@merittdev/horus-lens 0.0.2 → 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,2233 +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
- /* 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
- }