@qaiddev/thumbs-embed 1.8.0 → 1.9.1
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 +45 -12
- package/dist/bootstrap.d.ts +4 -2
- package/dist/chunks/{loader-DHtXHt1z.js → loader-DepVS4i5.js} +206 -160
- package/dist/chunks/{loader-DHtXHt1z.js.map → loader-DepVS4i5.js.map} +1 -1
- package/dist/chunks/{modal-CTbqN-h9.js → modal-CEfcaIQR.js} +2 -2
- package/dist/chunks/{modal-CTbqN-h9.js.map → modal-CEfcaIQR.js.map} +1 -1
- package/dist/chunks/{recording-Dx8AX-BC.js → recording-CcfOfIC7.js} +6 -6
- package/dist/chunks/recording-CcfOfIC7.js.map +1 -0
- package/dist/index.js +389 -343
- package/dist/index.js.map +1 -1
- package/dist/loader.js +1 -1
- package/dist/qaid.umd.cjs +14 -14
- package/dist/qaid.umd.cjs.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/recording-Dx8AX-BC.js.map +0 -1
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { i as
|
|
2
|
-
const wt = "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-dismissed{display:none!important}.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}:where(button.qaid-btn-structural)>svg:where(:not(.qaid-icon):not([width])){width:var(--qaid-icon-size, 24px);height:var(--qaid-icon-size, 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:var(--qaid-font-size, 16px);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, #6365f1);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-type-static{width:2.5rem;height:2.5rem;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:var(--qaid-marker, #6365f1);color:var(--qaid-marker-text, white)}.qaid-type-static svg{width:1.25rem;height:1.25rem}.qaid-modal-header-text{flex:1;min-width:0}.qaid-modal-title{font-size:calc(var(--qaid-font-size, 16px) * 1.125);font-weight:700;margin:0 0 .25rem;color:light-dark(#1f2937,#f9fafb)}.qaid-modal-subtitle{color:light-dark(#6b7280,#9ca3af);margin:0;font-size:calc(var(--qaid-font-size, 16px) * .875)}.qaid-textarea{width:100%;height:6rem;padding:.75rem;border:1px solid light-dark(#d1d5db,#374151);border-radius:.5rem;font-family:inherit;font-size:var(--qaid-font-size, 16px);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:calc(var(--qaid-font-size, 16px) * .875);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:calc(var(--qaid-font-size, 16px) * .875);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:calc(var(--qaid-font-size, 16px) * .75);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 0 auto;height:100vh;height:100dvh;display:flex;align-items:center;justify-content:center;padding:16px;padding-top:max(16px,env(safe-area-inset-top));padding-bottom:max(16px,env(safe-area-inset-bottom));box-sizing:border-box;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:100%;max-height:100%;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:calc(var(--qaid-font-size, 16px) * 1.125);font-weight:700;margin:0 0 1rem;color:light-dark(#1f2937,#f9fafb)}.qaid-video-preview-box video{width:100%;max-height:50vh;max-height:50dvh;object-fit:contain;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:calc(var(--qaid-font-size, 16px) * .875);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-error{margin:0 0 .75rem;font-size:calc(var(--qaid-font-size, 16px) * .875);font-weight:500;color:light-dark(#b91c1c,#fca5a5)}.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:calc(var(--qaid-font-size, 16px) * .875);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:calc(var(--qaid-font-size, 16px) * .875);color:light-dark(#6b7280,#9ca3af)}.qaid-annotate{position:fixed;inset:0;z-index:2147483000;display:flex;flex-direction:column;gap:.75rem;padding:16px;padding-top:max(16px,env(safe-area-inset-top));padding-bottom:max(16px,env(safe-area-inset-bottom));box-sizing:border-box;background:#000000d9;font-family:var(--qaid-font-family, system-ui, -apple-system, sans-serif);font-size:var(--qaid-font-size, 16px);animation:qaid-fadeIn .2s ease-out}.qaid-annotate-title{margin:0;font-size:var(--qaid-font-size, 16px);font-weight:700;text-align:center;color:#f9fafb}.qaid-annotate-desc{margin:0;font-size:calc(var(--qaid-font-size, 16px) * .8125);line-height:1.4;text-align:center;color:#f9fafbbf}.qaid-annotate-stage{flex:1 1 auto;min-height:0;display:flex;align-items:center;justify-content:center;overflow:auto}.qaid-annotate-canvas{max-width:100%;max-height:100%;object-fit:contain;background:light-dark(#ffffff,#111827);border-radius:.5rem;box-shadow:0 10px 30px #00000080;touch-action:none;cursor:crosshair}.qaid-annotate-toolbar{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;justify-content:center;padding:.5rem .75rem;background:light-dark(#ffffff,#1f2937);border-radius:.75rem;box-shadow:0 10px 30px light-dark(rgba(0,0,0,.25),rgba(0,0,0,.5))}.qaid-annotate-tools,.qaid-annotate-actions{display:flex;gap:.375rem;align-items:center}button.qaid-annotate-tool,button.qaid-annotate-action{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;min-width:44px;min-height:44px;padding:0 .75rem;border:1px solid light-dark(#d1d5db,#374151);border-radius:.5rem;background:light-dark(#f9fafb,#111827);color:light-dark(#1f2937,#f9fafb);font-family:inherit;font-size:calc(var(--qaid-font-size, 16px) * .8125);font-weight:600;cursor:pointer;-webkit-appearance:none;appearance:none;transition:background-color .15s,color .15s,border-color .15s,filter .15s}button.qaid-annotate-tool svg,button.qaid-annotate-action svg{width:20px;height:20px}.qaid-annotate-colors{display:flex;gap:.25rem;align-items:center}button.qaid-annotate-swatch{width:28px;height:28px;min-width:28px;padding:0;border-radius:9999px;border:2px solid light-dark(#d1d5db,#4b5563);background:var(--qaid-swatch, #000);cursor:pointer;-webkit-appearance:none;appearance:none;transition:transform .1s,box-shadow .15s,border-color .15s}button.qaid-annotate-swatch:hover{transform:scale(1.12)}button.qaid-annotate-swatch[aria-pressed=true]{border-color:light-dark(#111827,#f9fafb);box-shadow:0 0 0 2px var(--qaid-swatch)}@media(forced-colors:active){button.qaid-annotate-swatch[aria-pressed=true]{outline:2px solid Highlight;outline-offset:1px}}button.qaid-annotate-tool:hover,button.qaid-annotate-action:hover{background:light-dark(#eef2ff,#312e81)}button.qaid-annotate-tool[aria-pressed=true],button.qaid-annotate-done{background:var(--qaid-marker, #6365f1);color:var(--qaid-marker-text, #fff);border-color:var(--qaid-marker, #6365f1)}button.qaid-annotate-done:hover{filter:brightness(.9);background:var(--qaid-marker, #6365f1)}button.qaid-annotate-action:disabled{opacity:.45;cursor:not-allowed}@media(forced-colors:active){button.qaid-annotate-tool[aria-pressed=true],button.qaid-annotate-done{border:2px solid Highlight}.qaid-annotate-canvas{border:1px solid CanvasText}}button:focus-visible,textarea:focus-visible,a:focus-visible,[tabindex]:focus-visible,[role=button]:focus-visible{outline:2px solid var(--qaid-marker, #6365f1);outline-offset:2px}.qaid-textarea:focus-visible,button.qaid-btn-submit:focus-visible,.qaid-video-preview-box textarea:focus-visible{outline:2px solid var(--qaid-marker, #6365f1);outline-offset:2px}.qaid-buttons.qaid-incognito:focus-within{opacity:1}.qaid-buttons:focus-within .qaid-dismiss-btn,.qaid-dismiss-btn:focus-visible{opacity:1}.qaid-dismiss-btn{min-width:24px;min-height:24px}button.qaid-recording-stop{min-height:24px}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}@media(forced-colors:active){button:focus-visible,textarea:focus-visible,a:focus-visible,[tabindex]:focus-visible,[role=button]:focus-visible,.qaid-textarea:focus,button.qaid-btn-submit:focus,.qaid-video-preview-box textarea:focus{outline:2px solid CanvasText;outline-offset:2px}.qaid-selected-marker,.qaid-highlight-box{border-color:Highlight}}.qaid-confirm{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.5rem;padding:.5rem 0}.qaid-confirm-icon{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:9999px;color:#fff;background:var(--qaid-success, #22c55e);margin-bottom:.25rem;animation:qaid-confirm-pop .28s cubic-bezier(.34,1.56,.64,1)}.qaid-confirm-icon .qaid-icon{width:24px;height:24px}.qaid-confirm-error .qaid-confirm-icon{background:var(--qaid-error, #dc2626)}.qaid-confirm-title{margin:0;font-size:var(--qaid-font-size, 16px);font-weight:600;color:var(--qaid-text, light-dark(#111827, #f9fafb))}.qaid-confirm-title:focus-visible{outline:2px solid var(--qaid-primary, #6365f1);outline-offset:3px;border-radius:4px}.qaid-confirm-message{margin:0;font-size:calc(var(--qaid-font-size, 16px) * .875);color:var(--qaid-text-muted, light-dark(#6b7280, #9ca3af))}.qaid-confirm .qaid-confirm-close{margin-top:.5rem;min-width:96px}@keyframes qaid-confirm-pop{0%{transform:scale(.6);opacity:0}to{transform:scale(1);opacity:1}}@media(prefers-reduced-motion:reduce){.qaid-confirm-icon{animation:none}}", kt = "body.qaid-targeting,body.qaid-targeting *{cursor:none!important}";
|
|
1
|
+
import { i as At, F as Tt, T as It, a as Et, R as zt } from "./annotate-D-o8xCV9.js";
|
|
2
|
+
const Dt = "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-dismissed{display:none!important}.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}:where(button.qaid-btn-structural)>svg:where(:not(.qaid-icon):not([width])){width:var(--qaid-icon-size, 24px);height:var(--qaid-icon-size, 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:var(--qaid-font-size, 16px);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, #6365f1);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-type-static{width:2.5rem;height:2.5rem;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:var(--qaid-marker, #6365f1);color:var(--qaid-marker-text, white)}.qaid-type-static svg{width:1.25rem;height:1.25rem}.qaid-modal-header-text{flex:1;min-width:0}.qaid-modal-title{font-size:calc(var(--qaid-font-size, 16px) * 1.125);font-weight:700;margin:0 0 .25rem;color:light-dark(#1f2937,#f9fafb)}.qaid-modal-subtitle{color:light-dark(#6b7280,#9ca3af);margin:0;font-size:calc(var(--qaid-font-size, 16px) * .875)}.qaid-textarea{width:100%;height:6rem;padding:.75rem;border:1px solid light-dark(#d1d5db,#374151);border-radius:.5rem;font-family:inherit;font-size:var(--qaid-font-size, 16px);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:calc(var(--qaid-font-size, 16px) * .875);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;pointer-events:auto;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:calc(var(--qaid-font-size, 16px) * .875);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:calc(var(--qaid-font-size, 16px) * .75);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 0 auto;height:100vh;height:100dvh;display:flex;align-items:center;justify-content:center;padding:16px;padding-top:max(16px,env(safe-area-inset-top));padding-bottom:max(16px,env(safe-area-inset-bottom));box-sizing:border-box;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:100%;max-height:100%;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:calc(var(--qaid-font-size, 16px) * 1.125);font-weight:700;margin:0 0 1rem;color:light-dark(#1f2937,#f9fafb)}.qaid-video-preview-box video{width:100%;max-height:50vh;max-height:50dvh;object-fit:contain;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:calc(var(--qaid-font-size, 16px) * .875);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-error{margin:0 0 .75rem;font-size:calc(var(--qaid-font-size, 16px) * .875);font-weight:500;color:light-dark(#b91c1c,#fca5a5)}.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:calc(var(--qaid-font-size, 16px) * .875);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:calc(var(--qaid-font-size, 16px) * .875);color:light-dark(#6b7280,#9ca3af)}.qaid-annotate{position:fixed;inset:0;z-index:2147483000;display:flex;flex-direction:column;gap:.75rem;padding:16px;padding-top:max(16px,env(safe-area-inset-top));padding-bottom:max(16px,env(safe-area-inset-bottom));box-sizing:border-box;background:#000000d9;font-family:var(--qaid-font-family, system-ui, -apple-system, sans-serif);font-size:var(--qaid-font-size, 16px);animation:qaid-fadeIn .2s ease-out}.qaid-annotate-title{margin:0;font-size:var(--qaid-font-size, 16px);font-weight:700;text-align:center;color:#f9fafb}.qaid-annotate-desc{margin:0;font-size:calc(var(--qaid-font-size, 16px) * .8125);line-height:1.4;text-align:center;color:#f9fafbbf}.qaid-annotate-stage{flex:1 1 auto;min-height:0;display:flex;align-items:center;justify-content:center;overflow:auto}.qaid-annotate-canvas{max-width:100%;max-height:100%;object-fit:contain;background:light-dark(#ffffff,#111827);border-radius:.5rem;box-shadow:0 10px 30px #00000080;touch-action:none;cursor:crosshair}.qaid-annotate-toolbar{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;justify-content:center;padding:.5rem .75rem;background:light-dark(#ffffff,#1f2937);border-radius:.75rem;box-shadow:0 10px 30px light-dark(rgba(0,0,0,.25),rgba(0,0,0,.5))}.qaid-annotate-tools,.qaid-annotate-actions{display:flex;gap:.375rem;align-items:center}button.qaid-annotate-tool,button.qaid-annotate-action{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;min-width:44px;min-height:44px;padding:0 .75rem;border:1px solid light-dark(#d1d5db,#374151);border-radius:.5rem;background:light-dark(#f9fafb,#111827);color:light-dark(#1f2937,#f9fafb);font-family:inherit;font-size:calc(var(--qaid-font-size, 16px) * .8125);font-weight:600;cursor:pointer;-webkit-appearance:none;appearance:none;transition:background-color .15s,color .15s,border-color .15s,filter .15s}button.qaid-annotate-tool svg,button.qaid-annotate-action svg{width:20px;height:20px}.qaid-annotate-colors{display:flex;gap:.25rem;align-items:center}button.qaid-annotate-swatch{width:28px;height:28px;min-width:28px;padding:0;border-radius:9999px;border:2px solid light-dark(#d1d5db,#4b5563);background:var(--qaid-swatch, #000);cursor:pointer;-webkit-appearance:none;appearance:none;transition:transform .1s,box-shadow .15s,border-color .15s}button.qaid-annotate-swatch:hover{transform:scale(1.12)}button.qaid-annotate-swatch[aria-pressed=true]{border-color:light-dark(#111827,#f9fafb);box-shadow:0 0 0 2px var(--qaid-swatch)}@media(forced-colors:active){button.qaid-annotate-swatch[aria-pressed=true]{outline:2px solid Highlight;outline-offset:1px}}button.qaid-annotate-tool:hover,button.qaid-annotate-action:hover{background:light-dark(#eef2ff,#312e81)}button.qaid-annotate-tool[aria-pressed=true],button.qaid-annotate-done{background:var(--qaid-marker, #6365f1);color:var(--qaid-marker-text, #fff);border-color:var(--qaid-marker, #6365f1)}button.qaid-annotate-done:hover{filter:brightness(.9);background:var(--qaid-marker, #6365f1)}button.qaid-annotate-action:disabled{opacity:.45;cursor:not-allowed}@media(forced-colors:active){button.qaid-annotate-tool[aria-pressed=true],button.qaid-annotate-done{border:2px solid Highlight}.qaid-annotate-canvas{border:1px solid CanvasText}}button:focus-visible,textarea:focus-visible,a:focus-visible,[tabindex]:focus-visible,[role=button]:focus-visible{outline:2px solid var(--qaid-marker, #6365f1);outline-offset:2px}.qaid-textarea:focus-visible,button.qaid-btn-submit:focus-visible,.qaid-video-preview-box textarea:focus-visible{outline:2px solid var(--qaid-marker, #6365f1);outline-offset:2px}.qaid-buttons.qaid-incognito:focus-within{opacity:1}.qaid-buttons:focus-within .qaid-dismiss-btn,.qaid-dismiss-btn:focus-visible{opacity:1}.qaid-dismiss-btn{min-width:24px;min-height:24px}button.qaid-recording-stop{min-height:24px}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}@media(forced-colors:active){button:focus-visible,textarea:focus-visible,a:focus-visible,[tabindex]:focus-visible,[role=button]:focus-visible,.qaid-textarea:focus,button.qaid-btn-submit:focus,.qaid-video-preview-box textarea:focus{outline:2px solid CanvasText;outline-offset:2px}.qaid-selected-marker,.qaid-highlight-box{border-color:Highlight}}.qaid-confirm{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.5rem;padding:.5rem 0}.qaid-confirm-icon{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:9999px;color:#fff;background:var(--qaid-success, #22c55e);margin-bottom:.25rem;animation:qaid-confirm-pop .28s cubic-bezier(.34,1.56,.64,1)}.qaid-confirm-icon .qaid-icon{width:24px;height:24px}.qaid-confirm-error .qaid-confirm-icon{background:var(--qaid-error, #dc2626)}.qaid-confirm-title{margin:0;font-size:var(--qaid-font-size, 16px);font-weight:600;color:var(--qaid-text, light-dark(#111827, #f9fafb))}.qaid-confirm-title:focus-visible{outline:2px solid var(--qaid-primary, #6365f1);outline-offset:3px;border-radius:4px}.qaid-confirm-message{margin:0;font-size:calc(var(--qaid-font-size, 16px) * .875);color:var(--qaid-text-muted, light-dark(#6b7280, #9ca3af))}.qaid-confirm .qaid-confirm-close{margin-top:.5rem;min-width:96px}@keyframes qaid-confirm-pop{0%{transform:scale(.6);opacity:0}to{transform:scale(1);opacity:1}}@media(prefers-reduced-motion:reduce){.qaid-confirm-icon{animation:none}}", Ht = "body.qaid-targeting,body.qaid-targeting *{cursor:none!important}";
|
|
3
3
|
let b = 0;
|
|
4
|
-
const
|
|
4
|
+
const Lt = "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-feedback:hover{background:var(--qaid-marker,#6365f1);color:var(--qaid-marker-text,#fff)}button.qaid-btn svg{width:var(--qaid-icon-size);height:var(--qaid-icon-size)}", Mt = {
|
|
5
5
|
small: 36,
|
|
6
6
|
medium: 48,
|
|
7
7
|
large: 64
|
|
8
|
-
},
|
|
8
|
+
}, Bt = {
|
|
9
9
|
small: 18,
|
|
10
10
|
medium: 24,
|
|
11
11
|
large: 32
|
|
12
12
|
};
|
|
13
|
-
function
|
|
13
|
+
function Ot(e, t, i) {
|
|
14
14
|
const [o, r, n] = [e, t, i].map((a) => (a = a / 255, a <= 0.03928 ? a / 12.92 : Math.pow((a + 0.055) / 1.055, 2.4)));
|
|
15
15
|
return 0.2126 * o + 0.7152 * r + 0.0722 * n;
|
|
16
16
|
}
|
|
17
|
-
function
|
|
17
|
+
function Rt(e) {
|
|
18
18
|
if (e.startsWith("#")) {
|
|
19
19
|
const i = e.slice(1), o = i.length === 3 ? i.split("").map((n) => n + n).join("") : i, r = parseInt(o, 16);
|
|
20
20
|
return {
|
|
@@ -30,11 +30,11 @@ function Et(e) {
|
|
|
30
30
|
b: parseInt(t[3])
|
|
31
31
|
} : null;
|
|
32
32
|
}
|
|
33
|
-
function
|
|
34
|
-
const t =
|
|
35
|
-
return t &&
|
|
33
|
+
function Pt(e) {
|
|
34
|
+
const t = Rt(e);
|
|
35
|
+
return t && Ot(t.r, t.g, t.b) > 0.4 ? "black" : "white";
|
|
36
36
|
}
|
|
37
|
-
function
|
|
37
|
+
function Ft(e = {}) {
|
|
38
38
|
const {
|
|
39
39
|
positiveColor: t = "rgb(0, 200, 83)",
|
|
40
40
|
negativeColor: i = "rgb(255, 0, 0)",
|
|
@@ -44,7 +44,7 @@ function zt(e = {}) {
|
|
|
44
44
|
backdropOpacity: a = 0.3,
|
|
45
45
|
fontFamily: l = "system-ui, -apple-system, sans-serif",
|
|
46
46
|
fontSize: c = 16
|
|
47
|
-
} = e, d =
|
|
47
|
+
} = e, d = Mt[r], s = Bt[r], u = Pt(o);
|
|
48
48
|
return {
|
|
49
49
|
"--qaid-positive": t,
|
|
50
50
|
"--qaid-negative": i,
|
|
@@ -58,22 +58,22 @@ function zt(e = {}) {
|
|
|
58
58
|
"--qaid-font-size": `${c}px`
|
|
59
59
|
};
|
|
60
60
|
}
|
|
61
|
-
function
|
|
61
|
+
function Ut(e, t) {
|
|
62
62
|
for (const [i, o] of Object.entries(t))
|
|
63
63
|
e.style.setProperty(i, o);
|
|
64
64
|
}
|
|
65
|
-
function
|
|
66
|
-
return
|
|
65
|
+
function Q() {
|
|
66
|
+
return Dt + Lt;
|
|
67
67
|
}
|
|
68
|
-
function
|
|
68
|
+
function Vt() {
|
|
69
69
|
if (b++, b > 1) return;
|
|
70
70
|
const e = document.createElement("style");
|
|
71
|
-
e.id = "qaid-styles", e.textContent =
|
|
71
|
+
e.id = "qaid-styles", e.textContent = Ht, document.head.appendChild(e);
|
|
72
72
|
}
|
|
73
|
-
function
|
|
73
|
+
function _t() {
|
|
74
74
|
b <= 0 || (b--, b === 0 && document.getElementById("qaid-styles")?.remove());
|
|
75
75
|
}
|
|
76
|
-
const
|
|
76
|
+
const W = "data-qaid-a11y-live", $t = "position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;", Kt = [
|
|
77
77
|
"a[href]",
|
|
78
78
|
"button",
|
|
79
79
|
"input",
|
|
@@ -81,25 +81,25 @@ const K = "data-qaid-a11y-live", Mt = "position:absolute;width:1px;height:1px;ma
|
|
|
81
81
|
"select",
|
|
82
82
|
"[tabindex]"
|
|
83
83
|
].join(",");
|
|
84
|
-
function
|
|
84
|
+
function Nt(e) {
|
|
85
85
|
return e.ownerDocument || document;
|
|
86
86
|
}
|
|
87
|
-
function
|
|
87
|
+
function jt(e, t) {
|
|
88
88
|
const i = t ? "assertive" : "polite", o = e.querySelector(
|
|
89
|
-
`[${
|
|
89
|
+
`[${W}="${i}"]`
|
|
90
90
|
);
|
|
91
91
|
if (o) return o;
|
|
92
|
-
const n =
|
|
93
|
-
return n.setAttribute(
|
|
92
|
+
const n = Nt(e).createElement("div");
|
|
93
|
+
return n.setAttribute(W, i), n.setAttribute("role", t ? "alert" : "status"), n.setAttribute("aria-live", t ? "assertive" : "polite"), n.setAttribute("aria-atomic", "true"), n.style.cssText = $t, e.appendChild(n), n;
|
|
94
94
|
}
|
|
95
|
-
function
|
|
96
|
-
const o =
|
|
95
|
+
function Qt(e, t, i = {}) {
|
|
96
|
+
const o = jt(e, !!i.assertive);
|
|
97
97
|
o.textContent = "", o.textContent = t;
|
|
98
98
|
}
|
|
99
|
-
function
|
|
99
|
+
function Wt(e) {
|
|
100
100
|
return e.hasAttribute("disabled") ? !0 : e.disabled === !0;
|
|
101
101
|
}
|
|
102
|
-
function
|
|
102
|
+
function Yt(e) {
|
|
103
103
|
let t = e;
|
|
104
104
|
for (; t; ) {
|
|
105
105
|
if (t.hasAttribute("hidden")) return !0;
|
|
@@ -110,52 +110,52 @@ function Ut(e) {
|
|
|
110
110
|
}
|
|
111
111
|
return !1;
|
|
112
112
|
}
|
|
113
|
-
function
|
|
113
|
+
function Y(e) {
|
|
114
114
|
return Array.from(
|
|
115
|
-
e.querySelectorAll(
|
|
116
|
-
).filter((i) => !(i.getAttribute("tabindex") === "-1" || i instanceof HTMLInputElement && i.type === "hidden" || i instanceof HTMLAnchorElement && !i.getAttribute("href") ||
|
|
115
|
+
e.querySelectorAll(Kt)
|
|
116
|
+
).filter((i) => !(i.getAttribute("tabindex") === "-1" || i instanceof HTMLInputElement && i.type === "hidden" || i instanceof HTMLAnchorElement && !i.getAttribute("href") || Wt(i) || Yt(i)));
|
|
117
117
|
}
|
|
118
|
-
function
|
|
118
|
+
function tt(e) {
|
|
119
119
|
let t = e.activeElement;
|
|
120
120
|
for (; t && t.shadowRoot && t.shadowRoot.activeElement; )
|
|
121
121
|
t = t.shadowRoot.activeElement;
|
|
122
122
|
return t instanceof HTMLElement ? t : null;
|
|
123
123
|
}
|
|
124
|
-
function
|
|
124
|
+
function Xt(e) {
|
|
125
125
|
const t = e.ownerDocument || document;
|
|
126
126
|
let i = !1;
|
|
127
127
|
const o = (n) => {
|
|
128
128
|
if (n.key !== "Tab") return;
|
|
129
|
-
const a =
|
|
129
|
+
const a = Y(e);
|
|
130
130
|
if (a.length === 0) {
|
|
131
131
|
n.preventDefault(), e.focus();
|
|
132
132
|
return;
|
|
133
133
|
}
|
|
134
|
-
const l = a[0], c = a[a.length - 1], d =
|
|
134
|
+
const l = a[0], c = a[a.length - 1], d = tt(t), s = d ? a.indexOf(d) !== -1 : !1;
|
|
135
135
|
n.shiftKey ? (!s || d === l) && (n.preventDefault(), c.focus()) : (!s || d === c) && (n.preventDefault(), l.focus());
|
|
136
136
|
};
|
|
137
137
|
e.addEventListener("keydown", o);
|
|
138
|
-
const r =
|
|
138
|
+
const r = Y(e);
|
|
139
139
|
return r.length > 0 ? r[0].focus() : (e.hasAttribute("tabindex") || (e.setAttribute("tabindex", "-1"), i = !0), e.focus()), {
|
|
140
140
|
release() {
|
|
141
141
|
e.removeEventListener("keydown", o), i && (e.removeAttribute("tabindex"), i = !1);
|
|
142
142
|
}
|
|
143
143
|
};
|
|
144
144
|
}
|
|
145
|
-
function
|
|
146
|
-
return
|
|
145
|
+
function Jt() {
|
|
146
|
+
return tt(document);
|
|
147
147
|
}
|
|
148
|
-
function
|
|
148
|
+
function Gt(e) {
|
|
149
149
|
if (!(!e || typeof e.focus != "function"))
|
|
150
150
|
try {
|
|
151
151
|
e.focus();
|
|
152
152
|
} catch {
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
|
-
function
|
|
155
|
+
function Zt(e, t = {}) {
|
|
156
156
|
e.setAttribute("role", "dialog"), e.setAttribute("aria-modal", "true"), t.labelledbyId && e.setAttribute("aria-labelledby", t.labelledbyId), t.describedbyId && e.setAttribute("aria-describedby", t.describedbyId), t.label && e.setAttribute("aria-label", t.label);
|
|
157
157
|
}
|
|
158
|
-
function
|
|
158
|
+
function te(e, t) {
|
|
159
159
|
let i = e;
|
|
160
160
|
for (; i && i !== t; ) {
|
|
161
161
|
const o = i.parentNode;
|
|
@@ -169,11 +169,11 @@ function Nt(e, t) {
|
|
|
169
169
|
}
|
|
170
170
|
return null;
|
|
171
171
|
}
|
|
172
|
-
function
|
|
172
|
+
function ee(e) {
|
|
173
173
|
const i = (e.ownerDocument || document).body;
|
|
174
174
|
if (!i) return () => {
|
|
175
175
|
};
|
|
176
|
-
const o =
|
|
176
|
+
const o = te(e, i), r = [];
|
|
177
177
|
return Array.from(i.children).forEach((n) => {
|
|
178
178
|
if (!(n instanceof HTMLElement) || o && n === o) return;
|
|
179
179
|
const a = n.inert === !0, l = n.getAttribute("aria-hidden");
|
|
@@ -185,14 +185,14 @@ function jt(e) {
|
|
|
185
185
|
}
|
|
186
186
|
};
|
|
187
187
|
}
|
|
188
|
-
const
|
|
188
|
+
const et = {
|
|
189
189
|
width: 400,
|
|
190
190
|
height: 280,
|
|
191
191
|
arrowHeight: 12,
|
|
192
192
|
gap: 8,
|
|
193
193
|
viewportPadding: 16
|
|
194
194
|
};
|
|
195
|
-
function
|
|
195
|
+
function ie(e, t, i, o, r) {
|
|
196
196
|
const n = e.y, a = t - (e.y + e.height);
|
|
197
197
|
if (a >= i + o)
|
|
198
198
|
return {
|
|
@@ -211,22 +211,22 @@ function Qt(e, t, i, o, r) {
|
|
|
211
211
|
t - i - r
|
|
212
212
|
) : c = Math.max(r, e.y - i - o), { top: c, position: l };
|
|
213
213
|
}
|
|
214
|
-
function
|
|
214
|
+
function oe(e, t, i, o) {
|
|
215
215
|
let n = e.x + e.width / 2 - i / 2;
|
|
216
216
|
return n = Math.max(o, Math.min(n, t - i - o)), n;
|
|
217
217
|
}
|
|
218
|
-
function
|
|
218
|
+
function ae(e, t, i, o = 24, r = 24) {
|
|
219
219
|
const a = e.clickX - t - r / 2;
|
|
220
220
|
return Math.max(o, Math.min(a, i - o - r / 2));
|
|
221
221
|
}
|
|
222
|
-
function
|
|
223
|
-
const r = o.height + o.arrowHeight, n =
|
|
222
|
+
function ne(e, t, i, o = et) {
|
|
223
|
+
const r = o.height + o.arrowHeight, n = ie(
|
|
224
224
|
e,
|
|
225
225
|
i,
|
|
226
226
|
r,
|
|
227
227
|
o.gap,
|
|
228
228
|
o.viewportPadding
|
|
229
|
-
), a =
|
|
229
|
+
), a = oe(
|
|
230
230
|
e,
|
|
231
231
|
t,
|
|
232
232
|
o.width,
|
|
@@ -238,15 +238,15 @@ function Xt(e, t, i, o = X) {
|
|
|
238
238
|
position: n.position
|
|
239
239
|
};
|
|
240
240
|
}
|
|
241
|
-
function
|
|
241
|
+
function re(e, t, i, o = {}) {
|
|
242
242
|
const r = o.gap ?? 8;
|
|
243
243
|
let n = e.bottom + r;
|
|
244
244
|
n + t.height > i.height - r && (n = e.top - t.height - r);
|
|
245
245
|
let a = e.left;
|
|
246
246
|
return a < r ? a = r : a + t.width > i.width - r && (a = i.width - t.width - r), n < r ? n = r : n + t.height > i.height - r && (n = i.height - t.height - r), { top: n, left: a };
|
|
247
247
|
}
|
|
248
|
-
function
|
|
249
|
-
const r =
|
|
248
|
+
function Ce(e, t, i, o = et) {
|
|
249
|
+
const r = ne(e, t, i, o), n = ae(
|
|
250
250
|
e,
|
|
251
251
|
r.left,
|
|
252
252
|
o.width
|
|
@@ -256,15 +256,15 @@ function pe(e, t, i, o = X) {
|
|
|
256
256
|
arrow: { left: n }
|
|
257
257
|
};
|
|
258
258
|
}
|
|
259
|
-
const
|
|
260
|
-
function
|
|
259
|
+
const se = 20;
|
|
260
|
+
function de(e) {
|
|
261
261
|
const t = [], i = console.error, o = console.warn, r = console.log, n = (a, l) => {
|
|
262
262
|
const c = {
|
|
263
263
|
message: l.map((d) => String(d)).join(" "),
|
|
264
264
|
timestamp: Date.now(),
|
|
265
265
|
level: a
|
|
266
266
|
};
|
|
267
|
-
t.length >=
|
|
267
|
+
t.length >= se && t.shift(), t.push(c), e && e(c);
|
|
268
268
|
};
|
|
269
269
|
return console.error = function(...a) {
|
|
270
270
|
n("error", a), i.apply(console, a);
|
|
@@ -279,7 +279,7 @@ function Zt(e) {
|
|
|
279
279
|
}
|
|
280
280
|
};
|
|
281
281
|
}
|
|
282
|
-
const
|
|
282
|
+
const le = "https://unpkg.com/@qaiddev/quests-embed@1/dist/qaid-quests.js", ce = (e) => (
|
|
283
283
|
// The URL is a runtime value, not a static specifier — keep Vite from
|
|
284
284
|
// trying to analyze/bundle it.
|
|
285
285
|
import(
|
|
@@ -287,19 +287,19 @@ const te = "https://unpkg.com/@qaiddev/quests-embed@1/dist/qaid-quests.js", ee =
|
|
|
287
287
|
e
|
|
288
288
|
)
|
|
289
289
|
);
|
|
290
|
-
let
|
|
291
|
-
function
|
|
292
|
-
return p &&
|
|
290
|
+
let ue = ce, p = null, k = null;
|
|
291
|
+
function he(e) {
|
|
292
|
+
return p && k === e || (k = e, p = Promise.resolve(ue(e)).then((t) => {
|
|
293
293
|
const i = t;
|
|
294
294
|
if (!i || typeof i.QaidQuests != "function")
|
|
295
295
|
throw new Error("quests module has no QaidQuests export");
|
|
296
296
|
return i;
|
|
297
297
|
}).catch((t) => {
|
|
298
|
-
throw p = null,
|
|
298
|
+
throw p = null, k = null, t;
|
|
299
299
|
})), p;
|
|
300
300
|
}
|
|
301
|
-
async function
|
|
302
|
-
const t = await
|
|
301
|
+
async function fe(e) {
|
|
302
|
+
const t = await he(e.moduleUrl), i = e.base.replace(/\/+$/, ""), o = e.feedbackId != null ? { feedbackId: e.feedbackId } : void 0;
|
|
303
303
|
return new t.QaidQuests({
|
|
304
304
|
endpoint: `${i}/responses`,
|
|
305
305
|
configUrl: `${i}/${encodeURIComponent(e.questId)}/definition`,
|
|
@@ -308,7 +308,7 @@ async function ae(e) {
|
|
|
308
308
|
onClose: e.onClose
|
|
309
309
|
});
|
|
310
310
|
}
|
|
311
|
-
const
|
|
311
|
+
const X = "qaid_visitor_id", J = "qaid_hide_feedback", pe = [
|
|
312
312
|
"#ef4444",
|
|
313
313
|
"#f59e0b",
|
|
314
314
|
"#22c55e",
|
|
@@ -316,26 +316,26 @@ const N = "qaid_visitor_id", j = "qaid_hide_feedback", ne = [
|
|
|
316
316
|
"#111827",
|
|
317
317
|
"#ffffff"
|
|
318
318
|
];
|
|
319
|
-
function
|
|
319
|
+
function be() {
|
|
320
320
|
return typeof window.matchMedia == "function" && window.matchMedia("(pointer: coarse)").matches;
|
|
321
321
|
}
|
|
322
|
-
function
|
|
323
|
-
return e ? `${
|
|
322
|
+
function S(e) {
|
|
323
|
+
return e ? `${J}_${e}` : J;
|
|
324
324
|
}
|
|
325
|
-
function
|
|
325
|
+
function me(e) {
|
|
326
326
|
try {
|
|
327
|
-
return localStorage.getItem(
|
|
327
|
+
return localStorage.getItem(S(e)) === "1";
|
|
328
328
|
} catch {
|
|
329
329
|
return !1;
|
|
330
330
|
}
|
|
331
331
|
}
|
|
332
|
-
function
|
|
332
|
+
function G(e, t = !0) {
|
|
333
333
|
try {
|
|
334
|
-
t ? localStorage.setItem(
|
|
334
|
+
t ? localStorage.setItem(S(e), "1") : localStorage.removeItem(S(e));
|
|
335
335
|
} catch {
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
|
-
function
|
|
338
|
+
function Z() {
|
|
339
339
|
const e = typeof crypto < "u" ? crypto : void 0;
|
|
340
340
|
if (e && typeof e.randomUUID == "function") return e.randomUUID();
|
|
341
341
|
const t = new Uint8Array(16);
|
|
@@ -347,15 +347,15 @@ function W() {
|
|
|
347
347
|
const i = Array.from(t, (o) => o.toString(16).padStart(2, "0")).join("");
|
|
348
348
|
return `${i.slice(0, 8)}-${i.slice(8, 12)}-${i.slice(12, 16)}-${i.slice(16, 20)}-${i.slice(20)}`;
|
|
349
349
|
}
|
|
350
|
-
function
|
|
350
|
+
function ge() {
|
|
351
351
|
try {
|
|
352
|
-
let e = localStorage.getItem(
|
|
353
|
-
return e || (e =
|
|
352
|
+
let e = localStorage.getItem(X);
|
|
353
|
+
return e || (e = Z(), localStorage.setItem(X, e)), e;
|
|
354
354
|
} catch {
|
|
355
|
-
return
|
|
355
|
+
return Z();
|
|
356
356
|
}
|
|
357
357
|
}
|
|
358
|
-
class
|
|
358
|
+
class ve {
|
|
359
359
|
config;
|
|
360
360
|
state = "IDLE";
|
|
361
361
|
feedbackData = {
|
|
@@ -473,7 +473,7 @@ class le {
|
|
|
473
473
|
captureScreenshot: t.captureScreenshot ?? !1,
|
|
474
474
|
annotate: t.annotate ?? !0,
|
|
475
475
|
annotationColor: t.annotationColor ?? t.colors?.marker ?? "#6365f1",
|
|
476
|
-
annotationPalette: t.annotationPalette ??
|
|
476
|
+
annotationPalette: t.annotationPalette ?? pe,
|
|
477
477
|
screenshotMethod: t.screenshotMethod ?? "permission",
|
|
478
478
|
screenshotOptions: {
|
|
479
479
|
quality: t.screenshotOptions?.quality ?? 0.8,
|
|
@@ -500,12 +500,12 @@ class le {
|
|
|
500
500
|
video: t.quests?.video ?? "",
|
|
501
501
|
// Quest service reuses the feedback API key unless overridden.
|
|
502
502
|
apiKey: t.quests?.apiKey ?? t.apiKey ?? "",
|
|
503
|
-
moduleUrl: t.quests?.moduleUrl ??
|
|
503
|
+
moduleUrl: t.quests?.moduleUrl ?? le
|
|
504
504
|
}
|
|
505
|
-
}, this.boundKeyDown = this.handleKeyDown.bind(this), this.boundResize = this.handleResize.bind(this), this.visitorId =
|
|
505
|
+
}, this.boundKeyDown = this.handleKeyDown.bind(this), this.boundResize = this.handleResize.bind(this), this.visitorId = ge(), this.init();
|
|
506
506
|
}
|
|
507
507
|
applyVars(t) {
|
|
508
|
-
|
|
508
|
+
Ut(t, this.cssVars);
|
|
509
509
|
}
|
|
510
510
|
/**
|
|
511
511
|
* Announce a message via the shared visually-hidden live regions.
|
|
@@ -515,7 +515,7 @@ class le {
|
|
|
515
515
|
*/
|
|
516
516
|
announceMsg(t, i = !1) {
|
|
517
517
|
const o = this.overlayShadowRoot ?? this.shadowRoot;
|
|
518
|
-
o &&
|
|
518
|
+
o && Qt(o, t, { assertive: i });
|
|
519
519
|
}
|
|
520
520
|
/**
|
|
521
521
|
* Turn a transient surface into an accessible modal dialog: save the
|
|
@@ -523,16 +523,16 @@ class le {
|
|
|
523
523
|
* background. Paired with closeDialogA11y() on every close path.
|
|
524
524
|
*/
|
|
525
525
|
openDialogA11y(t, i) {
|
|
526
|
-
this.dialogTrigger =
|
|
526
|
+
this.dialogTrigger = Jt(), Zt(t, i), this.dialogTrap = Xt(t), this.dialogRestoreInert = ee(t);
|
|
527
527
|
}
|
|
528
528
|
closeDialogA11y() {
|
|
529
|
-
this.dialogTrap?.release(), this.dialogTrap = null, this.dialogRestoreInert && (this.dialogRestoreInert(), this.dialogRestoreInert = null),
|
|
529
|
+
this.dialogTrap?.release(), this.dialogTrap = null, this.dialogRestoreInert && (this.dialogRestoreInert(), this.dialogRestoreInert = null), Gt(this.dialogTrigger), this.dialogTrigger = null;
|
|
530
530
|
}
|
|
531
531
|
clearActiveThumb() {
|
|
532
532
|
this.activeThumbBtn && (this.activeThumbBtn.setAttribute("aria-pressed", "false"), this.activeThumbBtn = null);
|
|
533
533
|
}
|
|
534
534
|
init() {
|
|
535
|
-
|
|
535
|
+
Vt(), this.cssVars = Ft({
|
|
536
536
|
positiveColor: this.config.colors.positive,
|
|
537
537
|
negativeColor: this.config.colors.negative,
|
|
538
538
|
markerColor: this.config.colors.marker,
|
|
@@ -541,7 +541,7 @@ class le {
|
|
|
541
541
|
backdropOpacity: this.config.backdropOpacity,
|
|
542
542
|
fontFamily: this.config.fontFamily,
|
|
543
543
|
fontSize: this.config.fontSize
|
|
544
|
-
}), !this.config.hideDismiss &&
|
|
544
|
+
}), !this.config.hideDismiss && me(this.config.apiKey) && (this._startDismissed = !0), this.checkMobile(), window.addEventListener("resize", this.boundResize), this.createEmbed(), this.consoleCapture = de((t) => {
|
|
545
545
|
this.feedbackData.consoleErrors = this.consoleCapture?.errors ?? [];
|
|
546
546
|
}), this.feedbackData.consoleErrors = this.consoleCapture.errors, this.observeDom(), (this.config.captureVideo && this.videoSupported() || this.config.captureScreenshot) && this.schedulePrewarm(() => {
|
|
547
547
|
this.config.captureVideo && this.videoSupported() && this.prewarmVideo(), this.config.captureScreenshot && this.prewarmScreenshot();
|
|
@@ -554,7 +554,7 @@ class le {
|
|
|
554
554
|
* swallowed — a failed preload just falls back to an on-demand load.
|
|
555
555
|
*/
|
|
556
556
|
prewarmVideo() {
|
|
557
|
-
this.videoPrewarmed || (this.videoPrewarmed = !0, import("./recording-
|
|
557
|
+
this.videoPrewarmed || (this.videoPrewarmed = !0, import("./recording-CcfOfIC7.js").catch(() => {
|
|
558
558
|
}), import("./video-Bd_29-rK.js").catch(() => {
|
|
559
559
|
}));
|
|
560
560
|
}
|
|
@@ -589,7 +589,7 @@ class le {
|
|
|
589
589
|
}), this.domObserver.observe(document.body, { childList: !0 });
|
|
590
590
|
}
|
|
591
591
|
checkMobile() {
|
|
592
|
-
this.isMobile =
|
|
592
|
+
this.isMobile = At();
|
|
593
593
|
}
|
|
594
594
|
handleResize() {
|
|
595
595
|
this.checkMobile();
|
|
@@ -599,7 +599,7 @@ class le {
|
|
|
599
599
|
let t = null;
|
|
600
600
|
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" });
|
|
601
601
|
const i = document.createElement("style");
|
|
602
|
-
if (i.textContent =
|
|
602
|
+
if (i.textContent = Q(), this.shadowRoot.appendChild(i), this.config.css) {
|
|
603
603
|
const d = document.createElement("style");
|
|
604
604
|
d.textContent = this.config.css, this.shadowRoot.appendChild(d);
|
|
605
605
|
}
|
|
@@ -623,20 +623,20 @@ class le {
|
|
|
623
623
|
const d = document.createElement("div");
|
|
624
624
|
d.className = "qaid-tooltip-wrapper";
|
|
625
625
|
const s = document.createElement("button");
|
|
626
|
-
s.type = "button", s.className = r ? `${n} qaid-btn-feedback` : "qaid-btn qaid-btn-feedback", s.setAttribute("aria-label", this.config.text.feedbackLabel), s.innerHTML = this.config.feedbackIcon ||
|
|
626
|
+
s.type = "button", s.className = r ? `${n} qaid-btn-feedback` : "qaid-btn qaid-btn-feedback", s.setAttribute("aria-label", this.config.text.feedbackLabel), s.innerHTML = this.config.feedbackIcon || Tt, s.addEventListener("click", (u) => this.handleThumbClick("neutral", u.currentTarget, u)), s.addEventListener("mouseenter", () => {
|
|
627
627
|
this.prewarmTargeting(), this.showTooltip(s);
|
|
628
628
|
}), s.addEventListener("mouseleave", () => this.hideTooltip()), d.appendChild(s), this.buttonsContainer.appendChild(d);
|
|
629
629
|
} else if (!this.config.hideThumbs) {
|
|
630
630
|
const d = document.createElement("div");
|
|
631
631
|
d.className = "qaid-tooltip-wrapper";
|
|
632
632
|
const s = document.createElement("button");
|
|
633
|
-
s.type = "button", s.className = r ? `${n} qaid-btn-up` : "qaid-btn qaid-btn-up", s.setAttribute("aria-label", this.config.text.positiveLabel), s.innerHTML = this.config.positiveIcon ||
|
|
633
|
+
s.type = "button", s.className = r ? `${n} qaid-btn-up` : "qaid-btn qaid-btn-up", s.setAttribute("aria-label", this.config.text.positiveLabel), s.innerHTML = this.config.positiveIcon || It, s.addEventListener("click", (f) => this.handleThumbClick("up", f.currentTarget, f)), s.addEventListener("mouseenter", () => {
|
|
634
634
|
this.prewarmTargeting(), this.showTooltip(s);
|
|
635
635
|
}), s.addEventListener("mouseleave", () => this.hideTooltip()), d.appendChild(s);
|
|
636
636
|
const u = document.createElement("div");
|
|
637
637
|
u.className = "qaid-tooltip-wrapper";
|
|
638
638
|
const h = document.createElement("button");
|
|
639
|
-
h.type = "button", h.className = r ? `${n} qaid-btn-down` : "qaid-btn qaid-btn-down", h.setAttribute("aria-label", this.config.text.negativeLabel), h.innerHTML = this.config.negativeIcon ||
|
|
639
|
+
h.type = "button", h.className = r ? `${n} qaid-btn-down` : "qaid-btn qaid-btn-down", h.setAttribute("aria-label", this.config.text.negativeLabel), h.innerHTML = this.config.negativeIcon || Et, h.addEventListener("click", (f) => this.handleThumbClick("down", f.currentTarget, f)), h.addEventListener("mouseenter", () => {
|
|
640
640
|
this.prewarmTargeting(), this.showTooltip(h);
|
|
641
641
|
}), h.addEventListener("mouseleave", () => this.hideTooltip()), u.appendChild(h), this.buttonsContainer.appendChild(d), this.buttonsContainer.appendChild(u);
|
|
642
642
|
}
|
|
@@ -644,7 +644,7 @@ class le {
|
|
|
644
644
|
const d = document.createElement("div");
|
|
645
645
|
d.className = "qaid-tooltip-wrapper";
|
|
646
646
|
const s = document.createElement("button");
|
|
647
|
-
s.type = "button", s.className = r ? `${n} qaid-btn-record` : "qaid-btn qaid-btn-record", s.setAttribute("aria-label", this.config.text.recordLabel), s.innerHTML = this.config.recordIcon ||
|
|
647
|
+
s.type = "button", s.className = r ? `${n} qaid-btn-record` : "qaid-btn qaid-btn-record", s.setAttribute("aria-label", this.config.text.recordLabel), s.innerHTML = this.config.recordIcon || zt, s.addEventListener("click", () => {
|
|
648
648
|
this.ensureRecording().then(
|
|
649
649
|
(h) => this.config.videoOptions.redaction ? h.startPicking() : h.startRecording()
|
|
650
650
|
);
|
|
@@ -668,7 +668,7 @@ class le {
|
|
|
668
668
|
if (this.overlayShadowRoot) return this.overlayShadowRoot;
|
|
669
669
|
this.overlayShadowHost = document.createElement("div"), this.overlayShadowHost.setAttribute("data-qaid-embed-overlay", ""), this.overlayShadowHost.style.position = "fixed", this.overlayShadowHost.style.inset = "0", this.overlayShadowHost.style.pointerEvents = "none", this.overlayShadowHost.style.zIndex = String(this.config.zIndex), document.body.appendChild(this.overlayShadowHost), this.overlayShadowRoot = this.overlayShadowHost.attachShadow({ mode: "open" });
|
|
670
670
|
const t = document.createElement("style");
|
|
671
|
-
if (t.textContent =
|
|
671
|
+
if (t.textContent = Q(), this.overlayShadowRoot.appendChild(t), this.config.css) {
|
|
672
672
|
const i = document.createElement("style");
|
|
673
673
|
i.textContent = this.config.css, this.overlayShadowRoot.appendChild(i);
|
|
674
674
|
}
|
|
@@ -678,7 +678,7 @@ class le {
|
|
|
678
678
|
showTooltip(t) {
|
|
679
679
|
const i = this.tooltipElement;
|
|
680
680
|
i.style.visibility = "hidden", i.classList.add("qaid-tooltip-visible");
|
|
681
|
-
const o = t.getBoundingClientRect(), r = i.getBoundingClientRect(), { top: n, left: a } =
|
|
681
|
+
const o = t.getBoundingClientRect(), r = i.getBoundingClientRect(), { top: n, left: a } = re(
|
|
682
682
|
o,
|
|
683
683
|
r,
|
|
684
684
|
{ width: window.innerWidth, height: window.innerHeight }
|
|
@@ -689,10 +689,10 @@ class le {
|
|
|
689
689
|
this.tooltipElement.classList.remove("qaid-tooltip-visible");
|
|
690
690
|
}
|
|
691
691
|
handleDismiss() {
|
|
692
|
-
this.buttonsContainer.classList.add("qaid-dismissed"),
|
|
692
|
+
this.buttonsContainer.classList.add("qaid-dismissed"), G(this.config.apiKey, !0);
|
|
693
693
|
}
|
|
694
694
|
handleThumbClick(t, i, o) {
|
|
695
|
-
if (this.buttonsContainer?.classList.contains("qaid-incognito") && (this.buttonsContainer.classList.remove("qaid-incognito"),
|
|
695
|
+
if (this.buttonsContainer?.classList.contains("qaid-incognito") && (this.buttonsContainer.classList.remove("qaid-incognito"), G(this.config.apiKey, !1)), this.prewarmModal(), this.config.skipTargeting || this.config.feedbackMode === "annotate")
|
|
696
696
|
this.submitDirectFeedback(t, i);
|
|
697
697
|
else {
|
|
698
698
|
this.activeThumbBtn = i, i.setAttribute("aria-pressed", "true");
|
|
@@ -725,7 +725,7 @@ class le {
|
|
|
725
725
|
* instead of the permission-based Screen Capture API. Explicit "dom" wins;
|
|
726
726
|
* otherwise DOM is used on touch devices to avoid the getDisplayMedia prompt. */
|
|
727
727
|
shouldCaptureViaDom() {
|
|
728
|
-
return this.config.screenshotMethod === "dom" ||
|
|
728
|
+
return this.config.screenshotMethod === "dom" || be();
|
|
729
729
|
}
|
|
730
730
|
/**
|
|
731
731
|
* Open the full-screen annotation editor over the captured screenshot,
|
|
@@ -842,7 +842,7 @@ class le {
|
|
|
842
842
|
const o = this.questIdFor(t);
|
|
843
843
|
if (!o) return !1;
|
|
844
844
|
try {
|
|
845
|
-
return this.activeQuest?.destroy(), this.activeQuest = await
|
|
845
|
+
return this.activeQuest?.destroy(), this.activeQuest = await fe({
|
|
846
846
|
questId: o,
|
|
847
847
|
base: this.config.quests.base,
|
|
848
848
|
apiKey: this.config.quests.apiKey || void 0,
|
|
@@ -871,7 +871,7 @@ class le {
|
|
|
871
871
|
*/
|
|
872
872
|
async ensureModal() {
|
|
873
873
|
if (!this.modal) {
|
|
874
|
-
const { ModalController: t } = await import("./modal-
|
|
874
|
+
const { ModalController: t } = await import("./modal-CEfcaIQR.js");
|
|
875
875
|
this.modal = new t(this.makeModalHost());
|
|
876
876
|
}
|
|
877
877
|
return this.modal;
|
|
@@ -917,7 +917,7 @@ class le {
|
|
|
917
917
|
}
|
|
918
918
|
/** Warm the modal chunk while the user is targeting, so it opens instantly. */
|
|
919
919
|
prewarmModal() {
|
|
920
|
-
this.modalPrewarmed || (this.modalPrewarmed = !0, import("./modal-
|
|
920
|
+
this.modalPrewarmed || (this.modalPrewarmed = !0, import("./modal-CEfcaIQR.js").catch(() => {
|
|
921
921
|
}));
|
|
922
922
|
}
|
|
923
923
|
/**
|
|
@@ -991,7 +991,7 @@ class le {
|
|
|
991
991
|
*/
|
|
992
992
|
async ensureRecording() {
|
|
993
993
|
if (!this.recording) {
|
|
994
|
-
const { RecordingController: t } = await import("./recording-
|
|
994
|
+
const { RecordingController: t } = await import("./recording-CcfOfIC7.js");
|
|
995
995
|
this.recording = new t(this.makeRecordingHost());
|
|
996
996
|
}
|
|
997
997
|
return this.recording;
|
|
@@ -1047,13 +1047,13 @@ class le {
|
|
|
1047
1047
|
const t = window;
|
|
1048
1048
|
this.prewarmIsTimeout ? clearTimeout(this.prewarmHandle) : t.cancelIdleCallback?.(this.prewarmHandle), this.prewarmHandle = null;
|
|
1049
1049
|
}
|
|
1050
|
-
this.recording?.destroy(), this.recording = null, this.modal?.destroy(), this.modal = null, this.activeQuest?.destroy(), this.activeQuest = null, this.consoleCapture && (this.consoleCapture.restore(), this.consoleCapture = null), window.removeEventListener("resize", this.boundResize), 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.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.dismissBtn = null, this.tooltipElement = null,
|
|
1050
|
+
this.recording?.destroy(), this.recording = null, this.modal?.destroy(), this.modal = null, this.activeQuest?.destroy(), this.activeQuest = null, this.consoleCapture && (this.consoleCapture.restore(), this.consoleCapture = null), window.removeEventListener("resize", this.boundResize), 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.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.dismissBtn = null, this.tooltipElement = null, _t();
|
|
1051
1051
|
}
|
|
1052
1052
|
}
|
|
1053
|
-
function
|
|
1053
|
+
function it(e) {
|
|
1054
1054
|
return document.querySelector(e)?.textContent?.trim() ?? "";
|
|
1055
1055
|
}
|
|
1056
|
-
function
|
|
1056
|
+
function ye() {
|
|
1057
1057
|
const e = document.querySelector(
|
|
1058
1058
|
'script[type="application/json"][data-feedback-config]'
|
|
1059
1059
|
);
|
|
@@ -1062,31 +1062,72 @@ function ce() {
|
|
|
1062
1062
|
if (!t) return null;
|
|
1063
1063
|
try {
|
|
1064
1064
|
const i = JSON.parse(t);
|
|
1065
|
-
return i.cssSelector && !i.css && (i.css =
|
|
1065
|
+
return i.cssSelector && !i.css && (i.css = it(i.cssSelector), delete i.cssSelector), i;
|
|
1066
1066
|
} catch {
|
|
1067
1067
|
return null;
|
|
1068
1068
|
}
|
|
1069
1069
|
}
|
|
1070
|
-
function
|
|
1070
|
+
function ot(e, t, i) {
|
|
1071
|
+
console.warn(`[thumbs-embed] Ignoring ${e}="${t}": expected ${i}.`);
|
|
1072
|
+
}
|
|
1073
|
+
function qe(e) {
|
|
1074
|
+
const t = [];
|
|
1075
|
+
let i = 0, o = "";
|
|
1076
|
+
for (const r of e)
|
|
1077
|
+
r === "(" && i++, r === ")" && (i = Math.max(0, i - 1)), r === "," && i === 0 ? (t.push(o.trim()), o = "") : o += r;
|
|
1078
|
+
return t.push(o.trim()), t;
|
|
1079
|
+
}
|
|
1080
|
+
function xe(e, t) {
|
|
1081
|
+
if (t === null) return;
|
|
1082
|
+
const i = t.trim();
|
|
1083
|
+
let o = null;
|
|
1084
|
+
if (i.startsWith("[") || i.startsWith("{"))
|
|
1085
|
+
try {
|
|
1086
|
+
o = JSON.parse(i);
|
|
1087
|
+
} catch {
|
|
1088
|
+
o = null;
|
|
1089
|
+
}
|
|
1090
|
+
else
|
|
1091
|
+
o = qe(i);
|
|
1092
|
+
if (Array.isArray(o) && o.length > 0 && o.every((r) => typeof r == "string" && r.trim() !== ""))
|
|
1093
|
+
return o.map((r) => r.trim());
|
|
1094
|
+
ot(e, t, "a JSON array of colours or a comma-separated list");
|
|
1095
|
+
}
|
|
1096
|
+
function m(e, t) {
|
|
1097
|
+
if (t !== null) {
|
|
1098
|
+
if (t.trim() === "") {
|
|
1099
|
+
ot(e, t, "a non-empty label");
|
|
1100
|
+
return;
|
|
1101
|
+
}
|
|
1102
|
+
return t;
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
function we(e) {
|
|
1071
1106
|
const t = e.getAttribute("data-endpoint");
|
|
1072
1107
|
if (!t) return null;
|
|
1073
|
-
const i = e.getAttribute("data-position"), o = e.getAttribute("data-zindex"), r = e.getAttribute("data-positive-color"), n = e.getAttribute("data-negative-color"), a = e.getAttribute("data-marker-color"), l = e.getAttribute("data-container"), c = e.getAttribute("data-button-class"), d = e.getAttribute("data-skip-targeting"), s = e.getAttribute("data-hide-confirmation"), u = e.getAttribute("data-single-button"), h = e.getAttribute("data-feedback-mode"), f = e.getAttribute("data-incognito"),
|
|
1108
|
+
const i = e.getAttribute("data-position"), o = e.getAttribute("data-zindex"), r = e.getAttribute("data-positive-color"), n = e.getAttribute("data-negative-color"), a = e.getAttribute("data-marker-color"), l = e.getAttribute("data-container"), c = e.getAttribute("data-button-class"), d = e.getAttribute("data-skip-targeting"), s = e.getAttribute("data-hide-confirmation"), u = e.getAttribute("data-single-button"), h = e.getAttribute("data-feedback-mode"), f = e.getAttribute("data-incognito"), at = e.getAttribute("data-button-size"), g = e.getAttribute("data-offset-x"), v = e.getAttribute("data-offset-y"), C = e.getAttribute("data-modal-width"), A = e.getAttribute("data-backdrop-opacity"), nt = e.getAttribute("data-font-family"), T = e.getAttribute("data-font-size"), I = e.getAttribute("data-tooltip"), E = e.getAttribute("data-modal-title"), z = e.getAttribute("data-confirmation-title"), D = e.getAttribute("data-confirmation-message"), H = e.getAttribute("data-confirmation-close"), L = e.getAttribute("data-error-title"), M = e.getAttribute("data-error-message"), B = e.getAttribute("data-modal-subtitle"), O = e.getAttribute("data-placeholder"), R = e.getAttribute("data-submit-button"), P = e.getAttribute("data-skip-button"), rt = e.getAttribute("data-positive-icon"), st = e.getAttribute("data-negative-icon"), dt = e.getAttribute("data-feedback-icon"), F = e.getAttribute("data-feedback-label"), lt = e.getAttribute("data-api-key"), ct = e.getAttribute("data-capture-screenshot"), ut = e.getAttribute("data-annotate"), ht = e.getAttribute("data-annotation-color"), y = e.getAttribute("data-screenshot-quality"), q = e.getAttribute("data-screenshot-max-width"), x = e.getAttribute("data-screenshot-max-height"), ft = e.getAttribute("data-capture-video"), U = e.getAttribute("data-video-redaction"), pt = e.getAttribute("data-hide-thumbs"), bt = e.getAttribute("data-hide-dismiss"), w = e.getAttribute("data-video-max-duration"), mt = e.getAttribute("data-screenshot-method"), gt = e.getAttribute("data-direction"), V = e.getAttribute("data-css-selector"), vt = e.getAttribute("data-css"), _ = m("data-positive-label", e.getAttribute("data-positive-label")), $ = m("data-negative-label", e.getAttribute("data-negative-label")), K = m("data-record-label", e.getAttribute("data-record-label")), N = m("data-dismiss-label", e.getAttribute("data-dismiss-label")), yt = xe(
|
|
1109
|
+
"data-annotation-palette",
|
|
1110
|
+
e.getAttribute("data-annotation-palette")
|
|
1111
|
+
), qt = e.getAttribute("data-record-icon"), j = e.getAttribute("data-quest-base"), xt = e.getAttribute("data-quest-up"), wt = e.getAttribute("data-quest-down"), kt = e.getAttribute("data-quest-video"), St = e.getAttribute("data-quest-api-key"), Ct = e.getAttribute("data-quest-module-url");
|
|
1074
1112
|
return {
|
|
1075
1113
|
endpoint: t,
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1114
|
+
// Inline CSS wins over a selector, as `css` wins over `cssSelector` in
|
|
1115
|
+
// the JSON block.
|
|
1116
|
+
css: vt || (V ? it(V) : void 0),
|
|
1117
|
+
apiKey: lt ?? void 0,
|
|
1118
|
+
captureScreenshot: ct === "true" ? !0 : void 0,
|
|
1079
1119
|
// Annotation is on by default; only an explicit "false" disables it.
|
|
1080
|
-
annotate:
|
|
1081
|
-
annotationColor:
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1120
|
+
annotate: ut === "false" ? !1 : void 0,
|
|
1121
|
+
annotationColor: ht ?? void 0,
|
|
1122
|
+
annotationPalette: yt,
|
|
1123
|
+
screenshotOptions: y || q || x ? {
|
|
1124
|
+
quality: y ? parseFloat(y) : void 0,
|
|
1125
|
+
maxWidth: q ? parseInt(q, 10) : void 0,
|
|
1126
|
+
maxHeight: x ? parseInt(x, 10) : void 0
|
|
1086
1127
|
} : void 0,
|
|
1087
1128
|
container: l ?? void 0,
|
|
1088
1129
|
buttonClass: c ?? void 0,
|
|
1089
|
-
direction:
|
|
1130
|
+
direction: gt ?? void 0,
|
|
1090
1131
|
position: i ?? void 0,
|
|
1091
1132
|
zIndex: o ? parseInt(o, 10) : void 0,
|
|
1092
1133
|
skipTargeting: d === "true" ? !0 : void 0,
|
|
@@ -1094,66 +1135,71 @@ function ue(e) {
|
|
|
1094
1135
|
singleButton: u === "true" ? !0 : void 0,
|
|
1095
1136
|
feedbackMode: h ?? void 0,
|
|
1096
1137
|
incognito: f === "true" ? !0 : void 0,
|
|
1097
|
-
buttonSize:
|
|
1098
|
-
offset:
|
|
1099
|
-
x:
|
|
1100
|
-
y:
|
|
1138
|
+
buttonSize: at ?? void 0,
|
|
1139
|
+
offset: g || v ? {
|
|
1140
|
+
x: g ? parseInt(g, 10) : void 0,
|
|
1141
|
+
y: v ? parseInt(v, 10) : void 0
|
|
1101
1142
|
} : void 0,
|
|
1102
1143
|
modalWidth: C ? parseInt(C, 10) : void 0,
|
|
1103
|
-
backdropOpacity:
|
|
1104
|
-
fontFamily:
|
|
1105
|
-
fontSize:
|
|
1144
|
+
backdropOpacity: A ? parseFloat(A) : void 0,
|
|
1145
|
+
fontFamily: nt ?? void 0,
|
|
1146
|
+
fontSize: T ? parseInt(T, 10) : void 0,
|
|
1106
1147
|
colors: {
|
|
1107
1148
|
positive: r ?? void 0,
|
|
1108
1149
|
negative: n ?? void 0,
|
|
1109
1150
|
marker: a ?? void 0
|
|
1110
1151
|
},
|
|
1111
|
-
text:
|
|
1112
|
-
tooltip:
|
|
1152
|
+
text: I || E || B || O || R || P || F || z || D || H || L || M || _ || $ || K || N ? {
|
|
1153
|
+
tooltip: I ?? void 0,
|
|
1113
1154
|
modalTitle: E ?? void 0,
|
|
1114
|
-
modalSubtitle:
|
|
1115
|
-
placeholder:
|
|
1116
|
-
submitButton:
|
|
1117
|
-
skipButton:
|
|
1118
|
-
feedbackLabel:
|
|
1119
|
-
confirmationTitle:
|
|
1120
|
-
confirmationMessage:
|
|
1121
|
-
confirmationClose:
|
|
1122
|
-
errorTitle:
|
|
1123
|
-
errorMessage:
|
|
1155
|
+
modalSubtitle: B ?? void 0,
|
|
1156
|
+
placeholder: O ?? void 0,
|
|
1157
|
+
submitButton: R ?? void 0,
|
|
1158
|
+
skipButton: P ?? void 0,
|
|
1159
|
+
feedbackLabel: F ?? void 0,
|
|
1160
|
+
confirmationTitle: z ?? void 0,
|
|
1161
|
+
confirmationMessage: D ?? void 0,
|
|
1162
|
+
confirmationClose: H ?? void 0,
|
|
1163
|
+
errorTitle: L ?? void 0,
|
|
1164
|
+
errorMessage: M ?? void 0,
|
|
1165
|
+
positiveLabel: _,
|
|
1166
|
+
negativeLabel: $,
|
|
1167
|
+
recordLabel: K,
|
|
1168
|
+
dismissLabel: N
|
|
1124
1169
|
} : void 0,
|
|
1125
|
-
positiveIcon:
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1170
|
+
positiveIcon: rt ?? void 0,
|
|
1171
|
+
recordIcon: qt ?? void 0,
|
|
1172
|
+
negativeIcon: st ?? void 0,
|
|
1173
|
+
feedbackIcon: dt ?? void 0,
|
|
1174
|
+
screenshotMethod: mt ?? void 0,
|
|
1175
|
+
captureVideo: ft === "true" ? !0 : void 0,
|
|
1176
|
+
hideThumbs: pt === "true" ? !0 : void 0,
|
|
1177
|
+
hideDismiss: bt === "true" ? !0 : void 0,
|
|
1178
|
+
videoOptions: w || U ? {
|
|
1179
|
+
maxDuration: w ? parseInt(w, 10) : void 0,
|
|
1180
|
+
redaction: U === "true" ? !0 : void 0
|
|
1135
1181
|
} : void 0,
|
|
1136
|
-
quests:
|
|
1137
|
-
base:
|
|
1138
|
-
up:
|
|
1139
|
-
down:
|
|
1140
|
-
video:
|
|
1141
|
-
apiKey:
|
|
1142
|
-
moduleUrl:
|
|
1182
|
+
quests: j ? {
|
|
1183
|
+
base: j,
|
|
1184
|
+
up: xt ?? void 0,
|
|
1185
|
+
down: wt ?? void 0,
|
|
1186
|
+
video: kt ?? void 0,
|
|
1187
|
+
apiKey: St ?? void 0,
|
|
1188
|
+
moduleUrl: Ct ?? void 0
|
|
1143
1189
|
} : void 0
|
|
1144
1190
|
};
|
|
1145
1191
|
}
|
|
1146
|
-
function
|
|
1192
|
+
function ke() {
|
|
1147
1193
|
if (typeof document > "u") return;
|
|
1148
1194
|
const e = () => {
|
|
1149
|
-
const t = document.currentScript ?? document.querySelector("script[data-endpoint]"), i =
|
|
1150
|
-
|
|
1195
|
+
const t = document.currentScript ?? document.querySelector("script[data-endpoint]"), i = ye() ?? (t ? we(t) : null);
|
|
1196
|
+
i?.endpoint && new ve(i);
|
|
1151
1197
|
};
|
|
1152
1198
|
document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", e) : e();
|
|
1153
1199
|
}
|
|
1154
|
-
|
|
1200
|
+
ke();
|
|
1155
1201
|
export {
|
|
1156
|
-
|
|
1157
|
-
|
|
1202
|
+
ve as Q,
|
|
1203
|
+
Ce as c
|
|
1158
1204
|
};
|
|
1159
|
-
//# sourceMappingURL=loader-
|
|
1205
|
+
//# sourceMappingURL=loader-DepVS4i5.js.map
|