@zmzai/theme 0.4.0 → 0.5.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.
@@ -0,0 +1,276 @@
1
+ /* ModelSelector — 二级模型选择器样式 */
2
+
3
+ .ms-trigger {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ justify-content: space-between;
7
+ gap: 0.5rem;
8
+ height: 2.25rem;
9
+ padding: 0 0.75rem;
10
+ border-radius: var(--radius-sm, 2px);
11
+ border: 1px solid var(--color-line, oklch(0.85 0.02 80));
12
+ background: var(--color-bg, oklch(0.97 0.01 80));
13
+ font-size: 0.875rem;
14
+ font-weight: 500;
15
+ color: var(--color-ink, oklch(0.2 0.02 80));
16
+ cursor: pointer;
17
+ outline: none;
18
+ transition: border-color 0.15s ease;
19
+ min-width: 10rem;
20
+ }
21
+
22
+ .ms-trigger:hover {
23
+ border-color: oklch(0.4 0.02 80 / 0.4);
24
+ }
25
+
26
+ .ms-trigger:focus-visible {
27
+ border-color: var(--color-ink, oklch(0.2 0.02 80));
28
+ }
29
+
30
+ .ms-trigger-placeholder {
31
+ color: var(--color-ink-3, oklch(0.6 0.02 80));
32
+ }
33
+
34
+ .ms-trigger-chevron {
35
+ transition: transform 0.2s ease;
36
+ }
37
+
38
+ .ms-trigger-chevron.ms-open {
39
+ transform: rotate(180deg);
40
+ }
41
+
42
+ /* Popover content */
43
+ .ms-popover {
44
+ z-index: 50;
45
+ min-width: 18rem;
46
+ max-height: 28rem;
47
+ overflow-y: auto;
48
+ border-radius: var(--radius-sm, 2px);
49
+ border: 1px solid var(--color-line, oklch(0.85 0.02 80));
50
+ background: var(--color-bg, oklch(0.97 0.01 80));
51
+ box-shadow: 0 10px 38px -10px oklch(0.2 0.02 80 / 0.25), 0 10px 20px -15px oklch(0.2 0.02 80 / 0.15);
52
+ padding: 0.25rem;
53
+ }
54
+
55
+ .ms-popover:focus {
56
+ outline: none;
57
+ }
58
+
59
+ /* Search */
60
+ .ms-search {
61
+ display: flex;
62
+ align-items: center;
63
+ gap: 0.5rem;
64
+ padding: 0.5rem 0.5rem 0.25rem;
65
+ border-bottom: 1px solid var(--color-line, oklch(0.85 0.02 80));
66
+ margin-bottom: 0.25rem;
67
+ }
68
+
69
+ .ms-search-input {
70
+ flex: 1;
71
+ height: 1.75rem;
72
+ padding: 0 0.5rem;
73
+ border: 1px solid var(--color-line, oklch(0.85 0.02 80));
74
+ border-radius: var(--radius-sm, 2px);
75
+ background: var(--color-bg, oklch(0.97 0.01 80));
76
+ font-size: 0.8125rem;
77
+ color: var(--color-ink, oklch(0.2 0.02 80));
78
+ outline: none;
79
+ }
80
+
81
+ .ms-search-input::placeholder {
82
+ color: var(--color-ink-3, oklch(0.6 0.02 80));
83
+ }
84
+
85
+ .ms-search-input:focus {
86
+ border-color: var(--color-ink, oklch(0.2 0.02 80));
87
+ }
88
+
89
+ /* Featured section */
90
+ .ms-featured {
91
+ padding: 0.25rem 0;
92
+ }
93
+
94
+ .ms-featured-item {
95
+ display: flex;
96
+ align-items: flex-start;
97
+ gap: 0.625rem;
98
+ padding: 0.5rem 0.625rem;
99
+ border-radius: var(--radius-sm, 2px);
100
+ cursor: pointer;
101
+ transition: background 0.1s ease;
102
+ border: none;
103
+ background: none;
104
+ width: 100%;
105
+ text-align: left;
106
+ font: inherit;
107
+ color: inherit;
108
+ }
109
+
110
+ .ms-featured-item:hover,
111
+ .ms-featured-item:focus-visible {
112
+ background: var(--color-surface-2, oklch(0.93 0.01 80));
113
+ outline: none;
114
+ }
115
+
116
+ .ms-featured-item.ms-selected {
117
+ background: var(--color-surface-2, oklch(0.93 0.01 80));
118
+ }
119
+
120
+ .ms-featured-icon {
121
+ flex-shrink: 0;
122
+ margin-top: 0.125rem;
123
+ display: flex;
124
+ align-items: center;
125
+ }
126
+
127
+ .ms-featured-body {
128
+ flex: 1;
129
+ min-width: 0;
130
+ }
131
+
132
+ .ms-featured-name {
133
+ font-size: 0.875rem;
134
+ font-weight: 500;
135
+ color: var(--color-ink, oklch(0.2 0.02 80));
136
+ line-height: 1.3;
137
+ }
138
+
139
+ .ms-featured-desc {
140
+ margin-top: 0.125rem;
141
+ font-size: 0.75rem;
142
+ color: var(--color-ink-2, oklch(0.5 0.02 80));
143
+ line-height: 1.3;
144
+ }
145
+
146
+ .ms-featured-check {
147
+ flex-shrink: 0;
148
+ margin-top: 0.25rem;
149
+ color: var(--color-accent, oklch(0.45 0.18 25));
150
+ }
151
+
152
+ /* Separator */
153
+ .ms-separator {
154
+ margin: 0.375rem 0.5rem;
155
+ height: 1px;
156
+ background: var(--color-line, oklch(0.85 0.02 80));
157
+ }
158
+
159
+ /* Channel group */
160
+ .ms-channel {
161
+ padding: 0.125rem 0;
162
+ }
163
+
164
+ .ms-channel-trigger {
165
+ display: flex;
166
+ align-items: center;
167
+ gap: 0.5rem;
168
+ width: 100%;
169
+ padding: 0.4375rem 0.625rem;
170
+ border: none;
171
+ background: none;
172
+ cursor: pointer;
173
+ font: inherit;
174
+ font-size: 0.8125rem;
175
+ font-weight: 500;
176
+ color: var(--color-ink-2, oklch(0.5 0.02 80));
177
+ border-radius: var(--radius-sm, 2px);
178
+ transition: background 0.1s ease, color 0.1s ease;
179
+ }
180
+
181
+ .ms-channel-trigger:hover,
182
+ .ms-channel-trigger:focus-visible {
183
+ background: var(--color-surface-2, oklch(0.93 0.01 80));
184
+ color: var(--color-ink, oklch(0.2 0.02 80));
185
+ outline: none;
186
+ }
187
+
188
+ .ms-channel-icon {
189
+ flex-shrink: 0;
190
+ display: flex;
191
+ align-items: center;
192
+ }
193
+
194
+ .ms-channel-chevron {
195
+ margin-left: auto;
196
+ transition: transform 0.2s ease;
197
+ flex-shrink: 0;
198
+ }
199
+
200
+ .ms-channel-chevron.ms-open {
201
+ transform: rotate(90deg);
202
+ }
203
+
204
+ .ms-channel-count {
205
+ font-size: 0.6875rem;
206
+ color: var(--color-ink-3, oklch(0.6 0.02 80));
207
+ font-weight: 400;
208
+ }
209
+
210
+ /* Channel models list */
211
+ .ms-channel-models {
212
+ padding: 0.125rem 0 0.25rem 0;
213
+ }
214
+
215
+ .ms-model-item {
216
+ display: flex;
217
+ align-items: center;
218
+ gap: 0.5rem;
219
+ padding: 0.375rem 0.625rem 0.375rem 1.75rem;
220
+ border: none;
221
+ background: none;
222
+ cursor: pointer;
223
+ font: inherit;
224
+ font-size: 0.8125rem;
225
+ color: var(--color-ink-2, oklch(0.5 0.02 80));
226
+ border-radius: var(--radius-sm, 2px);
227
+ transition: background 0.1s ease;
228
+ width: 100%;
229
+ text-align: left;
230
+ }
231
+
232
+ .ms-model-item:hover,
233
+ .ms-model-item:focus-visible {
234
+ background: var(--color-surface-2, oklch(0.93 0.01 80));
235
+ color: var(--color-ink, oklch(0.2 0.02 80));
236
+ outline: none;
237
+ }
238
+
239
+ .ms-model-item.ms-selected {
240
+ color: var(--color-ink, oklch(0.2 0.02 80));
241
+ font-weight: 500;
242
+ }
243
+
244
+ .ms-model-icon {
245
+ flex-shrink: 0;
246
+ display: flex;
247
+ align-items: center;
248
+ }
249
+
250
+ .ms-model-name {
251
+ flex: 1;
252
+ min-width: 0;
253
+ overflow: hidden;
254
+ text-overflow: ellipsis;
255
+ white-space: nowrap;
256
+ }
257
+
258
+ .ms-model-check {
259
+ flex-shrink: 0;
260
+ color: var(--color-accent, oklch(0.45 0.18 25));
261
+ }
262
+
263
+ .ms-model-meta {
264
+ font-size: 0.6875rem;
265
+ color: var(--color-ink-3, oklch(0.6 0.02 80));
266
+ font-weight: 400;
267
+ flex-shrink: 0;
268
+ }
269
+
270
+ /* Empty state */
271
+ .ms-empty {
272
+ padding: 1.5rem 1rem;
273
+ text-align: center;
274
+ font-size: 0.8125rem;
275
+ color: var(--color-ink-3, oklch(0.6 0.02 80));
276
+ }
@@ -0,0 +1,43 @@
1
+ import type { ReactNode } from "react";
2
+
3
+ /** 单个模型条目。 */
4
+ export interface ModelSelectorModel {
5
+ /** 唯一标识,如 "gpt-5.6-terra" */
6
+ id: string;
7
+ /** 显示名 */
8
+ name: string;
9
+ /** 一句话描述(用于 featured 区) */
10
+ description?: string;
11
+ /** 供应商图标(消费方传入) */
12
+ icon?: ReactNode;
13
+ /** 所属渠道名(用于分组显示) */
14
+ channel?: string;
15
+ /** 附加信息,如价格、上下文等 */
16
+ meta?: Record<string, string>;
17
+ }
18
+
19
+ /** 渠道分组。 */
20
+ export interface ModelSelectorChannel {
21
+ /** 渠道 ID */
22
+ id: string;
23
+ /** 渠道名,如 "Azure OpenAI" */
24
+ name: string;
25
+ /** 渠道图标(消费方传入) */
26
+ icon?: ReactNode;
27
+ /** 该渠道下的模型 */
28
+ models: ModelSelectorModel[];
29
+ }
30
+
31
+ /** ModelSelector 完整数据。 */
32
+ export interface ModelSelectorData {
33
+ /** 顶部推荐模型(带描述,直接展示不折叠) */
34
+ featured: ModelSelectorModel[];
35
+ /** 渠道分组列表 */
36
+ channels: ModelSelectorChannel[];
37
+ }
38
+
39
+ /** 选中值。 */
40
+ export interface ModelSelectorValue {
41
+ channel?: string;
42
+ model: string;
43
+ }