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

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 (95) hide show
  1. package/README.md +12 -1
  2. package/dist/index.cjs +2039 -953
  3. package/dist/index.js +2042 -956
  4. package/dist/react.cjs +1975 -803
  5. package/dist/react.js +1978 -806
  6. package/dist/tanstack.cjs +1862 -524
  7. package/dist/tanstack.js +1865 -527
  8. package/{dist → dist-types}/components/dropdown-menu.d.ts +0 -1
  9. package/{dist → dist-types}/components/index.d.ts +0 -1
  10. package/{dist → dist-types}/components/panel.d.ts +0 -1
  11. package/{dist → dist-types}/components/tabs.d.ts +0 -1
  12. package/{dist → dist-types}/components/ui.d.ts +8 -1
  13. package/dist-types/core/debug-bundle.d.ts +13 -0
  14. package/{dist → dist-types}/core/devtools.d.ts +0 -1
  15. package/{dist → dist-types}/core/draggable.d.ts +0 -1
  16. package/{dist → dist-types}/core/index.d.ts +0 -1
  17. package/{dist → dist-types}/core/override-storage.d.ts +1 -2
  18. package/{dist → dist-types}/core/panel-renderer.d.ts +6 -2
  19. package/{dist → dist-types}/core/renderer.d.ts +0 -1
  20. package/{dist → dist-types}/core/reset-consents.d.ts +1 -2
  21. package/{dist → dist-types}/core/state-manager.d.ts +1 -2
  22. package/{dist → dist-types}/core/store-connector.d.ts +17 -2
  23. package/dist-types/core/store-instrumentation.d.ts +12 -0
  24. package/{dist → dist-types}/index.d.ts +0 -1
  25. package/{dist → dist-types}/panels/actions.d.ts +2 -2
  26. package/{dist → dist-types}/panels/consents.d.ts +1 -2
  27. package/{dist → dist-types}/panels/dom-scanner.d.ts +1 -2
  28. package/{dist → dist-types}/panels/events.d.ts +0 -1
  29. package/{dist → dist-types}/panels/iab.d.ts +1 -2
  30. package/{dist → dist-types}/panels/index.d.ts +1 -1
  31. package/{dist → dist-types}/panels/location.d.ts +1 -2
  32. package/dist-types/panels/policy.d.ts +12 -0
  33. package/{dist → dist-types}/panels/scripts.d.ts +1 -2
  34. package/{dist → dist-types}/react.d.ts +0 -1
  35. package/{dist → dist-types}/styles/index.d.ts +0 -1
  36. package/{dist → dist-types}/tanstack.d.ts +0 -1
  37. package/{dist → dist-types}/utils/index.d.ts +1 -1
  38. package/dist-types/utils/init-source.d.ts +2 -0
  39. package/{dist → dist-types}/utils/preference-trigger.d.ts +0 -1
  40. package/dist-types/version.d.ts +1 -0
  41. package/package.json +35 -32
  42. package/CHANGELOG.md +0 -154
  43. package/dist/__tests__/components/ui.test.d.ts +0 -2
  44. package/dist/__tests__/components/ui.test.d.ts.map +0 -1
  45. package/dist/__tests__/core/override-storage.test.d.ts +0 -2
  46. package/dist/__tests__/core/override-storage.test.d.ts.map +0 -1
  47. package/dist/__tests__/core/renderer.test.d.ts +0 -2
  48. package/dist/__tests__/core/renderer.test.d.ts.map +0 -1
  49. package/dist/__tests__/core/reset-consents.test.d.ts +0 -2
  50. package/dist/__tests__/core/reset-consents.test.d.ts.map +0 -1
  51. package/dist/__tests__/core/state-manager.test.d.ts +0 -2
  52. package/dist/__tests__/core/state-manager.test.d.ts.map +0 -1
  53. package/dist/__tests__/core/store-connector.test.d.ts +0 -2
  54. package/dist/__tests__/core/store-connector.test.d.ts.map +0 -1
  55. package/dist/__tests__/panels/dom-scanner.test.d.ts +0 -2
  56. package/dist/__tests__/panels/dom-scanner.test.d.ts.map +0 -1
  57. package/dist/__tests__/panels/events.test.d.ts +0 -2
  58. package/dist/__tests__/panels/events.test.d.ts.map +0 -1
  59. package/dist/__tests__/panels/iab.test.d.ts +0 -2
  60. package/dist/__tests__/panels/iab.test.d.ts.map +0 -1
  61. package/dist/__tests__/panels/scripts.test.d.ts +0 -2
  62. package/dist/__tests__/panels/scripts.test.d.ts.map +0 -1
  63. package/dist/__tests__/utils/preference-trigger.test.d.ts +0 -2
  64. package/dist/__tests__/utils/preference-trigger.test.d.ts.map +0 -1
  65. package/dist/components/dropdown-menu.d.ts.map +0 -1
  66. package/dist/components/index.d.ts.map +0 -1
  67. package/dist/components/panel.d.ts.map +0 -1
  68. package/dist/components/tabs.d.ts.map +0 -1
  69. package/dist/components/ui.d.ts.map +0 -1
  70. package/dist/core/devtools.d.ts.map +0 -1
  71. package/dist/core/draggable.d.ts.map +0 -1
  72. package/dist/core/index.d.ts.map +0 -1
  73. package/dist/core/override-storage.d.ts.map +0 -1
  74. package/dist/core/panel-renderer.d.ts.map +0 -1
  75. package/dist/core/renderer.d.ts.map +0 -1
  76. package/dist/core/reset-consents.d.ts.map +0 -1
  77. package/dist/core/state-manager.d.ts.map +0 -1
  78. package/dist/core/store-connector.d.ts.map +0 -1
  79. package/dist/index.d.ts.map +0 -1
  80. package/dist/panels/actions.d.ts.map +0 -1
  81. package/dist/panels/consents.d.ts.map +0 -1
  82. package/dist/panels/dom-scanner.d.ts.map +0 -1
  83. package/dist/panels/events.d.ts.map +0 -1
  84. package/dist/panels/iab.d.ts.map +0 -1
  85. package/dist/panels/index.d.ts.map +0 -1
  86. package/dist/panels/location.d.ts.map +0 -1
  87. package/dist/panels/scripts.d.ts.map +0 -1
  88. package/dist/react.d.ts.map +0 -1
  89. package/dist/styles/index.d.ts.map +0 -1
  90. package/dist/tanstack.d.ts.map +0 -1
  91. package/dist/utils/index.d.ts.map +0 -1
  92. package/dist/utils/preference-trigger.d.ts.map +0 -1
  93. package/dist/version.d.ts +0 -2
  94. package/dist/version.d.ts.map +0 -1
  95. package/tsconfig.json +0 -12
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);
@@ -1759,6 +2023,11 @@ var __webpack_exports__ = {};
1759
2023
  <circle cx="12" cy="12" r="10"></circle>
1760
2024
  <line x1="2" y1="12" x2="22" y2="12"></line>
1761
2025
  <path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path>
2026
+ </svg>`;
2027
+ const POLICY_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">
2028
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
2029
+ <path d="M9 12h6"></path>
2030
+ <path d="M12 9v6"></path>
1762
2031
  </svg>`;
1763
2032
  const SCRIPTS_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">
1764
2033
  <polyline points="16 18 22 12 16 6"></polyline>
@@ -1775,6 +2044,11 @@ var __webpack_exports__ = {};
1775
2044
  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
2045
  <path d="M12 20h9"></path>
1777
2046
  <path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"></path>
2047
+ </svg>`;
2048
+ const MORE_ICON = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
2049
+ <circle cx="12" cy="5" r="1.75"></circle>
2050
+ <circle cx="12" cy="12" r="1.75"></circle>
2051
+ <circle cx="12" cy="19" r="1.75"></circle>
1778
2052
  </svg>`;
1779
2053
  const TABS = [
1780
2054
  {
@@ -1782,6 +2056,11 @@ var __webpack_exports__ = {};
1782
2056
  label: 'Location',
1783
2057
  icon: LOCATION_ICON
1784
2058
  },
2059
+ {
2060
+ id: 'policy',
2061
+ label: 'Policy',
2062
+ icon: POLICY_ICON
2063
+ },
1785
2064
  {
1786
2065
  id: 'consents',
1787
2066
  label: 'Consents',
@@ -1811,12 +2090,56 @@ var __webpack_exports__ = {};
1811
2090
  function tabs_createTabs(options) {
1812
2091
  const { onTabChange, disabledTabs = [] } = options;
1813
2092
  let activeTab = options.activeTab;
2093
+ let isOverflowMenuOpen = false;
2094
+ let visibleTabIds = [];
2095
+ let hiddenTabIds = [];
1814
2096
  const tabButtons = new Map();
2097
+ const overflowButtons = new Map();
1815
2098
  const tabList = renderer_div({
1816
- className: styles_tabs_module.tabList,
2099
+ className: styles_tabs_module.tabList
2100
+ });
2101
+ const tabStrip = renderer_div({
2102
+ className: styles_tabs_module.tabStrip,
1817
2103
  role: 'tablist',
1818
2104
  ariaLabel: 'DevTools tabs'
1819
2105
  });
2106
+ tabList.appendChild(tabStrip);
2107
+ const overflowMenu = renderer_div({
2108
+ className: styles_tabs_module.overflowMenu,
2109
+ role: 'menu',
2110
+ ariaLabel: 'All tabs'
2111
+ });
2112
+ overflowMenu.dataset.state = 'closed';
2113
+ const overflowButton = renderer_button({
2114
+ className: styles_tabs_module.overflowButton,
2115
+ ariaLabel: 'More tabs',
2116
+ ariaExpanded: 'false',
2117
+ onClick: ()=>toggleOverflowMenu(),
2118
+ onKeyDown: (e)=>{
2119
+ if ('ArrowDown' === e.key || 'Enter' === e.key || ' ' === e.key) {
2120
+ e.preventDefault();
2121
+ openOverflowMenu();
2122
+ focusFirstEnabledOverflowItem();
2123
+ }
2124
+ }
2125
+ });
2126
+ overflowButton.setAttribute('aria-haspopup', 'menu');
2127
+ const overflowIcon = renderer_div({
2128
+ className: styles_tabs_module.overflowButtonIcon
2129
+ });
2130
+ overflowIcon.appendChild(renderer_createSvgElement(MORE_ICON, {
2131
+ width: 14,
2132
+ height: 14
2133
+ }));
2134
+ overflowButton.appendChild(overflowIcon);
2135
+ const overflowContainer = renderer_div({
2136
+ className: styles_tabs_module.overflowContainer,
2137
+ children: [
2138
+ overflowButton,
2139
+ overflowMenu
2140
+ ]
2141
+ });
2142
+ tabList.appendChild(overflowContainer);
1820
2143
  for (const tab of TABS){
1821
2144
  const isActive = tab.id === activeTab;
1822
2145
  const isDisabled = disabledTabs.includes(tab.id);
@@ -1830,6 +2153,7 @@ var __webpack_exports__ = {};
1830
2153
  disabled: isDisabled,
1831
2154
  onClick: ()=>{
1832
2155
  if (!isDisabled) {
2156
+ closeOverflowMenu();
1833
2157
  setActiveTab(tab.id);
1834
2158
  onTabChange(tab.id);
1835
2159
  }
@@ -1846,25 +2170,203 @@ var __webpack_exports__ = {};
1846
2170
  tabButton.appendChild(iconWrapper);
1847
2171
  tabButton.appendChild(document.createTextNode(tab.label));
1848
2172
  tabButtons.set(tab.id, tabButton);
1849
- tabList.appendChild(tabButton);
2173
+ tabStrip.appendChild(tabButton);
2174
+ const overflowItem = renderer_button({
2175
+ className: `${styles_tabs_module.overflowItem} ${isActive ? styles_tabs_module.overflowItemActive : ''} ${isDisabled ? styles_tabs_module.overflowItemDisabled : ''}`,
2176
+ role: 'menuitemradio',
2177
+ ariaChecked: isActive ? 'true' : 'false',
2178
+ disabled: isDisabled,
2179
+ onClick: ()=>{
2180
+ if (!isDisabled) {
2181
+ setActiveTab(tab.id);
2182
+ onTabChange(tab.id);
2183
+ closeOverflowMenu();
2184
+ tabButtons.get(tab.id)?.focus();
2185
+ }
2186
+ },
2187
+ onKeyDown: (e)=>handleOverflowKeyDown(e, tab.id)
2188
+ });
2189
+ const overflowItemIcon = renderer_div({
2190
+ className: styles_tabs_module.overflowItemIcon
2191
+ });
2192
+ overflowItemIcon.appendChild(renderer_createSvgElement(tab.icon, {
2193
+ width: 14,
2194
+ height: 14
2195
+ }));
2196
+ overflowItem.appendChild(overflowItemIcon);
2197
+ overflowItem.appendChild(document.createTextNode(tab.label));
2198
+ overflowButtons.set(tab.id, overflowItem);
2199
+ overflowMenu.appendChild(overflowItem);
1850
2200
  }
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;
2201
+ function applyActiveState(tab) {
2202
+ for (const [tabId, tabButton] of tabButtons){
2203
+ const isActive = tabId === tab;
2204
+ if (styles_tabs_module.tabActive) tabButton.classList.toggle(styles_tabs_module.tabActive, isActive);
2205
+ tabButton.setAttribute('aria-selected', isActive ? 'true' : 'false');
2206
+ tabButton.tabIndex = isActive ? 0 : -1;
2207
+ }
2208
+ for (const [tabId, overflowItem] of overflowButtons){
2209
+ const isActive = tabId === tab;
2210
+ if (styles_tabs_module.overflowItemActive) overflowItem.classList.toggle(styles_tabs_module.overflowItemActive, isActive);
2211
+ overflowItem.setAttribute('aria-checked', isActive ? 'true' : 'false');
2212
+ }
2213
+ }
2214
+ function updateVisibleTabs() {
2215
+ const allTabIds = TABS.map((t)=>t.id);
2216
+ const iabEnabled = !disabledTabs.includes('iab');
2217
+ const preferredSecondTab = iabEnabled ? 'iab' : 'consents';
2218
+ const overflowSecondTab = iabEnabled ? 'consents' : 'iab';
2219
+ const showOverflowSecondTabInStrip = activeTab === overflowSecondTab;
2220
+ const stripSecondTab = showOverflowSecondTabInStrip ? overflowSecondTab : preferredSecondTab;
2221
+ const forcedOverflowTab = showOverflowSecondTabInStrip ? preferredSecondTab : overflowSecondTab;
2222
+ const layoutTabIds = [
2223
+ 'location',
2224
+ 'policy',
2225
+ stripSecondTab,
2226
+ "scripts",
2227
+ 'actions',
2228
+ 'events',
2229
+ forcedOverflowTab
2230
+ ];
2231
+ const forcedOverflowTabIds = new Set();
2232
+ forcedOverflowTabIds.add(forcedOverflowTab);
2233
+ for (const [index, tabId] of layoutTabIds.entries()){
2234
+ const tabButton = tabButtons.get(tabId);
2235
+ if (tabButton) tabButton.style.order = String(index);
2236
+ const overflowItem = overflowButtons.get(tabId);
2237
+ if (overflowItem) overflowItem.style.order = String(index);
2238
+ }
2239
+ for (const tabId of allTabIds){
2240
+ const tabButton = tabButtons.get(tabId);
2241
+ if (tabButton && styles_tabs_module.tabHidden) tabButton.classList.remove(styles_tabs_module.tabHidden);
2242
+ }
2243
+ if (styles_tabs_module.overflowContainerHidden) overflowContainer.classList.remove(styles_tabs_module.overflowContainerHidden);
2244
+ const stripGap = Number.parseFloat(getComputedStyle(tabStrip).gap || '0');
2245
+ const calculateVisibleTabs = (availableWidth)=>{
2246
+ if (availableWidth <= 0) return [];
2247
+ const nextVisible = [];
2248
+ let usedWidth = 0;
2249
+ for (const tabId of layoutTabIds){
2250
+ if (forcedOverflowTabIds.has(tabId)) continue;
2251
+ const tabButton = tabButtons.get(tabId);
2252
+ if (!tabButton) continue;
2253
+ const width = tabButton.getBoundingClientRect().width;
2254
+ const nextUsed = 0 === nextVisible.length ? width : usedWidth + stripGap + width;
2255
+ if (nextUsed <= availableWidth) {
2256
+ nextVisible.push(tabId);
2257
+ usedWidth = nextUsed;
2258
+ } else break;
2259
+ }
2260
+ return nextVisible;
2261
+ };
2262
+ const measureStripWidth = ()=>tabStrip.getBoundingClientRect().width;
2263
+ const showOverflowContainer = ()=>{
2264
+ if (styles_tabs_module.overflowContainerHidden) overflowContainer.classList.remove(styles_tabs_module.overflowContainerHidden);
2265
+ };
2266
+ const hideOverflowContainer = ()=>{
2267
+ if (styles_tabs_module.overflowContainerHidden) overflowContainer.classList.add(styles_tabs_module.overflowContainerHidden);
2268
+ };
2269
+ const measureVisibleWidth = (tabIds)=>{
2270
+ let width = 0;
2271
+ for (const [index, tabId] of tabIds.entries()){
2272
+ const tabButton = tabButtons.get(tabId);
2273
+ if (tabButton) {
2274
+ width += tabButton.getBoundingClientRect().width;
2275
+ if (index > 0) width += stripGap;
2276
+ }
2277
+ }
2278
+ return width;
2279
+ };
2280
+ if (0 === forcedOverflowTabIds.size) {
2281
+ hideOverflowContainer();
2282
+ const visibleWithoutOverflow = calculateVisibleTabs(measureStripWidth());
2283
+ if (visibleWithoutOverflow.length === layoutTabIds.length) visibleTabIds = visibleWithoutOverflow;
2284
+ else {
2285
+ showOverflowContainer();
2286
+ visibleTabIds = calculateVisibleTabs(measureStripWidth());
2287
+ }
2288
+ } else {
2289
+ showOverflowContainer();
2290
+ const withOverflow = calculateVisibleTabs(measureStripWidth());
2291
+ visibleTabIds = withOverflow.length > 0 ? withOverflow : [
2292
+ activeTab
2293
+ ];
2294
+ }
2295
+ if (!visibleTabIds.includes(activeTab) && !disabledTabs.includes(activeTab)) if (visibleTabIds.length > 0) visibleTabIds[visibleTabIds.length - 1] = activeTab;
2296
+ else visibleTabIds = [
2297
+ activeTab
2298
+ ];
2299
+ visibleTabIds = [
2300
+ ...new Set(visibleTabIds)
2301
+ ];
2302
+ const maxStripWidth = measureStripWidth();
2303
+ while(visibleTabIds.length > 1 && measureVisibleWidth(visibleTabIds) > maxStripWidth + 0.5){
2304
+ let removeIndex = visibleTabIds.length - 1;
2305
+ if (visibleTabIds[removeIndex] === activeTab) removeIndex = Math.max(0, removeIndex - 1);
2306
+ visibleTabIds.splice(removeIndex, 1);
2307
+ }
2308
+ hiddenTabIds = layoutTabIds.filter((tabId)=>!visibleTabIds.includes(tabId) || forcedOverflowTabIds.has(tabId) && tabId !== activeTab);
2309
+ for (const tabId of allTabIds){
2310
+ const tabButton = tabButtons.get(tabId);
2311
+ if (tabButton) {
2312
+ if (styles_tabs_module.tabHidden) tabButton.classList.toggle(styles_tabs_module.tabHidden, hiddenTabIds.includes(tabId));
2313
+ }
2314
+ }
2315
+ for (const tabId of allTabIds){
2316
+ const overflowItem = overflowButtons.get(tabId);
2317
+ if (overflowItem) {
2318
+ if (styles_tabs_module.overflowItemHidden) overflowItem.classList.toggle(styles_tabs_module.overflowItemHidden, !hiddenTabIds.includes(tabId));
2319
+ }
2320
+ }
2321
+ if (styles_tabs_module.overflowContainerHidden) overflowContainer.classList.toggle(styles_tabs_module.overflowContainerHidden, 0 === hiddenTabIds.length);
2322
+ if (0 === hiddenTabIds.length) closeOverflowMenu();
2323
+ }
2324
+ function focusFirstEnabledOverflowItem() {
2325
+ const firstEnabled = hiddenTabIds.find((tabId)=>!disabledTabs.includes(tabId));
2326
+ if (firstEnabled) overflowButtons.get(firstEnabled)?.focus();
2327
+ }
2328
+ function openOverflowMenu() {
2329
+ if (isOverflowMenuOpen || 0 === hiddenTabIds.length) return;
2330
+ isOverflowMenuOpen = true;
2331
+ overflowMenu.dataset.state = 'open';
2332
+ overflowButton.setAttribute('aria-expanded', 'true');
2333
+ document.addEventListener('click', handleOutsideClick);
2334
+ document.addEventListener('keydown', handleEscapeKey);
2335
+ }
2336
+ function closeOverflowMenu() {
2337
+ if (!isOverflowMenuOpen) return;
2338
+ isOverflowMenuOpen = false;
2339
+ overflowMenu.dataset.state = 'closed';
2340
+ overflowButton.setAttribute('aria-expanded', 'false');
2341
+ document.removeEventListener('click', handleOutsideClick);
2342
+ document.removeEventListener('keydown', handleEscapeKey);
2343
+ }
2344
+ function toggleOverflowMenu() {
2345
+ if (isOverflowMenuOpen) closeOverflowMenu();
2346
+ else openOverflowMenu();
2347
+ }
2348
+ function handleOutsideClick(e) {
2349
+ if (!overflowContainer.contains(e.target)) closeOverflowMenu();
2350
+ }
2351
+ function handleEscapeKey(e) {
2352
+ if ('Escape' === e.key) closeOverflowMenu();
2353
+ }
2354
+ function handleKeyDown(e, currentTab) {
2355
+ const enabledTabIds = visibleTabIds.filter((tabId)=>!disabledTabs.includes(tabId));
2356
+ const currentIndex = enabledTabIds.indexOf(currentTab);
2357
+ let newIndex = currentIndex;
2358
+ switch(e.key){
2359
+ case 'ArrowLeft':
2360
+ newIndex = currentIndex > 0 ? currentIndex - 1 : enabledTabIds.length - 1;
2361
+ break;
2362
+ case 'ArrowRight':
2363
+ newIndex = currentIndex < enabledTabIds.length - 1 ? currentIndex + 1 : 0;
2364
+ break;
2365
+ case 'Home':
2366
+ newIndex = 0;
2367
+ break;
2368
+ case 'End':
2369
+ newIndex = enabledTabIds.length - 1;
1868
2370
  break;
1869
2371
  default:
1870
2372
  return;
@@ -1877,23 +2379,152 @@ var __webpack_exports__ = {};
1877
2379
  tabButtons.get(newTab)?.focus();
1878
2380
  }
1879
2381
  }
2382
+ function handleOverflowKeyDown(e, currentTab) {
2383
+ const enabledTabIds = hiddenTabIds.filter((tabId)=>!disabledTabs.includes(tabId));
2384
+ const currentIndex = enabledTabIds.indexOf(currentTab);
2385
+ if ('Escape' === e.key) {
2386
+ e.preventDefault();
2387
+ closeOverflowMenu();
2388
+ overflowButton.focus();
2389
+ return;
2390
+ }
2391
+ let newIndex = currentIndex;
2392
+ switch(e.key){
2393
+ case 'ArrowDown':
2394
+ newIndex = (currentIndex + 1) % enabledTabIds.length;
2395
+ break;
2396
+ case 'ArrowUp':
2397
+ newIndex = currentIndex > 0 ? currentIndex - 1 : enabledTabIds.length - 1;
2398
+ break;
2399
+ default:
2400
+ return;
2401
+ }
2402
+ e.preventDefault();
2403
+ const newTab = enabledTabIds[newIndex];
2404
+ if (newTab) overflowButtons.get(newTab)?.focus();
2405
+ }
1880
2406
  function setActiveTab(tab) {
1881
2407
  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
- }
2408
+ applyActiveState(tab);
2409
+ updateVisibleTabs();
1888
2410
  }
2411
+ const handleWindowResize = ()=>{
2412
+ updateVisibleTabs();
2413
+ };
2414
+ let resizeObserver = null;
2415
+ if ('undefined' != typeof ResizeObserver) {
2416
+ resizeObserver = new ResizeObserver(()=>{
2417
+ updateVisibleTabs();
2418
+ });
2419
+ resizeObserver.observe(tabList);
2420
+ } else window.addEventListener('resize', handleWindowResize);
2421
+ applyActiveState(activeTab);
2422
+ requestAnimationFrame(()=>{
2423
+ updateVisibleTabs();
2424
+ });
1889
2425
  return {
1890
2426
  element: tabList,
1891
2427
  setActiveTab,
1892
2428
  destroy: ()=>{
2429
+ closeOverflowMenu();
2430
+ if (resizeObserver) {
2431
+ resizeObserver.disconnect();
2432
+ resizeObserver = null;
2433
+ } else window.removeEventListener('resize', handleWindowResize);
1893
2434
  tabButtons.clear();
2435
+ overflowButtons.clear();
1894
2436
  }
1895
2437
  };
1896
2438
  }
2439
+ function debug_bundle_createDebugBundle(payload) {
2440
+ const { namespace, devToolsState, connection, recentEvents, storeState } = payload;
2441
+ const bundle = {
2442
+ generatedAt: new Date().toISOString(),
2443
+ namespace,
2444
+ devToolsState,
2445
+ connection,
2446
+ recentEvents,
2447
+ storeState,
2448
+ overrides: storeState?.overrides ?? null,
2449
+ iab: storeState?.iab ? {
2450
+ tcString: (storeState?.iab).tcString ?? null,
2451
+ purposeCount: Object.keys((storeState?.iab).purposeConsents ?? {}).length,
2452
+ vendorCount: Object.keys((storeState?.iab).vendorConsents ?? {}).length
2453
+ } : null
2454
+ };
2455
+ return JSON.stringify(bundle, null, 2);
2456
+ }
2457
+ function debug_bundle_sanitizeStoreState(state) {
2458
+ if (!state) return null;
2459
+ try {
2460
+ return JSON.parse(JSON.stringify(state, (_key, value)=>'function' == typeof value ? void 0 : value));
2461
+ } catch {
2462
+ return {
2463
+ error: 'Unable to serialize store state'
2464
+ };
2465
+ }
2466
+ }
2467
+ function debug_bundle_downloadDebugBundle(content) {
2468
+ const blob = new Blob([
2469
+ content
2470
+ ], {
2471
+ type: 'application/json'
2472
+ });
2473
+ const url = URL.createObjectURL(blob);
2474
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
2475
+ const anchor = document.createElement('a');
2476
+ anchor.href = url;
2477
+ anchor.download = `c15t-debug-bundle-${timestamp}.json`;
2478
+ anchor.click();
2479
+ URL.revokeObjectURL(url);
2480
+ }
2481
+ const DEVTOOLS_OVERRIDES_STORAGE_KEY = 'c15t-devtools-overrides';
2482
+ function normalizeStringValue(value) {
2483
+ if ('string' != typeof value) return;
2484
+ const normalized = value.trim();
2485
+ return normalized.length > 0 ? normalized : void 0;
2486
+ }
2487
+ function normalizeBooleanValue(value) {
2488
+ return 'boolean' == typeof value ? value : void 0;
2489
+ }
2490
+ function normalizeOverrides(value) {
2491
+ if (!value || 'object' != typeof value) return null;
2492
+ const source = value;
2493
+ const overrides = {
2494
+ country: normalizeStringValue(source.country),
2495
+ region: normalizeStringValue(source.region),
2496
+ language: normalizeStringValue(source.language),
2497
+ gpc: normalizeBooleanValue(source.gpc)
2498
+ };
2499
+ return hasPersistedOverrides(overrides) ? overrides : null;
2500
+ }
2501
+ function hasPersistedOverrides(overrides) {
2502
+ return Boolean(overrides.country || overrides.region || overrides.language || void 0 !== overrides.gpc);
2503
+ }
2504
+ function override_storage_loadPersistedOverrides(storageKey = DEVTOOLS_OVERRIDES_STORAGE_KEY) {
2505
+ if ('undefined' == typeof window) return null;
2506
+ try {
2507
+ const stored = localStorage.getItem(storageKey);
2508
+ if (!stored) return null;
2509
+ const parsed = JSON.parse(stored);
2510
+ return normalizeOverrides(parsed);
2511
+ } catch {
2512
+ return null;
2513
+ }
2514
+ }
2515
+ function override_storage_persistOverrides(overrides, storageKey = DEVTOOLS_OVERRIDES_STORAGE_KEY) {
2516
+ if ('undefined' == typeof window) return;
2517
+ try {
2518
+ if (!hasPersistedOverrides(overrides)) return void localStorage.removeItem(storageKey);
2519
+ localStorage.setItem(storageKey, JSON.stringify(overrides));
2520
+ } catch {}
2521
+ }
2522
+ function override_storage_clearPersistedOverrides(storageKey = DEVTOOLS_OVERRIDES_STORAGE_KEY) {
2523
+ if ('undefined' == typeof window) return;
2524
+ try {
2525
+ localStorage.removeItem(storageKey);
2526
+ } catch {}
2527
+ }
1897
2528
  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
2529
  var components_module_options = {};
1899
2530
  components_module_options.styleTagTransform = styleTagTransform_default();
@@ -1961,31 +2592,19 @@ var __webpack_exports__ = {};
1961
2592
  btn.appendChild(document.createTextNode(text));
1962
2593
  return btn;
1963
2594
  }
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
- ]
2595
+ function createInput(options) {
2596
+ const { value, placeholder, ariaLabel, small = false, onInput } = options;
2597
+ const sizeClass = small ? styles_components_module.inputSmall : '';
2598
+ return input({
2599
+ className: `${styles_components_module.input} ${sizeClass}`.trim(),
2600
+ type: 'text',
2601
+ value,
2602
+ placeholder,
2603
+ ariaLabel,
2604
+ onInput: (event)=>{
2605
+ const target = event.target;
2606
+ onInput?.(target?.value ?? '');
2607
+ }
1989
2608
  });
1990
2609
  }
1991
2610
  function createSection(options) {
@@ -2068,6 +2687,18 @@ var __webpack_exports__ = {};
2068
2687
  children
2069
2688
  });
2070
2689
  }
2690
+ function createDisconnectedState(message = 'Store not connected') {
2691
+ return renderer_div({
2692
+ className: styles_components_module.disconnectedState,
2693
+ style: {
2694
+ padding: '24px',
2695
+ textAlign: 'center',
2696
+ color: 'var(--c15t-text-muted)',
2697
+ fontSize: 'var(--c15t-devtools-font-size-sm)'
2698
+ },
2699
+ text: message
2700
+ });
2701
+ }
2071
2702
  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
2703
  <path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"></path>
2073
2704
  <path d="M21 3v5h-5"></path>
@@ -2095,19 +2726,11 @@ var __webpack_exports__ = {};
2095
2726
  <polyline points="4 17 10 11 4 5"></polyline>
2096
2727
  <line x1="12" y1="19" x2="20" y2="19"></line>
2097
2728
  </svg>`;
2098
- function actions_renderActionsPanel(container, options) {
2099
- const { getState, onResetConsents, onRefetchBanner, onShowBanner, onOpenPreferences, onCopyState } = options;
2729
+ function renderActionsPanel(container, options) {
2730
+ const { getState, onResetConsents, onRefetchBanner, onShowBanner, onOpenPreferences, onCopyState, onExportDebugBundle } = options;
2100
2731
  renderer_clearElement(container);
2101
2732
  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
- }));
2733
+ if (!state) return void container.appendChild(createDisconnectedState());
2111
2734
  const actionCards = [
2112
2735
  createActionCard({
2113
2736
  icon: actions_EYE_ICON,
@@ -2128,6 +2751,12 @@ var __webpack_exports__ = {};
2128
2751
  icon: COPY_ICON,
2129
2752
  label: 'Copy State',
2130
2753
  onClick: onCopyState
2754
+ }),
2755
+ createActionCard({
2756
+ icon: REFRESH_ICON,
2757
+ label: 'Export Debug',
2758
+ onClick: ()=>onExportDebugBundle?.(),
2759
+ disabled: !onExportDebugBundle
2131
2760
  })
2132
2761
  ];
2133
2762
  const grid = createGrid({
@@ -2201,7 +2830,7 @@ var __webpack_exports__ = {};
2201
2830
  container.appendChild(consoleSection);
2202
2831
  }
2203
2832
  function createActionCard(options) {
2204
- const { icon, label, onClick } = options;
2833
+ const { icon, label, onClick, disabled = false } = options;
2205
2834
  const card = renderer_div({
2206
2835
  className: styles_components_module.gridCard ?? '',
2207
2836
  style: {
@@ -2212,7 +2841,8 @@ var __webpack_exports__ = {};
2212
2841
  gap: '6px',
2213
2842
  padding: '16px 8px',
2214
2843
  cursor: 'pointer',
2215
- transition: 'background-color var(--c15t-duration-fast) var(--c15t-easing)'
2844
+ transition: 'background-color var(--c15t-duration-fast) var(--c15t-easing)',
2845
+ opacity: disabled ? '0.55' : '1'
2216
2846
  },
2217
2847
  children: [
2218
2848
  createIconWrapper(icon, 20),
@@ -2227,13 +2857,15 @@ var __webpack_exports__ = {};
2227
2857
  })
2228
2858
  ]
2229
2859
  });
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
- });
2860
+ if (!disabled) {
2861
+ card.addEventListener('click', onClick);
2862
+ card.addEventListener('mouseenter', ()=>{
2863
+ card.style.backgroundColor = 'var(--c15t-surface-hover)';
2864
+ });
2865
+ card.addEventListener('mouseleave', ()=>{
2866
+ card.style.backgroundColor = '';
2867
+ });
2868
+ }
2237
2869
  return card;
2238
2870
  }
2239
2871
  function createIconWrapper(icon, size) {
@@ -2254,19 +2886,11 @@ var __webpack_exports__ = {};
2254
2886
  function getNamespace(state) {
2255
2887
  return state.config?.meta?.namespace || 'c15tStore';
2256
2888
  }
2257
- function consents_renderConsentsPanel(container, options) {
2889
+ function renderConsentsPanel(container, options) {
2258
2890
  const { getState, onConsentChange, onSave, onAcceptAll, onRejectAll, onReset } = options;
2259
2891
  renderer_clearElement(container);
2260
2892
  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
- }));
2893
+ if (!state) return void container.appendChild(createDisconnectedState());
2270
2894
  const isIabMode = 'iab' === state.model;
2271
2895
  const savedConsents = state.consents || {};
2272
2896
  const selectedConsents = state.selectedConsents || {};
@@ -2424,15 +3048,26 @@ var __webpack_exports__ = {};
2424
3048
  function formatConsentName(name) {
2425
3049
  return name.replace(/_/g, ' ').replace(/\b\w/g, (l)=>l.toUpperCase());
2426
3050
  }
2427
- let activeFilter = 'all';
2428
- let selectedEventId = null;
2429
- function events_renderEventsPanel(container, options) {
3051
+ const panelStateByContainer = new WeakMap();
3052
+ function getPanelState(container) {
3053
+ const existing = panelStateByContainer.get(container);
3054
+ if (existing) return existing;
3055
+ const initialState = {
3056
+ activeFilter: 'all',
3057
+ selectedEventId: null,
3058
+ searchQuery: ''
3059
+ };
3060
+ panelStateByContainer.set(container, initialState);
3061
+ return initialState;
3062
+ }
3063
+ function renderEventsPanel(container, options) {
2430
3064
  const { getEvents, onClear } = options;
3065
+ const panelState = getPanelState(container);
2431
3066
  renderer_clearElement(container);
2432
3067
  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;
3068
+ const events = allEvents.filter((event)=>matchesFilter(event, panelState.activeFilter)).filter((event)=>matchesSearch(event, panelState.searchQuery));
3069
+ if (!events.some((event)=>event.id === panelState.selectedEventId)) panelState.selectedEventId = events[0]?.id ?? null;
3070
+ const selectedEvent = events.find((event)=>event.id === panelState.selectedEventId) ?? null;
2436
3071
  const header = renderer_div({
2437
3072
  style: {
2438
3073
  display: 'flex',
@@ -2468,8 +3103,8 @@ var __webpack_exports__ = {};
2468
3103
  small: true,
2469
3104
  onClick: ()=>{
2470
3105
  onClear();
2471
- selectedEventId = null;
2472
- events_renderEventsPanel(container, options);
3106
+ panelState.selectedEventId = null;
3107
+ renderEventsPanel(container, options);
2473
3108
  }
2474
3109
  })
2475
3110
  ]
@@ -2484,12 +3119,30 @@ var __webpack_exports__ = {};
2484
3119
  gap: '6px',
2485
3120
  padding: '0 16px 8px'
2486
3121
  },
2487
- children: EVENT_FILTERS.map((filter)=>createFilterButton(filter, filter === activeFilter, ()=>{
2488
- activeFilter = filter;
2489
- selectedEventId = null;
2490
- events_renderEventsPanel(container, options);
3122
+ children: EVENT_FILTERS.map((filter)=>createFilterButton(filter, filter === panelState.activeFilter, ()=>{
3123
+ panelState.activeFilter = filter;
3124
+ panelState.selectedEventId = null;
3125
+ renderEventsPanel(container, options);
2491
3126
  }))
2492
3127
  }));
3128
+ container.appendChild(renderer_div({
3129
+ style: {
3130
+ padding: '0 16px 8px'
3131
+ },
3132
+ children: [
3133
+ createInput({
3134
+ value: panelState.searchQuery,
3135
+ placeholder: 'Search events…',
3136
+ ariaLabel: 'Search events',
3137
+ small: true,
3138
+ onInput: (value)=>{
3139
+ panelState.searchQuery = value.trim().toLowerCase();
3140
+ panelState.selectedEventId = null;
3141
+ renderEventsPanel(container, options);
3142
+ }
3143
+ })
3144
+ ]
3145
+ }));
2493
3146
  const eventList = renderer_div({
2494
3147
  style: {
2495
3148
  display: 'flex',
@@ -2509,9 +3162,9 @@ var __webpack_exports__ = {};
2509
3162
  },
2510
3163
  text: 'No events match this filter'
2511
3164
  }));
2512
- else for (const event of events)eventList.appendChild(createEventItem(event, event.id === selectedEventId, ()=>{
2513
- selectedEventId = event.id;
2514
- events_renderEventsPanel(container, options);
3165
+ else for (const event of events)eventList.appendChild(createEventItem(event, event.id === panelState.selectedEventId, ()=>{
3166
+ panelState.selectedEventId = event.id;
3167
+ renderEventsPanel(container, options);
2515
3168
  }));
2516
3169
  container.appendChild(eventList);
2517
3170
  container.appendChild(createPayloadSection(selectedEvent));
@@ -2538,6 +3191,11 @@ var __webpack_exports__ = {};
2538
3191
  if ('network' === filter) return 'network' === event.type;
2539
3192
  return 'iab' === event.type;
2540
3193
  }
3194
+ function matchesSearch(event, query) {
3195
+ if (!query) return true;
3196
+ const haystack = `${event.type} ${event.message} ${JSON.stringify(event.data ?? {})}`;
3197
+ return haystack.toLowerCase().includes(query);
3198
+ }
2541
3199
  function createPayloadSection(event) {
2542
3200
  const payload = event?.data ? JSON.stringify(event.data, null, 2) : null;
2543
3201
  return renderer_div({
@@ -2675,38 +3333,15 @@ var __webpack_exports__ = {};
2675
3333
  return 'var(--c15t-text-muted)';
2676
3334
  }
2677
3335
  }
2678
- function iab_renderIabPanel(container, options) {
3336
+ const iabSearchByContainer = new WeakMap();
3337
+ function renderIabPanel(container, options) {
2679
3338
  const { getState, onSetPurposeConsent, onSetVendorConsent, onSetSpecialFeatureOptIn, onAcceptAll, onRejectAll, onSave, onReset } = options;
2680
3339
  renderer_clearElement(container);
2681
3340
  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
- }));
3341
+ if (!state) return void container.appendChild(createDisconnectedState());
3342
+ if ('iab' !== state.model) return void container.appendChild(createDisconnectedState('IAB TCF mode is not configured'));
2700
3343
  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
- }));
3344
+ if (!iabState) return void container.appendChild(createDisconnectedState('IAB state not available'));
2710
3345
  const tcString = iabState.tcString;
2711
3346
  const tcStringSection = createSection({
2712
3347
  title: 'TC String',
@@ -2738,9 +3373,30 @@ var __webpack_exports__ = {};
2738
3373
  });
2739
3374
  container.appendChild(tcStringSection);
2740
3375
  const gvl = iabState.gvl;
3376
+ const searchQuery = iabSearchByContainer.get(container) ?? '';
3377
+ container.appendChild(createSection({
3378
+ title: 'Filter',
3379
+ children: [
3380
+ createInput({
3381
+ value: searchQuery,
3382
+ placeholder: 'Filter purposes or vendors…',
3383
+ ariaLabel: 'Filter IAB purposes and vendors',
3384
+ small: true,
3385
+ onInput: (value)=>{
3386
+ iabSearchByContainer.set(container, value.trim().toLowerCase());
3387
+ renderIabPanel(container, options);
3388
+ }
3389
+ })
3390
+ ]
3391
+ }));
2741
3392
  const purposeConsents = iabState.purposeConsents || {};
2742
3393
  const purposes = gvl?.purposes || {};
2743
- const purposeEntries = Object.entries(purposeConsents);
3394
+ const purposeEntries = Object.entries(purposeConsents).filter(([purposeId])=>{
3395
+ if (!searchQuery) return true;
3396
+ const purposeInfo = purposes[purposeId];
3397
+ const purposeName = purposeInfo?.name || `Purpose ${purposeId}`;
3398
+ return `${purposeId} ${purposeName}`.toLowerCase().includes(searchQuery);
3399
+ });
2744
3400
  if (purposeEntries.length > 0) {
2745
3401
  const purposeList = renderer_div({
2746
3402
  style: {
@@ -2768,7 +3424,12 @@ var __webpack_exports__ = {};
2768
3424
  }
2769
3425
  const specialFeatureOptIns = iabState.specialFeatureOptIns || {};
2770
3426
  const specialFeatures = gvl?.specialFeatures || {};
2771
- const specialFeatureEntries = Object.entries(specialFeatureOptIns);
3427
+ const specialFeatureEntries = Object.entries(specialFeatureOptIns).filter(([featureId])=>{
3428
+ if (!searchQuery) return true;
3429
+ const featureInfo = specialFeatures[featureId];
3430
+ const featureName = featureInfo?.name || `Special Feature ${featureId}`;
3431
+ return `${featureId} ${featureName}`.toLowerCase().includes(searchQuery);
3432
+ });
2772
3433
  if (specialFeatureEntries.length > 0) {
2773
3434
  const specialFeatureList = renderer_div({
2774
3435
  style: {
@@ -2796,7 +3457,12 @@ var __webpack_exports__ = {};
2796
3457
  }
2797
3458
  const vendorConsents = iabState.vendorConsents || {};
2798
3459
  const vendors = gvl?.vendors || {};
2799
- const vendorEntries = Object.entries(vendorConsents);
3460
+ const vendorEntries = Object.entries(vendorConsents).filter(([vendorId])=>{
3461
+ if (!searchQuery) return true;
3462
+ const vendorInfo = vendors[vendorId];
3463
+ const vendorName = vendorInfo?.name || `Vendor ${vendorId}`;
3464
+ return `${vendorId} ${vendorName}`.toLowerCase().includes(searchQuery);
3465
+ });
2800
3466
  const iabVendors = [];
2801
3467
  const customVendors = [];
2802
3468
  for (const [vendorId, consent] of vendorEntries){
@@ -3015,27 +3681,44 @@ var __webpack_exports__ = {};
3015
3681
  if (text.length <= maxLength) return text;
3016
3682
  return `${text.slice(0, maxLength - 3)}...`;
3017
3683
  }
3018
- function location_renderLocationPanel(container, options) {
3684
+ function init_source_formatInitSource(source, detail) {
3685
+ const label = (()=>{
3686
+ switch(source){
3687
+ case 'ssr':
3688
+ return 'SSR Prefetch';
3689
+ case 'backend':
3690
+ return 'Backend';
3691
+ case 'backend-cache-hit':
3692
+ return 'Backend (Cache Hit)';
3693
+ case 'offline-fallback':
3694
+ return 'Offline Fallback';
3695
+ case 'offline-mode':
3696
+ return 'Offline Mode';
3697
+ case 'custom':
3698
+ return 'Custom Client';
3699
+ default:
3700
+ return '—';
3701
+ }
3702
+ })();
3703
+ return detail ? `${label} [${detail}]` : label;
3704
+ }
3705
+ function renderLocationPanel(container, options) {
3019
3706
  const { getState, onApplyOverrides, onClearOverrides } = options;
3020
3707
  renderer_clearElement(container);
3021
3708
  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
- }));
3709
+ if (!state) return void container.appendChild(createDisconnectedState());
3031
3710
  const locationInfo = state.locationInfo;
3032
3711
  const overrides = state.overrides;
3033
3712
  const translationConfig = state.translationConfig;
3713
+ const initData = state.lastBannerFetchData;
3714
+ const activePolicy = initData?.policy;
3715
+ const policyDecision = initData?.policyDecision;
3716
+ const initSource = init_source_formatInitSource(state.initDataSource, state.initDataSourceDetail);
3034
3717
  const gridItems = [
3035
3718
  createCompactInfoCard('Country', locationInfo?.countryCode || '—'),
3036
3719
  createCompactInfoCard('Region', locationInfo?.regionCode || '—'),
3037
- createCompactInfoCard('Jurisdiction', locationInfo?.jurisdiction || '—'),
3038
- createCompactInfoCard('Language', translationConfig?.defaultLanguage || '—')
3720
+ createCompactInfoCard('Language', translationConfig?.defaultLanguage || '—'),
3721
+ createCompactInfoCard('Init Source', initSource)
3039
3722
  ];
3040
3723
  gridItems.push(createCompactInfoCard('GPC', getEffectiveGpcLabel(overrides?.gpc)));
3041
3724
  if (state.model) gridItems.push(createCompactInfoCard('Model', getModelLabel(state.model)));
@@ -3043,7 +3726,6 @@ var __webpack_exports__ = {};
3043
3726
  columns: 3,
3044
3727
  children: gridItems
3045
3728
  });
3046
- container.appendChild(locationGrid);
3047
3729
  const initialDraft = getDraftFromOverrides(overrides);
3048
3730
  let appliedOverrides = normalizeOverrideDraft(initialDraft);
3049
3731
  let isSubmitting = false;
@@ -3134,6 +3816,12 @@ var __webpack_exports__ = {};
3134
3816
  ]
3135
3817
  });
3136
3818
  container.appendChild(overrideSection);
3819
+ container.appendChild(locationGrid);
3820
+ container.appendChild(createActivePolicySummarySection({
3821
+ policy: activePolicy,
3822
+ policyDecision,
3823
+ policySnapshotToken: initData?.policySnapshotToken
3824
+ }));
3137
3825
  countryField.control.addEventListener('change', updateFormState);
3138
3826
  regionField.control.addEventListener('input', updateFormState);
3139
3827
  languageField.control.addEventListener('input', updateFormState);
@@ -3422,15 +4110,53 @@ var __webpack_exports__ = {};
3422
4110
  return 'None';
3423
4111
  }
3424
4112
  }
4113
+ function createActivePolicySummarySection(options) {
4114
+ const { policy, policyDecision, policySnapshotToken } = options;
4115
+ if (!policy && !policyDecision) return createSection({
4116
+ title: 'Active Policy',
4117
+ children: [
4118
+ renderer_div({
4119
+ style: {
4120
+ padding: '10px 12px',
4121
+ fontSize: 'var(--c15t-devtools-font-size-sm)',
4122
+ color: 'var(--c15t-text-muted)'
4123
+ },
4124
+ text: 'No active policy matched.'
4125
+ })
4126
+ ]
4127
+ });
4128
+ const cards = [
4129
+ createCompactInfoCard('Policy ID', policy?.id ?? policyDecision?.policyId ?? '—'),
4130
+ createCompactInfoCard('Matched By', policyDecision?.matchedBy ?? '—'),
4131
+ createCompactInfoCard('Snapshot Token', policySnapshotToken ? 'present' : 'missing')
4132
+ ];
4133
+ return createSection({
4134
+ title: 'Active Policy',
4135
+ children: [
4136
+ renderer_div({
4137
+ style: {
4138
+ display: 'grid',
4139
+ gridTemplateColumns: 'repeat(3, minmax(0, 1fr))',
4140
+ gap: 'var(--c15t-space-sm, 0.5rem)'
4141
+ },
4142
+ children: cards
4143
+ }),
4144
+ renderer_span({
4145
+ className: styles_components_module.overrideHint,
4146
+ text: 'Open the Policy tab for full policy-pack diagnostics.'
4147
+ })
4148
+ ]
4149
+ });
4150
+ }
3425
4151
  function createCompactInfoCard(label, value) {
3426
4152
  return renderer_div({
3427
4153
  className: styles_components_module.gridCard ?? '',
3428
4154
  style: {
3429
- padding: '6px 8px',
4155
+ padding: '8px 10px',
3430
4156
  minHeight: 'auto',
3431
4157
  flexDirection: 'column',
3432
4158
  alignItems: 'flex-start',
3433
- gap: '1px'
4159
+ gap: '2px'
3434
4160
  },
3435
4161
  children: [
3436
4162
  renderer_span({
@@ -3451,6 +4177,253 @@ var __webpack_exports__ = {};
3451
4177
  ]
3452
4178
  });
3453
4179
  }
4180
+ function renderPolicyPanel(container, options) {
4181
+ const { getState } = options;
4182
+ renderer_clearElement(container);
4183
+ const state = getState();
4184
+ if (!state) return void container.appendChild(createDisconnectedState());
4185
+ const initData = state.lastBannerFetchData;
4186
+ const activePolicy = initData?.policy;
4187
+ const policyDecision = initData?.policyDecision;
4188
+ const initSource = init_source_formatInitSource(state.initDataSource, state.initDataSourceDetail);
4189
+ container.appendChild(createMatchTraceSection({
4190
+ policyDecision,
4191
+ policyId: activePolicy?.id ?? policyDecision?.policyId
4192
+ }));
4193
+ if (!activePolicy && !policyDecision) return void container.appendChild(createSection({
4194
+ title: 'Policy',
4195
+ children: [
4196
+ renderer_div({
4197
+ style: {
4198
+ padding: '10px 12px',
4199
+ fontSize: 'var(--c15t-devtools-font-size-sm)',
4200
+ color: 'var(--c15t-text-muted)'
4201
+ },
4202
+ text: 'No active policy matched for this request.'
4203
+ }),
4204
+ createHint(`Init Source: ${initSource}`)
4205
+ ]
4206
+ }));
4207
+ container.appendChild(createSection({
4208
+ title: 'Policy',
4209
+ children: [
4210
+ policy_createGrid(3, [
4211
+ createCard('ID', activePolicy?.id ?? policyDecision?.policyId ?? '—'),
4212
+ createCard('Model', policy_getModelLabel(activePolicy?.model)),
4213
+ createCard('Scope', getScopeModeLabel(activePolicy?.consent?.scopeMode ?? state.policyScopeMode)),
4214
+ createCard('Categories', formatList(state.policyCategories ?? activePolicy?.consent?.categories)),
4215
+ createCard('Preselected', formatList(activePolicy?.consent?.preselectedCategories)),
4216
+ createCard('Expiry', 'number' == typeof activePolicy?.consent?.expiryDays ? `${activePolicy.consent.expiryDays}d` : '—')
4217
+ ]),
4218
+ createHint(`${initSource} · ${formatFingerprint(policyDecision?.fingerprint)}`)
4219
+ ]
4220
+ }));
4221
+ const uiMode = activePolicy?.ui?.mode;
4222
+ if (uiMode && 'none' !== uiMode) {
4223
+ const bannerCards = buildSurfaceCards('Banner', activePolicy?.ui?.banner, state.policyBanner);
4224
+ const dialogCards = buildSurfaceCards('Dialog', activePolicy?.ui?.dialog, state.policyDialog);
4225
+ if (bannerCards.length > 0 || dialogCards.length > 0) container.appendChild(createSection({
4226
+ title: `UI · ${uiMode}`,
4227
+ children: [
4228
+ policy_createGrid(3, [
4229
+ ...bannerCards,
4230
+ ...dialogCards
4231
+ ])
4232
+ ]
4233
+ }));
4234
+ }
4235
+ const proofLabel = formatProofSummary(activePolicy?.proof);
4236
+ const snapshotLabel = initData?.policySnapshotToken ? 'present' : 'missing';
4237
+ container.appendChild(createSection({
4238
+ title: 'Proof & Snapshot',
4239
+ children: [
4240
+ policy_createGrid(3, [
4241
+ createCard('Proof', proofLabel),
4242
+ createCard('Snapshot', snapshotLabel),
4243
+ createCard('I18n', activePolicy?.i18n?.messageProfile ?? activePolicy?.i18n?.language ?? '—')
4244
+ ])
4245
+ ]
4246
+ }));
4247
+ }
4248
+ function buildSurfaceCards(prefix, policySurface, storeSurface) {
4249
+ const policyLayout = Array.isArray(policySurface?.layout) && 0 === policySurface.layout.length ? null : policySurface?.layout ?? null;
4250
+ const storeLayout = Array.isArray(storeSurface.layout) && 0 === storeSurface.layout.length ? null : storeSurface.layout ?? null;
4251
+ const actions = formatList(policySurface?.allowedActions ?? storeSurface.allowedActions);
4252
+ const primary = policySurface?.primaryAction ?? storeSurface.primaryAction ?? null;
4253
+ const layout = policyLayout ?? storeLayout;
4254
+ const direction = policySurface?.direction ?? storeSurface.direction ?? null;
4255
+ const profile = policySurface?.uiProfile ?? storeSurface.uiProfile ?? null;
4256
+ const scrollLock = policySurface?.scrollLock ?? storeSurface.scrollLock ?? null;
4257
+ if ('—' === actions && !primary && !layout && !direction && !profile && null === scrollLock) return [];
4258
+ const cards = [
4259
+ createCard(`${prefix} Actions`, actions)
4260
+ ];
4261
+ if (primary) cards.push(createCard(`${prefix} Primary`, primary));
4262
+ if (layout) cards.push(createCard(`${prefix} Layout`, Array.isArray(layout) ? layout.map((group)=>Array.isArray(group) ? `[${group.join(', ')}]` : group).join(' / ') : layout));
4263
+ if (direction) cards.push(createCard(`${prefix} Direction`, direction));
4264
+ if (profile) cards.push(createCard(`${prefix} Profile`, profile));
4265
+ if (null !== scrollLock) cards.push(createCard(`${prefix} Scroll Lock`, scrollLock ? 'on' : 'off'));
4266
+ return cards;
4267
+ }
4268
+ function createMatchTraceSection(options) {
4269
+ const { policyDecision, policyId } = options;
4270
+ const entries = buildTraceEntries(policyDecision, policyId);
4271
+ return createSection({
4272
+ title: 'Match Trace',
4273
+ children: [
4274
+ renderer_div({
4275
+ style: {
4276
+ display: 'grid',
4277
+ gridTemplateColumns: '1fr',
4278
+ gap: '4px'
4279
+ },
4280
+ children: entries.map((entry)=>renderer_div({
4281
+ className: styles_components_module.gridCard ?? '',
4282
+ style: {
4283
+ padding: '6px 10px',
4284
+ display: 'flex',
4285
+ alignItems: 'center',
4286
+ justifyContent: 'space-between',
4287
+ gap: '10px'
4288
+ },
4289
+ children: [
4290
+ renderer_span({
4291
+ style: {
4292
+ fontSize: 'var(--c15t-devtools-font-size-xs)',
4293
+ color: 'var(--c15t-text-muted)',
4294
+ fontFamily: 'ui-monospace, monospace'
4295
+ },
4296
+ text: entry.step
4297
+ }),
4298
+ renderer_span({
4299
+ style: {
4300
+ fontSize: 'var(--c15t-devtools-font-size-xs)',
4301
+ fontFamily: 'ui-monospace, monospace'
4302
+ },
4303
+ text: entry.result
4304
+ })
4305
+ ]
4306
+ }))
4307
+ }),
4308
+ createHint('region → country → default · fallback on geo failure · Simulate via Location tab')
4309
+ ]
4310
+ });
4311
+ }
4312
+ function buildTraceEntries(decision, policyId) {
4313
+ if (!decision) return [
4314
+ {
4315
+ step: 'decision metadata',
4316
+ result: 'UNAVAILABLE'
4317
+ }
4318
+ ];
4319
+ const country = decision.country ?? 'n/a';
4320
+ const regionKey = decision.country && decision.region ? `${decision.country}-${decision.region}` : 'n/a';
4321
+ const resolved = policyId ?? decision.policyId ?? 'unknown';
4322
+ const matched = decision.matchedBy;
4323
+ return [
4324
+ {
4325
+ step: `region(${regionKey})`,
4326
+ result: 'region' === matched ? `MATCH → ${resolved}` : 'MISS'
4327
+ },
4328
+ {
4329
+ step: `country(${country})`,
4330
+ result: 'country' === matched ? `MATCH → ${resolved}` : 'region' === matched ? 'SKIPPED' : 'MISS'
4331
+ },
4332
+ {
4333
+ step: 'fallback(geo-fail)',
4334
+ result: 'fallback' === matched ? `MATCH → ${resolved}` : 'SKIPPED'
4335
+ },
4336
+ {
4337
+ step: 'default(catch-all)',
4338
+ result: 'default' === matched ? `MATCH → ${resolved}` : 'SKIPPED'
4339
+ }
4340
+ ];
4341
+ }
4342
+ function policy_getModelLabel(model) {
4343
+ switch(model){
4344
+ case 'opt-in':
4345
+ return 'Opt-In';
4346
+ case 'opt-out':
4347
+ return 'Opt-Out';
4348
+ case 'iab':
4349
+ return 'IAB TCF';
4350
+ default:
4351
+ return 'None';
4352
+ }
4353
+ }
4354
+ function getScopeModeLabel(mode) {
4355
+ switch(mode){
4356
+ case 'strict':
4357
+ return 'Strict';
4358
+ case 'permissive':
4359
+ return 'Permissive';
4360
+ default:
4361
+ return '—';
4362
+ }
4363
+ }
4364
+ function formatList(items) {
4365
+ if (!items || 0 === items.length) return '—';
4366
+ if (items.includes('*')) return '* (all)';
4367
+ return items.join(', ');
4368
+ }
4369
+ function formatProofSummary(proof) {
4370
+ if (!proof) return '—';
4371
+ const parts = [];
4372
+ if (proof.storeIp) parts.push('IP');
4373
+ if (proof.storeUserAgent) parts.push('UA');
4374
+ if (proof.storeLanguage) parts.push('Lang');
4375
+ return parts.length > 0 ? parts.join(', ') : 'none';
4376
+ }
4377
+ function formatFingerprint(fingerprint) {
4378
+ if (!fingerprint) return 'no fingerprint';
4379
+ if (fingerprint.length <= 12) return fingerprint;
4380
+ return `${fingerprint.slice(0, 8)}…${fingerprint.slice(-4)}`;
4381
+ }
4382
+ function createCard(label, value) {
4383
+ return renderer_div({
4384
+ className: styles_components_module.gridCard ?? '',
4385
+ style: {
4386
+ padding: '8px 10px',
4387
+ minHeight: 'auto',
4388
+ flexDirection: 'column',
4389
+ alignItems: 'flex-start',
4390
+ gap: '2px'
4391
+ },
4392
+ children: [
4393
+ renderer_span({
4394
+ style: {
4395
+ fontSize: 'var(--c15t-devtools-font-size-xs)',
4396
+ color: 'var(--c15t-text-muted)'
4397
+ },
4398
+ text: label
4399
+ }),
4400
+ renderer_span({
4401
+ style: {
4402
+ fontSize: 'var(--c15t-font-size-sm)',
4403
+ fontWeight: '500',
4404
+ fontFamily: 'ui-monospace, monospace'
4405
+ },
4406
+ text: value
4407
+ })
4408
+ ]
4409
+ });
4410
+ }
4411
+ function policy_createGrid(columns, children) {
4412
+ return renderer_div({
4413
+ style: {
4414
+ display: 'grid',
4415
+ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`,
4416
+ gap: 'var(--c15t-space-sm, 0.5rem)'
4417
+ },
4418
+ children
4419
+ });
4420
+ }
4421
+ function createHint(text) {
4422
+ return renderer_span({
4423
+ className: styles_components_module.overrideHint,
4424
+ text
4425
+ });
4426
+ }
3454
4427
  const dismissedResources = new Set();
3455
4428
  function scanDOM(state) {
3456
4429
  const results = [];
@@ -3676,23 +4649,37 @@ var __webpack_exports__ = {};
3676
4649
  <polyline points="16 18 22 12 16 6"></polyline>
3677
4650
  <polyline points="8 6 2 12 8 18"></polyline>
3678
4651
  </svg>`;
3679
- function scripts_renderScriptsPanel(container, options) {
4652
+ const scriptsSearchByContainer = new WeakMap();
4653
+ function renderScriptsPanel(container, options) {
3680
4654
  const { getState, getEvents } = options;
3681
4655
  renderer_clearElement(container);
3682
4656
  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
- }));
4657
+ if (!state) return void container.appendChild(createDisconnectedState());
3692
4658
  const scripts = state.scripts || [];
3693
4659
  const loadedScripts = state.loadedScripts || {};
3694
4660
  const networkBlocker = state.networkBlocker;
3695
4661
  const events = getEvents?.() ?? [];
4662
+ const searchQuery = scriptsSearchByContainer.get(container) ?? '';
4663
+ const filteredScripts = scripts.filter((script)=>{
4664
+ if (!searchQuery) return true;
4665
+ const category = 'string' == typeof script.category ? script.category : JSON.stringify(script.category);
4666
+ return `${script.id} ${category}`.toLowerCase().includes(searchQuery);
4667
+ });
4668
+ if (scripts.length > 4) container.appendChild(createSection({
4669
+ title: 'Filter',
4670
+ children: [
4671
+ createInput({
4672
+ value: searchQuery,
4673
+ placeholder: "Filter scripts…",
4674
+ ariaLabel: "Filter scripts",
4675
+ small: true,
4676
+ onInput: (value)=>{
4677
+ scriptsSearchByContainer.set(container, value.trim().toLowerCase());
4678
+ renderScriptsPanel(container, options);
4679
+ }
4680
+ })
4681
+ ]
4682
+ }));
3696
4683
  if (0 === scripts.length) {
3697
4684
  const scriptsSection = createSection({
3698
4685
  title: 'Configured Scripts',
@@ -3709,10 +4696,19 @@ var __webpack_exports__ = {};
3709
4696
  style: {
3710
4697
  display: 'flex',
3711
4698
  flexDirection: 'column',
3712
- gap: '4px'
4699
+ borderTop: '1px solid var(--c15t-border)',
4700
+ borderBottom: '1px solid var(--c15t-border)'
3713
4701
  }
3714
4702
  });
3715
- for (const script of scripts){
4703
+ if (0 === filteredScripts.length) scriptsList.appendChild(renderer_div({
4704
+ style: {
4705
+ padding: '10px 0',
4706
+ fontSize: 'var(--c15t-devtools-font-size-xs)',
4707
+ color: 'var(--c15t-text-muted)'
4708
+ },
4709
+ text: "No matching scripts"
4710
+ }));
4711
+ for (const script of filteredScripts){
3716
4712
  const scriptId = script.id;
3717
4713
  const isLoaded = true === loadedScripts[scriptId];
3718
4714
  const category = script.category;
@@ -3736,17 +4732,64 @@ var __webpack_exports__ = {};
3736
4732
  text: status.charAt(0).toUpperCase() + status.slice(1),
3737
4733
  variant: statusVariant
3738
4734
  });
3739
- const item = createListItem({
3740
- title: scriptId,
3741
- description: `Category: ${categoryDisplay}`,
3742
- actions: [
3743
- badge
4735
+ const row = renderer_div({
4736
+ style: {
4737
+ display: 'flex',
4738
+ alignItems: 'center',
4739
+ justifyContent: 'space-between',
4740
+ gap: '8px',
4741
+ padding: '8px 0',
4742
+ borderBottom: '1px solid var(--c15t-border)'
4743
+ },
4744
+ children: [
4745
+ renderer_div({
4746
+ style: {
4747
+ display: 'flex',
4748
+ flexDirection: 'column',
4749
+ gap: '2px',
4750
+ minWidth: '0',
4751
+ flex: '1'
4752
+ },
4753
+ children: [
4754
+ renderer_div({
4755
+ style: {
4756
+ fontSize: 'var(--c15t-font-size-sm)',
4757
+ fontWeight: '500',
4758
+ color: 'var(--c15t-text)',
4759
+ overflow: 'hidden',
4760
+ textOverflow: 'ellipsis',
4761
+ whiteSpace: 'nowrap'
4762
+ },
4763
+ text: scriptId
4764
+ }),
4765
+ renderer_div({
4766
+ style: {
4767
+ fontSize: 'var(--c15t-devtools-font-size-xs)',
4768
+ color: 'var(--c15t-text-muted)',
4769
+ overflow: 'hidden',
4770
+ textOverflow: 'ellipsis',
4771
+ whiteSpace: 'nowrap'
4772
+ },
4773
+ text: `Category: ${categoryDisplay}`
4774
+ })
4775
+ ]
4776
+ }),
4777
+ renderer_div({
4778
+ style: {
4779
+ flexShrink: '0'
4780
+ },
4781
+ children: [
4782
+ badge
4783
+ ]
4784
+ })
3744
4785
  ]
3745
4786
  });
3746
- scriptsList.appendChild(item);
4787
+ scriptsList.appendChild(row);
3747
4788
  }
4789
+ const lastRow = scriptsList.lastElementChild;
4790
+ if (lastRow) lastRow.style.borderBottom = 'none';
3748
4791
  const scriptsSection = createSection({
3749
- title: `Configured Scripts (${scripts.length})`,
4792
+ title: `Configured Scripts (${filteredScripts.length}/${scripts.length})`,
3750
4793
  children: [
3751
4794
  scriptsList
3752
4795
  ]
@@ -3888,53 +4931,6 @@ var __webpack_exports__ = {};
3888
4931
  if (text.length <= maxLength) return text;
3889
4932
  return `${text.slice(0, maxLength - 3)}...`;
3890
4933
  }
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
4934
  const STORAGE_KEYS = {
3939
4935
  C15T: 'c15t',
3940
4936
  PENDING_SYNC: 'c15t:pending-consent-sync',
@@ -3960,7 +4956,7 @@ var __webpack_exports__ = {};
3960
4956
  localStorage.removeItem(STORAGE_KEYS.EUCONSENT);
3961
4957
  } catch {}
3962
4958
  }
3963
- async function reset_consents_resetAllConsents(store, stateManager) {
4959
+ async function resetAllConsents(store, stateManager) {
3964
4960
  const storeState = store.getState();
3965
4961
  storeState.resetConsents();
3966
4962
  clearAllCookies();
@@ -3971,7 +4967,227 @@ var __webpack_exports__ = {};
3971
4967
  message: 'All consents reset (storage cleared)'
3972
4968
  });
3973
4969
  }
4970
+ function panel_renderer_createPanelRenderer(config) {
4971
+ const { storeConnector, stateManager, enableEventLogging = true, onPersistOverrides, onClearPersistedOverrides, onCopyState, onExportDebugBundle } = config;
4972
+ const getStoreState = ()=>storeConnector.getState();
4973
+ const logEvent = (type, message, data)=>{
4974
+ if (enableEventLogging) stateManager.addEvent({
4975
+ type,
4976
+ message,
4977
+ data
4978
+ });
4979
+ };
4980
+ const resetConsents = async ()=>{
4981
+ const store = storeConnector.getStore();
4982
+ if (store) await resetAllConsents(store, enableEventLogging ? stateManager : void 0);
4983
+ };
4984
+ const renderPanel = (container, tab)=>{
4985
+ switch(tab){
4986
+ case 'consents':
4987
+ renderConsentsPanel(container, {
4988
+ getState: getStoreState,
4989
+ onConsentChange: (name, value)=>{
4990
+ const store = storeConnector.getStore();
4991
+ if (store) {
4992
+ const consentName = String(name);
4993
+ store.getState().setSelectedConsent(consentName, value);
4994
+ logEvent('info', `${consentName} toggled to ${value} (not saved)`, {
4995
+ name: consentName,
4996
+ value
4997
+ });
4998
+ }
4999
+ },
5000
+ onSave: ()=>{
5001
+ const store = storeConnector.getStore();
5002
+ if (store) {
5003
+ store.getState().saveConsents('custom');
5004
+ logEvent('consent_save', 'Saved consent preferences');
5005
+ }
5006
+ },
5007
+ onAcceptAll: ()=>{
5008
+ const store = storeConnector.getStore();
5009
+ if (store) {
5010
+ store.getState().saveConsents('all');
5011
+ logEvent('consent_save', 'Accepted all consents');
5012
+ }
5013
+ },
5014
+ onRejectAll: ()=>{
5015
+ const store = storeConnector.getStore();
5016
+ if (store) {
5017
+ store.getState().saveConsents('necessary');
5018
+ logEvent('consent_save', 'Rejected all optional consents');
5019
+ }
5020
+ },
5021
+ onReset: resetConsents
5022
+ });
5023
+ break;
5024
+ case 'location':
5025
+ renderLocationPanel(container, {
5026
+ getState: getStoreState,
5027
+ onApplyOverrides: async (overrides)=>{
5028
+ const store = storeConnector.getStore();
5029
+ if (store) {
5030
+ await store.getState().setOverrides({
5031
+ country: overrides.country,
5032
+ region: overrides.region,
5033
+ language: overrides.language,
5034
+ gpc: overrides.gpc
5035
+ });
5036
+ logEvent('info', 'Overrides updated', {
5037
+ country: overrides.country,
5038
+ region: overrides.region,
5039
+ language: overrides.language,
5040
+ gpc: overrides.gpc
5041
+ });
5042
+ onPersistOverrides?.({
5043
+ country: overrides.country,
5044
+ region: overrides.region,
5045
+ language: overrides.language,
5046
+ gpc: overrides.gpc
5047
+ });
5048
+ }
5049
+ },
5050
+ onClearOverrides: async ()=>{
5051
+ const store = storeConnector.getStore();
5052
+ if (store) {
5053
+ await store.getState().setOverrides({
5054
+ country: void 0,
5055
+ region: void 0,
5056
+ language: void 0,
5057
+ gpc: void 0
5058
+ });
5059
+ logEvent('info', 'Overrides cleared');
5060
+ onClearPersistedOverrides?.();
5061
+ }
5062
+ }
5063
+ });
5064
+ break;
5065
+ case 'policy':
5066
+ renderPolicyPanel(container, {
5067
+ getState: getStoreState
5068
+ });
5069
+ break;
5070
+ case "scripts":
5071
+ renderScriptsPanel(container, {
5072
+ getState: getStoreState,
5073
+ getEvents: ()=>stateManager.getState().eventLog
5074
+ });
5075
+ break;
5076
+ case 'iab':
5077
+ renderIabPanel(container, {
5078
+ getState: getStoreState,
5079
+ onSetPurposeConsent: (purposeId, value)=>{
5080
+ const iab = storeConnector.getStore()?.getState().iab;
5081
+ if (!iab) return;
5082
+ iab.setPurposeConsent(purposeId, value);
5083
+ logEvent('iab', `IAB purpose ${purposeId} set to ${value}`);
5084
+ },
5085
+ onSetVendorConsent: (vendorId, value)=>{
5086
+ const iab = storeConnector.getStore()?.getState().iab;
5087
+ if (!iab) return;
5088
+ iab.setVendorConsent(vendorId, value);
5089
+ logEvent('iab', `IAB vendor ${vendorId} set to ${value}`);
5090
+ },
5091
+ onSetSpecialFeatureOptIn: (featureId, value)=>{
5092
+ const iab = storeConnector.getStore()?.getState().iab;
5093
+ if (!iab) return;
5094
+ iab.setSpecialFeatureOptIn(featureId, value);
5095
+ logEvent('iab', `IAB feature ${featureId} set to ${value}`);
5096
+ },
5097
+ onAcceptAll: ()=>{
5098
+ const iab = storeConnector.getStore()?.getState().iab;
5099
+ if (!iab) return;
5100
+ iab.acceptAll();
5101
+ logEvent('iab', 'IAB accept all selected');
5102
+ },
5103
+ onRejectAll: ()=>{
5104
+ const iab = storeConnector.getStore()?.getState().iab;
5105
+ if (!iab) return;
5106
+ iab.rejectAll();
5107
+ logEvent('iab', 'IAB reject all selected');
5108
+ },
5109
+ onSave: ()=>{
5110
+ const iab = storeConnector.getStore()?.getState().iab;
5111
+ if (!iab) return;
5112
+ iab.save().then(()=>logEvent('iab', 'IAB preferences saved')).catch((error)=>{
5113
+ logEvent('error', `Failed to save IAB preferences: ${String(error)}`);
5114
+ });
5115
+ },
5116
+ onReset: resetConsents
5117
+ });
5118
+ break;
5119
+ case 'events':
5120
+ renderEventsPanel(container, {
5121
+ getEvents: ()=>stateManager.getState().eventLog,
5122
+ onClear: ()=>{
5123
+ stateManager.clearEventLog();
5124
+ logEvent('info', 'Event log cleared');
5125
+ }
5126
+ });
5127
+ break;
5128
+ case 'actions':
5129
+ renderActionsPanel(container, {
5130
+ getState: getStoreState,
5131
+ onResetConsents: resetConsents,
5132
+ onRefetchBanner: async ()=>{
5133
+ const store = storeConnector.getStore();
5134
+ if (store) {
5135
+ await store.getState().initConsentManager();
5136
+ logEvent('info', 'Banner data refetched');
5137
+ }
5138
+ },
5139
+ onShowBanner: ()=>{
5140
+ const store = storeConnector.getStore();
5141
+ if (store) {
5142
+ store.getState().setActiveUI('banner', {
5143
+ force: true
5144
+ });
5145
+ logEvent('info', 'Banner shown');
5146
+ }
5147
+ },
5148
+ onOpenPreferences: ()=>{
5149
+ const store = storeConnector.getStore();
5150
+ if (store) {
5151
+ store.getState().setActiveUI('dialog');
5152
+ logEvent('info', 'Preferences dialog opened');
5153
+ }
5154
+ },
5155
+ onCopyState: ()=>{
5156
+ const state = getStoreState();
5157
+ if (state) if (onCopyState) {
5158
+ const result = onCopyState(state);
5159
+ if (result instanceof Promise) result.then((ok)=>{
5160
+ logEvent(ok ? 'info' : 'error', ok ? 'State copied to clipboard' : 'Failed to copy state');
5161
+ }).catch(()=>{
5162
+ logEvent('error', 'Failed to copy state');
5163
+ });
5164
+ else logEvent(result ? 'info' : 'error', result ? 'State copied to clipboard' : 'Failed to copy state');
5165
+ } else navigator.clipboard.writeText(JSON.stringify(state, null, 2)).then(()=>{
5166
+ logEvent('info', 'State copied to clipboard');
5167
+ }).catch(()=>{
5168
+ logEvent('error', 'Failed to copy state');
5169
+ });
5170
+ },
5171
+ onExportDebugBundle: onExportDebugBundle ? ()=>{
5172
+ try {
5173
+ onExportDebugBundle();
5174
+ logEvent('info', 'Debug bundle exported');
5175
+ } catch {
5176
+ logEvent('error', 'Failed to export debug bundle');
5177
+ }
5178
+ } : void 0
5179
+ });
5180
+ break;
5181
+ }
5182
+ };
5183
+ return {
5184
+ renderPanel,
5185
+ getStoreState,
5186
+ resetConsents
5187
+ };
5188
+ }
3974
5189
  const STORAGE_KEY = 'c15t-devtools-events';
5190
+ const ACTIVE_TAB_STORAGE_KEY = 'c15t-devtools-active-tab';
3975
5191
  function loadPersistedEvents() {
3976
5192
  if ('undefined' == typeof window) return [];
3977
5193
  try {
@@ -3986,11 +5202,29 @@ var __webpack_exports__ = {};
3986
5202
  sessionStorage.setItem(STORAGE_KEY, JSON.stringify(events));
3987
5203
  } catch {}
3988
5204
  }
5205
+ function isDevToolsTab(value) {
5206
+ return 'consents' === value || 'location' === value || 'policy' === value || "scripts" === value || 'iab' === value || 'events' === value || 'actions' === value;
5207
+ }
5208
+ function loadPersistedActiveTab() {
5209
+ if ('undefined' == typeof window) return null;
5210
+ try {
5211
+ const stored = localStorage.getItem(ACTIVE_TAB_STORAGE_KEY);
5212
+ if (isDevToolsTab(stored)) return stored;
5213
+ } catch {}
5214
+ return null;
5215
+ }
5216
+ function persistActiveTab(tab) {
5217
+ if ('undefined' == typeof window) return;
5218
+ try {
5219
+ localStorage.setItem(ACTIVE_TAB_STORAGE_KEY, tab);
5220
+ } catch {}
5221
+ }
3989
5222
  function state_manager_createStateManager(initialState = {}) {
3990
5223
  const persistedEvents = loadPersistedEvents();
5224
+ const persistedActiveTab = loadPersistedActiveTab();
3991
5225
  let state = {
3992
5226
  isOpen: false,
3993
- activeTab: 'location',
5227
+ activeTab: persistedActiveTab ?? 'location',
3994
5228
  position: 'bottom-right',
3995
5229
  isConnected: false,
3996
5230
  eventLog: persistedEvents,
@@ -4031,6 +5265,7 @@ var __webpack_exports__ = {};
4031
5265
  setState({
4032
5266
  activeTab: tab
4033
5267
  });
5268
+ persistActiveTab(tab);
4034
5269
  },
4035
5270
  setPosition: (position)=>{
4036
5271
  setState({
@@ -4076,22 +5311,52 @@ var __webpack_exports__ = {};
4076
5311
  let reconnectAttempts = 0;
4077
5312
  let hasNotifiedDisconnect = false;
4078
5313
  const listeners = new Set();
5314
+ const diagnosticsListeners = new Set();
5315
+ let diagnostics = {
5316
+ namespace,
5317
+ reconnectAttempts: 0,
5318
+ nextRetryInMs: null,
5319
+ lastError: null,
5320
+ isPolling: false,
5321
+ disconnectNotified: false
5322
+ };
4079
5323
  const INITIAL_RETRY_DELAY_MS = 100;
4080
5324
  const MAX_RETRY_DELAY_MS = 2000;
4081
5325
  const DISCONNECT_NOTIFY_ATTEMPTS = 5;
5326
+ function updateDiagnostics(partial, notify = true) {
5327
+ diagnostics = {
5328
+ ...diagnostics,
5329
+ ...partial
5330
+ };
5331
+ if (!notify) return;
5332
+ for (const listener of diagnosticsListeners)listener(diagnostics);
5333
+ }
4082
5334
  function clearReconnectTimer() {
4083
5335
  if (reconnectTimeout) {
4084
5336
  clearTimeout(reconnectTimeout);
4085
5337
  reconnectTimeout = null;
5338
+ updateDiagnostics({
5339
+ isPolling: false,
5340
+ nextRetryInMs: null
5341
+ });
4086
5342
  }
4087
5343
  }
4088
5344
  function resetReconnectState() {
4089
5345
  reconnectAttempts = 0;
4090
5346
  hasNotifiedDisconnect = false;
5347
+ updateDiagnostics({
5348
+ reconnectAttempts: 0,
5349
+ nextRetryInMs: null,
5350
+ lastError: null,
5351
+ disconnectNotified: false
5352
+ });
4091
5353
  }
4092
5354
  function notifyDisconnectedOnce() {
4093
5355
  if (hasNotifiedDisconnect) return;
4094
5356
  hasNotifiedDisconnect = true;
5357
+ updateDiagnostics({
5358
+ disconnectNotified: true
5359
+ });
4095
5360
  onDisconnect?.();
4096
5361
  }
4097
5362
  function tryConnect() {
@@ -4112,16 +5377,31 @@ var __webpack_exports__ = {};
4112
5377
  onConnect?.(currentState, store);
4113
5378
  clearReconnectTimer();
4114
5379
  resetReconnectState();
5380
+ updateDiagnostics({
5381
+ lastError: null
5382
+ });
4115
5383
  return true;
4116
5384
  }
5385
+ updateDiagnostics({
5386
+ lastError: `Store "${namespace}" not found on window`
5387
+ });
4117
5388
  return false;
4118
5389
  }
4119
5390
  function scheduleReconnect(immediate = false) {
4120
5391
  if (store || reconnectTimeout) return;
4121
5392
  const delay = immediate ? 0 : Math.min(INITIAL_RETRY_DELAY_MS * 2 ** Math.min(reconnectAttempts, 5), MAX_RETRY_DELAY_MS);
5393
+ updateDiagnostics({
5394
+ isPolling: true,
5395
+ nextRetryInMs: delay,
5396
+ reconnectAttempts
5397
+ });
4122
5398
  reconnectTimeout = setTimeout(()=>{
4123
5399
  reconnectTimeout = null;
4124
5400
  reconnectAttempts++;
5401
+ updateDiagnostics({
5402
+ reconnectAttempts,
5403
+ nextRetryInMs: null
5404
+ });
4125
5405
  if (tryConnect()) return;
4126
5406
  if (reconnectAttempts >= DISCONNECT_NOTIFY_ATTEMPTS) notifyDisconnectedOnce();
4127
5407
  scheduleReconnect();
@@ -4143,6 +5423,14 @@ var __webpack_exports__ = {};
4143
5423
  listeners.delete(listener);
4144
5424
  };
4145
5425
  },
5426
+ getDiagnostics: ()=>diagnostics,
5427
+ subscribeDiagnostics: (listener)=>{
5428
+ diagnosticsListeners.add(listener);
5429
+ listener(diagnostics);
5430
+ return ()=>{
5431
+ diagnosticsListeners.delete(listener);
5432
+ };
5433
+ },
4146
5434
  retryConnection: ()=>{
4147
5435
  if (store) return;
4148
5436
  resetReconnectState();
@@ -4156,6 +5444,134 @@ var __webpack_exports__ = {};
4156
5444
  }
4157
5445
  store = null;
4158
5446
  listeners.clear();
5447
+ diagnosticsListeners.clear();
5448
+ }
5449
+ };
5450
+ }
5451
+ const REGISTRY_KEY = '__c15tDevToolsInstrumentationRegistry';
5452
+ let fallbackRegistry = null;
5453
+ function getRegistry() {
5454
+ if ('undefined' == typeof window) {
5455
+ if (!fallbackRegistry) fallbackRegistry = new Map();
5456
+ return fallbackRegistry;
5457
+ }
5458
+ const host = window;
5459
+ const existing = host[REGISTRY_KEY];
5460
+ if (existing) return existing;
5461
+ const registry = new Map();
5462
+ host[REGISTRY_KEY] = registry;
5463
+ return registry;
5464
+ }
5465
+ function getBlockedRequestMessage(payload) {
5466
+ const data = payload;
5467
+ const method = 'string' == typeof data?.method ? data.method.toUpperCase() : 'REQUEST';
5468
+ const url = 'string' == typeof data?.url ? data.url : 'unknown-url';
5469
+ return `Network blocked: ${method} ${url}`;
5470
+ }
5471
+ function emitEvent(entry, event) {
5472
+ for (const listener of entry.listeners)listener(event);
5473
+ }
5474
+ function ensureNetworkBlockerWrapped(entry) {
5475
+ const blocker = entry.store.getState().networkBlocker;
5476
+ if (!blocker) return;
5477
+ if (blocker.onRequestBlocked === entry.wrappedNetworkBlockedCallback) return;
5478
+ entry.originalNetworkBlockedCallback = blocker.onRequestBlocked;
5479
+ entry.wrappedNetworkBlockedCallback = (payload)=>{
5480
+ emitEvent(entry, {
5481
+ type: 'network',
5482
+ message: getBlockedRequestMessage(payload),
5483
+ data: payload
5484
+ });
5485
+ if ('function' == typeof entry.originalNetworkBlockedCallback) entry.originalNetworkBlockedCallback(payload);
5486
+ };
5487
+ entry.store.getState().setNetworkBlocker({
5488
+ ...blocker,
5489
+ onRequestBlocked: entry.wrappedNetworkBlockedCallback
5490
+ });
5491
+ }
5492
+ function restoreInstrumentation(entry) {
5493
+ entry.stopWatchingStore?.();
5494
+ entry.stopWatchingStore = null;
5495
+ const state = entry.store.getState();
5496
+ state.setCallback('onBannerFetched', entry.originalCallbacks.onBannerFetched);
5497
+ state.setCallback('onConsentSet', entry.originalCallbacks.onConsentSet);
5498
+ state.setCallback('onError', entry.originalCallbacks.onError);
5499
+ state.setCallback('onBeforeConsentRevocationReload', entry.originalCallbacks.onBeforeConsentRevocationReload);
5500
+ const blocker = state.networkBlocker;
5501
+ if (blocker && blocker.onRequestBlocked === entry.wrappedNetworkBlockedCallback) state.setNetworkBlocker({
5502
+ ...blocker,
5503
+ onRequestBlocked: entry.originalNetworkBlockedCallback
5504
+ });
5505
+ entry.wrappedNetworkBlockedCallback = null;
5506
+ }
5507
+ function createInstrumentationEntry(store) {
5508
+ const entry = {
5509
+ store,
5510
+ listeners: new Set(),
5511
+ originalCallbacks: {
5512
+ ...store.getState().callbacks
5513
+ },
5514
+ originalNetworkBlockedCallback: store.getState().networkBlocker?.onRequestBlocked,
5515
+ wrappedNetworkBlockedCallback: null,
5516
+ stopWatchingStore: null
5517
+ };
5518
+ store.getState().setCallback('onBannerFetched', (payload)=>{
5519
+ const jurisdiction = payload.jurisdiction;
5520
+ emitEvent(entry, {
5521
+ type: 'info',
5522
+ message: `Banner fetched: ${String(jurisdiction)}`,
5523
+ data: payload
5524
+ });
5525
+ if ('function' == typeof entry.originalCallbacks.onBannerFetched) entry.originalCallbacks.onBannerFetched(payload);
5526
+ });
5527
+ store.getState().setCallback('onConsentSet', (payload)=>{
5528
+ emitEvent(entry, {
5529
+ type: 'consent_set',
5530
+ message: 'Consent preferences updated',
5531
+ data: payload
5532
+ });
5533
+ if ('function' == typeof entry.originalCallbacks.onConsentSet) entry.originalCallbacks.onConsentSet(payload);
5534
+ });
5535
+ store.getState().setCallback('onError', (payload)=>{
5536
+ const errorMessage = payload.error;
5537
+ emitEvent(entry, {
5538
+ type: 'error',
5539
+ message: `Error: ${String(errorMessage)}`,
5540
+ data: payload
5541
+ });
5542
+ if ('function' == typeof entry.originalCallbacks.onError) entry.originalCallbacks.onError(payload);
5543
+ });
5544
+ store.getState().setCallback('onBeforeConsentRevocationReload', (payload)=>{
5545
+ emitEvent(entry, {
5546
+ type: 'info',
5547
+ message: 'Consent revocation - page will reload',
5548
+ data: payload
5549
+ });
5550
+ if ('function' == typeof entry.originalCallbacks.onBeforeConsentRevocationReload) entry.originalCallbacks.onBeforeConsentRevocationReload(payload);
5551
+ });
5552
+ ensureNetworkBlockerWrapped(entry);
5553
+ entry.stopWatchingStore = store.subscribe(()=>{
5554
+ ensureNetworkBlockerWrapped(entry);
5555
+ });
5556
+ return entry;
5557
+ }
5558
+ function store_instrumentation_registerStoreInstrumentation(options) {
5559
+ const { namespace, store, onEvent } = options;
5560
+ const registry = getRegistry();
5561
+ let entry = registry.get(namespace);
5562
+ if (!entry || entry.store !== store) {
5563
+ if (entry) restoreInstrumentation(entry);
5564
+ entry = createInstrumentationEntry(store);
5565
+ registry.set(namespace, entry);
5566
+ }
5567
+ entry.listeners.add(onEvent);
5568
+ return ()=>{
5569
+ const current = registry.get(namespace);
5570
+ if (!current) return;
5571
+ current.listeners.delete(onEvent);
5572
+ if (0 === current.listeners.size) {
5573
+ restoreInstrumentation(current);
5574
+ registry.delete(namespace);
4159
5575
  }
4160
5576
  };
4161
5577
  }
@@ -4179,39 +5595,36 @@ var __webpack_exports__ = {};
4179
5595
  function persistedOverridesEqual(a, b) {
4180
5596
  return a.country === b.country && a.region === b.region && a.language === b.language && a.gpc === b.gpc;
4181
5597
  }
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}`;
5598
+ function createStateCopy(state) {
5599
+ return {
5600
+ consents: state.consents,
5601
+ selectedConsents: state.selectedConsents,
5602
+ consentInfo: state.consentInfo,
5603
+ locationInfo: state.locationInfo,
5604
+ model: state.model,
5605
+ overrides: state.overrides,
5606
+ scripts: state.scripts?.map((script)=>({
5607
+ id: script.id
5608
+ })),
5609
+ loadedScripts: state.loadedScripts
5610
+ };
4187
5611
  }
4188
5612
  function createDevToolsPanel(options) {
4189
5613
  const { namespace = 'c15tStore' } = options;
4190
- let originalEmbeddedNetworkBlockedCallback;
4191
- let hasWrappedEmbeddedNetworkBlocker = false;
5614
+ let detachInstrumentation = null;
4192
5615
  const stateManager = state_manager_createStateManager({
4193
5616
  isOpen: true
4194
5617
  });
4195
5618
  const storeConnector = store_connector_createStoreConnector({
4196
5619
  namespace,
4197
5620
  onConnect: (state, store)=>{
5621
+ detachInstrumentation?.();
5622
+ detachInstrumentation = store_instrumentation_registerStoreInstrumentation({
5623
+ namespace,
5624
+ store,
5625
+ onEvent: (event)=>stateManager.addEvent(event)
5626
+ });
4198
5627
  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
5628
  const persistedOverrides = override_storage_loadPersistedOverrides();
4216
5629
  if (persistedOverrides) {
4217
5630
  const currentOverrides = normalizeOverridesForPersistence(state.overrides);
@@ -4223,7 +5636,36 @@ var __webpack_exports__ = {};
4223
5636
  });
4224
5637
  }
4225
5638
  },
4226
- onDisconnect: ()=>stateManager.setConnected(false)
5639
+ onDisconnect: ()=>{
5640
+ stateManager.setConnected(false);
5641
+ detachInstrumentation?.();
5642
+ detachInstrumentation = null;
5643
+ }
5644
+ });
5645
+ const panelRenderer = panel_renderer_createPanelRenderer({
5646
+ storeConnector,
5647
+ stateManager,
5648
+ enableEventLogging: false,
5649
+ onPersistOverrides: override_storage_persistOverrides,
5650
+ onClearPersistedOverrides: override_storage_clearPersistedOverrides,
5651
+ onCopyState: async (state)=>{
5652
+ try {
5653
+ await navigator.clipboard.writeText(JSON.stringify(createStateCopy(state), null, 2));
5654
+ return true;
5655
+ } catch {
5656
+ return false;
5657
+ }
5658
+ },
5659
+ onExportDebugBundle: ()=>{
5660
+ const bundle = debug_bundle_createDebugBundle({
5661
+ namespace,
5662
+ devToolsState: stateManager.getState(),
5663
+ connection: storeConnector.getDiagnostics(),
5664
+ recentEvents: stateManager.getState().eventLog.slice(0, 100),
5665
+ storeState: debug_bundle_sanitizeStoreState(storeConnector.getState())
5666
+ });
5667
+ debug_bundle_downloadDebugBundle(bundle);
5668
+ }
4227
5669
  });
4228
5670
  const container = renderer_div({
4229
5671
  style: {
@@ -4244,140 +5686,42 @@ var __webpack_exports__ = {};
4244
5686
  }
4245
5687
  });
4246
5688
  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;
5689
+ const activeTab = syncTabs();
5690
+ panelRenderer.renderPanel(contentArea, activeTab);
5691
+ }
5692
+ let tabsInstance = null;
5693
+ let iabDisabled = true;
5694
+ function getDisabledTabs() {
5695
+ const disabledTabs = [];
5696
+ const storeState = storeConnector.getState();
5697
+ if (!storeState || 'iab' !== storeState.model) disabledTabs.push('iab');
5698
+ return disabledTabs;
5699
+ }
5700
+ function syncTabs() {
5701
+ const disabledTabs = getDisabledTabs();
5702
+ const nextIabDisabled = disabledTabs.includes('iab');
5703
+ let activeTab = stateManager.getState().activeTab;
5704
+ if (disabledTabs.includes(activeTab)) {
5705
+ activeTab = 'consents';
5706
+ stateManager.setActiveTab(activeTab);
5707
+ }
5708
+ if (tabsInstance && iabDisabled === nextIabDisabled) tabsInstance.setActiveTab(activeTab);
5709
+ else {
5710
+ tabsInstance?.destroy();
5711
+ tabsInstance = tabs_createTabs({
5712
+ activeTab,
5713
+ onTabChange: (tab)=>{
5714
+ stateManager.setActiveTab(tab);
5715
+ renderActivePanel();
5716
+ },
5717
+ disabledTabs
5718
+ });
5719
+ iabDisabled = nextIabDisabled;
5720
+ if (!tabsInstance.element.parentElement) container.appendChild(tabsInstance.element);
4367
5721
  }
5722
+ return activeTab;
4368
5723
  }
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);
5724
+ syncTabs();
4381
5725
  container.appendChild(contentArea);
4382
5726
  renderActivePanel();
4383
5727
  const unsubscribe = storeConnector.subscribe(()=>{
@@ -4386,16 +5730,10 @@ var __webpack_exports__ = {};
4386
5730
  return {
4387
5731
  element: container,
4388
5732
  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
- }
5733
+ detachInstrumentation?.();
5734
+ detachInstrumentation = null;
4397
5735
  unsubscribe();
4398
- tabsInstance.destroy();
5736
+ tabsInstance?.destroy();
4399
5737
  storeConnector.destroy();
4400
5738
  stateManager.destroy();
4401
5739
  }