@backtrack-js/browser 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +291 -0
  3. package/bin/cli.cjs +51 -0
  4. package/bin/cli.js +2 -0
  5. package/bin/symbolize.cjs +654 -0
  6. package/bin/viewer.cjs +143 -0
  7. package/dist/capturers/console.d.ts +18 -0
  8. package/dist/capturers/console.d.ts.map +1 -0
  9. package/dist/capturers/errors.d.ts +22 -0
  10. package/dist/capturers/errors.d.ts.map +1 -0
  11. package/dist/capturers/index.d.ts +8 -0
  12. package/dist/capturers/index.d.ts.map +1 -0
  13. package/dist/capturers/navigation.d.ts +20 -0
  14. package/dist/capturers/navigation.d.ts.map +1 -0
  15. package/dist/capturers/network.d.ts +30 -0
  16. package/dist/capturers/network.d.ts.map +1 -0
  17. package/dist/capturers/performance.d.ts +15 -0
  18. package/dist/capturers/performance.d.ts.map +1 -0
  19. package/dist/capturers/route-matcher.d.ts +10 -0
  20. package/dist/capturers/route-matcher.d.ts.map +1 -0
  21. package/dist/capturers/rrweb.d.ts +18 -0
  22. package/dist/capturers/rrweb.d.ts.map +1 -0
  23. package/dist/capturers/sanitizer.d.ts +37 -0
  24. package/dist/capturers/sanitizer.d.ts.map +1 -0
  25. package/dist/core/flight-recorder.d.ts +75 -0
  26. package/dist/core/flight-recorder.d.ts.map +1 -0
  27. package/dist/core/state-machine.d.ts +55 -0
  28. package/dist/core/state-machine.d.ts.map +1 -0
  29. package/dist/index.cjs +1803 -0
  30. package/dist/index.cjs.map +1 -0
  31. package/dist/index.d.ts +17 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +5763 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/storage/batch-writer.d.ts +57 -0
  36. package/dist/storage/batch-writer.d.ts.map +1 -0
  37. package/dist/storage/db.d.ts +39 -0
  38. package/dist/storage/db.d.ts.map +1 -0
  39. package/dist/storage/incident-manager.d.ts +107 -0
  40. package/dist/storage/incident-manager.d.ts.map +1 -0
  41. package/dist/storage/index.d.ts +6 -0
  42. package/dist/storage/index.d.ts.map +1 -0
  43. package/dist/storage/retention.d.ts +41 -0
  44. package/dist/storage/retention.d.ts.map +1 -0
  45. package/dist/storage/session.d.ts +32 -0
  46. package/dist/storage/session.d.ts.map +1 -0
  47. package/dist/types/artifact.d.ts +72 -0
  48. package/dist/types/artifact.d.ts.map +1 -0
  49. package/dist/types/chunk.d.ts +32 -0
  50. package/dist/types/chunk.d.ts.map +1 -0
  51. package/dist/types/health.d.ts +16 -0
  52. package/dist/types/health.d.ts.map +1 -0
  53. package/dist/types/incident.d.ts +35 -0
  54. package/dist/types/incident.d.ts.map +1 -0
  55. package/dist/types/index.d.ts +8 -0
  56. package/dist/types/index.d.ts.map +1 -0
  57. package/dist/types/options.d.ts +84 -0
  58. package/dist/types/options.d.ts.map +1 -0
  59. package/dist/types/timeline.d.ts +74 -0
  60. package/dist/types/timeline.d.ts.map +1 -0
  61. package/dist/types/transport.d.ts +6 -0
  62. package/dist/types/transport.d.ts.map +1 -0
  63. package/dist/utils/compression.d.ts +28 -0
  64. package/dist/utils/compression.d.ts.map +1 -0
  65. package/dist/utils/gist-uploader.d.ts +12 -0
  66. package/dist/utils/gist-uploader.d.ts.map +1 -0
  67. package/dist/utils/markdown.d.ts +12 -0
  68. package/dist/utils/markdown.d.ts.map +1 -0
  69. package/dist/validation/validate.d.ts +27 -0
  70. package/dist/validation/validate.d.ts.map +1 -0
  71. package/dist/viewer/assets/backtrack-favico-Ds-TMW85.png +0 -0
  72. package/dist/viewer/assets/index-D6J82Kcf.js +191 -0
  73. package/dist/viewer/assets/index-cVrM07fr.css +1 -0
  74. package/dist/viewer/index.html +19 -0
  75. package/dist/widget/annotator.d.ts +85 -0
  76. package/dist/widget/annotator.d.ts.map +1 -0
  77. package/dist/widget/styles.d.ts +2 -0
  78. package/dist/widget/styles.d.ts.map +1 -0
  79. package/dist/widget/widget.d.ts +78 -0
  80. package/dist/widget/widget.d.ts.map +1 -0
  81. package/package.json +82 -0
@@ -0,0 +1 @@
1
+ :root{--bg-app: #090d16;--bg-surface: #0f172a;--bg-surface-elevated: #162032;--bg-surface-active: #1e293b;--bg-code: #050811;--bg-input: #090d16;--border-subtle: #1e293b;--border-strong: #334155;--border-focus: #3b82f6;--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--text-main: #f8fafc;--text-secondary: #94a3b8;--text-muted: #64748b;--text-dim: #475569;--blue-500: #2563eb;--blue-600: #1d4ed8;--blue-focus: #3b82f6;--red-500: #ef4444;--red-bg: rgba(239, 68, 68, .12);--red-border: rgba(239, 68, 68, .35);--red-text: #f87171;--amber-500: #f59e0b;--amber-bg: rgba(245, 158, 11, .12);--amber-border: rgba(245, 158, 11, .35);--amber-text: #fbbf24;--emerald-500: #10b981;--emerald-text: #34d399;--radius-sm: 4px;--radius-md: 6px}*{box-sizing:border-box;margin:0;padding:0}body{background-color:var(--bg-app);color:var(--text-secondary);font-family:var(--font-sans);font-size:13px;line-height:1.4;height:100vh;overflow:hidden;display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#root{height:100%;display:flex;flex-direction:column}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#334155;border-radius:var(--radius-sm)}::-webkit-scrollbar-thumb:hover{background:#475569}.app-container{display:flex;flex-direction:column;height:100%;background-color:var(--bg-app);overflow:hidden}.app-header{background-color:var(--bg-surface);border-bottom:1px solid var(--border-subtle);display:flex;flex-direction:column;flex-shrink:0;z-index:30}.header-primary-band{display:flex;justify-content:space-between;align-items:center;padding:8px 14px;border-bottom:1px solid rgba(30,41,59,.8);min-height:42px}.header-brand-wrap{display:flex;align-items:center;gap:8px;min-width:0}.brand-icon{display:inline-flex;align-items:center;justify-content:center;color:var(--blue-focus);flex-shrink:0}.brand-title{font-size:13px;font-weight:600;color:var(--text-main);letter-spacing:-.01em;white-space:nowrap}.brand-version-badge{font-family:var(--font-mono);font-size:10px;font-weight:500;padding:1px 5px;border-radius:var(--radius-sm);background-color:var(--bg-surface-active);color:var(--text-secondary);border:1px solid var(--border-subtle);flex-shrink:0}.incident-status-badge{display:inline-flex;align-items:center;padding:2px 7px;border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:11px;font-weight:500;background-color:var(--bg-surface-elevated);color:var(--text-secondary);border:1px solid var(--border-subtle);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:240px}.header-actions{display:flex;align-items:center;gap:8px;flex-shrink:0;margin-left:12px}.header-secondary-band{display:flex;align-items:center;padding:4px 14px;background-color:#0b1120;min-height:32px;overflow-x:auto}.incident-meta-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap;width:100%}.meta-chip{display:inline-flex;align-items:center;gap:5px;padding:2px 7px;border-radius:var(--radius-sm);background-color:var(--bg-surface);border:1px solid var(--border-subtle);font-family:var(--font-mono);font-size:11px;color:var(--text-secondary);white-space:nowrap;flex-shrink:0}.meta-label{color:var(--text-muted)}.meta-value{color:var(--text-main);font-weight:500}.meta-chip-btn{background-color:var(--bg-surface);cursor:pointer;transition:background-color .1s ease,border-color .1s ease;outline:none}.meta-chip-btn:hover{background-color:var(--bg-surface-elevated);border-color:var(--border-strong)}.meta-chip-btn:focus-visible{outline:2px solid var(--border-focus)}.meta-id{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:bottom}.meta-copied{color:var(--emerald-text);font-weight:700;margin-left:2px}.meta-chip-host{max-width:220px}.meta-chip-host .meta-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:160px;display:inline-block;vertical-align:bottom}.meta-chip-drops.is-warning{border-color:var(--red-border);background-color:var(--red-bg)}.meta-chip-drops.is-warning .meta-value{color:var(--red-text)}.btn-primary{display:inline-flex;align-items:center;justify-content:center;gap:6px;background-color:var(--blue-500);color:#fff;border:1px solid var(--blue-600);border-radius:var(--radius-md);padding:6px 14px;font-family:var(--font-sans);font-size:12px;font-weight:500;cursor:pointer;transition:background-color .1s ease;-webkit-user-select:none;user-select:none;outline:none}.btn-primary:hover{background-color:var(--blue-600)}.btn-primary:focus-visible{outline:2px solid var(--blue-focus);outline-offset:1px}.btn-secondary{display:inline-flex;align-items:center;justify-content:center;gap:6px;background-color:var(--bg-surface-active);color:var(--text-main);border:1px solid var(--border-strong);border-radius:var(--radius-md);padding:4px 10px;font-family:var(--font-sans);font-size:11px;font-weight:500;cursor:pointer;transition:background-color .1s ease,border-color .1s ease;-webkit-user-select:none;user-select:none;outline:none}.btn-secondary:hover{background-color:#27354f;border-color:#475569}.btn-secondary:focus-visible{outline:2px solid var(--blue-focus);outline-offset:1px}.mobile-tab-nav{display:none}@media (max-width: 960px){.mobile-tab-nav{display:flex;background-color:var(--bg-surface);border-bottom:1px solid var(--border-subtle);padding:4px 10px;gap:6px;flex-shrink:0}.mobile-tab-btn{flex:1;background-color:transparent;color:var(--text-muted);border:1px solid transparent;border-radius:var(--radius-md);padding:6px 12px;font-family:var(--font-sans);font-size:12px;font-weight:500;cursor:pointer;text-align:center;transition:background-color .1s ease,color .1s ease;outline:none}.mobile-tab-btn:hover{color:var(--text-main);background-color:var(--bg-surface-elevated)}.mobile-tab-btn.is-active{background-color:var(--bg-surface-active);color:var(--text-main);border-color:var(--border-strong);font-weight:600}.mobile-tab-btn:focus-visible{outline:2px solid var(--blue-focus)}}.main-layout{display:flex;flex:1;overflow:hidden;padding:10px;gap:10px;background-color:var(--bg-app)}.pane-wrapper{display:flex;flex-direction:column;min-height:0}.replay-wrapper{flex:1.35;min-width:0}.timeline-wrapper{width:460px;flex-shrink:0}@media (min-width: 961px){.pane-wrapper.mobile-hidden{display:flex!important}}@media (max-width: 960px){.main-layout{flex-direction:column;padding:6px;gap:6px}.replay-wrapper,.timeline-wrapper{width:100%!important;flex:1}.pane-wrapper.mobile-hidden{display:none!important}}.replay-pane{flex:1;display:flex;flex-direction:column;background-color:var(--bg-surface);border-radius:var(--radius-md);border:1px solid var(--border-subtle);overflow:hidden;min-height:0}.replay-container{flex:1;display:flex;align-items:center;justify-content:center;overflow:auto;position:relative;padding:12px;background-color:#070a12}.replay-scaler-frame{position:relative;background-color:#000;border-radius:var(--radius-md);border:1px solid var(--border-strong);overflow:hidden;flex-shrink:0;transition:width .1s ease,height .1s ease}.replay-top-overlay{position:absolute;top:8px;left:8px;z-index:30;display:flex;align-items:center;gap:6px;pointer-events:none}.scale-pill{display:inline-flex;align-items:center;padding:2px 6px;border-radius:var(--radius-sm);background-color:#090d16d9;border:1px solid var(--border-strong);font-family:var(--font-mono);font-size:11px;color:var(--text-secondary)}.replay-frame-wrapper{transform-origin:top left;position:relative;background-color:#fff}.replayer-wrapper{position:relative!important;width:100%!important;height:100%!important;overflow:hidden}.replayer-wrapper iframe{position:absolute!important;top:0!important;left:0!important;width:100%!important;height:100%!important;border:none!important;outline:none!important;background-color:#fff!important;display:block!important;z-index:1!important}.replayer-mouse-tail{position:absolute!important;top:0!important;left:0!important;pointer-events:none!important;z-index:10!important}.replayer-mouse{position:absolute!important;z-index:20!important;pointer-events:none!important}.player-controls-bar{background-color:#0b101c;border-top:1px solid var(--border-subtle);padding:8px 12px;display:flex;flex-direction:column;gap:8px;flex-shrink:0;z-index:20}.scrubber-track-container{position:relative;width:100%;height:14px;display:flex;align-items:center;cursor:pointer}.scrubber-track-bg{position:relative;width:100%;height:4px;background-color:#1e293b;border-radius:2px;overflow:visible}.scrubber-fill{height:100%;background-color:var(--blue-500);border-radius:2px;position:relative;pointer-events:none}.scrubber-thumb-indicator{position:absolute;right:-5px;top:50%;transform:translateY(-50%);width:10px;height:10px;border-radius:50%;background-color:#fff;border:2px solid var(--blue-500)}.milestone-marker{position:absolute;top:50%;transform:translate(-50%,-50%);width:7px;height:7px;border-radius:50%;border:1px solid #0b101c;cursor:pointer;transition:transform .1s ease,box-shadow .1s ease;z-index:15;pointer-events:auto}.milestone-marker:hover{transform:translate(-50%,-50%) scale(2);box-shadow:0 0 8px #fff9;z-index:25}.marker-network{background-color:var(--text-secondary)}.marker-console{background-color:var(--amber-500)}.marker-error{background-color:var(--red-500);box-shadow:0 0 5px #ef4444cc}.marker-navigation{background-color:var(--text-secondary)}.marker-generic{background-color:#64748b}.seek-slider-overlay{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;margin:0;z-index:10}.scrubber-hover-tooltip{position:absolute;bottom:calc(100% + 8px);transform:translate(-50%);background-color:#0f172a;color:#f8fafc;border:1px solid #334155;border-radius:4px;padding:4px 8px;font-family:var(--font-mono);font-size:11px;white-space:nowrap;pointer-events:none;z-index:40;box-shadow:0 4px 14px #0009;display:flex;flex-direction:column;align-items:center;gap:2px;max-width:320px;animation:tooltipFadeIn .08s ease-out}.scrubber-hover-tooltip:after{content:"";position:absolute;top:100%;left:50%;transform:translate(-50%);border-width:4px;border-style:solid;border-color:#334155 transparent transparent transparent}@keyframes tooltipFadeIn{0%{opacity:0;transform:translate(-50%,2px)}to{opacity:1;transform:translate(-50%)}}.scrubber-hover-tooltip .tooltip-time{font-weight:700;color:#38bdf8;letter-spacing:.5px}.scrubber-hover-tooltip .tooltip-event{font-family:var(--font-sans);font-size:10px;color:#cbd5e1;max-width:280px;overflow:hidden;text-overflow:ellipsis}.scrubber-hover-tooltip .tooltip-event.is-error{color:#fca5a5;font-weight:600}.jump-feedback-toast{font-size:11px;font-family:var(--font-mono);color:#fca5a5;background-color:#ef444426;border:1px solid rgba(239,68,68,.35);padding:2px 8px;border-radius:var(--radius-sm);max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;animation:tooltipFadeIn .15s ease-out}.btn-jump-error.is-no-error{opacity:.7;border-color:#94a3b84d;color:var(--text-secondary);background-color:#94a3b81a}.btn-jump-error.is-no-error:hover{opacity:1;background-color:#94a3b833;color:var(--text-main);border-color:var(--border-subtle)}.controls-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px}.controls-left-group{display:flex;align-items:center;gap:8px}.btn-play-pause{height:26px;padding:0 10px;border-radius:var(--radius-sm);background-color:var(--text-main);color:#0b0f17;font-family:var(--font-sans);font-size:11px;font-weight:600;border:1px solid var(--text-main);cursor:pointer;display:inline-flex;align-items:center;gap:4px;transition:background-color .1s ease;outline:none}.btn-play-pause:hover{background-color:#e2e8f0}.btn-play-pause:focus-visible{outline:2px solid var(--blue-focus)}.step-buttons-group{display:flex;align-items:center;background-color:var(--bg-surface);border-radius:var(--radius-sm);padding:1px;border:1px solid var(--border-subtle)}.btn-step{height:22px;padding:0 6px;font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--text-secondary);background:transparent;border:none;border-radius:2px;cursor:pointer;transition:background-color .1s ease,color .1s ease;outline:none}.btn-step:hover{color:var(--text-main);background-color:var(--bg-surface-elevated)}.btn-step:focus-visible{outline:2px solid var(--blue-focus)}.btn-step-frame{font-weight:600;color:#38bdf8;padding:0 7px}.btn-step-frame:hover{background-color:#38bdf826;color:#7dd3fc}.btn-jump-error{height:26px;padding:0 9px;border-radius:var(--radius-sm);background-color:#ef444424;color:#fca5a5;font-family:var(--font-sans);font-size:11px;font-weight:600;border:1px solid rgba(239,68,68,.45);cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:all .12s ease;outline:none}.btn-jump-error:hover{background-color:#ef4444;color:#fff;border-color:#ef4444}.btn-jump-error:focus-visible{outline:2px solid var(--red-border)}.step-divider{width:1px;height:12px;background-color:var(--border-subtle);margin:0 1px}.time-display{display:flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--radius-sm);background-color:var(--bg-surface);border:1px solid var(--border-subtle);font-family:var(--font-mono);font-size:11px}.time-current{color:var(--text-main);font-weight:600}.time-divider{color:var(--text-dim)}.time-total{color:var(--text-muted)}.controls-right-group{display:flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:11px}.control-item{display:flex;align-items:center;gap:4px}.control-label{color:var(--text-muted)}.control-select{background-color:var(--bg-surface);border:1px solid var(--border-subtle);color:var(--text-main);border-radius:var(--radius-sm);padding:2px 6px;font-family:var(--font-mono);font-size:11px;cursor:pointer;outline:none}.control-select:focus-visible{border-color:var(--blue-focus);outline:1px solid var(--blue-focus)}.timeline-pane{flex:1;display:flex;flex-direction:column;background-color:var(--bg-surface);border-radius:var(--radius-md);border:1px solid var(--border-subtle);overflow:hidden;min-height:0}.timeline-header{padding:8px 10px;border-bottom:1px solid var(--border-subtle);background-color:#0b101c;display:flex;flex-direction:column;gap:8px;flex-shrink:0}.search-input-wrap{position:relative;display:flex;align-items:center}.search-icon{position:absolute;left:8px;color:var(--text-muted);pointer-events:none;display:flex}.timeline-search{width:100%;background-color:var(--bg-input);border:1px solid var(--border-subtle);border-radius:var(--radius-sm);color:var(--text-main);font-family:var(--font-sans);font-size:12px;padding:5px 8px 5px 28px;outline:none}.timeline-search:focus{border-color:var(--blue-focus)}.filter-tabs-row{display:flex;align-items:center;gap:3px;overflow-x:auto}.filter-tab{display:inline-flex;align-items:center;gap:5px;padding:3px 8px;border-radius:var(--radius-sm);font-family:var(--font-sans);font-size:11px;font-weight:500;color:var(--text-muted);background-color:transparent;border:1px solid transparent;cursor:pointer;white-space:nowrap;outline:none}.filter-tab:hover{color:var(--text-secondary);background-color:var(--bg-surface-elevated)}.filter-tab.active{background-color:var(--bg-surface-active);color:var(--text-main);border-color:var(--border-strong);font-weight:600}.filter-tab:focus-visible{outline:2px solid var(--blue-focus)}.tab-count{font-family:var(--font-mono);font-size:10px;padding:0 4px;border-radius:2px;background-color:var(--bg-app);color:var(--text-secondary)}.tab-count-error{background-color:var(--red-bg);color:var(--red-text)}.tab-count-network{background-color:var(--bg-surface-active);color:var(--text-secondary)}.timeline-list{flex:1;overflow-y:auto;padding:4px;display:flex;flex-direction:column;gap:1px}.timeline-item{display:flex;flex-direction:column;padding:5px 8px;border-radius:var(--radius-sm);border:1px solid transparent;border-left:3px solid transparent;background-color:transparent;cursor:pointer;outline:none;transition:background-color .1s ease}.timeline-item:hover{background-color:var(--bg-surface-elevated)}.timeline-item.active{background-color:var(--bg-surface-elevated);border-left-color:var(--blue-500)}.timeline-item:focus-visible{outline:2px solid var(--blue-focus)}.timeline-row-main{display:flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:11px;min-width:0}.timeline-col-time{color:var(--text-muted);width:52px;flex-shrink:0}.timeline-col-badge-wrap{flex-shrink:0}.timeline-badge{display:inline-block;padding:1px 4px;border-radius:2px;font-family:var(--font-mono);font-size:10px;font-weight:500;line-height:1.2}.badge-neutral{background-color:var(--bg-surface-active);color:var(--text-secondary);border:1px solid var(--border-subtle)}.badge-warn{background-color:var(--amber-bg);color:var(--amber-text);border:1px solid var(--amber-border)}.badge-error{background-color:var(--red-bg);color:var(--red-text);border:1px solid var(--red-border)}.timeline-col-summary{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-secondary)}.timeline-summary-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.timeline-summary-text.is-error{color:var(--red-text)}.timeline-col-status{flex-shrink:0;text-align:right;font-size:10.5px}.timeline-col-meta{color:var(--text-muted)}.timeline-col-meta.is-error{color:var(--red-text)}.timeline-details-panel{margin-top:6px;padding:6px 8px;background-color:var(--bg-code);border:1px solid var(--border-subtle);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:11px;color:var(--text-secondary)}.details-row{margin-bottom:3px;word-break:break-all}.details-url{color:var(--text-main)}.details-code{margin-top:4px;padding:6px;background-color:var(--bg-app);border-radius:2px;border:1px solid var(--border-subtle);overflow-x:auto;white-space:pre-wrap;word-break:break-all;font-size:10.5px}.details-error-code{color:var(--red-text)}.timeline-empty-message{padding:24px;text-align:center;color:var(--text-muted);font-size:12px}.timeline-footer{padding:6px 10px;border-top:1px solid var(--border-subtle);background-color:#0b101c;display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--text-muted);flex-shrink:0}.timeline-footer-status{color:var(--text-muted)}.timeline-footer-count{font-family:var(--font-mono);color:var(--text-dim)}.importer-wrapper{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:20px;background-color:var(--bg-app)}.dropzone{border:1px dashed var(--border-strong);border-radius:var(--radius-md);padding:40px 24px;text-align:center;max-width:480px;width:100%;background-color:var(--bg-surface);cursor:pointer;transition:border-color .1s ease,background-color .1s ease;outline:none}.dropzone:hover,.dropzone.dragover{border-color:var(--blue-focus);background-color:var(--bg-surface-elevated)}.dropzone:focus-visible{outline:2px solid var(--blue-focus)}.dropzone-icon{margin-bottom:12px;color:var(--blue-focus);display:flex;justify-content:center}.dropzone h2{font-size:16px;font-weight:600;margin-bottom:6px;color:var(--text-main);letter-spacing:-.01em}.dropzone-description{color:var(--text-secondary);font-size:12px;margin-bottom:18px;line-height:1.5}.importer-hint{color:var(--text-muted);font-size:11px;margin-top:14px;line-height:1.4}.import-error{margin-top:14px;background-color:var(--red-bg);color:var(--red-text);border:1px solid var(--red-border);border-radius:var(--radius-md);padding:10px 14px;max-width:480px;width:100%;font-size:11px;font-family:var(--font-mono)}.import-error ul{margin-top:6px;padding-left:16px}.resolved-stack{margin-top:8px;display:flex;flex-direction:column;gap:6px}.resolved-frame{background-color:var(--bg-app);border:1px solid var(--border-subtle);border-radius:var(--radius-sm);overflow:hidden}.resolved-frame>summary{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;cursor:pointer;background-color:var(--bg-surface-elevated);font-family:var(--font-mono);font-size:11px;color:var(--text-main);-webkit-user-select:none;user-select:none}.resolved-frame>summary:focus-visible{outline:2px solid var(--border-focus);outline-offset:-2px}.resolved-frame-location{display:flex;align-items:center;gap:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.resolved-frame-copy{background:transparent;border:1px solid var(--border-subtle);color:var(--text-secondary);font-size:10px;padding:2px 6px;border-radius:3px;cursor:pointer;font-family:var(--font-sans)}.resolved-frame-copy:hover{background:var(--bg-surface-active);color:var(--text-main);border-color:var(--border-strong)}.resolved-frame-copy:focus-visible{outline:2px solid var(--border-focus)}.source-context{overflow-x:auto;background-color:var(--bg-code);font-family:var(--font-mono);font-size:11px;line-height:1.5}.source-context pre{margin:0;padding:6px 0}.source-context code{display:block;font-family:inherit}.source-line{display:flex;padding:0 10px;min-width:fit-content}.source-line-active{background-color:#ef444426;border-left:2px solid var(--red-500)}.source-line-number{display:inline-block;width:44px;text-align:right;padding-right:12px;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex-shrink:0;border-right:1px solid var(--border-subtle);margin-right:12px}.source-line-active .source-line-number{color:var(--red-text);font-weight:600}.source-line-content{color:var(--text-secondary);white-space:pre}.source-line-active .source-line-content{color:var(--text-main);font-weight:500}.source-line-pointer .source-line-number{border-right:1px solid transparent}.source-line-pointer .source-line-content{color:var(--red-text);font-weight:700}.details-original-stack{margin-top:8px}.details-original-stack>summary{font-size:11px;color:var(--text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none}.replayer-wrapper{position:relative}.replayer-mouse{position:absolute;width:20px;height:20px;transition:left .05s linear,top .05s linear;background-size:contain;background-position:center center;background-repeat:no-repeat;background-image:url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9JzMwMHB4JyB3aWR0aD0nMzAwcHgnICBmaWxsPSIjMDAwMDAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGRhdGEtbmFtZT0iTGF5ZXIgMSIgdmlld0JveD0iMCAwIDUwIDUwIiB4PSIwcHgiIHk9IjBweCI+PHRpdGxlPkRlc2lnbl90bnA8L3RpdGxlPjxwYXRoIGQ9Ik00OC43MSw0Mi45MUwzNC4wOCwyOC4yOSw0NC4zMywxOEExLDEsMCwwLDAsNDQsMTYuMzlMMi4zNSwxLjA2QTEsMSwwLDAsMCwxLjA2LDIuMzVMMTYuMzksNDRhMSwxLDAsMCwwLDEuNjUuMzZMMjguMjksMzQuMDgsNDIuOTEsNDguNzFhMSwxLDAsMCwwLDEuNDEsMGw0LjM4LTQuMzhBMSwxLDAsMCwwLDQ4LjcxLDQyLjkxWm0tNS4wOSwzLjY3TDI5LDMyYTEsMSwwLDAsMC0xLjQxLDBsLTkuODUsOS44NUwzLjY5LDMuNjlsMzguMTIsMTRMMzIsMjcuNThBMSwxLDAsMCwwLDMyLDI5TDQ2LjU5LDQzLjYyWiI+PC9wYXRoPjwvc3ZnPg==);border-color:transparent}.replayer-mouse:after{content:"";display:inline-block;width:20px;height:20px;background:#4950f6;border-radius:100%;transform:translate(-50%,-50%);opacity:.3}.replayer-mouse.active:after{animation:click .2s ease-in-out 1}.replayer-mouse.touch-device{background-image:none;width:70px;height:70px;border-width:4px;border-style:solid;border-radius:100%;margin-left:-37px;margin-top:-37px;border-color:#4950f600;transition:left 0s linear,top 0s linear,border-color .2s ease-in-out}.replayer-mouse.touch-device.touch-active{border-color:#4950f6;transition:left .25s linear,top .25s linear,border-color .2s ease-in-out}.replayer-mouse.touch-device:after{opacity:0}.replayer-mouse.touch-device.active:after{animation:touch-click .2s ease-in-out 1}.replayer-mouse-tail{position:absolute;pointer-events:none}@keyframes click{0%{opacity:.3;width:20px;height:20px}50%{opacity:.5;width:10px;height:10px}}@keyframes touch-click{0%{opacity:0;width:20px;height:20px}50%{opacity:.5;width:10px;height:10px}}
@@ -0,0 +1,19 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <!-- CSP: Permite carregamento de gists remotos (GitHub API e gist.githubusercontent.com) e fontes seguras -->
7
+ <meta
8
+ http-equiv="Content-Security-Policy"
9
+ content="default-src 'self' 'unsafe-inline'; connect-src 'self' https://api.github.com https://gist.githubusercontent.com blob: data:; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src data: 'self' https: https://fonts.gstatic.com; img-src data: blob: 'self' http: https:; media-src 'none'; frame-src 'self' blob: data: about:; object-src 'none';"
10
+ />
11
+ <title>Backtrack Viewer</title>
12
+ <link rel="icon" type="image/png" href="/assets/backtrack-favico-Ds-TMW85.png" />
13
+ <script type="module" crossorigin src="/assets/index-D6J82Kcf.js"></script>
14
+ <link rel="stylesheet" crossorigin href="/assets/index-cVrM07fr.css">
15
+ </head>
16
+ <body>
17
+ <div id="root"></div>
18
+ </body>
19
+ </html>
@@ -0,0 +1,85 @@
1
+ export interface ScreenAnnotatorResult {
2
+ dataUrl: string;
3
+ notes?: string;
4
+ }
5
+ export type AnnotatorTool = 'select' | 'pen' | 'rect' | 'arrow' | 'ruler' | 'text';
6
+ export interface AnnotationItem {
7
+ id: string;
8
+ type: AnnotatorTool;
9
+ color: string;
10
+ x1: number;
11
+ y1: number;
12
+ x2: number;
13
+ y2: number;
14
+ text?: string;
15
+ note?: string;
16
+ label?: string;
17
+ points?: {
18
+ x: number;
19
+ y: number;
20
+ }[];
21
+ }
22
+ export declare class ScreenAnnotator {
23
+ private overlay;
24
+ private canvas;
25
+ private ctx;
26
+ private tool;
27
+ private color;
28
+ private items;
29
+ private historyStack;
30
+ private selectedItemId;
31
+ private isMouseDown;
32
+ private isDraggingItem;
33
+ private dragStartX;
34
+ private dragStartY;
35
+ private activeDrawStart;
36
+ private activePoints;
37
+ private activePopover;
38
+ private onComplete;
39
+ open(onComplete: (result: ScreenAnnotatorResult | null) => void): void;
40
+ private handlePointerDown;
41
+ private handlePointerMove;
42
+ private handlePointerUp;
43
+ private getToolBtnStyle;
44
+ private getShortcutBadgeStyle;
45
+ private getColorBtnStyle;
46
+ private getActionBtnStyle;
47
+ private selectTool;
48
+ private setupToolbarEvents;
49
+ private handleDone;
50
+ /**
51
+ * Redesenha todos os objetos do canvas
52
+ */
53
+ private redraw;
54
+ private drawLivePen;
55
+ private drawLiveRect;
56
+ private drawLiveArrow;
57
+ private drawLiveRuler;
58
+ /**
59
+ * Renderiza cota técnica com o badge DESLOCADO por 18px perpendicularmente à linha,
60
+ * para NUNCA encobrir ou obstruir a seta / linha de medição!
61
+ */
62
+ private renderTechnicalRuler;
63
+ private renderTextItem;
64
+ /**
65
+ * Desenha moldura sutil de seleção para indicar que o elemento pode ser arrastado
66
+ */
67
+ private drawSelectionOutline;
68
+ /**
69
+ * Encontra qual elemento está na coordenada (x, y)
70
+ */
71
+ private findItemAt;
72
+ private distToSegment;
73
+ /**
74
+ * Popover de confirmação/edição da régua posicionado de forma limpa SEM encobrir a régua
75
+ */
76
+ private openRulerConfirmPopover;
77
+ private openTextInput;
78
+ private closePopover;
79
+ private roundRect;
80
+ private recordHistory;
81
+ private undo;
82
+ private clear;
83
+ close(): void;
84
+ }
85
+ //# sourceMappingURL=annotator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotator.d.ts","sourceRoot":"","sources":["../../src/widget/annotator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAEnF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACrC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,GAAG,CAAyC;IACpD,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,KAAK,CAAa;IAG1B,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,cAAc,CAAuB;IAG7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAkC;IAGtD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,UAAU,CAAiE;IAE5E,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;IAiT7E,OAAO,CAAC,iBAAiB;IAqCzB,OAAO,CAAC,iBAAiB;IA2DzB,OAAO,CAAC,eAAe;IA4GvB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,kBAAkB;IAgE1B,OAAO,CAAC,UAAU;IAoClB;;OAEG;IACH,OAAO,CAAC,MAAM;IA0Cd,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,aAAa;IAmBrB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA+E5B,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsC5B;;OAEG;IACH,OAAO,CAAC,UAAU;IA2BlB,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA4E/B,OAAO,CAAC,aAAa;IAkFrB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,IAAI;IAkBZ,OAAO,CAAC,KAAK;IAQN,KAAK,IAAI,IAAI;CAYrB"}
@@ -0,0 +1,2 @@
1
+ export declare const WIDGET_CSS = "\n/* ==========================================================================\n Backtrack Trigger Widget \u2014 Dark Theme Design System (Shadow DOM)\n ========================================================================== */\n\n:host, .backtrack-root {\n --bt-surface-bg: #0f1117;\n --bt-surface-card: #161a23;\n --bt-surface-elevated: #1e2430;\n --bt-surface-input: #131720;\n --bt-border: #262d3d;\n --bt-border-subtle: #1c212c;\n --bt-text-primary: #f8fafc;\n --bt-text-muted: #94a3b8;\n --bt-text-dim: #64748b;\n --bt-accent: #2563eb;\n --bt-accent-hover: #1d4ed8;\n --bt-accent-muted: rgba(37, 99, 235, 0.16);\n --bt-status-online: #22c55e;\n --bt-bg-success: rgba(34, 197, 94, 0.12);\n --bt-text-success: #22c55e;\n --bt-border-success: rgba(34, 197, 94, 0.4);\n --bt-bg-danger: rgba(239, 68, 68, 0.12);\n --bt-text-danger: #ef4444;\n --bt-border-danger: rgba(239, 68, 68, 0.4);\n --bt-radius-lg: 12px;\n --bt-radius-md: 8px;\n --bt-radius-sm: 6px;\n --bt-font: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n --bt-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n\n all: initial;\n position: fixed;\n bottom: max(16px, env(safe-area-inset-bottom, 16px));\n left: max(16px, env(safe-area-inset-left, 16px));\n z-index: 999999;\n font-family: var(--bt-font);\n color: var(--bt-text-primary);\n box-sizing: border-box;\n}\n\n*, *::before, *::after {\n box-sizing: border-box;\n}\n\n.backtrack-root {\n position: relative;\n}\n\n/* Launcher Flutuante */\n.backtrack-launcher-btn {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 38px;\n height: 38px;\n padding: 0;\n background-color: var(--bt-surface-bg);\n color: var(--bt-text-primary);\n border: 1px solid var(--bt-border);\n border-radius: var(--bt-radius-sm);\n cursor: pointer;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);\n transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;\n user-select: none;\n touch-action: manipulation;\n outline: none;\n}\n\n.backtrack-launcher-btn:hover {\n background-color: var(--bt-surface-elevated);\n border-color: var(--bt-accent);\n color: var(--bt-accent);\n}\n\n.backtrack-launcher-btn:focus-visible {\n outline: 2px solid var(--bt-accent);\n outline-offset: 1px;\n}\n\n.backtrack-launcher-btn:active {\n transform: translateY(1px);\n}\n\n.backtrack-launcher-status-dot {\n position: absolute;\n bottom: 3px;\n right: 3px;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n border: 1px solid var(--bt-surface-bg);\n display: inline-block;\n pointer-events: none;\n}\n\n.backtrack-status-recording {\n background-color: #22c55e;\n box-shadow: 0 0 5px #22c55e;\n}\n\n.backtrack-status-degraded {\n background-color: #f59e0b;\n box-shadow: 0 0 4px #f59e0b;\n}\n\n.backtrack-status-idle {\n background-color: #64748b;\n}\n\n.backtrack-incident-badge-count {\n position: absolute;\n top: -4px;\n right: -4px;\n background-color: #ef4444;\n color: #ffffff;\n border: 1px solid var(--bt-surface-bg);\n border-radius: 4px;\n padding: 0 4px;\n font-family: var(--bt-font-mono);\n font-size: 9px;\n font-weight: 700;\n line-height: 13px;\n pointer-events: none;\n}\n\n/* Painel Modal / Drawer */\n.backtrack-panel {\n position: fixed;\n bottom: 60px;\n left: 16px;\n width: 340px;\n max-height: 540px;\n background-color: var(--bt-surface-bg);\n border: 1px solid var(--bt-border);\n border-radius: var(--bt-radius-lg);\n box-shadow: 0 14px 36px rgba(0, 0, 0, 0.65);\n z-index: 999999;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n font-family: var(--bt-font);\n animation: backtrackFadeIn 0.15s ease-out;\n}\n\n@keyframes backtrackFadeIn {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* 1. Cabe\u00E7alho do Painel */\n.backtrack-panel-header {\n background-color: transparent;\n border-bottom: 1px solid var(--bt-border);\n padding: 12px 14px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.backtrack-header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.backtrack-header-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--bt-text-primary);\n letter-spacing: -0.01em;\n}\n\n.backtrack-header-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: var(--bt-status-online);\n flex-shrink: 0;\n}\n\n.backtrack-header-right {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.backtrack-header-icon-btn {\n background: transparent;\n border: none;\n color: var(--bt-text-muted);\n width: 20px;\n height: 20px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n padding: 0;\n transition: color 0.12s ease;\n outline: none;\n}\n\n.backtrack-header-icon-btn:hover {\n color: var(--bt-text-primary);\n}\n\n.backtrack-storage-tooltip-trigger {\n color: var(--bt-text-muted);\n cursor: help;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: color 0.12s ease;\n}\n\n.backtrack-storage-tooltip-trigger:hover {\n color: var(--bt-text-primary);\n}\n\n/* Menu de 3 Pontos do Cabe\u00E7alho */\n.backtrack-header-menu-wrap {\n position: relative;\n display: inline-flex;\n}\n\n.backtrack-header-menu {\n position: absolute;\n top: calc(100% + 8px);\n right: 0;\n background-color: var(--bt-surface-card);\n border: 1px solid var(--bt-border);\n border-radius: var(--bt-radius-md);\n box-shadow: 0 10px 25px rgba(0, 0, 0, 0.6);\n min-width: 190px;\n z-index: 1000;\n padding: 5px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.backtrack-header-menu-info {\n padding: 8px 10px 6px 10px;\n font-size: 11px;\n color: var(--bt-text-muted);\n font-family: var(--bt-font-mono);\n border-bottom: 1px solid var(--bt-border);\n margin-bottom: 4px;\n}\n\n.backtrack-header-menu-item {\n background: transparent;\n border: none;\n border-radius: var(--bt-radius-sm);\n padding: 8px 10px;\n color: var(--bt-text-primary);\n font-size: 12px;\n text-align: left;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: background-color 0.1s ease, color 0.1s ease;\n width: 100%;\n}\n\n.backtrack-header-menu-item:hover {\n background-color: var(--bt-surface-elevated);\n color: #ffffff;\n}\n\n/* Corpo do Painel */\n.backtrack-panel-body {\n padding: 12px 14px;\n overflow-y: auto;\n flex: 1;\n scrollbar-width: thin;\n scrollbar-color: #334155 transparent;\n}\n\n.backtrack-panel-body::-webkit-scrollbar {\n width: 5px;\n}\n\n.backtrack-panel-body::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.backtrack-panel-body::-webkit-scrollbar-thumb {\n background-color: #334155;\n border-radius: 4px;\n}\n\n.backtrack-panel-body::-webkit-scrollbar-thumb:hover {\n background-color: #475569;\n}\n\n/* Banner Inline (Sucesso / Falha) */\n.backtrack-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n border-radius: var(--bt-radius-md);\n padding: 10px 12px;\n margin-bottom: 12px;\n font-size: 13px;\n line-height: 1.4;\n animation: backtrackFadeIn 0.15s ease-out;\n}\n\n.backtrack-banner-success {\n background-color: var(--bt-bg-success);\n color: var(--bt-text-success);\n}\n\n.backtrack-banner-danger {\n background-color: var(--bt-bg-danger);\n color: var(--bt-text-danger);\n}\n\n.backtrack-banner-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.backtrack-banner-success .backtrack-banner-icon {\n color: var(--bt-text-success);\n}\n\n.backtrack-banner-danger .backtrack-banner-icon {\n color: var(--bt-text-danger);\n}\n\n.backtrack-banner-text {\n flex: 1;\n font-weight: 500;\n font-size: 13px;\n}\n\n.backtrack-banner-close {\n background: transparent;\n border: none;\n padding: 2px 4px;\n cursor: pointer;\n opacity: 0.7;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n transition: opacity 0.12s ease;\n outline: none;\n}\n\n.backtrack-banner-success .backtrack-banner-close {\n color: var(--bt-text-success);\n}\n\n.backtrack-banner-danger .backtrack-banner-close {\n color: var(--bt-text-danger);\n}\n\n.backtrack-banner-close:hover {\n opacity: 1;\n}\n\n/* Toast Flutuante (Sobreposto e Tempor\u00E1rio) */\n.backtrack-toast-wrap {\n position: absolute;\n bottom: 14px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1000;\n pointer-events: none;\n width: max-content;\n max-width: calc(100% - 28px);\n animation: backtrackToastIn 0.2s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes backtrackToastIn {\n from {\n opacity: 0;\n transform: translate(-50%, 6px);\n }\n to {\n opacity: 1;\n transform: translate(-50%, 0);\n }\n}\n\n.backtrack-toast {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n background-color: var(--bt-surface-bg);\n border-radius: var(--bt-radius-md);\n padding: 8px 14px;\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.65);\n pointer-events: auto;\n}\n\n.backtrack-toast-success {\n border: 1px solid var(--bt-border-success);\n}\n\n.backtrack-toast-danger {\n border: 1px solid var(--bt-border-danger);\n}\n\n.backtrack-toast-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.backtrack-toast-success .backtrack-toast-icon {\n color: var(--bt-text-success);\n}\n\n.backtrack-toast-danger .backtrack-toast-icon {\n color: var(--bt-text-danger);\n}\n\n.backtrack-toast-text {\n color: var(--bt-text-primary);\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n/* 2. Se\u00E7\u00E3o de Controles de Grava\u00E7\u00E3o */\n.backtrack-controls-section {\n margin-bottom: 16px;\n}\n\n.backtrack-section-label-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.backtrack-section-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--bt-text-muted);\n}\n\n.backtrack-help-tooltip-trigger {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--bt-text-muted);\n cursor: help;\n font-size: 11px;\n transition: color 0.15s ease;\n}\n\n.backtrack-help-tooltip-trigger:hover {\n color: var(--bt-text-secondary);\n}\n\n.backtrack-duration-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 6px;\n margin-bottom: 10px;\n}\n\n.backtrack-duration-btn {\n background-color: var(--bt-surface-card);\n border: 1px solid var(--bt-border);\n border-radius: var(--bt-radius-md);\n height: 32px;\n font-size: 12px;\n font-weight: 500;\n color: var(--bt-text-primary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 3px;\n transition: background-color 0.1s ease, border-color 0.1s ease, color 0.1s ease;\n user-select: none;\n outline: none;\n}\n\n.backtrack-duration-btn:hover {\n background-color: var(--bt-surface-elevated);\n border-color: #3b4252;\n color: #ffffff;\n}\n\n.backtrack-duration-btn.is-selected {\n background-color: var(--bt-accent-muted);\n border-color: var(--bt-accent);\n color: #60a5fa;\n font-weight: 600;\n}\n\n.backtrack-custom-duration-row {\n background-color: var(--bt-surface-card);\n border: 1px solid var(--bt-border);\n border-radius: var(--bt-radius-sm);\n padding: 6px 10px;\n margin-bottom: 10px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.backtrack-custom-input-wrap {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.backtrack-custom-duration-input {\n background-color: var(--bt-surface-input);\n border: 1px solid var(--bt-accent);\n border-radius: var(--bt-radius-sm);\n color: var(--bt-text-primary);\n font-family: var(--bt-font-mono);\n font-size: 12px;\n font-weight: 600;\n width: 65px;\n padding: 3px 6px;\n outline: none;\n text-align: right;\n}\n\n.backtrack-custom-duration-input:focus {\n border-color: #60a5fa;\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);\n}\n\n.backtrack-custom-unit {\n font-size: 11px;\n color: var(--bt-text-muted);\n}\n\n.backtrack-custom-hint {\n font-size: 10.5px;\n color: var(--bt-text-dim);\n white-space: nowrap;\n}\n\n/* Linha de A\u00E7\u00F5es */\n.backtrack-actions-row {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.backtrack-btn-save {\n flex: 1;\n height: 36px;\n background-color: var(--bt-accent);\n color: #ffffff;\n border: 1px solid #3b82f6;\n border-radius: var(--bt-radius-md);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: background-color 0.12s ease;\n user-select: none;\n outline: none;\n}\n\n.backtrack-btn-save:hover:not(:disabled) {\n background-color: var(--bt-accent-hover);\n}\n\n.backtrack-btn-save:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.backtrack-btn-icon-square {\n width: 36px;\n height: 36px;\n border-radius: var(--bt-radius-md);\n border: 1px solid var(--bt-border);\n background-color: var(--bt-surface-card);\n color: var(--bt-text-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n flex-shrink: 0;\n transition: background-color 0.1s ease, border-color 0.1s ease, color 0.1s ease;\n outline: none;\n padding: 0;\n}\n\n.backtrack-btn-icon-square:hover:not(:disabled) {\n background-color: var(--bt-surface-elevated);\n border-color: #3b4252;\n color: #ffffff;\n}\n\n.backtrack-btn-icon-square:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* 3. Se\u00E7\u00E3o de Lista de Grava\u00E7\u00F5es Salvas */\n.backtrack-list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.backtrack-list-title {\n font-size: 12px;\n font-weight: 500;\n color: var(--bt-text-muted);\n}\n\n.backtrack-list-count {\n font-size: 12px;\n font-weight: 500;\n color: var(--bt-text-muted);\n}\n\n.backtrack-list-item {\n background-color: var(--bt-surface-card);\n border: 1px solid var(--bt-border);\n border-radius: var(--bt-radius-md);\n padding: 9px 12px;\n margin-bottom: 6px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n transition: background-color 0.12s ease, border-color 0.12s ease;\n text-align: left;\n width: 100%;\n box-sizing: border-box;\n}\n\n.backtrack-list-item:hover {\n background-color: var(--bt-surface-elevated);\n border-color: #3b4252;\n}\n\n.backtrack-item-content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n overflow: hidden;\n}\n\n.backtrack-item-title {\n font-size: 13px;\n font-weight: 500;\n color: var(--bt-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.backtrack-item-meta {\n font-size: 12px;\n color: var(--bt-text-muted);\n}\n\n.backtrack-item-chevron {\n color: var(--bt-text-muted);\n flex-shrink: 0;\n margin-left: 8px;\n display: flex;\n align-items: center;\n}\n\n/* Estado Vazio */\n.backtrack-empty-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 24px 16px;\n background-color: var(--bt-surface-card);\n border: 1px dashed var(--bt-border);\n border-radius: var(--bt-radius-md);\n text-align: center;\n}\n\n.backtrack-empty-title {\n font-size: 13px;\n font-weight: 500;\n color: var(--bt-text-primary);\n margin-top: 8px;\n margin-bottom: 2px;\n}\n\n.backtrack-empty-desc {\n font-size: 12px;\n color: var(--bt-text-muted);\n line-height: 1.4;\n}\n\n/* 4. Tela de Detalhe do Incidente */\n.backtrack-detail-view {\n display: flex;\n flex-direction: column;\n}\n\n.backtrack-detail-back-row {\n margin-bottom: 14px;\n}\n\n.backtrack-btn-back {\n background: transparent;\n border: 1px solid var(--bt-border);\n border-radius: var(--bt-radius-sm);\n padding: 5px 10px;\n font-size: 13px;\n font-weight: 400;\n color: var(--bt-text-primary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n transition: background-color 0.12s ease, border-color 0.12s ease;\n outline: none;\n}\n\n.backtrack-btn-back:hover {\n background-color: var(--bt-surface-elevated);\n border-color: #3b4252;\n}\n\n.backtrack-detail-card {\n background-color: var(--bt-surface-card);\n border: 1px solid var(--bt-border);\n border-radius: var(--bt-radius-md);\n padding: 10px 12px;\n margin-bottom: 18px;\n}\n\n.backtrack-detail-title {\n font-size: 14px;\n font-weight: 500;\n color: var(--bt-text-primary);\n margin-bottom: 4px;\n line-height: 1.3;\n}\n\n.backtrack-detail-meta {\n font-size: 12px;\n color: var(--bt-text-muted);\n font-family: var(--bt-font-mono);\n letter-spacing: -0.01em;\n}\n\n/* CTA principal \u2014 Visualizar replay */\n.backtrack-btn-cta-replay {\n width: 100%;\n height: 40px;\n background-color: var(--bt-accent);\n color: #ffffff;\n border: 1px solid #3b82f6;\n border-radius: var(--bt-radius-md);\n font-size: 13px;\n font-weight: 500;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n cursor: pointer;\n transition: background-color 0.12s ease;\n user-select: none;\n outline: none;\n margin-bottom: 18px;\n}\n\n.backtrack-btn-cta-replay:hover {\n background-color: var(--bt-accent-hover);\n}\n\n/* Grupo \"Exportar\" (a\u00E7\u00F5es agrupadas) */\n.backtrack-export-section {\n margin-bottom: 18px;\n}\n\n.backtrack-export-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--bt-text-muted);\n margin-bottom: 8px;\n}\n\n.backtrack-export-group {\n border: 1px solid var(--bt-border);\n border-radius: var(--bt-radius-md);\n overflow: hidden;\n background-color: transparent;\n}\n\n.backtrack-export-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: transparent;\n border: none;\n border-bottom: 1px solid var(--bt-border);\n color: var(--bt-text-primary);\n font-size: 13px;\n text-align: left;\n cursor: pointer;\n transition: background-color 0.12s ease;\n outline: none;\n}\n\n.backtrack-export-item:last-child {\n border-bottom: none;\n}\n\n.backtrack-export-item svg {\n color: var(--bt-text-muted);\n flex-shrink: 0;\n transition: color 0.12s ease;\n}\n\n.backtrack-export-item:hover {\n background-color: var(--bt-surface-elevated);\n}\n\n.backtrack-export-item:hover svg {\n color: var(--bt-text-primary);\n}\n\n/* A\u00E7\u00E3o destrutiva \u2014 Excluir grava\u00E7\u00E3o */\n.backtrack-destructive-section {\n border-top: 1px solid var(--bt-border);\n padding-top: 12px;\n}\n\n.backtrack-btn-delete-ghost {\n width: 100%;\n background: transparent;\n border: none;\n padding: 6px 0;\n display: flex;\n align-items: center;\n gap: 8px;\n color: #ef4444;\n font-size: 13px;\n font-weight: 400;\n cursor: pointer;\n text-align: left;\n transition: opacity 0.12s ease;\n outline: none;\n}\n\n.backtrack-btn-delete-ghost:hover {\n opacity: 0.8;\n}\n\n.backtrack-btn-delete-ghost svg {\n color: #ef4444;\n flex-shrink: 0;\n}\n\n\n/* Modais de Confirma\u00E7\u00E3o (Export, Download, Hide) */\n.backtrack-modal-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--bt-surface-bg);\n display: flex;\n flex-direction: column;\n z-index: 1000;\n border-radius: var(--bt-radius-lg);\n padding: 0;\n overflow: hidden;\n}\n\n.backtrack-modal-card {\n width: 100%;\n height: 100%;\n max-width: 100%;\n background-color: var(--bt-surface-bg);\n border: none;\n border-radius: var(--bt-radius-lg);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.backtrack-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 14px;\n border-bottom: 1px solid var(--bt-border);\n background-color: var(--bt-surface-bg);\n}\n\n.backtrack-modal-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 600;\n color: var(--bt-text-primary);\n}\n\n.backtrack-modal-close {\n background: transparent;\n border: none;\n color: var(--bt-text-muted);\n font-size: 14px;\n cursor: pointer;\n padding: 2px 4px;\n line-height: 1;\n}\n\n.backtrack-modal-close:hover {\n color: #f1f5f9;\n}\n\n.backtrack-modal-body {\n padding: 12px 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 1;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: #334155 transparent;\n}\n\n.backtrack-modal-body::-webkit-scrollbar {\n width: 5px;\n}\n\n.backtrack-modal-body::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.backtrack-modal-body::-webkit-scrollbar-thumb {\n background-color: #334155;\n border-radius: 4px;\n}\n\n.backtrack-modal-body::-webkit-scrollbar-thumb:hover {\n background-color: #475569;\n}\n\n.backtrack-modal-checkbox-label {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n}\n\n.backtrack-modal-checkbox-label input[type=\"checkbox\"] {\n margin-top: 2px;\n width: 15px;\n height: 15px;\n accent-color: var(--bt-accent);\n cursor: pointer;\n}\n\n.backtrack-modal-checkbox-title {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: #f1f5f9;\n}\n\n.backtrack-modal-checkbox-desc {\n margin: 3px 0 0 0;\n font-size: 11px;\n color: var(--bt-text-muted);\n line-height: 1.35;\n}\n\n.backtrack-modal-radio-label {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 10px;\n border: 1px solid var(--bt-border);\n border-radius: var(--bt-radius-sm);\n background-color: var(--bt-surface-card);\n cursor: pointer;\n user-select: none;\n transition: border-color 0.1s ease, background-color 0.1s ease;\n}\n\n.backtrack-modal-radio-label:hover {\n background-color: var(--bt-surface-elevated);\n}\n\n.backtrack-modal-radio-label.is-selected {\n border-color: var(--bt-accent);\n background-color: var(--bt-accent-muted);\n}\n\n.backtrack-modal-radio-label input[type=\"radio\"] {\n margin-top: 2px;\n width: 15px;\n height: 15px;\n accent-color: var(--bt-accent);\n cursor: pointer;\n}\n\n.backtrack-modal-radio-title {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: #f1f5f9;\n}\n\n.backtrack-modal-radio-desc {\n margin: 3px 0 0 0;\n font-size: 11px;\n color: var(--bt-text-muted);\n line-height: 1.35;\n}\n\n.backtrack-modal-error {\n padding: 6px 8px;\n background: rgba(239, 68, 68, 0.15);\n border: 1px solid rgba(239, 68, 68, 0.3);\n border-radius: 4px;\n color: #fca5a5;\n font-size: 11px;\n}\n\n.backtrack-modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n padding: 10px 14px;\n border-top: 1px solid var(--bt-border);\n background-color: var(--bt-surface-bg);\n}\n\n.backtrack-btn-secondary {\n background-color: var(--bt-surface-card);\n border: 1px solid var(--bt-border);\n color: #cbd5e1;\n border-radius: var(--bt-radius-sm);\n padding: 5px 10px;\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.backtrack-btn-secondary:hover:not(:disabled) {\n background-color: var(--bt-surface-elevated);\n color: #f8fafc;\n}\n\n.backtrack-btn-primary {\n background-color: var(--bt-accent);\n border: 1px solid #3b82f6;\n color: #ffffff;\n border-radius: var(--bt-radius-sm);\n padding: 5px 12px;\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.backtrack-btn-primary:hover:not(:disabled) {\n background-color: var(--bt-accent-hover);\n}\n\n.backtrack-btn-primary:disabled,\n.backtrack-btn-secondary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Responsividade Mobile e Safe Area */\n@media (max-width: 480px) {\n .backtrack-panel {\n width: calc(100vw - 32px);\n max-width: calc(100vw - 16px);\n left: 8px;\n right: 8px;\n bottom: max(60px, env(safe-area-inset-bottom, 60px));\n }\n}\n\n.backtrack-sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n";
2
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/widget/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,0/vBAqmCtB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import type { FlightRecorder } from '../types';
2
+ import type { WidgetOptions } from '../types/options';
3
+ export declare class BacktrackWidget {
4
+ private recorder;
5
+ private options;
6
+ private container;
7
+ private shadow;
8
+ private isOpen;
9
+ private selectedDurationSeconds;
10
+ private isCapturing;
11
+ private incidents;
12
+ private health;
13
+ private isCustomDuration;
14
+ private toast;
15
+ private banner;
16
+ private toastTimer;
17
+ private isHeaderMenuOpen;
18
+ private selectedIncidentId;
19
+ private exportModalIncidentId;
20
+ private exportModalIncludeLink;
21
+ private isExportingMarkdown;
22
+ private exportModalError;
23
+ private static sessionGithubToken;
24
+ private downloadModalIncidentId;
25
+ private downloadModalFormat;
26
+ private isDownloading;
27
+ private downloadModalError;
28
+ private showHideConfirmModal;
29
+ private wasDragged;
30
+ private pollTimer;
31
+ private handleGlobalKey?;
32
+ constructor(recorder: FlightRecorder, options?: WidgetOptions);
33
+ mount(): void;
34
+ unmount(): void;
35
+ hide(): void;
36
+ show(): void;
37
+ toggle(): boolean;
38
+ isVisible(): boolean;
39
+ private applyHostPosition;
40
+ private getViewerUrl;
41
+ private updateData;
42
+ private showToast;
43
+ private showBanner;
44
+ private dismissBanner;
45
+ private handleCapture;
46
+ private handleClear;
47
+ private handleViewIncident;
48
+ private handleDownloadIncident;
49
+ private openDownloadModal;
50
+ private closeDownloadModal;
51
+ private confirmDownload;
52
+ private handleCopyMarkdown;
53
+ private openExportModal;
54
+ private closeExportModal;
55
+ private confirmCopyMarkdown;
56
+ private handleShareGist;
57
+ private handleAnnotate;
58
+ private handleDeleteIncident;
59
+ private openInViewer;
60
+ private toggleOpen;
61
+ private formatBytes;
62
+ private formatIncidentTitle;
63
+ private renderBannerHtml;
64
+ private renderToastHtml;
65
+ private renderLauncherHtml;
66
+ private renderPanelContentHtml;
67
+ private render;
68
+ private renderIncidentsHtml;
69
+ private renderDetailViewHtml;
70
+ private renderExportModal;
71
+ private renderDownloadModal;
72
+ private renderHideConfirmModal;
73
+ private updateDomValues;
74
+ private attachIncidentListeners;
75
+ private attachLauncherListeners;
76
+ private attachPanelListeners;
77
+ }
78
+ //# sourceMappingURL=widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../../src/widget/widget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQtD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,MAAM,CAA2B;IAEzC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,uBAAuB,CAAO;IACtC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,KAAK,CAAgE;IAC7E,OAAO,CAAC,MAAM,CAAgE;IAC9E,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,kBAAkB,CAAuB;IAEjD,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAuB;IAExD,OAAO,CAAC,uBAAuB,CAAuB;IACtD,OAAO,CAAC,mBAAmB,CAA+C;IAC1E,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,oBAAoB,CAAS;IAErC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,eAAe,CAAC,CAA6B;gBAEzC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,aAAa;IAStD,KAAK,IAAI,IAAI;IA2Eb,OAAO,IAAI,IAAI;IAoBf,IAAI,IAAI,IAAI;IAwBZ,IAAI,IAAI,IAAI;IAcZ,MAAM,IAAI,OAAO;IAajB,SAAS,IAAI,OAAO;IAK3B,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,YAAY;YAcN,UAAU;IAUxB,OAAO,CAAC,SAAS;IA+BjB,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,aAAa;YAQP,aAAa;YAkBb,WAAW;YAgBX,kBAAkB;IAShC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,kBAAkB;YAQZ,eAAe;IAkC7B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,gBAAgB;YAOV,mBAAmB;YA+FnB,eAAe;IA2D7B,OAAO,CAAC,cAAc;YAoCR,oBAAoB;IAkBlC,OAAO,CAAC,YAAY;IA2EpB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,gBAAgB;IA4BxB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,sBAAsB;IA6N9B,OAAO,CAAC,MAAM;IAgFd,OAAO,CAAC,mBAAmB;IAyC3B,OAAO,CAAC,oBAAoB;IAuF5B,OAAO,CAAC,iBAAiB;IA6CzB,OAAO,CAAC,mBAAmB;IAuD3B,OAAO,CAAC,sBAAsB;IA0C9B,OAAO,CAAC,eAAe;IAuEvB,OAAO,CAAC,uBAAuB;IAyD/B,OAAO,CAAC,uBAAuB;IAgE/B,OAAO,CAAC,oBAAoB;CAiJ7B"}
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "@backtrack-js/browser",
3
+ "version": "0.4.0",
4
+ "description": "Backtrack - Privacy-first client-side time travel & bug recording for web apps",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "typings": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
17
+ "bin": {
18
+ "backtrack": "./bin/cli.js"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "bin",
23
+ "README.md",
24
+ "LICENSE"
25
+ ],
26
+ "sideEffects": false,
27
+ "scripts": {
28
+ "build:lib": "vite build && tsc -p tsconfig.build.json",
29
+ "build:viewer": "vite build viewer --outDir ../dist/viewer --emptyOutDir",
30
+ "build": "npm run build:lib && npm run build:viewer",
31
+ "test": "vitest run",
32
+ "test:e2e": "playwright test",
33
+ "gate:0": "tsx scripts/verify-fixture.ts",
34
+ "gate:1": "tsx scripts/verify-lote1.ts",
35
+ "gate:2": "tsx scripts/verify-lote2.ts",
36
+ "gate:3": "tsx scripts/verify-lote3.ts",
37
+ "viewer": "vite viewer --host",
38
+ "typecheck": "tsc --noEmit"
39
+ },
40
+ "keywords": [
41
+ "backtrack",
42
+ "flight-recorder",
43
+ "rrweb",
44
+ "blackbox",
45
+ "debugging",
46
+ "incident",
47
+ "error-tracking",
48
+ "browser",
49
+ "session-replay"
50
+ ],
51
+ "author": "Matheus Moorete",
52
+ "license": "SEE LICENSE IN LICENSE",
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "git+https://github.com/MatheusMoorete/Backtrack-JS.git"
56
+ },
57
+ "bugs": {
58
+ "url": "https://github.com/MatheusMoorete/Backtrack-JS/issues"
59
+ },
60
+ "homepage": "https://github.com/MatheusMoorete/Backtrack-JS#readme",
61
+ "dependencies": {
62
+ "@jridgewell/trace-mapping": "^0.3.31",
63
+ "@rrweb/record": "^2.1.6"
64
+ },
65
+ "devDependencies": {
66
+ "@playwright/test": "1.61.0",
67
+ "@rrweb/replay": "^2.1.6",
68
+ "@testing-library/react": "^16.3.3",
69
+ "@types/node": "^20.11.0",
70
+ "@types/react": "^18.3.31",
71
+ "@types/react-dom": "^18.3.7",
72
+ "@vitejs/plugin-react": "^4.7.0",
73
+ "fake-indexeddb": "^6.2.5",
74
+ "happy-dom": "^20.14.5",
75
+ "react": "^19.3.0",
76
+ "react-dom": "^19.3.0",
77
+ "tsx": "^4.7.1",
78
+ "typescript": "^5.4.0",
79
+ "vite": "^5.2.0",
80
+ "vitest": "^1.5.0"
81
+ }
82
+ }