bugstash 0.1.26 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +604 -469
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +604 -469
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,19 +1,24 @@
|
|
|
1
|
-
var
|
|
2
|
-
${
|
|
1
|
+
var tt=[],Vn=50,nt=null,rt=null,st=null,ot=null;function Pt(e){if(e.id)return`#${e.id}`;let t=e.tagName.toLowerCase(),n=e.className&&typeof e.className=="string"?"."+e.className.trim().split(/\s+/).slice(0,2).join("."):"",r=(e.textContent||"").trim().slice(0,30),s=r?` "${r}"`:"";return`${t}${n}${s}`}function V(e){tt.push(e),tt.length>Vn&&tt.shift()}function Jn(e){e&&(Vn=e),nt=n=>{let r=n.target;!r||!r.tagName||V({type:"click",category:"ui",message:`Clicked ${Pt(r)}`,timestamp:Date.now(),data:{x:n.clientX,y:n.clientY,selector:Pt(r)}})},document.addEventListener("click",nt,!0);let t=new WeakMap;rt=n=>{let r=n.target;if(!r||!r.tagName)return;let s=r.tagName.toLowerCase();if(s!=="input"&&s!=="textarea"&&s!=="select")return;let o=t.get(r);o&&clearTimeout(o),t.set(r,window.setTimeout(()=>{let i=r instanceof HTMLInputElement&&r.type==="password";V({type:"input",category:"ui",message:`Input ${Pt(r)}`,timestamp:Date.now(),data:{selector:Pt(r),value:i?"[redacted]":void 0}})},300))},document.addEventListener("input",rt,!0),st=()=>{V({type:"navigation",category:"navigation",message:`Navigated to ${window.location.pathname}`,timestamp:Date.now(),data:{url:window.location.href}})},window.addEventListener("popstate",st),ot=()=>{V({type:"navigation",category:"navigation",message:`Hash changed to ${window.location.hash}`,timestamp:Date.now(),data:{url:window.location.href}})},window.addEventListener("hashchange",ot),V({type:"navigation",category:"navigation",message:`Page loaded: ${window.location.pathname}`,timestamp:Date.now(),data:{url:window.location.href}})}function Ie(){return[...tt]}function Kn(){tt=[]}function Gn(){nt&&document.removeEventListener("click",nt,!0),rt&&document.removeEventListener("input",rt,!0),st&&window.removeEventListener("popstate",st),ot&&window.removeEventListener("hashchange",ot),nt=null,rt=null,st=null,ot=null}var dn="[REDACTED]",zs=[[/\b(?:\d[ -]*?){13,19}\b/g,"[CC_REDACTED]"],[/\b\d{3}-\d{2}-\d{4}\b/g,"[SSN_REDACTED]"],[/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,"Bearer [TOKEN_REDACTED]"],[/eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,"[JWT_REDACTED]"],[/(?:api[_-]?key|apikey|secret|token|password|passwd|authorization)['":\s=]+['"]?([A-Za-z0-9\-._~+/]{20,})['"]?/gi,e=>{let t=e.search(/[=:]/);return e.slice(0,t+1)+" "+dn}],[/AKIA[0-9A-Z]{16}/g,"[AWS_KEY_REDACTED]"],[/"(?:password|passwd|secret|token|access_token|refresh_token|api_key|apiKey|private_key)":\s*"[^"]*"/gi,e=>{let t=e.indexOf(":");return e.slice(0,t+1)+' "'+dn+'"'}]];function Re(e){let t=e;for(let[n,r]of zs)t=t.replace(n,r);return t}function Qn(e){return e.map(Re)}function Tt(e){if(typeof e=="string")return Re(e);if(Array.isArray(e))return e.map(Tt);if(e&&typeof e=="object"){let t={};for(let[n,r]of Object.entries(e)){let s=n.toLowerCase();s.includes("password")||s.includes("secret")||s.includes("token")||s.includes("apikey")||s.includes("api_key")||s.includes("private")?t[n]=dn:t[n]=Tt(r)}return t}return e}var $t={log:console.log,warn:console.warn,error:console.error,debug:console.debug,info:console.info},it=[],Zn=50;function Hs(e){return e.map(t=>{if(t instanceof Error)return`${t.name}: ${t.message}
|
|
2
|
+
${t.stack??""}`;if(typeof t=="object")try{return JSON.stringify(t,null,2)}catch{return String(t)}return String(t)})}function Ds(e,t){let n={level:e,args:Qn(Hs(t)),timestamp:Date.now()};e==="error"&&(n.stack=new Error().stack?.split(`
|
|
3
3
|
`).slice(2).join(`
|
|
4
|
-
`)),ae.push(n),ae.length>Zn&&ae.shift(),V({type:"console",category:`console.${t}`,message:n.args.join(" ").slice(0,200),timestamp:n.timestamp})}function tr(t){t&&(Zn=t);for(let e of Object.keys(Ae))console[e]=function(...n){Bs(e,n),Ae[e].apply(console,n)}}function ut(){return[...ae]}function er(){ae=[]}function nr(){for(let t of Object.keys(Ae))console[t]=Ae[t]}var Ht=[],rr=50,Re,ze,Ie;function bn(t){Ht.push(t),Ht.length>rr&&Ht.shift(),V({type:"network",category:t.failed?"network.error":"network.ok",message:`${t.method} ${t.url} \u2192 ${t.status} (${t.duration}ms)`,timestamp:t.timestamp,data:{status:t.status,duration:t.duration}})}function sr(t){try{let e=new URL(t,window.location.origin),n=new URLSearchParams(e.search);for(let s of n.keys()){let o=s.toLowerCase();(o.includes("token")||o.includes("key")||o.includes("secret")||o.includes("password")||o.includes("auth"))&&n.set(s,"[REDACTED]")}let r=n.toString();return e.pathname+(r?"?"+r:"")}catch{return It(t)}}function Os(){Re=window.fetch,window.fetch=async function(t,e){let n=e?.method?.toUpperCase()??"GET",r=typeof t=="string"?t:t instanceof URL?t.href:t.url,s=sr(r),o=Date.now();try{let i=await Re.call(window,t,e);return bn({method:n,url:s,status:i.status,statusText:i.statusText,duration:Date.now()-o,responseType:i.headers.get("content-type")??void 0,timestamp:o,failed:i.status>=400}),i}catch(i){throw bn({method:n,url:s,status:0,statusText:"Network Error",duration:Date.now()-o,timestamp:o,failed:!0}),i}}}function Ns(){ze=XMLHttpRequest.prototype.open,Ie=XMLHttpRequest.prototype.send,XMLHttpRequest.prototype.open=function(t,e,...n){return this.__bs_method=t.toUpperCase(),this.__bs_url=sr(typeof e=="string"?e:e.href),ze.apply(this,[t,e,...n])},XMLHttpRequest.prototype.send=function(t){let e=Date.now();return this.addEventListener("loadend",function(){bn({method:this.__bs_method??"GET",url:this.__bs_url??"",status:this.status,statusText:this.statusText,duration:Date.now()-e,responseType:this.getResponseHeader("content-type")??void 0,timestamp:e,failed:this.status>=400||this.status===0})}),Ie.call(this,t)}}function or(t){t&&(rr=t),Os(),Ns()}function Dt(){return[...Ht]}function vt(){return Ht.filter(t=>t.failed)}function ir(){Ht=[]}function ar(){Re&&(window.fetch=Re),ze&&(XMLHttpRequest.prototype.open=ze),Ie&&(XMLHttpRequest.prototype.send=Ie)}var He=[],le=null,ce=null;function lr(){le=t=>{let e={message:t.message||"Unknown error",source:t.filename,lineno:t.lineno,colno:t.colno,stack:t.error?.stack,type:"error",timestamp:Date.now()};He.push(e),V({type:"error",category:"exception",message:e.message,timestamp:e.timestamp,data:{source:e.source,lineno:e.lineno}})},ce=t=>{let e=t.reason,n=e instanceof Error?e.message:typeof e=="string"?e:"Unhandled promise rejection",r={message:n,stack:e instanceof Error?e.stack:void 0,type:"unhandledrejection",timestamp:Date.now()};He.push(r),V({type:"error",category:"promise",message:n,timestamp:r.timestamp})},window.addEventListener("error",le),window.addEventListener("unhandledrejection",ce)}function ft(){return[...He]}function cr(){He=[]}function dr(){le&&window.removeEventListener("error",le),ce&&window.removeEventListener("unhandledrejection",ce),le=null,ce=null}var H=null,De=null,Be=null,Oe=null;function pr(){if(H={timestamp:Date.now()},performance.getEntriesByType){let t=()=>{let[e]=performance.getEntriesByType("navigation");e&&H&&(H.pageLoadTime=Math.round(e.loadEventEnd-e.startTime),H.domContentLoaded=Math.round(e.domContentLoadedEventEnd-e.startTime));let n=performance.getEntriesByType("paint");for(let s of n)s.name==="first-paint"&&H&&(H.firstPaint=Math.round(s.startTime)),s.name==="first-contentful-paint"&&H&&(H.firstContentfulPaint=Math.round(s.startTime));H&&(H.resourceCount=performance.getEntriesByType("resource").length);let r=performance.memory;r&&H&&(H.memoryUsage={usedJSHeapSize:r.usedJSHeapSize,totalJSHeapSize:r.totalJSHeapSize})};document.readyState==="complete"?setTimeout(t,0):window.addEventListener("load",()=>setTimeout(t,100))}if(typeof PerformanceObserver<"u"){try{De=new PerformanceObserver(t=>{let e=t.getEntries(),n=e[e.length-1];n&&H&&(H.largestContentfulPaint=Math.round(n.startTime))}),De.observe({type:"largest-contentful-paint",buffered:!0})}catch{}try{let t=0;Be=new PerformanceObserver(e=>{for(let n of e.getEntries())n.hadRecentInput||(t+=n.value);H&&(H.cumulativeLayoutShift=Math.round(t*1e3)/1e3)}),Be.observe({type:"layout-shift",buffered:!0})}catch{}try{Oe=new PerformanceObserver(t=>{let[e]=t.getEntries();e&&H&&(H.firstInputDelay=Math.round(e.processingStart-e.startTime))}),Oe.observe({type:"first-input",buffered:!0})}catch{}}}function Bt(){return H&&(H.timestamp=Date.now()),H?{...H}:null}function br(){De?.disconnect(),Be?.disconnect(),Oe?.disconnect(),De=null,Be=null,Oe=null,H=null}function ur(t,e){if(t.match(/^[a-z]+:\/\//i))return t;if(t.match(/^\/\//))return window.location.protocol+t;if(t.match(/^[a-z]+:/i))return t;let n=document.implementation.createHTMLDocument(),r=n.createElement("base"),s=n.createElement("a");return n.head.appendChild(r),n.body.appendChild(s),e&&(r.href=e),s.href=t,s.href}var fr=(()=>{let t=0,e=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(t+=1,`u${e()}${t}`)})();function st(t){let e=[];for(let n=0,r=t.length;n<r;n++)e.push(t[n]);return e}var Ot=null;function je(t={}){return Ot||(t.includeStyleProperties?(Ot=t.includeStyleProperties,Ot):(Ot=st(window.getComputedStyle(document.documentElement)),Ot))}function Ne(t,e){let r=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return r?parseFloat(r.replace("px","")):0}function js(t){let e=Ne(t,"border-left-width"),n=Ne(t,"border-right-width");return t.clientWidth+e+n}function qs(t){let e=Ne(t,"border-top-width"),n=Ne(t,"border-bottom-width");return t.clientHeight+e+n}function un(t,e={}){let n=e.width||js(t),r=e.height||qs(t);return{width:n,height:r}}function mr(){let t,e;try{e=process}catch{}let n=e&&e.env?e.env.devicePixelRatio:null;return n&&(t=parseInt(n,10),Number.isNaN(t)&&(t=1)),t||window.devicePixelRatio||1}var tt=16384;function gr(t){(t.width>tt||t.height>tt)&&(t.width>tt&&t.height>tt?t.width>t.height?(t.height*=tt/t.width,t.width=tt):(t.width*=tt/t.height,t.height=tt):t.width>tt?(t.height*=tt/t.width,t.width=tt):(t.width*=tt/t.height,t.height=tt))}function Nt(t){return new Promise((e,n)=>{let r=new Image;r.onload=()=>{r.decode().then(()=>{requestAnimationFrame(()=>e(r))})},r.onerror=n,r.crossOrigin="anonymous",r.decoding="async",r.src=t})}async function Us(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function hr(t,e,n){let r="http://www.w3.org/2000/svg",s=document.createElementNS(r,"svg"),o=document.createElementNS(r,"foreignObject");return s.setAttribute("width",`${e}`),s.setAttribute("height",`${n}`),s.setAttribute("viewBox",`0 0 ${e} ${n}`),o.setAttribute("width","100%"),o.setAttribute("height","100%"),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("externalResourcesRequired","true"),s.appendChild(o),o.appendChild(t),Us(s)}var W=(t,e)=>{if(t instanceof e)return!0;let n=Object.getPrototypeOf(t);return n===null?!1:n.constructor.name===e.name||W(n,e)};function Fs(t){let e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function _s(t,e){return je(e).map(n=>{let r=t.getPropertyValue(n),s=t.getPropertyPriority(n);return`${n}: ${r}${s?" !important":""};`}).join(" ")}function Ws(t,e,n,r){let s=`.${t}:${e}`,o=n.cssText?Fs(n):_s(n,r);return document.createTextNode(`${s}{${o}}`)}function vr(t,e,n,r){let s=window.getComputedStyle(t,n),o=s.getPropertyValue("content");if(o===""||o==="none")return;let i=fr();try{e.className=`${e.className} ${i}`}catch{return}let a=document.createElement("style");a.appendChild(Ws(i,n,s,r)),e.appendChild(a)}function yr(t,e,n){vr(t,e,":before",n),vr(t,e,":after",n)}var xr="application/font-woff",wr="image/jpeg",Ys={woff:xr,woff2:xr,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:wr,jpeg:wr,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function Xs(t){let e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function jt(t){let e=Xs(t).toLowerCase();return Ys[e]||""}function Vs(t){return t.split(/,/)[1]}function de(t){return t.search(/^(data:)/)!==-1}function mn(t,e){return`data:${e};base64,${t}`}async function gn(t,e,n){let r=await fetch(t,e);if(r.status===404)throw new Error(`Resource "${r.url}" not found`);let s=await r.blob();return new Promise((o,i)=>{let a=new FileReader;a.onerror=i,a.onloadend=()=>{try{o(n({res:r,result:a.result}))}catch(c){i(c)}},a.readAsDataURL(s)})}var fn={};function Js(t,e,n){let r=t.replace(/\?.*/,"");return n&&(r=t),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,"")),e?`[${e}]${r}`:r}async function qt(t,e,n){let r=Js(t,e,n.includeQueryParams);if(fn[r]!=null)return fn[r];n.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+new Date().getTime());let s;try{let o=await gn(t,n.fetchRequestInit,({res:i,result:a})=>(e||(e=i.headers.get("Content-Type")||""),Vs(a)));s=mn(o,e)}catch(o){s=n.imagePlaceholder||"";let i=`Failed to fetch resource: ${t}`;o&&(i=typeof o=="string"?o:o.message),i&&console.warn(i)}return fn[r]=s,s}async function Ks(t){let e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):Nt(e)}async function Gs(t,e){if(t.currentSrc){let o=document.createElement("canvas"),i=o.getContext("2d");o.width=t.clientWidth,o.height=t.clientHeight,i?.drawImage(t,0,0,o.width,o.height);let a=o.toDataURL();return Nt(a)}let n=t.poster,r=jt(n),s=await qt(n,r,e);return Nt(s)}async function Qs(t,e){var n;try{if(!((n=t?.contentDocument)===null||n===void 0)&&n.body)return await pe(t.contentDocument.body,e,!0)}catch{}return t.cloneNode(!1)}async function Zs(t,e){return W(t,HTMLCanvasElement)?Ks(t):W(t,HTMLVideoElement)?Gs(t,e):W(t,HTMLIFrameElement)?Qs(t,e):t.cloneNode(kr(t))}var to=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",kr=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function eo(t,e,n){var r,s;if(kr(e))return e;let o=[];return to(t)&&t.assignedNodes?o=st(t.assignedNodes()):W(t,HTMLIFrameElement)&&(!((r=t.contentDocument)===null||r===void 0)&&r.body)?o=st(t.contentDocument.body.childNodes):o=st(((s=t.shadowRoot)!==null&&s!==void 0?s:t).childNodes),o.length===0||W(t,HTMLVideoElement)||await o.reduce((i,a)=>i.then(()=>pe(a,n)).then(c=>{c&&e.appendChild(c)}),Promise.resolve()),e}function no(t,e,n){let r=e.style;if(!r)return;let s=window.getComputedStyle(t);s.cssText?(r.cssText=s.cssText,r.transformOrigin=s.transformOrigin):je(n).forEach(o=>{let i=s.getPropertyValue(o);o==="font-size"&&i.endsWith("px")&&(i=`${Math.floor(parseFloat(i.substring(0,i.length-2)))-.1}px`),W(t,HTMLIFrameElement)&&o==="display"&&i==="inline"&&(i="block"),o==="d"&&e.getAttribute("d")&&(i=`path(${e.getAttribute("d")})`),r.setProperty(o,i,s.getPropertyPriority(o))})}function ro(t,e){W(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),W(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function so(t,e){if(W(t,HTMLSelectElement)){let r=Array.from(e.children).find(s=>t.value===s.getAttribute("value"));r&&r.setAttribute("selected","")}}function oo(t,e,n){return W(e,Element)&&(no(t,e,n),yr(t,e,n),ro(t,e),so(t,e)),e}async function io(t,e){let n=t.querySelectorAll?t.querySelectorAll("use"):[];if(n.length===0)return t;let r={};for(let o=0;o<n.length;o++){let a=n[o].getAttribute("xlink:href");if(a){let c=t.querySelector(a),p=document.querySelector(a);!c&&p&&!r[a]&&(r[a]=await pe(p,e,!0))}}let s=Object.values(r);if(s.length){let o="http://www.w3.org/1999/xhtml",i=document.createElementNS(o,"svg");i.setAttribute("xmlns",o),i.style.position="absolute",i.style.width="0",i.style.height="0",i.style.overflow="hidden",i.style.display="none";let a=document.createElementNS(o,"defs");i.appendChild(a);for(let c=0;c<s.length;c++)a.appendChild(s[c]);t.appendChild(i)}return t}async function pe(t,e,n){return!n&&e.filter&&!e.filter(t)?null:Promise.resolve(t).then(r=>Zs(r,e)).then(r=>eo(t,r,e)).then(r=>oo(t,r,e)).then(r=>io(r,e))}var Er=/url\((['"]?)([^'"]+?)\1\)/g,ao=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,lo=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function co(t){let e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function po(t){let e=[];return t.replace(Er,(n,r,s)=>(e.push(s),n)),e.filter(n=>!de(n))}async function bo(t,e,n,r,s){try{let o=n?ur(e,n):e,i=jt(e),a;if(s){let c=await s(o);a=mn(c,i)}else a=await qt(o,i,r);return t.replace(co(e),`$1${a}$3`)}catch{}return t}function uo(t,{preferredFontFormat:e}){return e?t.replace(lo,n=>{for(;;){let[r,,s]=ao.exec(n)||[];if(!s)return"";if(s===e)return`src: ${r};`}}):t}function hn(t){return t.search(Er)!==-1}async function qe(t,e,n){if(!hn(t))return t;let r=uo(t,n);return po(r).reduce((o,i)=>o.then(a=>bo(a,i,e,n)),Promise.resolve(r))}async function Ut(t,e,n){var r;let s=(r=e.style)===null||r===void 0?void 0:r.getPropertyValue(t);if(s){let o=await qe(s,null,n);return e.style.setProperty(t,o,e.style.getPropertyPriority(t)),!0}return!1}async function fo(t,e){await Ut("background",t,e)||await Ut("background-image",t,e),await Ut("mask",t,e)||await Ut("-webkit-mask",t,e)||await Ut("mask-image",t,e)||await Ut("-webkit-mask-image",t,e)}async function mo(t,e){let n=W(t,HTMLImageElement);if(!(n&&!de(t.src))&&!(W(t,SVGImageElement)&&!de(t.href.baseVal)))return;let r=n?t.src:t.href.baseVal,s=await qt(r,jt(r),e);await new Promise((o,i)=>{t.onload=o,t.onerror=e.onImageErrorHandler?(...c)=>{try{o(e.onImageErrorHandler(...c))}catch(p){i(p)}}:i;let a=t;a.decode&&(a.decode=o),a.loading==="lazy"&&(a.loading="eager"),n?(t.srcset="",t.src=s):t.href.baseVal=s})}async function go(t,e){let r=st(t.childNodes).map(s=>vn(s,e));await Promise.all(r).then(()=>t)}async function vn(t,e){W(t,Element)&&(await fo(t,e),await mo(t,e),await go(t,e))}function Lr(t,e){let{style:n}=t;e.backgroundColor&&(n.backgroundColor=e.backgroundColor),e.width&&(n.width=`${e.width}px`),e.height&&(n.height=`${e.height}px`);let r=e.style;return r!=null&&Object.keys(r).forEach(s=>{n[s]=r[s]}),t}var Sr={};async function Cr(t){let e=Sr[t];if(e!=null)return e;let r=await(await fetch(t)).text();return e={url:t,cssText:r},Sr[t]=e,e}async function Pr(t,e){let n=t.cssText,r=/url\(["']?([^"')]+)["']?\)/g,o=(n.match(/url\([^)]+\)/g)||[]).map(async i=>{let a=i.replace(r,"$1");return a.startsWith("https://")||(a=new URL(a,t.url).href),gn(a,e.fetchRequestInit,({result:c})=>(n=n.replace(i,`url(${c})`),[i,c]))});return Promise.all(o).then(()=>n)}function Tr(t){if(t==null)return[];let e=[],n=/(\/\*[\s\S]*?\*\/)/gi,r=t.replace(n,""),s=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){let c=s.exec(r);if(c===null)break;e.push(c[0])}r=r.replace(s,"");let o=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,i="((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})",a=new RegExp(i,"gi");for(;;){let c=o.exec(r);if(c===null){if(c=a.exec(r),c===null)break;o.lastIndex=a.lastIndex}else a.lastIndex=o.lastIndex;e.push(c[0])}return e}async function ho(t,e){let n=[],r=[];return t.forEach(s=>{if("cssRules"in s)try{st(s.cssRules||[]).forEach((o,i)=>{if(o.type===CSSRule.IMPORT_RULE){let a=i+1,c=o.href,p=Cr(c).then(b=>Pr(b,e)).then(b=>Tr(b).forEach(v=>{try{s.insertRule(v,v.startsWith("@import")?a+=1:s.cssRules.length)}catch(S){console.error("Error inserting rule from remote css",{rule:v,error:S})}})).catch(b=>{console.error("Error loading remote css",b.toString())});r.push(p)}})}catch(o){let i=t.find(a=>a.href==null)||document.styleSheets[0];s.href!=null&&r.push(Cr(s.href).then(a=>Pr(a,e)).then(a=>Tr(a).forEach(c=>{i.insertRule(c,i.cssRules.length)})).catch(a=>{console.error("Error loading remote stylesheet",a)})),console.error("Error inlining remote css file",o)}}),Promise.all(r).then(()=>(t.forEach(s=>{if("cssRules"in s)try{st(s.cssRules||[]).forEach(o=>{n.push(o)})}catch(o){console.error(`Error while reading CSS rules from ${s.href}`,o)}}),n))}function vo(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>hn(e.style.getPropertyValue("src")))}async function yo(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");let n=st(t.ownerDocument.styleSheets),r=await ho(n,e);return vo(r)}function $r(t){return t.trim().replace(/["']/g,"")}function xo(t){let e=new Set;function n(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(o=>{e.add($r(o))}),Array.from(r.children).forEach(o=>{o instanceof HTMLElement&&n(o)})}return n(t),e}async function Mr(t,e){let n=await yo(t,e),r=xo(t);return(await Promise.all(n.filter(o=>r.has($r(o.style.fontFamily))).map(o=>{let i=o.parentStyleSheet?o.parentStyleSheet.href:null;return qe(o.cssText,i,e)}))).join(`
|
|
5
|
-
`)}async function
|
|
4
|
+
`)),it.push(n),it.length>Zn&&it.shift(),V({type:"console",category:`console.${e}`,message:n.args.join(" ").slice(0,200),timestamp:n.timestamp})}function er(e){e&&(Zn=e);for(let t of Object.keys($t))console[t]=function(...n){Ds(t,n),$t[t].apply(console,n)}}function fe(){return[...it]}function tr(){it=[]}function nr(){for(let e of Object.keys($t))console[e]=$t[e]}var ze=[],rr=50,Mt,At,It;function pn(e){ze.push(e),ze.length>rr&&ze.shift(),V({type:"network",category:e.failed?"network.error":"network.ok",message:`${e.method} ${e.url} \u2192 ${e.status} (${e.duration}ms)`,timestamp:e.timestamp,data:{status:e.status,duration:e.duration}})}function sr(e){try{let t=new URL(e,window.location.origin),n=new URLSearchParams(t.search);for(let s of n.keys()){let o=s.toLowerCase();(o.includes("token")||o.includes("key")||o.includes("secret")||o.includes("password")||o.includes("auth"))&&n.set(s,"[REDACTED]")}let r=n.toString();return t.pathname+(r?"?"+r:"")}catch{return Re(e)}}function Bs(){Mt=window.fetch,window.fetch=async function(e,t){let n=t?.method?.toUpperCase()??"GET",r=typeof e=="string"?e:e instanceof URL?e.href:e.url,s=sr(r),o=Date.now();try{let i=await Mt.call(window,e,t);return pn({method:n,url:s,status:i.status,statusText:i.statusText,duration:Date.now()-o,responseType:i.headers.get("content-type")??void 0,timestamp:o,failed:i.status>=400}),i}catch(i){throw pn({method:n,url:s,status:0,statusText:"Network Error",duration:Date.now()-o,timestamp:o,failed:!0}),i}}}function Ns(){At=XMLHttpRequest.prototype.open,It=XMLHttpRequest.prototype.send,XMLHttpRequest.prototype.open=function(e,t,...n){return this.__bs_method=e.toUpperCase(),this.__bs_url=sr(typeof t=="string"?t:t.href),At.apply(this,[e,t,...n])},XMLHttpRequest.prototype.send=function(e){let t=Date.now();return this.addEventListener("loadend",function(){pn({method:this.__bs_method??"GET",url:this.__bs_url??"",status:this.status,statusText:this.statusText,duration:Date.now()-t,responseType:this.getResponseHeader("content-type")??void 0,timestamp:t,failed:this.status>=400||this.status===0})}),It.call(this,e)}}function or(e){e&&(rr=e),Bs(),Ns()}function He(){return[...ze]}function xe(){return ze.filter(e=>e.failed)}function ir(){ze=[]}function ar(){Mt&&(window.fetch=Mt),At&&(XMLHttpRequest.prototype.open=At),It&&(XMLHttpRequest.prototype.send=It)}var Rt=[],at=null,lt=null;function lr(){at=e=>{let t={message:e.message||"Unknown error",source:e.filename,lineno:e.lineno,colno:e.colno,stack:e.error?.stack,type:"error",timestamp:Date.now()};Rt.push(t),V({type:"error",category:"exception",message:t.message,timestamp:t.timestamp,data:{source:t.source,lineno:t.lineno}})},lt=e=>{let t=e.reason,n=t instanceof Error?t.message:typeof t=="string"?t:"Unhandled promise rejection",r={message:n,stack:t instanceof Error?t.stack:void 0,type:"unhandledrejection",timestamp:Date.now()};Rt.push(r),V({type:"error",category:"promise",message:n,timestamp:r.timestamp})},window.addEventListener("error",at),window.addEventListener("unhandledrejection",lt)}function ge(){return[...Rt]}function cr(){Rt=[]}function dr(){at&&window.removeEventListener("error",at),lt&&window.removeEventListener("unhandledrejection",lt),at=null,lt=null}var R=null,zt=null,Ht=null,Dt=null;function pr(){if(R={timestamp:Date.now()},performance.getEntriesByType){let e=()=>{let[t]=performance.getEntriesByType("navigation");t&&R&&(R.pageLoadTime=Math.round(t.loadEventEnd-t.startTime),R.domContentLoaded=Math.round(t.domContentLoadedEventEnd-t.startTime));let n=performance.getEntriesByType("paint");for(let s of n)s.name==="first-paint"&&R&&(R.firstPaint=Math.round(s.startTime)),s.name==="first-contentful-paint"&&R&&(R.firstContentfulPaint=Math.round(s.startTime));R&&(R.resourceCount=performance.getEntriesByType("resource").length);let r=performance.memory;r&&R&&(R.memoryUsage={usedJSHeapSize:r.usedJSHeapSize,totalJSHeapSize:r.totalJSHeapSize})};document.readyState==="complete"?setTimeout(e,0):window.addEventListener("load",()=>setTimeout(e,100))}if(typeof PerformanceObserver<"u"){try{zt=new PerformanceObserver(e=>{let t=e.getEntries(),n=t[t.length-1];n&&R&&(R.largestContentfulPaint=Math.round(n.startTime))}),zt.observe({type:"largest-contentful-paint",buffered:!0})}catch{}try{let e=0;Ht=new PerformanceObserver(t=>{for(let n of t.getEntries())n.hadRecentInput||(e+=n.value);R&&(R.cumulativeLayoutShift=Math.round(e*1e3)/1e3)}),Ht.observe({type:"layout-shift",buffered:!0})}catch{}try{Dt=new PerformanceObserver(e=>{let[t]=e.getEntries();t&&R&&(R.firstInputDelay=Math.round(t.processingStart-t.startTime))}),Dt.observe({type:"first-input",buffered:!0})}catch{}}}function De(){return R&&(R.timestamp=Date.now()),R?{...R}:null}function br(){zt?.disconnect(),Ht?.disconnect(),Dt?.disconnect(),zt=null,Ht=null,Dt=null,R=null}function ur(e,t){if(e.match(/^[a-z]+:\/\//i))return e;if(e.match(/^\/\//))return window.location.protocol+e;if(e.match(/^[a-z]+:/i))return e;let n=document.implementation.createHTMLDocument(),r=n.createElement("base"),s=n.createElement("a");return n.head.appendChild(r),n.body.appendChild(s),t&&(r.href=t),s.href=e,s.href}var mr=(()=>{let e=0,t=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(e+=1,`u${t()}${e}`)})();function oe(e){let t=[];for(let n=0,r=e.length;n<r;n++)t.push(e[n]);return t}var Be=null;function Nt(e={}){return Be||(e.includeStyleProperties?(Be=e.includeStyleProperties,Be):(Be=oe(window.getComputedStyle(document.documentElement)),Be))}function Bt(e,t){let r=(e.ownerDocument.defaultView||window).getComputedStyle(e).getPropertyValue(t);return r?parseFloat(r.replace("px","")):0}function Os(e){let t=Bt(e,"border-left-width"),n=Bt(e,"border-right-width");return e.clientWidth+t+n}function js(e){let t=Bt(e,"border-top-width"),n=Bt(e,"border-bottom-width");return e.clientHeight+t+n}function bn(e,t={}){let n=t.width||Os(e),r=t.height||js(e);return{width:n,height:r}}function fr(){let e,t;try{t=process}catch{}let n=t&&t.env?t.env.devicePixelRatio:null;return n&&(e=parseInt(n,10),Number.isNaN(e)&&(e=1)),e||window.devicePixelRatio||1}var ee=16384;function gr(e){(e.width>ee||e.height>ee)&&(e.width>ee&&e.height>ee?e.width>e.height?(e.height*=ee/e.width,e.width=ee):(e.width*=ee/e.height,e.height=ee):e.width>ee?(e.height*=ee/e.width,e.width=ee):(e.width*=ee/e.height,e.height=ee))}function Ne(e){return new Promise((t,n)=>{let r=new Image;r.onload=()=>{r.decode().then(()=>{requestAnimationFrame(()=>t(r))})},r.onerror=n,r.crossOrigin="anonymous",r.decoding="async",r.src=e})}async function qs(e){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(e)).then(encodeURIComponent).then(t=>`data:image/svg+xml;charset=utf-8,${t}`)}async function hr(e,t,n){let r="http://www.w3.org/2000/svg",s=document.createElementNS(r,"svg"),o=document.createElementNS(r,"foreignObject");return s.setAttribute("width",`${t}`),s.setAttribute("height",`${n}`),s.setAttribute("viewBox",`0 0 ${t} ${n}`),o.setAttribute("width","100%"),o.setAttribute("height","100%"),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("externalResourcesRequired","true"),s.appendChild(o),o.appendChild(e),qs(s)}var Y=(e,t)=>{if(e instanceof t)return!0;let n=Object.getPrototypeOf(e);return n===null?!1:n.constructor.name===t.name||Y(n,t)};function Us(e){let t=e.getPropertyValue("content");return`${e.cssText} content: '${t.replace(/'|"/g,"")}';`}function _s(e,t){return Nt(t).map(n=>{let r=e.getPropertyValue(n),s=e.getPropertyPriority(n);return`${n}: ${r}${s?" !important":""};`}).join(" ")}function Fs(e,t,n,r){let s=`.${e}:${t}`,o=n.cssText?Us(n):_s(n,r);return document.createTextNode(`${s}{${o}}`)}function vr(e,t,n,r){let s=window.getComputedStyle(e,n),o=s.getPropertyValue("content");if(o===""||o==="none")return;let i=mr();try{t.className=`${t.className} ${i}`}catch{return}let a=document.createElement("style");a.appendChild(Fs(i,n,s,r)),t.appendChild(a)}function yr(e,t,n){vr(e,t,":before",n),vr(e,t,":after",n)}var xr="application/font-woff",wr="image/jpeg",Ws={woff:xr,woff2:xr,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:wr,jpeg:wr,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function Ys(e){let t=/\.([^./]*?)$/g.exec(e);return t?t[1]:""}function Oe(e){let t=Ys(e).toLowerCase();return Ws[t]||""}function Xs(e){return e.split(/,/)[1]}function ct(e){return e.search(/^(data:)/)!==-1}function mn(e,t){return`data:${t};base64,${e}`}async function fn(e,t,n){let r=await fetch(e,t);if(r.status===404)throw new Error(`Resource "${r.url}" not found`);let s=await r.blob();return new Promise((o,i)=>{let a=new FileReader;a.onerror=i,a.onloadend=()=>{try{o(n({res:r,result:a.result}))}catch(d){i(d)}},a.readAsDataURL(s)})}var un={};function Vs(e,t,n){let r=e.replace(/\?.*/,"");return n&&(r=e),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,"")),t?`[${t}]${r}`:r}async function je(e,t,n){let r=Vs(e,t,n.includeQueryParams);if(un[r]!=null)return un[r];n.cacheBust&&(e+=(/\?/.test(e)?"&":"?")+new Date().getTime());let s;try{let o=await fn(e,n.fetchRequestInit,({res:i,result:a})=>(t||(t=i.headers.get("Content-Type")||""),Xs(a)));s=mn(o,t)}catch(o){s=n.imagePlaceholder||"";let i=`Failed to fetch resource: ${e}`;o&&(i=typeof o=="string"?o:o.message),i&&console.warn(i)}return un[r]=s,s}async function Js(e){let t=e.toDataURL();return t==="data:,"?e.cloneNode(!1):Ne(t)}async function Ks(e,t){if(e.currentSrc){let o=document.createElement("canvas"),i=o.getContext("2d");o.width=e.clientWidth,o.height=e.clientHeight,i?.drawImage(e,0,0,o.width,o.height);let a=o.toDataURL();return Ne(a)}let n=e.poster,r=Oe(n),s=await je(n,r,t);return Ne(s)}async function Gs(e,t){var n;try{if(!((n=e?.contentDocument)===null||n===void 0)&&n.body)return await dt(e.contentDocument.body,t,!0)}catch{}return e.cloneNode(!1)}async function Qs(e,t){return Y(e,HTMLCanvasElement)?Js(e):Y(e,HTMLVideoElement)?Ks(e,t):Y(e,HTMLIFrameElement)?Gs(e,t):e.cloneNode(kr(e))}var Zs=e=>e.tagName!=null&&e.tagName.toUpperCase()==="SLOT",kr=e=>e.tagName!=null&&e.tagName.toUpperCase()==="SVG";async function eo(e,t,n){var r,s;if(kr(t))return t;let o=[];return Zs(e)&&e.assignedNodes?o=oe(e.assignedNodes()):Y(e,HTMLIFrameElement)&&(!((r=e.contentDocument)===null||r===void 0)&&r.body)?o=oe(e.contentDocument.body.childNodes):o=oe(((s=e.shadowRoot)!==null&&s!==void 0?s:e).childNodes),o.length===0||Y(e,HTMLVideoElement)||await o.reduce((i,a)=>i.then(()=>dt(a,n)).then(d=>{d&&t.appendChild(d)}),Promise.resolve()),t}function to(e,t,n){let r=t.style;if(!r)return;let s=window.getComputedStyle(e);s.cssText?(r.cssText=s.cssText,r.transformOrigin=s.transformOrigin):Nt(n).forEach(o=>{let i=s.getPropertyValue(o);o==="font-size"&&i.endsWith("px")&&(i=`${Math.floor(parseFloat(i.substring(0,i.length-2)))-.1}px`),Y(e,HTMLIFrameElement)&&o==="display"&&i==="inline"&&(i="block"),o==="d"&&t.getAttribute("d")&&(i=`path(${t.getAttribute("d")})`),r.setProperty(o,i,s.getPropertyPriority(o))})}function no(e,t){Y(e,HTMLTextAreaElement)&&(t.innerHTML=e.value),Y(e,HTMLInputElement)&&t.setAttribute("value",e.value)}function ro(e,t){if(Y(e,HTMLSelectElement)){let r=Array.from(t.children).find(s=>e.value===s.getAttribute("value"));r&&r.setAttribute("selected","")}}function so(e,t,n){return Y(t,Element)&&(to(e,t,n),yr(e,t,n),no(e,t),ro(e,t)),t}async function oo(e,t){let n=e.querySelectorAll?e.querySelectorAll("use"):[];if(n.length===0)return e;let r={};for(let o=0;o<n.length;o++){let a=n[o].getAttribute("xlink:href");if(a){let d=e.querySelector(a),p=document.querySelector(a);!d&&p&&!r[a]&&(r[a]=await dt(p,t,!0))}}let s=Object.values(r);if(s.length){let o="http://www.w3.org/1999/xhtml",i=document.createElementNS(o,"svg");i.setAttribute("xmlns",o),i.style.position="absolute",i.style.width="0",i.style.height="0",i.style.overflow="hidden",i.style.display="none";let a=document.createElementNS(o,"defs");i.appendChild(a);for(let d=0;d<s.length;d++)a.appendChild(s[d]);e.appendChild(i)}return e}async function dt(e,t,n){return!n&&t.filter&&!t.filter(e)?null:Promise.resolve(e).then(r=>Qs(r,t)).then(r=>eo(e,r,t)).then(r=>so(e,r,t)).then(r=>oo(r,t))}var Er=/url\((['"]?)([^'"]+?)\1\)/g,io=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,ao=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function lo(e){let t=e.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${t})(['"]?\\))`,"g")}function co(e){let t=[];return e.replace(Er,(n,r,s)=>(t.push(s),n)),t.filter(n=>!ct(n))}async function po(e,t,n,r,s){try{let o=n?ur(t,n):t,i=Oe(t),a;if(s){let d=await s(o);a=mn(d,i)}else a=await je(o,i,r);return e.replace(lo(t),`$1${a}$3`)}catch{}return e}function bo(e,{preferredFontFormat:t}){return t?e.replace(ao,n=>{for(;;){let[r,,s]=io.exec(n)||[];if(!s)return"";if(s===t)return`src: ${r};`}}):e}function gn(e){return e.search(Er)!==-1}async function Ot(e,t,n){if(!gn(e))return e;let r=bo(e,n);return co(r).reduce((o,i)=>o.then(a=>po(a,i,t,n)),Promise.resolve(r))}async function qe(e,t,n){var r;let s=(r=t.style)===null||r===void 0?void 0:r.getPropertyValue(e);if(s){let o=await Ot(s,null,n);return t.style.setProperty(e,o,t.style.getPropertyPriority(e)),!0}return!1}async function uo(e,t){await qe("background",e,t)||await qe("background-image",e,t),await qe("mask",e,t)||await qe("-webkit-mask",e,t)||await qe("mask-image",e,t)||await qe("-webkit-mask-image",e,t)}async function mo(e,t){let n=Y(e,HTMLImageElement);if(!(n&&!ct(e.src))&&!(Y(e,SVGImageElement)&&!ct(e.href.baseVal)))return;let r=n?e.src:e.href.baseVal,s=await je(r,Oe(r),t);await new Promise((o,i)=>{e.onload=o,e.onerror=t.onImageErrorHandler?(...d)=>{try{o(t.onImageErrorHandler(...d))}catch(p){i(p)}}:i;let a=e;a.decode&&(a.decode=o),a.loading==="lazy"&&(a.loading="eager"),n?(e.srcset="",e.src=s):e.href.baseVal=s})}async function fo(e,t){let r=oe(e.childNodes).map(s=>hn(s,t));await Promise.all(r).then(()=>e)}async function hn(e,t){Y(e,Element)&&(await uo(e,t),await mo(e,t),await fo(e,t))}function Sr(e,t){let{style:n}=e;t.backgroundColor&&(n.backgroundColor=t.backgroundColor),t.width&&(n.width=`${t.width}px`),t.height&&(n.height=`${t.height}px`);let r=t.style;return r!=null&&Object.keys(r).forEach(s=>{n[s]=r[s]}),e}var Lr={};async function Cr(e){let t=Lr[e];if(t!=null)return t;let r=await(await fetch(e)).text();return t={url:e,cssText:r},Lr[e]=t,t}async function Pr(e,t){let n=e.cssText,r=/url\(["']?([^"')]+)["']?\)/g,o=(n.match(/url\([^)]+\)/g)||[]).map(async i=>{let a=i.replace(r,"$1");return a.startsWith("https://")||(a=new URL(a,e.url).href),fn(a,t.fetchRequestInit,({result:d})=>(n=n.replace(i,`url(${d})`),[i,d]))});return Promise.all(o).then(()=>n)}function Tr(e){if(e==null)return[];let t=[],n=/(\/\*[\s\S]*?\*\/)/gi,r=e.replace(n,""),s=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){let d=s.exec(r);if(d===null)break;t.push(d[0])}r=r.replace(s,"");let o=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,i="((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})",a=new RegExp(i,"gi");for(;;){let d=o.exec(r);if(d===null){if(d=a.exec(r),d===null)break;o.lastIndex=a.lastIndex}else a.lastIndex=o.lastIndex;t.push(d[0])}return t}async function go(e,t){let n=[],r=[];return e.forEach(s=>{if("cssRules"in s)try{oe(s.cssRules||[]).forEach((o,i)=>{if(o.type===CSSRule.IMPORT_RULE){let a=i+1,d=o.href,p=Cr(d).then(b=>Pr(b,t)).then(b=>Tr(b).forEach(v=>{try{s.insertRule(v,v.startsWith("@import")?a+=1:s.cssRules.length)}catch(k){console.error("Error inserting rule from remote css",{rule:v,error:k})}})).catch(b=>{console.error("Error loading remote css",b.toString())});r.push(p)}})}catch(o){let i=e.find(a=>a.href==null)||document.styleSheets[0];s.href!=null&&r.push(Cr(s.href).then(a=>Pr(a,t)).then(a=>Tr(a).forEach(d=>{i.insertRule(d,i.cssRules.length)})).catch(a=>{console.error("Error loading remote stylesheet",a)})),console.error("Error inlining remote css file",o)}}),Promise.all(r).then(()=>(e.forEach(s=>{if("cssRules"in s)try{oe(s.cssRules||[]).forEach(o=>{n.push(o)})}catch(o){console.error(`Error while reading CSS rules from ${s.href}`,o)}}),n))}function ho(e){return e.filter(t=>t.type===CSSRule.FONT_FACE_RULE).filter(t=>gn(t.style.getPropertyValue("src")))}async function vo(e,t){if(e.ownerDocument==null)throw new Error("Provided element is not within a Document");let n=oe(e.ownerDocument.styleSheets),r=await go(n,t);return ho(r)}function $r(e){return e.trim().replace(/["']/g,"")}function yo(e){let t=new Set;function n(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(o=>{t.add($r(o))}),Array.from(r.children).forEach(o=>{o instanceof HTMLElement&&n(o)})}return n(e),t}async function vn(e,t){let n=await vo(e,t),r=yo(e);return(await Promise.all(n.filter(o=>r.has($r(o.style.fontFamily))).map(o=>{let i=o.parentStyleSheet?o.parentStyleSheet.href:null;return Ot(o.cssText,i,t)}))).join(`
|
|
5
|
+
`)}async function Mr(e,t){let n=t.fontEmbedCSS!=null?t.fontEmbedCSS:t.skipFonts?null:await vn(e,t);if(n){let r=document.createElement("style"),s=document.createTextNode(n);r.appendChild(s),e.firstChild?e.insertBefore(r,e.firstChild):e.appendChild(r)}}async function xo(e,t={}){let{width:n,height:r}=bn(e,t),s=await dt(e,t,!0);return await Mr(s,t),await hn(s,t),Sr(s,t),await hr(s,n,r)}async function Ar(e,t={}){let{width:n,height:r}=bn(e,t),s=await xo(e,t),o=await Ne(s),i=document.createElement("canvas"),a=i.getContext("2d"),d=t.pixelRatio||fr(),p=t.canvasWidth||n,b=t.canvasHeight||r;return i.width=p*d,i.height=b*d,t.skipAutoScale||gr(i),i.style.width=`${p}`,i.style.height=`${b}`,t.backgroundColor&&(a.fillStyle=t.backgroundColor,a.fillRect(0,0,i.width,i.height)),a.drawImage(o,0,0,i.width,i.height),i}async function Ir(e,t={}){return vn(e,t)}function wo(){let e=document.createElement("div");if(e.style.cssText=`
|
|
6
6
|
position: fixed; inset: 0; z-index: 2147483647;
|
|
7
7
|
background: white; opacity: 0;
|
|
8
8
|
pointer-events: none;
|
|
9
9
|
animation: bs-flash 0.4s ease-out forwards;
|
|
10
|
-
`,!document.getElementById("bs-flash-style")){let
|
|
10
|
+
`,!document.getElementById("bs-flash-style")){let t=document.createElement("style");t.id="bs-flash-style",t.textContent=`
|
|
11
11
|
@keyframes bs-flash {
|
|
12
12
|
0% { opacity: 0; }
|
|
13
13
|
15% { opacity: 0.7; }
|
|
14
14
|
100% { opacity: 0; }
|
|
15
15
|
}
|
|
16
|
-
`,document.head.appendChild(
|
|
16
|
+
`,document.head.appendChild(t)}document.body.appendChild(e),e.addEventListener("animationend",()=>e.remove())}var Rr=e=>{let t=e.tagName.toLowerCase();return t==="bugstash-root"||t==="bugstash-overlay"||t==="bugstash-pin"||e.classList?.contains("bs-fab")||e.classList?.contains("bs-toolbar")||e.classList?.contains("bs-modal")||e.classList?.contains("bs-backdrop")||e.id==="bs-flash-style"||e.id==="bugstash-live-pins"||e.id==="bugstash-pin-overlay"};async function jt(e=!1){e&&wo();try{let n=await ko();if(n)return n}catch{}let t=[{tier:"high",timeout:5e3},{tier:"reduced",timeout:8e3},{tier:"reduced-skip-cors",timeout:8e3}];for(let{tier:n,timeout:r}of t)try{let s=await Co(n,r);if(s)return s}catch{}return null}async function ko(){if(!navigator.mediaDevices?.getDisplayMedia)return null;let e=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser",width:{ideal:window.screen.width*(window.devicePixelRatio||1)},height:{ideal:window.screen.height*(window.devicePixelRatio||1)}},audio:!1,preferCurrentTab:!0,selfBrowserSurface:"include",monitorTypeSurfaces:"exclude"});try{if(!e.getVideoTracks()[0])return null;let n=document.createElement("video");n.srcObject=e,n.muted=!0,n.playsInline=!0,await n.play(),await new Promise(o=>{if(n.readyState>=2){o();return}n.onloadeddata=()=>o()}),await new Promise(o=>requestAnimationFrame(()=>o()));let r=document.createElement("canvas");r.width=n.videoWidth,r.height=n.videoHeight;let s=r.getContext("2d");return s?(s.drawImage(n,0,0),r.toDataURL("image/png")):null}finally{e.getTracks().forEach(t=>t.stop())}}function Eo(){let e=document.createElement("style");return e.id="bs-pause-animations",e.textContent=`
|
|
17
|
+
*, *::before, *::after {
|
|
18
|
+
animation-play-state: paused !important;
|
|
19
|
+
transition: none !important;
|
|
20
|
+
}
|
|
21
|
+
`,document.head.appendChild(e),()=>e.remove()}function So(e,t){let n=e.getContext("2d");if(!n)return;let r=window.scrollX,s=window.scrollY;document.querySelectorAll("canvas, video").forEach(i=>{if(Rr(i))return;let a=i.getBoundingClientRect(),d=(a.left+r)*t,p=(a.top+s)*t,b=a.width*t,v=a.height*t;try{n.drawImage(i,d,p,b,v)}catch{}})}function Lo(e){return new Promise((t,n)=>{setTimeout(()=>n(new Error(`Screenshot capture timed out after ${e}ms`)),e)})}async function Co(e,t){let n=e==="reduced-skip-cors",r=e==="high"?Math.min(window.devicePixelRatio||1,3):Math.min(window.devicePixelRatio||1,2),s=window.getComputedStyle(document.body).backgroundColor,o=window.getComputedStyle(document.documentElement).backgroundColor,i=b=>!b||b==="transparent"||b==="rgba(0, 0, 0, 0)",a=i(s)?i(o)?"#ffffff":o:s,d=await Ir(document.body),p=Eo();try{let b=await Promise.race([Ar(document.body,{pixelRatio:r,backgroundColor:a,width:window.innerWidth,height:window.innerHeight,cacheBust:!0,fontEmbedCSS:d,filter:v=>{if(n&&v.tagName==="IMG"){let k=v.src||"";if(k&&!k.startsWith(window.location.origin)&&!k.startsWith("data:"))return!1}return!Rr(v)},imagePlaceholder:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"}),Lo(t)]);return So(b,r),b.toDataURL("image/png")}finally{p()}}var Po="https://bugstash-backend.vercel.app",zr="https://bugstash-backend.vercel.app",X=Po,yn=!1;function Hr(e){X=e.replace(/\/$/,""),yn=!1}function Dr(){return X}async function ce(e,t){try{return await fetch(e,t)}catch(n){if(yn)throw n;yn=!0;let r=X;X=zr;let s=e.replace(r,zr);return fetch(s,t)}}var xn="bugstash_auth";function wn(){try{let e=localStorage.getItem(xn);if(!e)return null;let t=JSON.parse(e);return t.tokens.expiresAt<Date.now(),t}catch{return null}}function Br(e){localStorage.setItem(xn,JSON.stringify(e))}function To(){localStorage.removeItem(xn)}function ie(){return wn()?.user||null}function Nr(){return wn()?.tokens.accessToken||null}async function we(){let e=wn();if(!e)return{"Content-Type":"application/json"};if(e.tokens.expiresAt<Date.now()+6e4)try{let t=await ce(`${X}/api/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e.tokens.refreshToken})});if(t.ok){let n=await t.json();n.success&&(e.tokens=n.data,Br(e))}}catch{}return{"Content-Type":"application/json",Authorization:`Bearer ${e.tokens.accessToken}`}}async function Ut(e,t,n){try{let s=await(await ce(`${X}/api/auth/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,password:t,projectId:n})})).json();return s.success&&Br({user:s.data.user,tokens:s.data.tokens}),s}catch{return{success:!1,error:"Network error"}}}async function _t(){To()}async function kn(e){try{let t=await we();return await(await ce(`${X}/api/reports`,{method:"POST",headers:t,body:JSON.stringify(e)})).json()}catch{return{success:!1,error:"Network error - could not reach BugStash"}}}async function Or(e,t){try{let n=await we();return await(await ce(`${X}/api/pins/by-page?projectId=${e}&pathname=${encodeURIComponent(t)}`,{headers:n})).json()}catch{return{success:!1,error:"Network error"}}}async function En(e){try{let t=await we();return await(await ce(`${X}/api/pins`,{method:"POST",headers:t,body:JSON.stringify(e)})).json()}catch{return{success:!1,error:"Network error"}}}async function Ft(e,t){try{let n=await we();return await(await ce(`${X}/api/pins/${e}`,{method:"PUT",headers:n,body:JSON.stringify(t)})).json()}catch{return{success:!1,error:"Network error"}}}async function jr(e){try{let t=await we();return await(await ce(`${X}/api/pins/${e}`,{method:"DELETE",headers:t})).json()}catch{return{success:!1,error:"Network error"}}}async function qr(e){try{let t=await we();return await(await ce(`${X}/api/pins/${e}/comments`,{headers:t})).json()}catch{return{success:!1,error:"Network error"}}}async function Sn(e,t,n=[]){try{let r=await we();return await(await ce(`${X}/api/pins/${e}/comments`,{method:"POST",headers:r,body:JSON.stringify({body:t,mentions:n})})).json()}catch{return{success:!1,error:"Network error"}}}async function Ur(e){try{let t=await we();return await(await ce(`${X}/api/members/for-project/${e}`,{headers:t})).json()}catch{return{success:!1,error:"Network error"}}}var qt=null;function _r(e){return qt||(qt=(async()=>{try{let t=await fetch(`${X}/api/orgs/projects/${encodeURIComponent(e)}/verify-domain`,{headers:{"Content-Type":"application/json"}});return t.ok?(await t.json()).allowed===!0:!1}catch{return!1}})(),qt)}var Ln="bugstash_offline_queue";function Cn(e){let t=Fr();t.push({...e,id:Math.random().toString(36).slice(2),timestamp:Date.now()}),localStorage.setItem(Ln,JSON.stringify(t))}function Fr(){try{return JSON.parse(localStorage.getItem(Ln)||"[]")}catch{return[]}}async function $o(){let e=Fr();if(e.length===0)return 0;let t=0,n=[];for(let r of e)try{let s;switch(r.type){case"create_pin":s=await En(r.data);break;case"create_comment":s=await Sn(r.data.pinId,r.data.body,r.data.mentions);break;case"update_pin":s=await Ft(r.data.pinId,r.data.updates);break;case"submit_report":s=await kn(r.data);break;default:s={success:!1,error:"Unknown action"}}s.success?t++:n.push(r)}catch{n.push(r)}return localStorage.setItem(Ln,JSON.stringify(n)),t}typeof window<"u"&&window.addEventListener("online",()=>{$o().catch(()=>{})});var Pn=[{id:"slate",name:"Slate",preview:["#0f1117","#6E9ED0"],vars:{"--bs-bg":"#0f1117","--bs-bg2":"#1a1d27","--bs-bg3":"#2a2d37","--bs-text":"#e8eaed","--bs-muted":"#9ca3af","--bs-border":"#2a2d37","--bs-accent":"#6E9ED0","--bs-accent2":"#C3CAD6","--bs-fab1":"#6E9ED0","--bs-fab2":"#4a7ba8","--bs-radius":"12px","--bs-radius-sm":"8px","--bs-red":"#ef4444","--bs-green":"#22c55e","--bs-orange":"#f97316","--bs-yellow":"#eab308"}},{id:"black",name:"Dark",preview:["#0a0a0a","#ffffff"],vars:{"--bs-bg":"#0a0a0a","--bs-bg2":"#141414","--bs-bg3":"#1e1e1e","--bs-text":"#f5f5f5","--bs-muted":"#737373","--bs-border":"#262626","--bs-accent":"#f5f5f5","--bs-accent2":"#d4d4d4","--bs-fab1":"#262626","--bs-fab2":"#171717","--bs-radius":"12px","--bs-radius-sm":"8px","--bs-red":"#ef4444","--bs-green":"#22c55e","--bs-orange":"#f97316","--bs-yellow":"#eab308"}},{id:"white",name:"Light",preview:["#ffffff","#0a0a0a"],vars:{"--bs-bg":"#ffffff","--bs-bg2":"#f5f5f5","--bs-bg3":"#e5e5e5","--bs-text":"#0a0a0a","--bs-muted":"#737373","--bs-border":"#e5e5e5","--bs-accent":"#0a0a0a","--bs-accent2":"#404040","--bs-fab1":"#0a0a0a","--bs-fab2":"#262626","--bs-radius":"12px","--bs-radius-sm":"8px","--bs-red":"#dc2626","--bs-green":"#16a34a","--bs-orange":"#ea580c","--bs-yellow":"#ca8a04"}}];function Wt(){return Pn}function Yt(e){return Pn.find(t=>t.id===e)}function Wr(){return Pn[0]}var Tn=[{id:"classic",name:"Center",description:"Centered modal",tabPosition:"top"},{id:"drawer-right",name:"Right Drawer",description:"Slides from right",tabPosition:"top"},{id:"bottom-sheet",name:"Bottom Sheet",description:"Slides from bottom",tabPosition:"top"},{id:"sidebar-tabs",name:"Sidebar",description:"Side navigation",tabPosition:"left"}];function Xt(){return Tn}function pt(e){return Tn.find(t=>t.id===e)}function Yr(){return Tn[0]}var Xr=`
|
|
17
22
|
/* \u2500\u2500 1. Classic (default \u2014 no overrides) \u2500\u2500 */
|
|
18
23
|
|
|
19
24
|
/* \u2500\u2500 2. Drawer Right \u2500\u2500 */
|
|
@@ -73,8 +78,410 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
73
78
|
}
|
|
74
79
|
.bs-ly-sidebar-tabs .bs-tab-divider { display: none; }
|
|
75
80
|
.bs-ly-sidebar-tabs .bs-scroll { flex: 1; }
|
|
76
|
-
`;var
|
|
77
|
-
|
|
81
|
+
`;var Fe=null,Vt=0,Mo=5e3,Ue=new Map,_e=null,Jt=new Set;function We(e){_e=e,Vt=Date.now(),Ao()}function Ao(){Fe||(Fe=setInterval(Io,Mo))}async function Io(){if(!_e)return;let e=Nr();if(e)try{let t=Dr(),n=window.location.pathname,r=await fetch(`${t}/api/pins/poll?projectId=${_e}&pathname=${encodeURIComponent(n)}&since=${Vt}`,{headers:{Authorization:`Bearer ${e}`}});if(!r.ok)return;let s=await r.json();if(!s.success)return;let o=Array.isArray(s.data)?s.data:s.data?.pins||[];Vt=s.serverTime||s.data?.serverTime||Date.now();for(let i of o)Jt.has(i.id)?Vr("pin:updated",{type:"pin:updated",projectId:_e,data:i,userId:"",timestamp:Date.now()}):(Jt.add(i.id),Vr("pin:created",{type:"pin:created",projectId:_e,data:i,userId:"",timestamp:Date.now()}))}catch{}}function Jr(){Fe&&(clearInterval(Fe),Fe=null),_e=null,Jt.clear(),Vt=0}function bt(e,t){return Ue.has(e)||Ue.set(e,new Set),Ue.get(e).add(t),()=>{Ue.get(e)?.delete(t)}}function Vr(e,t){Ue.get(e)?.forEach(n=>n(t)),Ue.get("*")?.forEach(n=>n(t))}function $n(e){Jt=new Set(e)}function Kr(){return Fe!==null}var Gr=`
|
|
82
|
+
:host {
|
|
83
|
+
all: initial !important;
|
|
84
|
+
display: block !important;
|
|
85
|
+
position: absolute !important;
|
|
86
|
+
/* CSS custom properties survive all:initial \u2014 inline --bs-x/--bs-y set per pin */
|
|
87
|
+
left: var(--bs-x, 0) !important;
|
|
88
|
+
top: var(--bs-y, 0) !important;
|
|
89
|
+
pointer-events: auto !important;
|
|
90
|
+
z-index: 2147483640 !important;
|
|
91
|
+
cursor: pointer !important;
|
|
92
|
+
transform: translate(-50%, -50%) !important;
|
|
93
|
+
transition: transform 0.15s ease, box-shadow 0.15s ease;
|
|
94
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
95
|
+
line-height: 1.5;
|
|
96
|
+
-webkit-font-smoothing: antialiased;
|
|
97
|
+
-moz-osx-font-smoothing: grayscale;
|
|
98
|
+
}
|
|
99
|
+
:host(:hover) {
|
|
100
|
+
transform: translate(-50%, -50%) scale(1.1) !important;
|
|
101
|
+
z-index: 2147483645 !important;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* Color scheme support */
|
|
105
|
+
@media (prefers-color-scheme: light) {
|
|
106
|
+
:host { --bs-pin-bg: #ffffff; --bs-pin-text: #171717; --bs-pin-muted: #6b7280; --bs-pin-border: #eaeaea; --bs-pin-surface: #fafafa; --bs-pin-input-bg: #ffffff; --bs-pin-hover: #f5f5f5; --bs-pin-shadow: rgba(0,0,0,0.08); --bs-pin-shadow-lg: rgba(0,0,0,0.12); }
|
|
107
|
+
}
|
|
108
|
+
@media (prefers-color-scheme: dark) {
|
|
109
|
+
:host { --bs-pin-bg: #1a1a1a; --bs-pin-text: #ededed; --bs-pin-muted: #888; --bs-pin-border: #333; --bs-pin-surface: #222; --bs-pin-input-bg: #2a2a2a; --bs-pin-hover: #2a2a2a; --bs-pin-shadow: rgba(0,0,0,0.2); --bs-pin-shadow-lg: rgba(0,0,0,0.4); }
|
|
110
|
+
}
|
|
111
|
+
/* Fallback (default to light) */
|
|
112
|
+
:host {
|
|
113
|
+
--bs-pin-bg: #ffffff; --bs-pin-text: #171717; --bs-pin-muted: #6b7280; --bs-pin-border: #eaeaea; --bs-pin-surface: #fafafa; --bs-pin-input-bg: #ffffff; --bs-pin-hover: #f5f5f5; --bs-pin-shadow: rgba(0,0,0,0.08); --bs-pin-shadow-lg: rgba(0,0,0,0.12);
|
|
114
|
+
}
|
|
115
|
+
@media (prefers-color-scheme: dark) {
|
|
116
|
+
:host { --bs-pin-bg: #1a1a1a; --bs-pin-text: #ededed; --bs-pin-muted: #888; --bs-pin-border: #333; --bs-pin-surface: #222; --bs-pin-input-bg: #2a2a2a; --bs-pin-hover: #2a2a2a; --bs-pin-shadow: rgba(0,0,0,0.2); --bs-pin-shadow-lg: rgba(0,0,0,0.4); }
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
*, *::before, *::after {
|
|
120
|
+
box-sizing: border-box !important;
|
|
121
|
+
margin: 0;
|
|
122
|
+
padding: 0;
|
|
123
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
|
124
|
+
line-height: 1.5;
|
|
125
|
+
direction: ltr;
|
|
126
|
+
text-align: left;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* \u2500\u2500 Pin Marker (Avatar-based) \u2500\u2500 */
|
|
130
|
+
.bs-lp-dot {
|
|
131
|
+
width: 32px;
|
|
132
|
+
height: 32px;
|
|
133
|
+
border-radius: 50%;
|
|
134
|
+
display: flex;
|
|
135
|
+
align-items: center;
|
|
136
|
+
justify-content: center;
|
|
137
|
+
font-size: 12px;
|
|
138
|
+
font-weight: 600;
|
|
139
|
+
color: #fff;
|
|
140
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
141
|
+
position: relative;
|
|
142
|
+
overflow: hidden;
|
|
143
|
+
background-size: cover;
|
|
144
|
+
background-position: center;
|
|
145
|
+
}
|
|
146
|
+
.bs-lp-dot.bs-overdue {
|
|
147
|
+
box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.4), 0 0 12px rgba(239, 68, 68, 0.25);
|
|
148
|
+
}
|
|
149
|
+
.bs-lp-avatar {
|
|
150
|
+
width: 100%;
|
|
151
|
+
height: 100%;
|
|
152
|
+
border-radius: 50%;
|
|
153
|
+
object-fit: cover;
|
|
154
|
+
}
|
|
155
|
+
.bs-lp-initials {
|
|
156
|
+
width: 100%;
|
|
157
|
+
height: 100%;
|
|
158
|
+
border-radius: 50%;
|
|
159
|
+
display: flex;
|
|
160
|
+
align-items: center;
|
|
161
|
+
justify-content: center;
|
|
162
|
+
font-size: 12px;
|
|
163
|
+
font-weight: 600;
|
|
164
|
+
color: #fff;
|
|
165
|
+
}
|
|
166
|
+
.bs-lp-badge {
|
|
167
|
+
position: absolute;
|
|
168
|
+
top: -3px;
|
|
169
|
+
right: -3px;
|
|
170
|
+
min-width: 14px;
|
|
171
|
+
height: 14px;
|
|
172
|
+
border-radius: 7px;
|
|
173
|
+
background: var(--bs-pin-text, #171717);
|
|
174
|
+
color: var(--bs-pin-bg, #fff);
|
|
175
|
+
font-size: 9px;
|
|
176
|
+
font-weight: 700;
|
|
177
|
+
display: flex;
|
|
178
|
+
align-items: center;
|
|
179
|
+
justify-content: center;
|
|
180
|
+
padding: 0 3px;
|
|
181
|
+
line-height: 1;
|
|
182
|
+
z-index: 2;
|
|
183
|
+
}
|
|
184
|
+
`,Qr=`
|
|
185
|
+
/* \u2500\u2500 Popup (Clean Card) \u2500\u2500 */
|
|
186
|
+
.bs-lp-popup {
|
|
187
|
+
position: absolute;
|
|
188
|
+
left: 40px;
|
|
189
|
+
top: -8px;
|
|
190
|
+
width: min(360px, calc(100vw - 48px));
|
|
191
|
+
background: var(--bs-pin-bg);
|
|
192
|
+
border: 1px solid var(--bs-pin-border);
|
|
193
|
+
border-radius: 14px;
|
|
194
|
+
box-shadow: 0 8px 30px var(--bs-pin-shadow-lg), 0 0 0 1px var(--bs-pin-shadow);
|
|
195
|
+
backdrop-filter: blur(12px);
|
|
196
|
+
z-index: 10;
|
|
197
|
+
pointer-events: auto;
|
|
198
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
199
|
+
color: var(--bs-pin-text);
|
|
200
|
+
overflow: hidden;
|
|
201
|
+
animation: bs-lp-pop-in 0.2s ease;
|
|
202
|
+
}
|
|
203
|
+
@keyframes bs-lp-pop-in {
|
|
204
|
+
from { opacity: 0; transform: translateY(4px); }
|
|
205
|
+
to { opacity: 1; transform: translateY(0); }
|
|
206
|
+
}
|
|
207
|
+
.bs-lp-popup-hdr {
|
|
208
|
+
padding: 14px 16px 12px;
|
|
209
|
+
display: flex;
|
|
210
|
+
align-items: flex-start;
|
|
211
|
+
gap: 10px;
|
|
212
|
+
}
|
|
213
|
+
.bs-lp-popup-hdr-avatar {
|
|
214
|
+
width: 24px;
|
|
215
|
+
height: 24px;
|
|
216
|
+
border-radius: 50%;
|
|
217
|
+
flex-shrink: 0;
|
|
218
|
+
display: flex;
|
|
219
|
+
align-items: center;
|
|
220
|
+
justify-content: center;
|
|
221
|
+
font-size: 10px;
|
|
222
|
+
font-weight: 600;
|
|
223
|
+
color: #fff;
|
|
224
|
+
overflow: hidden;
|
|
225
|
+
}
|
|
226
|
+
.bs-lp-popup-hdr-avatar img { width: 100%; height: 100%; object-fit: cover; }
|
|
227
|
+
.bs-lp-popup-hdr-body { flex: 1; min-width: 0; }
|
|
228
|
+
.bs-lp-popup-title {
|
|
229
|
+
font-size: 14px;
|
|
230
|
+
font-weight: 600;
|
|
231
|
+
color: var(--bs-pin-text);
|
|
232
|
+
line-height: 1.3;
|
|
233
|
+
margin-bottom: 2px;
|
|
234
|
+
}
|
|
235
|
+
.bs-lp-popup-meta {
|
|
236
|
+
font-size: 12px;
|
|
237
|
+
color: var(--bs-pin-muted);
|
|
238
|
+
display: flex;
|
|
239
|
+
align-items: center;
|
|
240
|
+
gap: 6px;
|
|
241
|
+
flex-wrap: wrap;
|
|
242
|
+
}
|
|
243
|
+
.bs-lp-popup-pill {
|
|
244
|
+
font-size: 11px;
|
|
245
|
+
padding: 2px 8px;
|
|
246
|
+
border-radius: 99px;
|
|
247
|
+
font-weight: 500;
|
|
248
|
+
white-space: nowrap;
|
|
249
|
+
}
|
|
250
|
+
.bs-lp-popup-close {
|
|
251
|
+
all: initial;
|
|
252
|
+
color: var(--bs-pin-muted);
|
|
253
|
+
cursor: pointer;
|
|
254
|
+
padding: 2px;
|
|
255
|
+
flex-shrink: 0;
|
|
256
|
+
display: flex;
|
|
257
|
+
align-items: center;
|
|
258
|
+
justify-content: center;
|
|
259
|
+
border-radius: 6px;
|
|
260
|
+
transition: background 0.15s, color 0.15s;
|
|
261
|
+
}
|
|
262
|
+
.bs-lp-popup-close:hover { color: var(--bs-pin-text); background: var(--bs-pin-hover); }
|
|
263
|
+
.bs-lp-popup-close svg { width: 16px; height: 16px; }
|
|
264
|
+
.bs-lp-popup-desc {
|
|
265
|
+
padding: 0 16px 12px;
|
|
266
|
+
font-size: 13px;
|
|
267
|
+
line-height: 1.6;
|
|
268
|
+
color: var(--bs-pin-muted);
|
|
269
|
+
}
|
|
270
|
+
.bs-lp-popup-due {
|
|
271
|
+
padding: 6px 16px;
|
|
272
|
+
font-size: 12px;
|
|
273
|
+
font-weight: 500;
|
|
274
|
+
display: flex;
|
|
275
|
+
align-items: center;
|
|
276
|
+
gap: 4px;
|
|
277
|
+
}
|
|
278
|
+
.bs-lp-popup-due.overdue { color: #ef4444; background: rgba(239,68,68,0.06); }
|
|
279
|
+
.bs-lp-popup-due:not(.overdue) { color: var(--bs-pin-muted); }
|
|
280
|
+
.bs-lp-popup-info {
|
|
281
|
+
padding: 8px 16px;
|
|
282
|
+
font-size: 11px;
|
|
283
|
+
color: var(--bs-pin-muted);
|
|
284
|
+
background: var(--bs-pin-surface);
|
|
285
|
+
border-top: 1px solid var(--bs-pin-border);
|
|
286
|
+
display: flex;
|
|
287
|
+
justify-content: space-between;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* Comments */
|
|
291
|
+
.bs-lp-cmts {
|
|
292
|
+
max-height: 220px;
|
|
293
|
+
overflow-y: auto;
|
|
294
|
+
border-top: 1px solid var(--bs-pin-border);
|
|
295
|
+
}
|
|
296
|
+
.bs-lp-cmts::-webkit-scrollbar { width: 4px; }
|
|
297
|
+
.bs-lp-cmts::-webkit-scrollbar-thumb { background: var(--bs-pin-border); border-radius: 2px; }
|
|
298
|
+
.bs-lp-cmt {
|
|
299
|
+
padding: 10px 16px;
|
|
300
|
+
display: flex;
|
|
301
|
+
gap: 8px;
|
|
302
|
+
align-items: flex-start;
|
|
303
|
+
border-bottom: 1px solid var(--bs-pin-border);
|
|
304
|
+
}
|
|
305
|
+
.bs-lp-cmt:last-child { border-bottom: none; }
|
|
306
|
+
.bs-lp-cmt-avatar {
|
|
307
|
+
width: 20px;
|
|
308
|
+
height: 20px;
|
|
309
|
+
border-radius: 50%;
|
|
310
|
+
flex-shrink: 0;
|
|
311
|
+
display: flex;
|
|
312
|
+
align-items: center;
|
|
313
|
+
justify-content: center;
|
|
314
|
+
font-size: 8px;
|
|
315
|
+
font-weight: 600;
|
|
316
|
+
color: #fff;
|
|
317
|
+
overflow: hidden;
|
|
318
|
+
}
|
|
319
|
+
.bs-lp-cmt-avatar img { width: 100%; height: 100%; object-fit: cover; }
|
|
320
|
+
.bs-lp-cmt-content { flex: 1; min-width: 0; }
|
|
321
|
+
.bs-lp-cmt-top { display: flex; align-items: center; justify-content: space-between; margin-bottom: 2px; }
|
|
322
|
+
.bs-lp-cmt-author { font-weight: 600; color: var(--bs-pin-text); font-size: 12px; }
|
|
323
|
+
.bs-lp-cmt-time { font-size: 11px; color: var(--bs-pin-muted); }
|
|
324
|
+
.bs-lp-cmt-body { color: var(--bs-pin-text); font-size: 13px; line-height: 1.5; }
|
|
325
|
+
|
|
326
|
+
/* Comment input */
|
|
327
|
+
.bs-lp-input {
|
|
328
|
+
display: flex;
|
|
329
|
+
align-items: center;
|
|
330
|
+
border-top: 1px solid var(--bs-pin-border);
|
|
331
|
+
padding: 4px;
|
|
332
|
+
gap: 4px;
|
|
333
|
+
}
|
|
334
|
+
.bs-lp-input input {
|
|
335
|
+
all: initial;
|
|
336
|
+
flex: 1;
|
|
337
|
+
padding: 8px 12px;
|
|
338
|
+
color: var(--bs-pin-text);
|
|
339
|
+
font-size: 13px;
|
|
340
|
+
font-family: inherit;
|
|
341
|
+
background: var(--bs-pin-input-bg);
|
|
342
|
+
border: 1px solid var(--bs-pin-border);
|
|
343
|
+
border-radius: 8px;
|
|
344
|
+
box-sizing: border-box;
|
|
345
|
+
transition: border-color 0.15s;
|
|
346
|
+
}
|
|
347
|
+
.bs-lp-input input:focus { border-color: #6E9ED0; outline: none; }
|
|
348
|
+
.bs-lp-input input::placeholder { color: var(--bs-pin-muted); }
|
|
349
|
+
.bs-lp-input button {
|
|
350
|
+
all: initial;
|
|
351
|
+
width: 32px;
|
|
352
|
+
height: 32px;
|
|
353
|
+
border-radius: 8px;
|
|
354
|
+
background: #6E9ED0;
|
|
355
|
+
color: #fff;
|
|
356
|
+
cursor: pointer;
|
|
357
|
+
display: flex;
|
|
358
|
+
align-items: center;
|
|
359
|
+
justify-content: center;
|
|
360
|
+
flex-shrink: 0;
|
|
361
|
+
transition: opacity 0.15s;
|
|
362
|
+
}
|
|
363
|
+
.bs-lp-input button:hover { opacity: 0.85; }
|
|
364
|
+
.bs-lp-input button svg { width: 14px; height: 14px; }
|
|
365
|
+
|
|
366
|
+
/* Actions */
|
|
367
|
+
.bs-lp-acts {
|
|
368
|
+
padding: 8px 16px 10px;
|
|
369
|
+
display: flex;
|
|
370
|
+
gap: 8px;
|
|
371
|
+
border-top: 1px solid var(--bs-pin-border);
|
|
372
|
+
}
|
|
373
|
+
.bs-lp-act {
|
|
374
|
+
all: initial;
|
|
375
|
+
padding: 6px 14px;
|
|
376
|
+
border-radius: 8px;
|
|
377
|
+
background: var(--bs-pin-surface);
|
|
378
|
+
color: var(--bs-pin-muted);
|
|
379
|
+
font-size: 12px;
|
|
380
|
+
font-weight: 500;
|
|
381
|
+
font-family: inherit;
|
|
382
|
+
cursor: pointer;
|
|
383
|
+
transition: all 0.15s;
|
|
384
|
+
display: flex;
|
|
385
|
+
align-items: center;
|
|
386
|
+
gap: 5px;
|
|
387
|
+
}
|
|
388
|
+
.bs-lp-act:hover { background: var(--bs-pin-hover); color: var(--bs-pin-text); }
|
|
389
|
+
.bs-lp-act.resolve { color: #22c55e; }
|
|
390
|
+
.bs-lp-act.resolve:hover { background: rgba(34,197,94,0.1); }
|
|
391
|
+
.bs-lp-act.delete { color: #ef4444; }
|
|
392
|
+
.bs-lp-act.delete:hover { background: rgba(239,68,68,0.1); }
|
|
393
|
+
`,Zr=`
|
|
394
|
+
/* \u2500\u2500 New Pin Form \u2500\u2500 */
|
|
395
|
+
.bs-lp-form {
|
|
396
|
+
position: fixed;
|
|
397
|
+
width: min(320px, calc(100vw - 32px));
|
|
398
|
+
background: var(--bs-pin-bg);
|
|
399
|
+
border: 1px solid var(--bs-pin-border);
|
|
400
|
+
border-radius: 14px;
|
|
401
|
+
box-shadow: 0 8px 30px var(--bs-pin-shadow-lg);
|
|
402
|
+
backdrop-filter: blur(12px);
|
|
403
|
+
z-index: 2147483645;
|
|
404
|
+
pointer-events: auto;
|
|
405
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
406
|
+
color: var(--bs-pin-text);
|
|
407
|
+
padding: 16px;
|
|
408
|
+
animation: bs-lp-pop-in 0.2s ease;
|
|
409
|
+
}
|
|
410
|
+
.bs-lp-form-label {
|
|
411
|
+
display: block;
|
|
412
|
+
font-size: 12px;
|
|
413
|
+
color: var(--bs-pin-muted);
|
|
414
|
+
margin-bottom: 4px;
|
|
415
|
+
margin-top: 12px;
|
|
416
|
+
font-weight: 500;
|
|
417
|
+
}
|
|
418
|
+
.bs-lp-form-label:first-child { margin-top: 0; }
|
|
419
|
+
.bs-lp-form input,
|
|
420
|
+
.bs-lp-form textarea,
|
|
421
|
+
.bs-lp-form select {
|
|
422
|
+
all: initial;
|
|
423
|
+
display: block;
|
|
424
|
+
width: 100%;
|
|
425
|
+
background: var(--bs-pin-input-bg);
|
|
426
|
+
border: 1px solid var(--bs-pin-border);
|
|
427
|
+
border-radius: 10px;
|
|
428
|
+
padding: 8px 12px;
|
|
429
|
+
color: var(--bs-pin-text);
|
|
430
|
+
font-size: 13px;
|
|
431
|
+
font-family: inherit;
|
|
432
|
+
box-sizing: border-box;
|
|
433
|
+
transition: border-color 0.15s;
|
|
434
|
+
}
|
|
435
|
+
.bs-lp-form textarea { resize: vertical; min-height: 48px; white-space: pre-wrap; }
|
|
436
|
+
.bs-lp-form input:focus,
|
|
437
|
+
.bs-lp-form textarea:focus,
|
|
438
|
+
.bs-lp-form select:focus { border-color: #6E9ED0; outline: none; }
|
|
439
|
+
.bs-lp-form input::placeholder,
|
|
440
|
+
.bs-lp-form textarea::placeholder { color: var(--bs-pin-muted); }
|
|
441
|
+
/* Segmented buttons for priority/category */
|
|
442
|
+
.bs-lp-seg-row {
|
|
443
|
+
display: flex;
|
|
444
|
+
gap: 0;
|
|
445
|
+
border: 1px solid var(--bs-pin-border);
|
|
446
|
+
border-radius: 10px;
|
|
447
|
+
overflow: hidden;
|
|
448
|
+
}
|
|
449
|
+
.bs-lp-seg-btn {
|
|
450
|
+
all: initial;
|
|
451
|
+
flex: 1;
|
|
452
|
+
padding: 7px 4px;
|
|
453
|
+
text-align: center;
|
|
454
|
+
font-size: 12px;
|
|
455
|
+
font-weight: 500;
|
|
456
|
+
font-family: inherit;
|
|
457
|
+
cursor: pointer;
|
|
458
|
+
color: var(--bs-pin-muted);
|
|
459
|
+
background: var(--bs-pin-input-bg);
|
|
460
|
+
border-right: 1px solid var(--bs-pin-border);
|
|
461
|
+
transition: all 0.15s;
|
|
462
|
+
box-sizing: border-box;
|
|
463
|
+
}
|
|
464
|
+
.bs-lp-seg-btn:last-child { border-right: none; }
|
|
465
|
+
.bs-lp-seg-btn:hover { color: var(--bs-pin-text); background: var(--bs-pin-hover); }
|
|
466
|
+
.bs-lp-seg-btn.bs-active { background: #6E9ED0; color: #fff; }
|
|
467
|
+
.bs-lp-form-btns { display: flex; gap: 8px; margin-top: 14px; }
|
|
468
|
+
.bs-lp-form-btns button {
|
|
469
|
+
all: initial;
|
|
470
|
+
padding: 9px 16px;
|
|
471
|
+
border-radius: 10px;
|
|
472
|
+
font-size: 13px;
|
|
473
|
+
font-weight: 600;
|
|
474
|
+
font-family: inherit;
|
|
475
|
+
cursor: pointer;
|
|
476
|
+
text-align: center;
|
|
477
|
+
transition: opacity 0.15s;
|
|
478
|
+
}
|
|
479
|
+
.bs-lp-form-submit { background: #6E9ED0; color: #fff; flex: 1; }
|
|
480
|
+
.bs-lp-form-submit:hover { opacity: 0.85; }
|
|
481
|
+
.bs-lp-form-cancel { background: transparent; color: var(--bs-pin-muted); }
|
|
482
|
+
.bs-lp-form-cancel:hover { color: var(--bs-pin-text); }
|
|
483
|
+
`;var Zt,de=null,L=null,M=[],os=[],Ye=!1,Xe=null,Ro="",Gt=null,In=null,Ve=new Map,Kt=null,Qt={open:"#f97316",in_progress:"#3b82f6",resolved:"#22c55e",closed:"#6b7280"},es={critical:"#ef4444",high:"#f97316",medium:"#eab308",low:"#6b7280"};function Je(e,t){Zt=e,In=t,Ro=window.location.pathname,No(),ds(),Oo(),Wo(),Yo(),Ho()}function is(){Do(),cs(),de?.remove(),de=null,L?.remove(),L=null,In=null,M=[]}function Pe(e){return Ye=e!==void 0?e:!Ye,L&&L.style.setProperty("display",Ye?"block":"none","important"),Ye}function en(){return Ye}function as(e,t){let n;if(e&&e.startsWith('["')&&e.endsWith('"]'))try{let r=JSON.parse(e);n=Array.isArray(r)?r.filter(s=>typeof s=="string"):[e]}catch{n=[e]}else n=e?[e]:[];for(let r of n)if(r&&r!=="body")try{let s=document.querySelector(r);if(s)return s}catch{}if(t)try{let r=document.evaluate(t,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);if(r.singleNodeValue instanceof Element)return r.singleNodeValue}catch{}return null}function zo(e){let t=e.getBoundingClientRect();if(t.bottom<=0||t.top>=window.innerHeight||t.right<=0||t.left>=window.innerWidth)return!0;let n=e.parentElement;for(;n&&n!==document.documentElement;){let r=window.getComputedStyle(n),s=r.overflowY,o=r.overflowX;if(s==="hidden"||s==="scroll"||s==="auto"||o==="hidden"||o==="scroll"||o==="auto"){let i=n.getBoundingClientRect();if(t.bottom<=i.top||t.top>=i.bottom||t.right<=i.left||t.left>=i.right)return!0}n=n.parentElement}return!1}function Ho(){window.addEventListener("keydown",ls),Gt=new MutationObserver(e=>{for(let t of e)for(let n of t.removedNodes)if(n.nodeType===Node.ELEMENT_NODE){for(let[r,s]of Ve)if(n.contains(s)){Ve.delete(r),pe();return}}}),Gt.observe(document.body,{childList:!0,subtree:!0}),Kt=setInterval(Bo,500)}function Do(){window.removeEventListener("keydown",ls),Gt?.disconnect(),Gt=null,Kt&&(clearInterval(Kt),Kt=null)}function ls(e){e.key==="Escape"&&(Xe?ke():Ye&&(de?.querySelectorAll(".bs-lp-form").forEach(t=>t.remove()),Pe(!1)))}function Bo(){for(let[e,t]of Ve){let n=M.find(s=>s.id===e);if(!n)continue;let r=as(n.elementSelector,n.elementXPath);r&&zo(r)?t.style.display="none":t.style.display=""}}function cs(){for(let[,e]of Ve)e.remove();Ve=new Map}function No(){if(de)return;de=document.createElement("div"),de.id="bugstash-live-pins",L=document.createElement("bugstash-overlay"),L.style.setProperty("display","none","important"),L.style.setProperty("position","fixed","important"),L.style.setProperty("inset","0","important"),L.style.setProperty("z-index","2147483641","important"),L.style.setProperty("cursor","crosshair","important"),L.style.setProperty("background","rgba(0,0,0,0.05)","important"),L.style.setProperty("margin","0","important"),L.style.setProperty("padding","0","important"),L.style.setProperty("border","none","important"),L.style.setProperty("opacity","1","important"),L.style.setProperty("visibility","visible","important"),L.style.setProperty("pointer-events","auto","important"),L.style.setProperty("transform","none","important"),L.style.setProperty("filter","none","important"),L.style.setProperty("perspective","none","important"),L.style.setProperty("will-change","auto","important"),L.style.setProperty("contain","none","important"),L.style.setProperty("clip-path","none","important"),L.style.setProperty("isolation","auto","important"),L.style.setProperty("mix-blend-mode","normal","important"),L.style.setProperty("box-sizing","border-box","important"),L.style.setProperty("overflow","visible","important"),L.style.setProperty("float","none","important");let e=document.createElement("style");e.textContent=`
|
|
484
|
+
/* \u2500\u2500\u2500 Container styles for form overlay (pins are in light DOM now) \u2500\u2500\u2500 */
|
|
78
485
|
:host {
|
|
79
486
|
all: initial !important;
|
|
80
487
|
position: fixed !important;
|
|
@@ -95,13 +502,8 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
95
502
|
box-sizing: border-box !important;
|
|
96
503
|
margin: 0;
|
|
97
504
|
padding: 0;
|
|
98
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
|
|
505
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
99
506
|
line-height: 1.5;
|
|
100
|
-
direction: ltr;
|
|
101
|
-
text-align: left;
|
|
102
|
-
-webkit-text-size-adjust: 100%;
|
|
103
|
-
-webkit-font-smoothing: antialiased;
|
|
104
|
-
-moz-osx-font-smoothing: grayscale;
|
|
105
507
|
}
|
|
106
508
|
/* Color scheme support */
|
|
107
509
|
@media (prefers-color-scheme: light) {
|
|
@@ -110,7 +512,6 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
110
512
|
@media (prefers-color-scheme: dark) {
|
|
111
513
|
:host { --bs-pin-bg: #1a1a1a; --bs-pin-text: #ededed; --bs-pin-muted: #888; --bs-pin-border: #333; --bs-pin-surface: #222; --bs-pin-input-bg: #2a2a2a; --bs-pin-hover: #2a2a2a; --bs-pin-shadow: rgba(0,0,0,0.2); --bs-pin-shadow-lg: rgba(0,0,0,0.4); }
|
|
112
514
|
}
|
|
113
|
-
/* Fallback (default to light) */
|
|
114
515
|
:host {
|
|
115
516
|
--bs-pin-bg: #ffffff; --bs-pin-text: #171717; --bs-pin-muted: #6b7280; --bs-pin-border: #eaeaea; --bs-pin-surface: #fafafa; --bs-pin-input-bg: #ffffff; --bs-pin-hover: #f5f5f5; --bs-pin-shadow: rgba(0,0,0,0.08); --bs-pin-shadow-lg: rgba(0,0,0,0.12);
|
|
116
517
|
}
|
|
@@ -133,437 +534,44 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
133
534
|
contain: none !important;
|
|
134
535
|
}
|
|
135
536
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
transform: translate(-50%, -50%) !important;
|
|
142
|
-
z-index: 1;
|
|
143
|
-
transition: transform 0.15s ease, box-shadow 0.15s ease;
|
|
144
|
-
}
|
|
145
|
-
.bs-lp:hover { transform: translate(-50%, -50%) scale(1.1) !important; z-index: 5; }
|
|
146
|
-
.bs-lp-dot {
|
|
147
|
-
width: 32px;
|
|
148
|
-
height: 32px;
|
|
149
|
-
border-radius: 50%;
|
|
150
|
-
display: flex;
|
|
151
|
-
align-items: center;
|
|
152
|
-
justify-content: center;
|
|
153
|
-
font-size: 12px;
|
|
154
|
-
font-weight: 600;
|
|
155
|
-
font-family: -apple-system, system-ui, sans-serif;
|
|
156
|
-
color: #fff;
|
|
157
|
-
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
158
|
-
position: relative;
|
|
159
|
-
overflow: hidden;
|
|
160
|
-
background-size: cover;
|
|
161
|
-
background-position: center;
|
|
162
|
-
}
|
|
163
|
-
.bs-lp-avatar {
|
|
164
|
-
width: 100%;
|
|
165
|
-
height: 100%;
|
|
166
|
-
border-radius: 50%;
|
|
167
|
-
object-fit: cover;
|
|
168
|
-
}
|
|
169
|
-
.bs-lp-initials {
|
|
170
|
-
width: 100%;
|
|
171
|
-
height: 100%;
|
|
172
|
-
border-radius: 50%;
|
|
173
|
-
display: flex;
|
|
174
|
-
align-items: center;
|
|
175
|
-
justify-content: center;
|
|
176
|
-
font-size: 12px;
|
|
177
|
-
font-weight: 600;
|
|
178
|
-
color: #fff;
|
|
179
|
-
}
|
|
180
|
-
.bs-lp-badge {
|
|
181
|
-
position: absolute;
|
|
182
|
-
top: -3px;
|
|
183
|
-
right: -3px;
|
|
184
|
-
min-width: 14px;
|
|
185
|
-
height: 14px;
|
|
186
|
-
border-radius: 7px;
|
|
187
|
-
background: var(--bs-pin-text, #171717);
|
|
188
|
-
color: var(--bs-pin-bg, #fff);
|
|
189
|
-
font-size: 9px;
|
|
190
|
-
font-weight: 700;
|
|
191
|
-
display: flex;
|
|
192
|
-
align-items: center;
|
|
193
|
-
justify-content: center;
|
|
194
|
-
padding: 0 3px;
|
|
195
|
-
line-height: 1;
|
|
196
|
-
z-index: 2;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/* \u2500\u2500 Popup (Clean Card) \u2500\u2500 */
|
|
200
|
-
.bs-lp-popup {
|
|
201
|
-
position: absolute;
|
|
202
|
-
left: 40px;
|
|
203
|
-
top: -8px;
|
|
204
|
-
width: min(360px, calc(100vw - 48px));
|
|
205
|
-
background: var(--bs-pin-bg);
|
|
206
|
-
border: 1px solid var(--bs-pin-border);
|
|
207
|
-
border-radius: 14px;
|
|
208
|
-
box-shadow: 0 8px 30px var(--bs-pin-shadow-lg), 0 0 0 1px var(--bs-pin-shadow);
|
|
209
|
-
backdrop-filter: blur(12px);
|
|
210
|
-
z-index: 10;
|
|
211
|
-
pointer-events: auto;
|
|
212
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
213
|
-
color: var(--bs-pin-text);
|
|
214
|
-
overflow: hidden;
|
|
215
|
-
animation: bs-lp-pop-in 0.2s ease;
|
|
216
|
-
}
|
|
217
|
-
@keyframes bs-lp-pop-in {
|
|
218
|
-
from { opacity: 0; transform: translateY(4px); }
|
|
219
|
-
to { opacity: 1; transform: translateY(0); }
|
|
220
|
-
}
|
|
221
|
-
.bs-lp-popup-hdr {
|
|
222
|
-
padding: 14px 16px 12px;
|
|
223
|
-
display: flex;
|
|
224
|
-
align-items: flex-start;
|
|
225
|
-
gap: 10px;
|
|
226
|
-
}
|
|
227
|
-
.bs-lp-popup-hdr-avatar {
|
|
228
|
-
width: 24px;
|
|
229
|
-
height: 24px;
|
|
230
|
-
border-radius: 50%;
|
|
231
|
-
flex-shrink: 0;
|
|
232
|
-
display: flex;
|
|
233
|
-
align-items: center;
|
|
234
|
-
justify-content: center;
|
|
235
|
-
font-size: 10px;
|
|
236
|
-
font-weight: 600;
|
|
237
|
-
color: #fff;
|
|
238
|
-
overflow: hidden;
|
|
239
|
-
}
|
|
240
|
-
.bs-lp-popup-hdr-avatar img {
|
|
241
|
-
width: 100%;
|
|
242
|
-
height: 100%;
|
|
243
|
-
object-fit: cover;
|
|
244
|
-
}
|
|
245
|
-
.bs-lp-popup-hdr-body {
|
|
246
|
-
flex: 1;
|
|
247
|
-
min-width: 0;
|
|
248
|
-
}
|
|
249
|
-
.bs-lp-popup-title {
|
|
250
|
-
font-size: 14px;
|
|
251
|
-
font-weight: 600;
|
|
252
|
-
color: var(--bs-pin-text);
|
|
253
|
-
line-height: 1.3;
|
|
254
|
-
margin-bottom: 2px;
|
|
255
|
-
}
|
|
256
|
-
.bs-lp-popup-meta {
|
|
257
|
-
font-size: 12px;
|
|
258
|
-
color: var(--bs-pin-muted);
|
|
259
|
-
display: flex;
|
|
260
|
-
align-items: center;
|
|
261
|
-
gap: 6px;
|
|
262
|
-
flex-wrap: wrap;
|
|
263
|
-
}
|
|
264
|
-
.bs-lp-popup-pill {
|
|
265
|
-
font-size: 11px;
|
|
266
|
-
padding: 2px 8px;
|
|
267
|
-
border-radius: 99px;
|
|
268
|
-
font-weight: 500;
|
|
269
|
-
white-space: nowrap;
|
|
270
|
-
}
|
|
271
|
-
.bs-lp-popup-close {
|
|
272
|
-
all: initial;
|
|
273
|
-
color: var(--bs-pin-muted);
|
|
274
|
-
cursor: pointer;
|
|
275
|
-
padding: 2px;
|
|
276
|
-
flex-shrink: 0;
|
|
277
|
-
display: flex;
|
|
278
|
-
align-items: center;
|
|
279
|
-
justify-content: center;
|
|
280
|
-
border-radius: 6px;
|
|
281
|
-
transition: background 0.15s, color 0.15s;
|
|
282
|
-
}
|
|
283
|
-
.bs-lp-popup-close:hover { color: var(--bs-pin-text); background: var(--bs-pin-hover); }
|
|
284
|
-
.bs-lp-popup-close svg { width: 16px; height: 16px; }
|
|
285
|
-
.bs-lp-popup-desc {
|
|
286
|
-
padding: 0 16px 12px;
|
|
287
|
-
font-size: 13px;
|
|
288
|
-
line-height: 1.6;
|
|
289
|
-
color: var(--bs-pin-muted);
|
|
290
|
-
}
|
|
291
|
-
.bs-lp-popup-info {
|
|
292
|
-
padding: 8px 16px;
|
|
293
|
-
font-size: 11px;
|
|
294
|
-
color: var(--bs-pin-muted);
|
|
295
|
-
background: var(--bs-pin-surface);
|
|
296
|
-
border-top: 1px solid var(--bs-pin-border);
|
|
297
|
-
display: flex;
|
|
298
|
-
justify-content: space-between;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/* Comments */
|
|
302
|
-
.bs-lp-cmts {
|
|
303
|
-
max-height: 220px;
|
|
304
|
-
overflow-y: auto;
|
|
305
|
-
border-top: 1px solid var(--bs-pin-border);
|
|
306
|
-
}
|
|
307
|
-
.bs-lp-cmts::-webkit-scrollbar { width: 4px; }
|
|
308
|
-
.bs-lp-cmts::-webkit-scrollbar-thumb { background: var(--bs-pin-border); border-radius: 2px; }
|
|
309
|
-
.bs-lp-cmt {
|
|
310
|
-
padding: 10px 16px;
|
|
311
|
-
display: flex;
|
|
312
|
-
gap: 8px;
|
|
313
|
-
align-items: flex-start;
|
|
314
|
-
border-bottom: 1px solid var(--bs-pin-border);
|
|
315
|
-
}
|
|
316
|
-
.bs-lp-cmt:last-child { border-bottom: none; }
|
|
317
|
-
.bs-lp-cmt-avatar {
|
|
318
|
-
width: 20px;
|
|
319
|
-
height: 20px;
|
|
320
|
-
border-radius: 50%;
|
|
321
|
-
flex-shrink: 0;
|
|
322
|
-
display: flex;
|
|
323
|
-
align-items: center;
|
|
324
|
-
justify-content: center;
|
|
325
|
-
font-size: 8px;
|
|
326
|
-
font-weight: 600;
|
|
327
|
-
color: #fff;
|
|
328
|
-
overflow: hidden;
|
|
329
|
-
}
|
|
330
|
-
.bs-lp-cmt-avatar img { width: 100%; height: 100%; object-fit: cover; }
|
|
331
|
-
.bs-lp-cmt-content { flex: 1; min-width: 0; }
|
|
332
|
-
.bs-lp-cmt-top {
|
|
333
|
-
display: flex;
|
|
334
|
-
align-items: center;
|
|
335
|
-
justify-content: space-between;
|
|
336
|
-
margin-bottom: 2px;
|
|
337
|
-
}
|
|
338
|
-
.bs-lp-cmt-author {
|
|
339
|
-
font-weight: 600;
|
|
340
|
-
color: var(--bs-pin-text);
|
|
341
|
-
font-size: 12px;
|
|
342
|
-
}
|
|
343
|
-
.bs-lp-cmt-time {
|
|
344
|
-
font-size: 11px;
|
|
345
|
-
color: var(--bs-pin-muted);
|
|
346
|
-
}
|
|
347
|
-
.bs-lp-cmt-body {
|
|
348
|
-
color: var(--bs-pin-text);
|
|
349
|
-
font-size: 13px;
|
|
350
|
-
line-height: 1.5;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
/* Comment input */
|
|
354
|
-
.bs-lp-input {
|
|
355
|
-
display: flex;
|
|
356
|
-
align-items: center;
|
|
357
|
-
border-top: 1px solid var(--bs-pin-border);
|
|
358
|
-
padding: 4px;
|
|
359
|
-
gap: 4px;
|
|
360
|
-
}
|
|
361
|
-
.bs-lp-input input {
|
|
362
|
-
all: initial;
|
|
363
|
-
flex: 1;
|
|
364
|
-
padding: 8px 12px;
|
|
365
|
-
color: var(--bs-pin-text);
|
|
366
|
-
font-size: 13px;
|
|
367
|
-
font-family: inherit;
|
|
368
|
-
background: var(--bs-pin-input-bg);
|
|
369
|
-
border: 1px solid var(--bs-pin-border);
|
|
370
|
-
border-radius: 8px;
|
|
371
|
-
box-sizing: border-box;
|
|
372
|
-
transition: border-color 0.15s;
|
|
373
|
-
}
|
|
374
|
-
.bs-lp-input input:focus { border-color: #6E9ED0; outline: none; }
|
|
375
|
-
.bs-lp-input input::placeholder { color: var(--bs-pin-muted); }
|
|
376
|
-
.bs-lp-input button {
|
|
377
|
-
all: initial;
|
|
378
|
-
width: 32px;
|
|
379
|
-
height: 32px;
|
|
380
|
-
border-radius: 8px;
|
|
381
|
-
background: #6E9ED0;
|
|
382
|
-
color: #fff;
|
|
383
|
-
cursor: pointer;
|
|
384
|
-
display: flex;
|
|
385
|
-
align-items: center;
|
|
386
|
-
justify-content: center;
|
|
387
|
-
flex-shrink: 0;
|
|
388
|
-
transition: opacity 0.15s;
|
|
389
|
-
}
|
|
390
|
-
.bs-lp-input button:hover { opacity: 0.85; }
|
|
391
|
-
.bs-lp-input button svg { width: 14px; height: 14px; }
|
|
392
|
-
|
|
393
|
-
/* Actions */
|
|
394
|
-
.bs-lp-acts {
|
|
395
|
-
padding: 8px 16px 10px;
|
|
396
|
-
display: flex;
|
|
397
|
-
gap: 8px;
|
|
398
|
-
border-top: 1px solid var(--bs-pin-border);
|
|
399
|
-
}
|
|
400
|
-
.bs-lp-act {
|
|
401
|
-
all: initial;
|
|
402
|
-
padding: 6px 14px;
|
|
403
|
-
border-radius: 8px;
|
|
404
|
-
background: var(--bs-pin-surface);
|
|
405
|
-
color: var(--bs-pin-muted);
|
|
406
|
-
font-size: 12px;
|
|
407
|
-
font-weight: 500;
|
|
408
|
-
font-family: inherit;
|
|
409
|
-
cursor: pointer;
|
|
410
|
-
transition: all 0.15s;
|
|
411
|
-
display: flex;
|
|
412
|
-
align-items: center;
|
|
413
|
-
gap: 5px;
|
|
414
|
-
}
|
|
415
|
-
.bs-lp-act:hover { background: var(--bs-pin-hover); color: var(--bs-pin-text); }
|
|
416
|
-
.bs-lp-act.resolve { color: #22c55e; }
|
|
417
|
-
.bs-lp-act.resolve:hover { background: rgba(34,197,94,0.1); }
|
|
418
|
-
.bs-lp-act.delete { color: #ef4444; }
|
|
419
|
-
.bs-lp-act.delete:hover { background: rgba(239,68,68,0.1); }
|
|
420
|
-
|
|
421
|
-
/* \u2500\u2500 New Pin Form \u2500\u2500 */
|
|
422
|
-
.bs-lp-form {
|
|
423
|
-
position: fixed;
|
|
424
|
-
width: min(320px, calc(100vw - 32px));
|
|
425
|
-
background: var(--bs-pin-bg);
|
|
426
|
-
border: 1px solid var(--bs-pin-border);
|
|
427
|
-
border-radius: 14px;
|
|
428
|
-
box-shadow: 0 8px 30px var(--bs-pin-shadow-lg);
|
|
429
|
-
backdrop-filter: blur(12px);
|
|
430
|
-
z-index: 2147483645;
|
|
431
|
-
pointer-events: auto;
|
|
432
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
433
|
-
color: var(--bs-pin-text);
|
|
434
|
-
padding: 16px;
|
|
435
|
-
animation: bs-lp-pop-in 0.2s ease;
|
|
436
|
-
}
|
|
437
|
-
.bs-lp-form-label {
|
|
438
|
-
display: block;
|
|
439
|
-
font-size: 12px;
|
|
440
|
-
color: var(--bs-pin-muted);
|
|
441
|
-
margin-bottom: 4px;
|
|
442
|
-
margin-top: 12px;
|
|
443
|
-
font-weight: 500;
|
|
444
|
-
}
|
|
445
|
-
.bs-lp-form-label:first-child { margin-top: 0; }
|
|
446
|
-
.bs-lp-form input,
|
|
447
|
-
.bs-lp-form textarea,
|
|
448
|
-
.bs-lp-form select {
|
|
449
|
-
all: initial;
|
|
450
|
-
display: block;
|
|
451
|
-
width: 100%;
|
|
452
|
-
background: var(--bs-pin-input-bg);
|
|
453
|
-
border: 1px solid var(--bs-pin-border);
|
|
454
|
-
border-radius: 10px;
|
|
455
|
-
padding: 8px 12px;
|
|
456
|
-
color: var(--bs-pin-text);
|
|
457
|
-
font-size: 13px;
|
|
458
|
-
font-family: inherit;
|
|
459
|
-
box-sizing: border-box;
|
|
460
|
-
transition: border-color 0.15s;
|
|
461
|
-
}
|
|
462
|
-
.bs-lp-form textarea {
|
|
463
|
-
resize: vertical;
|
|
464
|
-
min-height: 48px;
|
|
465
|
-
white-space: pre-wrap;
|
|
466
|
-
}
|
|
467
|
-
.bs-lp-form input:focus,
|
|
468
|
-
.bs-lp-form textarea:focus,
|
|
469
|
-
.bs-lp-form select:focus {
|
|
470
|
-
border-color: #6E9ED0;
|
|
471
|
-
outline: none;
|
|
472
|
-
}
|
|
473
|
-
.bs-lp-form input::placeholder,
|
|
474
|
-
.bs-lp-form textarea::placeholder { color: var(--bs-pin-muted); }
|
|
475
|
-
/* Segmented buttons for priority/category */
|
|
476
|
-
.bs-lp-seg-row {
|
|
477
|
-
display: flex;
|
|
478
|
-
gap: 0;
|
|
479
|
-
border: 1px solid var(--bs-pin-border);
|
|
480
|
-
border-radius: 10px;
|
|
481
|
-
overflow: hidden;
|
|
482
|
-
}
|
|
483
|
-
.bs-lp-seg-btn {
|
|
484
|
-
all: initial;
|
|
485
|
-
flex: 1;
|
|
486
|
-
padding: 7px 4px;
|
|
487
|
-
text-align: center;
|
|
488
|
-
font-size: 12px;
|
|
489
|
-
font-weight: 500;
|
|
490
|
-
font-family: inherit;
|
|
491
|
-
cursor: pointer;
|
|
492
|
-
color: var(--bs-pin-muted);
|
|
493
|
-
background: var(--bs-pin-input-bg);
|
|
494
|
-
border-right: 1px solid var(--bs-pin-border);
|
|
495
|
-
transition: all 0.15s;
|
|
496
|
-
box-sizing: border-box;
|
|
497
|
-
}
|
|
498
|
-
.bs-lp-seg-btn:last-child { border-right: none; }
|
|
499
|
-
.bs-lp-seg-btn:hover { color: var(--bs-pin-text); background: var(--bs-pin-hover); }
|
|
500
|
-
.bs-lp-seg-btn.bs-active {
|
|
501
|
-
background: #6E9ED0;
|
|
502
|
-
color: #fff;
|
|
503
|
-
}
|
|
504
|
-
.bs-lp-form-btns {
|
|
505
|
-
display: flex;
|
|
506
|
-
gap: 8px;
|
|
507
|
-
margin-top: 14px;
|
|
508
|
-
}
|
|
509
|
-
.bs-lp-form-btns button {
|
|
510
|
-
all: initial;
|
|
511
|
-
padding: 9px 16px;
|
|
512
|
-
border-radius: 10px;
|
|
513
|
-
font-size: 13px;
|
|
514
|
-
font-weight: 600;
|
|
515
|
-
font-family: inherit;
|
|
516
|
-
cursor: pointer;
|
|
517
|
-
text-align: center;
|
|
518
|
-
transition: opacity 0.15s;
|
|
519
|
-
}
|
|
520
|
-
.bs-lp-form-submit {
|
|
521
|
-
background: #6E9ED0;
|
|
522
|
-
color: #fff;
|
|
523
|
-
flex: 1;
|
|
524
|
-
}
|
|
525
|
-
.bs-lp-form-submit:hover { opacity: 0.85; }
|
|
526
|
-
.bs-lp-form-cancel {
|
|
527
|
-
background: transparent;
|
|
528
|
-
color: var(--bs-pin-muted);
|
|
529
|
-
}
|
|
530
|
-
.bs-lp-form-cancel:hover { color: var(--bs-pin-text); }
|
|
531
|
-
`,Y.appendChild(t),me.appendChild(Y),document.body.appendChild(L),L.addEventListener("click",e=>{let n=e.clientX,r=e.clientY,s=null;try{L.style.setProperty("pointer-events","none","important"),s=document.elementFromPoint(n,r)}finally{L.style.setProperty("pointer-events","auto","important")}let o=n+window.scrollX,i=r+window.scrollY,a,c;if(s&&s!==document.body&&s!==document.documentElement){let p=s.getBoundingClientRect();if(p.width>0&&p.height>0)a=(n-p.left)/p.width,c=(r-p.top)/p.height;else{let b=document.documentElement.scrollWidth||document.body.scrollWidth||1,v=document.documentElement.scrollHeight||document.body.scrollHeight||1;a=o/b*100,c=i/v*100}}else{let p=document.documentElement.scrollWidth||document.body.scrollWidth||1,b=document.documentElement.scrollHeight||document.body.scrollHeight||1;a=o/p*100,c=i/b*100}Wo(o,i,a,c,n,r,s)})}async function ds(){let t=await Nr(en,window.location.pathname);t.success&&t.data&&($=t.data,$n($.map(e=>e.id)),gt())}async function jo(){let t=await Ur(en);t.success&&t.data&&(rs=t.data)}function gt(){if(Y){Y.querySelectorAll(".bs-lp").forEach(t=>t.remove()),$.forEach(t=>{let e=document.createElement("div");e.className="bs-lp",e.dataset.pinId=t.id;let n=os(as(t));e.style.left=n.left,e.style.top=n.top,n.hidden&&(e.style.display="none");let r=tn[t.status]||tn.open,s=In(t.creatorName||"U"),o=Hn(t.creatorName||"U"),i=t.creatorAvatar?`<img class="bs-lp-avatar" src="${mt(t.creatorAvatar)}" alt="" />`:`<div class="bs-lp-initials" style="background:${o}">${s}</div>`,a=t.commentCount>0?`<span class="bs-lp-badge">${t.commentCount>99?"99+":t.commentCount}</span>`:"";e.innerHTML=`
|
|
532
|
-
<div class="bs-lp-dot" style="border:2px solid ${r}; background:transparent;">
|
|
533
|
-
${i}
|
|
534
|
-
${a}
|
|
537
|
+
${Zr}
|
|
538
|
+
`,de.appendChild(e),In.appendChild(de),document.body.appendChild(L),L.addEventListener("click",t=>{let n=t.clientX,r=t.clientY,s=null;try{L.style.setProperty("pointer-events","none","important"),s=document.elementFromPoint(n,r)}finally{L.style.setProperty("pointer-events","auto","important")}let o=n+window.scrollX,i=r+window.scrollY,a,d;if(s&&s!==document.body&&s!==document.documentElement){let p=s.getBoundingClientRect();if(p.width>0&&p.height>0)a=(n-p.left)/p.width,d=(r-p.top)/p.height;else{let b=document.documentElement.scrollWidth||document.body.scrollWidth||1,v=document.documentElement.scrollHeight||document.body.scrollHeight||1;a=o/b*100,d=i/v*100}}else{let p=document.documentElement.scrollWidth||document.body.scrollWidth||1,b=document.documentElement.scrollHeight||document.body.scrollHeight||1;a=o/p*100,d=i/b*100}Fo(o,i,a,d,n,r,s)})}async function ds(){let e=await Or(Zt,window.location.pathname);e.success&&e.data&&(M=e.data,$n(M.map(t=>t.id)),pe())}async function Oo(){let e=await Ur(Zt);e.success&&e.data&&(os=e.data)}function pe(){cs(),M.forEach(e=>{let t=e.xPercent>=0&&e.xPercent<=1&&e.yPercent>=0&&e.yPercent<=1,n=as(e.elementSelector,e.elementXPath),r=document.createElement("bugstash-pin");r.dataset.pinId=e.id,t&&n?(window.getComputedStyle(n).position==="static"&&(n.style.position="relative"),r.style.setProperty("--bs-x",`${e.xPercent*100}%`),r.style.setProperty("--bs-y",`${e.yPercent*100}%`),n.appendChild(r)):(r.style.setProperty("--bs-x",`${e.pageX}px`),r.style.setProperty("--bs-y",`${e.pageY}px`),document.body.appendChild(r));let s=r.attachShadow({mode:"open"}),o=document.createElement("style");o.textContent=Gr+Qr,s.appendChild(o);let i=Qt[e.status]||Qt.open,a=Rn(e.creatorName||"U"),d=Hn(e.creatorName||"U"),p=zn(e.creatorAvatar)?`<img class="bs-lp-avatar" src="${he(e.creatorAvatar)}" alt="" />`:`<div class="bs-lp-initials" style="background:${d}">${a}</div>`,b=e.commentCount>0?`<span class="bs-lp-badge">${e.commentCount>99?"99+":e.commentCount}</span>`:"",v=e.dueDate&&e.dueDate<Date.now()&&e.status!=="resolved"&&e.status!=="closed",k=document.createElement("div");k.className="bs-lp-marker",k.innerHTML=`
|
|
539
|
+
<div class="bs-lp-dot${v?" bs-overdue":""}" style="border:2px solid ${i}; background:transparent;">
|
|
540
|
+
${p}
|
|
541
|
+
${b}
|
|
535
542
|
</div>
|
|
536
|
-
`,
|
|
543
|
+
`,s.appendChild(k),k.addEventListener("click",S=>{S.stopPropagation(),jo(e,r)}),Ve.set(e.id,r)})}function ps(e){let t=typeof e=="string"?new Date(e).getTime():e;if(isNaN(t))return"";let n=Date.now()-t,r=Math.floor(n/6e4);if(r<1)return"just now";if(r<60)return`${r}m ago`;let s=Math.floor(r/60);return s<24?`${s}h ago`:`${Math.floor(s/24)}d ago`}function ts(e){requestAnimationFrame(()=>{let t=e.getBoundingClientRect(),n=16,r=0,s=0;if(t.right>window.innerWidth-n&&(r=window.innerWidth-n-t.right),t.left+r<n&&(r=n-t.left),t.bottom>window.innerHeight-n&&(s=window.innerHeight-n-t.bottom),t.top+s<n&&(s=n-t.top),r!==0||s!==0){let o=parseFloat(e.style.left)||0,i=parseFloat(e.style.top)||0;e.style.left=`${o+r}px`,e.style.top=`${i+s}px`,e.style.right="auto",e.style.bottom="auto"}})}async function jo(e,t){ke();let n=document.createElement("div");n.className="bs-lp-popup";let r=ie(),s=e.createdBy||e.createdById,o=r&&(r.role==="owner"||r.role==="admin"||r.id===s),i=Qt[e.status]||Qt.open,a=es[e.priority]||es.medium,d=e.priority?e.priority.charAt(0).toUpperCase()+e.priority.slice(1):"Medium",p=Rn(e.creatorName||"U"),b=Hn(e.creatorName||"U"),v=zn(e.creatorAvatar)?`<img src="${he(e.creatorAvatar)}" alt="" style="width:100%;height:100%;object-fit:cover;border-radius:50%;" />`:`<span>${p}</span>`,k=e.status.replace("_"," "),S='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg>',ue='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',ye=e.dueDate&&e.dueDate<Date.now()&&e.status!=="resolved"&&e.status!=="closed",N=e.dueDate?`<div class="bs-lp-popup-due${ye?" overdue":""}">${ye?"OVERDUE: ":"Due: "}${new Date(e.dueDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}</div>`:"";n.innerHTML=`
|
|
537
544
|
<div class="bs-lp-popup-hdr">
|
|
538
545
|
<div class="bs-lp-popup-hdr-avatar" style="background:${b}">
|
|
539
546
|
${v}
|
|
540
547
|
</div>
|
|
541
548
|
<div class="bs-lp-popup-hdr-body">
|
|
542
|
-
<div class="bs-lp-popup-title">${
|
|
549
|
+
<div class="bs-lp-popup-title">${he(e.title)}</div>
|
|
543
550
|
<div class="bs-lp-popup-meta">
|
|
544
|
-
<span>${
|
|
551
|
+
<span>${e.creatorName||"Unknown"}</span>
|
|
545
552
|
<span>·</span>
|
|
546
|
-
<span>${ps(
|
|
547
|
-
<span class="bs-lp-popup-pill" style="background:${i}18;color:${i}">${
|
|
548
|
-
<span class="bs-lp-popup-pill" style="background:${a}18;color:${a}">${
|
|
553
|
+
<span>${ps(e.createdAt)}</span>
|
|
554
|
+
<span class="bs-lp-popup-pill" style="background:${i}18;color:${i}">${k}</span>
|
|
555
|
+
<span class="bs-lp-popup-pill" style="background:${a}18;color:${a}">${d}</span>
|
|
549
556
|
</div>
|
|
550
557
|
</div>
|
|
551
|
-
<button class="bs-lp-popup-close">${
|
|
558
|
+
<button class="bs-lp-popup-close">${ue}</button>
|
|
552
559
|
</div>
|
|
553
|
-
${
|
|
554
|
-
${
|
|
560
|
+
${e.description?`<div class="bs-lp-popup-desc">${he(e.description)}</div>`:""}
|
|
561
|
+
${N}
|
|
562
|
+
${e.assigneeName?`<div class="bs-lp-popup-info"><span>Assigned to ${he(e.assigneeName)}</span></div>`:""}
|
|
555
563
|
<div class="bs-lp-cmts" id="bs-lp-cmts">
|
|
556
564
|
<div style="text-align:center;color:var(--bs-pin-muted);padding:12px;font-size:12px">Loading comments...</div>
|
|
557
565
|
</div>
|
|
558
566
|
<div class="bs-lp-input">
|
|
559
567
|
<input type="text" placeholder="Write a comment..." id="bs-lp-cmt-in" name="pin-comment" />
|
|
560
|
-
<button id="bs-lp-cmt-send">${
|
|
568
|
+
<button id="bs-lp-cmt-send">${S}</button>
|
|
561
569
|
</div>
|
|
562
570
|
<div class="bs-lp-acts">
|
|
563
|
-
${
|
|
571
|
+
${e.status!=="resolved"?'<button class="bs-lp-act resolve" id="bs-lp-resolve">✓ Resolve</button>':'<button class="bs-lp-act" id="bs-lp-reopen">↺ Reopen</button>'}
|
|
564
572
|
${o?'<button class="bs-lp-act delete" id="bs-lp-delete">✕ Delete</button>':""}
|
|
565
573
|
</div>
|
|
566
|
-
`,
|
|
574
|
+
`,t.shadowRoot.appendChild(n),Xe=n,qr(e.id).then(E=>{let D=n.querySelector("#bs-lp-cmts");if(!D)return;let z=E.success&&E.data?E.data:[];D.innerHTML=z.length?z.map(Z=>An(Z)).join(""):"",ts(n)}),ts(n),n.querySelector(".bs-lp-popup-close").addEventListener("click",E=>{E.stopPropagation(),ke()}),n.querySelector("#bs-lp-cmt-send")?.addEventListener("click",async()=>{let E=n.querySelector("#bs-lp-cmt-in"),D=E.value.trim();if(D)if(E.value="",navigator.onLine){let z=await Sn(e.id,D);if(z.success&&z.data){let Z=n.querySelector("#bs-lp-cmts");Z.innerHTML+=An(z.data),Z.scrollTop=Z.scrollHeight}}else Cn({type:"create_comment",data:{pinId:e.id,body:D}})}),n.querySelector("#bs-lp-cmt-in")?.addEventListener("keydown",E=>{E.key==="Enter"&&n.querySelector("#bs-lp-cmt-send")?.dispatchEvent(new Event("click"))}),n.querySelector("#bs-lp-resolve")?.addEventListener("click",async()=>{await Ft(e.id,{status:"resolved"});let E=M.findIndex(D=>D.id===e.id);E>=0&&(M=M.map((D,z)=>z===E?{...D,status:"resolved"}:D)),ke(),pe()}),n.querySelector("#bs-lp-reopen")?.addEventListener("click",async()=>{await Ft(e.id,{status:"open"});let E=M.findIndex(D=>D.id===e.id);E>=0&&(M=M.map((D,z)=>z===E?{...D,status:"open"}:D)),ke(),pe()});let H=!1;n.querySelector("#bs-lp-delete")?.addEventListener("click",async()=>{H||confirm("Delete this pin?")&&(H=!0,await jr(e.id),M=M.filter(E=>E.id!==e.id),ke(),pe())}),n.addEventListener("click",E=>E.stopPropagation())}function ke(){Xe?.remove(),Xe=null}var Mn=e=>e?typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g,"\\$1"):"";function qo(e){if(!e||e===document.body||e===document.documentElement)return["body"];let t=[];for(let r of["data-testid","data-test-id","data-cy"]){let s=e.getAttribute(r);if(s){t.push(`[${r}="${Mn(s)}"]`);break}}if(e.id)try{let r=`#${Mn(e.id)}`;document.querySelectorAll(r).length===1&&t.push(r)}catch{}let n=e.getAttribute("aria-label");if(n){let r=`${e.tagName.toLowerCase()}[aria-label="${Mn(n)}"]`;try{document.querySelectorAll(r).length===1&&t.push(r)}catch{}}return t.push(Uo(e)),t}function Uo(e){let t=[],n=e;for(;n&&n!==document.body&&n!==document.documentElement;){let r=n,s=r.parentElement;if(!s)break;let o=r.tagName.toLowerCase(),i=Array.from(s.children).filter(a=>a.tagName===r.tagName);i.length>1&&(o+=`:nth-of-type(${i.indexOf(r)+1})`),t.unshift(o),n=s}return t.join(" > ")}function _o(e){if(!e)return"";let t=[],n=e;for(;n&&n!==document.body;){let r=1,s=n.previousElementSibling;for(;s;)s.tagName===n.tagName&&r++,s=s.previousElementSibling;t.unshift(`${n.tagName.toLowerCase()}[${r}]`),n=n.parentElement}return"/body/"+t.join("/")}function Fo(e,t,n,r,s,o,i){ke(),de?.querySelectorAll(".bs-lp-form").forEach(S=>S.remove());let a=document.createElement("div");a.className="bs-lp-form";let d=Math.min(300,window.innerWidth-32),p=16,b=s+p,v=o-8;b+d>window.innerWidth-p&&(b=s-d-p),b<p&&(b=p),a.style.left=`${b}px`,a.style.top=`${v}px`,requestAnimationFrame(()=>{let S=a.getBoundingClientRect();S.bottom>window.innerHeight-p&&(a.style.top=`${Math.max(p,o-S.height)}px`)});let k=os.filter(S=>S.userId!==ie()?.id).map(S=>`<option value="${S.userId}">${he(S.name)}</option>`).join("");a.innerHTML=`
|
|
567
575
|
<label class="bs-lp-form-label">Title</label>
|
|
568
576
|
<input type="text" id="bs-np-title" name="pin-title" placeholder="What's the issue?" autofocus />
|
|
569
577
|
<label class="bs-lp-form-label">Description</label>
|
|
@@ -583,31 +591,33 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
583
591
|
<button class="bs-lp-seg-btn" data-value="content">Content</button>
|
|
584
592
|
<button class="bs-lp-seg-btn bs-active" data-value="other">Other</button>
|
|
585
593
|
</div>
|
|
586
|
-
${
|
|
594
|
+
${k?`
|
|
587
595
|
<label class="bs-lp-form-label">Assign to</label>
|
|
588
596
|
<select id="bs-np-assignee" name="pin-assignee">
|
|
589
597
|
<option value="">Unassigned</option>
|
|
590
|
-
${
|
|
598
|
+
${k}
|
|
591
599
|
</select>
|
|
592
600
|
`:""}
|
|
601
|
+
<label class="bs-lp-form-label">Due date</label>
|
|
602
|
+
<input type="date" id="bs-np-duedate" name="pin-duedate" />
|
|
593
603
|
<div class="bs-lp-form-btns">
|
|
594
604
|
<button class="bs-lp-form-cancel" id="bs-np-cancel">Cancel</button>
|
|
595
605
|
<button class="bs-lp-form-submit" id="bs-np-submit">Create pin</button>
|
|
596
606
|
</div>
|
|
597
|
-
`,
|
|
607
|
+
`,de.appendChild(a),a.addEventListener("click",S=>S.stopPropagation()),rs(a,"#bs-np-priority-row"),rs(a,"#bs-np-category-row"),a.querySelector("#bs-np-cancel").addEventListener("click",()=>a.remove()),a.querySelector("#bs-np-submit").addEventListener("click",async()=>{let S=a.querySelector("#bs-np-title").value.trim();if(!S){a.querySelector("#bs-np-title").style.borderColor="#ef4444";return}let ue=a.querySelector("#bs-np-submit");ue.textContent="Creating...",ue.style.opacity="0.6",ue.style.pointerEvents="none";let ye=a.querySelector("#bs-np-desc").value.trim(),N=ss(a,"#bs-np-priority-row")||"medium",H=ss(a,"#bs-np-category-row")||"other",D=a.querySelector("#bs-np-assignee")?.value||void 0,z=a.querySelector("#bs-np-duedate")?.value,Z=z?new Date(z).getTime():void 0,Se=JSON.stringify(qo(i)),w=_o(i),se=fe().slice(-20).map(U=>`[${U.level}] ${U.args.join(" ")}`),wt=ge().slice(-10).map(U=>`${U.message} at ${U.source}:${U.lineno}`),an=xe().slice(-10).map(U=>`${U.method} ${U.url} \u2192 ${U.status}`),Le={projectId:Zt,pageUrl:window.location.href,pathname:window.location.pathname,elementSelector:Se,elementXPath:w,xPercent:n,yPercent:r,pageX:e,pageY:t,title:S,description:ye,priority:N,category:H,assigneeId:D,dueDate:Z,browserInfo:navigator.userAgent,screenSize:`${screen.width}x${screen.height}`,viewportSize:`${window.innerWidth}x${window.innerHeight}`,devicePixelRatio:window.devicePixelRatio,consoleLogs:se,networkErrors:an,jsErrors:wt};if(a.remove(),navigator.onLine){let U=await En(Le);U.success&&U.data&&(M=[...M,U.data],pe())}else{Cn({type:"create_pin",data:Le});let U=ie();M=[...M,{...Le,id:"local-"+Date.now(),orgId:"",status:"open",tags:[],createdBy:U?.id||"",creatorName:U?.name||"",commentCount:0,createdAt:Date.now(),updatedAt:Date.now()}],pe()}}),setTimeout(()=>a.querySelector("#bs-np-title")?.focus(),50)}function Wo(){bt("pin:created",e=>{let t=e.data;t.pathname===window.location.pathname&&(M.find(n=>n.id===t.id)||(M=[...M,t],$n(M.map(n=>n.id)),pe()))}),bt("pin:updated",e=>{let t=e.data,n=M.findIndex(r=>r.id===t.id);n>=0&&(M=M.map((r,s)=>s===n?{...r,...t}:r),pe())}),bt("pin:deleted",e=>{let{id:t}=e.data;M=M.filter(n=>n.id!==t),ke(),pe()}),bt("comment:created",e=>{let t=e.data;if(Xe){let n=Xe.querySelector("#bs-lp-cmts");n&&(n.innerHTML+=An(t),n.scrollTop=n.scrollHeight)}})}function Yo(){let e=window.location.pathname,t=()=>{window.location.pathname!==e&&(e=window.location.pathname,window.location.href,ds())},n=history.pushState,r=history.replaceState;history.pushState=function(...s){n.apply(this,s),t()},history.replaceState=function(...s){r.apply(this,s),t()},window.addEventListener("popstate",t)}function Rn(e){return e.split(" ").map(t=>t[0]||"").join("").toUpperCase().slice(0,2)||"U"}function zn(e){if(!e)return!1;try{let t=new URL(e);return t.protocol==="https:"||t.protocol==="http:"}catch{return!1}}var ns=["linear-gradient(135deg, #667eea, #764ba2)","linear-gradient(135deg, #f093fb, #f5576c)","linear-gradient(135deg, #4facfe, #00f2fe)","linear-gradient(135deg, #43e97b, #38f9d7)","linear-gradient(135deg, #fa709a, #fee140)","linear-gradient(135deg, #a18cd1, #fbc2eb)","linear-gradient(135deg, #fccb90, #d57eeb)","linear-gradient(135deg, #e0c3fc, #8ec5fc)"];function Hn(e){let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n)|0;return ns[Math.abs(t)%ns.length]}function An(e){let t=e.author?.name||e.authorName||"Unknown",n=e.author?.avatar||e.authorAvatar,r=Rn(t),s=Hn(t),o=zn(n)?`<img src="${he(n)}" alt="" />`:`<span style="font-size:8px">${r}</span>`;return`
|
|
598
608
|
<div class="bs-lp-cmt">
|
|
599
609
|
<div class="bs-lp-cmt-avatar" style="background:${s}">
|
|
600
610
|
${o}
|
|
601
611
|
</div>
|
|
602
612
|
<div class="bs-lp-cmt-content">
|
|
603
613
|
<div class="bs-lp-cmt-top">
|
|
604
|
-
<span class="bs-lp-cmt-author">${
|
|
605
|
-
<span class="bs-lp-cmt-time">${ps(
|
|
614
|
+
<span class="bs-lp-cmt-author">${he(t)}</span>
|
|
615
|
+
<span class="bs-lp-cmt-time">${ps(e.createdAt?new Date(e.createdAt).getTime():Date.now())}</span>
|
|
606
616
|
</div>
|
|
607
|
-
<div class="bs-lp-cmt-body">${
|
|
617
|
+
<div class="bs-lp-cmt-body">${he(e.body)}</div>
|
|
608
618
|
</div>
|
|
609
619
|
</div>
|
|
610
|
-
`}function
|
|
620
|
+
`}function rs(e,t){let n=e.querySelector(t);n&&n.querySelectorAll(".bs-lp-seg-btn").forEach(r=>{r.addEventListener("click",s=>{s.preventDefault(),s.stopPropagation(),n.querySelectorAll(".bs-lp-seg-btn").forEach(o=>o.classList.remove("bs-active")),r.classList.add("bs-active")})})}function ss(e,t){return e.querySelector(`${t} .bs-lp-seg-btn.bs-active`)?.dataset.value||""}function he(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}var G,x=null,P=null,g=null,te=null,ut=null,ne=null,J=null,Te=null,K=!1,tn=!1,$e=!1,mt=null,Dn=null,us="bugstash_fab_position",ft=null,Ke=null,Ge="report";var ae=Wr(),Me=Yr(),B={bug:'<svg width="28" height="28" viewBox="55 38 60 105" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M95.8 44h-29c-3 0-5.4 2.4-5.4 5.4v29c0 3 2.4 5.4 5.4 5.4h19.5c13 0 23.5-10.5 23.5-23.5v-2.8c0-7.5-6-13.5-13.5-13.5h-.5zm-6.2 28.2H74.8V57.4h14.8c5.8 0 10.4 4.7 10.4 10.4s-4.7 10.4-10.4 10.4z" fill="rgba(255,255,255,0.85)"/><path d="M100.4 96h-33.6c-3 0-5.4 2.4-5.4 5.4v33.6c0 3 2.4 5.4 5.4 5.4h22c15 0 27-12 27-27v-3.9c0-7.5-6-13.5-13.5-13.5h-1.9zm-7.8 32.2H74.8v-20h17.8c6.7 0 12.2 5.5 12.2 12.2 0 4.3-3.5 7.8-7.8 7.8h-4.6z" fill="rgba(255,255,255,1)"/></svg>',x:'<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',cam:'<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/><circle cx="12" cy="13" r="4"/></svg>',check:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"><polyline points="20 6 9 17 4 12"/></svg>',report:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg>',console:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"/><line x1="12" y1="19" x2="20" y2="19"/></svg>',network:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>',ctx:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>',settings:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="4" y1="21" x2="4" y2="14"/><line x1="4" y1="10" x2="4" y2="3"/><line x1="12" y1="21" x2="12" y2="12"/><line x1="12" y1="8" x2="12" y2="3"/><line x1="20" y1="21" x2="20" y2="16"/><line x1="20" y1="12" x2="20" y2="3"/><line x1="1" y1="14" x2="7" y2="14"/><line x1="9" y1="8" x2="15" y2="8"/><line x1="17" y1="16" x2="23" y2="16"/></svg>',history:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>',pin:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>',sun:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg>',moon:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>',keyboard:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><rect x="2" y="4" width="20" height="16" rx="2"/><line x1="6" y1="8" x2="6" y2="8"/><line x1="10" y1="8" x2="10" y2="8"/><line x1="14" y1="8" x2="14" y2="8"/><line x1="18" y1="8" x2="18" y2="8"/><line x1="8" y1="12" x2="16" y2="12"/><line x1="6" y1="16" x2="18" y2="16"/></svg>'},Xo=`
|
|
611
621
|
/* \u2500\u2500 Shadow Boundary Reset \u2500\u2500
|
|
612
622
|
* Cuts ALL inherited CSS from host page (color, font, line-height, etc.)
|
|
613
623
|
* Every element below must declare its own styles explicitly. */
|
|
@@ -1701,6 +1711,131 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
1701
1711
|
.bs-set-ly.bs-picked { border-color: var(--bs-accent); box-shadow: 0 0 0 2px color-mix(in srgb, var(--bs-accent) 25%, transparent); }
|
|
1702
1712
|
.bs-set-ly-name { font-size: 12px; font-weight: 600; color: var(--bs-text); margin-bottom: 2px; }
|
|
1703
1713
|
.bs-set-ly-desc { font-size: 10px; color: var(--bs-muted); }
|
|
1714
|
+
`,Vo=`
|
|
1715
|
+
:host {
|
|
1716
|
+
all: initial !important;
|
|
1717
|
+
display: block !important;
|
|
1718
|
+
position: fixed !important;
|
|
1719
|
+
inset: 0 !important;
|
|
1720
|
+
pointer-events: none !important;
|
|
1721
|
+
z-index: 2147483640 !important;
|
|
1722
|
+
visibility: visible !important;
|
|
1723
|
+
}
|
|
1724
|
+
|
|
1725
|
+
/* \u2500\u2500 FAB \u2500\u2500 */
|
|
1726
|
+
.bs-fab {
|
|
1727
|
+
all: initial;
|
|
1728
|
+
pointer-events: auto;
|
|
1729
|
+
position: fixed;
|
|
1730
|
+
bottom: 24px;
|
|
1731
|
+
z-index: 2147483647;
|
|
1732
|
+
width: 56px;
|
|
1733
|
+
height: 56px;
|
|
1734
|
+
border-radius: var(--bs-radius);
|
|
1735
|
+
background: linear-gradient(135deg, var(--bs-fab1), var(--bs-fab2));
|
|
1736
|
+
color: #fff;
|
|
1737
|
+
cursor: grab;
|
|
1738
|
+
box-shadow: 0 4px 24px rgba(0,0,0,0.3), 0 0 0 0 rgba(0,0,0,0.15);
|
|
1739
|
+
display: flex;
|
|
1740
|
+
align-items: center;
|
|
1741
|
+
justify-content: center;
|
|
1742
|
+
transition: all 0.35s cubic-bezier(0.34,1.56,0.64,1);
|
|
1743
|
+
animation: bs-pulse 3s ease-in-out infinite;
|
|
1744
|
+
touch-action: none;
|
|
1745
|
+
user-select: none;
|
|
1746
|
+
-webkit-user-select: none;
|
|
1747
|
+
font-family: 'Inter', -apple-system, sans-serif;
|
|
1748
|
+
}
|
|
1749
|
+
.bs-fab.bs-dragging { cursor: grabbing; transition: none; animation: none; }
|
|
1750
|
+
.bs-fab:hover { transform: scale(1.08) translateY(-2px); box-shadow: 0 8px 32px rgba(0,0,0,0.4); animation: none; }
|
|
1751
|
+
.bs-fab:active { transform: scale(0.95); }
|
|
1752
|
+
.bs-fab.bs-open { animation: none; transform: rotate(45deg) scale(0.9); box-shadow: 0 2px 12px rgba(0,0,0,0.3); }
|
|
1753
|
+
.bs-fab.bs-open:hover { transform: rotate(45deg) scale(1); }
|
|
1754
|
+
@keyframes bs-pulse {
|
|
1755
|
+
0%, 100% { box-shadow: 0 4px 24px rgba(0,0,0,0.3), 0 0 0 0 rgba(0,0,0,0.15); }
|
|
1756
|
+
50% { box-shadow: 0 4px 24px rgba(0,0,0,0.3), 0 0 0 10px rgba(0,0,0,0); }
|
|
1757
|
+
}
|
|
1758
|
+
.bs-fab-label {
|
|
1759
|
+
position: absolute;
|
|
1760
|
+
right: calc(100% + 12px);
|
|
1761
|
+
background: var(--bs-bg2);
|
|
1762
|
+
color: var(--bs-text);
|
|
1763
|
+
font-family: 'Inter', sans-serif;
|
|
1764
|
+
font-size: 13px;
|
|
1765
|
+
font-weight: 500;
|
|
1766
|
+
padding: 8px 14px;
|
|
1767
|
+
border-radius: var(--bs-radius-sm);
|
|
1768
|
+
white-space: nowrap;
|
|
1769
|
+
box-shadow: 0 4px 20px rgba(0,0,0,0.3);
|
|
1770
|
+
opacity: 0;
|
|
1771
|
+
transform: translateX(8px);
|
|
1772
|
+
transition: all 0.25s ease;
|
|
1773
|
+
pointer-events: none;
|
|
1774
|
+
}
|
|
1775
|
+
.bs-fab:hover .bs-fab-label { opacity: 1; transform: translateX(0); }
|
|
1776
|
+
.bs-fab-label::after {
|
|
1777
|
+
content: '';
|
|
1778
|
+
position: absolute;
|
|
1779
|
+
right: -6px;
|
|
1780
|
+
top: 50%;
|
|
1781
|
+
transform: translateY(-50%);
|
|
1782
|
+
border: 6px solid transparent;
|
|
1783
|
+
border-left-color: var(--bs-bg2);
|
|
1784
|
+
border-right: none;
|
|
1785
|
+
}
|
|
1786
|
+
|
|
1787
|
+
/* \u2500\u2500 Quick Action Toolbar \u2500\u2500 */
|
|
1788
|
+
.bs-toolbar {
|
|
1789
|
+
pointer-events: auto;
|
|
1790
|
+
position: fixed;
|
|
1791
|
+
z-index: 2147483646;
|
|
1792
|
+
display: flex;
|
|
1793
|
+
flex-direction: column;
|
|
1794
|
+
gap: 6px;
|
|
1795
|
+
bottom: 88px;
|
|
1796
|
+
opacity: 0;
|
|
1797
|
+
transform: translateY(10px);
|
|
1798
|
+
transition: all 0.3s cubic-bezier(0.34,1.56,0.64,1);
|
|
1799
|
+
pointer-events: none;
|
|
1800
|
+
font-family: 'Inter', -apple-system, sans-serif;
|
|
1801
|
+
}
|
|
1802
|
+
.bs-toolbar.bs-show { opacity: 1; transform: translateY(0); pointer-events: all; }
|
|
1803
|
+
.bs-toolbar-btn {
|
|
1804
|
+
all: initial;
|
|
1805
|
+
width: 40px;
|
|
1806
|
+
height: 40px;
|
|
1807
|
+
border-radius: var(--bs-radius-sm);
|
|
1808
|
+
background: var(--bs-bg2);
|
|
1809
|
+
border: 1px solid var(--bs-border);
|
|
1810
|
+
color: var(--bs-muted);
|
|
1811
|
+
cursor: pointer;
|
|
1812
|
+
display: flex;
|
|
1813
|
+
align-items: center;
|
|
1814
|
+
justify-content: center;
|
|
1815
|
+
transition: all 0.2s;
|
|
1816
|
+
position: relative;
|
|
1817
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
1818
|
+
}
|
|
1819
|
+
.bs-toolbar-btn:hover { color: var(--bs-text); border-color: var(--bs-accent); background: var(--bs-bg3); }
|
|
1820
|
+
.bs-toolbar-btn.bs-active { color: var(--bs-accent); border-color: var(--bs-accent); }
|
|
1821
|
+
.bs-toolbar-tip {
|
|
1822
|
+
position: absolute;
|
|
1823
|
+
right: calc(100% + 8px);
|
|
1824
|
+
background: var(--bs-bg2);
|
|
1825
|
+
color: var(--bs-text);
|
|
1826
|
+
font-family: 'Inter', sans-serif;
|
|
1827
|
+
font-size: 11px;
|
|
1828
|
+
font-weight: 500;
|
|
1829
|
+
padding: 4px 8px;
|
|
1830
|
+
border-radius: 6px;
|
|
1831
|
+
white-space: nowrap;
|
|
1832
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
|
1833
|
+
opacity: 0;
|
|
1834
|
+
pointer-events: none;
|
|
1835
|
+
transition: opacity 0.15s;
|
|
1836
|
+
}
|
|
1837
|
+
.bs-toolbar-btn:hover .bs-toolbar-tip { opacity: 1; }
|
|
1838
|
+
.bs-toolbar-kbd { font-size: 9px; color: var(--bs-muted); margin-left: 4px; }
|
|
1704
1839
|
`;function Jo(){return`
|
|
1705
1840
|
<div class="bs-login-form">
|
|
1706
1841
|
<div class="bs-login-logo">BugStash</div>
|
|
@@ -1711,11 +1846,11 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
1711
1846
|
<button class="bs-login-btn" id="bs-login-submit">Sign In</button>
|
|
1712
1847
|
<div style="font-size:11px;color:var(--bs-muted);margin-top:4px">Contact your admin for an account</div>
|
|
1713
1848
|
</div>
|
|
1714
|
-
`}function j(
|
|
1849
|
+
`}function j(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Ko(e){let t=Math.floor((Date.now()-e)/1e3);return t<5?"now":t<60?`${t}s ago`:t<3600?`${Math.floor(t/60)}m ago`:new Date(e).toLocaleTimeString()}function ms(e){return new Date(e).toLocaleTimeString("en",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}var fs="bugstash_history";function Qe(){try{return JSON.parse(localStorage.getItem(fs)||"[]")}catch{return[]}}function Nn(e){try{localStorage.setItem(fs,JSON.stringify(e))}catch{}}function Go(e){let t=Qe(),n=Date.now();t.unshift({...e,id:n}),t.length>50&&(t.length=50),Nn(t)}function Qo(e){let t=Qe().filter(n=>n.id!==e);Nn(t)}function Zo(e,t){let n=Qe(),r=n.findIndex(s=>s.id===e);r>=0&&(n[r]={...n[r],...t},Nn(n))}function gs(){return{url:window.location.href,userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language,cookiesEnabled:navigator.cookieEnabled,online:navigator.onLine,screenWidth:screen.width,screenHeight:screen.height,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,devicePixelRatio:window.devicePixelRatio,timestamp:Date.now(),environment:G.environment??"development",commitHash:G.commitHash,user:G.user}}function hs(){let e=ge(),t=fe(),n=He(),r=xe(),s=Ie(),o=De(),i=t.filter(p=>p.level==="error"),a="low";e.length>=3||r.length>=3?a="critical":e.length>=1||r.length>=2?a="high":(i.length>0||r.length>=1)&&(a="medium");let d=[];return e.length&&d.push("has-errors"),r.length&&d.push("network-failures"),i.length&&d.push("console-errors"),o?.pageLoadTime&&o.pageLoadTime>3e3&&d.push("slow-load"),o?.cumulativeLayoutShift&&o.cumulativeLayoutShift>.25&&d.push("layout-shift"),navigator.onLine||d.push("offline"),window.innerWidth<768&&d.push("mobile"),{severity:a,tags:d,counts:{logs:t.length,network:n.length,failedNet:r.length,errors:e.length,crumbs:s.length}}}function vs(){let e=hs(),t=[{id:"ui",label:"UI"},{id:"functionality",label:"Feature"},{id:"performance",label:"Speed"},{id:"crash",label:"Crash"},{id:"security",label:"Security"},{id:"other",label:"Other"}],n=e.counts.errors>0||e.counts.failedNet>0;return`<div class="bs-view">
|
|
1715
1850
|
<form data-bs-form>
|
|
1716
|
-
<div class="bs-report-summary${n?" bs-alert":
|
|
1851
|
+
<div class="bs-report-summary${n?" bs-alert":e.counts.logs>0?" bs-has":""}">
|
|
1717
1852
|
<div class="bs-report-summary-left">
|
|
1718
|
-
${n?`<div class="bs-report-summary-icon bs-warn">!</div><span>${
|
|
1853
|
+
${n?`<div class="bs-report-summary-icon bs-warn">!</div><span>${e.counts.errors} error${e.counts.errors!==1?"s":""}, ${e.counts.failedNet} failed request${e.counts.failedNet!==1?"s":""} detected</span>`:`<div class="bs-report-summary-icon">${B.check}</div><span>Auto-collecting ${e.counts.logs} logs, ${e.counts.network} requests, ${e.counts.crumbs} actions</span>`}
|
|
1719
1854
|
</div>
|
|
1720
1855
|
</div>
|
|
1721
1856
|
<div class="bs-field">
|
|
@@ -1728,21 +1863,21 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
1728
1863
|
<div class="bs-field-label">Category</div>
|
|
1729
1864
|
<input type="hidden" name="category" value="functionality" />
|
|
1730
1865
|
<div class="bs-cat-row">
|
|
1731
|
-
${
|
|
1866
|
+
${t.map(s=>`<button type="button" class="bs-cat-btn${s.id==="functionality"?" bs-picked":""}" data-cat="${s.id}">${s.label}</button>`).join("")}
|
|
1732
1867
|
</div>
|
|
1733
1868
|
</div>
|
|
1734
1869
|
<div class="bs-field">
|
|
1735
1870
|
<div class="bs-field-label">Severity</div>
|
|
1736
|
-
<input type="hidden" name="severity" value="${
|
|
1871
|
+
<input type="hidden" name="severity" value="${e.severity}" />
|
|
1737
1872
|
<div class="bs-sev-row">
|
|
1738
|
-
<button type="button" class="bs-sev-btn bs-sev-low${
|
|
1739
|
-
<button type="button" class="bs-sev-btn bs-sev-medium${
|
|
1740
|
-
<button type="button" class="bs-sev-btn bs-sev-high${
|
|
1741
|
-
<button type="button" class="bs-sev-btn bs-sev-critical${
|
|
1873
|
+
<button type="button" class="bs-sev-btn bs-sev-low${e.severity==="low"?" bs-picked":""}" data-sev="low">Low</button>
|
|
1874
|
+
<button type="button" class="bs-sev-btn bs-sev-medium${e.severity==="medium"?" bs-picked":""}" data-sev="medium">Med</button>
|
|
1875
|
+
<button type="button" class="bs-sev-btn bs-sev-high${e.severity==="high"?" bs-picked":""}" data-sev="high">High</button>
|
|
1876
|
+
<button type="button" class="bs-sev-btn bs-sev-critical${e.severity==="critical"?" bs-picked":""}" data-sev="critical">Critical</button>
|
|
1742
1877
|
</div>
|
|
1743
1878
|
</div>
|
|
1744
1879
|
<div class="bs-shot-area" data-bs-screenshot>
|
|
1745
|
-
<div class="bs-shot-icon">${
|
|
1880
|
+
<div class="bs-shot-icon">${B.cam}</div>
|
|
1746
1881
|
<div class="bs-shot-text">
|
|
1747
1882
|
<div class="bs-shot-title" data-bs-shot-title>Attach screenshot</div>
|
|
1748
1883
|
<div class="bs-shot-sub" data-bs-shot-sub>Capture & annotate the current view</div>
|
|
@@ -1751,7 +1886,7 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
1751
1886
|
<div data-bs-annotate></div>
|
|
1752
1887
|
<button type="submit" class="bs-submit-btn">Submit Report</button>
|
|
1753
1888
|
</form>
|
|
1754
|
-
</div>`}function
|
|
1889
|
+
</div>`}function ei(){let e=fe(),t={error:"bs-le",warn:"bs-lw",log:"bs-ll",info:"bs-li",debug:"bs-ld"};return e.length?`<div class="bs-view">${e.slice().reverse().map(n=>`<div class="bs-log"><span class="bs-log-lv ${t[n.level]||"bs-ll"}">${n.level}</span><span class="bs-log-m">${j(n.args.join(" ")).slice(0,500)}</span><span class="bs-log-t">${ms(n.timestamp)}</span></div>`).join("")}</div>`:'<div class="bs-view"><div class="bs-empty"><p>No console logs captured yet.<br>Use the app \u2014 logs will appear here automatically.</p></div></div>'}function ti(){let e=He();return e.length?`<div class="bs-view">${e.slice().reverse().map(t=>`<div class="bs-net"><span class="bs-net-m">${t.method}</span><span class="bs-net-s ${t.failed?"bs-fail":"bs-ok"}">${t.status||"ERR"}</span><span class="bs-net-u" title="${j(t.url)}">${j(t.url)}</span><span class="bs-net-d">${t.duration}ms</span></div>`).join("")}</div>`:'<div class="bs-view"><div class="bs-empty"><p>No network requests captured yet.<br>API calls will show up here automatically.</p></div></div>'}function ni(){let e='<div class="bs-view">',t=ge();t.length&&(e+=`<div class="bs-sec">Errors <span class="bs-sec-n">${t.length}</span></div>`,e+=t.slice().reverse().map(o=>`<div class="bs-err-card"><div class="bs-err-m">${j(o.message)}</div>${o.stack?`<div class="bs-err-stack">${j(o.stack)}</div>`:""}<div class="bs-err-meta">${o.type} · ${ms(o.timestamp)}${o.source?` · ${j(o.source)}:${o.lineno}`:""}</div></div>`).join(""));let n=De();if(n){e+='<div class="bs-sec">Performance</div>';let o=[["Page Load",n.pageLoadTime,5e3],["DOM Ready",n.domContentLoaded,3e3],["First Paint",n.firstPaint,2e3],["FCP",n.firstContentfulPaint,2500],["LCP",n.largestContentfulPaint,4e3],["FID",n.firstInputDelay,300]];for(let[i,a,d]of o){if(a===void 0)continue;let p=Math.min(100,a/d*100);e+=`<div class="bs-pf"><span class="bs-pf-l">${i}</span><div class="bs-pf-tr"><div class="bs-pf-fl${p>75?" bs-slow":""}" style="width:${p}%"></div></div><span class="bs-pf-v">${a}ms</span></div>`}if(n.cumulativeLayoutShift!==void 0){let i=Math.min(100,n.cumulativeLayoutShift*400);e+=`<div class="bs-pf"><span class="bs-pf-l">CLS</span><div class="bs-pf-tr"><div class="bs-pf-fl${i>40?" bs-slow":""}" style="width:${i}%"></div></div><span class="bs-pf-v">${n.cumulativeLayoutShift}</span></div>`}}let r=Ie();r.length&&(e+=`<div class="bs-sec">Your activity trail <span class="bs-sec-n">${r.length}</span></div>`,e+=r.slice().reverse().map(o=>`<div class="bs-bc"><span class="bs-bc-t bs-t-${o.type}">${o.type}</span><span class="bs-bc-m">${j(o.message).slice(0,120)}</span><span class="bs-bc-time">${Ko(o.timestamp)}</span></div>`).join(""));let s=gs();return e+='<div class="bs-sec">Environment</div>',e+=`<div class="bs-kv">
|
|
1755
1890
|
<span class="bs-kv-k">URL</span><span class="bs-kv-v">${j(s.url)}</span>
|
|
1756
1891
|
<span class="bs-kv-k">Viewport</span><span class="bs-kv-v">${s.viewportWidth}×${s.viewportHeight} @${s.devicePixelRatio}x</span>
|
|
1757
1892
|
<span class="bs-kv-k">Screen</span><span class="bs-kv-v">${s.screenWidth}×${s.screenHeight}</span>
|
|
@@ -1759,7 +1894,7 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
1759
1894
|
<span class="bs-kv-k">Language</span><span class="bs-kv-v">${s.language}</span>
|
|
1760
1895
|
${G.commitHash?`<span class="bs-kv-k">Commit</span><span class="bs-kv-v">${j(G.commitHash)}</span>`:""}
|
|
1761
1896
|
${G.user?.email?`<span class="bs-kv-k">User</span><span class="bs-kv-v">${j(G.user.email)}</span>`:""}
|
|
1762
|
-
</div>`,
|
|
1897
|
+
</div>`,e+="</div>",e}function ri(){let e=Qe();if(!e.length)return'<div class="bs-view"><div class="bs-empty"><p>No reports yet.<br>Submitted bugs will appear here.</p></div></div>';let t={ui:"UI",functionality:"Feature",performance:"Perf",crash:"Crash",security:"Security",other:"Other"},n=s=>{let o=new Date(s),a=new Date().getTime()-o.getTime(),d=Math.floor(a/6e4);if(d<1)return"Just now";if(d<60)return`${d}m ago`;let p=Math.floor(d/60);if(p<24)return`${p}h ago`;let b=Math.floor(p/24);return b<7?`${b}d ago`:o.toLocaleDateString("en",{month:"short",day:"numeric"})},r='<div class="bs-view">';for(let s of e){let o=s.pins?.length?`<div class="bs-hist-pins">${s.pins.slice(0,5).map(i=>`<div class="bs-hist-pin-dot" style="background:${["#ef4444","#3b82f6","#f59e0b","#10b981","#8b5cf6"][i.number%5]}">${i.number}</div>`).join("")}${s.pins.length>5?`<span>+${s.pins.length-5}</span>`:""}</div>`:"";r+=`<div class="bs-hist-card" data-hist-id="${s.id}">
|
|
1763
1898
|
<div class="bs-hist-top">
|
|
1764
1899
|
<div class="bs-hist-title">${j(s.title)}</div>
|
|
1765
1900
|
${s.screenshot?`<img class="bs-hist-thumb" src="${s.screenshot}" alt=""/>`:""}
|
|
@@ -1769,7 +1904,7 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
1769
1904
|
</div>
|
|
1770
1905
|
</div>
|
|
1771
1906
|
<div class="bs-hist-meta">
|
|
1772
|
-
<span class="bs-hist-badge bs-cat">${
|
|
1907
|
+
<span class="bs-hist-badge bs-cat">${t[s.category]||s.category}</span>
|
|
1773
1908
|
<span class="bs-hist-badge bs-sev-${s.severity}">${s.severity}</span>
|
|
1774
1909
|
<span class="bs-hist-badge bs-status-${s.status}">${s.status}</span>
|
|
1775
1910
|
</div>
|
|
@@ -1778,12 +1913,12 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
1778
1913
|
<span>${n(s.createdAt)} · ${j(s.url.replace(/^https?:\/\//,"").slice(0,40))}</span>
|
|
1779
1914
|
${o}
|
|
1780
1915
|
</div>
|
|
1781
|
-
</div>`}return r+="</div>",r}function si(){let
|
|
1782
|
-
<div class="bs-ann-pin-num" style="background:${l.color}">${
|
|
1916
|
+
</div>`}return r+="</div>",r}function si(){let e=Wt(),t=Xt(),n='<div class="bs-view">';n+='<div class="bs-set-sec">Layout</div>',n+='<div class="bs-set-ly-grid">';for(let r of t)n+=`<button class="bs-set-ly${r.id===Me.id?" bs-picked":""}" data-set-layout="${r.id}"><div class="bs-set-ly-name">${j(r.name)}</div><div class="bs-set-ly-desc">${j(r.description)}</div></button>`;n+="</div>",n+='<div class="bs-set-sec">Theme</div>',n+='<div class="bs-set-grid">';for(let r of e)n+=`<button class="bs-set-card${r.id===ae.id?" bs-picked":""}" data-set-theme="${r.id}"><div class="bs-set-preview" style="background:${r.preview[0]}"><div class="bs-set-dot" style="background:${r.preview[1]}"></div><div class="bs-set-dot" style="background:${r.vars["--bs-accent2"]||r.preview[1]};opacity:0.6"></div></div><div class="bs-set-name">${j(r.name)}</div></button>`;return n+="</div>",n+="</div>",n}function oi(e,t){let n=["#f87171","#3b82f6","#fb923c","#4ade80","#a78bfa","#facc15"],r=n[0],s="draw",o=4,i=1,a=!1,d=[],p=[],b=-1,v=-1,k=!1,S=!1,ue=0,ye=0,N=0,H=0,E=[],D=["#ef4444","#3b82f6","#f59e0b","#10b981","#8b5cf6","#ec4899"],z=new Image;z.src=t;let Z=document.createElement("div");Z.className="bs-ann-wrap";let Se=document.createElement("div");Se.className="bs-ann-viewport";let w=document.createElement("canvas");w.className="bs-ann-canvas bs-draw";let se=document.createElement("div");se.className="bs-ann-toolbar";let wt={select:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z"/><path d="M13 13l6 6"/></svg>',draw:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/></svg>',arrow:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg>',rect:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/></svg>',circle:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/></svg>',text:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><polyline points="4 7 4 4 20 4 20 7"/><line x1="9.5" y1="20" x2="14.5" y2="20"/><line x1="12" y1="4" x2="12" y2="20"/></svg>',highlight:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M9 11l-6 6v3h9l3-3"/><path d="M22 12l-4.6 4.6a2 2 0 01-2.8 0l-5.2-5.2a2 2 0 010-2.8L14 4"/></svg>',pin:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg>'},an={select:"Select & Move",draw:"Draw",arrow:"Arrow",rect:"Rectangle",circle:"Circle",text:"Text",highlight:"Highlight",pin:"Pin Issue"},Le=[],U=l=>{s=l,b=-1,w.className=`bs-ann-canvas bs-${l}`,Le.forEach(f=>f.classList.remove("bs-sel")),Le.find(f=>f.dataset.tool===l)?.classList.add("bs-sel")};Object.keys(wt).forEach(l=>{let f=document.createElement("button");f.type="button",f.dataset.tool=l,f.className=`bs-ann-btn${l===s?" bs-sel":""}`,f.title=an[l],f.innerHTML=wt[l],f.addEventListener("click",()=>U(l)),Le.push(f),se.appendChild(f)}),se.appendChild(Object.assign(document.createElement("div"),{className:"bs-ann-sep"})),n.forEach((l,f)=>{let h=document.createElement("button");h.type="button",h.className=`bs-ann-dot${f===0?" bs-sel":""}`,h.style.background=l,h.addEventListener("click",()=>{r=l,se.querySelectorAll(".bs-ann-dot").forEach(A=>A.classList.remove("bs-sel")),h.classList.add("bs-sel")}),se.appendChild(h)}),se.appendChild(Object.assign(document.createElement("div"),{className:"bs-ann-sep"}));let me=document.createElement("input");me.type="range",me.min="1",me.max="12",me.value="4",me.className="bs-ann-size",me.title="Brush size",me.addEventListener("input",()=>{o=parseInt(me.value)}),se.appendChild(me);let kt=document.createElement("div");kt.className="bs-ann-right";let Et=(l,f)=>{let h=document.createElement("button");return h.type="button",h.className="bs-ann-btn",h.title=l,h.innerHTML=f,h},qn=Et("Zoom out",'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/><line x1="8" y1="11" x2="14" y2="11"/></svg>'),Un=Object.assign(document.createElement("span"),{className:"bs-ann-zoom-label",textContent:"100%"}),_n=Et("Zoom in",'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/><line x1="11" y1="8" x2="11" y2="14"/><line x1="8" y1="11" x2="14" y2="11"/></svg>'),Fn=Et("Fit",'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M15 3h6v6"/><path d="M9 21H3v-6"/><path d="M21 3l-7 7"/><path d="M3 21l7-7"/></svg>'),Wn=Et("Undo",'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><polyline points="1 4 1 10 7 10"/><path d="M3.51 15a9 9 0 105.42-8.49L1 10"/></svg>'),Yn=Object.assign(document.createElement("button"),{type:"button",className:"bs-ann-clr-btn",textContent:"Clear"}),ln=()=>{w.style.transform=`scale(${i})`,Un.textContent=`${Math.round(i*100)}%`};_n.addEventListener("click",()=>{i<3&&(i=Math.min(3,i+.25),ln())}),qn.addEventListener("click",()=>{i>.5&&(i=Math.max(.5,i-.25),ln())}),Fn.addEventListener("click",()=>{i=1,ln()}),kt.appendChild(Object.assign(document.createElement("div"),{className:"bs-ann-sep"})),[qn,Un,_n,Fn,Wn,Yn].forEach(l=>kt.appendChild(l)),se.appendChild(kt);let St=document.createElement("div");St.className="bs-ann-pins";let Ae=document.createElement("div");Ae.className="bs-ann-pin-list",Ae.style.display="none",Se.appendChild(w),Se.appendChild(St),Z.appendChild(Se),Z.appendChild(se),Z.appendChild(Ae),e.innerHTML="",e.appendChild(Z);let Lt=()=>{St.innerHTML="",Ae.innerHTML="",Ae.style.display=p.length?"":"none",p.forEach((l,f)=>{let h=document.createElement("div");h.className="bs-ann-pin",h.style.background=l.color,h.style.color=l.color;let A=l.x/(w.width||1)*100,m=l.y/(w.height||1)*100;h.style.left=`${A}%`,h.style.top=`${m}%`,h.innerHTML=`<span class="bs-ann-pin-n">${f+1}</span><span class="bs-ann-pin-pulse"></span>`,h.title=`#${f+1}: ${l.note}`;let I=!1;h.addEventListener("mousedown",O=>{O.stopPropagation(),I=!0,h.classList.add("bs-dragging");let u=T=>{if(!I)return;let $=Se.getBoundingClientRect();l.x=(T.clientX-$.left)/$.width*w.width,l.y=(T.clientY-$.top)/$.height*w.height,h.style.left=`${(T.clientX-$.left)/$.width*100}%`,h.style.top=`${(T.clientY-$.top)/$.height*100}%`},y=()=>{I=!1,h.classList.remove("bs-dragging"),document.removeEventListener("mousemove",u),document.removeEventListener("mouseup",y),Lt()};document.addEventListener("mousemove",u),document.addEventListener("mouseup",y)}),St.appendChild(h);let _=document.createElement("div");_.className="bs-ann-pin-item",_.innerHTML=`
|
|
1917
|
+
<div class="bs-ann-pin-num" style="background:${l.color}">${f+1}</div>
|
|
1783
1918
|
<div class="bs-ann-pin-body">
|
|
1784
1919
|
<div class="bs-ann-pin-note">${j(l.note)}</div>
|
|
1785
|
-
<div class="bs-ann-pin-loc">${Math.round(
|
|
1786
|
-
</div>`;let
|
|
1920
|
+
<div class="bs-ann-pin-loc">${Math.round(A)}% \xD7 ${Math.round(m)}%</div>
|
|
1921
|
+
</div>`;let W=document.createElement("button");W.type="button",W.className="bs-ann-pin-del",W.innerHTML="×",W.title="Remove pin",W.addEventListener("click",()=>{p.splice(f,1),Lt()}),_.appendChild(W),Ae.appendChild(_)})},c,cn=()=>a?"rgba(255,255,255,0.5)":"rgba(0,0,0,0.35)",Ce=(l,f)=>{c.save(),c.strokeStyle=cn(),c.lineWidth=f+3,c.lineCap="round",c.lineJoin="round",c.globalAlpha=.5,l(),c.restore()},As=(l,f=!1)=>{if(l.type==="draw"||l.type==="highlight"){if(l.points.length<2)return;let m=l.type==="highlight"?.25:1,I=l.type==="highlight"?l.size*4+10:l.size,_=()=>{c.beginPath(),c.moveTo(l.points[0].x,l.points[0].y);for(let W=1;W<l.points.length;W++)c.lineTo(l.points[W].x,l.points[W].y);c.stroke()};l.type!=="highlight"&&Ce(_,I),c.strokeStyle=l.color,c.lineWidth=I,c.lineCap="round",c.lineJoin="round",c.globalAlpha=m,_(),c.globalAlpha=1}else if(l.type==="rect"){let m=()=>c.strokeRect(l.x,l.y,l.w,l.h);Ce(m,l.size),c.strokeStyle=l.color,c.lineWidth=l.size,c.lineCap="round",c.lineJoin="round",m()}else if(l.type==="circle"){let m=()=>{c.beginPath(),c.ellipse(l.cx,l.cy,Math.abs(l.rx),Math.abs(l.ry),0,0,Math.PI*2),c.stroke()};Ce(m,l.size),c.strokeStyle=l.color,c.lineWidth=l.size,m()}else if(l.type==="arrow"){let m=Math.atan2(l.y2-l.y1,l.x2-l.x1),I=12+l.size*2,_=()=>{c.beginPath(),c.moveTo(l.x1,l.y1),c.lineTo(l.x2,l.y2),c.stroke(),c.beginPath(),c.moveTo(l.x2,l.y2),c.lineTo(l.x2-I*Math.cos(m-.45),l.y2-I*Math.sin(m-.45)),c.moveTo(l.x2,l.y2),c.lineTo(l.x2-I*Math.cos(m+.45),l.y2-I*Math.sin(m+.45)),c.stroke()};Ce(_,l.size),c.strokeStyle=l.color,c.lineWidth=l.size,c.lineCap="round",c.lineJoin="round",_()}else if(l.type==="text"){let m=l.size*5+12;c.font=`bold ${m}px Inter, -apple-system, sans-serif`,c.fillStyle=cn(),c.globalAlpha=.6,c.fillText(l.text,l.x+1,l.y+1),c.globalAlpha=1,c.fillStyle=l.color,c.fillText(l.text,l.x,l.y)}let h=!f&&b>=0&&d[b]===l,A=!f&&!h&&v>=0&&d[v]===l;if(h||A){let m=et(l);if(c.save(),c.setLineDash([6,4]),c.strokeStyle=a?"#fff":"#000",c.lineWidth=h?1.5:1,c.globalAlpha=h?.7:.45,c.strokeRect(m.x-4,m.y-4,m.w+8,m.h+8),l.type==="rect"||l.type==="circle"){c.setLineDash([]),c.globalAlpha=h?.9:.6;let _=l.type==="rect"?[[m.x,m.y],[m.x+m.w,m.y],[m.x,m.y+m.h],[m.x+m.w,m.y+m.h]]:[[m.x+m.w/2,m.y],[m.x+m.w,m.y+m.h/2],[m.x+m.w/2,m.y+m.h],[m.x,m.y+m.h/2]];for(let[W,O]of _)c.fillStyle="#fff",c.fillRect(W-5,O-5,10,10),c.strokeStyle=a?"#aaa":"#333",c.lineWidth=1.2,c.strokeRect(W-5,O-5,10,10)}c.restore()}},F=()=>{c.clearRect(0,0,w.width,w.height),c.drawImage(z,0,0);for(let l of d)As(l)},et=l=>{if(l.type==="rect")return{x:Math.min(l.x,l.x+l.w),y:Math.min(l.y,l.y+l.h),w:Math.abs(l.w),h:Math.abs(l.h)};if(l.type==="circle")return{x:l.cx-Math.abs(l.rx),y:l.cy-Math.abs(l.ry),w:Math.abs(l.rx)*2,h:Math.abs(l.ry)*2};if(l.type==="arrow"){let I=Math.min(l.x1,l.x2),_=Math.min(l.y1,l.y2);return{x:I,y:_,w:Math.abs(l.x2-l.x1)||20,h:Math.abs(l.y2-l.y1)||20}}if(l.type==="text")return{x:l.x,y:l.y-(l.size*5+12),w:l.text.length*(l.size*3+8),h:l.size*5+16};if(l.points.length===0)return{x:0,y:0,w:0,h:0};let f=1/0,h=1/0,A=-1/0,m=-1/0;for(let I of l.points)f=Math.min(f,I.x),h=Math.min(h,I.y),A=Math.max(A,I.x),m=Math.max(m,I.y);return{x:f,y:h,w:A-f||10,h:m-h||10}},Ct=(l,f)=>{for(let h=d.length-1;h>=0;h--){let A=et(d[h]),m=8;if(l>=A.x-m&&l<=A.x+A.w+m&&f>=A.y-m&&f<=A.y+A.h+m)return h}return-1},Is=(l,f,h)=>{if(l.type==="draw"||l.type==="highlight")for(let A of l.points)A.x+=f,A.y+=h;else l.type==="rect"?(l.x+=f,l.y+=h):l.type==="circle"?(l.cx+=f,l.cy+=h):l.type==="arrow"?(l.x1+=f,l.y1+=h,l.x2+=f,l.y2+=h):l.type==="text"&&(l.x+=f,l.y+=h)};z.onload=()=>{let f=(e.clientWidth||450)/z.width;w.width=z.width,w.height=z.height,w.style.height=`${z.height*f}px`,c=w.getContext("2d"),c.drawImage(z,0,0);let h=[[10,10],[w.width-10,10],[10,w.height-10],[w.width-10,w.height-10],[w.width/2,w.height/2]],A=0;for(let[O,u]of h){let y=c.getImageData(O,u,1,1).data;A+=(y[0]*299+y[1]*587+y[2]*114)/1e3}a=A/h.length<128;let m=O=>{let u=w.getBoundingClientRect();return{x:(O.clientX-u.left)*(w.width/u.width),y:(O.clientY-u.top)*(w.height/u.height)}},I=!1;w.addEventListener("mousedown",O=>{let u=m(O);if(s==="select"){let y=Ct(u.x,u.y);if(y>=0){b=y,k=!0;let T=et(d[y]);ue=u.x-T.x,ye=u.y-T.y,w.classList.add("bs-grabbing"),w.classList.remove("bs-grab"),F()}else b=-1,F();return}if(s!=="pin"&&s!=="text"){let y=Ct(u.x,u.y);if(y>=0){b=y,k=!0,I=!0;let T=et(d[y]);ue=u.x-T.x,ye=u.y-T.y,w.classList.add("bs-grabbing"),F();return}}if(S=!0,N=u.x,H=u.y,s==="pin"){S=!1;let y=prompt("Describe the issue at this spot:");if(y){let T=D[p.length%D.length];p.push({x:u.x,y:u.y,note:y,color:T}),Lt()}return}if(s==="text"){S=!1;let y=prompt("Enter text:");y&&(d.push({type:"text",color:r,size:o,x:u.x,y:u.y,text:y}),F());return}(s==="draw"||s==="highlight")&&(E=[{x:u.x,y:u.y}])}),w.addEventListener("mousemove",O=>{let u=m(O);if(k&&b>=0){let y=et(d[b]),T=u.x-ue-y.x,$=u.y-ye-y.y;Is(d[b],T,$),F();return}if(s==="select"){let y=Ct(u.x,u.y);w.classList.toggle("bs-grab",y>=0),v!==y&&(v=y,F());return}if(s!=="pin"&&s!=="text"&&!S){let y=Ct(u.x,u.y);w.classList.toggle("bs-grab",y>=0),v!==y&&(v=y,F())}if(S){if(s==="draw"||s==="highlight"){E.push({x:u.x,y:u.y}),F();let y=s==="highlight"?.25:1,T=s==="highlight"?o*4+10:o;if(s!=="highlight"){c.save(),c.strokeStyle=cn(),c.lineWidth=T+3,c.lineCap="round",c.lineJoin="round",c.globalAlpha=.5,c.beginPath(),c.moveTo(E[0].x,E[0].y);for(let $=1;$<E.length;$++)c.lineTo(E[$].x,E[$].y);c.stroke(),c.restore()}c.strokeStyle=r,c.lineWidth=T,c.lineCap="round",c.lineJoin="round",c.globalAlpha=y,c.beginPath(),c.moveTo(E[0].x,E[0].y);for(let $=1;$<E.length;$++)c.lineTo(E[$].x,E[$].y);c.stroke(),c.globalAlpha=1}else if(F(),c.strokeStyle=r,c.lineWidth=o,c.lineCap="round",c.lineJoin="round",s==="rect")Ce(()=>c.strokeRect(N,H,u.x-N,u.y-H),o),c.strokeStyle=r,c.lineWidth=o,c.strokeRect(N,H,u.x-N,u.y-H);else if(s==="circle"){let y=Math.abs(u.x-N)/2,T=Math.abs(u.y-H)/2,$=N+(u.x-N)/2,Xn=H+(u.y-H)/2;Ce(()=>{c.beginPath(),c.ellipse($,Xn,y,T,0,0,Math.PI*2),c.stroke()},o),c.strokeStyle=r,c.lineWidth=o,c.beginPath(),c.ellipse($,Xn,y,T,0,0,Math.PI*2),c.stroke()}else if(s==="arrow"){let y=Math.atan2(u.y-H,u.x-N),T=12+o*2,$=()=>{c.beginPath(),c.moveTo(N,H),c.lineTo(u.x,u.y),c.stroke(),c.beginPath(),c.moveTo(u.x,u.y),c.lineTo(u.x-T*Math.cos(y-.45),u.y-T*Math.sin(y-.45)),c.moveTo(u.x,u.y),c.lineTo(u.x-T*Math.cos(y+.45),u.y-T*Math.sin(y+.45)),c.stroke()};Ce($,o),c.strokeStyle=r,c.lineWidth=o,c.lineCap="round",c.lineJoin="round",$()}}});let _=O=>{if(k)return k=!1,I=!1,b=-1,w.classList.remove("bs-grabbing"),w.classList.remove("bs-grab"),F(),void 0;if(!S)return;S=!1;let u=m(O);if(s==="draw"||s==="highlight")E.length>1&&d.push({type:s,color:r,size:o,alpha:s==="highlight"?.25:1,points:[...E]}),E=[];else if(s==="rect")d.push({type:"rect",color:r,size:o,x:N,y:H,w:u.x-N,h:u.y-H});else if(s==="circle"){let y=Math.abs(u.x-N)/2,T=Math.abs(u.y-H)/2;d.push({type:"circle",color:r,size:o,cx:N+(u.x-N)/2,cy:H+(u.y-H)/2,rx:y,ry:T})}else s==="arrow"&&d.push({type:"arrow",color:r,size:o,x1:N,y1:H,x2:u.x,y2:u.y});F()};w.addEventListener("mouseup",_),w.addEventListener("mouseleave",O=>{k?(k=!1,I=!1,w.classList.remove("bs-grabbing"),w.classList.remove("bs-grab"),F()):S&&_(O)});let W=O=>{b>=0&&(O.key==="Delete"||O.key==="Backspace")&&(d.splice(b,1),b=-1,F())};document.addEventListener("keydown",W),Wn.addEventListener("click",()=>{d.length&&(d.pop(),b=-1,F())}),Yn.addEventListener("click",()=>{d.length=0,p.length=0,b=-1,F(),Lt()})};let Rs=()=>{for(let l=0;l<p.length;l++){let f=p[l],h=16;c.beginPath(),c.arc(f.x,f.y-h,h,0,Math.PI*2),c.fillStyle=f.color,c.fill(),c.strokeStyle="#fff",c.lineWidth=2,c.stroke(),c.beginPath(),c.moveTo(f.x-8,f.y-6),c.lineTo(f.x,f.y+4),c.lineTo(f.x+8,f.y-6),c.fillStyle=f.color,c.fill(),c.fillStyle="#fff",c.font="bold 14px Inter, sans-serif",c.textAlign="center",c.textBaseline="middle",c.fillText(`${l+1}`,f.x,f.y-h),c.textAlign="start",c.textBaseline="alphabetic"}};return{getAnnotation:()=>{try{return b=-1,F(),Rs(),w.toDataURL("image/jpeg",.7)}catch{return null}},getPins:()=>p.map((l,f)=>({number:f+1,x:Math.round(l.x),y:Math.round(l.y),note:l.note}))}}function gt(e){if(!g)return;Ge=e,g.querySelectorAll(".bs-tab").forEach(r=>{r.classList.toggle("bs-active",r.dataset.tab===e)});let t=g.querySelector(".bs-scroll"),n={report:vs,console:ei,network:ti,context:ni,history:ri,settings:si};t.innerHTML=n[e](),t.scrollTop=0,ys()}function ys(){if(!g)return;if(Ge==="history"){g.querySelectorAll("[data-hist-del]").forEach(n=>{n.addEventListener("click",()=>{let r=parseInt(n.dataset.histDel),s=g.querySelector(`[data-hist-id="${r}"]`);if(!s)return;let o=s.querySelector(".bs-hist-confirm");if(o){o.remove();return}let i=document.createElement("div");i.className="bs-hist-confirm",i.innerHTML="<span>Delete this report?</span>";let a=document.createElement("button");a.type="button",a.className="bs-hist-confirm-yes",a.textContent="Delete";let d=document.createElement("button");d.type="button",d.className="bs-hist-confirm-no",d.textContent="Cancel",a.addEventListener("click",()=>{Qo(r),gt("history")}),d.addEventListener("click",()=>i.remove()),i.appendChild(a),i.appendChild(d),s.appendChild(i)})}),g.querySelectorAll("[data-hist-edit]").forEach(n=>{n.addEventListener("click",()=>{let r=parseInt(n.dataset.histEdit),s=g.querySelector(`[data-hist-id="${r}"]`);if(!s)return;let o=s.querySelector(".bs-hist-edit-wrap");if(o){o.remove();return}s.querySelector(".bs-hist-confirm")?.remove();let i=Qe().find(k=>k.id===r);if(!i)return;let a=document.createElement("div");a.className="bs-hist-edit-wrap",a.innerHTML=`
|
|
1787
1922
|
<div class="bs-field" style="margin-bottom:8px">
|
|
1788
1923
|
<input class="bs-input" data-edit-title value="${j(i.title)}" />
|
|
1789
1924
|
</div>
|
|
@@ -1798,14 +1933,14 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
1798
1933
|
<button type="button" class="bs-sev-btn bs-sev-critical${i.severity==="critical"?" bs-picked":""}" data-edit-sev="critical">Critical</button>
|
|
1799
1934
|
</div>
|
|
1800
1935
|
</div>
|
|
1801
|
-
<div class="bs-hist-edit-row"></div>`;let
|
|
1936
|
+
<div class="bs-hist-edit-row"></div>`;let d=i.severity;s.appendChild(a),a.querySelectorAll("[data-edit-sev]").forEach(k=>{k.addEventListener("click",()=>{d=k.dataset.editSev,a.querySelectorAll(".bs-sev-btn").forEach(S=>S.classList.remove("bs-picked")),k.classList.add("bs-picked")})});let p=a.querySelector(".bs-hist-edit-row"),b=document.createElement("button");b.type="button",b.className="bs-hist-save",b.textContent="Save";let v=document.createElement("button");v.type="button",v.className="bs-hist-cancel",v.textContent="Cancel",b.addEventListener("click",()=>{let k=a.querySelector("[data-edit-title]").value.trim(),S=a.querySelector("[data-edit-desc]").value.trim();k&&(Zo(r,{title:k,description:S,severity:d}),gt("history"))}),v.addEventListener("click",()=>a.remove()),p.appendChild(b),p.appendChild(v)})});return}if(Ge==="settings"){g.querySelectorAll("[data-set-theme]").forEach(n=>{n.addEventListener("click",()=>{let r=n.dataset.setTheme;ht(r),g.querySelectorAll("[data-set-theme]").forEach(s=>s.classList.remove("bs-picked")),n.classList.add("bs-picked")})}),g.querySelectorAll("[data-set-layout]").forEach(n=>{n.addEventListener("click",()=>{let r=n.dataset.setLayout,s=pt(r);s&&(Me=s,re(),setTimeout(()=>{Ge="settings",le(),setTimeout(()=>gt("settings"),50)},400))})});return}if(Ge!=="report")return;g.querySelectorAll(".bs-cat-btn").forEach(n=>{n.addEventListener("click",()=>{let r=n.dataset.cat;g.querySelector('input[name="category"]').value=r,g.querySelectorAll(".bs-cat-btn").forEach(s=>s.classList.remove("bs-picked")),n.classList.add("bs-picked")})}),g.querySelectorAll(".bs-sev-btn").forEach(n=>{n.addEventListener("click",()=>{let r=n.dataset.sev;g.querySelector('input[name="severity"]').value=r,g.querySelectorAll(".bs-sev-btn").forEach(s=>s.classList.remove("bs-picked")),n.classList.add("bs-picked")})});let e=null,t=null;g.querySelector("[data-bs-screenshot]")?.addEventListener("click",async()=>{let n=g?.querySelector("[data-bs-shot-title]"),r=g?.querySelector("[data-bs-shot-sub]"),s=g?.querySelector("[data-bs-screenshot]");if(n&&(n.textContent="Capturing..."),g&&(g.style.visibility="hidden"),te&&(te.style.visibility="hidden"),await new Promise(o=>setTimeout(o,200)),e=await jt(!0),g&&(g.style.visibility=""),te&&(te.style.visibility=""),e){n&&(n.textContent="Screenshot captured!"),r&&(r.textContent="Draw on the image below to highlight the issue"),s?.classList.add("bs-captured");let o=g?.querySelector("[data-bs-annotate]");o&&(t=oi(o,e))}else n&&(n.textContent="Screenshot unavailable"),r&&(r.textContent="Could not capture screenshot on this page")}),g.querySelector("[data-bs-form]")?.addEventListener("submit",async n=>{n.preventDefault();let r=n.target,s=r.querySelector(".bs-submit-btn"),o=r.elements.namedItem("title").value.trim(),i=r.elements.namedItem("description").value.trim(),a=r.elements.namedItem("severity").value,d=r.elements.namedItem("category").value;if(!o)return;s.disabled=!0,s.textContent="Sending...";let p=hs(),b={projectId:G.projectId,title:o,description:i,category:d,severity:a,tags:p.tags.length?p.tags:void 0,context:gs(),consoleLogs:fe(),errors:ge(),networkCaptures:xe(),breadcrumbs:Ie(),performance:De()??void 0,screenshot:e??void 0,annotation:t?.getAnnotation()??void 0,pins:t?.getPins().length?t.getPins():void 0,createdAt:Date.now()},v=await kn(b);Go({title:b.title,description:b.description,category:b.category,severity:b.severity,tags:b.tags,screenshot:b.screenshot,pins:b.pins,url:window.location.href,createdAt:b.createdAt,status:v.success?"sent":"draft"}),v.success?(s.innerHTML=`${B.check} Bug reported!`,s.classList.add("bs-submit-ok"),setTimeout(re,1200)):(s.textContent=v.error??"Failed \u2014 saved as draft",s.classList.add("bs-submit-err"),setTimeout(()=>{s.disabled=!1,s.textContent="Submit Report",s.classList.remove("bs-submit-err")},2500))})}function le(){if(!Te||K)return;K=!0,Ge="report",Bn(),J&&(J.style.display="",J.style.pointerEvents="auto"),te=Te.createElement("div"),te.className="bs-backdrop",Te.body.appendChild(te);let e=xe().length,t=ge().length;g=Te.createElement("div"),g.className=`bs-modal bs-ly-${Me.id}`,Ee(g);let n=`
|
|
1802
1937
|
<div class="bs-tabs">
|
|
1803
|
-
<button class="bs-tab bs-active" data-tab="report">${
|
|
1804
|
-
<button class="bs-tab" data-tab="console">${
|
|
1805
|
-
<button class="bs-tab" data-tab="network">${
|
|
1806
|
-
<button class="bs-tab" data-tab="context">${
|
|
1807
|
-
<button class="bs-tab" data-tab="history">${
|
|
1808
|
-
</div>`,r=
|
|
1938
|
+
<button class="bs-tab bs-active" data-tab="report">${B.report} Report</button>
|
|
1939
|
+
<button class="bs-tab" data-tab="console">${B.console} Console <span class="bs-tab-badge">${fe().length}</span></button>
|
|
1940
|
+
<button class="bs-tab" data-tab="network">${B.network} Network ${e?`<span class="bs-tab-badge bs-warn">${e}</span>`:`<span class="bs-tab-badge">${He().length}</span>`}</button>
|
|
1941
|
+
<button class="bs-tab" data-tab="context">${B.ctx} Context ${t?`<span class="bs-tab-badge bs-warn">${t}</span>`:""}</button>
|
|
1942
|
+
<button class="bs-tab" data-tab="history">${B.history} History <span class="bs-tab-badge">${Qe().length}</span></button>
|
|
1943
|
+
</div>`,r=ie(),s=r?r.name.split(" ").map(v=>v[0]).join("").toUpperCase().slice(0,2):"",o=en(),i=r?`
|
|
1809
1944
|
<div class="bs-hdr">
|
|
1810
1945
|
<div class="bs-logo">BugStash</div>
|
|
1811
1946
|
<div class="bs-hdr-right">
|
|
@@ -1817,39 +1952,39 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
1817
1952
|
<div class="bs-user-avatar">${s}</div>
|
|
1818
1953
|
<span>${r.name.split(" ")[0]}</span>
|
|
1819
1954
|
</div>
|
|
1820
|
-
<button class="bs-hdr-icon" data-tab="settings" title="Settings">${
|
|
1955
|
+
<button class="bs-hdr-icon" data-tab="settings" title="Settings">${B.settings}</button>
|
|
1821
1956
|
<button class="bs-login-logout" data-bs-logout title="Sign out">Logout</button>
|
|
1822
|
-
<button class="bs-close-btn" data-bs-close title="Close">${
|
|
1957
|
+
<button class="bs-close-btn" data-bs-close title="Close">${B.x}</button>
|
|
1823
1958
|
</div>
|
|
1824
1959
|
</div>`:`
|
|
1825
1960
|
<div class="bs-hdr" style="justify-content:flex-end">
|
|
1826
|
-
<button class="bs-close-btn" data-bs-close title="Close">${
|
|
1827
|
-
</div>`,a=
|
|
1961
|
+
<button class="bs-close-btn" data-bs-close title="Close">${B.x}</button>
|
|
1962
|
+
</div>`,a=Me.tabPosition==="left",d=Me.tabPosition==="bottom",p=r?vs():Jo();a?g.innerHTML=`
|
|
1828
1963
|
${i}
|
|
1829
1964
|
<div class="bs-body-wrap">
|
|
1830
1965
|
${r?n:""}
|
|
1831
1966
|
<div class="bs-scroll">${p}</div>
|
|
1832
|
-
</div>`:
|
|
1967
|
+
</div>`:d?g.innerHTML=`
|
|
1833
1968
|
${i}
|
|
1834
1969
|
<div class="bs-scroll">${p}</div>
|
|
1835
1970
|
${r?`<div class="bs-tab-divider"></div>${n}`:""}`:g.innerHTML=`
|
|
1836
1971
|
${i}
|
|
1837
1972
|
${r?`${n}<div class="bs-tab-divider"></div>`:""}
|
|
1838
|
-
<div class="bs-scroll">${p}</div>`,
|
|
1973
|
+
<div class="bs-scroll">${p}</div>`,Te.body.appendChild(g),x&&x.classList.add("bs-open"),requestAnimationFrame(()=>{te?.classList.add("bs-in"),g?.classList.add("bs-in")}),g.querySelectorAll(".bs-tab").forEach(v=>{v.addEventListener("click",()=>gt(v.dataset.tab))}),g.querySelector('.bs-hdr-icon[data-tab="settings"]')?.addEventListener("click",()=>gt("settings")),g.querySelector("[data-bs-close]")?.addEventListener("click",re),te.addEventListener("click",re),g.querySelector("[data-bs-pin-toggle]")?.addEventListener("click",()=>{let v=Pe(),k=g?.querySelector("[data-bs-pin-toggle]");k&&(k.classList.toggle("active",v),k.innerHTML=`
|
|
1839
1974
|
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
|
|
1840
1975
|
Pins ${v?"ON":"OFF"}
|
|
1841
|
-
`)}),g.querySelector("[data-bs-logout]")?.addEventListener("click",()=>{
|
|
1976
|
+
`)}),g.querySelector("[data-bs-logout]")?.addEventListener("click",()=>{_t(),re(),setTimeout(()=>le(),300)}),r?ys():ii();let b=v=>{v.key==="Escape"&&(re(),document.removeEventListener("keydown",b))};document.addEventListener("keydown",b)}function ii(){if(!g)return;let e=g.querySelector("#bs-login-submit"),t=g.querySelector("#bs-login-email"),n=g.querySelector("#bs-login-pass"),r=g.querySelector("#bs-login-error");if(!e||!t||!n)return;let s=async()=>{let o=t.value.trim(),i=n.value;if(!o||!i){r.textContent="Please enter email and password",r.style.display="block";return}e.setAttribute("disabled","true"),e.textContent="Signing in...",r.style.display="none";let a=await Ut(o,i,G.projectId);a.success?(Je(G.projectId,ne),We(G.projectId),re(),setTimeout(()=>le(),300)):(r.textContent=a.error||"Invalid credentials",r.style.display="block",e.removeAttribute("disabled"),e.textContent="Sign In")};e.addEventListener("click",s),n.addEventListener("keydown",o=>{o.key==="Enter"&&s()}),t.addEventListener("keydown",o=>{o.key==="Enter"&&n.focus()}),setTimeout(()=>t.focus(),100)}function re(){K&&(x&&x.classList.remove("bs-open"),g&&(g.classList.remove("bs-in"),g.classList.add("bs-out")),te&&te.classList.remove("bs-in"),setTimeout(()=>{g?.remove(),te?.remove(),g=null,te=null,K=!1,J&&(J.style.display="none",J.style.pointerEvents="none")},350))}function Ee(e){for(let[t,n]of Object.entries(ae.vars))e.style.setProperty(t,n)}function ht(e){let t=Yt(e);t&&(ae=t,g&&Ee(g),x&&Ee(x),P&&Ee(P))}function xs(){return ae.id}function ws(e){let t=pt(e);t&&(Me=t,K&&(re(),setTimeout(le,400)))}function ks(){return Me.id}function ai(){try{let e=localStorage.getItem(us);if(!e)return null;let t=JSON.parse(e);if(typeof t.top=="number"&&typeof t.left=="number")return t}catch{}return null}function li(e,t){try{localStorage.setItem(us,JSON.stringify({top:e,left:t}))}catch{}}function ci(e,t){let s=window.innerWidth,o=window.innerHeight;return{top:Math.max(8,Math.min(o-56-8,e)),left:Math.max(8,Math.min(s-56-8,t))}}function On(e,t){if(!x)return;let n=ci(e,t);x.style.top=`${n.top}px`,x.style.left=`${n.left}px`,x.style.bottom="auto",x.style.right="auto",Es(n.top,n.left)}function Es(e,t){if(!P)return;let n=56,r=8,s=P.offsetHeight||200,o=e-s-r;o<8&&(o=e+n+r),P.style.top=`${o}px`,P.style.bottom="auto",P.style.left=`${t+n/2-20}px`,P.style.right="auto"}function di(){if(!x)return;let e=0,t=0,n=0,r=0,s=!1;function o(){x&&(x.removeEventListener("pointermove",a),x.removeEventListener("pointerup",d),x.classList.remove("bs-dragging")),Dn=null}function i(p){if(!x)return;$e=!1,s=!1,e=p.clientX,t=p.clientY;let b=x.getBoundingClientRect();n=b.top,r=b.left,x.setPointerCapture(p.pointerId),x.addEventListener("pointermove",a),x.addEventListener("pointerup",d),Dn=o}function a(p){let b=p.clientX-e,v=p.clientY-t;if(!s&&Math.abs(b)<5&&Math.abs(v)<5)return;s=!0,$e=!0,x?.classList.add("bs-dragging");let k=n+v,S=r+b;On(k,S)}function d(p){if(x?.releasePointerCapture(p.pointerId),o(),s&&x){let b=x.getBoundingClientRect();li(b.top,b.left),p.preventDefault(),p.stopPropagation(),setTimeout(()=>{$e=!1},10)}else $e=!1}x.addEventListener("pointerdown",i)}function Ss(e,t){G=e,ne=t,Ke=document.createElement("link"),Ke.rel="stylesheet",Ke.href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@400;600;700&family=Inter:wght@300;400;500;600;700&display=swap",ne.appendChild(Ke),ft=document.createElement("style"),ft.textContent=Vo,ne.appendChild(ft),pi(e),J=document.createElement("iframe"),J.style.cssText="position:fixed;inset:0;z-index:2147483640;pointer-events:none;border:none;background:transparent;width:100%;height:100%;color-scheme:normal;display:none;";let n=`
|
|
1842
1977
|
@import url('https://fonts.googleapis.com/css2?family=Comfortaa:wght@400;600;700&family=Inter:wght@300;400;500;600;700&display=swap');
|
|
1843
|
-
${
|
|
1978
|
+
${Xo}
|
|
1844
1979
|
${Xr}
|
|
1845
1980
|
html, body { margin: 0; padding: 0; background: transparent; pointer-events: none; overflow: hidden; }
|
|
1846
|
-
`;
|
|
1981
|
+
`;J.srcdoc=`<!DOCTYPE html><html><head><style>${n}</style></head><body></body></html>`,J.addEventListener("load",()=>{Te=J.contentDocument}),ne.appendChild(J),bi(e),mt=()=>{if(!(!x||$e)&&x.style.top&&x.style.top!=="auto"){let r=x.getBoundingClientRect();On(r.top,r.left)}},window.addEventListener("resize",mt)}function pi(e){if(!ne)return;let t=e.panelPosition==="bottom-left"?"left":"right";x=document.createElement("button"),x.className="bs-fab",Ee(x),x.innerHTML=`${B.bug}<span class="bs-fab-label">Report a bug</span>`;let n=ai();n?On(n.top,n.left):x.style[t]="24px",x.addEventListener("click",()=>{$e||(K?re():le())}),ne.appendChild(x),di(),P=document.createElement("div"),P.className="bs-toolbar",n?Es(n.top,n.left):P.style[t]="32px",Ee(P);let s=navigator.platform.toUpperCase().includes("MAC")?"\u2318":"Ctrl",o=[{icon:B.cam,tip:"Screenshot",kbd:`${s}+Shift+S`,action:async()=>{let i=await jt(!0);i&&(K||le(),setTimeout(()=>{let a=g?.querySelector("[data-bs-screenshot]");if(a){a.__screenshot=i,a.classList.add("bs-captured");let d=a.querySelector("[data-bs-shot-title]"),p=a.querySelector("[data-bs-shot-sub]");d&&(d.textContent="Screenshot captured!"),p&&(p.textContent="Click to retake or annotate"),a.click()}},400))}},{icon:B.pin,tip:"Toggle Pins",kbd:`${s}+Shift+P`,id:"bs-tb-pin",action:()=>{if(!ie()){K||le();return}ne?.querySelector("#bugstash-live-pins")||(Je(G.projectId,ne),We(G.projectId));let a=Pe(),d=P?.querySelector("#bs-tb-pin");d&&d.classList.toggle("bs-active",a);let p=g?.querySelector("[data-bs-pin-toggle]");p&&(p.classList.toggle("active",a),p.innerHTML=`
|
|
1847
1982
|
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
|
|
1848
1983
|
Pins ${a?"ON":"OFF"}
|
|
1849
|
-
`)}},{icon:
|
|
1984
|
+
`)}},{icon:ae.id==="black"?B.sun:B.moon,tip:"Toggle Theme",kbd:`${s}+Shift+T`,id:"bs-tb-theme",action:()=>{let i=ae.id==="black"?"white":"black";ht(i),P&&Ee(P);let a=P?.querySelector("#bs-tb-theme");a&&(a.innerHTML=`${ae.id==="black"?B.sun:B.moon}<span class="bs-toolbar-tip">${ae.id==="black"?"Light":"Dark"} Mode<span class="bs-toolbar-kbd">${s}+Shift+T</span></span>`)}},{icon:B.report,tip:"Open Panel",kbd:`${s}+Shift+B`,action:()=>{K?re():le()}}];for(let i of o){let a=document.createElement("button");a.className="bs-toolbar-btn",i.id&&(a.id=i.id),a.innerHTML=`${i.icon}<span class="bs-toolbar-tip">${i.tip}<span class="bs-toolbar-kbd">${i.kbd}</span></span>`,a.addEventListener("click",d=>{d.stopPropagation(),i.action()}),P.appendChild(a)}ne.appendChild(P),x.addEventListener("mouseenter",()=>{K||bs()}),x.addEventListener("mouseleave",i=>{let a=i.relatedTarget;P?.contains(a)||Bn()}),P.addEventListener("mouseenter",()=>bs()),P.addEventListener("mouseleave",i=>{let a=i.relatedTarget;x?.contains(a)||Bn()})}function bi(e){let n=navigator.platform.toUpperCase().includes("MAC")?"\u2318":"Ctrl";ut=r=>{if((r.ctrlKey||r.metaKey)&&r.shiftKey){if(r.key==="B"||r.key==="b")r.preventDefault(),K?re():le();else if(r.key==="S"||r.key==="s")r.preventDefault(),jt(!0).then(o=>{o&&(K||le(),setTimeout(()=>{let i=g?.querySelector("[data-bs-screenshot]");if(i){i.__screenshot=o,i.classList.add("bs-captured");let a=i.querySelector("[data-bs-shot-title]"),d=i.querySelector("[data-bs-shot-sub]");a&&(a.textContent="Screenshot captured!"),d&&(d.textContent="Click to retake or annotate"),i.click()}},400))});else if(r.key==="P"||r.key==="p"){if(r.preventDefault(),!ie()){K||le();return}ne?.querySelector("#bugstash-live-pins")||(Je(e.projectId,ne),We(e.projectId));let i=Pe(),a=P?.querySelector("#bs-tb-pin");a&&a.classList.toggle("bs-active",i);let d=g?.querySelector("[data-bs-pin-toggle]");d&&(d.classList.toggle("active",i),d.innerHTML=`
|
|
1850
1985
|
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
|
|
1851
1986
|
Pins ${i?"ON":"OFF"}
|
|
1852
|
-
`)}else if(r.key==="T"||r.key==="t"){r.preventDefault();let i=navigator.platform.toUpperCase().includes("MAC")?"\u2318":"Ctrl",a=
|
|
1987
|
+
`)}else if(r.key==="T"||r.key==="t"){r.preventDefault();let i=navigator.platform.toUpperCase().includes("MAC")?"\u2318":"Ctrl",a=ae.id==="black"?"white":"black";ht(a),P&&Ee(P);let d=P?.querySelector("#bs-tb-theme");d&&(d.innerHTML=`${ae.id==="black"?B.sun:B.moon}<span class="bs-toolbar-tip">${ae.id==="black"?"Light":"Dark"} Mode<span class="bs-toolbar-kbd">${i}+Shift+T</span></span>`)}}},document.addEventListener("keydown",ut)}function bs(){tn||K||(tn=!0,P?.classList.add("bs-show"))}function Bn(){tn=!1,P?.classList.remove("bs-show")}function Ls(){re(),Dn?.(),$e=!1,x?.remove(),x=null,P?.remove(),P=null,tn=!1,ft?.remove(),ft=null,Ke?.remove(),Ke=null,J?.remove(),J=null,Te=null,ne=null,ut&&document.removeEventListener("keydown",ut),ut=null,mt&&window.removeEventListener("resize",mt),mt=null}var be=null,q=null,C=null,ve=null,nn="freehand",rn="#ef4444",ui=3,Ze=[],Q=null,vt=!1,sn=null,mi=[{id:"freehand",label:"Draw",icon:"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25z"},{id:"rectangle",label:"Rect",icon:"M3 3h18v18H3V3zm2 2v14h14V5H5z"},{id:"circle",label:"Circle",icon:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"},{id:"arrow",label:"Arrow",icon:"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"}],fi=["#ef4444","#f97316","#eab308","#22c55e","#3b82f6","#8b5cf6","#ffffff","#000000"];function Ts(e){return new Promise(t=>{sn=t,Ze=[],Q=null,nn="freehand",rn="#ef4444",gi(e)})}function gi(e){be&&be.remove(),be=document.createElement("div"),be.id="bs-annotation-overlay";let t=document.createElement("style");t.textContent=`
|
|
1853
1988
|
#bs-annotation-overlay {
|
|
1854
1989
|
position: fixed; inset: 0; z-index: 2147483647;
|
|
1855
1990
|
background: rgba(0,0,0,0.85);
|
|
@@ -1894,5 +2029,5 @@ ${e.stack??""}`;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{
|
|
|
1894
2029
|
overflow: hidden; padding: 16px;
|
|
1895
2030
|
}
|
|
1896
2031
|
.bs-ann-canvas-wrap canvas { cursor: crosshair; border-radius: 4px; }
|
|
1897
|
-
`,
|
|
2032
|
+
`,be.appendChild(t);let n=document.createElement("div");n.className="bs-ann-toolbar";for(let a of mi){let d=document.createElement("button");d.className=`bs-ann-tool${a.id===nn?" active":""}`,d.title=a.label,d.innerHTML=`<svg viewBox="0 0 24 24"><path d="${a.icon}"/></svg>`,d.addEventListener("click",()=>{nn=a.id,n.querySelectorAll(".bs-ann-tool").forEach(p=>p.classList.remove("active")),d.classList.add("active")}),n.appendChild(d)}n.appendChild(Cs());for(let a of fi){let d=document.createElement("button");d.className=`bs-ann-color${a===rn?" active":""}`,d.style.background=a,d.addEventListener("click",()=>{rn=a,n.querySelectorAll(".bs-ann-color").forEach(p=>p.classList.remove("active")),d.classList.add("active")}),n.appendChild(d)}n.appendChild(Cs());let r=document.createElement("button");r.className="bs-ann-btn bs-ann-undo",r.textContent="Undo",r.addEventListener("click",()=>{Ze.pop(),on()}),n.appendChild(r);let s=document.createElement("button");s.className="bs-ann-btn bs-ann-save",s.textContent="Save",s.addEventListener("click",vi);let o=document.createElement("button");o.className="bs-ann-btn bs-ann-cancel",o.textContent="Cancel",o.addEventListener("click",()=>{jn(),sn?.(null)}),n.appendChild(s),n.appendChild(o),be.appendChild(n);let i=document.createElement("div");i.className="bs-ann-canvas-wrap",q=document.createElement("canvas"),C=q.getContext("2d"),i.appendChild(q),be.appendChild(i),document.body.appendChild(be),ve=new Image,ve.onload=()=>{if(!q||!C||!ve)return;let a=window.innerWidth-32,d=window.innerHeight-100,p=ve.width,b=ve.height,v=Math.min(1,a/p,d/b);p=Math.round(p*v),b=Math.round(b*v),q.width=p,q.height=b,on(),hi()},ve.src=e}function Cs(){let e=document.createElement("div");return e.className="bs-ann-sep",e}function hi(){if(!q)return;q.addEventListener("mousedown",t=>{vt=!0;let{x:n,y:r}=Ps(t);Q={type:nn,color:rn,lineWidth:ui,points:[{x:n,y:r}],x:n,y:r,width:0,height:0}}),q.addEventListener("mousemove",t=>{if(!vt||!Q)return;let{x:n,y:r}=Ps(t);Q.type==="freehand"?Q.points.push({x:n,y:r}):(Q.width=n-Q.x,Q.height=r-Q.y),on(),$s(Q)});let e=()=>{vt&&Q&&(Ze.push(Q),Q=null),vt=!1,on()};q.addEventListener("mouseup",e),q.addEventListener("mouseleave",e)}function Ps(e){let t=q.getBoundingClientRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}function on(){if(!(!C||!q||!ve)){C.clearRect(0,0,q.width,q.height),C.drawImage(ve,0,0,q.width,q.height);for(let e of Ze)$s(e)}}function $s(e){if(C)switch(C.strokeStyle=e.color,C.fillStyle=e.color,C.lineWidth=e.lineWidth,C.lineCap="round",C.lineJoin="round",e.type){case"freehand":{if(!e.points||e.points.length<2)return;C.beginPath(),C.moveTo(e.points[0].x,e.points[0].y);for(let t=1;t<e.points.length;t++)C.lineTo(e.points[t].x,e.points[t].y);C.stroke();break}case"rectangle":{C.strokeRect(e.x,e.y,e.width,e.height);break}case"circle":{let t=e.x+e.width/2,n=e.y+e.height/2,r=Math.abs(e.width)/2,s=Math.abs(e.height)/2;C.beginPath(),C.ellipse(t,n,r,s,0,0,Math.PI*2),C.stroke();break}case"arrow":{let t=e.x,n=e.y,r=e.x+e.width,s=e.y+e.height,o=14,i=Math.atan2(s-n,r-t);C.beginPath(),C.moveTo(t,n),C.lineTo(r,s),C.stroke(),C.beginPath(),C.moveTo(r,s),C.lineTo(r-o*Math.cos(i-Math.PI/6),s-o*Math.sin(i-Math.PI/6)),C.lineTo(r-o*Math.cos(i+Math.PI/6),s-o*Math.sin(i+Math.PI/6)),C.closePath(),C.fill();break}}}function vi(){if(!q){jn(),sn?.(null);return}let t={dataUrl:q.toDataURL("image/png"),annotations:Ze};jn(),sn?.(t)}function jn(){be?.remove(),be=null,q=null,C=null,ve=null,Ze=[],Q=null,vt=!1}var xt=!1,yt=null;function yi(){if(yt)return yt;let e=document.createElement("bugstash-root");return e.style.setProperty("position","fixed","important"),e.style.setProperty("inset","0","important"),e.style.setProperty("pointer-events","none","important"),e.style.setProperty("z-index","2147483640","important"),e.style.setProperty("display","block","important"),e.style.setProperty("visibility","visible","important"),e.style.setProperty("opacity","1","important"),e.style.setProperty("transform","none","important"),e.style.setProperty("perspective","none","important"),e.style.setProperty("filter","none","important"),e.style.setProperty("will-change","auto","important"),e.style.setProperty("contain","none","important"),e.style.setProperty("isolation","auto","important"),e.style.setProperty("mix-blend-mode","normal","important"),e.style.setProperty("clip-path","none","important"),e.style.setProperty("margin","0","important"),e.style.setProperty("padding","0","important"),e.style.setProperty("border","none","important"),e.style.setProperty("background","none","important"),e.style.setProperty("box-sizing","border-box","important"),e.style.setProperty("overflow","visible","important"),e.style.setProperty("min-width","0","important"),e.style.setProperty("min-height","0","important"),e.style.setProperty("max-width","none","important"),e.style.setProperty("max-height","none","important"),e.style.setProperty("float","none","important"),e.style.setProperty("clear","none","important"),e.style.setProperty("columns","auto","important"),e.style.setProperty("font-size","16px","important"),e.style.setProperty("line-height","normal","important"),e.style.setProperty("text-align","left","important"),e.style.setProperty("direction","ltr","important"),yt=e.attachShadow({mode:"closed"}),document.body.appendChild(e),yt}function Ms(e){if(xt)return;xt=!0;let t=yi();Jn(e.maxBreadcrumbs),er(e.maxLogs),or(e.maxNetworkCaptures),lr(),e.enablePerformance!==!1&&pr(),Ss(e,t),e.enableLivePins!==!1&&ie()&&(Je(e.projectId,t),We(e.projectId))}function xi(){if(typeof window>"u")return"production";let e=window.location.hostname;return e==="localhost"||e==="127.0.0.1"||e==="0.0.0.0"||e.endsWith(".local")||/^192\.168\./.test(e)||/^10\./.test(e)||/^172\.(1[6-9]|2\d|3[01])\./.test(e)?"development":e.includes("staging")||e.includes("stage")||e.includes("preview")||e.includes("preprod")||e.includes("pre-prod")||e.includes("qa.")||e.includes(".qa")||e.includes("test.")||e.includes(".dev.")||e.includes("vercel.app")||e.includes("netlify.app")||e.includes("pages.dev")||e.includes("ngrok.io")||e.includes("ngrok-free.app")||e.includes("localhost.run")||e.includes("loca.lt")?"staging":"production"}var wi={init(e){if(xt||typeof window>"u"||(e.environment??xi())==="production")return;e.endpoint&&Hr(e.endpoint);let n=window.location.hostname;n==="localhost"||n==="127.0.0.1"||n==="0.0.0.0"||n.endsWith(".local")||/^192\.168\./.test(n)||/^10\./.test(n)||/^172\.(1[6-9]|2\d|3[01])\./.test(n)?Ms(e):_r(e.projectId).then(s=>{s&&Ms(e)}).catch(()=>{})},destroy(){xt&&(Ls(),is(),Jr(),nr(),ar(),dr(),Gn(),br(),document.querySelector("bugstash-root")?.remove(),yt=null,xt=!1)},getLogs:fe,clearLogs:tr,getNetworkCaptures:He,getFailedNetworkCaptures:xe,clearNetworkCaptures:ir,getErrors:ge,clearErrors:cr,getBreadcrumbs:Ie,clearBreadcrumbs:Kn,getPerformanceMetrics:De,addBreadcrumb:V,getThemes:Wt,getThemeById:Yt,setTheme:ht,getCurrentThemeId:xs,getLayouts:Xt,getLayoutById:pt,setLayout:ws,getCurrentLayoutId:ks,getCurrentUser:ie,login:Ut,logout:_t,togglePinMode:Pe,isPinModeActive:en,isConnected:Kr,openAnnotationEditor:Ts,redactString:Re,redactObject:Tt},Qa=wi;export{wi as BugStash,Qa as default};
|
|
1898
2033
|
//# sourceMappingURL=index.js.map
|