@makefully/notefully 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,6 +22,7 @@ Notefully.init({
22
22
  name: pkg.name, // optional report prefix; falls back to project default slug
23
23
  theme: 'maker', // maker | all-business | brighter-day | quiet-night
24
24
  video: false, // default; set true to enable screen recording
25
+ consoleLogLimit: 10, // most recent console lines attached to each report (0–80)
25
26
  hideLauncher: true // optional; drive open/submit from your own UI
26
27
  });
27
28
 
@@ -1,20 +1,20 @@
1
- var Notefully=(function(P){"use strict";function pe(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;const n=document.implementation.createHTMLDocument(),r=n.createElement("base"),i=n.createElement("a");return n.head.appendChild(r),n.body.appendChild(i),e&&(r.href=e),i.href=t,i.href}const me=(()=>{let t=0;const e=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(t+=1,`u${e()}${t}`)})();function A(t){const e=[];for(let n=0,r=t.length;n<r;n++)e.push(t[n]);return e}let j=null;function kt(t={}){return j||(t.includeStyleProperties?(j=t.includeStyleProperties,j):(j=A(window.getComputedStyle(document.documentElement)),j))}function Y(t,e){const r=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return r?parseFloat(r.replace("px","")):0}function ye(t){const e=Y(t,"border-left-width"),n=Y(t,"border-right-width");return t.clientWidth+e+n}function ge(t){const e=Y(t,"border-top-width"),n=Y(t,"border-bottom-width");return t.clientHeight+e+n}function Tt(t,e={}){const n=e.width||ye(t),r=e.height||ge(t);return{width:n,height:r}}function we(){let t,e;try{e=process}catch{}const n=e&&e.env?e.env.devicePixelRatio:null;return n&&(t=parseInt(n,10),Number.isNaN(t)&&(t=1)),t||window.devicePixelRatio||1}const E=16384;function be(t){(t.width>E||t.height>E)&&(t.width>E&&t.height>E?t.width>t.height?(t.height*=E/t.width,t.width=E):(t.width*=E/t.height,t.height=E):t.width>E?(t.height*=E/t.width,t.width=E):(t.width*=E/t.height,t.height=E))}function G(t){return new Promise((e,n)=>{const 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 ve(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function Se(t,e,n){const r="http://www.w3.org/2000/svg",i=document.createElementNS(r,"svg"),a=document.createElementNS(r,"foreignObject");return i.setAttribute("width",`${e}`),i.setAttribute("height",`${n}`),i.setAttribute("viewBox",`0 0 ${e} ${n}`),a.setAttribute("width","100%"),a.setAttribute("height","100%"),a.setAttribute("x","0"),a.setAttribute("y","0"),a.setAttribute("externalResourcesRequired","true"),i.appendChild(a),a.appendChild(t),ve(i)}const x=(t,e)=>{if(t instanceof e)return!0;const n=Object.getPrototypeOf(t);return n===null?!1:n.constructor.name===e.name||x(n,e)};function xe(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function Ee(t,e){return kt(e).map(n=>{const r=t.getPropertyValue(n),i=t.getPropertyPriority(n);return`${n}: ${r}${i?" !important":""};`}).join(" ")}function Ce(t,e,n,r){const i=`.${t}:${e}`,a=n.cssText?xe(n):Ee(n,r);return document.createTextNode(`${i}{${a}}`)}function It(t,e,n,r){const i=window.getComputedStyle(t,n),a=i.getPropertyValue("content");if(a===""||a==="none")return;const o=me();try{e.className=`${e.className} ${o}`}catch{return}const s=document.createElement("style");s.appendChild(Ce(o,n,i,r)),e.appendChild(s)}function Me(t,e,n){It(t,e,":before",n),It(t,e,":after",n)}const Ht="application/font-woff",Dt="image/jpeg",$e={woff:Ht,woff2:Ht,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:Dt,jpeg:Dt,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function Re(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function ot(t){const e=Re(t).toLowerCase();return $e[e]||""}function Pe(t){return t.split(/,/)[1]}function st(t){return t.search(/^(data:)/)!==-1}function Le(t,e){return`data:${e};base64,${t}`}async function Ot(t,e,n){const r=await fetch(t,e);if(r.status===404)throw new Error(`Resource "${r.url}" not found`);const i=await r.blob();return new Promise((a,o)=>{const s=new FileReader;s.onerror=o,s.onloadend=()=>{try{a(n({res:r,result:s.result}))}catch(l){o(l)}},s.readAsDataURL(i)})}const ct={};function Ae(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 lt(t,e,n){const r=Ae(t,e,n.includeQueryParams);if(ct[r]!=null)return ct[r];n.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+new Date().getTime());let i;try{const a=await Ot(t,n.fetchRequestInit,({res:o,result:s})=>(e||(e=o.headers.get("Content-Type")||""),Pe(s)));i=Le(a,e)}catch(a){i=n.imagePlaceholder||"";let o=`Failed to fetch resource: ${t}`;a&&(o=typeof a=="string"?a:a.message),o&&console.warn(o)}return ct[r]=i,i}async function ke(t){const e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):G(e)}async function Te(t,e){if(t.currentSrc){const a=document.createElement("canvas"),o=a.getContext("2d");a.width=t.clientWidth,a.height=t.clientHeight,o==null||o.drawImage(t,0,0,a.width,a.height);const s=a.toDataURL();return G(s)}const n=t.poster,r=ot(n),i=await lt(n,r,e);return G(i)}async function Ie(t,e){var n;try{if(!((n=t==null?void 0:t.contentDocument)===null||n===void 0)&&n.body)return await J(t.contentDocument.body,e,!0)}catch{}return t.cloneNode(!1)}async function He(t,e){return x(t,HTMLCanvasElement)?ke(t):x(t,HTMLVideoElement)?Te(t,e):x(t,HTMLIFrameElement)?Ie(t,e):t.cloneNode(Ft(t))}const De=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",Ft=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function Oe(t,e,n){var r,i;if(Ft(e))return e;let a=[];return De(t)&&t.assignedNodes?a=A(t.assignedNodes()):x(t,HTMLIFrameElement)&&(!((r=t.contentDocument)===null||r===void 0)&&r.body)?a=A(t.contentDocument.body.childNodes):a=A(((i=t.shadowRoot)!==null&&i!==void 0?i:t).childNodes),a.length===0||x(t,HTMLVideoElement)||await a.reduce((o,s)=>o.then(()=>J(s,n)).then(l=>{l&&e.appendChild(l)}),Promise.resolve()),e}function Fe(t,e,n){const r=e.style;if(!r)return;const i=window.getComputedStyle(t);i.cssText?(r.cssText=i.cssText,r.transformOrigin=i.transformOrigin):kt(n).forEach(a=>{let o=i.getPropertyValue(a);a==="font-size"&&o.endsWith("px")&&(o=`${Math.floor(parseFloat(o.substring(0,o.length-2)))-.1}px`),x(t,HTMLIFrameElement)&&a==="display"&&o==="inline"&&(o="block"),a==="d"&&e.getAttribute("d")&&(o=`path(${e.getAttribute("d")})`),r.setProperty(a,o,i.getPropertyPriority(a))})}function je(t,e){x(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),x(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function Ue(t,e){if(x(t,HTMLSelectElement)){const r=Array.from(e.children).find(i=>t.value===i.getAttribute("value"));r&&r.setAttribute("selected","")}}function Be(t,e,n){return x(e,Element)&&(Fe(t,e,n),Me(t,e,n),je(t,e),Ue(t,e)),e}async function Ve(t,e){const n=t.querySelectorAll?t.querySelectorAll("use"):[];if(n.length===0)return t;const r={};for(let a=0;a<n.length;a++){const s=n[a].getAttribute("xlink:href");if(s){const l=t.querySelector(s),u=document.querySelector(s);!l&&u&&!r[s]&&(r[s]=await J(u,e,!0))}}const i=Object.values(r);if(i.length){const a="http://www.w3.org/1999/xhtml",o=document.createElementNS(a,"svg");o.setAttribute("xmlns",a),o.style.position="absolute",o.style.width="0",o.style.height="0",o.style.overflow="hidden",o.style.display="none";const s=document.createElementNS(a,"defs");o.appendChild(s);for(let l=0;l<i.length;l++)s.appendChild(i[l]);t.appendChild(o)}return t}async function J(t,e,n){return!n&&e.filter&&!e.filter(t)?null:Promise.resolve(t).then(r=>He(r,e)).then(r=>Oe(t,r,e)).then(r=>Be(t,r,e)).then(r=>Ve(r,e))}const jt=/url\((['"]?)([^'"]+?)\1\)/g,_e=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,Ne=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function We(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function qe(t){const e=[];return t.replace(jt,(n,r,i)=>(e.push(i),n)),e.filter(n=>!st(n))}async function ze(t,e,n,r,i){try{const a=n?pe(e,n):e,o=ot(e);let s;return i||(s=await lt(a,o,r)),t.replace(We(e),`$1${s}$3`)}catch{}return t}function Xe(t,{preferredFontFormat:e}){return e?t.replace(Ne,n=>{for(;;){const[r,,i]=_e.exec(n)||[];if(!i)return"";if(i===e)return`src: ${r};`}}):t}function Ut(t){return t.search(jt)!==-1}async function Bt(t,e,n){if(!Ut(t))return t;const r=Xe(t,n);return qe(r).reduce((a,o)=>a.then(s=>ze(s,o,e,n)),Promise.resolve(r))}async function U(t,e,n){var r;const i=(r=e.style)===null||r===void 0?void 0:r.getPropertyValue(t);if(i){const a=await Bt(i,null,n);return e.style.setProperty(t,a,e.style.getPropertyPriority(t)),!0}return!1}async function Ke(t,e){await U("background",t,e)||await U("background-image",t,e),await U("mask",t,e)||await U("-webkit-mask",t,e)||await U("mask-image",t,e)||await U("-webkit-mask-image",t,e)}async function Ye(t,e){const n=x(t,HTMLImageElement);if(!(n&&!st(t.src))&&!(x(t,SVGImageElement)&&!st(t.href.baseVal)))return;const r=n?t.src:t.href.baseVal,i=await lt(r,ot(r),e);await new Promise((a,o)=>{t.onload=a,t.onerror=e.onImageErrorHandler?(...l)=>{try{a(e.onImageErrorHandler(...l))}catch(u){o(u)}}:o;const s=t;s.decode&&(s.decode=a),s.loading==="lazy"&&(s.loading="eager"),n?(t.srcset="",t.src=i):t.href.baseVal=i})}async function Ge(t,e){const r=A(t.childNodes).map(i=>Vt(i,e));await Promise.all(r).then(()=>t)}async function Vt(t,e){x(t,Element)&&(await Ke(t,e),await Ye(t,e),await Ge(t,e))}function Je(t,e){const{style:n}=t;e.backgroundColor&&(n.backgroundColor=e.backgroundColor),e.width&&(n.width=`${e.width}px`),e.height&&(n.height=`${e.height}px`);const r=e.style;return r!=null&&Object.keys(r).forEach(i=>{n[i]=r[i]}),t}const _t={};async function Nt(t){let e=_t[t];if(e!=null)return e;const r=await(await fetch(t)).text();return e={url:t,cssText:r},_t[t]=e,e}async function Wt(t,e){let n=t.cssText;const r=/url\(["']?([^"')]+)["']?\)/g,a=(n.match(/url\([^)]+\)/g)||[]).map(async o=>{let s=o.replace(r,"$1");return s.startsWith("https://")||(s=new URL(s,t.url).href),Ot(s,e.fetchRequestInit,({result:l})=>(n=n.replace(o,`url(${l})`),[o,l]))});return Promise.all(a).then(()=>n)}function qt(t){if(t==null)return[];const e=[],n=/(\/\*[\s\S]*?\*\/)/gi;let r=t.replace(n,"");const i=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){const l=i.exec(r);if(l===null)break;e.push(l[0])}r=r.replace(i,"");const a=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,o="((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})",s=new RegExp(o,"gi");for(;;){let l=a.exec(r);if(l===null){if(l=s.exec(r),l===null)break;a.lastIndex=s.lastIndex}else s.lastIndex=a.lastIndex;e.push(l[0])}return e}async function Qe(t,e){const n=[],r=[];return t.forEach(i=>{if("cssRules"in i)try{A(i.cssRules||[]).forEach((a,o)=>{if(a.type===CSSRule.IMPORT_RULE){let s=o+1;const l=a.href,u=Nt(l).then(d=>Wt(d,e)).then(d=>qt(d).forEach(m=>{try{i.insertRule(m,m.startsWith("@import")?s+=1:i.cssRules.length)}catch(y){console.error("Error inserting rule from remote css",{rule:m,error:y})}})).catch(d=>{console.error("Error loading remote css",d.toString())});r.push(u)}})}catch(a){const o=t.find(s=>s.href==null)||document.styleSheets[0];i.href!=null&&r.push(Nt(i.href).then(s=>Wt(s,e)).then(s=>qt(s).forEach(l=>{o.insertRule(l,o.cssRules.length)})).catch(s=>{console.error("Error loading remote stylesheet",s)})),console.error("Error inlining remote css file",a)}}),Promise.all(r).then(()=>(t.forEach(i=>{if("cssRules"in i)try{A(i.cssRules||[]).forEach(a=>{n.push(a)})}catch(a){console.error(`Error while reading CSS rules from ${i.href}`,a)}}),n))}function Ze(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>Ut(e.style.getPropertyValue("src")))}async function tn(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");const n=A(t.ownerDocument.styleSheets),r=await Qe(n,e);return Ze(r)}function zt(t){return t.trim().replace(/["']/g,"")}function en(t){const e=new Set;function n(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(a=>{e.add(zt(a))}),Array.from(r.children).forEach(a=>{a instanceof HTMLElement&&n(a)})}return n(t),e}async function nn(t,e){const n=await tn(t,e),r=en(t);return(await Promise.all(n.filter(a=>r.has(zt(a.style.fontFamily))).map(a=>{const o=a.parentStyleSheet?a.parentStyleSheet.href:null;return Bt(a.cssText,o,e)}))).join(`
2
- `)}async function rn(t,e){const n=e.fontEmbedCSS!=null?e.fontEmbedCSS:e.skipFonts?null:await nn(t,e);if(n){const r=document.createElement("style"),i=document.createTextNode(n);r.appendChild(i),t.firstChild?t.insertBefore(r,t.firstChild):t.appendChild(r)}}async function an(t,e={}){const{width:n,height:r}=Tt(t,e),i=await J(t,e,!0);return await rn(i,e),await Vt(i,e),Je(i,e),await Se(i,n,r)}async function on(t,e={}){const{width:n,height:r}=Tt(t,e),i=await an(t,e),a=await G(i),o=document.createElement("canvas"),s=o.getContext("2d"),l=e.pixelRatio||we(),u=e.canvasWidth||n,d=e.canvasHeight||r;return o.width=u*l,o.height=d*l,e.skipAutoScale||be(o),o.style.width=`${u}`,o.style.height=`${d}`,e.backgroundColor&&(s.fillStyle=e.backgroundColor,s.fillRect(0,0,o.width,o.height)),s.drawImage(a,0,0,o.width,o.height),o}async function sn(t,e={}){return(await on(t,e)).toDataURL()}const Q="data-nf-capture-chrome";function cn(t){return t instanceof Element&&(t.hasAttribute(Q)||t.hasAttribute("data-nf-mask-cover")||t.id==="notefully")}function ln(){const t=[];return document.querySelectorAll('input[type="password"], [data-notefully-mask]').forEach(n=>{const r=n.getBoundingClientRect(),i=document.createElement("div");i.setAttribute("data-nf-mask-cover","1"),i.style.cssText=["position:fixed",`left:${r.left}px`,`top:${r.top}px`,`width:${Math.max(r.width,4)}px`,`height:${Math.max(r.height,4)}px`,"background:#111","z-index:2147483646","pointer-events:none"].join(";"),document.body.appendChild(i),t.push(i)}),()=>t.forEach(n=>n.remove())}function un(){const t=document.querySelector(`[${Q}]`);if(t)return t;const e=document.createElement("div");return e.setAttribute(Q,"1"),e.className="nf-capture-chrome",e.setAttribute("role","status"),e.setAttribute("aria-live","polite"),e.innerHTML='<span class="nf-capture-chrome-pill">Capturing…</span>',document.body.appendChild(e),e}function dn(){document.querySelectorAll(`[${Q}]`).forEach(t=>t.remove())}async function fn(){const t=document.getElementById("notefully"),e=t?t.style.display:"",n=un();t&&(t.style.display="none");const r=ln();await new Promise(i=>requestAnimationFrame(()=>requestAnimationFrame(i)));try{return await sn(document.body,{cacheBust:!0,pixelRatio:Math.min(window.devicePixelRatio||1,2),filter:i=>!cn(i)})}finally{r(),n.remove(),dn(),t&&(t.style.display=e)}}function hn(t={}){return{url:location.href,title:document.title,userAgent:navigator.userAgent,language:navigator.language,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,viewport:{width:window.innerWidth,height:window.innerHeight,dpr:window.devicePixelRatio||1},user:{userId:t.userId||null,email:t.email||null,displayName:t.displayName||null}}}const Xt=new Set(["userId","email","displayName"]),Kt={id:"userId",username:"displayName",name:"displayName"},Yt=new Set(["endpoint","projectKey","version","name","targets","hideLauncher","theme","video"]),Gt={slug:"Use init({ name }) for a per-app report prefix (same idea as package.json name). slug is not a widget option.",projectSlug:"Use init({ name }) for a per-app report prefix. projectSlug is not a widget option.",project:"Pass projectKey (nfk_…) from Showfully Notefully settings — there is no project option on the widget.",username:"Pass people via Notefully.identify({ displayName }) (username is an identify alias), not init().",userId:"Pass people via Notefully.identify({ userId, email, displayName }), not init().",email:"Pass people via Notefully.identify({ userId, email, displayName }), not init().",displayName:"Pass people via Notefully.identify({ userId, email, displayName }), not init()."};function pn(t={},e={}){const n=e.warn||Jt,r=t&&typeof t=="object"?t:{},i={},a=[];for(const o of Xt)Object.prototype.hasOwnProperty.call(r,o)&&(i[o]=r[o]);for(const[o,s]of Object.entries(Kt))Object.prototype.hasOwnProperty.call(r,o)&&(Object.prototype.hasOwnProperty.call(i,s)||(i[s]=r[o]));for(const o of Object.keys(r))Xt.has(o)||Object.prototype.hasOwnProperty.call(Kt,o)||a.push(o);if(a.length){const o=a.some(s=>s==="name"||s==="slug"||s==="projectSlug")?" Pass the package/report name via Notefully.init({ name }), not identify().":"";n(`Notefully.identify: ignoring unknown key(s): ${a.join(", ")}. Supported: userId, email, displayName (aliases: id → userId; username/name → displayName).`+o)}return i}function mn(t={},e={}){const n=e.warn||Jt,r=t&&typeof t=="object"?t:{},i=Object.keys(r).filter(a=>!Yt.has(a));if(i.length)for(const a of i){if(Gt[a]){n(`Notefully.init: ignoring "${a}". ${Gt[a]}`);continue}n(`Notefully.init: ignoring unknown key "${a}". Supported: ${[...Yt].join(", ")}.`)}}function Jt(t){typeof console<"u"&&typeof console.warn=="function"&&console.warn(t)}const yn=80;function gn(){const t=[],e={};let n=!1;const r=(a,o)=>{let s="";try{s=o.map(l=>l instanceof Error?l.stack||l.message:typeof l=="string"?l:JSON.stringify(l)).join(" ")}catch{s=String(o[0])}t.push({level:a,text:s.slice(0,2e3),at:Date.now()}),t.length>yn&&t.shift()};return{hook:()=>{n||typeof window>"u"||(n=!0,["log","info","warn","error"].forEach(a=>{e[a]=console[a].bind(console),console[a]=(...o)=>{r(a,o),e[a](...o)}}),window.addEventListener("error",a=>{r("error",[a.message||"window.error"])}),window.addEventListener("unhandledrejection",a=>{r("error",[a.reason||"unhandledrejection"])}))},snapshot(){return t.slice()}}}function wn(t){const e=window.SpeechRecognition||window.webkitSpeechRecognition;let n=null,r=!1;const i=()=>{if(r=!1,n)try{n.stop()}catch{}};return{start:()=>{if(!e)throw new Error("Speech recognition is not supported in this browser.");return r?(i(),!1):(n=new e,n.continuous=!0,n.interimResults=!0,n.lang=navigator.language||"en-US",n.onresult=o=>{let s="";for(let l=o.resultIndex;l<o.results.length;l+=1)o.results[l].isFinal&&(s+=o.results[l][0].transcript);s&&t(s)},n.onerror=()=>{r=!1},n.onend=()=>{r=!1},n.start(),r=!0,!0)},stop:i,isSupported:()=>!!e,isActive:()=>r}}const bn=60*1e3;function vn({onStart:t,onStop:e,onError:n}){let r=null,i=null,a=[],o=null;const s=()=>{if(o&&(clearTimeout(o),o=null),i&&i.state!=="inactive")try{i.stop()}catch{}r&&(r.getTracks().forEach(d=>d.stop()),r=null)},l=()=>{if(i&&i.state==="recording"){i.stop();return}s(),e(null)};return{start:async()=>{var d,m;if(!((d=navigator.mediaDevices)!=null&&d.getDisplayMedia))throw new Error("Screen recording is not supported in this browser.");r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1,preferCurrentTab:!0,selfBrowserSurface:"include"}),a=[],i=new MediaRecorder(r,{mimeType:MediaRecorder.isTypeSupported("video/webm;codecs=vp9")?"video/webm;codecs=vp9":"video/webm"}),i.ondataavailable=y=>{y.data&&y.data.size&&a.push(y.data)},i.onstop=()=>{const y=a.length?new Blob(a,{type:i.mimeType||"video/webm"}):null;s(),e(y)},(m=r.getVideoTracks()[0])==null||m.addEventListener("ended",()=>l()),i.start(),o=setTimeout(l,bn)},stop:l}}function Sn(){const t=new Set;return{alloc(){let e=1;for(;t.has(e);)e+=1;return t.add(e),e},free(e){const n=Number(e);Number.isInteger(n)&&n>0&&t.delete(n)},peekUsed(){return[...t].sort((e,n)=>e-n)}}}const ut={x:0,y:0,w:1,h:1};function Qt(){const t=Sn();let e=[],n={...ut},r=1;return{list:()=>e.filter(a=>En(a,n)),all:()=>e.slice(),crop:()=>({...n}),setCrop(a){return n=xn(a),n},resetCrop(){return n={...ut},n},isCropped(){return n.x>1e-6||n.y>1e-6||n.w<.999999||n.h<.999999},add(a,o){const s={id:`s${r++}`,type:a,number:t.alloc(),x:.2,y:.2,w:a==="arrow"?.2:.22,h:a==="arrow"?.05:.16,x2:.4,y2:.28,...o};return e.push(s),s},update(a,o){const s=e.find(l=>l.id===a);return s?(Object.assign(s,o),s):null},remove(a){const o=e.findIndex(l=>l.id===a);if(o<0)return null;const[s]=e.splice(o,1);return t.free(s.number),s},reset(){for(e=[],n={...ut},r=1;t.peekUsed().length;)t.free(t.peekUsed()[0])}}}function xn(t){const e=Math.min(Math.max(t.x,0),.95),n=Math.min(Math.max(t.y,0),.95),r=Math.min(Math.max(t.w,.05),1-e),i=Math.min(Math.max(t.h,.05),1-n);return{x:e,y:n,w:r,h:i}}function En(t,e){const n=t.type==="arrow"?(t.x+(t.x2??t.x))/2:t.x+(t.w||0)/2,r=t.type==="arrow"?(t.y+(t.y2??t.y))/2:t.y+(t.h||0)/2;return n>=e.x&&r>=e.y&&n<=e.x+e.w&&r<=e.y+e.h}function dt(t){const e=Math.max(1,Number(t)||1);return{stroke:Math.max(2,e*.0075),badgeRadius:Math.max(8,e*.025),fontSize:Math.max(10,e*.0275),arrowHead:Math.max(8,e*.035),arrowHeadAngle:.4}}function Cn(t,{stickers:e=[],crop:n={x:0,y:0,w:1,h:1},width:r,height:i,colors:a={}}){const o=a.mark||"#fdd341",s=a.markText||"#2a2140",l=dt(r);t.save(),t.lineWidth=l.stroke,t.lineCap="round",t.lineJoin="round",t.strokeStyle=o,t.fillStyle=o,t.font=`700 ${Math.round(l.fontSize)}px ui-sans-serif, system-ui, sans-serif`,e.forEach(u=>{const d=ft(u.x,n,r),m=ht(u.y,n,i),y=u.w/n.w*r,M=u.h/n.h*i,R=l.stroke/2;if(u.type==="rect")t.strokeRect(d+R,m+R,Math.max(0,y-l.stroke),Math.max(0,M-l.stroke));else if(u.type==="circle")t.beginPath(),t.ellipse(d+y/2,m+M/2,Math.max(.5,y/2-R),Math.max(.5,M/2-R),0,0,Math.PI*2),t.stroke();else if(u.type==="arrow"){const B=ft(u.x2??u.x+u.w,n,r),V=ht(u.y2??u.y,n,i);$n(t,d,m,B,V,l)}if(u.number==null||u.number==="")return;const D=Mn(u,n,r,i,d,m,y),K=String(u.number);t.beginPath(),t.arc(D.x,D.y,l.badgeRadius,0,Math.PI*2),t.fillStyle=o,t.fill(),t.fillStyle=s,t.textAlign="center",t.textBaseline="middle",t.fillText(K,D.x,D.y+.5),t.fillStyle=o}),t.restore()}function ft(t,e,n){return(t-e.x)/e.w*n}function ht(t,e,n){return(t-e.y)/e.h*n}function Mn(t,e,n,r,i,a,o){if(t.type==="arrow"){const s=ft(t.x2??t.x+t.w,e,n),l=ht(t.y2??t.y,e,r);return{x:(i+s)/2,y:(a+l)/2}}return{x:i+o/2,y:a}}function Zt(t,e,n,r,i){const a=Math.atan2(r-e,n-t),o=i.arrowHead,s=Math.min(i.stroke,o*.2),l=n,u=r,d=n-Math.cos(a)*o,m=r-Math.sin(a)*o,y={x:l-o*Math.cos(a-i.arrowHeadAngle),y:u-o*Math.sin(a-i.arrowHeadAngle)},M={x:l-o*Math.cos(a+i.arrowHeadAngle),y:u-o*Math.sin(a+i.arrowHeadAngle)},R={x:n-Math.cos(a)*s,y:r-Math.sin(a)*s};return{angle:a,tipX:l,tipY:u,baseX:d,baseY:m,left:y,right:M,shaftEnd:R}}function $n(t,e,n,r,i,a){const o=Zt(e,n,r,i,a);t.beginPath(),t.moveTo(e,n),t.lineTo(o.shaftEnd.x,o.shaftEnd.y),t.stroke(),t.beginPath(),t.moveTo(o.tipX,o.tipY),t.lineTo(o.left.x,o.left.y),t.lineTo(o.right.x,o.right.y),t.closePath(),t.fill()}function Rn(t,e,n,r={}){return new Promise((i,a)=>{const o=new Image;o.onload=()=>{const s=Math.round(e.x*o.width),l=Math.round(e.y*o.height),u=Math.max(1,Math.round(e.w*o.width)),d=Math.max(1,Math.round(e.h*o.height)),m=document.createElement("canvas");m.width=u,m.height=d;const y=m.getContext("2d");y.drawImage(o,s,l,u,d,0,0,u,d),Cn(y,{stickers:n,crop:e,width:u,height:d,colors:r}),m.toBlob(M=>{if(!M){a(new Error("Could not encode screenshot"));return}i(M)},"image/png")},o.onerror=()=>a(new Error("Could not load screenshot")),o.src=t})}const Pn=["bug","idea","other"],Ln=["maker","all-business","brighter-day","quiet-night"],te="maker",An=new Set(["crop","arrow","rect","circle"]),pt=.02,ee=.05,kn=`
1
+ var Notefully=(function(R){"use strict";function ye(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;const n=document.implementation.createHTMLDocument(),r=n.createElement("base"),o=n.createElement("a");return n.head.appendChild(r),n.body.appendChild(o),e&&(r.href=e),o.href=t,o.href}const ge=(()=>{let t=0;const e=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(t+=1,`u${e()}${t}`)})();function A(t){const e=[];for(let n=0,r=t.length;n<r;n++)e.push(t[n]);return e}let j=null;function Tt(t={}){return j||(t.includeStyleProperties?(j=t.includeStyleProperties,j):(j=A(window.getComputedStyle(document.documentElement)),j))}function Y(t,e){const r=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return r?parseFloat(r.replace("px","")):0}function we(t){const e=Y(t,"border-left-width"),n=Y(t,"border-right-width");return t.clientWidth+e+n}function be(t){const e=Y(t,"border-top-width"),n=Y(t,"border-bottom-width");return t.clientHeight+e+n}function kt(t,e={}){const n=e.width||we(t),r=e.height||be(t);return{width:n,height:r}}function ve(){let t,e;try{e=process}catch{}const n=e&&e.env?e.env.devicePixelRatio:null;return n&&(t=parseInt(n,10),Number.isNaN(t)&&(t=1)),t||window.devicePixelRatio||1}const E=16384;function Se(t){(t.width>E||t.height>E)&&(t.width>E&&t.height>E?t.width>t.height?(t.height*=E/t.width,t.width=E):(t.width*=E/t.height,t.height=E):t.width>E?(t.height*=E/t.width,t.width=E):(t.width*=E/t.height,t.height=E))}function G(t){return new Promise((e,n)=>{const 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 xe(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function Ee(t,e,n){const r="http://www.w3.org/2000/svg",o=document.createElementNS(r,"svg"),i=document.createElementNS(r,"foreignObject");return o.setAttribute("width",`${e}`),o.setAttribute("height",`${n}`),o.setAttribute("viewBox",`0 0 ${e} ${n}`),i.setAttribute("width","100%"),i.setAttribute("height","100%"),i.setAttribute("x","0"),i.setAttribute("y","0"),i.setAttribute("externalResourcesRequired","true"),o.appendChild(i),i.appendChild(t),xe(o)}const x=(t,e)=>{if(t instanceof e)return!0;const n=Object.getPrototypeOf(t);return n===null?!1:n.constructor.name===e.name||x(n,e)};function Ce(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function Me(t,e){return Tt(e).map(n=>{const r=t.getPropertyValue(n),o=t.getPropertyPriority(n);return`${n}: ${r}${o?" !important":""};`}).join(" ")}function Le(t,e,n,r){const o=`.${t}:${e}`,i=n.cssText?Ce(n):Me(n,r);return document.createTextNode(`${o}{${i}}`)}function It(t,e,n,r){const o=window.getComputedStyle(t,n),i=o.getPropertyValue("content");if(i===""||i==="none")return;const a=ge();try{e.className=`${e.className} ${a}`}catch{return}const s=document.createElement("style");s.appendChild(Le(a,n,o,r)),e.appendChild(s)}function $e(t,e,n){It(t,e,":before",n),It(t,e,":after",n)}const Ot="application/font-woff",Ht="image/jpeg",Re={woff:Ot,woff2:Ot,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:Ht,jpeg:Ht,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function Pe(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function at(t){const e=Pe(t).toLowerCase();return Re[e]||""}function Ae(t){return t.split(/,/)[1]}function st(t){return t.search(/^(data:)/)!==-1}function Te(t,e){return`data:${e};base64,${t}`}async function Dt(t,e,n){const r=await fetch(t,e);if(r.status===404)throw new Error(`Resource "${r.url}" not found`);const o=await r.blob();return new Promise((i,a)=>{const s=new FileReader;s.onerror=a,s.onloadend=()=>{try{i(n({res:r,result:s.result}))}catch(l){a(l)}},s.readAsDataURL(o)})}const ct={};function ke(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 lt(t,e,n){const r=ke(t,e,n.includeQueryParams);if(ct[r]!=null)return ct[r];n.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+new Date().getTime());let o;try{const i=await Dt(t,n.fetchRequestInit,({res:a,result:s})=>(e||(e=a.headers.get("Content-Type")||""),Ae(s)));o=Te(i,e)}catch(i){o=n.imagePlaceholder||"";let a=`Failed to fetch resource: ${t}`;i&&(a=typeof i=="string"?i:i.message),a&&console.warn(a)}return ct[r]=o,o}async function Ie(t){const e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):G(e)}async function Oe(t,e){if(t.currentSrc){const i=document.createElement("canvas"),a=i.getContext("2d");i.width=t.clientWidth,i.height=t.clientHeight,a==null||a.drawImage(t,0,0,i.width,i.height);const s=i.toDataURL();return G(s)}const n=t.poster,r=at(n),o=await lt(n,r,e);return G(o)}async function He(t,e){var n;try{if(!((n=t==null?void 0:t.contentDocument)===null||n===void 0)&&n.body)return await J(t.contentDocument.body,e,!0)}catch{}return t.cloneNode(!1)}async function De(t,e){return x(t,HTMLCanvasElement)?Ie(t):x(t,HTMLVideoElement)?Oe(t,e):x(t,HTMLIFrameElement)?He(t,e):t.cloneNode(Ft(t))}const Fe=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",Ft=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function je(t,e,n){var r,o;if(Ft(e))return e;let i=[];return Fe(t)&&t.assignedNodes?i=A(t.assignedNodes()):x(t,HTMLIFrameElement)&&(!((r=t.contentDocument)===null||r===void 0)&&r.body)?i=A(t.contentDocument.body.childNodes):i=A(((o=t.shadowRoot)!==null&&o!==void 0?o:t).childNodes),i.length===0||x(t,HTMLVideoElement)||await i.reduce((a,s)=>a.then(()=>J(s,n)).then(l=>{l&&e.appendChild(l)}),Promise.resolve()),e}function Ue(t,e,n){const r=e.style;if(!r)return;const o=window.getComputedStyle(t);o.cssText?(r.cssText=o.cssText,r.transformOrigin=o.transformOrigin):Tt(n).forEach(i=>{let a=o.getPropertyValue(i);i==="font-size"&&a.endsWith("px")&&(a=`${Math.floor(parseFloat(a.substring(0,a.length-2)))-.1}px`),x(t,HTMLIFrameElement)&&i==="display"&&a==="inline"&&(a="block"),i==="d"&&e.getAttribute("d")&&(a=`path(${e.getAttribute("d")})`),r.setProperty(i,a,o.getPropertyPriority(i))})}function _e(t,e){x(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),x(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function Be(t,e){if(x(t,HTMLSelectElement)){const r=Array.from(e.children).find(o=>t.value===o.getAttribute("value"));r&&r.setAttribute("selected","")}}function Ve(t,e,n){return x(e,Element)&&(Ue(t,e,n),$e(t,e,n),_e(t,e),Be(t,e)),e}async function Ne(t,e){const n=t.querySelectorAll?t.querySelectorAll("use"):[];if(n.length===0)return t;const r={};for(let i=0;i<n.length;i++){const s=n[i].getAttribute("xlink:href");if(s){const l=t.querySelector(s),u=document.querySelector(s);!l&&u&&!r[s]&&(r[s]=await J(u,e,!0))}}const o=Object.values(r);if(o.length){const i="http://www.w3.org/1999/xhtml",a=document.createElementNS(i,"svg");a.setAttribute("xmlns",i),a.style.position="absolute",a.style.width="0",a.style.height="0",a.style.overflow="hidden",a.style.display="none";const s=document.createElementNS(i,"defs");a.appendChild(s);for(let l=0;l<o.length;l++)s.appendChild(o[l]);t.appendChild(a)}return t}async function J(t,e,n){return!n&&e.filter&&!e.filter(t)?null:Promise.resolve(t).then(r=>De(r,e)).then(r=>je(t,r,e)).then(r=>Ve(t,r,e)).then(r=>Ne(r,e))}const jt=/url\((['"]?)([^'"]+?)\1\)/g,We=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,qe=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function ze(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function Xe(t){const e=[];return t.replace(jt,(n,r,o)=>(e.push(o),n)),e.filter(n=>!st(n))}async function Ke(t,e,n,r,o){try{const i=n?ye(e,n):e,a=at(e);let s;return o||(s=await lt(i,a,r)),t.replace(ze(e),`$1${s}$3`)}catch{}return t}function Ye(t,{preferredFontFormat:e}){return e?t.replace(qe,n=>{for(;;){const[r,,o]=We.exec(n)||[];if(!o)return"";if(o===e)return`src: ${r};`}}):t}function Ut(t){return t.search(jt)!==-1}async function _t(t,e,n){if(!Ut(t))return t;const r=Ye(t,n);return Xe(r).reduce((i,a)=>i.then(s=>Ke(s,a,e,n)),Promise.resolve(r))}async function U(t,e,n){var r;const o=(r=e.style)===null||r===void 0?void 0:r.getPropertyValue(t);if(o){const i=await _t(o,null,n);return e.style.setProperty(t,i,e.style.getPropertyPriority(t)),!0}return!1}async function Ge(t,e){await U("background",t,e)||await U("background-image",t,e),await U("mask",t,e)||await U("-webkit-mask",t,e)||await U("mask-image",t,e)||await U("-webkit-mask-image",t,e)}async function Je(t,e){const n=x(t,HTMLImageElement);if(!(n&&!st(t.src))&&!(x(t,SVGImageElement)&&!st(t.href.baseVal)))return;const r=n?t.src:t.href.baseVal,o=await lt(r,at(r),e);await new Promise((i,a)=>{t.onload=i,t.onerror=e.onImageErrorHandler?(...l)=>{try{i(e.onImageErrorHandler(...l))}catch(u){a(u)}}:a;const s=t;s.decode&&(s.decode=i),s.loading==="lazy"&&(s.loading="eager"),n?(t.srcset="",t.src=o):t.href.baseVal=o})}async function Qe(t,e){const r=A(t.childNodes).map(o=>Bt(o,e));await Promise.all(r).then(()=>t)}async function Bt(t,e){x(t,Element)&&(await Ge(t,e),await Je(t,e),await Qe(t,e))}function Ze(t,e){const{style:n}=t;e.backgroundColor&&(n.backgroundColor=e.backgroundColor),e.width&&(n.width=`${e.width}px`),e.height&&(n.height=`${e.height}px`);const r=e.style;return r!=null&&Object.keys(r).forEach(o=>{n[o]=r[o]}),t}const Vt={};async function Nt(t){let e=Vt[t];if(e!=null)return e;const r=await(await fetch(t)).text();return e={url:t,cssText:r},Vt[t]=e,e}async function Wt(t,e){let n=t.cssText;const r=/url\(["']?([^"')]+)["']?\)/g,i=(n.match(/url\([^)]+\)/g)||[]).map(async a=>{let s=a.replace(r,"$1");return s.startsWith("https://")||(s=new URL(s,t.url).href),Dt(s,e.fetchRequestInit,({result:l})=>(n=n.replace(a,`url(${l})`),[a,l]))});return Promise.all(i).then(()=>n)}function qt(t){if(t==null)return[];const e=[],n=/(\/\*[\s\S]*?\*\/)/gi;let r=t.replace(n,"");const o=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){const l=o.exec(r);if(l===null)break;e.push(l[0])}r=r.replace(o,"");const i=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,a="((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})",s=new RegExp(a,"gi");for(;;){let l=i.exec(r);if(l===null){if(l=s.exec(r),l===null)break;i.lastIndex=s.lastIndex}else s.lastIndex=i.lastIndex;e.push(l[0])}return e}async function tn(t,e){const n=[],r=[];return t.forEach(o=>{if("cssRules"in o)try{A(o.cssRules||[]).forEach((i,a)=>{if(i.type===CSSRule.IMPORT_RULE){let s=a+1;const l=i.href,u=Nt(l).then(d=>Wt(d,e)).then(d=>qt(d).forEach(p=>{try{o.insertRule(p,p.startsWith("@import")?s+=1:o.cssRules.length)}catch(y){console.error("Error inserting rule from remote css",{rule:p,error:y})}})).catch(d=>{console.error("Error loading remote css",d.toString())});r.push(u)}})}catch(i){const a=t.find(s=>s.href==null)||document.styleSheets[0];o.href!=null&&r.push(Nt(o.href).then(s=>Wt(s,e)).then(s=>qt(s).forEach(l=>{a.insertRule(l,a.cssRules.length)})).catch(s=>{console.error("Error loading remote stylesheet",s)})),console.error("Error inlining remote css file",i)}}),Promise.all(r).then(()=>(t.forEach(o=>{if("cssRules"in o)try{A(o.cssRules||[]).forEach(i=>{n.push(i)})}catch(i){console.error(`Error while reading CSS rules from ${o.href}`,i)}}),n))}function en(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>Ut(e.style.getPropertyValue("src")))}async function nn(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");const n=A(t.ownerDocument.styleSheets),r=await tn(n,e);return en(r)}function zt(t){return t.trim().replace(/["']/g,"")}function rn(t){const e=new Set;function n(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(i=>{e.add(zt(i))}),Array.from(r.children).forEach(i=>{i instanceof HTMLElement&&n(i)})}return n(t),e}async function on(t,e){const n=await nn(t,e),r=rn(t);return(await Promise.all(n.filter(i=>r.has(zt(i.style.fontFamily))).map(i=>{const a=i.parentStyleSheet?i.parentStyleSheet.href:null;return _t(i.cssText,a,e)}))).join(`
2
+ `)}async function an(t,e){const n=e.fontEmbedCSS!=null?e.fontEmbedCSS:e.skipFonts?null:await on(t,e);if(n){const r=document.createElement("style"),o=document.createTextNode(n);r.appendChild(o),t.firstChild?t.insertBefore(r,t.firstChild):t.appendChild(r)}}async function sn(t,e={}){const{width:n,height:r}=kt(t,e),o=await J(t,e,!0);return await an(o,e),await Bt(o,e),Ze(o,e),await Ee(o,n,r)}async function cn(t,e={}){const{width:n,height:r}=kt(t,e),o=await sn(t,e),i=await G(o),a=document.createElement("canvas"),s=a.getContext("2d"),l=e.pixelRatio||ve(),u=e.canvasWidth||n,d=e.canvasHeight||r;return a.width=u*l,a.height=d*l,e.skipAutoScale||Se(a),a.style.width=`${u}`,a.style.height=`${d}`,e.backgroundColor&&(s.fillStyle=e.backgroundColor,s.fillRect(0,0,a.width,a.height)),s.drawImage(i,0,0,a.width,a.height),a}async function ln(t,e={}){return(await cn(t,e)).toDataURL()}const Q="data-nf-capture-chrome";function un(t){return t instanceof Element&&(t.hasAttribute(Q)||t.hasAttribute("data-nf-mask-cover")||t.id==="notefully")}function dn(){const t=[];return document.querySelectorAll('input[type="password"], [data-notefully-mask]').forEach(n=>{const r=n.getBoundingClientRect(),o=document.createElement("div");o.setAttribute("data-nf-mask-cover","1"),o.style.cssText=["position:fixed",`left:${r.left}px`,`top:${r.top}px`,`width:${Math.max(r.width,4)}px`,`height:${Math.max(r.height,4)}px`,"background:#111","z-index:2147483646","pointer-events:none"].join(";"),document.body.appendChild(o),t.push(o)}),()=>t.forEach(n=>n.remove())}function fn(){const t=document.querySelector(`[${Q}]`);if(t)return t;const e=document.createElement("div");return e.setAttribute(Q,"1"),e.className="nf-capture-chrome",e.setAttribute("role","status"),e.setAttribute("aria-live","polite"),e.innerHTML='<span class="nf-capture-chrome-pill">Capturing…</span>',document.body.appendChild(e),e}function hn(){document.querySelectorAll(`[${Q}]`).forEach(t=>t.remove())}async function mn(){const t=document.getElementById("notefully"),e=t?t.style.display:"",n=fn();t&&(t.style.display="none");const r=dn();await new Promise(o=>requestAnimationFrame(()=>requestAnimationFrame(o)));try{return await ln(document.body,{cacheBust:!0,pixelRatio:Math.min(window.devicePixelRatio||1,2),filter:o=>!un(o)})}finally{r(),n.remove(),hn(),t&&(t.style.display=e)}}function pn(t=""){const e=String(t||"");return e?/Windows NT/i.test(e)?"Windows":/iPhone|iPad|iPod/i.test(e)?"iOS":/Mac OS X|Macintosh/i.test(e)?"macOS":/Android/i.test(e)?"Android":/CrOS/i.test(e)?"ChromeOS":/Linux/i.test(e)?"Linux":"Other":""}function yn(t=""){const e=String(t||"");return e?/Edg\//i.test(e)?"Edge":/OPR\/|Opera/i.test(e)?"Opera":/Firefox\//i.test(e)?"Firefox":/Chrome\//i.test(e)||/CriOS\//i.test(e)?"Chrome":/Safari\//i.test(e)?"Safari":"Other":""}function gn(t={}){const e=navigator.userAgent;return{url:location.href,title:document.title,userAgent:e,os:pn(e),browser:yn(e),language:navigator.language,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,viewport:{width:window.innerWidth,height:window.innerHeight,dpr:window.devicePixelRatio||1},user:{userId:t.userId||null,email:t.email||null,displayName:t.displayName||null}}}const Xt=new Set(["userId","email","displayName"]),Kt={id:"userId",username:"displayName",name:"displayName"},Yt=new Set(["endpoint","projectKey","version","name","targets","hideLauncher","theme","video","consoleLogLimit"]),Gt={slug:"Use init({ name }) for a per-app report prefix (same idea as package.json name). slug is not a widget option.",projectSlug:"Use init({ name }) for a per-app report prefix. projectSlug is not a widget option.",project:"Pass projectKey (nfk_…) from Showfully Notefully settings — there is no project option on the widget.",username:"Pass people via Notefully.identify({ displayName }) (username is an identify alias), not init().",userId:"Pass people via Notefully.identify({ userId, email, displayName }), not init().",email:"Pass people via Notefully.identify({ userId, email, displayName }), not init().",displayName:"Pass people via Notefully.identify({ userId, email, displayName }), not init()."};function wn(t={},e={}){const n=e.warn||Jt,r=t&&typeof t=="object"?t:{},o={},i=[];for(const a of Xt)Object.prototype.hasOwnProperty.call(r,a)&&(o[a]=r[a]);for(const[a,s]of Object.entries(Kt))Object.prototype.hasOwnProperty.call(r,a)&&(Object.prototype.hasOwnProperty.call(o,s)||(o[s]=r[a]));for(const a of Object.keys(r))Xt.has(a)||Object.prototype.hasOwnProperty.call(Kt,a)||i.push(a);if(i.length){const a=i.some(s=>s==="name"||s==="slug"||s==="projectSlug")?" Pass the package/report name via Notefully.init({ name }), not identify().":"";n(`Notefully.identify: ignoring unknown key(s): ${i.join(", ")}. Supported: userId, email, displayName (aliases: id → userId; username/name → displayName).`+a)}return o}function bn(t={},e={}){const n=e.warn||Jt,r=t&&typeof t=="object"?t:{},o=Object.keys(r).filter(i=>!Yt.has(i));if(o.length)for(const i of o){if(Gt[i]){n(`Notefully.init: ignoring "${i}". ${Gt[i]}`);continue}n(`Notefully.init: ignoring unknown key "${i}". Supported: ${[...Yt].join(", ")}.`)}}function Jt(t){typeof console<"u"&&typeof console.warn=="function"&&console.warn(t)}const vn=80;function Sn(){const t=[],e={};let n=!1;const r=(i,a)=>{let s="";try{s=a.map(l=>l instanceof Error?l.stack||l.message:typeof l=="string"?l:JSON.stringify(l)).join(" ")}catch{s=String(a[0])}t.push({level:i,text:s.slice(0,2e3),at:Date.now()}),t.length>vn&&t.shift()};return{hook:()=>{n||typeof window>"u"||(n=!0,["log","info","warn","error"].forEach(i=>{e[i]=console[i].bind(console),console[i]=(...a)=>{r(i,a),e[i](...a)}}),window.addEventListener("error",i=>{r("error",[i.message||"window.error"])}),window.addEventListener("unhandledrejection",i=>{r("error",[i.reason||"unhandledrejection"])}))},snapshot(){return t.slice()}}}function xn(t){const e=window.SpeechRecognition||window.webkitSpeechRecognition;let n=null,r=!1;const o=()=>{if(r=!1,n)try{n.stop()}catch{}};return{start:()=>{if(!e)throw new Error("Speech recognition is not supported in this browser.");return r?(o(),!1):(n=new e,n.continuous=!0,n.interimResults=!0,n.lang=navigator.language||"en-US",n.onresult=a=>{let s="";for(let l=a.resultIndex;l<a.results.length;l+=1)a.results[l].isFinal&&(s+=a.results[l][0].transcript);s&&t(s)},n.onerror=()=>{r=!1},n.onend=()=>{r=!1},n.start(),r=!0,!0)},stop:o,isSupported:()=>!!e,isActive:()=>r}}const En=60*1e3;function Cn({onStart:t,onStop:e,onError:n}){let r=null,o=null,i=[],a=null;const s=()=>{if(a&&(clearTimeout(a),a=null),o&&o.state!=="inactive")try{o.stop()}catch{}r&&(r.getTracks().forEach(d=>d.stop()),r=null)},l=()=>{if(o&&o.state==="recording"){o.stop();return}s(),e(null)};return{start:async()=>{var d,p;if(!((d=navigator.mediaDevices)!=null&&d.getDisplayMedia))throw new Error("Screen recording is not supported in this browser.");r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1,preferCurrentTab:!0,selfBrowserSurface:"include"}),i=[],o=new MediaRecorder(r,{mimeType:MediaRecorder.isTypeSupported("video/webm;codecs=vp9")?"video/webm;codecs=vp9":"video/webm"}),o.ondataavailable=y=>{y.data&&y.data.size&&i.push(y.data)},o.onstop=()=>{const y=i.length?new Blob(i,{type:o.mimeType||"video/webm"}):null;s(),e(y)},(p=r.getVideoTracks()[0])==null||p.addEventListener("ended",()=>l()),o.start(),a=setTimeout(l,En)},stop:l}}function Mn(){const t=new Set;return{alloc(){let e=1;for(;t.has(e);)e+=1;return t.add(e),e},free(e){const n=Number(e);Number.isInteger(n)&&n>0&&t.delete(n)},peekUsed(){return[...t].sort((e,n)=>e-n)}}}const ut={x:0,y:0,w:1,h:1};function Qt(){const t=Mn();let e=[],n={...ut},r=1;return{list:()=>e.filter(i=>$n(i,n)),all:()=>e.slice(),crop:()=>({...n}),setCrop(i){return n=Ln(i),n},resetCrop(){return n={...ut},n},isCropped(){return n.x>1e-6||n.y>1e-6||n.w<.999999||n.h<.999999},add(i,a){const s={id:`s${r++}`,type:i,number:t.alloc(),x:.2,y:.2,w:i==="arrow"?.2:.22,h:i==="arrow"?.05:.16,x2:.4,y2:.28,...a};return e.push(s),s},update(i,a){const s=e.find(l=>l.id===i);return s?(Object.assign(s,a),s):null},remove(i){const a=e.findIndex(l=>l.id===i);if(a<0)return null;const[s]=e.splice(a,1);return t.free(s.number),s},reset(){for(e=[],n={...ut},r=1;t.peekUsed().length;)t.free(t.peekUsed()[0])}}}function Ln(t){const e=Math.min(Math.max(t.x,0),.95),n=Math.min(Math.max(t.y,0),.95),r=Math.min(Math.max(t.w,.05),1-e),o=Math.min(Math.max(t.h,.05),1-n);return{x:e,y:n,w:r,h:o}}function $n(t,e){const n=t.type==="arrow"?(t.x+(t.x2??t.x))/2:t.x+(t.w||0)/2,r=t.type==="arrow"?(t.y+(t.y2??t.y))/2:t.y+(t.h||0)/2;return n>=e.x&&r>=e.y&&n<=e.x+e.w&&r<=e.y+e.h}function dt(t){const e=Math.max(1,Number(t)||1);return{stroke:Math.max(2,e*.0075),badgeRadius:Math.max(8,e*.025),fontSize:Math.max(10,e*.0275),arrowHead:Math.max(8,e*.035),arrowHeadAngle:.4}}function Rn(t,{stickers:e=[],crop:n={x:0,y:0,w:1,h:1},width:r,height:o,colors:i={}}){const a=i.mark||"#fdd341",s=i.markText||"#2a2140",l=dt(r);t.save(),t.lineWidth=l.stroke,t.lineCap="round",t.lineJoin="round",t.strokeStyle=a,t.fillStyle=a,t.font=`700 ${Math.round(l.fontSize)}px ui-sans-serif, system-ui, sans-serif`,e.forEach(u=>{const d=ft(u.x,n,r),p=ht(u.y,n,o),y=u.w/n.w*r,M=u.h/n.h*o,$=l.stroke/2;if(u.type==="rect")t.strokeRect(d+$,p+$,Math.max(0,y-l.stroke),Math.max(0,M-l.stroke));else if(u.type==="circle")t.beginPath(),t.ellipse(d+y/2,p+M/2,Math.max(.5,y/2-$),Math.max(.5,M/2-$),0,0,Math.PI*2),t.stroke();else if(u.type==="arrow"){const _=ft(u.x2??u.x+u.w,n,r),B=ht(u.y2??u.y,n,o);An(t,d,p,_,B,l)}if(u.number==null||u.number==="")return;const H=Pn(u,n,r,o,d,p,y),K=String(u.number);t.beginPath(),t.arc(H.x,H.y,l.badgeRadius,0,Math.PI*2),t.fillStyle=a,t.fill(),t.fillStyle=s,t.textAlign="center",t.textBaseline="middle",t.fillText(K,H.x,H.y+.5),t.fillStyle=a}),t.restore()}function ft(t,e,n){return(t-e.x)/e.w*n}function ht(t,e,n){return(t-e.y)/e.h*n}function Pn(t,e,n,r,o,i,a){if(t.type==="arrow"){const s=ft(t.x2??t.x+t.w,e,n),l=ht(t.y2??t.y,e,r);return{x:(o+s)/2,y:(i+l)/2}}return{x:o+a/2,y:i}}function Zt(t,e,n,r,o){const i=Math.atan2(r-e,n-t),a=o.arrowHead,s=Math.min(o.stroke,a*.2),l=n,u=r,d=n-Math.cos(i)*a,p=r-Math.sin(i)*a,y={x:l-a*Math.cos(i-o.arrowHeadAngle),y:u-a*Math.sin(i-o.arrowHeadAngle)},M={x:l-a*Math.cos(i+o.arrowHeadAngle),y:u-a*Math.sin(i+o.arrowHeadAngle)},$={x:n-Math.cos(i)*s,y:r-Math.sin(i)*s};return{angle:i,tipX:l,tipY:u,baseX:d,baseY:p,left:y,right:M,shaftEnd:$}}function An(t,e,n,r,o,i){const a=Zt(e,n,r,o,i);t.beginPath(),t.moveTo(e,n),t.lineTo(a.shaftEnd.x,a.shaftEnd.y),t.stroke(),t.beginPath(),t.moveTo(a.tipX,a.tipY),t.lineTo(a.left.x,a.left.y),t.lineTo(a.right.x,a.right.y),t.closePath(),t.fill()}function Tn(t,e,n,r={}){return new Promise((o,i)=>{const a=new Image;a.onload=()=>{const s=Math.round(e.x*a.width),l=Math.round(e.y*a.height),u=Math.max(1,Math.round(e.w*a.width)),d=Math.max(1,Math.round(e.h*a.height)),p=document.createElement("canvas");p.width=u,p.height=d;const y=p.getContext("2d");y.drawImage(a,s,l,u,d,0,0,u,d),Rn(y,{stickers:n,crop:e,width:u,height:d,colors:r}),p.toBlob(M=>{if(!M){i(new Error("Could not encode screenshot"));return}o(M)},"image/png")},a.onerror=()=>i(new Error("Could not load screenshot")),a.src=t})}const kn=["bug","idea","other"],In=["maker","all-business","brighter-day","quiet-night"],te="maker",On=new Set(["crop","arrow","rect","circle"]),mt=.02,ee=.05,Hn=`
3
3
  <svg class="nf-launcher-icon" viewBox="0 0 24 24" aria-hidden="true">
4
4
  <path fill="currentColor" d="M5.2 2.8h9.1A2.7 2.7 0 0 1 17 5.5v8.2c0 .4-.3.7-.7.7h-.1a.7.7 0 0 1-.7-.7V5.5c0-.7-.6-1.3-1.3-1.3H5.2c-.7 0-1.3.6-1.3 1.3v12.2c0 .7.6 1.3 1.3 1.3h6.4a.7.7 0 0 1 0 1.4H5.2A2.7 2.7 0 0 1 2.5 17.7V5.5A2.7 2.7 0 0 1 5.2 2.8zm1.6 4.2a.7.7 0 0 0 0 1.4h6.2a.7.7 0 0 0 0-1.4H6.8zm0 3.2a.7.7 0 0 0 0 1.4h6.2a.7.7 0 0 0 0-1.4H6.8zm0 3.2a.7.7 0 0 0 0 1.4h3.6a.7.7 0 0 0 0-1.4H6.8z"/>
5
5
  <path fill="currentColor" d="M14.7 13.05 20.2 7.55a1.55 1.55 0 0 1 2.2 2.2l-5.5 5.5-.45 1.9a.6.6 0 0 1-.72.45l-1.9-.45.87-1.9z"/>
6
6
  </svg>
7
- `;function k(t){return`<svg class="nf-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${t}</svg>`}const T={crop:k('<path d="M6 3v5H1M18 21v-5h5M8 5h8a2 2 0 0 1 2 2v8M16 19H8a2 2 0 0 1-2-2V8"/>'),resetCrop:k('<path d="M3 12a9 9 0 1 0 3-6.7L3 8"/><path d="M3 3v5h5"/>'),arrow:k('<path d="M5 19 19 5"/><path d="M9 5h10v10"/>'),rect:k('<rect x="4" y="6" width="16" height="12" rx="1.5"/>'),circle:k('<circle cx="12" cy="12" r="8"/>'),discard:k('<path d="M4 7h16"/><path d="M9 7V5h6v2"/><path d="M6 7l1 13h10l1-13"/>'),audio:k('<rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0"/><path d="M12 18v3"/>'),video:k('<rect x="3" y="7" width="13" height="10" rx="2"/><path d="M16 10.5 21 8v8l-5-2.5z"/>')},ne=gn();ne.hook();let h={endpoint:"",projectKey:"",version:"0.0.0",name:"",targets:null,hideLauncher:!1,theme:te,video:!1},mt={},f=null,c={},p=Qt(),v="",N="",L=null,Z="bug",I=null,$=null,g=null,w=null,tt=null,F=null,W=null,H={w:0,h:0},yt=!1;function S(t){return f.querySelector(t)}function re(t){const e=String(t||"").trim().toLowerCase().replace(/\s+/g,"-");return Ln.includes(e)?e:te}function ae(t,e){return f&&getComputedStyle(f).getPropertyValue(t).trim()||e}function b(t,e=!1){c.status&&(c.status.textContent=t||"",tt&&(clearTimeout(tt),tt=null),t&&!e&&(tt=setTimeout(()=>{c.status.textContent=""},4e3)))}function gt(){return f&&document.body.contains(f)||(f=document.createElement("div"),f.id="notefully",f.innerHTML=`
8
- <button class="nf-launcher" type="button" title="Leave a note…" aria-label="Leave a note…">${kn}</button>
7
+ `;function T(t){return`<svg class="nf-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${t}</svg>`}const k={crop:T('<path d="M6 3v5H1M18 21v-5h5M8 5h8a2 2 0 0 1 2 2v8M16 19H8a2 2 0 0 1-2-2V8"/>'),resetCrop:T('<path d="M3 12a9 9 0 1 0 3-6.7L3 8"/><path d="M3 3v5h5"/>'),arrow:T('<path d="M5 19 19 5"/><path d="M9 5h10v10"/>'),rect:T('<rect x="4" y="6" width="16" height="12" rx="1.5"/>'),circle:T('<circle cx="12" cy="12" r="8"/>'),discard:T('<path d="M4 7h16"/><path d="M9 7V5h6v2"/><path d="M6 7l1 13h10l1-13"/>'),audio:T('<rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0"/><path d="M12 18v3"/>'),video:T('<rect x="3" y="7" width="13" height="10" rx="2"/><path d="M16 10.5 21 8v8l-5-2.5z"/>')},ne=Sn();ne.hook();const re=10,Dn=80;let f={endpoint:"",projectKey:"",version:"0.0.0",name:"",targets:null,hideLauncher:!1,theme:te,video:!1,consoleLogLimit:re},pt={},h=null,c={},m=Qt(),v="",N="",P=null,Z="bug",I=null,L=null,g=null,w=null,tt=null,F=null,W=null,O={w:0,h:0},yt=!1;function S(t){return h.querySelector(t)}function ie(t){const e=String(t||"").trim().toLowerCase().replace(/\s+/g,"-");return In.includes(e)?e:te}function oe(t,e){return h&&getComputedStyle(h).getPropertyValue(t).trim()||e}function b(t,e=!1){c.status&&(c.status.textContent=t||"",tt&&(clearTimeout(tt),tt=null),t&&!e&&(tt=setTimeout(()=>{c.status.textContent=""},4e3)))}function gt(){return h&&document.body.contains(h)||(h=document.createElement("div"),h.id="notefully",h.innerHTML=`
8
+ <button class="nf-launcher" type="button" title="Leave a note…" aria-label="Leave a note…">${Hn}</button>
9
9
  <div class="nf-dialog" hidden>
10
10
  <div class="nf-panel">
11
11
  <div class="nf-stage">
12
12
  <div class="nf-palette">
13
- <button class="nf-tool nf-icon-btn" type="button" data-tool="crop" title="Crop" aria-label="Crop">${T.crop}</button>
14
- <button class="nf-reset-crop nf-icon-btn" type="button" title="Reset crop" aria-label="Reset crop" hidden>${T.resetCrop}</button>
15
- <button class="nf-tool nf-icon-btn" type="button" data-tool="arrow" title="Arrow" aria-label="Arrow">${T.arrow}</button>
16
- <button class="nf-tool nf-icon-btn" type="button" data-tool="rect" title="Rectangle" aria-label="Rectangle">${T.rect}</button>
17
- <button class="nf-tool nf-icon-btn" type="button" data-tool="circle" title="Circle" aria-label="Circle">${T.circle}</button>
13
+ <button class="nf-tool nf-icon-btn" type="button" data-tool="crop" title="Crop" aria-label="Crop">${k.crop}</button>
14
+ <button class="nf-reset-crop nf-icon-btn" type="button" title="Reset crop" aria-label="Reset crop" hidden>${k.resetCrop}</button>
15
+ <button class="nf-tool nf-icon-btn" type="button" data-tool="arrow" title="Arrow" aria-label="Arrow">${k.arrow}</button>
16
+ <button class="nf-tool nf-icon-btn" type="button" data-tool="rect" title="Rectangle" aria-label="Rectangle">${k.rect}</button>
17
+ <button class="nf-tool nf-icon-btn" type="button" data-tool="circle" title="Circle" aria-label="Circle">${k.circle}</button>
18
18
  </div>
19
19
  <div class="nf-canvas"></div>
20
20
  </div>
@@ -25,9 +25,9 @@ var Notefully=(function(P){"use strict";function pe(t,e){if(t.match(/^[a-z]+:\/\
25
25
  <button type="button" data-kind="other">Other</button>
26
26
  </div>
27
27
  <div class="nf-actions">
28
- <button class="nf-discard-shot nf-icon-btn" type="button" title="Discard screenshot" aria-label="Discard screenshot">${T.discard}</button>
29
- <button class="nf-audio nf-icon-btn" type="button" title="Record audio" aria-label="Record audio">${T.audio}</button>
30
- <button class="nf-video nf-icon-btn" type="button" title="Record video" aria-label="Record video">${T.video}</button>
28
+ <button class="nf-discard-shot nf-icon-btn" type="button" title="Discard screenshot" aria-label="Discard screenshot">${k.discard}</button>
29
+ <button class="nf-audio nf-icon-btn" type="button" title="Record audio" aria-label="Record audio">${k.audio}</button>
30
+ <button class="nf-video nf-icon-btn" type="button" title="Record video" aria-label="Record video">${k.video}</button>
31
31
  <button class="nf-submit" type="button">Submit</button>
32
32
  </div>
33
33
  <button class="nf-restore" type="button" hidden>Restore screenshot</button>
@@ -35,8 +35,8 @@ var Notefully=(function(P){"use strict";function pe(t,e){if(t.match(/^[a-z]+:\/\
35
35
  </div>
36
36
  </div>
37
37
  <button class="nf-stop-video" type="button" hidden>Stop</button>
38
- `,document.body.appendChild(f),c={launcher:S(".nf-launcher"),dialog:S(".nf-dialog"),stage:S(".nf-stage"),canvas:S(".nf-canvas"),text:S(".nf-text"),restore:S(".nf-restore"),status:S(".nf-status"),audio:S(".nf-audio"),video:S(".nf-video"),discard:S(".nf-discard-shot"),stop:S(".nf-stop-video"),resetCrop:S(".nf-reset-crop"),submit:S(".nf-submit"),shot:null},Tn(),et()),f}function et(){var t;f&&(f.dataset.theme=re(h.theme),h.hideLauncher?f.setAttribute("data-nf-hidden-launcher",""):f.removeAttribute("data-nf-hidden-launcher"),c.video&&(c.video.hidden=!h.video),(t=c.dialog)!=null&&t.hidden&&nt())}function nt(){c.launcher&&(c.launcher.hidden=!!h.hideLauncher)}function Tn(){c.launcher.addEventListener("click",()=>$t()),S(".nf-dialog").addEventListener("click",t=>{t.target===c.dialog&&X()}),f.querySelectorAll(".nf-tool").forEach(t=>{t.addEventListener("click",()=>bt(t.dataset.tool))}),c.resetCrop.addEventListener("click",Un),c.canvas.addEventListener("pointerdown",Hn),c.canvas.addEventListener("dragstart",t=>t.preventDefault()),f.querySelectorAll("[data-kind]").forEach(t=>{t.addEventListener("click",()=>wt(t.dataset.kind))}),c.discard.addEventListener("click",Bn),c.restore.addEventListener("click",Vn),c.audio.addEventListener("click",_n),c.video.addEventListener("click",Nn),c.stop.addEventListener("click",()=>W==null?void 0:W.stop()),S(".nf-submit").addEventListener("click",()=>{Rt().catch(t=>b(t.message||"Submit failed."))}),wt("bug"),bt(null)}function wt(t){Z=Pn.includes(t)?t:"bug",f.querySelectorAll("[data-kind]").forEach(e=>{e.dataset.active=String(e.dataset.kind===Z)})}function bt(t){I=An.has(t)?t:null,$=null,f.querySelectorAll(".nf-tool").forEach(e=>{e.dataset.active=String(e.dataset.tool===I)}),c.canvas&&(c.canvas.dataset.draw=I?"true":"false"),v&&C()}function ie(t){return Math.min(1,Math.max(0,t))}function q(){return c.shot||c.canvas}function rt(t){const e=q().getBoundingClientRect();return{x:ie((t.clientX-e.left)/Math.max(e.width,1)),y:ie((t.clientY-e.top)/Math.max(e.height,1))}}function In(t){const e=q().getBoundingClientRect();return t.clientX>=e.left&&t.clientX<=e.right&&t.clientY>=e.top&&t.clientY<=e.bottom}function oe(t){const e=rt(t),n=p.crop();return{x:n.x+e.x*n.w,y:n.y+e.y*n.h}}function at(t,e){const n=Math.min(t.x,e.x),r=Math.min(t.y,e.y);return{x:n,y:r,w:Math.max(pt,Math.abs(e.x-t.x)),h:Math.max(pt,Math.abs(e.y-t.y))}}function vt(t){f&&(t?f.dataset.grabbing="true":delete f.dataset.grabbing)}function St(t){try{c.canvas.setPointerCapture(t.pointerId)}catch{}}function xt(){window.addEventListener("pointermove",ce),window.addEventListener("pointerup",it),window.addEventListener("pointercancel",it)}function se(){window.removeEventListener("pointermove",ce),window.removeEventListener("pointerup",it),window.removeEventListener("pointercancel",it)}function Hn(t){if(t.button!==0||!v)return;if(!t.target.closest(".nf-sticker")&&!In(t)){$=null,C();return}const e=t.target.closest(".nf-handle"),n=t.target.closest(".nf-sticker");if(n&&n.dataset.preview!=="true"){t.preventDefault(),t.stopPropagation(),$=n.dataset.id,St(t),Dn({kind:"sticker",id:$,dir:(e==null?void 0:e.dataset.dir)||"move"},t),C();return}if($=null,I==="crop"){t.preventDefault(),St(t),g={kind:"crop",start:rt(t),current:rt(t)},xt(),C();return}if(I==="arrow"||I==="rect"||I==="circle"){t.preventDefault(),St(t);const r=oe(t);g={kind:"sticker",type:I,start:r,current:r},xt(),C();return}C()}function Dn(t,e){e.preventDefault(),e.stopPropagation();const n=q().getBoundingClientRect(),r=p.list().find(i=>i.id===t.id);w={...t,startX:e.clientX,startY:e.clientY,crop:p.crop(),sticker:r?{...r}:null,rect:n},vt(t.dir==="move"||t.dir==="start"||t.dir==="end"),xt()}function ce(t){if(g){g.current=g.kind==="crop"?rt(t):oe(t),C();return}if(!w)return;const e=(t.clientX-w.startX)/w.rect.width*w.crop.w,n=(t.clientY-w.startY)/w.rect.height*w.crop.h,r=w.sticker;if(r){if(w.dir==="end")p.update(r.id,{x2:r.x2+e,y2:r.y2+n});else if(w.dir==="start")p.update(r.id,{x:r.x+e,y:r.y+n});else if(w.dir==="move")p.update(r.id,{x:r.x+e,y:r.y+n,x2:(r.x2||r.x)+e,y2:(r.y2||r.y)+n});else{const i={x:r.x,y:r.y,w:r.w,h:r.h};On(i,w.dir,e,n),p.update(r.id,i)}C()}}function On(t,e,n,r){if(e.includes("e")&&(t.w=Math.max(.04,t.w+n)),e.includes("s")&&(t.h=Math.max(.04,t.h+r)),e.includes("w")){const i=Math.max(.04,t.w-n);t.x+=t.w-i,t.w=i}if(e.includes("n")){const i=Math.max(.04,t.h-r);t.y+=t.h-i,t.h=i}}function it(t){if(se(),vt(!1),g){Fn();return}if(w){if(w.kind==="sticker"){const e=c.canvas.getBoundingClientRect();(t.clientX<e.left-24||t.clientX>e.right+24||t.clientY<e.top-24||t.clientY>e.bottom+24)&&(p.remove(w.id),$=null)}w=null,C()}}function Fn(){const t=g;if(g=null,!t)return;if(t.kind==="crop"){const n=at(t.start,t.current);if(Math.abs(t.current.x-t.start.x)<ee||Math.abs(t.current.y-t.start.y)<ee){C();return}const i=p.crop();p.setCrop({x:i.x+n.x*i.w,y:i.y+n.y*i.h,w:n.w*i.w,h:n.h*i.h}),z();return}const e=jn(t);e&&($=e.id),C()}function jn(t){if(t.type==="arrow"){const e=t.current.x-t.start.x,n=t.current.y-t.start.y;return Math.hypot(e,n)<pt?p.add("arrow",{x:t.start.x,y:t.start.y,x2:t.start.x+.12,y2:t.start.y,w:.12,h:.02}):p.add("arrow",{x:t.start.x,y:t.start.y,x2:t.current.x,y2:t.current.y,w:Math.abs(e),h:Math.abs(n)})}return p.add(t.type,at(t.start,t.current))}function Un(){p.resetCrop(),$=null,z()}function Et(){c.resetCrop&&(c.resetCrop.hidden=!p.isCropped())}function Ct(t){if(!c.audio)return;const e=t?"Stop audio":"Record audio";c.audio.title=e,c.audio.setAttribute("aria-label",e),c.audio.dataset.active=String(!!t)}function Bn(){v&&(N=v),v="",c.stage.hidden=!0,c.restore.hidden=!N}function Vn(){N&&(v=N,c.stage.hidden=!1,c.restore.hidden=!0,z())}function _n(){try{if(F||(F=wn(e=>{const n=c.text.value.trim();c.text.value=n?`${n} ${e}`:e})),!F.isSupported()){b("Audio-to-text is not supported in this browser.");return}const t=F.start();Ct(t),b(t?"Listening…":"")}catch(t){b(t.message)}}async function Nn(){if(!h.video){b("Video is disabled on this host.");return}c.dialog.hidden=!0,c.stop.hidden=!1,et(),c.launcher.hidden=!0,W=vn({onStart(){},onStop(t){L=t,c.stop.hidden=!0,nt(),c.dialog.hidden=!1,z(),b(t?"Video attached.":"Recording cancelled.")},onError(t){b(t.message)}});try{await W.start()}catch(t){c.stop.hidden=!0,nt(),c.dialog.hidden=!1,b(t.message)}}function z(){if(c.shot=null,!v){c.canvas.style.removeProperty("--nf-shot-aspect"),c.canvas.style.removeProperty("aspect-ratio"),c.canvas.innerHTML=L?`<video class="nf-recording-preview" controls src="${URL.createObjectURL(L)}"></video>`:"",Et();return}c.canvas.innerHTML=`<div class="nf-shot"><img alt="Screenshot" src="${v}" draggable="false"></div>`,c.shot=c.canvas.querySelector(".nf-shot");const t=c.shot.querySelector("img");t.draggable=!1,t.addEventListener("dragstart",n=>n.preventDefault());const e=()=>{Wn(t),C()};t.addEventListener("load",e),t.complete&&t.naturalWidth&&e()}function Wn(t){const e=t.naturalWidth||H.w,n=t.naturalHeight||H.h;if(e&&n&&(H={w:e,h:n},c.canvas.style.setProperty("--nf-shot-aspect",String(e/n)),c.canvas.style.aspectRatio=`${e} / ${n}`),!c.shot||!H.w||!H.h)return;const r=p.crop(),i=H.w/H.h,a=r.w/r.h*i,o=Math.min(1,a/i),s=Math.min(1,i/a);c.shot.style.left=`${(1-o)/2*100}%`,c.shot.style.top=`${(1-s)/2*100}%`,c.shot.style.width=`${o*100}%`,c.shot.style.height=`${s*100}%`,t.style.width=`${100/r.w}%`,t.style.height=`${100/r.h}%`,t.style.left=`${-r.x/r.w*100}%`,t.style.top=`${-r.y/r.h*100}%`}function qn(t){return t.type==="arrow"?{id:"preview",type:"arrow",number:"",x:t.start.x,y:t.start.y,x2:t.current.x,y2:t.current.y,w:Math.abs(t.current.x-t.start.x),h:Math.abs(t.current.y-t.start.y)}:{id:"preview",type:t.type,number:"",...at(t.start,t.current)}}function C(){if((c.shot||c.canvas).querySelectorAll(".nf-sticker, .nf-crop").forEach(a=>a.remove()),!v||!c.shot){Et();return}const e=p.crop(),n=q(),r=dt(n.clientWidth||400);if(c.shot.style.setProperty("--nf-anno-stroke",`${r.stroke}px`),c.shot.style.setProperty("--nf-anno-badge",`${r.badgeRadius*2}px`),c.shot.style.setProperty("--nf-anno-badge-font",`${r.fontSize}px`),c.shot.style.setProperty("--nf-anno-handle",`${Math.max(8,r.stroke*2.5)}px`),(g==null?void 0:g.kind)==="crop"){const a=document.createElement("div");a.className="nf-crop",le(a,at(g.start,g.current),{x:0,y:0,w:1,h:1}),c.shot.appendChild(a)}const i=p.list().slice();if((g==null?void 0:g.kind)==="sticker"&&i.push(qn(g)),i.forEach(a=>{const o=a.id==="preview",s=!o&&a.id===$,l=document.createElement("div");if(l.className=`nf-sticker nf-${a.type}`,l.dataset.id=a.id,s&&(l.dataset.selected="true"),o&&(l.dataset.preview="true"),a.type==="arrow"?zn(l,a,e,s,r):(le(l,a,e),s&&["nw","ne","sw","se"].forEach(u=>Mt(l,u))),!o&&a.number){const u=document.createElement("span");u.className="nf-badge",u.textContent=String(a.number),l.appendChild(u)}c.shot.appendChild(l)}),c.canvas.querySelectorAll(":scope > .nf-recording-preview").forEach(a=>a.remove()),L){const a=document.createElement("video");a.className="nf-recording-preview",a.controls=!0,a.src=URL.createObjectURL(L),a.style.position="absolute",a.style.right="8px",a.style.bottom="8px",a.style.width="160px",c.canvas.appendChild(a)}Et()}function zn(t,e,n,r,i=dt(400)){const a=q(),o=a.clientWidth,s=a.clientHeight,l=(e.x-n.x)/n.w*o,u=(e.y-n.y)/n.h*s,d=((e.x2??e.x+e.w)-n.x)/n.w*o,m=((e.y2??e.y)-n.y)/n.h*s,y=Math.max(18,i.arrowHead+i.stroke*2),M=Math.min(l,d)-y,R=Math.min(u,m)-y,D=Math.max(2,Math.abs(d-l))+y*2,K=Math.max(2,Math.abs(m-u))+y*2,B=l-M,V=u-R,Lt=d-M,At=m-R,O=Zt(B,V,Lt,At,i),_=document.createElementNS("http://www.w3.org/2000/svg","svg");t.style.left=`${M}px`,t.style.top=`${R}px`,t.style.width=`${D}px`,t.style.height=`${K}px`,_.setAttribute("class","nf-arrow-svg"),_.setAttribute("viewBox",`0 0 ${D} ${K}`),_.setAttribute("width",String(D)),_.setAttribute("height",String(K)),_.innerHTML=`
39
- <line class="nf-arrow-hit" x1="${B}" y1="${V}" x2="${Lt}" y2="${At}" />
40
- <line class="nf-arrow-shaft" x1="${B}" y1="${V}" x2="${O.shaftEnd.x}" y2="${O.shaftEnd.y}" />
41
- <polygon class="nf-arrow-head" points="${O.tipX},${O.tipY} ${O.left.x},${O.left.y} ${O.right.x},${O.right.y}" />
42
- `,t.appendChild(_),r&&(Mt(t,"start",{left:B-5,top:V-5}),Mt(t,"end",{left:Lt-5,top:At-5}))}function Mt(t,e,n){const r=document.createElement("span");r.className="nf-handle",r.dataset.dir=e,n&&(r.style.left=`${n.left}px`,r.style.top=`${n.top}px`),t.appendChild(r)}function le(t,e,n){t.style.left=`${(e.x-n.x)/n.w*100}%`,t.style.top=`${(e.y-n.y)/n.h*100}%`,t.style.width=`${e.w/n.w*100}%`,t.style.height=`${e.h/n.h*100}%`}function ue(t={}){return mn(t),h={...h,endpoint:String(t.endpoint||h.endpoint||"").replace(/\/$/,""),projectKey:t.projectKey==null?h.projectKey:String(t.projectKey),version:t.version==null?h.version:String(t.version),name:t.name==null?h.name:String(t.name||""),targets:t.targets===void 0?h.targets:t.targets,hideLauncher:t.hideLauncher==null?h.hideLauncher:!!t.hideLauncher,theme:re(t.theme??h.theme),video:t.video==null?h.video:!!t.video},gt(),et(),Pt}async function $t(){gt(),et(),c.launcher.hidden=!0,p=Qt(),H={w:0,h:0},L=null,$=null,g=null,w=null,Z="bug",wt("bug"),bt(null),Ct(!1),c.text.value="",b("");try{v=await fn(),N=v,c.stage.hidden=!1,c.restore.hidden=!0,b("")}catch{v="",b("Screenshot failed; you can still send text.")}c.dialog.hidden=!1,z(),c.text.focus()}function X(){f&&(F==null||F.stop(),Ct(!1),se(),g=null,w=null,vt(!1),c.dialog.hidden=!0,c.stop.hidden=!0,nt())}function de(t={}){mt={...mt,...pn(t)}}async function Rt(){if(gt(),yt)return null;const t=c.text.value.trim();if(!t&&!v&&!L)return b("Add a note, screenshot, or video first."),null;if(!h.endpoint||!h.projectKey)return b("Notefully is missing endpoint or projectKey."),null;yt=!0,fe(!0),b("Submitting…",!0);try{const e=new FormData;if(e.append("message",t),e.append("kind",Z),e.append("version",h.version||"0.0.0"),h.name&&e.append("name",h.name),e.append("context",JSON.stringify({...hn(mt),console:ne.snapshot()})),e.append("annotations",JSON.stringify(p.list())),Array.isArray(h.targets)&&e.append("targets",JSON.stringify(h.targets)),v){const i=await Rn(v,p.crop(),p.list(),{mark:ae("--nf-mark","#fdd341"),markText:ae("--nf-mark-text","#2a2140")});e.append("screenshot",i,"screenshot.png")}L&&e.append("recording",L,"recording.webm");const n=await fetch(`${h.endpoint}/v1/reports`,{method:"POST",headers:{"X-Notefully-Key":h.projectKey},body:e});let r=null;try{r=await n.json()}catch{r=null}if(!n.ok)throw b((r==null?void 0:r.error)||"Submit failed."),new Error((r==null?void 0:r.error)||`Submit failed (${n.status})`);return b("Sent. Thank you."),X(),r}finally{yt=!1,fe(!1)}}function fe(t){c.submit&&(c.submit.disabled=!!t,c.submit.setAttribute("aria-busy",t?"true":"false"))}function he(){X(),f==null||f.remove(),f=null,c={}}const Pt={init:ue,open:$t,close:X,identify:de,submit:Rt,destroy:he};return typeof window<"u"&&(window.Notefully=Pt),P.close=X,P.default=Pt,P.destroy=he,P.identify=de,P.init=ue,P.open=$t,P.submit=Rt,Object.defineProperties(P,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),P})({});
38
+ `,document.body.appendChild(h),c={launcher:S(".nf-launcher"),dialog:S(".nf-dialog"),stage:S(".nf-stage"),canvas:S(".nf-canvas"),text:S(".nf-text"),restore:S(".nf-restore"),status:S(".nf-status"),audio:S(".nf-audio"),video:S(".nf-video"),discard:S(".nf-discard-shot"),stop:S(".nf-stop-video"),resetCrop:S(".nf-reset-crop"),submit:S(".nf-submit"),shot:null},Fn(),et()),h}function et(){var t;h&&(h.dataset.theme=ie(f.theme),f.hideLauncher?h.setAttribute("data-nf-hidden-launcher",""):h.removeAttribute("data-nf-hidden-launcher"),c.video&&(c.video.hidden=!f.video),(t=c.dialog)!=null&&t.hidden&&nt())}function nt(){c.launcher&&(c.launcher.hidden=!!f.hideLauncher)}function Fn(){c.launcher.addEventListener("click",()=>Lt()),S(".nf-dialog").addEventListener("click",t=>{t.target===c.dialog&&X()}),h.querySelectorAll(".nf-tool").forEach(t=>{t.addEventListener("click",()=>bt(t.dataset.tool))}),c.resetCrop.addEventListener("click",Wn),c.canvas.addEventListener("pointerdown",Un),c.canvas.addEventListener("dragstart",t=>t.preventDefault()),h.querySelectorAll("[data-kind]").forEach(t=>{t.addEventListener("click",()=>wt(t.dataset.kind))}),c.discard.addEventListener("click",qn),c.restore.addEventListener("click",zn),c.audio.addEventListener("click",Xn),c.video.addEventListener("click",Kn),c.stop.addEventListener("click",()=>W==null?void 0:W.stop()),S(".nf-submit").addEventListener("click",()=>{$t().catch(t=>b(t.message||"Submit failed."))}),wt("bug"),bt(null)}function wt(t){Z=kn.includes(t)?t:"bug",h.querySelectorAll("[data-kind]").forEach(e=>{e.dataset.active=String(e.dataset.kind===Z)})}function bt(t){I=On.has(t)?t:null,L=null,h.querySelectorAll(".nf-tool").forEach(e=>{e.dataset.active=String(e.dataset.tool===I)}),c.canvas&&(c.canvas.dataset.draw=I?"true":"false"),v&&C()}function ae(t){return Math.min(1,Math.max(0,t))}function q(){return c.shot||c.canvas}function rt(t){const e=q().getBoundingClientRect();return{x:ae((t.clientX-e.left)/Math.max(e.width,1)),y:ae((t.clientY-e.top)/Math.max(e.height,1))}}function jn(t){const e=q().getBoundingClientRect();return t.clientX>=e.left&&t.clientX<=e.right&&t.clientY>=e.top&&t.clientY<=e.bottom}function se(t){const e=rt(t),n=m.crop();return{x:n.x+e.x*n.w,y:n.y+e.y*n.h}}function it(t,e){const n=Math.min(t.x,e.x),r=Math.min(t.y,e.y);return{x:n,y:r,w:Math.max(mt,Math.abs(e.x-t.x)),h:Math.max(mt,Math.abs(e.y-t.y))}}function vt(t){h&&(t?h.dataset.grabbing="true":delete h.dataset.grabbing)}function St(t){try{c.canvas.setPointerCapture(t.pointerId)}catch{}}function xt(){window.addEventListener("pointermove",le),window.addEventListener("pointerup",ot),window.addEventListener("pointercancel",ot)}function ce(){window.removeEventListener("pointermove",le),window.removeEventListener("pointerup",ot),window.removeEventListener("pointercancel",ot)}function Un(t){if(t.button!==0||!v)return;if(!t.target.closest(".nf-sticker")&&!jn(t)){L=null,C();return}const e=t.target.closest(".nf-handle"),n=t.target.closest(".nf-sticker");if(n&&n.dataset.preview!=="true"){t.preventDefault(),t.stopPropagation(),L=n.dataset.id,St(t),_n({kind:"sticker",id:L,dir:(e==null?void 0:e.dataset.dir)||"move"},t),C();return}if(L=null,I==="crop"){t.preventDefault(),St(t),g={kind:"crop",start:rt(t),current:rt(t)},xt(),C();return}if(I==="arrow"||I==="rect"||I==="circle"){t.preventDefault(),St(t);const r=se(t);g={kind:"sticker",type:I,start:r,current:r},xt(),C();return}C()}function _n(t,e){e.preventDefault(),e.stopPropagation();const n=q().getBoundingClientRect(),r=m.list().find(o=>o.id===t.id);w={...t,startX:e.clientX,startY:e.clientY,crop:m.crop(),sticker:r?{...r}:null,rect:n},vt(t.dir==="move"||t.dir==="start"||t.dir==="end"),xt()}function le(t){if(g){g.current=g.kind==="crop"?rt(t):se(t),C();return}if(!w)return;const e=(t.clientX-w.startX)/w.rect.width*w.crop.w,n=(t.clientY-w.startY)/w.rect.height*w.crop.h,r=w.sticker;if(r){if(w.dir==="end")m.update(r.id,{x2:r.x2+e,y2:r.y2+n});else if(w.dir==="start")m.update(r.id,{x:r.x+e,y:r.y+n});else if(w.dir==="move")m.update(r.id,{x:r.x+e,y:r.y+n,x2:(r.x2||r.x)+e,y2:(r.y2||r.y)+n});else{const o={x:r.x,y:r.y,w:r.w,h:r.h};Bn(o,w.dir,e,n),m.update(r.id,o)}C()}}function Bn(t,e,n,r){if(e.includes("e")&&(t.w=Math.max(.04,t.w+n)),e.includes("s")&&(t.h=Math.max(.04,t.h+r)),e.includes("w")){const o=Math.max(.04,t.w-n);t.x+=t.w-o,t.w=o}if(e.includes("n")){const o=Math.max(.04,t.h-r);t.y+=t.h-o,t.h=o}}function ot(t){if(ce(),vt(!1),g){Vn();return}if(w){if(w.kind==="sticker"){const e=c.canvas.getBoundingClientRect();(t.clientX<e.left-24||t.clientX>e.right+24||t.clientY<e.top-24||t.clientY>e.bottom+24)&&(m.remove(w.id),L=null)}w=null,C()}}function Vn(){const t=g;if(g=null,!t)return;if(t.kind==="crop"){const n=it(t.start,t.current);if(Math.abs(t.current.x-t.start.x)<ee||Math.abs(t.current.y-t.start.y)<ee){C();return}const o=m.crop();m.setCrop({x:o.x+n.x*o.w,y:o.y+n.y*o.h,w:n.w*o.w,h:n.h*o.h}),z();return}const e=Nn(t);e&&(L=e.id),C()}function Nn(t){if(t.type==="arrow"){const e=t.current.x-t.start.x,n=t.current.y-t.start.y;return Math.hypot(e,n)<mt?m.add("arrow",{x:t.start.x,y:t.start.y,x2:t.start.x+.12,y2:t.start.y,w:.12,h:.02}):m.add("arrow",{x:t.start.x,y:t.start.y,x2:t.current.x,y2:t.current.y,w:Math.abs(e),h:Math.abs(n)})}return m.add(t.type,it(t.start,t.current))}function Wn(){m.resetCrop(),L=null,z()}function Et(){c.resetCrop&&(c.resetCrop.hidden=!m.isCropped())}function Ct(t){if(!c.audio)return;const e=t?"Stop audio":"Record audio";c.audio.title=e,c.audio.setAttribute("aria-label",e),c.audio.dataset.active=String(!!t)}function qn(){v&&(N=v),v="",c.stage.hidden=!0,c.restore.hidden=!N}function zn(){N&&(v=N,c.stage.hidden=!1,c.restore.hidden=!0,z())}function Xn(){try{if(F||(F=xn(e=>{const n=c.text.value.trim();c.text.value=n?`${n} ${e}`:e})),!F.isSupported()){b("Audio-to-text is not supported in this browser.");return}const t=F.start();Ct(t),b(t?"Listening…":"")}catch(t){b(t.message)}}async function Kn(){if(!f.video){b("Video is disabled on this host.");return}c.dialog.hidden=!0,c.stop.hidden=!1,et(),c.launcher.hidden=!0,W=Cn({onStart(){},onStop(t){P=t,c.stop.hidden=!0,nt(),c.dialog.hidden=!1,z(),b(t?"Video attached.":"Recording cancelled.")},onError(t){b(t.message)}});try{await W.start()}catch(t){c.stop.hidden=!0,nt(),c.dialog.hidden=!1,b(t.message)}}function z(){if(c.shot=null,!v){c.canvas.style.removeProperty("--nf-shot-aspect"),c.canvas.style.removeProperty("aspect-ratio"),c.canvas.innerHTML=P?`<video class="nf-recording-preview" controls src="${URL.createObjectURL(P)}"></video>`:"",Et();return}c.canvas.innerHTML=`<div class="nf-shot"><img alt="Screenshot" src="${v}" draggable="false"></div>`,c.shot=c.canvas.querySelector(".nf-shot");const t=c.shot.querySelector("img");t.draggable=!1,t.addEventListener("dragstart",n=>n.preventDefault());const e=()=>{Yn(t),C()};t.addEventListener("load",e),t.complete&&t.naturalWidth&&e()}function Yn(t){const e=t.naturalWidth||O.w,n=t.naturalHeight||O.h;if(e&&n&&(O={w:e,h:n},c.canvas.style.setProperty("--nf-shot-aspect",String(e/n)),c.canvas.style.aspectRatio=`${e} / ${n}`),!c.shot||!O.w||!O.h)return;const r=m.crop(),o=O.w/O.h,i=r.w/r.h*o,a=Math.min(1,i/o),s=Math.min(1,o/i);c.shot.style.left=`${(1-a)/2*100}%`,c.shot.style.top=`${(1-s)/2*100}%`,c.shot.style.width=`${a*100}%`,c.shot.style.height=`${s*100}%`,t.style.width=`${100/r.w}%`,t.style.height=`${100/r.h}%`,t.style.left=`${-r.x/r.w*100}%`,t.style.top=`${-r.y/r.h*100}%`}function Gn(t){return t.type==="arrow"?{id:"preview",type:"arrow",number:"",x:t.start.x,y:t.start.y,x2:t.current.x,y2:t.current.y,w:Math.abs(t.current.x-t.start.x),h:Math.abs(t.current.y-t.start.y)}:{id:"preview",type:t.type,number:"",...it(t.start,t.current)}}function C(){if((c.shot||c.canvas).querySelectorAll(".nf-sticker, .nf-crop").forEach(i=>i.remove()),!v||!c.shot){Et();return}const e=m.crop(),n=q(),r=dt(n.clientWidth||400);if(c.shot.style.setProperty("--nf-anno-stroke",`${r.stroke}px`),c.shot.style.setProperty("--nf-anno-badge",`${r.badgeRadius*2}px`),c.shot.style.setProperty("--nf-anno-badge-font",`${r.fontSize}px`),c.shot.style.setProperty("--nf-anno-handle",`${Math.max(8,r.stroke*2.5)}px`),(g==null?void 0:g.kind)==="crop"){const i=document.createElement("div");i.className="nf-crop",ue(i,it(g.start,g.current),{x:0,y:0,w:1,h:1}),c.shot.appendChild(i)}const o=m.list().slice();if((g==null?void 0:g.kind)==="sticker"&&o.push(Gn(g)),o.forEach(i=>{const a=i.id==="preview",s=!a&&i.id===L,l=document.createElement("div");if(l.className=`nf-sticker nf-${i.type}`,l.dataset.id=i.id,s&&(l.dataset.selected="true"),a&&(l.dataset.preview="true"),i.type==="arrow"?Jn(l,i,e,s,r):(ue(l,i,e),s&&["nw","ne","sw","se"].forEach(u=>Mt(l,u))),!a&&i.number){const u=document.createElement("span");u.className="nf-badge",u.textContent=String(i.number),l.appendChild(u)}c.shot.appendChild(l)}),c.canvas.querySelectorAll(":scope > .nf-recording-preview").forEach(i=>i.remove()),P){const i=document.createElement("video");i.className="nf-recording-preview",i.controls=!0,i.src=URL.createObjectURL(P),i.style.position="absolute",i.style.right="8px",i.style.bottom="8px",i.style.width="160px",c.canvas.appendChild(i)}Et()}function Jn(t,e,n,r,o=dt(400)){const i=q(),a=i.clientWidth,s=i.clientHeight,l=(e.x-n.x)/n.w*a,u=(e.y-n.y)/n.h*s,d=((e.x2??e.x+e.w)-n.x)/n.w*a,p=((e.y2??e.y)-n.y)/n.h*s,y=Math.max(18,o.arrowHead+o.stroke*2),M=Math.min(l,d)-y,$=Math.min(u,p)-y,H=Math.max(2,Math.abs(d-l))+y*2,K=Math.max(2,Math.abs(p-u))+y*2,_=l-M,B=u-$,Pt=d-M,At=p-$,D=Zt(_,B,Pt,At,o),V=document.createElementNS("http://www.w3.org/2000/svg","svg");t.style.left=`${M}px`,t.style.top=`${$}px`,t.style.width=`${H}px`,t.style.height=`${K}px`,V.setAttribute("class","nf-arrow-svg"),V.setAttribute("viewBox",`0 0 ${H} ${K}`),V.setAttribute("width",String(H)),V.setAttribute("height",String(K)),V.innerHTML=`
39
+ <line class="nf-arrow-hit" x1="${_}" y1="${B}" x2="${Pt}" y2="${At}" />
40
+ <line class="nf-arrow-shaft" x1="${_}" y1="${B}" x2="${D.shaftEnd.x}" y2="${D.shaftEnd.y}" />
41
+ <polygon class="nf-arrow-head" points="${D.tipX},${D.tipY} ${D.left.x},${D.left.y} ${D.right.x},${D.right.y}" />
42
+ `,t.appendChild(V),r&&(Mt(t,"start",{left:_-5,top:B-5}),Mt(t,"end",{left:Pt-5,top:At-5}))}function Mt(t,e,n){const r=document.createElement("span");r.className="nf-handle",r.dataset.dir=e,n&&(r.style.left=`${n.left}px`,r.style.top=`${n.top}px`),t.appendChild(r)}function ue(t,e,n){t.style.left=`${(e.x-n.x)/n.w*100}%`,t.style.top=`${(e.y-n.y)/n.h*100}%`,t.style.width=`${e.w/n.w*100}%`,t.style.height=`${e.h/n.h*100}%`}function de(t,e=re){const n=Number(t);return Number.isFinite(n)?Math.min(Dn,Math.max(0,Math.floor(n))):e}function fe(t={}){return bn(t),f={...f,endpoint:String(t.endpoint||f.endpoint||"").replace(/\/$/,""),projectKey:t.projectKey==null?f.projectKey:String(t.projectKey),version:t.version==null?f.version:String(t.version),name:t.name==null?f.name:String(t.name||""),targets:t.targets===void 0?f.targets:t.targets,hideLauncher:t.hideLauncher==null?f.hideLauncher:!!t.hideLauncher,theme:ie(t.theme??f.theme),video:t.video==null?f.video:!!t.video,consoleLogLimit:t.consoleLogLimit==null?f.consoleLogLimit:de(t.consoleLogLimit,f.consoleLogLimit)},gt(),et(),Rt}async function Lt(){gt(),et(),c.launcher.hidden=!0,m=Qt(),O={w:0,h:0},P=null,L=null,g=null,w=null,Z="bug",wt("bug"),bt(null),Ct(!1),c.text.value="",b("");try{v=await mn(),N=v,c.stage.hidden=!1,c.restore.hidden=!0,b("")}catch{v="",b("Screenshot failed; you can still send text.")}c.dialog.hidden=!1,z(),c.text.focus()}function X(){h&&(F==null||F.stop(),Ct(!1),ce(),g=null,w=null,vt(!1),c.dialog.hidden=!0,c.stop.hidden=!0,nt())}function he(t={}){pt={...pt,...wn(t)}}async function $t(){if(gt(),yt)return null;const t=c.text.value.trim();if(!t&&!v&&!P)return b("Add a note, screenshot, or video first."),null;if(!f.endpoint||!f.projectKey)return b("Notefully is missing endpoint or projectKey."),null;yt=!0,me(!0),b("Submitting…",!0);try{const e=new FormData;if(e.append("message",t),e.append("kind",Z),e.append("version",f.version||"0.0.0"),f.name&&e.append("name",f.name),e.append("context",JSON.stringify({...gn(pt),console:ne.snapshot().slice(-de(f.consoleLogLimit))})),e.append("annotations",JSON.stringify(m.list())),Array.isArray(f.targets)&&e.append("targets",JSON.stringify(f.targets)),v){const o=await Tn(v,m.crop(),m.list(),{mark:oe("--nf-mark","#fdd341"),markText:oe("--nf-mark-text","#2a2140")});e.append("screenshot",o,"screenshot.png")}P&&e.append("recording",P,"recording.webm");const n=await fetch(`${f.endpoint}/v1/reports`,{method:"POST",headers:{"X-Notefully-Key":f.projectKey},body:e});let r=null;try{r=await n.json()}catch{r=null}if(!n.ok)throw b((r==null?void 0:r.error)||"Submit failed."),new Error((r==null?void 0:r.error)||`Submit failed (${n.status})`);return b("Sent. Thank you."),X(),r}finally{yt=!1,me(!1)}}function me(t){c.submit&&(c.submit.disabled=!!t,c.submit.setAttribute("aria-busy",t?"true":"false"))}function pe(){X(),h==null||h.remove(),h=null,c={}}const Rt={init:fe,open:Lt,close:X,identify:he,submit:$t,destroy:pe};return typeof window<"u"&&(window.Notefully=Rt),R.close=X,R.default=Rt,R.destroy=pe,R.identify=he,R.init=fe,R.open=Lt,R.submit=$t,Object.defineProperties(R,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),R})({});