@makefully/notefully 0.1.22 → 0.1.26

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
@@ -23,6 +23,8 @@ Notefully.init({
23
23
  theme: 'maker', // maker | all-business | brighter-day | quiet-night
24
24
  video: false, // default; set true to enable screen recording
25
25
  consoleLogLimit: 10, // most recent console lines attached to each report (0–80)
26
+ // kinds default to bug / idea / other. Pass kinds to replace the full list:
27
+ // kinds: ['bug', 'idea', { id: 'polish', label: 'Polish' }, 'other'],
26
28
  hideLauncher: true // optional; drive open/submit from your own UI
27
29
  });
28
30
 
@@ -77,4 +79,17 @@ Unknown keys are ignored and warned in the console. Identity is attached to each
77
79
 
78
80
  When any identify field is set, the widget hides the Author input and uses that identity as the reporter (`displayName`, else `email`, else `userId`). Without `identify()`, the Author field stays visible (prefilled from `localStorage`) so guests can name themselves.
79
81
 
82
+ ### Report kinds
83
+
84
+ By default the dialog offers **Bug**, **Idea**, and **Other**. Pass `kinds` to replace that list entirely:
85
+
86
+ ```js
87
+ Notefully.init({
88
+ // …
89
+ kinds: ['bug', 'idea', { id: 'ux', label: 'UX' }, 'other']
90
+ });
91
+ ```
92
+
93
+ Kind ids are lowercased slugs (`polish`, `ux`). Labels default to title case; use `{ id, label }` for custom labels. The relay stores whatever kind the widget submits.
94
+
80
95
  Secrets never go in the widget — only the public project key and relay URL.
@@ -1,11 +1,11 @@
1
- var Notefully=(function(A){"use strict";function Se(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 ve=(()=>{let t=0;const e=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(t+=1,`u${e()}${t}`)})();function T(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=T(window.getComputedStyle(document.documentElement)),j))}function G(t,e){const r=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return r?parseFloat(r.replace("px","")):0}function xe(t){const e=G(t,"border-left-width"),n=G(t,"border-right-width");return t.clientWidth+e+n}function Ee(t){const e=G(t,"border-top-width"),n=G(t,"border-bottom-width");return t.clientHeight+e+n}function It(t,e={}){const n=e.width||xe(t),r=e.height||Ee(t);return{width:n,height:r}}function Ce(){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 Me(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 J(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 Le(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function $e(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),Le(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 Re(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function Ae(t,e){return kt(e).map(n=>{const r=t.getPropertyValue(n),o=t.getPropertyPriority(n);return`${n}: ${r}${o?" !important":""};`}).join(" ")}function Pe(t,e,n,r){const o=`.${t}:${e}`,i=n.cssText?Re(n):Ae(n,r);return document.createTextNode(`${o}{${i}}`)}function Ot(t,e,n,r){const o=window.getComputedStyle(t,n),i=o.getPropertyValue("content");if(i===""||i==="none")return;const a=ve();try{e.className=`${e.className} ${a}`}catch{return}const s=document.createElement("style");s.appendChild(Pe(a,n,o,r)),e.appendChild(s)}function Te(t,e,n){Ot(t,e,":before",n),Ot(t,e,":after",n)}const Ht="application/font-woff",Dt="image/jpeg",ke={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 Ie(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function st(t){const e=Ie(t).toLowerCase();return ke[e]||""}function Oe(t){return t.split(/,/)[1]}function ct(t){return t.search(/^(data:)/)!==-1}function He(t,e){return`data:${e};base64,${t}`}async function Ft(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 lt={};function De(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 ut(t,e,n){const r=De(t,e,n.includeQueryParams);if(lt[r]!=null)return lt[r];n.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+new Date().getTime());let o;try{const i=await Ft(t,n.fetchRequestInit,({res:a,result:s})=>(e||(e=a.headers.get("Content-Type")||""),Oe(s)));o=He(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 lt[r]=o,o}async function Fe(t){const e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):J(e)}async function Ue(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 J(s)}const n=t.poster,r=st(n),o=await ut(n,r,e);return J(o)}async function je(t,e){var n;try{if(!((n=t==null?void 0:t.contentDocument)===null||n===void 0)&&n.body)return await Q(t.contentDocument.body,e,!0)}catch{}return t.cloneNode(!1)}async function _e(t,e){return x(t,HTMLCanvasElement)?Fe(t):x(t,HTMLVideoElement)?Ue(t,e):x(t,HTMLIFrameElement)?je(t,e):t.cloneNode(Ut(t))}const Ne=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",Ut=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function Be(t,e,n){var r,o;if(Ut(e))return e;let i=[];return Ne(t)&&t.assignedNodes?i=T(t.assignedNodes()):x(t,HTMLIFrameElement)&&(!((r=t.contentDocument)===null||r===void 0)&&r.body)?i=T(t.contentDocument.body.childNodes):i=T(((o=t.shadowRoot)!==null&&o!==void 0?o:t).childNodes),i.length===0||x(t,HTMLVideoElement)||await i.reduce((a,s)=>a.then(()=>Q(s,n)).then(l=>{l&&e.appendChild(l)}),Promise.resolve()),e}function Ve(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):kt(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 We(t,e){x(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),x(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function qe(t,e){if(x(t,HTMLSelectElement)){const r=Array.from(e.children).find(o=>t.value===o.getAttribute("value"));r&&r.setAttribute("selected","")}}function ze(t,e,n){return x(e,Element)&&(Ve(t,e,n),Te(t,e,n),We(t,e),qe(t,e)),e}async function Xe(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 Q(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 Q(t,e,n){return!n&&e.filter&&!e.filter(t)?null:Promise.resolve(t).then(r=>_e(r,e)).then(r=>Be(t,r,e)).then(r=>ze(t,r,e)).then(r=>Xe(r,e))}const jt=/url\((['"]?)([^'"]+?)\1\)/g,Ye=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,Ke=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function Ge(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function Je(t){const e=[];return t.replace(jt,(n,r,o)=>(e.push(o),n)),e.filter(n=>!ct(n))}async function Qe(t,e,n,r,o){try{const i=n?Se(e,n):e,a=st(e);let s;return o||(s=await ut(i,a,r)),t.replace(Ge(e),`$1${s}$3`)}catch{}return t}function Ze(t,{preferredFontFormat:e}){return e?t.replace(Ke,n=>{for(;;){const[r,,o]=Ye.exec(n)||[];if(!o)return"";if(o===e)return`src: ${r};`}}):t}function _t(t){return t.search(jt)!==-1}async function Nt(t,e,n){if(!_t(t))return t;const r=Ze(t,n);return Je(r).reduce((i,a)=>i.then(s=>Qe(s,a,e,n)),Promise.resolve(r))}async function _(t,e,n){var r;const o=(r=e.style)===null||r===void 0?void 0:r.getPropertyValue(t);if(o){const i=await Nt(o,null,n);return e.style.setProperty(t,i,e.style.getPropertyPriority(t)),!0}return!1}async function tn(t,e){await _("background",t,e)||await _("background-image",t,e),await _("mask",t,e)||await _("-webkit-mask",t,e)||await _("mask-image",t,e)||await _("-webkit-mask-image",t,e)}async function en(t,e){const n=x(t,HTMLImageElement);if(!(n&&!ct(t.src))&&!(x(t,SVGImageElement)&&!ct(t.href.baseVal)))return;const r=n?t.src:t.href.baseVal,o=await ut(r,st(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 nn(t,e){const r=T(t.childNodes).map(o=>Bt(o,e));await Promise.all(r).then(()=>t)}async function Bt(t,e){x(t,Element)&&(await tn(t,e),await en(t,e),await nn(t,e))}function rn(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 Wt(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 qt(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),Ft(s,e.fetchRequestInit,({result:l})=>(n=n.replace(a,`url(${l})`),[a,l]))});return Promise.all(i).then(()=>n)}function zt(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 on(t,e){const n=[],r=[];return t.forEach(o=>{if("cssRules"in o)try{T(o.cssRules||[]).forEach((i,a)=>{if(i.type===CSSRule.IMPORT_RULE){let s=a+1;const l=i.href,u=Wt(l).then(d=>qt(d,e)).then(d=>zt(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(Wt(o.href).then(s=>qt(s,e)).then(s=>zt(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{T(o.cssRules||[]).forEach(i=>{n.push(i)})}catch(i){console.error(`Error while reading CSS rules from ${o.href}`,i)}}),n))}function an(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>_t(e.style.getPropertyValue("src")))}async function sn(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");const n=T(t.ownerDocument.styleSheets),r=await on(n,e);return an(r)}function Xt(t){return t.trim().replace(/["']/g,"")}function cn(t){const e=new Set;function n(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(i=>{e.add(Xt(i))}),Array.from(r.children).forEach(i=>{i instanceof HTMLElement&&n(i)})}return n(t),e}async function ln(t,e){const n=await sn(t,e),r=cn(t);return(await Promise.all(n.filter(i=>r.has(Xt(i.style.fontFamily))).map(i=>{const a=i.parentStyleSheet?i.parentStyleSheet.href:null;return Nt(i.cssText,a,e)}))).join(`
2
- `)}async function un(t,e){const n=e.fontEmbedCSS!=null?e.fontEmbedCSS:e.skipFonts?null:await ln(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 dn(t,e={}){const{width:n,height:r}=It(t,e),o=await Q(t,e,!0);return await un(o,e),await Bt(o,e),rn(o,e),await $e(o,n,r)}async function fn(t,e={}){const{width:n,height:r}=It(t,e),o=await dn(t,e),i=await J(o),a=document.createElement("canvas"),s=a.getContext("2d"),l=e.pixelRatio||Ce(),u=e.canvasWidth||n,d=e.canvasHeight||r;return a.width=u*l,a.height=d*l,e.skipAutoScale||Me(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 hn(t,e={}){return(await fn(t,e)).toDataURL()}const Z="data-nf-capture-chrome";function mn(t){return t instanceof Element&&(t.hasAttribute(Z)||t.hasAttribute("data-nf-mask-cover")||t.id==="notefully")}function pn(){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 yn(){const t=document.querySelector(`[${Z}]`);if(t)return t;const e=document.createElement("div");return e.setAttribute(Z,"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 gn(){document.querySelectorAll(`[${Z}]`).forEach(t=>t.remove())}async function wn(){const t=document.getElementById("notefully"),e=t?t.style.display:"",n=yn();t&&(t.style.display="none");const r=pn();await new Promise(o=>requestAnimationFrame(()=>requestAnimationFrame(o)));try{return await hn(document.body,{cacheBust:!0,pixelRatio:Math.min(window.devicePixelRatio||1,2),filter:o=>!mn(o)})}finally{r(),n.remove(),gn(),t&&(t.style.display=e)}}function bn(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 Sn(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 vn(t={}){const e=navigator.userAgent;return{url:location.href,title:document.title,userAgent:e,os:bn(e),browser:Sn(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 Yt=new Set(["userId","email","displayName"]),Kt={id:"userId",username:"displayName",name:"displayName"},Gt=new Set(["endpoint","projectKey","version","name","targets","hideLauncher","theme","video","consoleLogLimit"]),Jt={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 xn(t={},e={}){const n=e.warn||Qt,r=t&&typeof t=="object"?t:{},o={},i=[];for(const a of Yt)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))Yt.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 En(t={},e={}){const n=e.warn||Qt,r=t&&typeof t=="object"?t:{},o=Object.keys(r).filter(i=>!Gt.has(i));if(o.length)for(const i of o){if(Jt[i]){n(`Notefully.init: ignoring "${i}". ${Jt[i]}`);continue}n(`Notefully.init: ignoring unknown key "${i}". Supported: ${[...Gt].join(", ")}.`)}}function Qt(t){typeof console<"u"&&typeof console.warn=="function"&&console.warn(t)}const Cn=80;function Mn(){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>Cn&&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 Ln(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 $n=60*1e3;function Rn({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,$n)},stop:l}}function An(){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 dt={x:0,y:0,w:1,h:1};function Zt(){const t=An();let e=[],n={...dt},r=1;return{list:()=>e.filter(i=>Tn(i,n)),all:()=>e.slice(),crop:()=>({...n}),setCrop(i){return n=Pn(i),n},resetCrop(){return n={...dt},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={...dt},r=1;t.peekUsed().length;)t.free(t.peekUsed()[0])}}}function Pn(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 Tn(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 ft(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 kn(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=ft(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=ht(u.x,n,r),p=mt(u.y,n,o),y=u.w/n.w*r,M=u.h/n.h*o,R=l.stroke/2;if(u.type==="rect")t.strokeRect(d+R,p+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,p+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 N=ht(u.x2??u.x+u.w,n,r),B=mt(u.y2??u.y,n,o);On(t,d,p,N,B,l)}if(u.number==null||u.number==="")return;const D=In(u,n,r,o,d,p,y),K=String(u.number);t.beginPath(),t.arc(D.x,D.y,l.badgeRadius,0,Math.PI*2),t.fillStyle=a,t.fill(),t.fillStyle=s,t.textAlign="center",t.textBaseline="middle",t.fillText(K,D.x,D.y+.5),t.fillStyle=a}),t.restore()}function ht(t,e,n){return(t-e.x)/e.w*n}function mt(t,e,n){return(t-e.y)/e.h*n}function In(t,e,n,r,o,i,a){if(t.type==="arrow"){const s=ht(t.x2??t.x+t.w,e,n),l=mt(t.y2??t.y,e,r);return{x:(o+s)/2,y:(i+l)/2}}return{x:o+a/2,y:i}}function te(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)},R={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:R}}function On(t,e,n,r,o,i){const a=te(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 Hn(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),kn(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 Dn=["bug","idea","other"],Fn=["maker","all-business","brighter-day","quiet-night"],ee="maker",Un=new Set(["crop","arrow","rect","circle"]),pt=.02,ne=.05,jn=`
1
+ var Notefully=(function(R){"use strict";function Le(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 $e=(()=>{let t=0;const e=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(t+=1,`u${e()}${t}`)})();function P(t){const e=[];for(let n=0,r=t.length;n<r;n++)e.push(t[n]);return e}let B=null;function Ht(t={}){return B||(t.includeStyleProperties?(B=t.includeStyleProperties,B):(B=P(window.getComputedStyle(document.documentElement)),B))}function Q(t,e){const r=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return r?parseFloat(r.replace("px","")):0}function Ae(t){const e=Q(t,"border-left-width"),n=Q(t,"border-right-width");return t.clientWidth+e+n}function Re(t){const e=Q(t,"border-top-width"),n=Q(t,"border-bottom-width");return t.clientHeight+e+n}function Dt(t,e={}){const n=e.width||Ae(t),r=e.height||Re(t);return{width:n,height:r}}function ke(){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 Pe(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 Z(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 Te(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function Ie(t,e,n){const r="http://www.w3.org/2000/svg",i=document.createElementNS(r,"svg"),o=document.createElementNS(r,"foreignObject");return i.setAttribute("width",`${e}`),i.setAttribute("height",`${n}`),i.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"),i.appendChild(o),o.appendChild(t),Te(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 Oe(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function He(t,e){return Ht(e).map(n=>{const r=t.getPropertyValue(n),i=t.getPropertyPriority(n);return`${n}: ${r}${i?" !important":""};`}).join(" ")}function De(t,e,n,r){const i=`.${t}:${e}`,o=n.cssText?Oe(n):He(n,r);return document.createTextNode(`${i}{${o}}`)}function Ft(t,e,n,r){const i=window.getComputedStyle(t,n),o=i.getPropertyValue("content");if(o===""||o==="none")return;const a=$e();try{e.className=`${e.className} ${a}`}catch{return}const s=document.createElement("style");s.appendChild(De(a,n,i,r)),e.appendChild(s)}function Fe(t,e,n){Ft(t,e,":before",n),Ft(t,e,":after",n)}const Ut="application/font-woff",jt="image/jpeg",Ue={woff:Ut,woff2:Ut,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:jt,jpeg:jt,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function je(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function lt(t){const e=je(t).toLowerCase();return Ue[e]||""}function _e(t){return t.split(/,/)[1]}function ut(t){return t.search(/^(data:)/)!==-1}function Be(t,e){return`data:${e};base64,${t}`}async function _t(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((o,a)=>{const s=new FileReader;s.onerror=a,s.onloadend=()=>{try{o(n({res:r,result:s.result}))}catch(l){a(l)}},s.readAsDataURL(i)})}const dt={};function Ne(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 ft(t,e,n){const r=Ne(t,e,n.includeQueryParams);if(dt[r]!=null)return dt[r];n.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+new Date().getTime());let i;try{const o=await _t(t,n.fetchRequestInit,({res:a,result:s})=>(e||(e=a.headers.get("Content-Type")||""),_e(s)));i=Be(o,e)}catch(o){i=n.imagePlaceholder||"";let a=`Failed to fetch resource: ${t}`;o&&(a=typeof o=="string"?o:o.message),a&&console.warn(a)}return dt[r]=i,i}async function Ve(t){const e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):Z(e)}async function ze(t,e){if(t.currentSrc){const o=document.createElement("canvas"),a=o.getContext("2d");o.width=t.clientWidth,o.height=t.clientHeight,a==null||a.drawImage(t,0,0,o.width,o.height);const s=o.toDataURL();return Z(s)}const n=t.poster,r=lt(n),i=await ft(n,r,e);return Z(i)}async function We(t,e){var n;try{if(!((n=t==null?void 0:t.contentDocument)===null||n===void 0)&&n.body)return await tt(t.contentDocument.body,e,!0)}catch{}return t.cloneNode(!1)}async function qe(t,e){return x(t,HTMLCanvasElement)?Ve(t):x(t,HTMLVideoElement)?ze(t,e):x(t,HTMLIFrameElement)?We(t,e):t.cloneNode(Bt(t))}const Ke=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",Bt=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function Xe(t,e,n){var r,i;if(Bt(e))return e;let o=[];return Ke(t)&&t.assignedNodes?o=P(t.assignedNodes()):x(t,HTMLIFrameElement)&&(!((r=t.contentDocument)===null||r===void 0)&&r.body)?o=P(t.contentDocument.body.childNodes):o=P(((i=t.shadowRoot)!==null&&i!==void 0?i:t).childNodes),o.length===0||x(t,HTMLVideoElement)||await o.reduce((a,s)=>a.then(()=>tt(s,n)).then(l=>{l&&e.appendChild(l)}),Promise.resolve()),e}function Ye(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):Ht(n).forEach(o=>{let a=i.getPropertyValue(o);o==="font-size"&&a.endsWith("px")&&(a=`${Math.floor(parseFloat(a.substring(0,a.length-2)))-.1}px`),x(t,HTMLIFrameElement)&&o==="display"&&a==="inline"&&(a="block"),o==="d"&&e.getAttribute("d")&&(a=`path(${e.getAttribute("d")})`),r.setProperty(o,a,i.getPropertyPriority(o))})}function Ge(t,e){x(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),x(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function Je(t,e){if(x(t,HTMLSelectElement)){const r=Array.from(e.children).find(i=>t.value===i.getAttribute("value"));r&&r.setAttribute("selected","")}}function Qe(t,e,n){return x(e,Element)&&(Ye(t,e,n),Fe(t,e,n),Ge(t,e),Je(t,e)),e}async function Ze(t,e){const n=t.querySelectorAll?t.querySelectorAll("use"):[];if(n.length===0)return t;const r={};for(let o=0;o<n.length;o++){const s=n[o].getAttribute("xlink:href");if(s){const l=t.querySelector(s),u=document.querySelector(s);!l&&u&&!r[s]&&(r[s]=await tt(u,e,!0))}}const i=Object.values(r);if(i.length){const o="http://www.w3.org/1999/xhtml",a=document.createElementNS(o,"svg");a.setAttribute("xmlns",o),a.style.position="absolute",a.style.width="0",a.style.height="0",a.style.overflow="hidden",a.style.display="none";const s=document.createElementNS(o,"defs");a.appendChild(s);for(let l=0;l<i.length;l++)s.appendChild(i[l]);t.appendChild(a)}return t}async function tt(t,e,n){return!n&&e.filter&&!e.filter(t)?null:Promise.resolve(t).then(r=>qe(r,e)).then(r=>Xe(t,r,e)).then(r=>Qe(t,r,e)).then(r=>Ze(r,e))}const Nt=/url\((['"]?)([^'"]+?)\1\)/g,tn=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,en=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function nn(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function rn(t){const e=[];return t.replace(Nt,(n,r,i)=>(e.push(i),n)),e.filter(n=>!ut(n))}async function on(t,e,n,r,i){try{const o=n?Le(e,n):e,a=lt(e);let s;return i||(s=await ft(o,a,r)),t.replace(nn(e),`$1${s}$3`)}catch{}return t}function an(t,{preferredFontFormat:e}){return e?t.replace(en,n=>{for(;;){const[r,,i]=tn.exec(n)||[];if(!i)return"";if(i===e)return`src: ${r};`}}):t}function Vt(t){return t.search(Nt)!==-1}async function zt(t,e,n){if(!Vt(t))return t;const r=an(t,n);return rn(r).reduce((o,a)=>o.then(s=>on(s,a,e,n)),Promise.resolve(r))}async function N(t,e,n){var r;const i=(r=e.style)===null||r===void 0?void 0:r.getPropertyValue(t);if(i){const o=await zt(i,null,n);return e.style.setProperty(t,o,e.style.getPropertyPriority(t)),!0}return!1}async function sn(t,e){await N("background",t,e)||await N("background-image",t,e),await N("mask",t,e)||await N("-webkit-mask",t,e)||await N("mask-image",t,e)||await N("-webkit-mask-image",t,e)}async function cn(t,e){const n=x(t,HTMLImageElement);if(!(n&&!ut(t.src))&&!(x(t,SVGImageElement)&&!ut(t.href.baseVal)))return;const r=n?t.src:t.href.baseVal,i=await ft(r,lt(r),e);await new Promise((o,a)=>{t.onload=o,t.onerror=e.onImageErrorHandler?(...l)=>{try{o(e.onImageErrorHandler(...l))}catch(u){a(u)}}:a;const s=t;s.decode&&(s.decode=o),s.loading==="lazy"&&(s.loading="eager"),n?(t.srcset="",t.src=i):t.href.baseVal=i})}async function ln(t,e){const r=P(t.childNodes).map(i=>Wt(i,e));await Promise.all(r).then(()=>t)}async function Wt(t,e){x(t,Element)&&(await sn(t,e),await cn(t,e),await ln(t,e))}function un(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 qt={};async function Kt(t){let e=qt[t];if(e!=null)return e;const r=await(await fetch(t)).text();return e={url:t,cssText:r},qt[t]=e,e}async function Xt(t,e){let n=t.cssText;const r=/url\(["']?([^"')]+)["']?\)/g,o=(n.match(/url\([^)]+\)/g)||[]).map(async a=>{let s=a.replace(r,"$1");return s.startsWith("https://")||(s=new URL(s,t.url).href),_t(s,e.fetchRequestInit,({result:l})=>(n=n.replace(a,`url(${l})`),[a,l]))});return Promise.all(o).then(()=>n)}function Yt(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 o=/@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=o.exec(r);if(l===null){if(l=s.exec(r),l===null)break;o.lastIndex=s.lastIndex}else s.lastIndex=o.lastIndex;e.push(l[0])}return e}async function dn(t,e){const n=[],r=[];return t.forEach(i=>{if("cssRules"in i)try{P(i.cssRules||[]).forEach((o,a)=>{if(o.type===CSSRule.IMPORT_RULE){let s=a+1;const l=o.href,u=Kt(l).then(h=>Xt(h,e)).then(h=>Yt(h).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(h=>{console.error("Error loading remote css",h.toString())});r.push(u)}})}catch(o){const a=t.find(s=>s.href==null)||document.styleSheets[0];i.href!=null&&r.push(Kt(i.href).then(s=>Xt(s,e)).then(s=>Yt(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",o)}}),Promise.all(r).then(()=>(t.forEach(i=>{if("cssRules"in i)try{P(i.cssRules||[]).forEach(o=>{n.push(o)})}catch(o){console.error(`Error while reading CSS rules from ${i.href}`,o)}}),n))}function fn(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>Vt(e.style.getPropertyValue("src")))}async function hn(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");const n=P(t.ownerDocument.styleSheets),r=await dn(n,e);return fn(r)}function Gt(t){return t.trim().replace(/["']/g,"")}function pn(t){const e=new Set;function n(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(o=>{e.add(Gt(o))}),Array.from(r.children).forEach(o=>{o instanceof HTMLElement&&n(o)})}return n(t),e}async function mn(t,e){const n=await hn(t,e),r=pn(t);return(await Promise.all(n.filter(o=>r.has(Gt(o.style.fontFamily))).map(o=>{const a=o.parentStyleSheet?o.parentStyleSheet.href:null;return zt(o.cssText,a,e)}))).join(`
2
+ `)}async function yn(t,e){const n=e.fontEmbedCSS!=null?e.fontEmbedCSS:e.skipFonts?null:await mn(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 gn(t,e={}){const{width:n,height:r}=Dt(t,e),i=await tt(t,e,!0);return await yn(i,e),await Wt(i,e),un(i,e),await Ie(i,n,r)}async function wn(t,e={}){const{width:n,height:r}=Dt(t,e),i=await gn(t,e),o=await Z(i),a=document.createElement("canvas"),s=a.getContext("2d"),l=e.pixelRatio||ke(),u=e.canvasWidth||n,h=e.canvasHeight||r;return a.width=u*l,a.height=h*l,e.skipAutoScale||Pe(a),a.style.width=`${u}`,a.style.height=`${h}`,e.backgroundColor&&(s.fillStyle=e.backgroundColor,s.fillRect(0,0,a.width,a.height)),s.drawImage(o,0,0,a.width,a.height),a}async function bn(t,e={}){return(await wn(t,e)).toDataURL()}const et="data-nf-capture-chrome";function Sn(t){return t instanceof Element&&(t.hasAttribute(et)||t.hasAttribute("data-nf-mask-cover")||t.id==="notefully")}function vn(){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 xn(){const t=document.querySelector(`[${et}]`);if(t)return t;const e=document.createElement("div");return e.setAttribute(et,"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 En(){document.querySelectorAll(`[${et}]`).forEach(t=>t.remove())}async function Cn(){const t=document.getElementById("notefully"),e=t?t.style.display:"",n=xn();t&&(t.style.display="none");const r=vn();await new Promise(i=>requestAnimationFrame(()=>requestAnimationFrame(i)));try{return await bn(document.body,{cacheBust:!0,pixelRatio:Math.min(window.devicePixelRatio||1,2),filter:i=>!Sn(i)})}finally{r(),n.remove(),En(),t&&(t.style.display=e)}}function Mn(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 Ln(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 $n(t={}){const e=navigator.userAgent;return{url:location.href,title:document.title,userAgent:e,os:Mn(e),browser:Ln(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 Jt=new Set(["userId","email","displayName"]),Qt={id:"userId",username:"displayName",name:"displayName"},Zt=new Set(["endpoint","projectKey","version","name","targets","hideLauncher","theme","video","consoleLogLimit","kinds"]),te={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 An(t={},e={}){const n=e.warn||ee,r=t&&typeof t=="object"?t:{},i={},o=[];for(const a of Jt)Object.prototype.hasOwnProperty.call(r,a)&&(i[a]=r[a]);for(const[a,s]of Object.entries(Qt))Object.prototype.hasOwnProperty.call(r,a)&&(Object.prototype.hasOwnProperty.call(i,s)||(i[s]=r[a]));for(const a of Object.keys(r))Jt.has(a)||Object.prototype.hasOwnProperty.call(Qt,a)||o.push(a);if(o.length){const a=o.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): ${o.join(", ")}. Supported: userId, email, displayName (aliases: id → userId; username/name → displayName).`+a)}return i}function Rn(t={},e={}){const n=e.warn||ee,r=t&&typeof t=="object"?t:{},i=Object.keys(r).filter(o=>!Zt.has(o));if(i.length)for(const o of i){if(te[o]){n(`Notefully.init: ignoring "${o}". ${te[o]}`);continue}n(`Notefully.init: ignoring unknown key "${o}". Supported: ${[...Zt].join(", ")}.`)}}function ee(t){typeof console<"u"&&typeof console.warn=="function"&&console.warn(t)}const kn=80;function Pn(){const t=[],e={};let n=!1;const r=(o,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:o,text:s.slice(0,2e3),at:Date.now()}),t.length>kn&&t.shift()};return{hook:()=>{n||typeof window>"u"||(n=!0,["log","info","warn","error"].forEach(o=>{e[o]=console[o].bind(console),console[o]=(...a)=>{r(o,a),e[o](...a)}}),window.addEventListener("error",o=>{r("error",[o.message||"window.error"])}),window.addEventListener("unhandledrejection",o=>{r("error",[o.reason||"unhandledrejection"])}))},snapshot(){return t.slice()}}}function Tn(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=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:i,isSupported:()=>!!e,isActive:()=>r}}const In=60*1e3;function On({onStart:t,onStop:e,onError:n}){let r=null,i=null,o=[],a=null;const s=()=>{if(a&&(clearTimeout(a),a=null),i&&i.state!=="inactive")try{i.stop()}catch{}r&&(r.getTracks().forEach(h=>h.stop()),r=null)},l=()=>{if(i&&i.state==="recording"){i.stop();return}s(),e(null)};return{start:async()=>{var h,m;if(!((h=navigator.mediaDevices)!=null&&h.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"}),o=[],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&&o.push(y.data)},i.onstop=()=>{const y=o.length?new Blob(o,{type:i.mimeType||"video/webm"}):null;s(),e(y)},(m=r.getVideoTracks()[0])==null||m.addEventListener("ended",()=>l()),i.start(),a=setTimeout(l,In)},stop:l}}function Hn(){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 ht={x:0,y:0,w:1,h:1};function ne(){const t=Hn();let e=[],n={...ht},r=1;return{list:()=>e.filter(o=>Fn(o,n)),all:()=>e.slice(),crop:()=>({...n}),setCrop(o){return n=Dn(o),n},resetCrop(){return n={...ht},n},isCropped(){return n.x>1e-6||n.y>1e-6||n.w<.999999||n.h<.999999},add(o,a){const s={id:`s${r++}`,type:o,number:t.alloc(),x:.2,y:.2,w:o==="arrow"?.2:.22,h:o==="arrow"?.05:.16,x2:.4,y2:.28,...a};return e.push(s),s},update(o,a){const s=e.find(l=>l.id===o);return s?(Object.assign(s,a),s):null},remove(o){const a=e.findIndex(l=>l.id===o);if(a<0)return null;const[s]=e.splice(a,1);return t.free(s.number),s},reset(){for(e=[],n={...ht},r=1;t.peekUsed().length;)t.free(t.peekUsed()[0])}}}function Dn(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 Fn(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 pt(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 Un(t,{stickers:e=[],crop:n={x:0,y:0,w:1,h:1},width:r,height:i,colors:o={}}){const a=o.mark||"#fdd341",s=o.markText||"#2a2140",l=pt(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 h=mt(u.x,n,r),m=yt(u.y,n,i),y=u.w/n.w*r,M=u.h/n.h*i,A=l.stroke/2;if(u.type==="rect")t.strokeRect(h+A,m+A,Math.max(0,y-l.stroke),Math.max(0,M-l.stroke));else if(u.type==="circle")t.beginPath(),t.ellipse(h+y/2,m+M/2,Math.max(.5,y/2-A),Math.max(.5,M/2-A),0,0,Math.PI*2),t.stroke();else if(u.type==="arrow"){const V=mt(u.x2??u.x+u.w,n,r),z=yt(u.y2??u.y,n,i);_n(t,h,m,V,z,l)}if(u.number==null||u.number==="")return;const D=jn(u,n,r,i,h,m,y),J=String(u.number);t.beginPath(),t.arc(D.x,D.y,l.badgeRadius,0,Math.PI*2),t.fillStyle=a,t.fill(),t.fillStyle=s,t.textAlign="center",t.textBaseline="middle",t.fillText(J,D.x,D.y+.5),t.fillStyle=a}),t.restore()}function mt(t,e,n){return(t-e.x)/e.w*n}function yt(t,e,n){return(t-e.y)/e.h*n}function jn(t,e,n,r,i,o,a){if(t.type==="arrow"){const s=mt(t.x2??t.x+t.w,e,n),l=yt(t.y2??t.y,e,r);return{x:(i+s)/2,y:(o+l)/2}}return{x:i+a/2,y:o}}function re(t,e,n,r,i){const o=Math.atan2(r-e,n-t),a=i.arrowHead,s=Math.min(i.stroke,a*.2),l=n,u=r,h=n-Math.cos(o)*a,m=r-Math.sin(o)*a,y={x:l-a*Math.cos(o-i.arrowHeadAngle),y:u-a*Math.sin(o-i.arrowHeadAngle)},M={x:l-a*Math.cos(o+i.arrowHeadAngle),y:u-a*Math.sin(o+i.arrowHeadAngle)},A={x:n-Math.cos(o)*s,y:r-Math.sin(o)*s};return{angle:o,tipX:l,tipY:u,baseX:h,baseY:m,left:y,right:M,shaftEnd:A}}function _n(t,e,n,r,i,o){const a=re(e,n,r,i,o);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 Bn(t,e,n,r={}){return new Promise((i,o)=>{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)),h=Math.max(1,Math.round(e.h*a.height)),m=document.createElement("canvas");m.width=u,m.height=h;const y=m.getContext("2d");y.drawImage(a,s,l,u,h,0,0,u,h),Un(y,{stickers:n,crop:e,width:u,height:h,colors:r}),m.toBlob(M=>{if(!M){o(new Error("Could not encode screenshot"));return}i(M)},"image/png")},a.onerror=()=>o(new Error("Could not load screenshot")),a.src=t})}const U=[{id:"bug",label:"Bug"},{id:"idea",label:"Idea"},{id:"other",label:"Other"}];function ie(t){return String(t||"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32)}function gt(t){const e=String(t||"").trim();return e?e.split(/[-_\s]+/).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" "):""}function Nn(t){if(!Array.isArray(t)||!t.length)return U.map(r=>({...r}));const e=new Set,n=[];for(const r of t){let i="",o="";typeof r=="string"||typeof r=="number"?(i=ie(r),o=gt(i)):r&&typeof r=="object"&&(i=ie(r.id??r.value??r.kind),o=String(r.label||r.name||gt(i)).trim()||gt(i)),!(!i||e.has(i))&&(e.add(i),n.push({id:i,label:o}))}return n.length?n:U.map(r=>({...r}))}function nt(t){var n;const e=Array.isArray(t)&&t.length?t:U;return e.some(r=>r.id==="bug")?"bug":((n=e[0])==null?void 0:n.id)||"other"}const Vn=["maker","all-business","brighter-day","quiet-night"],oe="maker",zn=new Set(["crop","arrow","rect","circle"]),wt=.02,ae=.05,Wn=`
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 I={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"/>')},re=Mn();re.hook();const ie=10,_n=80,oe="notefully.author",yt="Anonymous";let f={endpoint:"",projectKey:"",version:"0.0.0",name:"",targets:null,hideLauncher:!1,theme:ee,video:!1,consoleLogLimit:ie},L={},h=null,c={},m=Zt(),b="",W="",P=null,tt="bug",O=null,$=null,g=null,w=null,et=null,U=null,q=null,H={w:0,h:0},gt=!1;function S(t){return h.querySelector(t)}function ae(t){const e=String(t||"").trim().toLowerCase().replace(/\s+/g,"-");return Fn.includes(e)?e:ee}function se(t,e){return h&&getComputedStyle(h).getPropertyValue(t).trim()||e}async function Nn(t){return(await fetch(t)).blob()}function v(t,e=!1){c.status&&(c.status.textContent=t||"",et&&(clearTimeout(et),et=null),t&&!e&&(et=setTimeout(()=>{c.status.textContent=""},4e3)))}function wt(){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…">${jn}</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 I={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"/>')},se=Pn();se.hook();const ce=10,qn=80,le="notefully.author",bt="Anonymous";let d={endpoint:"",projectKey:"",version:"0.0.0",name:"",targets:null,hideLauncher:!1,theme:oe,video:!1,consoleLogLimit:ce,kinds:U.map(t=>({...t}))},L={},f=null,c={},p=ne(),S="",q="",k=null,j=nt(U),O=null,$=null,g=null,w=null,rt=null,_=null,K=null,H={w:0,h:0},St=!1;function b(t){return f.querySelector(t)}function ue(t){const e=String(t||"").trim().toLowerCase().replace(/\s+/g,"-");return Vn.includes(e)?e:oe}function de(t,e){return f&&getComputedStyle(f).getPropertyValue(t).trim()||e}async function Kn(t){return(await fetch(t)).blob()}function v(t,e=!1){c.status&&(c.status.textContent=t||"",rt&&(clearTimeout(rt),rt=null),t&&!e&&(rt=setTimeout(()=>{c.status.textContent=""},4e3)))}function vt(){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…">${Wn}</button>
9
9
  <div class="nf-dialog" hidden>
10
10
  <div class="nf-panel">
11
11
  <div class="nf-stage">
@@ -20,11 +20,7 @@ var Notefully=(function(A){"use strict";function Se(t,e){if(t.match(/^[a-z]+:\/\
20
20
  </div>
21
21
  <textarea class="nf-text" placeholder="Describe the bug or the change you want…"></textarea>
22
22
  <input class="nf-author" type="text" name="author" autocomplete="nickname" placeholder="Anonymous" aria-label="Author">
23
- <div class="nf-kind">
24
- <button type="button" data-kind="bug">Bug</button>
25
- <button type="button" data-kind="idea">Idea</button>
26
- <button type="button" data-kind="other">Other</button>
27
- </div>
23
+ <div class="nf-kind"></div>
28
24
  <div class="nf-actions">
29
25
  <button class="nf-discard-shot nf-icon-btn" type="button" title="Discard screenshot" aria-label="Discard screenshot">${I.discard}</button>
30
26
  <button class="nf-audio nf-icon-btn" type="button" title="Record audio" aria-label="Record audio">${I.audio}</button>
@@ -36,8 +32,8 @@ var Notefully=(function(A){"use strict";function Se(t,e){if(t.match(/^[a-z]+:\/\
36
32
  </div>
37
33
  </div>
38
34
  <button class="nf-stop-video" type="button" hidden>Stop</button>
39
- `,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"),author:S(".nf-author"),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},Bn(),nt()),h}function nt(){var t;h&&(h.dataset.theme=ae(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&&rt())}function rt(){c.launcher&&(c.launcher.hidden=!!f.hideLauncher)}function Bn(){c.launcher.addEventListener("click",()=>$t()),S(".nf-dialog").addEventListener("click",t=>{t.target===c.dialog&&Y()}),h.querySelectorAll(".nf-tool").forEach(t=>{t.addEventListener("click",()=>St(t.dataset.tool))}),c.resetCrop.addEventListener("click",Kn),c.canvas.addEventListener("pointerdown",Wn),c.canvas.addEventListener("dragstart",t=>t.preventDefault()),h.querySelectorAll("[data-kind]").forEach(t=>{t.addEventListener("click",()=>bt(t.dataset.kind))}),c.discard.addEventListener("click",Gn),c.restore.addEventListener("click",Jn),c.audio.addEventListener("click",Qn),c.video.addEventListener("click",Zn),c.stop.addEventListener("click",()=>q==null?void 0:q.stop()),S(".nf-submit").addEventListener("click",()=>{Rt().catch(t=>v(t.message||"Submit failed."))}),bt("bug"),St(null)}function bt(t){tt=Dn.includes(t)?t:"bug",h.querySelectorAll("[data-kind]").forEach(e=>{e.dataset.active=String(e.dataset.kind===tt)})}function St(t){O=Un.has(t)?t:null,$=null,h.querySelectorAll(".nf-tool").forEach(e=>{e.dataset.active=String(e.dataset.tool===O)}),c.canvas&&(c.canvas.dataset.draw=O?"true":"false"),b&&C()}function ce(t){return Math.min(1,Math.max(0,t))}function z(){return c.shot||c.canvas}function it(t){const e=z().getBoundingClientRect();return{x:ce((t.clientX-e.left)/Math.max(e.width,1)),y:ce((t.clientY-e.top)/Math.max(e.height,1))}}function Vn(t){const e=z().getBoundingClientRect();return t.clientX>=e.left&&t.clientX<=e.right&&t.clientY>=e.top&&t.clientY<=e.bottom}function le(t){const e=it(t),n=m.crop();return{x:n.x+e.x*n.w,y:n.y+e.y*n.h}}function ot(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){h&&(t?h.dataset.grabbing="true":delete h.dataset.grabbing)}function xt(t){try{c.canvas.setPointerCapture(t.pointerId)}catch{}}function Et(){window.addEventListener("pointermove",de),window.addEventListener("pointerup",at),window.addEventListener("pointercancel",at)}function ue(){window.removeEventListener("pointermove",de),window.removeEventListener("pointerup",at),window.removeEventListener("pointercancel",at)}function Wn(t){if(t.button!==0||!b)return;if(!t.target.closest(".nf-sticker")&&!Vn(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,xt(t),qn({kind:"sticker",id:$,dir:(e==null?void 0:e.dataset.dir)||"move"},t),C();return}if($=null,O==="crop"){t.preventDefault(),xt(t),g={kind:"crop",start:it(t),current:it(t)},Et(),C();return}if(O==="arrow"||O==="rect"||O==="circle"){t.preventDefault(),xt(t);const r=le(t);g={kind:"sticker",type:O,start:r,current:r},Et(),C();return}C()}function qn(t,e){e.preventDefault(),e.stopPropagation();const n=z().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"),Et()}function de(t){if(g){g.current=g.kind==="crop"?it(t):le(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};zn(o,w.dir,e,n),m.update(r.id,o)}C()}}function zn(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 at(t){if(ue(),vt(!1),g){Xn();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),$=null)}w=null,C()}}function Xn(){const t=g;if(g=null,!t)return;if(t.kind==="crop"){const n=ot(t.start,t.current);if(Math.abs(t.current.x-t.start.x)<ne||Math.abs(t.current.y-t.start.y)<ne){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}),X();return}const e=Yn(t);e&&($=e.id),C()}function Yn(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?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,ot(t.start,t.current))}function Kn(){m.resetCrop(),$=null,X()}function Ct(){c.resetCrop&&(c.resetCrop.hidden=!m.isCropped())}function Mt(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 Gn(){b&&(W=b),b="",c.stage.hidden=!0,c.restore.hidden=!W}function Jn(){W&&(b=W,c.stage.hidden=!1,c.restore.hidden=!0,X())}function Qn(){try{if(U||(U=Ln(e=>{const n=c.text.value.trim();c.text.value=n?`${n} ${e}`:e})),!U.isSupported()){v("Audio-to-text is not supported in this browser.");return}const t=U.start();Mt(t),v(t?"Listening…":"")}catch(t){v(t.message)}}async function Zn(){if(!f.video){v("Video is disabled on this host.");return}c.dialog.hidden=!0,c.stop.hidden=!1,nt(),c.launcher.hidden=!0,q=Rn({onStart(){},onStop(t){P=t,c.stop.hidden=!0,rt(),c.dialog.hidden=!1,X(),v(t?"Video attached.":"Recording cancelled.")},onError(t){v(t.message)}});try{await q.start()}catch(t){c.stop.hidden=!0,rt(),c.dialog.hidden=!1,v(t.message)}}function X(){if(c.shot=null,!b){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>`:"",Ct();return}c.canvas.innerHTML=`<div class="nf-shot"><img alt="Screenshot" src="${b}" 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=()=>{tr(t),C()};t.addEventListener("load",e),t.complete&&t.naturalWidth&&e()}function tr(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=m.crop(),o=H.w/H.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 er(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:"",...ot(t.start,t.current)}}function C(){if((c.shot||c.canvas).querySelectorAll(".nf-sticker, .nf-crop").forEach(i=>i.remove()),!b||!c.shot){Ct();return}const e=m.crop(),n=z(),r=ft(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",fe(i,ot(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(er(g)),o.forEach(i=>{const a=i.id==="preview",s=!a&&i.id===$,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"?nr(l,i,e,s,r):(fe(l,i,e),s&&["nw","ne","sw","se"].forEach(u=>Lt(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)}Ct()}function nr(t,e,n,r,o=ft(400)){const i=z(),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,R=Math.min(u,p)-y,D=Math.max(2,Math.abs(d-l))+y*2,K=Math.max(2,Math.abs(p-u))+y*2,N=l-M,B=u-R,Pt=d-M,Tt=p-R,F=te(N,B,Pt,Tt,o),V=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`,V.setAttribute("class","nf-arrow-svg"),V.setAttribute("viewBox",`0 0 ${D} ${K}`),V.setAttribute("width",String(D)),V.setAttribute("height",String(K)),V.innerHTML=`
40
- <line class="nf-arrow-hit" x1="${N}" y1="${B}" x2="${Pt}" y2="${Tt}" />
41
- <line class="nf-arrow-shaft" x1="${N}" y1="${B}" x2="${F.shaftEnd.x}" y2="${F.shaftEnd.y}" />
35
+ `,document.body.appendChild(f),c={launcher:b(".nf-launcher"),dialog:b(".nf-dialog"),stage:b(".nf-stage"),canvas:b(".nf-canvas"),text:b(".nf-text"),author:b(".nf-author"),restore:b(".nf-restore"),status:b(".nf-status"),audio:b(".nf-audio"),video:b(".nf-video"),discard:b(".nf-discard-shot"),stop:b(".nf-stop-video"),resetCrop:b(".nf-reset-crop"),submit:b(".nf-submit"),shot:null},Xn(),it()),f}function it(){var t;f&&(f.dataset.theme=ue(d.theme),d.hideLauncher?f.setAttribute("data-nf-hidden-launcher",""):f.removeAttribute("data-nf-hidden-launcher"),c.video&&(c.video.hidden=!d.video),he(),(t=c.dialog)!=null&&t.hidden&&ot())}function ot(){c.launcher&&(c.launcher.hidden=!!d.hideLauncher)}function Xn(){c.launcher.addEventListener("click",()=>kt()),b(".nf-dialog").addEventListener("click",e=>{e.target===c.dialog&&G()}),f.querySelectorAll(".nf-tool").forEach(e=>{e.addEventListener("click",()=>Et(e.dataset.tool))}),c.resetCrop.addEventListener("click",er),c.canvas.addEventListener("pointerdown",Gn),c.canvas.addEventListener("dragstart",e=>e.preventDefault());const t=b(".nf-kind");t&&t.addEventListener("click",e=>{const n=e.target.closest("[data-kind]");n&&xt(n.dataset.kind)}),c.discard.addEventListener("click",nr),c.restore.addEventListener("click",rr),c.audio.addEventListener("click",ir),c.video.addEventListener("click",or),c.stop.addEventListener("click",()=>K==null?void 0:K.stop()),b(".nf-submit").addEventListener("click",()=>{Pt().catch(e=>v(e.message||"Submit failed."))}),he(),Et(null)}function fe(t){return String(t||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function he(){const t=f==null?void 0:f.querySelector(".nf-kind");if(!t)return;const e=Array.isArray(d.kinds)&&d.kinds.length?d.kinds:U;t.innerHTML=e.map(i=>`<button type="button" data-kind="${fe(i.id)}">${fe(i.label)}</button>`).join("");const r=e.map(i=>i.id).includes(j)?j:nt(e);xt(r)}function xt(t){j=(d.kinds||U).map(n=>n.id).includes(t)?t:nt(d.kinds),f==null||f.querySelectorAll("[data-kind]").forEach(n=>{n.dataset.active=String(n.dataset.kind===j)})}function Et(t){O=zn.has(t)?t:null,$=null,f.querySelectorAll(".nf-tool").forEach(e=>{e.dataset.active=String(e.dataset.tool===O)}),c.canvas&&(c.canvas.dataset.draw=O?"true":"false"),S&&C()}function pe(t){return Math.min(1,Math.max(0,t))}function X(){return c.shot||c.canvas}function at(t){const e=X().getBoundingClientRect();return{x:pe((t.clientX-e.left)/Math.max(e.width,1)),y:pe((t.clientY-e.top)/Math.max(e.height,1))}}function Yn(t){const e=X().getBoundingClientRect();return t.clientX>=e.left&&t.clientX<=e.right&&t.clientY>=e.top&&t.clientY<=e.bottom}function me(t){const e=at(t),n=p.crop();return{x:n.x+e.x*n.w,y:n.y+e.y*n.h}}function st(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(wt,Math.abs(e.x-t.x)),h:Math.max(wt,Math.abs(e.y-t.y))}}function Ct(t){f&&(t?f.dataset.grabbing="true":delete f.dataset.grabbing)}function Mt(t){try{c.canvas.setPointerCapture(t.pointerId)}catch{}}function Lt(){window.addEventListener("pointermove",ge),window.addEventListener("pointerup",ct),window.addEventListener("pointercancel",ct)}function ye(){window.removeEventListener("pointermove",ge),window.removeEventListener("pointerup",ct),window.removeEventListener("pointercancel",ct)}function Gn(t){if(t.button!==0||!S)return;if(!t.target.closest(".nf-sticker")&&!Yn(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,Mt(t),Jn({kind:"sticker",id:$,dir:(e==null?void 0:e.dataset.dir)||"move"},t),C();return}if($=null,O==="crop"){t.preventDefault(),Mt(t),g={kind:"crop",start:at(t),current:at(t)},Lt(),C();return}if(O==="arrow"||O==="rect"||O==="circle"){t.preventDefault(),Mt(t);const r=me(t);g={kind:"sticker",type:O,start:r,current:r},Lt(),C();return}C()}function Jn(t,e){e.preventDefault(),e.stopPropagation();const n=X().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},Ct(t.dir==="move"||t.dir==="start"||t.dir==="end"),Lt()}function ge(t){if(g){g.current=g.kind==="crop"?at(t):me(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};Qn(i,w.dir,e,n),p.update(r.id,i)}C()}}function Qn(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 ct(t){if(ye(),Ct(!1),g){Zn();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 Zn(){const t=g;if(g=null,!t)return;if(t.kind==="crop"){const n=st(t.start,t.current);if(Math.abs(t.current.x-t.start.x)<ae||Math.abs(t.current.y-t.start.y)<ae){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}),Y();return}const e=tr(t);e&&($=e.id),C()}function tr(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)<wt?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,st(t.start,t.current))}function er(){p.resetCrop(),$=null,Y()}function $t(){c.resetCrop&&(c.resetCrop.hidden=!p.isCropped())}function At(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 nr(){S&&(q=S),S="",c.stage.hidden=!0,c.restore.hidden=!q}function rr(){q&&(S=q,c.stage.hidden=!1,c.restore.hidden=!0,Y())}function ir(){try{if(_||(_=Tn(e=>{const n=c.text.value.trim();c.text.value=n?`${n} ${e}`:e})),!_.isSupported()){v("Audio-to-text is not supported in this browser.");return}const t=_.start();At(t),v(t?"Listening…":"")}catch(t){v(t.message)}}async function or(){if(!d.video){v("Video is disabled on this host.");return}c.dialog.hidden=!0,c.stop.hidden=!1,it(),c.launcher.hidden=!0,K=On({onStart(){},onStop(t){k=t,c.stop.hidden=!0,ot(),c.dialog.hidden=!1,Y(),v(t?"Video attached.":"Recording cancelled.")},onError(t){v(t.message)}});try{await K.start()}catch(t){c.stop.hidden=!0,ot(),c.dialog.hidden=!1,v(t.message)}}function Y(){if(c.shot=null,!S){c.canvas.style.removeProperty("--nf-shot-aspect"),c.canvas.style.removeProperty("aspect-ratio"),c.canvas.innerHTML=k?`<video class="nf-recording-preview" controls src="${URL.createObjectURL(k)}"></video>`:"",$t();return}c.canvas.innerHTML=`<div class="nf-shot"><img alt="Screenshot" src="${S}" 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=()=>{ar(t),C()};t.addEventListener("load",e),t.complete&&t.naturalWidth&&e()}function ar(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,o=r.w/r.h*i,a=Math.min(1,o/i),s=Math.min(1,i/o);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 sr(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:"",...st(t.start,t.current)}}function C(){if((c.shot||c.canvas).querySelectorAll(".nf-sticker, .nf-crop").forEach(o=>o.remove()),!S||!c.shot){$t();return}const e=p.crop(),n=X(),r=pt(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 o=document.createElement("div");o.className="nf-crop",we(o,st(g.start,g.current),{x:0,y:0,w:1,h:1}),c.shot.appendChild(o)}const i=p.list().slice();if((g==null?void 0:g.kind)==="sticker"&&i.push(sr(g)),i.forEach(o=>{const a=o.id==="preview",s=!a&&o.id===$,l=document.createElement("div");if(l.className=`nf-sticker nf-${o.type}`,l.dataset.id=o.id,s&&(l.dataset.selected="true"),a&&(l.dataset.preview="true"),o.type==="arrow"?cr(l,o,e,s,r):(we(l,o,e),s&&["nw","ne","sw","se"].forEach(u=>Rt(l,u))),!a&&o.number){const u=document.createElement("span");u.className="nf-badge",u.textContent=String(o.number),l.appendChild(u)}c.shot.appendChild(l)}),c.canvas.querySelectorAll(":scope > .nf-recording-preview").forEach(o=>o.remove()),k){const o=document.createElement("video");o.className="nf-recording-preview",o.controls=!0,o.src=URL.createObjectURL(k),o.style.position="absolute",o.style.right="8px",o.style.bottom="8px",o.style.width="160px",c.canvas.appendChild(o)}$t()}function cr(t,e,n,r,i=pt(400)){const o=X(),a=o.clientWidth,s=o.clientHeight,l=(e.x-n.x)/n.w*a,u=(e.y-n.y)/n.h*s,h=((e.x2??e.x+e.w)-n.x)/n.w*a,m=((e.y2??e.y)-n.y)/n.h*s,y=Math.max(18,i.arrowHead+i.stroke*2),M=Math.min(l,h)-y,A=Math.min(u,m)-y,D=Math.max(2,Math.abs(h-l))+y*2,J=Math.max(2,Math.abs(m-u))+y*2,V=l-M,z=u-A,It=h-M,Ot=m-A,F=re(V,z,It,Ot,i),W=document.createElementNS("http://www.w3.org/2000/svg","svg");t.style.left=`${M}px`,t.style.top=`${A}px`,t.style.width=`${D}px`,t.style.height=`${J}px`,W.setAttribute("class","nf-arrow-svg"),W.setAttribute("viewBox",`0 0 ${D} ${J}`),W.setAttribute("width",String(D)),W.setAttribute("height",String(J)),W.innerHTML=`
36
+ <line class="nf-arrow-hit" x1="${V}" y1="${z}" x2="${It}" y2="${Ot}" />
37
+ <line class="nf-arrow-shaft" x1="${V}" y1="${z}" x2="${F.shaftEnd.x}" y2="${F.shaftEnd.y}" />
42
38
  <polygon class="nf-arrow-head" points="${F.tipX},${F.tipY} ${F.left.x},${F.left.y} ${F.right.x},${F.right.y}" />
43
- `,t.appendChild(V),r&&(Lt(t,"start",{left:N-5,top:B-5}),Lt(t,"end",{left:Pt-5,top:Tt-5}))}function Lt(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 fe(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 rr(){try{return String(localStorage.getItem(oe)||"").trim()}catch{return""}}function ir(t){const e=String(t||"").trim();if(!(!e||e===yt))try{localStorage.setItem(oe,e)}catch{}}function he(){return!!(String(L.userId||"").trim()||String(L.email||"").trim()||String(L.displayName||"").trim())}function or(){return String(L.displayName||L.email||L.userId||"").trim()}function ar(){var e;if(he())return or()||yt;const t=String(((e=c.author)==null?void 0:e.value)||"").trim();return t?(ir(t),t):yt}function me(){if(!c.author)return;const t=he();if(c.author.hidden=t,t){c.author.value="";return}c.author.value=rr()}function pe(t,e=ie){const n=Number(t);return Number.isFinite(n)?Math.min(_n,Math.max(0,Math.floor(n))):e}function ye(t={}){return En(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:ae(t.theme??f.theme),video:t.video==null?f.video:!!t.video,consoleLogLimit:t.consoleLogLimit==null?f.consoleLogLimit:pe(t.consoleLogLimit,f.consoleLogLimit)},wt(),nt(),At}async function $t(){wt(),nt(),c.launcher.hidden=!0,m=Zt(),H={w:0,h:0},P=null,$=null,g=null,w=null,tt="bug",bt("bug"),St(null),Mt(!1),c.text.value="",me(),v("");try{b=await wn(),W=b,c.stage.hidden=!1,c.restore.hidden=!0,v("")}catch{b="",v("Screenshot failed; you can still send text.")}c.dialog.hidden=!1,X(),c.text.focus()}function Y(){h&&(U==null||U.stop(),Mt(!1),ue(),g=null,w=null,vt(!1),c.dialog.hidden=!0,c.stop.hidden=!0,rt())}function ge(t={}){L={...L,...xn(t)},me()}async function Rt(){if(wt(),gt)return null;const t=c.text.value.trim();if(!t&&!b&&!P)return v("Add a note, screenshot, or video first."),null;if(!f.endpoint||!f.projectKey)return v("Notefully is missing endpoint or projectKey."),null;gt=!0,we(!0),v("Submitting…",!0);try{const e=ar(),n=new FormData;if(n.append("message",t),n.append("kind",tt),n.append("version",f.version||"0.0.0"),n.append("author",e),f.name&&n.append("name",f.name),n.append("context",JSON.stringify({...vn({...L,displayName:L.displayName||e}),author:e,console:re.snapshot().slice(-pe(f.consoleLogLimit))})),n.append("annotations",JSON.stringify(m.list())),n.append("crop",JSON.stringify(m.crop())),Array.isArray(f.targets)&&n.append("targets",JSON.stringify(f.targets)),b){const i=await Nn(b);if(n.append("screenshot",i,"screenshot.png"),m.list().length||m.isCropped()){const a=await Hn(b,m.crop(),m.list(),{mark:se("--nf-mark","#fdd341"),markText:se("--nf-mark-text","#2a2140")});n.append("screenshotBaked",a,"screenshot.baked.png")}}P&&n.append("recording",P,"recording.webm");const r=await fetch(`${f.endpoint}/v1/reports`,{method:"POST",headers:{"X-Notefully-Key":f.projectKey},body:n});let o=null;try{o=await r.json()}catch{o=null}if(!r.ok)throw v((o==null?void 0:o.error)||"Submit failed."),new Error((o==null?void 0:o.error)||`Submit failed (${r.status})`);return v("Sent. Thank you."),Y(),o}finally{gt=!1,we(!1)}}function we(t){c.submit&&(c.submit.disabled=!!t,c.submit.setAttribute("aria-busy",t?"true":"false"))}function be(){Y(),h==null||h.remove(),h=null,c={}}const At={init:ye,open:$t,close:Y,identify:ge,submit:Rt,destroy:be};return typeof window<"u"&&(window.Notefully=At),A.close=Y,A.default=At,A.destroy=be,A.identify=ge,A.init=ye,A.open=$t,A.submit=Rt,Object.defineProperties(A,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),A})({});
39
+ `,t.appendChild(W),r&&(Rt(t,"start",{left:V-5,top:z-5}),Rt(t,"end",{left:It-5,top:Ot-5}))}function Rt(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 we(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 lr(){try{return String(localStorage.getItem(le)||"").trim()}catch{return""}}function ur(t){const e=String(t||"").trim();if(!(!e||e===bt))try{localStorage.setItem(le,e)}catch{}}function be(){return!!(String(L.userId||"").trim()||String(L.email||"").trim()||String(L.displayName||"").trim())}function dr(){return String(L.displayName||L.email||L.userId||"").trim()}function fr(){var e;if(be())return dr()||bt;const t=String(((e=c.author)==null?void 0:e.value)||"").trim();return t?(ur(t),t):bt}function Se(){if(!c.author)return;const t=be();if(c.author.hidden=t,t){c.author.value="";return}c.author.value=lr()}function ve(t,e=ce){const n=Number(t);return Number.isFinite(n)?Math.min(qn,Math.max(0,Math.floor(n))):e}function xe(t={}){Rn(t);const e=Object.prototype.hasOwnProperty.call(t,"kinds");return d={...d,endpoint:String(t.endpoint||d.endpoint||"").replace(/\/$/,""),projectKey:t.projectKey==null?d.projectKey:String(t.projectKey),version:t.version==null?d.version:String(t.version),name:t.name==null?d.name:String(t.name||""),targets:t.targets===void 0?d.targets:t.targets,hideLauncher:t.hideLauncher==null?d.hideLauncher:!!t.hideLauncher,theme:ue(t.theme??d.theme),video:t.video==null?d.video:!!t.video,consoleLogLimit:t.consoleLogLimit==null?d.consoleLogLimit:ve(t.consoleLogLimit,d.consoleLogLimit),kinds:e?Nn(t.kinds):d.kinds},vt(),it(),Tt}async function kt(){vt(),it(),c.launcher.hidden=!0,p=ne(),H={w:0,h:0},k=null,$=null,g=null,w=null,j=nt(d.kinds),xt(j),Et(null),At(!1),c.text.value="",Se(),v("");try{S=await Cn(),q=S,c.stage.hidden=!1,c.restore.hidden=!0,v("")}catch{S="",v("Screenshot failed; you can still send text.")}c.dialog.hidden=!1,Y(),c.text.focus()}function G(){f&&(_==null||_.stop(),At(!1),ye(),g=null,w=null,Ct(!1),c.dialog.hidden=!0,c.stop.hidden=!0,ot())}function Ee(t={}){L={...L,...An(t)},Se()}async function Pt(){if(vt(),St)return null;const t=c.text.value.trim();if(!t&&!S&&!k)return v("Add a note, screenshot, or video first."),null;if(!d.endpoint||!d.projectKey)return v("Notefully is missing endpoint or projectKey."),null;St=!0,Ce(!0),v("Submitting…",!0);try{const e=fr(),n=new FormData;if(n.append("message",t),n.append("kind",j),n.append("version",d.version||"0.0.0"),n.append("author",e),d.name&&n.append("name",d.name),n.append("context",JSON.stringify({...$n({...L,displayName:L.displayName||e}),author:e,console:se.snapshot().slice(-ve(d.consoleLogLimit))})),n.append("annotations",JSON.stringify(p.list())),n.append("crop",JSON.stringify(p.crop())),Array.isArray(d.targets)&&n.append("targets",JSON.stringify(d.targets)),S){const o=await Kn(S);if(n.append("screenshot",o,"screenshot.png"),p.list().length||p.isCropped()){const a=await Bn(S,p.crop(),p.list(),{mark:de("--nf-mark","#fdd341"),markText:de("--nf-mark-text","#2a2140")});n.append("screenshotBaked",a,"screenshot.baked.png")}}k&&n.append("recording",k,"recording.webm");const r=await fetch(`${d.endpoint}/v1/reports`,{method:"POST",headers:{"X-Notefully-Key":d.projectKey},body:n});let i=null;try{i=await r.json()}catch{i=null}if(!r.ok)throw v((i==null?void 0:i.error)||"Submit failed."),new Error((i==null?void 0:i.error)||`Submit failed (${r.status})`);return v("Sent. Thank you."),G(),i}finally{St=!1,Ce(!1)}}function Ce(t){c.submit&&(c.submit.disabled=!!t,c.submit.setAttribute("aria-busy",t?"true":"false"))}function Me(){G(),f==null||f.remove(),f=null,c={}}const Tt={init:xe,open:kt,close:G,identify:Ee,submit:Pt,destroy:Me};return typeof window<"u"&&(window.Notefully=Tt),R.close=G,R.default=Tt,R.destroy=Me,R.identify=Ee,R.init=xe,R.open=kt,R.submit=Pt,Object.defineProperties(R,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),R})({});