@xihan-ui/styles 3.2.0 → 4.0.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 (232) hide show
  1. package/CHANGELOG.md +441 -0
  2. package/component-tokens.d.ts +229 -60
  3. package/components.tokens.json +5124 -1555
  4. package/css/accordion.css +47 -20
  5. package/css/alert.css +14 -15
  6. package/css/anchor.css +2 -2
  7. package/css/approval.css +37 -13
  8. package/css/avatar-group.css +9 -12
  9. package/css/avatar.css +20 -18
  10. package/css/back-top.css +21 -7
  11. package/css/badge.css +5 -5
  12. package/css/breadcrumb.css +18 -16
  13. package/css/button-group.css +4 -6
  14. package/css/button.css +4 -7
  15. package/css/calendar-picker.css +177 -94
  16. package/css/calendar-range-picker.css +206 -121
  17. package/css/card.css +34 -6
  18. package/css/carousel.css +65 -49
  19. package/css/cascader.css +41 -29
  20. package/css/checkbox-group.css +9 -6
  21. package/css/checkbox.css +5 -4
  22. package/css/citation.css +7 -2
  23. package/css/clipboard.css +20 -4
  24. package/css/collapsible.css +29 -14
  25. package/css/color-field.css +4 -4
  26. package/css/color-picker.css +77 -23
  27. package/css/color-slider.css +10 -8
  28. package/css/color-swatch-picker.css +5 -5
  29. package/css/combobox.css +14 -10
  30. package/css/command.css +13 -8
  31. package/css/context-menu.css +10 -5
  32. package/css/date-field.css +4 -4
  33. package/css/date-picker.css +165 -102
  34. package/css/date-range-picker.css +186 -123
  35. package/css/description.css +10 -6
  36. package/css/descriptions.css +47 -19
  37. package/css/dialog.css +50 -35
  38. package/css/drawer.css +75 -21
  39. package/css/editable.css +15 -41
  40. package/css/empty-state.css +21 -3
  41. package/css/field-array.css +4 -1
  42. package/css/field.css +17 -18
  43. package/css/fieldset.css +33 -13
  44. package/css/file-upload.css +65 -32
  45. package/css/float-button.css +25 -15
  46. package/css/floating-panel.css +1 -1
  47. package/css/form.css +24 -10
  48. package/css/grid-list.css +1 -1
  49. package/css/highlight.css +4 -4
  50. package/css/hover-card.css +19 -12
  51. package/css/image-viewer.css +77 -27
  52. package/css/image.css +12 -4
  53. package/css/infinite-scroll.css +8 -4
  54. package/css/input-group.css +74 -26
  55. package/css/kbd.css +1 -1
  56. package/css/label.css +27 -11
  57. package/css/layout.css +17 -10
  58. package/css/list.css +13 -9
  59. package/css/listbox.css +12 -7
  60. package/css/loading-bar.css +3 -0
  61. package/css/mention.css +10 -8
  62. package/css/menu.css +10 -5
  63. package/css/menubar.css +13 -8
  64. package/css/navigation-menu.css +2 -2
  65. package/css/notification.css +114 -31
  66. package/css/number-animation.css +2 -2
  67. package/css/number-field.css +60 -37
  68. package/css/page-header.css +63 -26
  69. package/css/pagination.css +35 -38
  70. package/css/password-input.css +10 -66
  71. package/css/pin-input.css +18 -26
  72. package/css/popconfirm.css +20 -11
  73. package/css/popover.css +18 -12
  74. package/css/progress.css +14 -13
  75. package/css/prompt-input.css +3 -3
  76. package/css/question-flow.css +33 -7
  77. package/css/radio-group.css +120 -55
  78. package/css/rating.css +31 -14
  79. package/css/select.css +14 -10
  80. package/css/separator.css +22 -4
  81. package/css/side-nav.css +16 -11
  82. package/css/signature-pad.css +23 -9
  83. package/css/skeleton.css +7 -7
  84. package/css/slider.css +71 -42
  85. package/css/sparkline.css +8 -2
  86. package/css/spinner.css +40 -20
  87. package/css/statistic.css +14 -14
  88. package/css/steps.css +115 -84
  89. package/css/switch.css +9 -7
  90. package/css/table.css +27 -10
  91. package/css/tabs.css +35 -12
  92. package/css/tag-group.css +17 -6
  93. package/css/tag.css +54 -29
  94. package/css/tags-input.css +38 -19
  95. package/css/text-field.css +5 -5
  96. package/css/time-field.css +4 -4
  97. package/css/time-picker.css +150 -64
  98. package/css/time-range-picker.css +91 -62
  99. package/css/timeline.css +37 -20
  100. package/css/timer.css +3 -3
  101. package/css/toggle-group.css +4 -4
  102. package/css/tool-call.css +6 -4
  103. package/css/toolbar.css +6 -5
  104. package/css/tooltip.css +15 -16
  105. package/css/tour.css +14 -7
  106. package/css/transfer.css +22 -16
  107. package/css/tree-select.css +10 -10
  108. package/css/tree.css +26 -25
  109. package/css/typography.css +28 -25
  110. package/dist/css/accordion.css +47 -20
  111. package/dist/css/alert.css +14 -15
  112. package/dist/css/anchor.css +2 -2
  113. package/dist/css/approval.css +37 -13
  114. package/dist/css/avatar-group.css +9 -12
  115. package/dist/css/avatar.css +20 -18
  116. package/dist/css/back-top.css +21 -7
  117. package/dist/css/badge.css +5 -5
  118. package/dist/css/breadcrumb.css +18 -16
  119. package/dist/css/button-group.css +4 -6
  120. package/dist/css/button.css +4 -7
  121. package/dist/css/calendar-picker.css +177 -94
  122. package/dist/css/calendar-range-picker.css +206 -121
  123. package/dist/css/card.css +34 -6
  124. package/dist/css/carousel.css +65 -49
  125. package/dist/css/cascader.css +41 -29
  126. package/dist/css/checkbox-group.css +9 -6
  127. package/dist/css/checkbox.css +5 -4
  128. package/dist/css/citation.css +7 -2
  129. package/dist/css/clipboard.css +20 -4
  130. package/dist/css/collapsible.css +29 -14
  131. package/dist/css/color-field.css +4 -4
  132. package/dist/css/color-picker.css +77 -23
  133. package/dist/css/color-slider.css +10 -8
  134. package/dist/css/color-swatch-picker.css +5 -5
  135. package/dist/css/combobox.css +14 -10
  136. package/dist/css/command.css +13 -8
  137. package/dist/css/context-menu.css +10 -5
  138. package/dist/css/date-field.css +4 -4
  139. package/dist/css/date-picker.css +165 -102
  140. package/dist/css/date-range-picker.css +186 -123
  141. package/dist/css/description.css +10 -6
  142. package/dist/css/descriptions.css +47 -19
  143. package/dist/css/dialog.css +50 -35
  144. package/dist/css/drawer.css +75 -21
  145. package/dist/css/editable.css +15 -41
  146. package/dist/css/empty-state.css +21 -3
  147. package/dist/css/field-array.css +4 -1
  148. package/dist/css/field.css +17 -18
  149. package/dist/css/fieldset.css +33 -13
  150. package/dist/css/file-upload.css +65 -32
  151. package/dist/css/float-button.css +25 -15
  152. package/dist/css/floating-panel.css +1 -1
  153. package/dist/css/form.css +24 -10
  154. package/dist/css/grid-list.css +1 -1
  155. package/dist/css/highlight.css +4 -4
  156. package/dist/css/hover-card.css +19 -12
  157. package/dist/css/image-viewer.css +77 -27
  158. package/dist/css/image.css +12 -4
  159. package/dist/css/infinite-scroll.css +8 -4
  160. package/dist/css/input-group.css +74 -26
  161. package/dist/css/kbd.css +1 -1
  162. package/dist/css/label.css +27 -11
  163. package/dist/css/layout.css +17 -10
  164. package/dist/css/list.css +13 -9
  165. package/dist/css/listbox.css +12 -7
  166. package/dist/css/loading-bar.css +3 -0
  167. package/dist/css/mention.css +10 -8
  168. package/dist/css/menu.css +10 -5
  169. package/dist/css/menubar.css +13 -8
  170. package/dist/css/navigation-menu.css +2 -2
  171. package/dist/css/notification.css +114 -31
  172. package/dist/css/number-animation.css +2 -2
  173. package/dist/css/number-field.css +60 -37
  174. package/dist/css/page-header.css +63 -26
  175. package/dist/css/pagination.css +35 -38
  176. package/dist/css/password-input.css +10 -66
  177. package/dist/css/pin-input.css +18 -26
  178. package/dist/css/popconfirm.css +20 -11
  179. package/dist/css/popover.css +18 -12
  180. package/dist/css/progress.css +14 -13
  181. package/dist/css/prompt-input.css +3 -3
  182. package/dist/css/question-flow.css +33 -7
  183. package/dist/css/radio-group.css +120 -55
  184. package/dist/css/rating.css +31 -14
  185. package/dist/css/select.css +14 -10
  186. package/dist/css/separator.css +22 -4
  187. package/dist/css/side-nav.css +16 -11
  188. package/dist/css/signature-pad.css +23 -9
  189. package/dist/css/skeleton.css +7 -7
  190. package/dist/css/slider.css +71 -42
  191. package/dist/css/sparkline.css +8 -2
  192. package/dist/css/spinner.css +40 -20
  193. package/dist/css/statistic.css +14 -14
  194. package/dist/css/steps.css +115 -84
  195. package/dist/css/switch.css +9 -7
  196. package/dist/css/table.css +27 -10
  197. package/dist/css/tabs.css +35 -12
  198. package/dist/css/tag-group.css +17 -6
  199. package/dist/css/tag.css +54 -29
  200. package/dist/css/tags-input.css +38 -19
  201. package/dist/css/text-field.css +5 -5
  202. package/dist/css/time-field.css +4 -4
  203. package/dist/css/time-picker.css +150 -64
  204. package/dist/css/time-range-picker.css +91 -62
  205. package/dist/css/timeline.css +37 -20
  206. package/dist/css/timer.css +3 -3
  207. package/dist/css/toggle-group.css +4 -4
  208. package/dist/css/tool-call.css +6 -4
  209. package/dist/css/toolbar.css +6 -5
  210. package/dist/css/tooltip.css +15 -16
  211. package/dist/css/tour.css +14 -7
  212. package/dist/css/transfer.css +22 -16
  213. package/dist/css/tree-select.css +10 -10
  214. package/dist/css/tree.css +26 -25
  215. package/dist/css/typography.css +28 -25
  216. package/dist/family/action-control.css +30 -24
  217. package/dist/family/chart.css +57 -0
  218. package/dist/family/collection-item.css +12 -8
  219. package/dist/family/field-chrome.css +28 -19
  220. package/dist/family/loading-ring.css +20 -13
  221. package/dist/family/swatch.css +4 -4
  222. package/dist/family/tag-list.css +6 -0
  223. package/family/action-control.css +30 -24
  224. package/family/chart.css +57 -0
  225. package/family/collection-item.css +12 -8
  226. package/family/field-chrome.css +28 -19
  227. package/family/loading-ring.css +20 -13
  228. package/family/swatch.css +4 -4
  229. package/family/tag-list.css +6 -0
  230. package/index.css +3580 -2060
  231. package/index.unlayered.css +3579 -2060
  232. package/package.json +2 -2
@@ -5,6 +5,9 @@
5
5
 
6
6
  /* 定义 page header 样式。 */
7
7
 
8
+ /* 返回钮接动作钮家族:独立引入本皮肤时同样带上家族配方,full bundle 递归去重。 */
9
+ @import '../family/action-control.css';
10
+
8
11
  @layer xihan.components {
9
12
  /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
13
  [data-scope='page-header'] {
@@ -14,16 +17,17 @@
14
17
  [data-scope='page-header'][data-part='root'] {
15
18
  /* 尺寸档只换这三个私有槽,各段从根上继承它们,换档不必给每个部件各写一条选择器 */
16
19
  --xh-_page-header-py: var(--xh-space-4);
17
- --xh-_page-header-row-gap: var(--xh-space-2);
18
- --xh-_page-header-title-size: var(--xh-text-heading-3-size);
20
+ --xh-_page-header-row-gap: var(--xh-space-1);
21
+ --xh-_page-header-title-size: var(--xh-text-heading-2-size);
19
22
  /* 形态档只换这两个:不画面的那一档左右不留内衬、也不切圆角 */
20
23
  --xh-_page-header-px: 0;
21
24
  --xh-_page-header-radius: 0;
22
25
 
23
- /* 返回、媒体、标题区与操作区分列;标题与说明上下排列。 */
26
+ /* 返回、媒体、标题、副标题与操作区分列:副标题跟在标题后面同一行,中间一条竖线隔开。
27
+ 标题列按内容宽、但能收到 0,副标题列至少留下竖线与一个字:不可断的长标题在列内断行,不把页头撑出容器 */
24
28
  display: grid;
25
29
  grid-auto-flow: dense;
26
- grid-template-columns: auto auto minmax(0, 1fr) auto;
30
+ grid-template-columns: auto auto minmax(0, max-content) minmax(min-content, 1fr) auto;
27
31
  align-items: center;
28
32
  row-gap: var(--xh-page-header-row-gap, var(--xh-_page-header-row-gap));
29
33
  padding-block: var(--xh-page-header-py, var(--xh-_page-header-py));
@@ -40,21 +44,26 @@
40
44
  /* —— 尺寸 —— */
41
45
  [data-scope='page-header'][data-part='root'][data-size='sm'] {
42
46
  --xh-_page-header-py: var(--xh-space-3);
43
- --xh-_page-header-row-gap: var(--xh-space-1);
47
+ --xh-_page-header-row-gap: var(--xh-space-0_5);
44
48
  --xh-_page-header-title-size: var(--xh-control-font-lg);
45
49
  }
46
50
 
47
51
  [data-scope='page-header'][data-part='root'][data-size='lg'] {
48
52
  --xh-_page-header-py: var(--xh-space-6);
49
- --xh-_page-header-row-gap: var(--xh-space-3);
50
- --xh-_page-header-title-size: var(--xh-text-heading-2-size);
53
+ --xh-_page-header-row-gap: var(--xh-space-2);
54
+ --xh-_page-header-title-size: var(--xh-text-heading-1-size);
55
+ }
56
+
57
+ /* 带面包屑的缺省档上下收一档:面包屑本身已在标题之上占了一行 */
58
+ [data-scope='page-header'][data-part='root']:not([data-size='sm'], [data-size='lg']):has(> [data-part='breadcrumb']) {
59
+ --xh-_page-header-py: var(--xh-space-3);
51
60
  }
52
61
 
53
62
  /* —— 分隔线 —— */
54
63
  /* 只有贴底的 ghost 画这条下边线:一块切了圆角的面底下横一条直线,两头会露在圆角外面,
55
64
  有面的两档由自己的边界接手同一件事——把页头与下面的内容分开 */
56
65
  [data-scope='page-header'][data-part='root'][data-variant='ghost'][data-split] {
57
- border-block-end: var(--xh-stroke-thin) solid var(--xh-page-header-border, var(--xh-border-subtle));
66
+ border-block-end: var(--xh-stroke-thin) solid var(--xh-page-header-border, var(--xh-border-default));
58
67
  }
59
68
 
60
69
  /* —— 形态 —— */
@@ -96,13 +105,14 @@
96
105
  justify-content: center;
97
106
  }
98
107
 
99
- /* 返回位只摆位置与对齐,外观归作者自己的按钮 */
108
+ /* 返回位是 icon ghost 档的动作钮:盒与三态面由家族给,这里只摆位置并把字色压到次级前景 */
100
109
  [data-scope='page-header'][data-part='back-trigger'] {
110
+ --xh-action-fg-rest: var(--xh-page-header-back-fg, var(--xh-fg-muted));
111
+ --xh-action-fg-hover: var(--xh-page-header-back-fg-hover, var(--xh-fg-default));
112
+ --xh-action-fg-pressed: var(--xh-page-header-back-fg-hover, var(--xh-fg-default));
113
+
101
114
  grid-column: 1;
102
115
  margin-inline-end: var(--xh-page-header-column-gap, var(--xh-space-3));
103
- display: inline-flex;
104
- align-items: center;
105
- justify-content: center;
106
116
  }
107
117
 
108
118
  [data-scope='page-header'][data-part='title'] {
@@ -115,23 +125,36 @@
115
125
  color: var(--xh-page-header-title-fg, var(--xh-fg-default));
116
126
  font-size: var(--xh-page-header-title-font-size, var(--xh-_page-header-title-size));
117
127
  /* 页面级标题:字重走标题档令牌,不直接下探字重原语 */
118
- font-weight: var(--xh-page-header-title-font-weight, var(--xh-text-heading-3-weight));
128
+ font-weight: var(--xh-page-header-title-font-weight, var(--xh-text-heading-2-weight));
119
129
  line-height: var(--xh-leading-tight);
120
130
  }
121
131
 
122
- /* 副标题吃掉标题与操作之间的剩余宽度,长文本在这里收窄换行 */
132
+ /* 副标题跟在标题后面、吃掉到操作区之间的剩余宽度,长文本在这里收窄换行;
133
+ 与标题之间一条 1 × 16px 的竖线,两侧各 12px */
123
134
  [data-scope='page-header'][data-part='description'] {
124
- grid-column: 3;
135
+ grid-column: 4;
136
+ display: flex;
137
+ align-items: center;
125
138
  margin: 0;
126
139
  min-inline-size: 0;
127
- color: var(--xh-page-header-description-fg, var(--xh-fg-muted));
128
- font-size: var(--xh-page-header-description-font-size, var(--xh-text-secondary-size));
140
+ color: var(--xh-page-header-description-fg, var(--xh-fg-subtle));
141
+ font-size: var(--xh-page-header-description-font-size, var(--xh-text-body-size));
129
142
  line-height: var(--xh-leading-normal);
130
143
  }
131
144
 
145
+ [data-scope='page-header'][data-part='title'] + [data-scope='page-header'][data-part='description']::before {
146
+ content: '';
147
+ flex: none;
148
+ align-self: center;
149
+ inline-size: var(--xh-stroke-thin);
150
+ block-size: var(--xh-glyph-size-sm);
151
+ margin-inline: var(--xh-space-3);
152
+ background: var(--xh-page-header-divider, var(--xh-border-default));
153
+ }
154
+
132
155
  /* 操作区贴到行尾,没有副标题占位时也一样靠边 */
133
156
  [data-scope='page-header'][data-part='extra'] {
134
- grid-column: 4;
157
+ grid-column: 5;
135
158
  display: flex;
136
159
  flex-wrap: wrap;
137
160
  align-items: center;
@@ -140,21 +163,17 @@
140
163
  justify-self: end;
141
164
  }
142
165
 
143
- /* 页脚占满一整行,前面有内容时自然被挤到下一行 */
166
+ /* 页脚占满一整行,前面有内容时自然被挤到下一行;与标题行之间再让出 12px */
144
167
  [data-scope='page-header'][data-part='footer'] {
145
168
  grid-column: 1 / -1;
169
+ margin-block-start: var(--xh-space-3);
146
170
  color: var(--xh-page-header-footer-fg, var(--xh-fg-muted));
147
171
  font-size: var(--xh-page-header-footer-font-size, var(--xh-text-secondary-size));
148
172
  line-height: var(--xh-leading-normal);
149
173
  }
150
174
 
151
- [data-scope='page-header'][data-part='root']:has(> [data-part='description'])
152
- > :is([data-part='back-trigger'], [data-part='media'], [data-part='extra']):where([data-scope='page-header']) {
153
- grid-row: span 2;
154
- }
155
-
156
- /* 窄于 sm 断点时标题区占满第二列、操作区换到下一行。写成 min-width 的补集:640px 本身归宽档,
157
- 与其余皮肤在同一宽度切换 */
175
+ /* 窄于 sm 断点时标题区占满第二列、副标题回到标题下一行、操作区换到再下一行。
176
+ 写成 min-width 的补集:640px 本身归宽档,与其余皮肤在同一宽度切换 */
158
177
  @media not all and (min-width: 640px) {
159
178
  [data-scope='page-header'][data-part='root'] {
160
179
  grid-template-columns: auto minmax(0, 1fr);
@@ -166,6 +185,15 @@
166
185
  grid-column: 2;
167
186
  }
168
187
 
188
+ [data-scope='page-header'][data-part='title'] + [data-scope='page-header'][data-part='description']::before {
189
+ display: none;
190
+ }
191
+
192
+ [data-scope='page-header'][data-part='root']:has(> [data-part='description'])
193
+ > :is([data-part='back-trigger'], [data-part='media']):where([data-scope='page-header']) {
194
+ grid-row: span 2;
195
+ }
196
+
169
197
  [data-scope='page-header'][data-part='root'] > [data-part='extra']:where([data-scope='page-header']) {
170
198
  grid-column: 1 / -1;
171
199
  grid-row: auto;
@@ -174,10 +202,19 @@
174
202
  }
175
203
  }
176
204
 
205
+ /* 强制色:标题与副标题之间的竖线是底色画的,系统换掉底色线就消失,改写 CanvasText */
206
+ @media (forced-colors: active) {
207
+ [data-scope='page-header'][data-part='title'] + [data-scope='page-header'][data-part='description']::before {
208
+ forced-color-adjust: none;
209
+ background: CanvasText;
210
+ }
211
+ }
212
+
177
213
  /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
178
214
  写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
179
215
  [data-scope='page-header'][data-part='back-trigger'][hidden],
180
216
  [data-scope='page-header'][data-part='media'][hidden],
217
+ [data-scope='page-header'][data-part='description'][hidden],
181
218
  [data-scope='page-header'][data-part='extra'][hidden] {
182
219
  display: none;
183
220
  }
@@ -22,20 +22,22 @@
22
22
  /* 作者塞进面板或分页行里的图标按档取字形尺;四类格子上另按家族档位取同一把尺 */
23
23
  --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-glyph-size-md));
24
24
 
25
- /* 尺寸档只换这三个私有槽,上一页/下一页、页码与省略号都从这两处继承它们,
26
- 换档不必给每个部件各写一条选择器 */
25
+ /* 尺寸档只换这几个私有槽,上一页/下一页、页码与省略号都从这两处继承它们,
26
+ 换档不必给每个部件各写一条选择器。格子的横内衬比控件尺窄一档:一位数的页码加两侧内衬
27
+ 要收得进方格的最小宽度,格子才是正方的;跳页输入框是字段,仍取控件尺的横内衬 */
27
28
  --xh-_pagination-item-size: var(--xh-control-h-md);
28
- --xh-_pagination-item-px: var(--xh-control-px-md);
29
+ --xh-_pagination-item-px: var(--xh-space-2);
30
+ --xh-_pagination-jumper-px: var(--xh-control-px-md);
29
31
  --xh-_pagination-font-size: var(--xh-control-font-md);
30
32
 
31
33
  /* 当前页的选中态随语气走。没写 data-tone 时这几个 --xh-_tone-* 都没被声明,
32
34
  退回原来的品牌底与其配色。聚焦环不在其列,它恒是 --xh-ring-focus */
33
- --xh-_pagination-selected-bg: var(--xh-_tone, var(--xh-bg-brand));
34
- --xh-_pagination-selected-bg-hover: var(--xh-_tone-hover, var(--xh-bg-brand-hover));
35
- --xh-_pagination-selected-bg-active: var(--xh-_tone-active, var(--xh-bg-brand-active));
36
- --xh-_pagination-selected-fg: var(--xh-_tone-on, var(--xh-fg-on-brand));
35
+ --xh-_pagination-selected-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
36
+ --xh-_pagination-selected-bg-hover: var(--xh-_tone-subtle-hover, var(--xh-bg-brand-subtle-hover));
37
+ --xh-_pagination-selected-bg-active: var(--xh-_tone-subtle-active, var(--xh-bg-brand-subtle-active));
38
+ --xh-_pagination-selected-fg: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
39
+ --xh-_pagination-selected-border: var(--xh-_tone-border-control, var(--xh-bg-brand));
37
40
  /* 当前页那一格是实心底,顶边画一条极浅的内高光把它衬出厚度(solid 面允许顶高光,经家族的 highlight 槽画) */
38
- --xh-_pagination-highlight: var(--xh-_highlight-tone);
39
41
  }
40
42
 
41
43
  /* 根节点是 nav 地标,只负责把上一页 / 页码 / 下一页排成一行。
@@ -55,14 +57,16 @@
55
57
  [data-scope='pagination']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
56
58
  --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-glyph-size-sm));
57
59
  --xh-_pagination-item-size: var(--xh-control-h-sm);
58
- --xh-_pagination-item-px: var(--xh-control-px-sm);
60
+ --xh-_pagination-item-px: var(--xh-space-1_5);
61
+ --xh-_pagination-jumper-px: var(--xh-control-px-sm);
59
62
  --xh-_pagination-font-size: var(--xh-control-font-sm);
60
63
  }
61
64
 
62
65
  [data-scope='pagination']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
63
66
  --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-glyph-size-lg));
64
67
  --xh-_pagination-item-size: var(--xh-control-h-lg);
65
- --xh-_pagination-item-px: var(--xh-control-px-lg);
68
+ --xh-_pagination-item-px: var(--xh-space-2_5);
69
+ --xh-_pagination-jumper-px: var(--xh-control-px-lg);
66
70
  --xh-_pagination-font-size: var(--xh-control-font-lg);
67
71
  }
68
72
 
@@ -70,9 +74,9 @@
70
74
  display: none;
71
75
  }
72
76
 
73
- /* 各类格子接 Action Control 的 text 档,缺省中性的 ghost 形态(只有 Button 品牌实心):盒型、三档几何、
74
- 透明描边(省略号也占一条,两者内容盒等高,一行里对得齐)、悬停 100 → 按下 200(画布承载)、禁用面、按压缩放与
75
- 过渡都由家族给;这里只把使用者槽映射到桥接槽并保留分页自己的排版。
77
+ /* 各类格子接 Action Control 的 text 档(连接层投影 ghost 形态):盒型、三档几何、禁用面、按压与过渡都由家族给。
78
+ 分页把每一格画成描边方块:静息一道装饰边、透明底,悬停边加深一档、字转正文色,底走家族的承载面阶梯;
79
+ 省略位也占同样一格,几种格子内容盒等高,一行里对得齐。这里把使用者槽映射到桥接槽并保留分页自己的排版。
76
80
  等宽的关键:1 与 10 的内容宽度不同,靠最小宽度把它们撑到同一格,行宽才不会随当前页左右抖动 */
77
81
  [data-scope='pagination'][data-part='first-trigger'],
78
82
  [data-scope='pagination'][data-part='prev-trigger'],
@@ -83,14 +87,19 @@
83
87
  --xh-action-min-inline-size: var(--xh-pagination-item-min-size, var(--xh-_pagination-item-size));
84
88
  --xh-action-visual-size: var(--xh-pagination-item-h, var(--xh-_pagination-item-size));
85
89
  --xh-action-padding-inline: var(--xh-pagination-item-px, var(--xh-_pagination-item-px));
86
- --xh-action-radius: var(--xh-pagination-item-radius, var(--xh-shape-control));
90
+ --xh-action-radius: var(--xh-pagination-item-radius, var(--xh-shape-surface));
87
91
  --xh-action-font-size: var(--xh-pagination-font-size, var(--xh-_pagination-font-size));
88
92
  --xh-action-bg-rest: var(--xh-pagination-item-bg, var(--xh-_action-variant-bg-rest));
89
93
  --xh-action-bg-hover: var(--xh-pagination-item-bg-hover, var(--xh-_action-variant-bg-hover));
90
94
  --xh-action-bg-pressed: var(--xh-pagination-item-bg-active, var(--xh-_action-variant-bg-pressed));
95
+ --xh-action-border-rest: var(--xh-pagination-item-border, var(--xh-border-default));
96
+ --xh-action-border-hover: var(--xh-pagination-item-border-hover, var(--xh-border-strong));
97
+ --xh-action-border-pressed: var(--xh-pagination-item-border-hover, var(--xh-border-strong));
98
+ --xh-action-border-focus-visible: var(--xh-pagination-item-border, var(--xh-border-default));
99
+ --xh-action-border-disabled: var(--xh-pagination-item-border, var(--xh-border-default));
91
100
  --xh-action-fg-rest: var(--xh-pagination-item-fg, var(--xh-_action-variant-fg-rest));
92
- --xh-action-fg-hover: var(--xh-pagination-item-fg, var(--xh-_action-variant-fg-hover));
93
- --xh-action-fg-pressed: var(--xh-pagination-item-fg, var(--xh-_action-variant-fg-pressed));
101
+ --xh-action-fg-hover: var(--xh-pagination-item-fg, var(--xh-fg-default));
102
+ --xh-action-fg-pressed: var(--xh-pagination-item-fg, var(--xh-fg-default));
94
103
  /* 作者塞进翻页钮的图标按档取字形尺,与皮肤画的兜底字形同一把尺 */
95
104
  --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-_action-profile-glyph-size));
96
105
 
@@ -112,10 +121,9 @@
112
121
  /* 到头那一侧的翻页钮是原生 disabled(不可聚焦、进不了 Tab 序列),连接层同时给 data-disabled,
113
122
  家族按 data-disabled 画禁用面(透明底 + --xh-fg-disabled);整组 disabled 时页码与省略位同样如此 */
114
123
 
115
- /* 当前页(格状当前):data-current 与 aria-current='page' 由连接层成对给出,样式挂在 data 钩子上,
116
- 无障碍语义留给 aria。实心品牌面 + 配对前景、不加粗——字重一变字形就变宽,页码格子会跟着长一点,
117
- 正是这里要避免的抖动;悬停 / 按下沿 brand → brand-hover → brand-active 走,三态都经桥接槽交给家族画,
118
- solid 面允许一条顶高光,环色改取面自己的前景 */
124
+ /* 当前页:data-current 与 aria-current='page' 由连接层成对给出,样式挂在 data 钩子上,无障碍语义留给 aria。
125
+ 品牌描边 + 品牌淡底 + 淡底前景、不加粗——字重一变字形就变宽,页码格子会跟着长一点,正是这里要避免的抖动;
126
+ 悬停 / 按下沿淡底 12% → 20% → 28% 走,边不变,三态都经桥接槽交给家族画 */
119
127
  [data-scope='pagination'][data-part='item'][data-current] {
120
128
  --xh-action-bg-rest: var(--xh-pagination-item-bg-selected, var(--xh-_pagination-selected-bg));
121
129
  --xh-action-bg-hover: var(--xh-pagination-item-bg-selected-hover, var(--xh-_pagination-selected-bg-hover));
@@ -125,22 +133,17 @@
125
133
  --xh-action-fg-hover: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
126
134
  --xh-action-fg-pressed: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
127
135
  --xh-action-fg-focus-visible: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
128
- --xh-action-border-rest: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-bg));
129
- --xh-action-border-hover: var(--xh-pagination-item-border-selected-hover, var(--xh-_pagination-selected-bg-hover));
130
- --xh-action-border-pressed: var(--xh-pagination-item-border-selected-active, var(--xh-_pagination-selected-bg-active));
131
- --xh-action-border-focus-visible: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-bg));
132
- --xh-action-highlight-rest: var(--xh-_pagination-highlight);
133
- --xh-action-highlight-hover: var(--xh-_pagination-highlight);
134
- --xh-action-highlight-pressed: var(--xh-_pagination-highlight);
135
- --xh-action-highlight-focus-visible: var(--xh-_pagination-highlight);
136
+ --xh-action-border-rest: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-border));
137
+ --xh-action-border-hover: var(--xh-pagination-item-border-selected-hover, var(--xh-_pagination-selected-border));
138
+ --xh-action-border-pressed: var(--xh-pagination-item-border-selected-active, var(--xh-_pagination-selected-border));
139
+ --xh-action-border-focus-visible: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-border));
136
140
  --xh-action-shadow-rest: var(--xh-pagination-item-shadow, none);
137
141
  --xh-action-shadow-hover: var(--xh-pagination-item-shadow, none);
138
142
  --xh-action-shadow-pressed: var(--xh-pagination-item-shadow, none);
139
143
  --xh-action-shadow-focus-visible: var(--xh-pagination-item-shadow, none);
140
- --xh-action-ring-color-focus-visible: currentColor;
141
144
  }
142
145
 
143
- /* 整组禁用时当前页不跟着透明:实心品牌面退成淡底、字取禁用色,格子仍标得出位置,又一眼看得出按不动 */
146
+ /* 整组禁用时当前页不跟着透明:品牌淡底退成中性淡底、字取禁用色,格子仍标得出位置,又一眼看得出按不动 */
144
147
  [data-scope='pagination'][data-part='item'][data-current][data-disabled] {
145
148
  --xh-action-bg-disabled: var(--xh-bg-subtle);
146
149
  --xh-action-border-disabled: var(--xh-bg-subtle);
@@ -192,7 +195,7 @@
192
195
  高度、内衬与圆角跟页码格子同一把尺,宽度按页码位数留够 */
193
196
  [data-scope='pagination'][data-part='jumper'] {
194
197
  --xh-field-control-height: var(--xh-pagination-item-h, var(--xh-_pagination-item-size));
195
- --xh-field-control-padding-inline: var(--xh-pagination-item-px, var(--xh-_pagination-item-px));
198
+ --xh-field-control-padding-inline: var(--xh-pagination-item-px, var(--xh-_pagination-jumper-px));
196
199
  --xh-field-control-min-inline-size: 0;
197
200
  --xh-field-control-radius: var(--xh-pagination-item-radius, var(--xh-shape-control));
198
201
  --xh-field-bg-rest: var(--xh-pagination-jumper-bg, var(--xh-_field-variant-bg-rest));
@@ -203,8 +206,6 @@
203
206
  --xh-field-border-hover: var(--xh-pagination-jumper-border-hover, var(--xh-_field-variant-border-hover));
204
207
  --xh-field-border-focus: var(--xh-pagination-jumper-border-focus, var(--xh-_field-variant-border-focus));
205
208
  --xh-field-border-invalid: var(--xh-pagination-jumper-border-invalid, var(--xh-_field-variant-border-invalid));
206
- --xh-field-ring-focus: var(--xh-ring-focus);
207
- --xh-field-ring-invalid: var(--xh-ring-invalid);
208
209
  --xh-field-shadow-rest: none;
209
210
 
210
211
  flex: none;
@@ -220,16 +221,12 @@
220
221
  display: none;
221
222
  }
222
223
 
223
- /* 越界的页码(超出 1 到总页数):浏览器的约束校验在用户动过之后判失败,与字段家族的校验失败同一副边与环。
224
+ /* 越界的页码(超出 1 到总页数):浏览器的约束校验在用户动过之后判失败,与字段家族的校验失败同一副边。
224
225
  家族的失败档认 data-invalid,跳页框的取值不进状态机,失败由原生约束给出 */
225
226
  [data-scope='pagination'][data-part='jumper']:user-invalid {
226
227
  border-color: var(--xh-field-border-invalid, var(--xh-_field-variant-border-invalid));
227
228
  }
228
229
 
229
- [data-scope='pagination'][data-part='jumper']:user-invalid:focus-within {
230
- outline-color: var(--xh-field-ring-invalid, var(--xh-ring-invalid));
231
- }
232
-
233
230
  /* 摊开省略位的定位层。三处坐标系必须同为 fixed:机器交给引擎的 strategy、
234
231
  连接层的内联 position、这里 —— 差一处就会算在错的坐标系里 */
235
232
  [data-scope='pagination'][data-part='positioner'] {
@@ -31,8 +31,6 @@
31
31
  /* 提示与切换钮里的字形都比正文小一档,三个尺寸档各自换过,不是一个恒等的中转 */
32
32
  --xh-_password-input-caps-lock-font-size: var(--xh-control-caption-md);
33
33
  --xh-_password-input-trigger-font-size: var(--xh-control-caption-md);
34
- /* 切换钮与输入之间那道线的长度:取钮高的一半,线的上下各留一截空白 */
35
- --xh-_password-input-divider-h: 50%;
36
34
 
37
35
  /* 盒里有两个 Tab 停靠点,切换钮上再画一圈自己的环;环恒用 --xh-ring-focus,校验失败时随盒换红 */
38
36
  --xh-_password-input-ring: var(--xh-ring-focus);
@@ -77,13 +75,15 @@
77
75
 
78
76
  /* —— 标题 —— */
79
77
  [data-scope='password-input'][data-part='label'] {
80
- color: var(--xh-password-input-label-fg, var(--xh-fg-default));
78
+ /* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-password-input-label-gap 给多少最终就是多少 */
79
+ margin-block-end: calc(var(--xh-password-input-label-gap, var(--xh-space-2)) - var(--xh-password-input-gap, var(--xh-space-1)));
80
+ color: var(--xh-password-input-label-fg, var(--xh-fg-muted));
81
81
  font-size: var(--xh-password-input-label-font-size, var(--xh-text-label-size));
82
82
  font-weight: var(--xh-password-input-label-font-weight, var(--xh-text-label-weight));
83
83
  }
84
84
 
85
85
  [data-scope='password-input'][data-part='label'][data-disabled] {
86
- color: var(--xh-password-input-label-fg-disabled, var(--xh-fg-subtle));
86
+ color: var(--xh-password-input-label-fg-disabled, var(--xh-fg-muted));
87
87
  }
88
88
 
89
89
  /* —— 一体式 control:输入框、切换钮与提示同框 —— */
@@ -104,8 +104,6 @@
104
104
  --xh-field-border-hover: var(--xh-password-input-control-border-hover, var(--xh-_field-variant-border-hover));
105
105
  --xh-field-border-focus: var(--xh-password-input-control-border-focus, var(--xh-_field-variant-border-focus));
106
106
  --xh-field-border-invalid: var(--xh-password-input-control-border-invalid, var(--xh-_field-variant-border-invalid));
107
- --xh-field-ring-focus: var(--xh-ring-focus);
108
- --xh-field-ring-invalid: var(--xh-ring-invalid);
109
107
  --xh-field-shadow-rest: var(--xh-password-input-control-shadow, none);
110
108
  /* 家族 chrome 会重写 --xh-icon-size,使用者图标槽必须经桥接槽下发才能在盒内生效 */
111
109
  --xh-field-glyph-size: var(--xh-password-input-icon-size, var(--xh-_field-size-glyph-size));
@@ -131,8 +129,10 @@
131
129
  }
132
130
 
133
131
  /* —— 明暗切换钮 —— */
134
- /* 正方视觉盒、inset 圆角、悬停 100 / 按下 200 与 0.97 按压、粗指针热区全由 Action Control 的
135
- field-inset ghost 档给,组件只映射既有覆盖槽;常态只剩符号,符号取次级前景 */
132
+ /* inset 圆角、按承载面取的悬停 / 按下阶梯、粗指针热区全由 Action Control 的 field-inset ghost 档给,
133
+ 组件只映射既有覆盖槽;常态只剩符号,符号取次级前景。
134
+ 视觉盒按字段内钮尺寸表随字段档(sm 取控件内动作档、md 取 control-h-sm、lg 取 control-h-md),
135
+ 由 field-inset 档按 data-xh-action-size 给:比字段矮一档,是框里的辅助动作、不与输入抢 */
136
136
  [data-scope='password-input'][data-part='visibility-trigger'] {
137
137
  --xh-action-visual-size: var(--xh-password-input-trigger-size, var(--xh-_action-profile-visual-size));
138
138
  --xh-action-min-inline-size: var(--xh-password-input-trigger-size, var(--xh-_action-profile-visual-size));
@@ -161,44 +161,7 @@
161
161
  display: none;
162
162
  }
163
163
 
164
- /* 显隐动作与输入/状态区之间留一道半高分隔。::before 是兜底字形、::after 在粗指针下是家族给的
165
- 44px 热区,线只能落在 background-image 上:一条 1px × 半高的渐变贴在靠输入的那一侧,
166
- 不随按钮悬停底或圆角变化。background-position 是物理轴,RTL 另给两条换边。 */
167
- [data-scope='password-input'][data-part='control']
168
- > [data-scope='password-input'][data-part='visibility-trigger']:has(~ [data-scope='password-input'][data-part='input']),
169
- [data-scope='password-input'][data-part='control']
170
- > [data-scope='password-input'][data-part='input'] ~ [data-scope='password-input'][data-part='visibility-trigger'] {
171
- background-image: linear-gradient(
172
- var(--xh-password-input-visibility-trigger-separator-color, var(--xh-border-subtle)),
173
- var(--xh-password-input-visibility-trigger-separator-color, var(--xh-border-subtle))
174
- );
175
- background-repeat: no-repeat;
176
- background-size: var(--xh-stroke-thin) var(--xh-password-input-visibility-trigger-separator-h, var(--xh-_password-input-divider-h));
177
- }
178
-
179
- /* 钮排在输入之前:线贴在钮的逻辑末端 */
180
- [data-scope='password-input'][data-part='control']
181
- > [data-scope='password-input'][data-part='visibility-trigger']:has(~ [data-scope='password-input'][data-part='input']) {
182
- background-position: 100% 50%;
183
- }
184
-
185
- [dir='rtl'] [data-scope='password-input'][data-part='control']
186
- > [data-scope='password-input'][data-part='visibility-trigger']:has(~ [data-scope='password-input'][data-part='input']) {
187
- background-position: 0 50%;
188
- }
189
-
190
- /* 钮排在输入之后:线贴在钮的逻辑起始侧 */
191
- [data-scope='password-input'][data-part='control']
192
- > [data-scope='password-input'][data-part='input'] ~ [data-scope='password-input'][data-part='visibility-trigger'] {
193
- background-position: 0 50%;
194
- }
195
-
196
- [dir='rtl'] [data-scope='password-input'][data-part='control']
197
- > [data-scope='password-input'][data-part='input'] ~ [data-scope='password-input'][data-part='visibility-trigger'] {
198
- background-position: 100% 50%;
199
- }
200
-
201
- /* 盒里有两个 Tab 停靠点,盒子在 :focus-within 上画的那一圈两者完全一样,
164
+ /* 盒里有两个 Tab 停靠点,盒子在 :focus-within 上换的聚焦描边两者完全一样,
202
165
  分不出焦点在框里还是在钮上,所以钮上再画一圈自己的环(家族只对不占 Tab 位的内嵌钮关环)。
203
166
  环往内收,压在按钮自己的方框里,不与盒子外面那一圈叠在一起。
204
167
  指示焦点只能用环不能用底色:可用的几档底色压在盒底上都到不了 3:1,换了色也等于没画 */
@@ -338,29 +301,10 @@
338
301
  --xh-_password-input-strength-fg: var(--xh-fg-disabled);
339
302
  }
340
303
 
341
- /* 高对比档整层丢弃 background-image,分隔线改用系统色重画,并关掉这一颗钮的强制换色 */
342
304
  @media (forced-colors: active) {
343
- [data-scope='password-input'][data-part='control']
344
- > [data-scope='password-input'][data-part='visibility-trigger']:has(~ [data-scope='password-input'][data-part='input']),
345
- [data-scope='password-input'][data-part='control']
346
- > [data-scope='password-input'][data-part='input'] ~ [data-scope='password-input'][data-part='visibility-trigger'] {
347
- background-image: linear-gradient(CanvasText, CanvasText);
348
- forced-color-adjust: none;
349
- }
350
-
351
- [data-scope='password-input'][data-part='control'][data-disabled]
352
- > [data-scope='password-input'][data-part='visibility-trigger']:has(~ [data-scope='password-input'][data-part='input']),
353
- [data-scope='password-input'][data-part='control'][data-disabled]
354
- > [data-scope='password-input'][data-part='input'] ~ [data-scope='password-input'][data-part='visibility-trigger'] {
355
- background-image: linear-gradient(GrayText, GrayText);
356
- }
357
-
358
- /* 关掉强制换色后,上面那圈自留的 :focus-visible 环与家族普通态的焦点底/字都会按作者色落地;
359
- 家族高对比块的特指度压不过它们,这里用同一选择器把环、底、字改回系统色 */
305
+ /* 钮上那圈自留的 :focus-visible 环取系统高亮色:家族高对比块的特指度压不过上面那条环规则 */
360
306
  [data-scope='password-input'][data-part='control'] [data-part='visibility-trigger']:where([data-scope='password-input']):focus-visible {
361
307
  outline-color: Highlight;
362
- background-color: ButtonFace;
363
- color: ButtonText;
364
308
  }
365
309
  }
366
310
 
package/css/pin-input.css CHANGED
@@ -15,10 +15,11 @@
15
15
  /* 与文本框、数字框同一套堆叠:标签一行、格子一行。
16
16
  格子的描边、底、圆角、五态与悬停由 Field Chrome 家族按格子上的 data-variant 生成,皮肤不再声明形态三档 */
17
17
  [data-scope='pin-input'][data-part='root'] {
18
- /* 尺寸档只换这三个私有槽,格子与分隔都从 root 继承它们,换档不必给每个部件各写一条选择器 */
19
- --xh-_pin-input-box-size: var(--xh-control-box-md);
20
- --xh-_pin-input-box-gap: var(--xh-control-gap-md);
21
- --xh-_pin-input-box-font-size: var(--xh-text-heading-3-size);
18
+ /* 尺寸档只换这两个私有槽,格子与分隔都从 root 继承它们,换档不必给每个部件各写一条选择器。
19
+ 格子边长取控件高档,与同一行里的字段等高;字号取控件字号档;格间距三档同为 --xh-space-1 */
20
+ --xh-_pin-input-box-size: var(--xh-control-h-md);
21
+ --xh-_pin-input-box-gap: var(--xh-space-1);
22
+ --xh-_pin-input-box-font-size: var(--xh-control-font-md);
22
23
  /* 填满态的强调色随语气走。没写 data-tone 时 --xh-_tone 没被声明,退回品牌色 */
23
24
  --xh-_pin-input-accent: var(--xh-_tone, var(--xh-bg-brand));
24
25
 
@@ -38,26 +39,25 @@
38
39
 
39
40
  /* —— 尺寸 —— */
40
41
  [data-scope='pin-input'][data-part='root'][data-size='sm'] {
41
- --xh-_pin-input-box-size: var(--xh-control-box-sm);
42
- --xh-_pin-input-box-gap: var(--xh-control-gap-sm);
43
- --xh-_pin-input-box-font-size: var(--xh-control-font-lg);
42
+ --xh-_pin-input-box-size: var(--xh-control-h-sm);
43
+ --xh-_pin-input-box-font-size: var(--xh-control-font-sm);
44
44
  }
45
45
 
46
- /* 格子是正方形,缺省档已经占到控件高度表的顶档,lg 档由顶档加一格间距合成,不另立数值 */
47
46
  [data-scope='pin-input'][data-part='root'][data-size='lg'] {
48
- --xh-_pin-input-box-size: var(--xh-control-box-lg);
49
- --xh-_pin-input-box-gap: var(--xh-control-gap-lg);
50
- --xh-_pin-input-box-font-size: var(--xh-text-heading-2-size);
47
+ --xh-_pin-input-box-size: var(--xh-control-h-lg);
48
+ --xh-_pin-input-box-font-size: var(--xh-control-font-lg);
51
49
  }
52
50
 
53
51
  [data-scope='pin-input'][data-part='label'] {
54
- color: var(--xh-pin-input-label-fg, var(--xh-fg-default));
52
+ /* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-pin-input-label-gap 给多少最终就是多少 */
53
+ margin-block-end: calc(var(--xh-pin-input-label-gap, var(--xh-space-2)) - var(--xh-pin-input-gap, var(--xh-space-1)));
54
+ color: var(--xh-pin-input-label-fg, var(--xh-fg-muted));
55
55
  font-size: var(--xh-pin-input-label-font-size, var(--xh-text-label-size));
56
56
  font-weight: var(--xh-pin-input-label-font-weight, var(--xh-text-label-weight));
57
57
  }
58
58
 
59
59
  [data-scope='pin-input'][data-part='label'][data-disabled] {
60
- color: var(--xh-pin-input-label-fg-disabled, var(--xh-fg-subtle));
60
+ color: var(--xh-pin-input-label-fg-disabled, var(--xh-fg-muted));
61
61
  }
62
62
 
63
63
  /* 分段:连着的几格圈成一段。它只排版,格间距仍由格子自己的相邻兄弟规则给 */
@@ -109,8 +109,6 @@
109
109
  --xh-field-border-hover: var(--xh-pin-input-box-border-hover, var(--xh-_field-variant-border-hover));
110
110
  --xh-field-border-focus: var(--xh-pin-input-box-border-focus, var(--xh-_field-variant-border-focus));
111
111
  --xh-field-border-invalid: var(--xh-pin-input-box-border-invalid, var(--xh-_field-variant-border-invalid));
112
- --xh-field-ring-focus: var(--xh-ring-focus);
113
- --xh-field-ring-invalid: var(--xh-ring-invalid);
114
112
  --xh-field-shadow-rest: var(--xh-pin-input-box-shadow, none);
115
113
 
116
114
  /* 一行放不下时逐格收窄,收不动就整行顶出屏幕。
@@ -141,19 +139,13 @@
141
139
  color: var(--xh-pin-input-placeholder-fg, var(--xh-fg-subtle));
142
140
  }
143
141
 
144
- /* 一行格子长得一模一样,光标那道竖线太细,看不出正在填哪一格:
145
- 当前格必须有明显的环。data-focus 由机器给(它知道谁是当前格),
146
- 家族的 :focus-within 兜住机器状态还没回流的那一帧,两条同时写不冲突。
147
- 焦点边一律家族的 --xh-border-control-focus,不随 tone */
142
+ /* 一行格子长得一模一样,光标那道竖线太细,看不出正在填哪一格:当前格与字段外壳的聚焦态同一副面——
143
+ 换承载面 + 聚焦描边,压在别的格子的字段淡底之间一眼分得出,不另画环(强制色档由家族补系统色环)。
144
+ data-focus 由机器给(它知道谁是当前格),家族的 :focus-within 兜住机器状态还没回流的那一帧,
145
+ 两条同时写不冲突。焦点边一律家族的 --xh-border-control-focus,不随 tone */
148
146
  [data-scope='pin-input'][data-part='input'][data-focus] {
149
147
  border-color: var(--xh-pin-input-box-border-focus, var(--xh-_field-variant-border-focus));
150
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
151
- outline-offset: var(--xh-ring-offset);
152
- }
153
-
154
- /* 校验失败时环也跟着变红:两圈等宽相邻却一红一蓝,读的人不知道哪个才是当前状态 */
155
- [data-scope='pin-input'][data-part='input'][data-invalid][data-focus] {
156
- outline-color: var(--xh-ring-invalid);
148
+ background-color: var(--xh-_field-variant-bg-focus);
157
149
  }
158
150
 
159
151
  /* 填满只代表"格子都有字",不代表"验证码对",所以用品牌色而不是成功色收个尾。
@@ -115,15 +115,19 @@
115
115
 
116
116
  /* 作者塞进面板里的图标按控件档取;两颗动作钮另由家族配方按 sm 档下发字形尺 */
117
117
  --xh-icon-size: var(--xh-popconfirm-icon-size, var(--xh-glyph-size-md));
118
- /* 尺寸档只换这两个私有槽 */
119
- --xh-_popconfirm-pad: var(--xh-surface-pad-md);
118
+ /* 尺寸档只换这三个私有槽:横向内衬比纵向高一档(缺省纵 12 横 16),与 popover 同一套 */
119
+ --xh-_popconfirm-py: var(--xh-surface-pad-md);
120
+ --xh-_popconfirm-px: var(--xh-surface-pad-lg);
120
121
  --xh-_popconfirm-max-w: var(--xh-overlay-max-w);
121
122
 
122
123
  position: relative;
123
124
  display: grid;
124
125
  grid-template-columns: 1fr auto auto;
125
126
  align-items: center;
126
- gap: var(--xh-popconfirm-gap, var(--xh-space-2));
127
+ /* 行距与气泡族同一档:标题与说明之间只留 4px;两颗钮之间的列距另由 column-gap 放宽。
128
+ column-gap 写在 gap 之后,先回落到 gap 槽再取缺省:作者只写 --xh-popconfirm-gap 时行列一起跟着它走 */
129
+ gap: var(--xh-popconfirm-gap, var(--xh-space-1));
130
+ column-gap: var(--xh-popconfirm-column-gap, var(--xh-popconfirm-gap, var(--xh-space-2)));
127
131
  inline-size: max-content;
128
132
  /* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的两颗钮就点不到了 */
129
133
  max-inline-size: min(var(--xh-popconfirm-max-w, var(--xh-_popconfirm-max-w)), var(--xh-_popconfirm-available-w));
@@ -132,8 +136,8 @@
132
136
  overflow-y: auto;
133
137
  /* 浮在页面之上的 Overlay 滚动面:滚到头不把页面一起带走 */
134
138
  overscroll-behavior: contain;
135
- padding-block: var(--xh-popconfirm-py, var(--xh-_popconfirm-pad));
136
- padding-inline: var(--xh-popconfirm-px, var(--xh-_popconfirm-pad));
139
+ padding-block: var(--xh-popconfirm-py, var(--xh-_popconfirm-py));
140
+ padding-inline: var(--xh-popconfirm-px, var(--xh-_popconfirm-px));
137
141
  border-radius: var(--xh-popconfirm-radius, var(--xh-shape-overlay));
138
142
  pointer-events: auto;
139
143
  /* 进退场的缩放锚在贴着锚点的那条边上;两个分量由 positioner 按 placement 写进私有槽 */
@@ -171,32 +175,35 @@
171
175
  }
172
176
 
173
177
  /* —— 尺寸 —— */
174
- /* 缺省档写在 content 的基础规则里;四边等宽的面板内衬三档取 surface-pad 那把尺 */
178
+ /* 缺省档写在 content 的基础规则里;内衬三档取 surface-pad 那把尺,横向始终比纵向高一档 */
175
179
  [data-scope='popconfirm'][data-part='content'][data-size='sm'] {
176
- --xh-_popconfirm-pad: var(--xh-surface-pad-sm);
180
+ --xh-_popconfirm-py: var(--xh-surface-pad-sm);
181
+ --xh-_popconfirm-px: var(--xh-surface-pad-md);
177
182
  --xh-_popconfirm-max-w: var(--xh-overlay-max-w-sm);
178
183
  }
179
184
 
180
185
  [data-scope='popconfirm'][data-part='content'][data-size='lg'] {
181
- --xh-_popconfirm-pad: var(--xh-surface-pad-lg);
186
+ --xh-_popconfirm-py: var(--xh-surface-pad-lg);
187
+ --xh-_popconfirm-px: var(--xh-surface-pad-xl);
182
188
  --xh-_popconfirm-max-w: var(--xh-overlay-max-w-lg);
183
189
  }
184
190
 
191
+ /* 气泡标题:14px / medium / 正文色 */
185
192
  [data-scope='popconfirm'][data-part='title'] {
186
193
  margin: 0;
187
194
  min-inline-size: 0;
188
195
  font-size: var(--xh-popconfirm-title-font-size, var(--xh-text-label-size));
189
- font-weight: var(--xh-popconfirm-title-font-weight, var(--xh-font-weight-semibold));
196
+ font-weight: var(--xh-popconfirm-title-font-weight, var(--xh-font-weight-medium));
190
197
  line-height: var(--xh-leading-tight);
191
198
  overflow-wrap: anywhere;
192
199
  color: var(--xh-popconfirm-title-fg, var(--xh-material-frosted-fg));
193
200
  }
194
201
 
195
- /* 说明文字走说明档:13px + fg-muted */
202
+ /* 说明就是气泡的正文:14px 正文字号 + fg-muted 次级色 */
196
203
  [data-scope='popconfirm'][data-part='description'] {
197
204
  margin: 0;
198
205
  min-inline-size: 0;
199
- font-size: var(--xh-popconfirm-description-font-size, var(--xh-text-secondary-size));
206
+ font-size: var(--xh-popconfirm-description-font-size, var(--xh-text-body-size));
200
207
  line-height: var(--xh-leading-normal);
201
208
  overflow-wrap: anywhere;
202
209
  color: var(--xh-popconfirm-description-fg, var(--xh-fg-muted));
@@ -231,6 +238,8 @@
231
238
 
232
239
  /* 动作钮的文字与 Button 同一字重(家族配方不管字重) */
233
240
  font-weight: var(--xh-popconfirm-action-font-weight, var(--xh-text-label-weight));
241
+ /* 末行与上面的文字隔开:栅格行距只有标题与说明之间那 4px,钮再往下让 12px,文字与钮之间共 16px */
242
+ margin-block-start: var(--xh-popconfirm-action-mt, var(--xh-space-3));
234
243
  }
235
244
 
236
245
  /* 并排落在最后一行的右侧两格;取消在左、确认在右 */