claudito 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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +500 -0
  3. package/dist/agents/agent-manager.d.ts +150 -0
  4. package/dist/agents/agent-manager.d.ts.map +1 -0
  5. package/dist/agents/agent-manager.js +560 -0
  6. package/dist/agents/agent-manager.js.map +1 -0
  7. package/dist/agents/claude-agent.d.ts +138 -0
  8. package/dist/agents/claude-agent.d.ts.map +1 -0
  9. package/dist/agents/claude-agent.js +608 -0
  10. package/dist/agents/claude-agent.js.map +1 -0
  11. package/dist/agents/index.d.ts +3 -0
  12. package/dist/agents/index.d.ts.map +1 -0
  13. package/dist/agents/index.js +21 -0
  14. package/dist/agents/index.js.map +1 -0
  15. package/dist/cli.d.ts +3 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +115 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config/index.d.ts +18 -0
  20. package/dist/config/index.d.ts.map +1 -0
  21. package/dist/config/index.js +47 -0
  22. package/dist/config/index.js.map +1 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +35 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/repositories/conversation.d.ts +67 -0
  28. package/dist/repositories/conversation.d.ts.map +1 -0
  29. package/dist/repositories/conversation.js +233 -0
  30. package/dist/repositories/conversation.js.map +1 -0
  31. package/dist/repositories/index.d.ts +4 -0
  32. package/dist/repositories/index.d.ts.map +1 -0
  33. package/dist/repositories/index.js +20 -0
  34. package/dist/repositories/index.js.map +1 -0
  35. package/dist/repositories/project.d.ts +92 -0
  36. package/dist/repositories/project.d.ts.map +1 -0
  37. package/dist/repositories/project.js +279 -0
  38. package/dist/repositories/project.js.map +1 -0
  39. package/dist/repositories/settings.d.ts +44 -0
  40. package/dist/repositories/settings.d.ts.map +1 -0
  41. package/dist/repositories/settings.js +116 -0
  42. package/dist/repositories/settings.js.map +1 -0
  43. package/dist/routes/filesystem.d.ts +33 -0
  44. package/dist/routes/filesystem.d.ts.map +1 -0
  45. package/dist/routes/filesystem.js +211 -0
  46. package/dist/routes/filesystem.js.map +1 -0
  47. package/dist/routes/index.d.ts +11 -0
  48. package/dist/routes/index.d.ts.map +1 -0
  49. package/dist/routes/index.js +101 -0
  50. package/dist/routes/index.js.map +1 -0
  51. package/dist/routes/projects.d.ts +48 -0
  52. package/dist/routes/projects.d.ts.map +1 -0
  53. package/dist/routes/projects.js +578 -0
  54. package/dist/routes/projects.js.map +1 -0
  55. package/dist/routes/settings.d.ts +10 -0
  56. package/dist/routes/settings.d.ts.map +1 -0
  57. package/dist/routes/settings.js +30 -0
  58. package/dist/routes/settings.js.map +1 -0
  59. package/dist/server/index.d.ts +25 -0
  60. package/dist/server/index.d.ts.map +1 -0
  61. package/dist/server/index.js +104 -0
  62. package/dist/server/index.js.map +1 -0
  63. package/dist/services/index.d.ts +5 -0
  64. package/dist/services/index.d.ts.map +1 -0
  65. package/dist/services/index.js +21 -0
  66. package/dist/services/index.js.map +1 -0
  67. package/dist/services/instruction-generator.d.ts +47 -0
  68. package/dist/services/instruction-generator.d.ts.map +1 -0
  69. package/dist/services/instruction-generator.js +147 -0
  70. package/dist/services/instruction-generator.js.map +1 -0
  71. package/dist/services/project.d.ts +38 -0
  72. package/dist/services/project.d.ts.map +1 -0
  73. package/dist/services/project.js +80 -0
  74. package/dist/services/project.js.map +1 -0
  75. package/dist/services/roadmap-generator.d.ts +63 -0
  76. package/dist/services/roadmap-generator.d.ts.map +1 -0
  77. package/dist/services/roadmap-generator.js +290 -0
  78. package/dist/services/roadmap-generator.js.map +1 -0
  79. package/dist/services/roadmap.d.ts +72 -0
  80. package/dist/services/roadmap.d.ts.map +1 -0
  81. package/dist/services/roadmap.js +234 -0
  82. package/dist/services/roadmap.js.map +1 -0
  83. package/dist/utils/errors.d.ts +24 -0
  84. package/dist/utils/errors.d.ts.map +1 -0
  85. package/dist/utils/errors.js +80 -0
  86. package/dist/utils/errors.js.map +1 -0
  87. package/dist/utils/index.d.ts +6 -0
  88. package/dist/utils/index.d.ts.map +1 -0
  89. package/dist/utils/index.js +22 -0
  90. package/dist/utils/index.js.map +1 -0
  91. package/dist/utils/logger.d.ts +49 -0
  92. package/dist/utils/logger.d.ts.map +1 -0
  93. package/dist/utils/logger.js +172 -0
  94. package/dist/utils/logger.js.map +1 -0
  95. package/dist/utils/paths.d.ts +2 -0
  96. package/dist/utils/paths.d.ts.map +1 -0
  97. package/dist/utils/paths.js +19 -0
  98. package/dist/utils/paths.js.map +1 -0
  99. package/dist/utils/pid-tracker.d.ts +39 -0
  100. package/dist/utils/pid-tracker.d.ts.map +1 -0
  101. package/dist/utils/pid-tracker.js +171 -0
  102. package/dist/utils/pid-tracker.js.map +1 -0
  103. package/dist/utils/retry.d.ts +10 -0
  104. package/dist/utils/retry.d.ts.map +1 -0
  105. package/dist/utils/retry.js +65 -0
  106. package/dist/utils/retry.js.map +1 -0
  107. package/dist/websocket/index.d.ts +2 -0
  108. package/dist/websocket/index.d.ts.map +1 -0
  109. package/dist/websocket/index.js +18 -0
  110. package/dist/websocket/index.js.map +1 -0
  111. package/dist/websocket/websocket-server.d.ts +42 -0
  112. package/dist/websocket/websocket-server.d.ts.map +1 -0
  113. package/dist/websocket/websocket-server.js +140 -0
  114. package/dist/websocket/websocket-server.js.map +1 -0
  115. package/package.json +77 -0
  116. package/public/css/styles.css +1860 -0
  117. package/public/index.html +1004 -0
  118. package/public/js/app.js +5346 -0
  119. package/public/vendor/highlight-github-dark.min.css +10 -0
  120. package/public/vendor/highlight.min.js +1213 -0
  121. package/public/vendor/jquery.min.js +2 -0
  122. package/public/vendor/marked.min.js +69 -0
  123. package/public/vendor/tailwind.js +65 -0
@@ -0,0 +1,1860 @@
1
+ /* Base font size - smaller throughout */
2
+ :root {
3
+ --claudito-font-size: 14px;
4
+ }
5
+
6
+ html {
7
+ font-size: 13px;
8
+ }
9
+
10
+ body {
11
+ font-size: 0.875rem;
12
+ }
13
+
14
+ /* Apply user-configurable font size to content areas */
15
+ #conversation,
16
+ #project-detail,
17
+ .modal-content {
18
+ font-size: var(--claudito-font-size);
19
+ }
20
+
21
+ /* Modal styles */
22
+ .modal {
23
+ position: fixed;
24
+ inset: 0;
25
+ z-index: 40;
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ }
30
+
31
+ .modal.hidden {
32
+ display: none;
33
+ }
34
+
35
+ .modal-backdrop {
36
+ position: absolute;
37
+ inset: 0;
38
+ background-color: rgba(0, 0, 0, 0.5);
39
+ }
40
+
41
+ .modal-content {
42
+ position: relative;
43
+ z-index: 10;
44
+ padding: 1rem;
45
+ width: 100%;
46
+ display: flex;
47
+ justify-content: center;
48
+ }
49
+
50
+ /* Status badges */
51
+ .status-badge {
52
+ display: inline-flex;
53
+ align-items: center;
54
+ padding: 0.25rem 0.75rem;
55
+ font-size: 0.75rem;
56
+ font-weight: 500;
57
+ border-radius: 9999px;
58
+ }
59
+
60
+ .status-badge.stopped {
61
+ background-color: rgba(107, 114, 128, 0.2);
62
+ color: #9ca3af;
63
+ }
64
+
65
+ .status-badge.running {
66
+ background-color: rgba(34, 197, 94, 0.2);
67
+ color: #4ade80;
68
+ }
69
+
70
+ .status-badge.error {
71
+ background-color: rgba(239, 68, 68, 0.2);
72
+ color: #f87171;
73
+ }
74
+
75
+ .status-badge.queued {
76
+ background-color: rgba(234, 179, 8, 0.2);
77
+ color: #facc15;
78
+ }
79
+
80
+ /* Mode selector buttons */
81
+ .mode-btn {
82
+ color: #9ca3af;
83
+ background-color: transparent;
84
+ }
85
+
86
+ .mode-btn:hover:not(.mode-active) {
87
+ color: #e5e7eb;
88
+ background-color: rgba(255, 255, 255, 0.1);
89
+ }
90
+
91
+ .mode-btn.mode-active {
92
+ color: #fff;
93
+ background-color: #7c3aed;
94
+ }
95
+
96
+ #mode-selector {
97
+ border: 1px solid #4b5563;
98
+ }
99
+
100
+ #mode-selector.disabled {
101
+ opacity: 0.5;
102
+ pointer-events: none;
103
+ }
104
+
105
+ /* Project card */
106
+ .project-card {
107
+ background-color: #374151;
108
+ border-radius: 0.5rem;
109
+ padding: 0.75rem;
110
+ cursor: pointer;
111
+ transition: background-color 0.15s ease-in-out;
112
+ }
113
+
114
+ .project-card:hover {
115
+ background-color: #4b5563;
116
+ }
117
+
118
+ .project-card.selected {
119
+ background-color: #4c1d95;
120
+ border-left: 3px solid #a78bfa;
121
+ }
122
+
123
+ .project-card .project-card-name {
124
+ font-weight: 500;
125
+ margin-bottom: 0.25rem;
126
+ white-space: nowrap;
127
+ overflow: hidden;
128
+ text-overflow: ellipsis;
129
+ }
130
+
131
+ .project-card .project-card-path {
132
+ font-size: 0.75rem;
133
+ color: #9ca3af;
134
+ white-space: nowrap;
135
+ overflow: hidden;
136
+ text-overflow: ellipsis;
137
+ }
138
+
139
+ .project-card .project-card-status {
140
+ display: flex;
141
+ align-items: center;
142
+ gap: 0.5rem;
143
+ margin-top: 0.5rem;
144
+ }
145
+
146
+ /* Quick action buttons */
147
+ .quick-action {
148
+ padding: 0.375rem;
149
+ border-radius: 0.25rem;
150
+ background: transparent;
151
+ border: none;
152
+ cursor: pointer;
153
+ opacity: 0.7;
154
+ transition: opacity 0.15s, background-color 0.15s, transform 0.15s;
155
+ }
156
+
157
+ .project-card:hover .quick-action {
158
+ opacity: 1;
159
+ }
160
+
161
+ .quick-action:hover {
162
+ background-color: rgba(255, 255, 255, 0.1);
163
+ transform: scale(1.1);
164
+ }
165
+
166
+ .quick-action:disabled {
167
+ opacity: 0.3;
168
+ cursor: not-allowed;
169
+ transform: none;
170
+ }
171
+
172
+ .quick-action.loading {
173
+ opacity: 0.5;
174
+ cursor: wait;
175
+ }
176
+
177
+ .quick-action.start {
178
+ color: #4ade80;
179
+ }
180
+
181
+ .quick-action.start:hover:not(:disabled) {
182
+ background-color: rgba(34, 197, 94, 0.2);
183
+ }
184
+
185
+ .quick-action.stop {
186
+ color: #f87171;
187
+ }
188
+
189
+ .quick-action.stop:hover:not(:disabled) {
190
+ background-color: rgba(239, 68, 68, 0.2);
191
+ }
192
+
193
+ .quick-action.cancel {
194
+ color: #facc15;
195
+ }
196
+
197
+ .quick-action.cancel:hover:not(:disabled) {
198
+ background-color: rgba(234, 179, 8, 0.2);
199
+ }
200
+
201
+ .quick-action.delete {
202
+ color: #9ca3af;
203
+ }
204
+
205
+ .quick-action.delete:hover:not(:disabled) {
206
+ color: #f87171;
207
+ background-color: rgba(239, 68, 68, 0.2);
208
+ }
209
+
210
+ /* Loading overlay for content area */
211
+ .content-loading-overlay {
212
+ position: absolute;
213
+ inset: 0;
214
+ background-color: rgba(17, 24, 39, 0.8);
215
+ display: flex;
216
+ align-items: center;
217
+ justify-content: center;
218
+ z-index: 10;
219
+ }
220
+
221
+ .content-loading-overlay.hidden {
222
+ display: none;
223
+ }
224
+
225
+ .loading-spinner {
226
+ width: 2rem;
227
+ height: 2rem;
228
+ border: 3px solid #374151;
229
+ border-top-color: #a78bfa;
230
+ border-radius: 50%;
231
+ animation: spin 1s linear infinite;
232
+ }
233
+
234
+ .loading-spinner.small {
235
+ width: 1rem;
236
+ height: 1rem;
237
+ border-width: 2px;
238
+ }
239
+
240
+ @keyframes spin {
241
+ to {
242
+ transform: rotate(360deg);
243
+ }
244
+ }
245
+
246
+ /* Conversation messages */
247
+ .conversation-message {
248
+ padding: 0.75rem;
249
+ border-radius: 0.5rem;
250
+ background-color: #1f2937;
251
+ }
252
+
253
+ .conversation-message.assistant {
254
+ background-color: #1e3a5f;
255
+ border-left: 3px solid #3b82f6;
256
+ }
257
+
258
+ .conversation-message.user {
259
+ background-color: #2d2450;
260
+ border-left: 3px solid #a78bfa;
261
+ margin-left: 1.5rem;
262
+ }
263
+
264
+ /* Message headers for Claude and user */
265
+ .message-header {
266
+ display: flex;
267
+ align-items: center;
268
+ gap: 0.375rem;
269
+ margin-bottom: 0.5rem;
270
+ font-size: 0.6875rem;
271
+ font-weight: 600;
272
+ text-transform: uppercase;
273
+ letter-spacing: 0.05em;
274
+ }
275
+
276
+ .message-header svg {
277
+ width: 1rem;
278
+ height: 1rem;
279
+ flex-shrink: 0;
280
+ }
281
+
282
+ .message-sender {
283
+ opacity: 0.9;
284
+ }
285
+
286
+ /* Claude message header */
287
+ .claude-header {
288
+ color: #60a5fa;
289
+ }
290
+
291
+ .claude-header svg {
292
+ color: #3b82f6;
293
+ }
294
+
295
+ /* User message header - handled via content insertion */
296
+ .conversation-message.user .message-header {
297
+ color: #a78bfa;
298
+ }
299
+
300
+ .conversation-message.user .message-header svg {
301
+ color: #8b5cf6;
302
+ }
303
+
304
+ .message-content {
305
+ padding-left: 0.125rem;
306
+ }
307
+
308
+ .conversation-message.system {
309
+ background-color: #374151;
310
+ border-left: 3px solid #6b7280;
311
+ font-style: italic;
312
+ }
313
+
314
+ .conversation-message.error,
315
+ .conversation-message.stderr {
316
+ background-color: #450a0a;
317
+ border-left: 3px solid #ef4444;
318
+ }
319
+
320
+ .conversation-message.stdout {
321
+ background-color: #1f2937;
322
+ border-left: 3px solid #3b82f6;
323
+ }
324
+
325
+ /* Markdown content styling */
326
+ .markdown-content {
327
+ line-height: 1.6;
328
+ }
329
+
330
+ .markdown-content p {
331
+ margin-bottom: 0.75rem;
332
+ }
333
+
334
+ .markdown-content p:last-child {
335
+ margin-bottom: 0;
336
+ }
337
+
338
+ .markdown-content h1,
339
+ .markdown-content h2,
340
+ .markdown-content h3,
341
+ .markdown-content h4 {
342
+ font-weight: 600;
343
+ margin-top: 1rem;
344
+ margin-bottom: 0.5rem;
345
+ color: #e5e7eb;
346
+ }
347
+
348
+ .markdown-content h1 { font-size: 1.25rem; }
349
+ .markdown-content h2 { font-size: 1.125rem; }
350
+ .markdown-content h3 { font-size: 1rem; }
351
+
352
+ .markdown-content code {
353
+ background-color: #374151;
354
+ padding: 0.125rem 0.375rem;
355
+ border-radius: 0.25rem;
356
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
357
+ font-size: 0.9em;
358
+ }
359
+
360
+ .markdown-content pre {
361
+ background-color: #1f2937;
362
+ border: 1px solid #374151;
363
+ border-radius: 0.375rem;
364
+ padding: 0.75rem;
365
+ overflow-x: auto;
366
+ margin: 0.75rem 0;
367
+ }
368
+
369
+ .markdown-content pre code {
370
+ background: none;
371
+ padding: 0;
372
+ font-size: 0.9em;
373
+ }
374
+
375
+ .markdown-content ul,
376
+ .markdown-content ol {
377
+ margin: 0.5rem 0;
378
+ padding-left: 1.5rem;
379
+ }
380
+
381
+ .markdown-content li {
382
+ margin-bottom: 0.25rem;
383
+ }
384
+
385
+ .markdown-content blockquote {
386
+ border-left: 3px solid #6b7280;
387
+ padding-left: 0.75rem;
388
+ margin: 0.75rem 0;
389
+ color: #9ca3af;
390
+ }
391
+
392
+ .markdown-content a {
393
+ color: #60a5fa;
394
+ text-decoration: underline;
395
+ }
396
+
397
+ .markdown-content a:hover {
398
+ color: #93c5fd;
399
+ }
400
+
401
+ .markdown-content hr {
402
+ border: none;
403
+ border-top: 1px solid #374151;
404
+ margin: 1rem 0;
405
+ }
406
+
407
+ .conversation-message.tool-use {
408
+ background-color: #1a1a2e;
409
+ border-left: 3px solid #a855f7;
410
+ color: #d8b4fe;
411
+ cursor: pointer;
412
+ transition: background-color 0.15s;
413
+ }
414
+
415
+ .conversation-message.tool-use:hover {
416
+ background-color: #252545;
417
+ }
418
+
419
+ .tool-header {
420
+ display: flex;
421
+ align-items: center;
422
+ gap: 0.5rem;
423
+ margin-bottom: 0.5rem;
424
+ }
425
+
426
+ .tool-header svg {
427
+ color: #a855f7;
428
+ }
429
+
430
+ .tool-name {
431
+ font-weight: 600;
432
+ color: #e9d5ff;
433
+ }
434
+
435
+ /* Diff preview styles */
436
+ .diff-preview {
437
+ position: relative;
438
+ }
439
+
440
+ .diff-preview-fade {
441
+ position: absolute;
442
+ bottom: 0;
443
+ left: 0;
444
+ right: 0;
445
+ height: 2rem;
446
+ background: linear-gradient(transparent, #1a1a2e);
447
+ pointer-events: none;
448
+ }
449
+
450
+ .diff-more-indicator {
451
+ text-align: center;
452
+ padding: 0.25rem;
453
+ color: #9ca3af;
454
+ font-size: 0.8em;
455
+ font-style: italic;
456
+ }
457
+
458
+ .tool-status {
459
+ width: 6px;
460
+ height: 6px;
461
+ border-radius: 50%;
462
+ }
463
+
464
+ .tool-status.running {
465
+ background-color: #facc15;
466
+ animation: pulse 1.5s ease-in-out infinite;
467
+ }
468
+
469
+ .tool-status.completed {
470
+ background-color: #4ade80;
471
+ }
472
+
473
+ .tool-status.failed {
474
+ background-color: #f87171;
475
+ }
476
+
477
+ /* Tool detail modal */
478
+ #tool-detail-content .tool-args {
479
+ padding-left: 0;
480
+ margin-bottom: 1rem;
481
+ }
482
+
483
+ #tool-detail-content .tool-diff {
484
+ max-height: none;
485
+ }
486
+
487
+ #tool-detail-content .tool-arg {
488
+ margin-bottom: 0.5rem;
489
+ }
490
+
491
+ .tool-args {
492
+ padding-left: 1.5rem;
493
+ font-size: inherit;
494
+ }
495
+
496
+ .tool-arg {
497
+ margin-bottom: 0.25rem;
498
+ display: flex;
499
+ gap: 0.5rem;
500
+ align-items: flex-start;
501
+ }
502
+
503
+ .arg-label {
504
+ color: #9ca3af;
505
+ flex-shrink: 0;
506
+ }
507
+
508
+ .arg-value {
509
+ color: #e5e7eb;
510
+ word-break: break-all;
511
+ font-size: inherit;
512
+ }
513
+
514
+ .arg-value.file-path {
515
+ color: #93c5fd;
516
+ }
517
+
518
+ .arg-value.bash-command {
519
+ background-color: #1f2937;
520
+ padding: 0.25rem 0.5rem;
521
+ border-radius: 0.25rem;
522
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
523
+ font-size: inherit;
524
+ white-space: pre-wrap;
525
+ word-break: break-all;
526
+ }
527
+
528
+ .tool-diff {
529
+ margin-top: 0.5rem;
530
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
531
+ font-size: 0.85em;
532
+ border-radius: 0.25rem;
533
+ overflow: hidden;
534
+ background-color: #1a1a2e;
535
+ border: 1px solid #374151;
536
+ }
537
+
538
+ /* Unified diff view */
539
+ .tool-diff.unified {
540
+ max-height: 300px;
541
+ overflow-y: auto;
542
+ }
543
+
544
+ /* Side-by-side diff view */
545
+ .tool-diff.side-by-side {
546
+ display: flex;
547
+ max-height: 200px;
548
+ overflow: hidden;
549
+ }
550
+
551
+ .diff-side {
552
+ flex: 1;
553
+ min-width: 0;
554
+ display: flex;
555
+ flex-direction: column;
556
+ overflow: hidden;
557
+ }
558
+
559
+ .diff-side-content {
560
+ flex: 1;
561
+ overflow-y: auto;
562
+ min-height: 0;
563
+ }
564
+
565
+ .diff-side.old {
566
+ border-right: 1px solid #374151;
567
+ }
568
+
569
+ .diff-side-header {
570
+ padding: 0.375rem 0.5rem;
571
+ font-size: 0.7em;
572
+ font-weight: 600;
573
+ text-transform: uppercase;
574
+ letter-spacing: 0.05em;
575
+ background-color: rgba(0, 0, 0, 0.3);
576
+ position: relative;
577
+ flex-shrink: 0;
578
+ }
579
+
580
+ .diff-side.old .diff-side-header {
581
+ color: #fca5a5;
582
+ background-color: rgba(239, 68, 68, 0.1);
583
+ }
584
+
585
+ .diff-side.new .diff-side-header {
586
+ color: #86efac;
587
+ background-color: rgba(34, 197, 94, 0.1);
588
+ }
589
+
590
+ .diff-side .diff-line {
591
+ border-left: none;
592
+ }
593
+
594
+ /* Mobile: stack side-by-side vertically */
595
+ @media (max-width: 640px) {
596
+ .tool-diff.side-by-side {
597
+ flex-direction: column;
598
+ max-height: 300px;
599
+ }
600
+
601
+ .diff-side.old {
602
+ border-right: none;
603
+ border-bottom: 1px solid #374151;
604
+ }
605
+ }
606
+
607
+ .diff-line {
608
+ display: flex;
609
+ padding: 0.125rem 0.5rem;
610
+ border-left: 3px solid transparent;
611
+ }
612
+
613
+ .diff-prefix {
614
+ flex-shrink: 0;
615
+ width: 1rem;
616
+ color: #6b7280;
617
+ user-select: none;
618
+ }
619
+
620
+ .diff-content {
621
+ white-space: pre-wrap;
622
+ word-break: break-all;
623
+ }
624
+
625
+ /* Unchanged lines - grey */
626
+ .diff-line.diff-unchanged {
627
+ background-color: transparent;
628
+ border-left-color: transparent;
629
+ }
630
+
631
+ .diff-line.diff-unchanged .diff-content {
632
+ color: #9ca3af;
633
+ }
634
+
635
+ /* Added lines - green */
636
+ .diff-line.diff-add {
637
+ background-color: rgba(34, 197, 94, 0.15);
638
+ border-left-color: #22c55e;
639
+ }
640
+
641
+ .diff-line.diff-add .diff-prefix {
642
+ color: #22c55e;
643
+ }
644
+
645
+ .diff-line.diff-add .diff-content {
646
+ color: #86efac;
647
+ }
648
+
649
+ /* Removed lines - red */
650
+ .diff-line.diff-remove {
651
+ background-color: rgba(239, 68, 68, 0.15);
652
+ border-left-color: #ef4444;
653
+ }
654
+
655
+ .diff-line.diff-remove .diff-prefix {
656
+ color: #ef4444;
657
+ }
658
+
659
+ .diff-line.diff-remove .diff-content {
660
+ color: #fca5a5;
661
+ }
662
+
663
+ /* Changed/modified lines - orange */
664
+ .diff-line.diff-change {
665
+ background-color: rgba(249, 115, 22, 0.15);
666
+ border-left-color: #f97316;
667
+ }
668
+
669
+ .diff-line.diff-change .diff-prefix {
670
+ color: #f97316;
671
+ }
672
+
673
+ .diff-line.diff-change .diff-content {
674
+ color: #fdba74;
675
+ }
676
+
677
+ /* Empty lines for side-by-side alignment */
678
+ .diff-line.diff-empty {
679
+ background-color: rgba(107, 114, 128, 0.1);
680
+ }
681
+
682
+ .diff-line.diff-empty .diff-content {
683
+ color: transparent;
684
+ }
685
+
686
+ /* Syntax highlighting in diffs - bright colors for dark bg */
687
+ /* Base color for all hljs elements in diffs - ensures nothing is invisible */
688
+ .diff-content .hljs,
689
+ .diff-content code.hljs {
690
+ color: #e5e7eb;
691
+ }
692
+
693
+ .diff-content .hljs-keyword { color: #ff79c6; }
694
+ .diff-content .hljs-string { color: #a5d6ff; }
695
+ .diff-content .hljs-number { color: #bd93f9; }
696
+ .diff-content .hljs-comment { color: #9ca3af; font-style: italic; }
697
+ .diff-content .hljs-function { color: #50fa7b; }
698
+ .diff-content .hljs-class { color: #8be9fd; }
699
+ .diff-content .hljs-variable { color: #f8f8f2; }
700
+ .diff-content .hljs-operator { color: #79c0ff; }
701
+ .diff-content .hljs-punctuation { color: #e5e7eb; }
702
+ .diff-content .hljs-property { color: #79c0ff; }
703
+ .diff-content .hljs-attr { color: #7ee787; }
704
+ .diff-content .hljs-tag { color: #ff79c6; }
705
+ .diff-content .hljs-name { color: #7ee787; }
706
+ .diff-content .hljs-attribute { color: #79c0ff; }
707
+ .diff-content .hljs-selector-tag { color: #7ee787; }
708
+ .diff-content .hljs-selector-class { color: #79c0ff; }
709
+ .diff-content .hljs-selector-id { color: #79c0ff; }
710
+ .diff-content .hljs-built_in { color: #ffa657; }
711
+ .diff-content .hljs-type { color: #ff7b72; }
712
+ .diff-content .hljs-params { color: #ffb86c; }
713
+ .diff-content .hljs-literal { color: #79c0ff; }
714
+ .diff-content .hljs-meta { color: #9ca3af; }
715
+ .diff-content .hljs-title { color: #d2a8ff; }
716
+ .diff-content .hljs-title.function_ { color: #d2a8ff; }
717
+ .diff-content .hljs-title.class_ { color: #ffa657; }
718
+ .diff-content .hljs-doctag { color: #ff7b72; }
719
+ .diff-content .hljs-template-tag { color: #ff7b72; }
720
+ .diff-content .hljs-template-variable { color: #ff7b72; }
721
+ .diff-content .hljs-variable.language_ { color: #ff7b72; }
722
+ .diff-content .hljs-selector-attr { color: #79c0ff; }
723
+ .diff-content .hljs-regexp { color: #a5d6ff; }
724
+ .diff-content .hljs-symbol { color: #ffa657; }
725
+ .diff-content .hljs-code { color: #9ca3af; }
726
+ .diff-content .hljs-formula { color: #9ca3af; }
727
+ .diff-content .hljs-quote { color: #7ee787; }
728
+ .diff-content .hljs-selector-pseudo { color: #7ee787; }
729
+ .diff-content .hljs-subst { color: #c9d1d9; }
730
+ .diff-content .hljs-section { color: #58a6ff; font-weight: 700; }
731
+ .diff-content .hljs-bullet { color: #f2cc60; }
732
+ .diff-content .hljs-emphasis { color: #c9d1d9; font-style: italic; }
733
+ .diff-content .hljs-strong { color: #c9d1d9; font-weight: 700; }
734
+ .diff-content .hljs-addition { color: #aff5b4; background-color: #033a16; }
735
+ .diff-content .hljs-deletion { color: #ffdcd7; background-color: #67060c; }
736
+ /* Additional token types for diffs */
737
+ .diff-content .hljs-link { color: #58a6ff; }
738
+ .diff-content .hljs-char { color: #a5d6ff; }
739
+ .diff-content .hljs-char.escape_ { color: #79c0ff; }
740
+ .diff-content .hljs-tag .hljs-name { color: #7ee787; }
741
+ .diff-content .hljs-tag .hljs-attr { color: #79c0ff; }
742
+ .diff-content .hljs-tag .hljs-string { color: #a5d6ff; }
743
+ .diff-content .hljs-meta .hljs-string { color: #a5d6ff; }
744
+ .diff-content .hljs-meta .hljs-keyword { color: #ff7b72; }
745
+
746
+ /* Global syntax highlighting for code editor and other contexts - bright colors for dark bg */
747
+ /* Base color for all hljs elements - ensures nothing is invisible */
748
+ .code-editor-backdrop .hljs,
749
+ .code-editor-backdrop code.hljs,
750
+ .code-editor-backdrop pre code.hljs,
751
+ .code-editor-backdrop code {
752
+ color: #e5e7eb !important;
753
+ background: transparent !important;
754
+ }
755
+
756
+ /* Ensure unclassified spans and text nodes inherit the visible color */
757
+ .code-editor-backdrop .hljs span:not([class]),
758
+ .code-editor-backdrop code span:not([class]),
759
+ #code-editor-highlight span:not([class]) {
760
+ color: inherit;
761
+ }
762
+
763
+ .code-editor-backdrop .hljs-keyword { color: #ff79c6; }
764
+ .code-editor-backdrop .hljs-string { color: #a5d6ff; }
765
+ .code-editor-backdrop .hljs-number { color: #bd93f9; }
766
+ .code-editor-backdrop .hljs-comment { color: #9ca3af; font-style: italic; }
767
+ .code-editor-backdrop .hljs-function { color: #50fa7b; }
768
+ .code-editor-backdrop .hljs-class { color: #8be9fd; }
769
+ .code-editor-backdrop .hljs-variable { color: #f8f8f2; }
770
+ .code-editor-backdrop .hljs-operator { color: #79c0ff; }
771
+ .code-editor-backdrop .hljs-punctuation { color: #e5e7eb; }
772
+ .code-editor-backdrop .hljs-property { color: #79c0ff; }
773
+ .code-editor-backdrop .hljs-attr { color: #7ee787; }
774
+ .code-editor-backdrop .hljs-tag { color: #ff79c6; }
775
+ .code-editor-backdrop .hljs-name { color: #7ee787; }
776
+ .code-editor-backdrop .hljs-attribute { color: #79c0ff; }
777
+ .code-editor-backdrop .hljs-built_in { color: #ffa657; }
778
+ .code-editor-backdrop .hljs-type { color: #ff7b72; }
779
+ .code-editor-backdrop .hljs-params { color: #ffb86c; }
780
+ .code-editor-backdrop .hljs-literal { color: #79c0ff; }
781
+ .code-editor-backdrop .hljs-meta { color: #9ca3af; }
782
+ .code-editor-backdrop .hljs-title { color: #d2a8ff; }
783
+ .code-editor-backdrop .hljs-title.function_ { color: #d2a8ff; }
784
+ .code-editor-backdrop .hljs-title.class_ { color: #ffa657; }
785
+ .code-editor-backdrop .hljs-doctag { color: #ff7b72; }
786
+ .code-editor-backdrop .hljs-template-tag { color: #ff7b72; }
787
+ .code-editor-backdrop .hljs-template-variable { color: #ff7b72; }
788
+ .code-editor-backdrop .hljs-variable.language_ { color: #ff7b72; }
789
+ .code-editor-backdrop .hljs-selector-attr { color: #79c0ff; }
790
+ .code-editor-backdrop .hljs-selector-class { color: #79c0ff; }
791
+ .code-editor-backdrop .hljs-selector-id { color: #79c0ff; }
792
+ .code-editor-backdrop .hljs-regexp { color: #a5d6ff; }
793
+ .code-editor-backdrop .hljs-symbol { color: #ffa657; }
794
+ .code-editor-backdrop .hljs-code { color: #9ca3af; }
795
+ .code-editor-backdrop .hljs-formula { color: #9ca3af; }
796
+ .code-editor-backdrop .hljs-quote { color: #7ee787; }
797
+ .code-editor-backdrop .hljs-selector-pseudo { color: #7ee787; }
798
+ .code-editor-backdrop .hljs-selector-tag { color: #7ee787; }
799
+ .code-editor-backdrop .hljs-subst { color: #c9d1d9; }
800
+ .code-editor-backdrop .hljs-section { color: #58a6ff; font-weight: 700; }
801
+ .code-editor-backdrop .hljs-bullet { color: #f2cc60; }
802
+ .code-editor-backdrop .hljs-emphasis { color: #c9d1d9; font-style: italic; }
803
+ .code-editor-backdrop .hljs-strong { color: #c9d1d9; font-weight: 700; }
804
+ .code-editor-backdrop .hljs-addition { color: #aff5b4; background-color: #033a16; }
805
+ .code-editor-backdrop .hljs-deletion { color: #ffdcd7; background-color: #67060c; }
806
+ /* Additional token types that might appear in various languages */
807
+ .code-editor-backdrop .hljs-link { color: #58a6ff; }
808
+ .code-editor-backdrop .hljs-char { color: #a5d6ff; }
809
+ .code-editor-backdrop .hljs-char.escape_ { color: #79c0ff; }
810
+ .code-editor-backdrop .hljs-tag .hljs-name { color: #7ee787; }
811
+ .code-editor-backdrop .hljs-tag .hljs-attr { color: #79c0ff; }
812
+ .code-editor-backdrop .hljs-tag .hljs-string { color: #a5d6ff; }
813
+ .code-editor-backdrop .hljs-meta .hljs-string { color: #a5d6ff; }
814
+ .code-editor-backdrop .hljs-meta .hljs-keyword { color: #ff7b72; }
815
+
816
+ /* Dim syntax colors slightly for unchanged lines */
817
+ .diff-line.diff-unchanged .diff-content .hljs-keyword,
818
+ .diff-line.diff-unchanged .diff-content .hljs-string,
819
+ .diff-line.diff-unchanged .diff-content .hljs-number,
820
+ .diff-line.diff-unchanged .diff-content .hljs-function,
821
+ .diff-line.diff-unchanged .diff-content .hljs-class,
822
+ .diff-line.diff-unchanged .diff-content .hljs-built_in,
823
+ .diff-line.diff-unchanged .diff-content .hljs-type,
824
+ .diff-line.diff-unchanged .diff-content .hljs-title {
825
+ opacity: 0.6;
826
+ }
827
+
828
+ /* Question messages */
829
+ .conversation-message.question {
830
+ background-color: #1e3a5f;
831
+ border-left: 3px solid #facc15;
832
+ }
833
+
834
+ .question-header {
835
+ display: flex;
836
+ align-items: center;
837
+ gap: 0.5rem;
838
+ margin-bottom: 0.5rem;
839
+ }
840
+
841
+ .question-header svg {
842
+ color: #facc15;
843
+ }
844
+
845
+ .question-label {
846
+ font-weight: 600;
847
+ color: #fde047;
848
+ font-size: 0.6875rem;
849
+ text-transform: uppercase;
850
+ letter-spacing: 0.05em;
851
+ }
852
+
853
+ .question-text {
854
+ color: #e5e7eb;
855
+ margin-bottom: 0.75rem;
856
+ }
857
+
858
+ .question-options {
859
+ display: flex;
860
+ flex-wrap: wrap;
861
+ gap: 0.5rem;
862
+ }
863
+
864
+ .question-option {
865
+ display: flex;
866
+ flex-direction: column;
867
+ align-items: flex-start;
868
+ padding: 0.5rem 0.75rem;
869
+ background-color: #374151;
870
+ border: 1px solid #4b5563;
871
+ border-radius: 0.375rem;
872
+ cursor: pointer;
873
+ transition: all 0.15s;
874
+ text-align: left;
875
+ }
876
+
877
+ .question-option:hover:not(:disabled) {
878
+ background-color: #4b5563;
879
+ border-color: #6b7280;
880
+ }
881
+
882
+ .question-option:disabled {
883
+ opacity: 0.5;
884
+ cursor: not-allowed;
885
+ }
886
+
887
+ .question-option.selected {
888
+ background-color: #7c3aed;
889
+ border-color: #8b5cf6;
890
+ opacity: 1;
891
+ }
892
+
893
+ .question-option .option-label {
894
+ font-weight: 500;
895
+ color: #e5e7eb;
896
+ }
897
+
898
+ .question-option .option-description {
899
+ font-size: 0.85em;
900
+ color: #9ca3af;
901
+ margin-top: 0.125rem;
902
+ }
903
+
904
+ .question-option.selected .option-label,
905
+ .question-option.selected .option-description {
906
+ color: #fff;
907
+ }
908
+
909
+ .question-option-other {
910
+ border-style: dashed;
911
+ }
912
+
913
+ .question-option-other:hover:not(:disabled) {
914
+ border-style: solid;
915
+ }
916
+
917
+ /* Permission messages */
918
+ .conversation-message.permission {
919
+ background-color: #422006;
920
+ border-left: 3px solid #f97316;
921
+ }
922
+
923
+ .permission-header {
924
+ display: flex;
925
+ align-items: center;
926
+ gap: 0.5rem;
927
+ margin-bottom: 0.5rem;
928
+ }
929
+
930
+ .permission-header svg {
931
+ color: #f97316;
932
+ }
933
+
934
+ .permission-label {
935
+ font-weight: 600;
936
+ color: #fb923c;
937
+ font-size: 0.6875rem;
938
+ text-transform: uppercase;
939
+ letter-spacing: 0.05em;
940
+ }
941
+
942
+ .permission-tool {
943
+ background-color: rgba(249, 115, 22, 0.2);
944
+ color: #fdba74;
945
+ padding: 0.125rem 0.5rem;
946
+ border-radius: 0.25rem;
947
+ font-size: 0.6875rem;
948
+ font-weight: 500;
949
+ }
950
+
951
+ .permission-action {
952
+ color: #e5e7eb;
953
+ margin-bottom: 0.5rem;
954
+ }
955
+
956
+ .permission-detail {
957
+ font-size: 0.9em;
958
+ margin-bottom: 0.25rem;
959
+ }
960
+
961
+ .permission-detail .detail-label {
962
+ color: #9ca3af;
963
+ }
964
+
965
+ .permission-detail code,
966
+ .permission-detail pre {
967
+ background-color: #1f2937;
968
+ padding: 0.125rem 0.375rem;
969
+ border-radius: 0.25rem;
970
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
971
+ color: #e5e7eb;
972
+ }
973
+
974
+ .permission-detail pre {
975
+ display: block;
976
+ margin-top: 0.25rem;
977
+ padding: 0.375rem;
978
+ white-space: pre-wrap;
979
+ word-break: break-all;
980
+ }
981
+
982
+ .permission-actions {
983
+ display: flex;
984
+ gap: 0.5rem;
985
+ margin-top: 0.75rem;
986
+ }
987
+
988
+ .permission-btn {
989
+ padding: 0.375rem 0.75rem;
990
+ border-radius: 0.25rem;
991
+ font-size: 0.9em;
992
+ font-weight: 500;
993
+ cursor: pointer;
994
+ transition: all 0.15s;
995
+ border: none;
996
+ }
997
+
998
+ .permission-btn.approve {
999
+ background-color: #166534;
1000
+ color: #86efac;
1001
+ }
1002
+
1003
+ .permission-btn.approve:hover:not(:disabled) {
1004
+ background-color: #15803d;
1005
+ }
1006
+
1007
+ .permission-btn.deny {
1008
+ background-color: #991b1b;
1009
+ color: #fca5a5;
1010
+ }
1011
+
1012
+ .permission-btn.deny:hover:not(:disabled) {
1013
+ background-color: #b91c1c;
1014
+ }
1015
+
1016
+ .permission-btn.always {
1017
+ background-color: #374151;
1018
+ color: #d1d5db;
1019
+ }
1020
+
1021
+ .permission-btn.always:hover:not(:disabled) {
1022
+ background-color: #4b5563;
1023
+ }
1024
+
1025
+ .permission-btn:disabled {
1026
+ opacity: 0.5;
1027
+ cursor: not-allowed;
1028
+ }
1029
+
1030
+ .permission-btn.selected {
1031
+ opacity: 1;
1032
+ ring: 2px solid white;
1033
+ }
1034
+
1035
+ /* Conversation history dropdown */
1036
+ #conversation-history-dropdown {
1037
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
1038
+ }
1039
+
1040
+ .conversation-history-item {
1041
+ padding: 0.5rem 0.75rem;
1042
+ border-radius: 0.25rem;
1043
+ cursor: pointer;
1044
+ transition: background-color 0.15s;
1045
+ margin-bottom: 0.25rem;
1046
+ }
1047
+
1048
+ .conversation-history-item:hover {
1049
+ background-color: #374151;
1050
+ }
1051
+
1052
+ .conversation-history-item.active {
1053
+ background-color: #4c1d95;
1054
+ border-left: 2px solid #a78bfa;
1055
+ }
1056
+
1057
+ .conversation-history-item .conv-row {
1058
+ display: flex;
1059
+ align-items: center;
1060
+ gap: 0.25rem;
1061
+ }
1062
+
1063
+ .conversation-history-item .conv-label {
1064
+ font-size: 0.75rem;
1065
+ color: #e5e7eb;
1066
+ white-space: nowrap;
1067
+ overflow: hidden;
1068
+ text-overflow: ellipsis;
1069
+ }
1070
+
1071
+ .conversation-history-item .btn-rename-conversation {
1072
+ opacity: 0;
1073
+ transition: opacity 0.15s;
1074
+ }
1075
+
1076
+ .conversation-history-item:hover .btn-rename-conversation {
1077
+ opacity: 1;
1078
+ }
1079
+
1080
+ /* File tree delete button */
1081
+ .file-tree-item .btn-delete-file {
1082
+ opacity: 0;
1083
+ padding: 2px;
1084
+ margin-left: auto;
1085
+ color: #9ca3af;
1086
+ transition: opacity 0.15s, color 0.15s;
1087
+ flex-shrink: 0;
1088
+ }
1089
+
1090
+ .file-tree-item:hover .btn-delete-file {
1091
+ opacity: 1;
1092
+ }
1093
+
1094
+ .file-tree-item .btn-delete-file:hover {
1095
+ color: #ef4444;
1096
+ }
1097
+
1098
+ .conversation-history-item .conv-meta {
1099
+ display: flex;
1100
+ gap: 0.5rem;
1101
+ margin-top: 0.125rem;
1102
+ }
1103
+
1104
+ .conversation-history-item .conv-date {
1105
+ font-size: 0.625rem;
1106
+ color: #6b7280;
1107
+ }
1108
+
1109
+ .conversation-history-item .conv-messages {
1110
+ font-size: 0.625rem;
1111
+ color: #6b7280;
1112
+ }
1113
+
1114
+ .conversation-history-item.active .conv-label {
1115
+ color: #fff;
1116
+ }
1117
+
1118
+ .conversation-history-item.active .conv-date,
1119
+ .conversation-history-item.active .conv-messages {
1120
+ color: #c4b5fd;
1121
+ }
1122
+
1123
+ /* Conversation toolbar */
1124
+ #conversation-toolbar {
1125
+ background-color: #1f2937;
1126
+ }
1127
+
1128
+ /* Project detail layout - ensure proper overflow handling */
1129
+ #project-detail {
1130
+ min-height: 0; /* Important for flex children to shrink properly */
1131
+ }
1132
+
1133
+ /* Conversation container - scrollable area */
1134
+ #conversation-container {
1135
+ min-height: 0; /* Important for flex children to shrink properly */
1136
+ }
1137
+
1138
+ /* Debug panel */
1139
+ #debug-panel {
1140
+ max-height: 300px;
1141
+ overflow: hidden;
1142
+ flex-direction: column;
1143
+ }
1144
+
1145
+ #debug-panel:not(.hidden) {
1146
+ display: flex;
1147
+ }
1148
+
1149
+ #debug-panel pre {
1150
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
1151
+ word-break: break-all;
1152
+ }
1153
+
1154
+ /* Toast notifications */
1155
+ .toast {
1156
+ padding: 0.75rem 1rem;
1157
+ border-radius: 0.5rem;
1158
+ background-color: #374151;
1159
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3);
1160
+ display: flex;
1161
+ align-items: center;
1162
+ gap: 0.5rem;
1163
+ animation: slide-in 0.2s ease-out;
1164
+ }
1165
+
1166
+ .toast.success {
1167
+ background-color: #065f46;
1168
+ }
1169
+
1170
+ .toast.error {
1171
+ background-color: #7f1d1d;
1172
+ }
1173
+
1174
+ .toast.info {
1175
+ background-color: #1e3a8a;
1176
+ }
1177
+
1178
+ @keyframes slide-in {
1179
+ from {
1180
+ transform: translateX(100%);
1181
+ opacity: 0;
1182
+ }
1183
+ to {
1184
+ transform: translateX(0);
1185
+ opacity: 1;
1186
+ }
1187
+ }
1188
+
1189
+ /* Scrollbar styling */
1190
+ ::-webkit-scrollbar {
1191
+ width: 8px;
1192
+ height: 8px;
1193
+ }
1194
+
1195
+ ::-webkit-scrollbar-track {
1196
+ background: #1f2937;
1197
+ }
1198
+
1199
+ ::-webkit-scrollbar-thumb {
1200
+ background: #4b5563;
1201
+ border-radius: 4px;
1202
+ }
1203
+
1204
+ ::-webkit-scrollbar-thumb:hover {
1205
+ background: #6b7280;
1206
+ }
1207
+
1208
+ /* Roadmap milestone */
1209
+ .roadmap-milestone {
1210
+ margin-bottom: 1.5rem;
1211
+ }
1212
+
1213
+ .roadmap-milestone h4 {
1214
+ font-weight: 600;
1215
+ color: #e5e7eb;
1216
+ margin-bottom: 0.5rem;
1217
+ }
1218
+
1219
+ .roadmap-task {
1220
+ display: flex;
1221
+ align-items: flex-start;
1222
+ gap: 0.5rem;
1223
+ padding: 0.25rem 0;
1224
+ }
1225
+
1226
+ .roadmap-task.completed {
1227
+ color: #6b7280;
1228
+ text-decoration: line-through;
1229
+ }
1230
+
1231
+ .roadmap-task .task-checkbox {
1232
+ margin-top: 0.125rem;
1233
+ }
1234
+
1235
+ /* Roadmap selection checkboxes */
1236
+ .roadmap-select-milestone,
1237
+ .roadmap-select-task {
1238
+ cursor: pointer;
1239
+ accent-color: #a855f7;
1240
+ }
1241
+
1242
+ .roadmap-select-milestone:disabled,
1243
+ .roadmap-select-task:disabled {
1244
+ opacity: 0.4;
1245
+ cursor: not-allowed;
1246
+ }
1247
+
1248
+ /* Running indicator animation */
1249
+ .running-indicator {
1250
+ display: inline-block;
1251
+ width: 8px;
1252
+ height: 8px;
1253
+ border-radius: 50%;
1254
+ background-color: #4ade80;
1255
+ animation: pulse 1.5s ease-in-out infinite;
1256
+ }
1257
+
1258
+ @keyframes pulse {
1259
+ 0%, 100% {
1260
+ opacity: 1;
1261
+ }
1262
+ 50% {
1263
+ opacity: 0.4;
1264
+ }
1265
+ }
1266
+
1267
+ /* Folder browser */
1268
+ .folder-browser {
1269
+ height: 300px;
1270
+ overflow-y: auto;
1271
+ background-color: #1f2937;
1272
+ border: 1px solid #374151;
1273
+ border-radius: 0.375rem;
1274
+ }
1275
+
1276
+ .folder-item {
1277
+ display: flex;
1278
+ align-items: center;
1279
+ gap: 0.5rem;
1280
+ padding: 0.375rem 0.75rem;
1281
+ cursor: pointer;
1282
+ transition: background-color 0.1s;
1283
+ }
1284
+
1285
+ .folder-item:hover {
1286
+ background-color: #374151;
1287
+ }
1288
+
1289
+ .folder-item .folder-icon {
1290
+ width: 1rem;
1291
+ height: 1rem;
1292
+ flex-shrink: 0;
1293
+ }
1294
+
1295
+ .folder-item .folder-name {
1296
+ white-space: nowrap;
1297
+ overflow: hidden;
1298
+ text-overflow: ellipsis;
1299
+ }
1300
+
1301
+ .folder-breadcrumb {
1302
+ display: flex;
1303
+ align-items: center;
1304
+ gap: 0.25rem;
1305
+ padding: 0.5rem;
1306
+ background-color: #1f2937;
1307
+ border-bottom: 1px solid #374151;
1308
+ font-size: 0.75rem;
1309
+ overflow-x: auto;
1310
+ }
1311
+
1312
+ .folder-breadcrumb-item {
1313
+ color: #9ca3af;
1314
+ cursor: pointer;
1315
+ white-space: nowrap;
1316
+ }
1317
+
1318
+ .folder-breadcrumb-item:hover {
1319
+ color: #e5e7eb;
1320
+ }
1321
+
1322
+ .folder-breadcrumb-separator {
1323
+ color: #6b7280;
1324
+ }
1325
+
1326
+ /* Textarea styling */
1327
+ .textarea-resizable {
1328
+ resize: vertical;
1329
+ min-height: 4rem;
1330
+ max-height: 50vh;
1331
+ overflow-y: auto;
1332
+ transition: border-color 0.15s ease-in-out;
1333
+ }
1334
+
1335
+ .textarea-resizable:focus {
1336
+ border-color: #a78bfa;
1337
+ outline: none;
1338
+ }
1339
+
1340
+ .textarea-auto-resize {
1341
+ resize: none;
1342
+ overflow-y: hidden;
1343
+ min-height: 2.5rem;
1344
+ max-height: 40vh;
1345
+ transition: height 0.1s ease-out, border-color 0.15s ease-in-out;
1346
+ }
1347
+
1348
+ .textarea-auto-resize:focus {
1349
+ border-color: #a78bfa;
1350
+ outline: none;
1351
+ }
1352
+
1353
+ .textarea-auto-resize.expanded {
1354
+ overflow-y: auto;
1355
+ }
1356
+
1357
+ /* Textarea container for resize handle styling */
1358
+ .textarea-container {
1359
+ position: relative;
1360
+ }
1361
+
1362
+ .textarea-container .resize-handle {
1363
+ position: absolute;
1364
+ bottom: 0;
1365
+ right: 0;
1366
+ width: 12px;
1367
+ height: 12px;
1368
+ cursor: ns-resize;
1369
+ opacity: 0.3;
1370
+ transition: opacity 0.15s;
1371
+ }
1372
+
1373
+ .textarea-container:hover .resize-handle {
1374
+ opacity: 0.6;
1375
+ }
1376
+
1377
+ /* Milestone expand/collapse */
1378
+ .milestone-chevron {
1379
+ transition: transform 0.2s ease-in-out;
1380
+ }
1381
+
1382
+ .milestone-chevron.rotate-90 {
1383
+ transform: rotate(90deg);
1384
+ }
1385
+
1386
+ .milestone-tasks {
1387
+ transition: all 0.2s ease-in-out;
1388
+ }
1389
+
1390
+ /* Loading button state */
1391
+ .btn-loading {
1392
+ position: relative;
1393
+ pointer-events: none;
1394
+ opacity: 0.7;
1395
+ }
1396
+
1397
+ .btn-loading::after {
1398
+ content: '';
1399
+ position: absolute;
1400
+ width: 12px;
1401
+ height: 12px;
1402
+ top: 50%;
1403
+ left: 50%;
1404
+ margin-left: -6px;
1405
+ margin-top: -6px;
1406
+ border: 2px solid transparent;
1407
+ border-top-color: currentColor;
1408
+ border-radius: 50%;
1409
+ animation: spin 0.6s linear infinite;
1410
+ }
1411
+
1412
+ /* Dismissable alerts */
1413
+ .alert {
1414
+ position: relative;
1415
+ padding: 0.75rem 2rem 0.75rem 0.75rem;
1416
+ border-radius: 0.5rem;
1417
+ margin-bottom: 0.5rem;
1418
+ }
1419
+
1420
+ .alert-error {
1421
+ background-color: rgba(239, 68, 68, 0.1);
1422
+ border: 1px solid rgba(239, 68, 68, 0.3);
1423
+ color: #fca5a5;
1424
+ }
1425
+
1426
+ .alert-warning {
1427
+ background-color: rgba(234, 179, 8, 0.1);
1428
+ border: 1px solid rgba(234, 179, 8, 0.3);
1429
+ color: #fde047;
1430
+ }
1431
+
1432
+ .alert-success {
1433
+ background-color: rgba(34, 197, 94, 0.1);
1434
+ border: 1px solid rgba(34, 197, 94, 0.3);
1435
+ color: #86efac;
1436
+ }
1437
+
1438
+ .alert-dismiss {
1439
+ position: absolute;
1440
+ top: 0.5rem;
1441
+ right: 0.5rem;
1442
+ padding: 0.25rem;
1443
+ cursor: pointer;
1444
+ opacity: 0.6;
1445
+ transition: opacity 0.15s;
1446
+ }
1447
+
1448
+ .alert-dismiss:hover {
1449
+ opacity: 1;
1450
+ }
1451
+
1452
+ /* Tabs styling */
1453
+ .tab-button {
1454
+ transition: all 0.15s ease-in-out;
1455
+ border-bottom-width: 2px;
1456
+ }
1457
+
1458
+ .tab-button:hover:not(.active) {
1459
+ color: #e5e7eb;
1460
+ background-color: rgba(255, 255, 255, 0.05);
1461
+ }
1462
+
1463
+ .tab-button.active {
1464
+ color: #fff;
1465
+ border-bottom-color: #a855f7;
1466
+ }
1467
+
1468
+ .tab-content.hidden {
1469
+ display: none;
1470
+ }
1471
+
1472
+ /* File browser tree */
1473
+ #file-browser-tree .file-tree-item {
1474
+ display: flex;
1475
+ align-items: center;
1476
+ gap: 0.375rem;
1477
+ padding: 0.25rem 0.5rem;
1478
+ cursor: pointer;
1479
+ border-radius: 0.25rem;
1480
+ transition: background-color 0.1s;
1481
+ white-space: nowrap;
1482
+ overflow: hidden;
1483
+ text-overflow: ellipsis;
1484
+ }
1485
+
1486
+ #file-browser-tree .file-tree-item:hover {
1487
+ background-color: #374151;
1488
+ }
1489
+
1490
+ #file-browser-tree .file-tree-item.selected {
1491
+ background-color: #4c1d95;
1492
+ }
1493
+
1494
+ #file-browser-tree .file-tree-item .tree-icon {
1495
+ width: 1rem;
1496
+ height: 1rem;
1497
+ flex-shrink: 0;
1498
+ }
1499
+
1500
+ #file-browser-tree .file-tree-item.directory .tree-icon {
1501
+ color: #fbbf24;
1502
+ }
1503
+
1504
+ #file-browser-tree .file-tree-item.file .tree-icon {
1505
+ color: #9ca3af;
1506
+ }
1507
+
1508
+ #file-browser-tree .file-tree-item.file.editable .tree-icon {
1509
+ color: #60a5fa;
1510
+ }
1511
+
1512
+ #file-browser-tree .file-tree-item .tree-name {
1513
+ flex: 1;
1514
+ overflow: hidden;
1515
+ text-overflow: ellipsis;
1516
+ }
1517
+
1518
+ #file-browser-tree .tree-children {
1519
+ padding-left: 1rem;
1520
+ }
1521
+
1522
+ #file-browser-tree .tree-chevron {
1523
+ width: 0.75rem;
1524
+ height: 0.75rem;
1525
+ flex-shrink: 0;
1526
+ color: #6b7280;
1527
+ transition: transform 0.15s;
1528
+ }
1529
+
1530
+ #file-browser-tree .tree-chevron.expanded {
1531
+ transform: rotate(90deg);
1532
+ }
1533
+
1534
+ /* File tabs */
1535
+ #open-file-tabs {
1536
+ min-height: 2rem;
1537
+ }
1538
+
1539
+ #open-file-tabs::-webkit-scrollbar {
1540
+ height: 4px;
1541
+ }
1542
+
1543
+ .file-tab {
1544
+ display: flex;
1545
+ align-items: center;
1546
+ gap: 0.5rem;
1547
+ padding: 0.375rem 0.75rem;
1548
+ border-right: 1px solid #374151;
1549
+ cursor: pointer;
1550
+ white-space: nowrap;
1551
+ transition: background-color 0.1s;
1552
+ font-size: 0.9em;
1553
+ }
1554
+
1555
+ .file-tab:hover {
1556
+ background-color: #374151;
1557
+ }
1558
+
1559
+ .file-tab.active {
1560
+ background-color: #1f2937;
1561
+ border-bottom: 2px solid #a855f7;
1562
+ }
1563
+
1564
+ .file-tab .tab-name {
1565
+ max-width: 150px;
1566
+ overflow: hidden;
1567
+ text-overflow: ellipsis;
1568
+ }
1569
+
1570
+ .file-tab .tab-modified {
1571
+ width: 6px;
1572
+ height: 6px;
1573
+ border-radius: 50%;
1574
+ background-color: #fbbf24;
1575
+ }
1576
+
1577
+ .file-tab .tab-close {
1578
+ padding: 0.125rem;
1579
+ border-radius: 0.25rem;
1580
+ opacity: 0.6;
1581
+ transition: opacity 0.1s, background-color 0.1s;
1582
+ }
1583
+
1584
+ .file-tab:hover .tab-close {
1585
+ opacity: 1;
1586
+ }
1587
+
1588
+ .file-tab .tab-close:hover {
1589
+ background-color: rgba(239, 68, 68, 0.3);
1590
+ color: #f87171;
1591
+ }
1592
+
1593
+ /* File editor with syntax highlighting */
1594
+ .code-editor-container {
1595
+ position: relative;
1596
+ height: 100%;
1597
+ overflow: hidden;
1598
+ }
1599
+
1600
+ .code-editor-backdrop {
1601
+ position: absolute;
1602
+ top: 0;
1603
+ left: 0;
1604
+ right: 0;
1605
+ bottom: 0;
1606
+ overflow: auto;
1607
+ padding: 0.75rem;
1608
+ margin: 0;
1609
+ white-space: pre-wrap;
1610
+ word-wrap: break-word;
1611
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
1612
+ font-size: inherit;
1613
+ line-height: 1.5;
1614
+ tab-size: 2;
1615
+ color: transparent;
1616
+ background: transparent;
1617
+ border: none;
1618
+ pointer-events: none;
1619
+ }
1620
+
1621
+ .code-editor-backdrop code,
1622
+ #code-editor-highlight {
1623
+ font-family: inherit;
1624
+ font-size: inherit;
1625
+ line-height: inherit;
1626
+ background: none !important;
1627
+ padding: 0;
1628
+ color: #e5e7eb;
1629
+ }
1630
+
1631
+ /* Override the highlight.js base colors for our editor backdrop */
1632
+ .code-editor-backdrop code.hljs,
1633
+ #code-editor-highlight.hljs {
1634
+ color: #e5e7eb !important;
1635
+ background: none !important;
1636
+ }
1637
+
1638
+ /* Ensure all text inside code blocks is visible - fallback for unclassified tokens */
1639
+ .code-editor-backdrop code,
1640
+ .code-editor-backdrop code span:not([class]),
1641
+ .code-editor-backdrop code span:not([class*="hljs-"]),
1642
+ #code-editor-highlight,
1643
+ #code-editor-highlight span:not([class]),
1644
+ #code-editor-highlight span:not([class*="hljs-"]) {
1645
+ color: #e5e7eb;
1646
+ }
1647
+
1648
+ .code-editor-textarea {
1649
+ position: absolute;
1650
+ top: 0;
1651
+ left: 0;
1652
+ width: 100%;
1653
+ height: 100%;
1654
+ padding: 0.75rem;
1655
+ margin: 0;
1656
+ border: none;
1657
+ resize: none;
1658
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
1659
+ font-size: inherit;
1660
+ line-height: 1.5;
1661
+ tab-size: 2;
1662
+ color: #e5e7eb;
1663
+ background: transparent;
1664
+ caret-color: #fff;
1665
+ white-space: pre-wrap;
1666
+ word-wrap: break-word;
1667
+ overflow: auto;
1668
+ }
1669
+
1670
+ .code-editor-textarea:focus {
1671
+ outline: none;
1672
+ }
1673
+
1674
+ /* Sync scrolling between backdrop and textarea */
1675
+ .code-editor-container.highlighting .code-editor-textarea {
1676
+ color: transparent;
1677
+ }
1678
+
1679
+ .code-editor-container:not(.highlighting) .code-editor-backdrop {
1680
+ display: none;
1681
+ }
1682
+
1683
+ /* Legacy fallback */
1684
+ #file-editor-textarea {
1685
+ line-height: 1.5;
1686
+ tab-size: 2;
1687
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
1688
+ }
1689
+
1690
+ #file-editor-textarea:focus {
1691
+ outline: none;
1692
+ }
1693
+
1694
+ /* Responsive adjustments */
1695
+ @media (max-width: 768px) {
1696
+ #sidebar {
1697
+ position: fixed;
1698
+ left: -100%;
1699
+ z-index: 30;
1700
+ transition: left 0.3s ease-in-out;
1701
+ width: 80%;
1702
+ max-width: 300px;
1703
+ }
1704
+
1705
+ #sidebar.open {
1706
+ left: 0;
1707
+ }
1708
+
1709
+ /* Add mobile menu toggle button */
1710
+ .mobile-menu-overlay {
1711
+ position: fixed;
1712
+ inset: 0;
1713
+ background-color: rgba(0, 0, 0, 0.5);
1714
+ z-index: 20;
1715
+ display: none;
1716
+ }
1717
+
1718
+ .mobile-menu-overlay.active {
1719
+ display: block;
1720
+ }
1721
+
1722
+ /* Adjust modal sizes for mobile */
1723
+ .modal-content > div {
1724
+ max-width: 95%;
1725
+ max-height: 90vh;
1726
+ }
1727
+
1728
+ /* Stack buttons vertically on small screens */
1729
+ .btn-group-responsive {
1730
+ flex-direction: column;
1731
+ }
1732
+
1733
+ .btn-group-responsive > * {
1734
+ width: 100%;
1735
+ }
1736
+ }
1737
+
1738
+ /* Debug log item styles */
1739
+ .debug-log-item {
1740
+ transition: background-color 0.15s ease-in-out;
1741
+ }
1742
+
1743
+ .debug-log-item:hover {
1744
+ background-color: rgba(55, 65, 81, 0.5);
1745
+ }
1746
+
1747
+ .debug-log-chevron {
1748
+ transition: transform 0.2s ease-in-out;
1749
+ }
1750
+
1751
+ .debug-log-chevron.rotate-180 {
1752
+ transform: rotate(180deg);
1753
+ }
1754
+
1755
+ .bg-gray-750 {
1756
+ background-color: rgba(55, 65, 81, 0.7);
1757
+ }
1758
+
1759
+ /* Image preview styles */
1760
+ .image-preview-item {
1761
+ position: relative;
1762
+ display: inline-block;
1763
+ max-width: 150px;
1764
+ border-radius: 0.375rem;
1765
+ overflow: hidden;
1766
+ border: 1px solid #4b5563;
1767
+ background-color: #1f2937;
1768
+ }
1769
+
1770
+ .image-preview-item img {
1771
+ max-width: 100%;
1772
+ max-height: 100px;
1773
+ object-fit: contain;
1774
+ display: block;
1775
+ }
1776
+
1777
+ .image-preview-item .image-preview-remove {
1778
+ position: absolute;
1779
+ top: 2px;
1780
+ right: 2px;
1781
+ width: 20px;
1782
+ height: 20px;
1783
+ background-color: rgba(0, 0, 0, 0.7);
1784
+ border-radius: 50%;
1785
+ display: flex;
1786
+ align-items: center;
1787
+ justify-content: center;
1788
+ cursor: pointer;
1789
+ color: #f87171;
1790
+ transition: background-color 0.15s;
1791
+ }
1792
+
1793
+ .image-preview-item .image-preview-remove:hover {
1794
+ background-color: rgba(239, 68, 68, 0.8);
1795
+ color: #fff;
1796
+ }
1797
+
1798
+ .image-preview-item .image-preview-size {
1799
+ position: absolute;
1800
+ bottom: 0;
1801
+ left: 0;
1802
+ right: 0;
1803
+ font-size: 0.625rem;
1804
+ background-color: rgba(0, 0, 0, 0.7);
1805
+ color: #9ca3af;
1806
+ padding: 2px 4px;
1807
+ text-align: center;
1808
+ }
1809
+
1810
+ /* Conversation image styles */
1811
+ .conversation-image {
1812
+ max-width: 300px;
1813
+ max-height: 200px;
1814
+ border-radius: 0.375rem;
1815
+ border: 1px solid #374151;
1816
+ margin: 0.5rem 0;
1817
+ cursor: pointer;
1818
+ transition: transform 0.15s;
1819
+ }
1820
+
1821
+ .conversation-image:hover {
1822
+ transform: scale(1.02);
1823
+ }
1824
+
1825
+ /* Image modal for full view */
1826
+ #image-modal {
1827
+ position: fixed;
1828
+ inset: 0;
1829
+ z-index: 50;
1830
+ display: flex;
1831
+ align-items: center;
1832
+ justify-content: center;
1833
+ background-color: rgba(0, 0, 0, 0.9);
1834
+ }
1835
+
1836
+ #image-modal.hidden {
1837
+ display: none;
1838
+ }
1839
+
1840
+ #image-modal img {
1841
+ max-width: 90vw;
1842
+ max-height: 90vh;
1843
+ object-fit: contain;
1844
+ }
1845
+
1846
+ @media (max-width: 480px) {
1847
+ /* Even smaller adjustments */
1848
+ html {
1849
+ font-size: 12px;
1850
+ }
1851
+
1852
+ .project-card {
1853
+ padding: 0.5rem;
1854
+ }
1855
+
1856
+ #project-detail header {
1857
+ flex-wrap: wrap;
1858
+ gap: 0.5rem;
1859
+ }
1860
+ }