@xihan-ui/styles 3.0.0 → 3.2.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.
- package/CHANGELOG.md +63 -0
- package/README.md +1 -1
- package/component-tokens.d.ts +29 -0
- package/components.tokens.json +683 -27
- package/css/alert.css +2 -2
- package/css/approval.css +4 -4
- package/css/button.css +9 -5
- package/css/calendar-picker.css +3 -3
- package/css/calendar-range-picker.css +7 -7
- package/css/carousel.css +45 -13
- package/css/cartesian-chart.css +11 -11
- package/css/cascader.css +10 -10
- package/css/citation.css +2 -2
- package/css/code-view.css +6 -6
- package/css/color-picker.css +81 -0
- package/css/color-swatch-picker.css +9 -4
- package/css/combobox.css +12 -4
- package/css/command.css +1 -1
- package/css/date-field.css +39 -0
- package/css/date-picker.css +86 -9
- package/css/date-range-picker.css +47 -7
- package/css/diff-view.css +8 -8
- package/css/field-array.css +1 -1
- package/css/field.css +4 -0
- package/css/file-upload.css +1 -1
- package/css/float-button.css +140 -27
- package/css/form.css +14 -6
- package/css/graph-chart.css +2 -2
- package/css/highlight.css +1 -1
- package/css/image.css +1 -1
- package/css/mention.css +1 -1
- package/css/message-feed.css +1 -1
- package/css/notification.css +26 -20
- package/css/number-field.css +18 -18
- package/css/page-header.css +2 -2
- package/css/password-input.css +2 -2
- package/css/popconfirm.css +3 -3
- package/css/question-flow.css +8 -8
- package/css/radar-chart.css +6 -6
- package/css/rating.css +1 -1
- package/css/select.css +2 -2
- package/css/separator.css +2 -2
- package/css/side-nav.css +13 -13
- package/css/skeleton.css +5 -5
- package/css/slider.css +6 -6
- package/css/sortable.css +2 -2
- package/css/table.css +19 -2
- package/css/tags-input.css +1 -1
- package/css/time-picker.css +59 -2
- package/css/tool-call.css +7 -7
- package/css/tooltip.css +1 -1
- package/css/tree-select.css +2 -2
- package/css/tree.css +81 -11
- package/dist/css/accordion.css +269 -0
- package/dist/css/affix.css +47 -0
- package/dist/css/alert.css +247 -0
- package/dist/css/anchor.css +252 -0
- package/dist/css/approval.css +501 -0
- package/dist/css/avatar-group.css +99 -0
- package/dist/css/avatar.css +98 -0
- package/dist/css/back-top.css +161 -0
- package/dist/css/badge.css +205 -0
- package/dist/css/bar-code.css +62 -0
- package/dist/css/breadcrumb.css +230 -0
- package/dist/css/button-group.css +263 -0
- package/dist/css/button.css +219 -0
- package/dist/css/calendar-picker.css +467 -0
- package/dist/css/calendar-range-picker.css +554 -0
- package/dist/css/card.css +221 -0
- package/dist/css/carousel.css +710 -0
- package/dist/css/cartesian-chart.css +830 -0
- package/dist/css/cascader.css +961 -0
- package/dist/css/checkbox-group.css +358 -0
- package/dist/css/checkbox.css +257 -0
- package/dist/css/citation.css +470 -0
- package/dist/css/clipboard.css +315 -0
- package/dist/css/code-view.css +374 -0
- package/dist/css/collapsible.css +185 -0
- package/dist/css/color-field.css +176 -0
- package/dist/css/color-picker.css +595 -0
- package/dist/css/color-slider.css +281 -0
- package/dist/css/color-swatch-picker.css +250 -0
- package/dist/css/color-swatch.css +35 -0
- package/dist/css/combobox.css +574 -0
- package/dist/css/command.css +399 -0
- package/dist/css/context-menu.css +420 -0
- package/dist/css/date-field.css +317 -0
- package/dist/css/date-picker.css +868 -0
- package/dist/css/date-range-picker.css +886 -0
- package/dist/css/description.css +67 -0
- package/dist/css/descriptions.css +299 -0
- package/dist/css/dialog.css +455 -0
- package/dist/css/diff-view.css +513 -0
- package/dist/css/download-trigger.css +151 -0
- package/dist/css/drawer.css +552 -0
- package/dist/css/editable.css +295 -0
- package/dist/css/empty-state.css +163 -0
- package/dist/css/field-array.css +226 -0
- package/dist/css/field.css +166 -0
- package/dist/css/fieldset.css +102 -0
- package/dist/css/file-upload.css +429 -0
- package/dist/css/flex.css +441 -0
- package/dist/css/float-button.css +569 -0
- package/dist/css/floating-panel.css +429 -0
- package/dist/css/focus.css +46 -0
- package/dist/css/forced-colors.css +93 -0
- package/dist/css/form.css +393 -0
- package/dist/css/funnel-chart.css +106 -0
- package/dist/css/graph-chart.css +205 -0
- package/dist/css/grid-list.css +235 -0
- package/dist/css/grid.css +1201 -0
- package/dist/css/heatmap.css +552 -0
- package/dist/css/hierarchy-chart.css +298 -0
- package/dist/css/highlight.css +41 -0
- package/dist/css/hover-card.css +226 -0
- package/dist/css/icon.css +225 -0
- package/dist/css/image-cropper.css +373 -0
- package/dist/css/image-viewer.css +538 -0
- package/dist/css/image.css +98 -0
- package/dist/css/infinite-scroll.css +77 -0
- package/dist/css/input-group.css +275 -0
- package/dist/css/json-viewer.css +379 -0
- package/dist/css/kbd.css +72 -0
- package/dist/css/label.css +78 -0
- package/dist/css/layers.css +7 -0
- package/dist/css/layout.css +372 -0
- package/dist/css/liquid.css +106 -0
- package/dist/css/list.css +152 -0
- package/dist/css/listbox.css +390 -0
- package/dist/css/loading-bar.css +141 -0
- package/dist/css/log.css +306 -0
- package/dist/css/markdown-stream.css +149 -0
- package/dist/css/marquee.css +378 -0
- package/dist/css/masonry.css +70 -0
- package/dist/css/matrix-code.css +67 -0
- package/dist/css/mention.css +393 -0
- package/dist/css/menu.css +364 -0
- package/dist/css/menubar.css +456 -0
- package/dist/css/message-feed.css +318 -0
- package/dist/css/navigation-menu.css +513 -0
- package/dist/css/notification.css +782 -0
- package/dist/css/number-animation.css +44 -0
- package/dist/css/number-field.css +252 -0
- package/dist/css/overlay-arrow.css +56 -0
- package/dist/css/page-header.css +184 -0
- package/dist/css/pagination.css +450 -0
- package/dist/css/password-input.css +391 -0
- package/dist/css/pie-chart.css +247 -0
- package/dist/css/pin-input.css +199 -0
- package/dist/css/pointer.css +36 -0
- package/dist/css/popconfirm.css +320 -0
- package/dist/css/popover.css +279 -0
- package/dist/css/progress.css +501 -0
- package/dist/css/prompt-input.css +260 -0
- package/dist/css/question-flow.css +553 -0
- package/dist/css/radar-chart.css +233 -0
- package/dist/css/radio-group.css +598 -0
- package/dist/css/rating.css +294 -0
- package/dist/css/reasoning.css +343 -0
- package/dist/css/reset.css +117 -0
- package/dist/css/resizable.css +242 -0
- package/dist/css/sankey-chart.css +174 -0
- package/dist/css/scroll-area.css +240 -0
- package/dist/css/scrollbar.css +204 -0
- package/dist/css/select.css +612 -0
- package/dist/css/separator.css +122 -0
- package/dist/css/side-nav.css +476 -0
- package/dist/css/signature-pad.css +179 -0
- package/dist/css/skeleton.css +161 -0
- package/dist/css/slider.css +374 -0
- package/dist/css/sortable.css +228 -0
- package/dist/css/sparkline.css +164 -0
- package/dist/css/spinner.css +236 -0
- package/dist/css/splitter.css +159 -0
- package/dist/css/statistic.css +137 -0
- package/dist/css/steps.css +627 -0
- package/dist/css/switch.css +351 -0
- package/dist/css/table.css +1145 -0
- package/dist/css/tabs.css +944 -0
- package/dist/css/tag-group.css +247 -0
- package/dist/css/tag.css +310 -0
- package/dist/css/tags-input.css +322 -0
- package/dist/css/text-field.css +197 -0
- package/dist/css/time-field.css +277 -0
- package/dist/css/time-picker.css +707 -0
- package/dist/css/time-range-picker.css +746 -0
- package/dist/css/timeline.css +423 -0
- package/dist/css/timer.css +123 -0
- package/dist/css/timestamp.css +34 -0
- package/dist/css/toggle-group.css +424 -0
- package/dist/css/toggle.css +146 -0
- package/dist/css/tone.css +189 -0
- package/dist/css/tool-call.css +429 -0
- package/dist/css/toolbar.css +365 -0
- package/dist/css/tooltip.css +218 -0
- package/dist/css/tour.css +439 -0
- package/dist/css/transfer.css +638 -0
- package/dist/css/tree-select.css +878 -0
- package/dist/css/tree.css +733 -0
- package/dist/css/truncate.css +108 -0
- package/dist/css/typography.css +472 -0
- package/dist/css/undefined.css +58 -0
- package/dist/css/virtualizer.css +166 -0
- package/dist/css/visually-hidden.css +20 -0
- package/dist/css/watermark.css +82 -0
- package/dist/family/action-control.css +487 -0
- package/dist/family/chart.css +480 -0
- package/dist/family/check-mark.css +94 -0
- package/dist/family/choice-card.css +97 -0
- package/dist/family/collection-item.css +764 -0
- package/dist/family/field-chrome.css +287 -0
- package/dist/family/loading-ring.css +95 -0
- package/dist/family/material.css +72 -0
- package/dist/family/menu-choice.css +56 -0
- package/dist/family/motion.css +363 -0
- package/dist/family/swatch.css +59 -0
- package/dist/family/tag-list.css +59 -0
- package/family/action-control.css +3 -12
- package/index.css +7307 -6759
- package/index.unlayered.css +7309 -6761
- package/package.json +165 -164
|
@@ -0,0 +1,294 @@
|
|
|
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
|
+
/* 定义 rating 样式。 */
|
|
7
|
+
|
|
8
|
+
@import '../family/action-control.css';
|
|
9
|
+
|
|
10
|
+
@layer xihan.components {
|
|
11
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
12
|
+
.xh-scope-rating {
|
|
13
|
+
--xh-rating-skin: 1;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* position 是给表单影子做定位基准的:那份输入被连接层内联写成绝对定位,
|
|
17
|
+
根上不留基准它就会贴到更外层的定位祖先上,原生校验提示跟着飘到页面别处。 */
|
|
18
|
+
.xh-scope-rating[data-part='root'] {
|
|
19
|
+
/* 尺寸档只换这三个私有槽,星星与分值都从 root 继承它们,换档不必给每个部件各写一条选择器。
|
|
20
|
+
星是控件内的字形,按档取 --xh-glyph-size-sm / md / lg;标签字号不随档 */
|
|
21
|
+
--xh-_rating-item-gap: var(--xh-control-gap-md);
|
|
22
|
+
--xh-_rating-item-size: var(--xh-glyph-size-md);
|
|
23
|
+
--xh-_rating-item-box-size: var(--xh-control-action-size);
|
|
24
|
+
--xh-_rating-font-size: var(--xh-control-font-md);
|
|
25
|
+
--xh-icon-size: var(--xh-rating-item-font-size, var(--xh-_rating-item-size));
|
|
26
|
+
/* 点亮色随语气走。没写 data-tone 时 --xh-_tone 没被声明,退回原来的警示色 */
|
|
27
|
+
--xh-_rating-accent: var(--xh-_tone, var(--xh-color-warning-500));
|
|
28
|
+
|
|
29
|
+
position: relative;
|
|
30
|
+
display: inline-flex;
|
|
31
|
+
flex-direction: column;
|
|
32
|
+
/* 字段标签贴控件(复合单字段) */
|
|
33
|
+
gap: var(--xh-rating-gap, var(--xh-space-1));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* —— 尺寸 —— */
|
|
37
|
+
.xh-scope-rating[data-part='root'][data-size='sm'] {
|
|
38
|
+
--xh-_rating-item-gap: var(--xh-control-gap-sm);
|
|
39
|
+
--xh-_rating-item-size: var(--xh-glyph-size-sm);
|
|
40
|
+
--xh-_rating-font-size: var(--xh-control-font-sm);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.xh-scope-rating[data-part='root'][data-size='lg'] {
|
|
44
|
+
--xh-_rating-item-gap: var(--xh-control-gap-lg);
|
|
45
|
+
--xh-_rating-item-size: var(--xh-glyph-size-lg);
|
|
46
|
+
--xh-_rating-font-size: var(--xh-control-font-lg);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* 字段标签:14 / 500 / fg-default,禁用换到 --xh-fg-subtle;文字部件不叠 opacity */
|
|
50
|
+
.xh-scope-rating[data-part='label'] {
|
|
51
|
+
color: var(--xh-rating-label-fg, var(--xh-fg-default));
|
|
52
|
+
font-size: var(--xh-rating-label-font-size, var(--xh-text-label-size));
|
|
53
|
+
font-weight: var(--xh-rating-label-font-weight, var(--xh-text-label-weight));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.xh-scope-rating[data-part='label'][data-disabled] {
|
|
57
|
+
color: var(--xh-rating-label-fg-disabled, var(--xh-fg-subtle));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.xh-scope-rating[data-part='control'] {
|
|
61
|
+
display: inline-flex;
|
|
62
|
+
align-items: center;
|
|
63
|
+
gap: var(--xh-rating-item-gap, var(--xh-_rating-item-gap));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* 禁用:星带是纯图形,整体压暗只做一次、落在星带上(星星逐颗再叠 opacity 会越叠越黑);
|
|
67
|
+
标签与分值是文字,各自换到禁用前景,不落在这层 opacity 之下 */
|
|
68
|
+
.xh-scope-rating[data-part='control'][data-disabled] {
|
|
69
|
+
opacity: var(--xh-state-disabled-opacity);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* 分值文本在场时根改成两列栅格:星星带与分值并排,标题仍独占一整行。
|
|
73
|
+
没写这个部件的评分不命中这条,还是原来的竖排 */
|
|
74
|
+
.xh-scope-rating[data-part='root']:has(> [data-part='value-text']) {
|
|
75
|
+
display: inline-grid;
|
|
76
|
+
grid-template-columns: auto auto;
|
|
77
|
+
align-items: center;
|
|
78
|
+
justify-content: start;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.xh-scope-rating[data-part='root']:has(> [data-part='value-text']) > [data-part='label']:where(.xh-scope-rating) {
|
|
82
|
+
grid-column: 1 / -1;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* 数字等宽:指针从一颗星划到另一颗时分值在原地变,不带着星星左右挪 */
|
|
86
|
+
.xh-scope-rating[data-part='value-text'] {
|
|
87
|
+
color: var(--xh-rating-value-text-fg, var(--xh-fg-muted));
|
|
88
|
+
font-size: var(--xh-rating-value-text-font-size, var(--xh-_rating-font-size));
|
|
89
|
+
font-variant-numeric: tabular-nums;
|
|
90
|
+
line-height: var(--xh-leading-none);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.xh-scope-rating[data-part='value-text'][data-disabled] {
|
|
94
|
+
color: var(--xh-rating-value-text-fg-disabled, var(--xh-fg-subtle));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* 容器只是焦点域的兜底落点(焦点从带外进来先落在它身上,随即被转投给某颗星),
|
|
98
|
+
落焦不画环:高亮永远长在星星上,容器再画一圈只是重影。 */
|
|
99
|
+
.xh-scope-rating[data-part='control']:focus-visible {
|
|
100
|
+
outline: none;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.xh-scope-rating[data-part='control'][data-readonly]:not([data-disabled]) {
|
|
104
|
+
cursor: default;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* 条目固定成一枚方形图标盒:连接层用 clientWidth 判定指针落在左半还是右半,
|
|
108
|
+
固定盒能让半档分界与图形中心严格重合。
|
|
109
|
+
星接 Action Control icon 档(定尺的星):盒型、按下 / 禁用面、0.97 缩放与换底、焦点环与过渡由家族配方给,
|
|
110
|
+
这里只把使用者槽映射到桥接槽。静息透明(ghost 形态);悬停不换底——悬停预览由点亮的星形(data-highlighted)
|
|
111
|
+
表达,再给盒换面是重复的通道;按下换到 200 档中性面(白底承载)。前景五态映射同一个值:点亮时五态一起换到
|
|
112
|
+
点亮色,家族的悬停 / 按下块才不会把点亮色换回静息色;禁用不换前景,星带整体的压暗落在 control 的 opacity 上 */
|
|
113
|
+
.xh-scope-rating[data-part='item'] {
|
|
114
|
+
--xh-_rating-item-bg-pressed: var(--xh-rating-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
115
|
+
|
|
116
|
+
--xh-action-visual-size: var(--xh-_rating-item-box-size);
|
|
117
|
+
--xh-action-min-inline-size: var(--xh-_rating-item-box-size);
|
|
118
|
+
--xh-action-radius: var(--xh-rating-item-radius, var(--xh-shape-control));
|
|
119
|
+
--xh-action-font-size: var(--xh-rating-item-font-size, var(--xh-_rating-item-size));
|
|
120
|
+
--xh-action-bg-hover: transparent;
|
|
121
|
+
--xh-action-bg-pressed: var(--xh-_rating-item-bg-pressed);
|
|
122
|
+
--xh-action-fg-rest: var(--xh-rating-item-fg, var(--xh-fg-subtle));
|
|
123
|
+
--xh-action-fg-hover: var(--xh-rating-item-fg, var(--xh-fg-subtle));
|
|
124
|
+
--xh-action-fg-pressed: var(--xh-rating-item-fg, var(--xh-fg-subtle));
|
|
125
|
+
--xh-action-fg-focus-visible: var(--xh-rating-item-fg, var(--xh-fg-subtle));
|
|
126
|
+
--xh-action-fg-disabled: var(--xh-rating-item-fg, var(--xh-fg-subtle));
|
|
127
|
+
--xh-action-border-rest: transparent;
|
|
128
|
+
--xh-action-border-hover: transparent;
|
|
129
|
+
--xh-action-border-pressed: transparent;
|
|
130
|
+
--xh-action-border-focus-visible: transparent;
|
|
131
|
+
--xh-action-border-disabled: transparent;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* 家族 icon 档在粗指针下用 ::after 扩热区到 44px:五颗星密排,44px 热区会压住相邻的星,
|
|
135
|
+
连接层又按 currentTarget 的宽度判半颗,热区串到邻星上半档就判错;星本身仍是 24px 盒,热区不外扩。
|
|
136
|
+
空条目的 ::after 是点亮那层星形,下限归零才不会被撑成 44px */
|
|
137
|
+
@media (pointer: coarse) {
|
|
138
|
+
.xh-scope-rating[data-part='item']::after {
|
|
139
|
+
min-inline-size: 0;
|
|
140
|
+
min-block-size: 0;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* 空条目使用两层同源星形:底层保持中性轮廓,上层按完整或半档裁出强调色。
|
|
145
|
+
两层都铺满格子、四边外边距 auto 回中:定宽定高的定位盒在四边 inset 为 0 时由自动外边距平分余量,
|
|
146
|
+
与书写方向无关,不用物理平移回拉(粗指针下家族在同一个 ::after 上铺的热区平移一并钉回)。
|
|
147
|
+
裁切只认物理左右:行首那一侧留着、从行尾那一侧裁,--xh-_rating-end / -start 是行尾 / 行首
|
|
148
|
+
落在物理右侧的份数(ltr 为 1 / 0,rtl 为 0 / 1),整幅与半档都乘它换边 */
|
|
149
|
+
.xh-scope-rating[data-part='item']:empty::before,
|
|
150
|
+
.xh-scope-rating[data-part='item']:empty::after {
|
|
151
|
+
--xh-_rating-end: calc((1 + var(--xh-direction-sign)) / 2);
|
|
152
|
+
--xh-_rating-start: calc((1 - var(--xh-direction-sign)) / 2);
|
|
153
|
+
|
|
154
|
+
content: '';
|
|
155
|
+
position: absolute;
|
|
156
|
+
inset: 0;
|
|
157
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
158
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
159
|
+
margin: auto;
|
|
160
|
+
translate: none;
|
|
161
|
+
background-color: var(--xh-rating-item-fg, var(--xh-fg-subtle));
|
|
162
|
+
-webkit-mask: var(--xh-glyph-mark-star) center / contain no-repeat;
|
|
163
|
+
mask: var(--xh-glyph-mark-star) center / contain no-repeat;
|
|
164
|
+
pointer-events: none;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.xh-scope-rating[data-part='item']:empty::after {
|
|
168
|
+
background-color: var(--xh-rating-item-fg-highlighted, var(--xh-_rating-accent));
|
|
169
|
+
clip-path: inset(0 calc(100% * var(--xh-_rating-end)) 0 calc(100% * var(--xh-_rating-start)));
|
|
170
|
+
transition: clip-path var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* 点亮的判据是 data-highlighted,不是 aria-checked:
|
|
174
|
+
aria-checked 只认落定的值,而悬停预览要求手划过去当场就亮。
|
|
175
|
+
两者共用同一档颜色,预览与选中因此看不出差别——这正是"预览"该有的样子。 */
|
|
176
|
+
.xh-scope-rating[data-part='item'][data-highlighted] {
|
|
177
|
+
--xh-action-fg-rest: var(--xh-rating-item-fg-highlighted, var(--xh-_rating-accent));
|
|
178
|
+
--xh-action-fg-hover: var(--xh-rating-item-fg-highlighted, var(--xh-_rating-accent));
|
|
179
|
+
--xh-action-fg-pressed: var(--xh-rating-item-fg-highlighted, var(--xh-_rating-accent));
|
|
180
|
+
--xh-action-fg-focus-visible: var(--xh-rating-item-fg-highlighted, var(--xh-_rating-accent));
|
|
181
|
+
--xh-action-fg-disabled: var(--xh-rating-item-fg-highlighted, var(--xh-_rating-accent));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.xh-scope-rating[data-part='item'][data-highlighted]:empty::after {
|
|
185
|
+
clip-path: inset(0);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* 半颗:一道 50% 硬边渐变裁到字形上,行首那半亮、行尾那半灰。
|
|
189
|
+
rtl 下"半颗"落在星的右半边(连接层按 1 - offsetX/width 判),亮的那半跟着掉头:渐变方向没有逻辑
|
|
190
|
+
关键字可用,角度乘书写方向的符号换向(90deg 朝右、-90deg 朝左)。
|
|
191
|
+
必须排在 data-highlighted 之后:半颗那颗星同时带着 data-highlighted,两条选择器特异度相同,
|
|
192
|
+
顺序一反 color 就把 transparent 覆盖回实色,渐变整个看不见。 */
|
|
193
|
+
.xh-scope-rating[data-part='item'][data-half]:not(:empty) {
|
|
194
|
+
background-image: linear-gradient(
|
|
195
|
+
calc(90deg * var(--xh-direction-sign)),
|
|
196
|
+
var(--xh-rating-item-fg-highlighted, var(--xh-_rating-accent)) 50%,
|
|
197
|
+
var(--xh-rating-item-fg, var(--xh-fg-subtle)) 50%
|
|
198
|
+
);
|
|
199
|
+
-webkit-background-clip: text;
|
|
200
|
+
background-clip: text;
|
|
201
|
+
color: transparent;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.xh-scope-rating[data-part='item'][data-half]:empty::after {
|
|
205
|
+
clip-path: inset(0 calc(50% * var(--xh-_rating-end)) 0 calc(50% * var(--xh-_rating-start)));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* 只读仍进得了 Tab 序列、读屏也念得出,只是改不动:收掉手型,别暗示"点这儿能改";
|
|
209
|
+
家族的按压块由这里的映射钉回静息面——按下不缩放、不换底 */
|
|
210
|
+
.xh-scope-rating[data-part='item'][data-readonly]:not([data-disabled]) {
|
|
211
|
+
--xh-_rating-item-bg-pressed: transparent;
|
|
212
|
+
--xh-action-scale-pressed: none;
|
|
213
|
+
--xh-action-cursor-rest: default;
|
|
214
|
+
--xh-action-cursor-hover: default;
|
|
215
|
+
--xh-action-cursor-pressed: default;
|
|
216
|
+
--xh-action-cursor-focus-visible: default;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* 表单影子的视觉隐藏(绝对定位 + 1px + clip-path)连接层内联给全了,这里不重复也不覆盖,
|
|
220
|
+
只掐掉指针命中:那个 1px 的框压在星带上会截走本该落到星星上的点击。 */
|
|
221
|
+
.xh-scope-rating[data-part='hidden-input'] {
|
|
222
|
+
pointer-events: none;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* display 会盖掉 UA 的 [hidden]{display:none},凡是被赋了 display 的角色节点都要显式让位 */
|
|
226
|
+
.xh-scope-rating[data-part='root'][hidden],
|
|
227
|
+
.xh-scope-rating[data-part='control'][hidden],
|
|
228
|
+
.xh-scope-rating[data-part='item'][hidden] {
|
|
229
|
+
display: none;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/*
|
|
233
|
+
* 高对比档:点亮与没点亮只差一档字色,这一档里两档一起被换成同一个系统前景色,
|
|
234
|
+
* 整条星带看上去全是亮的。改用系统自己的两个角色分开:亮的取高亮色、没亮的取不可用色。
|
|
235
|
+
* 半颗那道裁到字形上的渐变在这一档里被丢弃,留着透明填充整颗星会消失,
|
|
236
|
+
* 把填充还回去并按点亮那一档画。
|
|
237
|
+
*/
|
|
238
|
+
@media (forced-colors: active) {
|
|
239
|
+
.xh-scope-rating[data-part='item'] {
|
|
240
|
+
color: GrayText;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* 两层星形都是 mask 挖出来的底色:退出强制换色、直接写系统色,空星 GrayText、点亮的那层 Highlight */
|
|
244
|
+
.xh-scope-rating[data-part='item']:empty::before {
|
|
245
|
+
forced-color-adjust: none;
|
|
246
|
+
background-color: GrayText;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.xh-scope-rating[data-part='item']:empty::after {
|
|
250
|
+
forced-color-adjust: none;
|
|
251
|
+
background-color: Highlight;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.xh-scope-rating[data-part='item'][data-highlighted],
|
|
255
|
+
.xh-scope-rating[data-part='item'][data-half]:not(:empty) {
|
|
256
|
+
background-image: none;
|
|
257
|
+
-webkit-background-clip: border-box;
|
|
258
|
+
background-clip: border-box;
|
|
259
|
+
color: Highlight;
|
|
260
|
+
/* 亮档已经由字色表出,公共层那圈锚点虚线在这里只是重影 */
|
|
261
|
+
outline: none;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/* 家族在这一档把悬停 / 按下的盒填成 Highlight、字换 HighlightText:点亮的那层星形也是 Highlight,
|
|
265
|
+
填了盒就把它吞掉。盒保持 Canvas 底,字色仍按点亮与否取 GrayText / Highlight;
|
|
266
|
+
按住那一下给盒画一圈系统高亮环表出按下 */
|
|
267
|
+
.xh-scope-rating[data-part='item']:not([data-disabled]):not([data-loading]):hover,
|
|
268
|
+
.xh-scope-rating[data-part='item']:not([data-disabled]):not([data-loading]):is(:active, [data-pressed]) {
|
|
269
|
+
background-color: Canvas;
|
|
270
|
+
color: GrayText;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.xh-scope-rating[data-part='item'][data-highlighted]:not([data-disabled]):not([data-loading]):hover,
|
|
274
|
+
.xh-scope-rating[data-part='item'][data-highlighted]:not([data-disabled]):not([data-loading]):is(:active, [data-pressed]) {
|
|
275
|
+
color: Highlight;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.xh-scope-rating[data-part='item']:not([data-disabled]):not([data-readonly]):is(:active, [data-pressed]) {
|
|
279
|
+
outline: var(--xh-stroke-thick) solid Highlight;
|
|
280
|
+
outline-offset: calc(-1 * var(--xh-stroke-thick));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
@media print {
|
|
285
|
+
/* 打印默认丢底图:半颗那道裁到字形上的渐变整个消失,星上只剩 color: transparent,
|
|
286
|
+
那颗星在纸上什么都不剩。把填充还回去并按点亮那一档画整颗。 */
|
|
287
|
+
.xh-scope-rating[data-part='item'][data-half]:not(:empty) {
|
|
288
|
+
background-image: none;
|
|
289
|
+
-webkit-background-clip: border-box;
|
|
290
|
+
background-clip: border-box;
|
|
291
|
+
color: var(--xh-rating-item-fg-highlighted, var(--xh-_rating-accent));
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
@@ -0,0 +1,343 @@
|
|
|
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
|
+
/* 定义 reasoning 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立;
|
|
9
|
+
独立皮肤同时传递引入开关的动作控件配方,full bundle 递归去重。 */
|
|
10
|
+
@import '../family/motion.css';
|
|
11
|
+
@import '../family/action-control.css';
|
|
12
|
+
|
|
13
|
+
@layer xihan.components {
|
|
14
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
15
|
+
.xh-scope-reasoning {
|
|
16
|
+
--xh-reasoning-skin: 1;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* 一张描边面:--xh-border-default 描边 + surface 底 + 无影(静态内容面),与同族的 ToolCall 等一致。
|
|
20
|
+
白底承载开关:向它下发 hover 100 → pressed 200 的阶梯,淡底档在形态规则里改成 200 → 300 */
|
|
21
|
+
.xh-scope-reasoning[data-part='root'] {
|
|
22
|
+
--xh-action-host-bg-hover: var(--xh-bg-subtle);
|
|
23
|
+
--xh-action-host-bg-pressed: var(--xh-bg-subtle-hover);
|
|
24
|
+
|
|
25
|
+
/* 作者塞进两个图形位的图标与皮肤画的兜底字形同一把尺:按档取,与开关的家族档同步 */
|
|
26
|
+
--xh-_reasoning-icon-size: var(--xh-glyph-size-md);
|
|
27
|
+
--xh-icon-size: var(--xh-reasoning-icon-size, var(--xh-_reasoning-icon-size));
|
|
28
|
+
|
|
29
|
+
/* 影另落一份进私有槽给语气档:它要把影与左侧色条叠成一条 box-shadow,缺省无影写成零影占位 */
|
|
30
|
+
--xh-_reasoning-shadow: var(--xh-reasoning-shadow, 0 0 0 transparent);
|
|
31
|
+
|
|
32
|
+
/* 尺寸缺省档:不写 data-size 时的取值。三档都只写这三个私有槽,
|
|
33
|
+
公开槽留在读处当首选,作者在祖先上设的覆盖才赢得过档位声明 */
|
|
34
|
+
--xh-_reasoning-px: var(--xh-space-4);
|
|
35
|
+
--xh-_reasoning-py: var(--xh-space-4);
|
|
36
|
+
--xh-_reasoning-font-size: var(--xh-control-font-md);
|
|
37
|
+
|
|
38
|
+
display: block;
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
border: var(--xh-stroke-thin) solid var(--xh-reasoning-border, var(--xh-border-default));
|
|
41
|
+
border-radius: var(--xh-reasoning-radius, var(--xh-shape-surface));
|
|
42
|
+
background: var(--xh-reasoning-bg, var(--xh-bg-surface));
|
|
43
|
+
box-shadow: var(--xh-reasoning-shadow, none);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* 上面声明的 display 会盖掉 UA 的 [hidden]{display:none},这里补回 */
|
|
47
|
+
.xh-scope-reasoning[data-part='root'][hidden] {
|
|
48
|
+
display: none;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* —— 形态 —— */
|
|
52
|
+
/* 缺省档即 outline;显式写 outline 时与缺省同形 */
|
|
53
|
+
.xh-scope-reasoning[data-part='root'][data-variant='outline'] {
|
|
54
|
+
border: var(--xh-stroke-thin) solid var(--xh-reasoning-border, var(--xh-border-default));
|
|
55
|
+
background: var(--xh-reasoning-bg, var(--xh-bg-surface));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* 底色分区:--xh-bg-subtle 底 + 透明边位 + 无影;淡底承载面向开关下发 hover 200 → pressed 300 */
|
|
59
|
+
.xh-scope-reasoning[data-part='root'][data-variant='subtle'] {
|
|
60
|
+
--xh-action-host-bg-hover: var(--xh-bg-subtle-hover);
|
|
61
|
+
--xh-action-host-bg-pressed: var(--xh-bg-subtle-active);
|
|
62
|
+
|
|
63
|
+
border-color: transparent;
|
|
64
|
+
background: var(--xh-reasoning-bg, var(--xh-bg-subtle));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* 无壳内联:思考过程贴着正文走,不占一块面;开关落在正文的白底上,阶梯同 outline 档 */
|
|
68
|
+
.xh-scope-reasoning[data-part='root'][data-variant='ghost'] {
|
|
69
|
+
--xh-action-host-bg-hover: var(--xh-bg-subtle);
|
|
70
|
+
--xh-action-host-bg-pressed: var(--xh-bg-subtle-hover);
|
|
71
|
+
|
|
72
|
+
overflow: visible;
|
|
73
|
+
background: none;
|
|
74
|
+
box-shadow: none;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* 无壳档的开关只占文字宽度(盖掉 profile 的铺满一行),自己带圆角,悬停时才浮出一块底 */
|
|
78
|
+
.xh-scope-reasoning[data-part='root'][data-variant='ghost'] .xh-scope-reasoning[data-part='trigger'] {
|
|
79
|
+
--xh-action-radius: var(--xh-reasoning-trigger-radius, var(--xh-shape-control));
|
|
80
|
+
|
|
81
|
+
inline-size: auto;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* 开关铺满一行,盒型、悬停 / 按下 / 禁用面由 Action Control 的 disclosure-trigger 档给(ghost 形态,
|
|
85
|
+
阶梯由根按承载面经 host 槽下发,按下只换面不缩放);这里只把使用者槽映射到桥接槽:
|
|
86
|
+
圆角归零贴住面边,内衬与字号沿用本组件的档位(不取 profile 的内衬,几何不变),字色三态都停在
|
|
87
|
+
弱一档的 muted(开关不是正文);字形尺由根按同一档位给 */
|
|
88
|
+
.xh-scope-reasoning[data-part='trigger'] {
|
|
89
|
+
--xh-action-radius: 0;
|
|
90
|
+
--xh-action-gap: var(--xh-reasoning-trigger-gap, var(--xh-space-2));
|
|
91
|
+
--xh-action-padding-inline: var(--xh-reasoning-px, var(--xh-_reasoning-px));
|
|
92
|
+
--xh-action-padding-block: var(--xh-reasoning-py, var(--xh-_reasoning-py));
|
|
93
|
+
--xh-action-font-size: var(--xh-reasoning-font-size, var(--xh-_reasoning-font-size));
|
|
94
|
+
--xh-action-fg-rest: var(--xh-reasoning-trigger-fg, var(--xh-fg-muted));
|
|
95
|
+
--xh-action-fg-hover: var(--xh-reasoning-trigger-fg, var(--xh-fg-muted));
|
|
96
|
+
--xh-action-fg-pressed: var(--xh-reasoning-trigger-fg, var(--xh-fg-muted));
|
|
97
|
+
--xh-action-bg-hover: var(--xh-reasoning-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
98
|
+
|
|
99
|
+
border-width: 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.xh-scope-reasoning[data-part='trigger'][hidden] {
|
|
103
|
+
display: none;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* 状态图形位:在想的时候实一档,想完退回弱一档 */
|
|
107
|
+
.xh-scope-reasoning[data-part='icon'] {
|
|
108
|
+
display: inline-flex;
|
|
109
|
+
flex: none;
|
|
110
|
+
align-items: center;
|
|
111
|
+
justify-content: center;
|
|
112
|
+
color: var(--xh-reasoning-icon-fg, var(--xh-fg-subtle));
|
|
113
|
+
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.xh-scope-reasoning[data-part='icon'][data-streaming] {
|
|
117
|
+
color: var(--xh-reasoning-icon-streaming-fg, var(--xh-fg-muted));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.xh-scope-reasoning[data-part='icon'][hidden] {
|
|
121
|
+
display: none;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* 指示随开合转向,纯装饰。转向与正文开合取同一档时长,两件事一起收尾:收起取 collapse 档,展开取 expand 档 */
|
|
125
|
+
.xh-scope-reasoning[data-part='indicator'] {
|
|
126
|
+
display: inline-flex;
|
|
127
|
+
flex: none;
|
|
128
|
+
align-items: center;
|
|
129
|
+
justify-content: center;
|
|
130
|
+
color: var(--xh-reasoning-indicator-fg, var(--xh-fg-subtle));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* 首帧就在的朝向直接呈现(data-instant),第一次开合起才转 */
|
|
134
|
+
.xh-scope-reasoning[data-part='indicator']:not([data-instant]) {
|
|
135
|
+
transition: rotate var(--xh-motion-duration-collapse) var(--xh-motion-ease-enter-strong);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* 没写内容就由皮肤画;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
139
|
+
.xh-scope-reasoning[data-part='indicator']:empty::before {
|
|
140
|
+
content: '';
|
|
141
|
+
display: inline-block;
|
|
142
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
143
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
144
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
145
|
+
background-color: currentColor;
|
|
146
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
147
|
+
mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.xh-scope-reasoning[data-part='indicator'][data-state='open'] {
|
|
151
|
+
rotate: 180deg;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.xh-scope-reasoning[data-part='indicator'][data-state='open']:not([data-instant]) {
|
|
155
|
+
transition: rotate var(--xh-motion-duration-expand) var(--xh-motion-ease-enter-strong);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.xh-scope-reasoning[data-part='indicator'][hidden] {
|
|
159
|
+
display: none;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* 状态文案排成一行,长了截断:换行会把开关的高度顶开,时长位跟着跳 */
|
|
163
|
+
.xh-scope-reasoning[data-part='label'] {
|
|
164
|
+
display: block;
|
|
165
|
+
flex: 1 1 auto;
|
|
166
|
+
overflow: hidden;
|
|
167
|
+
font-weight: var(--xh-reasoning-label-font-weight, var(--xh-text-label-weight));
|
|
168
|
+
white-space: nowrap;
|
|
169
|
+
text-overflow: ellipsis;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.xh-scope-reasoning[data-part='label'][hidden] {
|
|
173
|
+
display: none;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* 还在想:一道亮带在文字上从右往左扫,字色由这层渐变裁出来 */
|
|
177
|
+
.xh-scope-reasoning[data-part='label'][data-streaming] {
|
|
178
|
+
background-image: linear-gradient(
|
|
179
|
+
90deg,
|
|
180
|
+
var(--xh-reasoning-shimmer-from, var(--xh-fg-subtle)) 35%,
|
|
181
|
+
var(--xh-reasoning-shimmer-to, var(--xh-fg-default)) 50%,
|
|
182
|
+
var(--xh-reasoning-shimmer-from, var(--xh-fg-subtle)) 65%
|
|
183
|
+
);
|
|
184
|
+
background-size: 200% 100%;
|
|
185
|
+
-webkit-background-clip: text;
|
|
186
|
+
background-clip: text;
|
|
187
|
+
color: transparent;
|
|
188
|
+
animation: xh-shimmer var(--xh-reasoning-shimmer-duration, var(--xh-motion-loop-shimmer)) var(--xh-motion-ease-loop) infinite;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/*
|
|
192
|
+
* 减少动效:撤掉扫光那层,换成一档更实的静态字色。
|
|
193
|
+
* 这里不能只把时长压到接近零——光带会停在某一帧上,在文字上留下一道说不清的渐变;
|
|
194
|
+
* 而撤掉渐变又不还字色的话,被裁成透明的文字会整句消失。
|
|
195
|
+
* 两条规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion。
|
|
196
|
+
*/
|
|
197
|
+
@media (prefers-reduced-motion: reduce) {
|
|
198
|
+
.xh-scope-reasoning[data-part='label'][data-streaming] {
|
|
199
|
+
background-image: none;
|
|
200
|
+
-webkit-background-clip: border-box;
|
|
201
|
+
background-clip: border-box;
|
|
202
|
+
color: var(--xh-reasoning-label-streaming-fg, var(--xh-fg-default));
|
|
203
|
+
animation: none;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
:where([data-motion='reduce']) .xh-scope-reasoning[data-part='label'][data-streaming] {
|
|
208
|
+
background-image: none;
|
|
209
|
+
-webkit-background-clip: border-box;
|
|
210
|
+
background-clip: border-box;
|
|
211
|
+
color: var(--xh-reasoning-label-streaming-fg, var(--xh-fg-default));
|
|
212
|
+
animation: none;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.xh-scope-reasoning[data-part='duration'] {
|
|
216
|
+
display: block;
|
|
217
|
+
flex: none;
|
|
218
|
+
color: var(--xh-reasoning-duration-fg, var(--xh-fg-subtle));
|
|
219
|
+
font-size: var(--xh-reasoning-duration-font-size, var(--xh-text-caption-size));
|
|
220
|
+
font-variant-numeric: tabular-nums;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.xh-scope-reasoning[data-part='duration'][hidden] {
|
|
224
|
+
display: none;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/* 想完那一下两句文案整句换掉,淡入接住这次替换;首帧就已想完的直接呈现(data-instant) */
|
|
228
|
+
.xh-scope-reasoning[data-part='label']:not([data-streaming], [data-instant]),
|
|
229
|
+
.xh-scope-reasoning[data-part='duration']:not([data-streaming], [data-instant]) {
|
|
230
|
+
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) both;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/*
|
|
234
|
+
* 思考正文是散文:段落排版,不用等宽,行距比正文松一档。
|
|
235
|
+
* 左侧一条轨迹线把这一段与开关分开,起点对齐开关里的图形位。
|
|
236
|
+
*
|
|
237
|
+
* 这里刻意没有 [data-part='content'][hidden] { display: none }:补了动画一帧都播不出来。
|
|
238
|
+
* 收起由适配器在退场结束后写内联 display 落成,退场窗口内靠 connect 发的 inert 挡住焦点。
|
|
239
|
+
*/
|
|
240
|
+
.xh-scope-reasoning[data-part='content'] {
|
|
241
|
+
/* 行高与内缩同帧动的共享关键帧读这条槽:只有末端有内缩,起端不写、按 0 动 */
|
|
242
|
+
--xh-_disclosure-pb: var(--xh-reasoning-py, var(--xh-_reasoning-py));
|
|
243
|
+
|
|
244
|
+
display: grid;
|
|
245
|
+
grid-template-rows: 1fr;
|
|
246
|
+
overflow: clip;
|
|
247
|
+
margin-inline-start: var(--xh-reasoning-rail-inset, var(--xh-reasoning-px, var(--xh-_reasoning-px)));
|
|
248
|
+
border-inline-start: var(--xh-reasoning-rail-width, var(--xh-stroke-thin)) solid var(--xh-reasoning-rail, var(--xh-border-subtle));
|
|
249
|
+
padding-inline-start: var(--xh-reasoning-content-ps, var(--xh-space-3));
|
|
250
|
+
padding-inline-end: var(--xh-reasoning-content-pe, var(--xh-reasoning-px, var(--xh-_reasoning-px)));
|
|
251
|
+
padding-block-end: var(--xh-reasoning-py, var(--xh-_reasoning-py));
|
|
252
|
+
color: var(--xh-reasoning-content-fg, var(--xh-fg-muted));
|
|
253
|
+
font-size: var(--xh-reasoning-content-font-size, var(--xh-text-secondary-size));
|
|
254
|
+
line-height: var(--xh-reasoning-content-leading, var(--xh-text-prose-leading));
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* 展开与收起只在开合时播:首帧就在的展开 / 收起直接呈现(data-instant) */
|
|
258
|
+
.xh-scope-reasoning[data-part='content'][data-state='open']:not([data-instant]) {
|
|
259
|
+
animation: xh-disclosure-expand var(--xh-motion-duration-expand) var(--xh-motion-ease-enter-strong);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.xh-scope-reasoning[data-part='content'][data-state='closed']:not([data-instant]) {
|
|
263
|
+
animation: xh-disclosure-collapse var(--xh-motion-duration-collapse) var(--xh-motion-ease-exit) forwards;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/* 尺寸档改内衬、字号与图标档 */
|
|
267
|
+
.xh-scope-reasoning[data-part='root'][data-size='sm'] {
|
|
268
|
+
--xh-_reasoning-icon-size: var(--xh-glyph-size-sm);
|
|
269
|
+
--xh-_reasoning-px: var(--xh-space-3);
|
|
270
|
+
--xh-_reasoning-py: var(--xh-space-3);
|
|
271
|
+
--xh-_reasoning-font-size: var(--xh-control-font-sm);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.xh-scope-reasoning[data-part='root'][data-size='md'] {
|
|
275
|
+
--xh-_reasoning-icon-size: var(--xh-glyph-size-md);
|
|
276
|
+
--xh-_reasoning-px: var(--xh-space-4);
|
|
277
|
+
--xh-_reasoning-py: var(--xh-space-4);
|
|
278
|
+
--xh-_reasoning-font-size: var(--xh-control-font-md);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.xh-scope-reasoning[data-part='root'][data-size='lg'] {
|
|
282
|
+
--xh-_reasoning-icon-size: var(--xh-glyph-size-lg);
|
|
283
|
+
--xh-_reasoning-px: var(--xh-space-5);
|
|
284
|
+
--xh-_reasoning-py: var(--xh-space-5);
|
|
285
|
+
--xh-_reasoning-font-size: var(--xh-control-font-lg);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/* 语气只染左侧那一条色条,海拔跟着一起落在同一条 box-shadow 上 */
|
|
289
|
+
.xh-scope-reasoning[data-part='root'][data-tone] {
|
|
290
|
+
box-shadow:
|
|
291
|
+
inset var(--xh-reasoning-tone-bar, var(--xh-stroke-thick)) 0 0 0 var(--xh-reasoning-tone-fg, var(--xh-_tone-soft, var(--xh-bg-brand))),
|
|
292
|
+
var(--xh-_reasoning-shadow);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
@media (forced-colors: active) {
|
|
296
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
297
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
298
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
299
|
+
禁用取 GrayText */
|
|
300
|
+
.xh-scope-reasoning[data-part='indicator']:empty::before {
|
|
301
|
+
forced-color-adjust: none;
|
|
302
|
+
background-color: ButtonText;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.xh-scope-reasoning[data-part='trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]) .xh-scope-reasoning[data-part='indicator']:empty::before {
|
|
306
|
+
background-color: HighlightText;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.xh-scope-reasoning[data-part='trigger'][data-disabled] .xh-scope-reasoning[data-part='indicator']:empty::before {
|
|
310
|
+
background-color: GrayText;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
@layer xihan.motion {
|
|
316
|
+
@media print {
|
|
317
|
+
/* 打印:动画会被定格在任意一帧——转了一半的圈、扫到一半的微光。这里换成静止的表达,
|
|
318
|
+
取值与减弱动效那一档相同。两档各写一块、不并进一条媒体查询列表:减弱动效另有一份
|
|
319
|
+
:where([data-motion='reduce']) 的钩子版本与它成对,打印没有对应的钩子可配,
|
|
320
|
+
并成一条之后这层配对关系在文本上就断了。 */
|
|
321
|
+
.xh-scope-reasoning[data-part='label'][data-streaming] {
|
|
322
|
+
background-image: none;
|
|
323
|
+
-webkit-background-clip: border-box;
|
|
324
|
+
background-clip: border-box;
|
|
325
|
+
color: var(--xh-reasoning-label-streaming-fg, var(--xh-fg-default));
|
|
326
|
+
animation: none;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/*
|
|
331
|
+
* 高对比档:扫光那层渐变被丢弃,只剩被裁成透明的文字,整行标题消失。
|
|
332
|
+
* 把填充还回去,在想这件事仍由标题文字本身与展开钮的状态表出。
|
|
333
|
+
*/
|
|
334
|
+
@media (forced-colors: active) {
|
|
335
|
+
.xh-scope-reasoning[data-part='label'][data-streaming] {
|
|
336
|
+
background-image: none;
|
|
337
|
+
-webkit-background-clip: border-box;
|
|
338
|
+
background-clip: border-box;
|
|
339
|
+
color: CanvasText;
|
|
340
|
+
animation: none;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|