@merittdev/horus-lens 0.0.1

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 (42) hide show
  1. package/dist/browser.cjs +31594 -0
  2. package/dist/browser.cjs.map +1 -0
  3. package/dist/browser.d.cts +125 -0
  4. package/dist/browser.d.ts +125 -0
  5. package/dist/browser.js +24 -0
  6. package/dist/browser.js.map +1 -0
  7. package/dist/chunk-DU7HNRF4.js +1644 -0
  8. package/dist/chunk-DU7HNRF4.js.map +1 -0
  9. package/dist/chunk-DWOH2ENF.js +17613 -0
  10. package/dist/chunk-DWOH2ENF.js.map +1 -0
  11. package/dist/chunk-PZ5AY32C.js +10 -0
  12. package/dist/chunk-PZ5AY32C.js.map +1 -0
  13. package/dist/chunk-S6S3ZZQA.js +17225 -0
  14. package/dist/chunk-S6S3ZZQA.js.map +1 -0
  15. package/dist/dashboard.cjs +19774 -0
  16. package/dist/dashboard.cjs.map +1 -0
  17. package/dist/dashboard.css +2233 -0
  18. package/dist/dashboard.d.cts +707 -0
  19. package/dist/dashboard.d.ts +707 -0
  20. package/dist/dashboard.js +2237 -0
  21. package/dist/dashboard.js.map +1 -0
  22. package/dist/index.cjs +30040 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d-BA540Fae.d.ts +80 -0
  25. package/dist/index.d-Bzgtl7-B.d.cts +161 -0
  26. package/dist/index.d-Bzgtl7-B.d.ts +161 -0
  27. package/dist/index.d-DOCLVJGS.d.cts +80 -0
  28. package/dist/index.d.cts +906 -0
  29. package/dist/index.d.ts +906 -0
  30. package/dist/index.js +89 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/lens.min.js +770 -0
  33. package/dist/lens.min.js.map +1 -0
  34. package/dist/react.cjs +31683 -0
  35. package/dist/react.cjs.map +1 -0
  36. package/dist/react.d.cts +100 -0
  37. package/dist/react.d.ts +100 -0
  38. package/dist/react.js +108 -0
  39. package/dist/react.js.map +1 -0
  40. package/dist/rrweb-EYUUZIYR.js +30 -0
  41. package/dist/rrweb-EYUUZIYR.js.map +1 -0
  42. package/package.json +68 -0
@@ -0,0 +1,2233 @@
1
+ /**
2
+ * @horus-lens/dashboard styles.
3
+ *
4
+ * Everything is scoped under `.lens-db` so it composes cleanly into any host
5
+ * dashboard (Tailwind or not). The design is LIGHT-FIRST: default rendering is
6
+ * a white-surface admin component meant to sit inside a light host page. It must
7
+ * NOT flip to dark just because the OS prefers dark — a black card in a light
8
+ * page is the bug we're fixing. Dark mode is therefore opt-in by the host only.
9
+ *
10
+ * Theming is driven by CSS custom properties. Hosts may override any variable.
11
+ *
12
+ * Dark mode activates via three host-controlled mechanisms (never OS preference):
13
+ * 1. `.dark .lens-db` — Tailwind-style `.dark` class on an ancestor
14
+ * 2. `[data-theme="dark"] .lens-db` (and `.lens-db[data-theme="dark"]`)
15
+ * 3. `.lens-db--dark` wrapper — stamped by <LensDashboardProvider theme="dark">
16
+ * A matching light-force set (`.lens-db--light`, `[data-theme="light"]`) lets a
17
+ * host pin light even inside its own dark shell.
18
+ *
19
+ * ---------------------------------------------------------------------------
20
+ * CSS variables (override any of these from the host):
21
+ * Surfaces / text
22
+ * --lens-bg component surface (white)
23
+ * --lens-fg primary text
24
+ * --lens-muted secondary / label text (body-safe, 4.5:1)
25
+ * --lens-border hairline borders
26
+ * --lens-subtle soft hover / header tint
27
+ * --lens-well gray-100 recessed well (inputs off-state, code inline)
28
+ * Accent
29
+ * --lens-accent monochrome accent — black in light, white in dark (links, focus, primary btn)
30
+ * --lens-accent-hover accent hover
31
+ * --lens-accent-fg text on accent
32
+ * --lens-accent-bg accent tint background (badges/chips)
33
+ * --lens-accent-strong accent tint foreground (700-weight)
34
+ * Semantic tints (bg + 700-weight fg, ≥4.5:1)
35
+ * --lens-ok / --lens-ok-bg / --lens-ok-fg
36
+ * --lens-warn / --lens-warn-bg / --lens-warn-fg
37
+ * --lens-danger / --lens-danger-bg / --lens-danger-fg
38
+ * --lens-info-bg / --lens-info-fg
39
+ * Amber warning banner
40
+ * --lens-amber-bg / --lens-amber-border / --lens-amber-fg
41
+ * Code viewport (intentionally dark even in light mode — native for logs)
42
+ * --lens-code-bg / --lens-code-fg
43
+ * Shape
44
+ * --lens-radius inputs / buttons / badges base (8px)
45
+ * --lens-radius-card cards / panels (10px)
46
+ * --lens-shadow the ONLY card shadow allowed
47
+ * ---------------------------------------------------------------------------
48
+ */
49
+
50
+ .lens-db {
51
+ /* Surfaces / text */
52
+ --lens-bg: #ffffff;
53
+ --lens-fg: #0f172a;
54
+ --lens-muted: #64748b;
55
+ --lens-border: #e5e7eb;
56
+ --lens-subtle: #f8fafc;
57
+ --lens-well: #f1f5f9;
58
+
59
+ /* Accent (monochrome) */
60
+ --lens-accent: #111111;
61
+ --lens-accent-hover: #000000;
62
+ --lens-accent-fg: #ffffff;
63
+ --lens-accent-bg: #f4f4f5;
64
+ --lens-accent-strong: #18181b;
65
+
66
+ /* Semantic */
67
+ --lens-ok: #111111;
68
+ --lens-ok-bg: #f4f4f5;
69
+ --lens-ok-fg: #18181b;
70
+ --lens-warn: #52525b;
71
+ --lens-warn-bg: #f4f4f5;
72
+ --lens-warn-fg: #3f3f46;
73
+ --lens-danger: #dc2626;
74
+ --lens-danger-bg: #fef2f2;
75
+ --lens-danger-fg: #b91c1c;
76
+ --lens-info-bg: #f4f4f5;
77
+ --lens-info-fg: #18181b;
78
+
79
+ /* Connected/health signal dot — the one intentional splash of color. */
80
+ --lens-dot-ok: #16a34a;
81
+
82
+ /* Amber warning banner */
83
+ --lens-amber-bg: #fffbeb;
84
+ --lens-amber-border: #fde68a;
85
+ --lens-amber-fg: #78350f;
86
+
87
+ /* Code viewport (stays dark in light mode) */
88
+ --lens-code-bg: #f4f4f5;
89
+ --lens-code-fg: #18181b;
90
+
91
+ /* Shape */
92
+ --lens-radius: 8px;
93
+ --lens-radius-card: 10px;
94
+ --lens-shadow: 0 1px 2px rgb(0 0 0 / 0.04);
95
+
96
+ /* Inherit the host admin's typeface so the component reads as native. */
97
+ font: inherit;
98
+ font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
99
+ font-size: 13.5px;
100
+ line-height: 1.5;
101
+ color: var(--lens-fg);
102
+ box-sizing: border-box;
103
+ -webkit-font-smoothing: antialiased;
104
+ }
105
+
106
+ .lens-db *,
107
+ .lens-db *::before,
108
+ .lens-db *::after {
109
+ box-sizing: border-box;
110
+ }
111
+
112
+ /* ---------- Dark mode: host opt-in ONLY (never OS preference) ---------- */
113
+ .dark .lens-db,
114
+ [data-theme="dark"] .lens-db,
115
+ .lens-db[data-theme="dark"],
116
+ .lens-db--dark .lens-db,
117
+ .lens-db.lens-db--dark {
118
+ --lens-bg: #111318;
119
+ --lens-fg: #f1f5f9;
120
+ --lens-muted: #94a3b8;
121
+ --lens-border: rgba(255, 255, 255, 0.08);
122
+ --lens-subtle: rgba(255, 255, 255, 0.035);
123
+ --lens-well: rgba(255, 255, 255, 0.05);
124
+
125
+ --lens-accent: #fafafa;
126
+ --lens-accent-hover: #ffffff;
127
+ --lens-accent-fg: #111111;
128
+ --lens-accent-bg: rgba(255, 255, 255, 0.08);
129
+ --lens-accent-strong: #e4e4e7;
130
+
131
+ --lens-ok: #4ade80;
132
+ --lens-ok-bg: rgba(74, 222, 128, 0.13);
133
+ --lens-ok-fg: #86efac;
134
+ --lens-warn: #fbbf24;
135
+ --lens-warn-bg: rgba(251, 191, 36, 0.13);
136
+ --lens-warn-fg: #fcd34d;
137
+ --lens-danger: #f87171;
138
+ --lens-danger-bg: rgba(248, 113, 113, 0.13);
139
+ --lens-danger-fg: #fca5a5;
140
+ --lens-info-bg: rgba(96, 165, 250, 0.13);
141
+ --lens-info-fg: #93c5fd;
142
+
143
+ --lens-dot-ok: #4ade80;
144
+
145
+ --lens-amber-bg: rgba(251, 191, 36, 0.1);
146
+ --lens-amber-border: rgba(251, 191, 36, 0.32);
147
+ --lens-amber-fg: #fcd34d;
148
+
149
+ --lens-code-bg: #0b0e14;
150
+ --lens-code-fg: #18181b;
151
+
152
+ --lens-shadow: 0 1px 2px rgb(0 0 0 / 0.4);
153
+ }
154
+
155
+ /* ---------- Light force: lets a host pin light inside a dark shell ---------- */
156
+ .lens-db--light .lens-db,
157
+ .lens-db.lens-db--light,
158
+ [data-theme="light"] .lens-db,
159
+ .lens-db[data-theme="light"] {
160
+ --lens-bg: #ffffff;
161
+ --lens-fg: #0f172a;
162
+ --lens-muted: #64748b;
163
+ --lens-border: #e5e7eb;
164
+ --lens-subtle: #f8fafc;
165
+ --lens-well: #f1f5f9;
166
+ --lens-accent: #111111;
167
+ --lens-accent-hover: #000000;
168
+ --lens-accent-fg: #ffffff;
169
+ --lens-accent-bg: #f4f4f5;
170
+ --lens-accent-strong: #18181b;
171
+ --lens-ok: #111111;
172
+ --lens-ok-bg: #f4f4f5;
173
+ --lens-ok-fg: #18181b;
174
+ --lens-warn: #52525b;
175
+ --lens-warn-bg: #f4f4f5;
176
+ --lens-warn-fg: #3f3f46;
177
+ --lens-danger: #dc2626;
178
+ --lens-danger-bg: #fef2f2;
179
+ --lens-danger-fg: #b91c1c;
180
+ --lens-info-bg: #f4f4f5;
181
+ --lens-info-fg: #18181b;
182
+ --lens-dot-ok: #16a34a;
183
+ --lens-amber-bg: #fffbeb;
184
+ --lens-amber-border: #fde68a;
185
+ --lens-amber-fg: #78350f;
186
+ }
187
+
188
+ /* display:contents wrapper the provider stamps — carries theme vars, no box. */
189
+ .lens-db-theme-scope {
190
+ display: contents;
191
+ }
192
+
193
+ /* ---------- Focus / motion ---------- */
194
+
195
+ .lens-db :focus-visible {
196
+ outline: 2px solid var(--lens-accent);
197
+ outline-offset: 1px;
198
+ border-radius: 4px;
199
+ }
200
+
201
+ @media (prefers-reduced-motion: reduce) {
202
+ .lens-db *,
203
+ .lens-db *::before,
204
+ .lens-db *::after {
205
+ transition-duration: 0.01ms !important;
206
+ animation-duration: 0.01ms !important;
207
+ animation-iteration-count: 1 !important;
208
+ }
209
+ }
210
+
211
+ /* ---------- Shared primitives ---------- */
212
+
213
+ .lens-db__muted {
214
+ color: var(--lens-muted);
215
+ }
216
+
217
+ .lens-db__mono {
218
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
219
+ font-size: 12.5px;
220
+ }
221
+
222
+ .lens-db__num,
223
+ .lens-db__tnum {
224
+ font-variant-numeric: tabular-nums;
225
+ }
226
+
227
+ .lens-db__num {
228
+ text-align: right;
229
+ }
230
+
231
+ .lens-db__center {
232
+ text-align: center;
233
+ }
234
+
235
+ .lens-db__link {
236
+ color: var(--lens-accent);
237
+ text-decoration: none;
238
+ cursor: pointer;
239
+ }
240
+
241
+ .lens-db__link:hover {
242
+ color: var(--lens-accent-hover);
243
+ text-decoration: underline;
244
+ }
245
+
246
+ .lens-db__link-inline {
247
+ display: inline-flex;
248
+ align-items: center;
249
+ gap: 5px;
250
+ }
251
+
252
+ .lens-db__link-btn {
253
+ background: none;
254
+ border: none;
255
+ padding: 0;
256
+ color: var(--lens-accent);
257
+ cursor: pointer;
258
+ font: inherit;
259
+ }
260
+
261
+ .lens-db__link-btn:hover:not(:disabled) {
262
+ color: var(--lens-accent-hover);
263
+ text-decoration: underline;
264
+ }
265
+
266
+ .lens-db__link-btn:disabled {
267
+ color: var(--lens-muted);
268
+ cursor: default;
269
+ text-decoration: none;
270
+ }
271
+
272
+ .lens-db__btn {
273
+ appearance: none;
274
+ display: inline-flex;
275
+ align-items: center;
276
+ justify-content: center;
277
+ gap: 6px;
278
+ height: 32px;
279
+ border: 1px solid var(--lens-border);
280
+ background: var(--lens-bg);
281
+ color: var(--lens-fg);
282
+ border-radius: var(--lens-radius);
283
+ padding: 0 12px;
284
+ font: inherit;
285
+ font-size: 13px;
286
+ font-weight: 500;
287
+ cursor: pointer;
288
+ white-space: nowrap;
289
+ transition: background 150ms ease, border-color 150ms ease, color 150ms ease;
290
+ }
291
+
292
+ .lens-db__btn:hover:not(:disabled) {
293
+ background: var(--lens-subtle);
294
+ border-color: var(--lens-muted);
295
+ }
296
+
297
+ .lens-db__btn:disabled {
298
+ opacity: 0.55;
299
+ cursor: default;
300
+ }
301
+
302
+ .lens-db__btn--sm {
303
+ height: 28px;
304
+ padding: 0 10px;
305
+ font-size: 12.5px;
306
+ }
307
+
308
+ .lens-db__btn--primary {
309
+ background: var(--lens-accent);
310
+ color: var(--lens-accent-fg);
311
+ border-color: var(--lens-accent);
312
+ }
313
+
314
+ .lens-db__btn--primary:hover:not(:disabled) {
315
+ background: var(--lens-accent-hover);
316
+ border-color: var(--lens-accent-hover);
317
+ }
318
+
319
+ .lens-db__btn--ghost {
320
+ background: none;
321
+ border-color: transparent;
322
+ color: var(--lens-muted);
323
+ }
324
+
325
+ .lens-db__btn--ghost:hover:not(:disabled) {
326
+ background: var(--lens-subtle);
327
+ border-color: var(--lens-border);
328
+ color: var(--lens-fg);
329
+ }
330
+
331
+ .lens-db__icon-btn {
332
+ appearance: none;
333
+ display: inline-flex;
334
+ align-items: center;
335
+ justify-content: center;
336
+ width: 30px;
337
+ height: 30px;
338
+ border: 1px solid transparent;
339
+ background: none;
340
+ color: var(--lens-muted);
341
+ cursor: pointer;
342
+ border-radius: var(--lens-radius);
343
+ transition: background 150ms ease, color 150ms ease, border-color 150ms ease;
344
+ }
345
+
346
+ .lens-db__icon-btn:hover {
347
+ background: var(--lens-subtle);
348
+ border-color: var(--lens-border);
349
+ color: var(--lens-fg);
350
+ }
351
+
352
+ .lens-db__error {
353
+ color: var(--lens-danger);
354
+ padding: 8px 0;
355
+ }
356
+
357
+ .lens-db__empty {
358
+ color: var(--lens-muted);
359
+ text-align: center;
360
+ padding: 40px 16px;
361
+ }
362
+
363
+ .lens-db__empty-icon {
364
+ display: inline-flex;
365
+ color: var(--lens-muted);
366
+ opacity: 0.7;
367
+ margin-bottom: 10px;
368
+ }
369
+
370
+ .lens-db__empty-title {
371
+ color: var(--lens-fg);
372
+ font-size: 13.5px;
373
+ font-weight: 500;
374
+ }
375
+
376
+ .lens-db__empty-hint {
377
+ margin-top: 4px;
378
+ font-size: 12.5px;
379
+ color: var(--lens-muted);
380
+ }
381
+
382
+ .lens-db__empty code,
383
+ .lens-db__comment code {
384
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
385
+ background: var(--lens-well);
386
+ border: 1px solid var(--lens-border);
387
+ border-radius: 5px;
388
+ padding: 1px 5px;
389
+ font-size: 12px;
390
+ }
391
+
392
+ /* ---------- Badges ---------- */
393
+
394
+ .lens-db__badge {
395
+ display: inline-flex;
396
+ align-items: center;
397
+ font-size: 10px;
398
+ font-weight: 600;
399
+ letter-spacing: 0.04em;
400
+ text-transform: uppercase;
401
+ line-height: 1.4;
402
+ padding: 4px 8px;
403
+ border-radius: 999px;
404
+ border: 1px solid transparent;
405
+ white-space: nowrap;
406
+ }
407
+
408
+ .lens-db__badge--initiated {
409
+ background: var(--lens-well);
410
+ color: var(--lens-muted);
411
+ border-color: var(--lens-border);
412
+ }
413
+
414
+ .lens-db__badge--submitted {
415
+ background: var(--lens-accent-bg);
416
+ color: var(--lens-accent-strong);
417
+ }
418
+
419
+ .lens-db__badge--triaged {
420
+ background: var(--lens-warn-bg);
421
+ color: var(--lens-warn-fg);
422
+ }
423
+
424
+ .lens-db__badge--linked {
425
+ background: var(--lens-info-bg);
426
+ color: var(--lens-info-fg);
427
+ }
428
+
429
+ .lens-db__badge--resolved {
430
+ background: var(--lens-ok-bg);
431
+ color: var(--lens-ok-fg);
432
+ }
433
+
434
+ .lens-db__badge--danger {
435
+ background: var(--lens-danger-bg);
436
+ color: var(--lens-danger-fg);
437
+ font-variant-numeric: tabular-nums;
438
+ }
439
+
440
+ /* ---------- Table ---------- */
441
+
442
+ .lens-db__table-wrap {
443
+ border: 1px solid var(--lens-border);
444
+ border-radius: var(--lens-radius-card);
445
+ overflow-x: auto;
446
+ background: var(--lens-bg);
447
+ box-shadow: var(--lens-shadow);
448
+ }
449
+
450
+ .lens-db__table {
451
+ width: 100%;
452
+ border-collapse: collapse;
453
+ font-size: 13px;
454
+ }
455
+
456
+ .lens-db__table thead th {
457
+ text-align: left;
458
+ font-weight: 600;
459
+ font-size: 11px;
460
+ letter-spacing: 0.05em;
461
+ text-transform: uppercase;
462
+ color: var(--lens-muted);
463
+ padding: 10px 14px;
464
+ border-bottom: 1px solid var(--lens-border);
465
+ white-space: nowrap;
466
+ }
467
+
468
+ .lens-db__table tbody td {
469
+ height: 44px;
470
+ padding: 0 14px;
471
+ border-bottom: 1px solid var(--lens-border);
472
+ vertical-align: middle;
473
+ }
474
+
475
+ .lens-db__table tbody tr:last-child td {
476
+ border-bottom: none;
477
+ }
478
+
479
+ .lens-db__cell-comment {
480
+ display: block;
481
+ max-width: 320px;
482
+ overflow: hidden;
483
+ text-overflow: ellipsis;
484
+ white-space: nowrap;
485
+ }
486
+
487
+ .lens-db__row--clickable {
488
+ cursor: pointer;
489
+ transition: background 150ms ease;
490
+ }
491
+
492
+ .lens-db__row--clickable:hover {
493
+ background: var(--lens-subtle);
494
+ }
495
+
496
+ .lens-db__row--clickable:focus-visible {
497
+ outline: 2px solid var(--lens-accent);
498
+ outline-offset: -2px;
499
+ border-radius: 0;
500
+ }
501
+
502
+ .lens-db__play {
503
+ display: inline-flex;
504
+ color: var(--lens-accent);
505
+ }
506
+
507
+ .lens-db__table-footer {
508
+ display: flex;
509
+ justify-content: center;
510
+ padding: 12px;
511
+ border-top: 1px solid var(--lens-border);
512
+ }
513
+
514
+ /* ---------- Reports toolbar (search + result context) ---------- */
515
+
516
+ .lens-db__table-toolbar {
517
+ display: flex;
518
+ align-items: center;
519
+ justify-content: space-between;
520
+ gap: 12px;
521
+ padding: 10px 12px;
522
+ border-bottom: 1px solid var(--lens-border);
523
+ }
524
+
525
+ .lens-db__table-search {
526
+ height: 32px;
527
+ max-width: 320px;
528
+ }
529
+
530
+ .lens-db__table-context {
531
+ flex: none;
532
+ font-size: 12px;
533
+ white-space: nowrap;
534
+ }
535
+
536
+ /* ---------- Reports pager (Prev / Next) ---------- */
537
+
538
+ .lens-db__pager {
539
+ justify-content: space-between;
540
+ }
541
+
542
+ /* ---------- Skeletons ---------- */
543
+
544
+ .lens-db__skeleton {
545
+ display: block;
546
+ height: 12px;
547
+ width: 70%;
548
+ border-radius: 5px;
549
+ background: linear-gradient(
550
+ 90deg,
551
+ var(--lens-well) 25%,
552
+ var(--lens-subtle) 37%,
553
+ var(--lens-well) 63%
554
+ );
555
+ background-size: 400% 100%;
556
+ animation: lens-db-shimmer 1.4s ease-in-out infinite;
557
+ }
558
+
559
+ .lens-db__skeleton--avatar {
560
+ width: 32px;
561
+ height: 32px;
562
+ border-radius: 8px;
563
+ }
564
+
565
+ @keyframes lens-db-shimmer {
566
+ 0% {
567
+ background-position: 100% 50%;
568
+ }
569
+ 100% {
570
+ background-position: 0 50%;
571
+ }
572
+ }
573
+
574
+ /* ---------- Detail view ---------- */
575
+
576
+ .lens-db__detail {
577
+ background: var(--lens-bg);
578
+ border: 1px solid var(--lens-border);
579
+ border-radius: var(--lens-radius-card);
580
+ overflow: hidden;
581
+ box-shadow: var(--lens-shadow);
582
+ }
583
+
584
+ .lens-db__detail-loading {
585
+ padding: 24px 16px;
586
+ color: var(--lens-muted);
587
+ }
588
+
589
+ .lens-db__detail-header {
590
+ display: flex;
591
+ align-items: center;
592
+ justify-content: space-between;
593
+ gap: 12px;
594
+ padding: 12px 16px;
595
+ border-bottom: 1px solid var(--lens-border);
596
+ }
597
+
598
+ .lens-db__detail-header-main {
599
+ display: flex;
600
+ align-items: center;
601
+ gap: 10px;
602
+ flex-wrap: wrap;
603
+ }
604
+
605
+ .lens-db__detail-time {
606
+ color: var(--lens-muted);
607
+ font-size: 12.5px;
608
+ font-variant-numeric: tabular-nums;
609
+ }
610
+
611
+ .lens-db__section {
612
+ padding: 16px;
613
+ border-bottom: 1px solid var(--lens-border);
614
+ }
615
+
616
+ .lens-db__section:last-child {
617
+ border-bottom: none;
618
+ }
619
+
620
+ .lens-db__section-title {
621
+ margin: 0 0 10px;
622
+ font-size: 11px;
623
+ font-weight: 600;
624
+ letter-spacing: 0.05em;
625
+ text-transform: uppercase;
626
+ color: var(--lens-muted);
627
+ }
628
+
629
+ .lens-db__comment {
630
+ margin: 0;
631
+ white-space: pre-wrap;
632
+ overflow-wrap: anywhere;
633
+ font-size: 13.5px;
634
+ }
635
+
636
+ /* ---------- Meta grid ---------- */
637
+
638
+ .lens-db__grid {
639
+ display: grid;
640
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
641
+ gap: 12px 24px;
642
+ margin: 0;
643
+ }
644
+
645
+ .lens-db__grid-row {
646
+ display: flex;
647
+ flex-direction: column;
648
+ gap: 2px;
649
+ min-width: 0;
650
+ }
651
+
652
+ .lens-db__grid-label {
653
+ font-size: 11px;
654
+ font-weight: 600;
655
+ letter-spacing: 0.05em;
656
+ text-transform: uppercase;
657
+ color: var(--lens-muted);
658
+ }
659
+
660
+ .lens-db__grid-value {
661
+ min-width: 0;
662
+ overflow-wrap: anywhere;
663
+ font-size: 13px;
664
+ }
665
+
666
+ /* ---------- Target element ---------- */
667
+
668
+ .lens-db__dompath {
669
+ display: block;
670
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
671
+ font-size: 12.5px;
672
+ color: var(--lens-fg);
673
+ background: var(--lens-well);
674
+ border: 1px solid var(--lens-border);
675
+ border-radius: var(--lens-radius);
676
+ padding: 8px 10px;
677
+ overflow-x: auto;
678
+ white-space: nowrap;
679
+ }
680
+
681
+ .lens-db__chips {
682
+ display: flex;
683
+ flex-wrap: wrap;
684
+ gap: 6px;
685
+ margin-top: 10px;
686
+ }
687
+
688
+ .lens-db__chip {
689
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
690
+ font-size: 12px;
691
+ padding: 2px 8px;
692
+ border-radius: 6px;
693
+ background: var(--lens-accent-bg);
694
+ color: var(--lens-accent-strong);
695
+ }
696
+
697
+ /* ---------- Errors ---------- */
698
+
699
+ .lens-db__errors {
700
+ list-style: none;
701
+ margin: 0;
702
+ padding: 0;
703
+ display: flex;
704
+ flex-direction: column;
705
+ gap: 8px;
706
+ }
707
+
708
+ .lens-db__error-item {
709
+ border: 1px solid var(--lens-danger-bg);
710
+ border-radius: var(--lens-radius);
711
+ background: var(--lens-danger-bg);
712
+ overflow: hidden;
713
+ }
714
+
715
+ .lens-db__error-head {
716
+ display: flex;
717
+ align-items: baseline;
718
+ justify-content: space-between;
719
+ gap: 10px;
720
+ padding: 10px 12px;
721
+ }
722
+
723
+ .lens-db__error-msg {
724
+ color: var(--lens-danger-fg);
725
+ font-weight: 500;
726
+ overflow-wrap: anywhere;
727
+ }
728
+
729
+ .lens-db__tag {
730
+ flex: none;
731
+ font-size: 11px;
732
+ color: var(--lens-danger-fg);
733
+ opacity: 0.8;
734
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
735
+ }
736
+
737
+ .lens-db__details {
738
+ border-top: 1px solid color-mix(in srgb, var(--lens-danger) 22%, transparent);
739
+ }
740
+
741
+ .lens-db__details > summary {
742
+ cursor: pointer;
743
+ color: var(--lens-danger-fg);
744
+ font-size: 12px;
745
+ font-weight: 500;
746
+ padding: 8px 12px;
747
+ list-style: none;
748
+ user-select: none;
749
+ }
750
+
751
+ .lens-db__details > summary::-webkit-details-marker {
752
+ display: none;
753
+ }
754
+
755
+ .lens-db__details > summary::before {
756
+ content: "";
757
+ display: inline-block;
758
+ width: 0;
759
+ height: 0;
760
+ margin-right: 8px;
761
+ border-left: 4px solid currentColor;
762
+ border-top: 4px solid transparent;
763
+ border-bottom: 4px solid transparent;
764
+ vertical-align: middle;
765
+ transition: transform 150ms ease;
766
+ }
767
+
768
+ .lens-db__details[open] > summary::before {
769
+ transform: rotate(90deg);
770
+ }
771
+
772
+ .lens-db__stack {
773
+ margin: 0;
774
+ padding: 12px;
775
+ background: var(--lens-code-bg);
776
+ color: var(--lens-code-fg);
777
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
778
+ font-size: 12px;
779
+ line-height: 1.55;
780
+ overflow-x: auto;
781
+ white-space: pre;
782
+ }
783
+
784
+ /* ---------- Console (dark log viewport) ---------- */
785
+
786
+ .lens-db__console {
787
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
788
+ font-size: 12.5px;
789
+ background: var(--lens-code-bg);
790
+ color: var(--lens-code-fg);
791
+ border-radius: var(--lens-radius);
792
+ overflow-x: auto;
793
+ padding: 6px 0;
794
+ }
795
+
796
+ .lens-db__console-line {
797
+ display: flex;
798
+ gap: 12px;
799
+ padding: 2px 12px;
800
+ white-space: pre-wrap;
801
+ overflow-wrap: anywhere;
802
+ }
803
+
804
+ .lens-db__console-level {
805
+ flex: 0 0 40px;
806
+ text-transform: uppercase;
807
+ font-size: 10px;
808
+ letter-spacing: 0.05em;
809
+ padding-top: 2px;
810
+ color: #94a3b8;
811
+ }
812
+
813
+ .lens-db__console-args {
814
+ color: var(--lens-code-fg);
815
+ }
816
+
817
+ .lens-db__console-line--info .lens-db__console-level {
818
+ color: var(--lens-muted);
819
+ }
820
+
821
+ .lens-db__console-line--warn .lens-db__console-level,
822
+ .lens-db__console-line--warn .lens-db__console-args {
823
+ color: #3f3f46;
824
+ font-weight: 500;
825
+ }
826
+
827
+ .lens-db__console-line--error .lens-db__console-level,
828
+ .lens-db__console-line--error .lens-db__console-args {
829
+ color: #111111;
830
+ font-weight: 600;
831
+ }
832
+
833
+ .lens-db__console-line--debug {
834
+ opacity: 0.7;
835
+ }
836
+
837
+ /* ---------- Network ---------- */
838
+
839
+ .lens-db__nettable {
840
+ width: 100%;
841
+ border-collapse: collapse;
842
+ font-size: 12.5px;
843
+ }
844
+
845
+ .lens-db__nettable th {
846
+ text-align: left;
847
+ font-weight: 600;
848
+ font-size: 11px;
849
+ letter-spacing: 0.05em;
850
+ text-transform: uppercase;
851
+ color: var(--lens-muted);
852
+ padding: 6px 8px;
853
+ border-bottom: 1px solid var(--lens-border);
854
+ }
855
+
856
+ .lens-db__nettable td {
857
+ padding: 6px 8px;
858
+ border-bottom: 1px solid var(--lens-border);
859
+ }
860
+
861
+ .lens-db__nettable tr:last-child td {
862
+ border-bottom: none;
863
+ }
864
+
865
+ .lens-db__netrow--bad td {
866
+ background: var(--lens-danger-bg);
867
+ }
868
+
869
+ .lens-db__netrow--bad .lens-db__net-status {
870
+ color: var(--lens-danger-fg);
871
+ font-weight: 600;
872
+ }
873
+
874
+ /* ---------- Replay ---------- */
875
+
876
+ .lens-db__replay {
877
+ display: flex;
878
+ flex-direction: column;
879
+ min-height: 40px;
880
+ }
881
+
882
+ .lens-db__replay-state {
883
+ display: flex;
884
+ align-items: center;
885
+ justify-content: center;
886
+ aspect-ratio: 16 / 10;
887
+ padding: 16px;
888
+ text-align: center;
889
+ color: var(--lens-muted);
890
+ border: 1px solid var(--lens-border);
891
+ border-radius: var(--lens-radius-card);
892
+ background: var(--lens-well);
893
+ }
894
+
895
+ /* Player (frame + controls) — only mounted once rrweb is ready. */
896
+ .lens-db__rp {
897
+ display: none;
898
+ flex-direction: column;
899
+ gap: 8px;
900
+ }
901
+
902
+ .lens-db__rp[data-visible="true"] {
903
+ display: flex;
904
+ }
905
+
906
+ /* Frame: bordered card, viewport aspect set inline; clips the scaled wrapper. */
907
+ .lens-db__rp-frame {
908
+ position: relative;
909
+ overflow: hidden;
910
+ width: 100%;
911
+ aspect-ratio: 16 / 10;
912
+ border: 1px solid var(--lens-border);
913
+ border-radius: var(--lens-radius-card);
914
+ background: var(--lens-well);
915
+ }
916
+
917
+ /* ---------- rrweb replayer base ----------
918
+ * Minimal rules copied from rrweb 2.1.0's dist/style.css (NOT imported in JS).
919
+ * mouseTail is disabled, so the mouse-tail canvas rule is omitted; the
920
+ * .replayer-mouse cursor rules are kept so the pointer is visible during replay.
921
+ * Namespaced under .lens-db__rp-frame so they never leak into the host page. */
922
+ .lens-db__rp-frame .replayer-wrapper {
923
+ position: relative;
924
+ }
925
+
926
+ .lens-db__rp-frame .replayer-wrapper > iframe {
927
+ border: none;
928
+ background: white;
929
+ pointer-events: none;
930
+ }
931
+
932
+ .lens-db__rp-frame .replayer-mouse {
933
+ position: absolute;
934
+ width: 20px;
935
+ height: 20px;
936
+ transition: left 0.05s linear, top 0.05s linear;
937
+ background-size: contain;
938
+ background-position: center center;
939
+ background-repeat: no-repeat;
940
+ background-image: url('data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9JzMwMHB4JyB3aWR0aD0nMzAwcHgnICBmaWxsPSIjMDAwMDAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGRhdGEtbmFtZT0iTGF5ZXIgMSIgdmlld0JveD0iMCAwIDUwIDUwIiB4PSIwcHgiIHk9IjBweCI+PHRpdGxlPkRlc2lnbl90bnA8L3RpdGxlPjxwYXRoIGQ9Ik00OC43MSw0Mi45MUwzNC4wOCwyOC4yOSw0NC4zMywxOEExLDEsMCwwLDAsNDQsMTYuMzlMMi4zNSwxLjA2QTEsMSwwLDAsMCwxLjA2LDIuMzVMMTYuMzksNDRhMSwxLDAsMCwwLDEuNjUuMzZMMjguMjksMzQuMDgsNDIuOTEsNDguNzFhMSwxLDAsMCwwLDEuNDEsMGw0LjM4LTQuMzhBMSwxLDAsMCwwLDQ4LjcxLDQyLjkxWm0tNS4wOSwzLjY3TDI5LDMyYTEsMSwwLDAsMC0xLjQxLDBsLTkuODUsOS44NUwzLjY5LDMuNjlsMzguMTIsMTRMMzIsMjcuNThBMSwxLDAsMCwwLDMyLDI5TDQ2LjU5LDQzLjYyWiI+PC9wYXRoPjwvc3ZnPg==');
941
+ border-color: transparent;
942
+ }
943
+
944
+ .lens-db__rp-frame .replayer-mouse::after {
945
+ content: '';
946
+ display: inline-block;
947
+ width: 20px;
948
+ height: 20px;
949
+ background: var(--lens-accent);
950
+ border-radius: 100%;
951
+ transform: translate(-50%, -50%);
952
+ opacity: 0.3;
953
+ }
954
+
955
+ .lens-db__rp-frame .replayer-mouse.active::after {
956
+ animation: lens-db-rp-click 0.2s ease-in-out 1;
957
+ }
958
+
959
+ @keyframes lens-db-rp-click {
960
+ 0% {
961
+ opacity: 0.3;
962
+ width: 20px;
963
+ height: 20px;
964
+ }
965
+ 50% {
966
+ opacity: 0.5;
967
+ width: 10px;
968
+ height: 10px;
969
+ }
970
+ }
971
+
972
+ /* ---------- Replay controls bar ---------- */
973
+
974
+ .lens-db__rp-bar {
975
+ display: flex;
976
+ align-items: center;
977
+ gap: 10px;
978
+ height: 40px;
979
+ padding: 0 4px;
980
+ }
981
+
982
+ .lens-db__rp-play {
983
+ flex: none;
984
+ appearance: none;
985
+ display: inline-flex;
986
+ align-items: center;
987
+ justify-content: center;
988
+ width: 28px;
989
+ height: 28px;
990
+ border: 1px solid var(--lens-border);
991
+ border-radius: 999px;
992
+ background: var(--lens-accent);
993
+ color: var(--lens-accent-fg);
994
+ cursor: pointer;
995
+ transition: background 150ms ease, border-color 150ms ease, opacity 150ms ease;
996
+ }
997
+
998
+ .lens-db__rp-play:hover {
999
+ background: var(--lens-accent-hover);
1000
+ border-color: var(--lens-accent-hover);
1001
+ }
1002
+
1003
+ .lens-db__rp-play:focus-visible {
1004
+ outline: 2px solid var(--lens-accent);
1005
+ outline-offset: 2px;
1006
+ }
1007
+
1008
+ .lens-db__rp-time {
1009
+ flex: none;
1010
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
1011
+ font-size: 11.5px;
1012
+ font-variant-numeric: tabular-nums;
1013
+ color: var(--lens-muted);
1014
+ min-width: 34px;
1015
+ text-align: center;
1016
+ }
1017
+
1018
+ .lens-db__rp-track {
1019
+ flex: 1 1 auto;
1020
+ position: relative;
1021
+ height: 4px;
1022
+ border-radius: 999px;
1023
+ background: var(--lens-well);
1024
+ cursor: pointer;
1025
+ touch-action: none;
1026
+ }
1027
+
1028
+ .lens-db__rp-track:focus-visible {
1029
+ outline: 2px solid var(--lens-accent);
1030
+ outline-offset: 3px;
1031
+ }
1032
+
1033
+ .lens-db__rp-fill {
1034
+ position: absolute;
1035
+ top: 0;
1036
+ left: 0;
1037
+ height: 100%;
1038
+ border-radius: 999px;
1039
+ background: var(--lens-accent);
1040
+ pointer-events: none;
1041
+ }
1042
+
1043
+ .lens-db__rp-speeds {
1044
+ flex: none;
1045
+ display: inline-flex;
1046
+ gap: 2px;
1047
+ }
1048
+
1049
+ .lens-db__rp-speed {
1050
+ appearance: none;
1051
+ min-width: 28px;
1052
+ height: 24px;
1053
+ padding: 0 6px;
1054
+ border: 1px solid transparent;
1055
+ border-radius: 6px;
1056
+ background: none;
1057
+ color: var(--lens-muted);
1058
+ font: inherit;
1059
+ font-size: 11.5px;
1060
+ font-weight: 600;
1061
+ font-variant-numeric: tabular-nums;
1062
+ cursor: pointer;
1063
+ transition: background 150ms ease, color 150ms ease, border-color 150ms ease;
1064
+ }
1065
+
1066
+ .lens-db__rp-speed:hover:not(.lens-db__rp-speed--on) {
1067
+ color: var(--lens-fg);
1068
+ background: var(--lens-subtle);
1069
+ }
1070
+
1071
+ .lens-db__rp-speed--on {
1072
+ background: var(--lens-accent);
1073
+ color: var(--lens-accent-fg);
1074
+ }
1075
+
1076
+ .lens-db__rp-speed:focus-visible {
1077
+ outline: 2px solid var(--lens-accent);
1078
+ outline-offset: 2px;
1079
+ }
1080
+
1081
+ .lens-db__rp-skip {
1082
+ flex: none;
1083
+ appearance: none;
1084
+ height: 24px;
1085
+ padding: 0 10px;
1086
+ border: 1px solid var(--lens-border);
1087
+ border-radius: 999px;
1088
+ background: none;
1089
+ color: var(--lens-muted);
1090
+ font: inherit;
1091
+ font-size: 11.5px;
1092
+ font-weight: 500;
1093
+ cursor: pointer;
1094
+ white-space: nowrap;
1095
+ transition: background 150ms ease, color 150ms ease, border-color 150ms ease;
1096
+ }
1097
+
1098
+ .lens-db__rp-skip:hover {
1099
+ color: var(--lens-fg);
1100
+ border-color: var(--lens-muted);
1101
+ }
1102
+
1103
+ .lens-db__rp-skip--on {
1104
+ background: var(--lens-accent);
1105
+ color: var(--lens-accent-fg);
1106
+ border-color: var(--lens-accent);
1107
+ }
1108
+
1109
+ .lens-db__rp-skip:focus-visible {
1110
+ outline: 2px solid var(--lens-accent);
1111
+ outline-offset: 2px;
1112
+ }
1113
+
1114
+ /* ---------- Attachments ---------- */
1115
+
1116
+ .lens-db__attachment-list {
1117
+ list-style: none;
1118
+ margin: 0;
1119
+ padding: 0;
1120
+ display: flex;
1121
+ flex-direction: column;
1122
+ gap: 6px;
1123
+ }
1124
+
1125
+ .lens-db__attachment {
1126
+ display: flex;
1127
+ align-items: center;
1128
+ gap: 10px;
1129
+ padding: 8px 10px;
1130
+ border: 1px solid var(--lens-border);
1131
+ border-radius: var(--lens-radius);
1132
+ background: var(--lens-bg);
1133
+ }
1134
+
1135
+ .lens-db__attachment-kind {
1136
+ font-weight: 600;
1137
+ text-transform: capitalize;
1138
+ font-size: 13px;
1139
+ }
1140
+
1141
+ .lens-db__attachment-type {
1142
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1143
+ font-size: 11px;
1144
+ }
1145
+
1146
+ .lens-db__attachment-size {
1147
+ margin-left: auto;
1148
+ font-size: 11px;
1149
+ font-variant-numeric: tabular-nums;
1150
+ }
1151
+
1152
+ /* ---------- Integration list (Linear/Vercel-settings style) ----------
1153
+ * One bordered card; provider rows divided by hairlines. Shared by the
1154
+ * standalone IntegrationSettings surface and the onboarding Destination step.
1155
+ */
1156
+
1157
+ .lens-db__intlist {
1158
+ background: var(--lens-bg);
1159
+ border: 1px solid var(--lens-border);
1160
+ border-radius: var(--lens-radius-card);
1161
+ box-shadow: var(--lens-shadow);
1162
+ overflow: hidden;
1163
+ }
1164
+
1165
+ .lens-db__intlist-head {
1166
+ padding: 14px 16px;
1167
+ border-bottom: 1px solid var(--lens-border);
1168
+ }
1169
+
1170
+ .lens-db__intlist-title {
1171
+ font-size: 13px;
1172
+ font-weight: 600;
1173
+ color: var(--lens-fg);
1174
+ }
1175
+
1176
+ .lens-db__intlist-desc {
1177
+ margin-top: 2px;
1178
+ font-size: 12px;
1179
+ }
1180
+
1181
+ /* Full-bleed inline banner at the card top (OAuth outcome / action error). */
1182
+ .lens-db__intlist-banner {
1183
+ display: flex;
1184
+ align-items: center;
1185
+ gap: 8px;
1186
+ min-height: 40px;
1187
+ padding: 8px 16px;
1188
+ border-bottom: 1px solid var(--lens-border);
1189
+ font-size: 12.5px;
1190
+ animation: lens-db-fade-in 150ms ease;
1191
+ }
1192
+
1193
+ .lens-db__intlist-banner svg {
1194
+ flex: none;
1195
+ }
1196
+
1197
+ .lens-db__intlist-banner--ok {
1198
+ background: var(--lens-ok-bg);
1199
+ color: var(--lens-ok-fg);
1200
+ }
1201
+
1202
+ .lens-db__intlist-banner--error {
1203
+ background: var(--lens-danger-bg);
1204
+ color: var(--lens-danger-fg);
1205
+ }
1206
+
1207
+ @keyframes lens-db-fade-in {
1208
+ from {
1209
+ opacity: 0;
1210
+ }
1211
+ to {
1212
+ opacity: 1;
1213
+ }
1214
+ }
1215
+
1216
+ .lens-db__intlist-load-error {
1217
+ padding: 16px;
1218
+ color: var(--lens-danger);
1219
+ font-size: 13px;
1220
+ }
1221
+
1222
+ /* Row: [mark 36] [name + status] [spacer] [radio + actions right] */
1223
+ .lens-db__introw {
1224
+ display: grid;
1225
+ grid-template-columns: auto minmax(0, 1fr) auto;
1226
+ align-items: center;
1227
+ gap: 12px;
1228
+ min-height: 64px;
1229
+ padding: 12px 16px;
1230
+ border-bottom: 1px solid var(--lens-border);
1231
+ }
1232
+
1233
+ .lens-db__intlist-rows > .lens-db__introw:last-child {
1234
+ border-bottom: none;
1235
+ }
1236
+
1237
+ /* Active destination: subtle tinted left-edge indicator. */
1238
+ .lens-db__introw--active {
1239
+ box-shadow: inset 2px 0 0 var(--lens-accent);
1240
+ }
1241
+
1242
+ .lens-db__intmark {
1243
+ flex: none;
1244
+ width: 36px;
1245
+ height: 36px;
1246
+ border-radius: 9px;
1247
+ display: flex;
1248
+ align-items: center;
1249
+ justify-content: center;
1250
+ color: var(--lens-fg);
1251
+ background: var(--lens-well);
1252
+ border: 1px solid var(--lens-border);
1253
+ }
1254
+
1255
+ .lens-db__intmark-skeleton {
1256
+ width: 36px;
1257
+ height: 36px;
1258
+ border-radius: 9px;
1259
+ }
1260
+
1261
+ .lens-db__intbody {
1262
+ min-width: 0;
1263
+ display: flex;
1264
+ flex-direction: column;
1265
+ }
1266
+
1267
+ .lens-db__intname {
1268
+ font-size: 13.5px;
1269
+ font-weight: 600;
1270
+ color: var(--lens-fg);
1271
+ }
1272
+
1273
+ .lens-db__intstatus {
1274
+ display: flex;
1275
+ align-items: center;
1276
+ gap: 6px;
1277
+ margin-top: 3px;
1278
+ font-size: 12px;
1279
+ color: var(--lens-muted);
1280
+ min-width: 0;
1281
+ }
1282
+
1283
+ .lens-db__intstatus > span:last-child {
1284
+ overflow: hidden;
1285
+ text-overflow: ellipsis;
1286
+ white-space: nowrap;
1287
+ }
1288
+
1289
+ .lens-db__intdot {
1290
+ flex: none;
1291
+ width: 7px;
1292
+ height: 7px;
1293
+ border-radius: 50%;
1294
+ background: color-mix(in srgb, var(--lens-muted) 55%, transparent);
1295
+ }
1296
+
1297
+ .lens-db__intdot--on {
1298
+ background: var(--lens-dot-ok);
1299
+ }
1300
+
1301
+ .lens-db__intdot--pending {
1302
+ background: var(--lens-warn);
1303
+ }
1304
+
1305
+ .lens-db__intdot--off {
1306
+ background: color-mix(in srgb, var(--lens-muted) 55%, transparent);
1307
+ }
1308
+
1309
+ .lens-db__introw-right {
1310
+ display: flex;
1311
+ align-items: center;
1312
+ gap: 14px;
1313
+ justify-self: end;
1314
+ }
1315
+
1316
+ /* Radio-style destination selector. */
1317
+ .lens-db__intradio {
1318
+ appearance: none;
1319
+ display: inline-flex;
1320
+ align-items: center;
1321
+ gap: 7px;
1322
+ background: none;
1323
+ border: none;
1324
+ padding: 2px 2px;
1325
+ margin: -2px -2px;
1326
+ font: inherit;
1327
+ font-size: 12px;
1328
+ font-weight: 500;
1329
+ color: var(--lens-muted);
1330
+ cursor: pointer;
1331
+ white-space: nowrap;
1332
+ transition: color 150ms ease;
1333
+ }
1334
+
1335
+ .lens-db__intradio--active {
1336
+ color: var(--lens-fg);
1337
+ cursor: default;
1338
+ }
1339
+
1340
+ .lens-db__intradio-dot {
1341
+ flex: none;
1342
+ width: 16px;
1343
+ height: 16px;
1344
+ border-radius: 50%;
1345
+ border: 1.5px solid var(--lens-border);
1346
+ display: inline-flex;
1347
+ align-items: center;
1348
+ justify-content: center;
1349
+ transition: border-color 150ms ease;
1350
+ }
1351
+
1352
+ .lens-db__intradio:hover:not(.lens-db__intradio--active) .lens-db__intradio-dot {
1353
+ border-color: var(--lens-muted);
1354
+ }
1355
+
1356
+ .lens-db__intradio--active .lens-db__intradio-dot {
1357
+ border-color: var(--lens-accent);
1358
+ }
1359
+
1360
+ .lens-db__intradio-fill {
1361
+ width: 8px;
1362
+ height: 8px;
1363
+ border-radius: 50%;
1364
+ background: var(--lens-accent);
1365
+ }
1366
+
1367
+ .lens-db__intwait {
1368
+ font-size: 12px;
1369
+ color: var(--lens-muted);
1370
+ white-space: nowrap;
1371
+ }
1372
+
1373
+ /* Subdued config editor line under a connected row (issue-routing target).
1374
+ Sits on its own grid row, indented under the provider name. */
1375
+ .lens-db__intconfig {
1376
+ grid-column: 2 / -1;
1377
+ display: flex;
1378
+ flex-wrap: wrap;
1379
+ align-items: center;
1380
+ gap: 8px 10px;
1381
+ margin-top: 2px;
1382
+ }
1383
+
1384
+ .lens-db__intconfig-field {
1385
+ display: inline-flex;
1386
+ align-items: center;
1387
+ gap: 8px;
1388
+ min-width: 0;
1389
+ flex: 1 1 auto;
1390
+ }
1391
+
1392
+ .lens-db__intconfig-label {
1393
+ font-size: 12px;
1394
+ color: var(--lens-muted);
1395
+ white-space: nowrap;
1396
+ }
1397
+
1398
+ .lens-db__intconfig-input {
1399
+ appearance: none;
1400
+ height: 28px;
1401
+ width: 100%;
1402
+ max-width: 220px;
1403
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1404
+ font-size: 12.5px;
1405
+ color: var(--lens-fg);
1406
+ background: var(--lens-bg);
1407
+ border: 1px solid var(--lens-border);
1408
+ border-radius: var(--lens-radius);
1409
+ padding: 0 9px;
1410
+ transition: border-color 150ms ease, box-shadow 150ms ease;
1411
+ }
1412
+
1413
+ .lens-db__intconfig-input::placeholder {
1414
+ color: color-mix(in srgb, var(--lens-muted) 75%, transparent);
1415
+ }
1416
+
1417
+ .lens-db__intconfig-input:focus {
1418
+ outline: none;
1419
+ border-color: var(--lens-accent);
1420
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--lens-accent) 20%, transparent);
1421
+ }
1422
+
1423
+ .lens-db__intconfig-input:disabled {
1424
+ background: var(--lens-well);
1425
+ color: var(--lens-muted);
1426
+ cursor: default;
1427
+ }
1428
+
1429
+ /* Busy/saved affordances occupy the Save button's slot so the row doesn't shift. */
1430
+ .lens-db__intconfig-busy,
1431
+ .lens-db__intconfig-done {
1432
+ display: inline-flex;
1433
+ align-items: center;
1434
+ justify-content: center;
1435
+ flex: none;
1436
+ width: 28px;
1437
+ height: 28px;
1438
+ }
1439
+
1440
+ .lens-db__intconfig-done {
1441
+ color: var(--lens-dot-ok);
1442
+ }
1443
+
1444
+ /* Amber nudge when the active destination has no target configured yet. */
1445
+ .lens-db__intconfig-hint {
1446
+ flex-basis: 100%;
1447
+ font-size: 11.5px;
1448
+ color: var(--lens-warn-fg);
1449
+ }
1450
+
1451
+ /* Ghost by default, danger tint on hover — for Disconnect. */
1452
+ .lens-db__btn--danger-ghost {
1453
+ background: none;
1454
+ border-color: transparent;
1455
+ color: var(--lens-muted);
1456
+ }
1457
+
1458
+ .lens-db__btn--danger-ghost:hover:not(:disabled) {
1459
+ background: var(--lens-danger-bg);
1460
+ border-color: transparent;
1461
+ color: var(--lens-danger-fg);
1462
+ }
1463
+
1464
+ /* Under 560px: mark + name on top, radio/actions wrap to a second line. */
1465
+ @media (max-width: 560px) {
1466
+ .lens-db__introw {
1467
+ grid-template-columns: auto minmax(0, 1fr);
1468
+ row-gap: 12px;
1469
+ }
1470
+
1471
+ .lens-db__introw-right {
1472
+ grid-column: 1 / -1;
1473
+ justify-self: start;
1474
+ flex-wrap: wrap;
1475
+ gap: 12px;
1476
+ }
1477
+
1478
+ /* Config line spans full width and lets the input fill the row. */
1479
+ .lens-db__intconfig {
1480
+ grid-column: 1 / -1;
1481
+ }
1482
+
1483
+ .lens-db__intconfig-field {
1484
+ flex-basis: 100%;
1485
+ }
1486
+
1487
+ .lens-db__intconfig-input {
1488
+ max-width: none;
1489
+ }
1490
+ }
1491
+
1492
+ /* ---------- Onboarding wizard ---------- */
1493
+
1494
+ .lens-db__wizard {
1495
+ background: var(--lens-bg);
1496
+ border: 1px solid var(--lens-border);
1497
+ border-radius: var(--lens-radius-card);
1498
+ overflow: hidden;
1499
+ width: 100%;
1500
+ box-shadow: var(--lens-shadow);
1501
+ }
1502
+
1503
+ /* ---------- Standalone panel (ProjectSettings) ---------- */
1504
+
1505
+ .lens-db__panel {
1506
+ display: flex;
1507
+ flex-direction: column;
1508
+ gap: 14px;
1509
+ width: 100%;
1510
+ padding: 20px 16px;
1511
+ background: var(--lens-bg);
1512
+ border: 1px solid var(--lens-border);
1513
+ border-radius: var(--lens-radius-card);
1514
+ box-shadow: var(--lens-shadow);
1515
+ }
1516
+
1517
+ .lens-db__panel-actions {
1518
+ display: flex;
1519
+ align-items: center;
1520
+ gap: 12px;
1521
+ }
1522
+
1523
+ /* ---------- Inline flash notes (OAuth callback / save feedback) ---------- */
1524
+
1525
+ .lens-db__flash {
1526
+ display: inline-flex;
1527
+ align-items: center;
1528
+ gap: 8px;
1529
+ padding: 8px 12px;
1530
+ border-radius: var(--lens-radius);
1531
+ border: 1px solid var(--lens-border);
1532
+ background: var(--lens-well);
1533
+ color: var(--lens-fg);
1534
+ font-size: 12.5px;
1535
+ }
1536
+
1537
+ .lens-db__flash--ok svg {
1538
+ flex: none;
1539
+ color: var(--lens-ok-fg);
1540
+ }
1541
+
1542
+ .lens-db__stepper {
1543
+ display: flex;
1544
+ align-items: center;
1545
+ gap: 8px;
1546
+ list-style: none;
1547
+ margin: 0;
1548
+ padding: 16px;
1549
+ border-bottom: 1px solid var(--lens-border);
1550
+ }
1551
+
1552
+ .lens-db__step {
1553
+ display: flex;
1554
+ align-items: center;
1555
+ gap: 8px;
1556
+ flex: 1;
1557
+ min-width: 0;
1558
+ color: var(--lens-muted);
1559
+ }
1560
+
1561
+ .lens-db__step:not(:last-child)::after {
1562
+ content: "";
1563
+ flex: 1;
1564
+ height: 1px;
1565
+ background: var(--lens-border);
1566
+ }
1567
+
1568
+ .lens-db__step--done:not(:last-child)::after {
1569
+ background: var(--lens-accent);
1570
+ }
1571
+
1572
+ .lens-db__step-dot {
1573
+ flex: none;
1574
+ width: 24px;
1575
+ height: 24px;
1576
+ border-radius: 50%;
1577
+ display: flex;
1578
+ align-items: center;
1579
+ justify-content: center;
1580
+ font-size: 11px;
1581
+ font-weight: 600;
1582
+ font-variant-numeric: tabular-nums;
1583
+ background: var(--lens-bg);
1584
+ border: 1px solid var(--lens-border);
1585
+ color: var(--lens-muted);
1586
+ }
1587
+
1588
+ .lens-db__step--current .lens-db__step-dot {
1589
+ background: var(--lens-accent);
1590
+ border-color: var(--lens-accent);
1591
+ color: var(--lens-accent-fg);
1592
+ }
1593
+
1594
+ .lens-db__step--done .lens-db__step-dot {
1595
+ background: var(--lens-accent-bg);
1596
+ border-color: var(--lens-accent);
1597
+ color: var(--lens-accent-strong);
1598
+ }
1599
+
1600
+ .lens-db__step-label {
1601
+ font-size: 12px;
1602
+ font-weight: 500;
1603
+ white-space: nowrap;
1604
+ overflow: hidden;
1605
+ text-overflow: ellipsis;
1606
+ }
1607
+
1608
+ .lens-db__step--current .lens-db__step-label {
1609
+ color: var(--lens-fg);
1610
+ font-weight: 600;
1611
+ }
1612
+
1613
+ .lens-db__wizard-body {
1614
+ padding: 20px 16px;
1615
+ }
1616
+
1617
+ .lens-db__step-panel {
1618
+ display: flex;
1619
+ flex-direction: column;
1620
+ gap: 14px;
1621
+ }
1622
+
1623
+ .lens-db__wizard-title {
1624
+ margin: 0;
1625
+ font-size: 13px;
1626
+ font-weight: 600;
1627
+ display: flex;
1628
+ align-items: center;
1629
+ gap: 8px;
1630
+ }
1631
+
1632
+ .lens-db__wizard-title--ok {
1633
+ color: var(--lens-ok-fg);
1634
+ }
1635
+
1636
+ .lens-db__wizard-lead {
1637
+ margin: -8px 0 0;
1638
+ font-size: 13px;
1639
+ color: var(--lens-muted);
1640
+ }
1641
+
1642
+ .lens-db__wizard-footer {
1643
+ display: flex;
1644
+ align-items: center;
1645
+ justify-content: space-between;
1646
+ gap: 12px;
1647
+ padding: 12px 16px;
1648
+ border-top: 1px solid var(--lens-border);
1649
+ }
1650
+
1651
+ .lens-db__wizard-footer-right {
1652
+ display: flex;
1653
+ align-items: center;
1654
+ gap: 8px;
1655
+ }
1656
+
1657
+ /* ---------- Forms ---------- */
1658
+
1659
+ .lens-db__field {
1660
+ display: flex;
1661
+ flex-direction: column;
1662
+ gap: 6px;
1663
+ }
1664
+
1665
+ .lens-db__field-grid {
1666
+ display: grid;
1667
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1668
+ gap: 14px;
1669
+ }
1670
+
1671
+ .lens-db__field--wide {
1672
+ grid-column: 1 / -1;
1673
+ }
1674
+
1675
+ .lens-db__label {
1676
+ font-size: 12px;
1677
+ font-weight: 500;
1678
+ color: var(--lens-fg);
1679
+ }
1680
+
1681
+ .lens-db__input {
1682
+ appearance: none;
1683
+ width: 100%;
1684
+ height: 36px;
1685
+ font: inherit;
1686
+ font-size: 13px;
1687
+ color: var(--lens-fg);
1688
+ background: var(--lens-bg);
1689
+ border: 1px solid var(--lens-border);
1690
+ border-radius: var(--lens-radius);
1691
+ padding: 0 10px;
1692
+ transition: border-color 150ms ease, box-shadow 150ms ease;
1693
+ }
1694
+
1695
+ .lens-db__input::placeholder {
1696
+ color: color-mix(in srgb, var(--lens-muted) 75%, transparent);
1697
+ }
1698
+
1699
+ .lens-db__input:focus {
1700
+ outline: none;
1701
+ border-color: var(--lens-accent);
1702
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--lens-accent) 20%, transparent);
1703
+ }
1704
+
1705
+ .lens-db__input:disabled {
1706
+ background: var(--lens-well);
1707
+ color: var(--lens-muted);
1708
+ cursor: default;
1709
+ }
1710
+
1711
+ .lens-db__textarea {
1712
+ height: auto;
1713
+ padding: 8px 10px;
1714
+ resize: vertical;
1715
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1716
+ font-size: 12.5px;
1717
+ line-height: 1.5;
1718
+ }
1719
+
1720
+ .lens-db__hint {
1721
+ font-size: 12px;
1722
+ color: var(--lens-muted);
1723
+ }
1724
+
1725
+ .lens-db__check {
1726
+ display: flex;
1727
+ align-items: flex-start;
1728
+ gap: 8px;
1729
+ font-size: 12.5px;
1730
+ cursor: pointer;
1731
+ }
1732
+
1733
+ .lens-db__check input {
1734
+ margin-top: 1px;
1735
+ accent-color: var(--lens-accent);
1736
+ cursor: pointer;
1737
+ }
1738
+
1739
+ .lens-db__note {
1740
+ padding: 10px 12px;
1741
+ border-radius: var(--lens-radius);
1742
+ background: var(--lens-well);
1743
+ border: 1px solid var(--lens-border);
1744
+ color: var(--lens-muted);
1745
+ font-size: 12.5px;
1746
+ }
1747
+
1748
+ /* ---------- S3 verification ---------- */
1749
+
1750
+ .lens-db__verify {
1751
+ display: flex;
1752
+ align-items: center;
1753
+ gap: 8px;
1754
+ color: var(--lens-muted);
1755
+ font-size: 12.5px;
1756
+ }
1757
+
1758
+ .lens-db__spinner {
1759
+ width: 14px;
1760
+ height: 14px;
1761
+ border-radius: 50%;
1762
+ border: 2px solid var(--lens-border);
1763
+ border-top-color: var(--lens-accent);
1764
+ animation: lens-db-spin 0.7s linear infinite;
1765
+ }
1766
+
1767
+ @keyframes lens-db-spin {
1768
+ to {
1769
+ transform: rotate(360deg);
1770
+ }
1771
+ }
1772
+
1773
+ /* ---------- Install / credentials ---------- */
1774
+
1775
+ .lens-db__cred {
1776
+ display: flex;
1777
+ flex-direction: column;
1778
+ gap: 6px;
1779
+ }
1780
+
1781
+ .lens-db__cred-row {
1782
+ display: flex;
1783
+ align-items: center;
1784
+ gap: 8px;
1785
+ }
1786
+
1787
+ .lens-db__code-inline {
1788
+ flex: 1;
1789
+ min-width: 0;
1790
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1791
+ font-size: 12.5px;
1792
+ color: var(--lens-fg);
1793
+ background: var(--lens-well);
1794
+ border: 1px solid var(--lens-border);
1795
+ border-radius: var(--lens-radius);
1796
+ padding: 8px 10px;
1797
+ overflow-x: auto;
1798
+ white-space: nowrap;
1799
+ }
1800
+
1801
+ .lens-db__code-inline--secret {
1802
+ color: var(--lens-amber-fg);
1803
+ background: var(--lens-amber-bg);
1804
+ border-color: var(--lens-amber-border);
1805
+ }
1806
+
1807
+ .lens-db__copy-btn {
1808
+ flex: none;
1809
+ appearance: none;
1810
+ display: inline-flex;
1811
+ align-items: center;
1812
+ gap: 5px;
1813
+ border: 1px solid var(--lens-border);
1814
+ background: var(--lens-bg);
1815
+ color: var(--lens-fg);
1816
+ border-radius: var(--lens-radius);
1817
+ height: 32px;
1818
+ padding: 0 10px;
1819
+ font: inherit;
1820
+ font-size: 12.5px;
1821
+ font-weight: 500;
1822
+ cursor: pointer;
1823
+ transition: background 150ms ease, border-color 150ms ease, color 150ms ease;
1824
+ }
1825
+
1826
+ .lens-db__copy-btn:hover {
1827
+ background: var(--lens-subtle);
1828
+ border-color: var(--lens-muted);
1829
+ }
1830
+
1831
+ .lens-db__copy-btn--done {
1832
+ color: var(--lens-ok-fg);
1833
+ border-color: color-mix(in srgb, var(--lens-ok) 40%, var(--lens-border));
1834
+ }
1835
+
1836
+ .lens-db__copy-btn--ghost {
1837
+ border-color: transparent;
1838
+ background: none;
1839
+ color: var(--lens-muted);
1840
+ }
1841
+
1842
+ .lens-db__copy-btn--ghost:hover {
1843
+ background: var(--lens-subtle);
1844
+ border-color: var(--lens-border);
1845
+ color: var(--lens-fg);
1846
+ }
1847
+
1848
+ /* Amber secret warning — precise, not shouty */
1849
+ .lens-db__warn-banner {
1850
+ border: 1px solid var(--lens-amber-border);
1851
+ background: var(--lens-amber-bg);
1852
+ border-radius: var(--lens-radius);
1853
+ padding: 12px 14px;
1854
+ display: flex;
1855
+ gap: 10px;
1856
+ }
1857
+
1858
+ .lens-db__warn-icon {
1859
+ flex: none;
1860
+ color: var(--lens-amber-fg);
1861
+ margin-top: 1px;
1862
+ }
1863
+
1864
+ .lens-db__warn-body {
1865
+ display: flex;
1866
+ flex-direction: column;
1867
+ gap: 6px;
1868
+ min-width: 0;
1869
+ flex: 1;
1870
+ }
1871
+
1872
+ .lens-db__warn-title {
1873
+ font-weight: 600;
1874
+ font-size: 13px;
1875
+ color: var(--lens-amber-fg);
1876
+ }
1877
+
1878
+ .lens-db__warn-text {
1879
+ margin: 0;
1880
+ font-size: 12.5px;
1881
+ color: var(--lens-amber-fg);
1882
+ }
1883
+
1884
+ .lens-db__snippet {
1885
+ display: flex;
1886
+ flex-direction: column;
1887
+ gap: 6px;
1888
+ }
1889
+
1890
+ .lens-db__snippet-head {
1891
+ display: flex;
1892
+ align-items: center;
1893
+ }
1894
+
1895
+ .lens-db__codeblock {
1896
+ position: relative;
1897
+ }
1898
+
1899
+ .lens-db__pre {
1900
+ margin: 0;
1901
+ padding: 12px 14px;
1902
+ background: var(--lens-code-bg);
1903
+ color: var(--lens-code-fg);
1904
+ border-radius: var(--lens-radius);
1905
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1906
+ font-size: 12.5px;
1907
+ line-height: 1.55;
1908
+ overflow-x: auto;
1909
+ white-space: pre;
1910
+ }
1911
+
1912
+ .lens-db__codeblock .lens-db__copy-btn {
1913
+ position: absolute;
1914
+ top: 8px;
1915
+ right: 8px;
1916
+ height: 28px;
1917
+ padding: 0 10px;
1918
+ background: var(--lens-bg);
1919
+ border: 1px solid var(--lens-border);
1920
+ color: var(--lens-fg);
1921
+ box-shadow: var(--lens-shadow);
1922
+ }
1923
+
1924
+ .lens-db__codeblock .lens-db__copy-btn:hover {
1925
+ background: var(--lens-subtle);
1926
+ border-color: var(--lens-muted);
1927
+ }
1928
+
1929
+ .lens-db__codeblock .lens-db__copy-btn--done {
1930
+ color: var(--lens-ok-fg);
1931
+ }
1932
+
1933
+ @media (max-width: 520px) {
1934
+ .lens-db__field-grid {
1935
+ grid-template-columns: minmax(0, 1fr);
1936
+ }
1937
+
1938
+ .lens-db__step-label {
1939
+ display: none;
1940
+ }
1941
+ }
1942
+
1943
+ /* ---------- Saved S3 config summary (wizard step 3, existing project) ---------- */
1944
+
1945
+ .lens-db__s3-summary {
1946
+ display: grid;
1947
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1948
+ gap: 12px 24px;
1949
+ padding: 14px 16px;
1950
+ background: var(--lens-well);
1951
+ border: 1px solid var(--lens-border);
1952
+ border-radius: var(--lens-radius-card);
1953
+ }
1954
+
1955
+ .lens-db__s3-summary .lens-db__field {
1956
+ gap: 3px;
1957
+ }
1958
+
1959
+ .lens-db__s3-summary-actions {
1960
+ display: flex;
1961
+ flex-wrap: wrap;
1962
+ gap: 8px;
1963
+ }
1964
+
1965
+ .lens-db__btn--danger {
1966
+ color: var(--lens-danger-fg);
1967
+ }
1968
+
1969
+ .lens-db__btn--danger:hover {
1970
+ background: var(--lens-danger-bg);
1971
+ }
1972
+
1973
+
1974
+ /* ---------- Syntax tokens (GitHub-light palette) ---------- */
1975
+
1976
+ .lens-db__tok-kw { color: #cf222e; }
1977
+ .lens-db__tok-str { color: #0a3069; }
1978
+ .lens-db__tok-com { color: #6e7781; font-style: italic; }
1979
+ .lens-db__tok-tag { color: #116329; }
1980
+ .lens-db__tok-attr { color: #0550ae; }
1981
+ .lens-db__tok-num { color: #953800; }
1982
+
1983
+ /* ---------- Storage status (wizard step 3) ---------- */
1984
+
1985
+ .lens-db__storage-ok {
1986
+ display: flex;
1987
+ align-items: flex-start;
1988
+ gap: 10px;
1989
+ padding: 14px 16px;
1990
+ border: 1px solid var(--lens-border);
1991
+ border-radius: var(--lens-radius-card);
1992
+ background: var(--lens-well);
1993
+ }
1994
+
1995
+ .lens-db__storage-ok svg {
1996
+ flex-shrink: 0;
1997
+ margin-top: 2px;
1998
+ color: var(--lens-ok-fg);
1999
+ }
2000
+
2001
+ .lens-db__storage-ok-title {
2002
+ font-weight: 600;
2003
+ font-size: 13.5px;
2004
+ }
2005
+
2006
+ .lens-db__warn-banner {
2007
+ padding: 12px 14px;
2008
+ border: 1px solid var(--lens-amber-border);
2009
+ border-radius: var(--lens-radius);
2010
+ background: var(--lens-amber-bg);
2011
+ color: var(--lens-amber-fg);
2012
+ font-size: 13px;
2013
+ }
2014
+
2015
+ .lens-db__codewrap {
2016
+ position: relative;
2017
+ }
2018
+
2019
+ .lens-db__codewrap .lens-db__copy-btn {
2020
+ position: absolute;
2021
+ top: 8px;
2022
+ right: 8px;
2023
+ height: 28px;
2024
+ padding: 0 10px;
2025
+ background: var(--lens-bg);
2026
+ border: 1px solid var(--lens-border);
2027
+ color: var(--lens-fg);
2028
+ box-shadow: var(--lens-shadow);
2029
+ }
2030
+
2031
+ /* ===========================================================================
2032
+ * Report detail — tabbed layout (Overview / Replay / Logs / Network)
2033
+ * Reworks the old single-page stack: a native segmented control below the
2034
+ * header, a screenshot frame on Overview, deduped compact error rows on Logs.
2035
+ * All monochrome + existing --lens-* variables; danger tint stays muted.
2036
+ * ======================================================================== */
2037
+
2038
+ /* ---------- Segmented tab control ---------- */
2039
+
2040
+ .lens-db__tabs {
2041
+ display: flex;
2042
+ gap: 4px;
2043
+ margin: 12px 16px 0;
2044
+ padding: 3px;
2045
+ background: var(--lens-well);
2046
+ border: 1px solid var(--lens-border);
2047
+ border-radius: var(--lens-radius);
2048
+ }
2049
+
2050
+ .lens-db__tab {
2051
+ flex: 1 1 0;
2052
+ display: inline-flex;
2053
+ align-items: center;
2054
+ justify-content: center;
2055
+ gap: 6px;
2056
+ height: 30px;
2057
+ min-width: 0;
2058
+ border: none;
2059
+ background: none;
2060
+ color: var(--lens-muted);
2061
+ font: inherit;
2062
+ font-size: 12.5px;
2063
+ font-weight: 500;
2064
+ border-radius: 6px;
2065
+ cursor: pointer;
2066
+ white-space: nowrap;
2067
+ transition: background 150ms ease, color 150ms ease;
2068
+ }
2069
+
2070
+ .lens-db__tab:hover:not(.lens-db__tab--active) {
2071
+ color: var(--lens-fg);
2072
+ background: var(--lens-subtle);
2073
+ }
2074
+
2075
+ .lens-db__tab--active {
2076
+ background: var(--lens-accent);
2077
+ color: var(--lens-accent-fg);
2078
+ }
2079
+
2080
+ .lens-db__tab:focus-visible {
2081
+ outline: 2px solid var(--lens-accent);
2082
+ outline-offset: 2px;
2083
+ }
2084
+
2085
+ .lens-db__tab-count {
2086
+ flex: none;
2087
+ display: inline-flex;
2088
+ align-items: center;
2089
+ justify-content: center;
2090
+ min-width: 17px;
2091
+ height: 16px;
2092
+ padding: 0 5px;
2093
+ border-radius: 999px;
2094
+ font-size: 11px;
2095
+ font-weight: 600;
2096
+ font-variant-numeric: tabular-nums;
2097
+ background: var(--lens-bg);
2098
+ color: var(--lens-muted);
2099
+ }
2100
+
2101
+ .lens-db__tab--active .lens-db__tab-count {
2102
+ background: color-mix(in srgb, var(--lens-accent-fg) 22%, transparent);
2103
+ color: var(--lens-accent-fg);
2104
+ }
2105
+
2106
+ /* Generic tab panel padding (Network + Replay; Overview/Logs use sections). */
2107
+ .lens-db__panel {
2108
+ padding: 16px;
2109
+ }
2110
+
2111
+ /* ---------- Screenshot frame ---------- */
2112
+
2113
+ .lens-db__shot {
2114
+ display: block;
2115
+ max-width: 100%;
2116
+ border: 1px solid var(--lens-border);
2117
+ border-radius: var(--lens-radius);
2118
+ overflow: hidden;
2119
+ background: var(--lens-well);
2120
+ line-height: 0;
2121
+ cursor: zoom-in;
2122
+ }
2123
+
2124
+ .lens-db__shot-img {
2125
+ display: block;
2126
+ max-width: 100%;
2127
+ height: auto;
2128
+ }
2129
+
2130
+ .lens-db__shot--loading {
2131
+ height: 240px;
2132
+ cursor: default;
2133
+ background: linear-gradient(
2134
+ 90deg,
2135
+ var(--lens-well) 25%,
2136
+ var(--lens-subtle) 37%,
2137
+ var(--lens-well) 63%
2138
+ );
2139
+ background-size: 400% 100%;
2140
+ animation: lens-db-shimmer 1.4s ease-in-out infinite;
2141
+ }
2142
+
2143
+ /* ---------- Logs: scroll containers + deduped error rows ---------- */
2144
+
2145
+ .lens-db__scroll {
2146
+ max-height: 420px;
2147
+ overflow-y: auto;
2148
+ border-radius: var(--lens-radius);
2149
+ }
2150
+
2151
+ .lens-db__errlog {
2152
+ list-style: none;
2153
+ margin: 0;
2154
+ padding: 0;
2155
+ display: flex;
2156
+ flex-direction: column;
2157
+ gap: 6px;
2158
+ }
2159
+
2160
+ .lens-db__errlog-item {
2161
+ border: 1px solid var(--lens-border);
2162
+ border-left: 2px solid color-mix(in srgb, var(--lens-danger) 55%, var(--lens-border));
2163
+ border-radius: var(--lens-radius);
2164
+ background: var(--lens-subtle);
2165
+ overflow: hidden;
2166
+ }
2167
+
2168
+ .lens-db__errlog-summary {
2169
+ display: flex;
2170
+ align-items: center;
2171
+ gap: 8px;
2172
+ padding: 8px 10px;
2173
+ cursor: pointer;
2174
+ list-style: none;
2175
+ user-select: none;
2176
+ }
2177
+
2178
+ .lens-db__errlog-summary::-webkit-details-marker {
2179
+ display: none;
2180
+ }
2181
+
2182
+ .lens-db__errlog-summary::before {
2183
+ content: "";
2184
+ flex: none;
2185
+ width: 0;
2186
+ height: 0;
2187
+ border-left: 4px solid color-mix(in srgb, var(--lens-danger) 70%, var(--lens-muted));
2188
+ border-top: 4px solid transparent;
2189
+ border-bottom: 4px solid transparent;
2190
+ transition: transform 150ms ease;
2191
+ }
2192
+
2193
+ .lens-db__errlog-details[open] .lens-db__errlog-summary::before {
2194
+ transform: rotate(90deg);
2195
+ }
2196
+
2197
+ .lens-db__errlog-msg {
2198
+ flex: 1;
2199
+ min-width: 0;
2200
+ overflow: hidden;
2201
+ text-overflow: ellipsis;
2202
+ white-space: nowrap;
2203
+ color: var(--lens-danger-fg);
2204
+ font-weight: 500;
2205
+ font-size: 12.5px;
2206
+ }
2207
+
2208
+ .lens-db__errlog-source {
2209
+ flex: none;
2210
+ font-size: 11px;
2211
+ color: var(--lens-muted);
2212
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
2213
+ }
2214
+
2215
+ .lens-db__errlog-body {
2216
+ padding: 0 10px 10px;
2217
+ display: flex;
2218
+ flex-direction: column;
2219
+ gap: 8px;
2220
+ }
2221
+
2222
+ /* Monochrome ×N occurrence badge */
2223
+ .lens-db__count-badge {
2224
+ flex: none;
2225
+ font-size: 11px;
2226
+ font-weight: 600;
2227
+ font-variant-numeric: tabular-nums;
2228
+ padding: 1px 6px;
2229
+ border-radius: 999px;
2230
+ background: var(--lens-well);
2231
+ color: var(--lens-muted);
2232
+ border: 1px solid var(--lens-border);
2233
+ }