@qaiddev/thumbs-embed 1.0.11 → 1.0.13

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.
package/dist/qaid.js CHANGED
@@ -2,24 +2,24 @@ const E = `<svg xmlns="http://www.w3.org/2000/svg" class="qaid-icon" fill="none"
2
2
  <path stroke-linecap="round" stroke-linejoin="round" d="M14 10h4.764a2 2 0 011.789 2.894l-3.5 7A2 2 0 0115.263 21h-4.017c-.163 0-.326-.02-.485-.06L7 20m7-10V5a2 2 0 00-2-2h-.095c-.5 0-.905.405-.905.905 0 .714-.211 1.412-.608 2.006L7 11v9m7-10h-2M7 20H5a2 2 0 01-2-2v-6a2 2 0 012-2h2.5"/>
3
3
  </svg>`, T = `<svg xmlns="http://www.w3.org/2000/svg" class="qaid-icon" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
4
4
  <path stroke-linecap="round" stroke-linejoin="round" d="M10 14H5.236a2 2 0 01-1.789-2.894l3.5-7A2 2 0 018.737 3h4.018a2 2 0 01.485.06l3.76.94m-7 10v5a2 2 0 002 2h.095c.5 0 .905-.405.905-.905 0-.714.211-1.412.608-2.006L17 13V4m-7 10h2m5-10h2a2 2 0 012 2v6a2 2 0 01-2 2h-2.5"/>
5
- </svg>`, tt = `<svg xmlns="http://www.w3.org/2000/svg" class="qaid-icon" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
5
+ </svg>`, et = `<svg xmlns="http://www.w3.org/2000/svg" class="qaid-icon" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
6
6
  <path stroke-linecap="round" stroke-linejoin="round" d="M15.75 10.5l4.72-4.72a.75.75 0 011.28.53v11.38a.75.75 0 01-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 002.25-2.25v-9a2.25 2.25 0 00-2.25-2.25h-9A2.25 2.25 0 002.25 7.5v9a2.25 2.25 0 002.25 2.25z"/>
7
- </svg>`, et = "button{cursor:pointer}.qaid-buttons{display:flex;gap:.5rem}.qaid-buttons.qaid-vertical{flex-direction:column}.qaid-buttons.qaid-auto-container{position:fixed;z-index:50}.qaid-buttons.qaid-auto-container.qaid-bottom-right{bottom:1rem;right:1rem}.qaid-buttons.qaid-auto-container.qaid-bottom-left{bottom:1rem;left:1rem}.qaid-buttons.qaid-auto-container.qaid-top-right{top:1rem;right:1rem}.qaid-buttons.qaid-auto-container.qaid-top-left{top:1rem;left:1rem}.qaid-buttons.qaid-incognito{opacity:0;transition:opacity .2s ease-in-out}.qaid-buttons.qaid-incognito:hover{opacity:1}.qaid-buttons{position:relative}.qaid-dismiss-btn{position:absolute;width:20px;height:20px;padding:0;border:none;border-radius:50%;background:#0006;color:#fff;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .15s,background .15s;cursor:pointer;-webkit-appearance:none;appearance:none}.qaid-dismiss-btn:hover{background:#0009}.qaid-buttons:hover .qaid-dismiss-btn{opacity:1}.qaid-bottom-right .qaid-dismiss-btn{bottom:100%;right:0;margin-bottom:4px}.qaid-bottom-left .qaid-dismiss-btn{bottom:100%;left:0;margin-bottom:4px}.qaid-top-right .qaid-dismiss-btn{top:100%;right:0;margin-top:4px}.qaid-top-left .qaid-dismiss-btn{top:100%;left:0;margin-top:4px}button.qaid-btn-structural{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;-webkit-appearance:none;appearance:none}.qaid-icon{width:24px;height:24px}.qaid-btn-structural:not(:has(svg)),.qaid-btn:not(:has(svg)){font-size:var(--qaid-icon-size, 24px);line-height:1}.qaid-emoji-icon{font-size:var(--qaid-icon-size, 24px);line-height:1}.qaid-buttons,.qaid-buttons *,.qaid-modal-container,.qaid-modal-container *{cursor:pointer!important}.qaid-tooltip-wrapper{position:relative}.qaid-tooltip-text{position:fixed;padding:.5rem .75rem;background:#1f2937;color:#fff;font-size:1rem;font-weight:600;border-radius:.5rem;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s;z-index:99999}.qaid-tooltip-text.qaid-tooltip-visible{opacity:1}.qaid-targeting-overlay{position:fixed;inset:0;z-index:40;pointer-events:none}.qaid-capture-layer{position:fixed;inset:0;pointer-events:none;z-index:9999}@keyframes qaid-slideDown{0%{transform:translateY(-100%)}to{transform:translateY(0)}}.qaid-vignette{position:fixed;inset:0;pointer-events:none;background:radial-gradient(ellipse at center,transparent 30%,rgba(0,0,0,.3) 70%,rgba(0,0,0,.6) 100%);z-index:41}.qaid-crosshair-h,.qaid-crosshair-v{position:fixed;pointer-events:none;z-index:42}.qaid-crosshair-h{left:0;right:0;height:1px;background:color-mix(in srgb,var(--qaid-negative) 60%,transparent)}.qaid-crosshair-v{top:0;bottom:0;width:1px;background:color-mix(in srgb,var(--qaid-negative) 60%,transparent)}.qaid-type-up .qaid-crosshair-h,.qaid-type-up .qaid-crosshair-v{background:color-mix(in srgb,var(--qaid-positive) 60%,transparent)}.qaid-highlight-box{position:fixed;top:0;left:0;pointer-events:none;z-index:41;display:none;border:3px solid color-mix(in srgb,var(--qaid-negative) 80%,transparent);border-radius:2px;background:color-mix(in srgb,var(--qaid-negative) 8%,transparent);will-change:transform,width,height}.qaid-type-up .qaid-highlight-box{border-color:color-mix(in srgb,var(--qaid-positive) 80%,transparent);background:color-mix(in srgb,var(--qaid-positive) 8%,transparent)}.qaid-scope{position:fixed;width:80px;height:80px;pointer-events:none;z-index:43;transform:translate(-50%,-50%)}.qaid-scope-ring{position:absolute;inset:10px;border:2px solid color-mix(in srgb,var(--qaid-negative) 80%,transparent);border-radius:50%}.qaid-type-up .qaid-scope-ring{border-color:color-mix(in srgb,var(--qaid-positive) 80%,transparent)}.qaid-scope-ring-inner{position:absolute;inset:20px;border:1px solid color-mix(in srgb,var(--qaid-negative) 50%,transparent);border-radius:50%}.qaid-type-up .qaid-scope-ring-inner{border-color:color-mix(in srgb,var(--qaid-positive) 50%,transparent)}.qaid-scope-dot{position:absolute;top:50%;left:50%;width:4px;height:4px;background:var(--qaid-negative);border-radius:50%;transform:translate(-50%,-50%)}.qaid-type-up .qaid-scope-dot{background:var(--qaid-positive)}.qaid-selected-marker{position:fixed;border:3px solid var(--qaid-marker, #6366f1);border-radius:50%;pointer-events:none;z-index:44;animation:qaid-markerPulse 1.5s ease-in-out infinite}@keyframes qaid-markerPulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}.qaid-backdrop{position:fixed;inset:0;z-index:45;background:#0000004d}.qaid-modal-container{position:fixed;z-index:50;display:flex;flex-direction:column;align-items:flex-start;max-height:calc(100vh - 32px);font-family:var(--qaid-font-family, system-ui, -apple-system, sans-serif);font-size:var(--qaid-font-size, 16px)}.qaid-modal-container.qaid-above{flex-direction:column-reverse}.qaid-modal-arrow{width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;position:relative;align-self:flex-start}.qaid-modal-container.qaid-below .qaid-modal-arrow{border-bottom:12px solid light-dark(#ffffff,#1f2937)}.qaid-modal-container.qaid-above .qaid-modal-arrow{border-top:12px solid light-dark(#ffffff,#1f2937)}.qaid-modal-box{color-scheme:inherit;background:light-dark(#ffffff,#1f2937);border-radius:1rem;padding:1.5rem;box-shadow:0 25px 50px -12px light-dark(rgba(0,0,0,.25),rgba(0,0,0,.5));width:var(--qaid-modal-width, 400px);max-width:calc(100vw - 32px);max-height:calc(100vh - 60px);overflow-y:auto}.qaid-modal-header{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:1rem}button.qaid-type-toggle{border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;flex-shrink:0;-webkit-appearance:none;appearance:none}button.qaid-type-toggle:hover{transform:scale(1.1)}button.qaid-type-toggle:not(.qaid-type-toggle-custom){width:2.5rem;height:2.5rem;border-radius:50%}button.qaid-type-toggle:not(.qaid-type-toggle-custom) svg{width:1.25rem;height:1.25rem}button.qaid-type-toggle.qaid-type-up{background:var(--qaid-positive);color:#fff}button.qaid-type-toggle.qaid-type-down{background:var(--qaid-negative);color:#fff}.qaid-modal-header-text{flex:1;min-width:0}.qaid-modal-title{font-size:1.125rem;font-weight:700;margin:0 0 .25rem;color:light-dark(#1f2937,#f9fafb)}.qaid-modal-subtitle{color:light-dark(#6b7280,#9ca3af);margin:0;font-size:.875rem}.qaid-textarea{width:100%;height:6rem;padding:.75rem;border:1px solid light-dark(#d1d5db,#374151);border-radius:.5rem;font-family:inherit;font-size:1rem;resize:vertical;margin-bottom:1rem;box-sizing:border-box;background:light-dark(#ffffff,#111827);color:light-dark(#1f2937,#f9fafb)}.qaid-textarea:focus{outline:none;border-color:var(--qaid-marker);box-shadow:0 0 0 3px color-mix(in srgb,var(--qaid-marker) 20%,transparent)}.qaid-btn-row{display:flex;gap:.5rem;justify-content:flex-end}button.qaid-btn-submit{padding:.5rem 1rem;background:var(--qaid-marker);color:var(--qaid-marker-text, white);border:none;border-radius:.5rem;font-size:.875rem;font-weight:500;cursor:pointer;transition:background-color .2s,filter .2s;-webkit-appearance:none;appearance:none}button.qaid-btn-submit:hover{filter:brightness(.85)}button.qaid-btn-submit:focus{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--qaid-marker) 30%,transparent)}.qaid-bottom-sheet{position:fixed;bottom:0;left:0;right:0;z-index:50;animation:qaid-slideUpSheet .3s ease-out;font-family:var(--qaid-font-family, system-ui, -apple-system, sans-serif);font-size:var(--qaid-font-size, 16px)}.qaid-bottom-sheet-content{background:light-dark(#ffffff,#1f2937);border-radius:1rem 1rem 0 0;padding:1.5rem;padding-bottom:max(1.5rem,env(safe-area-inset-bottom))}.qaid-bottom-sheet-handle{width:36px;height:4px;background:light-dark(rgba(0,0,0,.2),rgba(255,255,255,.2));border-radius:2px;margin:0 auto 1rem}@keyframes qaid-slideUpSheet{0%{transform:translateY(100%)}to{transform:translateY(0)}}button.qaid-btn-record:hover{background:#dc2626;color:#fff}.qaid-recording-indicator{position:fixed;top:12px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;background:light-dark(#1f2937,#374151);color:#fff;border-radius:9999px;font-family:var(--qaid-font-family, system-ui, -apple-system, sans-serif);font-size:.875rem;font-weight:500;box-shadow:0 4px 12px #0000004d;z-index:99999;animation:qaid-slideDown .2s ease-out}.qaid-recording-dot{width:10px;height:10px;background:#dc2626;border-radius:50%;animation:qaid-dotPulse 1.5s ease-in-out infinite}@keyframes qaid-dotPulse{0%,to{opacity:1}50%{opacity:.3}}.qaid-recording-time{font-variant-numeric:tabular-nums;min-width:2.5rem;text-align:center}button.qaid-recording-stop{padding:.25rem .75rem;background:#dc2626;color:#fff;border:none;border-radius:9999px;font-size:.75rem;font-weight:600;cursor:pointer;transition:background-color .2s;-webkit-appearance:none;appearance:none}button.qaid-recording-stop:hover{background:#b91c1c}.qaid-video-preview{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#0009;z-index:99998;animation:qaid-fadeIn .2s ease-out}@keyframes qaid-fadeIn{0%{opacity:0}to{opacity:1}}.qaid-video-preview-box{color-scheme:inherit;background:light-dark(#ffffff,#1f2937);border-radius:1rem;padding:1.5rem;box-shadow:0 25px 50px -12px #00000080;width:560px;max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow-y:auto;font-family:var(--qaid-font-family, system-ui, -apple-system, sans-serif);font-size:var(--qaid-font-size, 16px)}.qaid-video-preview-box h3{font-size:1.125rem;font-weight:700;margin:0 0 1rem;color:light-dark(#1f2937,#f9fafb)}.qaid-video-preview-box video{width:100%;border-radius:.5rem;background:#000;margin-bottom:1rem}.qaid-video-preview-box textarea{width:100%;height:4rem;padding:.75rem;border:1px solid light-dark(#d1d5db,#374151);border-radius:.5rem;font-family:inherit;font-size:.875rem;resize:vertical;margin-bottom:1rem;box-sizing:border-box;background:light-dark(#ffffff,#111827);color:light-dark(#1f2937,#f9fafb)}.qaid-video-preview-box textarea:focus{outline:none;border-color:var(--qaid-marker);box-shadow:0 0 0 3px color-mix(in srgb,var(--qaid-marker) 20%,transparent)}.qaid-video-preview-actions{display:flex;gap:.5rem;justify-content:flex-end}button.qaid-video-btn{padding:.5rem 1rem;border:none;border-radius:.5rem;font-size:.875rem;font-weight:500;cursor:pointer;transition:background-color .2s,filter .2s;-webkit-appearance:none;appearance:none}button.qaid-video-btn-cancel{background:light-dark(#f3f4f6,#374151);color:light-dark(#374151,#d1d5db)}button.qaid-video-btn-cancel:hover{background:light-dark(#e5e7eb,#4b5563)}button.qaid-video-btn-rerecord{background:light-dark(#fef3c7,#78350f);color:light-dark(#92400e,#fde68a)}button.qaid-video-btn-rerecord:hover{filter:brightness(.9)}button.qaid-video-btn-send{background:var(--qaid-marker);color:var(--qaid-marker-text, white)}button.qaid-video-btn-send:hover{filter:brightness(.85)}button.qaid-video-btn-send:disabled{opacity:.5;cursor:not-allowed}.qaid-video-sending{display:flex;align-items:center;gap:.5rem;font-size:.875rem;color:light-dark(#6b7280,#9ca3af)}", it = "body.qaid-targeting,body.qaid-targeting *{cursor:none!important}";
7
+ </svg>`, it = "button{cursor:pointer}.qaid-buttons{display:flex;gap:.5rem}.qaid-buttons.qaid-vertical{flex-direction:column}.qaid-buttons.qaid-auto-container{position:fixed;z-index:50}.qaid-buttons.qaid-auto-container.qaid-bottom-right{bottom:1rem;right:1rem}.qaid-buttons.qaid-auto-container.qaid-bottom-left{bottom:1rem;left:1rem}.qaid-buttons.qaid-auto-container.qaid-top-right{top:1rem;right:1rem}.qaid-buttons.qaid-auto-container.qaid-top-left{top:1rem;left:1rem}.qaid-buttons.qaid-incognito{opacity:0;transition:opacity .2s ease-in-out}.qaid-buttons.qaid-incognito:hover{opacity:1}.qaid-buttons{position:relative}.qaid-dismiss-btn{position:absolute;width:20px;height:20px;padding:0;border:none;border-radius:50%;background:#0006;color:#fff;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .15s,background .15s;cursor:pointer;pointer-events:auto;-webkit-appearance:none;appearance:none}.qaid-dismiss-btn:hover{background:#0009}.qaid-buttons:hover .qaid-dismiss-btn{opacity:1}.qaid-bottom-right .qaid-dismiss-btn{bottom:100%;right:0;margin-bottom:4px}.qaid-bottom-left .qaid-dismiss-btn{bottom:100%;left:0;margin-bottom:4px}.qaid-top-right .qaid-dismiss-btn{top:100%;right:0;margin-top:4px}.qaid-top-left .qaid-dismiss-btn{top:100%;left:0;margin-top:4px}button.qaid-btn-structural{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;-webkit-appearance:none;appearance:none}.qaid-icon{width:24px;height:24px}.qaid-btn-structural:not(:has(svg)),.qaid-btn:not(:has(svg)){font-size:var(--qaid-icon-size, 24px);line-height:1}.qaid-emoji-icon{font-size:var(--qaid-icon-size, 24px);line-height:1}.qaid-buttons,.qaid-buttons *,.qaid-modal-container,.qaid-modal-container *{cursor:pointer!important}.qaid-tooltip-wrapper{position:relative}.qaid-tooltip-text{position:fixed;padding:.5rem .75rem;background:#1f2937;color:#fff;font-size:1rem;font-weight:600;border-radius:.5rem;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s;z-index:99999}.qaid-tooltip-text.qaid-tooltip-visible{opacity:1}.qaid-targeting-overlay{position:fixed;inset:0;z-index:40;pointer-events:none}.qaid-capture-layer{position:fixed;inset:0;pointer-events:none;z-index:9999}@keyframes qaid-slideDown{0%{transform:translateY(-100%)}to{transform:translateY(0)}}.qaid-vignette{position:fixed;inset:0;pointer-events:none;background:radial-gradient(ellipse at center,transparent 30%,rgba(0,0,0,.3) 70%,rgba(0,0,0,.6) 100%);z-index:41}.qaid-crosshair-h,.qaid-crosshair-v{position:fixed;pointer-events:none;z-index:42}.qaid-crosshair-h{left:0;right:0;height:1px;background:color-mix(in srgb,var(--qaid-negative) 60%,transparent)}.qaid-crosshair-v{top:0;bottom:0;width:1px;background:color-mix(in srgb,var(--qaid-negative) 60%,transparent)}.qaid-type-up .qaid-crosshair-h,.qaid-type-up .qaid-crosshair-v{background:color-mix(in srgb,var(--qaid-positive) 60%,transparent)}.qaid-highlight-box{position:fixed;top:0;left:0;pointer-events:none;z-index:41;display:none;border:3px solid color-mix(in srgb,var(--qaid-negative) 80%,transparent);border-radius:2px;background:color-mix(in srgb,var(--qaid-negative) 8%,transparent);will-change:transform,width,height}.qaid-type-up .qaid-highlight-box{border-color:color-mix(in srgb,var(--qaid-positive) 80%,transparent);background:color-mix(in srgb,var(--qaid-positive) 8%,transparent)}.qaid-scope{position:fixed;width:80px;height:80px;pointer-events:none;z-index:43;transform:translate(-50%,-50%)}.qaid-scope-ring{position:absolute;inset:10px;border:2px solid color-mix(in srgb,var(--qaid-negative) 80%,transparent);border-radius:50%}.qaid-type-up .qaid-scope-ring{border-color:color-mix(in srgb,var(--qaid-positive) 80%,transparent)}.qaid-scope-ring-inner{position:absolute;inset:20px;border:1px solid color-mix(in srgb,var(--qaid-negative) 50%,transparent);border-radius:50%}.qaid-type-up .qaid-scope-ring-inner{border-color:color-mix(in srgb,var(--qaid-positive) 50%,transparent)}.qaid-scope-dot{position:absolute;top:50%;left:50%;width:4px;height:4px;background:var(--qaid-negative);border-radius:50%;transform:translate(-50%,-50%)}.qaid-type-up .qaid-scope-dot{background:var(--qaid-positive)}.qaid-selected-marker{position:fixed;border:3px solid var(--qaid-marker, #6366f1);border-radius:50%;pointer-events:none;z-index:44;animation:qaid-markerPulse 1.5s ease-in-out infinite}@keyframes qaid-markerPulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}.qaid-backdrop{position:fixed;inset:0;z-index:45;background:#0000004d}.qaid-modal-container{position:fixed;z-index:50;display:flex;flex-direction:column;align-items:flex-start;max-height:calc(100vh - 32px);font-family:var(--qaid-font-family, system-ui, -apple-system, sans-serif);font-size:var(--qaid-font-size, 16px)}.qaid-modal-container.qaid-above{flex-direction:column-reverse}.qaid-modal-arrow{width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;position:relative;align-self:flex-start}.qaid-modal-container.qaid-below .qaid-modal-arrow{border-bottom:12px solid light-dark(#ffffff,#1f2937)}.qaid-modal-container.qaid-above .qaid-modal-arrow{border-top:12px solid light-dark(#ffffff,#1f2937)}.qaid-modal-box{color-scheme:inherit;background:light-dark(#ffffff,#1f2937);border-radius:1rem;padding:1.5rem;box-shadow:0 25px 50px -12px light-dark(rgba(0,0,0,.25),rgba(0,0,0,.5));width:var(--qaid-modal-width, 400px);max-width:calc(100vw - 32px);max-height:calc(100vh - 60px);overflow-y:auto}.qaid-modal-header{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:1rem}button.qaid-type-toggle{border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;flex-shrink:0;-webkit-appearance:none;appearance:none}button.qaid-type-toggle:hover{transform:scale(1.1)}button.qaid-type-toggle:not(.qaid-type-toggle-custom){width:2.5rem;height:2.5rem;border-radius:50%}button.qaid-type-toggle:not(.qaid-type-toggle-custom) svg{width:1.25rem;height:1.25rem}button.qaid-type-toggle.qaid-type-up{background:var(--qaid-positive);color:#fff}button.qaid-type-toggle.qaid-type-down{background:var(--qaid-negative);color:#fff}.qaid-modal-header-text{flex:1;min-width:0}.qaid-modal-title{font-size:1.125rem;font-weight:700;margin:0 0 .25rem;color:light-dark(#1f2937,#f9fafb)}.qaid-modal-subtitle{color:light-dark(#6b7280,#9ca3af);margin:0;font-size:.875rem}.qaid-textarea{width:100%;height:6rem;padding:.75rem;border:1px solid light-dark(#d1d5db,#374151);border-radius:.5rem;font-family:inherit;font-size:1rem;resize:vertical;margin-bottom:1rem;box-sizing:border-box;background:light-dark(#ffffff,#111827);color:light-dark(#1f2937,#f9fafb)}.qaid-textarea:focus{outline:none;border-color:var(--qaid-marker);box-shadow:0 0 0 3px color-mix(in srgb,var(--qaid-marker) 20%,transparent)}.qaid-btn-row{display:flex;gap:.5rem;justify-content:flex-end}button.qaid-btn-submit{padding:.5rem 1rem;background:var(--qaid-marker);color:var(--qaid-marker-text, white);border:none;border-radius:.5rem;font-size:.875rem;font-weight:500;cursor:pointer;transition:background-color .2s,filter .2s;-webkit-appearance:none;appearance:none}button.qaid-btn-submit:hover{filter:brightness(.85)}button.qaid-btn-submit:focus{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--qaid-marker) 30%,transparent)}.qaid-bottom-sheet{position:fixed;bottom:0;left:0;right:0;z-index:50;animation:qaid-slideUpSheet .3s ease-out;font-family:var(--qaid-font-family, system-ui, -apple-system, sans-serif);font-size:var(--qaid-font-size, 16px)}.qaid-bottom-sheet-content{background:light-dark(#ffffff,#1f2937);border-radius:1rem 1rem 0 0;padding:1.5rem;padding-bottom:max(1.5rem,env(safe-area-inset-bottom))}.qaid-bottom-sheet-handle{width:36px;height:4px;background:light-dark(rgba(0,0,0,.2),rgba(255,255,255,.2));border-radius:2px;margin:0 auto 1rem}@keyframes qaid-slideUpSheet{0%{transform:translateY(100%)}to{transform:translateY(0)}}button.qaid-btn-record:hover{background:#dc2626;color:#fff}.qaid-recording-indicator{position:fixed;top:12px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;background:light-dark(#1f2937,#374151);color:#fff;border-radius:9999px;font-family:var(--qaid-font-family, system-ui, -apple-system, sans-serif);font-size:.875rem;font-weight:500;box-shadow:0 4px 12px #0000004d;z-index:99999;animation:qaid-slideDown .2s ease-out}.qaid-recording-dot{width:10px;height:10px;background:#dc2626;border-radius:50%;animation:qaid-dotPulse 1.5s ease-in-out infinite}@keyframes qaid-dotPulse{0%,to{opacity:1}50%{opacity:.3}}.qaid-recording-time{font-variant-numeric:tabular-nums;min-width:2.5rem;text-align:center}button.qaid-recording-stop{padding:.25rem .75rem;background:#dc2626;color:#fff;border:none;border-radius:9999px;font-size:.75rem;font-weight:600;cursor:pointer;transition:background-color .2s;-webkit-appearance:none;appearance:none}button.qaid-recording-stop:hover{background:#b91c1c}.qaid-video-preview{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#0009;z-index:99998;animation:qaid-fadeIn .2s ease-out}@keyframes qaid-fadeIn{0%{opacity:0}to{opacity:1}}.qaid-video-preview-box{color-scheme:inherit;background:light-dark(#ffffff,#1f2937);border-radius:1rem;padding:1.5rem;box-shadow:0 25px 50px -12px #00000080;width:560px;max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow-y:auto;font-family:var(--qaid-font-family, system-ui, -apple-system, sans-serif);font-size:var(--qaid-font-size, 16px)}.qaid-video-preview-box h3{font-size:1.125rem;font-weight:700;margin:0 0 1rem;color:light-dark(#1f2937,#f9fafb)}.qaid-video-preview-box video{width:100%;border-radius:.5rem;background:#000;margin-bottom:1rem}.qaid-video-preview-box textarea{width:100%;height:4rem;padding:.75rem;border:1px solid light-dark(#d1d5db,#374151);border-radius:.5rem;font-family:inherit;font-size:.875rem;resize:vertical;margin-bottom:1rem;box-sizing:border-box;background:light-dark(#ffffff,#111827);color:light-dark(#1f2937,#f9fafb)}.qaid-video-preview-box textarea:focus{outline:none;border-color:var(--qaid-marker);box-shadow:0 0 0 3px color-mix(in srgb,var(--qaid-marker) 20%,transparent)}.qaid-video-preview-actions{display:flex;gap:.5rem;justify-content:flex-end}button.qaid-video-btn{padding:.5rem 1rem;border:none;border-radius:.5rem;font-size:.875rem;font-weight:500;cursor:pointer;transition:background-color .2s,filter .2s;-webkit-appearance:none;appearance:none}button.qaid-video-btn-cancel{background:light-dark(#f3f4f6,#374151);color:light-dark(#374151,#d1d5db)}button.qaid-video-btn-cancel:hover{background:light-dark(#e5e7eb,#4b5563)}button.qaid-video-btn-rerecord{background:light-dark(#fef3c7,#78350f);color:light-dark(#92400e,#fde68a)}button.qaid-video-btn-rerecord:hover{filter:brightness(.9)}button.qaid-video-btn-send{background:var(--qaid-marker);color:var(--qaid-marker-text, white)}button.qaid-video-btn-send:hover{filter:brightness(.85)}button.qaid-video-btn-send:disabled{opacity:.5;cursor:not-allowed}.qaid-video-sending{display:flex;align-items:center;gap:.5rem;font-size:.875rem;color:light-dark(#6b7280,#9ca3af)}", ot = "body.qaid-targeting,body.qaid-targeting *{cursor:none!important}";
8
8
  let w = 0;
9
- const ot = "button.qaid-btn{width:var(--qaid-btn-size);height:var(--qaid-btn-size);border-radius:50%;border:none;background:#f3f4f6;color:#374151;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);transition:background-color .2s,color .2s,transform .2s;-webkit-appearance:none;appearance:none;--qaid-hover-up-bg:var(--qaid-positive);--qaid-hover-up-color:#fff;--qaid-hover-down-bg:var(--qaid-negative);--qaid-hover-down-color:#fff}button.qaid-btn:hover{transform:scale(1.05)}button.qaid-btn-up:hover{background:var(--qaid-hover-up-bg);color:var(--qaid-hover-up-color)}button.qaid-btn-down:hover{background:var(--qaid-hover-down-bg);color:var(--qaid-hover-down-color)}button.qaid-btn svg{width:var(--qaid-icon-size);height:var(--qaid-icon-size)}", nt = {
9
+ const nt = "button.qaid-btn{width:var(--qaid-btn-size);height:var(--qaid-btn-size);border-radius:50%;border:none;background:#f3f4f6;color:#374151;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);transition:background-color .2s,color .2s,transform .2s;-webkit-appearance:none;appearance:none;--qaid-hover-up-bg:var(--qaid-positive);--qaid-hover-up-color:#fff;--qaid-hover-down-bg:var(--qaid-negative);--qaid-hover-down-color:#fff}button.qaid-btn:hover{transform:scale(1.05)}button.qaid-btn-up:hover{background:var(--qaid-hover-up-bg);color:var(--qaid-hover-up-color)}button.qaid-btn-down:hover{background:var(--qaid-hover-down-bg);color:var(--qaid-hover-down-color)}button.qaid-btn svg{width:var(--qaid-icon-size);height:var(--qaid-icon-size)}", st = {
10
10
  small: 36,
11
11
  medium: 48,
12
12
  large: 64
13
- }, st = {
13
+ }, at = {
14
14
  small: 18,
15
15
  medium: 24,
16
16
  large: 32
17
17
  };
18
- function at(e, t, i) {
18
+ function rt(e, t, i) {
19
19
  const [o, n, s] = [e, t, i].map((r) => (r = r / 255, r <= 0.03928 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4)));
20
20
  return 0.2126 * o + 0.7152 * n + 0.0722 * s;
21
21
  }
22
- function rt(e) {
22
+ function dt(e) {
23
23
  if (e.startsWith("#")) {
24
24
  const i = e.slice(1), o = i.length === 3 ? i.split("").map((s) => s + s).join("") : i, n = parseInt(o, 16);
25
25
  return {
@@ -35,11 +35,11 @@ function rt(e) {
35
35
  b: parseInt(t[3])
36
36
  } : null;
37
37
  }
38
- function dt(e) {
39
- const t = rt(e);
40
- return t && at(t.r, t.g, t.b) > 0.4 ? "black" : "white";
38
+ function ct(e) {
39
+ const t = dt(e);
40
+ return t && rt(t.r, t.g, t.b) > 0.4 ? "black" : "white";
41
41
  }
42
- function ct(e = {}) {
42
+ function lt(e = {}) {
43
43
  const {
44
44
  positiveColor: t = "rgb(0, 200, 83)",
45
45
  negativeColor: i = "rgb(255, 0, 0)",
@@ -49,7 +49,7 @@ function ct(e = {}) {
49
49
  backdropOpacity: r = 0.3,
50
50
  fontFamily: l = "system-ui, -apple-system, sans-serif",
51
51
  fontSize: d = 16
52
- } = e, a = nt[n], c = st[n], h = dt(o);
52
+ } = e, a = st[n], c = at[n], h = ct(o);
53
53
  return {
54
54
  "--qaid-positive": t,
55
55
  "--qaid-negative": i,
@@ -63,29 +63,29 @@ function ct(e = {}) {
63
63
  "--qaid-font-size": `${d}px`
64
64
  };
65
65
  }
66
- function lt(e, t) {
66
+ function ht(e, t) {
67
67
  for (const [i, o] of Object.entries(t))
68
68
  e.style.setProperty(i, o);
69
69
  }
70
70
  function z() {
71
- return et + ot;
71
+ return it + nt;
72
72
  }
73
- function ht() {
73
+ function ut() {
74
74
  if (w++, w > 1) return;
75
75
  const e = document.createElement("style");
76
- e.id = "qaid-styles", e.textContent = it, document.head.appendChild(e);
76
+ e.id = "qaid-styles", e.textContent = ot, document.head.appendChild(e);
77
77
  }
78
- function ut() {
78
+ function pt() {
79
79
  if (!(w <= 0) && (w--, w === 0)) {
80
80
  const e = document.getElementById("qaid-styles");
81
81
  e && e.remove();
82
82
  }
83
83
  }
84
- const pt = ["data-comp", "data-qa", "data-testid", "data-id"];
85
- function F(e, t = document.body) {
84
+ const mt = ["data-comp", "data-qa", "data-testid", "data-id"];
85
+ function U(e, t = document.body) {
86
86
  let i = e;
87
87
  for (; i && i !== t; ) {
88
- for (const o of pt) {
88
+ for (const o of mt) {
89
89
  const n = i.getAttribute(o);
90
90
  if (n)
91
91
  return `${o}="${n}"`;
@@ -94,44 +94,44 @@ function F(e, t = document.body) {
94
94
  }
95
95
  return null;
96
96
  }
97
- function mt(e, t = 100) {
97
+ function ft(e, t = 100) {
98
98
  const i = e.textContent?.trim().slice(0, t) || "";
99
99
  return i.length === t ? i + "..." : i;
100
100
  }
101
- function ft(e) {
101
+ function bt(e) {
102
102
  let t = 1, i = e.previousElementSibling;
103
103
  for (; i; )
104
104
  t++, i = i.previousElementSibling;
105
105
  return t;
106
106
  }
107
- function bt(e) {
107
+ function gt(e) {
108
108
  const t = [];
109
109
  let i = e;
110
110
  for (; i && i !== document.body && i !== document.documentElement; ) {
111
- const o = i.tagName.toLowerCase(), n = ft(i);
111
+ const o = i.tagName.toLowerCase(), n = bt(i);
112
112
  t.unshift(`${o}:nth-child(${n})`), i = i.parentElement;
113
113
  }
114
114
  return t.length > 0 ? `body > ${t.join(" > ")}` : "body";
115
115
  }
116
- function gt(e) {
117
- return e.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
118
- }
119
116
  function vt(e) {
120
- const t = F(e);
121
- return t ? `[${t}]` : e.id ? `#${gt(e.id)}` : bt(e);
117
+ return e.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
122
118
  }
123
119
  function yt(e) {
124
- const t = mt(e), i = F(e);
125
- return { selector: vt(e), text: t, dataAttr: i };
120
+ const t = U(e);
121
+ return t ? `[${t}]` : e.id ? `#${vt(e.id)}` : gt(e);
122
+ }
123
+ function wt(e) {
124
+ const t = ft(e), i = U(e);
125
+ return { selector: yt(e), text: t, dataAttr: i };
126
126
  }
127
- const U = {
127
+ const W = {
128
128
  width: 400,
129
129
  height: 280,
130
130
  arrowHeight: 12,
131
131
  gap: 8,
132
132
  viewportPadding: 16
133
133
  };
134
- function wt(e, t, i, o, n) {
134
+ function xt(e, t, i, o, n) {
135
135
  const s = e.y, r = t - (e.y + e.height);
136
136
  if (r >= i + o)
137
137
  return {
@@ -150,22 +150,22 @@ function wt(e, t, i, o, n) {
150
150
  t - i - n
151
151
  ) : d = Math.max(n, e.y - i - o), { top: d, position: l };
152
152
  }
153
- function xt(e, t, i, o) {
153
+ function qt(e, t, i, o) {
154
154
  let s = e.x + e.width / 2 - i / 2;
155
155
  return s = Math.max(o, Math.min(s, t - i - o)), s;
156
156
  }
157
- function qt(e, t, i, o = 24, n = 24) {
157
+ function kt(e, t, i, o = 24, n = 24) {
158
158
  const r = e.clickX - t - n / 2;
159
159
  return Math.max(o, Math.min(r, i - o - n / 2));
160
160
  }
161
- function kt(e, t, i, o = U) {
162
- const n = o.height + o.arrowHeight, s = wt(
161
+ function Ct(e, t, i, o = W) {
162
+ const n = o.height + o.arrowHeight, s = xt(
163
163
  e,
164
164
  i,
165
165
  n,
166
166
  o.gap,
167
167
  o.viewportPadding
168
- ), r = xt(
168
+ ), r = qt(
169
169
  e,
170
170
  t,
171
171
  o.width,
@@ -177,8 +177,8 @@ function kt(e, t, i, o = U) {
177
177
  position: s.position
178
178
  };
179
179
  }
180
- function Ct(e, t, i, o = U) {
181
- const n = kt(e, t, i, o), s = qt(
180
+ function St(e, t, i, o = W) {
181
+ const n = Ct(e, t, i, o), s = kt(
182
182
  e,
183
183
  n.left,
184
184
  o.width
@@ -188,15 +188,15 @@ function Ct(e, t, i, o = U) {
188
188
  arrow: { left: s }
189
189
  };
190
190
  }
191
- const St = 20;
192
- function Et(e) {
191
+ const Et = 20;
192
+ function Tt(e) {
193
193
  const t = [], i = console.error, o = console.warn, n = console.log, s = (r, l) => {
194
194
  const d = {
195
195
  message: l.map((a) => String(a)).join(" "),
196
196
  timestamp: Date.now(),
197
197
  level: r
198
198
  };
199
- t.length >= St && t.shift(), t.push(d), e && e(d);
199
+ t.length >= Et && t.shift(), t.push(d), e && e(d);
200
200
  };
201
201
  return console.error = function(...r) {
202
202
  s("error", r), i.apply(console, r);
@@ -211,16 +211,16 @@ function Et(e) {
211
211
  }
212
212
  };
213
213
  }
214
- const Tt = 20, P = 4096;
214
+ const It = 20, P = 4096;
215
215
  function q(e) {
216
216
  if (e == null) return;
217
217
  const t = typeof e == "string" ? e : JSON.stringify(e);
218
218
  return t.length > P ? t.slice(0, P) + "…[truncated]" : t;
219
219
  }
220
220
  function O(e, t) {
221
- e.length >= Tt && e.shift(), e.push(t);
221
+ e.length >= It && e.shift(), e.push(t);
222
222
  }
223
- async function It(e) {
223
+ async function Lt(e) {
224
224
  try {
225
225
  const t = await e.clone().text();
226
226
  return q(t);
@@ -228,7 +228,7 @@ async function It(e) {
228
228
  return;
229
229
  }
230
230
  }
231
- function Lt() {
231
+ function Ht() {
232
232
  const e = [], t = window.fetch;
233
233
  window.fetch = async function(n, s) {
234
234
  const r = typeof n == "string" ? n : n instanceof URL ? n.toString() : n.url, l = s?.method ?? (typeof n == "object" && "method" in n ? n.method : "GET");
@@ -236,7 +236,7 @@ function Lt() {
236
236
  s?.body && (d = q(s.body));
237
237
  const a = await t.apply(window, [n, s]);
238
238
  if (a.status >= 400) {
239
- const c = await It(a);
239
+ const c = await Lt(a);
240
240
  O(e, {
241
241
  url: r,
242
242
  method: l.toUpperCase(),
@@ -272,10 +272,10 @@ function Lt() {
272
272
  }
273
273
  };
274
274
  }
275
- function Ht() {
275
+ function Dt() {
276
276
  return typeof navigator < "u" && !!navigator.mediaDevices && typeof navigator.mediaDevices.getDisplayMedia == "function" && typeof MediaRecorder < "u";
277
277
  }
278
- function Dt() {
278
+ function Mt() {
279
279
  if (typeof MediaRecorder > "u") return "";
280
280
  const e = [
281
281
  "video/webm;codecs=vp9",
@@ -288,7 +288,7 @@ function Dt() {
288
288
  return t;
289
289
  return "";
290
290
  }
291
- function Mt(e = {}) {
291
+ function Bt(e = {}) {
292
292
  const t = e.maxDuration ?? 15, i = e.videoBitsPerSecond ?? 8e5;
293
293
  let o = null, n = null, s = [], r = null, l = null, d = null, a = 0, c = null, h = null, u = !1, p = null;
294
294
  function g() {
@@ -300,7 +300,7 @@ function Mt(e = {}) {
300
300
  return {
301
301
  async start() {
302
302
  u = !1, s = [];
303
- const m = Dt();
303
+ const m = Mt();
304
304
  if (!m)
305
305
  throw new Error("No supported video MIME type found");
306
306
  o = await navigator.mediaDevices.getDisplayMedia({
@@ -347,7 +347,7 @@ function Mt(e = {}) {
347
347
  }
348
348
  };
349
349
  }
350
- function Bt(e = 640) {
350
+ function Rt(e = 640) {
351
351
  return typeof window < "u" && window.innerWidth < e;
352
352
  }
353
353
  function A(e, t, i) {
@@ -359,7 +359,7 @@ function A(e, t, i) {
359
359
  function $(e) {
360
360
  return e ? e.hasAttribute("data-qaid-embed") || e.hasAttribute("data-qaid-embed-overlay") ? !0 : !!e.closest("[data-qaid-embed], [data-qaid-embed-overlay]") : !1;
361
361
  }
362
- function Rt(e, t = 0) {
362
+ function zt(e, t = 0) {
363
363
  const i = e.getBoundingClientRect();
364
364
  return {
365
365
  x: i.left - t,
@@ -368,7 +368,7 @@ function Rt(e, t = 0) {
368
368
  height: i.height + t * 2
369
369
  };
370
370
  }
371
- async function zt(e = {}) {
371
+ async function Pt(e = {}) {
372
372
  const { quality: t = 1, maxWidth: i = 1280, maxHeight: o = 800 } = e;
373
373
  try {
374
374
  if (!navigator.mediaDevices?.getDisplayMedia)
@@ -397,7 +397,7 @@ async function zt(e = {}) {
397
397
  return console.warn("Screenshot capture failed:", n), null;
398
398
  }
399
399
  }
400
- const N = "https://qaid.dev/lib/html2canvas.min.js", Pt = 1e4, Ot = 50;
400
+ const N = "https://qaid.dev/lib/html2canvas.min.js", Ot = 1e4, At = 50;
401
401
  let y = null;
402
402
  function Xt() {
403
403
  if (typeof document > "u" || typeof window > "u")
@@ -405,7 +405,7 @@ function Xt() {
405
405
  const e = document.createElement("canvas");
406
406
  return typeof e.getContext == "function" && !!e.getContext("2d");
407
407
  }
408
- function At() {
408
+ function $t() {
409
409
  return window.html2canvas ? Promise.resolve(!0) : y || (y = new Promise((e) => {
410
410
  if (!document.querySelector(
411
411
  `script[src="${N}"]`
@@ -418,19 +418,19 @@ function At() {
418
418
  e(!0);
419
419
  return;
420
420
  }
421
- if (Date.now() - i > Pt) {
421
+ if (Date.now() - i > Ot) {
422
422
  y = null, e(!1);
423
423
  return;
424
424
  }
425
- setTimeout(o, Ot);
425
+ setTimeout(o, At);
426
426
  };
427
427
  o();
428
428
  }), y);
429
429
  }
430
- async function $t(e = {}) {
430
+ async function Nt(e = {}) {
431
431
  const { quality: t = 0.8, maxWidth: i = 1280, maxHeight: o = 800 } = e;
432
432
  try {
433
- if (!await At() || !window.html2canvas)
433
+ if (!await $t() || !window.html2canvas)
434
434
  return console.warn("html2canvas failed to load"), null;
435
435
  const s = await window.html2canvas(document.body, {
436
436
  useCORS: !0,
@@ -459,14 +459,14 @@ const V = "qaid_visitor_id", _ = "qaid_hide_feedback";
459
459
  function I(e) {
460
460
  return e ? `${_}_${e}` : _;
461
461
  }
462
- function Nt(e) {
462
+ function Vt(e) {
463
463
  try {
464
464
  return localStorage.getItem(I(e)) === "1";
465
465
  } catch {
466
466
  return !1;
467
467
  }
468
468
  }
469
- function Vt(e, t = !0) {
469
+ function F(e, t = !0) {
470
470
  try {
471
471
  t ? localStorage.setItem(I(e), "1") : localStorage.removeItem(I(e));
472
472
  } catch {
@@ -594,10 +594,10 @@ class Ft {
594
594
  }, this.boundKeyDown = this.handleKeyDown.bind(this), this.boundMouseMove = this.handleMouseMove.bind(this), this.boundClick = this.handleClick.bind(this), this.boundResize = this.handleResize.bind(this), this.visitorId = _t(), this.init();
595
595
  }
596
596
  applyVars(t) {
597
- lt(t, this.cssVars);
597
+ ht(t, this.cssVars);
598
598
  }
599
599
  init() {
600
- ht(), this.cssVars = ct({
600
+ ut(), this.cssVars = lt({
601
601
  positiveColor: this.config.colors.positive,
602
602
  negativeColor: this.config.colors.negative,
603
603
  markerColor: this.config.colors.marker,
@@ -606,7 +606,7 @@ class Ft {
606
606
  backdropOpacity: this.config.backdropOpacity,
607
607
  fontFamily: this.config.fontFamily,
608
608
  fontSize: this.config.fontSize
609
- }), Nt(this.config.apiKey) && (this.config.incognito = !0), this.checkMobile(), window.addEventListener("resize", this.boundResize), this.createEmbed(), this.consoleCapture = Et((t) => {
609
+ }), Vt(this.config.apiKey) && (this.config.incognito = !0), this.checkMobile(), window.addEventListener("resize", this.boundResize), this.createEmbed(), this.consoleCapture = Tt((t) => {
610
610
  this.feedbackData.consoleErrors = this.consoleCapture?.errors ?? [];
611
611
  }), this.feedbackData.consoleErrors = this.consoleCapture.errors, this.observeDom();
612
612
  }
@@ -629,7 +629,7 @@ class Ft {
629
629
  }), this.domObserver.observe(document.body, { childList: !0 });
630
630
  }
631
631
  checkMobile() {
632
- this.isMobile = Bt();
632
+ this.isMobile = Rt();
633
633
  }
634
634
  handleResize() {
635
635
  this.checkMobile();
@@ -663,11 +663,11 @@ class Ft {
663
663
  const u = document.createElement("button");
664
664
  u.type = "button", u.className = n ? `${s} qaid-btn-down` : "qaid-btn qaid-btn-down", u.innerHTML = this.config.negativeIcon || T, u.addEventListener("click", (p) => this.handleThumbClick("down", p.currentTarget, p)), u.addEventListener("mouseenter", () => this.showTooltip(u)), u.addEventListener("mouseleave", () => this.hideTooltip()), h.appendChild(u), this.buttonsContainer.appendChild(a), this.buttonsContainer.appendChild(h);
665
665
  }
666
- if (this.config.captureVideo && Ht()) {
666
+ if (this.config.captureVideo && Dt()) {
667
667
  const a = document.createElement("div");
668
668
  a.className = "qaid-tooltip-wrapper";
669
669
  const c = document.createElement("button");
670
- c.type = "button", c.className = n ? `${s} qaid-btn-record` : "qaid-btn qaid-btn-record", c.innerHTML = this.config.recordIcon || tt, c.addEventListener("click", () => this.startRecording()), c.addEventListener("mouseenter", () => this.showTooltip(c)), c.addEventListener("mouseleave", () => this.hideTooltip()), a.appendChild(c), this.buttonsContainer.appendChild(a);
670
+ c.type = "button", c.className = n ? `${s} qaid-btn-record` : "qaid-btn qaid-btn-record", c.innerHTML = this.config.recordIcon || et, c.addEventListener("click", () => this.startRecording()), c.addEventListener("mouseenter", () => this.showTooltip(c)), c.addEventListener("mouseleave", () => this.hideTooltip()), a.appendChild(c), this.buttonsContainer.appendChild(a);
671
671
  }
672
672
  this.dismissBtn = document.createElement("button"), this.dismissBtn.type = "button", this.dismissBtn.className = "qaid-dismiss-btn", this.dismissBtn.setAttribute("aria-label", "Hide Feedback"), this.dismissBtn.title = "Hide Feedback", this.dismissBtn.innerHTML = '<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2 2l8 8M10 2l-8 8" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>', this.dismissBtn.addEventListener("click", (a) => {
673
673
  a.stopPropagation(), this.handleDismiss();
@@ -702,10 +702,10 @@ class Ft {
702
702
  this.tooltipElement && this.tooltipElement.classList.remove("qaid-tooltip-visible");
703
703
  }
704
704
  handleDismiss() {
705
- this.buttonsContainer && this.buttonsContainer.classList.add("qaid-incognito"), Vt(this.config.apiKey, !0);
705
+ this.buttonsContainer && this.buttonsContainer.classList.add("qaid-incognito"), F(this.config.apiKey, !0);
706
706
  }
707
707
  handleThumbClick(t, i, o) {
708
- this.config.skipTargeting ? this.submitDirectFeedback(t, i) : this.startTargeting(t, o);
708
+ this.buttonsContainer?.classList.contains("qaid-incognito") && (this.buttonsContainer.classList.remove("qaid-incognito"), F(this.config.apiKey, !1)), this.config.skipTargeting ? this.submitDirectFeedback(t, i) : this.startTargeting(t, o);
709
709
  }
710
710
  submitDirectFeedback(t, i) {
711
711
  this.feedbackData.feedbackType = t, this.feedbackData.elementSelector = null, this.feedbackData.elementText = null;
@@ -762,14 +762,14 @@ class Ft {
762
762
  );
763
763
  if (!o || $(o))
764
764
  return;
765
- const n = Rt(o, 8);
765
+ const n = zt(o, 8);
766
766
  this.selectedBounds = {
767
767
  ...n,
768
768
  clickX: t.clientX,
769
769
  clickY: t.clientY,
770
770
  visible: !0
771
771
  };
772
- const { selector: s, text: r } = yt(o);
772
+ const { selector: s, text: r } = wt(o);
773
773
  this.feedbackData.elementSelector = s, this.feedbackData.elementText = r, this.removeTargetingOverlay(), document.removeEventListener("mousemove", this.boundMouseMove), document.removeEventListener("click", this.boundClick, !0), document.removeEventListener("keydown", this.boundKeyDown), document.body.classList.remove("qaid-targeting", "qaid-type-up"), document.body.style.removeProperty("--qaid-positive"), document.body.style.removeProperty("--qaid-negative"), this.state = "SELECTED", this.showSelectedMarker(), this.submitFeedback();
774
774
  }
775
775
  cancelTargeting() {
@@ -789,7 +789,7 @@ class Ft {
789
789
  async submitFeedback() {
790
790
  if (!this.feedbackData.feedbackType) return;
791
791
  let t = null;
792
- this.config.captureScreenshot && (this.config.screenshotMethod === "dom" ? t = await $t(this.config.screenshotOptions) : t = await zt(this.config.screenshotOptions));
792
+ this.config.captureScreenshot && (this.config.screenshotMethod === "dom" ? t = await Nt(this.config.screenshotOptions) : t = await Pt(this.config.screenshotOptions));
793
793
  const i = this.feedbackData.elementSelector ? {
794
794
  x: this.selectedBounds.x,
795
795
  y: this.selectedBounds.y,
@@ -843,7 +843,7 @@ class Ft {
843
843
  `, this.applyVars(i), t.appendChild(i), this.modalContainer = i, this.setupModalInteractions();
844
844
  }
845
845
  showPositionedModal() {
846
- const t = this.ensureOverlayHost(), { modal: i, arrow: o } = Ct(
846
+ const t = this.ensureOverlayHost(), { modal: i, arrow: o } = St(
847
847
  this.selectedBounds,
848
848
  window.innerWidth,
849
849
  window.innerHeight,
@@ -926,7 +926,7 @@ class Ft {
926
926
  async startRecording() {
927
927
  if (!(this.isRecording || this.state !== "IDLE"))
928
928
  try {
929
- this.networkCapture = Lt(), this.videoRecorder = Mt({
929
+ this.networkCapture = Ht(), this.videoRecorder = Bt({
930
930
  maxDuration: this.config.videoOptions.maxDuration
931
931
  }), this.videoRecorder.onTick((t) => {
932
932
  this.updateRecordingTimer(t);
@@ -1037,10 +1037,10 @@ class Ft {
1037
1037
  * Destroy the embed and clean up all resources
1038
1038
  */
1039
1039
  destroy() {
1040
- this.destroyed = !0, this.domObserver && (this.domObserver.disconnect(), this.domObserver = null), this.boundBeforeSwap && (document.removeEventListener("astro:before-swap", this.boundBeforeSwap), this.boundBeforeSwap = null), this.cleanupRecording(), this.removeVideoPreview(), this.consoleCapture && (this.consoleCapture.restore(), this.consoleCapture = null), window.removeEventListener("resize", this.boundResize), document.removeEventListener("keydown", this.boundKeyDown), document.removeEventListener("mousemove", this.boundMouseMove), document.removeEventListener("click", this.boundClick, !0), document.body.classList.remove("qaid-targeting", "qaid-type-up"), document.body.style.removeProperty("--qaid-positive"), document.body.style.removeProperty("--qaid-negative"), this.shadowHost && (this.shadowHost.remove(), this.shadowHost = null, this.shadowRoot = null), this.overlayShadowHost && (this.overlayShadowHost.remove(), this.overlayShadowHost = null, this.overlayShadowRoot = null), this.buttonsContainer = null, this.overlayContainer = null, this.captureLayer = null, this.crosshairH = null, this.crosshairV = null, this.scope = null, this.marker = null, this.modalContainer = null, this.backdrop = null, this.dismissBtn = null, this.tooltipElement = null, ut();
1040
+ this.destroyed = !0, this.domObserver && (this.domObserver.disconnect(), this.domObserver = null), this.boundBeforeSwap && (document.removeEventListener("astro:before-swap", this.boundBeforeSwap), this.boundBeforeSwap = null), this.cleanupRecording(), this.removeVideoPreview(), this.consoleCapture && (this.consoleCapture.restore(), this.consoleCapture = null), window.removeEventListener("resize", this.boundResize), document.removeEventListener("keydown", this.boundKeyDown), document.removeEventListener("mousemove", this.boundMouseMove), document.removeEventListener("click", this.boundClick, !0), document.body.classList.remove("qaid-targeting", "qaid-type-up"), document.body.style.removeProperty("--qaid-positive"), document.body.style.removeProperty("--qaid-negative"), this.shadowHost && (this.shadowHost.remove(), this.shadowHost = null, this.shadowRoot = null), this.overlayShadowHost && (this.overlayShadowHost.remove(), this.overlayShadowHost = null, this.overlayShadowRoot = null), this.buttonsContainer = null, this.overlayContainer = null, this.captureLayer = null, this.crosshairH = null, this.crosshairV = null, this.scope = null, this.marker = null, this.modalContainer = null, this.backdrop = null, this.dismissBtn = null, this.tooltipElement = null, pt();
1041
1041
  }
1042
1042
  }
1043
- function W(e) {
1043
+ function X(e) {
1044
1044
  return document.querySelector(e)?.textContent?.trim() ?? "";
1045
1045
  }
1046
1046
  function Ut() {
@@ -1052,7 +1052,7 @@ function Ut() {
1052
1052
  if (!t) return null;
1053
1053
  try {
1054
1054
  const i = JSON.parse(t);
1055
- return i.cssSelector && !i.css && (i.css = W(i.cssSelector), delete i.cssSelector), i;
1055
+ return i.cssSelector && !i.css && (i.css = X(i.cssSelector), delete i.cssSelector), i;
1056
1056
  } catch {
1057
1057
  return null;
1058
1058
  }
@@ -1060,12 +1060,12 @@ function Ut() {
1060
1060
  function Wt(e) {
1061
1061
  const t = e.getAttribute("data-endpoint");
1062
1062
  if (!t) return null;
1063
- const i = e.getAttribute("data-position"), o = e.getAttribute("data-zindex"), n = e.getAttribute("data-positive-color"), s = e.getAttribute("data-negative-color"), r = e.getAttribute("data-marker-color"), l = e.getAttribute("data-container"), d = e.getAttribute("data-button-class"), a = e.getAttribute("data-skip-targeting"), c = e.getAttribute("data-incognito"), h = e.getAttribute("data-button-size"), u = e.getAttribute("data-offset-x"), p = e.getAttribute("data-offset-y"), g = e.getAttribute("data-modal-width"), f = e.getAttribute("data-backdrop-opacity"), m = e.getAttribute("data-font-family"), v = e.getAttribute("data-font-size"), b = e.getAttribute("data-tooltip"), x = e.getAttribute("data-modal-title"), L = e.getAttribute("data-modal-subtitle"), H = e.getAttribute("data-placeholder"), D = e.getAttribute("data-submit-button"), M = e.getAttribute("data-skip-button"), X = e.getAttribute("data-positive-icon"), j = e.getAttribute("data-negative-icon"), K = e.getAttribute("data-api-key"), Y = e.getAttribute("data-capture-screenshot"), k = e.getAttribute("data-screenshot-quality"), C = e.getAttribute("data-screenshot-max-width"), S = e.getAttribute("data-screenshot-max-height"), J = e.getAttribute("data-capture-video"), G = e.getAttribute("data-hide-thumbs"), B = e.getAttribute("data-video-max-duration"), Z = e.getAttribute("data-screenshot-method"), Q = e.getAttribute("data-direction"), R = e.getAttribute("data-css-selector");
1063
+ const i = e.getAttribute("data-position"), o = e.getAttribute("data-zindex"), n = e.getAttribute("data-positive-color"), s = e.getAttribute("data-negative-color"), r = e.getAttribute("data-marker-color"), l = e.getAttribute("data-container"), d = e.getAttribute("data-button-class"), a = e.getAttribute("data-skip-targeting"), c = e.getAttribute("data-incognito"), h = e.getAttribute("data-button-size"), u = e.getAttribute("data-offset-x"), p = e.getAttribute("data-offset-y"), g = e.getAttribute("data-modal-width"), f = e.getAttribute("data-backdrop-opacity"), m = e.getAttribute("data-font-family"), v = e.getAttribute("data-font-size"), b = e.getAttribute("data-tooltip"), x = e.getAttribute("data-modal-title"), L = e.getAttribute("data-modal-subtitle"), H = e.getAttribute("data-placeholder"), D = e.getAttribute("data-submit-button"), M = e.getAttribute("data-skip-button"), j = e.getAttribute("data-positive-icon"), K = e.getAttribute("data-negative-icon"), Y = e.getAttribute("data-api-key"), J = e.getAttribute("data-capture-screenshot"), k = e.getAttribute("data-screenshot-quality"), C = e.getAttribute("data-screenshot-max-width"), S = e.getAttribute("data-screenshot-max-height"), G = e.getAttribute("data-capture-video"), Z = e.getAttribute("data-hide-thumbs"), B = e.getAttribute("data-video-max-duration"), Q = e.getAttribute("data-screenshot-method"), tt = e.getAttribute("data-direction"), R = e.getAttribute("data-css-selector");
1064
1064
  return {
1065
1065
  endpoint: t,
1066
- css: R ? W(R) : void 0,
1067
- apiKey: K ?? void 0,
1068
- captureScreenshot: Y === "true" ? !0 : void 0,
1066
+ css: R ? X(R) : void 0,
1067
+ apiKey: Y ?? void 0,
1068
+ captureScreenshot: J === "true" ? !0 : void 0,
1069
1069
  screenshotOptions: k || C || S ? {
1070
1070
  quality: k ? parseFloat(k) : void 0,
1071
1071
  maxWidth: C ? parseInt(C, 10) : void 0,
@@ -1073,7 +1073,7 @@ function Wt(e) {
1073
1073
  } : void 0,
1074
1074
  container: l ?? void 0,
1075
1075
  buttonClass: d ?? void 0,
1076
- direction: Q ?? void 0,
1076
+ direction: tt ?? void 0,
1077
1077
  position: i ?? void 0,
1078
1078
  zIndex: o ? parseInt(o, 10) : void 0,
1079
1079
  skipTargeting: a === "true" ? !0 : void 0,
@@ -1100,11 +1100,11 @@ function Wt(e) {
1100
1100
  submitButton: D ?? void 0,
1101
1101
  skipButton: M ?? void 0
1102
1102
  } : void 0,
1103
- positiveIcon: X ?? void 0,
1104
- negativeIcon: j ?? void 0,
1105
- screenshotMethod: Z ?? void 0,
1106
- captureVideo: J === "true" ? !0 : void 0,
1107
- hideThumbs: G === "true" ? !0 : void 0,
1103
+ positiveIcon: j ?? void 0,
1104
+ negativeIcon: K ?? void 0,
1105
+ screenshotMethod: Q ?? void 0,
1106
+ captureVideo: G === "true" ? !0 : void 0,
1107
+ hideThumbs: Z === "true" ? !0 : void 0,
1108
1108
  videoOptions: B ? {
1109
1109
  maxDuration: parseInt(B, 10)
1110
1110
  } : void 0
@@ -1119,11 +1119,11 @@ if (typeof document < "u") {
1119
1119
  }
1120
1120
  export {
1121
1121
  Ft as QaidFeedback,
1122
- $t as captureDomScreenshot,
1123
- Lt as captureNetworkErrors,
1124
- Mt as createVideoRecorder,
1125
- Dt as getSupportedMimeType,
1122
+ Nt as captureDomScreenshot,
1123
+ Ht as captureNetworkErrors,
1124
+ Bt as createVideoRecorder,
1125
+ Mt as getSupportedMimeType,
1126
1126
  Xt as isDomScreenshotSupported,
1127
- Ht as isVideoRecordingSupported
1127
+ Dt as isVideoRecordingSupported
1128
1128
  };
1129
1129
  //# sourceMappingURL=qaid.js.map