@qaiddev/thumbs-embed 1.0.13 → 1.0.15

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/embed.d.ts CHANGED
@@ -40,6 +40,7 @@ export declare class QaidFeedback {
40
40
  private boundMouseMove;
41
41
  private boundClick;
42
42
  private boundResize;
43
+ private _startDismissed;
43
44
  private destroyed;
44
45
  private domObserver;
45
46
  private boundBeforeSwap;
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>`, et = `<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>`, it = `<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>`, 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}";
7
+ </svg>`, ot = "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.qaid-incognito.qaid-force-hidden{opacity:0}.qaid-dismiss-btn{width:20px;height:20px;padding:0;border:none;border-radius:50%;background:#0006;color:#fff;display:flex;align-items:center;justify-content:center;align-self: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}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)}", nt = "body.qaid-targeting,body.qaid-targeting *{cursor:none!important}";
8
8
  let w = 0;
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 = {
9
+ const st = "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)}", at = {
10
10
  small: 36,
11
11
  medium: 48,
12
12
  large: 64
13
- }, at = {
13
+ }, rt = {
14
14
  small: 18,
15
15
  medium: 24,
16
16
  large: 32
17
17
  };
18
- function rt(e, t, i) {
18
+ function dt(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 dt(e) {
22
+ function ct(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 dt(e) {
35
35
  b: parseInt(t[3])
36
36
  } : null;
37
37
  }
38
- function ct(e) {
39
- const t = dt(e);
40
- return t && rt(t.r, t.g, t.b) > 0.4 ? "black" : "white";
38
+ function lt(e) {
39
+ const t = ct(e);
40
+ return t && dt(t.r, t.g, t.b) > 0.4 ? "black" : "white";
41
41
  }
42
- function lt(e = {}) {
42
+ function ht(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 lt(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 = st[n], c = at[n], h = ct(o);
52
+ } = e, a = at[n], c = rt[n], h = lt(o);
53
53
  return {
54
54
  "--qaid-positive": t,
55
55
  "--qaid-negative": i,
@@ -63,29 +63,29 @@ function lt(e = {}) {
63
63
  "--qaid-font-size": `${d}px`
64
64
  };
65
65
  }
66
- function ht(e, t) {
66
+ function ut(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 it + nt;
71
+ return ot + st;
72
72
  }
73
- function ut() {
73
+ function pt() {
74
74
  if (w++, w > 1) return;
75
75
  const e = document.createElement("style");
76
- e.id = "qaid-styles", e.textContent = ot, document.head.appendChild(e);
76
+ e.id = "qaid-styles", e.textContent = nt, document.head.appendChild(e);
77
77
  }
78
- function pt() {
78
+ function mt() {
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 mt = ["data-comp", "data-qa", "data-testid", "data-id"];
84
+ const ft = ["data-comp", "data-qa", "data-testid", "data-id"];
85
85
  function U(e, t = document.body) {
86
86
  let i = e;
87
87
  for (; i && i !== t; ) {
88
- for (const o of mt) {
88
+ for (const o of ft) {
89
89
  const n = i.getAttribute(o);
90
90
  if (n)
91
91
  return `${o}="${n}"`;
@@ -94,35 +94,35 @@ function U(e, t = document.body) {
94
94
  }
95
95
  return null;
96
96
  }
97
- function ft(e, t = 100) {
97
+ function bt(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 bt(e) {
101
+ function gt(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 gt(e) {
107
+ function vt(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 = bt(i);
111
+ const o = i.tagName.toLowerCase(), n = gt(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 vt(e) {
116
+ function yt(e) {
117
117
  return e.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
118
118
  }
119
- function yt(e) {
119
+ function wt(e) {
120
120
  const t = U(e);
121
- return t ? `[${t}]` : e.id ? `#${vt(e.id)}` : gt(e);
121
+ return t ? `[${t}]` : e.id ? `#${yt(e.id)}` : vt(e);
122
122
  }
123
- function wt(e) {
124
- const t = ft(e), i = U(e);
125
- return { selector: yt(e), text: t, dataAttr: i };
123
+ function xt(e) {
124
+ const t = bt(e), i = U(e);
125
+ return { selector: wt(e), text: t, dataAttr: i };
126
126
  }
127
127
  const W = {
128
128
  width: 400,
@@ -131,7 +131,7 @@ const W = {
131
131
  gap: 8,
132
132
  viewportPadding: 16
133
133
  };
134
- function xt(e, t, i, o, n) {
134
+ function qt(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 xt(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 qt(e, t, i, o) {
153
+ function kt(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 kt(e, t, i, o = 24, n = 24) {
157
+ function Ct(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 Ct(e, t, i, o = W) {
162
- const n = o.height + o.arrowHeight, s = xt(
161
+ function St(e, t, i, o = W) {
162
+ const n = o.height + o.arrowHeight, s = qt(
163
163
  e,
164
164
  i,
165
165
  n,
166
166
  o.gap,
167
167
  o.viewportPadding
168
- ), r = qt(
168
+ ), r = kt(
169
169
  e,
170
170
  t,
171
171
  o.width,
@@ -177,8 +177,8 @@ function Ct(e, t, i, o = W) {
177
177
  position: s.position
178
178
  };
179
179
  }
180
- function St(e, t, i, o = W) {
181
- const n = Ct(e, t, i, o), s = kt(
180
+ function Et(e, t, i, o = W) {
181
+ const n = St(e, t, i, o), s = Ct(
182
182
  e,
183
183
  n.left,
184
184
  o.width
@@ -188,15 +188,15 @@ function St(e, t, i, o = W) {
188
188
  arrow: { left: s }
189
189
  };
190
190
  }
191
- const Et = 20;
192
- function Tt(e) {
191
+ const Tt = 20;
192
+ function It(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 >= Et && t.shift(), t.push(d), e && e(d);
199
+ t.length >= Tt && 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 Tt(e) {
211
211
  }
212
212
  };
213
213
  }
214
- const It = 20, P = 4096;
214
+ const Lt = 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 >= It && e.shift(), e.push(t);
221
+ e.length >= Lt && e.shift(), e.push(t);
222
222
  }
223
- async function Lt(e) {
223
+ async function Dt(e) {
224
224
  try {
225
225
  const t = await e.clone().text();
226
226
  return q(t);
@@ -236,7 +236,7 @@ function Ht() {
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 Lt(a);
239
+ const c = await Dt(a);
240
240
  O(e, {
241
241
  url: r,
242
242
  method: l.toUpperCase(),
@@ -272,10 +272,10 @@ function Ht() {
272
272
  }
273
273
  };
274
274
  }
275
- function Dt() {
275
+ function Mt() {
276
276
  return typeof navigator < "u" && !!navigator.mediaDevices && typeof navigator.mediaDevices.getDisplayMedia == "function" && typeof MediaRecorder < "u";
277
277
  }
278
- function Mt() {
278
+ function Bt() {
279
279
  if (typeof MediaRecorder > "u") return "";
280
280
  const e = [
281
281
  "video/webm;codecs=vp9",
@@ -288,7 +288,7 @@ function Mt() {
288
288
  return t;
289
289
  return "";
290
290
  }
291
- function Bt(e = {}) {
291
+ function Rt(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 Bt(e = {}) {
300
300
  return {
301
301
  async start() {
302
302
  u = !1, s = [];
303
- const m = Mt();
303
+ const m = Bt();
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 Bt(e = {}) {
347
347
  }
348
348
  };
349
349
  }
350
- function Rt(e = 640) {
350
+ function zt(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 zt(e, t = 0) {
362
+ function Pt(e, t = 0) {
363
363
  const i = e.getBoundingClientRect();
364
364
  return {
365
365
  x: i.left - t,
@@ -368,7 +368,7 @@ function zt(e, t = 0) {
368
368
  height: i.height + t * 2
369
369
  };
370
370
  }
371
- async function Pt(e = {}) {
371
+ async function Ot(e = {}) {
372
372
  const { quality: t = 1, maxWidth: i = 1280, maxHeight: o = 800 } = e;
373
373
  try {
374
374
  if (!navigator.mediaDevices?.getDisplayMedia)
@@ -397,15 +397,15 @@ async function Pt(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", Ot = 1e4, At = 50;
400
+ const N = "https://qaid.dev/lib/html2canvas.min.js", At = 1e4, $t = 50;
401
401
  let y = null;
402
- function Xt() {
402
+ function jt() {
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 $t() {
408
+ function Nt() {
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 $t() {
418
418
  e(!0);
419
419
  return;
420
420
  }
421
- if (Date.now() - i > Ot) {
421
+ if (Date.now() - i > At) {
422
422
  y = null, e(!1);
423
423
  return;
424
424
  }
425
- setTimeout(o, At);
425
+ setTimeout(o, $t);
426
426
  };
427
427
  o();
428
428
  }), y);
429
429
  }
430
- async function Nt(e = {}) {
430
+ async function Vt(e = {}) {
431
431
  const { quality: t = 0.8, maxWidth: i = 1280, maxHeight: o = 800 } = e;
432
432
  try {
433
- if (!await $t() || !window.html2canvas)
433
+ if (!await Nt() || !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,7 +459,7 @@ const V = "qaid_visitor_id", _ = "qaid_hide_feedback";
459
459
  function I(e) {
460
460
  return e ? `${_}_${e}` : _;
461
461
  }
462
- function Vt(e) {
462
+ function _t(e) {
463
463
  try {
464
464
  return localStorage.getItem(I(e)) === "1";
465
465
  } catch {
@@ -472,7 +472,7 @@ function F(e, t = !0) {
472
472
  } catch {
473
473
  }
474
474
  }
475
- function _t() {
475
+ function Ft() {
476
476
  try {
477
477
  let e = localStorage.getItem(V);
478
478
  return e || (e = crypto.randomUUID(), localStorage.setItem(V, e)), e;
@@ -480,7 +480,7 @@ function _t() {
480
480
  return crypto.randomUUID();
481
481
  }
482
482
  }
483
- class Ft {
483
+ class Ut {
484
484
  config;
485
485
  state = "IDLE";
486
486
  feedbackData = {
@@ -538,6 +538,8 @@ class Ft {
538
538
  boundMouseMove;
539
539
  boundClick;
540
540
  boundResize;
541
+ // Start with buttons slid off-screen (localStorage dismiss, no animation)
542
+ _startDismissed = !1;
541
543
  // DOM persistence (survives framework client-side navigation)
542
544
  destroyed = !1;
543
545
  domObserver = null;
@@ -582,6 +584,7 @@ class Ft {
582
584
  maxHeight: t.screenshotOptions?.maxHeight ?? 800
583
585
  },
584
586
  incognito: t.incognito ?? !1,
587
+ hideDismiss: t.hideDismiss ?? !1,
585
588
  positiveIcon: t.positiveIcon ?? "",
586
589
  negativeIcon: t.negativeIcon ?? "",
587
590
  hideThumbs: t.hideThumbs ?? !1,
@@ -591,13 +594,13 @@ class Ft {
591
594
  maxDuration: t.videoOptions?.maxDuration ?? 15
592
595
  },
593
596
  recordIcon: t.recordIcon ?? ""
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();
597
+ }, 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 = Ft(), this.init();
595
598
  }
596
599
  applyVars(t) {
597
- ht(t, this.cssVars);
600
+ ut(t, this.cssVars);
598
601
  }
599
602
  init() {
600
- ut(), this.cssVars = lt({
603
+ pt(), this.cssVars = ht({
601
604
  positiveColor: this.config.colors.positive,
602
605
  negativeColor: this.config.colors.negative,
603
606
  markerColor: this.config.colors.marker,
@@ -606,7 +609,7 @@ class Ft {
606
609
  backdropOpacity: this.config.backdropOpacity,
607
610
  fontFamily: this.config.fontFamily,
608
611
  fontSize: this.config.fontSize
609
- }), Vt(this.config.apiKey) && (this.config.incognito = !0), this.checkMobile(), window.addEventListener("resize", this.boundResize), this.createEmbed(), this.consoleCapture = Tt((t) => {
612
+ }), !this.config.hideDismiss && _t(this.config.apiKey) && (this._startDismissed = !0), this.checkMobile(), window.addEventListener("resize", this.boundResize), this.createEmbed(), this.consoleCapture = It((t) => {
610
613
  this.feedbackData.consoleErrors = this.consoleCapture?.errors ?? [];
611
614
  }), this.feedbackData.consoleErrors = this.consoleCapture.errors, this.observeDom();
612
615
  }
@@ -629,7 +632,7 @@ class Ft {
629
632
  }), this.domObserver.observe(document.body, { childList: !0 });
630
633
  }
631
634
  checkMobile() {
632
- this.isMobile = Rt();
635
+ this.isMobile = zt();
633
636
  }
634
637
  handleResize() {
635
638
  this.checkMobile();
@@ -637,7 +640,7 @@ class Ft {
637
640
  createEmbed() {
638
641
  this.shadowHost = document.createElement("div"), this.shadowHost.setAttribute("data-qaid-embed", ""), this.shadowHost.style.position = "static", this.shadowHost.style.display = "contents";
639
642
  let t = null;
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" });
643
+ this.config.container && (t = document.querySelector(this.config.container)), t ? (t.appendChild(this.shadowHost), this.isUserProvidedContainer = !0, this.config.hideDismiss = !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" });
641
644
  const i = document.createElement("style");
642
645
  if (i.textContent = z(), this.shadowRoot.appendChild(i), this.config.css) {
643
646
  const a = document.createElement("style");
@@ -663,15 +666,15 @@ class Ft {
663
666
  const u = document.createElement("button");
664
667
  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
668
  }
666
- if (this.config.captureVideo && Dt()) {
669
+ if (this.config.captureVideo && Mt()) {
667
670
  const a = document.createElement("div");
668
671
  a.className = "qaid-tooltip-wrapper";
669
672
  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 || et, c.addEventListener("click", () => this.startRecording()), c.addEventListener("mouseenter", () => this.showTooltip(c)), c.addEventListener("mouseleave", () => this.hideTooltip()), a.appendChild(c), this.buttonsContainer.appendChild(a);
673
+ c.type = "button", c.className = n ? `${s} qaid-btn-record` : "qaid-btn qaid-btn-record", c.innerHTML = this.config.recordIcon || it, c.addEventListener("click", () => this.startRecording()), c.addEventListener("mouseenter", () => this.showTooltip(c)), c.addEventListener("mouseleave", () => this.hideTooltip()), a.appendChild(c), this.buttonsContainer.appendChild(a);
671
674
  }
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) => {
675
+ this.config.hideDismiss || (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
676
  a.stopPropagation(), this.handleDismiss();
674
- }), this.buttonsContainer.appendChild(this.dismissBtn);
677
+ }), this.buttonsContainer.insertBefore(this.dismissBtn, this.buttonsContainer.firstChild), this._startDismissed && this.buttonsContainer.classList.add("qaid-incognito"));
675
678
  }
676
679
  /**
677
680
  * Lazily create a separate overlay shadow host on document.body.
@@ -702,10 +705,12 @@ class Ft {
702
705
  this.tooltipElement && this.tooltipElement.classList.remove("qaid-tooltip-visible");
703
706
  }
704
707
  handleDismiss() {
705
- this.buttonsContainer && this.buttonsContainer.classList.add("qaid-incognito"), F(this.config.apiKey, !0);
708
+ this.buttonsContainer && (this.buttonsContainer.classList.add("qaid-incognito"), this.buttonsContainer.classList.add("qaid-force-hidden"), this.buttonsContainer.addEventListener("mouseleave", () => {
709
+ this.buttonsContainer?.classList.remove("qaid-force-hidden");
710
+ }, { once: !0 })), F(this.config.apiKey, !0);
706
711
  }
707
712
  handleThumbClick(t, i, 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);
713
+ this.buttonsContainer?.classList.contains("qaid-incognito") && (this.buttonsContainer.classList.remove("qaid-incognito"), this.buttonsContainer.classList.remove("qaid-force-hidden"), F(this.config.apiKey, !1)), this.config.skipTargeting ? this.submitDirectFeedback(t, i) : this.startTargeting(t, o);
709
714
  }
710
715
  submitDirectFeedback(t, i) {
711
716
  this.feedbackData.feedbackType = t, this.feedbackData.elementSelector = null, this.feedbackData.elementText = null;
@@ -762,14 +767,14 @@ class Ft {
762
767
  );
763
768
  if (!o || $(o))
764
769
  return;
765
- const n = zt(o, 8);
770
+ const n = Pt(o, 8);
766
771
  this.selectedBounds = {
767
772
  ...n,
768
773
  clickX: t.clientX,
769
774
  clickY: t.clientY,
770
775
  visible: !0
771
776
  };
772
- const { selector: s, text: r } = wt(o);
777
+ const { selector: s, text: r } = xt(o);
773
778
  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
779
  }
775
780
  cancelTargeting() {
@@ -789,7 +794,7 @@ class Ft {
789
794
  async submitFeedback() {
790
795
  if (!this.feedbackData.feedbackType) return;
791
796
  let t = null;
792
- this.config.captureScreenshot && (this.config.screenshotMethod === "dom" ? t = await Nt(this.config.screenshotOptions) : t = await Pt(this.config.screenshotOptions));
797
+ this.config.captureScreenshot && (this.config.screenshotMethod === "dom" ? t = await Vt(this.config.screenshotOptions) : t = await Ot(this.config.screenshotOptions));
793
798
  const i = this.feedbackData.elementSelector ? {
794
799
  x: this.selectedBounds.x,
795
800
  y: this.selectedBounds.y,
@@ -843,7 +848,7 @@ class Ft {
843
848
  `, this.applyVars(i), t.appendChild(i), this.modalContainer = i, this.setupModalInteractions();
844
849
  }
845
850
  showPositionedModal() {
846
- const t = this.ensureOverlayHost(), { modal: i, arrow: o } = St(
851
+ const t = this.ensureOverlayHost(), { modal: i, arrow: o } = Et(
847
852
  this.selectedBounds,
848
853
  window.innerWidth,
849
854
  window.innerHeight,
@@ -926,7 +931,7 @@ class Ft {
926
931
  async startRecording() {
927
932
  if (!(this.isRecording || this.state !== "IDLE"))
928
933
  try {
929
- this.networkCapture = Ht(), this.videoRecorder = Bt({
934
+ this.networkCapture = Ht(), this.videoRecorder = Rt({
930
935
  maxDuration: this.config.videoOptions.maxDuration
931
936
  }), this.videoRecorder.onTick((t) => {
932
937
  this.updateRecordingTimer(t);
@@ -1037,13 +1042,13 @@ class Ft {
1037
1042
  * Destroy the embed and clean up all resources
1038
1043
  */
1039
1044
  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, pt();
1045
+ 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, mt();
1041
1046
  }
1042
1047
  }
1043
1048
  function X(e) {
1044
1049
  return document.querySelector(e)?.textContent?.trim() ?? "";
1045
1050
  }
1046
- function Ut() {
1051
+ function Wt() {
1047
1052
  const e = document.querySelector(
1048
1053
  'script[type="application/json"][data-feedback-config]'
1049
1054
  );
@@ -1057,10 +1062,10 @@ function Ut() {
1057
1062
  return null;
1058
1063
  }
1059
1064
  }
1060
- function Wt(e) {
1065
+ function Xt(e) {
1061
1066
  const t = e.getAttribute("data-endpoint");
1062
1067
  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"), 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");
1068
+ 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"), D = e.getAttribute("data-placeholder"), H = 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"), Q = e.getAttribute("data-hide-dismiss"), B = e.getAttribute("data-video-max-duration"), tt = e.getAttribute("data-screenshot-method"), et = e.getAttribute("data-direction"), R = e.getAttribute("data-css-selector");
1064
1069
  return {
1065
1070
  endpoint: t,
1066
1071
  css: R ? X(R) : void 0,
@@ -1073,7 +1078,7 @@ function Wt(e) {
1073
1078
  } : void 0,
1074
1079
  container: l ?? void 0,
1075
1080
  buttonClass: d ?? void 0,
1076
- direction: tt ?? void 0,
1081
+ direction: et ?? void 0,
1077
1082
  position: i ?? void 0,
1078
1083
  zIndex: o ? parseInt(o, 10) : void 0,
1079
1084
  skipTargeting: a === "true" ? !0 : void 0,
@@ -1092,19 +1097,20 @@ function Wt(e) {
1092
1097
  negative: s ?? void 0,
1093
1098
  marker: r ?? void 0
1094
1099
  },
1095
- text: b || x || L || H || D || M ? {
1100
+ text: b || x || L || D || H || M ? {
1096
1101
  tooltip: b ?? void 0,
1097
1102
  modalTitle: x ?? void 0,
1098
1103
  modalSubtitle: L ?? void 0,
1099
- placeholder: H ?? void 0,
1100
- submitButton: D ?? void 0,
1104
+ placeholder: D ?? void 0,
1105
+ submitButton: H ?? void 0,
1101
1106
  skipButton: M ?? void 0
1102
1107
  } : void 0,
1103
1108
  positiveIcon: j ?? void 0,
1104
1109
  negativeIcon: K ?? void 0,
1105
- screenshotMethod: Q ?? void 0,
1110
+ screenshotMethod: tt ?? void 0,
1106
1111
  captureVideo: G === "true" ? !0 : void 0,
1107
1112
  hideThumbs: Z === "true" ? !0 : void 0,
1113
+ hideDismiss: Q === "true" ? !0 : void 0,
1108
1114
  videoOptions: B ? {
1109
1115
  maxDuration: parseInt(B, 10)
1110
1116
  } : void 0
@@ -1112,18 +1118,18 @@ function Wt(e) {
1112
1118
  }
1113
1119
  if (typeof document < "u") {
1114
1120
  const e = () => {
1115
- const t = document.currentScript, i = Ut(), o = t ? Wt(t) : null, n = i ?? o;
1116
- n?.endpoint && new Ft(n);
1121
+ const t = document.currentScript, i = Wt(), o = t ? Xt(t) : null, n = i ?? o;
1122
+ n?.endpoint && new Ut(n);
1117
1123
  };
1118
1124
  document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", e) : e();
1119
1125
  }
1120
1126
  export {
1121
- Ft as QaidFeedback,
1122
- Nt as captureDomScreenshot,
1127
+ Ut as QaidFeedback,
1128
+ Vt as captureDomScreenshot,
1123
1129
  Ht as captureNetworkErrors,
1124
- Bt as createVideoRecorder,
1125
- Mt as getSupportedMimeType,
1126
- Xt as isDomScreenshotSupported,
1127
- Dt as isVideoRecordingSupported
1130
+ Rt as createVideoRecorder,
1131
+ Bt as getSupportedMimeType,
1132
+ jt as isDomScreenshotSupported,
1133
+ Mt as isVideoRecordingSupported
1128
1134
  };
1129
1135
  //# sourceMappingURL=qaid.js.map