tracebook 0.1.0 → 1.0.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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -27
  3. data/README.md +201 -754
  4. data/app/assets/javascripts/tracebook/application.js +92 -35
  5. data/app/assets/stylesheets/tracebook/application.css +1915 -50
  6. data/app/controllers/tracebook/application_controller.rb +25 -0
  7. data/app/controllers/tracebook/chats_controller.rb +229 -0
  8. data/app/controllers/tracebook/comments_controller.rb +25 -0
  9. data/app/helpers/tracebook/chats_helper.rb +29 -0
  10. data/app/models/tracebook/chat_review.rb +19 -0
  11. data/app/models/tracebook/comment.rb +14 -0
  12. data/app/models/tracebook/message_cost.rb +12 -0
  13. data/app/models/tracebook/pricing_rule.rb +6 -8
  14. data/app/views/tracebook/chats/index.html.erb +77 -0
  15. data/app/views/tracebook/chats/show.html.erb +94 -0
  16. data/config/routes.rb +7 -5
  17. data/db/migrate/20260325000100_create_tracebook_message_costs.rb +19 -0
  18. data/db/migrate/20260325000200_create_tracebook_chat_reviews.rb +19 -0
  19. data/db/migrate/{20241112000300_create_tracebook_pricing_rules.rb → 20260325000300_create_tracebook_pricing_rules.rb} +3 -3
  20. data/db/migrate/20260325000500_create_tracebook_comments.rb +15 -0
  21. data/lib/generators/tracebook/install/USAGE +10 -0
  22. data/lib/generators/tracebook/install/install_generator.rb +33 -0
  23. data/lib/generators/tracebook/install/templates/initializer.rb.tt +16 -0
  24. data/lib/tasks/tracebook_tasks.rake +14 -4
  25. data/lib/tracebook/adapters/ruby_llm.rb +19 -81
  26. data/lib/tracebook/adapters.rb +5 -4
  27. data/lib/tracebook/config.rb +85 -101
  28. data/lib/tracebook/engine.rb +6 -0
  29. data/lib/tracebook/errors.rb +0 -2
  30. data/lib/tracebook/pricing/calculator.rb +11 -6
  31. data/lib/tracebook/pricing.rb +0 -2
  32. data/lib/tracebook/redaction/pattern.rb +124 -0
  33. data/lib/tracebook/redaction/pipeline.rb +32 -0
  34. data/lib/tracebook/seeds/pricing_rules.rb +62 -0
  35. data/lib/tracebook/version.rb +1 -1
  36. data/lib/tracebook.rb +47 -152
  37. metadata +32 -43
  38. data/app/controllers/tracebook/exports_controller.rb +0 -25
  39. data/app/controllers/tracebook/interactions_controller.rb +0 -71
  40. data/app/helpers/tracebook/interactions_helper.rb +0 -35
  41. data/app/jobs/tracebook/daily_rollups_job.rb +0 -100
  42. data/app/jobs/tracebook/export_job.rb +0 -162
  43. data/app/jobs/tracebook/persist_interaction_job.rb +0 -160
  44. data/app/mailers/tracebook/application_mailer.rb +0 -6
  45. data/app/models/tracebook/interaction.rb +0 -100
  46. data/app/models/tracebook/redaction_rule.rb +0 -81
  47. data/app/models/tracebook/rollup_daily.rb +0 -73
  48. data/app/views/tracebook/interactions/index.html.erb +0 -105
  49. data/app/views/tracebook/interactions/show.html.erb +0 -44
  50. data/db/migrate/20241112000100_create_tracebook_interactions.rb +0 -55
  51. data/db/migrate/20241112000200_create_tracebook_rollups_dailies.rb +0 -24
  52. data/db/migrate/20241112000400_create_tracebook_redaction_rules.rb +0 -19
  53. data/lib/tracebook/adapters/active_agent.rb +0 -82
  54. data/lib/tracebook/mappers/anthropic.rb +0 -59
  55. data/lib/tracebook/mappers/base.rb +0 -38
  56. data/lib/tracebook/mappers/ollama.rb +0 -49
  57. data/lib/tracebook/mappers/openai.rb +0 -75
  58. data/lib/tracebook/mappers.rb +0 -283
  59. data/lib/tracebook/normalized_interaction.rb +0 -86
  60. data/lib/tracebook/redaction_pipeline.rb +0 -88
  61. data/lib/tracebook/redactors/base.rb +0 -29
  62. data/lib/tracebook/redactors/card_pan.rb +0 -15
  63. data/lib/tracebook/redactors/email.rb +0 -15
  64. data/lib/tracebook/redactors/phone.rb +0 -15
  65. data/lib/tracebook/redactors.rb +0 -8
  66. data/lib/tracebook/result.rb +0 -53
@@ -16,19 +16,36 @@
16
16
 
17
17
  :root {
18
18
  color-scheme: light dark;
19
- --tb-bg: #f9f9fb;
20
- --tb-border: #d0d7de;
21
- --tb-text: #202124;
22
- --tb-accent: #0b5fff;
23
- --tb-muted: #4a4d52;
24
- font-family: "Inter", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
19
+ --tb-bg: #f4f6f8;
20
+ --tb-surface: #ffffff;
21
+ --tb-border: #e1e4e8;
22
+ --tb-border-strong: #d0d7de;
23
+ --tb-text: #24292f;
24
+ --tb-text-secondary: #57606a;
25
+ --tb-accent: #0969da;
26
+ --tb-accent-hover: #0550ae;
27
+ --tb-muted: #656d76;
28
+ --tb-success: #1a7f37;
29
+ --tb-success-bg: #dafbe1;
30
+ --tb-error: #cf222e;
31
+ --tb-error-bg: #ffebe9;
32
+ --tb-warning: #9a6700;
33
+ --tb-warning-bg: #fff8c5;
34
+ --tb-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
35
+ --tb-shadow: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.06);
36
+ --tb-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
37
+ --tb-radius: 8px;
38
+ --tb-radius-sm: 6px;
25
39
  }
26
40
 
27
41
  body {
42
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;
43
+ font-size: 14px;
44
+ line-height: 1.5;
28
45
  background: var(--tb-bg);
29
46
  color: var(--tb-text);
30
47
  margin: 0;
31
- padding: 1.5rem;
48
+ padding: 2rem;
32
49
  }
33
50
 
34
51
  .tb-container {
@@ -41,48 +58,100 @@ body {
41
58
 
42
59
  .tb-header h1 {
43
60
  margin: 0;
61
+ font-size: 1.5rem;
62
+ font-weight: 600;
63
+ color: var(--tb-text);
44
64
  }
45
65
 
46
66
  .tb-kpis {
47
67
  display: grid;
48
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
68
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
49
69
  gap: 1rem;
50
- margin-top: 1rem;
70
+ margin-top: 1.5rem;
51
71
  }
52
72
 
53
73
  .tb-kpi {
54
- padding: 0.75rem;
74
+ padding: 1rem 1.25rem;
55
75
  border: 1px solid var(--tb-border);
56
- border-radius: 0.75rem;
57
- background: white;
76
+ border-radius: var(--tb-radius);
77
+ background: var(--tb-surface);
78
+ box-shadow: var(--tb-shadow-sm);
58
79
  display: flex;
59
80
  flex-direction: column;
60
- gap: 0.5rem;
81
+ gap: 0.25rem;
82
+ transition: box-shadow 0.15s ease, border-color 0.15s ease;
83
+ }
84
+
85
+ .tb-kpi:hover {
86
+ box-shadow: var(--tb-shadow);
87
+ border-color: var(--tb-border-strong);
61
88
  }
62
89
 
63
90
  .tb-kpi span {
64
- font-size: 0.85rem;
91
+ font-size: 0.75rem;
92
+ font-weight: 500;
65
93
  color: var(--tb-muted);
94
+ text-transform: uppercase;
95
+ letter-spacing: 0.025em;
66
96
  }
67
97
 
68
98
  .tb-kpi strong {
69
- font-size: 1.25rem;
99
+ font-size: 1.75rem;
100
+ font-weight: 600;
101
+ color: var(--tb-text);
70
102
  }
71
103
 
72
104
  .tb-filter-form {
73
105
  display: flex;
74
106
  flex-direction: column;
75
- gap: 1rem;
76
- padding: 1rem;
107
+ gap: 0.75rem;
108
+ padding: 1rem 1.25rem;
77
109
  border: 1px solid var(--tb-border);
78
- border-radius: 0.75rem;
79
- background: white;
110
+ border-radius: var(--tb-radius);
111
+ background: var(--tb-surface);
112
+ box-shadow: var(--tb-shadow-sm);
80
113
  }
81
114
 
82
- .tb-filter-grid {
83
- display: grid;
84
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
85
- gap: 1rem;
115
+ .tb-filter-row {
116
+ display: flex;
117
+ flex-wrap: wrap;
118
+ gap: 0.75rem;
119
+ align-items: flex-end;
120
+ }
121
+
122
+ .tb-filter-field {
123
+ display: flex;
124
+ flex-direction: column;
125
+ gap: 0.25rem;
126
+ min-width: 120px;
127
+ flex: 1;
128
+ max-width: 160px;
129
+ }
130
+
131
+ .tb-filter-row-secondary {
132
+ padding-top: 0.75rem;
133
+ border-top: 1px solid var(--tb-border);
134
+ justify-content: space-between;
135
+ }
136
+
137
+ .tb-filter-date-range {
138
+ max-width: none;
139
+ flex: 0 0 auto;
140
+ }
141
+
142
+ .tb-date-inputs {
143
+ display: flex;
144
+ align-items: center;
145
+ gap: 0.5rem;
146
+ }
147
+
148
+ .tb-date-inputs input[type="date"] {
149
+ width: 140px;
150
+ }
151
+
152
+ .tb-date-separator {
153
+ color: var(--tb-muted);
154
+ font-size: 0.8125rem;
86
155
  }
87
156
 
88
157
  .tb-filter-actions {
@@ -91,16 +160,127 @@ body {
91
160
  align-items: center;
92
161
  }
93
162
 
163
+ /* Form Controls */
164
+ label {
165
+ font-size: 0.8125rem;
166
+ font-weight: 500;
167
+ color: var(--tb-text-secondary);
168
+ }
169
+
170
+ select,
171
+ input[type="text"],
172
+ input[type="date"],
173
+ input[type="search"] {
174
+ width: 100%;
175
+ padding: 0.5rem 0.75rem;
176
+ font-size: 0.875rem;
177
+ line-height: 1.4;
178
+ color: var(--tb-text);
179
+ background-color: var(--tb-surface);
180
+ border: 1px solid var(--tb-border-strong);
181
+ border-radius: var(--tb-radius-sm);
182
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
183
+ box-sizing: border-box;
184
+ }
185
+
186
+ select:hover,
187
+ input[type="text"]:hover,
188
+ input[type="date"]:hover,
189
+ input[type="search"]:hover {
190
+ border-color: var(--tb-muted);
191
+ }
192
+
193
+ select:focus,
194
+ input[type="text"]:focus,
195
+ input[type="date"]:focus,
196
+ input[type="search"]:focus {
197
+ outline: none;
198
+ border-color: var(--tb-accent);
199
+ box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.15);
200
+ }
201
+
202
+ select {
203
+ appearance: none;
204
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23656d76' d='M2.22 4.47a.75.75 0 011.06 0L6 7.19l2.72-2.72a.75.75 0 011.06 1.06l-3.25 3.25a.75.75 0 01-1.06 0L2.22 5.53a.75.75 0 010-1.06z'/%3E%3C/svg%3E");
205
+ background-repeat: no-repeat;
206
+ background-position: right 0.75rem center;
207
+ padding-right: 2rem;
208
+ }
209
+
210
+ /* Buttons */
211
+ button,
212
+ input[type="submit"] {
213
+ display: inline-flex;
214
+ align-items: center;
215
+ justify-content: center;
216
+ padding: 0.5rem 1rem;
217
+ font-size: 0.875rem;
218
+ font-weight: 500;
219
+ line-height: 1.4;
220
+ color: var(--tb-surface);
221
+ background-color: var(--tb-accent);
222
+ border: 1px solid var(--tb-accent);
223
+ border-radius: var(--tb-radius-sm);
224
+ cursor: pointer;
225
+ transition: background-color 0.15s ease, border-color 0.15s ease;
226
+ }
227
+
228
+ button:hover,
229
+ input[type="submit"]:hover {
230
+ background-color: var(--tb-accent-hover);
231
+ border-color: var(--tb-accent-hover);
232
+ }
233
+
234
+ button:focus,
235
+ input[type="submit"]:focus {
236
+ outline: none;
237
+ box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.3);
238
+ }
239
+
240
+ .tb-btn-secondary {
241
+ color: var(--tb-text);
242
+ background-color: var(--tb-surface);
243
+ border-color: var(--tb-border-strong);
244
+ }
245
+
246
+ .tb-btn-secondary:hover {
247
+ background-color: var(--tb-bg);
248
+ border-color: var(--tb-muted);
249
+ }
250
+
94
251
  .tb-link {
95
252
  color: var(--tb-accent);
96
253
  text-decoration: none;
254
+ font-weight: 500;
255
+ }
256
+
257
+ .tb-link:hover {
258
+ text-decoration: underline;
259
+ }
260
+
261
+ .tb-muted {
262
+ color: var(--tb-muted);
97
263
  }
98
264
 
99
265
  .tb-table-wrapper {
100
266
  border: 1px solid var(--tb-border);
101
- border-radius: 0.75rem;
102
- background: white;
267
+ border-radius: var(--tb-radius);
268
+ background: var(--tb-surface);
269
+ box-shadow: var(--tb-shadow-sm);
270
+ overflow: hidden;
271
+ }
272
+
273
+ .tb-table-actions {
274
+ display: flex;
275
+ gap: 0.5rem;
103
276
  padding: 1rem;
277
+ border-bottom: 1px solid var(--tb-border);
278
+ background: var(--tb-bg);
279
+ }
280
+
281
+ .tb-table-actions button {
282
+ padding: 0.375rem 0.75rem;
283
+ font-size: 0.8125rem;
104
284
  }
105
285
 
106
286
  .tb-table {
@@ -108,54 +288,161 @@ body {
108
288
  border-collapse: collapse;
109
289
  }
110
290
 
111
- .tb-table th,
291
+ .tb-table th {
292
+ padding: 0.75rem 1rem;
293
+ font-size: 0.75rem;
294
+ font-weight: 600;
295
+ text-transform: uppercase;
296
+ letter-spacing: 0.025em;
297
+ color: var(--tb-text-secondary);
298
+ background: var(--tb-bg);
299
+ border-bottom: 1px solid var(--tb-border);
300
+ text-align: left;
301
+ }
302
+
112
303
  .tb-table td {
113
- padding: 0.75rem;
304
+ padding: 0.75rem 1rem;
114
305
  border-bottom: 1px solid var(--tb-border);
115
306
  text-align: left;
307
+ font-size: 0.875rem;
308
+ }
309
+
310
+ .tb-table tbody tr {
311
+ transition: background-color 0.1s ease;
116
312
  }
117
313
 
118
314
  .tb-table tbody tr:hover {
119
- background: rgba(11, 95, 255, 0.08);
315
+ background: var(--tb-bg);
120
316
  }
121
317
 
122
- .tb-selected {
123
- outline: 2px solid var(--tb-accent);
318
+ .tb-table tbody tr:last-child td {
319
+ border-bottom: none;
124
320
  }
125
321
 
126
- .tb-collapsed {
127
- max-height: 200px;
128
- overflow: hidden;
322
+ .tb-table a {
323
+ color: var(--tb-accent);
324
+ text-decoration: none;
325
+ font-weight: 500;
129
326
  }
130
327
 
131
- .tb-alert {
132
- background: #fffbdd;
133
- border: 1px solid #f7d070;
134
- color: #5c4400;
135
- padding: 0.75rem 1rem;
136
- border-radius: 0.5rem;
137
- margin-bottom: 1rem;
138
- font-size: 0.9rem;
328
+ .tb-table a:hover {
329
+ text-decoration: underline;
330
+ }
331
+
332
+ .tb-table input[type="checkbox"] {
333
+ width: 1rem;
334
+ height: 1rem;
335
+ accent-color: var(--tb-accent);
336
+ cursor: pointer;
337
+ }
338
+
339
+ /* Status badges */
340
+ .tb-status {
341
+ display: inline-flex;
342
+ align-items: center;
343
+ padding: 0.125rem 0.5rem;
344
+ font-size: 0.75rem;
345
+ font-weight: 500;
346
+ border-radius: 9999px;
347
+ }
348
+
349
+ .tb-status-success {
350
+ color: var(--tb-success);
351
+ background: var(--tb-success-bg);
139
352
  }
140
353
 
354
+ .tb-status-error {
355
+ color: var(--tb-error);
356
+ background: var(--tb-error-bg);
357
+ }
358
+
359
+ .tb-status-warning {
360
+ color: var(--tb-warning);
361
+ background: var(--tb-warning-bg);
362
+ }
363
+
364
+ .tb-status-pending {
365
+ color: var(--tb-warning);
366
+ background: var(--tb-warning-bg);
367
+ }
368
+
369
+ /* .tb-collapsed class is used by JS to track state, not for display */
370
+
141
371
  .tb-section {
142
372
  border: 1px solid var(--tb-border);
143
- border-radius: 0.75rem;
144
- background: white;
145
- padding: 1rem;
373
+ border-radius: var(--tb-radius);
374
+ background: var(--tb-surface);
375
+ box-shadow: var(--tb-shadow-sm);
376
+ padding: 1.25rem;
377
+ }
378
+
379
+ .tb-section-header {
380
+ margin: 0;
381
+ font-size: 1rem;
382
+ font-weight: 600;
383
+ color: var(--tb-text);
384
+ cursor: pointer;
385
+ display: flex;
386
+ align-items: center;
387
+ gap: 0.5rem;
388
+ user-select: none;
389
+ padding: 0.5rem 0;
390
+ transition: color 0.15s ease;
391
+ }
392
+
393
+ .tb-section-header:hover {
394
+ color: var(--tb-accent);
395
+ }
396
+
397
+ .tb-toggle-icon {
398
+ font-size: 0.75rem;
399
+ color: var(--tb-muted);
400
+ transition: color 0.15s ease;
401
+ width: 1rem;
402
+ text-align: center;
403
+ }
404
+
405
+ .tb-section-header:hover .tb-toggle-icon {
406
+ color: var(--tb-accent);
407
+ }
408
+
409
+ .tb-section-content {
410
+ margin-top: 1rem;
411
+ }
412
+
413
+ .tb-section h2 {
414
+ margin: 0 0 1rem;
415
+ font-size: 1rem;
416
+ font-weight: 600;
417
+ color: var(--tb-text);
146
418
  }
147
419
 
148
420
  .tb-meta-grid {
149
421
  display: grid;
150
- grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
151
- gap: 1rem;
152
- margin-top: 1rem;
422
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
423
+ gap: 1.25rem;
424
+ margin-top: 1.5rem;
425
+ }
426
+
427
+ .tb-meta-grid > div {
428
+ display: flex;
429
+ flex-direction: column;
430
+ gap: 0.25rem;
153
431
  }
154
432
 
155
433
  .tb-meta-grid span {
156
434
  display: block;
157
- font-size: 0.8rem;
435
+ font-size: 0.75rem;
436
+ font-weight: 500;
158
437
  color: var(--tb-muted);
438
+ text-transform: uppercase;
439
+ letter-spacing: 0.025em;
440
+ }
441
+
442
+ .tb-meta-grid strong {
443
+ font-size: 1rem;
444
+ font-weight: 600;
445
+ color: var(--tb-text);
159
446
  }
160
447
 
161
448
  .tb-review-form {
@@ -164,10 +451,1588 @@ body {
164
451
  align-items: flex-end;
165
452
  }
166
453
 
454
+ .tb-review-form > div:not(.tb-review-actions) {
455
+ display: flex;
456
+ flex-direction: column;
457
+ gap: 0.375rem;
458
+ }
459
+
167
460
  pre {
168
- background: #0d1117;
461
+ background: #161b22;
169
462
  color: #e6edf3;
170
463
  padding: 1rem;
171
- border-radius: 0.5rem;
464
+ border-radius: var(--tb-radius-sm);
172
465
  overflow-x: auto;
466
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
467
+ font-size: 0.8125rem;
468
+ line-height: 1.6;
469
+ margin: 0;
470
+ }
471
+
472
+ /* Breadcrumbs */
473
+ .tb-breadcrumbs {
474
+ margin-bottom: 1rem;
475
+ }
476
+
477
+ .tb-breadcrumbs a {
478
+ color: var(--tb-accent);
479
+ text-decoration: none;
480
+ font-size: 0.875rem;
481
+ font-weight: 500;
482
+ }
483
+
484
+ .tb-breadcrumbs a:hover {
485
+ text-decoration: underline;
486
+ }
487
+
488
+ .tb-pagination {
489
+ display: flex;
490
+ justify-content: center;
491
+ padding: 1rem;
492
+ border-top: 1px solid var(--tb-border);
493
+ background: var(--tb-bg);
494
+ }
495
+
496
+ .tb-pagination nav {
497
+ display: flex;
498
+ gap: 0.25rem;
499
+ align-items: center;
500
+ }
501
+
502
+ .tb-pagination a,
503
+ .tb-pagination span {
504
+ display: inline-flex;
505
+ align-items: center;
506
+ justify-content: center;
507
+ min-width: 2rem;
508
+ padding: 0.375rem 0.625rem;
509
+ border: 1px solid var(--tb-border);
510
+ border-radius: var(--tb-radius-sm);
511
+ text-decoration: none;
512
+ color: var(--tb-text);
513
+ font-size: 0.8125rem;
514
+ font-weight: 500;
515
+ background: var(--tb-surface);
516
+ transition: all 0.15s ease;
517
+ }
518
+
519
+ .tb-pagination a:hover {
520
+ background: var(--tb-bg);
521
+ border-color: var(--tb-accent);
522
+ color: var(--tb-accent);
523
+ }
524
+
525
+ .tb-pagination .current {
526
+ background: var(--tb-accent);
527
+ color: white;
528
+ border-color: var(--tb-accent);
529
+ }
530
+
531
+ .tb-pagination .disabled {
532
+ color: var(--tb-muted);
533
+ background: var(--tb-bg);
534
+ cursor: not-allowed;
535
+ }
536
+
537
+ .tb-pagination .gap {
538
+ border: none;
539
+ background: transparent;
540
+ color: var(--tb-muted);
541
+ }
542
+
543
+ /* ==========================================================================
544
+ Interaction Detail Page - Premium Design
545
+ ========================================================================== */
546
+
547
+ .tb-detail-page {
548
+ max-width: 1000px;
549
+ margin: 0 auto;
550
+ display: flex;
551
+ flex-direction: column;
552
+ gap: 1.5rem;
553
+ }
554
+
555
+ /* Navigation */
556
+ .tb-detail-nav {
557
+ margin-bottom: 0.5rem;
558
+ }
559
+
560
+ .tb-back-link {
561
+ display: inline-flex;
562
+ align-items: center;
563
+ gap: 0.5rem;
564
+ color: var(--tb-text-secondary);
565
+ text-decoration: none;
566
+ font-size: 0.875rem;
567
+ font-weight: 500;
568
+ padding: 0.5rem 0;
569
+ transition: color 0.15s ease;
570
+ }
571
+
572
+ .tb-back-link:hover {
573
+ color: var(--tb-accent);
574
+ }
575
+
576
+ .tb-back-link svg {
577
+ transition: transform 0.15s ease;
578
+ }
579
+
580
+ .tb-back-link:hover svg {
581
+ transform: translateX(-3px);
582
+ }
583
+
584
+ /* Header */
585
+ .tb-detail-header {
586
+ padding-bottom: 1.5rem;
587
+ border-bottom: 1px solid var(--tb-border);
588
+ }
589
+
590
+ .tb-detail-title-row {
591
+ display: flex;
592
+ align-items: baseline;
593
+ justify-content: space-between;
594
+ gap: 1rem;
595
+ flex-wrap: wrap;
596
+ }
597
+
598
+ .tb-detail-header h1 {
599
+ margin: 0;
600
+ font-size: 1.75rem;
601
+ font-weight: 700;
602
+ color: var(--tb-text);
603
+ letter-spacing: -0.02em;
604
+ }
605
+
606
+ .tb-detail-timestamp {
607
+ font-size: 0.875rem;
608
+ color: var(--tb-muted);
609
+ }
610
+
611
+ .tb-detail-subtitle {
612
+ display: flex;
613
+ align-items: center;
614
+ gap: 0.75rem;
615
+ margin-top: 0.75rem;
616
+ }
617
+
618
+ .tb-provider-badge {
619
+ display: inline-flex;
620
+ align-items: center;
621
+ padding: 0.25rem 0.75rem;
622
+ font-size: 0.75rem;
623
+ font-weight: 600;
624
+ text-transform: uppercase;
625
+ letter-spacing: 0.05em;
626
+ color: #fff;
627
+ background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
628
+ border-radius: 9999px;
629
+ }
630
+
631
+ .tb-model-name {
632
+ font-size: 0.9375rem;
633
+ font-weight: 500;
634
+ color: var(--tb-text-secondary);
635
+ }
636
+
637
+ /* Metrics Grid */
638
+ .tb-metrics-grid {
639
+ display: grid;
640
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
641
+ gap: 1rem;
642
+ }
643
+
644
+ .tb-metric-card {
645
+ background: var(--tb-surface);
646
+ border: 1px solid var(--tb-border);
647
+ border-radius: var(--tb-radius);
648
+ padding: 1rem 1.25rem;
649
+ display: flex;
650
+ flex-direction: column;
651
+ gap: 0.5rem;
652
+ transition: all 0.2s ease;
653
+ }
654
+
655
+ .tb-metric-card:hover {
656
+ border-color: var(--tb-border-strong);
657
+ box-shadow: var(--tb-shadow);
658
+ }
659
+
660
+ .tb-metric-label {
661
+ font-size: 0.6875rem;
662
+ font-weight: 600;
663
+ text-transform: uppercase;
664
+ letter-spacing: 0.05em;
665
+ color: var(--tb-muted);
666
+ }
667
+
668
+ .tb-metric-value {
669
+ font-size: 1.125rem;
670
+ font-weight: 600;
671
+ color: var(--tb-text);
672
+ }
673
+
674
+ /* Latency with color indicator */
675
+ .tb-latency {
676
+ display: flex;
677
+ align-items: center;
678
+ gap: 0.5rem;
679
+ }
680
+
681
+ .tb-latency-indicator {
682
+ width: 8px;
683
+ height: 8px;
684
+ border-radius: 50%;
685
+ flex-shrink: 0;
686
+ }
687
+
688
+ .tb-latency-good .tb-latency-indicator {
689
+ background: linear-gradient(135deg, #10b981 0%, #059669 100%);
690
+ box-shadow: 0 0 8px rgba(16, 185, 129, 0.4);
691
+ }
692
+
693
+ .tb-latency-warning .tb-latency-indicator {
694
+ background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
695
+ box-shadow: 0 0 8px rgba(245, 158, 11, 0.4);
696
+ }
697
+
698
+ .tb-latency-slow .tb-latency-indicator {
699
+ background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
700
+ box-shadow: 0 0 8px rgba(239, 68, 68, 0.4);
701
+ }
702
+
703
+ /* Tokens display */
704
+ .tb-tokens {
705
+ display: flex;
706
+ align-items: center;
707
+ gap: 0.375rem;
708
+ }
709
+
710
+ .tb-tokens-in {
711
+ color: var(--tb-muted);
712
+ }
713
+
714
+ .tb-tokens-arrow {
715
+ color: var(--tb-border-strong);
716
+ }
717
+
718
+ .tb-tokens-out {
719
+ color: var(--tb-text);
720
+ }
721
+
722
+ /* Cost styling */
723
+ .tb-cost {
724
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace;
725
+ }
726
+
727
+ /* Payload Sections */
728
+ .tb-payload-sections {
729
+ display: flex;
730
+ flex-direction: column;
731
+ gap: 1rem;
732
+ }
733
+
734
+ .tb-payload-section {
735
+ background: var(--tb-surface);
736
+ border: 1px solid var(--tb-border);
737
+ border-radius: var(--tb-radius);
738
+ overflow: hidden;
739
+ transition: box-shadow 0.2s ease;
740
+ }
741
+
742
+ .tb-payload-section:hover {
743
+ box-shadow: var(--tb-shadow);
744
+ }
745
+
746
+ .tb-payload-header {
747
+ display: flex;
748
+ align-items: center;
749
+ justify-content: space-between;
750
+ padding: 1rem 1.25rem;
751
+ background: var(--tb-bg);
752
+ cursor: pointer;
753
+ user-select: none;
754
+ transition: background-color 0.15s ease;
755
+ }
756
+
757
+ .tb-payload-header:hover {
758
+ background: var(--tb-border);
759
+ }
760
+
761
+ .tb-payload-title {
762
+ display: flex;
763
+ align-items: center;
764
+ gap: 0.5rem;
765
+ font-weight: 600;
766
+ color: var(--tb-text);
767
+ }
768
+
769
+ .tb-chevron {
770
+ color: var(--tb-muted);
771
+ transition: transform 0.2s ease;
772
+ }
773
+
774
+ .tb-payload-section[data-json-viewer-collapsed-value="false"] .tb-chevron,
775
+ .tb-payload-section.expanded .tb-chevron {
776
+ transform: rotate(90deg);
777
+ }
778
+
779
+ .tb-copy-btn {
780
+ display: inline-flex;
781
+ align-items: center;
782
+ gap: 0.375rem;
783
+ padding: 0.375rem 0.75rem;
784
+ font-size: 0.75rem;
785
+ font-weight: 500;
786
+ color: var(--tb-text-secondary);
787
+ background: var(--tb-surface);
788
+ border: 1px solid var(--tb-border);
789
+ border-radius: var(--tb-radius-sm);
790
+ cursor: pointer;
791
+ transition: all 0.15s ease;
792
+ }
793
+
794
+ .tb-copy-btn:hover {
795
+ color: var(--tb-accent);
796
+ border-color: var(--tb-accent);
797
+ background: rgba(9, 105, 218, 0.05);
798
+ }
799
+
800
+ .tb-payload-content {
801
+ overflow: hidden;
802
+ transition: max-height 0.3s ease;
803
+ }
804
+
805
+ .tb-payload-content[style*="display: none"],
806
+ .tb-collapsed .tb-payload-content {
807
+ max-height: 0;
808
+ padding: 0;
809
+ }
810
+
811
+ /* Code block styling - VS Code Dark+ inspired */
812
+ .tb-code {
813
+ margin: 0;
814
+ padding: 1.25rem;
815
+ background: #1e1e1e;
816
+ color: #d4d4d4;
817
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
818
+ font-size: 0.8125rem;
819
+ line-height: 1.7;
820
+ overflow-x: auto;
821
+ border-radius: 0;
822
+ }
823
+
824
+ .tb-code code {
825
+ display: block;
826
+ }
827
+
828
+ /* JSON syntax highlighting */
829
+ .tb-json-key {
830
+ color: #9cdcfe;
831
+ }
832
+
833
+ .tb-json-string {
834
+ color: #ce9178;
835
+ }
836
+
837
+ .tb-json-number {
838
+ color: #b5cea8;
839
+ }
840
+
841
+ .tb-json-boolean {
842
+ color: #569cd6;
843
+ }
844
+
845
+ .tb-json-null {
846
+ color: #569cd6;
847
+ }
848
+
849
+ .tb-json-redacted {
850
+ color: #f14c4c;
851
+ background: rgba(241, 76, 76, 0.15);
852
+ padding: 0.125rem 0.375rem;
853
+ border-radius: 3px;
854
+ font-weight: 500;
855
+ }
856
+
857
+ /* Review Section */
858
+ .tb-review-section {
859
+ background: var(--tb-surface);
860
+ border: 1px solid var(--tb-border);
861
+ border-radius: var(--tb-radius);
862
+ padding: 1.25rem 1.5rem;
863
+ }
864
+
865
+ .tb-review-header {
866
+ display: flex;
867
+ align-items: center;
868
+ justify-content: space-between;
869
+ margin-bottom: 1rem;
870
+ }
871
+
872
+ .tb-review-section h2 {
873
+ margin: 0;
874
+ font-size: 1rem;
875
+ font-weight: 600;
876
+ color: var(--tb-text);
877
+ }
878
+
879
+ .tb-current-state {
880
+ font-size: 0.875rem;
881
+ color: var(--tb-text-secondary);
882
+ }
883
+
884
+ .tb-review-actions {
885
+ display: flex;
886
+ gap: 0.5rem;
887
+ flex-wrap: wrap;
888
+ }
889
+
890
+ .tb-review-btn {
891
+ padding: 0.5rem 1rem;
892
+ font-size: 0.8125rem;
893
+ font-weight: 500;
894
+ border: 1px solid var(--tb-border);
895
+ border-radius: var(--tb-radius-sm);
896
+ cursor: pointer;
897
+ transition: all 0.15s ease;
898
+ background: var(--tb-bg);
899
+ color: var(--tb-text);
900
+ }
901
+
902
+ .tb-review-btn:hover {
903
+ border-color: var(--tb-border-strong);
904
+ }
905
+
906
+ .tb-review-btn-approved {
907
+ color: var(--tb-success);
908
+ border-color: var(--tb-success);
909
+ }
910
+
911
+ .tb-review-btn-approved:hover {
912
+ background: rgba(26, 127, 55, 0.1);
913
+ }
914
+
915
+ .tb-review-btn-flagged {
916
+ color: var(--tb-warning);
917
+ border-color: var(--tb-warning);
918
+ }
919
+
920
+ .tb-review-btn-flagged:hover {
921
+ background: rgba(154, 103, 0, 0.1);
922
+ }
923
+
924
+ .tb-review-btn-rejected {
925
+ color: var(--tb-error);
926
+ border-color: var(--tb-error);
927
+ }
928
+
929
+ .tb-review-btn-rejected:hover {
930
+ background: rgba(207, 34, 46, 0.1);
931
+ }
932
+
933
+ .tb-review-btn-pending {
934
+ color: var(--tb-muted);
935
+ border-color: var(--tb-border);
936
+ }
937
+
938
+ .tb-review-btn-pending:hover {
939
+ background: var(--tb-surface);
940
+ }
941
+
942
+ .tb-btn-primary {
943
+ padding: 0.625rem 1.25rem;
944
+ font-size: 0.875rem;
945
+ font-weight: 600;
946
+ color: #fff;
947
+ background: linear-gradient(135deg, var(--tb-accent) 0%, var(--tb-accent-hover) 100%);
948
+ border: none;
949
+ border-radius: var(--tb-radius-sm);
950
+ cursor: pointer;
951
+ transition: all 0.15s ease;
952
+ box-shadow: 0 1px 3px rgba(9, 105, 218, 0.3);
953
+ }
954
+
955
+ .tb-btn-primary:hover {
956
+ transform: translateY(-1px);
957
+ box-shadow: 0 4px 12px rgba(9, 105, 218, 0.4);
958
+ }
959
+
960
+ .tb-btn-primary:active {
961
+ transform: translateY(0);
962
+ }
963
+
964
+ .tb-btn-secondary {
965
+ padding: 0.5rem 1rem;
966
+ font-size: 0.8125rem;
967
+ font-weight: 500;
968
+ color: var(--tb-text);
969
+ background: var(--tb-surface);
970
+ border: 1px solid var(--tb-border);
971
+ border-radius: var(--tb-radius-sm);
972
+ cursor: pointer;
973
+ transition: all 0.15s ease;
974
+ }
975
+
976
+ .tb-btn-secondary:hover {
977
+ background: var(--tb-bg);
978
+ border-color: var(--tb-border-strong);
979
+ }
980
+
981
+ /* Comments Section */
982
+ .tb-comments-section {
983
+ background: var(--tb-surface);
984
+ border: 1px solid var(--tb-border);
985
+ border-radius: var(--tb-radius);
986
+ padding: 1.25rem 1.5rem;
987
+ }
988
+
989
+ .tb-comments-section h2 {
990
+ margin: 0 0 1rem;
991
+ font-size: 1rem;
992
+ font-weight: 600;
993
+ color: var(--tb-text);
994
+ }
995
+
996
+ .tb-comments-list {
997
+ display: flex;
998
+ flex-direction: column;
999
+ gap: 0.75rem;
1000
+ margin-bottom: 1rem;
1001
+ }
1002
+
1003
+ .tb-comment {
1004
+ background: var(--tb-bg);
1005
+ border: 1px solid var(--tb-border);
1006
+ border-radius: var(--tb-radius-sm);
1007
+ padding: 0.75rem 1rem;
1008
+ }
1009
+
1010
+ .tb-comment-meta {
1011
+ display: flex;
1012
+ align-items: center;
1013
+ gap: 0.75rem;
1014
+ margin-bottom: 0.5rem;
1015
+ font-size: 0.8125rem;
1016
+ }
1017
+
1018
+ .tb-comment-author {
1019
+ font-weight: 600;
1020
+ color: var(--tb-text);
1021
+ }
1022
+
1023
+ .tb-comment-time {
1024
+ color: var(--tb-muted);
1025
+ }
1026
+
1027
+ .tb-comment-body {
1028
+ font-size: 0.875rem;
1029
+ color: var(--tb-text);
1030
+ line-height: 1.5;
1031
+ }
1032
+
1033
+ .tb-comment-body p {
1034
+ margin: 0;
1035
+ }
1036
+
1037
+ .tb-edit-comment {
1038
+ margin-top: 0.75rem;
1039
+ }
1040
+
1041
+ .tb-edit-link {
1042
+ font-size: 0.8125rem;
1043
+ color: var(--tb-accent);
1044
+ cursor: pointer;
1045
+ user-select: none;
1046
+ }
1047
+
1048
+ .tb-edit-link:hover {
1049
+ text-decoration: underline;
1050
+ }
1051
+
1052
+ .tb-edit-comment[open] .tb-comment-form {
1053
+ margin-top: 0.75rem;
1054
+ }
1055
+
1056
+ .tb-comment-form {
1057
+ display: flex;
1058
+ flex-direction: column;
1059
+ gap: 0.75rem;
1060
+ }
1061
+
1062
+ .tb-comment-input {
1063
+ width: 100%;
1064
+ padding: 0.75rem;
1065
+ font-size: 0.875rem;
1066
+ font-family: inherit;
1067
+ color: var(--tb-text);
1068
+ background: var(--tb-bg);
1069
+ border: 1px solid var(--tb-border);
1070
+ border-radius: var(--tb-radius-sm);
1071
+ resize: vertical;
1072
+ min-height: 80px;
1073
+ }
1074
+
1075
+ .tb-comment-input:focus {
1076
+ outline: none;
1077
+ border-color: var(--tb-accent);
1078
+ box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.1);
1079
+ }
1080
+
1081
+ .tb-comment-input::placeholder {
1082
+ color: var(--tb-muted);
1083
+ }
1084
+
1085
+ .tb-comment-form .tb-btn-secondary {
1086
+ align-self: flex-start;
1087
+ }
1088
+
1089
+ /* ==========================================================================
1090
+ Navigation Tabs
1091
+ ========================================================================== */
1092
+
1093
+ .tb-nav-tabs {
1094
+ display: flex;
1095
+ gap: 0;
1096
+ border-bottom: 1px solid var(--tb-border);
1097
+ margin-bottom: 0.5rem;
1098
+ }
1099
+
1100
+ .tb-nav-tab {
1101
+ padding: 0.75rem 1.25rem;
1102
+ font-size: 0.875rem;
1103
+ font-weight: 500;
1104
+ color: var(--tb-text-secondary);
1105
+ text-decoration: none;
1106
+ border-bottom: 2px solid transparent;
1107
+ margin-bottom: -1px;
1108
+ transition: all 0.15s ease;
1109
+ }
1110
+
1111
+ .tb-nav-tab:hover {
1112
+ color: var(--tb-text);
1113
+ background: var(--tb-bg);
1114
+ }
1115
+
1116
+ .tb-nav-tab-active {
1117
+ color: var(--tb-accent);
1118
+ border-bottom-color: var(--tb-accent);
1119
+ }
1120
+
1121
+ /* ==========================================================================
1122
+ Thread View (Trackable Detail)
1123
+ ========================================================================== */
1124
+
1125
+ .tb-thread {
1126
+ display: flex;
1127
+ flex-direction: column;
1128
+ gap: 1rem;
1129
+ }
1130
+
1131
+ .tb-thread-item {
1132
+ background: var(--tb-surface);
1133
+ border: 1px solid var(--tb-border);
1134
+ border-radius: var(--tb-radius);
1135
+ overflow: hidden;
1136
+ transition: box-shadow 0.15s ease;
1137
+ }
1138
+
1139
+ .tb-thread-item:hover {
1140
+ box-shadow: var(--tb-shadow);
1141
+ }
1142
+
1143
+ .tb-thread-header {
1144
+ display: flex;
1145
+ justify-content: space-between;
1146
+ align-items: center;
1147
+ padding: 0.75rem 1rem;
1148
+ background: var(--tb-bg);
1149
+ border-bottom: 1px solid var(--tb-border);
1150
+ flex-wrap: wrap;
1151
+ gap: 0.5rem;
1152
+ }
1153
+
1154
+ .tb-thread-meta {
1155
+ display: flex;
1156
+ align-items: center;
1157
+ gap: 0.5rem;
1158
+ flex-wrap: wrap;
1159
+ }
1160
+
1161
+ .tb-thread-number {
1162
+ font-size: 0.75rem;
1163
+ font-weight: 600;
1164
+ color: var(--tb-muted);
1165
+ background: var(--tb-surface);
1166
+ padding: 0.125rem 0.5rem;
1167
+ border-radius: 9999px;
1168
+ border: 1px solid var(--tb-border);
1169
+ }
1170
+
1171
+ .tb-thread-stats {
1172
+ display: flex;
1173
+ align-items: center;
1174
+ gap: 1rem;
1175
+ font-size: 0.8125rem;
1176
+ color: var(--tb-muted);
1177
+ }
1178
+
1179
+ .tb-thread-content {
1180
+ padding: 1rem;
1181
+ display: flex;
1182
+ flex-direction: column;
1183
+ gap: 0.75rem;
1184
+ }
1185
+
1186
+ .tb-message {
1187
+ padding: 0.75rem 1rem;
1188
+ border-radius: var(--tb-radius-sm);
1189
+ }
1190
+
1191
+ .tb-message-user {
1192
+ background: var(--tb-bg);
1193
+ border: 1px solid var(--tb-border);
1194
+ margin-right: 2rem;
1195
+ }
1196
+
1197
+ .tb-message-assistant {
1198
+ background: linear-gradient(135deg, rgba(99, 102, 241, 0.05) 0%, rgba(139, 92, 246, 0.05) 100%);
1199
+ border: 1px solid rgba(99, 102, 241, 0.2);
1200
+ margin-left: 2rem;
1201
+ }
1202
+
1203
+ .tb-message-role {
1204
+ font-size: 0.6875rem;
1205
+ font-weight: 600;
1206
+ text-transform: uppercase;
1207
+ letter-spacing: 0.05em;
1208
+ color: var(--tb-muted);
1209
+ margin-bottom: 0.375rem;
1210
+ }
1211
+
1212
+ .tb-message-content {
1213
+ font-size: 0.875rem;
1214
+ line-height: 1.6;
1215
+ color: var(--tb-text);
1216
+ }
1217
+
1218
+ .tb-message-content p {
1219
+ margin: 0;
1220
+ }
1221
+
1222
+ .tb-message-content p + p {
1223
+ margin-top: 0.5rem;
1224
+ }
1225
+
1226
+ .tb-thread-footer {
1227
+ padding: 0.75rem 1rem;
1228
+ border-top: 1px solid var(--tb-border);
1229
+ background: var(--tb-bg);
1230
+ }
1231
+
1232
+ /* Empty state */
1233
+ .tb-empty-state {
1234
+ padding: 3rem;
1235
+ text-align: center;
1236
+ color: var(--tb-muted);
1237
+ }
1238
+
1239
+ .tb-empty-state p {
1240
+ margin: 0 0 1rem;
1241
+ }
1242
+
1243
+ /* Responsive adjustments */
1244
+ @media (max-width: 640px) {
1245
+ .tb-detail-header h1 {
1246
+ font-size: 1.375rem;
1247
+ }
1248
+
1249
+ .tb-metrics-grid {
1250
+ grid-template-columns: repeat(2, 1fr);
1251
+ }
1252
+
1253
+ .tb-review-header {
1254
+ flex-direction: column;
1255
+ align-items: flex-start;
1256
+ gap: 0.5rem;
1257
+ }
1258
+
1259
+ .tb-review-actions {
1260
+ width: 100%;
1261
+ }
1262
+
1263
+ .tb-btn-primary {
1264
+ width: 100%;
1265
+ justify-content: center;
1266
+ }
1267
+
1268
+ .tb-message-user,
1269
+ .tb-message-assistant {
1270
+ margin-left: 0;
1271
+ margin-right: 0;
1272
+ }
1273
+ }
1274
+
1275
+ /* ==========================================================================
1276
+ Actor Hierarchy Views
1277
+ ========================================================================== */
1278
+
1279
+ .tb-breadcrumb {
1280
+ display: flex;
1281
+ align-items: center;
1282
+ gap: 0.5rem;
1283
+ margin-bottom: 0.75rem;
1284
+ }
1285
+
1286
+ .tb-export-btn {
1287
+ margin-left: auto;
1288
+ padding: 0.375rem 0.75rem;
1289
+ font-size: 0.8125rem;
1290
+ font-weight: 500;
1291
+ color: var(--tb-text);
1292
+ background: var(--tb-bg);
1293
+ border: 1px solid var(--tb-border);
1294
+ border-radius: var(--tb-radius-sm);
1295
+ text-decoration: none;
1296
+ transition: all 0.15s ease;
1297
+ }
1298
+
1299
+ .tb-export-btn:hover {
1300
+ border-color: var(--tb-border-strong);
1301
+ background: var(--tb-surface);
1302
+ }
1303
+
1304
+ .tb-section-title {
1305
+ margin: 0 0 1rem;
1306
+ padding: 1rem;
1307
+ font-size: 0.875rem;
1308
+ font-weight: 600;
1309
+ text-transform: uppercase;
1310
+ letter-spacing: 0.05em;
1311
+ color: var(--tb-muted);
1312
+ background: var(--tb-bg);
1313
+ border-bottom: 1px solid var(--tb-border);
1314
+ }
1315
+
1316
+ .tb-actor-type {
1317
+ display: inline-flex;
1318
+ padding: 0.125rem 0.5rem;
1319
+ font-size: 0.75rem;
1320
+ font-weight: 500;
1321
+ color: #6366f1;
1322
+ background: rgba(99, 102, 241, 0.1);
1323
+ border-radius: 4px;
1324
+ }
1325
+
1326
+ .tb-actor-id {
1327
+ font-weight: 600;
1328
+ color: var(--tb-text);
1329
+ }
1330
+
1331
+ .tb-actor-name {
1332
+ color: var(--tb-text-secondary);
1333
+ margin-left: 0.25rem;
1334
+ }
1335
+
1336
+ .tb-model-badge {
1337
+ display: inline-flex;
1338
+ padding: 0.125rem 0.5rem;
1339
+ font-size: 0.75rem;
1340
+ font-weight: 500;
1341
+ color: var(--tb-muted);
1342
+ background: var(--tb-bg);
1343
+ border: 1px solid var(--tb-border);
1344
+ border-radius: 4px;
1345
+ }
1346
+
1347
+ .tb-session-meta {
1348
+ display: flex;
1349
+ align-items: center;
1350
+ gap: 0.5rem;
1351
+ margin-top: 0.5rem;
1352
+ flex-wrap: wrap;
1353
+ }
1354
+
1355
+ .tb-session-actions {
1356
+ display: flex;
1357
+ gap: 0.5rem;
1358
+ padding: 1rem;
1359
+ background: var(--tb-surface);
1360
+ border: 1px solid var(--tb-border);
1361
+ border-radius: var(--tb-radius);
1362
+ }
1363
+
1364
+ .tb-interactions-list {
1365
+ display: flex;
1366
+ flex-direction: column;
1367
+ gap: 1rem;
1368
+ }
1369
+
1370
+ .tb-interaction-card {
1371
+ background: var(--tb-surface);
1372
+ border: 1px solid var(--tb-border);
1373
+ border-radius: var(--tb-radius);
1374
+ overflow: hidden;
1375
+ }
1376
+
1377
+ .tb-interaction-header {
1378
+ display: flex;
1379
+ align-items: center;
1380
+ gap: 0.75rem;
1381
+ padding: 0.75rem 1rem;
1382
+ background: var(--tb-bg);
1383
+ border-bottom: 1px solid var(--tb-border);
1384
+ flex-wrap: wrap;
1385
+ }
1386
+
1387
+ .tb-interaction-number {
1388
+ font-size: 0.75rem;
1389
+ font-weight: 600;
1390
+ color: var(--tb-muted);
1391
+ background: var(--tb-surface);
1392
+ padding: 0.125rem 0.5rem;
1393
+ border-radius: 9999px;
1394
+ border: 1px solid var(--tb-border);
1395
+ }
1396
+
1397
+ .tb-interaction-tokens,
1398
+ .tb-interaction-cost,
1399
+ .tb-interaction-latency {
1400
+ font-size: 0.8125rem;
1401
+ color: var(--tb-muted);
1402
+ }
1403
+
1404
+ .tb-interaction-messages {
1405
+ padding: 1rem;
1406
+ display: flex;
1407
+ flex-direction: column;
1408
+ gap: 0.5rem;
1409
+ }
1410
+
1411
+ .tb-message-toggle {
1412
+ display: flex;
1413
+ align-items: center;
1414
+ gap: 0.5rem;
1415
+ width: 100%;
1416
+ padding: 0.5rem;
1417
+ background: none;
1418
+ border: none;
1419
+ text-align: left;
1420
+ cursor: pointer;
1421
+ font-size: 0.875rem;
1422
+ color: var(--tb-text);
1423
+ border-radius: var(--tb-radius-sm);
1424
+ transition: background-color 0.15s ease;
1425
+ }
1426
+
1427
+ .tb-message-toggle:hover {
1428
+ background: var(--tb-bg);
1429
+ }
1430
+
1431
+ .tb-message-preview {
1432
+ color: var(--tb-muted);
1433
+ font-weight: 400;
1434
+ overflow: hidden;
1435
+ text-overflow: ellipsis;
1436
+ white-space: nowrap;
1437
+ flex: 1;
1438
+ }
1439
+
1440
+ .tb-message-content.hidden {
1441
+ display: none;
1442
+ }
1443
+
1444
+ .tb-message-content pre {
1445
+ margin: 0.5rem 0 0;
1446
+ padding: 0.75rem;
1447
+ background: var(--tb-bg);
1448
+ border-radius: var(--tb-radius-sm);
1449
+ font-size: 0.8125rem;
1450
+ white-space: pre-wrap;
1451
+ word-break: break-word;
1452
+ }
1453
+
1454
+ .tb-btn-small {
1455
+ padding: 0.25rem 0.5rem;
1456
+ font-size: 0.75rem;
1457
+ font-weight: 500;
1458
+ color: var(--tb-accent);
1459
+ background: transparent;
1460
+ border: 1px solid var(--tb-accent);
1461
+ border-radius: var(--tb-radius-sm);
1462
+ cursor: pointer;
1463
+ text-decoration: none;
1464
+ transition: all 0.15s ease;
1465
+ margin-left: auto;
1466
+ }
1467
+
1468
+ .tb-btn-small:hover {
1469
+ background: rgba(9, 105, 218, 0.1);
1470
+ }
1471
+
1472
+ .tb-kpi small {
1473
+ font-size: 0.75rem;
1474
+ font-weight: 400;
1475
+ color: var(--tb-muted);
1476
+ }
1477
+
1478
+ .hidden {
1479
+ display: none !important;
1480
+ }
1481
+
1482
+ /* ==========================================================================
1483
+ Conversation Chat View
1484
+ ========================================================================== */
1485
+
1486
+ .tb-conversation {
1487
+ background: var(--tb-surface);
1488
+ border: 1px solid var(--tb-border);
1489
+ border-radius: var(--tb-radius);
1490
+ overflow: hidden;
1491
+ }
1492
+
1493
+ .tb-chat {
1494
+ padding: 1.5rem;
1495
+ display: flex;
1496
+ flex-direction: column;
1497
+ gap: 1rem;
1498
+ }
1499
+
1500
+ .tb-chat-message {
1501
+ max-width: 85%;
1502
+ border-radius: var(--tb-radius);
1503
+ overflow: hidden;
1504
+ }
1505
+
1506
+ .tb-chat-user {
1507
+ align-self: flex-start;
1508
+ background: var(--tb-bg);
1509
+ border: 1px solid var(--tb-border);
1510
+ }
1511
+
1512
+ .tb-chat-assistant {
1513
+ align-self: flex-end;
1514
+ background: linear-gradient(135deg, rgba(99, 102, 241, 0.08) 0%, rgba(139, 92, 246, 0.08) 100%);
1515
+ border: 1px solid rgba(99, 102, 241, 0.2);
1516
+ }
1517
+
1518
+ .tb-chat-label {
1519
+ padding: 0.5rem 1rem;
1520
+ font-size: 0.6875rem;
1521
+ font-weight: 600;
1522
+ text-transform: uppercase;
1523
+ letter-spacing: 0.05em;
1524
+ color: var(--tb-muted);
1525
+ border-bottom: 1px solid var(--tb-border);
1526
+ }
1527
+
1528
+ .tb-chat-assistant .tb-chat-label {
1529
+ border-bottom-color: rgba(99, 102, 241, 0.2);
1530
+ }
1531
+
1532
+ .tb-chat-content {
1533
+ padding: 1rem;
1534
+ font-size: 0.9375rem;
1535
+ line-height: 1.7;
1536
+ color: var(--tb-text);
1537
+ }
1538
+
1539
+ .tb-chat-content p {
1540
+ margin: 0;
1541
+ }
1542
+
1543
+ .tb-chat-content p + p {
1544
+ margin-top: 0.75rem;
1545
+ }
1546
+
1547
+ .tb-chat-meta {
1548
+ display: flex;
1549
+ align-items: center;
1550
+ gap: 0.75rem;
1551
+ padding: 0.5rem 1rem;
1552
+ font-size: 0.75rem;
1553
+ color: var(--tb-muted);
1554
+ border-top: 1px solid rgba(99, 102, 241, 0.15);
1555
+ background: rgba(99, 102, 241, 0.03);
1556
+ flex-wrap: wrap;
1557
+ }
1558
+
1559
+ .tb-chat-turn {
1560
+ font-weight: 600;
1561
+ color: var(--tb-text-secondary);
1562
+ background: var(--tb-surface);
1563
+ padding: 0.125rem 0.5rem;
1564
+ border-radius: 9999px;
1565
+ border: 1px solid var(--tb-border);
1566
+ }
1567
+
1568
+ .tb-chat-review-link {
1569
+ color: var(--tb-accent);
1570
+ text-decoration: none;
1571
+ font-weight: 500;
1572
+ margin-left: auto;
1573
+ }
1574
+
1575
+ .tb-chat-review-link:hover {
1576
+ text-decoration: underline;
1577
+ }
1578
+
1579
+ @media (max-width: 768px) {
1580
+ .tb-chat-message {
1581
+ max-width: 95%;
1582
+ }
1583
+ }
1584
+
1585
+ /* ==========================================================================
1586
+ Mobile Responsive Styles
1587
+ ========================================================================== */
1588
+
1589
+ :root {
1590
+ --tb-touch-target: 44px;
1591
+ }
1592
+
1593
+ /* Mobile body padding */
1594
+ @media (max-width: 767px) {
1595
+ body {
1596
+ padding: 1rem;
1597
+ }
1598
+ }
1599
+
1600
+ /* KPI Grid - 2 columns on mobile */
1601
+ @media (max-width: 767px) {
1602
+ .tb-kpis {
1603
+ grid-template-columns: repeat(2, 1fr);
1604
+ gap: 0.75rem;
1605
+ }
1606
+
1607
+ .tb-kpi {
1608
+ padding: 0.75rem 1rem;
1609
+ }
1610
+
1611
+ .tb-kpi span {
1612
+ font-size: 0.6875rem;
1613
+ }
1614
+
1615
+ .tb-kpi strong {
1616
+ font-size: 1.5rem;
1617
+ }
1618
+
1619
+ .tb-container {
1620
+ gap: 1rem;
1621
+ }
1622
+
1623
+ .tb-header h1 {
1624
+ font-size: 1.25rem;
1625
+ }
1626
+ }
1627
+
1628
+ /* Collapsible Filters */
1629
+ .tb-filter-details {
1630
+ border: 1px solid var(--tb-border);
1631
+ border-radius: var(--tb-radius);
1632
+ background: var(--tb-surface);
1633
+ box-shadow: var(--tb-shadow-sm);
1634
+ }
1635
+
1636
+ .tb-filter-summary {
1637
+ display: flex;
1638
+ align-items: center;
1639
+ gap: 0.5rem;
1640
+ padding: 0.75rem 1rem;
1641
+ cursor: pointer;
1642
+ font-weight: 500;
1643
+ list-style: none;
1644
+ min-height: var(--tb-touch-target);
1645
+ }
1646
+
1647
+ .tb-filter-summary::-webkit-details-marker {
1648
+ display: none;
1649
+ }
1650
+
1651
+ .tb-filter-summary-text {
1652
+ font-size: 0.875rem;
1653
+ color: var(--tb-text);
1654
+ }
1655
+
1656
+ .tb-filter-count {
1657
+ background: var(--tb-accent);
1658
+ color: white;
1659
+ font-size: 0.75rem;
1660
+ padding: 0.125rem 0.5rem;
1661
+ border-radius: 9999px;
1662
+ }
1663
+
1664
+ .tb-filter-count:empty {
1665
+ display: none;
1666
+ }
1667
+
1668
+ .tb-filter-chevron {
1669
+ margin-left: auto;
1670
+ color: var(--tb-muted);
1671
+ transition: transform 0.2s ease;
1672
+ }
1673
+
1674
+ .tb-filter-details[open] .tb-filter-chevron {
1675
+ transform: rotate(180deg);
1676
+ }
1677
+
1678
+ .tb-filter-details .tb-filter-form {
1679
+ border: none;
1680
+ border-radius: 0;
1681
+ box-shadow: none;
1682
+ border-top: 1px solid var(--tb-border);
1683
+ }
1684
+
1685
+ /* Desktop: always show filters, hide summary */
1686
+ @media (min-width: 768px) {
1687
+ .tb-filter-summary {
1688
+ display: none;
1689
+ }
1690
+
1691
+ .tb-filter-details .tb-filter-form {
1692
+ display: flex !important;
1693
+ border-top: none;
1694
+ }
1695
+
1696
+ .tb-filter-details {
1697
+ border: none;
1698
+ background: transparent;
1699
+ box-shadow: none;
1700
+ }
1701
+
1702
+ .tb-filters .tb-filter-form {
1703
+ border: 1px solid var(--tb-border);
1704
+ border-radius: var(--tb-radius);
1705
+ background: var(--tb-surface);
1706
+ box-shadow: var(--tb-shadow-sm);
1707
+ }
1708
+ }
1709
+
1710
+ /* Mobile filter layout */
1711
+ @media (max-width: 767px) {
1712
+ .tb-filter-form {
1713
+ padding: 0.75rem;
1714
+ }
1715
+
1716
+ .tb-filter-row {
1717
+ flex-direction: column;
1718
+ gap: 0.75rem;
1719
+ }
1720
+
1721
+ .tb-filter-field {
1722
+ max-width: none;
1723
+ width: 100%;
1724
+ }
1725
+
1726
+ .tb-filter-row-secondary {
1727
+ flex-direction: column;
1728
+ padding-top: 0.75rem;
1729
+ }
1730
+
1731
+ .tb-filter-date-range {
1732
+ width: 100%;
1733
+ }
1734
+
1735
+ .tb-date-inputs {
1736
+ flex-wrap: wrap;
1737
+ }
1738
+
1739
+ .tb-date-inputs input[type="date"] {
1740
+ flex: 1;
1741
+ min-width: 120px;
1742
+ }
1743
+
1744
+ .tb-filter-actions {
1745
+ flex-direction: column;
1746
+ width: 100%;
1747
+ }
1748
+
1749
+ .tb-filter-actions button,
1750
+ .tb-filter-actions input[type="submit"],
1751
+ .tb-filter-actions a {
1752
+ width: 100%;
1753
+ justify-content: center;
1754
+ min-height: var(--tb-touch-target);
1755
+ text-align: center;
1756
+ }
1757
+ }
1758
+
1759
+ /* Touch Targets */
1760
+ @media (max-width: 767px) {
1761
+ button,
1762
+ input[type="submit"],
1763
+ .tb-btn-primary,
1764
+ .tb-btn-secondary {
1765
+ min-height: var(--tb-touch-target);
1766
+ padding: 0.625rem 1rem;
1767
+ }
1768
+
1769
+ .tb-table input[type="checkbox"] {
1770
+ width: 1.25rem;
1771
+ height: 1.25rem;
1772
+ min-width: var(--tb-touch-target);
1773
+ min-height: var(--tb-touch-target);
1774
+ margin: 0;
1775
+ cursor: pointer;
1776
+ }
1777
+
1778
+ .tb-pagination a,
1779
+ .tb-pagination span {
1780
+ min-width: var(--tb-touch-target);
1781
+ min-height: var(--tb-touch-target);
1782
+ padding: 0.5rem 0.75rem;
1783
+ }
1784
+ }
1785
+
1786
+ /* Table Actions Mobile */
1787
+ @media (max-width: 767px) {
1788
+ .tb-table-actions {
1789
+ flex-direction: column;
1790
+ gap: 0.5rem;
1791
+ }
1792
+
1793
+ .tb-table-actions button {
1794
+ width: 100%;
1795
+ justify-content: center;
1796
+ min-height: var(--tb-touch-target);
1797
+ }
1798
+ }
1799
+
1800
+ /* Table to Cards Transformation */
1801
+ @media (max-width: 767px) {
1802
+ .tb-table thead {
1803
+ position: absolute;
1804
+ left: -9999px;
1805
+ width: 1px;
1806
+ height: 1px;
1807
+ overflow: hidden;
1808
+ }
1809
+
1810
+ .tb-table,
1811
+ .tb-table tbody {
1812
+ display: block;
1813
+ }
1814
+
1815
+ .tb-table tbody {
1816
+ padding: 0.75rem;
1817
+ }
1818
+
1819
+ .tb-table tbody tr {
1820
+ display: block;
1821
+ padding: 1rem;
1822
+ margin-bottom: 0.75rem;
1823
+ background: var(--tb-surface);
1824
+ border: 1px solid var(--tb-border);
1825
+ border-radius: var(--tb-radius);
1826
+ box-shadow: var(--tb-shadow-sm);
1827
+ }
1828
+
1829
+ .tb-table tbody tr:last-child {
1830
+ margin-bottom: 0;
1831
+ }
1832
+
1833
+ .tb-table td {
1834
+ display: flex;
1835
+ justify-content: space-between;
1836
+ align-items: center;
1837
+ padding: 0.375rem 0;
1838
+ border-bottom: 1px solid var(--tb-border);
1839
+ text-align: right;
1840
+ min-height: 2rem;
1841
+ }
1842
+
1843
+ .tb-table td:last-child {
1844
+ border-bottom: none;
1845
+ }
1846
+
1847
+ .tb-table td::before {
1848
+ content: attr(data-label);
1849
+ font-size: 0.75rem;
1850
+ font-weight: 600;
1851
+ color: var(--tb-muted);
1852
+ text-transform: uppercase;
1853
+ letter-spacing: 0.025em;
1854
+ text-align: left;
1855
+ flex-shrink: 0;
1856
+ margin-right: 1rem;
1857
+ }
1858
+
1859
+ /* Checkbox cell - no label, centered */
1860
+ .tb-table td[data-label="Select"] {
1861
+ justify-content: center;
1862
+ border-bottom: 1px solid var(--tb-border);
1863
+ padding: 0.5rem 0;
1864
+ }
1865
+
1866
+ .tb-table td[data-label="Select"]::before {
1867
+ display: none;
1868
+ }
1869
+
1870
+ /* Pagination inside table wrapper */
1871
+ .tb-table-wrapper .tb-pagination {
1872
+ flex-wrap: wrap;
1873
+ gap: 0.5rem;
1874
+ }
1875
+
1876
+ .tb-table-wrapper .tb-pagination nav {
1877
+ flex-wrap: wrap;
1878
+ justify-content: center;
1879
+ }
1880
+ }
1881
+
1882
+ /* ==========================================================================
1883
+ Review Section (Chat Show)
1884
+ ========================================================================== */
1885
+
1886
+ .tb-review-bar {
1887
+ display: flex;
1888
+ align-items: center;
1889
+ justify-content: space-between;
1890
+ padding: 0.75rem 1rem;
1891
+ border-bottom: 1px solid var(--tb-border);
1892
+ background: var(--tb-bg);
1893
+ }
1894
+
1895
+ .tb-review-status {
1896
+ display: flex;
1897
+ align-items: center;
1898
+ gap: 0.625rem;
1899
+ }
1900
+
1901
+ .tb-review-status-label {
1902
+ font-size: 0.75rem;
1903
+ font-weight: 600;
1904
+ text-transform: uppercase;
1905
+ letter-spacing: 0.04em;
1906
+ color: var(--tb-muted);
1907
+ }
1908
+
1909
+ .tb-review-bar .tb-review-actions {
1910
+ gap: 0.375rem;
1911
+ }
1912
+
1913
+ .tb-review-bar .tb-review-btn {
1914
+ padding: 0.375rem 0.875rem;
1915
+ font-size: 0.8125rem;
1916
+ }
1917
+
1918
+ /* Comments list */
1919
+ .tb-review-comments {
1920
+ border-bottom: 1px solid var(--tb-border);
1921
+ }
1922
+
1923
+ .tb-review-comment {
1924
+ padding: 0.625rem 1rem;
1925
+ border-bottom: 1px solid var(--tb-border);
1926
+ }
1927
+
1928
+ .tb-review-comment:last-child {
1929
+ border-bottom: none;
1930
+ }
1931
+
1932
+ .tb-review-comment-meta {
1933
+ display: flex;
1934
+ align-items: baseline;
1935
+ gap: 0.5rem;
1936
+ margin-bottom: 0.125rem;
1937
+ }
1938
+
1939
+ .tb-review-comment-author {
1940
+ font-size: 0.8125rem;
1941
+ font-weight: 600;
1942
+ color: var(--tb-text);
1943
+ }
1944
+
1945
+ .tb-review-comment-meta .tb-muted {
1946
+ font-size: 0.75rem;
1947
+ }
1948
+
1949
+ .tb-review-comment-body {
1950
+ margin: 0;
1951
+ font-size: 0.875rem;
1952
+ line-height: 1.5;
1953
+ color: var(--tb-text-secondary);
1954
+ }
1955
+
1956
+ /* Comment compose */
1957
+ .tb-review-compose {
1958
+ display: flex;
1959
+ align-items: stretch;
1960
+ padding: 0.75rem 1rem;
1961
+ gap: 0.5rem;
1962
+ }
1963
+
1964
+ .tb-review-textarea {
1965
+ flex: 1;
1966
+ padding: 0.5rem 0.75rem;
1967
+ font-size: 0.875rem;
1968
+ font-family: inherit;
1969
+ color: var(--tb-text);
1970
+ background: var(--tb-bg);
1971
+ border: 1px solid var(--tb-border-strong);
1972
+ border-radius: var(--tb-radius-sm);
1973
+ resize: vertical;
1974
+ min-height: 2.5rem;
1975
+ line-height: 1.5;
1976
+ box-sizing: border-box;
1977
+ }
1978
+
1979
+ .tb-review-textarea:focus {
1980
+ outline: none;
1981
+ border-color: var(--tb-accent);
1982
+ box-shadow: -3px 0 0 0 rgba(9, 105, 218, 0.08) inset;
1983
+ z-index: 1;
1984
+ position: relative;
1985
+ }
1986
+
1987
+ .tb-review-textarea::placeholder {
1988
+ color: var(--tb-muted);
1989
+ }
1990
+
1991
+ .tb-review-submit {
1992
+ padding: 0.5rem 1.125rem;
1993
+ font-size: 0.8125rem;
1994
+ font-weight: 600;
1995
+ color: var(--tb-surface);
1996
+ background: var(--tb-accent);
1997
+ border: 1px solid var(--tb-accent);
1998
+ border-radius: var(--tb-radius-sm);
1999
+ cursor: pointer;
2000
+ transition: background-color 0.15s ease;
2001
+ white-space: nowrap;
2002
+ align-self: flex-end;
2003
+ min-height: 2.5rem;
2004
+ box-sizing: border-box;
2005
+ }
2006
+
2007
+ .tb-review-submit:hover {
2008
+ background: var(--tb-accent-hover);
2009
+ border-color: var(--tb-accent-hover);
2010
+ }
2011
+
2012
+ .tb-review-submit:focus {
2013
+ outline: none;
2014
+ box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.3);
2015
+ }
2016
+
2017
+ @media (max-width: 767px) {
2018
+ .tb-review-bar {
2019
+ flex-direction: column;
2020
+ align-items: flex-start;
2021
+ gap: 0.625rem;
2022
+ }
2023
+
2024
+ .tb-review-compose {
2025
+ flex-direction: column;
2026
+ gap: 0.5rem;
2027
+ }
2028
+
2029
+ .tb-review-textarea {
2030
+ border-right: 1px solid var(--tb-border-strong);
2031
+ border-radius: var(--tb-radius-sm);
2032
+ }
2033
+
2034
+ .tb-review-submit {
2035
+ border-radius: var(--tb-radius-sm);
2036
+ align-self: flex-start;
2037
+ }
173
2038
  }