@c15t/dev-tools 2.0.0-rc.3 → 2.0.0-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/components/panel.d.ts.map +1 -1
  3. package/dist/components/tabs.d.ts.map +1 -1
  4. package/dist/components/ui.d.ts +8 -0
  5. package/dist/components/ui.d.ts.map +1 -1
  6. package/dist/core/debug-bundle.d.ts +14 -0
  7. package/dist/core/debug-bundle.d.ts.map +1 -0
  8. package/dist/core/devtools.d.ts.map +1 -1
  9. package/dist/core/panel-renderer.d.ts +5 -0
  10. package/dist/core/panel-renderer.d.ts.map +1 -1
  11. package/dist/core/state-manager.d.ts.map +1 -1
  12. package/dist/core/store-connector.d.ts +16 -0
  13. package/dist/core/store-connector.d.ts.map +1 -1
  14. package/dist/core/store-instrumentation.d.ts +13 -0
  15. package/dist/core/store-instrumentation.d.ts.map +1 -0
  16. package/dist/index.cjs +1681 -905
  17. package/dist/index.js +1680 -904
  18. package/dist/panels/actions.d.ts +1 -0
  19. package/dist/panels/actions.d.ts.map +1 -1
  20. package/dist/panels/consents.d.ts.map +1 -1
  21. package/dist/panels/events.d.ts.map +1 -1
  22. package/dist/panels/iab.d.ts.map +1 -1
  23. package/dist/panels/location.d.ts.map +1 -1
  24. package/dist/panels/scripts.d.ts.map +1 -1
  25. package/dist/react.cjs +1610 -748
  26. package/dist/react.js +1610 -748
  27. package/dist/tanstack.cjs +1565 -532
  28. package/dist/tanstack.js +1565 -532
  29. package/dist/utils/preference-trigger.d.ts.map +1 -1
  30. package/dist/version.d.ts +1 -1
  31. package/package.json +9 -9
  32. package/tsconfig.json +9 -1
  33. package/dist/__tests__/components/ui.test.d.ts +0 -2
  34. package/dist/__tests__/components/ui.test.d.ts.map +0 -1
  35. package/dist/__tests__/core/override-storage.test.d.ts +0 -2
  36. package/dist/__tests__/core/override-storage.test.d.ts.map +0 -1
  37. package/dist/__tests__/core/renderer.test.d.ts +0 -2
  38. package/dist/__tests__/core/renderer.test.d.ts.map +0 -1
  39. package/dist/__tests__/core/reset-consents.test.d.ts +0 -2
  40. package/dist/__tests__/core/reset-consents.test.d.ts.map +0 -1
  41. package/dist/__tests__/core/state-manager.test.d.ts +0 -2
  42. package/dist/__tests__/core/state-manager.test.d.ts.map +0 -1
  43. package/dist/__tests__/core/store-connector.test.d.ts +0 -2
  44. package/dist/__tests__/core/store-connector.test.d.ts.map +0 -1
  45. package/dist/__tests__/panels/dom-scanner.test.d.ts +0 -2
  46. package/dist/__tests__/panels/dom-scanner.test.d.ts.map +0 -1
  47. package/dist/__tests__/panels/events.test.d.ts +0 -2
  48. package/dist/__tests__/panels/events.test.d.ts.map +0 -1
  49. package/dist/__tests__/panels/iab.test.d.ts +0 -2
  50. package/dist/__tests__/panels/iab.test.d.ts.map +0 -1
  51. package/dist/__tests__/panels/scripts.test.d.ts +0 -2
  52. package/dist/__tests__/panels/scripts.test.d.ts.map +0 -1
  53. package/dist/__tests__/utils/preference-trigger.test.d.ts +0 -2
  54. package/dist/__tests__/utils/preference-trigger.test.d.ts.map +0 -1
package/dist/tanstack.cjs CHANGED
@@ -260,21 +260,21 @@ var __webpack_modules__ = {
260
260
  module.id,
261
261
  `.toggle-bPZtik {
262
262
  border-radius: var(--c15t-radius-full, 9999px);
263
- background-color: var(--c15t-switch-track, #ccc);
263
+ background-color: var(--c15t-switch-track, #d9d9d9);
264
264
  cursor: pointer;
265
- width: 36px;
266
- height: 20px;
267
- transition: background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
265
+ width: 2rem;
266
+ height: 1.25rem;
267
+ transition: background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), box-shadow var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
268
268
  border: none;
269
269
  align-items: center;
270
- padding: 0;
270
+ padding: .125rem;
271
271
  display: inline-flex;
272
272
  position: relative;
273
273
  }
274
274
 
275
275
  .toggle-bPZtik:focus-visible {
276
- outline: 2px solid var(--c15t-primary, #335cff);
277
- outline-offset: 2px;
276
+ box-shadow: 0 0 0 2px var(--c15t-devtools-focus-ring, #335cff);
277
+ outline: none;
278
278
  }
279
279
 
280
280
  .toggleActive-Ldlasg {
@@ -284,16 +284,16 @@ var __webpack_modules__ = {
284
284
  .toggleThumb-hjGfoX {
285
285
  border-radius: var(--c15t-radius-full, 9999px);
286
286
  background-color: var(--c15t-switch-thumb, #fff);
287
- width: 16px;
288
- height: 16px;
289
- transition: transform var(--c15t-duration-fast, .1s) var(--c15t-easing-spring, cubic-bezier(.34, 1.56, .64, 1));
287
+ width: .75rem;
288
+ height: .75rem;
289
+ box-shadow: 0 0 0 1px var(--c15t-border, #e3e3e3);
290
+ transition: transform var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
290
291
  position: absolute;
291
292
  left: 2px;
292
- box-shadow: 0 1px 2px #0003;
293
293
  }
294
294
 
295
295
  .toggleActive-Ldlasg .toggleThumb-hjGfoX {
296
- transform: translateX(16px);
296
+ transform: translateX(1rem);
297
297
  }
298
298
 
299
299
  .toggle-bPZtik:disabled, .toggleDisabled-ZcD8nZ {
@@ -306,13 +306,14 @@ var __webpack_modules__ = {
306
306
  }
307
307
 
308
308
  .badge-yA0giZ {
309
- border-radius: var(--c15t-radius-sm, .25rem);
309
+ border-radius: var(--c15t-radius-full, 9999px);
310
310
  font-size: var(--c15t-devtools-font-size-xs, .75rem);
311
311
  font-weight: var(--c15t-font-weight-medium, 500);
312
+ line-height: var(--c15t-line-height-tight, 1.25);
312
313
  white-space: nowrap;
314
+ justify-content: center;
313
315
  align-items: center;
314
- padding: 2px 6px;
315
- line-height: 1;
316
+ padding: .1875rem .4375rem;
316
317
  display: inline-flex;
317
318
  }
318
319
 
@@ -345,35 +346,36 @@ var __webpack_modules__ = {
345
346
  justify-content: center;
346
347
  align-items: center;
347
348
  gap: var(--c15t-space-xs, .25rem);
348
- border: 1px solid var(--c15t-border, #e3e3e3);
349
+ border: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
349
350
  border-radius: var(--c15t-radius-md, .5rem);
350
- background-color: var(--c15t-surface, #fff);
351
- min-height: 30px;
351
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
352
+ min-height: 2rem;
352
353
  color: var(--c15t-text, #171717);
353
- font-family: inherit;
354
- font-size: 12px;
354
+ font-family: var(--c15t-font-family, system-ui, -apple-system, sans-serif);
355
+ font-size: var(--c15t-font-size-sm, .875rem);
355
356
  font-weight: var(--c15t-font-weight-medium, 500);
357
+ line-height: var(--c15t-line-height-tight, 1.25);
358
+ box-shadow: var(--c15t-shadow-sm, 0 1px 2px #0000000d);
356
359
  cursor: pointer;
357
360
  transition: background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), border-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), box-shadow var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
358
- padding: 5px 10px;
359
- line-height: 1;
361
+ padding: .375rem .625rem;
360
362
  display: inline-flex;
361
- box-shadow: 0 1px 1px #0000000a;
362
363
  }
363
364
 
364
365
  .btn-evRVlh:hover {
365
- background-color: var(--c15t-surface-hover, #f7f7f7);
366
+ background-color: var(--c15t-devtools-surface-subtle, #f7f7f7);
366
367
  border-color: var(--c15t-border-hover, #c9c9c9);
367
- box-shadow: 0 2px 6px #00000014;
368
+ box-shadow: var(--c15t-shadow-md, 0 4px 12px #00000014);
368
369
  }
369
370
 
370
371
  .btn-evRVlh:focus-visible {
371
- outline: 2px solid var(--c15t-primary, #335cff);
372
- outline-offset: 1px;
372
+ box-shadow: var(--c15t-shadow-sm, 0 1px 2px #0000000d), 0 0 0 2px var(--c15t-devtools-focus-ring, #335cff);
373
+ outline: none;
373
374
  }
374
375
 
375
376
  .btn-evRVlh:active {
376
- box-shadow: 0 1px 2px #00000014;
377
+ box-shadow: var(--c15t-shadow-sm, 0 1px 2px #0000000d);
378
+ transform: scale(.98);
377
379
  }
378
380
 
379
381
  .btn-evRVlh:disabled {
@@ -386,6 +388,7 @@ var __webpack_modules__ = {
386
388
  background-color: var(--c15t-primary, #335cff);
387
389
  border-color: var(--c15t-primary, #335cff);
388
390
  color: var(--c15t-text-on-primary, #fff);
391
+ box-shadow: none;
389
392
  }
390
393
 
391
394
  .btnPrimary-dA6nqY:hover {
@@ -397,6 +400,7 @@ var __webpack_modules__ = {
397
400
  background-color: var(--c15t-devtools-badge-error, #ef4343);
398
401
  border-color: var(--c15t-devtools-badge-error, #ef4343);
399
402
  color: var(--c15t-text-on-primary, #fff);
403
+ box-shadow: none;
400
404
  }
401
405
 
402
406
  .btnDanger-eDnqOX:hover {
@@ -405,10 +409,10 @@ var __webpack_modules__ = {
405
409
  }
406
410
 
407
411
  .btnSmall-TjXoqZ {
412
+ min-height: 1.75rem;
413
+ font-size: var(--c15t-devtools-font-size-xs, .75rem);
408
414
  border-radius: var(--c15t-radius-sm, .375rem);
409
- min-height: 26px;
410
- padding: 3px 8px;
411
- font-size: 11px;
415
+ padding: .25rem .5rem;
412
416
  }
413
417
 
414
418
  .btnIcon-fiYQAh {
@@ -418,19 +422,22 @@ var __webpack_modules__ = {
418
422
  }
419
423
 
420
424
  .input-IeTcCs {
421
- width: 100%;
422
- padding: var(--c15t-space-xs, .25rem) var(--c15t-space-sm, .5rem);
423
- border: 1px solid var(--c15t-border, #e3e3e3);
425
+ border: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
424
426
  border-radius: var(--c15t-radius-md, .5rem);
425
- background-color: var(--c15t-surface, #fff);
427
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
428
+ width: 100%;
429
+ min-height: 2rem;
426
430
  color: var(--c15t-text, #171717);
427
- font-family: inherit;
428
- font-size: var(--c15t-font-size-sm, .875rem);
429
- transition: border-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
431
+ font-family: var(--c15t-font-family, system-ui, -apple-system, sans-serif);
432
+ font-size: var(--c15t-devtools-font-size-xs, .75rem);
433
+ line-height: var(--c15t-line-height-tight, 1.25);
434
+ transition: border-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), box-shadow var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
435
+ padding: .375rem .625rem;
430
436
  }
431
437
 
432
438
  .input-IeTcCs:focus {
433
- border-color: var(--c15t-primary, #335cff);
439
+ border-color: var(--c15t-devtools-focus-ring, #335cff);
440
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--c15t-devtools-focus-ring, #335cff) 25%, transparent);
434
441
  outline: none;
435
442
  }
436
443
 
@@ -439,30 +446,35 @@ var __webpack_modules__ = {
439
446
  }
440
447
 
441
448
  .inputSmall-pJyXcL {
442
- padding: 2px var(--c15t-space-xs, .25rem);
449
+ min-height: 1.625rem;
443
450
  font-size: var(--c15t-devtools-font-size-xs, .75rem);
451
+ padding: .25rem .4375rem;
444
452
  }
445
453
 
446
454
  .select-byJ1WM {
447
- width: 100%;
448
- padding: var(--c15t-space-xs, .25rem) var(--c15t-space-sm, .5rem);
449
- border: 1px solid var(--c15t-border, #e3e3e3);
455
+ border: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
450
456
  border-radius: var(--c15t-radius-md, .5rem);
451
- background-color: var(--c15t-surface, #fff);
457
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
458
+ width: 100%;
459
+ min-height: 2rem;
452
460
  color: var(--c15t-text, #171717);
453
- font-family: inherit;
461
+ font-family: var(--c15t-font-family, system-ui, -apple-system, sans-serif);
454
462
  font-size: var(--c15t-devtools-font-size-xs, .75rem);
463
+ line-height: var(--c15t-line-height-tight, 1.25);
455
464
  cursor: pointer;
465
+ transition: border-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), box-shadow var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
466
+ padding: .375rem .625rem;
456
467
  }
457
468
 
458
469
  .select-byJ1WM:focus {
459
- border-color: var(--c15t-primary, #335cff);
470
+ border-color: var(--c15t-devtools-focus-ring, #335cff);
471
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--c15t-devtools-focus-ring, #335cff) 25%, transparent);
460
472
  outline: none;
461
473
  }
462
474
 
463
475
  .grid-LlrmEz {
464
476
  gap: var(--c15t-space-sm, .5rem);
465
- padding: var(--c15t-space-sm, .5rem) var(--c15t-space-md, 1rem);
477
+ padding: var(--c15t-space-md, 1rem);
466
478
  display: grid;
467
479
  }
468
480
 
@@ -475,42 +487,51 @@ var __webpack_modules__ = {
475
487
  }
476
488
 
477
489
  .gridCard-Qm5xxI {
478
- padding: var(--c15t-space-sm, .5rem) var(--c15t-space-md, .75rem);
479
- border: 1px solid var(--c15t-border, #e3e3e3);
480
- border-radius: var(--c15t-radius-md, .5rem);
481
- background-color: var(--c15t-surface, #fff);
482
- transition: border-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
483
490
  justify-content: space-between;
484
491
  align-items: center;
492
+ gap: var(--c15t-space-sm, .5rem);
493
+ border: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
494
+ border-radius: var(--c15t-radius-md, .5rem);
495
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
496
+ min-height: 2.75rem;
497
+ box-shadow: var(--c15t-shadow-sm, 0 1px 2px #0000000d);
498
+ transition: border-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
499
+ padding: .5625rem .75rem;
485
500
  display: flex;
486
501
  }
487
502
 
488
503
  .gridCard-Qm5xxI:hover {
489
504
  border-color: var(--c15t-border-hover, #c9c9c9);
505
+ background-color: var(--c15t-devtools-surface-subtle, #fafafa);
490
506
  }
491
507
 
492
508
  .gridCardTitle-HjXETp {
493
509
  font-size: var(--c15t-devtools-font-size-xs, .75rem);
494
510
  font-weight: var(--c15t-font-weight-medium, 500);
495
511
  color: var(--c15t-text, #171717);
512
+ line-height: var(--c15t-line-height-tight, 1.25);
496
513
  }
497
514
 
498
515
  .listItem-XUKGIo {
499
- padding: var(--c15t-space-xs, .25rem) var(--c15t-space-md, 1rem);
500
- border-bottom: 1px solid var(--c15t-border, #e3e3e3);
501
516
  justify-content: space-between;
502
517
  align-items: center;
518
+ gap: var(--c15t-space-sm, .5rem);
519
+ border: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
520
+ border-radius: var(--c15t-radius-md, .5rem);
521
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
522
+ margin-bottom: .375rem;
523
+ padding: .625rem .75rem;
503
524
  display: flex;
504
525
  }
505
526
 
506
527
  .listItem-XUKGIo:last-child {
507
- border-bottom: none;
528
+ margin-bottom: 0;
508
529
  }
509
530
 
510
531
  .listItemContent-WDBF1N {
511
532
  flex-direction: column;
512
533
  flex: 1;
513
- gap: 2px;
534
+ gap: .1875rem;
514
535
  min-width: 0;
515
536
  display: flex;
516
537
  }
@@ -524,6 +545,7 @@ var __webpack_modules__ = {
524
545
  .listItemDescription-E6JHyZ {
525
546
  font-size: var(--c15t-devtools-font-size-xs, .75rem);
526
547
  color: var(--c15t-text-muted, #737373);
548
+ line-height: var(--c15t-line-height-tight, 1.25);
527
549
  text-overflow: ellipsis;
528
550
  white-space: nowrap;
529
551
  overflow: hidden;
@@ -537,8 +559,8 @@ var __webpack_modules__ = {
537
559
  }
538
560
 
539
561
  .section-a197cB {
540
- padding: var(--c15t-space-sm, .5rem) var(--c15t-space-md, 1rem);
541
- border-bottom: 1px solid var(--c15t-border, #e3e3e3);
562
+ border-bottom: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
563
+ padding: .75rem 1rem;
542
564
  }
543
565
 
544
566
  .section-a197cB:last-child {
@@ -546,9 +568,10 @@ var __webpack_modules__ = {
546
568
  }
547
569
 
548
570
  .sectionHeader-Xcljcw {
549
- margin-bottom: var(--c15t-space-sm, .5rem);
550
571
  justify-content: space-between;
551
572
  align-items: center;
573
+ gap: .5rem;
574
+ margin-bottom: .625rem;
552
575
  display: flex;
553
576
  }
554
577
 
@@ -557,47 +580,49 @@ var __webpack_modules__ = {
557
580
  font-weight: var(--c15t-font-weight-semibold, 600);
558
581
  color: var(--c15t-text-muted, #737373);
559
582
  text-transform: uppercase;
560
- letter-spacing: .5px;
583
+ letter-spacing: .04em;
561
584
  }
562
585
 
563
586
  .overrideField-keNdpJ {
564
587
  flex-direction: column;
565
- gap: 3px;
588
+ gap: .3125rem;
566
589
  margin-bottom: 0;
567
590
  display: flex;
568
591
  }
569
592
 
570
593
  .overrideLabel-ApMoTw {
594
+ font-size: var(--c15t-devtools-font-size-xs, .75rem);
595
+ font-weight: var(--c15t-font-weight-semibold, 600);
571
596
  color: var(--c15t-text-muted, #737373);
572
- font-size: 11px;
573
- font-weight: 600;
597
+ line-height: var(--c15t-line-height-tight, 1.25);
574
598
  }
575
599
 
576
600
  .overrideHint-yCfwGt {
577
- color: var(--c15t-devtools-text-muted, #737373);
578
- margin-top: 6px;
579
- font-size: 11px;
601
+ font-size: var(--c15t-devtools-font-size-xs, .75rem);
602
+ color: var(--c15t-text-muted, #737373);
603
+ line-height: var(--c15t-line-height-tight, 1.25);
604
+ margin-top: .5rem;
580
605
  }
581
606
 
582
607
  .overrideActions-imdcn7 {
583
- border-top: 1px dashed var(--c15t-border, #e3e3e3);
608
+ border-top: 1px dashed var(--c15t-devtools-border-strong, #e3e3e3);
584
609
  justify-content: space-between;
585
610
  align-items: center;
586
- gap: 8px;
587
- margin-top: 8px;
588
- padding-top: 8px;
611
+ gap: .5rem;
612
+ margin-top: .625rem;
613
+ padding-top: .625rem;
589
614
  display: flex;
590
615
  }
591
616
 
592
617
  .overrideActionButtons-gYOx1e {
593
618
  flex-wrap: wrap;
594
- gap: 6px;
619
+ gap: .375rem;
595
620
  display: flex;
596
621
  }
597
622
 
598
623
  .overrideStatus-sty_qS {
624
+ font-size: var(--c15t-devtools-font-size-xs, .75rem);
599
625
  color: var(--c15t-text-muted, #737373);
600
- font-size: 11px;
601
626
  }
602
627
 
603
628
  .overrideStatusDirty-OUdDMw {
@@ -605,9 +630,10 @@ var __webpack_modules__ = {
605
630
  }
606
631
 
607
632
  .infoRow-RlB_0h {
608
- padding: var(--c15t-space-xs, .25rem) 0;
609
633
  justify-content: space-between;
610
634
  align-items: center;
635
+ gap: .5rem;
636
+ padding: .25rem 0;
611
637
  display: flex;
612
638
  }
613
639
 
@@ -620,6 +646,7 @@ var __webpack_modules__ = {
620
646
  font-size: var(--c15t-devtools-font-size-xs, .75rem);
621
647
  font-weight: var(--c15t-font-weight-medium, 500);
622
648
  color: var(--c15t-text, #171717);
649
+ font-variant-numeric: tabular-nums;
623
650
  font-family: ui-monospace, Cascadia Code, Source Code Pro, Menlo, Consolas, DejaVu Sans Mono, monospace;
624
651
  }
625
652
 
@@ -630,18 +657,27 @@ var __webpack_modules__ = {
630
657
  flex-direction: column;
631
658
  justify-content: center;
632
659
  align-items: center;
660
+ gap: .375rem;
633
661
  display: flex;
634
662
  }
635
663
 
636
664
  .emptyStateIcon-WHFkX8 {
665
+ opacity: .55;
637
666
  width: 32px;
638
667
  height: 32px;
639
- margin-bottom: var(--c15t-space-sm, .5rem);
640
- opacity: .5;
641
668
  }
642
669
 
643
670
  .emptyStateText-TaLvAJ {
644
671
  font-size: var(--c15t-font-size-sm, .875rem);
672
+ line-height: var(--c15t-line-height-normal, 1.5);
673
+ }
674
+
675
+ .disconnectedState-dOtZBG {
676
+ padding: var(--c15t-space-xl, 2rem);
677
+ text-align: center;
678
+ font-size: var(--c15t-font-size-sm, .875rem);
679
+ color: var(--c15t-text-muted, #737373);
680
+ line-height: var(--c15t-line-height-normal, 1.5);
645
681
  }
646
682
 
647
683
  @media (prefers-reduced-motion: reduce) {
@@ -708,7 +744,8 @@ var __webpack_modules__ = {
708
744
  infoValue: "infoValue-flMl_e",
709
745
  emptyState: "emptyState-QcmzTQ",
710
746
  emptyStateIcon: "emptyStateIcon-WHFkX8",
711
- emptyStateText: "emptyStateText-TaLvAJ"
747
+ emptyStateText: "emptyStateText-TaLvAJ",
748
+ disconnectedState: "disconnectedState-dOtZBG"
712
749
  };
713
750
  const __rspack_default_export = ___CSS_LOADER_EXPORT___;
714
751
  },
@@ -737,9 +774,9 @@ var __webpack_modules__ = {
737
774
  .floatingButton-Gw8MtJ {
738
775
  width: var(--c15t-devtools-button-size, 40px);
739
776
  height: var(--c15t-devtools-button-size, 40px);
740
- border: 1px solid var(--c15t-border, #e3e3e3);
777
+ border: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
741
778
  border-radius: var(--c15t-radius-full, 9999px);
742
- background-color: var(--c15t-surface, #fff);
779
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
743
780
  box-shadow: var(--c15t-shadow-lg, 0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a);
744
781
  cursor: grab;
745
782
  z-index: var(--c15t-devtools-z-index, 99999);
@@ -767,13 +804,13 @@ var __webpack_modules__ = {
767
804
  }
768
805
 
769
806
  .floatingButton-Gw8MtJ:focus-visible {
770
- outline: 2px solid var(--c15t-primary, #335cff);
771
- outline-offset: 2px;
807
+ box-shadow: var(--c15t-shadow-lg, 0 8px 24px #0000001f), 0 0 0 2px var(--c15t-devtools-focus-ring, #335cff);
808
+ outline: none;
772
809
  }
773
810
 
774
811
  .floatingButton-Gw8MtJ:active {
775
812
  cursor: grabbing;
776
- transform: scale(1.02);
813
+ transform: scale(.98);
777
814
  }
778
815
 
779
816
  .floatingButtonIcon-cHWefk {
@@ -814,6 +851,7 @@ var __webpack_modules__ = {
814
851
 
815
852
  .backdrop-LhVMB5 {
816
853
  background-color: var(--c15t-overlay, #00000080);
854
+ backdrop-filter: blur(1px);
817
855
  z-index: calc(var(--c15t-devtools-z-index, 99999) + 1);
818
856
  position: fixed;
819
857
  inset: 0;
@@ -822,10 +860,10 @@ var __webpack_modules__ = {
822
860
  .panel-jtWove {
823
861
  width: var(--c15t-devtools-panel-width, 480px);
824
862
  max-height: var(--c15t-devtools-panel-max-height, 560px);
825
- background-color: var(--c15t-surface, #fff);
826
- border: 1px solid var(--c15t-border, #e3e3e3);
863
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
864
+ border: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
827
865
  border-radius: var(--c15t-radius-lg, .75rem);
828
- box-shadow: var(--c15t-shadow-lg, 0 8px 24px #0000001f);
866
+ box-shadow: var(--c15t-shadow-lg, 0 10px 28px #00000029);
829
867
  z-index: calc(var(--c15t-devtools-z-index, 99999) + 2);
830
868
  flex-direction: column;
831
869
  display: flex;
@@ -858,11 +896,11 @@ var __webpack_modules__ = {
858
896
  }
859
897
 
860
898
  .header-xluoTr {
861
- padding: var(--c15t-space-sm, .5rem) var(--c15t-space-md, 1rem);
862
- border-bottom: 1px solid var(--c15t-border, #e3e3e3);
899
+ border-bottom: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
863
900
  background-color: var(--c15t-devtools-surface-muted, #f5f5f5);
864
901
  justify-content: space-between;
865
902
  align-items: center;
903
+ padding: .6875rem .875rem;
866
904
  display: flex;
867
905
  }
868
906
 
@@ -871,6 +909,7 @@ var __webpack_modules__ = {
871
909
  gap: var(--c15t-space-sm, .5rem);
872
910
  font-size: var(--c15t-font-size-sm, .875rem);
873
911
  font-weight: var(--c15t-font-weight-semibold, 600);
912
+ line-height: var(--c15t-line-height-tight, 1.25);
874
913
  color: var(--c15t-text, #171717);
875
914
  display: flex;
876
915
  }
@@ -882,9 +921,9 @@ var __webpack_modules__ = {
882
921
  }
883
922
 
884
923
  .closeButton-Yto0Nb {
885
- border-radius: var(--c15t-radius-sm, .25rem);
886
- width: 28px;
887
- height: 28px;
924
+ border-radius: var(--c15t-radius-md, .5rem);
925
+ width: 2rem;
926
+ height: 2rem;
888
927
  color: var(--c15t-text-muted, #737373);
889
928
  cursor: pointer;
890
929
  transition: background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
@@ -897,13 +936,13 @@ var __webpack_modules__ = {
897
936
  }
898
937
 
899
938
  .closeButton-Yto0Nb:hover {
900
- background-color: var(--c15t-surface-hover, #f7f7f7);
939
+ background-color: var(--c15t-devtools-surface-subtle, #f7f7f7);
901
940
  color: var(--c15t-text, #171717);
902
941
  }
903
942
 
904
943
  .closeButton-Yto0Nb:focus-visible {
905
- outline: 2px solid var(--c15t-primary, #335cff);
906
- outline-offset: 1px;
944
+ box-shadow: 0 0 0 2px var(--c15t-devtools-focus-ring, #335cff);
945
+ outline: none;
907
946
  }
908
947
 
909
948
  .closeButtonIcon-fVlR1I {
@@ -911,33 +950,71 @@ var __webpack_modules__ = {
911
950
  height: 16px;
912
951
  }
913
952
 
953
+ .inlineActionButton-Ky8BmN {
954
+ border: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
955
+ border-radius: var(--c15t-radius-sm, .375rem);
956
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
957
+ min-height: 1.625rem;
958
+ color: var(--c15t-text, #171717);
959
+ font-family: var(--c15t-font-family, system-ui, -apple-system, sans-serif);
960
+ font-size: var(--c15t-devtools-font-size-xs, .75rem);
961
+ font-weight: var(--c15t-font-weight-medium, 500);
962
+ line-height: var(--c15t-line-height-tight, 1.25);
963
+ cursor: pointer;
964
+ transition: background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), border-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
965
+ justify-content: center;
966
+ align-items: center;
967
+ padding: .25rem .5rem;
968
+ display: inline-flex;
969
+ }
970
+
971
+ .inlineActionButton-Ky8BmN:hover {
972
+ background-color: var(--c15t-devtools-surface-subtle, #f7f7f7);
973
+ border-color: var(--c15t-border-hover, #c9c9c9);
974
+ }
975
+
976
+ .inlineActionButton-Ky8BmN:focus-visible {
977
+ box-shadow: 0 0 0 2px var(--c15t-devtools-focus-ring, #335cff);
978
+ outline: none;
979
+ }
980
+
914
981
  .content-yDMYfG {
982
+ scrollbar-gutter: stable;
915
983
  overscroll-behavior: contain;
916
984
  -webkit-overflow-scrolling: touch;
985
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
917
986
  flex: auto;
918
987
  min-height: 200px;
919
- overflow: hidden auto;
988
+ overflow: hidden scroll;
920
989
  }
921
990
 
922
991
  .footer-ESbmwQ {
923
- padding: var(--c15t-space-xs, .25rem) var(--c15t-space-md, 1rem);
924
- border-top: 1px solid var(--c15t-border, #e3e3e3);
992
+ border-top: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
925
993
  background-color: var(--c15t-devtools-surface-muted, #f5f5f5);
926
994
  font-size: var(--c15t-devtools-font-size-xs, .75rem);
927
995
  color: var(--c15t-text-muted, #737373);
928
996
  justify-content: space-between;
929
997
  align-items: center;
998
+ gap: .5rem;
999
+ padding: .5rem .75rem;
930
1000
  display: flex;
931
1001
  }
932
1002
 
933
1003
  .footerStatus-rlb99A {
934
1004
  align-items: center;
935
- gap: var(--c15t-space-xs, .25rem);
1005
+ gap: .375rem;
1006
+ min-width: 0;
936
1007
  display: flex;
937
1008
  }
938
1009
 
1010
+ .footerMeta-Vdtxdk {
1011
+ opacity: .75;
1012
+ white-space: nowrap;
1013
+ }
1014
+
939
1015
  .statusDot-hYJoej {
940
1016
  border-radius: var(--c15t-radius-full, 9999px);
1017
+ flex-shrink: 0;
941
1018
  width: 6px;
942
1019
  height: 6px;
943
1020
  }
@@ -976,6 +1053,7 @@ var __webpack_modules__ = {
976
1053
  font-size: var(--c15t-font-size-sm, .875rem);
977
1054
  color: var(--c15t-text-muted, #737373);
978
1055
  max-width: 280px;
1056
+ line-height: var(--c15t-line-height-normal, 1.5);
979
1057
  }
980
1058
 
981
1059
  @media (prefers-reduced-motion: reduce) {
@@ -992,17 +1070,17 @@ var __webpack_modules__ = {
992
1070
  }
993
1071
 
994
1072
  .dropdownMenu-aKK18l {
995
- min-width: 200px;
996
- padding: var(--c15t-space-xs, .25rem);
997
- border: 1px solid var(--c15t-border, #e3e3e3);
1073
+ border: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
998
1074
  border-radius: var(--c15t-radius-lg, .75rem);
999
- background-color: var(--c15t-surface, #fff);
1075
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
1076
+ min-width: 200px;
1000
1077
  box-shadow: var(--c15t-shadow-lg, 0 8px 24px #0000001f);
1001
1078
  z-index: calc(var(--c15t-devtools-z-index, 99999) + 1);
1002
1079
  opacity: 0;
1003
1080
  transform-origin: 0 100%;
1004
1081
  pointer-events: none;
1005
1082
  transition: opacity var(--c15t-duration-fast, .1s) var(--c15t-easing-out, cubic-bezier(.215, .61, .355, 1)), transform var(--c15t-duration-fast, .1s) var(--c15t-easing-out, cubic-bezier(.215, .61, .355, 1));
1083
+ padding: .375rem;
1006
1084
  position: fixed;
1007
1085
  transform: scale(.95)translateY(8px);
1008
1086
  }
@@ -1030,34 +1108,35 @@ var __webpack_modules__ = {
1030
1108
  }
1031
1109
 
1032
1110
  .menuItem-kBbHRP {
1033
- align-items: center;
1034
- gap: var(--c15t-space-sm, .5rem);
1035
- width: 100%;
1036
- padding: var(--c15t-space-sm, .5rem) var(--c15t-space-md, .75rem);
1037
1111
  border-radius: var(--c15t-radius-md, .5rem);
1112
+ width: 100%;
1038
1113
  color: var(--c15t-text, #171717);
1039
- font-size: var(--c15t-font-size-sm, .875rem);
1114
+ font-size: var(--c15t-devtools-font-size-xs, .75rem);
1040
1115
  font-weight: var(--c15t-font-weight-medium, 500);
1116
+ line-height: var(--c15t-line-height-tight, 1.25);
1041
1117
  text-align: left;
1042
1118
  cursor: pointer;
1043
1119
  transition: background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
1044
1120
  background: none;
1045
1121
  border: none;
1122
+ align-items: center;
1123
+ gap: .625rem;
1124
+ padding: .5rem .625rem;
1046
1125
  display: flex;
1047
1126
  }
1048
1127
 
1049
1128
  .menuItem-kBbHRP:hover {
1050
- background-color: var(--c15t-surface-hover, #f2f2f2);
1129
+ background-color: var(--c15t-devtools-surface-subtle, #f2f2f2);
1051
1130
  }
1052
1131
 
1053
1132
  .menuItem-kBbHRP:focus-visible {
1054
- outline: 2px solid var(--c15t-primary, #335cff);
1055
- outline-offset: -2px;
1133
+ box-shadow: 0 0 0 2px var(--c15t-devtools-focus-ring, #335cff);
1134
+ outline: none;
1056
1135
  }
1057
1136
 
1058
1137
  .menuItemIcon-P3pP5K {
1059
- width: 20px;
1060
- height: 20px;
1138
+ width: 1rem;
1139
+ height: 1rem;
1061
1140
  color: var(--c15t-text-muted, #737373);
1062
1141
  flex-shrink: 0;
1063
1142
  }
@@ -1070,6 +1149,7 @@ var __webpack_modules__ = {
1070
1149
  font-size: var(--c15t-devtools-font-size-xs, .75rem);
1071
1150
  color: var(--c15t-text-muted, #737373);
1072
1151
  font-weight: var(--c15t-font-weight-normal, 400);
1152
+ margin-top: .125rem;
1073
1153
  }
1074
1154
 
1075
1155
  .menuItemContent-hBlruV {
@@ -1085,8 +1165,8 @@ var __webpack_modules__ = {
1085
1165
  .menuItemToggleTrack-gDp_f3 {
1086
1166
  background-color: var(--c15t-switch-track, #d9d9d9);
1087
1167
  border-radius: var(--c15t-radius-full, 9999px);
1088
- width: 36px;
1089
- height: 20px;
1168
+ width: 2rem;
1169
+ height: 1.25rem;
1090
1170
  transition: background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
1091
1171
  position: relative;
1092
1172
  }
@@ -1094,21 +1174,22 @@ var __webpack_modules__ = {
1094
1174
  .menuItemToggleThumb-ioqqyc {
1095
1175
  background-color: var(--c15t-switch-thumb, #fff);
1096
1176
  border-radius: var(--c15t-radius-full, 9999px);
1097
- width: 16px;
1098
- height: 16px;
1099
- box-shadow: var(--c15t-shadow-sm, 0 1px 2px #0000001a);
1177
+ width: .75rem;
1178
+ height: .75rem;
1179
+ box-shadow: 0 0 0 1px var(--c15t-border, #e3e3e3);
1100
1180
  transition: transform var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
1101
1181
  position: absolute;
1102
- top: 2px;
1182
+ top: 50%;
1103
1183
  left: 2px;
1184
+ transform: translateY(-50%);
1104
1185
  }
1105
1186
 
1106
1187
  .menuItemToggleChecked-K3BPtk .menuItemToggleTrack-gDp_f3 {
1107
- background-color: var(--c15t-switch-track-checked, #335cff);
1188
+ background-color: var(--c15t-switch-track-active, #335cff);
1108
1189
  }
1109
1190
 
1110
1191
  .menuItemToggleChecked-K3BPtk .menuItemToggleThumb-ioqqyc {
1111
- transform: translateX(16px);
1192
+ transform: translate(1rem, -50%);
1112
1193
  }
1113
1194
 
1114
1195
  .menuDivider-JIBdhU {
@@ -1144,9 +1225,11 @@ var __webpack_modules__ = {
1144
1225
  headerLogo: "headerLogo-PxJ_w1",
1145
1226
  closeButton: "closeButton-Yto0Nb",
1146
1227
  closeButtonIcon: "closeButtonIcon-fVlR1I",
1228
+ inlineActionButton: "inlineActionButton-Ky8BmN",
1147
1229
  content: "content-yDMYfG",
1148
1230
  footer: "footer-ESbmwQ",
1149
1231
  footerStatus: "footerStatus-rlb99A",
1232
+ footerMeta: "footerMeta-Vdtxdk",
1150
1233
  statusDot: "statusDot-hYJoej",
1151
1234
  statusConnected: "statusConnected-hPSUgS",
1152
1235
  statusDisconnected: "statusDisconnected-HIpcee",
@@ -1185,62 +1268,63 @@ var __webpack_modules__ = {
1185
1268
  ___CSS_LOADER_EXPORT___.push([
1186
1269
  module.id,
1187
1270
  `.tabList-IyuiBE {
1271
+ border-bottom: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
1272
+ background-color: var(--c15t-devtools-surface-subtle, #fafafa);
1188
1273
  align-items: center;
1189
- gap: var(--c15t-space-xs, .25rem);
1190
- padding: var(--c15t-space-sm, .5rem) var(--c15t-space-sm, .5rem);
1191
- border-bottom: 1px solid var(--c15t-border, #e3e3e3);
1192
- background-color: var(--c15t-surface, #fff);
1193
- scrollbar-width: none;
1194
- -ms-overflow-style: none;
1195
- scroll-padding-inline-end: var(--c15t-space-sm, .5rem);
1274
+ gap: .375rem;
1275
+ padding: .75rem;
1196
1276
  display: flex;
1197
- overflow-x: auto;
1198
1277
  }
1199
1278
 
1200
- .tabList-IyuiBE:after {
1201
- content: "";
1202
- flex: 0 0 var(--c15t-space-sm, .5rem);
1203
- }
1204
-
1205
- .tabList-IyuiBE::-webkit-scrollbar {
1206
- display: none;
1279
+ .tabStrip-_KrWe4 {
1280
+ align-items: center;
1281
+ gap: var(--c15t-space-xs, .25rem);
1282
+ flex: auto;
1283
+ min-width: 0;
1284
+ display: flex;
1285
+ overflow: hidden;
1207
1286
  }
1208
1287
 
1209
1288
  .tab-yfDEqg {
1210
- align-items: center;
1211
- gap: var(--c15t-space-xs, .25rem);
1212
1289
  border-radius: var(--c15t-radius-md, .5rem);
1290
+ min-height: 1.875rem;
1213
1291
  color: var(--c15t-text-muted, #737373);
1214
- font-family: inherit;
1215
- font-size: 11px;
1292
+ font-family: var(--c15t-font-family, system-ui, -apple-system, sans-serif);
1293
+ font-size: var(--c15t-devtools-font-size-xs, .75rem);
1216
1294
  font-weight: var(--c15t-font-weight-medium, 500);
1295
+ line-height: var(--c15t-line-height-tight, 1.25);
1217
1296
  cursor: pointer;
1218
1297
  white-space: nowrap;
1219
- transition: background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
1298
+ transition: background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), border-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), box-shadow var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
1220
1299
  background-color: #0000;
1221
- border: none;
1222
- padding: 3px 7px;
1300
+ border: 1px solid #0000;
1301
+ flex-shrink: 0;
1302
+ align-items: center;
1303
+ gap: .375rem;
1304
+ padding: .25rem .625rem;
1223
1305
  display: flex;
1224
1306
  }
1225
1307
 
1226
1308
  .tab-yfDEqg:hover {
1227
- background-color: var(--c15t-surface-hover, #f7f7f7);
1309
+ background-color: var(--c15t-devtools-surface-muted, #f7f7f7);
1228
1310
  color: var(--c15t-text, #171717);
1229
1311
  }
1230
1312
 
1231
1313
  .tab-yfDEqg:focus-visible {
1232
- outline: 2px solid var(--c15t-primary, #335cff);
1233
- outline-offset: 1px;
1314
+ box-shadow: 0 0 0 2px var(--c15t-devtools-focus-ring, #335cff);
1315
+ outline: none;
1234
1316
  }
1235
1317
 
1236
1318
  .tabActive-r4hing {
1237
- background-color: var(--c15t-primary, #335cff);
1238
- color: var(--c15t-text-on-primary, #fff);
1319
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
1320
+ border-color: var(--c15t-devtools-border-strong, #e3e3e3);
1321
+ color: var(--c15t-text, #171717);
1322
+ box-shadow: var(--c15t-shadow-sm, 0 1px 2px #0000000d);
1239
1323
  }
1240
1324
 
1241
1325
  .tabActive-r4hing:hover {
1242
- background-color: var(--c15t-primary-hover, #03f);
1243
- color: var(--c15t-text-on-primary, #fff);
1326
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
1327
+ color: var(--c15t-text, #171717);
1244
1328
  }
1245
1329
 
1246
1330
  .tabIcon-U9tnu0 {
@@ -1249,6 +1333,131 @@ var __webpack_modules__ = {
1249
1333
  height: 14px;
1250
1334
  }
1251
1335
 
1336
+ .tabHidden-HBXYSd {
1337
+ display: none;
1338
+ }
1339
+
1340
+ .overflowContainer-TTw9DO {
1341
+ flex-shrink: 0;
1342
+ position: relative;
1343
+ }
1344
+
1345
+ .overflowContainerHidden-sQa_XZ {
1346
+ display: none;
1347
+ }
1348
+
1349
+ .overflowButton-tKq4FF {
1350
+ border-radius: var(--c15t-radius-md, .5rem);
1351
+ width: 1.875rem;
1352
+ height: 1.875rem;
1353
+ color: var(--c15t-text-muted, #737373);
1354
+ cursor: pointer;
1355
+ transition: background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), border-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
1356
+ background-color: #0000;
1357
+ border: 1px solid #0000;
1358
+ justify-content: center;
1359
+ align-items: center;
1360
+ padding: 0;
1361
+ display: inline-flex;
1362
+ }
1363
+
1364
+ .overflowButton-tKq4FF:hover {
1365
+ background-color: var(--c15t-devtools-surface-muted, #f7f7f7);
1366
+ color: var(--c15t-text, #171717);
1367
+ }
1368
+
1369
+ .overflowButton-tKq4FF:focus-visible {
1370
+ box-shadow: 0 0 0 2px var(--c15t-devtools-focus-ring, #335cff);
1371
+ outline: none;
1372
+ }
1373
+
1374
+ .overflowButtonIcon-FSurfC {
1375
+ justify-content: center;
1376
+ align-items: center;
1377
+ width: 14px;
1378
+ height: 14px;
1379
+ display: inline-flex;
1380
+ }
1381
+
1382
+ .overflowMenu-TST0eZ {
1383
+ border: 1px solid var(--c15t-devtools-border-strong, #e3e3e3);
1384
+ border-radius: var(--c15t-radius-md, .5rem);
1385
+ background-color: var(--c15t-devtools-surface-elevated, #fff);
1386
+ min-width: 10rem;
1387
+ box-shadow: var(--c15t-shadow-md, 0 4px 12px #00000014);
1388
+ opacity: 0;
1389
+ transform-origin: 100% 0;
1390
+ pointer-events: none;
1391
+ z-index: 10;
1392
+ transition: opacity var(--c15t-duration-fast, .1s) var(--c15t-easing-out, cubic-bezier(.215, .61, .355, 1)), transform var(--c15t-duration-fast, .1s) var(--c15t-easing-out, cubic-bezier(.215, .61, .355, 1));
1393
+ flex-direction: column;
1394
+ gap: .125rem;
1395
+ padding: .3125rem;
1396
+ display: flex;
1397
+ position: absolute;
1398
+ top: calc(100% + .375rem);
1399
+ right: 0;
1400
+ transform: translateY(-4px)scale(.98);
1401
+ }
1402
+
1403
+ .overflowMenu-TST0eZ[data-state="open"] {
1404
+ opacity: 1;
1405
+ pointer-events: auto;
1406
+ transform: translateY(0)scale(1);
1407
+ }
1408
+
1409
+ .overflowItem-y5Pz7k {
1410
+ border-radius: var(--c15t-radius-sm, .375rem);
1411
+ min-height: 1.75rem;
1412
+ color: var(--c15t-text, #171717);
1413
+ font-family: var(--c15t-font-family, system-ui, -apple-system, sans-serif);
1414
+ font-size: var(--c15t-devtools-font-size-xs, .75rem);
1415
+ font-weight: var(--c15t-font-weight-medium, 500);
1416
+ line-height: var(--c15t-line-height-tight, 1.25);
1417
+ text-align: left;
1418
+ cursor: pointer;
1419
+ white-space: nowrap;
1420
+ transition: background-color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1)), color var(--c15t-duration-fast, .1s) var(--c15t-easing, cubic-bezier(.4, 0, .2, 1));
1421
+ background-color: #0000;
1422
+ border: none;
1423
+ align-items: center;
1424
+ gap: .5rem;
1425
+ padding: .3125rem .5rem;
1426
+ display: inline-flex;
1427
+ }
1428
+
1429
+ .overflowItem-y5Pz7k:hover {
1430
+ background-color: var(--c15t-devtools-surface-subtle, #fafafa);
1431
+ }
1432
+
1433
+ .overflowItem-y5Pz7k:focus-visible {
1434
+ box-shadow: 0 0 0 2px var(--c15t-devtools-focus-ring, #335cff);
1435
+ outline: none;
1436
+ }
1437
+
1438
+ .overflowItemActive-mzVG1T {
1439
+ background-color: var(--c15t-devtools-accent-soft, #ebefff);
1440
+ color: var(--c15t-text, #171717);
1441
+ }
1442
+
1443
+ .overflowItemDisabled-dcHX3K {
1444
+ opacity: .5;
1445
+ cursor: not-allowed;
1446
+ }
1447
+
1448
+ .overflowItemIcon-fz291V {
1449
+ flex-shrink: 0;
1450
+ justify-content: center;
1451
+ align-items: center;
1452
+ width: 14px;
1453
+ height: 14px;
1454
+ display: inline-flex;
1455
+ }
1456
+
1457
+ .overflowItemHidden-k4aawi {
1458
+ display: none;
1459
+ }
1460
+
1252
1461
  .tabDisabled-lDuv5l {
1253
1462
  opacity: .5;
1254
1463
  cursor: not-allowed;
@@ -1269,7 +1478,7 @@ var __webpack_modules__ = {
1269
1478
  }
1270
1479
 
1271
1480
  @media (prefers-reduced-motion: reduce) {
1272
- .tab-yfDEqg {
1481
+ .tab-yfDEqg, .overflowButton-tKq4FF, .overflowMenu-TST0eZ, .overflowItem-y5Pz7k {
1273
1482
  transition: none;
1274
1483
  }
1275
1484
  }
@@ -1285,9 +1494,21 @@ var __webpack_modules__ = {
1285
1494
  ]);
1286
1495
  ___CSS_LOADER_EXPORT___.locals = {
1287
1496
  tabList: "tabList-IyuiBE",
1497
+ tabStrip: "tabStrip-_KrWe4",
1288
1498
  tab: "tab-yfDEqg",
1289
1499
  tabActive: "tabActive-r4hing",
1290
1500
  tabIcon: "tabIcon-U9tnu0",
1501
+ tabHidden: "tabHidden-HBXYSd",
1502
+ overflowContainer: "overflowContainer-TTw9DO",
1503
+ overflowContainerHidden: "overflowContainerHidden-sQa_XZ",
1504
+ overflowButton: "overflowButton-tKq4FF",
1505
+ overflowButtonIcon: "overflowButtonIcon-FSurfC",
1506
+ overflowMenu: "overflowMenu-TST0eZ",
1507
+ overflowItem: "overflowItem-y5Pz7k",
1508
+ overflowItemActive: "overflowItemActive-mzVG1T",
1509
+ overflowItemDisabled: "overflowItemDisabled-dcHX3K",
1510
+ overflowItemIcon: "overflowItemIcon-fz291V",
1511
+ overflowItemHidden: "overflowItemHidden-k4aawi",
1291
1512
  tabDisabled: "tabDisabled-lDuv5l",
1292
1513
  tabPanel: "tabPanel-QKO8FX",
1293
1514
  tabPanelActive: "tabPanelActive-mrNlGE"
@@ -1311,6 +1532,15 @@ var __webpack_modules__ = {
1311
1532
  --c15t-devtools-button-size: 40px;
1312
1533
  --c15t-devtools-z-index: 99999;
1313
1534
  --c15t-devtools-surface-muted: var(--c15t-surface-hover, #f7f7f7);
1535
+ --c15t-devtools-surface-subtle: #fafafa;
1536
+ --c15t-devtools-surface-elevated: var(--c15t-surface, #fff);
1537
+ --c15t-devtools-border-strong: var(--c15t-border, #e3e3e3);
1538
+ --c15t-devtools-code-surface: #f7f7f7;
1539
+ --c15t-devtools-accent-soft: #ebefff;
1540
+ --c15t-devtools-focus-ring: var(--c15t-primary, #335cff);
1541
+ --c15t-devtools-text-muted: var(--c15t-text-muted, #737373);
1542
+ --c15t-devtools-font-size-sm: var(--c15t-font-size-sm, .875rem);
1543
+ --c15t-surface-muted: var(--c15t-devtools-surface-muted, #f7f7f7);
1314
1544
  --c15t-devtools-font-size-xs: .75rem;
1315
1545
  --c15t-devtools-badge-success: #21c45d;
1316
1546
  --c15t-devtools-badge-success-bg: #e4fbed;
@@ -1324,8 +1554,37 @@ var __webpack_modules__ = {
1324
1554
  --c15t-devtools-badge-neutral-bg: #f0f0f0;
1325
1555
  }
1326
1556
 
1557
+ :is(:global(.c15t-light), :global(.light)) {
1558
+ --c15t-devtools-surface-muted: var(--c15t-surface-hover, #f7f7f7);
1559
+ --c15t-devtools-surface-subtle: #fafafa;
1560
+ --c15t-devtools-surface-elevated: var(--c15t-surface, #fff);
1561
+ --c15t-devtools-border-strong: var(--c15t-border, #e3e3e3);
1562
+ --c15t-devtools-code-surface: #f7f7f7;
1563
+ --c15t-devtools-accent-soft: #ebefff;
1564
+ --c15t-devtools-badge-success-bg: #e4fbed;
1565
+ --c15t-devtools-badge-error-bg: #fde7e7;
1566
+ --c15t-devtools-badge-warning-bg: #fef7dc;
1567
+ --c15t-devtools-badge-info-bg: #dcebfe;
1568
+ --c15t-devtools-badge-neutral-bg: #f0f0f0;
1569
+ }
1570
+
1571
+ @supports (color: color-mix(in srgb, white, black)) {
1572
+ :root {
1573
+ --c15t-devtools-surface-muted: color-mix(in srgb, var(--c15t-surface-hover, #f7f7f7) 85%, var(--c15t-surface, #fff));
1574
+ --c15t-devtools-surface-subtle: color-mix(in srgb, var(--c15t-surface-hover, #f7f7f7) 55%, var(--c15t-surface, #fff));
1575
+ --c15t-devtools-border-strong: color-mix(in srgb, var(--c15t-border, #e3e3e3) 80%, var(--c15t-text-muted, #737373));
1576
+ --c15t-devtools-code-surface: color-mix(in srgb, var(--c15t-surface-hover, #f7f7f7) 70%, var(--c15t-surface, #fff));
1577
+ --c15t-devtools-accent-soft: color-mix(in srgb, var(--c15t-primary, #335cff) 12%, transparent);
1578
+ }
1579
+ }
1580
+
1327
1581
  :is(:global(.c15t-dark), :global(.dark)) {
1328
1582
  --c15t-devtools-surface-muted: var(--c15t-surface-hover, #292929);
1583
+ --c15t-devtools-surface-subtle: #242424;
1584
+ --c15t-devtools-surface-elevated: var(--c15t-surface, #1a1a1a);
1585
+ --c15t-devtools-border-strong: var(--c15t-border, #3d3d3d);
1586
+ --c15t-devtools-code-surface: #212121;
1587
+ --c15t-devtools-accent-soft: #335cff33;
1329
1588
  --c15t-devtools-badge-success-bg: #21c45d33;
1330
1589
  --c15t-devtools-badge-error-bg: #ef434333;
1331
1590
  --c15t-devtools-badge-warning-bg: #f59f0a33;
@@ -1334,8 +1593,13 @@ var __webpack_modules__ = {
1334
1593
  }
1335
1594
 
1336
1595
  @media (prefers-color-scheme: dark) {
1337
- :root {
1596
+ :global(:root:not(.light):not(.c15t-light)) {
1338
1597
  --c15t-devtools-surface-muted: var(--c15t-surface-hover, #292929);
1598
+ --c15t-devtools-surface-subtle: #242424;
1599
+ --c15t-devtools-surface-elevated: var(--c15t-surface, #1a1a1a);
1600
+ --c15t-devtools-border-strong: var(--c15t-border, #3d3d3d);
1601
+ --c15t-devtools-code-surface: #212121;
1602
+ --c15t-devtools-accent-soft: #335cff33;
1339
1603
  --c15t-devtools-badge-success-bg: #21c45d33;
1340
1604
  --c15t-devtools-badge-error-bg: #ef434333;
1341
1605
  --c15t-devtools-badge-warning-bg: #f59f0a33;
@@ -1648,7 +1912,7 @@ var __webpack_exports__ = {};
1648
1912
  panel_module_options.insertStyleElement = insertStyleElement_default();
1649
1913
  injectStylesIntoStyleTag_default()(panel_module.A, panel_module_options);
1650
1914
  panel_module.A && panel_module.A.locals && panel_module.A.locals;
1651
- '[data-c15t-trigger], [aria-label*="privacy settings"], [aria-label*="preference"]';
1915
+ '[data-c15t-trigger], [aria-label*="privacy settings" i], [aria-label*="preference" i]';
1652
1916
  function createElement(options = {}) {
1653
1917
  const { tag = 'div', text, html, children, className, id, style, dataset, onClick, onMouseEnter, onMouseLeave, onKeyDown, onKeyUp, onFocus, onBlur, onChange, onInput, onAnimationEnd, onTransitionEnd, ...attrs } = options;
1654
1918
  const element = document.createElement(tag);
@@ -1775,6 +2039,11 @@ var __webpack_exports__ = {};
1775
2039
  const EVENTS_ICON = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1776
2040
  <path d="M12 20h9"></path>
1777
2041
  <path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"></path>
2042
+ </svg>`;
2043
+ const MORE_ICON = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
2044
+ <circle cx="12" cy="5" r="1.75"></circle>
2045
+ <circle cx="12" cy="12" r="1.75"></circle>
2046
+ <circle cx="12" cy="19" r="1.75"></circle>
1778
2047
  </svg>`;
1779
2048
  const TABS = [
1780
2049
  {
@@ -1811,12 +2080,56 @@ var __webpack_exports__ = {};
1811
2080
  function tabs_createTabs(options) {
1812
2081
  const { onTabChange, disabledTabs = [] } = options;
1813
2082
  let activeTab = options.activeTab;
2083
+ let isOverflowMenuOpen = false;
2084
+ let visibleTabIds = [];
2085
+ let hiddenTabIds = [];
1814
2086
  const tabButtons = new Map();
2087
+ const overflowButtons = new Map();
1815
2088
  const tabList = renderer_div({
1816
- className: styles_tabs_module.tabList,
2089
+ className: styles_tabs_module.tabList
2090
+ });
2091
+ const tabStrip = renderer_div({
2092
+ className: styles_tabs_module.tabStrip,
1817
2093
  role: 'tablist',
1818
2094
  ariaLabel: 'DevTools tabs'
1819
2095
  });
2096
+ tabList.appendChild(tabStrip);
2097
+ const overflowMenu = renderer_div({
2098
+ className: styles_tabs_module.overflowMenu,
2099
+ role: 'menu',
2100
+ ariaLabel: 'All tabs'
2101
+ });
2102
+ overflowMenu.dataset.state = 'closed';
2103
+ const overflowButton = renderer_button({
2104
+ className: styles_tabs_module.overflowButton,
2105
+ ariaLabel: 'More tabs',
2106
+ ariaExpanded: 'false',
2107
+ onClick: ()=>toggleOverflowMenu(),
2108
+ onKeyDown: (e)=>{
2109
+ if ('ArrowDown' === e.key || 'Enter' === e.key || ' ' === e.key) {
2110
+ e.preventDefault();
2111
+ openOverflowMenu();
2112
+ focusFirstEnabledOverflowItem();
2113
+ }
2114
+ }
2115
+ });
2116
+ overflowButton.setAttribute('aria-haspopup', 'menu');
2117
+ const overflowIcon = renderer_div({
2118
+ className: styles_tabs_module.overflowButtonIcon
2119
+ });
2120
+ overflowIcon.appendChild(renderer_createSvgElement(MORE_ICON, {
2121
+ width: 14,
2122
+ height: 14
2123
+ }));
2124
+ overflowButton.appendChild(overflowIcon);
2125
+ const overflowContainer = renderer_div({
2126
+ className: styles_tabs_module.overflowContainer,
2127
+ children: [
2128
+ overflowButton,
2129
+ overflowMenu
2130
+ ]
2131
+ });
2132
+ tabList.appendChild(overflowContainer);
1820
2133
  for (const tab of TABS){
1821
2134
  const isActive = tab.id === activeTab;
1822
2135
  const isDisabled = disabledTabs.includes(tab.id);
@@ -1830,6 +2143,7 @@ var __webpack_exports__ = {};
1830
2143
  disabled: isDisabled,
1831
2144
  onClick: ()=>{
1832
2145
  if (!isDisabled) {
2146
+ closeOverflowMenu();
1833
2147
  setActiveTab(tab.id);
1834
2148
  onTabChange(tab.id);
1835
2149
  }
@@ -1846,29 +2160,206 @@ var __webpack_exports__ = {};
1846
2160
  tabButton.appendChild(iconWrapper);
1847
2161
  tabButton.appendChild(document.createTextNode(tab.label));
1848
2162
  tabButtons.set(tab.id, tabButton);
1849
- tabList.appendChild(tabButton);
2163
+ tabStrip.appendChild(tabButton);
2164
+ const overflowItem = renderer_button({
2165
+ className: `${styles_tabs_module.overflowItem} ${isActive ? styles_tabs_module.overflowItemActive : ''} ${isDisabled ? styles_tabs_module.overflowItemDisabled : ''}`,
2166
+ role: 'menuitemradio',
2167
+ ariaChecked: isActive ? 'true' : 'false',
2168
+ disabled: isDisabled,
2169
+ onClick: ()=>{
2170
+ if (!isDisabled) {
2171
+ setActiveTab(tab.id);
2172
+ onTabChange(tab.id);
2173
+ closeOverflowMenu();
2174
+ tabButtons.get(tab.id)?.focus();
2175
+ }
2176
+ },
2177
+ onKeyDown: (e)=>handleOverflowKeyDown(e, tab.id)
2178
+ });
2179
+ const overflowItemIcon = renderer_div({
2180
+ className: styles_tabs_module.overflowItemIcon
2181
+ });
2182
+ overflowItemIcon.appendChild(renderer_createSvgElement(tab.icon, {
2183
+ width: 14,
2184
+ height: 14
2185
+ }));
2186
+ overflowItem.appendChild(overflowItemIcon);
2187
+ overflowItem.appendChild(document.createTextNode(tab.label));
2188
+ overflowButtons.set(tab.id, overflowItem);
2189
+ overflowMenu.appendChild(overflowItem);
1850
2190
  }
1851
- function handleKeyDown(e, currentTab) {
1852
- const tabIds = TABS.map((t)=>t.id);
1853
- const enabledTabIds = tabIds.filter((id)=>!disabledTabs.includes(id));
1854
- const currentIndex = enabledTabIds.indexOf(currentTab);
1855
- let newIndex = currentIndex;
1856
- switch(e.key){
1857
- case 'ArrowLeft':
1858
- newIndex = currentIndex > 0 ? currentIndex - 1 : enabledTabIds.length - 1;
1859
- break;
1860
- case 'ArrowRight':
1861
- newIndex = currentIndex < enabledTabIds.length - 1 ? currentIndex + 1 : 0;
1862
- break;
1863
- case 'Home':
1864
- newIndex = 0;
1865
- break;
1866
- case 'End':
1867
- newIndex = enabledTabIds.length - 1;
1868
- break;
1869
- default:
1870
- return;
1871
- }
2191
+ function applyActiveState(tab) {
2192
+ for (const [tabId, tabButton] of tabButtons){
2193
+ const isActive = tabId === tab;
2194
+ if (styles_tabs_module.tabActive) tabButton.classList.toggle(styles_tabs_module.tabActive, isActive);
2195
+ tabButton.setAttribute('aria-selected', isActive ? 'true' : 'false');
2196
+ tabButton.tabIndex = isActive ? 0 : -1;
2197
+ }
2198
+ for (const [tabId, overflowItem] of overflowButtons){
2199
+ const isActive = tabId === tab;
2200
+ if (styles_tabs_module.overflowItemActive) overflowItem.classList.toggle(styles_tabs_module.overflowItemActive, isActive);
2201
+ overflowItem.setAttribute('aria-checked', isActive ? 'true' : 'false');
2202
+ }
2203
+ }
2204
+ function updateVisibleTabs() {
2205
+ const allTabIds = TABS.map((t)=>t.id);
2206
+ const iabEnabled = !disabledTabs.includes('iab');
2207
+ const preferredSecondTab = iabEnabled ? 'iab' : 'consents';
2208
+ const overflowSecondTab = iabEnabled ? 'consents' : 'iab';
2209
+ const showOverflowSecondTabInStrip = activeTab === overflowSecondTab;
2210
+ const stripSecondTab = showOverflowSecondTabInStrip ? overflowSecondTab : preferredSecondTab;
2211
+ const forcedOverflowTab = showOverflowSecondTabInStrip ? preferredSecondTab : overflowSecondTab;
2212
+ const layoutTabIds = [
2213
+ 'location',
2214
+ stripSecondTab,
2215
+ "scripts",
2216
+ 'actions',
2217
+ 'events',
2218
+ forcedOverflowTab
2219
+ ];
2220
+ const forcedOverflowTabIds = new Set();
2221
+ forcedOverflowTabIds.add(forcedOverflowTab);
2222
+ for (const [index, tabId] of layoutTabIds.entries()){
2223
+ const tabButton = tabButtons.get(tabId);
2224
+ if (tabButton) tabButton.style.order = String(index);
2225
+ const overflowItem = overflowButtons.get(tabId);
2226
+ if (overflowItem) overflowItem.style.order = String(index);
2227
+ }
2228
+ for (const tabId of allTabIds){
2229
+ const tabButton = tabButtons.get(tabId);
2230
+ if (tabButton && styles_tabs_module.tabHidden) tabButton.classList.remove(styles_tabs_module.tabHidden);
2231
+ }
2232
+ if (styles_tabs_module.overflowContainerHidden) overflowContainer.classList.remove(styles_tabs_module.overflowContainerHidden);
2233
+ const stripGap = Number.parseFloat(getComputedStyle(tabStrip).gap || '0');
2234
+ const calculateVisibleTabs = (availableWidth)=>{
2235
+ if (availableWidth <= 0) return [];
2236
+ const nextVisible = [];
2237
+ let usedWidth = 0;
2238
+ for (const tabId of layoutTabIds){
2239
+ if (forcedOverflowTabIds.has(tabId)) continue;
2240
+ const tabButton = tabButtons.get(tabId);
2241
+ if (!tabButton) continue;
2242
+ const width = tabButton.getBoundingClientRect().width;
2243
+ const nextUsed = 0 === nextVisible.length ? width : usedWidth + stripGap + width;
2244
+ if (nextUsed <= availableWidth) {
2245
+ nextVisible.push(tabId);
2246
+ usedWidth = nextUsed;
2247
+ } else break;
2248
+ }
2249
+ return nextVisible;
2250
+ };
2251
+ const measureStripWidth = ()=>tabStrip.getBoundingClientRect().width;
2252
+ const showOverflowContainer = ()=>{
2253
+ if (styles_tabs_module.overflowContainerHidden) overflowContainer.classList.remove(styles_tabs_module.overflowContainerHidden);
2254
+ };
2255
+ const hideOverflowContainer = ()=>{
2256
+ if (styles_tabs_module.overflowContainerHidden) overflowContainer.classList.add(styles_tabs_module.overflowContainerHidden);
2257
+ };
2258
+ const measureVisibleWidth = (tabIds)=>{
2259
+ let width = 0;
2260
+ for (const [index, tabId] of tabIds.entries()){
2261
+ const tabButton = tabButtons.get(tabId);
2262
+ if (tabButton) {
2263
+ width += tabButton.getBoundingClientRect().width;
2264
+ if (index > 0) width += stripGap;
2265
+ }
2266
+ }
2267
+ return width;
2268
+ };
2269
+ if (0 === forcedOverflowTabIds.size) {
2270
+ hideOverflowContainer();
2271
+ const visibleWithoutOverflow = calculateVisibleTabs(measureStripWidth());
2272
+ if (visibleWithoutOverflow.length === layoutTabIds.length) visibleTabIds = visibleWithoutOverflow;
2273
+ else {
2274
+ showOverflowContainer();
2275
+ visibleTabIds = calculateVisibleTabs(measureStripWidth());
2276
+ }
2277
+ } else {
2278
+ showOverflowContainer();
2279
+ const withOverflow = calculateVisibleTabs(measureStripWidth());
2280
+ visibleTabIds = withOverflow.length > 0 ? withOverflow : [
2281
+ activeTab
2282
+ ];
2283
+ }
2284
+ if (!visibleTabIds.includes(activeTab) && !disabledTabs.includes(activeTab)) if (visibleTabIds.length > 0) visibleTabIds[visibleTabIds.length - 1] = activeTab;
2285
+ else visibleTabIds = [
2286
+ activeTab
2287
+ ];
2288
+ visibleTabIds = [
2289
+ ...new Set(visibleTabIds)
2290
+ ];
2291
+ const maxStripWidth = measureStripWidth();
2292
+ while(visibleTabIds.length > 1 && measureVisibleWidth(visibleTabIds) > maxStripWidth + 0.5){
2293
+ let removeIndex = visibleTabIds.length - 1;
2294
+ if (visibleTabIds[removeIndex] === activeTab) removeIndex = Math.max(0, removeIndex - 1);
2295
+ visibleTabIds.splice(removeIndex, 1);
2296
+ }
2297
+ hiddenTabIds = layoutTabIds.filter((tabId)=>!visibleTabIds.includes(tabId) || forcedOverflowTabIds.has(tabId) && tabId !== activeTab);
2298
+ for (const tabId of allTabIds){
2299
+ const tabButton = tabButtons.get(tabId);
2300
+ if (tabButton) {
2301
+ if (styles_tabs_module.tabHidden) tabButton.classList.toggle(styles_tabs_module.tabHidden, hiddenTabIds.includes(tabId));
2302
+ }
2303
+ }
2304
+ for (const tabId of allTabIds){
2305
+ const overflowItem = overflowButtons.get(tabId);
2306
+ if (overflowItem) {
2307
+ if (styles_tabs_module.overflowItemHidden) overflowItem.classList.toggle(styles_tabs_module.overflowItemHidden, !hiddenTabIds.includes(tabId));
2308
+ }
2309
+ }
2310
+ if (styles_tabs_module.overflowContainerHidden) overflowContainer.classList.toggle(styles_tabs_module.overflowContainerHidden, 0 === hiddenTabIds.length);
2311
+ if (0 === hiddenTabIds.length) closeOverflowMenu();
2312
+ }
2313
+ function focusFirstEnabledOverflowItem() {
2314
+ const firstEnabled = hiddenTabIds.find((tabId)=>!disabledTabs.includes(tabId));
2315
+ if (firstEnabled) overflowButtons.get(firstEnabled)?.focus();
2316
+ }
2317
+ function openOverflowMenu() {
2318
+ if (isOverflowMenuOpen || 0 === hiddenTabIds.length) return;
2319
+ isOverflowMenuOpen = true;
2320
+ overflowMenu.dataset.state = 'open';
2321
+ overflowButton.setAttribute('aria-expanded', 'true');
2322
+ document.addEventListener('click', handleOutsideClick);
2323
+ document.addEventListener('keydown', handleEscapeKey);
2324
+ }
2325
+ function closeOverflowMenu() {
2326
+ if (!isOverflowMenuOpen) return;
2327
+ isOverflowMenuOpen = false;
2328
+ overflowMenu.dataset.state = 'closed';
2329
+ overflowButton.setAttribute('aria-expanded', 'false');
2330
+ document.removeEventListener('click', handleOutsideClick);
2331
+ document.removeEventListener('keydown', handleEscapeKey);
2332
+ }
2333
+ function toggleOverflowMenu() {
2334
+ if (isOverflowMenuOpen) closeOverflowMenu();
2335
+ else openOverflowMenu();
2336
+ }
2337
+ function handleOutsideClick(e) {
2338
+ if (!overflowContainer.contains(e.target)) closeOverflowMenu();
2339
+ }
2340
+ function handleEscapeKey(e) {
2341
+ if ('Escape' === e.key) closeOverflowMenu();
2342
+ }
2343
+ function handleKeyDown(e, currentTab) {
2344
+ const enabledTabIds = visibleTabIds.filter((tabId)=>!disabledTabs.includes(tabId));
2345
+ const currentIndex = enabledTabIds.indexOf(currentTab);
2346
+ let newIndex = currentIndex;
2347
+ switch(e.key){
2348
+ case 'ArrowLeft':
2349
+ newIndex = currentIndex > 0 ? currentIndex - 1 : enabledTabIds.length - 1;
2350
+ break;
2351
+ case 'ArrowRight':
2352
+ newIndex = currentIndex < enabledTabIds.length - 1 ? currentIndex + 1 : 0;
2353
+ break;
2354
+ case 'Home':
2355
+ newIndex = 0;
2356
+ break;
2357
+ case 'End':
2358
+ newIndex = enabledTabIds.length - 1;
2359
+ break;
2360
+ default:
2361
+ return;
2362
+ }
1872
2363
  e.preventDefault();
1873
2364
  const newTab = enabledTabIds[newIndex];
1874
2365
  if (newTab) {
@@ -1877,23 +2368,152 @@ var __webpack_exports__ = {};
1877
2368
  tabButtons.get(newTab)?.focus();
1878
2369
  }
1879
2370
  }
2371
+ function handleOverflowKeyDown(e, currentTab) {
2372
+ const enabledTabIds = hiddenTabIds.filter((tabId)=>!disabledTabs.includes(tabId));
2373
+ const currentIndex = enabledTabIds.indexOf(currentTab);
2374
+ if ('Escape' === e.key) {
2375
+ e.preventDefault();
2376
+ closeOverflowMenu();
2377
+ overflowButton.focus();
2378
+ return;
2379
+ }
2380
+ let newIndex = currentIndex;
2381
+ switch(e.key){
2382
+ case 'ArrowDown':
2383
+ newIndex = (currentIndex + 1) % enabledTabIds.length;
2384
+ break;
2385
+ case 'ArrowUp':
2386
+ newIndex = currentIndex > 0 ? currentIndex - 1 : enabledTabIds.length - 1;
2387
+ break;
2388
+ default:
2389
+ return;
2390
+ }
2391
+ e.preventDefault();
2392
+ const newTab = enabledTabIds[newIndex];
2393
+ if (newTab) overflowButtons.get(newTab)?.focus();
2394
+ }
1880
2395
  function setActiveTab(tab) {
1881
2396
  activeTab = tab;
1882
- for (const [tabId, tabButton] of tabButtons){
1883
- const isActive = tabId === tab;
1884
- if (styles_tabs_module.tabActive) tabButton.classList.toggle(styles_tabs_module.tabActive, isActive);
1885
- tabButton.setAttribute('aria-selected', isActive ? 'true' : 'false');
1886
- tabButton.tabIndex = isActive ? 0 : -1;
1887
- }
2397
+ applyActiveState(tab);
2398
+ updateVisibleTabs();
1888
2399
  }
2400
+ const handleWindowResize = ()=>{
2401
+ updateVisibleTabs();
2402
+ };
2403
+ let resizeObserver = null;
2404
+ if ('undefined' != typeof ResizeObserver) {
2405
+ resizeObserver = new ResizeObserver(()=>{
2406
+ updateVisibleTabs();
2407
+ });
2408
+ resizeObserver.observe(tabList);
2409
+ } else window.addEventListener('resize', handleWindowResize);
2410
+ applyActiveState(activeTab);
2411
+ requestAnimationFrame(()=>{
2412
+ updateVisibleTabs();
2413
+ });
1889
2414
  return {
1890
2415
  element: tabList,
1891
2416
  setActiveTab,
1892
2417
  destroy: ()=>{
2418
+ closeOverflowMenu();
2419
+ if (resizeObserver) {
2420
+ resizeObserver.disconnect();
2421
+ resizeObserver = null;
2422
+ } else window.removeEventListener('resize', handleWindowResize);
1893
2423
  tabButtons.clear();
2424
+ overflowButtons.clear();
1894
2425
  }
1895
2426
  };
1896
2427
  }
2428
+ function debug_bundle_createDebugBundle(payload) {
2429
+ const { namespace, devToolsState, connection, recentEvents, storeState } = payload;
2430
+ const bundle = {
2431
+ generatedAt: new Date().toISOString(),
2432
+ namespace,
2433
+ devToolsState,
2434
+ connection,
2435
+ recentEvents,
2436
+ storeState,
2437
+ overrides: storeState?.overrides ?? null,
2438
+ iab: storeState?.iab ? {
2439
+ tcString: (storeState?.iab).tcString ?? null,
2440
+ purposeCount: Object.keys((storeState?.iab).purposeConsents ?? {}).length,
2441
+ vendorCount: Object.keys((storeState?.iab).vendorConsents ?? {}).length
2442
+ } : null
2443
+ };
2444
+ return JSON.stringify(bundle, null, 2);
2445
+ }
2446
+ function debug_bundle_sanitizeStoreState(state) {
2447
+ if (!state) return null;
2448
+ try {
2449
+ return JSON.parse(JSON.stringify(state, (_key, value)=>'function' == typeof value ? void 0 : value));
2450
+ } catch {
2451
+ return {
2452
+ error: 'Unable to serialize store state'
2453
+ };
2454
+ }
2455
+ }
2456
+ function debug_bundle_downloadDebugBundle(content) {
2457
+ const blob = new Blob([
2458
+ content
2459
+ ], {
2460
+ type: 'application/json'
2461
+ });
2462
+ const url = URL.createObjectURL(blob);
2463
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
2464
+ const anchor = document.createElement('a');
2465
+ anchor.href = url;
2466
+ anchor.download = `c15t-debug-bundle-${timestamp}.json`;
2467
+ anchor.click();
2468
+ URL.revokeObjectURL(url);
2469
+ }
2470
+ const DEVTOOLS_OVERRIDES_STORAGE_KEY = 'c15t-devtools-overrides';
2471
+ function normalizeStringValue(value) {
2472
+ if ('string' != typeof value) return;
2473
+ const normalized = value.trim();
2474
+ return normalized.length > 0 ? normalized : void 0;
2475
+ }
2476
+ function normalizeBooleanValue(value) {
2477
+ return 'boolean' == typeof value ? value : void 0;
2478
+ }
2479
+ function normalizeOverrides(value) {
2480
+ if (!value || 'object' != typeof value) return null;
2481
+ const source = value;
2482
+ const overrides = {
2483
+ country: normalizeStringValue(source.country),
2484
+ region: normalizeStringValue(source.region),
2485
+ language: normalizeStringValue(source.language),
2486
+ gpc: normalizeBooleanValue(source.gpc)
2487
+ };
2488
+ return hasPersistedOverrides(overrides) ? overrides : null;
2489
+ }
2490
+ function hasPersistedOverrides(overrides) {
2491
+ return Boolean(overrides.country || overrides.region || overrides.language || void 0 !== overrides.gpc);
2492
+ }
2493
+ function override_storage_loadPersistedOverrides(storageKey = DEVTOOLS_OVERRIDES_STORAGE_KEY) {
2494
+ if ('undefined' == typeof window) return null;
2495
+ try {
2496
+ const stored = localStorage.getItem(storageKey);
2497
+ if (!stored) return null;
2498
+ const parsed = JSON.parse(stored);
2499
+ return normalizeOverrides(parsed);
2500
+ } catch {
2501
+ return null;
2502
+ }
2503
+ }
2504
+ function override_storage_persistOverrides(overrides, storageKey = DEVTOOLS_OVERRIDES_STORAGE_KEY) {
2505
+ if ('undefined' == typeof window) return;
2506
+ try {
2507
+ if (!hasPersistedOverrides(overrides)) return void localStorage.removeItem(storageKey);
2508
+ localStorage.setItem(storageKey, JSON.stringify(overrides));
2509
+ } catch {}
2510
+ }
2511
+ function override_storage_clearPersistedOverrides(storageKey = DEVTOOLS_OVERRIDES_STORAGE_KEY) {
2512
+ if ('undefined' == typeof window) return;
2513
+ try {
2514
+ localStorage.removeItem(storageKey);
2515
+ } catch {}
2516
+ }
1897
2517
  var components_module = __webpack_require__("../../node_modules/.bun/@rsbuild+core@1.6.12/node_modules/@rsbuild/core/compiled/css-loader/index.js??ruleSet[1].rules[1].use[1]!builtin:lightningcss-loader??ruleSet[1].rules[1].use[2]!./src/styles/components.module.css");
1898
2518
  var components_module_options = {};
1899
2519
  components_module_options.styleTagTransform = styleTagTransform_default();
@@ -1961,31 +2581,19 @@ var __webpack_exports__ = {};
1961
2581
  btn.appendChild(document.createTextNode(text));
1962
2582
  return btn;
1963
2583
  }
1964
- function createListItem(options) {
1965
- const { title, description, actions = [] } = options;
1966
- const content = renderer_div({
1967
- className: styles_components_module.listItemContent,
1968
- children: [
1969
- renderer_span({
1970
- className: styles_components_module.listItemTitle,
1971
- text: title
1972
- }),
1973
- description ? renderer_span({
1974
- className: styles_components_module.listItemDescription,
1975
- text: description
1976
- }) : null
1977
- ]
1978
- });
1979
- const actionsContainer = renderer_div({
1980
- className: styles_components_module.listItemActions,
1981
- children: actions
1982
- });
1983
- return renderer_div({
1984
- className: styles_components_module.listItem,
1985
- children: [
1986
- content,
1987
- actionsContainer
1988
- ]
2584
+ function createInput(options) {
2585
+ const { value, placeholder, ariaLabel, small = false, onInput } = options;
2586
+ const sizeClass = small ? styles_components_module.inputSmall : '';
2587
+ return input({
2588
+ className: `${styles_components_module.input} ${sizeClass}`.trim(),
2589
+ type: 'text',
2590
+ value,
2591
+ placeholder,
2592
+ ariaLabel,
2593
+ onInput: (event)=>{
2594
+ const target = event.target;
2595
+ onInput?.(target?.value ?? '');
2596
+ }
1989
2597
  });
1990
2598
  }
1991
2599
  function createSection(options) {
@@ -2068,6 +2676,18 @@ var __webpack_exports__ = {};
2068
2676
  children
2069
2677
  });
2070
2678
  }
2679
+ function createDisconnectedState(message = 'Store not connected') {
2680
+ return renderer_div({
2681
+ className: styles_components_module.disconnectedState,
2682
+ style: {
2683
+ padding: '24px',
2684
+ textAlign: 'center',
2685
+ color: 'var(--c15t-text-muted)',
2686
+ fontSize: 'var(--c15t-devtools-font-size-sm)'
2687
+ },
2688
+ text: message
2689
+ });
2690
+ }
2071
2691
  const REFRESH_ICON = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
2072
2692
  <path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"></path>
2073
2693
  <path d="M21 3v5h-5"></path>
@@ -2095,19 +2715,11 @@ var __webpack_exports__ = {};
2095
2715
  <polyline points="4 17 10 11 4 5"></polyline>
2096
2716
  <line x1="12" y1="19" x2="20" y2="19"></line>
2097
2717
  </svg>`;
2098
- function actions_renderActionsPanel(container, options) {
2099
- const { getState, onResetConsents, onRefetchBanner, onShowBanner, onOpenPreferences, onCopyState } = options;
2718
+ function renderActionsPanel(container, options) {
2719
+ const { getState, onResetConsents, onRefetchBanner, onShowBanner, onOpenPreferences, onCopyState, onExportDebugBundle } = options;
2100
2720
  renderer_clearElement(container);
2101
2721
  const state = getState();
2102
- if (!state) return void container.appendChild(renderer_div({
2103
- style: {
2104
- padding: '24px',
2105
- textAlign: 'center',
2106
- color: 'var(--c15t-text-muted)',
2107
- fontSize: 'var(--c15t-devtools-font-size-sm)'
2108
- },
2109
- text: 'Store not connected'
2110
- }));
2722
+ if (!state) return void container.appendChild(createDisconnectedState());
2111
2723
  const actionCards = [
2112
2724
  createActionCard({
2113
2725
  icon: actions_EYE_ICON,
@@ -2128,6 +2740,12 @@ var __webpack_exports__ = {};
2128
2740
  icon: COPY_ICON,
2129
2741
  label: 'Copy State',
2130
2742
  onClick: onCopyState
2743
+ }),
2744
+ createActionCard({
2745
+ icon: REFRESH_ICON,
2746
+ label: 'Export Debug',
2747
+ onClick: ()=>onExportDebugBundle?.(),
2748
+ disabled: !onExportDebugBundle
2131
2749
  })
2132
2750
  ];
2133
2751
  const grid = createGrid({
@@ -2201,7 +2819,7 @@ var __webpack_exports__ = {};
2201
2819
  container.appendChild(consoleSection);
2202
2820
  }
2203
2821
  function createActionCard(options) {
2204
- const { icon, label, onClick } = options;
2822
+ const { icon, label, onClick, disabled = false } = options;
2205
2823
  const card = renderer_div({
2206
2824
  className: styles_components_module.gridCard ?? '',
2207
2825
  style: {
@@ -2212,7 +2830,8 @@ var __webpack_exports__ = {};
2212
2830
  gap: '6px',
2213
2831
  padding: '16px 8px',
2214
2832
  cursor: 'pointer',
2215
- transition: 'background-color var(--c15t-duration-fast) var(--c15t-easing)'
2833
+ transition: 'background-color var(--c15t-duration-fast) var(--c15t-easing)',
2834
+ opacity: disabled ? '0.55' : '1'
2216
2835
  },
2217
2836
  children: [
2218
2837
  createIconWrapper(icon, 20),
@@ -2227,13 +2846,15 @@ var __webpack_exports__ = {};
2227
2846
  })
2228
2847
  ]
2229
2848
  });
2230
- card.addEventListener('click', onClick);
2231
- card.addEventListener('mouseenter', ()=>{
2232
- card.style.backgroundColor = 'var(--c15t-surface-hover)';
2233
- });
2234
- card.addEventListener('mouseleave', ()=>{
2235
- card.style.backgroundColor = '';
2236
- });
2849
+ if (!disabled) {
2850
+ card.addEventListener('click', onClick);
2851
+ card.addEventListener('mouseenter', ()=>{
2852
+ card.style.backgroundColor = 'var(--c15t-surface-hover)';
2853
+ });
2854
+ card.addEventListener('mouseleave', ()=>{
2855
+ card.style.backgroundColor = '';
2856
+ });
2857
+ }
2237
2858
  return card;
2238
2859
  }
2239
2860
  function createIconWrapper(icon, size) {
@@ -2254,19 +2875,12 @@ var __webpack_exports__ = {};
2254
2875
  function getNamespace(state) {
2255
2876
  return state.config?.meta?.namespace || 'c15tStore';
2256
2877
  }
2257
- function consents_renderConsentsPanel(container, options) {
2878
+ const consentSearchByContainer = new WeakMap();
2879
+ function renderConsentsPanel(container, options) {
2258
2880
  const { getState, onConsentChange, onSave, onAcceptAll, onRejectAll, onReset } = options;
2259
2881
  renderer_clearElement(container);
2260
2882
  const state = getState();
2261
- if (!state) return void container.appendChild(renderer_div({
2262
- style: {
2263
- padding: '24px',
2264
- textAlign: 'center',
2265
- color: 'var(--c15t-text-muted)',
2266
- fontSize: 'var(--c15t-devtools-font-size-sm)'
2267
- },
2268
- text: 'Store not connected'
2269
- }));
2883
+ if (!state) return void container.appendChild(createDisconnectedState());
2270
2884
  const isIabMode = 'iab' === state.model;
2271
2885
  const savedConsents = state.consents || {};
2272
2886
  const selectedConsents = state.selectedConsents || {};
@@ -2280,15 +2894,40 @@ var __webpack_exports__ = {};
2280
2894
  ct.name,
2281
2895
  ct
2282
2896
  ]));
2897
+ const searchQuery = consentSearchByContainer.get(container) ?? '';
2283
2898
  const consentEntries = Object.entries(displayConsents);
2284
- if (0 === consentEntries.length) container.appendChild(renderer_div({
2899
+ const filteredConsentEntries = consentEntries.filter(([name])=>{
2900
+ if (!searchQuery) return true;
2901
+ const consentType = consentTypeMap.get(name);
2902
+ const displayName = consentType?.name || name;
2903
+ return `${name} ${displayName}`.toLowerCase().includes(searchQuery);
2904
+ });
2905
+ const showSearchInput = consentEntries.length > 4;
2906
+ if (showSearchInput) container.appendChild(renderer_div({
2907
+ style: {
2908
+ padding: '8px 0 10px'
2909
+ },
2910
+ children: [
2911
+ createInput({
2912
+ value: searchQuery,
2913
+ placeholder: 'Filter consents…',
2914
+ ariaLabel: 'Filter consents',
2915
+ small: true,
2916
+ onInput: (value)=>{
2917
+ consentSearchByContainer.set(container, value.trim().toLowerCase());
2918
+ renderConsentsPanel(container, options);
2919
+ }
2920
+ })
2921
+ ]
2922
+ }));
2923
+ if (0 === filteredConsentEntries.length) container.appendChild(renderer_div({
2285
2924
  style: {
2286
2925
  padding: '24px',
2287
2926
  textAlign: 'center',
2288
2927
  color: 'var(--c15t-devtools-text-muted)',
2289
2928
  fontSize: 'var(--c15t-devtools-font-size-sm)'
2290
2929
  },
2291
- text: 'No consents configured'
2930
+ text: 0 === consentEntries.length ? 'No consents configured' : 'No matching consents'
2292
2931
  }));
2293
2932
  else {
2294
2933
  if (isIabMode) {
@@ -2306,7 +2945,7 @@ var __webpack_exports__ = {};
2306
2945
  container.appendChild(iabNotice);
2307
2946
  }
2308
2947
  const gridCards = [];
2309
- for (const [name, value] of consentEntries){
2948
+ for (const [name, value] of filteredConsentEntries){
2310
2949
  const consentType = consentTypeMap.get(name);
2311
2950
  const isNecessary = 'necessary' === name;
2312
2951
  const displayName = consentType?.name || name;
@@ -2424,15 +3063,26 @@ var __webpack_exports__ = {};
2424
3063
  function formatConsentName(name) {
2425
3064
  return name.replace(/_/g, ' ').replace(/\b\w/g, (l)=>l.toUpperCase());
2426
3065
  }
2427
- let activeFilter = 'all';
2428
- let selectedEventId = null;
2429
- function events_renderEventsPanel(container, options) {
3066
+ const panelStateByContainer = new WeakMap();
3067
+ function getPanelState(container) {
3068
+ const existing = panelStateByContainer.get(container);
3069
+ if (existing) return existing;
3070
+ const initialState = {
3071
+ activeFilter: 'all',
3072
+ selectedEventId: null,
3073
+ searchQuery: ''
3074
+ };
3075
+ panelStateByContainer.set(container, initialState);
3076
+ return initialState;
3077
+ }
3078
+ function renderEventsPanel(container, options) {
2430
3079
  const { getEvents, onClear } = options;
3080
+ const panelState = getPanelState(container);
2431
3081
  renderer_clearElement(container);
2432
3082
  const allEvents = getEvents();
2433
- const events = allEvents.filter((event)=>matchesFilter(event, activeFilter));
2434
- if (!events.some((event)=>event.id === selectedEventId)) selectedEventId = events[0]?.id ?? null;
2435
- const selectedEvent = events.find((event)=>event.id === selectedEventId) ?? null;
3083
+ const events = allEvents.filter((event)=>matchesFilter(event, panelState.activeFilter)).filter((event)=>matchesSearch(event, panelState.searchQuery));
3084
+ if (!events.some((event)=>event.id === panelState.selectedEventId)) panelState.selectedEventId = events[0]?.id ?? null;
3085
+ const selectedEvent = events.find((event)=>event.id === panelState.selectedEventId) ?? null;
2436
3086
  const header = renderer_div({
2437
3087
  style: {
2438
3088
  display: 'flex',
@@ -2468,8 +3118,8 @@ var __webpack_exports__ = {};
2468
3118
  small: true,
2469
3119
  onClick: ()=>{
2470
3120
  onClear();
2471
- selectedEventId = null;
2472
- events_renderEventsPanel(container, options);
3121
+ panelState.selectedEventId = null;
3122
+ renderEventsPanel(container, options);
2473
3123
  }
2474
3124
  })
2475
3125
  ]
@@ -2484,12 +3134,30 @@ var __webpack_exports__ = {};
2484
3134
  gap: '6px',
2485
3135
  padding: '0 16px 8px'
2486
3136
  },
2487
- children: EVENT_FILTERS.map((filter)=>createFilterButton(filter, filter === activeFilter, ()=>{
2488
- activeFilter = filter;
2489
- selectedEventId = null;
2490
- events_renderEventsPanel(container, options);
3137
+ children: EVENT_FILTERS.map((filter)=>createFilterButton(filter, filter === panelState.activeFilter, ()=>{
3138
+ panelState.activeFilter = filter;
3139
+ panelState.selectedEventId = null;
3140
+ renderEventsPanel(container, options);
2491
3141
  }))
2492
3142
  }));
3143
+ container.appendChild(renderer_div({
3144
+ style: {
3145
+ padding: '0 16px 8px'
3146
+ },
3147
+ children: [
3148
+ createInput({
3149
+ value: panelState.searchQuery,
3150
+ placeholder: 'Search events…',
3151
+ ariaLabel: 'Search events',
3152
+ small: true,
3153
+ onInput: (value)=>{
3154
+ panelState.searchQuery = value.trim().toLowerCase();
3155
+ panelState.selectedEventId = null;
3156
+ renderEventsPanel(container, options);
3157
+ }
3158
+ })
3159
+ ]
3160
+ }));
2493
3161
  const eventList = renderer_div({
2494
3162
  style: {
2495
3163
  display: 'flex',
@@ -2509,9 +3177,9 @@ var __webpack_exports__ = {};
2509
3177
  },
2510
3178
  text: 'No events match this filter'
2511
3179
  }));
2512
- else for (const event of events)eventList.appendChild(createEventItem(event, event.id === selectedEventId, ()=>{
2513
- selectedEventId = event.id;
2514
- events_renderEventsPanel(container, options);
3180
+ else for (const event of events)eventList.appendChild(createEventItem(event, event.id === panelState.selectedEventId, ()=>{
3181
+ panelState.selectedEventId = event.id;
3182
+ renderEventsPanel(container, options);
2515
3183
  }));
2516
3184
  container.appendChild(eventList);
2517
3185
  container.appendChild(createPayloadSection(selectedEvent));
@@ -2538,6 +3206,11 @@ var __webpack_exports__ = {};
2538
3206
  if ('network' === filter) return 'network' === event.type;
2539
3207
  return 'iab' === event.type;
2540
3208
  }
3209
+ function matchesSearch(event, query) {
3210
+ if (!query) return true;
3211
+ const haystack = `${event.type} ${event.message} ${JSON.stringify(event.data ?? {})}`;
3212
+ return haystack.toLowerCase().includes(query);
3213
+ }
2541
3214
  function createPayloadSection(event) {
2542
3215
  const payload = event?.data ? JSON.stringify(event.data, null, 2) : null;
2543
3216
  return renderer_div({
@@ -2675,38 +3348,15 @@ var __webpack_exports__ = {};
2675
3348
  return 'var(--c15t-text-muted)';
2676
3349
  }
2677
3350
  }
2678
- function iab_renderIabPanel(container, options) {
3351
+ const iabSearchByContainer = new WeakMap();
3352
+ function renderIabPanel(container, options) {
2679
3353
  const { getState, onSetPurposeConsent, onSetVendorConsent, onSetSpecialFeatureOptIn, onAcceptAll, onRejectAll, onSave, onReset } = options;
2680
3354
  renderer_clearElement(container);
2681
3355
  const state = getState();
2682
- if (!state) return void container.appendChild(renderer_div({
2683
- style: {
2684
- padding: '24px',
2685
- textAlign: 'center',
2686
- color: 'var(--c15t-text-muted)',
2687
- fontSize: 'var(--c15t-devtools-font-size-sm)'
2688
- },
2689
- text: 'Store not connected'
2690
- }));
2691
- if ('iab' !== state.model) return void container.appendChild(renderer_div({
2692
- style: {
2693
- padding: '24px',
2694
- textAlign: 'center',
2695
- color: 'var(--c15t-text-muted)',
2696
- fontSize: 'var(--c15t-devtools-font-size-sm)'
2697
- },
2698
- text: 'IAB TCF mode is not configured'
2699
- }));
3356
+ if (!state) return void container.appendChild(createDisconnectedState());
3357
+ if ('iab' !== state.model) return void container.appendChild(createDisconnectedState('IAB TCF mode is not configured'));
2700
3358
  const iabState = state.iab;
2701
- if (!iabState) return void container.appendChild(renderer_div({
2702
- style: {
2703
- padding: '24px',
2704
- textAlign: 'center',
2705
- color: 'var(--c15t-text-muted)',
2706
- fontSize: 'var(--c15t-devtools-font-size-sm)'
2707
- },
2708
- text: 'IAB state not available'
2709
- }));
3359
+ if (!iabState) return void container.appendChild(createDisconnectedState('IAB state not available'));
2710
3360
  const tcString = iabState.tcString;
2711
3361
  const tcStringSection = createSection({
2712
3362
  title: 'TC String',
@@ -2738,9 +3388,30 @@ var __webpack_exports__ = {};
2738
3388
  });
2739
3389
  container.appendChild(tcStringSection);
2740
3390
  const gvl = iabState.gvl;
3391
+ const searchQuery = iabSearchByContainer.get(container) ?? '';
3392
+ container.appendChild(createSection({
3393
+ title: 'Filter',
3394
+ children: [
3395
+ createInput({
3396
+ value: searchQuery,
3397
+ placeholder: 'Filter purposes or vendors…',
3398
+ ariaLabel: 'Filter IAB purposes and vendors',
3399
+ small: true,
3400
+ onInput: (value)=>{
3401
+ iabSearchByContainer.set(container, value.trim().toLowerCase());
3402
+ renderIabPanel(container, options);
3403
+ }
3404
+ })
3405
+ ]
3406
+ }));
2741
3407
  const purposeConsents = iabState.purposeConsents || {};
2742
3408
  const purposes = gvl?.purposes || {};
2743
- const purposeEntries = Object.entries(purposeConsents);
3409
+ const purposeEntries = Object.entries(purposeConsents).filter(([purposeId])=>{
3410
+ if (!searchQuery) return true;
3411
+ const purposeInfo = purposes[purposeId];
3412
+ const purposeName = purposeInfo?.name || `Purpose ${purposeId}`;
3413
+ return `${purposeId} ${purposeName}`.toLowerCase().includes(searchQuery);
3414
+ });
2744
3415
  if (purposeEntries.length > 0) {
2745
3416
  const purposeList = renderer_div({
2746
3417
  style: {
@@ -2768,7 +3439,12 @@ var __webpack_exports__ = {};
2768
3439
  }
2769
3440
  const specialFeatureOptIns = iabState.specialFeatureOptIns || {};
2770
3441
  const specialFeatures = gvl?.specialFeatures || {};
2771
- const specialFeatureEntries = Object.entries(specialFeatureOptIns);
3442
+ const specialFeatureEntries = Object.entries(specialFeatureOptIns).filter(([featureId])=>{
3443
+ if (!searchQuery) return true;
3444
+ const featureInfo = specialFeatures[featureId];
3445
+ const featureName = featureInfo?.name || `Special Feature ${featureId}`;
3446
+ return `${featureId} ${featureName}`.toLowerCase().includes(searchQuery);
3447
+ });
2772
3448
  if (specialFeatureEntries.length > 0) {
2773
3449
  const specialFeatureList = renderer_div({
2774
3450
  style: {
@@ -2796,7 +3472,12 @@ var __webpack_exports__ = {};
2796
3472
  }
2797
3473
  const vendorConsents = iabState.vendorConsents || {};
2798
3474
  const vendors = gvl?.vendors || {};
2799
- const vendorEntries = Object.entries(vendorConsents);
3475
+ const vendorEntries = Object.entries(vendorConsents).filter(([vendorId])=>{
3476
+ if (!searchQuery) return true;
3477
+ const vendorInfo = vendors[vendorId];
3478
+ const vendorName = vendorInfo?.name || `Vendor ${vendorId}`;
3479
+ return `${vendorId} ${vendorName}`.toLowerCase().includes(searchQuery);
3480
+ });
2800
3481
  const iabVendors = [];
2801
3482
  const customVendors = [];
2802
3483
  for (const [vendorId, consent] of vendorEntries){
@@ -3015,19 +3696,11 @@ var __webpack_exports__ = {};
3015
3696
  if (text.length <= maxLength) return text;
3016
3697
  return `${text.slice(0, maxLength - 3)}...`;
3017
3698
  }
3018
- function location_renderLocationPanel(container, options) {
3699
+ function renderLocationPanel(container, options) {
3019
3700
  const { getState, onApplyOverrides, onClearOverrides } = options;
3020
3701
  renderer_clearElement(container);
3021
3702
  const state = getState();
3022
- if (!state) return void container.appendChild(renderer_div({
3023
- style: {
3024
- padding: '24px',
3025
- textAlign: 'center',
3026
- color: 'var(--c15t-text-muted)',
3027
- fontSize: 'var(--c15t-devtools-font-size-sm)'
3028
- },
3029
- text: 'Store not connected'
3030
- }));
3703
+ if (!state) return void container.appendChild(createDisconnectedState());
3031
3704
  const locationInfo = state.locationInfo;
3032
3705
  const overrides = state.overrides;
3033
3706
  const translationConfig = state.translationConfig;
@@ -3676,29 +4349,43 @@ var __webpack_exports__ = {};
3676
4349
  <polyline points="16 18 22 12 16 6"></polyline>
3677
4350
  <polyline points="8 6 2 12 8 18"></polyline>
3678
4351
  </svg>`;
3679
- function scripts_renderScriptsPanel(container, options) {
4352
+ const scriptsSearchByContainer = new WeakMap();
4353
+ function renderScriptsPanel(container, options) {
3680
4354
  const { getState, getEvents } = options;
3681
4355
  renderer_clearElement(container);
3682
4356
  const state = getState();
3683
- if (!state) return void container.appendChild(renderer_div({
3684
- style: {
3685
- padding: '24px',
3686
- textAlign: 'center',
3687
- color: 'var(--c15t-text-muted)',
3688
- fontSize: 'var(--c15t-devtools-font-size-sm)'
3689
- },
3690
- text: 'Store not connected'
3691
- }));
4357
+ if (!state) return void container.appendChild(createDisconnectedState());
3692
4358
  const scripts = state.scripts || [];
3693
4359
  const loadedScripts = state.loadedScripts || {};
3694
4360
  const networkBlocker = state.networkBlocker;
3695
4361
  const events = getEvents?.() ?? [];
3696
- if (0 === scripts.length) {
3697
- const scriptsSection = createSection({
3698
- title: 'Configured Scripts',
3699
- children: [
3700
- createEmptyState({
3701
- icon: CODE_ICON,
4362
+ const searchQuery = scriptsSearchByContainer.get(container) ?? '';
4363
+ const filteredScripts = scripts.filter((script)=>{
4364
+ if (!searchQuery) return true;
4365
+ const category = 'string' == typeof script.category ? script.category : JSON.stringify(script.category);
4366
+ return `${script.id} ${category}`.toLowerCase().includes(searchQuery);
4367
+ });
4368
+ if (scripts.length > 4) container.appendChild(createSection({
4369
+ title: 'Filter',
4370
+ children: [
4371
+ createInput({
4372
+ value: searchQuery,
4373
+ placeholder: "Filter scripts…",
4374
+ ariaLabel: "Filter scripts",
4375
+ small: true,
4376
+ onInput: (value)=>{
4377
+ scriptsSearchByContainer.set(container, value.trim().toLowerCase());
4378
+ renderScriptsPanel(container, options);
4379
+ }
4380
+ })
4381
+ ]
4382
+ }));
4383
+ if (0 === scripts.length) {
4384
+ const scriptsSection = createSection({
4385
+ title: 'Configured Scripts',
4386
+ children: [
4387
+ createEmptyState({
4388
+ icon: CODE_ICON,
3702
4389
  text: "No scripts configured"
3703
4390
  })
3704
4391
  ]
@@ -3709,10 +4396,19 @@ var __webpack_exports__ = {};
3709
4396
  style: {
3710
4397
  display: 'flex',
3711
4398
  flexDirection: 'column',
3712
- gap: '4px'
4399
+ borderTop: '1px solid var(--c15t-border)',
4400
+ borderBottom: '1px solid var(--c15t-border)'
3713
4401
  }
3714
4402
  });
3715
- for (const script of scripts){
4403
+ if (0 === filteredScripts.length) scriptsList.appendChild(renderer_div({
4404
+ style: {
4405
+ padding: '10px 0',
4406
+ fontSize: 'var(--c15t-devtools-font-size-xs)',
4407
+ color: 'var(--c15t-text-muted)'
4408
+ },
4409
+ text: "No matching scripts"
4410
+ }));
4411
+ for (const script of filteredScripts){
3716
4412
  const scriptId = script.id;
3717
4413
  const isLoaded = true === loadedScripts[scriptId];
3718
4414
  const category = script.category;
@@ -3736,17 +4432,64 @@ var __webpack_exports__ = {};
3736
4432
  text: status.charAt(0).toUpperCase() + status.slice(1),
3737
4433
  variant: statusVariant
3738
4434
  });
3739
- const item = createListItem({
3740
- title: scriptId,
3741
- description: `Category: ${categoryDisplay}`,
3742
- actions: [
3743
- badge
4435
+ const row = renderer_div({
4436
+ style: {
4437
+ display: 'flex',
4438
+ alignItems: 'center',
4439
+ justifyContent: 'space-between',
4440
+ gap: '8px',
4441
+ padding: '8px 0',
4442
+ borderBottom: '1px solid var(--c15t-border)'
4443
+ },
4444
+ children: [
4445
+ renderer_div({
4446
+ style: {
4447
+ display: 'flex',
4448
+ flexDirection: 'column',
4449
+ gap: '2px',
4450
+ minWidth: '0',
4451
+ flex: '1'
4452
+ },
4453
+ children: [
4454
+ renderer_div({
4455
+ style: {
4456
+ fontSize: 'var(--c15t-font-size-sm)',
4457
+ fontWeight: '500',
4458
+ color: 'var(--c15t-text)',
4459
+ overflow: 'hidden',
4460
+ textOverflow: 'ellipsis',
4461
+ whiteSpace: 'nowrap'
4462
+ },
4463
+ text: scriptId
4464
+ }),
4465
+ renderer_div({
4466
+ style: {
4467
+ fontSize: 'var(--c15t-devtools-font-size-xs)',
4468
+ color: 'var(--c15t-text-muted)',
4469
+ overflow: 'hidden',
4470
+ textOverflow: 'ellipsis',
4471
+ whiteSpace: 'nowrap'
4472
+ },
4473
+ text: `Category: ${categoryDisplay}`
4474
+ })
4475
+ ]
4476
+ }),
4477
+ renderer_div({
4478
+ style: {
4479
+ flexShrink: '0'
4480
+ },
4481
+ children: [
4482
+ badge
4483
+ ]
4484
+ })
3744
4485
  ]
3745
4486
  });
3746
- scriptsList.appendChild(item);
4487
+ scriptsList.appendChild(row);
3747
4488
  }
4489
+ const lastRow = scriptsList.lastElementChild;
4490
+ if (lastRow) lastRow.style.borderBottom = 'none';
3748
4491
  const scriptsSection = createSection({
3749
- title: `Configured Scripts (${scripts.length})`,
4492
+ title: `Configured Scripts (${filteredScripts.length}/${scripts.length})`,
3750
4493
  children: [
3751
4494
  scriptsList
3752
4495
  ]
@@ -3888,53 +4631,6 @@ var __webpack_exports__ = {};
3888
4631
  if (text.length <= maxLength) return text;
3889
4632
  return `${text.slice(0, maxLength - 3)}...`;
3890
4633
  }
3891
- const DEVTOOLS_OVERRIDES_STORAGE_KEY = 'c15t-devtools-overrides';
3892
- function normalizeStringValue(value) {
3893
- if ('string' != typeof value) return;
3894
- const normalized = value.trim();
3895
- return normalized.length > 0 ? normalized : void 0;
3896
- }
3897
- function normalizeBooleanValue(value) {
3898
- return 'boolean' == typeof value ? value : void 0;
3899
- }
3900
- function normalizeOverrides(value) {
3901
- if (!value || 'object' != typeof value) return null;
3902
- const source = value;
3903
- const overrides = {
3904
- country: normalizeStringValue(source.country),
3905
- region: normalizeStringValue(source.region),
3906
- language: normalizeStringValue(source.language),
3907
- gpc: normalizeBooleanValue(source.gpc)
3908
- };
3909
- return hasPersistedOverrides(overrides) ? overrides : null;
3910
- }
3911
- function hasPersistedOverrides(overrides) {
3912
- return Boolean(overrides.country || overrides.region || overrides.language || void 0 !== overrides.gpc);
3913
- }
3914
- function override_storage_loadPersistedOverrides(storageKey = DEVTOOLS_OVERRIDES_STORAGE_KEY) {
3915
- if ('undefined' == typeof window) return null;
3916
- try {
3917
- const stored = localStorage.getItem(storageKey);
3918
- if (!stored) return null;
3919
- const parsed = JSON.parse(stored);
3920
- return normalizeOverrides(parsed);
3921
- } catch {
3922
- return null;
3923
- }
3924
- }
3925
- function override_storage_persistOverrides(overrides, storageKey = DEVTOOLS_OVERRIDES_STORAGE_KEY) {
3926
- if ('undefined' == typeof window) return;
3927
- try {
3928
- if (!hasPersistedOverrides(overrides)) return void localStorage.removeItem(storageKey);
3929
- localStorage.setItem(storageKey, JSON.stringify(overrides));
3930
- } catch {}
3931
- }
3932
- function override_storage_clearPersistedOverrides(storageKey = DEVTOOLS_OVERRIDES_STORAGE_KEY) {
3933
- if ('undefined' == typeof window) return;
3934
- try {
3935
- localStorage.removeItem(storageKey);
3936
- } catch {}
3937
- }
3938
4634
  const STORAGE_KEYS = {
3939
4635
  C15T: 'c15t',
3940
4636
  PENDING_SYNC: 'c15t:pending-consent-sync',
@@ -3960,7 +4656,7 @@ var __webpack_exports__ = {};
3960
4656
  localStorage.removeItem(STORAGE_KEYS.EUCONSENT);
3961
4657
  } catch {}
3962
4658
  }
3963
- async function reset_consents_resetAllConsents(store, stateManager) {
4659
+ async function resetAllConsents(store, stateManager) {
3964
4660
  const storeState = store.getState();
3965
4661
  storeState.resetConsents();
3966
4662
  clearAllCookies();
@@ -3971,7 +4667,222 @@ var __webpack_exports__ = {};
3971
4667
  message: 'All consents reset (storage cleared)'
3972
4668
  });
3973
4669
  }
4670
+ function panel_renderer_createPanelRenderer(config) {
4671
+ const { storeConnector, stateManager, enableEventLogging = true, onPersistOverrides, onClearPersistedOverrides, onCopyState, onExportDebugBundle } = config;
4672
+ const getStoreState = ()=>storeConnector.getState();
4673
+ const logEvent = (type, message, data)=>{
4674
+ if (enableEventLogging) stateManager.addEvent({
4675
+ type,
4676
+ message,
4677
+ data
4678
+ });
4679
+ };
4680
+ const resetConsents = async ()=>{
4681
+ const store = storeConnector.getStore();
4682
+ if (store) await resetAllConsents(store, enableEventLogging ? stateManager : void 0);
4683
+ };
4684
+ const renderPanel = (container, tab)=>{
4685
+ switch(tab){
4686
+ case 'consents':
4687
+ renderConsentsPanel(container, {
4688
+ getState: getStoreState,
4689
+ onConsentChange: (name, value)=>{
4690
+ const store = storeConnector.getStore();
4691
+ if (store) {
4692
+ const consentName = String(name);
4693
+ store.getState().setSelectedConsent(consentName, value);
4694
+ logEvent('info', `${consentName} toggled to ${value} (not saved)`, {
4695
+ name: consentName,
4696
+ value
4697
+ });
4698
+ }
4699
+ },
4700
+ onSave: ()=>{
4701
+ const store = storeConnector.getStore();
4702
+ if (store) {
4703
+ store.getState().saveConsents('custom');
4704
+ logEvent('consent_save', 'Saved consent preferences');
4705
+ }
4706
+ },
4707
+ onAcceptAll: ()=>{
4708
+ const store = storeConnector.getStore();
4709
+ if (store) {
4710
+ store.getState().saveConsents('all');
4711
+ logEvent('consent_save', 'Accepted all consents');
4712
+ }
4713
+ },
4714
+ onRejectAll: ()=>{
4715
+ const store = storeConnector.getStore();
4716
+ if (store) {
4717
+ store.getState().saveConsents('necessary');
4718
+ logEvent('consent_save', 'Rejected all optional consents');
4719
+ }
4720
+ },
4721
+ onReset: resetConsents
4722
+ });
4723
+ break;
4724
+ case 'location':
4725
+ renderLocationPanel(container, {
4726
+ getState: getStoreState,
4727
+ onApplyOverrides: async (overrides)=>{
4728
+ const store = storeConnector.getStore();
4729
+ if (store) {
4730
+ await store.getState().setOverrides({
4731
+ country: overrides.country,
4732
+ region: overrides.region,
4733
+ language: overrides.language,
4734
+ gpc: overrides.gpc
4735
+ });
4736
+ logEvent('info', 'Overrides updated', {
4737
+ country: overrides.country,
4738
+ region: overrides.region,
4739
+ language: overrides.language,
4740
+ gpc: overrides.gpc
4741
+ });
4742
+ onPersistOverrides?.({
4743
+ country: overrides.country,
4744
+ region: overrides.region,
4745
+ language: overrides.language,
4746
+ gpc: overrides.gpc
4747
+ });
4748
+ }
4749
+ },
4750
+ onClearOverrides: async ()=>{
4751
+ const store = storeConnector.getStore();
4752
+ if (store) {
4753
+ await store.getState().setOverrides({
4754
+ country: void 0,
4755
+ region: void 0,
4756
+ language: void 0,
4757
+ gpc: void 0
4758
+ });
4759
+ logEvent('info', 'Overrides cleared');
4760
+ onClearPersistedOverrides?.();
4761
+ }
4762
+ }
4763
+ });
4764
+ break;
4765
+ case "scripts":
4766
+ renderScriptsPanel(container, {
4767
+ getState: getStoreState,
4768
+ getEvents: ()=>stateManager.getState().eventLog
4769
+ });
4770
+ break;
4771
+ case 'iab':
4772
+ renderIabPanel(container, {
4773
+ getState: getStoreState,
4774
+ onSetPurposeConsent: (purposeId, value)=>{
4775
+ const iab = storeConnector.getStore()?.getState().iab;
4776
+ if (!iab) return;
4777
+ iab.setPurposeConsent(purposeId, value);
4778
+ logEvent('iab', `IAB purpose ${purposeId} set to ${value}`);
4779
+ },
4780
+ onSetVendorConsent: (vendorId, value)=>{
4781
+ const iab = storeConnector.getStore()?.getState().iab;
4782
+ if (!iab) return;
4783
+ iab.setVendorConsent(vendorId, value);
4784
+ logEvent('iab', `IAB vendor ${vendorId} set to ${value}`);
4785
+ },
4786
+ onSetSpecialFeatureOptIn: (featureId, value)=>{
4787
+ const iab = storeConnector.getStore()?.getState().iab;
4788
+ if (!iab) return;
4789
+ iab.setSpecialFeatureOptIn(featureId, value);
4790
+ logEvent('iab', `IAB feature ${featureId} set to ${value}`);
4791
+ },
4792
+ onAcceptAll: ()=>{
4793
+ const iab = storeConnector.getStore()?.getState().iab;
4794
+ if (!iab) return;
4795
+ iab.acceptAll();
4796
+ logEvent('iab', 'IAB accept all selected');
4797
+ },
4798
+ onRejectAll: ()=>{
4799
+ const iab = storeConnector.getStore()?.getState().iab;
4800
+ if (!iab) return;
4801
+ iab.rejectAll();
4802
+ logEvent('iab', 'IAB reject all selected');
4803
+ },
4804
+ onSave: ()=>{
4805
+ const iab = storeConnector.getStore()?.getState().iab;
4806
+ if (!iab) return;
4807
+ iab.save().then(()=>logEvent('iab', 'IAB preferences saved')).catch((error)=>{
4808
+ logEvent('error', `Failed to save IAB preferences: ${String(error)}`);
4809
+ });
4810
+ },
4811
+ onReset: resetConsents
4812
+ });
4813
+ break;
4814
+ case 'events':
4815
+ renderEventsPanel(container, {
4816
+ getEvents: ()=>stateManager.getState().eventLog,
4817
+ onClear: ()=>{
4818
+ stateManager.clearEventLog();
4819
+ logEvent('info', 'Event log cleared');
4820
+ }
4821
+ });
4822
+ break;
4823
+ case 'actions':
4824
+ renderActionsPanel(container, {
4825
+ getState: getStoreState,
4826
+ onResetConsents: resetConsents,
4827
+ onRefetchBanner: async ()=>{
4828
+ const store = storeConnector.getStore();
4829
+ if (store) {
4830
+ await store.getState().initConsentManager();
4831
+ logEvent('info', 'Banner data refetched');
4832
+ }
4833
+ },
4834
+ onShowBanner: ()=>{
4835
+ const store = storeConnector.getStore();
4836
+ if (store) {
4837
+ store.getState().setActiveUI('banner', {
4838
+ force: true
4839
+ });
4840
+ logEvent('info', 'Banner shown');
4841
+ }
4842
+ },
4843
+ onOpenPreferences: ()=>{
4844
+ const store = storeConnector.getStore();
4845
+ if (store) {
4846
+ store.getState().setActiveUI('dialog');
4847
+ logEvent('info', 'Preferences dialog opened');
4848
+ }
4849
+ },
4850
+ onCopyState: ()=>{
4851
+ const state = getStoreState();
4852
+ if (state) if (onCopyState) {
4853
+ const result = onCopyState(state);
4854
+ if (result instanceof Promise) result.then((ok)=>{
4855
+ logEvent(ok ? 'info' : 'error', ok ? 'State copied to clipboard' : 'Failed to copy state');
4856
+ }).catch(()=>{
4857
+ logEvent('error', 'Failed to copy state');
4858
+ });
4859
+ else logEvent(result ? 'info' : 'error', result ? 'State copied to clipboard' : 'Failed to copy state');
4860
+ } else navigator.clipboard.writeText(JSON.stringify(state, null, 2)).then(()=>{
4861
+ logEvent('info', 'State copied to clipboard');
4862
+ }).catch(()=>{
4863
+ logEvent('error', 'Failed to copy state');
4864
+ });
4865
+ },
4866
+ onExportDebugBundle: onExportDebugBundle ? ()=>{
4867
+ try {
4868
+ onExportDebugBundle();
4869
+ logEvent('info', 'Debug bundle exported');
4870
+ } catch {
4871
+ logEvent('error', 'Failed to export debug bundle');
4872
+ }
4873
+ } : void 0
4874
+ });
4875
+ break;
4876
+ }
4877
+ };
4878
+ return {
4879
+ renderPanel,
4880
+ getStoreState,
4881
+ resetConsents
4882
+ };
4883
+ }
3974
4884
  const STORAGE_KEY = 'c15t-devtools-events';
4885
+ const ACTIVE_TAB_STORAGE_KEY = 'c15t-devtools-active-tab';
3975
4886
  function loadPersistedEvents() {
3976
4887
  if ('undefined' == typeof window) return [];
3977
4888
  try {
@@ -3986,11 +4897,29 @@ var __webpack_exports__ = {};
3986
4897
  sessionStorage.setItem(STORAGE_KEY, JSON.stringify(events));
3987
4898
  } catch {}
3988
4899
  }
4900
+ function isDevToolsTab(value) {
4901
+ return 'consents' === value || 'location' === value || "scripts" === value || 'iab' === value || 'events' === value || 'actions' === value;
4902
+ }
4903
+ function loadPersistedActiveTab() {
4904
+ if ('undefined' == typeof window) return null;
4905
+ try {
4906
+ const stored = localStorage.getItem(ACTIVE_TAB_STORAGE_KEY);
4907
+ if (isDevToolsTab(stored)) return stored;
4908
+ } catch {}
4909
+ return null;
4910
+ }
4911
+ function persistActiveTab(tab) {
4912
+ if ('undefined' == typeof window) return;
4913
+ try {
4914
+ localStorage.setItem(ACTIVE_TAB_STORAGE_KEY, tab);
4915
+ } catch {}
4916
+ }
3989
4917
  function state_manager_createStateManager(initialState = {}) {
3990
4918
  const persistedEvents = loadPersistedEvents();
4919
+ const persistedActiveTab = loadPersistedActiveTab();
3991
4920
  let state = {
3992
4921
  isOpen: false,
3993
- activeTab: 'location',
4922
+ activeTab: persistedActiveTab ?? 'location',
3994
4923
  position: 'bottom-right',
3995
4924
  isConnected: false,
3996
4925
  eventLog: persistedEvents,
@@ -4031,6 +4960,7 @@ var __webpack_exports__ = {};
4031
4960
  setState({
4032
4961
  activeTab: tab
4033
4962
  });
4963
+ persistActiveTab(tab);
4034
4964
  },
4035
4965
  setPosition: (position)=>{
4036
4966
  setState({
@@ -4076,22 +5006,52 @@ var __webpack_exports__ = {};
4076
5006
  let reconnectAttempts = 0;
4077
5007
  let hasNotifiedDisconnect = false;
4078
5008
  const listeners = new Set();
5009
+ const diagnosticsListeners = new Set();
5010
+ let diagnostics = {
5011
+ namespace,
5012
+ reconnectAttempts: 0,
5013
+ nextRetryInMs: null,
5014
+ lastError: null,
5015
+ isPolling: false,
5016
+ disconnectNotified: false
5017
+ };
4079
5018
  const INITIAL_RETRY_DELAY_MS = 100;
4080
5019
  const MAX_RETRY_DELAY_MS = 2000;
4081
5020
  const DISCONNECT_NOTIFY_ATTEMPTS = 5;
5021
+ function updateDiagnostics(partial, notify = true) {
5022
+ diagnostics = {
5023
+ ...diagnostics,
5024
+ ...partial
5025
+ };
5026
+ if (!notify) return;
5027
+ for (const listener of diagnosticsListeners)listener(diagnostics);
5028
+ }
4082
5029
  function clearReconnectTimer() {
4083
5030
  if (reconnectTimeout) {
4084
5031
  clearTimeout(reconnectTimeout);
4085
5032
  reconnectTimeout = null;
5033
+ updateDiagnostics({
5034
+ isPolling: false,
5035
+ nextRetryInMs: null
5036
+ });
4086
5037
  }
4087
5038
  }
4088
5039
  function resetReconnectState() {
4089
5040
  reconnectAttempts = 0;
4090
5041
  hasNotifiedDisconnect = false;
5042
+ updateDiagnostics({
5043
+ reconnectAttempts: 0,
5044
+ nextRetryInMs: null,
5045
+ lastError: null,
5046
+ disconnectNotified: false
5047
+ });
4091
5048
  }
4092
5049
  function notifyDisconnectedOnce() {
4093
5050
  if (hasNotifiedDisconnect) return;
4094
5051
  hasNotifiedDisconnect = true;
5052
+ updateDiagnostics({
5053
+ disconnectNotified: true
5054
+ });
4095
5055
  onDisconnect?.();
4096
5056
  }
4097
5057
  function tryConnect() {
@@ -4112,16 +5072,31 @@ var __webpack_exports__ = {};
4112
5072
  onConnect?.(currentState, store);
4113
5073
  clearReconnectTimer();
4114
5074
  resetReconnectState();
5075
+ updateDiagnostics({
5076
+ lastError: null
5077
+ });
4115
5078
  return true;
4116
5079
  }
5080
+ updateDiagnostics({
5081
+ lastError: `Store "${namespace}" not found on window`
5082
+ });
4117
5083
  return false;
4118
5084
  }
4119
5085
  function scheduleReconnect(immediate = false) {
4120
5086
  if (store || reconnectTimeout) return;
4121
5087
  const delay = immediate ? 0 : Math.min(INITIAL_RETRY_DELAY_MS * 2 ** Math.min(reconnectAttempts, 5), MAX_RETRY_DELAY_MS);
5088
+ updateDiagnostics({
5089
+ isPolling: true,
5090
+ nextRetryInMs: delay,
5091
+ reconnectAttempts
5092
+ });
4122
5093
  reconnectTimeout = setTimeout(()=>{
4123
5094
  reconnectTimeout = null;
4124
5095
  reconnectAttempts++;
5096
+ updateDiagnostics({
5097
+ reconnectAttempts,
5098
+ nextRetryInMs: null
5099
+ });
4125
5100
  if (tryConnect()) return;
4126
5101
  if (reconnectAttempts >= DISCONNECT_NOTIFY_ATTEMPTS) notifyDisconnectedOnce();
4127
5102
  scheduleReconnect();
@@ -4143,6 +5118,14 @@ var __webpack_exports__ = {};
4143
5118
  listeners.delete(listener);
4144
5119
  };
4145
5120
  },
5121
+ getDiagnostics: ()=>diagnostics,
5122
+ subscribeDiagnostics: (listener)=>{
5123
+ diagnosticsListeners.add(listener);
5124
+ listener(diagnostics);
5125
+ return ()=>{
5126
+ diagnosticsListeners.delete(listener);
5127
+ };
5128
+ },
4146
5129
  retryConnection: ()=>{
4147
5130
  if (store) return;
4148
5131
  resetReconnectState();
@@ -4156,6 +5139,134 @@ var __webpack_exports__ = {};
4156
5139
  }
4157
5140
  store = null;
4158
5141
  listeners.clear();
5142
+ diagnosticsListeners.clear();
5143
+ }
5144
+ };
5145
+ }
5146
+ const REGISTRY_KEY = '__c15tDevToolsInstrumentationRegistry';
5147
+ let fallbackRegistry = null;
5148
+ function getRegistry() {
5149
+ if ('undefined' == typeof window) {
5150
+ if (!fallbackRegistry) fallbackRegistry = new Map();
5151
+ return fallbackRegistry;
5152
+ }
5153
+ const host = window;
5154
+ const existing = host[REGISTRY_KEY];
5155
+ if (existing) return existing;
5156
+ const registry = new Map();
5157
+ host[REGISTRY_KEY] = registry;
5158
+ return registry;
5159
+ }
5160
+ function getBlockedRequestMessage(payload) {
5161
+ const data = payload;
5162
+ const method = 'string' == typeof data?.method ? data.method.toUpperCase() : 'REQUEST';
5163
+ const url = 'string' == typeof data?.url ? data.url : 'unknown-url';
5164
+ return `Network blocked: ${method} ${url}`;
5165
+ }
5166
+ function emitEvent(entry, event) {
5167
+ for (const listener of entry.listeners)listener(event);
5168
+ }
5169
+ function ensureNetworkBlockerWrapped(entry) {
5170
+ const blocker = entry.store.getState().networkBlocker;
5171
+ if (!blocker) return;
5172
+ if (blocker.onRequestBlocked === entry.wrappedNetworkBlockedCallback) return;
5173
+ entry.originalNetworkBlockedCallback = blocker.onRequestBlocked;
5174
+ entry.wrappedNetworkBlockedCallback = (payload)=>{
5175
+ emitEvent(entry, {
5176
+ type: 'network',
5177
+ message: getBlockedRequestMessage(payload),
5178
+ data: payload
5179
+ });
5180
+ if ('function' == typeof entry.originalNetworkBlockedCallback) entry.originalNetworkBlockedCallback(payload);
5181
+ };
5182
+ entry.store.getState().setNetworkBlocker({
5183
+ ...blocker,
5184
+ onRequestBlocked: entry.wrappedNetworkBlockedCallback
5185
+ });
5186
+ }
5187
+ function restoreInstrumentation(entry) {
5188
+ entry.stopWatchingStore?.();
5189
+ entry.stopWatchingStore = null;
5190
+ const state = entry.store.getState();
5191
+ state.setCallback('onBannerFetched', entry.originalCallbacks.onBannerFetched);
5192
+ state.setCallback('onConsentSet', entry.originalCallbacks.onConsentSet);
5193
+ state.setCallback('onError', entry.originalCallbacks.onError);
5194
+ state.setCallback('onBeforeConsentRevocationReload', entry.originalCallbacks.onBeforeConsentRevocationReload);
5195
+ const blocker = state.networkBlocker;
5196
+ if (blocker && blocker.onRequestBlocked === entry.wrappedNetworkBlockedCallback) state.setNetworkBlocker({
5197
+ ...blocker,
5198
+ onRequestBlocked: entry.originalNetworkBlockedCallback
5199
+ });
5200
+ entry.wrappedNetworkBlockedCallback = null;
5201
+ }
5202
+ function createInstrumentationEntry(store) {
5203
+ const entry = {
5204
+ store,
5205
+ listeners: new Set(),
5206
+ originalCallbacks: {
5207
+ ...store.getState().callbacks
5208
+ },
5209
+ originalNetworkBlockedCallback: store.getState().networkBlocker?.onRequestBlocked,
5210
+ wrappedNetworkBlockedCallback: null,
5211
+ stopWatchingStore: null
5212
+ };
5213
+ store.getState().setCallback('onBannerFetched', (payload)=>{
5214
+ const jurisdiction = payload.jurisdiction;
5215
+ emitEvent(entry, {
5216
+ type: 'info',
5217
+ message: `Banner fetched: ${String(jurisdiction)}`,
5218
+ data: payload
5219
+ });
5220
+ if ('function' == typeof entry.originalCallbacks.onBannerFetched) entry.originalCallbacks.onBannerFetched(payload);
5221
+ });
5222
+ store.getState().setCallback('onConsentSet', (payload)=>{
5223
+ emitEvent(entry, {
5224
+ type: 'consent_set',
5225
+ message: 'Consent preferences updated',
5226
+ data: payload
5227
+ });
5228
+ if ('function' == typeof entry.originalCallbacks.onConsentSet) entry.originalCallbacks.onConsentSet(payload);
5229
+ });
5230
+ store.getState().setCallback('onError', (payload)=>{
5231
+ const errorMessage = payload.error;
5232
+ emitEvent(entry, {
5233
+ type: 'error',
5234
+ message: `Error: ${String(errorMessage)}`,
5235
+ data: payload
5236
+ });
5237
+ if ('function' == typeof entry.originalCallbacks.onError) entry.originalCallbacks.onError(payload);
5238
+ });
5239
+ store.getState().setCallback('onBeforeConsentRevocationReload', (payload)=>{
5240
+ emitEvent(entry, {
5241
+ type: 'info',
5242
+ message: 'Consent revocation - page will reload',
5243
+ data: payload
5244
+ });
5245
+ if ('function' == typeof entry.originalCallbacks.onBeforeConsentRevocationReload) entry.originalCallbacks.onBeforeConsentRevocationReload(payload);
5246
+ });
5247
+ ensureNetworkBlockerWrapped(entry);
5248
+ entry.stopWatchingStore = store.subscribe(()=>{
5249
+ ensureNetworkBlockerWrapped(entry);
5250
+ });
5251
+ return entry;
5252
+ }
5253
+ function store_instrumentation_registerStoreInstrumentation(options) {
5254
+ const { namespace, store, onEvent } = options;
5255
+ const registry = getRegistry();
5256
+ let entry = registry.get(namespace);
5257
+ if (!entry || entry.store !== store) {
5258
+ if (entry) restoreInstrumentation(entry);
5259
+ entry = createInstrumentationEntry(store);
5260
+ registry.set(namespace, entry);
5261
+ }
5262
+ entry.listeners.add(onEvent);
5263
+ return ()=>{
5264
+ const current = registry.get(namespace);
5265
+ if (!current) return;
5266
+ current.listeners.delete(onEvent);
5267
+ if (0 === current.listeners.size) {
5268
+ restoreInstrumentation(current);
5269
+ registry.delete(namespace);
4159
5270
  }
4160
5271
  };
4161
5272
  }
@@ -4179,39 +5290,36 @@ var __webpack_exports__ = {};
4179
5290
  function persistedOverridesEqual(a, b) {
4180
5291
  return a.country === b.country && a.region === b.region && a.language === b.language && a.gpc === b.gpc;
4181
5292
  }
4182
- function getBlockedRequestMessage(payload) {
4183
- const data = payload;
4184
- const method = 'string' == typeof data?.method ? data.method.toUpperCase() : 'REQUEST';
4185
- const url = 'string' == typeof data?.url ? data.url : 'unknown-url';
4186
- return `Network blocked: ${method} ${url}`;
5293
+ function createStateCopy(state) {
5294
+ return {
5295
+ consents: state.consents,
5296
+ selectedConsents: state.selectedConsents,
5297
+ consentInfo: state.consentInfo,
5298
+ locationInfo: state.locationInfo,
5299
+ model: state.model,
5300
+ overrides: state.overrides,
5301
+ scripts: state.scripts?.map((script)=>({
5302
+ id: script.id
5303
+ })),
5304
+ loadedScripts: state.loadedScripts
5305
+ };
4187
5306
  }
4188
5307
  function createDevToolsPanel(options) {
4189
5308
  const { namespace = 'c15tStore' } = options;
4190
- let originalEmbeddedNetworkBlockedCallback;
4191
- let hasWrappedEmbeddedNetworkBlocker = false;
5309
+ let detachInstrumentation = null;
4192
5310
  const stateManager = state_manager_createStateManager({
4193
5311
  isOpen: true
4194
5312
  });
4195
5313
  const storeConnector = store_connector_createStoreConnector({
4196
5314
  namespace,
4197
5315
  onConnect: (state, store)=>{
5316
+ detachInstrumentation?.();
5317
+ detachInstrumentation = store_instrumentation_registerStoreInstrumentation({
5318
+ namespace,
5319
+ store,
5320
+ onEvent: (event)=>stateManager.addEvent(event)
5321
+ });
4198
5322
  stateManager.setConnected(true);
4199
- const currentNetworkBlocker = state.networkBlocker;
4200
- if (currentNetworkBlocker && !hasWrappedEmbeddedNetworkBlocker) {
4201
- originalEmbeddedNetworkBlockedCallback = currentNetworkBlocker.onRequestBlocked;
4202
- hasWrappedEmbeddedNetworkBlocker = true;
4203
- store.getState().setNetworkBlocker({
4204
- ...currentNetworkBlocker,
4205
- onRequestBlocked: (payload)=>{
4206
- stateManager.addEvent({
4207
- type: 'network',
4208
- message: getBlockedRequestMessage(payload),
4209
- data: payload
4210
- });
4211
- if ('function' == typeof originalEmbeddedNetworkBlockedCallback) originalEmbeddedNetworkBlockedCallback(payload);
4212
- }
4213
- });
4214
- }
4215
5323
  const persistedOverrides = override_storage_loadPersistedOverrides();
4216
5324
  if (persistedOverrides) {
4217
5325
  const currentOverrides = normalizeOverridesForPersistence(state.overrides);
@@ -4223,7 +5331,36 @@ var __webpack_exports__ = {};
4223
5331
  });
4224
5332
  }
4225
5333
  },
4226
- onDisconnect: ()=>stateManager.setConnected(false)
5334
+ onDisconnect: ()=>{
5335
+ stateManager.setConnected(false);
5336
+ detachInstrumentation?.();
5337
+ detachInstrumentation = null;
5338
+ }
5339
+ });
5340
+ const panelRenderer = panel_renderer_createPanelRenderer({
5341
+ storeConnector,
5342
+ stateManager,
5343
+ enableEventLogging: false,
5344
+ onPersistOverrides: override_storage_persistOverrides,
5345
+ onClearPersistedOverrides: override_storage_clearPersistedOverrides,
5346
+ onCopyState: async (state)=>{
5347
+ try {
5348
+ await navigator.clipboard.writeText(JSON.stringify(createStateCopy(state), null, 2));
5349
+ return true;
5350
+ } catch {
5351
+ return false;
5352
+ }
5353
+ },
5354
+ onExportDebugBundle: ()=>{
5355
+ const bundle = debug_bundle_createDebugBundle({
5356
+ namespace,
5357
+ devToolsState: stateManager.getState(),
5358
+ connection: storeConnector.getDiagnostics(),
5359
+ recentEvents: stateManager.getState().eventLog.slice(0, 100),
5360
+ storeState: debug_bundle_sanitizeStoreState(storeConnector.getState())
5361
+ });
5362
+ debug_bundle_downloadDebugBundle(bundle);
5363
+ }
4227
5364
  });
4228
5365
  const container = renderer_div({
4229
5366
  style: {
@@ -4244,140 +5381,42 @@ var __webpack_exports__ = {};
4244
5381
  }
4245
5382
  });
4246
5383
  function renderActivePanel() {
4247
- const state = stateManager.getState();
4248
- const getStoreState = ()=>storeConnector.getState();
4249
- switch(state.activeTab){
4250
- case 'consents':
4251
- consents_renderConsentsPanel(contentArea, {
4252
- getState: getStoreState,
4253
- onConsentChange: (name, value)=>{
4254
- storeConnector.getStore()?.getState().setSelectedConsent(name, value);
4255
- },
4256
- onSave: ()=>{
4257
- storeConnector.getStore()?.getState().saveConsents('custom');
4258
- },
4259
- onAcceptAll: ()=>{
4260
- storeConnector.getStore()?.getState().saveConsents('all');
4261
- },
4262
- onRejectAll: ()=>{
4263
- storeConnector.getStore()?.getState().saveConsents('necessary');
4264
- },
4265
- onReset: async ()=>{
4266
- const store = storeConnector.getStore();
4267
- if (store) await reset_consents_resetAllConsents(store);
4268
- }
4269
- });
4270
- break;
4271
- case 'location':
4272
- location_renderLocationPanel(contentArea, {
4273
- getState: getStoreState,
4274
- onApplyOverrides: async (overrides)=>{
4275
- const store = storeConnector.getStore();
4276
- if (store) {
4277
- await store.getState().setOverrides({
4278
- country: overrides.country,
4279
- region: overrides.region,
4280
- language: overrides.language,
4281
- gpc: overrides.gpc
4282
- });
4283
- override_storage_persistOverrides({
4284
- country: overrides.country,
4285
- region: overrides.region,
4286
- language: overrides.language,
4287
- gpc: overrides.gpc
4288
- });
4289
- }
4290
- },
4291
- onClearOverrides: async ()=>{
4292
- await storeConnector.getStore()?.getState().setOverrides({
4293
- country: void 0,
4294
- region: void 0,
4295
- language: void 0,
4296
- gpc: void 0
4297
- });
4298
- override_storage_clearPersistedOverrides();
4299
- }
4300
- });
4301
- break;
4302
- case "scripts":
4303
- scripts_renderScriptsPanel(contentArea, {
4304
- getState: getStoreState,
4305
- getEvents: ()=>stateManager.getState().eventLog
4306
- });
4307
- break;
4308
- case 'iab':
4309
- iab_renderIabPanel(contentArea, {
4310
- getState: getStoreState,
4311
- onSetPurposeConsent: (purposeId, value)=>{
4312
- storeConnector.getStore()?.getState().iab?.setPurposeConsent(purposeId, value);
4313
- },
4314
- onSetVendorConsent: (vendorId, value)=>{
4315
- storeConnector.getStore()?.getState().iab?.setVendorConsent(vendorId, value);
4316
- },
4317
- onSetSpecialFeatureOptIn: (featureId, value)=>{
4318
- storeConnector.getStore()?.getState().iab?.setSpecialFeatureOptIn(featureId, value);
4319
- },
4320
- onAcceptAll: ()=>{
4321
- storeConnector.getStore()?.getState().iab?.acceptAll();
4322
- },
4323
- onRejectAll: ()=>{
4324
- storeConnector.getStore()?.getState().iab?.rejectAll();
4325
- },
4326
- onSave: ()=>{
4327
- storeConnector.getStore()?.getState().iab?.save();
4328
- },
4329
- onReset: async ()=>{
4330
- const store = storeConnector.getStore();
4331
- if (store) await reset_consents_resetAllConsents(store);
4332
- }
4333
- });
4334
- break;
4335
- case 'events':
4336
- events_renderEventsPanel(contentArea, {
4337
- getEvents: ()=>stateManager.getState().eventLog,
4338
- onClear: ()=>{
4339
- stateManager.clearEventLog();
4340
- }
4341
- });
4342
- break;
4343
- case 'actions':
4344
- actions_renderActionsPanel(contentArea, {
4345
- getState: getStoreState,
4346
- onResetConsents: async ()=>{
4347
- const store = storeConnector.getStore();
4348
- if (store) await reset_consents_resetAllConsents(store);
4349
- },
4350
- onRefetchBanner: async ()=>{
4351
- await storeConnector.getStore()?.getState().initConsentManager();
4352
- },
4353
- onShowBanner: ()=>{
4354
- storeConnector.getStore()?.getState().setActiveUI('banner', {
4355
- force: true
4356
- });
4357
- },
4358
- onOpenPreferences: ()=>{
4359
- storeConnector.getStore()?.getState().setActiveUI('dialog');
4360
- },
4361
- onCopyState: ()=>{
4362
- const state = storeConnector.getState();
4363
- if (state) navigator.clipboard.writeText(JSON.stringify(state, null, 2));
4364
- }
4365
- });
4366
- break;
5384
+ const activeTab = syncTabs();
5385
+ panelRenderer.renderPanel(contentArea, activeTab);
5386
+ }
5387
+ let tabsInstance = null;
5388
+ let iabDisabled = true;
5389
+ function getDisabledTabs() {
5390
+ const disabledTabs = [];
5391
+ const storeState = storeConnector.getState();
5392
+ if (!storeState || 'iab' !== storeState.model) disabledTabs.push('iab');
5393
+ return disabledTabs;
5394
+ }
5395
+ function syncTabs() {
5396
+ const disabledTabs = getDisabledTabs();
5397
+ const nextIabDisabled = disabledTabs.includes('iab');
5398
+ let activeTab = stateManager.getState().activeTab;
5399
+ if (disabledTabs.includes(activeTab)) {
5400
+ activeTab = 'consents';
5401
+ stateManager.setActiveTab(activeTab);
4367
5402
  }
5403
+ if (tabsInstance && iabDisabled === nextIabDisabled) tabsInstance.setActiveTab(activeTab);
5404
+ else {
5405
+ tabsInstance?.destroy();
5406
+ tabsInstance = tabs_createTabs({
5407
+ activeTab,
5408
+ onTabChange: (tab)=>{
5409
+ stateManager.setActiveTab(tab);
5410
+ renderActivePanel();
5411
+ },
5412
+ disabledTabs
5413
+ });
5414
+ iabDisabled = nextIabDisabled;
5415
+ if (!tabsInstance.element.parentElement) container.appendChild(tabsInstance.element);
5416
+ }
5417
+ return activeTab;
4368
5418
  }
4369
- const storeState = storeConnector.getState();
4370
- const disabledTabs = [];
4371
- if (!storeState || 'iab' !== storeState.model) disabledTabs.push('iab');
4372
- const tabsInstance = tabs_createTabs({
4373
- activeTab: stateManager.getState().activeTab,
4374
- onTabChange: (tab)=>{
4375
- stateManager.setActiveTab(tab);
4376
- renderActivePanel();
4377
- },
4378
- disabledTabs
4379
- });
4380
- container.appendChild(tabsInstance.element);
5419
+ syncTabs();
4381
5420
  container.appendChild(contentArea);
4382
5421
  renderActivePanel();
4383
5422
  const unsubscribe = storeConnector.subscribe(()=>{
@@ -4386,16 +5425,10 @@ var __webpack_exports__ = {};
4386
5425
  return {
4387
5426
  element: container,
4388
5427
  destroy: ()=>{
4389
- const store = storeConnector.getStore();
4390
- if (store && hasWrappedEmbeddedNetworkBlocker) {
4391
- const currentNetworkBlocker = store.getState().networkBlocker;
4392
- if (currentNetworkBlocker) store.getState().setNetworkBlocker({
4393
- ...currentNetworkBlocker,
4394
- onRequestBlocked: originalEmbeddedNetworkBlockedCallback
4395
- });
4396
- }
5428
+ detachInstrumentation?.();
5429
+ detachInstrumentation = null;
4397
5430
  unsubscribe();
4398
- tabsInstance.destroy();
5431
+ tabsInstance?.destroy();
4399
5432
  storeConnector.destroy();
4400
5433
  stateManager.destroy();
4401
5434
  }