@makefully/notefully 0.1.0 → 0.1.2
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 +71 -44
- package/dist/notefully.iife.js +19 -18
- package/dist/notefully.js +534 -472
- package/package.json +47 -47
package/README.md
CHANGED
|
@@ -1,44 +1,71 @@
|
|
|
1
|
-
# Notefully
|
|
2
|
-
|
|
3
|
-
In-app feedback for web apps: screenshot + numbered stickers, dictation, and optional short video.
|
|
4
|
-
|
|
5
|
-
## Install
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install @makefully/notefully
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Embed
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
1
|
+
# Notefully
|
|
2
|
+
|
|
3
|
+
In-app feedback for web apps: screenshot + numbered stickers, dictation, and optional short video.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @makefully/notefully
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Embed
|
|
12
|
+
|
|
13
|
+
```js
|
|
14
|
+
import Notefully from '@makefully/notefully';
|
|
15
|
+
import '@makefully/notefully/notefully.css';
|
|
16
|
+
|
|
17
|
+
Notefully.init({
|
|
18
|
+
endpoint: 'https://make.makefullystudios.com/notefully', // or your self-hosted relay
|
|
19
|
+
projectKey: 'nfk_…', // from Showfully → Notefully → Settings
|
|
20
|
+
version: '1.4.2',
|
|
21
|
+
theme: 'maker', // maker | all-business | brighter-day | quiet-night
|
|
22
|
+
video: false, // default; set true to enable screen recording
|
|
23
|
+
hideLauncher: true // optional; drive open/submit from your own UI
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
Notefully.identify({
|
|
27
|
+
userId: 'user_123',
|
|
28
|
+
email: 'ada@example.com',
|
|
29
|
+
displayName: 'Ada'
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Or via the IIFE build:
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<link rel="stylesheet" href="node_modules/@makefully/notefully/dist/notefully.css">
|
|
37
|
+
<script src="node_modules/@makefully/notefully/dist/notefully.iife.js"></script>
|
|
38
|
+
<script>
|
|
39
|
+
Notefully.init({
|
|
40
|
+
endpoint: 'https://make.makefullystudios.com/notefully',
|
|
41
|
+
projectKey: 'nfk_…',
|
|
42
|
+
version: '1.4.2',
|
|
43
|
+
hideLauncher: false
|
|
44
|
+
});
|
|
45
|
+
</script>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Bundlers should prefer the package export `import '@makefully/notefully/notefully.css'` (see Embed above). The `dist/` path is for static / IIFE hosts.
|
|
49
|
+
With `hideLauncher: true`, call `Notefully.open()` / `Notefully.submit()` from your own UI.
|
|
50
|
+
|
|
51
|
+
### Hosted relay
|
|
52
|
+
|
|
53
|
+
Makefully hosts a relay at **`https://make.makefullystudios.com/notefully`**. Pass that as `endpoint` (no trailing slash required). You still need a project key from your Showfully Notefully settings.
|
|
54
|
+
|
|
55
|
+
### Project key vs project slug
|
|
56
|
+
|
|
57
|
+
The widget only needs `projectKey` (`nfk_…`). The **project slug** (used in report folder names on the relay / Showfully) is configured on the relay from that key — it is **not** a `Notefully.init()` option. Passing `slug` / `projectSlug` is ignored (with a console warning).
|
|
58
|
+
|
|
59
|
+
### Identify
|
|
60
|
+
|
|
61
|
+
Call `Notefully.identify()` whenever the signed-in user is known (and again if they switch accounts):
|
|
62
|
+
|
|
63
|
+
| Field | Type | Notes |
|
|
64
|
+
|-------|------|--------|
|
|
65
|
+
| `userId` | string | Stable app user id. Alias: `id`. |
|
|
66
|
+
| `email` | string | Contact email when available. |
|
|
67
|
+
| `displayName` | string | Human-readable name. Aliases: `username`, `name`. |
|
|
68
|
+
|
|
69
|
+
Unknown keys are ignored and warned in the console so typos like `slug` do not fail silently. Identity is attached to each report’s context payload; it is not a substitute for `projectKey`.
|
|
70
|
+
|
|
71
|
+
Secrets never go in the widget — only the public project key and relay URL.
|
package/dist/notefully.iife.js
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
var Notefully=(function(L){"use strict";function ne(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 r=document.implementation.createHTMLDocument(),n=r.createElement("base"),i=r.createElement("a");return r.head.appendChild(n),r.body.appendChild(i),e&&(n.href=e),i.href=t,i.href}const re=(()=>{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 r=0,n=t.length;r<n;r++)e.push(t[r]);return e}let q=null;function Rt(t={}){return q||(t.includeStyleProperties?(q=t.includeStyleProperties,q):(q=T(window.getComputedStyle(document.documentElement)),q))}function K(t,e){const n=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return n?parseFloat(n.replace("px","")):0}function ie(t){const e=K(t,"border-left-width"),r=K(t,"border-right-width");return t.clientWidth+e+r}function ae(t){const e=K(t,"border-top-width"),r=K(t,"border-bottom-width");return t.clientHeight+e+r}function $t(t,e={}){const r=e.width||ie(t),n=e.height||ae(t);return{width:r,height:n}}function oe(){let t,e;try{e=process}catch{}const r=e&&e.env?e.env.devicePixelRatio:null;return r&&(t=parseInt(r,10),Number.isNaN(t)&&(t=1)),t||window.devicePixelRatio||1}const M=16384;function se(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 J(t){return new Promise((e,r)=>{const n=new Image;n.onload=()=>{n.decode().then(()=>{requestAnimationFrame(()=>e(n))})},n.onerror=r,n.crossOrigin="anonymous",n.decoding="async",n.src=t})}async function ce(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function le(t,e,r){const n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg"),a=document.createElementNS(n,"foreignObject");return i.setAttribute("width",`${e}`),i.setAttribute("height",`${r}`),i.setAttribute("viewBox",`0 0 ${e} ${r}`),a.setAttribute("width","100%"),a.setAttribute("height","100%"),a.setAttribute("x","0"),a.setAttribute("y","0"),a.setAttribute("externalResourcesRequired","true"),i.appendChild(a),a.appendChild(t),ce(i)}const E=(t,e)=>{if(t instanceof e)return!0;const r=Object.getPrototypeOf(t);return r===null?!1:r.constructor.name===e.name||E(r,e)};function ue(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function de(t,e){return Rt(e).map(r=>{const n=t.getPropertyValue(r),i=t.getPropertyPriority(r);return`${r}: ${n}${i?" !important":""};`}).join(" ")}function fe(t,e,r,n){const i=`.${t}:${e}`,a=r.cssText?ue(r):de(r,n);return document.createTextNode(`${i}{${a}}`)}function Lt(t,e,r,n){const i=window.getComputedStyle(t,r),a=i.getPropertyValue("content");if(a===""||a==="none")return;const o=re();try{e.className=`${e.className} ${o}`}catch{return}const s=document.createElement("style");s.appendChild(fe(o,r,i,n)),e.appendChild(s)}function he(t,e,r){Lt(t,e,":before",r),Lt(t,e,":after",r)}const Pt="application/font-woff",Tt="image/jpeg",me={woff:Pt,woff2:Pt,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:Tt,jpeg:Tt,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function pe(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function at(t){const e=pe(t).toLowerCase();return me[e]||""}function ge(t){return t.split(/,/)[1]}function ot(t){return t.search(/^(data:)/)!==-1}function ye(t,e){return`data:${e};base64,${t}`}async function At(t,e,r){const n=await fetch(t,e);if(n.status===404)throw new Error(`Resource "${n.url}" not found`);const i=await n.blob();return new Promise((a,o)=>{const s=new FileReader;s.onerror=o,s.onloadend=()=>{try{a(r({res:n,result:s.result}))}catch(l){o(l)}},s.readAsDataURL(i)})}const st={};function we(t,e,r){let n=t.replace(/\?.*/,"");return r&&(n=t),/ttf|otf|eot|woff2?/i.test(n)&&(n=n.replace(/.*\//,"")),e?`[${e}]${n}`:n}async function ct(t,e,r){const n=we(t,e,r.includeQueryParams);if(st[n]!=null)return st[n];r.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+new Date().getTime());let i;try{const a=await At(t,r.fetchRequestInit,({res:o,result:s})=>(e||(e=o.headers.get("Content-Type")||""),ge(s)));i=ye(a,e)}catch(a){i=r.imagePlaceholder||"";let o=`Failed to fetch resource: ${t}`;a&&(o=typeof a=="string"?a:a.message),o&&console.warn(o)}return st[n]=i,i}async function be(t){const e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):J(e)}async function xe(t,e){if(t.currentSrc){const a=document.createElement("canvas"),o=a.getContext("2d");a.width=t.clientWidth,a.height=t.clientHeight,o==null||o.drawImage(t,0,0,a.width,a.height);const s=a.toDataURL();return J(s)}const r=t.poster,n=at(r),i=await ct(r,n,e);return J(i)}async function ve(t,e){var r;try{if(!((r=t==null?void 0:t.contentDocument)===null||r===void 0)&&r.body)return await N(t.contentDocument.body,e,!0)}catch{}return t.cloneNode(!1)}async function Se(t,e){return E(t,HTMLCanvasElement)?be(t):E(t,HTMLVideoElement)?xe(t,e):E(t,HTMLIFrameElement)?ve(t,e):t.cloneNode(kt(t))}const Ee=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",kt=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function Ce(t,e,r){var n,i;if(kt(e))return e;let a=[];return Ee(t)&&t.assignedNodes?a=T(t.assignedNodes()):E(t,HTMLIFrameElement)&&(!((n=t.contentDocument)===null||n===void 0)&&n.body)?a=T(t.contentDocument.body.childNodes):a=T(((i=t.shadowRoot)!==null&&i!==void 0?i:t).childNodes),a.length===0||E(t,HTMLVideoElement)||await a.reduce((o,s)=>o.then(()=>N(s,r)).then(l=>{l&&e.appendChild(l)}),Promise.resolve()),e}function Me(t,e,r){const n=e.style;if(!n)return;const i=window.getComputedStyle(t);i.cssText?(n.cssText=i.cssText,n.transformOrigin=i.transformOrigin):Rt(r).forEach(a=>{let o=i.getPropertyValue(a);a==="font-size"&&o.endsWith("px")&&(o=`${Math.floor(parseFloat(o.substring(0,o.length-2)))-.1}px`),E(t,HTMLIFrameElement)&&a==="display"&&o==="inline"&&(o="block"),a==="d"&&e.getAttribute("d")&&(o=`path(${e.getAttribute("d")})`),n.setProperty(a,o,i.getPropertyPriority(a))})}function Re(t,e){E(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),E(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function $e(t,e){if(E(t,HTMLSelectElement)){const n=Array.from(e.children).find(i=>t.value===i.getAttribute("value"));n&&n.setAttribute("selected","")}}function Le(t,e,r){return E(e,Element)&&(Me(t,e,r),he(t,e,r),Re(t,e),$e(t,e)),e}async function Pe(t,e){const r=t.querySelectorAll?t.querySelectorAll("use"):[];if(r.length===0)return t;const n={};for(let a=0;a<r.length;a++){const s=r[a].getAttribute("xlink:href");if(s){const l=t.querySelector(s),b=document.querySelector(s);!l&&b&&!n[s]&&(n[s]=await N(b,e,!0))}}const i=Object.values(n);if(i.length){const a="http://www.w3.org/1999/xhtml",o=document.createElementNS(a,"svg");o.setAttribute("xmlns",a),o.style.position="absolute",o.style.width="0",o.style.height="0",o.style.overflow="hidden",o.style.display="none";const s=document.createElementNS(a,"defs");o.appendChild(s);for(let l=0;l<i.length;l++)s.appendChild(i[l]);t.appendChild(o)}return t}async function N(t,e,r){return!r&&e.filter&&!e.filter(t)?null:Promise.resolve(t).then(n=>Se(n,e)).then(n=>Ce(t,n,e)).then(n=>Le(t,n,e)).then(n=>Pe(n,e))}const It=/url\((['"]?)([^'"]+?)\1\)/g,Te=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,Ae=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function ke(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function Ie(t){const e=[];return t.replace(It,(r,n,i)=>(e.push(i),r)),e.filter(r=>!ot(r))}async function De(t,e,r,n,i){try{const a=r?ne(e,r):e,o=at(e);let s;return i||(s=await ct(a,o,n)),t.replace(ke(e),`$1${s}$3`)}catch{}return t}function Fe(t,{preferredFontFormat:e}){return e?t.replace(Ae,r=>{for(;;){const[n,,i]=Te.exec(r)||[];if(!i)return"";if(i===e)return`src: ${n};`}}):t}function Dt(t){return t.search(It)!==-1}async function Ft(t,e,r){if(!Dt(t))return t;const n=Fe(t,r);return Ie(n).reduce((a,o)=>a.then(s=>De(s,o,e,r)),Promise.resolve(n))}async function j(t,e,r){var n;const i=(n=e.style)===null||n===void 0?void 0:n.getPropertyValue(t);if(i){const a=await Ft(i,null,r);return e.style.setProperty(t,a,e.style.getPropertyPriority(t)),!0}return!1}async function He(t,e){await j("background",t,e)||await j("background-image",t,e),await j("mask",t,e)||await j("-webkit-mask",t,e)||await j("mask-image",t,e)||await j("-webkit-mask-image",t,e)}async function Oe(t,e){const r=E(t,HTMLImageElement);if(!(r&&!ot(t.src))&&!(E(t,SVGImageElement)&&!ot(t.href.baseVal)))return;const n=r?t.src:t.href.baseVal,i=await ct(n,at(n),e);await new Promise((a,o)=>{t.onload=a,t.onerror=e.onImageErrorHandler?(...l)=>{try{a(e.onImageErrorHandler(...l))}catch(b){o(b)}}:o;const s=t;s.decode&&(s.decode=a),s.loading==="lazy"&&(s.loading="eager"),r?(t.srcset="",t.src=i):t.href.baseVal=i})}async function Ue(t,e){const n=T(t.childNodes).map(i=>Ht(i,e));await Promise.all(n).then(()=>t)}async function Ht(t,e){E(t,Element)&&(await He(t,e),await Oe(t,e),await Ue(t,e))}function Ve(t,e){const{style:r}=t;e.backgroundColor&&(r.backgroundColor=e.backgroundColor),e.width&&(r.width=`${e.width}px`),e.height&&(r.height=`${e.height}px`);const n=e.style;return n!=null&&Object.keys(n).forEach(i=>{r[i]=n[i]}),t}const Ot={};async function Ut(t){let e=Ot[t];if(e!=null)return e;const n=await(await fetch(t)).text();return e={url:t,cssText:n},Ot[t]=e,e}async function Vt(t,e){let r=t.cssText;const n=/url\(["']?([^"')]+)["']?\)/g,a=(r.match(/url\([^)]+\)/g)||[]).map(async o=>{let s=o.replace(n,"$1");return s.startsWith("https://")||(s=new URL(s,t.url).href),At(s,e.fetchRequestInit,({result:l})=>(r=r.replace(o,`url(${l})`),[o,l]))});return Promise.all(a).then(()=>r)}function Bt(t){if(t==null)return[];const e=[],r=/(\/\*[\s\S]*?\*\/)/gi;let n=t.replace(r,"");const i=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){const l=i.exec(n);if(l===null)break;e.push(l[0])}n=n.replace(i,"");const a=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,o="((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})",s=new RegExp(o,"gi");for(;;){let l=a.exec(n);if(l===null){if(l=s.exec(n),l===null)break;a.lastIndex=s.lastIndex}else s.lastIndex=a.lastIndex;e.push(l[0])}return e}async function Be(t,e){const r=[],n=[];return t.forEach(i=>{if("cssRules"in i)try{T(i.cssRules||[]).forEach((a,o)=>{if(a.type===CSSRule.IMPORT_RULE){let s=o+1;const l=a.href,b=Ut(l).then(p=>Vt(p,e)).then(p=>Bt(p).forEach(h=>{try{i.insertRule(h,h.startsWith("@import")?s+=1:i.cssRules.length)}catch(w){console.error("Error inserting rule from remote css",{rule:h,error:w})}})).catch(p=>{console.error("Error loading remote css",p.toString())});n.push(b)}})}catch(a){const o=t.find(s=>s.href==null)||document.styleSheets[0];i.href!=null&&n.push(Ut(i.href).then(s=>Vt(s,e)).then(s=>Bt(s).forEach(l=>{o.insertRule(l,o.cssRules.length)})).catch(s=>{console.error("Error loading remote stylesheet",s)})),console.error("Error inlining remote css file",a)}}),Promise.all(n).then(()=>(t.forEach(i=>{if("cssRules"in i)try{T(i.cssRules||[]).forEach(a=>{r.push(a)})}catch(a){console.error(`Error while reading CSS rules from ${i.href}`,a)}}),r))}function _e(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>Dt(e.style.getPropertyValue("src")))}async function We(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");const r=T(t.ownerDocument.styleSheets),n=await Be(r,e);return _e(n)}function _t(t){return t.trim().replace(/["']/g,"")}function qe(t){const e=new Set;function r(n){(n.style.fontFamily||getComputedStyle(n).fontFamily).split(",").forEach(a=>{e.add(_t(a))}),Array.from(n.children).forEach(a=>{a instanceof HTMLElement&&r(a)})}return r(t),e}async function je(t,e){const r=await We(t,e),n=qe(t);return(await Promise.all(r.filter(a=>n.has(_t(a.style.fontFamily))).map(a=>{const o=a.parentStyleSheet?a.parentStyleSheet.href:null;return Ft(a.cssText,o,e)}))).join(`
|
|
2
|
-
`)}async function
|
|
1
|
+
var Notefully=(function(L){"use strict";function ce(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 r=document.implementation.createHTMLDocument(),n=r.createElement("base"),i=r.createElement("a");return r.head.appendChild(n),r.body.appendChild(i),e&&(n.href=e),i.href=t,i.href}const le=(()=>{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 r=0,n=t.length;r<n;r++)e.push(t[r]);return e}let N=null;function Rt(t={}){return N||(t.includeStyleProperties?(N=t.includeStyleProperties,N):(N=k(window.getComputedStyle(document.documentElement)),N))}function Y(t,e){const n=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return n?parseFloat(n.replace("px","")):0}function ue(t){const e=Y(t,"border-left-width"),r=Y(t,"border-right-width");return t.clientWidth+e+r}function de(t){const e=Y(t,"border-top-width"),r=Y(t,"border-bottom-width");return t.clientHeight+e+r}function Lt(t,e={}){const r=e.width||ue(t),n=e.height||de(t);return{width:r,height:n}}function fe(){let t,e;try{e=process}catch{}const r=e&&e.env?e.env.devicePixelRatio:null;return r&&(t=parseInt(r,10),Number.isNaN(t)&&(t=1)),t||window.devicePixelRatio||1}const M=16384;function he(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 G(t){return new Promise((e,r)=>{const n=new Image;n.onload=()=>{n.decode().then(()=>{requestAnimationFrame(()=>e(n))})},n.onerror=r,n.crossOrigin="anonymous",n.decoding="async",n.src=t})}async function pe(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function me(t,e,r){const n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg"),o=document.createElementNS(n,"foreignObject");return i.setAttribute("width",`${e}`),i.setAttribute("height",`${r}`),i.setAttribute("viewBox",`0 0 ${e} ${r}`),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),pe(i)}const E=(t,e)=>{if(t instanceof e)return!0;const r=Object.getPrototypeOf(t);return r===null?!1:r.constructor.name===e.name||E(r,e)};function ye(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function ge(t,e){return Rt(e).map(r=>{const n=t.getPropertyValue(r),i=t.getPropertyPriority(r);return`${r}: ${n}${i?" !important":""};`}).join(" ")}function we(t,e,r,n){const i=`.${t}:${e}`,o=r.cssText?ye(r):ge(r,n);return document.createTextNode(`${i}{${o}}`)}function Pt(t,e,r,n){const i=window.getComputedStyle(t,r),o=i.getPropertyValue("content");if(o===""||o==="none")return;const a=le();try{e.className=`${e.className} ${a}`}catch{return}const s=document.createElement("style");s.appendChild(we(a,r,i,n)),e.appendChild(s)}function be(t,e,r){Pt(t,e,":before",r),Pt(t,e,":after",r)}const kt="application/font-woff",Tt="image/jpeg",ve={woff:kt,woff2:kt,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:Tt,jpeg:Tt,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function Se(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function at(t){const e=Se(t).toLowerCase();return ve[e]||""}function xe(t){return t.split(/,/)[1]}function st(t){return t.search(/^(data:)/)!==-1}function Ee(t,e){return`data:${e};base64,${t}`}async function At(t,e,r){const n=await fetch(t,e);if(n.status===404)throw new Error(`Resource "${n.url}" not found`);const i=await n.blob();return new Promise((o,a)=>{const s=new FileReader;s.onerror=a,s.onloadend=()=>{try{o(r({res:n,result:s.result}))}catch(l){a(l)}},s.readAsDataURL(i)})}const ct={};function Ce(t,e,r){let n=t.replace(/\?.*/,"");return r&&(n=t),/ttf|otf|eot|woff2?/i.test(n)&&(n=n.replace(/.*\//,"")),e?`[${e}]${n}`:n}async function lt(t,e,r){const n=Ce(t,e,r.includeQueryParams);if(ct[n]!=null)return ct[n];r.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+new Date().getTime());let i;try{const o=await At(t,r.fetchRequestInit,({res:a,result:s})=>(e||(e=a.headers.get("Content-Type")||""),xe(s)));i=Ee(o,e)}catch(o){i=r.imagePlaceholder||"";let a=`Failed to fetch resource: ${t}`;o&&(a=typeof o=="string"?o:o.message),a&&console.warn(a)}return ct[n]=i,i}async function Me(t){const e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):G(e)}async function $e(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 G(s)}const r=t.poster,n=at(r),i=await lt(r,n,e);return G(i)}async function Re(t,e){var r;try{if(!((r=t==null?void 0:t.contentDocument)===null||r===void 0)&&r.body)return await J(t.contentDocument.body,e,!0)}catch{}return t.cloneNode(!1)}async function Le(t,e){return E(t,HTMLCanvasElement)?Me(t):E(t,HTMLVideoElement)?$e(t,e):E(t,HTMLIFrameElement)?Re(t,e):t.cloneNode(It(t))}const Pe=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",It=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function ke(t,e,r){var n,i;if(It(e))return e;let o=[];return Pe(t)&&t.assignedNodes?o=k(t.assignedNodes()):E(t,HTMLIFrameElement)&&(!((n=t.contentDocument)===null||n===void 0)&&n.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,s)=>a.then(()=>J(s,r)).then(l=>{l&&e.appendChild(l)}),Promise.resolve()),e}function Te(t,e,r){const n=e.style;if(!n)return;const i=window.getComputedStyle(t);i.cssText?(n.cssText=i.cssText,n.transformOrigin=i.transformOrigin):Rt(r).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")})`),n.setProperty(o,a,i.getPropertyPriority(o))})}function Ae(t,e){E(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),E(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function Ie(t,e){if(E(t,HTMLSelectElement)){const n=Array.from(e.children).find(i=>t.value===i.getAttribute("value"));n&&n.setAttribute("selected","")}}function De(t,e,r){return E(e,Element)&&(Te(t,e,r),be(t,e,r),Ae(t,e),Ie(t,e)),e}async function je(t,e){const r=t.querySelectorAll?t.querySelectorAll("use"):[];if(r.length===0)return t;const n={};for(let o=0;o<r.length;o++){const s=r[o].getAttribute("xlink:href");if(s){const l=t.querySelector(s),v=document.querySelector(s);!l&&v&&!n[s]&&(n[s]=await J(v,e,!0))}}const i=Object.values(n);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 J(t,e,r){return!r&&e.filter&&!e.filter(t)?null:Promise.resolve(t).then(n=>Le(n,e)).then(n=>ke(t,n,e)).then(n=>De(t,n,e)).then(n=>je(n,e))}const Dt=/url\((['"]?)([^'"]+?)\1\)/g,Fe=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,Oe=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function He(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function Ue(t){const e=[];return t.replace(Dt,(r,n,i)=>(e.push(i),r)),e.filter(r=>!st(r))}async function Ve(t,e,r,n,i){try{const o=r?ce(e,r):e,a=at(e);let s;return i||(s=await lt(o,a,n)),t.replace(He(e),`$1${s}$3`)}catch{}return t}function Be(t,{preferredFontFormat:e}){return e?t.replace(Oe,r=>{for(;;){const[n,,i]=Fe.exec(r)||[];if(!i)return"";if(i===e)return`src: ${n};`}}):t}function jt(t){return t.search(Dt)!==-1}async function Ft(t,e,r){if(!jt(t))return t;const n=Be(t,r);return Ue(n).reduce((o,a)=>o.then(s=>Ve(s,a,e,r)),Promise.resolve(n))}async function W(t,e,r){var n;const i=(n=e.style)===null||n===void 0?void 0:n.getPropertyValue(t);if(i){const o=await Ft(i,null,r);return e.style.setProperty(t,o,e.style.getPropertyPriority(t)),!0}return!1}async function _e(t,e){await W("background",t,e)||await W("background-image",t,e),await W("mask",t,e)||await W("-webkit-mask",t,e)||await W("mask-image",t,e)||await W("-webkit-mask-image",t,e)}async function Ne(t,e){const r=E(t,HTMLImageElement);if(!(r&&!st(t.src))&&!(E(t,SVGImageElement)&&!st(t.href.baseVal)))return;const n=r?t.src:t.href.baseVal,i=await lt(n,at(n),e);await new Promise((o,a)=>{t.onload=o,t.onerror=e.onImageErrorHandler?(...l)=>{try{o(e.onImageErrorHandler(...l))}catch(v){a(v)}}:a;const s=t;s.decode&&(s.decode=o),s.loading==="lazy"&&(s.loading="eager"),r?(t.srcset="",t.src=i):t.href.baseVal=i})}async function We(t,e){const n=k(t.childNodes).map(i=>Ot(i,e));await Promise.all(n).then(()=>t)}async function Ot(t,e){E(t,Element)&&(await _e(t,e),await Ne(t,e),await We(t,e))}function qe(t,e){const{style:r}=t;e.backgroundColor&&(r.backgroundColor=e.backgroundColor),e.width&&(r.width=`${e.width}px`),e.height&&(r.height=`${e.height}px`);const n=e.style;return n!=null&&Object.keys(n).forEach(i=>{r[i]=n[i]}),t}const Ht={};async function Ut(t){let e=Ht[t];if(e!=null)return e;const n=await(await fetch(t)).text();return e={url:t,cssText:n},Ht[t]=e,e}async function Vt(t,e){let r=t.cssText;const n=/url\(["']?([^"')]+)["']?\)/g,o=(r.match(/url\([^)]+\)/g)||[]).map(async a=>{let s=a.replace(n,"$1");return s.startsWith("https://")||(s=new URL(s,t.url).href),At(s,e.fetchRequestInit,({result:l})=>(r=r.replace(a,`url(${l})`),[a,l]))});return Promise.all(o).then(()=>r)}function Bt(t){if(t==null)return[];const e=[],r=/(\/\*[\s\S]*?\*\/)/gi;let n=t.replace(r,"");const i=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){const l=i.exec(n);if(l===null)break;e.push(l[0])}n=n.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(n);if(l===null){if(l=s.exec(n),l===null)break;o.lastIndex=s.lastIndex}else s.lastIndex=o.lastIndex;e.push(l[0])}return e}async function ze(t,e){const r=[],n=[];return t.forEach(i=>{if("cssRules"in i)try{k(i.cssRules||[]).forEach((o,a)=>{if(o.type===CSSRule.IMPORT_RULE){let s=a+1;const l=o.href,v=Ut(l).then(y=>Vt(y,e)).then(y=>Bt(y).forEach(p=>{try{i.insertRule(p,p.startsWith("@import")?s+=1:i.cssRules.length)}catch(b){console.error("Error inserting rule from remote css",{rule:p,error:b})}})).catch(y=>{console.error("Error loading remote css",y.toString())});n.push(v)}})}catch(o){const a=t.find(s=>s.href==null)||document.styleSheets[0];i.href!=null&&n.push(Ut(i.href).then(s=>Vt(s,e)).then(s=>Bt(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(n).then(()=>(t.forEach(i=>{if("cssRules"in i)try{k(i.cssRules||[]).forEach(o=>{r.push(o)})}catch(o){console.error(`Error while reading CSS rules from ${i.href}`,o)}}),r))}function Ke(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>jt(e.style.getPropertyValue("src")))}async function Xe(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");const r=k(t.ownerDocument.styleSheets),n=await ze(r,e);return Ke(n)}function _t(t){return t.trim().replace(/["']/g,"")}function Ye(t){const e=new Set;function r(n){(n.style.fontFamily||getComputedStyle(n).fontFamily).split(",").forEach(o=>{e.add(_t(o))}),Array.from(n.children).forEach(o=>{o instanceof HTMLElement&&r(o)})}return r(t),e}async function Ge(t,e){const r=await Xe(t,e),n=Ye(t);return(await Promise.all(r.filter(o=>n.has(_t(o.style.fontFamily))).map(o=>{const a=o.parentStyleSheet?o.parentStyleSheet.href:null;return Ft(o.cssText,a,e)}))).join(`
|
|
2
|
+
`)}async function Je(t,e){const r=e.fontEmbedCSS!=null?e.fontEmbedCSS:e.skipFonts?null:await Ge(t,e);if(r){const n=document.createElement("style"),i=document.createTextNode(r);n.appendChild(i),t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n)}}async function Ze(t,e={}){const{width:r,height:n}=Lt(t,e),i=await J(t,e,!0);return await Je(i,e),await Ot(i,e),qe(i,e),await me(i,r,n)}async function Qe(t,e={}){const{width:r,height:n}=Lt(t,e),i=await Ze(t,e),o=await G(i),a=document.createElement("canvas"),s=a.getContext("2d"),l=e.pixelRatio||fe(),v=e.canvasWidth||r,y=e.canvasHeight||n;return a.width=v*l,a.height=y*l,e.skipAutoScale||he(a),a.style.width=`${v}`,a.style.height=`${y}`,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 tn(t,e={}){return(await Qe(t,e)).toDataURL()}function en(){const t=[];return document.querySelectorAll('input[type="password"], [data-notefully-mask]').forEach(r=>{const n=r.getBoundingClientRect(),i=document.createElement("div");i.setAttribute("data-nf-mask-cover","1"),i.style.cssText=["position:fixed",`left:${n.left}px`,`top:${n.top}px`,`width:${Math.max(n.width,4)}px`,`height:${Math.max(n.height,4)}px`,"background:#111","z-index:2147483646","pointer-events:none"].join(";"),document.body.appendChild(i),t.push(i)}),()=>t.forEach(r=>r.remove())}async function nn(){const t=document.getElementById("notefully"),e=t?t.style.display:"";t&&(t.style.display="none");const r=en();await new Promise(n=>requestAnimationFrame(()=>requestAnimationFrame(n)));try{return await tn(document.body,{cacheBust:!0,pixelRatio:Math.min(window.devicePixelRatio||1,2),filter:n=>n instanceof Element?n.id!=="notefully"&&!n.hasAttribute("data-nf-mask-cover"):!0})}finally{r(),t&&(t.style.display=e)}}function rn(t={}){return{url:location.href,title:document.title,userAgent:navigator.userAgent,language:navigator.language,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,viewport:{width:window.innerWidth,height:window.innerHeight,dpr:window.devicePixelRatio||1},user:{userId:t.userId||null,email:t.email||null,displayName:t.displayName||null}}}const Nt=new Set(["userId","email","displayName"]),Wt={id:"userId",username:"displayName",name:"displayName"},qt=new Set(["endpoint","projectKey","version","targets","hideLauncher","theme","video"]),zt={slug:"Project slug comes from the relay project tied to your projectKey (Showfully Notefully settings) — it is not a widget init option.",projectSlug:"Project slug comes from the relay project tied to your projectKey (Showfully Notefully settings) — it is not a widget init option.",project:"Pass projectKey (nfk_…) from Showfully Notefully settings — there is no project slug/name 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().",name:"Pass people via Notefully.identify({ displayName }) (name is an identify alias), not init()."};function on(t={},e={}){const r=e.warn||Kt,n=t&&typeof t=="object"?t:{},i={},o=[];for(const a of Nt)Object.prototype.hasOwnProperty.call(n,a)&&(i[a]=n[a]);for(const[a,s]of Object.entries(Wt))Object.prototype.hasOwnProperty.call(n,a)&&(Object.prototype.hasOwnProperty.call(i,s)||(i[s]=n[a]));for(const a of Object.keys(n))Nt.has(a)||Object.prototype.hasOwnProperty.call(Wt,a)||o.push(a);if(o.length){const a=o.some(s=>s==="slug"||s==="projectSlug")?" Project slug is relay/dashboard config from the project key, not identify().":"";r(`Notefully.identify: ignoring unknown key(s): ${o.join(", ")}. Supported: userId, email, displayName (aliases: id → userId; username/name → displayName).`+a)}return i}function an(t={},e={}){const r=e.warn||Kt,n=t&&typeof t=="object"?t:{},i=Object.keys(n).filter(o=>!qt.has(o));if(i.length)for(const o of i){if(zt[o]){r(`Notefully.init: ignoring "${o}". ${zt[o]}`);continue}r(`Notefully.init: ignoring unknown key "${o}". Supported: ${[...qt].join(", ")}.`)}}function Kt(t){typeof console<"u"&&typeof console.warn=="function"&&console.warn(t)}const sn=80;function cn(){const t=[],e={};let r=!1;const n=(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>sn&&t.shift()};return{hook:()=>{r||typeof window>"u"||(r=!0,["log","info","warn","error"].forEach(o=>{e[o]=console[o].bind(console),console[o]=(...a)=>{n(o,a),e[o](...a)}}),window.addEventListener("error",o=>{n("error",[o.message||"window.error"])}),window.addEventListener("unhandledrejection",o=>{n("error",[o.reason||"unhandledrejection"])}))},snapshot(){return t.slice()}}}function ln(t){const e=window.SpeechRecognition||window.webkitSpeechRecognition;let r=null,n=!1;const i=()=>{if(n=!1,r)try{r.stop()}catch{}};return{start:()=>{if(!e)throw new Error("Speech recognition is not supported in this browser.");return n?(i(),!1):(r=new e,r.continuous=!0,r.interimResults=!0,r.lang=navigator.language||"en-US",r.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)},r.onerror=()=>{n=!1},r.onend=()=>{n=!1},r.start(),n=!0,!0)},stop:i,isSupported:()=>!!e,isActive:()=>n}}const un=60*1e3;function dn({onStart:t,onStop:e,onError:r}){let n=null,i=null,o=[],a=null;const s=()=>{if(a&&(clearTimeout(a),a=null),i&&i.state!=="inactive")try{i.stop()}catch{}n&&(n.getTracks().forEach(y=>y.stop()),n=null)},l=()=>{if(i&&i.state==="recording"){i.stop();return}s(),e(null)};return{start:async()=>{var y,p;if(!((y=navigator.mediaDevices)!=null&&y.getDisplayMedia))throw new Error("Screen recording is not supported in this browser.");n=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1,preferCurrentTab:!0,selfBrowserSurface:"include"}),o=[],i=new MediaRecorder(n,{mimeType:MediaRecorder.isTypeSupported("video/webm;codecs=vp9")?"video/webm;codecs=vp9":"video/webm"}),i.ondataavailable=b=>{b.data&&b.data.size&&o.push(b.data)},i.onstop=()=>{const b=o.length?new Blob(o,{type:i.mimeType||"video/webm"}):null;s(),e(b)},(p=n.getVideoTracks()[0])==null||p.addEventListener("ended",()=>l()),i.start(),a=setTimeout(l,un)},stop:l}}function fn(){const t=new Set;return{alloc(){let e=1;for(;t.has(e);)e+=1;return t.add(e),e},free(e){const r=Number(e);Number.isInteger(r)&&r>0&&t.delete(r)},peekUsed(){return[...t].sort((e,r)=>e-r)}}}const ut={x:0,y:0,w:1,h:1};function Xt(){const t=fn();let e=[],r={...ut},n=1;return{list:()=>e.filter(o=>pn(o,r)),all:()=>e.slice(),crop:()=>({...r}),setCrop(o){return r=hn(o),r},resetCrop(){return r={...ut},r},isCropped(){return r.x>1e-6||r.y>1e-6||r.w<.999999||r.h<.999999},add(o,a){const s={id:`s${n++}`,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=[],r={...ut},n=1;t.peekUsed().length;)t.free(t.peekUsed()[0])}}}function hn(t){const e=Math.min(Math.max(t.x,0),.95),r=Math.min(Math.max(t.y,0),.95),n=Math.min(Math.max(t.w,.05),1-e),i=Math.min(Math.max(t.h,.05),1-r);return{x:e,y:r,w:n,h:i}}function pn(t,e){const r=t.type==="arrow"?(t.x+(t.x2??t.x))/2:t.x+(t.w||0)/2,n=t.type==="arrow"?(t.y+(t.y2??t.y))/2:t.y+(t.h||0)/2;return r>=e.x&&n>=e.y&&r<=e.x+e.w&&n<=e.y+e.h}function mn(t,e,r,n={}){const i=n.mark||"#fdd341",o=n.markText||"#2a2140";return new Promise((a,s)=>{const l=new Image;l.onload=()=>{const v=Math.round(e.x*l.width),y=Math.round(e.y*l.height),p=Math.max(1,Math.round(e.w*l.width)),b=Math.max(1,Math.round(e.h*l.height)),j=document.createElement("canvas");j.width=p,j.height=b;const f=j.getContext("2d");f.drawImage(l,v,y,p,b,0,0,p,b),f.lineWidth=Math.max(3,Math.round(p/400)),f.strokeStyle=i,f.fillStyle=i,f.font=`700 ${Math.max(14,Math.round(p/40))}px sans-serif`,r.forEach(m=>{const F=dt(m.x,e,p),O=ft(m.y,e,b),H=m.w/e.w*p,B=m.h/e.h*b;if(m.type==="rect")f.strokeRect(F,O,H,B);else if(m.type==="circle")f.beginPath(),f.ellipse(F+H/2,O+B/2,H/2,B/2,0,0,Math.PI*2),f.stroke();else if(m.type==="arrow"){const On=dt(m.x2??m.x+m.w,e,p),Hn=ft(m.y2??m.y,e,b);gn(f,F,O,On,Hn)}const _=yn(m,e,p,b,F,O,H),U=String(m.number);f.beginPath(),f.arc(_.x,_.y,11,0,Math.PI*2),f.fill(),f.fillStyle=o,f.textAlign="center",f.textBaseline="middle",f.fillText(U,_.x,_.y),f.fillStyle=i}),j.toBlob(m=>{if(!m){s(new Error("Could not encode screenshot"));return}a(m)},"image/png")},l.onerror=()=>s(new Error("Could not load screenshot")),l.src=t})}function dt(t,e,r){return(t-e.x)/e.w*r}function ft(t,e,r){return(t-e.y)/e.h*r}function yn(t,e,r,n,i,o,a){if(t.type==="arrow"){const s=dt(t.x2??t.x+t.w,e,r),l=ft(t.y2??t.y,e,n);return{x:(i+s)/2,y:(o+l)/2}}return{x:i+a/2,y:o}}function gn(t,e,r,n,i){const o=Math.atan2(i-r,n-e),a=14,s=2,l=n-Math.cos(o)*s,v=i-Math.sin(o)*s;t.beginPath(),t.moveTo(e,r),t.lineTo(l,v),t.stroke(),t.beginPath(),t.moveTo(n,i),t.lineTo(n-a*Math.cos(o-.4),i-a*Math.sin(o-.4)),t.lineTo(n-a*Math.cos(o+.4),i-a*Math.sin(o+.4)),t.closePath(),t.fill()}const wn=["bug","idea","other"],bn=["maker","all-business","brighter-day","quiet-night"],Yt="maker",vn=new Set(["crop","arrow","rect","circle"]),ht=.02,Gt=.05,Sn=`
|
|
3
3
|
<svg class="nf-launcher-icon" viewBox="0 0 24 24" aria-hidden="true">
|
|
4
|
-
<path fill="currentColor" d="
|
|
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
|
+
<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"/>
|
|
5
6
|
</svg>
|
|
6
|
-
`;function
|
|
7
|
-
<button class="nf-launcher" type="button" title="
|
|
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 A={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"/>')},Jt=cn();Jt.hook();let h={endpoint:"",projectKey:"",version:"0.0.0",targets:null,hideLauncher:!1,theme:Yt,video:!1},pt={},u=null,c={},d=Xt(),S="",q="",P=null,Z="bug",I=null,R=null,g=null,w=null,Q=null,V=null,z=null,D={w:0,h:0};function C(t){return u.querySelector(t)}function Zt(t){const e=String(t||"").trim().toLowerCase().replace(/\s+/g,"-");return bn.includes(e)?e:Yt}function Qt(t,e){return u&&getComputedStyle(u).getPropertyValue(t).trim()||e}function x(t,e=!1){c.status&&(c.status.textContent=t||"",Q&&(clearTimeout(Q),Q=null),t&&!e&&(Q=setTimeout(()=>{c.status.textContent=""},4e3)))}function mt(){return u&&document.body.contains(u)||(u=document.createElement("div"),u.id="notefully",u.innerHTML=`
|
|
8
|
+
<button class="nf-launcher" type="button" title="Leave a note…" aria-label="Leave a note…">${Sn}</button>
|
|
8
9
|
<div class="nf-dialog" hidden>
|
|
9
10
|
<div class="nf-panel">
|
|
10
11
|
<div class="nf-stage">
|
|
11
12
|
<div class="nf-palette">
|
|
12
|
-
<button class="nf-tool nf-icon-btn" type="button" data-tool="crop" title="Crop" aria-label="Crop">${
|
|
13
|
-
<button class="nf-reset-crop nf-icon-btn" type="button" title="Reset crop" aria-label="Reset crop" hidden>${
|
|
14
|
-
<button class="nf-tool nf-icon-btn" type="button" data-tool="arrow" title="Arrow" aria-label="Arrow">${
|
|
15
|
-
<button class="nf-tool nf-icon-btn" type="button" data-tool="rect" title="Rectangle" aria-label="Rectangle">${
|
|
16
|
-
<button class="nf-tool nf-icon-btn" type="button" data-tool="circle" title="Circle" aria-label="Circle">${
|
|
13
|
+
<button class="nf-tool nf-icon-btn" type="button" data-tool="crop" title="Crop" aria-label="Crop">${A.crop}</button>
|
|
14
|
+
<button class="nf-reset-crop nf-icon-btn" type="button" title="Reset crop" aria-label="Reset crop" hidden>${A.resetCrop}</button>
|
|
15
|
+
<button class="nf-tool nf-icon-btn" type="button" data-tool="arrow" title="Arrow" aria-label="Arrow">${A.arrow}</button>
|
|
16
|
+
<button class="nf-tool nf-icon-btn" type="button" data-tool="rect" title="Rectangle" aria-label="Rectangle">${A.rect}</button>
|
|
17
|
+
<button class="nf-tool nf-icon-btn" type="button" data-tool="circle" title="Circle" aria-label="Circle">${A.circle}</button>
|
|
17
18
|
</div>
|
|
18
19
|
<div class="nf-canvas"></div>
|
|
19
20
|
</div>
|
|
@@ -24,9 +25,9 @@ var Notefully=(function(L){"use strict";function ne(t,e){if(t.match(/^[a-z]+:\/\
|
|
|
24
25
|
<button type="button" data-kind="other">Other</button>
|
|
25
26
|
</div>
|
|
26
27
|
<div class="nf-actions">
|
|
27
|
-
<button class="nf-discard-shot nf-icon-btn" type="button" title="Discard screenshot" aria-label="Discard screenshot">${
|
|
28
|
-
<button class="nf-audio nf-icon-btn" type="button" title="Record audio" aria-label="Record audio">${
|
|
29
|
-
<button class="nf-video nf-icon-btn" type="button" title="Record video" aria-label="Record video">${
|
|
28
|
+
<button class="nf-discard-shot nf-icon-btn" type="button" title="Discard screenshot" aria-label="Discard screenshot">${A.discard}</button>
|
|
29
|
+
<button class="nf-audio nf-icon-btn" type="button" title="Record audio" aria-label="Record audio">${A.audio}</button>
|
|
30
|
+
<button class="nf-video nf-icon-btn" type="button" title="Record video" aria-label="Record video">${A.video}</button>
|
|
30
31
|
<button class="nf-submit" type="button">Submit</button>
|
|
31
32
|
</div>
|
|
32
33
|
<button class="nf-restore" type="button" hidden>Restore screenshot</button>
|
|
@@ -34,12 +35,12 @@ var Notefully=(function(L){"use strict";function ne(t,e){if(t.match(/^[a-z]+:\/\
|
|
|
34
35
|
</div>
|
|
35
36
|
</div>
|
|
36
37
|
<button class="nf-stop-video" type="button" hidden>Stop</button>
|
|
37
|
-
`,document.body.appendChild(u),c={launcher:C(".nf-launcher"),dialog:C(".nf-dialog"),stage:C(".nf-stage"),canvas:C(".nf-canvas"),text:C(".nf-text"),restore:C(".nf-restore"),status:C(".nf-status"),audio:C(".nf-audio"),video:C(".nf-video"),discard:C(".nf-discard-shot"),stop:C(".nf-stop-video"),resetCrop:C(".nf-reset-crop"),shot:null},
|
|
38
|
+
`,document.body.appendChild(u),c={launcher:C(".nf-launcher"),dialog:C(".nf-dialog"),stage:C(".nf-stage"),canvas:C(".nf-canvas"),text:C(".nf-text"),restore:C(".nf-restore"),status:C(".nf-status"),audio:C(".nf-audio"),video:C(".nf-video"),discard:C(".nf-discard-shot"),stop:C(".nf-stop-video"),resetCrop:C(".nf-reset-crop"),shot:null},xn(),tt()),u}function tt(){var t;u&&(u.dataset.theme=Zt(h.theme),h.hideLauncher?u.setAttribute("data-nf-hidden-launcher",""):u.removeAttribute("data-nf-hidden-launcher"),c.video&&(c.video.hidden=!h.video),(t=c.dialog)!=null&&t.hidden&&et())}function et(){c.launcher&&(c.launcher.hidden=!!h.hideLauncher)}function xn(){c.launcher.addEventListener("click",()=>Ct()),C(".nf-dialog").addEventListener("click",t=>{t.target===c.dialog&&X()}),u.querySelectorAll(".nf-tool").forEach(t=>{t.addEventListener("click",()=>gt(t.dataset.tool))}),c.resetCrop.addEventListener("click",Pn),c.canvas.addEventListener("pointerdown",Cn),c.canvas.addEventListener("dragstart",t=>t.preventDefault()),u.querySelectorAll("[data-kind]").forEach(t=>{t.addEventListener("click",()=>yt(t.dataset.kind))}),c.discard.addEventListener("click",kn),c.restore.addEventListener("click",Tn),c.audio.addEventListener("click",An),c.video.addEventListener("click",In),c.stop.addEventListener("click",()=>z==null?void 0:z.stop()),C(".nf-submit").addEventListener("click",()=>{Mt().catch(t=>x(t.message||"Submit failed."))}),yt("bug"),gt(null)}function yt(t){Z=wn.includes(t)?t:"bug",u.querySelectorAll("[data-kind]").forEach(e=>{e.dataset.active=String(e.dataset.kind===Z)})}function gt(t){I=vn.has(t)?t:null,R=null,u.querySelectorAll(".nf-tool").forEach(e=>{e.dataset.active=String(e.dataset.tool===I)}),c.canvas&&(c.canvas.dataset.draw=I?"true":"false"),S&&$()}function te(t){return Math.min(1,Math.max(0,t))}function nt(){return c.shot||c.canvas}function rt(t){const e=nt().getBoundingClientRect();return{x:te((t.clientX-e.left)/Math.max(e.width,1)),y:te((t.clientY-e.top)/Math.max(e.height,1))}}function En(t){const e=nt().getBoundingClientRect();return t.clientX>=e.left&&t.clientX<=e.right&&t.clientY>=e.top&&t.clientY<=e.bottom}function ee(t){const e=rt(t),r=d.crop();return{x:r.x+e.x*r.w,y:r.y+e.y*r.h}}function it(t,e){const r=Math.min(t.x,e.x),n=Math.min(t.y,e.y);return{x:r,y:n,w:Math.max(ht,Math.abs(e.x-t.x)),h:Math.max(ht,Math.abs(e.y-t.y))}}function wt(t){u&&(t?u.dataset.grabbing="true":delete u.dataset.grabbing)}function bt(t){try{c.canvas.setPointerCapture(t.pointerId)}catch{}}function vt(){window.addEventListener("pointermove",re),window.addEventListener("pointerup",ot),window.addEventListener("pointercancel",ot)}function ne(){window.removeEventListener("pointermove",re),window.removeEventListener("pointerup",ot),window.removeEventListener("pointercancel",ot)}function Cn(t){if(t.button!==0||!S)return;if(!t.target.closest(".nf-sticker")&&!En(t)){R=null,$();return}const e=t.target.closest(".nf-handle"),r=t.target.closest(".nf-sticker");if(r&&r.dataset.preview!=="true"){t.preventDefault(),t.stopPropagation(),R=r.dataset.id,bt(t),Mn({kind:"sticker",id:R,dir:(e==null?void 0:e.dataset.dir)||"move"},t),$();return}if(R=null,I==="crop"){t.preventDefault(),bt(t),g={kind:"crop",start:rt(t),current:rt(t)},vt(),$();return}if(I==="arrow"||I==="rect"||I==="circle"){t.preventDefault(),bt(t);const n=ee(t);g={kind:"sticker",type:I,start:n,current:n},vt(),$();return}$()}function Mn(t,e){e.preventDefault(),e.stopPropagation();const r=nt().getBoundingClientRect(),n=d.list().find(i=>i.id===t.id);w={...t,startX:e.clientX,startY:e.clientY,crop:d.crop(),sticker:n?{...n}:null,rect:r},wt(t.dir==="move"||t.dir==="start"||t.dir==="end"),vt()}function re(t){if(g){g.current=g.kind==="crop"?rt(t):ee(t),$();return}if(!w)return;const e=(t.clientX-w.startX)/w.rect.width*w.crop.w,r=(t.clientY-w.startY)/w.rect.height*w.crop.h,n=w.sticker;if(n){if(w.dir==="end")d.update(n.id,{x2:n.x2+e,y2:n.y2+r});else if(w.dir==="start")d.update(n.id,{x:n.x+e,y:n.y+r});else if(w.dir==="move")d.update(n.id,{x:n.x+e,y:n.y+r,x2:(n.x2||n.x)+e,y2:(n.y2||n.y)+r});else{const i={x:n.x,y:n.y,w:n.w,h:n.h};$n(i,w.dir,e,r),d.update(n.id,i)}$()}}function $n(t,e,r,n){if(e.includes("e")&&(t.w=Math.max(.04,t.w+r)),e.includes("s")&&(t.h=Math.max(.04,t.h+n)),e.includes("w")){const i=Math.max(.04,t.w-r);t.x+=t.w-i,t.w=i}if(e.includes("n")){const i=Math.max(.04,t.h-n);t.y+=t.h-i,t.h=i}}function ot(t){if(ne(),wt(!1),g){Rn();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)&&(d.remove(w.id),R=null)}w=null,$()}}function Rn(){const t=g;if(g=null,!t)return;if(t.kind==="crop"){const r=it(t.start,t.current);if(Math.abs(t.current.x-t.start.x)<Gt||Math.abs(t.current.y-t.start.y)<Gt){$();return}const i=d.crop();d.setCrop({x:i.x+r.x*i.w,y:i.y+r.y*i.h,w:r.w*i.w,h:r.h*i.h}),K();return}const e=Ln(t);e&&(R=e.id),$()}function Ln(t){if(t.type==="arrow"){const e=t.current.x-t.start.x,r=t.current.y-t.start.y;return Math.hypot(e,r)<ht?d.add("arrow",{x:t.start.x,y:t.start.y,x2:t.start.x+.12,y2:t.start.y,w:.12,h:.02}):d.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(r)})}return d.add(t.type,it(t.start,t.current))}function Pn(){d.resetCrop(),R=null,K()}function St(){c.resetCrop&&(c.resetCrop.hidden=!d.isCropped())}function xt(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 kn(){S&&(q=S),S="",c.stage.hidden=!0,c.restore.hidden=!q}function Tn(){q&&(S=q,c.stage.hidden=!1,c.restore.hidden=!0,K())}function An(){try{if(V||(V=ln(e=>{const r=c.text.value.trim();c.text.value=r?`${r} ${e}`:e})),!V.isSupported()){x("Audio-to-text is not supported in this browser.");return}const t=V.start();xt(t),x(t?"Listening…":"")}catch(t){x(t.message)}}async function In(){if(!h.video){x("Video is disabled on this host.");return}c.dialog.hidden=!0,c.stop.hidden=!1,tt(),c.launcher.hidden=!0,z=dn({onStart(){},onStop(t){P=t,c.stop.hidden=!0,et(),c.dialog.hidden=!1,K(),x(t?"Video attached.":"Recording cancelled.")},onError(t){x(t.message)}});try{await z.start()}catch(t){c.stop.hidden=!0,et(),c.dialog.hidden=!1,x(t.message)}}function K(){if(c.shot=null,!S){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>`:"",St();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",r=>r.preventDefault());const e=()=>{Dn(t),$()};t.addEventListener("load",e),t.complete&&t.naturalWidth&&e()}function Dn(t){const e=t.naturalWidth||D.w,r=t.naturalHeight||D.h;if(e&&r&&(D={w:e,h:r},c.canvas.style.setProperty("--nf-shot-aspect",String(e/r)),c.canvas.style.aspectRatio=`${e} / ${r}`),!c.shot||!D.w||!D.h)return;const n=d.crop(),i=D.w/D.h,o=n.w/n.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/n.w}%`,t.style.height=`${100/n.h}%`,t.style.left=`${-n.x/n.w*100}%`,t.style.top=`${-n.y/n.h*100}%`}function jn(t){return t.type==="arrow"?{id:"preview",type:"arrow",number:"",x:t.start.x,y:t.start.y,x2:t.current.x,y2:t.current.y,w:Math.abs(t.current.x-t.start.x),h:Math.abs(t.current.y-t.start.y)}:{id:"preview",type:t.type,number:"",...it(t.start,t.current)}}function $(){if((c.shot||c.canvas).querySelectorAll(".nf-sticker, .nf-crop").forEach(n=>n.remove()),!S||!c.shot){St();return}const e=d.crop();if((g==null?void 0:g.kind)==="crop"){const n=document.createElement("div");n.className="nf-crop",ie(n,it(g.start,g.current),{x:0,y:0,w:1,h:1}),c.shot.appendChild(n)}const r=d.list().slice();if((g==null?void 0:g.kind)==="sticker"&&r.push(jn(g)),r.forEach(n=>{const i=n.id==="preview",o=!i&&n.id===R,a=document.createElement("div");if(a.className=`nf-sticker nf-${n.type}`,a.dataset.id=n.id,o&&(a.dataset.selected="true"),i&&(a.dataset.preview="true"),n.type==="arrow"?Fn(a,n,e,o):(ie(a,n,e),o&&["nw","ne","sw","se"].forEach(s=>Et(a,s))),!i&&n.number){const s=document.createElement("span");s.className="nf-badge",s.textContent=String(n.number),a.appendChild(s)}c.shot.appendChild(a)}),c.canvas.querySelectorAll(":scope > .nf-recording-preview").forEach(n=>n.remove()),P){const n=document.createElement("video");n.className="nf-recording-preview",n.controls=!0,n.src=URL.createObjectURL(P),n.style.position="absolute",n.style.right="8px",n.style.bottom="8px",n.style.width="160px",c.canvas.appendChild(n)}St()}function Fn(t,e,r,n){const i=nt(),o=i.clientWidth,a=i.clientHeight,s=(e.x-r.x)/r.w*o,l=(e.y-r.y)/r.h*a,v=((e.x2??e.x+e.w)-r.x)/r.w*o,y=((e.y2??e.y)-r.y)/r.h*a,p=18,b=Math.min(s,v)-p,j=Math.min(l,y)-p,f=Math.max(2,Math.abs(v-s))+p*2,m=Math.max(2,Math.abs(y-l))+p*2,F=s-b,O=l-j,H=v-b,B=y-j,_=`nf-ah-${e.id}`,U=document.createElementNS("http://www.w3.org/2000/svg","svg");t.style.left=`${b}px`,t.style.top=`${j}px`,t.style.width=`${f}px`,t.style.height=`${m}px`,U.setAttribute("class","nf-arrow-svg"),U.setAttribute("viewBox",`0 0 ${f} ${m}`),U.setAttribute("width",String(f)),U.setAttribute("height",String(m)),U.innerHTML=`
|
|
38
39
|
<defs>
|
|
39
|
-
<marker id="${
|
|
40
|
+
<marker id="${_}" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
|
|
40
41
|
<path d="M0,0 L10,5 L0,10 Z" fill="currentColor" />
|
|
41
42
|
</marker>
|
|
42
43
|
</defs>
|
|
43
|
-
<line class="nf-arrow-hit" x1="${
|
|
44
|
-
<line class="nf-arrow-shaft" x1="${
|
|
45
|
-
`,t.appendChild(
|
|
44
|
+
<line class="nf-arrow-hit" x1="${F}" y1="${O}" x2="${H}" y2="${B}" />
|
|
45
|
+
<line class="nf-arrow-shaft" x1="${F}" y1="${O}" x2="${H}" y2="${B}" marker-end="url(#${_})" />
|
|
46
|
+
`,t.appendChild(U),n&&(Et(t,"start",{left:F-5,top:O-5}),Et(t,"end",{left:H-5,top:B-5}))}function Et(t,e,r){const n=document.createElement("span");n.className="nf-handle",n.dataset.dir=e,r&&(n.style.left=`${r.left}px`,n.style.top=`${r.top}px`),t.appendChild(n)}function ie(t,e,r){t.style.left=`${(e.x-r.x)/r.w*100}%`,t.style.top=`${(e.y-r.y)/r.h*100}%`,t.style.width=`${e.w/r.w*100}%`,t.style.height=`${e.h/r.h*100}%`}function oe(t={}){return an(t),h={...h,endpoint:String(t.endpoint||h.endpoint||"").replace(/\/$/,""),projectKey:t.projectKey==null?h.projectKey:String(t.projectKey),version:t.version==null?h.version:String(t.version),targets:t.targets===void 0?h.targets:t.targets,hideLauncher:t.hideLauncher==null?h.hideLauncher:!!t.hideLauncher,theme:Zt(t.theme??h.theme),video:t.video==null?h.video:!!t.video},mt(),tt(),$t}async function Ct(){mt(),tt(),c.launcher.hidden=!0,d=Xt(),D={w:0,h:0},P=null,R=null,g=null,w=null,Z="bug",yt("bug"),gt(null),xt(!1),c.text.value="",x("Capturing…");try{S=await nn(),q=S,c.stage.hidden=!1,c.restore.hidden=!0}catch{S="",x("Screenshot failed; you can still send text.")}c.dialog.hidden=!1,K(),c.text.focus()}function X(){u&&(V==null||V.stop(),xt(!1),ne(),g=null,w=null,wt(!1),c.dialog.hidden=!0,c.stop.hidden=!0,et())}function ae(t={}){pt={...pt,...on(t)}}async function Mt(){mt();const t=c.text.value.trim();if(!t&&!S&&!P)return x("Add a note, screenshot, or video first."),null;if(!h.endpoint||!h.projectKey)return x("Notefully is missing endpoint or projectKey."),null;x("Submitting…",!0);const e=new FormData;if(e.append("message",t),e.append("kind",Z),e.append("version",h.version||"0.0.0"),e.append("context",JSON.stringify({...rn(pt),console:Jt.snapshot()})),e.append("annotations",JSON.stringify(d.list())),Array.isArray(h.targets)&&e.append("targets",JSON.stringify(h.targets)),S){const i=await mn(S,d.crop(),d.list(),{mark:Qt("--nf-mark","#fdd341"),markText:Qt("--nf-mark-text","#2a2140")});e.append("screenshot",i,"screenshot.png")}P&&e.append("recording",P,"recording.webm");const r=await fetch(`${h.endpoint}/v1/reports`,{method:"POST",headers:{"X-Notefully-Key":h.projectKey},body:e});let n=null;try{n=await r.json()}catch{n=null}if(!r.ok)throw x((n==null?void 0:n.error)||"Submit failed."),new Error((n==null?void 0:n.error)||`Submit failed (${r.status})`);return x("Sent. Thank you."),X(),n}function se(){X(),u==null||u.remove(),u=null,c={}}const $t={init:oe,open:Ct,close:X,identify:ae,submit:Mt,destroy:se};return typeof window<"u"&&(window.Notefully=$t),L.close=X,L.default=$t,L.destroy=se,L.identify=ae,L.init=oe,L.open=Ct,L.submit=Mt,Object.defineProperties(L,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),L})({});
|