@wingmanjs/react 0.1.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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/dist/components/chat-input.d.ts +9 -0
  3. package/dist/components/chat-input.d.ts.map +1 -0
  4. package/dist/components/chat-input.js +36 -0
  5. package/dist/components/chat-input.js.map +1 -0
  6. package/dist/components/chat-message.d.ts +10 -0
  7. package/dist/components/chat-message.d.ts.map +1 -0
  8. package/dist/components/chat-message.js +9 -0
  9. package/dist/components/chat-message.js.map +1 -0
  10. package/dist/components/debug-panel.d.ts +20 -0
  11. package/dist/components/debug-panel.d.ts.map +1 -0
  12. package/dist/components/debug-panel.js +29 -0
  13. package/dist/components/debug-panel.js.map +1 -0
  14. package/dist/components/markdown-renderer.d.ts +9 -0
  15. package/dist/components/markdown-renderer.d.ts.map +1 -0
  16. package/dist/components/markdown-renderer.js +9 -0
  17. package/dist/components/markdown-renderer.js.map +1 -0
  18. package/dist/components/mode-switcher.d.ts +18 -0
  19. package/dist/components/mode-switcher.d.ts.map +1 -0
  20. package/dist/components/mode-switcher.js +38 -0
  21. package/dist/components/mode-switcher.js.map +1 -0
  22. package/dist/components/model-picker.d.ts +19 -0
  23. package/dist/components/model-picker.d.ts.map +1 -0
  24. package/dist/components/model-picker.js +50 -0
  25. package/dist/components/model-picker.js.map +1 -0
  26. package/dist/components/thinking-block.d.ts +10 -0
  27. package/dist/components/thinking-block.d.ts.map +1 -0
  28. package/dist/components/thinking-block.js +12 -0
  29. package/dist/components/thinking-block.js.map +1 -0
  30. package/dist/components/token-usage.d.ts +12 -0
  31. package/dist/components/token-usage.d.ts.map +1 -0
  32. package/dist/components/token-usage.js +14 -0
  33. package/dist/components/token-usage.js.map +1 -0
  34. package/dist/components/tool-status.d.ts +12 -0
  35. package/dist/components/tool-status.d.ts.map +1 -0
  36. package/dist/components/tool-status.js +20 -0
  37. package/dist/components/tool-status.js.map +1 -0
  38. package/dist/components/welcome-screen.d.ts +12 -0
  39. package/dist/components/welcome-screen.d.ts.map +1 -0
  40. package/dist/components/welcome-screen.js +5 -0
  41. package/dist/components/welcome-screen.js.map +1 -0
  42. package/dist/index.d.ts +32 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +28 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/providers/chat-provider.d.ts +102 -0
  47. package/dist/providers/chat-provider.d.ts.map +1 -0
  48. package/dist/providers/chat-provider.js +388 -0
  49. package/dist/providers/chat-provider.js.map +1 -0
  50. package/dist/providers/theme-provider.d.ts +72 -0
  51. package/dist/providers/theme-provider.d.ts.map +1 -0
  52. package/dist/providers/theme-provider.js +87 -0
  53. package/dist/providers/theme-provider.js.map +1 -0
  54. package/package.json +57 -0
  55. package/src/styles/wingman.css +686 -0
@@ -0,0 +1,686 @@
1
+ /**
2
+ * 🦜 Wingman Default Theme
3
+ *
4
+ * CSS custom properties power the entire color system.
5
+ * Override any --wm-* variable in your own CSS or via the
6
+ * ThemeProvider `colors` prop to reskin the UI.
7
+ *
8
+ * Color space: oklch — perceptually uniform, wide-gamut.
9
+ */
10
+
11
+ /* ------------------------------------------------------------------ */
12
+ /* Design Tokens */
13
+ /* ------------------------------------------------------------------ */
14
+
15
+ :root,
16
+ [data-wingman-theme='light'] {
17
+ /* Surfaces */
18
+ --wm-bg: oklch(0.985 0 0);
19
+ --wm-bg-secondary: oklch(0.96 0 0);
20
+ --wm-bg-tertiary: oklch(0.93 0 0);
21
+ --wm-bg-hover: oklch(0.94 0 0);
22
+
23
+ /* Text */
24
+ --wm-text: oklch(0.18 0 0);
25
+ --wm-text-secondary: oklch(0.45 0 0);
26
+ --wm-text-tertiary: oklch(0.60 0 0);
27
+ --wm-text-inverse: oklch(0.98 0 0);
28
+
29
+ /* Primary accent */
30
+ --wm-primary: oklch(0.55 0.18 255);
31
+ --wm-primary-hover: oklch(0.50 0.18 255);
32
+ --wm-primary-subtle: oklch(0.92 0.04 255);
33
+
34
+ /* Semantic */
35
+ --wm-success: oklch(0.55 0.16 155);
36
+ --wm-error: oklch(0.55 0.20 28);
37
+ --wm-warning: oklch(0.72 0.15 80);
38
+
39
+ /* Borders & Dividers */
40
+ --wm-border: oklch(0.90 0 0);
41
+ --wm-border-subtle: oklch(0.94 0 0);
42
+
43
+ /* Message Bubbles */
44
+ --wm-user-bg: var(--wm-primary);
45
+ --wm-user-text: var(--wm-text-inverse);
46
+ --wm-assistant-bg: var(--wm-bg-secondary);
47
+ --wm-assistant-text: var(--wm-text);
48
+
49
+ /* Shadows */
50
+ --wm-shadow-sm: 0 1px 2px oklch(0 0 0 / 0.05);
51
+ --wm-shadow-md: 0 2px 8px oklch(0 0 0 / 0.08);
52
+
53
+ /* Typography */
54
+ --wm-font: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
55
+ --wm-font-mono: ui-monospace, 'Cascadia Code', 'Fira Code', 'JetBrains Mono', Consolas, monospace;
56
+ --wm-font-size: 0.9375rem;
57
+ --wm-line-height: 1.6;
58
+
59
+ /* Spacing & Radii */
60
+ --wm-radius: 0.75rem;
61
+ --wm-radius-sm: 0.375rem;
62
+ --wm-radius-lg: 1rem;
63
+ --wm-space-xs: 0.25rem;
64
+ --wm-space-sm: 0.5rem;
65
+ --wm-space-md: 1rem;
66
+ --wm-space-lg: 1.5rem;
67
+ --wm-space-xl: 2rem;
68
+
69
+ /* Transitions */
70
+ --wm-transition: 150ms ease;
71
+
72
+ /* Scrollbar */
73
+ --wm-scrollbar: oklch(0.85 0 0);
74
+ --wm-scrollbar-hover: oklch(0.75 0 0);
75
+ }
76
+
77
+ [data-wingman-theme='dark'] {
78
+ --wm-bg: oklch(0.16 0.005 260);
79
+ --wm-bg-secondary: oklch(0.21 0.005 260);
80
+ --wm-bg-tertiary: oklch(0.26 0.005 260);
81
+ --wm-bg-hover: oklch(0.28 0.005 260);
82
+
83
+ --wm-text: oklch(0.92 0 0);
84
+ --wm-text-secondary: oklch(0.68 0 0);
85
+ --wm-text-tertiary: oklch(0.52 0 0);
86
+ --wm-text-inverse: oklch(0.98 0 0);
87
+
88
+ --wm-primary: oklch(0.68 0.16 255);
89
+ --wm-primary-hover: oklch(0.73 0.16 255);
90
+ --wm-primary-subtle: oklch(0.25 0.06 255);
91
+
92
+ --wm-success: oklch(0.68 0.16 155);
93
+ --wm-error: oklch(0.65 0.18 28);
94
+ --wm-warning: oklch(0.78 0.14 80);
95
+
96
+ --wm-border: oklch(0.30 0.005 260);
97
+ --wm-border-subtle: oklch(0.25 0.005 260);
98
+
99
+ --wm-user-bg: var(--wm-primary);
100
+ --wm-user-text: var(--wm-text-inverse);
101
+ --wm-assistant-bg: var(--wm-bg-secondary);
102
+ --wm-assistant-text: var(--wm-text);
103
+
104
+ --wm-shadow-sm: 0 1px 2px oklch(0 0 0 / 0.20);
105
+ --wm-shadow-md: 0 2px 8px oklch(0 0 0 / 0.30);
106
+
107
+ --wm-scrollbar: oklch(0.30 0 0);
108
+ --wm-scrollbar-hover: oklch(0.40 0 0);
109
+ }
110
+
111
+ /* Auto dark mode when no explicit theme set */
112
+ @media (prefers-color-scheme: dark) {
113
+ [data-wingman-theme='system'] {
114
+ --wm-bg: oklch(0.16 0.005 260);
115
+ --wm-bg-secondary: oklch(0.21 0.005 260);
116
+ --wm-bg-tertiary: oklch(0.26 0.005 260);
117
+ --wm-bg-hover: oklch(0.28 0.005 260);
118
+
119
+ --wm-text: oklch(0.92 0 0);
120
+ --wm-text-secondary: oklch(0.68 0 0);
121
+ --wm-text-tertiary: oklch(0.52 0 0);
122
+ --wm-text-inverse: oklch(0.98 0 0);
123
+
124
+ --wm-primary: oklch(0.68 0.16 255);
125
+ --wm-primary-hover: oklch(0.73 0.16 255);
126
+ --wm-primary-subtle: oklch(0.25 0.06 255);
127
+
128
+ --wm-success: oklch(0.68 0.16 155);
129
+ --wm-error: oklch(0.65 0.18 28);
130
+ --wm-warning: oklch(0.78 0.14 80);
131
+
132
+ --wm-border: oklch(0.30 0.005 260);
133
+ --wm-border-subtle: oklch(0.25 0.005 260);
134
+
135
+ --wm-user-bg: var(--wm-primary);
136
+ --wm-user-text: var(--wm-text-inverse);
137
+ --wm-assistant-bg: var(--wm-bg-secondary);
138
+ --wm-assistant-text: var(--wm-text);
139
+
140
+ --wm-shadow-sm: 0 1px 2px oklch(0 0 0 / 0.20);
141
+ --wm-shadow-md: 0 2px 8px oklch(0 0 0 / 0.30);
142
+
143
+ --wm-scrollbar: oklch(0.30 0 0);
144
+ --wm-scrollbar-hover: oklch(0.40 0 0);
145
+ }
146
+ }
147
+
148
+ /* ------------------------------------------------------------------ */
149
+ /* Root Container */
150
+ /* ------------------------------------------------------------------ */
151
+
152
+ .wingman-root {
153
+ display: flex;
154
+ flex-direction: column;
155
+ height: 100%;
156
+ background: var(--wm-bg);
157
+ color: var(--wm-text);
158
+ font-family: var(--wm-font);
159
+ font-size: var(--wm-font-size);
160
+ line-height: var(--wm-line-height);
161
+ -webkit-font-smoothing: antialiased;
162
+ -moz-osx-font-smoothing: grayscale;
163
+ }
164
+
165
+ .wingman-root *,
166
+ .wingman-root *::before,
167
+ .wingman-root *::after {
168
+ box-sizing: border-box;
169
+ }
170
+
171
+ /* ------------------------------------------------------------------ */
172
+ /* Scrollbar */
173
+ /* ------------------------------------------------------------------ */
174
+
175
+ .wingman-root ::-webkit-scrollbar {
176
+ width: 6px;
177
+ height: 6px;
178
+ }
179
+
180
+ .wingman-root ::-webkit-scrollbar-track {
181
+ background: transparent;
182
+ }
183
+
184
+ .wingman-root ::-webkit-scrollbar-thumb {
185
+ background: var(--wm-scrollbar);
186
+ border-radius: 3px;
187
+ }
188
+
189
+ .wingman-root ::-webkit-scrollbar-thumb:hover {
190
+ background: var(--wm-scrollbar-hover);
191
+ }
192
+
193
+ /* ------------------------------------------------------------------ */
194
+ /* Welcome Screen */
195
+ /* ------------------------------------------------------------------ */
196
+
197
+ .wingman-welcome {
198
+ display: flex;
199
+ flex-direction: column;
200
+ align-items: center;
201
+ justify-content: center;
202
+ flex: 1;
203
+ padding: var(--wm-space-xl);
204
+ text-align: center;
205
+ gap: var(--wm-space-md);
206
+ }
207
+
208
+ .wingman-welcome-icon {
209
+ color: var(--wm-primary);
210
+ opacity: 0.7;
211
+ }
212
+
213
+ .wingman-welcome-icon svg {
214
+ width: 48px;
215
+ height: 48px;
216
+ }
217
+
218
+ .wingman-welcome-title {
219
+ font-size: 1.75rem;
220
+ font-weight: 600;
221
+ color: var(--wm-text);
222
+ margin: 0;
223
+ }
224
+
225
+ .wingman-welcome-message {
226
+ font-size: 1.1rem;
227
+ color: var(--wm-text-secondary);
228
+ margin: 0;
229
+ max-width: 32rem;
230
+ }
231
+
232
+ .wingman-welcome-suggestions {
233
+ display: flex;
234
+ flex-wrap: wrap;
235
+ justify-content: center;
236
+ gap: var(--wm-space-sm);
237
+ margin-top: var(--wm-space-sm);
238
+ max-width: 40rem;
239
+ }
240
+
241
+ .wingman-welcome-suggestion {
242
+ padding: var(--wm-space-sm) var(--wm-space-md);
243
+ background: var(--wm-bg-secondary);
244
+ color: var(--wm-text);
245
+ border: 1px solid var(--wm-border);
246
+ border-radius: var(--wm-radius);
247
+ font-family: var(--wm-font);
248
+ font-size: 0.875rem;
249
+ cursor: pointer;
250
+ transition: all var(--wm-transition);
251
+ }
252
+
253
+ .wingman-welcome-suggestion:hover {
254
+ background: var(--wm-bg-hover);
255
+ border-color: var(--wm-primary);
256
+ color: var(--wm-primary);
257
+ }
258
+
259
+ /* ------------------------------------------------------------------ */
260
+ /* Messages */
261
+ /* ------------------------------------------------------------------ */
262
+
263
+ .wingman-message {
264
+ padding: var(--wm-space-md) var(--wm-space-lg);
265
+ animation: wm-fade-in 200ms ease;
266
+ }
267
+
268
+ .wingman-message + .wingman-message {
269
+ border-top: 1px solid var(--wm-border-subtle);
270
+ }
271
+
272
+ .wingman-message-user .wingman-message-content {
273
+ background: var(--wm-user-bg);
274
+ color: var(--wm-user-text);
275
+ padding: var(--wm-space-sm) var(--wm-space-md);
276
+ border-radius: var(--wm-radius);
277
+ display: inline-block;
278
+ max-width: 80%;
279
+ margin-left: auto;
280
+ }
281
+
282
+ .wingman-message-user {
283
+ display: flex;
284
+ flex-direction: column;
285
+ align-items: flex-end;
286
+ }
287
+
288
+ .wingman-message-user .wingman-message-content p {
289
+ margin: 0;
290
+ }
291
+
292
+ .wingman-message-assistant .wingman-message-content {
293
+ color: var(--wm-assistant-text);
294
+ max-width: 100%;
295
+ }
296
+
297
+ /* ------------------------------------------------------------------ */
298
+ /* Markdown Rendering */
299
+ /* ------------------------------------------------------------------ */
300
+
301
+ .wingman-markdown {
302
+ line-height: var(--wm-line-height);
303
+ word-wrap: break-word;
304
+ overflow-wrap: break-word;
305
+ }
306
+
307
+ .wingman-markdown > *:first-child { margin-top: 0; }
308
+ .wingman-markdown > *:last-child { margin-bottom: 0; }
309
+
310
+ .wingman-markdown p {
311
+ margin: 0 0 var(--wm-space-sm) 0;
312
+ }
313
+
314
+ .wingman-markdown p:last-child {
315
+ margin-bottom: 0;
316
+ }
317
+
318
+ .wingman-markdown h1,
319
+ .wingman-markdown h2,
320
+ .wingman-markdown h3,
321
+ .wingman-markdown h4 {
322
+ color: var(--wm-text);
323
+ font-weight: 600;
324
+ margin: var(--wm-space-md) 0 var(--wm-space-sm) 0;
325
+ }
326
+
327
+ .wingman-markdown h1 { font-size: 1.5rem; }
328
+ .wingman-markdown h2 { font-size: 1.25rem; }
329
+ .wingman-markdown h3 { font-size: 1.1rem; }
330
+ .wingman-markdown h4 { font-size: 1rem; }
331
+
332
+ .wingman-markdown ul,
333
+ .wingman-markdown ol {
334
+ margin: var(--wm-space-sm) 0;
335
+ padding-left: 1.5rem;
336
+ }
337
+
338
+ .wingman-markdown li {
339
+ margin-bottom: var(--wm-space-xs);
340
+ }
341
+
342
+ .wingman-markdown a {
343
+ color: var(--wm-primary);
344
+ text-decoration: none;
345
+ }
346
+
347
+ .wingman-markdown a:hover {
348
+ text-decoration: underline;
349
+ }
350
+
351
+ .wingman-markdown strong {
352
+ font-weight: 600;
353
+ color: var(--wm-text);
354
+ }
355
+
356
+ .wingman-markdown code {
357
+ background: var(--wm-bg-tertiary);
358
+ padding: 0.15em 0.4em;
359
+ border-radius: var(--wm-radius-sm);
360
+ font-family: var(--wm-font-mono);
361
+ font-size: 0.85em;
362
+ }
363
+
364
+ .wingman-markdown pre {
365
+ background: var(--wm-bg-tertiary);
366
+ border: 1px solid var(--wm-border);
367
+ border-radius: var(--wm-radius);
368
+ padding: var(--wm-space-md);
369
+ overflow-x: auto;
370
+ margin: var(--wm-space-sm) 0;
371
+ }
372
+
373
+ .wingman-markdown pre code {
374
+ background: none;
375
+ padding: 0;
376
+ border-radius: 0;
377
+ font-size: 0.85em;
378
+ line-height: 1.5;
379
+ }
380
+
381
+ .wingman-markdown blockquote {
382
+ border-left: 3px solid var(--wm-primary);
383
+ margin: var(--wm-space-sm) 0;
384
+ padding: var(--wm-space-xs) var(--wm-space-md);
385
+ color: var(--wm-text-secondary);
386
+ background: var(--wm-bg-secondary);
387
+ border-radius: 0 var(--wm-radius-sm) var(--wm-radius-sm) 0;
388
+ }
389
+
390
+ .wingman-markdown hr {
391
+ border: none;
392
+ border-top: 1px solid var(--wm-border);
393
+ margin: var(--wm-space-md) 0;
394
+ }
395
+
396
+ .wingman-markdown table {
397
+ width: 100%;
398
+ border-collapse: collapse;
399
+ margin: var(--wm-space-sm) 0;
400
+ font-size: 0.875em;
401
+ }
402
+
403
+ .wingman-markdown thead {
404
+ border-bottom: 2px solid var(--wm-border);
405
+ }
406
+
407
+ .wingman-markdown th,
408
+ .wingman-markdown td {
409
+ text-align: left;
410
+ padding: var(--wm-space-sm) var(--wm-space-md);
411
+ border-bottom: 1px solid var(--wm-border-subtle);
412
+ }
413
+
414
+ .wingman-markdown th {
415
+ font-weight: 600;
416
+ color: var(--wm-text);
417
+ }
418
+
419
+ .wingman-markdown img {
420
+ max-width: 100%;
421
+ border-radius: var(--wm-radius);
422
+ }
423
+
424
+ /* ------------------------------------------------------------------ */
425
+ /* Tool Status */
426
+ /* ------------------------------------------------------------------ */
427
+
428
+ .wingman-tool-status {
429
+ display: flex;
430
+ align-items: center;
431
+ gap: var(--wm-space-sm);
432
+ padding: var(--wm-space-xs) 0;
433
+ font-size: 0.8125rem;
434
+ color: var(--wm-text-secondary);
435
+ }
436
+
437
+ .wingman-tool-status-icon {
438
+ display: flex;
439
+ align-items: center;
440
+ width: 1.125rem;
441
+ justify-content: center;
442
+ flex-shrink: 0;
443
+ }
444
+
445
+ .wingman-tool-status-complete .wingman-tool-status-icon {
446
+ color: var(--wm-success);
447
+ }
448
+
449
+ .wingman-tool-status-error .wingman-tool-status-icon {
450
+ color: var(--wm-error);
451
+ }
452
+
453
+ .wingman-tool-status-running .wingman-tool-status-icon {
454
+ color: var(--wm-primary);
455
+ }
456
+
457
+ .wingman-tool-status-name {
458
+ font-weight: 500;
459
+ color: var(--wm-text);
460
+ }
461
+
462
+ .wingman-tool-status-result {
463
+ color: var(--wm-text-tertiary);
464
+ overflow: hidden;
465
+ text-overflow: ellipsis;
466
+ white-space: nowrap;
467
+ max-width: 30rem;
468
+ }
469
+
470
+ .wingman-tool-status-duration {
471
+ color: var(--wm-text-tertiary);
472
+ flex-shrink: 0;
473
+ }
474
+
475
+ .wingman-message-tools {
476
+ margin-bottom: var(--wm-space-sm);
477
+ }
478
+
479
+ /* Spinner animation */
480
+ .wingman-spinner {
481
+ display: inline-block;
482
+ animation: wm-spin 1s linear infinite;
483
+ }
484
+
485
+ /* ------------------------------------------------------------------ */
486
+ /* Thinking Block */
487
+ /* ------------------------------------------------------------------ */
488
+
489
+ .wingman-thinking {
490
+ margin-bottom: var(--wm-space-sm);
491
+ }
492
+
493
+ .wingman-thinking-toggle {
494
+ display: flex;
495
+ align-items: center;
496
+ gap: var(--wm-space-xs);
497
+ padding: var(--wm-space-xs) var(--wm-space-sm);
498
+ background: none;
499
+ border: none;
500
+ color: var(--wm-text-secondary);
501
+ font-family: var(--wm-font);
502
+ font-size: 0.8125rem;
503
+ cursor: pointer;
504
+ border-radius: var(--wm-radius-sm);
505
+ transition: all var(--wm-transition);
506
+ }
507
+
508
+ .wingman-thinking-toggle:hover {
509
+ background: var(--wm-bg-hover);
510
+ color: var(--wm-text);
511
+ }
512
+
513
+ .wingman-thinking-icon {
514
+ font-size: 0.75rem;
515
+ width: 0.75rem;
516
+ display: inline-flex;
517
+ justify-content: center;
518
+ }
519
+
520
+ .wingman-thinking-label {
521
+ font-weight: 500;
522
+ }
523
+
524
+ .wingman-thinking-content {
525
+ margin-top: var(--wm-space-xs);
526
+ padding: var(--wm-space-sm) var(--wm-space-md);
527
+ background: var(--wm-bg-tertiary);
528
+ border-radius: var(--wm-radius-sm);
529
+ border-left: 2px solid var(--wm-primary-subtle);
530
+ }
531
+
532
+ .wingman-thinking-content pre {
533
+ margin: 0;
534
+ white-space: pre-wrap;
535
+ word-wrap: break-word;
536
+ font-family: var(--wm-font);
537
+ font-size: 0.8125rem;
538
+ color: var(--wm-text-secondary);
539
+ line-height: 1.5;
540
+ }
541
+
542
+ /* ------------------------------------------------------------------ */
543
+ /* Chat Input */
544
+ /* ------------------------------------------------------------------ */
545
+
546
+ .wingman-chat-input {
547
+ padding: var(--wm-space-md) var(--wm-space-lg);
548
+ border-top: 1px solid var(--wm-border);
549
+ background: var(--wm-bg);
550
+ }
551
+
552
+ .wingman-chat-input-container {
553
+ display: flex;
554
+ align-items: flex-end;
555
+ gap: var(--wm-space-sm);
556
+ background: var(--wm-bg-secondary);
557
+ border: 1px solid var(--wm-border);
558
+ border-radius: var(--wm-radius-lg);
559
+ padding: var(--wm-space-sm) var(--wm-space-sm) var(--wm-space-sm) var(--wm-space-md);
560
+ transition: border-color var(--wm-transition), box-shadow var(--wm-transition);
561
+ }
562
+
563
+ .wingman-chat-input-container:focus-within {
564
+ border-color: var(--wm-primary);
565
+ box-shadow: 0 0 0 2px var(--wm-primary-subtle);
566
+ }
567
+
568
+ .wingman-chat-input-textarea {
569
+ flex: 1;
570
+ border: none;
571
+ background: transparent;
572
+ color: var(--wm-text);
573
+ font-family: var(--wm-font);
574
+ font-size: var(--wm-font-size);
575
+ line-height: 1.5;
576
+ resize: none;
577
+ outline: none;
578
+ padding: var(--wm-space-xs) 0;
579
+ min-height: 1.5em;
580
+ max-height: 200px;
581
+ }
582
+
583
+ .wingman-chat-input-textarea::placeholder {
584
+ color: var(--wm-text-tertiary);
585
+ }
586
+
587
+ .wingman-chat-input-textarea:disabled {
588
+ opacity: 0.5;
589
+ cursor: not-allowed;
590
+ }
591
+
592
+ .wingman-chat-input-button {
593
+ display: flex;
594
+ align-items: center;
595
+ justify-content: center;
596
+ width: 2rem;
597
+ height: 2rem;
598
+ border: none;
599
+ border-radius: 50%;
600
+ background: var(--wm-primary);
601
+ color: var(--wm-text-inverse);
602
+ cursor: pointer;
603
+ flex-shrink: 0;
604
+ transition: all var(--wm-transition);
605
+ }
606
+
607
+ .wingman-chat-input-button:hover:not(:disabled) {
608
+ background: var(--wm-primary-hover);
609
+ }
610
+
611
+ .wingman-chat-input-button:disabled {
612
+ background: var(--wm-bg-tertiary);
613
+ color: var(--wm-text-tertiary);
614
+ cursor: not-allowed;
615
+ }
616
+
617
+ .wingman-chat-input-button svg {
618
+ width: 16px;
619
+ height: 16px;
620
+ }
621
+
622
+ /* ------------------------------------------------------------------ */
623
+ /* Token Usage */
624
+ /* ------------------------------------------------------------------ */
625
+
626
+ .wingman-message-usage {
627
+ display: flex;
628
+ gap: 0;
629
+ font-size: 0.75rem;
630
+ color: var(--wm-text-tertiary);
631
+ margin-top: var(--wm-space-xs);
632
+ }
633
+
634
+ /* ------------------------------------------------------------------ */
635
+ /* Error Display */
636
+ /* ------------------------------------------------------------------ */
637
+
638
+ .wingman-error {
639
+ padding: var(--wm-space-sm) var(--wm-space-md);
640
+ margin: var(--wm-space-sm) var(--wm-space-lg);
641
+ background: oklch(0.95 0.04 25);
642
+ border: 1px solid var(--wm-error);
643
+ border-radius: var(--wm-radius);
644
+ color: var(--wm-error);
645
+ font-size: 0.875rem;
646
+ }
647
+
648
+ [data-wingman-theme='dark'] .wingman-error {
649
+ background: oklch(0.22 0.04 25);
650
+ }
651
+
652
+ /* ------------------------------------------------------------------ */
653
+ /* Animations */
654
+ /* ------------------------------------------------------------------ */
655
+
656
+ @keyframes wm-spin {
657
+ from { transform: rotate(0deg); }
658
+ to { transform: rotate(360deg); }
659
+ }
660
+
661
+ @keyframes wm-fade-in {
662
+ from { opacity: 0; transform: translateY(4px); }
663
+ to { opacity: 1; transform: translateY(0); }
664
+ }
665
+
666
+ /* ------------------------------------------------------------------ */
667
+ /* Responsive */
668
+ /* ------------------------------------------------------------------ */
669
+
670
+ @media (max-width: 640px) {
671
+ .wingman-message {
672
+ padding: var(--wm-space-sm) var(--wm-space-md);
673
+ }
674
+
675
+ .wingman-chat-input {
676
+ padding: var(--wm-space-sm) var(--wm-space-md);
677
+ }
678
+
679
+ .wingman-message-user .wingman-message-content {
680
+ max-width: 90%;
681
+ }
682
+
683
+ .wingman-welcome-title {
684
+ font-size: 1.5rem;
685
+ }
686
+ }