@xihan-ui/styles 1.0.0-alpha.1 → 1.0.0-alpha.3

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 (129) hide show
  1. package/CHANGELOG.md +527 -0
  2. package/README.md +1 -1
  3. package/css/accordion.css +61 -5
  4. package/css/affix.css +5 -0
  5. package/css/alert.css +35 -5
  6. package/css/anchor.css +12 -7
  7. package/css/avatar-group.css +8 -3
  8. package/css/avatar.css +8 -3
  9. package/css/back-top.css +21 -1
  10. package/css/badge.css +21 -2
  11. package/css/breadcrumb.css +29 -4
  12. package/css/button-group.css +19 -13
  13. package/css/button.css +57 -11
  14. package/css/calendar.css +124 -2
  15. package/css/card.css +10 -5
  16. package/css/carousel.css +41 -5
  17. package/css/cascader.css +188 -102
  18. package/css/checkbox-group.css +46 -19
  19. package/css/checkbox.css +59 -8
  20. package/css/clipboard.css +7 -1
  21. package/css/code-block.css +17 -7
  22. package/css/collapsible.css +47 -2
  23. package/css/color-picker.css +117 -46
  24. package/css/combobox.css +132 -52
  25. package/css/composer.css +10 -3
  26. package/css/context-menu.css +101 -75
  27. package/css/countdown.css +5 -0
  28. package/css/date-field.css +96 -14
  29. package/css/date-picker.css +281 -65
  30. package/css/descriptions.css +7 -2
  31. package/css/dialog.css +109 -22
  32. package/css/download-trigger.css +76 -0
  33. package/css/drawer.css +75 -23
  34. package/css/dynamic-input.css +73 -17
  35. package/css/editable.css +17 -10
  36. package/css/ellipsis.css +6 -1
  37. package/css/empty-state.css +12 -7
  38. package/css/field.css +14 -6
  39. package/css/fieldset.css +69 -0
  40. package/css/file-upload.css +50 -7
  41. package/css/flex.css +5 -0
  42. package/css/float-button.css +21 -1
  43. package/css/floating-panel.css +310 -0
  44. package/css/form.css +10 -5
  45. package/css/gradient-text.css +5 -0
  46. package/css/grid.css +5 -0
  47. package/css/heatmap.css +410 -0
  48. package/css/highlight.css +6 -1
  49. package/css/hotkeys.css +90 -0
  50. package/css/hover-card.css +58 -50
  51. package/css/icon-wrapper.css +5 -0
  52. package/css/icon.css +5 -0
  53. package/css/image-cropper.css +231 -0
  54. package/css/image-viewer.css +167 -22
  55. package/css/image.css +7 -2
  56. package/css/infinite-scroll.css +6 -1
  57. package/css/json-viewer.css +241 -0
  58. package/css/layout.css +11 -10
  59. package/css/list.css +13 -8
  60. package/css/listbox.css +25 -4
  61. package/css/loading-bar.css +12 -1
  62. package/css/log.css +6 -1
  63. package/css/marquee.css +14 -0
  64. package/css/masonry.css +63 -0
  65. package/css/mention.css +105 -32
  66. package/css/menu.css +131 -46
  67. package/css/menubar.css +150 -66
  68. package/css/navigation-menu.css +59 -29
  69. package/css/number-animation.css +8 -3
  70. package/css/number-field.css +178 -16
  71. package/css/overlay-arrow.css +51 -0
  72. package/css/page-header.css +10 -5
  73. package/css/pagination.css +18 -13
  74. package/css/password-input.css +356 -0
  75. package/css/pin-input.css +18 -10
  76. package/css/popconfirm.css +73 -16
  77. package/css/popover.css +88 -44
  78. package/css/popselect.css +201 -52
  79. package/css/progress.css +52 -7
  80. package/css/qr-code.css +6 -1
  81. package/css/radio-group.css +19 -8
  82. package/css/rating.css +7 -2
  83. package/css/reset.css +17 -0
  84. package/css/result.css +11 -6
  85. package/css/scroll-area.css +65 -94
  86. package/css/scrollbar.css +167 -0
  87. package/css/segmented.css +215 -0
  88. package/css/select.css +292 -124
  89. package/css/separator.css +7 -2
  90. package/css/side-nav.css +116 -19
  91. package/css/signature-pad.css +144 -0
  92. package/css/skeleton.css +12 -1
  93. package/css/slider.css +15 -10
  94. package/css/space.css +117 -0
  95. package/css/spinner.css +31 -11
  96. package/css/splitter.css +5 -0
  97. package/css/statistic.css +14 -9
  98. package/css/steps.css +30 -8
  99. package/css/switch.css +62 -13
  100. package/css/table.css +136 -37
  101. package/css/tabs.css +9 -4
  102. package/css/tag.css +177 -0
  103. package/css/tags-input.css +83 -40
  104. package/css/text-field.css +154 -36
  105. package/css/thread.css +6 -1
  106. package/css/time-field.css +102 -16
  107. package/css/time-picker.css +264 -69
  108. package/css/time.css +5 -0
  109. package/css/timeline.css +15 -10
  110. package/css/timer.css +119 -0
  111. package/css/toast.css +46 -21
  112. package/css/toaster.css +6 -1
  113. package/css/toggle-group.css +5 -0
  114. package/css/toggle.css +11 -6
  115. package/css/tone.css +10 -5
  116. package/css/toolbar.css +6 -1
  117. package/css/tooltip.css +54 -38
  118. package/css/tour.css +128 -63
  119. package/css/transfer.css +73 -17
  120. package/css/tree-select.css +203 -83
  121. package/css/tree.css +90 -1
  122. package/css/typography.css +9 -4
  123. package/css/undefined.css +11 -1
  124. package/css/virtualizer.css +8 -1
  125. package/css/watermark.css +6 -2
  126. package/index.css +17 -1
  127. package/index.unlayered.css +9394 -2883
  128. package/package.json +19 -4
  129. package/css/motion.css +0 -58
package/css/calendar.css CHANGED
@@ -1,5 +1,13 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='calendar'] {
4
+ --xh-calendar-skin: 1;
5
+ }
6
+
2
7
  [data-scope='calendar'][data-part='root'] {
8
+ /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
9
+ --xh-icon-size: var(--xh-calendar-icon-size, var(--xh-glyph-size-text));
10
+
3
11
  display: flex;
4
12
  flex-direction: column;
5
13
  gap: var(--xh-calendar-gap, var(--xh-space-3));
@@ -32,7 +40,49 @@
32
40
  user-select: none;
33
41
  }
34
42
 
43
+ /* 标题里的年与月:点它们逐级钻上去(年 → 十年格、月 → 月格)。
44
+ 长得像标题而不像按钮——它本来就是标题,只是可点 */
45
+ [data-scope='calendar'][data-part='heading-year-trigger']:not([hidden]),
46
+ [data-scope='calendar'][data-part='heading-month-trigger']:not([hidden]) {
47
+ display: inline-flex;
48
+ align-items: center;
49
+ padding-inline: var(--xh-calendar-heading-trigger-px, var(--xh-space-1));
50
+ border: var(--xh-stroke-thin) solid transparent;
51
+ border-radius: var(--xh-calendar-heading-trigger-radius, var(--xh-shape-control));
52
+ background: transparent;
53
+ color: var(--xh-calendar-heading-fg, var(--xh-fg-default));
54
+ font-size: var(--xh-calendar-heading-font-size, var(--xh-text-label-size));
55
+ font-weight: var(--xh-calendar-heading-font-weight, var(--xh-font-weight-semibold));
56
+ line-height: var(--xh-leading-none);
57
+ cursor: pointer;
58
+ transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
59
+ }
60
+
61
+ [data-scope='calendar'][data-part='heading-year-trigger'][hidden],
62
+ [data-scope='calendar'][data-part='heading-month-trigger'][hidden] {
63
+ display: none;
64
+ }
65
+
66
+ [data-scope='calendar'][data-part='heading-year-trigger']:hover:not(:disabled),
67
+ [data-scope='calendar'][data-part='heading-month-trigger']:hover:not(:disabled) {
68
+ color: var(--xh-calendar-heading-trigger-fg-hover, var(--xh-fg-brand));
69
+ }
70
+
71
+ /* 到顶那一层(年视图的年那一截)只作标题显示:不再是可点的东西,光标也别装成能点 */
72
+ [data-scope='calendar'][data-part='heading-year-trigger']:disabled,
73
+ [data-scope='calendar'][data-part='heading-month-trigger']:disabled {
74
+ cursor: default;
75
+ }
76
+
77
+ [data-scope='calendar'][data-part='heading-year-trigger']:focus-visible,
78
+ [data-scope='calendar'][data-part='heading-month-trigger']:focus-visible {
79
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
80
+ outline-offset: var(--xh-ring-offset);
81
+ }
82
+
83
+ [data-scope='calendar'][data-part='prev-year-trigger'],
35
84
  [data-scope='calendar'][data-part='prev-trigger'],
85
+ [data-scope='calendar'][data-part='next-year-trigger'],
36
86
  [data-scope='calendar'][data-part='next-trigger'] {
37
87
  display: inline-flex;
38
88
  flex: none;
@@ -48,25 +98,33 @@
48
98
  transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
49
99
  }
50
100
 
101
+ [data-scope='calendar'][data-part='prev-year-trigger'],
51
102
  [data-scope='calendar'][data-part='prev-trigger'][hidden],
103
+ [data-scope='calendar'][data-part='next-year-trigger'],
52
104
  [data-scope='calendar'][data-part='next-trigger'][hidden] {
53
105
  display: none;
54
106
  }
55
107
 
108
+ [data-scope='calendar'][data-part='prev-year-trigger'],
56
109
  [data-scope='calendar'][data-part='prev-trigger']:hover:not(:disabled),
110
+ [data-scope='calendar'][data-part='next-year-trigger'],
57
111
  [data-scope='calendar'][data-part='next-trigger']:hover:not(:disabled) {
58
112
  background: var(--xh-calendar-nav-bg-hover, var(--xh-bg-subtle-hover));
59
113
  color: var(--xh-fg-default);
60
114
  }
61
115
 
62
116
  /* 翻月是单体控件,禁用走原生 :disabled(连接层输出的正是原生 disabled) */
117
+ [data-scope='calendar'][data-part='prev-year-trigger'],
63
118
  [data-scope='calendar'][data-part='prev-trigger']:disabled,
119
+ [data-scope='calendar'][data-part='next-year-trigger'],
64
120
  [data-scope='calendar'][data-part='next-trigger']:disabled {
65
121
  color: var(--xh-fg-disabled);
66
122
  cursor: not-allowed;
67
123
  }
68
124
 
125
+ [data-scope='calendar'][data-part='prev-year-trigger'],
69
126
  [data-scope='calendar'][data-part='prev-trigger']:focus-visible,
127
+ [data-scope='calendar'][data-part='next-year-trigger'],
70
128
  [data-scope='calendar'][data-part='next-trigger']:focus-visible {
71
129
  outline: var(--xh-ring-width) solid var(--xh-ring-focus);
72
130
  outline-offset: var(--xh-ring-offset);
@@ -78,6 +136,27 @@
78
136
  gap: var(--xh-calendar-grid-gap, var(--xh-space-1));
79
137
  }
80
138
 
139
+ /* 粗粒度视图:格子直接铺进网格,不再有周行那一层。
140
+ 月 3 列 × 4 行、季度 4 列一行、年 3 列——与常见日期控件同一套排布 */
141
+ [data-scope='calendar'][data-part='grid'][data-view='month'],
142
+ [data-scope='calendar'][data-part='grid'][data-view='year'] {
143
+ display: grid;
144
+ grid-template-columns: repeat(3, minmax(0, 1fr));
145
+ gap: var(--xh-calendar-period-gap, var(--xh-space-1));
146
+ }
147
+
148
+ [data-scope='calendar'][data-part='grid'][data-view='quarter'] {
149
+ display: grid;
150
+ grid-template-columns: repeat(4, minmax(0, 1fr));
151
+ gap: var(--xh-calendar-period-gap, var(--xh-space-1));
152
+ }
153
+
154
+ /* 粗粒度的格子比日子宽,文字居中、留出上下气口 */
155
+ [data-scope='calendar'][data-part='grid']:is([data-view='month'], [data-view='quarter'], [data-view='year']) [data-part='cell-trigger'] {
156
+ padding-block: var(--xh-calendar-period-py, var(--xh-space-2));
157
+ inline-size: 100%;
158
+ }
159
+
81
160
  [data-scope='calendar'][data-part='grid'][hidden] {
82
161
  display: none;
83
162
  }
@@ -105,6 +184,26 @@
105
184
  grid-template-columns: repeat(7, minmax(0, 1fr));
106
185
  }
107
186
 
187
+ /* 摆了周序号格的行多让出行首一列。写 :not([hidden]) 而不是靠顺序压过下面那条兜底——
188
+ 同特指度的规则谁在后面谁赢,收起态会被这条 display 掀开 */
189
+ [data-scope='calendar'][data-part='week-row']:not([hidden]):has(> [data-part='week-number']) {
190
+ display: grid;
191
+ grid-template-columns: var(--xh-calendar-week-number-w, 2.25rem) repeat(7, minmax(0, 1fr));
192
+ }
193
+
194
+ /* 周序号只是行的标号:比日子小一号、颜色压下去,不跟着选中态走 */
195
+ [data-scope='calendar'][data-part='week-number'] {
196
+ display: grid;
197
+ place-items: center;
198
+ color: var(--xh-calendar-week-number-fg, var(--xh-fg-subtle));
199
+ font-size: var(--xh-calendar-week-number-font-size, var(--xh-text-caption-size));
200
+ font-variant-numeric: tabular-nums;
201
+ user-select: none;
202
+ }
203
+
204
+ [data-scope='calendar'][data-part='week-number'][hidden] {
205
+ display: none;
206
+ }
108
207
  [data-scope='calendar'][data-part='week-row'][hidden] {
109
208
  display: none;
110
209
  }
@@ -115,7 +214,7 @@
115
214
  justify-content: center;
116
215
  block-size: var(--xh-calendar-week-day-h, var(--xh-control-h-sm));
117
216
  color: var(--xh-calendar-week-day-fg, var(--xh-fg-subtle));
118
- font-size: var(--xh-calendar-week-day-font-size, var(--xh-font-size-xs));
217
+ font-size: var(--xh-calendar-week-day-font-size, var(--xh-text-caption-size));
119
218
  font-weight: var(--xh-calendar-week-day-font-weight, var(--xh-font-weight-medium));
120
219
  line-height: var(--xh-leading-none);
121
220
  user-select: none;
@@ -131,7 +230,7 @@
131
230
  display: flex;
132
231
  align-items: center;
133
232
  justify-content: center;
134
- padding: var(--xh-calendar-cell-gap, 2px);
233
+ padding: var(--xh-calendar-cell-gap, var(--xh-space-0_5));
135
234
  }
136
235
 
137
236
  [data-scope='calendar'][data-part='cell'][hidden] {
@@ -216,4 +315,27 @@
216
315
  outline: var(--xh-ring-width) solid var(--xh-ring-focus);
217
316
  outline-offset: calc(-1 * var(--xh-ring-width));
218
317
  }
318
+
319
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
320
+ [data-scope='calendar'][data-part='prev-trigger']:empty::before {
321
+ content: '';
322
+ display: inline-block;
323
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
324
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
325
+ vertical-align: var(--xh-glyph-baseline-shift);
326
+ background-color: currentColor;
327
+ -webkit-mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
328
+ mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
329
+ }
330
+
331
+ [data-scope='calendar'][data-part='next-trigger']:empty::before {
332
+ content: '';
333
+ display: inline-block;
334
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
335
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
336
+ vertical-align: var(--xh-glyph-baseline-shift);
337
+ background-color: currentColor;
338
+ -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
339
+ mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
340
+ }
219
341
  }
package/css/card.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='card'] {
4
+ --xh-card-skin: 1;
5
+ }
6
+
2
7
  [data-scope='card'][data-part='root'] {
3
8
  display: flex;
4
9
  flex-direction: column;
@@ -22,7 +27,7 @@
22
27
  }
23
28
 
24
29
  [data-scope='card'][data-part='root'][data-variant='elevated'] {
25
- box-shadow: var(--xh-elevation-2);
30
+ box-shadow: var(--xh-card-shadow, var(--xh-elevation-raised));
26
31
  }
27
32
 
28
33
  [data-scope='card'][data-part='root'][data-variant='ghost'] {
@@ -42,7 +47,7 @@
42
47
  @media (hover: hover) {
43
48
  [data-scope='card'][data-part='root'][data-hoverable]:hover {
44
49
  border-color: var(--xh-card-border, var(--xh-border-strong));
45
- box-shadow: var(--xh-elevation-2);
50
+ box-shadow: var(--xh-card-shadow, var(--xh-elevation-raised));
46
51
  }
47
52
  }
48
53
 
@@ -69,18 +74,18 @@
69
74
  }
70
75
 
71
76
  [data-scope='card'][data-part='title'] {
72
- font-size: var(--xh-card-title-font-size, var(--xh-font-size-md));
77
+ font-size: var(--xh-card-title-font-size, var(--xh-text-label-size));
73
78
  font-weight: var(--xh-font-weight-medium);
74
79
  line-height: var(--xh-leading-tight);
75
80
  }
76
81
 
77
82
  [data-scope='card'][data-part='root'][data-size='lg'] [data-part='title'] {
78
- font-size: var(--xh-card-title-font-size, var(--xh-font-size-lg));
83
+ font-size: var(--xh-card-title-font-size, var(--xh-control-font-lg));
79
84
  }
80
85
 
81
86
  [data-scope='card'][data-part='description'] {
82
87
  color: var(--xh-fg-muted);
83
- font-size: var(--xh-font-size-sm);
88
+ font-size: var(--xh-text-secondary-size);
84
89
  line-height: var(--xh-leading-normal);
85
90
  }
86
91
 
package/css/carousel.css CHANGED
@@ -1,7 +1,15 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='carousel'] {
4
+ --xh-carousel-skin: 1;
5
+ }
6
+
2
7
  /* 根节点是 region 地标:把上一张 / 视口 / 下一张排成一行,指示点另起一行。
3
8
  两端按钮浮在视口上还是排在两侧由作者定,这里只给最朴素的一版排布 */
4
9
  [data-scope='carousel'][data-part='root'] {
10
+ /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
11
+ --xh-icon-size: var(--xh-carousel-icon-size, var(--xh-glyph-size-text));
12
+
5
13
  display: flex;
6
14
  flex-wrap: wrap;
7
15
  align-items: center;
@@ -163,7 +171,7 @@
163
171
  /* 圆点本身没有文字,按钮里的文案(页码)交给作者,默认不显示 */
164
172
  padding: 0;
165
173
  border: 0;
166
- border-radius: var(--xh-carousel-indicator-radius, var(--xh-radius-full));
174
+ border-radius: var(--xh-carousel-indicator-radius, var(--xh-shape-pill));
167
175
  background: var(--xh-carousel-indicator-bg, var(--xh-border-control));
168
176
  font-size: 0;
169
177
  cursor: pointer;
@@ -174,20 +182,48 @@
174
182
  display: none;
175
183
  }
176
184
 
177
- [data-scope='carousel'][data-part='indicator']:hover:not([data-selected]) {
185
+ [data-scope='carousel'][data-part='indicator']:hover:not([data-current]) {
178
186
  background: var(--xh-carousel-indicator-bg-hover, var(--xh-fg-subtle));
179
187
  }
180
188
 
181
- /* 当前页:data-selected 与 aria-current='true' 由连接层成对给出,
189
+ /* 当前页:data-current 与 aria-current='true' 由连接层成对给出,
182
190
  样式挂在 data 钩子上,无障碍语义留给 aria,两边各司其职 */
183
- [data-scope='carousel'][data-part='indicator'][data-selected] {
191
+ [data-scope='carousel'][data-part='indicator'][data-current] {
184
192
  background: var(--xh-carousel-indicator-bg-selected, var(--xh-bg-brand));
185
193
  }
186
194
 
187
- /* 减少动效:位移立刻到位。翻页本身照常发生,只是不再有滑动的过程 */
195
+ /* 减少动效:位移立刻到位。翻页本身照常发生,只是不再有滑动的过程。
196
+ 两条规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion */
188
197
  @media (prefers-reduced-motion: reduce) {
189
198
  [data-scope='carousel'][data-part='item-group'] {
190
199
  transition: none;
191
200
  }
192
201
  }
202
+
203
+ :where([data-motion='reduce']) [data-scope='carousel'][data-part='item-group'] {
204
+ transition: none;
205
+ }
206
+
207
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
208
+ [data-scope='carousel'][data-part='prev-trigger']:empty::before {
209
+ content: '';
210
+ display: inline-block;
211
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
212
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
213
+ vertical-align: var(--xh-glyph-baseline-shift);
214
+ background-color: currentColor;
215
+ -webkit-mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
216
+ mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
217
+ }
218
+
219
+ [data-scope='carousel'][data-part='next-trigger']:empty::before {
220
+ content: '';
221
+ display: inline-block;
222
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
223
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
224
+ vertical-align: var(--xh-glyph-baseline-shift);
225
+ background-color: currentColor;
226
+ -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
227
+ mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
228
+ }
193
229
  }