@merittdev/horus-lens 0.0.3 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2456 +0,0 @@
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
- /* Dropdown variant of the config editor — matches the input, with a monochrome
1430
- chevron (inline data-uri so it stays self-contained). */
1431
- .lens-db__intconfig-select {
1432
- appearance: none;
1433
- height: 28px;
1434
- width: 100%;
1435
- max-width: 260px;
1436
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1437
- font-size: 12.5px;
1438
- color: var(--lens-fg);
1439
- background-color: var(--lens-bg);
1440
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238a8a8a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
1441
- background-repeat: no-repeat;
1442
- background-position: right 9px center;
1443
- background-size: 12px;
1444
- border: 1px solid var(--lens-border);
1445
- border-radius: var(--lens-radius);
1446
- padding: 0 28px 0 9px;
1447
- transition: border-color 150ms ease, box-shadow 150ms ease;
1448
- }
1449
-
1450
- .lens-db__intconfig-select:focus {
1451
- outline: none;
1452
- border-color: var(--lens-accent);
1453
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--lens-accent) 20%, transparent);
1454
- }
1455
-
1456
- .lens-db__intconfig-select:disabled {
1457
- background-color: var(--lens-well);
1458
- color: var(--lens-muted);
1459
- cursor: default;
1460
- }
1461
-
1462
- /* Subtle nudge shown when live options couldn't be loaded and we fell back to
1463
- the free-text input. */
1464
- .lens-db__intconfig-note {
1465
- flex-basis: 100%;
1466
- font-size: 11.5px;
1467
- color: var(--lens-muted);
1468
- }
1469
-
1470
- /* Busy/saved affordances occupy the Save button's slot so the row doesn't shift. */
1471
- .lens-db__intconfig-busy,
1472
- .lens-db__intconfig-done {
1473
- display: inline-flex;
1474
- align-items: center;
1475
- justify-content: center;
1476
- flex: none;
1477
- width: 28px;
1478
- height: 28px;
1479
- }
1480
-
1481
- .lens-db__intconfig-done {
1482
- color: var(--lens-dot-ok);
1483
- }
1484
-
1485
- /* Amber nudge when the active destination has no target configured yet. */
1486
- .lens-db__intconfig-hint {
1487
- flex-basis: 100%;
1488
- font-size: 11.5px;
1489
- color: var(--lens-warn-fg);
1490
- }
1491
-
1492
- /* Ghost by default, danger tint on hover — for Disconnect. */
1493
- .lens-db__btn--danger-ghost {
1494
- background: none;
1495
- border-color: transparent;
1496
- color: var(--lens-muted);
1497
- }
1498
-
1499
- .lens-db__btn--danger-ghost:hover:not(:disabled) {
1500
- background: var(--lens-danger-bg);
1501
- border-color: transparent;
1502
- color: var(--lens-danger-fg);
1503
- }
1504
-
1505
- /* Under 560px: mark + name on top, radio/actions wrap to a second line. */
1506
- @media (max-width: 560px) {
1507
- .lens-db__introw {
1508
- grid-template-columns: auto minmax(0, 1fr);
1509
- row-gap: 12px;
1510
- }
1511
-
1512
- .lens-db__introw-right {
1513
- grid-column: 1 / -1;
1514
- justify-self: start;
1515
- flex-wrap: wrap;
1516
- gap: 12px;
1517
- }
1518
-
1519
- /* Config line spans full width and lets the input fill the row. */
1520
- .lens-db__intconfig {
1521
- grid-column: 1 / -1;
1522
- }
1523
-
1524
- .lens-db__intconfig-field {
1525
- flex-basis: 100%;
1526
- }
1527
-
1528
- .lens-db__intconfig-input,
1529
- .lens-db__intconfig-select {
1530
- max-width: none;
1531
- }
1532
- }
1533
-
1534
- /* ---------- Onboarding wizard ---------- */
1535
-
1536
- .lens-db__wizard {
1537
- background: var(--lens-bg);
1538
- border: 1px solid var(--lens-border);
1539
- border-radius: var(--lens-radius-card);
1540
- overflow: hidden;
1541
- width: 100%;
1542
- box-shadow: var(--lens-shadow);
1543
- }
1544
-
1545
- /* ---------- Standalone panel (ProjectSettings) ---------- */
1546
-
1547
- .lens-db__panel {
1548
- display: flex;
1549
- flex-direction: column;
1550
- gap: 14px;
1551
- width: 100%;
1552
- padding: 20px 16px;
1553
- background: var(--lens-bg);
1554
- border: 1px solid var(--lens-border);
1555
- border-radius: var(--lens-radius-card);
1556
- box-shadow: var(--lens-shadow);
1557
- }
1558
-
1559
- .lens-db__panel-actions {
1560
- display: flex;
1561
- align-items: center;
1562
- gap: 12px;
1563
- }
1564
-
1565
- /* ---------- Inline flash notes (OAuth callback / save feedback) ---------- */
1566
-
1567
- .lens-db__flash {
1568
- display: inline-flex;
1569
- align-items: center;
1570
- gap: 8px;
1571
- padding: 8px 12px;
1572
- border-radius: var(--lens-radius);
1573
- border: 1px solid var(--lens-border);
1574
- background: var(--lens-well);
1575
- color: var(--lens-fg);
1576
- font-size: 12.5px;
1577
- }
1578
-
1579
- .lens-db__flash--ok svg {
1580
- flex: none;
1581
- color: var(--lens-ok-fg);
1582
- }
1583
-
1584
- .lens-db__stepper {
1585
- display: flex;
1586
- align-items: center;
1587
- gap: 8px;
1588
- list-style: none;
1589
- margin: 0;
1590
- padding: 16px;
1591
- border-bottom: 1px solid var(--lens-border);
1592
- }
1593
-
1594
- .lens-db__step {
1595
- display: flex;
1596
- align-items: center;
1597
- gap: 8px;
1598
- flex: 1;
1599
- min-width: 0;
1600
- color: var(--lens-muted);
1601
- }
1602
-
1603
- .lens-db__step:not(:last-child)::after {
1604
- content: "";
1605
- flex: 1;
1606
- height: 1px;
1607
- background: var(--lens-border);
1608
- }
1609
-
1610
- .lens-db__step--done:not(:last-child)::after {
1611
- background: var(--lens-accent);
1612
- }
1613
-
1614
- .lens-db__step-dot {
1615
- flex: none;
1616
- width: 24px;
1617
- height: 24px;
1618
- border-radius: 50%;
1619
- display: flex;
1620
- align-items: center;
1621
- justify-content: center;
1622
- font-size: 11px;
1623
- font-weight: 600;
1624
- font-variant-numeric: tabular-nums;
1625
- background: var(--lens-bg);
1626
- border: 1px solid var(--lens-border);
1627
- color: var(--lens-muted);
1628
- }
1629
-
1630
- .lens-db__step--current .lens-db__step-dot {
1631
- background: var(--lens-accent);
1632
- border-color: var(--lens-accent);
1633
- color: var(--lens-accent-fg);
1634
- }
1635
-
1636
- .lens-db__step--done .lens-db__step-dot {
1637
- background: var(--lens-accent-bg);
1638
- border-color: var(--lens-accent);
1639
- color: var(--lens-accent-strong);
1640
- }
1641
-
1642
- .lens-db__step-label {
1643
- font-size: 12px;
1644
- font-weight: 500;
1645
- white-space: nowrap;
1646
- overflow: hidden;
1647
- text-overflow: ellipsis;
1648
- }
1649
-
1650
- .lens-db__step--current .lens-db__step-label {
1651
- color: var(--lens-fg);
1652
- font-weight: 600;
1653
- }
1654
-
1655
- .lens-db__wizard-body {
1656
- padding: 20px 16px;
1657
- }
1658
-
1659
- .lens-db__step-panel {
1660
- display: flex;
1661
- flex-direction: column;
1662
- gap: 14px;
1663
- }
1664
-
1665
- .lens-db__wizard-title {
1666
- margin: 0;
1667
- font-size: 13px;
1668
- font-weight: 600;
1669
- display: flex;
1670
- align-items: center;
1671
- gap: 8px;
1672
- }
1673
-
1674
- .lens-db__wizard-title--ok {
1675
- color: var(--lens-ok-fg);
1676
- }
1677
-
1678
- .lens-db__wizard-lead {
1679
- margin: -8px 0 0;
1680
- font-size: 13px;
1681
- color: var(--lens-muted);
1682
- }
1683
-
1684
- .lens-db__wizard-footer {
1685
- display: flex;
1686
- align-items: center;
1687
- justify-content: space-between;
1688
- gap: 12px;
1689
- padding: 12px 16px;
1690
- border-top: 1px solid var(--lens-border);
1691
- }
1692
-
1693
- .lens-db__wizard-footer-right {
1694
- display: flex;
1695
- align-items: center;
1696
- gap: 8px;
1697
- }
1698
-
1699
- /* ---------- Forms ---------- */
1700
-
1701
- .lens-db__field {
1702
- display: flex;
1703
- flex-direction: column;
1704
- gap: 6px;
1705
- }
1706
-
1707
- .lens-db__field-grid {
1708
- display: grid;
1709
- grid-template-columns: repeat(2, minmax(0, 1fr));
1710
- gap: 14px;
1711
- }
1712
-
1713
- .lens-db__field--wide {
1714
- grid-column: 1 / -1;
1715
- }
1716
-
1717
- .lens-db__label {
1718
- font-size: 12px;
1719
- font-weight: 500;
1720
- color: var(--lens-fg);
1721
- }
1722
-
1723
- .lens-db__input {
1724
- appearance: none;
1725
- width: 100%;
1726
- height: 36px;
1727
- font: inherit;
1728
- font-size: 13px;
1729
- color: var(--lens-fg);
1730
- background: var(--lens-bg);
1731
- border: 1px solid var(--lens-border);
1732
- border-radius: var(--lens-radius);
1733
- padding: 0 10px;
1734
- transition: border-color 150ms ease, box-shadow 150ms ease;
1735
- }
1736
-
1737
- .lens-db__input::placeholder {
1738
- color: color-mix(in srgb, var(--lens-muted) 75%, transparent);
1739
- }
1740
-
1741
- .lens-db__input:focus {
1742
- outline: none;
1743
- border-color: var(--lens-accent);
1744
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--lens-accent) 20%, transparent);
1745
- }
1746
-
1747
- .lens-db__input:disabled {
1748
- background: var(--lens-well);
1749
- color: var(--lens-muted);
1750
- cursor: default;
1751
- }
1752
-
1753
- .lens-db__textarea {
1754
- height: auto;
1755
- padding: 8px 10px;
1756
- resize: vertical;
1757
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1758
- font-size: 12.5px;
1759
- line-height: 1.5;
1760
- }
1761
-
1762
- .lens-db__hint {
1763
- font-size: 12px;
1764
- color: var(--lens-muted);
1765
- }
1766
-
1767
- .lens-db__check {
1768
- display: flex;
1769
- align-items: flex-start;
1770
- gap: 8px;
1771
- font-size: 12.5px;
1772
- cursor: pointer;
1773
- }
1774
-
1775
- .lens-db__check input {
1776
- margin-top: 1px;
1777
- accent-color: var(--lens-accent);
1778
- cursor: pointer;
1779
- }
1780
-
1781
- .lens-db__note {
1782
- padding: 10px 12px;
1783
- border-radius: var(--lens-radius);
1784
- background: var(--lens-well);
1785
- border: 1px solid var(--lens-border);
1786
- color: var(--lens-muted);
1787
- font-size: 12.5px;
1788
- }
1789
-
1790
- /* ---------- S3 verification ---------- */
1791
-
1792
- .lens-db__verify {
1793
- display: flex;
1794
- align-items: center;
1795
- gap: 8px;
1796
- color: var(--lens-muted);
1797
- font-size: 12.5px;
1798
- }
1799
-
1800
- .lens-db__spinner {
1801
- width: 14px;
1802
- height: 14px;
1803
- border-radius: 50%;
1804
- border: 2px solid var(--lens-border);
1805
- border-top-color: var(--lens-accent);
1806
- animation: lens-db-spin 0.7s linear infinite;
1807
- }
1808
-
1809
- @keyframes lens-db-spin {
1810
- to {
1811
- transform: rotate(360deg);
1812
- }
1813
- }
1814
-
1815
- /* ---------- Install / credentials ---------- */
1816
-
1817
- .lens-db__cred {
1818
- display: flex;
1819
- flex-direction: column;
1820
- gap: 6px;
1821
- }
1822
-
1823
- .lens-db__cred-row {
1824
- display: flex;
1825
- align-items: center;
1826
- gap: 8px;
1827
- }
1828
-
1829
- .lens-db__code-inline {
1830
- flex: 1;
1831
- min-width: 0;
1832
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1833
- font-size: 12.5px;
1834
- color: var(--lens-fg);
1835
- background: var(--lens-well);
1836
- border: 1px solid var(--lens-border);
1837
- border-radius: var(--lens-radius);
1838
- padding: 8px 10px;
1839
- overflow-x: auto;
1840
- white-space: nowrap;
1841
- }
1842
-
1843
- .lens-db__code-inline--secret {
1844
- color: var(--lens-amber-fg);
1845
- background: var(--lens-amber-bg);
1846
- border-color: var(--lens-amber-border);
1847
- }
1848
-
1849
- .lens-db__copy-btn {
1850
- flex: none;
1851
- appearance: none;
1852
- display: inline-flex;
1853
- align-items: center;
1854
- gap: 5px;
1855
- border: 1px solid var(--lens-border);
1856
- background: var(--lens-bg);
1857
- color: var(--lens-fg);
1858
- border-radius: var(--lens-radius);
1859
- height: 32px;
1860
- padding: 0 10px;
1861
- font: inherit;
1862
- font-size: 12.5px;
1863
- font-weight: 500;
1864
- cursor: pointer;
1865
- transition: background 150ms ease, border-color 150ms ease, color 150ms ease;
1866
- }
1867
-
1868
- .lens-db__copy-btn:hover {
1869
- background: var(--lens-subtle);
1870
- border-color: var(--lens-muted);
1871
- }
1872
-
1873
- .lens-db__copy-btn--done {
1874
- color: var(--lens-ok-fg);
1875
- border-color: color-mix(in srgb, var(--lens-ok) 40%, var(--lens-border));
1876
- }
1877
-
1878
- .lens-db__copy-btn--ghost {
1879
- border-color: transparent;
1880
- background: none;
1881
- color: var(--lens-muted);
1882
- }
1883
-
1884
- .lens-db__copy-btn--ghost:hover {
1885
- background: var(--lens-subtle);
1886
- border-color: var(--lens-border);
1887
- color: var(--lens-fg);
1888
- }
1889
-
1890
- /* Amber secret warning — precise, not shouty */
1891
- .lens-db__warn-banner {
1892
- border: 1px solid var(--lens-amber-border);
1893
- background: var(--lens-amber-bg);
1894
- border-radius: var(--lens-radius);
1895
- padding: 12px 14px;
1896
- display: flex;
1897
- gap: 10px;
1898
- }
1899
-
1900
- .lens-db__warn-icon {
1901
- flex: none;
1902
- color: var(--lens-amber-fg);
1903
- margin-top: 1px;
1904
- }
1905
-
1906
- .lens-db__warn-body {
1907
- display: flex;
1908
- flex-direction: column;
1909
- gap: 6px;
1910
- min-width: 0;
1911
- flex: 1;
1912
- }
1913
-
1914
- .lens-db__warn-title {
1915
- font-weight: 600;
1916
- font-size: 13px;
1917
- color: var(--lens-amber-fg);
1918
- }
1919
-
1920
- .lens-db__warn-text {
1921
- margin: 0;
1922
- font-size: 12.5px;
1923
- color: var(--lens-amber-fg);
1924
- }
1925
-
1926
- .lens-db__snippet {
1927
- display: flex;
1928
- flex-direction: column;
1929
- gap: 6px;
1930
- }
1931
-
1932
- .lens-db__snippet-head {
1933
- display: flex;
1934
- align-items: center;
1935
- }
1936
-
1937
- .lens-db__codeblock {
1938
- position: relative;
1939
- }
1940
-
1941
- .lens-db__pre {
1942
- margin: 0;
1943
- padding: 12px 14px;
1944
- background: var(--lens-code-bg);
1945
- color: var(--lens-code-fg);
1946
- border-radius: var(--lens-radius);
1947
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1948
- font-size: 12.5px;
1949
- line-height: 1.55;
1950
- overflow-x: auto;
1951
- white-space: pre;
1952
- }
1953
-
1954
- .lens-db__codeblock .lens-db__copy-btn {
1955
- position: absolute;
1956
- top: 8px;
1957
- right: 8px;
1958
- height: 28px;
1959
- padding: 0 10px;
1960
- background: var(--lens-bg);
1961
- border: 1px solid var(--lens-border);
1962
- color: var(--lens-fg);
1963
- box-shadow: var(--lens-shadow);
1964
- }
1965
-
1966
- .lens-db__codeblock .lens-db__copy-btn:hover {
1967
- background: var(--lens-subtle);
1968
- border-color: var(--lens-muted);
1969
- }
1970
-
1971
- .lens-db__codeblock .lens-db__copy-btn--done {
1972
- color: var(--lens-ok-fg);
1973
- }
1974
-
1975
- @media (max-width: 520px) {
1976
- .lens-db__field-grid {
1977
- grid-template-columns: minmax(0, 1fr);
1978
- }
1979
-
1980
- .lens-db__step-label {
1981
- display: none;
1982
- }
1983
- }
1984
-
1985
- /* ---------- Saved S3 config summary (wizard step 3, existing project) ---------- */
1986
-
1987
- .lens-db__s3-summary {
1988
- display: grid;
1989
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1990
- gap: 12px 24px;
1991
- padding: 14px 16px;
1992
- background: var(--lens-well);
1993
- border: 1px solid var(--lens-border);
1994
- border-radius: var(--lens-radius-card);
1995
- }
1996
-
1997
- .lens-db__s3-summary .lens-db__field {
1998
- gap: 3px;
1999
- }
2000
-
2001
- .lens-db__s3-summary-actions {
2002
- display: flex;
2003
- flex-wrap: wrap;
2004
- gap: 8px;
2005
- }
2006
-
2007
- .lens-db__btn--danger {
2008
- color: var(--lens-danger-fg);
2009
- }
2010
-
2011
- .lens-db__btn--danger:hover {
2012
- background: var(--lens-danger-bg);
2013
- }
2014
-
2015
-
2016
- /* ---------- Syntax tokens (GitHub-light palette) ---------- */
2017
-
2018
- .lens-db__tok-kw { color: #cf222e; }
2019
- .lens-db__tok-str { color: #0a3069; }
2020
- .lens-db__tok-com { color: #6e7781; font-style: italic; }
2021
- .lens-db__tok-tag { color: #116329; }
2022
- .lens-db__tok-attr { color: #0550ae; }
2023
- .lens-db__tok-num { color: #953800; }
2024
-
2025
- /* ---------- Storage status (wizard step 3) ---------- */
2026
-
2027
- .lens-db__storage-ok {
2028
- display: flex;
2029
- align-items: flex-start;
2030
- gap: 10px;
2031
- padding: 14px 16px;
2032
- border: 1px solid var(--lens-border);
2033
- border-radius: var(--lens-radius-card);
2034
- background: var(--lens-well);
2035
- }
2036
-
2037
- .lens-db__storage-ok svg {
2038
- flex-shrink: 0;
2039
- margin-top: 2px;
2040
- color: var(--lens-ok-fg);
2041
- }
2042
-
2043
- .lens-db__storage-ok-title {
2044
- font-weight: 600;
2045
- font-size: 13.5px;
2046
- }
2047
-
2048
- .lens-db__warn-banner {
2049
- padding: 12px 14px;
2050
- border: 1px solid var(--lens-amber-border);
2051
- border-radius: var(--lens-radius);
2052
- background: var(--lens-amber-bg);
2053
- color: var(--lens-amber-fg);
2054
- font-size: 13px;
2055
- }
2056
-
2057
- .lens-db__codewrap {
2058
- position: relative;
2059
- }
2060
-
2061
- .lens-db__codewrap .lens-db__copy-btn {
2062
- position: absolute;
2063
- top: 8px;
2064
- right: 8px;
2065
- height: 28px;
2066
- padding: 0 10px;
2067
- background: var(--lens-bg);
2068
- border: 1px solid var(--lens-border);
2069
- color: var(--lens-fg);
2070
- box-shadow: var(--lens-shadow);
2071
- }
2072
-
2073
- /* ===========================================================================
2074
- * Report detail — tabbed layout (Overview / Replay / Logs / Network)
2075
- * Reworks the old single-page stack: a native segmented control below the
2076
- * header, a screenshot frame on Overview, deduped compact error rows on Logs.
2077
- * All monochrome + existing --lens-* variables; danger tint stays muted.
2078
- * ======================================================================== */
2079
-
2080
- /* ---------- Segmented tab control ---------- */
2081
-
2082
- .lens-db__tabs {
2083
- display: flex;
2084
- gap: 4px;
2085
- margin: 12px 16px 0;
2086
- padding: 3px;
2087
- background: var(--lens-well);
2088
- border: 1px solid var(--lens-border);
2089
- border-radius: var(--lens-radius);
2090
- }
2091
-
2092
- .lens-db__tab {
2093
- flex: 1 1 0;
2094
- display: inline-flex;
2095
- align-items: center;
2096
- justify-content: center;
2097
- gap: 6px;
2098
- height: 30px;
2099
- min-width: 0;
2100
- border: none;
2101
- background: none;
2102
- color: var(--lens-muted);
2103
- font: inherit;
2104
- font-size: 12.5px;
2105
- font-weight: 500;
2106
- border-radius: 6px;
2107
- cursor: pointer;
2108
- white-space: nowrap;
2109
- transition: background 150ms ease, color 150ms ease;
2110
- }
2111
-
2112
- .lens-db__tab:hover:not(.lens-db__tab--active) {
2113
- color: var(--lens-fg);
2114
- background: var(--lens-subtle);
2115
- }
2116
-
2117
- .lens-db__tab--active {
2118
- background: var(--lens-accent);
2119
- color: var(--lens-accent-fg);
2120
- }
2121
-
2122
- .lens-db__tab:focus-visible {
2123
- outline: 2px solid var(--lens-accent);
2124
- outline-offset: 2px;
2125
- }
2126
-
2127
- .lens-db__tab-count {
2128
- flex: none;
2129
- display: inline-flex;
2130
- align-items: center;
2131
- justify-content: center;
2132
- min-width: 17px;
2133
- height: 16px;
2134
- padding: 0 5px;
2135
- border-radius: 999px;
2136
- font-size: 11px;
2137
- font-weight: 600;
2138
- font-variant-numeric: tabular-nums;
2139
- background: var(--lens-bg);
2140
- color: var(--lens-muted);
2141
- }
2142
-
2143
- .lens-db__tab--active .lens-db__tab-count {
2144
- background: color-mix(in srgb, var(--lens-accent-fg) 22%, transparent);
2145
- color: var(--lens-accent-fg);
2146
- }
2147
-
2148
- /* Generic tab panel padding (Network + Replay; Overview/Logs use sections). */
2149
- .lens-db__panel {
2150
- padding: 16px;
2151
- }
2152
-
2153
- /* ---------- Screenshot frame ---------- */
2154
-
2155
- .lens-db__shot {
2156
- display: block;
2157
- max-width: 100%;
2158
- border: 1px solid var(--lens-border);
2159
- border-radius: var(--lens-radius);
2160
- overflow: hidden;
2161
- background: var(--lens-well);
2162
- line-height: 0;
2163
- cursor: zoom-in;
2164
- }
2165
-
2166
- .lens-db__shot-img {
2167
- display: block;
2168
- max-width: 100%;
2169
- height: auto;
2170
- }
2171
-
2172
- .lens-db__shot--loading {
2173
- height: 240px;
2174
- cursor: default;
2175
- background: linear-gradient(
2176
- 90deg,
2177
- var(--lens-well) 25%,
2178
- var(--lens-subtle) 37%,
2179
- var(--lens-well) 63%
2180
- );
2181
- background-size: 400% 100%;
2182
- animation: lens-db-shimmer 1.4s ease-in-out infinite;
2183
- }
2184
-
2185
- /* ---------- Logs: scroll containers + deduped error rows ---------- */
2186
-
2187
- .lens-db__scroll {
2188
- max-height: 420px;
2189
- overflow-y: auto;
2190
- border-radius: var(--lens-radius);
2191
- }
2192
-
2193
- .lens-db__errlog {
2194
- list-style: none;
2195
- margin: 0;
2196
- padding: 0;
2197
- display: flex;
2198
- flex-direction: column;
2199
- gap: 6px;
2200
- }
2201
-
2202
- .lens-db__errlog-item {
2203
- border: 1px solid var(--lens-border);
2204
- border-left: 2px solid color-mix(in srgb, var(--lens-danger) 55%, var(--lens-border));
2205
- border-radius: var(--lens-radius);
2206
- background: var(--lens-subtle);
2207
- overflow: hidden;
2208
- }
2209
-
2210
- .lens-db__errlog-summary {
2211
- display: flex;
2212
- align-items: center;
2213
- gap: 8px;
2214
- padding: 8px 10px;
2215
- cursor: pointer;
2216
- list-style: none;
2217
- user-select: none;
2218
- }
2219
-
2220
- .lens-db__errlog-summary::-webkit-details-marker {
2221
- display: none;
2222
- }
2223
-
2224
- .lens-db__errlog-summary::before {
2225
- content: "";
2226
- flex: none;
2227
- width: 0;
2228
- height: 0;
2229
- border-left: 4px solid color-mix(in srgb, var(--lens-danger) 70%, var(--lens-muted));
2230
- border-top: 4px solid transparent;
2231
- border-bottom: 4px solid transparent;
2232
- transition: transform 150ms ease;
2233
- }
2234
-
2235
- .lens-db__errlog-details[open] .lens-db__errlog-summary::before {
2236
- transform: rotate(90deg);
2237
- }
2238
-
2239
- .lens-db__errlog-msg {
2240
- flex: 1;
2241
- min-width: 0;
2242
- overflow: hidden;
2243
- text-overflow: ellipsis;
2244
- white-space: nowrap;
2245
- color: var(--lens-danger-fg);
2246
- font-weight: 500;
2247
- font-size: 12.5px;
2248
- }
2249
-
2250
- .lens-db__errlog-source {
2251
- flex: none;
2252
- font-size: 11px;
2253
- color: var(--lens-muted);
2254
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
2255
- }
2256
-
2257
- .lens-db__errlog-body {
2258
- padding: 0 10px 10px;
2259
- display: flex;
2260
- flex-direction: column;
2261
- gap: 8px;
2262
- }
2263
-
2264
- /* Monochrome ×N occurrence badge */
2265
- .lens-db__count-badge {
2266
- flex: none;
2267
- font-size: 11px;
2268
- font-weight: 600;
2269
- font-variant-numeric: tabular-nums;
2270
- padding: 1px 6px;
2271
- border-radius: 999px;
2272
- background: var(--lens-well);
2273
- color: var(--lens-muted);
2274
- border: 1px solid var(--lens-border);
2275
- }
2276
-
2277
- /* ===========================================================================
2278
- * <LensDashboard> shell — the batteries-included admin surface.
2279
- * A full-width segmented tab bar (Issue Reports / Integrations / Setup), an
2280
- * optional project switcher on the same row, first-run provisioning, and the
2281
- * minted-secret env block. All monochrome + existing --lens-* variables.
2282
- * ======================================================================== */
2283
-
2284
- .lens-db__shell {
2285
- display: flex;
2286
- flex-direction: column;
2287
- gap: 16px;
2288
- width: 100%;
2289
- }
2290
-
2291
- /* Row: [ 3-up segmented tabs .................. ] [ project switcher ] */
2292
- .lens-db__shell-bar {
2293
- display: flex;
2294
- align-items: center;
2295
- gap: 12px;
2296
- }
2297
-
2298
- .lens-db__shell-tabs {
2299
- flex: 1 1 auto;
2300
- min-width: 0;
2301
- display: grid;
2302
- grid-template-columns: repeat(3, 1fr);
2303
- gap: 4px;
2304
- padding: 3px;
2305
- background: var(--lens-well);
2306
- border: 1px solid var(--lens-border);
2307
- border-radius: var(--lens-radius);
2308
- }
2309
-
2310
- .lens-db__shell-tab {
2311
- display: inline-flex;
2312
- align-items: center;
2313
- justify-content: center;
2314
- gap: 7px;
2315
- height: 34px;
2316
- min-width: 0;
2317
- border: none;
2318
- background: none;
2319
- color: var(--lens-muted);
2320
- font: inherit;
2321
- font-size: 13px;
2322
- font-weight: 500;
2323
- border-radius: 6px;
2324
- cursor: pointer;
2325
- white-space: nowrap;
2326
- transition: background 150ms ease, color 150ms ease;
2327
- }
2328
-
2329
- .lens-db__shell-tab svg {
2330
- flex: none;
2331
- }
2332
-
2333
- .lens-db__shell-tab-label {
2334
- overflow: hidden;
2335
- text-overflow: ellipsis;
2336
- }
2337
-
2338
- .lens-db__shell-tab:hover:not(.lens-db__shell-tab--active) {
2339
- color: var(--lens-fg);
2340
- background: var(--lens-subtle);
2341
- }
2342
-
2343
- .lens-db__shell-tab--active {
2344
- background: var(--lens-accent);
2345
- color: var(--lens-accent-fg);
2346
- }
2347
-
2348
- .lens-db__shell-tab:focus-visible {
2349
- outline: 2px solid var(--lens-accent);
2350
- outline-offset: 2px;
2351
- }
2352
-
2353
- /* Project switcher — the intconfig-select look, sized up to 32px. */
2354
- .lens-db__shell-switcher {
2355
- flex: none;
2356
- display: inline-flex;
2357
- align-items: center;
2358
- }
2359
-
2360
- .lens-db__shell-select {
2361
- appearance: none;
2362
- height: 32px;
2363
- max-width: 220px;
2364
- font: inherit;
2365
- font-size: 13px;
2366
- font-weight: 500;
2367
- color: var(--lens-fg);
2368
- background-color: var(--lens-bg);
2369
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238a8a8a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
2370
- background-repeat: no-repeat;
2371
- background-position: right 9px center;
2372
- background-size: 12px;
2373
- border: 1px solid var(--lens-border);
2374
- border-radius: var(--lens-radius);
2375
- padding: 0 30px 0 10px;
2376
- cursor: pointer;
2377
- transition: border-color 150ms ease, box-shadow 150ms ease;
2378
- }
2379
-
2380
- .lens-db__shell-select:focus {
2381
- outline: none;
2382
- border-color: var(--lens-accent);
2383
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--lens-accent) 20%, transparent);
2384
- }
2385
-
2386
- .lens-db__shell-content {
2387
- min-width: 0;
2388
- }
2389
-
2390
- /* Loading placeholder while the project list resolves. */
2391
- .lens-db__shell-loading {
2392
- padding: 40px 16px;
2393
- text-align: center;
2394
- color: var(--lens-muted);
2395
- }
2396
-
2397
- /* ---------- First-run provisioning ---------- */
2398
-
2399
- .lens-db__shell-provision {
2400
- display: flex;
2401
- flex-direction: column;
2402
- gap: 16px;
2403
- }
2404
-
2405
- .lens-db__shell-notice {
2406
- padding: 16px 18px;
2407
- border: 1px solid var(--lens-border);
2408
- border-radius: var(--lens-radius-card);
2409
- background: var(--lens-well);
2410
- box-shadow: var(--lens-shadow);
2411
- }
2412
-
2413
- .lens-db__shell-notice-title {
2414
- margin: 0 0 4px;
2415
- font-size: 14px;
2416
- font-weight: 600;
2417
- color: var(--lens-fg);
2418
- }
2419
-
2420
- .lens-db__shell-notice p:last-child {
2421
- margin: 0;
2422
- }
2423
-
2424
- .lens-db__shell-env {
2425
- display: flex;
2426
- flex-direction: column;
2427
- gap: 8px;
2428
- }
2429
-
2430
- /* Under 560px: tabs stay 3-up with tighter padding; switcher drops to its own
2431
- full-width row above them. */
2432
- @media (max-width: 560px) {
2433
- .lens-db__shell-bar {
2434
- flex-wrap: wrap;
2435
- }
2436
-
2437
- .lens-db__shell-switcher {
2438
- order: -1;
2439
- width: 100%;
2440
- }
2441
-
2442
- .lens-db__shell-select {
2443
- max-width: none;
2444
- width: 100%;
2445
- }
2446
-
2447
- .lens-db__shell-tabs {
2448
- flex-basis: 100%;
2449
- }
2450
-
2451
- .lens-db__shell-tab {
2452
- gap: 5px;
2453
- padding: 0 6px;
2454
- font-size: 12.5px;
2455
- }
2456
- }