@makefully/notefully 0.1.3 → 0.1.5
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 +6 -6
- package/dist/notefully.iife.js +3 -3
- package/dist/notefully.js +9 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ Notefully.init({
|
|
|
19
19
|
endpoint: 'https://make.makefullystudios.com/notefully', // or your self-hosted relay
|
|
20
20
|
projectKey: 'nfk_…', // from Showfully → Notefully → Settings
|
|
21
21
|
version: pkg.version,
|
|
22
|
-
|
|
22
|
+
name: pkg.name, // optional report prefix; falls back to project default slug
|
|
23
23
|
theme: 'maker', // maker | all-business | brighter-day | quiet-night
|
|
24
24
|
video: false, // default; set true to enable screen recording
|
|
25
25
|
hideLauncher: true // optional; drive open/submit from your own UI
|
|
@@ -42,7 +42,7 @@ Or via the IIFE build:
|
|
|
42
42
|
endpoint: 'https://make.makefullystudios.com/notefully',
|
|
43
43
|
projectKey: 'nfk_…',
|
|
44
44
|
version: '1.4.2',
|
|
45
|
-
|
|
45
|
+
name: 'my-app',
|
|
46
46
|
hideLauncher: false
|
|
47
47
|
});
|
|
48
48
|
</script>
|
|
@@ -55,12 +55,12 @@ With `hideLauncher: true`, call `Notefully.open()` / `Notefully.submit()` from y
|
|
|
55
55
|
|
|
56
56
|
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.
|
|
57
57
|
|
|
58
|
-
### Project key vs
|
|
58
|
+
### Project key vs `name`
|
|
59
59
|
|
|
60
60
|
- **`projectKey`** (`nfk_…`) chooses the Showfully inbox and delivery settings.
|
|
61
|
-
- **`
|
|
61
|
+
- **`name`** (optional on `init`, same idea as `package.json` `name`) is only a report folder prefix after sanitizing: `{slug}-{version}-{nf_id}/`. Values like `@scope/pkg` become `scope-pkg`. If omitted, the relay uses the project’s default slug from Showfully → Notefully → Settings.
|
|
62
62
|
|
|
63
|
-
Related apps can share one inbox/key and pass different `
|
|
63
|
+
Related apps can share one inbox/key and pass different `name` values. The Notefully inbox shows an app filter when more than one sanitized name/slug appears.
|
|
64
64
|
|
|
65
65
|
### Identify
|
|
66
66
|
|
|
@@ -72,6 +72,6 @@ Call `Notefully.identify()` whenever the signed-in user is known (and again if t
|
|
|
72
72
|
| `email` | string | Contact email when available. |
|
|
73
73
|
| `displayName` | string | Human-readable name. Aliases: `username`, `name`. |
|
|
74
74
|
|
|
75
|
-
Unknown keys are ignored and warned in the console. Identity is attached to each report’s context payload; it is not a substitute for `projectKey`.
|
|
75
|
+
Unknown keys are ignored and warned in the console. Identity is attached to each report’s context payload; it is not a substitute for `projectKey`. Prefer `displayName` (not `name`) on `identify()` so it does not collide with `init({ name })` mentally — both still work.
|
|
76
76
|
|
|
77
77
|
Secrets never go in the widget — only the public project key and relay URL.
|
package/dist/notefully.iife.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
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"),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),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}`,a=r.cssText?ye(r):ge(r,n);return document.createTextNode(`${i}{${a}}`)}function Pt(t,e,r,n){const i=window.getComputedStyle(t,r),a=i.getPropertyValue("content");if(a===""||a==="none")return;const o=le();try{e.className=`${e.className} ${o}`}catch{return}const s=document.createElement("style");s.appendChild(we(o,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 ot(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((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 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 a=await At(t,r.fetchRequestInit,({res:o,result:s})=>(e||(e=o.headers.get("Content-Type")||""),xe(s)));i=Ee(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 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 a=document.createElement("canvas"),o=a.getContext("2d");a.width=t.clientWidth,a.height=t.clientHeight,o==null||o.drawImage(t,0,0,a.width,a.height);const s=a.toDataURL();return G(s)}const r=t.poster,n=ot(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 a=[];return Pe(t)&&t.assignedNodes?a=k(t.assignedNodes()):E(t,HTMLIFrameElement)&&(!((n=t.contentDocument)===null||n===void 0)&&n.body)?a=k(t.contentDocument.body.childNodes):a=k(((i=t.shadowRoot)!==null&&i!==void 0?i:t).childNodes),a.length===0||E(t,HTMLVideoElement)||await a.reduce((o,s)=>o.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(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 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 Fe(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),v=document.querySelector(s);!l&&v&&!n[s]&&(n[s]=await J(v,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 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=>Fe(n,e))}const Dt=/url\((['"]?)([^'"]+?)\1\)/g,Oe=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,He=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function je(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 a=r?ce(e,r):e,o=ot(e);let s;return i||(s=await lt(a,o,n)),t.replace(je(e),`$1${s}$3`)}catch{}return t}function Be(t,{preferredFontFormat:e}){return e?t.replace(He,r=>{for(;;){const[n,,i]=Oe.exec(r)||[];if(!i)return"";if(i===e)return`src: ${n};`}}):t}function Ft(t){return t.search(Dt)!==-1}async function Ot(t,e,r){if(!Ft(t))return t;const n=Be(t,r);return Ue(n).reduce((a,o)=>a.then(s=>Ve(s,o,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 a=await Ot(i,null,r);return e.style.setProperty(t,a,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,ot(n),e);await new Promise((a,o)=>{t.onload=a,t.onerror=e.onImageErrorHandler?(...l)=>{try{a(e.onImageErrorHandler(...l))}catch(v){o(v)}}: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 We(t,e){const n=k(t.childNodes).map(i=>Ht(i,e));await Promise.all(n).then(()=>t)}async function Ht(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 jt={};async function Ut(t){let e=jt[t];if(e!=null)return e;const n=await(await fetch(t)).text();return e={url:t,cssText:n},jt[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 ze(t,e){const r=[],n=[];return t.forEach(i=>{if("cssRules"in i)try{k(i.cssRules||[]).forEach((a,o)=>{if(a.type===CSSRule.IMPORT_RULE){let s=o+1;const l=a.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(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{k(i.cssRules||[]).forEach(a=>{r.push(a)})}catch(a){console.error(`Error while reading CSS rules from ${i.href}`,a)}}),r))}function Ke(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>Ft(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(a=>{e.add(_t(a))}),Array.from(n.children).forEach(a=>{a instanceof HTMLElement&&r(a)})}return r(t),e}async function Ge(t,e){const r=await Xe(t,e),n=Ye(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 Ot(a.cssText,o,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 Ht(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),a=await G(i),o=document.createElement("canvas"),s=o.getContext("2d"),l=e.pixelRatio||fe(),v=e.canvasWidth||r,y=e.canvasHeight||n;return o.width=v*l,o.height=y*l,e.skipAutoScale||he(o),o.style.width=`${v}`,o.style.height=`${y}`,e.backgroundColor&&(s.fillStyle=e.backgroundColor,s.fillRect(0,0,o.width,o.height)),s.drawImage(a,0,0,o.width,o.height),o}async function 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","
|
|
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 Ht(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),a=await G(i),o=document.createElement("canvas"),s=o.getContext("2d"),l=e.pixelRatio||fe(),v=e.canvasWidth||r,y=e.canvasHeight||n;return o.width=v*l,o.height=y*l,e.skipAutoScale||he(o),o.style.width=`${v}`,o.style.height=`${y}`,e.backgroundColor&&(s.fillStyle=e.backgroundColor,s.fillRect(0,0,o.width,o.height)),s.drawImage(a,0,0,o.width,o.height),o}async function 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","name","targets","hideLauncher","theme","video"]),zt={slug:"Use init({ name }) for a per-app report prefix (same idea as package.json name). slug is not a widget option.",projectSlug:"Use init({ name }) for a per-app report prefix. projectSlug is not a widget option.",project:"Pass projectKey (nfk_…) from Showfully Notefully settings — there is no project option on the widget.",username:"Pass people via Notefully.identify({ displayName }) (username is an identify alias), not init().",userId:"Pass people via Notefully.identify({ userId, email, displayName }), not init().",email:"Pass people via Notefully.identify({ userId, email, displayName }), not init().",displayName:"Pass people via Notefully.identify({ userId, email, displayName }), not init()."};function an(t={},e={}){const r=e.warn||Kt,n=t&&typeof t=="object"?t:{},i={},a=[];for(const o of Nt)Object.prototype.hasOwnProperty.call(n,o)&&(i[o]=n[o]);for(const[o,s]of Object.entries(Wt))Object.prototype.hasOwnProperty.call(n,o)&&(Object.prototype.hasOwnProperty.call(i,s)||(i[s]=n[o]));for(const o of Object.keys(n))Nt.has(o)||Object.prototype.hasOwnProperty.call(Wt,o)||a.push(o);if(a.length){const o=a.some(s=>s==="name"||s==="slug"||s==="projectSlug")?" Pass the package/report name via Notefully.init({ name }), not identify().":"";r(`Notefully.identify: ignoring unknown key(s): ${a.join(", ")}. Supported: userId, email, displayName (aliases: id → userId; username/name → displayName).`+o)}return i}function on(t={},e={}){const r=e.warn||Kt,n=t&&typeof t=="object"?t:{},i=Object.keys(n).filter(a=>!qt.has(a));if(i.length)for(const a of i){if(zt[a]){r(`Notefully.init: ignoring "${a}". ${zt[a]}`);continue}r(`Notefully.init: ignoring unknown key "${a}". 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=(a,o)=>{let s="";try{s=o.map(l=>l instanceof Error?l.stack||l.message:typeof l=="string"?l:JSON.stringify(l)).join(" ")}catch{s=String(o[0])}t.push({level:a,text:s.slice(0,2e3),at:Date.now()}),t.length>sn&&t.shift()};return{hook:()=>{r||typeof window>"u"||(r=!0,["log","info","warn","error"].forEach(a=>{e[a]=console[a].bind(console),console[a]=(...o)=>{n(a,o),e[a](...o)}}),window.addEventListener("error",a=>{n("error",[a.message||"window.error"])}),window.addEventListener("unhandledrejection",a=>{n("error",[a.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=o=>{let s="";for(let l=o.resultIndex;l<o.results.length;l+=1)o.results[l].isFinal&&(s+=o.results[l][0].transcript);s&&t(s)},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,a=[],o=null;const s=()=>{if(o&&(clearTimeout(o),o=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"}),a=[],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&&a.push(b.data)},i.onstop=()=>{const b=a.length?new Blob(a,{type:i.mimeType||"video/webm"}):null;s(),e(b)},(p=n.getVideoTracks()[0])==null||p.addEventListener("ended",()=>l()),i.start(),o=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(a=>pn(a,r)),all:()=>e.slice(),crop:()=>({...r}),setCrop(a){return r=hn(a),r},resetCrop(){return r={...ut},r},isCropped(){return r.x>1e-6||r.y>1e-6||r.w<.999999||r.h<.999999},add(a,o){const s={id:`s${n++}`,type:a,number:t.alloc(),x:.2,y:.2,w:a==="arrow"?.2:.22,h:a==="arrow"?.05:.16,x2:.4,y2:.28,...o};return e.push(s),s},update(a,o){const s=e.find(l=>l.id===a);return s?(Object.assign(s,o),s):null},remove(a){const o=e.findIndex(l=>l.id===a);if(o<0)return null;const[s]=e.splice(o,1);return t.free(s.number),s},reset(){for(e=[],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",a=n.markText||"#2a2140";return new Promise((o,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)),F=document.createElement("canvas");F.width=p,F.height=b;const h=F.getContext("2d");h.drawImage(l,v,y,p,b,0,0,p,b),h.lineWidth=Math.max(3,Math.round(p/400)),h.strokeStyle=i,h.fillStyle=i,h.font=`700 ${Math.max(14,Math.round(p/40))}px sans-serif`,r.forEach(m=>{const O=dt(m.x,e,p),H=ft(m.y,e,b),j=m.w/e.w*p,B=m.h/e.h*b;if(m.type==="rect")h.strokeRect(O,H,j,B);else if(m.type==="circle")h.beginPath(),h.ellipse(O+j/2,H+B/2,j/2,B/2,0,0,Math.PI*2),h.stroke();else if(m.type==="arrow"){const Hn=dt(m.x2??m.x+m.w,e,p),jn=ft(m.y2??m.y,e,b);gn(h,O,H,Hn,jn)}const _=yn(m,e,p,b,O,H,j),U=String(m.number);h.beginPath(),h.arc(_.x,_.y,11,0,Math.PI*2),h.fill(),h.fillStyle=a,h.textAlign="center",h.textBaseline="middle",h.fillText(U,_.x,_.y),h.fillStyle=i}),F.toBlob(m=>{if(!m){s(new Error("Could not encode screenshot"));return}o(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,a,o){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:(a+l)/2}}return{x:i+o/2,y:a}}function gn(t,e,r,n,i){const a=Math.atan2(i-r,n-e),o=14,s=2,l=n-Math.cos(a)*s,v=i-Math.sin(a)*s;t.beginPath(),t.moveTo(e,r),t.lineTo(l,v),t.stroke(),t.beginPath(),t.moveTo(n,i),t.lineTo(n-o*Math.cos(a-.4),i-o*Math.sin(a-.4)),t.lineTo(n-o*Math.cos(a+.4),i-o*Math.sin(a+.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
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 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 d={endpoint:"",projectKey:"",version:"0.0.0",
|
|
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 d={endpoint:"",projectKey:"",version:"0.0.0",name:"",targets:null,hideLauncher:!1,theme:Yt,video:!1},pt={},u=null,c={},f=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
8
|
<button class="nf-launcher" type="button" title="Leave a note…" aria-label="Leave a note…">${Sn}</button>
|
|
9
9
|
<div class="nf-dialog" hidden>
|
|
10
10
|
<div class="nf-panel">
|
|
@@ -43,4 +43,4 @@ var Notefully=(function(L){"use strict";function ce(t,e){if(t.match(/^[a-z]+:\/\
|
|
|
43
43
|
</defs>
|
|
44
44
|
<line class="nf-arrow-hit" x1="${O}" y1="${H}" x2="${j}" y2="${B}" />
|
|
45
45
|
<line class="nf-arrow-shaft" x1="${O}" y1="${H}" x2="${j}" y2="${B}" marker-end="url(#${_})" />
|
|
46
|
-
`,t.appendChild(U),n&&(Et(t,"start",{left:O-5,top:H-5}),Et(t,"end",{left:j-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 ae(t={}){return on(t),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),
|
|
46
|
+
`,t.appendChild(U),n&&(Et(t,"start",{left:O-5,top:H-5}),Et(t,"end",{left:j-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 ae(t={}){return on(t),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:Zt(t.theme??d.theme),video:t.video==null?d.video:!!t.video},mt(),tt(),$t}async function Ct(){mt(),tt(),c.launcher.hidden=!0,f=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 oe(t={}){pt={...pt,...an(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(!d.endpoint||!d.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",d.version||"0.0.0"),d.name&&e.append("name",d.name),e.append("context",JSON.stringify({...rn(pt),console:Jt.snapshot()})),e.append("annotations",JSON.stringify(f.list())),Array.isArray(d.targets)&&e.append("targets",JSON.stringify(d.targets)),S){const i=await mn(S,f.crop(),f.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(`${d.endpoint}/v1/reports`,{method:"POST",headers:{"X-Notefully-Key":d.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:ae,open:Ct,close:X,identify:oe,submit:Mt,destroy:se};return typeof window<"u"&&(window.Notefully=$t),L.close=X,L.default=$t,L.destroy=se,L.identify=oe,L.init=ae,L.open=Ct,L.submit=Mt,Object.defineProperties(L,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),L})({});
|
package/dist/notefully.js
CHANGED
|
@@ -533,19 +533,19 @@ const kt = /* @__PURE__ */ new Set(["userId", "email", "displayName"]), Tt = {
|
|
|
533
533
|
"endpoint",
|
|
534
534
|
"projectKey",
|
|
535
535
|
"version",
|
|
536
|
-
"
|
|
536
|
+
"name",
|
|
537
537
|
"targets",
|
|
538
538
|
"hideLauncher",
|
|
539
539
|
"theme",
|
|
540
540
|
"video"
|
|
541
541
|
]), It = {
|
|
542
|
-
|
|
543
|
-
|
|
542
|
+
slug: "Use init({ name }) for a per-app report prefix (same idea as package.json name). slug is not a widget option.",
|
|
543
|
+
projectSlug: "Use init({ name }) for a per-app report prefix. projectSlug is not a widget option.",
|
|
544
|
+
project: "Pass projectKey (nfk_…) from Showfully Notefully settings — there is no project option on the widget.",
|
|
544
545
|
username: "Pass people via Notefully.identify({ displayName }) (username is an identify alias), not init().",
|
|
545
546
|
userId: "Pass people via Notefully.identify({ userId, email, displayName }), not init().",
|
|
546
547
|
email: "Pass people via Notefully.identify({ userId, email, displayName }), not init().",
|
|
547
|
-
displayName: "Pass people via Notefully.identify({ userId, email, displayName }), not init()."
|
|
548
|
-
name: "Pass people via Notefully.identify({ displayName }) (name is an identify alias), not init()."
|
|
548
|
+
displayName: "Pass people via Notefully.identify({ userId, email, displayName }), not init()."
|
|
549
549
|
};
|
|
550
550
|
function nn(t = {}, e = {}) {
|
|
551
551
|
const r = e.warn || Kt, n = t && typeof t == "object" ? t : {}, i = {}, a = [];
|
|
@@ -556,7 +556,7 @@ function nn(t = {}, e = {}) {
|
|
|
556
556
|
for (const o of Object.keys(n))
|
|
557
557
|
kt.has(o) || Object.prototype.hasOwnProperty.call(Tt, o) || a.push(o);
|
|
558
558
|
if (a.length) {
|
|
559
|
-
const o = a.some((s) => s === "slug" || s === "projectSlug") ? " Pass report
|
|
559
|
+
const o = a.some((s) => s === "name" || s === "slug" || s === "projectSlug") ? " Pass the package/report name via Notefully.init({ name }), not identify()." : "";
|
|
560
560
|
r(
|
|
561
561
|
`Notefully.identify: ignoring unknown key(s): ${a.join(", ")}. Supported: userId, email, displayName (aliases: id → userId; username/name → displayName).` + o
|
|
562
562
|
);
|
|
@@ -828,7 +828,7 @@ let d = {
|
|
|
828
828
|
endpoint: "",
|
|
829
829
|
projectKey: "",
|
|
830
830
|
version: "0.0.0",
|
|
831
|
-
|
|
831
|
+
name: "",
|
|
832
832
|
targets: null,
|
|
833
833
|
hideLauncher: !1,
|
|
834
834
|
theme: Yt,
|
|
@@ -1253,7 +1253,7 @@ function Fn(t = {}) {
|
|
|
1253
1253
|
endpoint: String(t.endpoint || d.endpoint || "").replace(/\/$/, ""),
|
|
1254
1254
|
projectKey: t.projectKey == null ? d.projectKey : String(t.projectKey),
|
|
1255
1255
|
version: t.version == null ? d.version : String(t.version),
|
|
1256
|
-
|
|
1256
|
+
name: t.name == null ? d.name : String(t.name || ""),
|
|
1257
1257
|
targets: t.targets === void 0 ? d.targets : t.targets,
|
|
1258
1258
|
hideLauncher: t.hideLauncher == null ? d.hideLauncher : !!t.hideLauncher,
|
|
1259
1259
|
theme: Jt(t.theme ?? d.theme),
|
|
@@ -1284,7 +1284,7 @@ async function ne() {
|
|
|
1284
1284
|
return x("Notefully is missing endpoint or projectKey."), null;
|
|
1285
1285
|
x("Submitting…", !0);
|
|
1286
1286
|
const e = new FormData();
|
|
1287
|
-
if (e.append("message", t), e.append("kind", G), e.append("version", d.version || "0.0.0"), d.
|
|
1287
|
+
if (e.append("message", t), e.append("kind", G), e.append("version", d.version || "0.0.0"), d.name && e.append("name", d.name), e.append("context", JSON.stringify({
|
|
1288
1288
|
...en(ft),
|
|
1289
1289
|
console: Gt.snapshot()
|
|
1290
1290
|
})), e.append("annotations", JSON.stringify(h.list())), Array.isArray(d.targets) && e.append("targets", JSON.stringify(d.targets)), S) {
|