vzcode 2.18.0 → 2.22.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 (57) hide show
  1. package/README.md +359 -0
  2. package/dist/assets/index-CfDs-dAu.js +476 -0
  3. package/dist/assets/{index-BvGPtSrr.css → index-fSroLVgi.css} +1 -1
  4. package/dist/assets/{worker-y5jhqCTR.js → worker-Cm3I3tnR.js} +57 -57
  5. package/dist/assets/{worker-ClF0pBYr.js → worker-KiuLM-X4.js} +71 -71
  6. package/dist/index.html +2 -2
  7. package/dist/llm-streaming-server/aiEditing.js +58 -0
  8. package/dist/llm-streaming-server/chatOperations.js +494 -0
  9. package/dist/llm-streaming-server/errorHandling.js +49 -0
  10. package/dist/llm-streaming-server/index.js +20 -0
  11. package/dist/llm-streaming-server/llmStreaming.js +265 -0
  12. package/dist/llm-streaming-server/validation.js +19 -0
  13. package/dist/server/aiChatHandler/chatOperations.js +3 -4
  14. package/dist/server/aiChatHandler/index.js +5 -5
  15. package/dist/server/aiChatHandler/llmStreaming.js +57 -4
  16. package/dist/server/prettier.js +18 -16
  17. package/dist/utils/fileDiff.js +25 -1
  18. package/package.json +45 -45
  19. package/src/client/CodeEditor/getOrCreateEditor.tsx +272 -258
  20. package/src/client/CodeEditor/index.tsx +3 -3
  21. package/src/client/VZRight.tsx +4 -0
  22. package/src/client/VZSidebar/AIChat/ChatInput.tsx +1 -1
  23. package/src/client/VZSidebar/AIChat/DiffView.scss +37 -1
  24. package/src/client/VZSidebar/AIChat/DiffView.tsx +55 -16
  25. package/src/client/VZSidebar/AIChat/styles.scss +38 -0
  26. package/src/client/VZSidebar/FileTypeIcon.tsx +1 -0
  27. package/src/client/VZSidebar/index.tsx +1 -1
  28. package/src/client/featureFlags.ts +7 -0
  29. package/src/llm-streaming-server/README.md +71 -0
  30. package/src/llm-streaming-server/aiEditing.ts +102 -0
  31. package/src/llm-streaming-server/chatOperations.ts +655 -0
  32. package/src/llm-streaming-server/errorHandling.ts +66 -0
  33. package/src/llm-streaming-server/index.ts +51 -0
  34. package/src/llm-streaming-server/llmStreaming.ts +403 -0
  35. package/src/llm-streaming-server/validation.ts +24 -0
  36. package/src/llm-streaming-ui/README.md +103 -0
  37. package/src/llm-streaming-ui/components/ChatInput.tsx +237 -0
  38. package/src/llm-streaming-ui/components/DiffView.scss +173 -0
  39. package/src/llm-streaming-ui/components/DiffView.tsx +236 -0
  40. package/src/llm-streaming-ui/components/FileEditingIndicator.tsx +89 -0
  41. package/src/llm-streaming-ui/components/IndividualFileDiff.tsx +86 -0
  42. package/src/llm-streaming-ui/components/JumpToLatestButton.tsx +64 -0
  43. package/src/llm-streaming-ui/components/Message.tsx +145 -0
  44. package/src/llm-streaming-ui/components/MessageList.tsx +241 -0
  45. package/src/llm-streaming-ui/components/ThinkingScratchpad.tsx +42 -0
  46. package/src/llm-streaming-ui/components/TypingIndicator.tsx +19 -0
  47. package/src/llm-streaming-ui/components/index.tsx +388 -0
  48. package/src/llm-streaming-ui/components/styles.scss +831 -0
  49. package/src/llm-streaming-ui/components/useSpeechRecognition.ts +116 -0
  50. package/src/llm-streaming-ui/index.ts +34 -0
  51. package/src/server/aiChatHandler/chatOperations.ts +3 -4
  52. package/src/server/aiChatHandler/index.ts +5 -5
  53. package/src/server/aiChatHandler/llmStreaming.ts +87 -4
  54. package/src/server/prettier.ts +30 -31
  55. package/src/types.ts +5 -0
  56. package/src/utils/fileDiff.ts +36 -2
  57. package/dist/assets/index-DuDXdJWC.js +0 -477
@@ -0,0 +1,831 @@
1
+ .ai-chat-container {
2
+ height: 100%;
3
+ display: flex;
4
+ flex-direction: column;
5
+ padding: 0;
6
+ }
7
+
8
+ .ai-chat-content {
9
+ flex: 1;
10
+ overflow: hidden;
11
+ display: flex;
12
+ flex-direction: column;
13
+ position: relative;
14
+ }
15
+
16
+ .ai-chat-messages-container {
17
+ flex: 1;
18
+ overflow-y: auto;
19
+ padding: 10px;
20
+ padding-bottom: 0;
21
+ display: flex;
22
+ flex-direction: column;
23
+ scroll-behavior: smooth;
24
+
25
+ &::-webkit-scrollbar {
26
+ width: 6px;
27
+ }
28
+
29
+ &::-webkit-scrollbar-track {
30
+ background: var(--vh-color-neutral-02);
31
+ border-radius: 3px;
32
+ }
33
+
34
+ &::-webkit-scrollbar-thumb {
35
+ background: var(--vh-color-neutral-04);
36
+ border-radius: 3px;
37
+ }
38
+ }
39
+
40
+ .ai-chat-input-fixed {
41
+ flex-shrink: 0;
42
+ padding: 10px;
43
+ padding-top: 0;
44
+ }
45
+
46
+ .ai-chat-empty {
47
+ flex: 1;
48
+ display: flex;
49
+ flex-direction: column;
50
+ align-items: center;
51
+ justify-content: center;
52
+ text-align: center;
53
+ padding: 20px;
54
+ overflow-y: auto;
55
+
56
+ .ai-chat-empty-icon {
57
+ font-size: 42px;
58
+ margin-bottom: 15px;
59
+ }
60
+
61
+ .ai-chat-empty-title {
62
+ font-size: 18px;
63
+ font-weight: 600;
64
+ color: var(--vh-color-neutral-04);
65
+ margin-bottom: 15px;
66
+ }
67
+
68
+ .ai-chat-empty-text {
69
+ font-size: 14px;
70
+ color: var(--vh-color-neutral-04);
71
+ margin-bottom: 20px;
72
+ line-height: 1.5;
73
+ }
74
+
75
+ .ai-chat-empty-examples {
76
+ background: var(--vh-color-neutral-02);
77
+ border-radius: 8px;
78
+ padding: 15px;
79
+ margin-bottom: 20px;
80
+ text-align: left;
81
+ width: 100%;
82
+
83
+ h4 {
84
+ font-size: 15px;
85
+ font-weight: 600;
86
+ color: var(--vh-color-neutral-04);
87
+ margin-bottom: 10px;
88
+ }
89
+
90
+ .ai-chat-suggested-prompts {
91
+ display: flex;
92
+ flex-direction: column;
93
+ gap: 8px;
94
+ margin: 0;
95
+
96
+ .ai-chat-suggested-prompt {
97
+ background: var(--vh-color-neutral-03);
98
+ border: 1px solid var(--vh-color-neutral-04);
99
+ border-radius: 6px;
100
+ padding: 8px 12px;
101
+ font-size: 13px;
102
+ color: var(--vh-color-neutral-04);
103
+ text-align: left;
104
+ cursor: pointer;
105
+ transition: all 0.2s ease;
106
+ line-height: 1.4;
107
+
108
+ &:hover {
109
+ background: var(--vh-color-neutral-04);
110
+ color: var(--vh-color-neutral-01);
111
+ border-color: var(--vh-color-primary-01);
112
+ }
113
+
114
+ &:active {
115
+ background: var(--vh-color-primary-01);
116
+ color: white;
117
+ border-color: var(--vh-color-primary-01);
118
+ }
119
+
120
+ &.selected {
121
+ background: var(--vh-color-primary-01);
122
+ color: white;
123
+ border-color: var(--vh-color-primary-01);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ // ============================================================================
131
+ // Streaming Message Components
132
+ // ============================================================================
133
+
134
+ .streaming-message {
135
+ .text-chunk {
136
+ margin-bottom: 1rem;
137
+ }
138
+ }
139
+
140
+ .file-editing-indicator {
141
+ display: flex;
142
+ align-items: center;
143
+ margin: 0.25rem 0;
144
+ background-color: var(--vscode-editor-background);
145
+ border: 1px solid var(--vscode-panel-border);
146
+ border-radius: 4px;
147
+
148
+ .file-editing-header {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 0.5rem;
152
+ width: 100%;
153
+ }
154
+
155
+ .file-editing-icon {
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ }
160
+
161
+ .file-editing-text {
162
+ color: var(--vscode-foreground);
163
+ font-size: 0.9rem;
164
+ flex: 1;
165
+
166
+ code {
167
+ background-color: var(
168
+ --vscode-textCodeBlock-background
169
+ );
170
+ padding: 0.2rem 0.4rem;
171
+ border-radius: 3px;
172
+ font-family: var(--vscode-editor-font-family);
173
+ }
174
+
175
+ .file-editing-done-container {
176
+ display: flex;
177
+ align-items: center;
178
+ justify-content: space-between;
179
+ width: 100%;
180
+ gap: 0.5rem;
181
+ }
182
+
183
+ .file-editing-done-status {
184
+ display: flex;
185
+ align-items: center;
186
+ gap: 8px;
187
+ font-size: 16px;
188
+ font-weight: 500;
189
+ margin-left: 4px;
190
+ }
191
+
192
+ .file-editing-done-widgets {
193
+ display: flex;
194
+ align-items: center;
195
+ gap: 0.5rem;
196
+ flex-shrink: 0;
197
+
198
+ // // Override the margin-top for undo-button-container when inside file editing indicator
199
+ // .undo-button-container {
200
+ // margin-top: 0;
201
+ // margin-bottom: 0;
202
+ // }
203
+ }
204
+ }
205
+ }
206
+
207
+ .status-indicator {
208
+ display: flex;
209
+ align-items: center;
210
+ padding: 0.5rem;
211
+ margin: 0.5rem 0;
212
+ background-color: var(--vscode-notifications-background);
213
+ border-left: 3px solid
214
+ var(--vscode-progressBar-foreground);
215
+ border-radius: 0 4px 4px 0;
216
+
217
+ .status-content {
218
+ display: flex;
219
+ align-items: center;
220
+ gap: 0.5rem;
221
+ }
222
+
223
+ .status-icon {
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+
228
+ .done-icon {
229
+ font-size: 1rem;
230
+ }
231
+ }
232
+
233
+ .status-text {
234
+ color: var(--vscode-foreground);
235
+ font-size: 0.9rem;
236
+ font-weight: 500;
237
+ }
238
+ }
239
+
240
+ @keyframes spin {
241
+ 0% {
242
+ transform: rotate(0deg);
243
+ }
244
+ 100% {
245
+ transform: rotate(360deg);
246
+ }
247
+ }
248
+
249
+ .ai-chat-list {
250
+ margin-top: 20px;
251
+
252
+ .ai-chat-list-header {
253
+ h4 {
254
+ font-size: 14px;
255
+ font-weight: 600;
256
+ color: var(--vh-color-neutral-04);
257
+ margin-bottom: 10px;
258
+ }
259
+ }
260
+ }
261
+
262
+ .ai-chat-messages {
263
+ flex: 1;
264
+ margin-bottom: 10px;
265
+ padding-right: 5px;
266
+ }
267
+
268
+ .ai-chat-message {
269
+ margin-bottom: 15px;
270
+
271
+ &.user {
272
+ .ai-chat-message-content {
273
+ background: var(--vh-color-primary-01);
274
+ color: white;
275
+ margin-left: 20px;
276
+ border-radius: 12px 12px 4px 12px;
277
+ }
278
+
279
+ .ai-chat-message-time {
280
+ text-align: right;
281
+ margin-right: 5px;
282
+ }
283
+ }
284
+
285
+ &.assistant {
286
+ .ai-chat-message-content {
287
+ background: var(--vh-color-neutral-02);
288
+ color: white;
289
+ margin-right: 20px;
290
+ border-radius: 12px 12px 12px 4px;
291
+ }
292
+
293
+ .ai-chat-message-time {
294
+ text-align: left;
295
+ margin-left: 5px;
296
+ }
297
+
298
+ &.streaming {
299
+ .ai-chat-message-content {
300
+ background: var(--vh-color-neutral-02);
301
+ color: white;
302
+ border-radius: 12px 12px 12px 4px;
303
+ }
304
+ }
305
+ }
306
+ }
307
+
308
+ .ai-chat-message-content {
309
+ .diff-view .diff-files .d2h-code-linenumber {
310
+ display: none !important;
311
+ }
312
+
313
+ .d2h-code-line {
314
+ padding: 0 1em;
315
+ }
316
+
317
+ padding: 10px 12px;
318
+ font-size: 14px;
319
+ line-height: 1.4;
320
+ word-wrap: break-word;
321
+
322
+ // Markdown styling for dark backgrounds
323
+ pre {
324
+ background-color: rgba(0, 0, 0, 0.3);
325
+ color: #e6e6e6;
326
+ padding: 0.5rem;
327
+ border-radius: 0.25rem;
328
+ overflow-x: auto;
329
+ font-size: 0.875rem;
330
+ border: 1px solid rgba(255, 255, 255, 0.1);
331
+ }
332
+
333
+ code {
334
+ background-color: rgba(0, 0, 0, 0.3);
335
+ color: #e6e6e6;
336
+ padding: 0.125rem 0.25rem;
337
+ border-radius: 0.25rem;
338
+ font-size: 0.875rem;
339
+ border: 1px solid rgba(255, 255, 255, 0.1);
340
+ }
341
+
342
+ pre code {
343
+ background-color: transparent;
344
+ padding: 0;
345
+ border: none;
346
+ }
347
+
348
+ blockquote {
349
+ border-left: 3px solid var(--vh-color-neutral-03);
350
+ padding-left: 1rem;
351
+ margin: 0.5rem 0;
352
+ color: var(--vh-color-neutral-03);
353
+ font-style: italic;
354
+ }
355
+
356
+ h1,
357
+ h2,
358
+ h3,
359
+ h4,
360
+ h5,
361
+ h6 {
362
+ margin-top: 1rem;
363
+ margin-bottom: 0.5rem;
364
+ color: inherit;
365
+ font-weight: 600;
366
+ }
367
+
368
+ h1 {
369
+ font-size: 1.25rem; // 20px at 16px base
370
+ }
371
+
372
+ h2 {
373
+ font-size: 1.125rem; // 18px at 16px base
374
+ }
375
+
376
+ h3 {
377
+ font-size: 1rem; // 16px at 16px base
378
+ }
379
+
380
+ h4,
381
+ h5,
382
+ h6 {
383
+ font-size: 0.875rem; // 14px at 16px base
384
+ }
385
+
386
+ ul,
387
+ ol {
388
+ padding-left: 1.5rem;
389
+ }
390
+
391
+ p {
392
+ margin-bottom: 0.5rem;
393
+ }
394
+
395
+ // Ensure good contrast for assistant messages
396
+ .ai-chat-message.assistant & {
397
+ color: white;
398
+ }
399
+
400
+ // Ensure user message text stays white
401
+ .ai-chat-message.user & {
402
+ color: white;
403
+ }
404
+ }
405
+
406
+ .ai-chat-message-time {
407
+ font-size: 11px;
408
+ color: var(--vh-color-neutral-03);
409
+ margin-top: 4px;
410
+ }
411
+
412
+ .ai-chat-status {
413
+ font-size: 0.75rem;
414
+ font-style: italic;
415
+ color: var(--vh-color-neutral-03);
416
+ margin-bottom: 0.5rem;
417
+ margin-left: 20px;
418
+ margin-right: 20px;
419
+ padding: 0.25rem 0.5rem;
420
+ background-color: var(--vh-color-neutral-02);
421
+ border-radius: 0.25rem;
422
+ border: 1px solid var(--vh-color-neutral-03);
423
+ text-align: left;
424
+ }
425
+
426
+ .ai-chat-typing {
427
+ display: flex;
428
+ gap: 4px;
429
+ align-items: center;
430
+
431
+ span {
432
+ width: 6px;
433
+ height: 6px;
434
+ background: var(--vh-color-neutral-03);
435
+ border-radius: 50%;
436
+ animation: typing 1.4s infinite ease-in-out;
437
+
438
+ &:nth-child(1) {
439
+ animation-delay: -0.32s;
440
+ }
441
+ &:nth-child(2) {
442
+ animation-delay: -0.16s;
443
+ }
444
+ &:nth-child(3) {
445
+ animation-delay: 0s;
446
+ }
447
+ }
448
+ }
449
+
450
+ @keyframes typing {
451
+ 0%,
452
+ 80%,
453
+ 100% {
454
+ transform: scale(0.8);
455
+ opacity: 0.5;
456
+ }
457
+ 40% {
458
+ transform: scale(1);
459
+ opacity: 1;
460
+ }
461
+ }
462
+
463
+ .ai-chat-error {
464
+ margin: 10px 0;
465
+ padding: 0;
466
+ border-radius: 8px;
467
+ background: rgba(220, 53, 69, 0.1);
468
+ border: 1px solid rgba(220, 53, 69, 0.3);
469
+
470
+ .ai-chat-error-content {
471
+ display: flex;
472
+ align-items: center;
473
+ padding: 12px;
474
+ gap: 10px;
475
+
476
+ .ai-chat-error-icon {
477
+ font-size: 16px;
478
+ flex-shrink: 0;
479
+ }
480
+
481
+ .ai-chat-error-message {
482
+ flex: 1;
483
+ font-size: 14px;
484
+ color: #dc3545;
485
+ line-height: 1.4;
486
+ font-weight: 500;
487
+ }
488
+
489
+ .ai-chat-error-dismiss {
490
+ background: none;
491
+ border: none;
492
+ color: #dc3545;
493
+ font-size: 18px;
494
+ font-weight: bold;
495
+ cursor: pointer;
496
+ padding: 0;
497
+ width: 20px;
498
+ height: 20px;
499
+ display: flex;
500
+ align-items: center;
501
+ justify-content: center;
502
+ border-radius: 50%;
503
+ transition: background-color 0.2s ease;
504
+ flex-shrink: 0;
505
+
506
+ &:hover {
507
+ background: rgba(220, 53, 69, 0.1);
508
+ }
509
+
510
+ &:focus {
511
+ outline: 2px solid rgba(220, 53, 69, 0.3);
512
+ outline-offset: 1px;
513
+ }
514
+ }
515
+ }
516
+ }
517
+
518
+ .ai-chat-input-container {
519
+ border-top: 1px solid var(--vh-color-neutral-02);
520
+ padding-top: 10px;
521
+ background: var(--vh-color-neutral-01);
522
+ }
523
+
524
+ .ai-chat-mode-toggle {
525
+ display: flex;
526
+ flex-direction: column;
527
+ gap: 4px;
528
+
529
+ .btn-group {
530
+ justify-content: center;
531
+ }
532
+
533
+ .btn-group .btn {
534
+ font-size: 12px;
535
+ font-weight: 500;
536
+ padding: 4px 12px;
537
+ border: 1px solid var(--vh-color-neutral-03);
538
+ background: var(--vh-color-neutral-02);
539
+ color: var(--vh-color-neutral-04);
540
+ transition: all 0.2s ease;
541
+
542
+ &:hover {
543
+ background: var(--vh-color-neutral-03);
544
+ border-color: var(--vh-color-neutral-04);
545
+ }
546
+
547
+ &.btn-primary {
548
+ background: var(--vh-color-primary-01);
549
+ border-color: var(--vh-color-primary-01);
550
+ color: white;
551
+
552
+ &:hover {
553
+ background: var(--vh-color-primary-02);
554
+ border-color: var(--vh-color-primary-02);
555
+ }
556
+ }
557
+
558
+ &:disabled {
559
+ opacity: 0.6;
560
+ cursor: not-allowed;
561
+ }
562
+ }
563
+
564
+ .ai-chat-mode-description {
565
+ font-size: 11px;
566
+ color: var(--vh-color-neutral-03);
567
+ text-align: center;
568
+ font-style: italic;
569
+ }
570
+ }
571
+
572
+ .ai-chat-input-group {
573
+ display: flex;
574
+ flex-direction: column;
575
+ gap: 8px;
576
+ margin-bottom: 0;
577
+
578
+ textarea {
579
+ flex: 1;
580
+ background: var(--vh-color-neutral-02) !important;
581
+ border: 1px solid var(--vh-color-neutral-03) !important;
582
+ color: var(--vh-color-neutral-04) !important;
583
+ border-radius: 8px;
584
+ padding: 10px 12px;
585
+ font-size: 14px;
586
+ font-family: var(--vzcode-font-family);
587
+ resize: none;
588
+ min-height: 48px;
589
+ line-height: 1.4;
590
+
591
+ &:focus {
592
+ outline: none !important;
593
+ border-color: var(--vh-color-primary-01) !important;
594
+ box-shadow: 0 0 0 2px rgba(38, 67, 153, 0.2) !important;
595
+ color: var(--vh-color-neutral-04) !important;
596
+ }
597
+
598
+ &::placeholder {
599
+ color: var(--vh-color-neutral-03) !important;
600
+ }
601
+
602
+ &:disabled {
603
+ opacity: 0.6;
604
+ cursor: not-allowed;
605
+ }
606
+ }
607
+
608
+ .ai-chat-input-footer {
609
+ display: flex;
610
+ justify-content: space-between;
611
+ align-items: center;
612
+ font-size: 12px;
613
+ color: var(--vh-color-neutral-03);
614
+ min-height: 40px; // Prevent layout jumping
615
+
616
+ .ai-chat-hint {
617
+ font-style: italic;
618
+ flex: 1;
619
+ }
620
+ }
621
+
622
+ .ai-chat-send-button {
623
+ border-radius: 8px;
624
+ padding: 8px 16px;
625
+ font-size: 14px;
626
+ font-weight: 500;
627
+ cursor: pointer;
628
+ transition: all 0.2s ease;
629
+ min-width: 80px;
630
+ flex-shrink: 0;
631
+
632
+ &.btn-primary {
633
+ background: var(--vh-color-primary-01);
634
+ border-color: var(--vh-color-primary-01);
635
+ color: white;
636
+
637
+ &:hover:not(:disabled) {
638
+ background: var(--vh-color-primary-02);
639
+ border-color: var(--vh-color-primary-02);
640
+ }
641
+ }
642
+
643
+ &.btn-outline-secondary {
644
+ background: transparent;
645
+ border-color: var(--vh-color-neutral-03);
646
+ color: var(--vh-color-neutral-03);
647
+
648
+ &:hover:not(:disabled) {
649
+ background: var(--vh-color-neutral-03);
650
+ color: var(--vh-color-neutral-01);
651
+ }
652
+ }
653
+
654
+ &:disabled {
655
+ background: var(--vh-color-neutral-03);
656
+ border-color: var(--vh-color-neutral-03);
657
+ color: var(--vh-color-neutral-02);
658
+ cursor: not-allowed;
659
+ }
660
+ }
661
+ }
662
+
663
+ // Jump to latest button styles
664
+ .jump-to-latest-button {
665
+ position: absolute;
666
+ left: 50%;
667
+ transform: translateX(-50%);
668
+ bottom: 20px; // Position above the input area
669
+ width: 44px;
670
+ height: 44px;
671
+ border-radius: 50%;
672
+ background: var(--vh-color-primary-01);
673
+ border: none;
674
+ color: white;
675
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
676
+ cursor: pointer;
677
+ display: flex;
678
+ align-items: center;
679
+ justify-content: center;
680
+ z-index: 10;
681
+ transition: all 0.2s ease;
682
+
683
+ &:hover {
684
+ background: var(--vh-color-primary-02);
685
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
686
+ transform: translateX(-50%) scale(1.05);
687
+ }
688
+
689
+ &:focus {
690
+ outline: 2px solid var(--vh-color-primary-01);
691
+ outline-offset: 2px;
692
+ }
693
+
694
+ &:active {
695
+ transform: translateX(-50%) scale(0.95);
696
+ }
697
+
698
+ .jump-to-latest-icon {
699
+ font-size: 16px;
700
+ font-weight: bold;
701
+ line-height: 1;
702
+ }
703
+
704
+ // Respect prefers-reduced-motion
705
+ @media (prefers-reduced-motion: reduce) {
706
+ transition: none;
707
+
708
+ &:hover {
709
+ transform: translateX(-50%);
710
+ }
711
+
712
+ &:active {
713
+ transform: translateX(-50%);
714
+ }
715
+ }
716
+ }
717
+
718
+ // Thinking scratchpad styles
719
+ .thinking-scratchpad {
720
+ background: var(--vh-color-neutral-02);
721
+ border: 1px solid var(--vh-color-neutral-03);
722
+ border-radius: 8px;
723
+ margin: 10px 0;
724
+ padding: 0;
725
+ overflow: hidden;
726
+ font-size: 13px;
727
+
728
+ .thinking-scratchpad-header {
729
+ background: var(--vh-color-neutral-03);
730
+ color: var(--vh-color-neutral-04);
731
+ padding: 8px 12px;
732
+ font-weight: 600;
733
+ display: flex;
734
+ align-items: center;
735
+ gap: 8px;
736
+
737
+ .thinking-scratchpad-icon {
738
+ font-size: 16px;
739
+ }
740
+
741
+ .thinking-scratchpad-title {
742
+ font-size: 13px;
743
+ }
744
+ }
745
+
746
+ .thinking-scratchpad-content {
747
+ padding: 12px;
748
+ max-height: 200px;
749
+ overflow-y: auto;
750
+ background: var(--vh-color-neutral-02);
751
+ scroll-behavior: smooth;
752
+
753
+ &::-webkit-scrollbar {
754
+ width: 6px;
755
+ }
756
+
757
+ &::-webkit-scrollbar-track {
758
+ background: var(--vh-color-neutral-02);
759
+ border-radius: 3px;
760
+ }
761
+
762
+ &::-webkit-scrollbar-thumb {
763
+ background: var(--vh-color-neutral-04);
764
+ border-radius: 3px;
765
+ }
766
+
767
+ // Style markdown content in thinking scratchpad
768
+ p {
769
+ margin: 0 0 8px 0;
770
+ line-height: 1.4;
771
+ color: var(--vh-color-neutral-04);
772
+
773
+ &:last-child {
774
+ margin-bottom: 0;
775
+ }
776
+ }
777
+
778
+ code {
779
+ background: rgba(0, 0, 0, 0.3);
780
+ color: #e6e6e6;
781
+ padding: 1px 4px;
782
+ border-radius: 3px;
783
+ font-size: 12px;
784
+ border: 1px solid rgba(255, 255, 255, 0.1);
785
+ }
786
+
787
+ ul,
788
+ ol {
789
+ margin: 0 0 8px 0;
790
+ padding-left: 20px;
791
+
792
+ li {
793
+ margin-bottom: 4px;
794
+ color: var(--vh-color-neutral-04);
795
+ }
796
+ }
797
+
798
+ h1,
799
+ h2,
800
+ h3,
801
+ h4,
802
+ h5,
803
+ h6 {
804
+ margin: 8px 0 6px 0;
805
+ color: var(--vh-color-neutral-04);
806
+ font-weight: 600;
807
+
808
+ &:first-child {
809
+ margin-top: 0;
810
+ }
811
+ }
812
+
813
+ h1 {
814
+ font-size: 1.125rem; // 18px at 16px base
815
+ }
816
+
817
+ h2 {
818
+ font-size: 1rem; // 16px at 16px base
819
+ }
820
+
821
+ h3 {
822
+ font-size: 0.9375rem; // 15px at 16px base
823
+ }
824
+
825
+ h4,
826
+ h5,
827
+ h6 {
828
+ font-size: 0.8125rem; // 13px at 16px base
829
+ }
830
+ }
831
+ }