hearback-widget 0.1.0 → 0.1.1

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.
Files changed (2) hide show
  1. package/dist/widget.js +1 -1
  2. package/package.json +1 -1
package/dist/widget.js CHANGED
@@ -288,7 +288,7 @@
288
288
  to { transform: translateY(0); }
289
289
  }
290
290
  }
291
- `;var u=[],b=[],E=!1,S=null,T=null;function L(){if(E)return;E=!0,S=console.error,console.error=(...e)=>{u.push({message:e.map(t=>String(t)).join(" "),timestamp:new Date().toISOString()}),u.length>20&&u.shift(),S.apply(console,e)},window.addEventListener("error",e=>{u.push({message:e.message,stack:e.error?.stack,timestamp:new Date().toISOString()}),u.length>20&&u.shift()}),window.addEventListener("unhandledrejection",e=>{u.push({message:`Unhandled rejection: ${String(e.reason)}`,timestamp:new Date().toISOString()}),u.length>20&&u.shift()}),T=window.fetch,window.fetch=async(...e)=>{try{let t=await T(...e);if(!t.ok){let r=typeof e[0]=="string"?e[0]:e[0]instanceof Request?e[0].url:String(e[0]),i=e[1];b.push({method:i?.method??"GET",url:r,status:t.status,statusText:t.statusText}),b.length>20&&b.shift()}return t}catch(t){let r=typeof e[0]=="string"?e[0]:e[0]instanceof Request?e[0].url:String(e[0]);throw b.push({method:e[1]?.method??"GET",url:r,statusText:String(t)}),b.length>20&&b.shift(),t}};let n=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(e,t,...r){return this._hbMethod=e,this._hbUrl=String(t),n.apply(this,[e,t,...r])},XMLHttpRequest.prototype.send=function(...e){return this.addEventListener("loadend",()=>{if(this.status>=400){let t=this;b.push({method:t._hbMethod??"GET",url:t._hbUrl??"",status:this.status,statusText:this.statusText}),b.length>20&&b.shift()}}),s.apply(this,e)}}function $(n){if(n.includes("Chrome")&&!n.includes("Edg")){let s=n.match(/Chrome\/([\d.]+)/);return s?`Chrome ${s[1]}`:"Chrome"}if(n.includes("Firefox")){let s=n.match(/Firefox\/([\d.]+)/);return s?`Firefox ${s[1]}`:"Firefox"}if(n.includes("Safari")&&!n.includes("Chrome")){let s=n.match(/Version\/([\d.]+)/);return s?`Safari ${s[1]}`:"Safari"}if(n.includes("Edg")){let s=n.match(/Edg\/([\d.]+)/);return s?`Edge ${s[1]}`:"Edge"}return"Unknown"}function W(n){if(n.includes("Mac OS X")){let s=n.match(/Mac OS X ([\d_.]+)/);return s?`macOS ${s[1].replace(/_/g,".")}`:"macOS"}if(n.includes("Windows NT")){let s=n.match(/Windows NT ([\d.]+)/);return s?`Windows ${s[1]}`:"Windows"}return n.includes("Linux")?"Linux":n.includes("Android")?"Android":n.includes("iPhone")||n.includes("iPad")?"iOS":"Unknown"}function M(){let n=navigator.userAgent;return{url:window.location.href,userAgent:n,browser:$(n),os:W(n),viewport:`${window.innerWidth}x${window.innerHeight}`,consoleErrors:[...u],failedRequests:[...b]}}async function F(){try{let n=await _();if(!n)return null;let s=await n(document.body,{logging:!1,useCORS:!0,allowTaint:!0,scale:1});return new Promise(e=>{s.toBlob(t=>e(t),"image/jpeg",.7)})}catch{return null}}async function _(){if(window.html2canvas)return window.html2canvas;try{return(await import("https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.esm.js")).default}catch{return new Promise(n=>{let s=document.createElement("script");s.src="https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js",s.onload=()=>{n(window.html2canvas)},s.onerror=()=>n(null),document.head.appendChild(s)})}}var k=class extends HTMLElement{constructor(){super();p(this,"shadow");p(this,"config");p(this,"currentScreen","trigger");p(this,"feedbackType","bug");p(this,"chatMessages",[]);p(this,"screenshotBlob",null);p(this,"duplicates",[]);p(this,"pendingReport",null);p(this,"isLoading",!1);this.shadow=this.attachShadow({mode:"open"}),this.config={endpoint:this.getAttribute("data-endpoint")??"/feedback",branding:this.getAttribute("data-branding")!=="false"}}connectedCallback(){L(),this.render()}render(){this.shadow.innerHTML="";let e=document.createElement("style");switch(e.textContent=C,this.shadow.appendChild(e),this.currentScreen){case"trigger":this.renderTrigger();break;case"mode-select":this.renderModeSelect();break;case"chat":this.renderChat();break;case"form":this.renderForm();break;case"duplicates":this.renderDuplicates();break;case"success":this.renderSuccess();break}}renderTrigger(){let e=document.createElement("button");e.className="hb-trigger",e.setAttribute("aria-label","Report feedback"),e.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg>',e.addEventListener("click",()=>this.navigate("mode-select")),this.shadow.appendChild(e)}renderDialog(e,t,r){this.renderTrigger();let i=document.createElement("div");i.className="hb-dialog",i.setAttribute("role","dialog"),i.setAttribute("aria-modal","true"),i.setAttribute("aria-label",e);let o=document.createElement("div");o.className="hb-header";let d=document.createElement("h2");d.textContent=e;let a=document.createElement("button");a.className="hb-close",a.setAttribute("aria-label","Close"),a.innerHTML="&times;",a.addEventListener("click",()=>this.navigate("trigger")),o.appendChild(d),o.appendChild(a),i.appendChild(o);let c=document.createElement("div");if(c.className="hb-body",c.appendChild(t),i.appendChild(c),r&&i.appendChild(r),this.config.branding){let l=document.createElement("div");l.className="hb-footer",l.innerHTML='Powered by <a href="https://github.com/hearback/hearback" target="_blank" rel="noopener">hearback</a>',i.appendChild(l)}this.shadow.appendChild(i),a.focus(),i.addEventListener("keydown",l=>{l.key==="Escape"&&this.navigate("trigger")})}renderModeSelect(){let e=document.createElement("div");e.className="hb-mode-select";let t=this.createModeButton("\u{1F41B}","Bug Report","Something is broken or not working right",()=>{this.feedbackType="bug",this.startFeedback()}),r=this.createModeButton("\u{1F4A1}","Feature Request","Suggest an improvement or new feature",()=>{this.feedbackType="feature",this.startFeedback()});e.appendChild(t),e.appendChild(r),this.renderDialog("Send Feedback",e)}createModeButton(e,t,r,i){let o=document.createElement("button");return o.className="hb-mode-btn",o.innerHTML=`
291
+ `;var u=[],b=[],E=!1,S=null,T=null;function L(){if(E)return;E=!0,S=console.error,console.error=(...e)=>{u.push({message:e.map(t=>String(t)).join(" "),timestamp:new Date().toISOString()}),u.length>20&&u.shift(),S.apply(console,e)},window.addEventListener("error",e=>{u.push({message:e.message,stack:e.error?.stack,timestamp:new Date().toISOString()}),u.length>20&&u.shift()}),window.addEventListener("unhandledrejection",e=>{u.push({message:`Unhandled rejection: ${String(e.reason)}`,timestamp:new Date().toISOString()}),u.length>20&&u.shift()}),T=window.fetch,window.fetch=async(...e)=>{try{let t=await T(...e);if(!t.ok){let r=typeof e[0]=="string"?e[0]:e[0]instanceof Request?e[0].url:String(e[0]),i=e[1];b.push({method:i?.method??"GET",url:r,status:t.status,statusText:t.statusText}),b.length>20&&b.shift()}return t}catch(t){let r=typeof e[0]=="string"?e[0]:e[0]instanceof Request?e[0].url:String(e[0]);throw b.push({method:e[1]?.method??"GET",url:r,statusText:String(t)}),b.length>20&&b.shift(),t}};let n=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(e,t,...r){return this._hbMethod=e,this._hbUrl=String(t),n.apply(this,[e,t,...r])},XMLHttpRequest.prototype.send=function(...e){return this.addEventListener("loadend",()=>{if(this.status>=400){let t=this;b.push({method:t._hbMethod??"GET",url:t._hbUrl??"",status:this.status,statusText:this.statusText}),b.length>20&&b.shift()}}),s.apply(this,e)}}function $(n){if(n.includes("Chrome")&&!n.includes("Edg")){let s=n.match(/Chrome\/([\d.]+)/);return s?`Chrome ${s[1]}`:"Chrome"}if(n.includes("Firefox")){let s=n.match(/Firefox\/([\d.]+)/);return s?`Firefox ${s[1]}`:"Firefox"}if(n.includes("Safari")&&!n.includes("Chrome")){let s=n.match(/Version\/([\d.]+)/);return s?`Safari ${s[1]}`:"Safari"}if(n.includes("Edg")){let s=n.match(/Edg\/([\d.]+)/);return s?`Edge ${s[1]}`:"Edge"}return"Unknown"}function W(n){if(n.includes("Mac OS X")){let s=n.match(/Mac OS X ([\d_.]+)/);return s?`macOS ${s[1].replace(/_/g,".")}`:"macOS"}if(n.includes("Windows NT")){let s=n.match(/Windows NT ([\d.]+)/);return s?`Windows ${s[1]}`:"Windows"}return n.includes("Linux")?"Linux":n.includes("Android")?"Android":n.includes("iPhone")||n.includes("iPad")?"iOS":"Unknown"}function M(){let n=navigator.userAgent;return{url:window.location.href,userAgent:n,browser:$(n),os:W(n),viewport:`${window.innerWidth}x${window.innerHeight}`,consoleErrors:[...u],failedRequests:[...b]}}async function F(){try{let n=await _();if(!n)return null;let s=await n(document.body,{logging:!1,useCORS:!0,allowTaint:!0,scale:1});return new Promise(e=>{s.toBlob(t=>e(t),"image/jpeg",.7)})}catch{return null}}async function _(){if(window.html2canvas)return window.html2canvas;try{return(await import("https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.esm.js")).default}catch{return new Promise(n=>{let s=document.createElement("script");s.src="https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js",s.onload=()=>{n(window.html2canvas)},s.onerror=()=>n(null),document.head.appendChild(s)})}}var k=class extends HTMLElement{constructor(){super();p(this,"shadow");p(this,"config");p(this,"currentScreen","trigger");p(this,"feedbackType","bug");p(this,"chatMessages",[]);p(this,"screenshotBlob",null);p(this,"duplicates",[]);p(this,"pendingReport",null);p(this,"isLoading",!1);this.shadow=this.attachShadow({mode:"open"}),this.config={endpoint:"/feedback",branding:!0}}connectedCallback(){this.config={endpoint:this.getAttribute("data-endpoint")??"/feedback",branding:this.getAttribute("data-branding")!=="false"},L(),this.render()}render(){this.shadow.innerHTML="";let e=document.createElement("style");switch(e.textContent=C,this.shadow.appendChild(e),this.currentScreen){case"trigger":this.renderTrigger();break;case"mode-select":this.renderModeSelect();break;case"chat":this.renderChat();break;case"form":this.renderForm();break;case"duplicates":this.renderDuplicates();break;case"success":this.renderSuccess();break}}renderTrigger(){let e=document.createElement("button");e.className="hb-trigger",e.setAttribute("aria-label","Report feedback"),e.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg>',e.addEventListener("click",()=>this.navigate("mode-select")),this.shadow.appendChild(e)}renderDialog(e,t,r){this.renderTrigger();let i=document.createElement("div");i.className="hb-dialog",i.setAttribute("role","dialog"),i.setAttribute("aria-modal","true"),i.setAttribute("aria-label",e);let o=document.createElement("div");o.className="hb-header";let d=document.createElement("h2");d.textContent=e;let a=document.createElement("button");a.className="hb-close",a.setAttribute("aria-label","Close"),a.innerHTML="&times;",a.addEventListener("click",()=>this.navigate("trigger")),o.appendChild(d),o.appendChild(a),i.appendChild(o);let c=document.createElement("div");if(c.className="hb-body",c.appendChild(t),i.appendChild(c),r&&i.appendChild(r),this.config.branding){let l=document.createElement("div");l.className="hb-footer",l.innerHTML='Powered by <a href="https://github.com/hearback/hearback" target="_blank" rel="noopener">hearback</a>',i.appendChild(l)}this.shadow.appendChild(i),a.focus(),i.addEventListener("keydown",l=>{l.key==="Escape"&&this.navigate("trigger")})}renderModeSelect(){let e=document.createElement("div");e.className="hb-mode-select";let t=this.createModeButton("\u{1F41B}","Bug Report","Something is broken or not working right",()=>{this.feedbackType="bug",this.startFeedback()}),r=this.createModeButton("\u{1F4A1}","Feature Request","Suggest an improvement or new feature",()=>{this.feedbackType="feature",this.startFeedback()});e.appendChild(t),e.appendChild(r),this.renderDialog("Send Feedback",e)}createModeButton(e,t,r,i){let o=document.createElement("button");return o.className="hb-mode-btn",o.innerHTML=`
292
292
  <span class="hb-mode-icon">${e}</span>
293
293
  <span>
294
294
  <span class="hb-mode-label">${t}</span><br/>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hearback-widget",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Embeddable feedback widget for any website — Shadow DOM, <25KB, dual mode (AI chat + form), screenshot, auto-captures console/network context",
5
5
  "type": "module",
6
6
  "main": "./dist/widget.js",