solid_log-ui 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 (63) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +295 -0
  4. data/Rakefile +12 -0
  5. data/app/assets/javascripts/application.js +6 -0
  6. data/app/assets/javascripts/solid_log/checkbox_dropdown.js +171 -0
  7. data/app/assets/javascripts/solid_log/filter_state.js +138 -0
  8. data/app/assets/javascripts/solid_log/jump_to_live.js +119 -0
  9. data/app/assets/javascripts/solid_log/live_tail.js +476 -0
  10. data/app/assets/javascripts/solid_log/live_tail.js.bak +270 -0
  11. data/app/assets/javascripts/solid_log/log_filters.js +37 -0
  12. data/app/assets/javascripts/solid_log/stream_scroll.js +195 -0
  13. data/app/assets/javascripts/solid_log/timeline_histogram.js +162 -0
  14. data/app/assets/javascripts/solid_log/toast.js +50 -0
  15. data/app/assets/stylesheets/solid_log/application.css +1329 -0
  16. data/app/assets/stylesheets/solid_log/components.css +1506 -0
  17. data/app/assets/stylesheets/solid_log/mission_control.css +398 -0
  18. data/app/channels/solid_log/ui/application_cable/channel.rb +8 -0
  19. data/app/channels/solid_log/ui/application_cable/connection.rb +10 -0
  20. data/app/channels/solid_log/ui/log_stream_channel.rb +132 -0
  21. data/app/controllers/solid_log/ui/base_controller.rb +122 -0
  22. data/app/controllers/solid_log/ui/dashboard_controller.rb +32 -0
  23. data/app/controllers/solid_log/ui/entries_controller.rb +34 -0
  24. data/app/controllers/solid_log/ui/fields_controller.rb +57 -0
  25. data/app/controllers/solid_log/ui/streams_controller.rb +204 -0
  26. data/app/controllers/solid_log/ui/timelines_controller.rb +29 -0
  27. data/app/controllers/solid_log/ui/tokens_controller.rb +46 -0
  28. data/app/helpers/solid_log/ui/application_helper.rb +99 -0
  29. data/app/helpers/solid_log/ui/dashboard_helper.rb +46 -0
  30. data/app/helpers/solid_log/ui/entries_helper.rb +16 -0
  31. data/app/helpers/solid_log/ui/timeline_helper.rb +39 -0
  32. data/app/services/solid_log/ui/live_tail_broadcaster.rb +81 -0
  33. data/app/views/layouts/solid_log/ui/application.html.erb +53 -0
  34. data/app/views/solid_log/ui/dashboard/index.html.erb +178 -0
  35. data/app/views/solid_log/ui/entries/show.html.erb +132 -0
  36. data/app/views/solid_log/ui/fields/index.html.erb +133 -0
  37. data/app/views/solid_log/ui/shared/_checkbox_dropdown.html.erb +64 -0
  38. data/app/views/solid_log/ui/shared/_multiselect_filter.html.erb +37 -0
  39. data/app/views/solid_log/ui/shared/_toast.html.erb +7 -0
  40. data/app/views/solid_log/ui/shared/_toast_message.html.erb +30 -0
  41. data/app/views/solid_log/ui/streams/_filter_form.html.erb +207 -0
  42. data/app/views/solid_log/ui/streams/_footer.html.erb +37 -0
  43. data/app/views/solid_log/ui/streams/_log_entries.html.erb +5 -0
  44. data/app/views/solid_log/ui/streams/_log_row.html.erb +5 -0
  45. data/app/views/solid_log/ui/streams/_log_row_compact.html.erb +37 -0
  46. data/app/views/solid_log/ui/streams/_log_row_expanded.html.erb +67 -0
  47. data/app/views/solid_log/ui/streams/_log_stream_content.html.erb +8 -0
  48. data/app/views/solid_log/ui/streams/_timeline.html.erb +68 -0
  49. data/app/views/solid_log/ui/streams/index.html.erb +22 -0
  50. data/app/views/solid_log/ui/timelines/show_job.html.erb +78 -0
  51. data/app/views/solid_log/ui/timelines/show_request.html.erb +88 -0
  52. data/app/views/solid_log/ui/tokens/index.html.erb +95 -0
  53. data/app/views/solid_log/ui/tokens/new.html.erb +47 -0
  54. data/config/importmap.rb +15 -0
  55. data/config/routes.rb +27 -0
  56. data/lib/solid_log/ui/api_client.rb +117 -0
  57. data/lib/solid_log/ui/configuration.rb +99 -0
  58. data/lib/solid_log/ui/data_source.rb +146 -0
  59. data/lib/solid_log/ui/engine.rb +76 -0
  60. data/lib/solid_log/ui/version.rb +5 -0
  61. data/lib/solid_log/ui.rb +27 -0
  62. data/lib/solid_log-ui.rb +2 -0
  63. metadata +290 -0
@@ -0,0 +1,1329 @@
1
+ /* SolidLog - Mission Control Inspired Styles */
2
+
3
+ :root {
4
+ --color-primary: #2563eb;
5
+ --color-success: #10b981;
6
+ --color-warning: #f59e0b;
7
+ --color-danger: #ef4444;
8
+ --color-info: #3b82f6;
9
+
10
+ --color-gray-50: #f9fafb;
11
+ --color-gray-100: #f3f4f6;
12
+ --color-gray-200: #e5e7eb;
13
+ --color-gray-300: #d1d5db;
14
+ --color-gray-700: #374151;
15
+ --color-gray-800: #1f2937;
16
+ --color-gray-900: #111827;
17
+
18
+ --spacing-sm: 0.5rem;
19
+ --spacing-md: 1rem;
20
+ --spacing-lg: 1.5rem;
21
+ --spacing-xl: 2rem;
22
+
23
+ --border-radius: 0.375rem;
24
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
25
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
26
+ }
27
+
28
+ body {
29
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
30
+ font-size: 14px;
31
+ line-height: 1.5;
32
+ color: var(--color-gray-900);
33
+ background: var(--color-gray-50);
34
+ margin: 0;
35
+ padding: 0;
36
+ display: flex;
37
+ flex-direction: column;
38
+ min-height: 100vh;
39
+ }
40
+
41
+ /* Navigation */
42
+ .top-nav {
43
+ background: white;
44
+ border-bottom: 1px solid var(--color-gray-200);
45
+ padding: 0 var(--spacing-xl);
46
+ display: flex;
47
+ align-items: center;
48
+ gap: var(--spacing-xl);
49
+ height: 60px;
50
+ }
51
+
52
+ .nav-brand {
53
+ font-size: 1.25rem;
54
+ }
55
+
56
+ .brand-link {
57
+ color: var(--color-gray-900);
58
+ text-decoration: none;
59
+ }
60
+
61
+ .brand-link:hover {
62
+ color: var(--color-primary);
63
+ }
64
+
65
+ .nav-links {
66
+ display: flex;
67
+ gap: var(--spacing-md);
68
+ }
69
+
70
+ .nav-link {
71
+ padding: 0.5rem 1rem;
72
+ color: var(--color-gray-700);
73
+ text-decoration: none;
74
+ font-weight: 500;
75
+ border-radius: var(--border-radius);
76
+ transition: all 0.15s ease;
77
+ }
78
+
79
+ .nav-link:hover {
80
+ background: var(--color-gray-100);
81
+ color: var(--color-gray-900);
82
+ }
83
+
84
+ .nav-link.active {
85
+ background: var(--color-primary);
86
+ color: white;
87
+ }
88
+
89
+ /* Main Content */
90
+ .main-content {
91
+ flex: 1;
92
+ }
93
+
94
+ /* Footer */
95
+ .footer {
96
+ background: white;
97
+ border-top: 1px solid var(--color-gray-200);
98
+ position: sticky;
99
+ bottom: 0;
100
+ z-index: 100;
101
+ width: 100%;
102
+ }
103
+
104
+ .footer-content {
105
+ font-size: 0.75rem;
106
+ color: var(--color-gray-700);
107
+ padding: var(--spacing-md) var(--spacing-xl);
108
+ text-align: center;
109
+ }
110
+
111
+ /* Page Header */
112
+ .page-header {
113
+ padding: var(--spacing-xl);
114
+ background: white;
115
+ border-bottom: 1px solid var(--color-gray-200);
116
+ margin-bottom: var(--spacing-lg);
117
+ display: flex;
118
+ justify-content: space-between;
119
+ align-items: center;
120
+ }
121
+
122
+ .page-header h1 {
123
+ margin: 0;
124
+ font-size: 1.875rem;
125
+ font-weight: 700;
126
+ color: var(--color-gray-900);
127
+ }
128
+
129
+ .page-header .subtitle {
130
+ margin: 0.25rem 0 0;
131
+ color: var(--color-gray-700);
132
+ font-size: 0.875rem;
133
+ }
134
+
135
+ .page-actions {
136
+ display: flex;
137
+ gap: var(--spacing-sm);
138
+ }
139
+
140
+ /* Dashboard */
141
+ .dashboard {
142
+ max-width: 1400px;
143
+ margin: 0 auto;
144
+ padding: var(--spacing-xl);
145
+ }
146
+
147
+ .stats-grid {
148
+ display: grid;
149
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
150
+ gap: var(--spacing-lg);
151
+ margin-bottom: var(--spacing-xl);
152
+ }
153
+
154
+ .stat-card {
155
+ background: white;
156
+ border-radius: var(--border-radius);
157
+ padding: var(--spacing-lg);
158
+ box-shadow: var(--shadow-sm);
159
+ border: 1px solid var(--color-gray-200);
160
+ }
161
+
162
+ .stat-label {
163
+ font-size: 0.875rem;
164
+ color: var(--color-gray-700);
165
+ font-weight: 500;
166
+ margin-bottom: var(--spacing-sm);
167
+ }
168
+
169
+ .stat-value {
170
+ font-size: 2rem;
171
+ font-weight: 700;
172
+ color: var(--color-gray-900);
173
+ margin-bottom: var(--spacing-sm);
174
+ }
175
+
176
+ .stat-value.error-count {
177
+ color: var(--color-danger);
178
+ }
179
+
180
+ .stat-footer {
181
+ font-size: 0.75rem;
182
+ color: var(--color-gray-700);
183
+ }
184
+
185
+ .stat-link {
186
+ color: var(--color-primary);
187
+ text-decoration: none;
188
+ }
189
+
190
+ .stat-link:hover {
191
+ text-decoration: underline;
192
+ }
193
+
194
+ /* Dashboard Row */
195
+ .dashboard-row {
196
+ display: grid;
197
+ grid-template-columns: repeat(12, 1fr);
198
+ gap: var(--spacing-lg);
199
+ }
200
+
201
+ .dashboard-col-8 {
202
+ grid-column: span 8;
203
+ }
204
+
205
+ .dashboard-col-4 {
206
+ grid-column: span 4;
207
+ }
208
+
209
+ @media (max-width: 768px) {
210
+ .dashboard-col-8,
211
+ .dashboard-col-4 {
212
+ grid-column: span 12;
213
+ }
214
+ }
215
+
216
+ /* Card */
217
+ .card {
218
+ background: white;
219
+ border-radius: var(--border-radius);
220
+ box-shadow: var(--shadow-sm);
221
+ border: 1px solid var(--color-gray-200);
222
+ overflow: hidden;
223
+ }
224
+
225
+ .card-header {
226
+ padding: var(--spacing-md) var(--spacing-lg);
227
+ border-bottom: 1px solid var(--color-gray-200);
228
+ background: var(--color-gray-50);
229
+ }
230
+
231
+ .card-header h2 {
232
+ margin: 0;
233
+ font-size: 1.125rem;
234
+ font-weight: 600;
235
+ color: var(--color-gray-900);
236
+ }
237
+
238
+ .card-body {
239
+ padding: var(--spacing-lg);
240
+ }
241
+
242
+ .empty-state {
243
+ text-align: center;
244
+ padding: var(--spacing-xl);
245
+ color: var(--color-gray-700);
246
+ }
247
+
248
+ /* Log Items */
249
+ .log-list {
250
+ display: flex;
251
+ flex-direction: column;
252
+ gap: var(--spacing-md);
253
+ }
254
+
255
+ .log-item {
256
+ padding: var(--spacing-md);
257
+ border: 1px solid var(--color-gray-200);
258
+ border-radius: var(--border-radius);
259
+ background: var(--color-gray-50);
260
+ }
261
+
262
+ .log-item-header {
263
+ display: flex;
264
+ align-items: center;
265
+ gap: var(--spacing-sm);
266
+ margin-bottom: var(--spacing-sm);
267
+ }
268
+
269
+ .log-time {
270
+ font-size: 0.75rem;
271
+ color: var(--color-gray-700);
272
+ }
273
+
274
+ .log-message {
275
+ font-size: 0.875rem;
276
+ color: var(--color-gray-900);
277
+ margin-bottom: var(--spacing-sm);
278
+ }
279
+
280
+ .log-message a {
281
+ color: var(--color-gray-900);
282
+ text-decoration: none;
283
+ }
284
+
285
+ .log-message a:hover {
286
+ color: var(--color-primary);
287
+ }
288
+
289
+ .log-meta {
290
+ font-size: 0.75rem;
291
+ color: var(--color-gray-700);
292
+ }
293
+
294
+ /* Distribution */
295
+ .distribution-list {
296
+ display: flex;
297
+ flex-direction: column;
298
+ gap: var(--spacing-md);
299
+ }
300
+
301
+ .distribution-item {
302
+ display: flex;
303
+ flex-direction: column;
304
+ gap: 0.25rem;
305
+ }
306
+
307
+ .distribution-header {
308
+ display: flex;
309
+ justify-content: space-between;
310
+ align-items: center;
311
+ }
312
+
313
+ .distribution-count {
314
+ font-weight: 600;
315
+ color: var(--color-gray-900);
316
+ }
317
+
318
+ .distribution-bar-container {
319
+ height: 8px;
320
+ background: var(--color-gray-200);
321
+ border-radius: 4px;
322
+ overflow: hidden;
323
+ }
324
+
325
+ .distribution-bar {
326
+ height: 100%;
327
+ background: var(--color-primary);
328
+ transition: width 0.3s ease;
329
+ }
330
+
331
+ .distribution-percentage {
332
+ font-size: 0.75rem;
333
+ color: var(--color-gray-700);
334
+ text-align: right;
335
+ }
336
+
337
+ /* Quick Stats */
338
+ .quick-stats {
339
+ display: flex;
340
+ flex-direction: column;
341
+ gap: var(--spacing-md);
342
+ }
343
+
344
+ .quick-stat {
345
+ display: flex;
346
+ justify-content: space-between;
347
+ padding: var(--spacing-sm) 0;
348
+ border-bottom: 1px solid var(--color-gray-200);
349
+ }
350
+
351
+ .quick-stat:last-child {
352
+ border-bottom: none;
353
+ }
354
+
355
+ .quick-stat-label {
356
+ font-size: 0.875rem;
357
+ color: var(--color-gray-700);
358
+ }
359
+
360
+ .quick-stat-value {
361
+ font-size: 0.875rem;
362
+ font-weight: 600;
363
+ color: var(--color-gray-900);
364
+ }
365
+
366
+ /* Recommendations */
367
+ .recommendation-list {
368
+ display: flex;
369
+ flex-direction: column;
370
+ gap: var(--spacing-md);
371
+ }
372
+
373
+ .recommendation-item {
374
+ padding: var(--spacing-md);
375
+ background: var(--color-gray-50);
376
+ border: 1px solid var(--color-gray-200);
377
+ border-radius: var(--border-radius);
378
+ }
379
+
380
+ .recommendation-header {
381
+ display: flex;
382
+ justify-content: space-between;
383
+ align-items: center;
384
+ margin-bottom: var(--spacing-sm);
385
+ }
386
+
387
+ .recommendation-header code {
388
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace;
389
+ font-size: 0.875rem;
390
+ font-weight: 600;
391
+ }
392
+
393
+ .recommendation-meta {
394
+ font-size: 0.8125rem;
395
+ color: var(--color-gray-600);
396
+ margin-bottom: var(--spacing-sm);
397
+ }
398
+
399
+ .recommendation-action {
400
+ font-size: 0.875rem;
401
+ color: var(--color-gray-700);
402
+ line-height: 1.5;
403
+ }
404
+
405
+ /* Component Styles */
406
+
407
+ /* Badges */
408
+ .badge {
409
+ display: inline-block;
410
+ padding: 0.25rem 0.5rem;
411
+ font-size: 0.75rem;
412
+ font-weight: 600;
413
+ line-height: 1;
414
+ border-radius: 0.25rem;
415
+ text-transform: uppercase;
416
+ }
417
+
418
+ .badge-blue {
419
+ background: #dbeafe;
420
+ color: #1e40af;
421
+ }
422
+
423
+ .badge-gray {
424
+ background: #f3f4f6;
425
+ color: #4b5563;
426
+ }
427
+
428
+ .badge-yellow {
429
+ background: #fef3c7;
430
+ color: #92400e;
431
+ }
432
+
433
+ .badge-red {
434
+ background: #fee2e2;
435
+ color: #991b1b;
436
+ }
437
+
438
+ .badge-dark-red {
439
+ background: #7f1d1d;
440
+ color: #fecaca;
441
+ }
442
+
443
+ .badge-success {
444
+ background: #d1fae5;
445
+ color: #065f46;
446
+ }
447
+
448
+ .badge-info {
449
+ background: #dbeafe;
450
+ color: #1e40af;
451
+ }
452
+
453
+ .badge-warning {
454
+ background: #fef3c7;
455
+ color: #92400e;
456
+ }
457
+
458
+ .badge-danger {
459
+ background: #fee2e2;
460
+ color: #991b1b;
461
+ }
462
+
463
+ .badge-secondary {
464
+ background: #f3f4f6;
465
+ color: #6b7280;
466
+ }
467
+
468
+ /* Log level badges */
469
+ .badge-debug {
470
+ background: #f3f4f6;
471
+ color: #4b5563;
472
+ }
473
+
474
+ .badge-error {
475
+ background: #fee2e2;
476
+ color: #991b1b;
477
+ }
478
+
479
+ .badge-fatal {
480
+ background: #7f1d1d;
481
+ color: #fecaca;
482
+ }
483
+
484
+ .badge-default {
485
+ background: #f3f4f6;
486
+ color: #6b7280;
487
+ }
488
+
489
+ /* Buttons */
490
+ .btn {
491
+ display: inline-block;
492
+ padding: 0.5rem 1rem;
493
+ font-size: 0.875rem;
494
+ font-weight: 500;
495
+ line-height: 1.5;
496
+ text-align: center;
497
+ text-decoration: none;
498
+ border: 1px solid transparent;
499
+ border-radius: var(--border-radius);
500
+ cursor: pointer;
501
+ transition: all 0.15s ease;
502
+ }
503
+
504
+ .btn-primary {
505
+ background: var(--color-primary);
506
+ color: white;
507
+ border-color: var(--color-primary);
508
+ }
509
+
510
+ .btn-primary:hover {
511
+ background: #1d4ed8;
512
+ border-color: #1d4ed8;
513
+ }
514
+
515
+ .btn-secondary {
516
+ background: white;
517
+ color: var(--color-gray-700);
518
+ border-color: var(--color-gray-300);
519
+ }
520
+
521
+ .btn-secondary:hover {
522
+ background: var(--color-gray-50);
523
+ }
524
+
525
+ .btn-block {
526
+ display: block;
527
+ width: 100%;
528
+ box-sizing: border-box;
529
+ }
530
+
531
+ .btn-link {
532
+ color: var(--color-primary);
533
+ text-decoration: none;
534
+ font-size: 0.875rem;
535
+ }
536
+
537
+ .btn-link:hover {
538
+ text-decoration: underline;
539
+ }
540
+
541
+ /* Forms */
542
+ .form-input,
543
+ .form-select {
544
+ width: 100%;
545
+ padding: 0.5rem 0.75rem;
546
+ font-size: 0.875rem;
547
+ line-height: 1.5;
548
+ color: var(--color-gray-900);
549
+ background: white;
550
+ border: 1px solid var(--color-gray-300);
551
+ border-radius: var(--border-radius);
552
+ box-sizing: border-box;
553
+ }
554
+
555
+ .form-input:focus,
556
+ .form-select:focus {
557
+ outline: none;
558
+ border-color: var(--color-primary);
559
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
560
+ }
561
+
562
+ .form-input-small {
563
+ font-size: 0.8125rem;
564
+ padding: 0.375rem 0.625rem;
565
+ }
566
+
567
+ /* Checkbox */
568
+ .checkbox-item {
569
+ display: flex;
570
+ align-items: center;
571
+ gap: 0.5rem;
572
+ padding: 0.25rem 0;
573
+ }
574
+
575
+ .checkbox-item input[type="checkbox"] {
576
+ width: 1rem;
577
+ height: 1rem;
578
+ cursor: pointer;
579
+ }
580
+
581
+ .checkbox-item label {
582
+ cursor: pointer;
583
+ margin: 0;
584
+ display: flex;
585
+ align-items: center;
586
+ }
587
+
588
+ /* Streams Page */
589
+ .streams-page {
590
+ display: flex;
591
+ flex-direction: column;
592
+ height: calc(100vh - 60px - 50px); /* viewport - nav - footer */
593
+ }
594
+
595
+ .streams-page .page-header {
596
+ margin-bottom: 0;
597
+ }
598
+
599
+ .streams-container {
600
+ display: grid;
601
+ grid-template-columns: 400px 1fr;
602
+ flex: 1;
603
+ overflow: hidden;
604
+ }
605
+
606
+ .streams-sidebar {
607
+ background: white;
608
+ border-right: 1px solid var(--color-gray-200);
609
+ overflow-y: auto;
610
+ }
611
+
612
+ .streams-main {
613
+ padding: var(--spacing-lg);
614
+ display: flex;
615
+ flex-direction: column;
616
+ overflow: hidden;
617
+ }
618
+
619
+ /* Filter Form */
620
+ .filter-form {
621
+ padding: var(--spacing-lg);
622
+ }
623
+
624
+ .filter-form h3 {
625
+ margin: 0 0 var(--spacing-lg) 0;
626
+ font-size: 1.125rem;
627
+ font-weight: 600;
628
+ }
629
+
630
+ .filters {
631
+ display: flex;
632
+ flex-direction: column;
633
+ gap: var(--spacing-lg);
634
+ }
635
+
636
+ .filter-group {
637
+ display: flex;
638
+ flex-direction: column;
639
+ gap: var(--spacing-sm);
640
+ }
641
+
642
+ .filter-group label {
643
+ font-size: 0.875rem;
644
+ font-weight: 500;
645
+ color: var(--color-gray-700);
646
+ }
647
+
648
+ .time-inputs {
649
+ display: flex;
650
+ flex-direction: column;
651
+ gap: var(--spacing-sm);
652
+ }
653
+
654
+ .filter-actions {
655
+ display: flex;
656
+ flex-direction: column;
657
+ gap: var(--spacing-sm);
658
+ padding-top: var(--spacing-md);
659
+ border-top: 1px solid var(--color-gray-200);
660
+ }
661
+
662
+ /* Streams Toolbar */
663
+ .streams-toolbar {
664
+ display: flex;
665
+ justify-content: space-between;
666
+ align-items: center;
667
+ padding: var(--spacing-md);
668
+ background: white;
669
+ border: 1px solid var(--color-gray-200);
670
+ border-radius: var(--border-radius);
671
+ margin-bottom: var(--spacing-lg);
672
+ }
673
+
674
+ .streams-count {
675
+ font-size: 0.875rem;
676
+ color: var(--color-gray-700);
677
+ }
678
+
679
+ .streams-actions {
680
+ display: flex;
681
+ gap: var(--spacing-sm);
682
+ }
683
+
684
+ #live-tail-toggle.active {
685
+ background: var(--color-success);
686
+ border-color: var(--color-success);
687
+ color: white;
688
+ }
689
+
690
+ #live-tail-toggle.active:hover {
691
+ background: #059669;
692
+ border-color: #059669;
693
+ }
694
+
695
+ /* Log Stream */
696
+ .log-stream {
697
+ display: flex;
698
+ flex-direction: column;
699
+ gap: var(--spacing-sm);
700
+ }
701
+
702
+ .log-row {
703
+ background: white;
704
+ border: 1px solid var(--color-gray-200);
705
+ border-radius: var(--border-radius);
706
+ padding: var(--spacing-md);
707
+ transition: box-shadow 0.15s ease;
708
+ }
709
+
710
+ .log-row:hover {
711
+ box-shadow: var(--shadow-md);
712
+ }
713
+
714
+ .log-row-header {
715
+ display: flex;
716
+ justify-content: space-between;
717
+ align-items: center;
718
+ margin-bottom: var(--spacing-sm);
719
+ }
720
+
721
+ .log-row-meta {
722
+ display: flex;
723
+ align-items: center;
724
+ gap: var(--spacing-sm);
725
+ flex-wrap: wrap;
726
+ }
727
+
728
+ .log-timestamp {
729
+ font-size: 0.8125rem;
730
+ color: var(--color-gray-700);
731
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace;
732
+ }
733
+
734
+ .log-app,
735
+ .log-env {
736
+ font-size: 0.75rem;
737
+ padding: 0.125rem 0.375rem;
738
+ background: var(--color-gray-100);
739
+ border-radius: 0.25rem;
740
+ color: var(--color-gray-700);
741
+ }
742
+
743
+ .log-row-content {
744
+ display: flex;
745
+ flex-direction: column;
746
+ gap: var(--spacing-sm);
747
+ }
748
+
749
+ .log-message {
750
+ font-size: 0.875rem;
751
+ line-height: 1.6;
752
+ color: var(--color-gray-900);
753
+ word-break: break-word;
754
+ }
755
+
756
+ .log-message mark {
757
+ background: #fef08a;
758
+ padding: 0.125rem 0.25rem;
759
+ border-radius: 0.125rem;
760
+ }
761
+
762
+ .log-details {
763
+ display: flex;
764
+ flex-wrap: wrap;
765
+ gap: var(--spacing-md);
766
+ font-size: 0.8125rem;
767
+ color: var(--color-gray-700);
768
+ }
769
+
770
+ .log-detail-item {
771
+ display: flex;
772
+ gap: 0.25rem;
773
+ }
774
+
775
+ .log-correlation {
776
+ display: flex;
777
+ gap: var(--spacing-sm);
778
+ font-size: 0.75rem;
779
+ }
780
+
781
+ .correlation-link {
782
+ color: var(--color-primary);
783
+ text-decoration: none;
784
+ padding: 0.25rem 0.5rem;
785
+ background: var(--color-gray-100);
786
+ border-radius: 0.25rem;
787
+ }
788
+
789
+ .correlation-link:hover {
790
+ background: var(--color-gray-200);
791
+ }
792
+
793
+ /* Entry Detail */
794
+ .entry-detail {
795
+ max-width: 1200px;
796
+ margin: 0 auto;
797
+ padding: var(--spacing-xl);
798
+ }
799
+
800
+ .entry-detail-content {
801
+ display: flex;
802
+ flex-direction: column;
803
+ gap: var(--spacing-lg);
804
+ }
805
+
806
+ .metadata-list {
807
+ display: grid;
808
+ grid-template-columns: 150px 1fr;
809
+ gap: var(--spacing-md);
810
+ }
811
+
812
+ .metadata-list dt {
813
+ font-weight: 600;
814
+ color: var(--color-gray-700);
815
+ }
816
+
817
+ .metadata-list dd {
818
+ margin: 0;
819
+ color: var(--color-gray-900);
820
+ }
821
+
822
+ .metadata-link {
823
+ color: var(--color-primary);
824
+ text-decoration: none;
825
+ font-size: 0.875rem;
826
+ margin-left: var(--spacing-sm);
827
+ }
828
+
829
+ .metadata-link:hover {
830
+ text-decoration: underline;
831
+ }
832
+
833
+ .log-message-full {
834
+ white-space: pre-wrap;
835
+ word-break: break-word;
836
+ margin: 0;
837
+ padding: var(--spacing-md);
838
+ background: var(--color-gray-50);
839
+ border-radius: var(--border-radius);
840
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace;
841
+ font-size: 0.875rem;
842
+ line-height: 1.6;
843
+ }
844
+
845
+ .json-display {
846
+ white-space: pre;
847
+ margin: 0;
848
+ padding: var(--spacing-md);
849
+ background: var(--color-gray-900);
850
+ color: #d4d4d4;
851
+ border-radius: var(--border-radius);
852
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace;
853
+ font-size: 0.8125rem;
854
+ line-height: 1.6;
855
+ overflow-x: auto;
856
+ }
857
+
858
+ /* Empty State */
859
+ .empty-state-large {
860
+ text-align: center;
861
+ padding: var(--spacing-xl) * 2;
862
+ }
863
+
864
+ .empty-state-large h2 {
865
+ font-size: 1.5rem;
866
+ margin: 0 0 var(--spacing-md) 0;
867
+ color: var(--color-gray-900);
868
+ }
869
+
870
+ .empty-state-large p {
871
+ color: var(--color-gray-700);
872
+ margin-bottom: var(--spacing-lg);
873
+ }
874
+
875
+ /* Timeline Styles */
876
+ .timeline-page {
877
+ max-width: 1200px;
878
+ margin: 0 auto;
879
+ padding: var(--spacing-xl);
880
+ }
881
+
882
+ .timeline-container {
883
+ display: flex;
884
+ flex-direction: column;
885
+ gap: var(--spacing-lg);
886
+ }
887
+
888
+ .timeline-stats {
889
+ display: flex;
890
+ gap: var(--spacing-lg);
891
+ flex-wrap: wrap;
892
+ padding: var(--spacing-md);
893
+ background: white;
894
+ border: 1px solid var(--color-gray-200);
895
+ border-radius: var(--border-radius);
896
+ }
897
+
898
+ .stat-inline {
899
+ display: flex;
900
+ align-items: center;
901
+ gap: var(--spacing-sm);
902
+ }
903
+
904
+ .stat-inline-label {
905
+ font-size: 0.875rem;
906
+ color: var(--color-gray-700);
907
+ }
908
+
909
+ .stat-inline-value {
910
+ font-size: 0.875rem;
911
+ font-weight: 600;
912
+ color: var(--color-gray-900);
913
+ }
914
+
915
+ .timeline-entries {
916
+ display: flex;
917
+ flex-direction: column;
918
+ }
919
+
920
+ .timeline-entry {
921
+ display: flex;
922
+ gap: var(--spacing-md);
923
+ }
924
+
925
+ .timeline-marker {
926
+ display: flex;
927
+ flex-direction: column;
928
+ align-items: center;
929
+ padding-top: 0.375rem;
930
+ }
931
+
932
+ .timeline-dot {
933
+ width: 12px;
934
+ height: 12px;
935
+ border-radius: 50%;
936
+ border: 2px solid white;
937
+ box-shadow: 0 0 0 2px var(--color-gray-300);
938
+ }
939
+
940
+ .timeline-dot.debug { box-shadow: 0 0 0 2px var(--color-gray-300); background: var(--color-gray-300); }
941
+ .timeline-dot.info { box-shadow: 0 0 0 2px var(--color-info); background: var(--color-info); }
942
+ .timeline-dot.warn { box-shadow: 0 0 0 2px var(--color-warning); background: var(--color-warning); }
943
+ .timeline-dot.error { box-shadow: 0 0 0 2px var(--color-danger); background: var(--color-danger); }
944
+ .timeline-dot.fatal { box-shadow: 0 0 0 2px #7f1d1d; background: #7f1d1d; }
945
+
946
+ .timeline-line {
947
+ width: 2px;
948
+ flex: 1;
949
+ background: var(--color-gray-200);
950
+ min-height: 40px;
951
+ }
952
+
953
+ .timeline-content {
954
+ flex: 1;
955
+ padding-bottom: var(--spacing-lg);
956
+ }
957
+
958
+ .timeline-header {
959
+ display: flex;
960
+ align-items: center;
961
+ gap: var(--spacing-sm);
962
+ margin-bottom: var(--spacing-sm);
963
+ }
964
+
965
+ .timeline-time {
966
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace;
967
+ font-size: 0.8125rem;
968
+ color: var(--color-gray-700);
969
+ font-weight: 500;
970
+ }
971
+
972
+ .timeline-delta {
973
+ color: var(--color-gray-600);
974
+ font-size: 0.75rem;
975
+ margin-left: 0.5rem;
976
+ }
977
+
978
+ .timeline-message {
979
+ font-size: 0.875rem;
980
+ line-height: 1.6;
981
+ color: var(--color-gray-900);
982
+ margin-bottom: var(--spacing-sm);
983
+ word-break: break-word;
984
+ }
985
+
986
+ .timeline-meta {
987
+ display: flex;
988
+ flex-wrap: wrap;
989
+ gap: var(--spacing-md);
990
+ font-size: 0.8125rem;
991
+ color: var(--color-gray-700);
992
+ margin-bottom: var(--spacing-sm);
993
+ }
994
+
995
+ .timeline-actions {
996
+ font-size: 0.875rem;
997
+ }
998
+
999
+ .timeline-details summary {
1000
+ cursor: pointer;
1001
+ font-size: 0.875rem;
1002
+ color: var(--color-primary);
1003
+ margin: var(--spacing-sm) 0;
1004
+ }
1005
+
1006
+ .json-display-small {
1007
+ font-size: 0.75rem;
1008
+ padding: var(--spacing-sm);
1009
+ margin: var(--spacing-sm) 0;
1010
+ }
1011
+
1012
+ /* Fields Page */
1013
+ .fields-page,
1014
+ .tokens-page {
1015
+ max-width: 1400px;
1016
+ margin: 0 auto;
1017
+ padding: var(--spacing-xl);
1018
+ }
1019
+
1020
+ .fields-container,
1021
+ .tokens-container {
1022
+ display: flex;
1023
+ flex-direction: column;
1024
+ gap: var(--spacing-lg);
1025
+ }
1026
+
1027
+ .fields-stats {
1028
+ display: flex;
1029
+ gap: var(--spacing-lg);
1030
+ flex-wrap: wrap;
1031
+ }
1032
+
1033
+ .stat-card-inline {
1034
+ background: white;
1035
+ border: 1px solid var(--color-gray-200);
1036
+ border-radius: var(--border-radius);
1037
+ padding: var(--spacing-md);
1038
+ min-width: 200px;
1039
+ }
1040
+
1041
+ .stat-card-inline .stat-label {
1042
+ font-size: 0.875rem;
1043
+ color: var(--color-gray-700);
1044
+ margin-bottom: 0.25rem;
1045
+ }
1046
+
1047
+ .stat-card-inline .stat-value {
1048
+ font-size: 1.5rem;
1049
+ font-weight: 700;
1050
+ color: var(--color-gray-900);
1051
+ }
1052
+
1053
+ .data-table {
1054
+ width: 100%;
1055
+ border-collapse: collapse;
1056
+ }
1057
+
1058
+ .data-table thead {
1059
+ background: var(--color-gray-50);
1060
+ border-bottom: 2px solid var(--color-gray-200);
1061
+ }
1062
+
1063
+ .data-table th {
1064
+ padding: 0.75rem 1rem;
1065
+ text-align: left;
1066
+ font-size: 0.875rem;
1067
+ font-weight: 600;
1068
+ color: var(--color-gray-700);
1069
+ }
1070
+
1071
+ .data-table td {
1072
+ padding: 0.75rem 1rem;
1073
+ font-size: 0.875rem;
1074
+ border-bottom: 1px solid var(--color-gray-200);
1075
+ }
1076
+
1077
+ .data-table tbody tr:hover {
1078
+ background: var(--color-gray-50);
1079
+ }
1080
+
1081
+ .field-promoted {
1082
+ background: #f0fdf4;
1083
+ }
1084
+
1085
+ .field-name code {
1086
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace;
1087
+ font-size: 0.8125rem;
1088
+ color: var(--color-gray-900);
1089
+ background: var(--color-gray-100);
1090
+ padding: 0.125rem 0.375rem;
1091
+ border-radius: 0.25rem;
1092
+ }
1093
+
1094
+ .text-right {
1095
+ text-align: right;
1096
+ }
1097
+
1098
+ .text-danger {
1099
+ color: var(--color-danger) !important;
1100
+ }
1101
+
1102
+ .text-muted {
1103
+ color: var(--color-gray-600);
1104
+ }
1105
+
1106
+ .table-actions {
1107
+ display: flex;
1108
+ gap: var(--spacing-sm);
1109
+ }
1110
+
1111
+ .btn-link-small {
1112
+ font-size: 0.8125rem;
1113
+ color: var(--color-primary);
1114
+ text-decoration: none;
1115
+ background: none;
1116
+ border: none;
1117
+ cursor: pointer;
1118
+ padding: 0.25rem 0.5rem;
1119
+ }
1120
+
1121
+ .btn-link-small:hover {
1122
+ text-decoration: underline;
1123
+ }
1124
+
1125
+ .field-help,
1126
+ .token-help,
1127
+ .info-card {
1128
+ background: var(--color-gray-50);
1129
+ border: 1px solid var(--color-gray-200);
1130
+ border-radius: var(--border-radius);
1131
+ padding: var(--spacing-lg);
1132
+ }
1133
+
1134
+ .field-help h3,
1135
+ .token-help h3,
1136
+ .info-card h3 {
1137
+ margin: 0 0 var(--spacing-md) 0;
1138
+ font-size: 1.125rem;
1139
+ font-weight: 600;
1140
+ }
1141
+
1142
+ .field-help p,
1143
+ .token-help p {
1144
+ margin-bottom: var(--spacing-sm);
1145
+ font-size: 0.875rem;
1146
+ line-height: 1.6;
1147
+ }
1148
+
1149
+ .field-help ol,
1150
+ .token-help ol,
1151
+ .field-help ul,
1152
+ .token-help ul {
1153
+ margin: var(--spacing-sm) 0 var(--spacing-md) var(--spacing-lg);
1154
+ font-size: 0.875rem;
1155
+ line-height: 1.6;
1156
+ }
1157
+
1158
+ .field-help ol li,
1159
+ .token-help ol li,
1160
+ .field-help ul li,
1161
+ .token-help ul li {
1162
+ margin-bottom: var(--spacing-xs);
1163
+ }
1164
+
1165
+ .field-help code,
1166
+ .token-help code {
1167
+ background: var(--color-gray-100);
1168
+ padding: 2px 6px;
1169
+ border-radius: 3px;
1170
+ font-size: 0.8125rem;
1171
+ }
1172
+
1173
+ /* Inline forms */
1174
+ .inline-form {
1175
+ display: inline-block;
1176
+ margin: 0;
1177
+ }
1178
+
1179
+ .form-select-small {
1180
+ padding: 4px 8px;
1181
+ font-size: 0.875rem;
1182
+ min-width: 120px;
1183
+ }
1184
+
1185
+ .form-hint {
1186
+ display: block;
1187
+ font-size: 0.75rem;
1188
+ color: var(--color-gray-600);
1189
+ margin-top: var(--spacing-xs);
1190
+ }
1191
+
1192
+ .code-example {
1193
+ background: var(--color-gray-900);
1194
+ color: #d4d4d4;
1195
+ padding: var(--spacing-md);
1196
+ border-radius: var(--border-radius);
1197
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace;
1198
+ font-size: 0.8125rem;
1199
+ overflow-x: auto;
1200
+ margin: var(--spacing-md) 0;
1201
+ }
1202
+
1203
+ /* Token Display */
1204
+ .alert {
1205
+ padding: var(--spacing-lg);
1206
+ border-radius: var(--border-radius);
1207
+ margin-bottom: var(--spacing-lg);
1208
+ }
1209
+
1210
+ .alert-success {
1211
+ background: #d1fae5;
1212
+ border: 1px solid #10b981;
1213
+ color: #065f46;
1214
+ }
1215
+
1216
+ .alert h3 {
1217
+ margin: 0 0 var(--spacing-sm) 0;
1218
+ font-size: 1.125rem;
1219
+ }
1220
+
1221
+ .alert p {
1222
+ margin: var(--spacing-sm) 0;
1223
+ font-size: 0.875rem;
1224
+ }
1225
+
1226
+ .token-display {
1227
+ display: flex;
1228
+ align-items: center;
1229
+ gap: var(--spacing-sm);
1230
+ padding: var(--spacing-md);
1231
+ background: white;
1232
+ border: 1px solid #10b981;
1233
+ border-radius: var(--border-radius);
1234
+ margin: var(--spacing-md) 0;
1235
+ }
1236
+
1237
+ .token-display code {
1238
+ flex: 1;
1239
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace;
1240
+ font-size: 0.875rem;
1241
+ word-break: break-all;
1242
+ }
1243
+
1244
+ .token-usage {
1245
+ font-size: 0.8125rem;
1246
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace;
1247
+ }
1248
+
1249
+ .btn-small {
1250
+ padding: 0.375rem 0.75rem;
1251
+ font-size: 0.8125rem;
1252
+ }
1253
+
1254
+ /* Form Styles */
1255
+ .form-container {
1256
+ max-width: 600px;
1257
+ margin: 0 auto;
1258
+ display: flex;
1259
+ flex-direction: column;
1260
+ gap: var(--spacing-lg);
1261
+ }
1262
+
1263
+ .form-group {
1264
+ margin-bottom: var(--spacing-md);
1265
+ }
1266
+
1267
+ .form-group label {
1268
+ display: block;
1269
+ font-size: 0.875rem;
1270
+ font-weight: 500;
1271
+ color: var(--color-gray-700);
1272
+ margin-bottom: var(--spacing-sm);
1273
+ }
1274
+
1275
+ .form-help {
1276
+ font-size: 0.8125rem;
1277
+ color: var(--color-gray-600);
1278
+ margin-top: 0.25rem;
1279
+ }
1280
+
1281
+ .form-actions {
1282
+ display: flex;
1283
+ gap: var(--spacing-sm);
1284
+ padding-top: var(--spacing-md);
1285
+ }
1286
+
1287
+ .info-card ul {
1288
+ margin: 0;
1289
+ padding-left: 1.5rem;
1290
+ }
1291
+
1292
+ .info-card li {
1293
+ font-size: 0.875rem;
1294
+ line-height: 1.6;
1295
+ margin-bottom: 0.5rem;
1296
+ }
1297
+
1298
+ .no-padding {
1299
+ padding: 0 !important;
1300
+ }
1301
+
1302
+ .table-responsive {
1303
+ overflow-x: auto;
1304
+ }
1305
+
1306
+ /* Responsive */
1307
+ @media (max-width: 768px) {
1308
+ .streams-container {
1309
+ grid-template-columns: 1fr;
1310
+ }
1311
+
1312
+ .streams-sidebar {
1313
+ border-right: none;
1314
+ border-bottom: 1px solid var(--color-gray-200);
1315
+ }
1316
+
1317
+ .metadata-list {
1318
+ grid-template-columns: 1fr;
1319
+ gap: var(--spacing-sm);
1320
+ }
1321
+
1322
+ .timeline-stats {
1323
+ flex-direction: column;
1324
+ }
1325
+
1326
+ .fields-stats {
1327
+ flex-direction: column;
1328
+ }
1329
+ }