free-coding-models 0.5.10 → 0.5.14

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,413 @@
1
+ /**
2
+ * @file web/src/components/playground/PlaygroundView.module.css
3
+ * @description Styles for the Playground chat modal — multi-turn chat, model
4
+ * selector, streaming response, and routed-via metadata.
5
+ */
6
+
7
+ .overlay {
8
+ position: fixed;
9
+ inset: 0;
10
+ z-index: 200;
11
+ background: rgba(0, 0, 0, 0.6);
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: center;
15
+ animation: fadeIn 0.15s ease;
16
+ }
17
+
18
+ .modal {
19
+ background: var(--bg-primary, #0f0f17);
20
+ border: 1px solid var(--border, #1e1e2e);
21
+ border-radius: 12px;
22
+ width: 880px;
23
+ max-width: 96vw;
24
+ max-height: 90vh;
25
+ display: flex;
26
+ flex-direction: column;
27
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
28
+ animation: slideUp 0.18s ease;
29
+ }
30
+
31
+ @keyframes fadeIn {
32
+ from { opacity: 0; }
33
+ to { opacity: 1; }
34
+ }
35
+
36
+ @keyframes slideUp {
37
+ from { transform: translateY(8px); opacity: 0; }
38
+ to { transform: translateY(0); opacity: 1; }
39
+ }
40
+
41
+ .header {
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: space-between;
45
+ padding: 16px 20px;
46
+ border-bottom: 1px solid var(--border, #1e1e2e);
47
+ flex-shrink: 0;
48
+ }
49
+
50
+ .headerLeft {
51
+ display: flex;
52
+ align-items: center;
53
+ gap: 12px;
54
+ min-width: 0;
55
+ }
56
+
57
+ .headerTitle {
58
+ font-size: 16px;
59
+ font-weight: 600;
60
+ display: flex;
61
+ align-items: center;
62
+ gap: 8px;
63
+ }
64
+
65
+ .headerSubtitle {
66
+ font-size: 12px;
67
+ color: var(--text-muted, #888);
68
+ font-weight: 400;
69
+ }
70
+
71
+ .headerActions {
72
+ display: flex;
73
+ align-items: center;
74
+ gap: 6px;
75
+ }
76
+
77
+ .iconBtn {
78
+ background: transparent;
79
+ border: 1px solid var(--border, #1e1e2e);
80
+ border-radius: 6px;
81
+ color: var(--text-muted, #888);
82
+ cursor: pointer;
83
+ padding: 6px;
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ transition: color 0.12s, border-color 0.12s;
88
+ }
89
+
90
+ .iconBtn:hover {
91
+ color: var(--text, #eee);
92
+ border-color: var(--accent, #22c55e);
93
+ }
94
+
95
+ .modelBar {
96
+ display: flex;
97
+ align-items: center;
98
+ gap: 10px;
99
+ padding: 10px 20px;
100
+ border-bottom: 1px solid var(--border, #1e1e2e);
101
+ background: var(--bg-secondary, #16161e);
102
+ font-size: 12px;
103
+ flex-shrink: 0;
104
+ }
105
+
106
+ .modelLabel {
107
+ color: var(--text-muted, #888);
108
+ font-weight: 500;
109
+ }
110
+
111
+ .modelSelect {
112
+ flex: 1;
113
+ background: var(--bg-primary, #0f0f17);
114
+ border: 1px solid var(--border, #1e1e2e);
115
+ border-radius: 6px;
116
+ color: var(--text, #eee);
117
+ padding: 6px 10px;
118
+ font-size: 12px;
119
+ font-family: inherit;
120
+ cursor: pointer;
121
+ max-width: 360px;
122
+ }
123
+
124
+ .modelSelect:focus {
125
+ outline: none;
126
+ border-color: var(--accent, #22c55e);
127
+ }
128
+
129
+ .presetChip {
130
+ background: var(--bg-primary, #0f0f17);
131
+ border: 1px solid var(--border, #1e1e2e);
132
+ border-radius: 6px;
133
+ color: var(--text, #eee);
134
+ padding: 4px 8px;
135
+ font-size: 11px;
136
+ font-family: inherit;
137
+ cursor: pointer;
138
+ transition: border-color 0.12s, color 0.12s;
139
+ }
140
+
141
+ .presetChip:hover {
142
+ border-color: var(--accent, #22c55e);
143
+ color: var(--accent, #22c55e);
144
+ }
145
+
146
+ .prePromptToggle {
147
+ display: flex;
148
+ align-items: center;
149
+ gap: 6px;
150
+ color: var(--text-muted, #888);
151
+ cursor: pointer;
152
+ user-select: none;
153
+ }
154
+
155
+ .prePromptToggle input {
156
+ cursor: pointer;
157
+ }
158
+
159
+ .transcript {
160
+ flex: 1;
161
+ overflow-y: auto;
162
+ padding: 18px 20px;
163
+ display: flex;
164
+ flex-direction: column;
165
+ gap: 14px;
166
+ min-height: 320px;
167
+ }
168
+
169
+ .empty {
170
+ flex: 1;
171
+ display: flex;
172
+ flex-direction: column;
173
+ align-items: center;
174
+ justify-content: center;
175
+ color: var(--text-muted, #888);
176
+ text-align: center;
177
+ padding: 40px 20px;
178
+ gap: 8px;
179
+ }
180
+
181
+ .emptyTitle {
182
+ font-size: 16px;
183
+ color: var(--text, #eee);
184
+ font-weight: 600;
185
+ }
186
+
187
+ .emptyHint {
188
+ font-size: 12px;
189
+ max-width: 380px;
190
+ line-height: 1.5;
191
+ }
192
+
193
+ .message {
194
+ display: flex;
195
+ flex-direction: column;
196
+ gap: 4px;
197
+ max-width: 88%;
198
+ animation: msgIn 0.15s ease;
199
+ }
200
+
201
+ @keyframes msgIn {
202
+ from { opacity: 0; transform: translateY(2px); }
203
+ to { opacity: 1; transform: translateY(0); }
204
+ }
205
+
206
+ .message.user {
207
+ align-self: flex-end;
208
+ }
209
+
210
+ .message.assistant {
211
+ align-self: flex-start;
212
+ }
213
+
214
+ .message.system {
215
+ align-self: center;
216
+ max-width: 100%;
217
+ }
218
+
219
+ .messageRole {
220
+ font-size: 11px;
221
+ text-transform: uppercase;
222
+ letter-spacing: 0.05em;
223
+ color: var(--text-muted, #888);
224
+ font-weight: 600;
225
+ padding: 0 4px;
226
+ }
227
+
228
+ .bubble {
229
+ padding: 10px 14px;
230
+ border-radius: 10px;
231
+ font-size: 13px;
232
+ line-height: 1.5;
233
+ white-space: pre-wrap;
234
+ word-wrap: break-word;
235
+ overflow-wrap: break-word;
236
+ }
237
+
238
+ .message.user .bubble {
239
+ background: var(--accent, #22c55e);
240
+ color: #061a08;
241
+ }
242
+
243
+ .message.assistant .bubble {
244
+ background: var(--bg-secondary, #16161e);
245
+ border: 1px solid var(--border, #1e1e2e);
246
+ color: var(--text, #eee);
247
+ }
248
+
249
+ .message.system .bubble {
250
+ background: transparent;
251
+ border: 1px dashed var(--border, #1e1e2e);
252
+ color: var(--text-muted, #888);
253
+ font-size: 12px;
254
+ font-style: italic;
255
+ text-align: center;
256
+ max-width: 100%;
257
+ }
258
+
259
+ .codeBlock {
260
+ background: rgba(0, 0, 0, 0.35);
261
+ border: 1px solid var(--border, #1e1e2e);
262
+ border-radius: 6px;
263
+ padding: 8px 10px;
264
+ font-family: 'Menlo', 'Monaco', 'Courier New', monospace;
265
+ font-size: 12px;
266
+ overflow-x: auto;
267
+ margin: 6px 0;
268
+ white-space: pre;
269
+ }
270
+
271
+ .meta {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: 10px;
275
+ font-size: 11px;
276
+ color: var(--text-muted, #888);
277
+ padding: 0 4px;
278
+ }
279
+
280
+ .metaChip {
281
+ display: inline-flex;
282
+ align-items: center;
283
+ gap: 4px;
284
+ background: var(--bg-secondary, #16161e);
285
+ border: 1px solid var(--border, #1e1e2e);
286
+ border-radius: 4px;
287
+ padding: 2px 6px;
288
+ font-family: 'Menlo', 'Monaco', monospace;
289
+ }
290
+
291
+ .metaChip.provider {
292
+ color: var(--accent, #22c55e);
293
+ border-color: rgba(34, 197, 94, 0.3);
294
+ }
295
+
296
+ .metaChip.error {
297
+ color: #f87171;
298
+ border-color: rgba(248, 113, 113, 0.3);
299
+ }
300
+
301
+ .cursor {
302
+ display: inline-block;
303
+ width: 7px;
304
+ height: 14px;
305
+ background: var(--accent, #22c55e);
306
+ margin-left: 2px;
307
+ vertical-align: text-bottom;
308
+ animation: blink 0.9s infinite;
309
+ }
310
+
311
+ @keyframes blink {
312
+ 0%, 50% { opacity: 1; }
313
+ 51%, 100% { opacity: 0; }
314
+ }
315
+
316
+ .inputBar {
317
+ display: flex;
318
+ gap: 8px;
319
+ padding: 12px 16px;
320
+ border-top: 1px solid var(--border, #1e1e2e);
321
+ flex-shrink: 0;
322
+ align-items: flex-end;
323
+ background: var(--bg-secondary, #16161e);
324
+ }
325
+
326
+ .textarea {
327
+ flex: 1;
328
+ resize: none;
329
+ min-height: 40px;
330
+ max-height: 180px;
331
+ background: var(--bg-primary, #0f0f17);
332
+ border: 1px solid var(--border, #1e1e2e);
333
+ border-radius: 8px;
334
+ color: var(--text, #eee);
335
+ padding: 9px 12px;
336
+ font-size: 13px;
337
+ font-family: inherit;
338
+ line-height: 1.4;
339
+ }
340
+
341
+ .textarea:focus {
342
+ outline: none;
343
+ border-color: var(--accent, #22c55e);
344
+ }
345
+
346
+ .textarea:disabled {
347
+ opacity: 0.5;
348
+ cursor: not-allowed;
349
+ }
350
+
351
+ .sendBtn {
352
+ background: var(--accent, #22c55e);
353
+ color: #061a08;
354
+ border: none;
355
+ border-radius: 8px;
356
+ padding: 9px 14px;
357
+ font-size: 13px;
358
+ font-weight: 600;
359
+ cursor: pointer;
360
+ display: flex;
361
+ align-items: center;
362
+ gap: 6px;
363
+ height: 40px;
364
+ font-family: inherit;
365
+ }
366
+
367
+ .sendBtn:disabled {
368
+ opacity: 0.5;
369
+ cursor: not-allowed;
370
+ }
371
+
372
+ .sendBtn:hover:not(:disabled) {
373
+ filter: brightness(1.1);
374
+ }
375
+
376
+ .errorBar {
377
+ padding: 8px 16px;
378
+ background: rgba(248, 113, 113, 0.12);
379
+ border-top: 1px solid rgba(248, 113, 113, 0.3);
380
+ color: #f87171;
381
+ font-size: 12px;
382
+ display: flex;
383
+ align-items: center;
384
+ gap: 6px;
385
+ flex-shrink: 0;
386
+ }
387
+
388
+ .stopBar {
389
+ padding: 6px 16px;
390
+ background: var(--bg-secondary, #16161e);
391
+ border-top: 1px solid var(--border, #1e1e2e);
392
+ display: flex;
393
+ align-items: center;
394
+ justify-content: space-between;
395
+ font-size: 12px;
396
+ color: var(--text-muted, #888);
397
+ flex-shrink: 0;
398
+ }
399
+
400
+ .stopBtn {
401
+ background: transparent;
402
+ border: 1px solid #f87171;
403
+ color: #f87171;
404
+ border-radius: 6px;
405
+ padding: 4px 10px;
406
+ font-size: 12px;
407
+ cursor: pointer;
408
+ font-family: inherit;
409
+ }
410
+
411
+ .stopBtn:hover {
412
+ background: rgba(248, 113, 113, 0.1);
413
+ }