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