@xihan-ui/styles 1.0.0 → 2.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 (171) hide show
  1. package/CHANGELOG.md +5146 -6
  2. package/README.md +22 -2
  3. package/component-tokens.d.ts +4212 -0
  4. package/component-tokens.js +2 -0
  5. package/components.tokens.json +80116 -0
  6. package/css/accordion.css +131 -75
  7. package/css/affix.css +16 -1
  8. package/css/alert.css +114 -67
  9. package/css/anchor.css +99 -27
  10. package/css/approval.css +461 -0
  11. package/css/avatar-group.css +14 -6
  12. package/css/avatar.css +33 -9
  13. package/css/back-top.css +103 -48
  14. package/css/badge.css +42 -14
  15. package/css/bar-code.css +62 -0
  16. package/css/breadcrumb.css +40 -21
  17. package/css/button-group.css +146 -24
  18. package/css/button.css +116 -99
  19. package/css/calendar-picker.css +448 -0
  20. package/css/calendar-range-picker.css +517 -0
  21. package/css/card.css +54 -77
  22. package/css/carousel.css +412 -68
  23. package/css/cascader.css +429 -246
  24. package/css/checkbox-group.css +225 -77
  25. package/css/checkbox.css +174 -37
  26. package/css/clipboard.css +266 -47
  27. package/css/code-view.css +279 -0
  28. package/css/collapsible.css +108 -63
  29. package/css/color-field.css +158 -0
  30. package/css/color-picker.css +172 -184
  31. package/css/color-slider.css +274 -0
  32. package/css/color-swatch-picker.css +243 -0
  33. package/css/color-swatch.css +35 -0
  34. package/css/combobox.css +267 -273
  35. package/css/command.css +399 -0
  36. package/css/context-menu.css +183 -108
  37. package/css/date-field.css +94 -121
  38. package/css/date-picker.css +486 -249
  39. package/css/date-range-picker.css +559 -0
  40. package/css/description.css +51 -0
  41. package/css/descriptions.css +133 -87
  42. package/css/dialog.css +247 -68
  43. package/css/diff-view.css +428 -0
  44. package/css/download-trigger.css +155 -46
  45. package/css/drawer.css +194 -111
  46. package/css/editable.css +172 -152
  47. package/css/empty-state.css +80 -11
  48. package/css/field-array.css +190 -0
  49. package/css/field.css +84 -31
  50. package/css/fieldset.css +51 -18
  51. package/css/file-upload.css +134 -36
  52. package/css/flex.css +20 -1
  53. package/css/float-button.css +238 -57
  54. package/css/floating-panel.css +173 -92
  55. package/css/focus.css +46 -0
  56. package/css/forced-colors.css +93 -0
  57. package/css/form.css +254 -77
  58. package/css/gradient-text.css +34 -10
  59. package/css/grid.css +516 -5
  60. package/css/heatmap.css +87 -29
  61. package/css/highlight.css +20 -5
  62. package/css/hover-card.css +97 -47
  63. package/css/icon-wrapper.css +15 -3
  64. package/css/icon.css +74 -8
  65. package/css/image-cropper.css +143 -29
  66. package/css/image-viewer.css +150 -89
  67. package/css/image.css +30 -1
  68. package/css/infinite-scroll.css +51 -1
  69. package/css/input-group.css +277 -0
  70. package/css/json-viewer.css +102 -45
  71. package/css/kbd.css +72 -0
  72. package/css/label.css +78 -0
  73. package/css/layers.css +5 -0
  74. package/css/layout.css +175 -31
  75. package/css/list.css +24 -3
  76. package/css/listbox.css +208 -67
  77. package/css/loading-bar.css +52 -3
  78. package/css/log.css +144 -9
  79. package/css/markdown-stream.css +149 -0
  80. package/css/marquee.css +27 -1
  81. package/css/masonry.css +7 -0
  82. package/css/matrix-code.css +67 -0
  83. package/css/mention.css +234 -152
  84. package/css/menu.css +180 -83
  85. package/css/menubar.css +204 -136
  86. package/css/message-feed.css +197 -0
  87. package/css/navigation-menu.css +144 -90
  88. package/css/notification.css +178 -100
  89. package/css/number-animation.css +7 -0
  90. package/css/number-field.css +120 -277
  91. package/css/overlay-arrow.css +12 -7
  92. package/css/page-header.css +99 -14
  93. package/css/pagination.css +175 -135
  94. package/css/password-input.css +222 -219
  95. package/css/pin-input.css +101 -67
  96. package/css/pointer.css +36 -0
  97. package/css/popconfirm.css +185 -94
  98. package/css/popover.css +121 -77
  99. package/css/progress.css +60 -12
  100. package/css/prompt-input.css +224 -0
  101. package/css/question-flow.css +513 -0
  102. package/css/radio-group.css +147 -30
  103. package/css/rating.css +193 -43
  104. package/css/reasoning.css +336 -0
  105. package/css/reset.css +84 -6
  106. package/css/resizable.css +237 -0
  107. package/css/scroll-area.css +68 -7
  108. package/css/scrollbar.css +47 -13
  109. package/css/segmented.css +94 -29
  110. package/css/select.css +288 -274
  111. package/css/separator.css +101 -1
  112. package/css/side-nav.css +133 -75
  113. package/css/signature-pad.css +74 -54
  114. package/css/skeleton.css +84 -11
  115. package/css/slider.css +132 -39
  116. package/css/sortable.css +198 -0
  117. package/css/spinner.css +126 -12
  118. package/css/splitter.css +29 -8
  119. package/css/statistic.css +55 -0
  120. package/css/steps.css +206 -72
  121. package/css/switch.css +268 -36
  122. package/css/table.css +695 -118
  123. package/css/tabs.css +604 -42
  124. package/css/tag-group.css +219 -0
  125. package/css/tag.css +118 -28
  126. package/css/tags-input.css +156 -274
  127. package/css/text-field.css +101 -249
  128. package/css/time-field.css +100 -128
  129. package/css/time-picker.css +323 -252
  130. package/css/time-range-picker.css +719 -0
  131. package/css/timeline.css +202 -68
  132. package/css/timer.css +56 -52
  133. package/css/timestamp.css +34 -0
  134. package/css/toast.css +373 -144
  135. package/css/toggle-group.css +309 -76
  136. package/css/toggle.css +116 -85
  137. package/css/tone.css +47 -0
  138. package/css/tool-call.css +421 -0
  139. package/css/toolbar.css +181 -33
  140. package/css/tooltip.css +107 -36
  141. package/css/tour.css +183 -152
  142. package/css/transfer.css +351 -138
  143. package/css/tree-select.css +323 -216
  144. package/css/tree.css +294 -62
  145. package/css/truncate.css +65 -0
  146. package/css/typography.css +228 -5
  147. package/css/undefined.css +10 -1
  148. package/css/virtualizer.css +9 -10
  149. package/css/visually-hidden.css +7 -0
  150. package/css/watermark.css +7 -0
  151. package/family/action-control.css +487 -0
  152. package/family/collection-item.css +721 -0
  153. package/family/field-chrome.css +298 -0
  154. package/family/motion.css +166 -0
  155. package/family/swatch.css +59 -0
  156. package/index.css +41705 -126
  157. package/index.unlayered.css +33692 -17339
  158. package/package.json +51 -17
  159. package/css/calendar.css +0 -367
  160. package/css/code-block.css +0 -91
  161. package/css/composer.css +0 -134
  162. package/css/countdown.css +0 -26
  163. package/css/dynamic-input.css +0 -220
  164. package/css/ellipsis.css +0 -52
  165. package/css/hotkeys.css +0 -90
  166. package/css/popselect.css +0 -391
  167. package/css/qr-code.css +0 -55
  168. package/css/result.css +0 -119
  169. package/css/space.css +0 -117
  170. package/css/thread.css +0 -120
  171. package/css/time.css +0 -25
@@ -1,32 +1,43 @@
1
+ /*
2
+ * Copyright (c) 2021-Present XiHanFun and contributors.
3
+ * Licensed under the MIT License. See LICENSE in the project root for license information.
4
+ */
5
+
6
+ /* DateField 独立皮肤同时传递引入字段视觉盒与字段内动作;full bundle 递归去重。 */
7
+ @import '../family/field-chrome.css';
8
+ @import '../family/action-control.css';
9
+
1
10
  @layer xihan.components {
2
11
  /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
12
  [data-scope='date-field'] {
4
13
  --xh-date-field-skin: 1;
5
14
  }
6
15
 
7
- /* 与文本框、数字框同一套堆叠:标签一行、分段框一行 */
16
+ /* 与文本框、数字框同一套堆叠:标签一行、分段框一行。
17
+ 组件层只把既有公开槽映射到家族合同;形态三档由家族按 control 上的 data-variant 生成,皮肤不再声明。 */
8
18
  [data-scope='date-field'][data-part='root'] {
9
19
  /* 作者塞进来的图标跟着控件的尺寸档走;它自己写了 size 时仍以作者的为准 */
10
20
  --xh-icon-size: var(--xh-date-field-icon-size, var(--xh-glyph-size-md));
11
21
 
12
- /* 尺寸档只换这四个私有槽,标题与分段框都从 root 继承它们,换档不必给每个部件各写一条选择器 */
22
+ /* 尺寸档只换这四个私有槽,分段框从 root 继承它们,换档不必给每个部件各写一条选择器 */
13
23
  --xh-_date-field-control-h: var(--xh-control-h-md);
14
24
  --xh-_date-field-control-px: var(--xh-control-px-md);
15
25
  --xh-_date-field-gap: var(--xh-control-gap-md);
16
26
  --xh-_date-field-font-size: var(--xh-control-font-md);
17
- --xh-_date-field-label-font-size: var(--xh-control-font-md);
18
- /* 形态档只换这三个私有槽:底色与两档描边 */
19
- --xh-_date-field-control-bg: var(--xh-bg-canvas);
20
- --xh-_date-field-control-border: var(--xh-border-control);
21
- --xh-_date-field-control-border-hover: var(--xh-border-control-hover);
22
- /* 聚焦环与段位反白随语气走。没写 data-tone 时这几个 --xh-_tone* 没被声明,退回原来的焦点色与品牌色 */
23
- --xh-_date-field-ring: var(--xh-ring-focus);
24
- --xh-_date-field-segment-bg: var(--xh-_tone, var(--xh-bg-brand));
25
- --xh-_date-field-segment-fg: var(--xh-_tone-on, var(--xh-fg-on-brand));
27
+ /* 段位反白随语气走:当前段是「当前项」,淡底 + 淡底前景。
28
+ 没写 data-tone 时这几个 --xh-_tone* 没被声明,退回品牌淡底 */
29
+ --xh-_date-field-segment-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
30
+ --xh-_date-field-segment-fg: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
26
31
 
27
32
  display: inline-flex;
28
33
  flex-direction: column;
29
34
  gap: var(--xh-date-field-gap, var(--xh-space-1));
35
+
36
+ /* 不传尺寸时一律这么宽,宽度不随内容走;父容器给不出这么宽时整件跟着收,地板同步让步,不越出父容器。
37
+ 地板不高过缺省宽:使用者把缺省宽钉到底线以下时不必再放开底线 */
38
+ inline-size: var(--xh-date-field-control-w, var(--xh-control-w));
39
+ min-inline-size: min(var(--xh-date-field-control-w, var(--xh-control-w)), var(--xh-date-field-control-min-w, var(--xh-control-min-w)), 100%);
40
+ max-inline-size: 100%;
30
41
  }
31
42
 
32
43
  /* —— 尺寸 —— */
@@ -36,7 +47,6 @@
36
47
  --xh-_date-field-control-px: var(--xh-control-px-sm);
37
48
  --xh-_date-field-gap: var(--xh-control-gap-sm);
38
49
  --xh-_date-field-font-size: var(--xh-control-font-sm);
39
- --xh-_date-field-label-font-size: var(--xh-control-font-sm);
40
50
  }
41
51
 
42
52
  [data-scope='date-field'][data-part='root'][data-size='lg'] {
@@ -45,29 +55,6 @@
45
55
  --xh-_date-field-control-px: var(--xh-control-px-lg);
46
56
  --xh-_date-field-gap: var(--xh-control-gap-lg);
47
57
  --xh-_date-field-font-size: var(--xh-control-font-lg);
48
- --xh-_date-field-label-font-size: var(--xh-control-font-lg);
49
- }
50
-
51
- /* —— 形态 —— */
52
- /* 描边式:与缺省等价,写出来是为了三档形态在皮肤里都看得见 */
53
- [data-scope='date-field'][data-part='root'][data-variant='outline'] {
54
- --xh-_date-field-control-bg: var(--xh-bg-canvas);
55
- --xh-_date-field-control-border: var(--xh-border-control);
56
- --xh-_date-field-control-border-hover: var(--xh-border-control-hover);
57
- }
58
-
59
- /* 填充式:底色顶替描边,悬停时才浮出一道淡边 */
60
- [data-scope='date-field'][data-part='root'][data-variant='subtle'] {
61
- --xh-_date-field-control-bg: var(--xh-_tone-subtle, var(--xh-bg-subtle));
62
- --xh-_date-field-control-border: transparent;
63
- --xh-_date-field-control-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
64
- }
65
-
66
- /* 无框:底与常态描边透明,悬停与聚焦浮出描边 */
67
- [data-scope='date-field'][data-part='root'][data-variant='ghost'] {
68
- --xh-_date-field-control-bg: transparent;
69
- --xh-_date-field-control-border: transparent;
70
- --xh-_date-field-control-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
71
58
  }
72
59
 
73
60
  /* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
@@ -77,9 +64,8 @@
77
64
 
78
65
  [data-scope='date-field'][data-part='label'] {
79
66
  color: var(--xh-date-field-label-fg, var(--xh-fg-default));
80
- font-size: var(--xh-date-field-label-font-size, var(--xh-_date-field-label-font-size));
67
+ font-size: var(--xh-date-field-label-font-size, var(--xh-text-label-size));
81
68
  font-weight: var(--xh-date-field-label-font-weight, var(--xh-text-label-weight));
82
- line-height: var(--xh-leading-none);
83
69
  }
84
70
 
85
71
  [data-scope='date-field'][data-part='label'][hidden] {
@@ -88,65 +74,42 @@
88
74
 
89
75
  [data-scope='date-field'][data-part='label'][data-disabled] {
90
76
  color: var(--xh-date-field-label-fg-disabled, var(--xh-fg-subtle));
91
- cursor: not-allowed;
92
77
  }
93
78
 
94
- /* 分段框整体长得像一个输入框:边框与背景长在 control 上,各段只是里面的文字 */
79
+ /* 分段框整体长得像一个输入框:描边、底色、圆角、聚焦环、五态与悬停由 Field Chrome 家族画在
80
+ control 上,各段只是里面的文字。组件只映射既有公开槽;段位靠键盘编辑,盒上不是文本光标 */
95
81
  [data-scope='date-field'][data-part='control'] {
96
- display: inline-flex;
97
- min-inline-size: var(--xh-date-field-control-min-w, var(--xh-control-min-w));
98
- align-items: center;
99
- gap: var(--xh-date-field-control-gap, var(--xh-_date-field-gap));
100
- block-size: var(--xh-date-field-control-h, var(--xh-_date-field-control-h));
101
- padding-inline: var(--xh-date-field-control-px, var(--xh-_date-field-control-px));
102
- padding-block: 0;
103
- border: var(--xh-stroke-thin) solid var(--xh-date-field-control-border, var(--xh-_date-field-control-border));
104
- border-radius: var(--xh-date-field-control-radius, var(--xh-shape-control));
105
- background: var(--xh-date-field-control-bg, var(--xh-_date-field-control-bg));
106
- color: var(--xh-date-field-control-fg, var(--xh-fg-default));
82
+ --xh-field-control-height: var(--xh-date-field-control-h, var(--xh-_date-field-control-h));
83
+ --xh-field-control-padding-inline: var(--xh-date-field-control-px, var(--xh-_date-field-control-px));
84
+ --xh-field-control-gap: var(--xh-date-field-control-gap, var(--xh-_date-field-gap));
85
+ --xh-field-control-min-inline-size: var(--xh-date-field-control-min-w, var(--xh-control-min-w));
86
+ --xh-field-control-radius: var(--xh-date-field-control-radius, var(--xh-shape-control));
87
+ --xh-field-bg-rest: var(--xh-date-field-control-bg, var(--xh-_field-variant-bg-rest));
88
+ --xh-field-bg-hover: var(--xh-date-field-control-bg-hover, var(--xh-_field-variant-bg-hover));
89
+ --xh-field-bg-read-only: var(--xh-date-field-control-bg-readonly, var(--xh-_field-variant-bg-read-only));
90
+ --xh-field-bg-disabled: var(--xh-date-field-control-bg-disabled, var(--xh-_field-variant-bg-disabled));
91
+ --xh-field-fg-rest: var(--xh-date-field-control-fg, var(--xh-fg-default));
92
+ --xh-field-border-rest: var(--xh-date-field-control-border, var(--xh-_field-variant-border-rest));
93
+ --xh-field-border-hover: var(--xh-date-field-control-border-hover, var(--xh-_field-variant-border-hover));
94
+ --xh-field-border-focus: var(--xh-date-field-control-border-focus, var(--xh-_field-variant-border-focus));
95
+ --xh-field-border-invalid: var(--xh-date-field-control-border-invalid, var(--xh-_field-variant-border-invalid));
96
+ --xh-field-ring-focus: var(--xh-ring-focus);
97
+ --xh-field-ring-invalid: var(--xh-ring-invalid);
98
+ --xh-field-shadow-rest: var(--xh-date-field-control-shadow, none);
99
+ --xh-field-cursor-rest: default;
100
+ /* 家族 chrome 会重写 --xh-icon-size,使用者图标槽必须经桥接槽下发才能在盒内生效 */
101
+ --xh-field-glyph-size: var(--xh-date-field-icon-size, var(--xh-_field-size-glyph-size));
102
+
107
103
  /* 表单控件不继承页面字体,只给字号会让分段框用 UA 默认字族 */
108
104
  font-family: inherit;
109
105
  font-size: var(--xh-date-field-font-size, var(--xh-_date-field-font-size));
110
106
  line-height: var(--xh-leading-none);
111
- transition: border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
112
107
  }
113
108
 
114
109
  [data-scope='date-field'][data-part='control'][hidden] {
115
110
  display: none;
116
111
  }
117
112
 
118
- /* hover 只在中性态换描边:invalid 正拿边框颜色说事,被 hover 盖掉那条信息就没了 */
119
- [data-scope='date-field'][data-part='control']:hover:not([data-disabled], [data-invalid]) {
120
- border-color: var(--xh-date-field-control-border-hover, var(--xh-_date-field-control-border-hover));
121
- }
122
-
123
- /* 焦点落在某一段上,而边框长在 control 上:焦点环得由内向外借一层。
124
- control 自己不占 Tab 位,:focus-within 是它唯一能感知组内焦点的方式 */
125
- [data-scope='date-field'][data-part='control']:focus-within:not([data-disabled]) {
126
- border-color: var(--xh-date-field-control-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
127
- outline: var(--xh-ring-width) solid var(--xh-_date-field-ring);
128
- outline-offset: var(--xh-ring-offset);
129
- }
130
-
131
- [data-scope='date-field'][data-part='control'][data-invalid] {
132
- border-color: var(--xh-date-field-control-border-invalid, var(--xh-border-invalid));
133
-
134
- /* 校验失败时环也跟着变红:两圈等宽相邻却一红一蓝,读的人不知道哪个才是当前状态 */
135
- --xh-_date-field-ring: var(--xh-ring-invalid);
136
- }
137
-
138
- /* 只读仍可聚焦、可换段,不置灰,只把底色压下去表示"改不动" */
139
- [data-scope='date-field'][data-part='control'][data-readonly] {
140
- background: var(--xh-date-field-control-bg-readonly, var(--xh-bg-subtle));
141
- }
142
-
143
- /* 整组禁用:段位是 div 而非原生控件,禁用只表达得成 data-disabled */
144
- [data-scope='date-field'][data-part='control'][data-disabled] {
145
- background: var(--xh-date-field-control-bg-disabled, var(--xh-bg-subtle));
146
- color: var(--xh-fg-disabled);
147
- cursor: not-allowed;
148
- }
149
-
150
113
  /* 段位与作者写在段间的分隔符('/'、'年')都在这一层里:它占满盒里剩下的宽度,
151
114
  清空钮因此靠在框内末端 */
152
115
  [data-scope='date-field'][data-part='segment-group'] {
@@ -160,10 +123,14 @@
160
123
  display: none;
161
124
  }
162
125
 
126
+ [data-scope='date-field'][data-part='segment-group'] > :not([data-scope]) {
127
+ color: var(--xh-date-field-literal-fg, var(--xh-fg-subtle));
128
+ }
129
+
163
130
  /* 每一段是一块可聚焦的文字:宽度随内容走,两侧留一点让选中底色不贴着数字 */
164
131
  [data-scope='date-field'][data-part='segment'] {
165
132
  display: inline-block;
166
- padding-inline: var(--xh-date-field-segment-px, var(--xh-space-1));
133
+ padding-inline: var(--xh-date-field-segment-px, var(--xh-space-0_5));
167
134
  padding-block: var(--xh-date-field-segment-py, var(--xh-space-0));
168
135
  border-radius: var(--xh-date-field-segment-radius, var(--xh-shape-inset));
169
136
  color: inherit;
@@ -192,7 +159,6 @@
192
159
  /* 段位是集合里的条目,用 data-* 而不是 :disabled —— 它是 div,没有原生禁用态 */
193
160
  [data-scope='date-field'][data-part='segment'][data-disabled] {
194
161
  color: var(--xh-fg-disabled);
195
- cursor: not-allowed;
196
162
  }
197
163
 
198
164
  /* 正在编辑的那一段要看得出来:整行数字长得一模一样,光标那道线这里根本没有。
@@ -210,46 +176,46 @@
210
176
  color: var(--xh-date-field-segment-fg-focus, var(--xh-_date-field-segment-fg));
211
177
  }
212
178
 
213
- /* 清空钮排在段位之后、与框等高的一颗小方钮:没值或不可编辑时连接层给 hidden 收起 */
214
- [data-scope='date-field'][data-part='clear-trigger'] {
215
- display: inline-flex;
216
- flex: none;
217
- align-items: center;
218
- justify-content: center;
219
- inline-size: var(--xh-date-field-action-size, var(--xh-control-action-size));
220
- block-size: var(--xh-date-field-action-size, var(--xh-control-action-size));
221
- padding: 0;
222
- border: 0;
223
- border-radius: var(--xh-date-field-action-radius, var(--xh-shape-control));
224
- background: var(--xh-date-field-action-bg, transparent);
225
- color: var(--xh-date-field-action-fg, var(--xh-fg-muted));
226
- font-family: inherit;
227
- font-size: var(--xh-date-field-action-font-size, var(--xh-text-secondary-size));
228
- line-height: var(--xh-leading-none);
229
- cursor: pointer;
230
- user-select: none;
231
- transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter), scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
179
+ [data-scope='date-field'][data-part='segment'][data-invalid] {
180
+ color: var(--xh-date-field-segment-fg-invalid, var(--xh-fg-danger));
232
181
  }
233
182
 
234
- /* 上面给了 display,UA 的 [hidden]{display:none} 已被盖掉,这里补回来 */
235
- [data-scope='date-field'][data-part='clear-trigger'][hidden] {
236
- display: none;
237
- }
238
-
239
- [data-scope='date-field'][data-part='clear-trigger']:hover {
240
- background: var(--xh-date-field-action-bg-hover, var(--xh-bg-subtle-hover));
241
- color: var(--xh-date-field-action-fg-hover, var(--xh-fg-default));
242
- }
243
-
244
- [data-scope='date-field'][data-part='clear-trigger']:active {
245
- background: var(--xh-date-field-action-bg-active, var(--xh-bg-subtle-active));
246
- scale: var(--xh-motion-scale-press);
183
+ [data-scope='date-field'][data-part='segment'][data-invalid]:is([data-focus], :focus-visible) {
184
+ background: var(
185
+ --xh-date-field-segment-bg-invalid-focus,
186
+ var(--xh-bg-subtle)
187
+ );
188
+ color: var(--xh-date-field-segment-fg-invalid-focus, var(--xh-fg-danger));
247
189
  }
248
190
 
249
- /* 按钮不占 Tab 位(tabindex=-1),留给程序化聚焦兜底,落焦时得看得见 */
250
- [data-scope='date-field'][data-part='clear-trigger']:focus-visible {
251
- outline: var(--xh-ring-width) solid var(--xh-_date-field-ring);
252
- outline-offset: var(--xh-ring-offset);
191
+ /* 清空钮排在段位之后:正方视觉盒、inset 圆角、悬停 100 / 按下 200 与 0.97 按压、粗指针热区与
192
+ :focus-visible 关环全由 Action Control 的 field-inset ghost 档给,组件只映射既有覆盖槽。
193
+ 没值或不可编辑时连接层给 hidden 收起 */
194
+ [data-scope='date-field'][data-part='clear-trigger'] {
195
+ --xh-action-visual-size: var(--xh-date-field-action-size, var(--xh-_action-profile-visual-size));
196
+ --xh-action-min-inline-size: var(--xh-date-field-action-size, var(--xh-_action-profile-visual-size));
197
+ --xh-action-radius: var(--xh-date-field-action-radius, var(--xh-shape-inset));
198
+ /* 底色阶梯由 ghost 档给(透明 → 100 → 200),使用者槽只作覆盖入口 */
199
+ --xh-action-bg-rest: var(--xh-date-field-action-bg, var(--xh-_action-variant-bg-rest));
200
+ --xh-action-bg-hover: var(--xh-date-field-action-bg-hover, var(--xh-_action-variant-bg-hover));
201
+ --xh-action-bg-pressed: var(--xh-date-field-action-bg-active, var(--xh-_action-variant-bg-pressed));
202
+ --xh-action-fg-rest: var(--xh-date-field-action-fg, var(--xh-fg-muted));
203
+ --xh-action-fg-hover: var(--xh-date-field-action-fg-hover, var(--xh-fg-default));
204
+ --xh-action-border-rest: transparent;
205
+ --xh-action-highlight-rest: transparent;
206
+ --xh-action-shadow-rest: none;
207
+ --xh-action-shadow-hover: none;
208
+ --xh-action-shadow-pressed: none;
209
+ --xh-action-font-size: var(--xh-date-field-action-font-size, var(--xh-text-secondary-size));
210
+ /* 配方尚未把 profile 字形档灌进 --xh-icon-size,钮内字形先按 field-inset 档逐钮取值 */
211
+ --xh-icon-size: var(--xh-_action-profile-glyph-size);
212
+
213
+ border-width: 0;
214
+ }
215
+
216
+ /* 家族给了 display,UA 的 [hidden]{display:none} 已被盖掉,这里补回来 */
217
+ [data-scope='date-field'][data-part='clear-trigger'][hidden] {
218
+ display: none;
253
219
  }
254
220
 
255
221
  /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这条即不命中 */
@@ -264,6 +230,13 @@
264
230
  mask: var(--xh-glyph-mark-close) center / contain no-repeat;
265
231
  }
266
232
 
233
+ @media (forced-colors: active) {
234
+ [data-scope='date-field'][data-part='segment'][data-invalid]:is([data-focus], :focus-visible) {
235
+ outline: var(--xh-ring-width) solid Highlight;
236
+ outline-offset: var(--xh-ring-offset);
237
+ }
238
+ }
239
+
267
240
  /* 连接层把它写成 type=hidden,UA 自己就不渲染;这里的视觉隐藏是给元素升级前那一瞬兜底
268
241
  (作者手写的是一个普通 input,升级完成前它是可见的文本框)。
269
242
  刻意不写 display:写了反而会盖掉 UA 对 type=hidden 的收起,把它显出来 */