@makefully/notefully 0.1.27 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/notefully.iife.js +8 -8
- package/dist/notefully.js +440 -424
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -28,6 +28,11 @@ Notefully.init({
|
|
|
28
28
|
hideLauncher: true // optional; drive open/submit from your own UI
|
|
29
29
|
});
|
|
30
30
|
|
|
31
|
+
// Update settings later without remounting (theme, hideLauncher, video, …):
|
|
32
|
+
Notefully.configure({ theme: 'quiet-night' });
|
|
33
|
+
Notefully.setTheme('all-business');
|
|
34
|
+
Notefully.setVisible(false); // hides launcher and closes an open dialog
|
|
35
|
+
|
|
31
36
|
Notefully.identify({
|
|
32
37
|
userId: 'user_123',
|
|
33
38
|
email: 'ada@example.com',
|
package/dist/notefully.iife.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
var Notefully=(function(A){"use strict";function Re(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 Ae=(()=>{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 _=null;function Ft(t={}){return _||(t.includeStyleProperties?(_=t.includeStyleProperties,_):(_=P(window.getComputedStyle(document.documentElement)),_))}function Q(t,e){const r=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return r?parseFloat(r.replace("px","")):0}function ke(t){const e=Q(t,"border-left-width"),n=Q(t,"border-right-width");return t.clientWidth+e+n}function Pe(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||ke(t),r=e.height||Pe(t);return{width:n,height:r}}function Te(){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 M=16384;function Ie(t){(t.width>M||t.height>M)&&(t.width>M&&t.height>M?t.width>t.height?(t.height*=M/t.width,t.width=M):(t.width*=M/t.height,t.height=M):t.width>M?(t.height*=M/t.width,t.width=M):(t.width*=M/t.height,t.height=M))}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 Oe(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function He(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),Oe(i)}const E=(t,e)=>{if(t instanceof e)return!0;const n=Object.getPrototypeOf(t);return n===null?!1:n.constructor.name===e.name||E(n,e)};function Fe(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function De(t,e){return Ft(e).map(n=>{const r=t.getPropertyValue(n),i=t.getPropertyPriority(n);return`${n}: ${r}${i?" !important":""};`}).join(" ")}function Be(t,e,n,r){const i=`.${t}:${e}`,o=n.cssText?Fe(n):De(n,r);return document.createTextNode(`${i}{${o}}`)}function Bt(t,e,n,r){const i=window.getComputedStyle(t,n),o=i.getPropertyValue("content");if(o===""||o==="none")return;const a=Ae();try{e.className=`${e.className} ${a}`}catch{return}const s=document.createElement("style");s.appendChild(Be(a,n,i,r)),e.appendChild(s)}function Ue(t,e,n){Bt(t,e,":before",n),Bt(t,e,":after",n)}const Ut="application/font-woff",jt="image/jpeg",je={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 _e(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function lt(t){const e=_e(t).toLowerCase();return je[e]||""}function Ne(t){return t.split(/,/)[1]}function ut(t){return t.search(/^(data:)/)!==-1}function Ve(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 ze(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=ze(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")||""),Ne(s)));i=Ve(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 We(t){const e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):Z(e)}async function qe(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 Ke(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 Xe(t,e){return E(t,HTMLCanvasElement)?We(t):E(t,HTMLVideoElement)?qe(t,e):E(t,HTMLIFrameElement)?Ke(t,e):t.cloneNode(Nt(t))}const Ye=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",Nt=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function Ge(t,e,n){var r,i;if(Nt(e))return e;let o=[];return Ye(t)&&t.assignedNodes?o=P(t.assignedNodes()):E(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||E(t,HTMLVideoElement)||await o.reduce((a,s)=>a.then(()=>tt(s,n)).then(l=>{l&&e.appendChild(l)}),Promise.resolve()),e}function Je(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):Ft(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`),E(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 Qe(t,e){E(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),E(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function Ze(t,e){if(E(t,HTMLSelectElement)){const r=Array.from(e.children).find(i=>t.value===i.getAttribute("value"));r&&r.setAttribute("selected","")}}function tn(t,e,n){return E(e,Element)&&(Je(t,e,n),Ue(t,e,n),Qe(t,e),Ze(t,e)),e}async function en(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=>Xe(r,e)).then(r=>Ge(t,r,e)).then(r=>tn(t,r,e)).then(r=>en(r,e))}const Vt=/url\((['"]?)([^'"]+?)\1\)/g,nn=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,rn=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function on(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function an(t){const e=[];return t.replace(Vt,(n,r,i)=>(e.push(i),n)),e.filter(n=>!ut(n))}async function sn(t,e,n,r,i){try{const o=n?Re(e,n):e,a=lt(e);let s;return i||(s=await ft(o,a,r)),t.replace(on(e),`$1${s}$3`)}catch{}return t}function cn(t,{preferredFontFormat:e}){return e?t.replace(rn,n=>{for(;;){const[r,,i]=nn.exec(n)||[];if(!i)return"";if(i===e)return`src: ${r};`}}):t}function zt(t){return t.search(Vt)!==-1}async function Wt(t,e,n){if(!zt(t))return t;const r=cn(t,n);return an(r).reduce((o,a)=>o.then(s=>sn(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 Wt(i,null,n);return e.style.setProperty(t,o,e.style.getPropertyPriority(t)),!0}return!1}async function ln(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 un(t,e){const n=E(t,HTMLImageElement);if(!(n&&!ut(t.src))&&!(E(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 dn(t,e){const r=P(t.childNodes).map(i=>qt(i,e));await Promise.all(r).then(()=>t)}async function qt(t,e){E(t,Element)&&(await ln(t,e),await un(t,e),await dn(t,e))}function fn(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 Kt={};async function Xt(t){let e=Kt[t];if(e!=null)return e;const r=await(await fetch(t)).text();return e={url:t,cssText:r},Kt[t]=e,e}async function Yt(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 Gt(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 hn(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=Xt(l).then(f=>Yt(f,e)).then(f=>Gt(f).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(f=>{console.error("Error loading remote css",f.toString())});r.push(u)}})}catch(o){const a=t.find(s=>s.href==null)||document.styleSheets[0];i.href!=null&&r.push(Xt(i.href).then(s=>Yt(s,e)).then(s=>Gt(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 pn(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>zt(e.style.getPropertyValue("src")))}async function mn(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");const n=P(t.ownerDocument.styleSheets),r=await hn(n,e);return pn(r)}function Jt(t){return t.trim().replace(/["']/g,"")}function yn(t){const e=new Set;function n(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(o=>{e.add(Jt(o))}),Array.from(r.children).forEach(o=>{o instanceof HTMLElement&&n(o)})}return n(t),e}async function gn(t,e){const n=await mn(t,e),r=yn(t);return(await Promise.all(n.filter(o=>r.has(Jt(o.style.fontFamily))).map(o=>{const a=o.parentStyleSheet?o.parentStyleSheet.href:null;return Wt(o.cssText,a,e)}))).join(`
|
|
2
|
-
`)}async function wn(t,e){const n=e.fontEmbedCSS!=null?e.fontEmbedCSS:e.skipFonts?null:await gn(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 bn(t,e={}){const{width:n,height:r}=Dt(t,e),i=await tt(t,e,!0);return await wn(i,e),await qt(i,e),fn(i,e),await He(i,n,r)}async function Sn(t,e={}){const{width:n,height:r}=Dt(t,e),i=await bn(t,e),o=await Z(i),a=document.createElement("canvas"),s=a.getContext("2d"),l=e.pixelRatio||Te(),u=e.canvasWidth||n,f=e.canvasHeight||r;return a.width=u*l,a.height=f*l,e.skipAutoScale||Ie(a),a.style.width=`${u}`,a.style.height=`${f}`,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 vn(t,e={}){return(await Sn(t,e)).toDataURL()}const et="data-nf-capture-chrome";function xn(t){return t instanceof Element&&(t.hasAttribute(et)||t.hasAttribute("data-nf-mask-cover")||t.id==="notefully")}function En(){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 Mn(){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 Cn(){document.querySelectorAll(`[${et}]`).forEach(t=>t.remove())}async function Ln(){const t=document.getElementById("notefully"),e=t?t.style.display:"",n=Mn();t&&(t.style.display="none");const r=En();await new Promise(i=>requestAnimationFrame(()=>requestAnimationFrame(i)));try{return await vn(document.body,{cacheBust:!0,pixelRatio:Math.min(window.devicePixelRatio||1,2),filter:i=>!xn(i)})}finally{r(),n.remove(),Cn(),t&&(t.style.display=e)}}function $n(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 Rn(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 An(t={}){const e=navigator.userAgent;return{url:location.href,title:document.title,userAgent:e,os:$n(e),browser:Rn(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 Qt=new Set(["userId","email","displayName"]),Zt={id:"userId",username:"displayName",name:"displayName"},te=new Set(["endpoint","projectKey","version","name","targets","hideLauncher","theme","video","consoleLogLimit","kinds"]),ee={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 kn(t={},e={}){const n=e.warn||ne,r=t&&typeof t=="object"?t:{},i={},o=[];for(const a of Qt)Object.prototype.hasOwnProperty.call(r,a)&&(i[a]=r[a]);for(const[a,s]of Object.entries(Zt))Object.prototype.hasOwnProperty.call(r,a)&&(Object.prototype.hasOwnProperty.call(i,s)||(i[s]=r[a]));for(const a of Object.keys(r))Qt.has(a)||Object.prototype.hasOwnProperty.call(Zt,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 Pn(t={},e={}){const n=e.warn||ne,r=t&&typeof t=="object"?t:{},i=Object.keys(r).filter(o=>!te.has(o));if(i.length)for(const o of i){if(ee[o]){n(`Notefully.init: ignoring "${o}". ${ee[o]}`);continue}n(`Notefully.init: ignoring unknown key "${o}". Supported: ${[...te].join(", ")}.`)}}function ne(t){typeof console<"u"&&typeof console.warn=="function"&&console.warn(t)}const Tn=80;function In(){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>Tn&&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 On(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 Hn=60*1e3;function Fn({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(f=>f.stop()),r=null)},l=()=>{if(i&&i.state==="recording"){i.stop();return}s(),e(null)};return{start:async()=>{var f,m;if(!((f=navigator.mediaDevices)!=null&&f.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,Hn)},stop:l}}function Dn(){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 re(){const t=Dn();let e=[],n={...ht},r=1;return{list:()=>e.filter(o=>Un(o,n)),all:()=>e.slice(),crop:()=>({...n}),setCrop(o){return n=Bn(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 Bn(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 Un(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 jn(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 f=mt(u.x,n,r),m=yt(u.y,n,i),y=u.w/n.w*r,x=u.h/n.h*i,R=l.stroke/2;if(u.type==="rect")t.strokeRect(f+R,m+R,Math.max(0,y-l.stroke),Math.max(0,x-l.stroke));else if(u.type==="circle")t.beginPath(),t.ellipse(f+y/2,m+x/2,Math.max(.5,y/2-R),Math.max(.5,x/2-R),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);Nn(t,f,m,V,z,l)}if(u.number==null||u.number==="")return;const F=_n(u,n,r,i,f,m,y),J=String(u.number);t.beginPath(),t.arc(F.x,F.y,l.badgeRadius,0,Math.PI*2),t.fillStyle=a,t.fill(),t.fillStyle=s,t.textAlign="center",t.textBaseline="middle",t.fillText(J,F.x,F.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 _n(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 ie(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,f=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)},x={x:l-a*Math.cos(o+i.arrowHeadAngle),y:u-a*Math.sin(o+i.arrowHeadAngle)},R={x:n-Math.cos(o)*s,y:r-Math.sin(o)*s};return{angle:o,tipX:l,tipY:u,baseX:f,baseY:m,left:y,right:x,shaftEnd:R}}function Nn(t,e,n,r,i,o){const a=ie(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 Vn(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)),f=Math.max(1,Math.round(e.h*a.height)),m=document.createElement("canvas");m.width=u,m.height=f;const y=m.getContext("2d");y.drawImage(a,s,l,u,f,0,0,u,f),jn(y,{stickers:n,crop:e,width:u,height:f,colors:r}),m.toBlob(x=>{if(!x){o(new Error("Could not encode screenshot"));return}i(x)},"image/png")},a.onerror=()=>o(new Error("Could not load screenshot")),a.src=t})}const B=[{id:"bug",label:"Bug"},{id:"idea",label:"Idea"},{id:"other",label:"Other"}];function oe(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 zn(t){if(!Array.isArray(t)||!t.length)return B.map(r=>({...r}));const e=new Set,n=[];for(const r of t){let i="",o="";typeof r=="string"||typeof r=="number"?(i=oe(r),o=gt(i)):r&&typeof r=="object"&&(i=oe(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:B.map(r=>({...r}))}function nt(t){var n;const e=Array.isArray(t)&&t.length?t:B;return e.some(r=>r.id==="bug")?"bug":((n=e[0])==null?void 0:n.id)||"other"}const Wn=["maker","all-business","brighter-day","quiet-night"],ae="maker",qn=new Set(["crop","arrow","rect","circle"]),wt=.02,se=.05,Kn=`
|
|
1
|
+
var Notefully=(function(C){"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 Ie=(()=>{let t=0;const e=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(t+=1,`u${e()}${t}`)})();function k(t){const e=[];for(let n=0,r=t.length;n<r;n++)e.push(t[n]);return e}let _=null;function Dt(t={}){return _||(t.includeStyleProperties?(_=t.includeStyleProperties,_):(_=k(window.getComputedStyle(document.documentElement)),_))}function Z(t,e){const r=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return r?parseFloat(r.replace("px","")):0}function Oe(t){const e=Z(t,"border-left-width"),n=Z(t,"border-right-width");return t.clientWidth+e+n}function He(t){const e=Z(t,"border-top-width"),n=Z(t,"border-bottom-width");return t.clientHeight+e+n}function Bt(t,e={}){const n=e.width||Oe(t),r=e.height||He(t);return{width:n,height:r}}function Fe(){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 M=16384;function De(t){(t.width>M||t.height>M)&&(t.width>M&&t.height>M?t.width>t.height?(t.height*=M/t.width,t.width=M):(t.width*=M/t.height,t.height=M):t.width>M?(t.height*=M/t.width,t.width=M):(t.width*=M/t.height,t.height=M))}function tt(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 Be(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function Ue(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),Be(i)}const E=(t,e)=>{if(t instanceof e)return!0;const n=Object.getPrototypeOf(t);return n===null?!1:n.constructor.name===e.name||E(n,e)};function je(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function _e(t,e){return Dt(e).map(n=>{const r=t.getPropertyValue(n),i=t.getPropertyPriority(n);return`${n}: ${r}${i?" !important":""};`}).join(" ")}function Ne(t,e,n,r){const i=`.${t}:${e}`,o=n.cssText?je(n):_e(n,r);return document.createTextNode(`${i}{${o}}`)}function Ut(t,e,n,r){const i=window.getComputedStyle(t,n),o=i.getPropertyValue("content");if(o===""||o==="none")return;const a=Ie();try{e.className=`${e.className} ${a}`}catch{return}const c=document.createElement("style");c.appendChild(Ne(a,n,i,r)),e.appendChild(c)}function Ve(t,e,n){Ut(t,e,":before",n),Ut(t,e,":after",n)}const jt="application/font-woff",_t="image/jpeg",ze={woff:jt,woff2:jt,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:_t,jpeg:_t,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function We(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function dt(t){const e=We(t).toLowerCase();return ze[e]||""}function qe(t){return t.split(/,/)[1]}function ft(t){return t.search(/^(data:)/)!==-1}function Ke(t,e){return`data:${e};base64,${t}`}async function Nt(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 c=new FileReader;c.onerror=a,c.onloadend=()=>{try{o(n({res:r,result:c.result}))}catch(l){a(l)}},c.readAsDataURL(i)})}const ht={};function Xe(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 mt(t,e,n){const r=Xe(t,e,n.includeQueryParams);if(ht[r]!=null)return ht[r];n.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+new Date().getTime());let i;try{const o=await Nt(t,n.fetchRequestInit,({res:a,result:c})=>(e||(e=a.headers.get("Content-Type")||""),qe(c)));i=Ke(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 ht[r]=i,i}async function Ye(t){const e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):tt(e)}async function Ge(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 c=o.toDataURL();return tt(c)}const n=t.poster,r=dt(n),i=await mt(n,r,e);return tt(i)}async function Je(t,e){var n;try{if(!((n=t==null?void 0:t.contentDocument)===null||n===void 0)&&n.body)return await et(t.contentDocument.body,e,!0)}catch{}return t.cloneNode(!1)}async function Qe(t,e){return E(t,HTMLCanvasElement)?Ye(t):E(t,HTMLVideoElement)?Ge(t,e):E(t,HTMLIFrameElement)?Je(t,e):t.cloneNode(Vt(t))}const Ze=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",Vt=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function tn(t,e,n){var r,i;if(Vt(e))return e;let o=[];return Ze(t)&&t.assignedNodes?o=k(t.assignedNodes()):E(t,HTMLIFrameElement)&&(!((r=t.contentDocument)===null||r===void 0)&&r.body)?o=k(t.contentDocument.body.childNodes):o=k(((i=t.shadowRoot)!==null&&i!==void 0?i:t).childNodes),o.length===0||E(t,HTMLVideoElement)||await o.reduce((a,c)=>a.then(()=>et(c,n)).then(l=>{l&&e.appendChild(l)}),Promise.resolve()),e}function en(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):Dt(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`),E(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 nn(t,e){E(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),E(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function rn(t,e){if(E(t,HTMLSelectElement)){const r=Array.from(e.children).find(i=>t.value===i.getAttribute("value"));r&&r.setAttribute("selected","")}}function on(t,e,n){return E(e,Element)&&(en(t,e,n),Ve(t,e,n),nn(t,e),rn(t,e)),e}async function an(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 c=n[o].getAttribute("xlink:href");if(c){const l=t.querySelector(c),u=document.querySelector(c);!l&&u&&!r[c]&&(r[c]=await et(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 c=document.createElementNS(o,"defs");a.appendChild(c);for(let l=0;l<i.length;l++)c.appendChild(i[l]);t.appendChild(a)}return t}async function et(t,e,n){return!n&&e.filter&&!e.filter(t)?null:Promise.resolve(t).then(r=>Qe(r,e)).then(r=>tn(t,r,e)).then(r=>on(t,r,e)).then(r=>an(r,e))}const zt=/url\((['"]?)([^'"]+?)\1\)/g,sn=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,cn=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function ln(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function un(t){const e=[];return t.replace(zt,(n,r,i)=>(e.push(i),n)),e.filter(n=>!ft(n))}async function dn(t,e,n,r,i){try{const o=n?Pe(e,n):e,a=dt(e);let c;return i||(c=await mt(o,a,r)),t.replace(ln(e),`$1${c}$3`)}catch{}return t}function fn(t,{preferredFontFormat:e}){return e?t.replace(cn,n=>{for(;;){const[r,,i]=sn.exec(n)||[];if(!i)return"";if(i===e)return`src: ${r};`}}):t}function Wt(t){return t.search(zt)!==-1}async function qt(t,e,n){if(!Wt(t))return t;const r=fn(t,n);return un(r).reduce((o,a)=>o.then(c=>dn(c,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 qt(i,null,n);return e.style.setProperty(t,o,e.style.getPropertyPriority(t)),!0}return!1}async function hn(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 mn(t,e){const n=E(t,HTMLImageElement);if(!(n&&!ft(t.src))&&!(E(t,SVGImageElement)&&!ft(t.href.baseVal)))return;const r=n?t.src:t.href.baseVal,i=await mt(r,dt(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 c=t;c.decode&&(c.decode=o),c.loading==="lazy"&&(c.loading="eager"),n?(t.srcset="",t.src=i):t.href.baseVal=i})}async function pn(t,e){const r=k(t.childNodes).map(i=>Kt(i,e));await Promise.all(r).then(()=>t)}async function Kt(t,e){E(t,Element)&&(await hn(t,e),await mn(t,e),await pn(t,e))}function yn(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 Xt={};async function Yt(t){let e=Xt[t];if(e!=null)return e;const r=await(await fetch(t)).text();return e={url:t,cssText:r},Xt[t]=e,e}async function Gt(t,e){let n=t.cssText;const r=/url\(["']?([^"')]+)["']?\)/g,o=(n.match(/url\([^)]+\)/g)||[]).map(async a=>{let c=a.replace(r,"$1");return c.startsWith("https://")||(c=new URL(c,t.url).href),Nt(c,e.fetchRequestInit,({result:l})=>(n=n.replace(a,`url(${l})`),[a,l]))});return Promise.all(o).then(()=>n)}function Jt(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]*?)})",c=new RegExp(a,"gi");for(;;){let l=o.exec(r);if(l===null){if(l=c.exec(r),l===null)break;o.lastIndex=c.lastIndex}else c.lastIndex=o.lastIndex;e.push(l[0])}return e}async function gn(t,e){const n=[],r=[];return t.forEach(i=>{if("cssRules"in i)try{k(i.cssRules||[]).forEach((o,a)=>{if(o.type===CSSRule.IMPORT_RULE){let c=a+1;const l=o.href,u=Yt(l).then(h=>Gt(h,e)).then(h=>Jt(h).forEach(p=>{try{i.insertRule(p,p.startsWith("@import")?c+=1:i.cssRules.length)}catch(y){console.error("Error inserting rule from remote css",{rule:p,error:y})}})).catch(h=>{console.error("Error loading remote css",h.toString())});r.push(u)}})}catch(o){const a=t.find(c=>c.href==null)||document.styleSheets[0];i.href!=null&&r.push(Yt(i.href).then(c=>Gt(c,e)).then(c=>Jt(c).forEach(l=>{a.insertRule(l,a.cssRules.length)})).catch(c=>{console.error("Error loading remote stylesheet",c)})),console.error("Error inlining remote css file",o)}}),Promise.all(r).then(()=>(t.forEach(i=>{if("cssRules"in i)try{k(i.cssRules||[]).forEach(o=>{n.push(o)})}catch(o){console.error(`Error while reading CSS rules from ${i.href}`,o)}}),n))}function wn(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>Wt(e.style.getPropertyValue("src")))}async function bn(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");const n=k(t.ownerDocument.styleSheets),r=await gn(n,e);return wn(r)}function Qt(t){return t.trim().replace(/["']/g,"")}function Sn(t){const e=new Set;function n(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(o=>{e.add(Qt(o))}),Array.from(r.children).forEach(o=>{o instanceof HTMLElement&&n(o)})}return n(t),e}async function vn(t,e){const n=await bn(t,e),r=Sn(t);return(await Promise.all(n.filter(o=>r.has(Qt(o.style.fontFamily))).map(o=>{const a=o.parentStyleSheet?o.parentStyleSheet.href:null;return qt(o.cssText,a,e)}))).join(`
|
|
2
|
+
`)}async function xn(t,e){const n=e.fontEmbedCSS!=null?e.fontEmbedCSS:e.skipFonts?null:await vn(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 En(t,e={}){const{width:n,height:r}=Bt(t,e),i=await et(t,e,!0);return await xn(i,e),await Kt(i,e),yn(i,e),await Ue(i,n,r)}async function Mn(t,e={}){const{width:n,height:r}=Bt(t,e),i=await En(t,e),o=await tt(i),a=document.createElement("canvas"),c=a.getContext("2d"),l=e.pixelRatio||Fe(),u=e.canvasWidth||n,h=e.canvasHeight||r;return a.width=u*l,a.height=h*l,e.skipAutoScale||De(a),a.style.width=`${u}`,a.style.height=`${h}`,e.backgroundColor&&(c.fillStyle=e.backgroundColor,c.fillRect(0,0,a.width,a.height)),c.drawImage(o,0,0,a.width,a.height),a}async function Cn(t,e={}){return(await Mn(t,e)).toDataURL()}const nt="data-nf-capture-chrome";function Ln(t){return t instanceof Element&&(t.hasAttribute(nt)||t.hasAttribute("data-nf-mask-cover")||t.id==="notefully")}function $n(){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 Rn(){const t=document.querySelector(`[${nt}]`);if(t)return t;const e=document.createElement("div");return e.setAttribute(nt,"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 An(){document.querySelectorAll(`[${nt}]`).forEach(t=>t.remove())}async function Tn(){const t=document.getElementById("notefully"),e=t?t.style.display:"",n=Rn();t&&(t.style.display="none");const r=$n();await new Promise(i=>requestAnimationFrame(()=>requestAnimationFrame(i)));try{return await Cn(document.body,{cacheBust:!0,pixelRatio:Math.min(window.devicePixelRatio||1,2),filter:i=>!Ln(i)})}finally{r(),n.remove(),An(),t&&(t.style.display=e)}}function kn(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 Pn(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 In(t={}){const e=navigator.userAgent;return{url:location.href,title:document.title,userAgent:e,os:kn(e),browser:Pn(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 Zt=new Set(["userId","email","displayName"]),te={id:"userId",username:"displayName",name:"displayName"},ee=new Set(["endpoint","projectKey","version","name","targets","hideLauncher","theme","video","consoleLogLimit","kinds"]),ne={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 On(t={},e={}){const n=e.warn||re,r=t&&typeof t=="object"?t:{},i={},o=[];for(const a of Zt)Object.prototype.hasOwnProperty.call(r,a)&&(i[a]=r[a]);for(const[a,c]of Object.entries(te))Object.prototype.hasOwnProperty.call(r,a)&&(Object.prototype.hasOwnProperty.call(i,c)||(i[c]=r[a]));for(const a of Object.keys(r))Zt.has(a)||Object.prototype.hasOwnProperty.call(te,a)||o.push(a);if(o.length){const a=o.some(c=>c==="name"||c==="slug"||c==="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 Hn(t={},e={}){const n=e.warn||re,r=t&&typeof t=="object"?t:{},i=Object.keys(r).filter(o=>!ee.has(o));if(i.length)for(const o of i){if(ne[o]){n(`Notefully.init: ignoring "${o}". ${ne[o]}`);continue}n(`Notefully.init: ignoring unknown key "${o}". Supported: ${[...ee].join(", ")}.`)}}function re(t){typeof console<"u"&&typeof console.warn=="function"&&console.warn(t)}const Fn=80;function Dn(){const t=[],e={};let n=!1;const r=(o,a)=>{let c="";try{c=a.map(l=>l instanceof Error?l.stack||l.message:typeof l=="string"?l:JSON.stringify(l)).join(" ")}catch{c=String(a[0])}t.push({level:o,text:c.slice(0,2e3),at:Date.now()}),t.length>Fn&&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 Bn(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 c="";for(let l=a.resultIndex;l<a.results.length;l+=1)a.results[l].isFinal&&(c+=a.results[l][0].transcript);c&&t(c)},n.onerror=()=>{r=!1},n.onend=()=>{r=!1},n.start(),r=!0,!0)},stop:i,isSupported:()=>!!e,isActive:()=>r}}const Un=60*1e3;function jn({onStart:t,onStop:e,onError:n}){let r=null,i=null,o=[],a=null;const c=()=>{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}c(),e(null)};return{start:async()=>{var h,p;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;c(),e(y)},(p=r.getVideoTracks()[0])==null||p.addEventListener("ended",()=>l()),i.start(),a=setTimeout(l,Un)},stop:l}}function _n(){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 pt={x:0,y:0,w:1,h:1};function ie(){const t=_n();let e=[],n={...pt},r=1;return{list:()=>e.filter(o=>Vn(o,n)),all:()=>e.slice(),crop:()=>({...n}),setCrop(o){return n=Nn(o),n},resetCrop(){return n={...pt},n},isCropped(){return n.x>1e-6||n.y>1e-6||n.w<.999999||n.h<.999999},add(o,a){const c={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(c),c},update(o,a){const c=e.find(l=>l.id===o);return c?(Object.assign(c,a),c):null},remove(o){const a=e.findIndex(l=>l.id===o);if(a<0)return null;const[c]=e.splice(a,1);return t.free(c.number),c},reset(){for(e=[],n={...pt},r=1;t.peekUsed().length;)t.free(t.peekUsed()[0])}}}function Nn(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 Vn(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 yt(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 zn(t,{stickers:e=[],crop:n={x:0,y:0,w:1,h:1},width:r,height:i,colors:o={}}){const a=o.mark||"#fdd341",c=o.markText||"#2a2140",l=yt(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=gt(u.x,n,r),p=wt(u.y,n,i),y=u.w/n.w*r,x=u.h/n.h*i,A=l.stroke/2;if(u.type==="rect")t.strokeRect(h+A,p+A,Math.max(0,y-l.stroke),Math.max(0,x-l.stroke));else if(u.type==="circle")t.beginPath(),t.ellipse(h+y/2,p+x/2,Math.max(.5,y/2-A),Math.max(.5,x/2-A),0,0,Math.PI*2),t.stroke();else if(u.type==="arrow"){const z=gt(u.x2??u.x+u.w,n,r),W=wt(u.y2??u.y,n,i);qn(t,h,p,z,W,l)}if(u.number==null||u.number==="")return;const F=Wn(u,n,r,i,h,p,y),Q=String(u.number);t.beginPath(),t.arc(F.x,F.y,l.badgeRadius,0,Math.PI*2),t.fillStyle=a,t.fill(),t.fillStyle=c,t.textAlign="center",t.textBaseline="middle",t.fillText(Q,F.x,F.y+.5),t.fillStyle=a}),t.restore()}function gt(t,e,n){return(t-e.x)/e.w*n}function wt(t,e,n){return(t-e.y)/e.h*n}function Wn(t,e,n,r,i,o,a){if(t.type==="arrow"){const c=gt(t.x2??t.x+t.w,e,n),l=wt(t.y2??t.y,e,r);return{x:(i+c)/2,y:(o+l)/2}}return{x:i+a/2,y:o}}function oe(t,e,n,r,i){const o=Math.atan2(r-e,n-t),a=i.arrowHead,c=Math.min(i.stroke,a*.2),l=n,u=r,h=n-Math.cos(o)*a,p=r-Math.sin(o)*a,y={x:l-a*Math.cos(o-i.arrowHeadAngle),y:u-a*Math.sin(o-i.arrowHeadAngle)},x={x:l-a*Math.cos(o+i.arrowHeadAngle),y:u-a*Math.sin(o+i.arrowHeadAngle)},A={x:n-Math.cos(o)*c,y:r-Math.sin(o)*c};return{angle:o,tipX:l,tipY:u,baseX:h,baseY:p,left:y,right:x,shaftEnd:A}}function qn(t,e,n,r,i,o){const a=oe(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 Kn(t,e,n,r={}){return new Promise((i,o)=>{const a=new Image;a.onload=()=>{const c=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)),p=document.createElement("canvas");p.width=u,p.height=h;const y=p.getContext("2d");y.drawImage(a,c,l,u,h,0,0,u,h),zn(y,{stickers:n,crop:e,width:u,height:h,colors:r}),p.toBlob(x=>{if(!x){o(new Error("Could not encode screenshot"));return}i(x)},"image/png")},a.onerror=()=>o(new Error("Could not load screenshot")),a.src=t})}const B=[{id:"bug",label:"Bug"},{id:"idea",label:"Idea"},{id:"other",label:"Other"}];function ae(t){return String(t||"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32)}function bt(t){const e=String(t||"").trim();return e?e.split(/[-_\s]+/).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" "):""}function Xn(t){if(!Array.isArray(t)||!t.length)return B.map(r=>({...r}));const e=new Set,n=[];for(const r of t){let i="",o="";typeof r=="string"||typeof r=="number"?(i=ae(r),o=bt(i)):r&&typeof r=="object"&&(i=ae(r.id??r.value??r.kind),o=String(r.label||r.name||bt(i)).trim()||bt(i)),!(!i||e.has(i))&&(e.add(i),n.push({id:i,label:o}))}return n.length?n:B.map(r=>({...r}))}function rt(t){var n;const e=Array.isArray(t)&&t.length?t:B;return e.some(r=>r.id==="bug")?"bug":((n=e[0])==null?void 0:n.id)||"other"}const Yn=["maker","all-business","brighter-day","quiet-night"],se="maker",Gn=new Set(["crop","arrow","rect","circle"]),St=.02,ce=.05,Jn=`
|
|
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
|
|
8
|
-
<button class="nf-launcher" type="button" title="Leave a note…" aria-label="Leave a note…">${
|
|
7
|
+
`;function P(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:P('<path d="M6 3v5H1M18 21v-5h5M8 5h8a2 2 0 0 1 2 2v8M16 19H8a2 2 0 0 1-2-2V8"/>'),resetCrop:P('<path d="M3 12a9 9 0 1 0 3-6.7L3 8"/><path d="M3 3v5h5"/>'),arrow:P('<path d="M5 19 19 5"/><path d="M9 5h10v10"/>'),rect:P('<rect x="4" y="6" width="16" height="12" rx="1.5"/>'),circle:P('<circle cx="12" cy="12" r="8"/>'),discard:P('<path d="M4 7h16"/><path d="M9 7V5h6v2"/><path d="M6 7l1 13h10l1-13"/>'),audio:P('<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:P('<rect x="3" y="7" width="13" height="10" rx="2"/><path d="M16 10.5 21 8v8l-5-2.5z"/>')},le=Dn();le.hook();const ue=10,Qn=80,de="notefully.author",vt="Anonymous";let d={endpoint:"",projectKey:"",version:"0.0.0",name:"",targets:null,hideLauncher:!1,theme:se,video:!1,consoleLogLimit:ue,kinds:B.map(t=>({...t}))},$={},f=null,s={},m=ie(),S="",K="",T=null,U=rt(B),O=null,R=null,w=null,b=null,it=null,j=null,X=null,H={w:0,h:0},xt=!1,Et=!1;function g(t){return f.querySelector(t)}function fe(t){const e=String(t||"").trim().toLowerCase().replace(/\s+/g,"-");return Yn.includes(e)?e:se}function he(t,e){return f&&getComputedStyle(f).getPropertyValue(t).trim()||e}async function Zn(t){return(await fetch(t)).blob()}function v(t,e=!1){s.status&&(s.status.textContent=t||"",it&&(clearTimeout(it),it=null),t&&!e&&(it=setTimeout(()=>{s.status.textContent=""},4e3)))}function Mt(){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…">${Jn}</button>
|
|
9
9
|
<div class="nf-dialog" hidden>
|
|
10
10
|
<div class="nf-panel">
|
|
11
11
|
<div class="nf-panel-body">
|
|
@@ -35,8 +35,8 @@ var Notefully=(function(A){"use strict";function Re(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(h),c={launcher:g(".nf-launcher"),dialog:g(".nf-dialog"),panel:g(".nf-panel"),panelBody:g(".nf-panel-body"),successMsg:g(".nf-success-msg"),stage:g(".nf-stage"),canvas:g(".nf-canvas"),text:g(".nf-text"),author:g(".nf-author"),restore:g(".nf-restore"),status:g(".nf-status"),audio:g(".nf-audio"),video:g(".nf-video"),discard:g(".nf-discard-shot"),stop:g(".nf-stop-video"),resetCrop:g(".nf-reset-crop"),submit:g(".nf-submit"),shot:null},Gn(),it()),h}function it(){var t;h&&(h.dataset.theme=de(d.theme),d.hideLauncher?h.setAttribute("data-nf-hidden-launcher",""):h.removeAttribute("data-nf-hidden-launcher"),c.video&&(c.video.hidden=!d.video),pe(),(t=c.dialog)!=null&&t.hidden&&ot())}function ot(){c.launcher&&(c.launcher.hidden=!!d.hideLauncher)}function Gn(){c.launcher.addEventListener("click",()=>Pt()),g(".nf-dialog").addEventListener("click",e=>{vt||e.target===c.dialog&&G()}),h.querySelectorAll(".nf-tool").forEach(e=>{e.addEventListener("click",()=>Mt(e.dataset.tool))}),c.resetCrop.addEventListener("click",rr),c.canvas.addEventListener("pointerdown",Qn),c.canvas.addEventListener("dragstart",e=>e.preventDefault());const t=g(".nf-kind");t&&t.addEventListener("click",e=>{const n=e.target.closest("[data-kind]");n&&Et(n.dataset.kind)}),c.discard.addEventListener("click",ir),c.restore.addEventListener("click",or),c.audio.addEventListener("click",ar),c.video.addEventListener("click",sr),c.stop.addEventListener("click",()=>K==null?void 0:K.stop()),g(".nf-submit").addEventListener("click",()=>{Tt().catch(e=>v(e.message||"Submit failed."))}),pe(),Mt(null)}function he(t){return String(t||"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function pe(){const t=h==null?void 0:h.querySelector(".nf-kind");if(!t)return;const e=Array.isArray(d.kinds)&&d.kinds.length?d.kinds:B;t.innerHTML=e.map(i=>`<button type="button" data-kind="${he(i.id)}">${he(i.label)}</button>`).join("");const r=e.map(i=>i.id).includes(U)?U:nt(e);Et(r)}function Et(t){U=(d.kinds||B).map(n=>n.id).includes(t)?t:nt(d.kinds),h==null||h.querySelectorAll("[data-kind]").forEach(n=>{n.dataset.active=String(n.dataset.kind===U)})}function Mt(t){O=qn.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"),S&&C()}function me(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:me((t.clientX-e.left)/Math.max(e.width,1)),y:me((t.clientY-e.top)/Math.max(e.height,1))}}function Jn(t){const e=X().getBoundingClientRect();return t.clientX>=e.left&&t.clientX<=e.right&&t.clientY>=e.top&&t.clientY<=e.bottom}function ye(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){h&&(t?h.dataset.grabbing="true":delete h.dataset.grabbing)}function Lt(t){try{c.canvas.setPointerCapture(t.pointerId)}catch{}}function $t(){window.addEventListener("pointermove",we),window.addEventListener("pointerup",ct),window.addEventListener("pointercancel",ct)}function ge(){window.removeEventListener("pointermove",we),window.removeEventListener("pointerup",ct),window.removeEventListener("pointercancel",ct)}function Qn(t){if(t.button!==0||!S)return;if(!t.target.closest(".nf-sticker")&&!Jn(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,Lt(t),Zn({kind:"sticker",id:$,dir:(e==null?void 0:e.dataset.dir)||"move"},t),C();return}if($=null,O==="crop"){t.preventDefault(),Lt(t),w={kind:"crop",start:at(t),current:at(t)},$t(),C();return}if(O==="arrow"||O==="rect"||O==="circle"){t.preventDefault(),Lt(t);const r=ye(t);w={kind:"sticker",type:O,start:r,current:r},$t(),C();return}C()}function Zn(t,e){e.preventDefault(),e.stopPropagation();const n=X().getBoundingClientRect(),r=p.list().find(i=>i.id===t.id);b={...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"),$t()}function we(t){if(w){w.current=w.kind==="crop"?at(t):ye(t),C();return}if(!b)return;const e=(t.clientX-b.startX)/b.rect.width*b.crop.w,n=(t.clientY-b.startY)/b.rect.height*b.crop.h,r=b.sticker;if(r){if(b.dir==="end")p.update(r.id,{x2:r.x2+e,y2:r.y2+n});else if(b.dir==="start")p.update(r.id,{x:r.x+e,y:r.y+n});else if(b.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};tr(i,b.dir,e,n),p.update(r.id,i)}C()}}function tr(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(ge(),Ct(!1),w){er();return}if(b){if(b.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(b.id),$=null)}b=null,C()}}function er(){const t=w;if(w=null,!t)return;if(t.kind==="crop"){const n=st(t.start,t.current);if(Math.abs(t.current.x-t.start.x)<se||Math.abs(t.current.y-t.start.y)<se){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=nr(t);e&&($=e.id),C()}function nr(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 rr(){p.resetCrop(),$=null,Y()}function Rt(){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 ir(){S&&(q=S),S="",c.stage.hidden=!0,c.restore.hidden=!q}function or(){q&&(S=q,c.stage.hidden=!1,c.restore.hidden=!0,Y())}function ar(){try{if(j||(j=On(e=>{const n=c.text.value.trim();c.text.value=n?`${n} ${e}`:e})),!j.isSupported()){v("Audio-to-text is not supported in this browser.");return}const t=j.start();At(t),v(t?"Listening…":"")}catch(t){v(t.message)}}async function sr(){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=Fn({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>`:"",Rt();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=()=>{cr(t),C()};t.addEventListener("load",e),t.complete&&t.naturalWidth&&e()}function cr(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 lr(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){Rt();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`),(w==null?void 0:w.kind)==="crop"){const o=document.createElement("div");o.className="nf-crop",be(o,st(w.start,w.current),{x:0,y:0,w:1,h:1}),c.shot.appendChild(o)}const i=p.list().slice();if((w==null?void 0:w.kind)==="sticker"&&i.push(lr(w)),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"?ur(l,o,e,s,r):(be(l,o,e),s&&["nw","ne","sw","se"].forEach(u=>kt(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)}Rt()}function ur(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,f=((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),x=Math.min(l,f)-y,R=Math.min(u,m)-y,F=Math.max(2,Math.abs(f-l))+y*2,J=Math.max(2,Math.abs(m-u))+y*2,V=l-x,z=u-R,Ot=f-x,Ht=m-R,D=ie(V,z,Ot,Ht,i),W=document.createElementNS("http://www.w3.org/2000/svg","svg");t.style.left=`${x}px`,t.style.top=`${R}px`,t.style.width=`${F}px`,t.style.height=`${J}px`,W.setAttribute("class","nf-arrow-svg"),W.setAttribute("viewBox",`0 0 ${F} ${J}`),W.setAttribute("width",String(F)),W.setAttribute("height",String(J)),W.innerHTML=`
|
|
39
|
-
<line class="nf-arrow-hit" x1="${
|
|
40
|
-
<line class="nf-arrow-shaft" x1="${
|
|
38
|
+
`,document.body.appendChild(f),s={launcher:g(".nf-launcher"),dialog:g(".nf-dialog"),panel:g(".nf-panel"),panelBody:g(".nf-panel-body"),successMsg:g(".nf-success-msg"),stage:g(".nf-stage"),canvas:g(".nf-canvas"),text:g(".nf-text"),author:g(".nf-author"),restore:g(".nf-restore"),status:g(".nf-status"),audio:g(".nf-audio"),video:g(".nf-video"),discard:g(".nf-discard-shot"),stop:g(".nf-stop-video"),resetCrop:g(".nf-reset-crop"),submit:g(".nf-submit"),shot:null},tr(),Y()),f}function Y(){var t;f&&(f.dataset.theme=fe(d.theme),d.hideLauncher?f.setAttribute("data-nf-hidden-launcher",""):f.removeAttribute("data-nf-hidden-launcher"),s.video&&(s.video.hidden=!d.video),pe(),(t=s.dialog)!=null&&t.hidden&&ot())}function ot(){s.launcher&&(s.launcher.hidden=!!d.hideLauncher)}function tr(){s.launcher.addEventListener("click",()=>It()),g(".nf-dialog").addEventListener("click",e=>{Et||e.target===s.dialog&&V()}),f.querySelectorAll(".nf-tool").forEach(e=>{e.addEventListener("click",()=>Lt(e.dataset.tool))}),s.resetCrop.addEventListener("click",sr),s.canvas.addEventListener("pointerdown",nr),s.canvas.addEventListener("dragstart",e=>e.preventDefault());const t=g(".nf-kind");t&&t.addEventListener("click",e=>{const n=e.target.closest("[data-kind]");n&&Ct(n.dataset.kind)}),s.discard.addEventListener("click",cr),s.restore.addEventListener("click",lr),s.audio.addEventListener("click",ur),s.video.addEventListener("click",dr),s.stop.addEventListener("click",()=>X==null?void 0:X.stop()),g(".nf-submit").addEventListener("click",()=>{Ot().catch(e=>v(e.message||"Submit failed."))}),pe(),Lt(null)}function me(t){return String(t||"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function pe(){const t=f==null?void 0:f.querySelector(".nf-kind");if(!t)return;const e=Array.isArray(d.kinds)&&d.kinds.length?d.kinds:B;t.innerHTML=e.map(i=>`<button type="button" data-kind="${me(i.id)}">${me(i.label)}</button>`).join("");const r=e.map(i=>i.id).includes(U)?U:rt(e);Ct(r)}function Ct(t){U=(d.kinds||B).map(n=>n.id).includes(t)?t:rt(d.kinds),f==null||f.querySelectorAll("[data-kind]").forEach(n=>{n.dataset.active=String(n.dataset.kind===U)})}function Lt(t){O=Gn.has(t)?t:null,R=null,f.querySelectorAll(".nf-tool").forEach(e=>{e.dataset.active=String(e.dataset.tool===O)}),s.canvas&&(s.canvas.dataset.draw=O?"true":"false"),S&&L()}function ye(t){return Math.min(1,Math.max(0,t))}function G(){return s.shot||s.canvas}function at(t){const e=G().getBoundingClientRect();return{x:ye((t.clientX-e.left)/Math.max(e.width,1)),y:ye((t.clientY-e.top)/Math.max(e.height,1))}}function er(t){const e=G().getBoundingClientRect();return t.clientX>=e.left&&t.clientX<=e.right&&t.clientY>=e.top&&t.clientY<=e.bottom}function ge(t){const e=at(t),n=m.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(St,Math.abs(e.x-t.x)),h:Math.max(St,Math.abs(e.y-t.y))}}function $t(t){f&&(t?f.dataset.grabbing="true":delete f.dataset.grabbing)}function Rt(t){try{s.canvas.setPointerCapture(t.pointerId)}catch{}}function At(){window.addEventListener("pointermove",be),window.addEventListener("pointerup",ct),window.addEventListener("pointercancel",ct)}function we(){window.removeEventListener("pointermove",be),window.removeEventListener("pointerup",ct),window.removeEventListener("pointercancel",ct)}function nr(t){if(t.button!==0||!S)return;if(!t.target.closest(".nf-sticker")&&!er(t)){R=null,L();return}const e=t.target.closest(".nf-handle"),n=t.target.closest(".nf-sticker");if(n&&n.dataset.preview!=="true"){t.preventDefault(),t.stopPropagation(),R=n.dataset.id,Rt(t),rr({kind:"sticker",id:R,dir:(e==null?void 0:e.dataset.dir)||"move"},t),L();return}if(R=null,O==="crop"){t.preventDefault(),Rt(t),w={kind:"crop",start:at(t),current:at(t)},At(),L();return}if(O==="arrow"||O==="rect"||O==="circle"){t.preventDefault(),Rt(t);const r=ge(t);w={kind:"sticker",type:O,start:r,current:r},At(),L();return}L()}function rr(t,e){e.preventDefault(),e.stopPropagation();const n=G().getBoundingClientRect(),r=m.list().find(i=>i.id===t.id);b={...t,startX:e.clientX,startY:e.clientY,crop:m.crop(),sticker:r?{...r}:null,rect:n},$t(t.dir==="move"||t.dir==="start"||t.dir==="end"),At()}function be(t){if(w){w.current=w.kind==="crop"?at(t):ge(t),L();return}if(!b)return;const e=(t.clientX-b.startX)/b.rect.width*b.crop.w,n=(t.clientY-b.startY)/b.rect.height*b.crop.h,r=b.sticker;if(r){if(b.dir==="end")m.update(r.id,{x2:r.x2+e,y2:r.y2+n});else if(b.dir==="start")m.update(r.id,{x:r.x+e,y:r.y+n});else if(b.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 i={x:r.x,y:r.y,w:r.w,h:r.h};ir(i,b.dir,e,n),m.update(r.id,i)}L()}}function ir(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(we(),$t(!1),w){or();return}if(b){if(b.kind==="sticker"){const e=s.canvas.getBoundingClientRect();(t.clientX<e.left-24||t.clientX>e.right+24||t.clientY<e.top-24||t.clientY>e.bottom+24)&&(m.remove(b.id),R=null)}b=null,L()}}function or(){const t=w;if(w=null,!t)return;if(t.kind==="crop"){const n=st(t.start,t.current);if(Math.abs(t.current.x-t.start.x)<ce||Math.abs(t.current.y-t.start.y)<ce){L();return}const i=m.crop();m.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}),J();return}const e=ar(t);e&&(R=e.id),L()}function ar(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)<St?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,st(t.start,t.current))}function sr(){m.resetCrop(),R=null,J()}function Tt(){s.resetCrop&&(s.resetCrop.hidden=!m.isCropped())}function kt(t){if(!s.audio)return;const e=t?"Stop audio":"Record audio";s.audio.title=e,s.audio.setAttribute("aria-label",e),s.audio.dataset.active=String(!!t)}function cr(){S&&(K=S),S="",s.stage.hidden=!0,s.restore.hidden=!K}function lr(){K&&(S=K,s.stage.hidden=!1,s.restore.hidden=!0,J())}function ur(){try{if(j||(j=Bn(e=>{const n=s.text.value.trim();s.text.value=n?`${n} ${e}`:e})),!j.isSupported()){v("Audio-to-text is not supported in this browser.");return}const t=j.start();kt(t),v(t?"Listening…":"")}catch(t){v(t.message)}}async function dr(){if(!d.video){v("Video is disabled on this host.");return}s.dialog.hidden=!0,s.stop.hidden=!1,Y(),s.launcher.hidden=!0,X=jn({onStart(){},onStop(t){T=t,s.stop.hidden=!0,ot(),s.dialog.hidden=!1,J(),v(t?"Video attached.":"Recording cancelled.")},onError(t){v(t.message)}});try{await X.start()}catch(t){s.stop.hidden=!0,ot(),s.dialog.hidden=!1,v(t.message)}}function J(){if(s.shot=null,!S){s.canvas.style.removeProperty("--nf-shot-aspect"),s.canvas.style.removeProperty("aspect-ratio"),s.canvas.innerHTML=T?`<video class="nf-recording-preview" controls src="${URL.createObjectURL(T)}"></video>`:"",Tt();return}s.canvas.innerHTML=`<div class="nf-shot"><img alt="Screenshot" src="${S}" draggable="false"></div>`,s.shot=s.canvas.querySelector(".nf-shot");const t=s.shot.querySelector("img");t.draggable=!1,t.addEventListener("dragstart",n=>n.preventDefault());const e=()=>{fr(t),L()};t.addEventListener("load",e),t.complete&&t.naturalWidth&&e()}function fr(t){const e=t.naturalWidth||H.w,n=t.naturalHeight||H.h;if(e&&n&&(H={w:e,h:n},s.canvas.style.setProperty("--nf-shot-aspect",String(e/n)),s.canvas.style.aspectRatio=`${e} / ${n}`),!s.shot||!H.w||!H.h)return;const r=m.crop(),i=H.w/H.h,o=r.w/r.h*i,a=Math.min(1,o/i),c=Math.min(1,i/o);s.shot.style.left=`${(1-a)/2*100}%`,s.shot.style.top=`${(1-c)/2*100}%`,s.shot.style.width=`${a*100}%`,s.shot.style.height=`${c*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 hr(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 L(){if((s.shot||s.canvas).querySelectorAll(".nf-sticker, .nf-crop").forEach(o=>o.remove()),!S||!s.shot){Tt();return}const e=m.crop(),n=G(),r=yt(n.clientWidth||400);if(s.shot.style.setProperty("--nf-anno-stroke",`${r.stroke}px`),s.shot.style.setProperty("--nf-anno-badge",`${r.badgeRadius*2}px`),s.shot.style.setProperty("--nf-anno-badge-font",`${r.fontSize}px`),s.shot.style.setProperty("--nf-anno-handle",`${Math.max(8,r.stroke*2.5)}px`),(w==null?void 0:w.kind)==="crop"){const o=document.createElement("div");o.className="nf-crop",Se(o,st(w.start,w.current),{x:0,y:0,w:1,h:1}),s.shot.appendChild(o)}const i=m.list().slice();if((w==null?void 0:w.kind)==="sticker"&&i.push(hr(w)),i.forEach(o=>{const a=o.id==="preview",c=!a&&o.id===R,l=document.createElement("div");if(l.className=`nf-sticker nf-${o.type}`,l.dataset.id=o.id,c&&(l.dataset.selected="true"),a&&(l.dataset.preview="true"),o.type==="arrow"?mr(l,o,e,c,r):(Se(l,o,e),c&&["nw","ne","sw","se"].forEach(u=>Pt(l,u))),!a&&o.number){const u=document.createElement("span");u.className="nf-badge",u.textContent=String(o.number),l.appendChild(u)}s.shot.appendChild(l)}),s.canvas.querySelectorAll(":scope > .nf-recording-preview").forEach(o=>o.remove()),T){const o=document.createElement("video");o.className="nf-recording-preview",o.controls=!0,o.src=URL.createObjectURL(T),o.style.position="absolute",o.style.right="8px",o.style.bottom="8px",o.style.width="160px",s.canvas.appendChild(o)}Tt()}function mr(t,e,n,r,i=yt(400)){const o=G(),a=o.clientWidth,c=o.clientHeight,l=(e.x-n.x)/n.w*a,u=(e.y-n.y)/n.h*c,h=((e.x2??e.x+e.w)-n.x)/n.w*a,p=((e.y2??e.y)-n.y)/n.h*c,y=Math.max(18,i.arrowHead+i.stroke*2),x=Math.min(l,h)-y,A=Math.min(u,p)-y,F=Math.max(2,Math.abs(h-l))+y*2,Q=Math.max(2,Math.abs(p-u))+y*2,z=l-x,W=u-A,Ht=h-x,Ft=p-A,D=oe(z,W,Ht,Ft,i),q=document.createElementNS("http://www.w3.org/2000/svg","svg");t.style.left=`${x}px`,t.style.top=`${A}px`,t.style.width=`${F}px`,t.style.height=`${Q}px`,q.setAttribute("class","nf-arrow-svg"),q.setAttribute("viewBox",`0 0 ${F} ${Q}`),q.setAttribute("width",String(F)),q.setAttribute("height",String(Q)),q.innerHTML=`
|
|
39
|
+
<line class="nf-arrow-hit" x1="${z}" y1="${W}" x2="${Ht}" y2="${Ft}" />
|
|
40
|
+
<line class="nf-arrow-shaft" x1="${z}" y1="${W}" x2="${D.shaftEnd.x}" y2="${D.shaftEnd.y}" />
|
|
41
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(
|
|
42
|
+
`,t.appendChild(q),r&&(Pt(t,"start",{left:z-5,top:W-5}),Pt(t,"end",{left:Ht-5,top:Ft-5}))}function Pt(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 Se(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 pr(){try{return String(localStorage.getItem(de)||"").trim()}catch{return""}}function yr(t){const e=String(t||"").trim();if(!(!e||e===vt))try{localStorage.setItem(de,e)}catch{}}function ve(){return!!(String($.userId||"").trim()||String($.email||"").trim()||String($.displayName||"").trim())}function gr(){return String($.displayName||$.email||$.userId||"").trim()}function wr(){var e;if(ve())return gr()||vt;const t=String(((e=s.author)==null?void 0:e.value)||"").trim();return t?(yr(t),t):vt}function xe(){if(!s.author)return;const t=ve();if(s.author.hidden=t,t){s.author.value="";return}s.author.value=pr()}function Ee(t,e=ue){const n=Number(t);return Number.isFinite(n)?Math.min(Qn,Math.max(0,Math.floor(n))):e}function Me(t={}){Hn(t);const e=Object.prototype.hasOwnProperty.call(t,"kinds");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:fe(t.theme??d.theme),video:t.video==null?d.video:!!t.video,consoleLogLimit:t.consoleLogLimit==null?d.consoleLogLimit:Ee(t.consoleLogLimit,d.consoleLogLimit),kinds:e?Xn(t.kinds):d.kinds}}function lt(t={}){return Me(t),f&&Y(),ut}function Ce(t={}){return Me(t),Mt(),Y(),ut}function Le(t){return lt({theme:t})}function $e(t){const e=!!t;return!e&&f&&s.dialog&&!s.dialog.hidden&&V(),lt({hideLauncher:!e})}async function It(){Mt(),Re(),Y(),s.launcher.hidden=!0,m=ie(),H={w:0,h:0},T=null,R=null,w=null,b=null,U=rt(d.kinds),Ct(U),Lt(null),kt(!1),s.text.value="",xe(),v("");try{S=await Tn(),K=S,s.stage.hidden=!1,s.restore.hidden=!0,v("")}catch{S="",v("Screenshot failed; you can still send text.")}s.dialog.hidden=!1,J(),s.text.focus()}function V(){f&&(j==null||j.stop(),kt(!1),we(),w=null,b=null,$t(!1),Re(),s.dialog.hidden=!0,s.stop.hidden=!0,ot())}function br(){const t=s.dialog,e=s.panel,n=s.panelBody,r=s.successMsg;if(!t||!e||!n||!r)return Promise.resolve();Et=!0,v("");const i=typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches,o=e.getBoundingClientRect();if(n.hidden=!0,r.hidden=!1,t.classList.add("nf-success"),t.style.opacity="1",i)return new Promise(u=>{window.setTimeout(()=>u(),1e3)});const a=e.getBoundingClientRect(),c=a.width>0?o.width/a.width:1,l=a.height>0?o.height/a.height:1;return e.style.transformOrigin="center center",e.style.transition="none",e.style.transform=`scale(${c}, ${l})`,e.getBoundingClientRect(),new Promise(u=>{let h=!1;const p=()=>{h||(h=!0,e.removeEventListener("transitionend",y),window.setTimeout(()=>{t.style.transition="opacity 0.28s ease",t.style.opacity="0",window.setTimeout(()=>u(),280)},1e3))},y=x=>{x.target!==e||x.propertyName!=="transform"||p()};e.addEventListener("transitionend",y),requestAnimationFrame(()=>{e.style.transition="transform 0.48s cubic-bezier(0.22, 1, 0.36, 1)",e.style.transform="scale(1)"}),window.setTimeout(p,700)})}function Re(){Et=!1,s.dialog&&(s.dialog.classList.remove("nf-success"),s.dialog.style.opacity="",s.dialog.style.transition="",s.panel&&(s.panel.style.transform="",s.panel.style.transition="",s.panel.style.transformOrigin=""),s.panelBody&&(s.panelBody.hidden=!1),s.successMsg&&(s.successMsg.hidden=!0))}function Ae(t={}){$={...$,...On(t)},xe()}async function Ot(){if(Mt(),xt)return null;const t=s.text.value.trim();if(!t&&!S&&!T)return v("Add a note, screenshot, or video first."),null;if(!d.endpoint||!d.projectKey)return v("Notefully is missing endpoint or projectKey."),null;xt=!0,Te(!0),v("Submitting…",!0);try{const e=wr(),n=new FormData;if(n.append("message",t),n.append("kind",U),n.append("version",d.version||"0.0.0"),n.append("author",e),d.name&&n.append("name",d.name),n.append("context",JSON.stringify({...In({...$,displayName:$.displayName||e}),author:e,console:le.snapshot().slice(-Ee(d.consoleLogLimit))})),n.append("annotations",JSON.stringify(m.list())),n.append("crop",JSON.stringify(m.crop())),Array.isArray(d.targets)&&n.append("targets",JSON.stringify(d.targets)),S){const o=await Zn(S);if(n.append("screenshot",o,"screenshot.png"),m.list().length||m.isCropped()){const a=await Kn(S,m.crop(),m.list(),{mark:he("--nf-mark","#fdd341"),markText:he("--nf-mark-text","#2a2140")});n.append("screenshotBaked",a,"screenshot.baked.png")}}T&&n.append("recording",T,"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 await br(),V(),i}finally{xt=!1,Te(!1)}}function Te(t){s.submit&&(s.submit.disabled=!!t,s.submit.setAttribute("aria-busy",t?"true":"false"))}function ke(){V(),f==null||f.remove(),f=null,s={}}const ut={init:Ce,configure:lt,setTheme:Le,setVisible:$e,open:It,close:V,identify:Ae,submit:Ot,destroy:ke};return typeof window<"u"&&(window.Notefully=ut),C.close=V,C.configure=lt,C.default=ut,C.destroy=ke,C.identify=Ae,C.init=Ce,C.open=It,C.setTheme=Le,C.setVisible=$e,C.submit=Ot,Object.defineProperties(C,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),C})({});
|