@xihan-ui/styles 1.0.0-alpha.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 (114) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/LICENSE +21 -0
  3. package/README.md +27 -0
  4. package/css/accordion.css +108 -0
  5. package/css/affix.css +27 -0
  6. package/css/alert.css +108 -0
  7. package/css/anchor.css +137 -0
  8. package/css/avatar-group.css +82 -0
  9. package/css/avatar.css +55 -0
  10. package/css/back-top.css +61 -0
  11. package/css/badge.css +50 -0
  12. package/css/breadcrumb.css +127 -0
  13. package/css/button-group.css +131 -0
  14. package/css/button.css +98 -0
  15. package/css/calendar.css +219 -0
  16. package/css/card.css +116 -0
  17. package/css/carousel.css +193 -0
  18. package/css/cascader.css +397 -0
  19. package/css/checkbox-group.css +185 -0
  20. package/css/checkbox.css +91 -0
  21. package/css/clipboard.css +133 -0
  22. package/css/code-block.css +81 -0
  23. package/css/collapsible.css +63 -0
  24. package/css/color-picker.css +424 -0
  25. package/css/combobox.css +433 -0
  26. package/css/composer.css +127 -0
  27. package/css/context-menu.css +263 -0
  28. package/css/countdown.css +21 -0
  29. package/css/date-field.css +200 -0
  30. package/css/date-picker.css +231 -0
  31. package/css/descriptions.css +200 -0
  32. package/css/dialog.css +127 -0
  33. package/css/drawer.css +372 -0
  34. package/css/dynamic-input.css +157 -0
  35. package/css/editable.css +249 -0
  36. package/css/ellipsis.css +41 -0
  37. package/css/empty-state.css +78 -0
  38. package/css/field.css +65 -0
  39. package/css/file-upload.css +298 -0
  40. package/css/flex.css +95 -0
  41. package/css/float-button.css +121 -0
  42. package/css/form.css +185 -0
  43. package/css/gradient-text.css +62 -0
  44. package/css/grid.css +428 -0
  45. package/css/highlight.css +21 -0
  46. package/css/hover-card.css +146 -0
  47. package/css/icon-wrapper.css +64 -0
  48. package/css/icon.css +54 -0
  49. package/css/image.css +45 -0
  50. package/css/infinite-scroll.css +22 -0
  51. package/css/layers.css +2 -0
  52. package/css/layout.css +169 -0
  53. package/css/list.css +117 -0
  54. package/css/listbox.css +174 -0
  55. package/css/loading-bar.css +66 -0
  56. package/css/log.css +66 -0
  57. package/css/marquee.css +182 -0
  58. package/css/mention.css +222 -0
  59. package/css/menu.css +144 -0
  60. package/css/menubar.css +271 -0
  61. package/css/motion.css +58 -0
  62. package/css/navigation-menu.css +270 -0
  63. package/css/number-animation.css +32 -0
  64. package/css/number-field.css +219 -0
  65. package/css/page-header.css +85 -0
  66. package/css/pagination.css +148 -0
  67. package/css/pin-input.css +157 -0
  68. package/css/popconfirm.css +150 -0
  69. package/css/popover.css +150 -0
  70. package/css/popselect.css +207 -0
  71. package/css/progress.css +37 -0
  72. package/css/qr-code.css +50 -0
  73. package/css/radio-group.css +101 -0
  74. package/css/rating.css +141 -0
  75. package/css/reset.css +22 -0
  76. package/css/result.css +104 -0
  77. package/css/scroll-area.css +176 -0
  78. package/css/select.css +264 -0
  79. package/css/separator.css +17 -0
  80. package/css/skeleton.css +78 -0
  81. package/css/slider.css +197 -0
  82. package/css/spinner.css +74 -0
  83. package/css/splitter.css +127 -0
  84. package/css/statistic.css +67 -0
  85. package/css/steps.css +252 -0
  86. package/css/switch.css +61 -0
  87. package/css/table.css +404 -0
  88. package/css/tabs.css +157 -0
  89. package/css/tags-input.css +360 -0
  90. package/css/text-field.css +195 -0
  91. package/css/thread.css +107 -0
  92. package/css/time-field.css +200 -0
  93. package/css/time-picker.css +347 -0
  94. package/css/time.css +20 -0
  95. package/css/timeline.css +284 -0
  96. package/css/toast.css +195 -0
  97. package/css/toaster.css +69 -0
  98. package/css/toggle-group.css +160 -0
  99. package/css/toggle.css +103 -0
  100. package/css/tone.css +85 -0
  101. package/css/toolbar.css +114 -0
  102. package/css/tooltip.css +109 -0
  103. package/css/tour.css +305 -0
  104. package/css/transfer.css +318 -0
  105. package/css/tree-select.css +441 -0
  106. package/css/tree.css +204 -0
  107. package/css/typography.css +151 -0
  108. package/css/undefined.css +38 -0
  109. package/css/virtualizer.css +104 -0
  110. package/css/visually-hidden.css +13 -0
  111. package/css/watermark.css +48 -0
  112. package/index.css +113 -0
  113. package/index.unlayered.css +16164 -0
  114. package/package.json +163 -0
@@ -0,0 +1,249 @@
1
+ @layer xihan.components {
2
+ /* 就地编辑是"一行文字里的一处可改内容":标题、显示区与按钮天然同行,
3
+ 所以根是一条横向的行,而不是文本框那种"标题一行、控件一行"的竖排。
4
+ 要竖排的作者把 flex-direction 覆盖掉即可,其余尺寸都长在各自的角色节点上 */
5
+ [data-scope='editable'][data-part='root'] {
6
+ display: inline-flex;
7
+ flex-wrap: wrap;
8
+ align-items: center;
9
+ gap: var(--xh-editable-gap, var(--xh-space-2));
10
+ }
11
+
12
+ /* 只要声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
13
+ [data-scope='editable'][data-part='root'][hidden] {
14
+ display: none;
15
+ }
16
+
17
+ [data-scope='editable'][data-part='label'] {
18
+ color: var(--xh-editable-label-fg, var(--xh-fg-default));
19
+ font-size: var(--xh-editable-label-font-size, var(--xh-text-label-size));
20
+ font-weight: var(--xh-editable-label-font-weight, var(--xh-text-label-weight));
21
+ line-height: var(--xh-leading-none);
22
+ /* 点标题会把人送进编辑态(预览态下 for 指着的输入框是收起的,点了没反应),
23
+ 所以光标要说明它可点 */
24
+ cursor: pointer;
25
+ }
26
+
27
+ [data-scope='editable'][data-part='label'][data-disabled] {
28
+ color: var(--xh-editable-label-fg-disabled, var(--xh-fg-subtle));
29
+ cursor: not-allowed;
30
+ }
31
+
32
+ /* 预览区与输入框轮流上场,两者在同一处落脚:
33
+ area 定死最小宽高,切换形态时这一块不会忽大忽小地跳 */
34
+ [data-scope='editable'][data-part='area'] {
35
+ display: inline-flex;
36
+ align-items: center;
37
+ min-block-size: var(--xh-editable-area-min-h, var(--xh-control-h-md));
38
+ min-inline-size: var(--xh-editable-area-min-w, 6ch);
39
+ }
40
+
41
+ [data-scope='editable'][data-part='area'][hidden] {
42
+ display: none;
43
+ }
44
+
45
+ /* 预览区的内边距与边框要和输入框对齐:只有描边是透明的,
46
+ 否则从预览切到编辑时文字会左右挪一下 */
47
+ [data-scope='editable'][data-part='preview'] {
48
+ display: inline-block;
49
+ inline-size: 100%;
50
+ padding-inline: var(--xh-editable-preview-px, var(--xh-control-px-md));
51
+ padding-block: 0;
52
+ border: var(--xh-stroke-thin) solid transparent;
53
+ border-radius: var(--xh-editable-preview-radius, var(--xh-shape-control));
54
+ color: var(--xh-editable-preview-fg, var(--xh-fg-default));
55
+ font-size: var(--xh-editable-preview-font-size, var(--xh-text-body-size));
56
+ line-height: var(--xh-editable-preview-line-height, var(--xh-control-h-md));
57
+ /* 值里的换行与连续空格照原样显示,但过长的行仍要能断开 */
58
+ white-space: pre-wrap;
59
+ overflow-wrap: break-word;
60
+ }
61
+
62
+ /* 编辑态由连接层给 hidden;上面那条 display 会盖掉 UA 规则,少了这条就收不起来 */
63
+ [data-scope='editable'][data-part='preview'][hidden] {
64
+ display: none;
65
+ }
66
+
67
+ /* 认交互的预览区才给文字光标与悬停底色:
68
+ activation-mode=none 或整块不可编辑时,它就只是一段文字,别装成能点 */
69
+ [data-scope='editable'][data-part='preview']:not(
70
+ [data-activation-mode='none'],
71
+ [data-disabled],
72
+ [data-readonly]
73
+ ) {
74
+ cursor: text;
75
+ }
76
+
77
+ [data-scope='editable'][data-part='preview']:not(
78
+ [data-activation-mode='none'],
79
+ [data-disabled],
80
+ [data-readonly]
81
+ ):hover {
82
+ background: var(--xh-editable-preview-bg-hover, var(--xh-bg-subtle-hover));
83
+ }
84
+
85
+ /* 显示的是占位文字而不是真值,压淡以示区别 */
86
+ [data-scope='editable'][data-part='preview'][data-placeholder] {
87
+ color: var(--xh-editable-placeholder-fg, var(--xh-fg-subtle));
88
+ }
89
+
90
+ [data-scope='editable'][data-part='preview'][data-disabled] {
91
+ color: var(--xh-fg-disabled);
92
+ cursor: not-allowed;
93
+ }
94
+
95
+ /* 预览区是可聚焦节点(focus 模式下还占 Tab 位),焦点环不能省 */
96
+ [data-scope='editable'][data-part='preview']:focus-visible {
97
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
98
+ outline-offset: var(--xh-ring-offset);
99
+ }
100
+
101
+ [data-scope='editable'][data-part='input'] {
102
+ inline-size: 100%;
103
+ block-size: var(--xh-editable-input-h, var(--xh-control-h-md));
104
+ padding-inline: var(--xh-editable-input-px, var(--xh-control-px-md));
105
+ padding-block: 0;
106
+ border: var(--xh-stroke-thin) solid var(--xh-editable-input-border, var(--xh-border-default));
107
+ border-radius: var(--xh-editable-input-radius, var(--xh-shape-control));
108
+ background: var(--xh-editable-input-bg, var(--xh-bg-canvas));
109
+ color: var(--xh-editable-input-fg, var(--xh-fg-default));
110
+ /* 表单控件不继承页面字体,只给字号会让输入框用 UA 默认字族,与预览区的文字对不上 */
111
+ font-family: inherit;
112
+ font-size: var(--xh-editable-input-font-size, var(--xh-text-body-size));
113
+ line-height: var(--xh-leading-normal);
114
+ transition: border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
115
+ }
116
+
117
+ /* 预览态由连接层给 hidden;上面给了 inline-size 与 block-size 但没给 display,
118
+ UA 的 [hidden]{display:none} 仍然管用——这里补一条是防作者层另给 display */
119
+ [data-scope='editable'][data-part='input'][hidden] {
120
+ display: none;
121
+ }
122
+
123
+ /* 宽度跟着内容走时交给原生 size 说了算,别再用 100% 把它撑满 */
124
+ [data-scope='editable'][data-part='input'][data-auto-resize] {
125
+ inline-size: auto;
126
+ }
127
+
128
+ [data-scope='editable'][data-part='input']::placeholder {
129
+ color: var(--xh-editable-placeholder-fg, var(--xh-fg-subtle));
130
+ }
131
+
132
+ /* hover 只在中性态换描边:invalid 正拿边框颜色说事,被 hover 盖掉那条信息就没了 */
133
+ [data-scope='editable'][data-part='input']:hover:not(:disabled, [data-invalid]) {
134
+ border-color: var(--xh-editable-input-border-hover, var(--xh-border-strong));
135
+ }
136
+
137
+ [data-scope='editable'][data-part='input']:focus-visible {
138
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
139
+ outline-offset: var(--xh-ring-offset);
140
+ }
141
+
142
+ [data-scope='editable'][data-part='input'][data-invalid] {
143
+ border-color: var(--xh-editable-input-border-invalid, var(--xh-color-danger-500));
144
+ }
145
+
146
+ /* 只读仍可聚焦、可复制,不置灰,只把底色压下去表示"改不动" */
147
+ [data-scope='editable'][data-part='input'][readonly] {
148
+ background: var(--xh-editable-input-bg-readonly, var(--xh-bg-subtle));
149
+ }
150
+
151
+ /* 输入框是单体表单控件,禁用走原生 disabled */
152
+ [data-scope='editable'][data-part='input']:disabled {
153
+ background: var(--xh-editable-input-bg-disabled, var(--xh-bg-subtle));
154
+ color: var(--xh-fg-disabled);
155
+ cursor: not-allowed;
156
+ }
157
+
158
+ [data-scope='editable'][data-part='control'] {
159
+ display: inline-flex;
160
+ flex: none;
161
+ align-items: center;
162
+ gap: var(--xh-editable-control-gap, var(--xh-space-1));
163
+ }
164
+
165
+ [data-scope='editable'][data-part='control'][hidden] {
166
+ display: none;
167
+ }
168
+
169
+ /* 三颗按钮共用一份皮肤:它们是同一种东西,只是干的活不同,
170
+ 分开写迟早会改了一颗忘了另外两颗 */
171
+ [data-scope='editable'][data-part='edit-trigger'],
172
+ [data-scope='editable'][data-part='submit-trigger'],
173
+ [data-scope='editable'][data-part='cancel-trigger'] {
174
+ display: inline-flex;
175
+ flex: none;
176
+ align-items: center;
177
+ justify-content: center;
178
+ block-size: var(--xh-editable-trigger-h, var(--xh-control-h-sm));
179
+ padding-inline: var(--xh-editable-trigger-px, var(--xh-control-px-sm));
180
+ padding-block: 0;
181
+ border: var(--xh-stroke-thin) solid var(--xh-editable-trigger-border, var(--xh-border-default));
182
+ border-radius: var(--xh-editable-trigger-radius, var(--xh-shape-control));
183
+ background: var(--xh-editable-trigger-bg, var(--xh-bg-subtle));
184
+ color: var(--xh-editable-trigger-fg, var(--xh-fg-default));
185
+ font-family: inherit;
186
+ font-size: var(--xh-editable-trigger-font-size, var(--xh-font-size-sm));
187
+ line-height: var(--xh-leading-none);
188
+ white-space: nowrap;
189
+ cursor: pointer;
190
+ user-select: none;
191
+ transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
192
+ }
193
+
194
+ /* 三颗按钮按形态轮流收起,连接层给的是 hidden 属性;
195
+ 上面那条 display 已把 UA 规则盖掉,少了这里三条按钮就一直杵着 */
196
+ [data-scope='editable'][data-part='edit-trigger'][hidden],
197
+ [data-scope='editable'][data-part='submit-trigger'][hidden],
198
+ [data-scope='editable'][data-part='cancel-trigger'][hidden] {
199
+ display: none;
200
+ }
201
+
202
+ [data-scope='editable'][data-part='edit-trigger']:hover:not(:disabled),
203
+ [data-scope='editable'][data-part='submit-trigger']:hover:not(:disabled),
204
+ [data-scope='editable'][data-part='cancel-trigger']:hover:not(:disabled) {
205
+ border-color: var(--xh-editable-trigger-border-hover, var(--xh-border-strong));
206
+ background: var(--xh-editable-trigger-bg-hover, var(--xh-bg-subtle-hover));
207
+ }
208
+
209
+ [data-scope='editable'][data-part='edit-trigger']:active:not(:disabled),
210
+ [data-scope='editable'][data-part='submit-trigger']:active:not(:disabled),
211
+ [data-scope='editable'][data-part='cancel-trigger']:active:not(:disabled) {
212
+ background: var(--xh-editable-trigger-bg-active, var(--xh-bg-subtle-active));
213
+ }
214
+
215
+ [data-scope='editable'][data-part='edit-trigger']:focus-visible,
216
+ [data-scope='editable'][data-part='submit-trigger']:focus-visible,
217
+ [data-scope='editable'][data-part='cancel-trigger']:focus-visible {
218
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
219
+ outline-offset: var(--xh-ring-offset);
220
+ }
221
+
222
+ /* 单体控件用 :disabled(不是集合条目那套 [data-disabled]):
223
+ 禁用与只读时编辑钮置灰,收起态的提交/取消也一并落到这条上 */
224
+ [data-scope='editable'][data-part='edit-trigger']:disabled,
225
+ [data-scope='editable'][data-part='submit-trigger']:disabled,
226
+ [data-scope='editable'][data-part='cancel-trigger']:disabled {
227
+ border-color: var(--xh-editable-trigger-border-disabled, var(--xh-border-subtle));
228
+ background: var(--xh-editable-trigger-bg-disabled, var(--xh-bg-muted));
229
+ color: var(--xh-fg-disabled);
230
+ cursor: not-allowed;
231
+ }
232
+
233
+ /* 提交按钮是这一组里的主操作,给它一层实心底色区分开 */
234
+ [data-scope='editable'][data-part='submit-trigger']:not(:disabled) {
235
+ border-color: var(--xh-editable-submit-border, var(--xh-bg-brand));
236
+ background: var(--xh-editable-submit-bg, var(--xh-bg-brand));
237
+ color: var(--xh-editable-submit-fg, var(--xh-fg-on-brand));
238
+ }
239
+
240
+ [data-scope='editable'][data-part='submit-trigger']:hover:not(:disabled) {
241
+ border-color: var(--xh-editable-submit-bg-hover, var(--xh-bg-brand-hover));
242
+ background: var(--xh-editable-submit-bg-hover, var(--xh-bg-brand-hover));
243
+ }
244
+
245
+ [data-scope='editable'][data-part='submit-trigger']:active:not(:disabled) {
246
+ border-color: var(--xh-editable-submit-bg-active, var(--xh-bg-brand-active));
247
+ background: var(--xh-editable-submit-bg-active, var(--xh-bg-brand-active));
248
+ }
249
+ }
@@ -0,0 +1,41 @@
1
+ @layer xihan.components {
2
+ /* 单行:一行装不下就收成省略号。
3
+ 行数由连接层写进这个盒子的内联 style,样式表这一行只是它缺席时的落点 */
4
+ [data-scope='ellipsis'][data-part='root'] {
5
+ --xh-_ellipsis-lines: 1;
6
+
7
+ display: block;
8
+ overflow: hidden;
9
+ white-space: nowrap;
10
+ text-overflow: ellipsis;
11
+ }
12
+
13
+ /* 多行:按行数裁,裁掉的那一行末尾收省略号 */
14
+ [data-scope='ellipsis'][data-part='root'][data-multiline] {
15
+ display: -webkit-box;
16
+ overflow: hidden;
17
+ -webkit-box-orient: vertical;
18
+ -webkit-line-clamp: var(--xh-_ellipsis-lines);
19
+ white-space: normal;
20
+ /* 一长串没有断点的字符(网址、编号)也得断开,否则它一路撑出去,裁不住 */
21
+ overflow-wrap: break-word;
22
+ }
23
+
24
+ /* 铺开:裁剪整个撤掉。写在两档之后,压得住上面同权重的那两条 */
25
+ [data-scope='ellipsis'][data-part='root'][data-expanded] {
26
+ display: block;
27
+ overflow: visible;
28
+ white-space: normal;
29
+ }
30
+
31
+ /* 可展开时整块文字就是那颗按钮 */
32
+ [data-scope='ellipsis'][data-part='root'][data-expandable] {
33
+ cursor: pointer;
34
+ }
35
+
36
+ /* 聚焦环恒是 --xh-ring-focus,不随语气走 */
37
+ [data-scope='ellipsis'][data-part='root'][data-expandable]:focus-visible {
38
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
39
+ outline-offset: var(--xh-ring-offset);
40
+ }
41
+ }
@@ -0,0 +1,78 @@
1
+ @layer xihan.components {
2
+ [data-scope='empty-state'][data-part='root'] {
3
+ /* 三个尺寸档只换这几个私有槽,图标与标题都从 root 继承它们,
4
+ 换档不必给每个部件各写一条选择器 */
5
+ --xh-_empty-state-gap: var(--xh-stack-gap-md);
6
+ --xh-_empty-state-py: var(--xh-section-py);
7
+ --xh-_empty-state-icon-size: 2.5rem;
8
+ --xh-_empty-state-title-size: var(--xh-font-size-lg);
9
+ /* 说明的读行宽度:整句话不收窄就会拉成一条难读的长行 */
10
+ --xh-_empty-state-measure: 32rem;
11
+
12
+ display: flex;
13
+ flex-direction: column;
14
+ align-items: center;
15
+ justify-content: center;
16
+ gap: var(--xh-empty-state-gap, var(--xh-_empty-state-gap));
17
+ padding-block: var(--xh-empty-state-py, var(--xh-_empty-state-py));
18
+ padding-inline: var(--xh-empty-state-px, var(--xh-space-6));
19
+ color: var(--xh-empty-state-fg, var(--xh-fg-default));
20
+ text-align: center;
21
+ }
22
+
23
+ /* 活区节点常挂、靠 hidden 收起,上面声明了 display 会盖掉 UA 的 [hidden] 规则 */
24
+ [data-scope='empty-state'][data-part='root'][hidden] {
25
+ display: none;
26
+ }
27
+
28
+ [data-scope='empty-state'][data-part='root'][data-size='sm'] {
29
+ --xh-_empty-state-gap: var(--xh-space-2);
30
+ --xh-_empty-state-py: var(--xh-space-4);
31
+ --xh-_empty-state-icon-size: 2rem;
32
+ --xh-_empty-state-title-size: var(--xh-font-size-md);
33
+ }
34
+
35
+ [data-scope='empty-state'][data-part='root'][data-size='lg'] {
36
+ --xh-_empty-state-gap: var(--xh-space-6);
37
+ --xh-_empty-state-py: var(--xh-space-8);
38
+ --xh-_empty-state-icon-size: 3.5rem;
39
+ --xh-_empty-state-title-size: var(--xh-font-size-xl);
40
+ }
41
+
42
+ [data-scope='empty-state'][data-part='icon'] {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ flex: none;
47
+ block-size: var(--xh-empty-state-icon-size, var(--xh-_empty-state-icon-size));
48
+ inline-size: var(--xh-empty-state-icon-size, var(--xh-_empty-state-icon-size));
49
+ color: var(--xh-empty-state-icon-fg, var(--xh-fg-subtle));
50
+ /* 图标常是一个字形,字号跟着图标框走,line-height 不再另占高度 */
51
+ font-size: var(--xh-empty-state-icon-font-size, var(--xh-font-size-3xl));
52
+ line-height: var(--xh-leading-none);
53
+ }
54
+
55
+ [data-scope='empty-state'][data-part='title'] {
56
+ margin: 0;
57
+ color: var(--xh-empty-state-title-fg, var(--xh-fg-default));
58
+ font-size: var(--xh-empty-state-title-font-size, var(--xh-_empty-state-title-size));
59
+ font-weight: var(--xh-empty-state-title-font-weight, var(--xh-font-weight-semibold));
60
+ line-height: var(--xh-empty-state-title-leading, var(--xh-leading-tight));
61
+ }
62
+
63
+ [data-scope='empty-state'][data-part='description'] {
64
+ margin: 0;
65
+ max-inline-size: var(--xh-empty-state-description-max-w, var(--xh-_empty-state-measure));
66
+ color: var(--xh-empty-state-description-fg, var(--xh-fg-muted));
67
+ font-size: var(--xh-empty-state-description-font-size, var(--xh-text-body-size));
68
+ line-height: var(--xh-empty-state-description-leading, var(--xh-text-body-leading));
69
+ }
70
+
71
+ [data-scope='empty-state'][data-part='action'] {
72
+ display: flex;
73
+ flex-wrap: wrap;
74
+ align-items: center;
75
+ justify-content: center;
76
+ gap: var(--xh-empty-state-action-gap, var(--xh-space-2));
77
+ }
78
+ }
package/css/field.css ADDED
@@ -0,0 +1,65 @@
1
+ @layer xihan.components {
2
+ [data-scope='field'][data-part='root'] {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: var(--xh-field-gap, var(--xh-space-1));
6
+ }
7
+
8
+ [data-scope='field'][data-part='label'] {
9
+ color: var(--xh-field-label-fg, var(--xh-fg-default));
10
+ font-size: var(--xh-field-label-font-size, var(--xh-text-label-size));
11
+ font-weight: var(--xh-field-label-font-weight, var(--xh-text-label-weight));
12
+ line-height: var(--xh-leading-none);
13
+ }
14
+
15
+ [data-scope='field'][data-part='label'][data-disabled] {
16
+ color: var(--xh-field-label-fg-disabled, var(--xh-fg-subtle));
17
+ }
18
+
19
+ /* control 是作者自己的输入控件,这里只给一套可被覆盖的基础皮肤 */
20
+ [data-scope='field'][data-part='control'] {
21
+ inline-size: 100%;
22
+ block-size: var(--xh-field-control-h, var(--xh-control-h-md));
23
+ padding-inline: var(--xh-field-control-px, var(--xh-control-px-md));
24
+ border: var(--xh-stroke-thin) solid var(--xh-field-control-border, var(--xh-border-default));
25
+ border-radius: var(--xh-field-control-radius, var(--xh-shape-control));
26
+ background: var(--xh-field-control-bg, var(--xh-bg-canvas));
27
+ color: var(--xh-field-control-fg, var(--xh-fg-default));
28
+ font-size: var(--xh-field-control-font-size, var(--xh-text-body-size));
29
+ }
30
+
31
+ [data-scope='field'][data-part='control']:focus-visible {
32
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
33
+ outline-offset: var(--xh-ring-offset);
34
+ }
35
+
36
+ [data-scope='field'][data-part='control'][data-invalid] {
37
+ border-color: var(--xh-field-control-border-invalid, var(--xh-color-danger-500));
38
+ }
39
+
40
+ /* 禁用由作者在控件上落原生 disabled,样式统一走 data-disabled */
41
+ [data-scope='field'][data-part='control'][data-disabled] {
42
+ background: var(--xh-field-control-bg-disabled, var(--xh-bg-subtle));
43
+ color: var(--xh-fg-disabled);
44
+ cursor: not-allowed;
45
+ }
46
+
47
+ [data-scope='field'][data-part='description'] {
48
+ margin: 0;
49
+ color: var(--xh-field-description-fg, var(--xh-fg-muted));
50
+ font-size: var(--xh-field-description-font-size, var(--xh-font-size-sm));
51
+ line-height: var(--xh-leading-normal);
52
+ }
53
+
54
+ [data-scope='field'][data-part='description'][data-disabled] {
55
+ color: var(--xh-field-description-fg-disabled, var(--xh-fg-subtle));
56
+ }
57
+
58
+ /* 不 invalid 时节点带 hidden:此处不声明 display,交给浏览器的 [hidden] 规则收起 */
59
+ [data-scope='field'][data-part='error-text'] {
60
+ margin: 0;
61
+ color: var(--xh-field-error-fg, var(--xh-fg-danger));
62
+ font-size: var(--xh-field-error-font-size, var(--xh-font-size-sm));
63
+ line-height: var(--xh-leading-normal);
64
+ }
65
+ }