@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
@@ -0,0 +1,719 @@
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
+ /* TimeRangePicker 独立皮肤同时传递引入字段视觉盒、字段内动作与浮层集合行;full bundle 递归去重。 */
7
+ @import '../family/field-chrome.css';
8
+ @import '../family/action-control.css';
9
+ @import '../family/collection-item.css';
10
+
11
+ @import './scrollbar.css';
12
+
13
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
14
+ @import '../family/motion.css';
15
+
16
+ @layer xihan.components {
17
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
18
+ [data-scope='time-range-picker'] {
19
+ --xh-time-range-picker-skin: 1;
20
+ }
21
+
22
+ /* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
23
+ [data-scope='time-range-picker'][data-part='positioner'] {
24
+ /* 落定那一侧的可用宽度,由定位引擎经内联自定义属性写进来,内容层据此夹住行内轴;
25
+ 引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
26
+ --xh-_time-range-picker-available-w: 100vw;
27
+
28
+ /* 每个浮层独立声明方向,避免嵌套浮层继承祖先的进场位移。 */
29
+ --xh-_overlay-enter-up: 0;
30
+ --xh-_overlay-enter-down: 0;
31
+ --xh-_overlay-enter-left: 0;
32
+ --xh-_overlay-enter-right: 0;
33
+
34
+ /* 面板的自绘横条浮在内容之上:轨道不上底色,实色轨道会在面板底缘糊出一条灰带 */
35
+ --xh-scrollbar-track-bg: transparent;
36
+
37
+ position: fixed;
38
+ z-index: var(--xh-time-range-picker-layer, var(--xh-_layer, var(--xh-layer-popover)));
39
+ /* 空壳不吃指针,交互只发生在 content 里 */
40
+ pointer-events: none;
41
+ }
42
+
43
+ /* 锚点被滚出可视区:整个浮层随之收起 */
44
+ [data-scope='time-range-picker'][data-part='positioner'][data-hidden] {
45
+ visibility: hidden;
46
+ }
47
+
48
+ /* 短位移沿实际落位的物理方向,不随书写方向翻转。 */
49
+ [data-scope='time-range-picker'][data-part='positioner'][data-placement^='top'] {
50
+ --xh-_overlay-enter-down: 1;
51
+ }
52
+
53
+ [data-scope='time-range-picker'][data-part='positioner'][data-placement^='bottom'] {
54
+ --xh-_overlay-enter-up: 1;
55
+ }
56
+
57
+ [data-scope='time-range-picker'][data-part='positioner'][data-placement^='left'] {
58
+ --xh-_overlay-enter-right: 1;
59
+ }
60
+
61
+ [data-scope='time-range-picker'][data-part='positioner'][data-placement^='right'] {
62
+ --xh-_overlay-enter-left: 1;
63
+ }
64
+
65
+ /* 私有槽同时声明在根与 positioner 上:浮层被搬到 portal 落点,不是根的后代,继承不过去 */
66
+ [data-scope='time-range-picker']:is([data-part='root'], [data-part='positioner']) {
67
+ /* 尺寸档只换这几个私有槽,标题、输入行与浮层里的格子都从这两处继承它们,
68
+ 换档不必给每个部件各写一条选择器;形态三档由家族按 control 上的 data-variant 生成,皮肤不再声明 */
69
+ --xh-_time-range-picker-control-h: var(--xh-control-h-md);
70
+ --xh-_time-range-picker-control-px: var(--xh-control-px-md);
71
+ --xh-_time-range-picker-gap: var(--xh-control-gap-md);
72
+ --xh-_time-range-picker-font-size: var(--xh-control-font-md);
73
+
74
+ /* 段位强调随语气走:当前段是「当前项」,淡底 + 淡底前景;对号使用普通表面上的前景色。
75
+ 没写 data-tone 时这几个 --xh-_tone* 没被声明,退回品牌色 */
76
+ --xh-_time-range-picker-segment-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
77
+ --xh-_time-range-picker-segment-fg: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
78
+ --xh-_time-range-picker-check-fg: var(--xh-_tone, var(--xh-fg-brand));
79
+ }
80
+
81
+ /* 与文本框、时间输入同一套堆叠:标签一行、控件一行 */
82
+ [data-scope='time-range-picker'][data-part='root'] {
83
+ /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
84
+ --xh-icon-size: var(--xh-time-range-picker-icon-size, var(--xh-glyph-size-md));
85
+
86
+ display: inline-flex;
87
+ flex-direction: column;
88
+ gap: var(--xh-time-range-picker-gap, var(--xh-space-1));
89
+
90
+ /* 不传尺寸时一律这么宽,宽度不随内容走;父容器给不出这么宽时整件跟着收,地板同步让步,不越出父容器。
91
+ 地板不高过缺省宽:使用者把缺省宽钉到底线以下时不必再放开底线 */
92
+ inline-size: var(--xh-time-range-picker-control-w, var(--xh-control-w));
93
+ min-inline-size: min(var(--xh-time-range-picker-control-w, var(--xh-control-w)), var(--xh-time-range-picker-control-min-w, var(--xh-control-min-w)), 100%);
94
+ max-inline-size: 100%;
95
+ }
96
+
97
+ /* —— 尺寸 —— */
98
+ /* 缺省档写在上面的基础规则里 */
99
+ [data-scope='time-range-picker']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
100
+ --xh-icon-size: var(--xh-time-range-picker-icon-size, var(--xh-glyph-size-sm));
101
+ --xh-_time-range-picker-control-h: var(--xh-control-h-sm);
102
+ --xh-_time-range-picker-control-px: var(--xh-control-px-sm);
103
+ --xh-_time-range-picker-gap: var(--xh-control-gap-sm);
104
+ --xh-_time-range-picker-font-size: var(--xh-control-font-sm);
105
+ }
106
+
107
+ [data-scope='time-range-picker']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
108
+ --xh-icon-size: var(--xh-time-range-picker-icon-size, var(--xh-glyph-size-lg));
109
+ --xh-_time-range-picker-control-h: var(--xh-control-h-lg);
110
+ --xh-_time-range-picker-control-px: var(--xh-control-px-lg);
111
+ --xh-_time-range-picker-gap: var(--xh-control-gap-lg);
112
+ --xh-_time-range-picker-font-size: var(--xh-control-font-lg);
113
+ }
114
+
115
+ /* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
116
+ [data-scope='time-range-picker'][data-part='root'][hidden] {
117
+ display: none;
118
+ }
119
+
120
+ [data-scope='time-range-picker'][data-part='label'] {
121
+ color: var(--xh-time-range-picker-label-fg, var(--xh-fg-default));
122
+ font-size: var(--xh-time-range-picker-label-font-size, var(--xh-text-label-size));
123
+ font-weight: var(--xh-time-range-picker-label-font-weight, var(--xh-text-label-weight));
124
+ line-height: var(--xh-leading-none);
125
+ }
126
+
127
+ [data-scope='time-range-picker'][data-part='label'][data-disabled] {
128
+ color: var(--xh-time-range-picker-label-fg-disabled, var(--xh-fg-subtle));
129
+ }
130
+
131
+ /* 画成一个框的是 control:几段文字、展开按钮、清空按钮要看起来是一体的,
132
+ 边框长在其中任何一个身上都会把另外几个割在框外。描边、底色、圆角、聚焦环、五态与悬停由
133
+ Field Chrome 家族画在 control 上(焦点落在段或按钮上,家族 :focus-within 让整框亮起来);
134
+ 组件只映射既有公开槽(shadow 缺省 none:字段静息描边式、无影)。打开中不另画环,由浮层本身承担 */
135
+ [data-scope='time-range-picker'][data-part='control'] {
136
+ --xh-field-control-height: var(--xh-time-range-picker-control-h, var(--xh-_time-range-picker-control-h));
137
+ --xh-field-control-padding-inline: var(--xh-time-range-picker-control-px, var(--xh-_time-range-picker-control-px));
138
+ --xh-field-control-gap: var(--xh-time-range-picker-control-gap, var(--xh-_time-range-picker-gap));
139
+ --xh-field-control-min-inline-size: var(--xh-time-range-picker-control-min-w, var(--xh-control-min-w));
140
+ --xh-field-control-radius: var(--xh-time-range-picker-control-radius, var(--xh-shape-control));
141
+ --xh-field-bg-rest: var(--xh-time-range-picker-control-bg, var(--xh-_field-variant-bg-rest));
142
+ --xh-field-bg-hover: var(--xh-time-range-picker-control-bg-hover, var(--xh-_field-variant-bg-hover));
143
+ --xh-field-bg-read-only: var(--xh-time-range-picker-control-bg-readonly, var(--xh-_field-variant-bg-read-only));
144
+ --xh-field-bg-disabled: var(--xh-time-range-picker-control-bg-disabled, var(--xh-_field-variant-bg-disabled));
145
+ --xh-field-fg-rest: var(--xh-time-range-picker-control-fg, var(--xh-fg-default));
146
+ --xh-field-border-rest: var(--xh-time-range-picker-control-border, var(--xh-_field-variant-border-rest));
147
+ --xh-field-border-hover: var(--xh-time-range-picker-control-border-hover, var(--xh-_field-variant-border-hover));
148
+ --xh-field-border-focus: var(--xh-time-range-picker-control-border-focus, var(--xh-_field-variant-border-focus));
149
+ --xh-field-border-invalid: var(--xh-time-range-picker-control-border-invalid, var(--xh-_field-variant-border-invalid));
150
+ --xh-field-ring-focus: var(--xh-ring-focus);
151
+ --xh-field-ring-invalid: var(--xh-ring-invalid);
152
+ --xh-field-shadow-rest: var(--xh-time-range-picker-control-shadow, none);
153
+ /* 段位靠键盘编辑,盒上不是文本光标 */
154
+ --xh-field-cursor-rest: default;
155
+ /* 家族 chrome 会重写 --xh-icon-size,使用者图标槽必须经桥接槽下发才能在盒内生效 */
156
+ --xh-field-glyph-size: var(--xh-time-range-picker-icon-size, var(--xh-_field-size-glyph-size));
157
+
158
+ /* 表单控件不继承页面字体,只给字号会让它用 UA 默认字族,与周围文本对不上 */
159
+ font-family: inherit;
160
+ font-size: var(--xh-time-range-picker-font-size, var(--xh-_time-range-picker-font-size));
161
+ /* 等宽数字:各位字宽不一时逐段填入会让整行左右跳 */
162
+ font-variant-numeric: tabular-nums;
163
+ line-height: var(--xh-leading-normal);
164
+ }
165
+
166
+ [data-scope='time-range-picker'][data-part='control'][hidden] {
167
+ display: none;
168
+ }
169
+
170
+ /* 起止各一组段位与作者写在段间的分隔符都在各自这一层里:起点那组只占自己的宽度,
171
+ 分隔符紧跟在它后面,剩下的宽度全给终点那组,尾部按钮因此靠在框内末端 */
172
+ [data-scope='time-range-picker'][data-part='segment-group'] {
173
+ display: inline-flex;
174
+ flex: 1 1 auto;
175
+ align-items: center;
176
+ min-inline-size: 0;
177
+ }
178
+
179
+ [data-scope='time-range-picker'][data-part='segment-group'][data-index='0']:has(+ [data-part='range-separator']) {
180
+ flex: 0 0 auto;
181
+ }
182
+
183
+ [data-scope='time-range-picker'][data-part='segment-group'][hidden] {
184
+ display: none;
185
+ }
186
+
187
+ [data-scope='time-range-picker'][data-part='range-separator'] {
188
+ display: inline-flex;
189
+ flex: none;
190
+ align-items: center;
191
+ justify-content: center;
192
+ /* 两侧各留一个小间距:把输入行的常规间距收回来,再补上自己那一份 */
193
+ --xh-_time-range-picker-range-separator-mx: calc(var(--xh-time-range-picker-range-separator-px, var(--xh-space-1)) - var(--xh-time-range-picker-control-gap, var(--xh-_time-range-picker-gap)));
194
+
195
+ margin-inline: var(--xh-time-range-picker-range-separator-mx, var(--xh-_time-range-picker-range-separator-mx));
196
+ padding-inline: var(--xh-time-range-picker-range-separator-px, var(--xh-space-1));
197
+ color: var(--xh-time-range-picker-range-separator-fg, var(--xh-fg-subtle));
198
+ font: inherit;
199
+ line-height: var(--xh-leading-none);
200
+ pointer-events: none;
201
+ user-select: none;
202
+ }
203
+
204
+ /* 作者自己给分隔符加 hidden 时也真的收起:上面那条 display 会盖掉 UA 的兜底 */
205
+ [data-scope='time-range-picker'][data-part='range-separator'][hidden] {
206
+ display: none;
207
+ }
208
+
209
+ [data-scope='time-range-picker'][data-part='segment-group'] > :not([data-scope]) {
210
+ color: var(--xh-time-range-picker-literal-fg, var(--xh-fg-subtle));
211
+ }
212
+
213
+ /* 每一段是一小块可聚焦区,紧挨着排;间距长在段自己身上 */
214
+ [data-scope='time-range-picker'][data-part='segment'] {
215
+ display: inline-block;
216
+ padding-inline: var(--xh-time-range-picker-segment-px, var(--xh-space-0_5));
217
+ padding-block: 0;
218
+ border-radius: var(--xh-time-range-picker-segment-radius, var(--xh-shape-inset));
219
+ color: inherit;
220
+ font-variant-numeric: inherit;
221
+ text-align: center;
222
+ /* 段是 role=spinbutton 的展示节点,双击选中一段文字只会碍事 */
223
+ user-select: none;
224
+ transition:
225
+ background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
226
+ color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
227
+ }
228
+
229
+ /* granularity / hourCycle 关掉的段由连接层打 hidden;上面那条 display 会把 UA 规则盖掉,
230
+ 少了这条,收起的段会一直杵在那儿 */
231
+ [data-scope='time-range-picker'][data-part='segment'][hidden] {
232
+ display: none;
233
+ }
234
+
235
+ /* 还没填的段压成弱色:一行里哪几段是占位符,一眼要看得出来 */
236
+ [data-scope='time-range-picker'][data-part='segment'][data-placeholder] {
237
+ color: var(--xh-time-range-picker-placeholder-fg, var(--xh-fg-subtle));
238
+ }
239
+
240
+ /* 一行段长得差不多,光有边框亮起来看不出正在改哪一段:当前段必须自己有底色。
241
+ data-focus 由机器给(它知道谁是当前段),:focus-visible 兜住机器状态还没回流的那一帧 */
242
+ [data-scope='time-range-picker'][data-part='segment'][data-focus]:not([data-disabled]),
243
+ [data-scope='time-range-picker'][data-part='segment']:focus-visible {
244
+ background: var(--xh-time-range-picker-segment-bg-focus, var(--xh-_time-range-picker-segment-bg));
245
+ color: var(--xh-time-range-picker-segment-fg-focus, var(--xh-_time-range-picker-segment-fg));
246
+ outline: none;
247
+ }
248
+
249
+ /* 焦点态用了品牌底色之后,占位符那条弱色会被它盖住,这里明确让位给焦点态 */
250
+ [data-scope='time-range-picker'][data-part='segment'][data-focus][data-placeholder]:not([data-disabled]) {
251
+ color: var(--xh-time-range-picker-segment-fg-focus, var(--xh-_time-range-picker-segment-fg));
252
+ }
253
+
254
+ [data-scope='time-range-picker'][data-part='segment'][data-invalid] {
255
+ color: var(--xh-time-range-picker-segment-fg-invalid, var(--xh-fg-danger));
256
+ }
257
+
258
+ [data-scope='time-range-picker'][data-part='segment'][data-invalid]:is([data-focus], :focus-visible) {
259
+ background: var(
260
+ --xh-time-range-picker-segment-bg-invalid-focus,
261
+ var(--xh-bg-subtle)
262
+ );
263
+ color: var(--xh-time-range-picker-segment-fg-invalid-focus, var(--xh-fg-danger));
264
+ }
265
+
266
+ [data-scope='time-range-picker'][data-part='segment']:hover:not([data-focus], [data-disabled]) {
267
+ background: var(--xh-time-range-picker-segment-bg-hover, var(--xh-bg-subtle));
268
+ }
269
+
270
+ /* 段是集合条目形态(role=spinbutton 的 span),禁用走 data-disabled 而不是 :disabled */
271
+ [data-scope='time-range-picker'][data-part='segment'][data-disabled] {
272
+ color: var(--xh-fg-disabled);
273
+ }
274
+
275
+ /* 两个按钮同一副长相:贴在框内末端的小方钮,不占宽度也不撑高 control。正方视觉盒、inset 圆角、
276
+ 悬停 100 / 按下 200 与 0.97 按压、粗指针热区、禁用面与 :focus-visible 关环(盒的 :focus-within
277
+ 已画了一圈)全由 Action Control 的 field-inset ghost 档给,组件只映射既有覆盖槽。
278
+ 打开中与悬停同档:展开钮不另上底,方向由浮层本身承担 */
279
+ [data-scope='time-range-picker'][data-part='trigger'],
280
+ [data-scope='time-range-picker'][data-part='clear-trigger'] {
281
+ --xh-action-visual-size: var(--xh-time-range-picker-action-size, var(--xh-_action-profile-visual-size));
282
+ --xh-action-min-inline-size: var(--xh-time-range-picker-action-size, var(--xh-_action-profile-visual-size));
283
+ --xh-action-radius: var(--xh-time-range-picker-action-radius, var(--xh-shape-inset));
284
+ /* 底色阶梯由 ghost 档给(透明 → 100 → 200),使用者槽只作覆盖入口 */
285
+ --xh-action-bg-rest: var(--xh-time-range-picker-action-bg, var(--xh-_action-variant-bg-rest));
286
+ --xh-action-bg-hover: var(--xh-time-range-picker-action-bg-hover, var(--xh-_action-variant-bg-hover));
287
+ --xh-action-bg-pressed: var(--xh-time-range-picker-action-bg-active, var(--xh-_action-variant-bg-pressed));
288
+ --xh-action-fg-rest: var(--xh-time-range-picker-action-fg, var(--xh-fg-muted));
289
+ --xh-action-fg-hover: var(--xh-time-range-picker-action-fg-hover, var(--xh-fg-default));
290
+ --xh-action-border-rest: transparent;
291
+ --xh-action-highlight-rest: transparent;
292
+ --xh-action-shadow-rest: none;
293
+ --xh-action-shadow-hover: none;
294
+ --xh-action-shadow-pressed: none;
295
+ --xh-action-font-size: var(--xh-time-range-picker-action-font-size, var(--xh-text-secondary-size));
296
+ /* 配方尚未把 profile 字形档灌进 --xh-icon-size,钮内字形先按 field-inset 档逐钮取值 */
297
+ --xh-icon-size: var(--xh-_action-profile-glyph-size);
298
+
299
+ border-width: 0;
300
+ }
301
+
302
+ /* 没值时连接层给的是 hidden 属性;家族那条 display 会把 UA 规则盖掉 */
303
+ [data-scope='time-range-picker'][data-part='trigger'][hidden],
304
+ [data-scope='time-range-picker'][data-part='clear-trigger'][hidden] {
305
+ display: none;
306
+ }
307
+
308
+ /* 打开中与悬停同档:展开钮的静息底换到悬停那一支中性面,不用品牌色、不另画环;方向由浮层本身承担 */
309
+ [data-scope='time-range-picker'][data-part='trigger'][data-state='open'] {
310
+ --xh-action-bg-rest: var(--xh-time-range-picker-action-bg-hover, var(--xh-_action-variant-bg-hover));
311
+ --xh-action-fg-rest: var(--xh-time-range-picker-action-fg-hover, var(--xh-fg-default));
312
+ }
313
+
314
+ /* 有值时清空钮顶上来,展开钮让位:两颗并排堆着用户分不清点哪个 */
315
+ [data-scope='time-range-picker'][data-part='control']:has(
316
+ > [data-scope='time-range-picker'][data-part='clear-trigger']:not([hidden])
317
+ )
318
+ > [data-scope='time-range-picker'][data-part='trigger'] {
319
+ display: none;
320
+ }
321
+
322
+ /* 几列并排:整体高度由列自己撑,滚动发生在列里而不是整个面板上——
323
+ 整面板滚会让时列与分列一起走,挑分的时候时就看不见了。
324
+ 含多列的锚定面板走 floating 材质:实体底 + --xh-border-default 描边 + --xh-elevation-floating 落影,
325
+ 不透景、不画顶光 */
326
+ [data-scope='time-range-picker'][data-part='content'] {
327
+ position: relative;
328
+ display: flex;
329
+ align-items: stretch;
330
+ padding-block: var(--xh-time-range-picker-content-py, var(--xh-space-2));
331
+ padding-inline: var(--xh-time-range-picker-content-px, var(--xh-space-2));
332
+ /* 行内轴的上限是落位后的可用宽度:两组时列并排,秒与上下午都开时八列合计会越过最窄视口,
333
+ 放不下时面板内自己横滚,每一列保持自己的宽度不被压 */
334
+ max-inline-size: var(--xh-_time-range-picker-available-w);
335
+ overflow-x: auto;
336
+ /* 浮层滚动面:滚到头不把页面一起带走 */
337
+ overscroll-behavior: contain;
338
+ /* 列自己定高,面板整体不该再长过页内滚动面那一档 */
339
+ max-block-size: var(--xh-time-range-picker-content-max-h, var(--xh-viewport-h-lg));
340
+ border: var(--xh-stroke-thin) solid var(--xh-time-range-picker-content-border, var(--xh-border-default));
341
+ border-radius: var(--xh-time-range-picker-content-radius, var(--xh-shape-overlay));
342
+ background: var(--xh-time-range-picker-content-bg, var(--xh-bg-surface));
343
+ color: var(--xh-time-range-picker-content-fg, var(--xh-fg-default));
344
+ font-variant-numeric: tabular-nums;
345
+ box-shadow: var(--xh-time-range-picker-content-shadow, var(--xh-elevation-floating));
346
+ pointer-events: auto;
347
+ /* 快捷选项列与各时间列的条子贴在各自的盒子上、挂在这一层里(它已是定位盒):轨道不画底 */
348
+ --xh-scrollbar-track-bg: transparent;
349
+ }
350
+
351
+ /* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
352
+ 收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
353
+ [hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
354
+ 真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
355
+ 其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
356
+
357
+ /* 面板本身不承载焦点(焦点在某一列的某一格上),落焦时不画环 */
358
+ [data-scope='time-range-picker'][data-part='content']:focus-visible {
359
+ outline: none;
360
+ }
361
+
362
+ [data-scope='time-range-picker'][data-part='content'][data-state='open'] {
363
+ /* 只在展开态挂着:随状态属性一起消失,不长期占着合成层 */
364
+ will-change: opacity, translate;
365
+ animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
366
+ }
367
+
368
+ /* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
369
+ 免得动画结束到真收起之间闪一下原样 */
370
+ [data-scope='time-range-picker'][data-part='content'][data-state='closed'] {
371
+ animation: xh-overlay-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
372
+ }
373
+
374
+ /* 快捷选项也是一列,与时分秒那几列并排,排在行内起始一侧 */
375
+ [data-scope='time-range-picker'][data-part='preset-group'] {
376
+ display: flex;
377
+ flex: none;
378
+ flex-direction: column;
379
+ gap: var(--xh-time-range-picker-preset-group-gap, var(--xh-list-option-gap));
380
+ max-block-size: var(--xh-time-range-picker-preset-group-h, var(--xh-viewport-h-sm));
381
+ padding-inline: var(--xh-time-range-picker-preset-group-px, var(--xh-space-1));
382
+ overflow-y: auto;
383
+ /* 浮层滚动面:滚到头不把页面一起带走 */
384
+ overscroll-behavior: contain;
385
+ border-inline-end: var(--xh-stroke-thin) solid var(--xh-time-range-picker-column-divider, var(--xh-material-frosted-separator));
386
+ }
387
+
388
+ [data-scope='time-range-picker'][data-part='preset-group'][hidden] {
389
+ display: none;
390
+ }
391
+
392
+ /* 快捷选项:悬停 / 高亮 100、按下 200、禁用面由 Collection Item 家族按 overlay 语境给(选中 = 透明底 +
393
+ 行尾对号,正文保持 rest 色与常规字重)。选项没有正文部件,匿名文本进不了家族网格的 text 列,
394
+ 行保持块级排版,末端为对号预留固定轨 */
395
+ [data-scope='time-range-picker'][data-part='preset'] {
396
+ --xh-collection-block-padding: var(--xh-time-range-picker-preset-py, var(--xh-space-1));
397
+ --xh-collection-inline-padding: var(--xh-time-range-picker-preset-px, var(--xh-space-3));
398
+ --xh-collection-font-size: var(--xh-text-secondary-size);
399
+ --xh-collection-radius: var(--xh-time-range-picker-preset-radius, var(--xh-shape-control));
400
+ /* 面板是实体面(floating),正文取页面前景 */
401
+ --xh-collection-fg-rest: var(--xh-time-range-picker-preset-fg, var(--xh-fg-default));
402
+ --xh-collection-fg-hover: var(--xh-time-range-picker-preset-fg, var(--xh-fg-default));
403
+ --xh-collection-fg-keyboard-highlight: var(--xh-time-range-picker-preset-fg, var(--xh-fg-default));
404
+ --xh-collection-fg-pressed: var(--xh-time-range-picker-preset-fg, var(--xh-fg-default));
405
+ --xh-collection-fg-selected: var(--xh-time-range-picker-preset-fg-checked, var(--xh-time-range-picker-preset-fg, var(--xh-fg-default)));
406
+ --xh-collection-fg-selected-highlight: var(--xh-time-range-picker-preset-fg-checked, var(--xh-time-range-picker-preset-fg, var(--xh-fg-default)));
407
+ --xh-collection-fg-selected-hover: var(--xh-time-range-picker-preset-fg-checked, var(--xh-time-range-picker-preset-fg, var(--xh-fg-default)));
408
+ --xh-collection-fg-selected-pressed: var(--xh-time-range-picker-preset-fg-checked, var(--xh-time-range-picker-preset-fg, var(--xh-fg-default)));
409
+ --xh-collection-fg-disabled: var(--xh-time-range-picker-preset-fg-disabled, var(--xh-fg-disabled));
410
+ --xh-collection-bg-hover: var(--xh-time-range-picker-preset-bg-hover, var(--xh-bg-subtle));
411
+ --xh-collection-bg-keyboard-highlight: var(--xh-time-range-picker-preset-bg-hover, var(--xh-bg-subtle));
412
+ --xh-collection-bg-selected-highlight: var(--xh-time-range-picker-preset-bg-hover, var(--xh-bg-subtle));
413
+ --xh-collection-bg-selected-hover: var(--xh-time-range-picker-preset-bg-hover, var(--xh-bg-subtle));
414
+ --xh-collection-bg-pressed: var(--xh-time-range-picker-preset-bg-pressed, var(--xh-bg-subtle-hover));
415
+ --xh-collection-bg-selected-pressed: var(--xh-time-range-picker-preset-bg-pressed, var(--xh-bg-subtle-hover));
416
+ --xh-collection-outline-keyboard-highlight: transparent;
417
+ --xh-collection-outline-selected-highlight: transparent;
418
+
419
+ position: relative;
420
+ display: block;
421
+ flex: none;
422
+ /* 对号的末端轨始终留着,切换选中时文字与整列宽度都不移动。 */
423
+ padding-inline-end: calc(
424
+ var(--xh-time-range-picker-preset-px, var(--xh-space-3))
425
+ + var(--xh-time-range-picker-preset-check-size, var(--xh-glyph-size-sm))
426
+ + var(--xh-space-1)
427
+ );
428
+ white-space: nowrap;
429
+ user-select: none;
430
+ }
431
+
432
+ /* 键盘焦点出现时环才接回并立即到位,不压在背景过渡的中间帧上 */
433
+ [data-scope='time-range-picker'][data-part='preset']:focus-visible:not(:hover) {
434
+ --xh-collection-outline-keyboard-highlight: var(--xh-ring-focus);
435
+ --xh-collection-outline-selected-highlight: var(--xh-ring-focus);
436
+
437
+ transition: none;
438
+ }
439
+
440
+ /* 对号是 preset 自身的正式选中出口:全部条目恒留末端轨,不依赖作者补节点。 */
441
+ [data-scope='time-range-picker'][data-part='preset']::after {
442
+ content: '';
443
+ position: absolute;
444
+ inset-block-start: 50%;
445
+ inset-inline-end: var(--xh-time-range-picker-preset-px, var(--xh-space-3));
446
+ inline-size: var(--xh-time-range-picker-preset-check-size, var(--xh-glyph-size-sm));
447
+ block-size: var(--xh-time-range-picker-preset-check-size, var(--xh-glyph-size-sm));
448
+ background-color: var(--xh-time-range-picker-preset-check-fg, var(--xh-_time-range-picker-check-fg));
449
+ opacity: 0;
450
+ translate: 0 -50%;
451
+ -webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
452
+ mask: var(--xh-glyph-mark-check) center / contain no-repeat;
453
+ pointer-events: none;
454
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
455
+ }
456
+
457
+ /* 命中只显示对号;正文不反白、不增重,底色通道留给临时交互状态。 */
458
+ [data-scope='time-range-picker'][data-part='preset'][data-state='checked']::after {
459
+ opacity: 1;
460
+ }
461
+
462
+ /* 上面给了 display,UA 的 [hidden]{display:none} 已被盖掉,这里补回来 */
463
+ [data-scope='time-range-picker'][data-part='preset'][hidden] {
464
+ display: none;
465
+ }
466
+
467
+ [data-scope='time-range-picker'][data-part='preset'][data-disabled]::after {
468
+ background-color: var(--xh-time-range-picker-preset-fg-disabled, var(--xh-fg-disabled));
469
+ }
470
+
471
+ /* 一端的几列成组并排,小标题独占顶上一行;两组之间留一道更宽的分隔,眼睛先分起止、再分时分 */
472
+ [data-scope='time-range-picker'][data-part='column-group'] {
473
+ --xh-_time-range-picker-column-group-label-py: var(
474
+ --xh-time-range-picker-column-group-py,
475
+ var(--xh-time-range-picker-column-group-label-py, var(--xh-space-1))
476
+ );
477
+ --xh-_time-range-picker-column-group-label-h: calc(
478
+ 1lh
479
+ + var(--xh-_time-range-picker-column-group-label-py)
480
+ + var(--xh-_time-range-picker-column-group-label-py)
481
+ );
482
+
483
+ position: relative;
484
+ display: flex;
485
+ flex: none;
486
+ flex-wrap: nowrap;
487
+ align-content: flex-start;
488
+ align-items: stretch;
489
+ min-inline-size: 0;
490
+ padding-block-start: var(--xh-_time-range-picker-column-group-label-h);
491
+ font-size: var(--xh-text-caption-size);
492
+ line-height: var(--xh-leading-normal);
493
+ }
494
+
495
+ [data-scope='time-range-picker'][data-part='column-group'][hidden] {
496
+ display: none;
497
+ }
498
+
499
+ [data-scope='time-range-picker'][data-part='column-group'] + [data-scope='time-range-picker'][data-part='column-group'] {
500
+ margin-inline-start: var(--xh-time-range-picker-column-group-gap, var(--xh-space-2));
501
+ padding-inline-start: var(--xh-time-range-picker-column-group-gap, var(--xh-space-2));
502
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-time-range-picker-column-group-divider, var(--xh-material-frosted-separator));
503
+ }
504
+
505
+ /* 组顶上的小标题:独占一行,字号走辅助文本档 */
506
+ [data-scope='time-range-picker'][data-part='column-group-label'] {
507
+ position: absolute;
508
+ inset-block-start: 0;
509
+ inset-inline: 0;
510
+ display: flex;
511
+ box-sizing: border-box;
512
+ align-items: center;
513
+ justify-content: center;
514
+ block-size: var(--xh-_time-range-picker-column-group-label-h);
515
+ padding-block: var(--xh-time-range-picker-column-group-label-py, var(--xh-space-1));
516
+ padding-inline: var(--xh-time-range-picker-column-group-label-px, var(--xh-space-1));
517
+ color: var(--xh-time-range-picker-column-group-label-fg, var(--xh-fg-subtle));
518
+ font-size: var(--xh-text-caption-size);
519
+ line-height: var(--xh-leading-normal);
520
+ text-align: center;
521
+ user-select: none;
522
+ }
523
+
524
+ [data-scope='time-range-picker'][data-part='column-group-label'][hidden] {
525
+ display: none;
526
+ }
527
+
528
+ /* 一列一个滚动区:列与列之间用细分隔线,视觉上"时 | 分 | 秒"三栏分明 */
529
+ [data-scope='time-range-picker'][data-part='column'] {
530
+ display: flex;
531
+ flex: none;
532
+ flex-direction: column;
533
+ gap: var(--xh-time-range-picker-column-gap, 0);
534
+ min-inline-size: var(--xh-time-range-picker-column-min-w, var(--xh-overlay-column-min-w));
535
+ /* 几列并排:定高而不是随内容收,否则时列与分列的可选值一多一少就错位 */
536
+ block-size: var(--xh-time-range-picker-column-h, var(--xh-viewport-h-sm));
537
+ padding-inline: var(--xh-time-range-picker-column-px, 0);
538
+ overflow-y: auto;
539
+ /* 浮层滚动面:滚到头不把页面一起带走 */
540
+ overscroll-behavior: contain;
541
+ /* 滚动容器在某些浏览器里会被自动塞进 Tab 序列,是否画环见下方按 tabindex 分档的两条 */
542
+ }
543
+
544
+ /* granularity 关掉的列(精度不到秒时的秒列)由连接层打 hidden */
545
+ [data-scope='time-range-picker'][data-part='column'][hidden] {
546
+ display: none;
547
+ }
548
+
549
+ /* 每列后面紧跟着它自己的贴层条子节点,相邻选择器接不到下一列,按「前面有过列」取第二列起 */
550
+ [data-scope='time-range-picker'][data-part='column'] ~ [data-scope='time-range-picker'][data-part='column'] {
551
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-time-range-picker-column-divider, var(--xh-material-frosted-separator));
552
+ }
553
+
554
+ /* 焦点落在列上有两种情形:指针打开、这一段还空着、还没有任何格当锚点,或整列被界裁空。
555
+ 那一刻它认领着 Tab 位,环画在列内沿;有锚点时环长在格上,列不再画 */
556
+ [data-scope='time-range-picker'][data-part='column'][tabindex='0']:focus-visible {
557
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
558
+ outline-offset: var(--xh-ring-offset);
559
+ }
560
+
561
+ [data-scope='time-range-picker'][data-part='column']:not([tabindex='0']):focus-visible {
562
+ outline: none;
563
+ }
564
+
565
+ /* 时间格:悬停 / 高亮 100、按下 200 由 Collection Item 家族按 overlay 语境给,选中只留末端对号——
566
+ 浮层瞬态集合的选中不上品牌淡底、不加粗、不变字色。格里只有数字、没有正文部件,保持自己的
567
+ 居中排版与等宽标记轨,家族只给状态面。行的字色与字重按值选择族的同一套映射写(--xh-time-range-picker-item-fg
568
+ / -fg-selected / -font-weight-selected 使用者槽,缺省落家族配方的行字色 --xh-material-frosted-fg:
569
+ 它在各主题与 forced-colors 下都等于 --xh-fg-default,floating 面板上的面色仍由 content 自己给) */
570
+ [data-scope='time-range-picker'][data-part='item'] {
571
+ --xh-_time-range-picker-item-rail: max(
572
+ var(--xh-time-range-picker-item-px, var(--xh-space-0_5)),
573
+ calc(var(--xh-time-range-picker-item-check-size, var(--xh-glyph-size-sm)) + var(--xh-space-0_5))
574
+ );
575
+ --xh-collection-block-padding: var(--xh-time-range-picker-item-py, 0);
576
+ /* 两侧留同宽轨:对号绝对落在末端,数字仍在整格的数学中心。 */
577
+ --xh-collection-inline-padding: var(--xh-_time-range-picker-item-rail);
578
+ --xh-collection-font-size: var(--xh-time-range-picker-item-font-size, var(--xh-_time-range-picker-font-size));
579
+ --xh-collection-radius: var(--xh-time-range-picker-item-radius, var(--xh-shape-control));
580
+ --xh-collection-fg-rest: var(--xh-time-range-picker-item-fg, var(--xh-material-frosted-fg));
581
+ --xh-collection-fg-hover: var(--xh-time-range-picker-item-fg, var(--xh-material-frosted-fg));
582
+ --xh-collection-fg-keyboard-highlight: var(--xh-time-range-picker-item-fg, var(--xh-material-frosted-fg));
583
+ --xh-collection-fg-pressed: var(--xh-time-range-picker-item-fg, var(--xh-material-frosted-fg));
584
+ --xh-collection-fg-selected: var(--xh-time-range-picker-item-fg-selected, var(--xh-time-range-picker-item-fg, var(--xh-material-frosted-fg)));
585
+ --xh-collection-fg-selected-highlight: var(--xh-time-range-picker-item-fg-selected, var(--xh-time-range-picker-item-fg, var(--xh-material-frosted-fg)));
586
+ --xh-collection-fg-selected-hover: var(--xh-time-range-picker-item-fg-selected, var(--xh-time-range-picker-item-fg, var(--xh-material-frosted-fg)));
587
+ --xh-collection-fg-selected-pressed: var(--xh-time-range-picker-item-fg-selected, var(--xh-time-range-picker-item-fg, var(--xh-material-frosted-fg)));
588
+ --xh-collection-font-weight-selected: var(--xh-time-range-picker-item-font-weight-selected, var(--xh-font-weight-regular));
589
+ --xh-collection-font-weight-selected-highlight: var(--xh-time-range-picker-item-font-weight-selected, var(--xh-font-weight-regular));
590
+ --xh-collection-font-weight-selected-hover: var(--xh-time-range-picker-item-font-weight-selected, var(--xh-font-weight-regular));
591
+ --xh-collection-font-weight-selected-pressed: var(--xh-time-range-picker-item-font-weight-selected, var(--xh-font-weight-regular));
592
+ --xh-collection-bg-hover: var(--xh-time-range-picker-item-bg-hover, var(--xh-bg-subtle));
593
+ --xh-collection-bg-keyboard-highlight: var(--xh-time-range-picker-item-bg-hover, var(--xh-bg-subtle));
594
+ --xh-collection-bg-selected-highlight: var(--xh-time-range-picker-item-bg-hover, var(--xh-bg-subtle));
595
+ --xh-collection-bg-selected-hover: var(--xh-time-range-picker-item-bg-hover, var(--xh-bg-subtle));
596
+ --xh-collection-bg-pressed: var(--xh-time-range-picker-item-bg-pressed, var(--xh-bg-subtle-hover));
597
+ --xh-collection-bg-selected-pressed: var(--xh-time-range-picker-item-bg-pressed, var(--xh-bg-subtle-hover));
598
+ --xh-collection-outline-keyboard-highlight: transparent;
599
+ --xh-collection-outline-selected-highlight: transparent;
600
+
601
+ position: relative;
602
+ display: flex;
603
+ flex: none;
604
+ align-items: center;
605
+ justify-content: center;
606
+ block-size: var(--xh-time-range-picker-item-h, var(--xh-overlay-column-item-h));
607
+ /* 居中的单个数字格没有截断层,行高保持紧排,列内多露几格 */
608
+ line-height: var(--xh-leading-none);
609
+ white-space: nowrap;
610
+ user-select: none;
611
+ }
612
+
613
+ /* 键盘焦点出现时环才接回并立即到位,不压在背景过渡的中间帧上 */
614
+ [data-scope='time-range-picker'][data-part='item']:focus-visible:not(:hover) {
615
+ --xh-collection-outline-keyboard-highlight: var(--xh-ring-focus);
616
+ --xh-collection-outline-selected-highlight: var(--xh-ring-focus);
617
+
618
+ transition: none;
619
+ }
620
+
621
+ /* 作者自己藏掉某几格时要让位,有 display 就得补这条 */
622
+ [data-scope='time-range-picker'][data-part='item'][hidden] {
623
+ display: none;
624
+ }
625
+
626
+ [data-scope='time-range-picker'][data-part='item']::after {
627
+ content: '';
628
+ position: absolute;
629
+ inset-block-start: 50%;
630
+ inset-inline-end: var(--xh-space-0_5);
631
+ inline-size: var(--xh-time-range-picker-item-check-size, var(--xh-glyph-size-sm));
632
+ block-size: var(--xh-time-range-picker-item-check-size, var(--xh-glyph-size-sm));
633
+ background-color: var(--xh-time-range-picker-item-check-fg, var(--xh-_time-range-picker-check-fg));
634
+ opacity: 0;
635
+ translate: 0 -50%;
636
+ -webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
637
+ mask: var(--xh-glyph-mark-check) center / contain no-repeat;
638
+ pointer-events: none;
639
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
640
+ }
641
+
642
+ /* 选中只画对号,正文与静止底保持普通态;悬停 / 高亮 / 按下面由家族给 */
643
+ [data-scope='time-range-picker'][data-part='item'][data-state='checked']::after {
644
+ opacity: 1;
645
+ }
646
+
647
+ /* 禁用走 aria-disabled 而非原生 disabled,家族按 aria-disabled 给禁用面;标记跟着降级 */
648
+ [data-scope='time-range-picker'][data-part='item'][data-disabled]::after {
649
+ background-color: var(--xh-fg-disabled);
650
+ }
651
+
652
+ @media (forced-colors: active) {
653
+ [data-scope='time-range-picker'][data-part='segment'][data-invalid]:is([data-focus], :focus-visible) {
654
+ outline: var(--xh-ring-width) solid Highlight;
655
+ outline-offset: var(--xh-ring-offset);
656
+ }
657
+
658
+ /* mask 保留对号轮廓,系统色接管墨色;关闭自动调整避免伪元素底被系统抹成透明。 */
659
+ [data-scope='time-range-picker'][data-part='preset']::after,
660
+ [data-scope='time-range-picker'][data-part='item']::after {
661
+ background-color: CanvasText;
662
+ forced-color-adjust: none;
663
+ }
664
+
665
+ [data-scope='time-range-picker'][data-part='preset'][data-disabled]::after,
666
+ [data-scope='time-range-picker'][data-part='item'][data-disabled]::after {
667
+ background-color: GrayText;
668
+ }
669
+ }
670
+
671
+ /* 连接层把它写成 type=hidden,UA 自己就不渲染;这里的视觉隐藏是给元素升级前那一瞬兜底
672
+ (作者手写的是一个普通 input,升级完成前它是可见的文本框)。
673
+ 刻意不写 display:写了反而会盖掉 UA 对 type=hidden 的收起,把它显出来 */
674
+ [data-scope='time-range-picker'][data-part='hidden-input'] {
675
+ position: absolute;
676
+ inline-size: 1px;
677
+ block-size: 1px;
678
+ padding: 0;
679
+ margin: -1px;
680
+ border: 0;
681
+ overflow: hidden;
682
+ clip-path: inset(50%);
683
+ white-space: nowrap;
684
+ pointer-events: none;
685
+ }
686
+
687
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
688
+ [data-scope='time-range-picker'][data-part='clear-trigger']:empty::before {
689
+ content: '';
690
+ display: inline-block;
691
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
692
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
693
+ vertical-align: var(--xh-glyph-baseline-shift);
694
+ background-color: currentColor;
695
+ -webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
696
+ mask: var(--xh-glyph-mark-close) center / contain no-repeat;
697
+ }
698
+
699
+ [data-scope='time-range-picker'][data-part='trigger']:empty::before {
700
+ content: '';
701
+ display: inline-block;
702
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
703
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
704
+ vertical-align: var(--xh-glyph-baseline-shift);
705
+ background-color: currentColor;
706
+ -webkit-mask: var(--xh-glyph-mark-clock) center / contain no-repeat;
707
+ mask: var(--xh-glyph-mark-clock) center / contain no-repeat;
708
+ }
709
+ }
710
+
711
+ @layer xihan.motion {
712
+ @media print {
713
+ /* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
714
+ 收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
715
+ [data-scope='time-range-picker'][data-part='positioner'] {
716
+ display: none;
717
+ }
718
+ }
719
+ }