@xihan-ui/styles 1.0.0-alpha.2 → 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 (118) hide show
  1. package/CHANGELOG.md +447 -0
  2. package/README.md +1 -1
  3. package/css/accordion.css +56 -5
  4. package/css/alert.css +30 -5
  5. package/css/anchor.css +7 -7
  6. package/css/avatar-group.css +3 -3
  7. package/css/avatar.css +3 -3
  8. package/css/back-top.css +16 -1
  9. package/css/badge.css +16 -2
  10. package/css/breadcrumb.css +24 -4
  11. package/css/button-group.css +14 -13
  12. package/css/button.css +42 -11
  13. package/css/calendar.css +119 -2
  14. package/css/card.css +5 -5
  15. package/css/carousel.css +36 -5
  16. package/css/cascader.css +183 -102
  17. package/css/checkbox-group.css +41 -19
  18. package/css/checkbox.css +54 -8
  19. package/css/clipboard.css +2 -1
  20. package/css/code-block.css +12 -7
  21. package/css/collapsible.css +42 -2
  22. package/css/color-picker.css +111 -45
  23. package/css/combobox.css +114 -53
  24. package/css/composer.css +5 -3
  25. package/css/context-menu.css +97 -69
  26. package/css/date-field.css +91 -14
  27. package/css/date-picker.css +276 -65
  28. package/css/descriptions.css +2 -2
  29. package/css/dialog.css +40 -13
  30. package/css/download-trigger.css +76 -0
  31. package/css/drawer.css +45 -14
  32. package/css/dynamic-input.css +68 -17
  33. package/css/editable.css +12 -10
  34. package/css/ellipsis.css +1 -1
  35. package/css/empty-state.css +7 -7
  36. package/css/field.css +9 -6
  37. package/css/fieldset.css +69 -0
  38. package/css/file-upload.css +45 -7
  39. package/css/float-button.css +16 -1
  40. package/css/floating-panel.css +310 -0
  41. package/css/form.css +4 -4
  42. package/css/heatmap.css +410 -0
  43. package/css/highlight.css +1 -1
  44. package/css/hotkeys.css +90 -0
  45. package/css/hover-card.css +40 -45
  46. package/css/image-cropper.css +231 -0
  47. package/css/image-viewer.css +137 -12
  48. package/css/image.css +2 -2
  49. package/css/infinite-scroll.css +1 -1
  50. package/css/json-viewer.css +241 -0
  51. package/css/layout.css +6 -10
  52. package/css/list.css +8 -8
  53. package/css/listbox.css +20 -4
  54. package/css/loading-bar.css +7 -1
  55. package/css/log.css +1 -1
  56. package/css/marquee.css +9 -0
  57. package/css/masonry.css +63 -0
  58. package/css/mention.css +87 -33
  59. package/css/menu.css +113 -47
  60. package/css/menubar.css +146 -60
  61. package/css/navigation-menu.css +54 -29
  62. package/css/number-animation.css +3 -3
  63. package/css/number-field.css +173 -16
  64. package/css/overlay-arrow.css +51 -0
  65. package/css/page-header.css +5 -5
  66. package/css/pagination.css +13 -13
  67. package/css/password-input.css +356 -0
  68. package/css/pin-input.css +13 -10
  69. package/css/popconfirm.css +46 -10
  70. package/css/popover.css +70 -45
  71. package/css/popselect.css +183 -53
  72. package/css/progress.css +47 -7
  73. package/css/qr-code.css +1 -1
  74. package/css/radio-group.css +14 -8
  75. package/css/rating.css +2 -2
  76. package/css/reset.css +17 -0
  77. package/css/result.css +6 -6
  78. package/css/scroll-area.css +61 -89
  79. package/css/scrollbar.css +167 -0
  80. package/css/segmented.css +215 -0
  81. package/css/select.css +274 -125
  82. package/css/separator.css +2 -2
  83. package/css/side-nav.css +111 -19
  84. package/css/signature-pad.css +144 -0
  85. package/css/skeleton.css +7 -1
  86. package/css/slider.css +10 -10
  87. package/css/space.css +117 -0
  88. package/css/spinner.css +22 -10
  89. package/css/statistic.css +9 -9
  90. package/css/steps.css +25 -8
  91. package/css/switch.css +48 -6
  92. package/css/table.css +131 -37
  93. package/css/tabs.css +4 -4
  94. package/css/tag.css +177 -0
  95. package/css/tags-input.css +78 -40
  96. package/css/text-field.css +149 -36
  97. package/css/thread.css +1 -1
  98. package/css/time-field.css +97 -16
  99. package/css/time-picker.css +259 -69
  100. package/css/timeline.css +10 -10
  101. package/css/timer.css +119 -0
  102. package/css/toast.css +34 -10
  103. package/css/toaster.css +1 -1
  104. package/css/toggle.css +6 -6
  105. package/css/tone.css +10 -5
  106. package/css/toolbar.css +1 -1
  107. package/css/tooltip.css +36 -33
  108. package/css/tour.css +103 -58
  109. package/css/transfer.css +68 -17
  110. package/css/tree-select.css +185 -84
  111. package/css/tree.css +85 -1
  112. package/css/typography.css +4 -4
  113. package/css/undefined.css +11 -1
  114. package/css/virtualizer.css +3 -1
  115. package/css/watermark.css +1 -2
  116. package/index.css +17 -0
  117. package/index.unlayered.css +8659 -2799
  118. package/package.json +19 -3
@@ -0,0 +1,215 @@
1
+ @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='segmented'] {
4
+ --xh-segmented-skin: 1;
5
+ }
6
+
7
+ /* 一条轨道装着若干段,指示器在轨道里滑。指示器是绝对定位的,
8
+ root 必须是它的定位参照系;段与段之间不留缝,所以不设 gap */
9
+ [data-scope='segmented'][data-part='root'] {
10
+ /* 尺寸档只换这四个私有槽,段与文字从 root 继承它们,换档不必给每个部件各写一条选择器 */
11
+ --xh-_segmented-h: var(--xh-control-h-md);
12
+ --xh-_segmented-px: var(--xh-control-px-md);
13
+ --xh-_segmented-gap: var(--xh-control-gap-md);
14
+ --xh-_segmented-font-size: var(--xh-text-label-size);
15
+ /* 指示器底色与选中段的文字色;没写 data-tone 时就是这里的取值 */
16
+ --xh-_segmented-indicator-bg: var(--xh-bg-surface);
17
+ --xh-_segmented-fg-selected: var(--xh-fg-default);
18
+
19
+ position: relative;
20
+ display: inline-flex;
21
+ align-items: stretch;
22
+ padding: var(--xh-segmented-track-padding, var(--xh-space-0_5));
23
+ border: var(--xh-stroke-thin) solid var(--xh-segmented-border, var(--xh-border-subtle));
24
+ border-radius: var(--xh-segmented-radius, var(--xh-shape-control));
25
+ background: var(--xh-segmented-bg, var(--xh-bg-subtle));
26
+ font-size: var(--xh-segmented-font-size, var(--xh-_segmented-font-size));
27
+ }
28
+
29
+ /* 横排时外盒整体就是一档控件高:段被 align-items: stretch 撑满轨道内侧,与同行控件齐平 */
30
+ [data-scope='segmented'][data-part='root'][data-orientation='horizontal'] {
31
+ flex-direction: row;
32
+ block-size: var(--xh-segmented-h, var(--xh-_segmented-h));
33
+ }
34
+
35
+ [data-scope='segmented'][data-part='root'][data-orientation='horizontal'] [data-scope='segmented'][data-part='item'] {
36
+ block-size: auto;
37
+ }
38
+
39
+ [data-scope='segmented'][data-part='root'][data-orientation='vertical'] {
40
+ flex-direction: column;
41
+ }
42
+
43
+ /* 撑满行宽:各段等分剩余空间,长短不一的文字也排得齐 */
44
+ [data-scope='segmented'][data-part='root'][data-block] {
45
+ display: flex;
46
+ inline-size: 100%;
47
+ }
48
+
49
+ /* 等分只在横排成立:竖排的主轴是块轴,flex-basis: 0 会顶掉段自己的高度档,
50
+ 段高改由「等分容器高度」决定,三档控件高度从此对它没有作用。
51
+ 竖排下段本来就靠上面那条 inline-size: 100% 与 align-items: stretch 撑满宽度 */
52
+ [data-scope='segmented'][data-part='root'][data-block][data-orientation='horizontal']
53
+ > [data-scope='segmented'][data-part='item'] {
54
+ flex: 1 1 0;
55
+ }
56
+
57
+ /* root 会短暂拿到 tabindex=0,但它的 onFocus 立刻把焦点转投给段,
58
+ 在它身上画环只会闪一下就跳走,高亮要长在段上 */
59
+ [data-scope='segmented'][data-part='root']:focus-visible {
60
+ outline: none;
61
+ }
62
+
63
+ [data-scope='segmented'][data-part='root'][data-invalid] {
64
+ border-color: var(--xh-segmented-border-invalid, var(--xh-border-invalid));
65
+ }
66
+
67
+ [data-scope='segmented'][data-part='root'][data-disabled] {
68
+ background: var(--xh-segmented-bg-disabled, var(--xh-bg-muted));
69
+ cursor: not-allowed;
70
+ }
71
+
72
+ /* 整组禁用时指示器落回轨道平面(不再浮起),但底色一点不兑淡:
73
+ 它上面压着选中段的文字,往 muted 兑哪怕一成,brand 的对比度就从 5.08 掉到 4.24 */
74
+ [data-scope='segmented'][data-part='root'][data-disabled]
75
+ [data-scope='segmented'][data-part='indicator'] {
76
+ box-shadow: var(--xh-segmented-indicator-shadow-disabled, none);
77
+ }
78
+
79
+ /* —— 语气 —— */
80
+ /* 选择器带 [data-tone] 限定:不限定的话,放在语气容器里的分段控件会跟着改色 */
81
+ [data-scope='segmented'][data-part='root'][data-tone] {
82
+ --xh-_segmented-indicator-bg: var(--xh-_tone, var(--xh-bg-surface));
83
+ --xh-_segmented-fg-selected: var(--xh-_tone-on, var(--xh-fg-default));
84
+ }
85
+
86
+ /* —— 尺寸 —— */
87
+ /* 缺省的 md 档写在上面的基础规则里 */
88
+ [data-scope='segmented'][data-part='root'][data-size='sm'] {
89
+ --xh-_segmented-h: var(--xh-control-h-sm);
90
+ --xh-_segmented-px: var(--xh-control-px-sm);
91
+ --xh-_segmented-gap: var(--xh-control-gap-sm);
92
+ --xh-_segmented-font-size: var(--xh-control-font-sm);
93
+ }
94
+
95
+ [data-scope='segmented'][data-part='root'][data-size='lg'] {
96
+ --xh-_segmented-h: var(--xh-control-h-lg);
97
+ --xh-_segmented-px: var(--xh-control-px-lg);
98
+ --xh-_segmented-gap: var(--xh-control-gap-lg);
99
+ --xh-_segmented-font-size: var(--xh-control-font-lg);
100
+ }
101
+
102
+ /* 段自己也定位,于是与绝对定位的指示器按文档序比高低:
103
+ 指示器写在段之前,段与它的焦点环便压在指示器上面,不必动层号 */
104
+ [data-scope='segmented'][data-part='item'] {
105
+ position: relative;
106
+ display: inline-flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ gap: var(--xh-segmented-item-gap, var(--xh-_segmented-gap));
110
+ block-size: var(--xh-segmented-item-h, var(--xh-_segmented-h));
111
+ padding-inline: var(--xh-segmented-item-px, var(--xh-_segmented-px));
112
+ border: 0;
113
+ border-radius: var(--xh-segmented-item-radius, var(--xh-shape-inset));
114
+ background: transparent;
115
+ color: var(--xh-segmented-item-fg, var(--xh-fg-muted));
116
+ /* 按钮不继承宿主字体,尺寸档在 root 上,两者都要显式接过来 */
117
+ font-family: inherit;
118
+ font-size: inherit;
119
+ font-weight: var(--xh-segmented-item-font-weight, var(--xh-text-label-weight));
120
+ line-height: var(--xh-leading-none);
121
+ white-space: nowrap;
122
+ cursor: pointer;
123
+ user-select: none;
124
+ transition:
125
+ color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
126
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
127
+ scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
128
+ }
129
+
130
+ /* 选中态:单选是 role=radio + aria-checked,样式一律读 data-state,不读 ARIA。
131
+ 文字色也要跟着变——指示器是可选部件,作者不渲染它时"当前是哪一段"仍然要看得出来 */
132
+ [data-scope='segmented'][data-part='item'][data-state='checked'] {
133
+ color: var(--xh-segmented-item-fg-checked, var(--xh-_segmented-fg-selected));
134
+ }
135
+
136
+ /* 悬停只提亮未选中的那几段:选中段的底下压着指示器,再变色就成了两套强调。
137
+ 底色用中性的悬停档——它是「指哪一段」的轻反馈,不表达选中 */
138
+ [data-scope='segmented'][data-part='item']:not([data-disabled]):not([data-state='checked']):hover {
139
+ background-color: var(--xh-segmented-item-bg-hover, var(--xh-bg-subtle-hover));
140
+ color: var(--xh-segmented-item-fg-hover, var(--xh-fg-default));
141
+ }
142
+
143
+ /* 按下去要有回应:整段轻微下压,松手即弹回。选中段也压——按在已选段上同样是一次点击。
144
+ 只读段不压:它本来就不接受改值,压下去等于骗人 */
145
+ [data-scope='segmented'][data-part='item']:not([data-disabled]):not([data-readonly]):active {
146
+ scale: var(--xh-segmented-item-press-scale, var(--xh-motion-scale-press));
147
+ }
148
+
149
+ /* 只读:值改不动,但对比度不降,光标也不摆出"禁止"的样子 */
150
+ [data-scope='segmented'][data-part='item'][data-readonly] {
151
+ cursor: default;
152
+ }
153
+
154
+ /* 集合条目一律 aria-disabled 而非原生 disabled(禁用段仍要能当方向键的起点),
155
+ 所以这里读 data-disabled,写 :disabled 永远不命中。
156
+ 用了 fg-disabled 就不再叠 opacity:半透明会把底下的指示器透出来 */
157
+ [data-scope='segmented'][data-part='item'][data-disabled] {
158
+ color: var(--xh-fg-disabled);
159
+ cursor: not-allowed;
160
+ }
161
+
162
+ /* 禁用且选中的那一段不换文字色:它压着的是指示器的实心底,换成 fg-disabled 后
163
+ 六族语气实测只剩 1.04–3.01 的对比度,「当前选的是哪一段」当场看不见。
164
+ 禁用由轨道底色、未选中段的文字色与光标表达,选中段保持可读 */
165
+ [data-scope='segmented'][data-part='item'][data-disabled][data-state='checked'] {
166
+ color: var(--xh-segmented-item-fg-checked-disabled, var(--xh-_segmented-fg-selected));
167
+ }
168
+
169
+ /* 焦点环往内收一格:段贴着轨道内缘,往外画会被 root 的描边切掉一半 */
170
+ [data-scope='segmented'][data-part='item']:focus-visible {
171
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
172
+ outline-offset: calc(-1 * var(--xh-ring-offset));
173
+ }
174
+
175
+ [data-scope='segmented'][data-part='item-text'] {
176
+ color: inherit;
177
+ user-select: none;
178
+ }
179
+
180
+ [data-scope='segmented'][data-part='indicator'] {
181
+ /* 位置与尺寸由连接层量好写成内联样式(它量得到,样式表量不到);
182
+ 这四个是还没量到时的落点,量到即被内联样式盖过 */
183
+ --xh-_segmented-indicator-x: 0;
184
+ --xh-_segmented-indicator-y: 0;
185
+ --xh-_segmented-indicator-w: 0;
186
+ --xh-_segmented-indicator-h: 0;
187
+
188
+ position: absolute;
189
+ display: block;
190
+ inset-inline-start: var(--xh-_segmented-indicator-x);
191
+ inset-block-start: var(--xh-_segmented-indicator-y);
192
+ inline-size: var(--xh-_segmented-indicator-w);
193
+ block-size: var(--xh-_segmented-indicator-h);
194
+ border-radius: var(--xh-segmented-indicator-radius, var(--xh-shape-inset));
195
+ background: var(--xh-segmented-indicator-bg, var(--xh-_segmented-indicator-bg));
196
+ box-shadow: var(--xh-segmented-indicator-shadow, var(--xh-elevation-raised));
197
+ /* 段压在它上面,点击一律交给段;作者把它写在段之后时也不至于吞掉点击 */
198
+ pointer-events: none;
199
+ /* 用标准曲线而不是进场那条:滑块是被推过去的,起步就该有速度,
200
+ 纯减速曲线看着像自己飘过去。四个几何量同时走,段宽不等时才不会先变形再挪位 */
201
+ transition:
202
+ inset-inline-start var(--xh-motion-duration-enter) var(--xh-ease-standard),
203
+ inset-block-start var(--xh-motion-duration-enter) var(--xh-ease-standard),
204
+ inline-size var(--xh-motion-duration-enter) var(--xh-ease-standard),
205
+ block-size var(--xh-motion-duration-enter) var(--xh-ease-standard);
206
+ }
207
+
208
+ /* 给了 display 的角色节点必须补这条:display 声明会盖掉 UA 的 [hidden]{display:none},
209
+ 不补的话作者给节点加 hidden 后它照样显示 */
210
+ [data-scope='segmented'][data-part='root'][hidden],
211
+ [data-scope='segmented'][data-part='item'][hidden],
212
+ [data-scope='segmented'][data-part='indicator'][hidden] {
213
+ display: none;
214
+ }
215
+ }