@qaiddev/thumbs-embed 1.0.10 → 1.0.11

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>`, Z = `<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>`, tt = `<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>`, Q = "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}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)}", tt = "body.qaid-targeting,body.qaid-targeting *{cursor:none!important}";
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}";
8
8
  let w = 0;
9
- const et = "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)}", it = {
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 = {
10
10
  small: 36,
11
11
  medium: 48,
12
12
  large: 64
13
- }, ot = {
13
+ }, st = {
14
14
  small: 18,
15
15
  medium: 24,
16
16
  large: 32
17
17
  };
18
- function nt(e, t, i) {
18
+ function at(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 st(e) {
22
+ function rt(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 st(e) {
35
35
  b: parseInt(t[3])
36
36
  } : null;
37
37
  }
38
- function at(e) {
39
- const t = st(e);
40
- return t && nt(t.r, t.g, t.b) > 0.4 ? "black" : "white";
38
+ function dt(e) {
39
+ const t = rt(e);
40
+ return t && at(t.r, t.g, t.b) > 0.4 ? "black" : "white";
41
41
  }
42
- function rt(e = {}) {
42
+ function ct(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 rt(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 = it[n], c = ot[n], h = at(o);
52
+ } = e, a = nt[n], c = st[n], h = dt(o);
53
53
  return {
54
54
  "--qaid-positive": t,
55
55
  "--qaid-negative": i,
@@ -63,29 +63,29 @@ function rt(e = {}) {
63
63
  "--qaid-font-size": `${d}px`
64
64
  };
65
65
  }
66
- function dt(e, t) {
66
+ function lt(e, t) {
67
67
  for (const [i, o] of Object.entries(t))
68
68
  e.style.setProperty(i, o);
69
69
  }
70
- function B() {
71
- return Q + et;
70
+ function z() {
71
+ return et + ot;
72
72
  }
73
- function ct() {
73
+ function ht() {
74
74
  if (w++, w > 1) return;
75
75
  const e = document.createElement("style");
76
- e.id = "qaid-styles", e.textContent = tt, document.head.appendChild(e);
76
+ e.id = "qaid-styles", e.textContent = it, document.head.appendChild(e);
77
77
  }
78
- function lt() {
78
+ function ut() {
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 ht = ["data-comp", "data-qa", "data-testid", "data-id"];
85
- function V(e, t = document.body) {
84
+ const pt = ["data-comp", "data-qa", "data-testid", "data-id"];
85
+ function F(e, t = document.body) {
86
86
  let i = e;
87
87
  for (; i && i !== t; ) {
88
- for (const o of ht) {
88
+ for (const o of pt) {
89
89
  const n = i.getAttribute(o);
90
90
  if (n)
91
91
  return `${o}="${n}"`;
@@ -94,35 +94,35 @@ function V(e, t = document.body) {
94
94
  }
95
95
  return null;
96
96
  }
97
- function ut(e, t = 100) {
97
+ function mt(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 pt(e) {
101
+ function ft(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 mt(e) {
107
+ function bt(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 = pt(i);
111
+ const o = i.tagName.toLowerCase(), n = ft(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 ft(e) {
116
+ function gt(e) {
117
117
  return e.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
118
118
  }
119
- function bt(e) {
120
- const t = V(e);
121
- return t ? `[${t}]` : e.id ? `#${ft(e.id)}` : mt(e);
119
+ function vt(e) {
120
+ const t = F(e);
121
+ return t ? `[${t}]` : e.id ? `#${gt(e.id)}` : bt(e);
122
122
  }
123
- function gt(e) {
124
- const t = ut(e), i = V(e);
125
- return { selector: bt(e), text: t, dataAttr: i };
123
+ function yt(e) {
124
+ const t = mt(e), i = F(e);
125
+ return { selector: vt(e), text: t, dataAttr: i };
126
126
  }
127
127
  const U = {
128
128
  width: 400,
@@ -131,7 +131,7 @@ const U = {
131
131
  gap: 8,
132
132
  viewportPadding: 16
133
133
  };
134
- function vt(e, t, i, o, n) {
134
+ function wt(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 vt(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 yt(e, t, i, o) {
153
+ function xt(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 wt(e, t, i, o = 24, n = 24) {
157
+ function qt(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 xt(e, t, i, o = U) {
162
- const n = o.height + o.arrowHeight, s = vt(
161
+ function kt(e, t, i, o = U) {
162
+ const n = o.height + o.arrowHeight, s = wt(
163
163
  e,
164
164
  i,
165
165
  n,
166
166
  o.gap,
167
167
  o.viewportPadding
168
- ), r = yt(
168
+ ), r = xt(
169
169
  e,
170
170
  t,
171
171
  o.width,
@@ -177,8 +177,8 @@ function xt(e, t, i, o = U) {
177
177
  position: s.position
178
178
  };
179
179
  }
180
- function qt(e, t, i, o = U) {
181
- const n = xt(e, t, i, o), s = wt(
180
+ function Ct(e, t, i, o = U) {
181
+ const n = kt(e, t, i, o), s = qt(
182
182
  e,
183
183
  n.left,
184
184
  o.width
@@ -188,15 +188,15 @@ function qt(e, t, i, o = U) {
188
188
  arrow: { left: s }
189
189
  };
190
190
  }
191
- const kt = 20;
192
- function Ct(e) {
191
+ const St = 20;
192
+ function Et(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 >= kt && t.shift(), t.push(d), e && e(d);
199
+ t.length >= St && 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 Ct(e) {
211
211
  }
212
212
  };
213
213
  }
214
- const St = 20, z = 4096;
214
+ const Tt = 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
- return t.length > z ? t.slice(0, z) + "…[truncated]" : t;
218
+ return t.length > P ? t.slice(0, P) + "…[truncated]" : t;
219
219
  }
220
220
  function O(e, t) {
221
- e.length >= St && e.shift(), e.push(t);
221
+ e.length >= Tt && e.shift(), e.push(t);
222
222
  }
223
- async function Et(e) {
223
+ async function It(e) {
224
224
  try {
225
225
  const t = await e.clone().text();
226
226
  return q(t);
@@ -228,7 +228,7 @@ async function Et(e) {
228
228
  return;
229
229
  }
230
230
  }
231
- function Tt() {
231
+ function Lt() {
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 Tt() {
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 Et(a);
239
+ const c = await It(a);
240
240
  O(e, {
241
241
  url: r,
242
242
  method: l.toUpperCase(),
@@ -272,10 +272,10 @@ function Tt() {
272
272
  }
273
273
  };
274
274
  }
275
- function It() {
275
+ function Ht() {
276
276
  return typeof navigator < "u" && !!navigator.mediaDevices && typeof navigator.mediaDevices.getDisplayMedia == "function" && typeof MediaRecorder < "u";
277
277
  }
278
- function Lt() {
278
+ function Dt() {
279
279
  if (typeof MediaRecorder > "u") return "";
280
280
  const e = [
281
281
  "video/webm;codecs=vp9",
@@ -288,7 +288,7 @@ function Lt() {
288
288
  return t;
289
289
  return "";
290
290
  }
291
- function Rt(e = {}) {
291
+ function Mt(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 Rt(e = {}) {
300
300
  return {
301
301
  async start() {
302
302
  u = !1, s = [];
303
- const m = Lt();
303
+ const m = Dt();
304
304
  if (!m)
305
305
  throw new Error("No supported video MIME type found");
306
306
  o = await navigator.mediaDevices.getDisplayMedia({
@@ -347,19 +347,19 @@ function Rt(e = {}) {
347
347
  }
348
348
  };
349
349
  }
350
- function Ht(e = 640) {
350
+ function Bt(e = 640) {
351
351
  return typeof window < "u" && window.innerWidth < e;
352
352
  }
353
- function P(e, t, i) {
353
+ function A(e, t, i) {
354
354
  const o = i.map((s) => s.style.visibility);
355
355
  i.forEach((s) => s.style.visibility = "hidden");
356
356
  const n = document.elementFromPoint(e, t);
357
357
  return i.forEach((s, r) => s.style.visibility = o[r]), n;
358
358
  }
359
- function A(e) {
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 Mt(e, t = 0) {
362
+ function Rt(e, t = 0) {
363
363
  const i = e.getBoundingClientRect();
364
364
  return {
365
365
  x: i.left - t,
@@ -368,7 +368,7 @@ function Mt(e, t = 0) {
368
368
  height: i.height + t * 2
369
369
  };
370
370
  }
371
- async function Dt(e = {}) {
371
+ async function zt(e = {}) {
372
372
  const { quality: t = 1, maxWidth: i = 1280, maxHeight: o = 800 } = e;
373
373
  try {
374
374
  if (!navigator.mediaDevices?.getDisplayMedia)
@@ -397,40 +397,40 @@ async function Dt(e = {}) {
397
397
  return console.warn("Screenshot capture failed:", n), null;
398
398
  }
399
399
  }
400
- const $ = "https://qaid.dev/lib/html2canvas.min.js", Bt = 1e4, zt = 50;
400
+ const N = "https://qaid.dev/lib/html2canvas.min.js", Pt = 1e4, Ot = 50;
401
401
  let y = null;
402
- function Ut() {
402
+ function Xt() {
403
403
  if (typeof document > "u" || typeof window > "u")
404
404
  return !1;
405
405
  const e = document.createElement("canvas");
406
406
  return typeof e.getContext == "function" && !!e.getContext("2d");
407
407
  }
408
- function Ot() {
408
+ function At() {
409
409
  return window.html2canvas ? Promise.resolve(!0) : y || (y = new Promise((e) => {
410
410
  if (!document.querySelector(
411
- `script[src="${$}"]`
411
+ `script[src="${N}"]`
412
412
  )) {
413
413
  const n = document.createElement("script");
414
- n.src = $, n.async = !0, document.head.appendChild(n);
414
+ n.src = N, n.async = !0, document.head.appendChild(n);
415
415
  }
416
416
  const i = Date.now(), o = () => {
417
417
  if (window.html2canvas) {
418
418
  e(!0);
419
419
  return;
420
420
  }
421
- if (Date.now() - i > Bt) {
421
+ if (Date.now() - i > Pt) {
422
422
  y = null, e(!1);
423
423
  return;
424
424
  }
425
- setTimeout(o, zt);
425
+ setTimeout(o, Ot);
426
426
  };
427
427
  o();
428
428
  }), y);
429
429
  }
430
- async function Pt(e = {}) {
430
+ async function $t(e = {}) {
431
431
  const { quality: t = 0.8, maxWidth: i = 1280, maxHeight: o = 800 } = e;
432
432
  try {
433
- if (!await Ot() || !window.html2canvas)
433
+ if (!await At() || !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,
@@ -455,16 +455,32 @@ async function Pt(e = {}) {
455
455
  return console.warn("DOM screenshot capture failed:", n), null;
456
456
  }
457
457
  }
458
- const N = "qaid_visitor_id";
459
- function At() {
458
+ const V = "qaid_visitor_id", _ = "qaid_hide_feedback";
459
+ function I(e) {
460
+ return e ? `${_}_${e}` : _;
461
+ }
462
+ function Nt(e) {
460
463
  try {
461
- let e = localStorage.getItem(N);
462
- return e || (e = crypto.randomUUID(), localStorage.setItem(N, e)), e;
464
+ return localStorage.getItem(I(e)) === "1";
465
+ } catch {
466
+ return !1;
467
+ }
468
+ }
469
+ function Vt(e, t = !0) {
470
+ try {
471
+ t ? localStorage.setItem(I(e), "1") : localStorage.removeItem(I(e));
472
+ } catch {
473
+ }
474
+ }
475
+ function _t() {
476
+ try {
477
+ let e = localStorage.getItem(V);
478
+ return e || (e = crypto.randomUUID(), localStorage.setItem(V, e)), e;
463
479
  } catch {
464
480
  return crypto.randomUUID();
465
481
  }
466
482
  }
467
- class $t {
483
+ class Ft {
468
484
  config;
469
485
  state = "IDLE";
470
486
  feedbackData = {
@@ -514,6 +530,7 @@ class $t {
514
530
  marker = null;
515
531
  modalContainer = null;
516
532
  backdrop = null;
533
+ dismissBtn = null;
517
534
  // Per-instance CSS variables
518
535
  cssVars = {};
519
536
  // Bound event handlers
@@ -574,13 +591,13 @@ class $t {
574
591
  maxDuration: t.videoOptions?.maxDuration ?? 15
575
592
  },
576
593
  recordIcon: t.recordIcon ?? ""
577
- }, 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 = At(), this.init();
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();
578
595
  }
579
596
  applyVars(t) {
580
- dt(t, this.cssVars);
597
+ lt(t, this.cssVars);
581
598
  }
582
599
  init() {
583
- ct(), this.cssVars = rt({
600
+ ht(), this.cssVars = ct({
584
601
  positiveColor: this.config.colors.positive,
585
602
  negativeColor: this.config.colors.negative,
586
603
  markerColor: this.config.colors.marker,
@@ -589,7 +606,7 @@ class $t {
589
606
  backdropOpacity: this.config.backdropOpacity,
590
607
  fontFamily: this.config.fontFamily,
591
608
  fontSize: this.config.fontSize
592
- }), this.checkMobile(), window.addEventListener("resize", this.boundResize), this.createEmbed(), this.consoleCapture = Ct((t) => {
609
+ }), Nt(this.config.apiKey) && (this.config.incognito = !0), this.checkMobile(), window.addEventListener("resize", this.boundResize), this.createEmbed(), this.consoleCapture = Et((t) => {
593
610
  this.feedbackData.consoleErrors = this.consoleCapture?.errors ?? [];
594
611
  }), this.feedbackData.consoleErrors = this.consoleCapture.errors, this.observeDom();
595
612
  }
@@ -612,7 +629,7 @@ class $t {
612
629
  }), this.domObserver.observe(document.body, { childList: !0 });
613
630
  }
614
631
  checkMobile() {
615
- this.isMobile = Ht();
632
+ this.isMobile = Bt();
616
633
  }
617
634
  handleResize() {
618
635
  this.checkMobile();
@@ -622,7 +639,7 @@ class $t {
622
639
  let t = null;
623
640
  this.config.container && (t = document.querySelector(this.config.container)), t ? (t.appendChild(this.shadowHost), this.isUserProvidedContainer = !0) : (this.shadowHost.style.position = "fixed", this.shadowHost.style.display = "block", this.shadowHost.style.inset = "0", this.shadowHost.style.pointerEvents = "none", this.shadowHost.style.zIndex = String(this.config.zIndex), document.body.appendChild(this.shadowHost)), this.shadowRoot = this.shadowHost.attachShadow({ mode: "open" });
624
641
  const i = document.createElement("style");
625
- if (i.textContent = B(), this.shadowRoot.appendChild(i), this.config.css) {
642
+ if (i.textContent = z(), this.shadowRoot.appendChild(i), this.config.css) {
626
643
  const a = document.createElement("style");
627
644
  a.textContent = this.config.css, this.shadowRoot.appendChild(a);
628
645
  }
@@ -646,12 +663,15 @@ class $t {
646
663
  const u = document.createElement("button");
647
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);
648
665
  }
649
- if (this.config.captureVideo && It()) {
666
+ if (this.config.captureVideo && Ht()) {
650
667
  const a = document.createElement("div");
651
668
  a.className = "qaid-tooltip-wrapper";
652
669
  const c = document.createElement("button");
653
- c.type = "button", c.className = n ? `${s} qaid-btn-record` : "qaid-btn qaid-btn-record", c.innerHTML = this.config.recordIcon || Z, 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 || tt, c.addEventListener("click", () => this.startRecording()), c.addEventListener("mouseenter", () => this.showTooltip(c)), c.addEventListener("mouseleave", () => this.hideTooltip()), a.appendChild(c), this.buttonsContainer.appendChild(a);
654
671
  }
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
+ a.stopPropagation(), this.handleDismiss();
674
+ }), this.buttonsContainer.appendChild(this.dismissBtn);
655
675
  }
656
676
  /**
657
677
  * Lazily create a separate overlay shadow host on document.body.
@@ -663,7 +683,7 @@ class $t {
663
683
  if (this.overlayShadowRoot) return this.overlayShadowRoot;
664
684
  this.overlayShadowHost = document.createElement("div"), this.overlayShadowHost.setAttribute("data-qaid-embed-overlay", ""), this.overlayShadowHost.style.position = "fixed", this.overlayShadowHost.style.inset = "0", this.overlayShadowHost.style.pointerEvents = "none", this.overlayShadowHost.style.zIndex = String(this.config.zIndex), document.body.appendChild(this.overlayShadowHost), this.overlayShadowRoot = this.overlayShadowHost.attachShadow({ mode: "open" });
665
685
  const t = document.createElement("style");
666
- if (t.textContent = B(), this.overlayShadowRoot.appendChild(t), this.config.css) {
686
+ if (t.textContent = z(), this.overlayShadowRoot.appendChild(t), this.config.css) {
667
687
  const i = document.createElement("style");
668
688
  i.textContent = this.config.css, this.overlayShadowRoot.appendChild(i);
669
689
  }
@@ -681,6 +701,9 @@ class $t {
681
701
  hideTooltip() {
682
702
  this.tooltipElement && this.tooltipElement.classList.remove("qaid-tooltip-visible");
683
703
  }
704
+ handleDismiss() {
705
+ this.buttonsContainer && this.buttonsContainer.classList.add("qaid-incognito"), Vt(this.config.apiKey, !0);
706
+ }
684
707
  handleThumbClick(t, i, o) {
685
708
  this.config.skipTargeting ? this.submitDirectFeedback(t, i) : this.startTargeting(t, o);
686
709
  }
@@ -715,12 +738,12 @@ class $t {
715
738
  }
716
739
  handleMouseMove(t) {
717
740
  if (this.mousePos.x = t.clientX, this.mousePos.y = t.clientY, this.crosshairH && (this.crosshairH.style.top = `${t.clientY}px`), this.crosshairV && (this.crosshairV.style.left = `${t.clientX}px`), this.scope && (this.scope.style.left = `${t.clientX}px`, this.scope.style.top = `${t.clientY}px`), this.captureLayer && this.shadowHost) {
718
- const i = [this.shadowHost, this.overlayShadowHost].filter(Boolean), o = P(
741
+ const i = [this.shadowHost, this.overlayShadowHost].filter(Boolean), o = A(
719
742
  t.clientX,
720
743
  t.clientY,
721
744
  i
722
745
  );
723
- if (o && !A(o)) {
746
+ if (o && !$(o)) {
724
747
  if (this.highlightBox) {
725
748
  const n = o.getBoundingClientRect();
726
749
  this.highlightBox.style.transform = `translate(${n.left}px, ${n.top}px)`, this.highlightBox.style.width = `${n.width}px`, this.highlightBox.style.height = `${n.height}px`, this.highlightBox.style.display = "block";
@@ -732,21 +755,21 @@ class $t {
732
755
  handleClick(t) {
733
756
  if (this.state !== "TARGETING" || !this.shadowHost) return;
734
757
  t.preventDefault(), t.stopPropagation();
735
- const i = [this.shadowHost, this.overlayShadowHost].filter(Boolean), o = P(
758
+ const i = [this.shadowHost, this.overlayShadowHost].filter(Boolean), o = A(
736
759
  t.clientX,
737
760
  t.clientY,
738
761
  i
739
762
  );
740
- if (!o || A(o))
763
+ if (!o || $(o))
741
764
  return;
742
- const n = Mt(o, 8);
765
+ const n = Rt(o, 8);
743
766
  this.selectedBounds = {
744
767
  ...n,
745
768
  clickX: t.clientX,
746
769
  clickY: t.clientY,
747
770
  visible: !0
748
771
  };
749
- const { selector: s, text: r } = gt(o);
772
+ const { selector: s, text: r } = yt(o);
750
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();
751
774
  }
752
775
  cancelTargeting() {
@@ -766,7 +789,7 @@ class $t {
766
789
  async submitFeedback() {
767
790
  if (!this.feedbackData.feedbackType) return;
768
791
  let t = null;
769
- this.config.captureScreenshot && (this.config.screenshotMethod === "dom" ? t = await Pt(this.config.screenshotOptions) : t = await Dt(this.config.screenshotOptions));
792
+ this.config.captureScreenshot && (this.config.screenshotMethod === "dom" ? t = await $t(this.config.screenshotOptions) : t = await zt(this.config.screenshotOptions));
770
793
  const i = this.feedbackData.elementSelector ? {
771
794
  x: this.selectedBounds.x,
772
795
  y: this.selectedBounds.y,
@@ -820,7 +843,7 @@ class $t {
820
843
  `, this.applyVars(i), t.appendChild(i), this.modalContainer = i, this.setupModalInteractions();
821
844
  }
822
845
  showPositionedModal() {
823
- const t = this.ensureOverlayHost(), { modal: i, arrow: o } = qt(
846
+ const t = this.ensureOverlayHost(), { modal: i, arrow: o } = Ct(
824
847
  this.selectedBounds,
825
848
  window.innerWidth,
826
849
  window.innerHeight,
@@ -903,7 +926,7 @@ class $t {
903
926
  async startRecording() {
904
927
  if (!(this.isRecording || this.state !== "IDLE"))
905
928
  try {
906
- this.networkCapture = Tt(), this.videoRecorder = Rt({
929
+ this.networkCapture = Lt(), this.videoRecorder = Mt({
907
930
  maxDuration: this.config.videoOptions.maxDuration
908
931
  }), this.videoRecorder.onTick((t) => {
909
932
  this.updateRecordingTimer(t);
@@ -1014,13 +1037,13 @@ class $t {
1014
1037
  * Destroy the embed and clean up all resources
1015
1038
  */
1016
1039
  destroy() {
1017
- 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.tooltipElement = null, lt();
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();
1018
1041
  }
1019
1042
  }
1020
- function _(e) {
1043
+ function W(e) {
1021
1044
  return document.querySelector(e)?.textContent?.trim() ?? "";
1022
1045
  }
1023
- function Nt() {
1046
+ function Ut() {
1024
1047
  const e = document.querySelector(
1025
1048
  'script[type="application/json"][data-feedback-config]'
1026
1049
  );
@@ -1029,20 +1052,20 @@ function Nt() {
1029
1052
  if (!t) return null;
1030
1053
  try {
1031
1054
  const i = JSON.parse(t);
1032
- return i.cssSelector && !i.css && (i.css = _(i.cssSelector), delete i.cssSelector), i;
1055
+ return i.cssSelector && !i.css && (i.css = W(i.cssSelector), delete i.cssSelector), i;
1033
1056
  } catch {
1034
1057
  return null;
1035
1058
  }
1036
1059
  }
1037
- function Vt(e) {
1060
+ function Wt(e) {
1038
1061
  const t = e.getAttribute("data-endpoint");
1039
1062
  if (!t) return null;
1040
- 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"), I = e.getAttribute("data-modal-subtitle"), L = e.getAttribute("data-placeholder"), R = e.getAttribute("data-submit-button"), H = e.getAttribute("data-skip-button"), F = e.getAttribute("data-positive-icon"), W = e.getAttribute("data-negative-icon"), X = 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"), K = e.getAttribute("data-capture-video"), Y = e.getAttribute("data-hide-thumbs"), M = e.getAttribute("data-video-max-duration"), J = e.getAttribute("data-screenshot-method"), G = e.getAttribute("data-direction"), D = 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"), 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");
1041
1064
  return {
1042
1065
  endpoint: t,
1043
- css: D ? _(D) : void 0,
1044
- apiKey: X ?? void 0,
1045
- captureScreenshot: j === "true" ? !0 : void 0,
1066
+ css: R ? W(R) : void 0,
1067
+ apiKey: K ?? void 0,
1068
+ captureScreenshot: Y === "true" ? !0 : void 0,
1046
1069
  screenshotOptions: k || C || S ? {
1047
1070
  quality: k ? parseFloat(k) : void 0,
1048
1071
  maxWidth: C ? parseInt(C, 10) : void 0,
@@ -1050,7 +1073,7 @@ function Vt(e) {
1050
1073
  } : void 0,
1051
1074
  container: l ?? void 0,
1052
1075
  buttonClass: d ?? void 0,
1053
- direction: G ?? void 0,
1076
+ direction: Q ?? void 0,
1054
1077
  position: i ?? void 0,
1055
1078
  zIndex: o ? parseInt(o, 10) : void 0,
1056
1079
  skipTargeting: a === "true" ? !0 : void 0,
@@ -1069,38 +1092,38 @@ function Vt(e) {
1069
1092
  negative: s ?? void 0,
1070
1093
  marker: r ?? void 0
1071
1094
  },
1072
- text: b || x || I || L || R || H ? {
1095
+ text: b || x || L || H || D || M ? {
1073
1096
  tooltip: b ?? void 0,
1074
1097
  modalTitle: x ?? void 0,
1075
- modalSubtitle: I ?? void 0,
1076
- placeholder: L ?? void 0,
1077
- submitButton: R ?? void 0,
1078
- skipButton: H ?? void 0
1098
+ modalSubtitle: L ?? void 0,
1099
+ placeholder: H ?? void 0,
1100
+ submitButton: D ?? void 0,
1101
+ skipButton: M ?? void 0
1079
1102
  } : void 0,
1080
- positiveIcon: F ?? void 0,
1081
- negativeIcon: W ?? void 0,
1082
- screenshotMethod: J ?? void 0,
1083
- captureVideo: K === "true" ? !0 : void 0,
1084
- hideThumbs: Y === "true" ? !0 : void 0,
1085
- videoOptions: M ? {
1086
- maxDuration: parseInt(M, 10)
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,
1108
+ videoOptions: B ? {
1109
+ maxDuration: parseInt(B, 10)
1087
1110
  } : void 0
1088
1111
  };
1089
1112
  }
1090
1113
  if (typeof document < "u") {
1091
1114
  const e = () => {
1092
- const t = document.currentScript, i = Nt(), o = t ? Vt(t) : null, n = i ?? o;
1093
- n?.endpoint && new $t(n);
1115
+ const t = document.currentScript, i = Ut(), o = t ? Wt(t) : null, n = i ?? o;
1116
+ n?.endpoint && new Ft(n);
1094
1117
  };
1095
1118
  document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", e) : e();
1096
1119
  }
1097
1120
  export {
1098
- $t as QaidFeedback,
1099
- Pt as captureDomScreenshot,
1100
- Tt as captureNetworkErrors,
1101
- Rt as createVideoRecorder,
1102
- Lt as getSupportedMimeType,
1103
- Ut as isDomScreenshotSupported,
1104
- It as isVideoRecordingSupported
1121
+ Ft as QaidFeedback,
1122
+ $t as captureDomScreenshot,
1123
+ Lt as captureNetworkErrors,
1124
+ Mt as createVideoRecorder,
1125
+ Dt as getSupportedMimeType,
1126
+ Xt as isDomScreenshotSupported,
1127
+ Ht as isVideoRecordingSupported
1105
1128
  };
1106
1129
  //# sourceMappingURL=qaid.js.map