@bugjar/reporter 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/dist/index.cjs CHANGED
@@ -114,7 +114,7 @@ PERFORMANCE OF THIS SOFTWARE.
114
114
  ...
115
115
  }
116
116
  `);t(7,g=new ny(o,{speed:u,root:y,unpackFn:wy,...e})),g.on("resize",S=>{D(g.wrapper,S)}),b=Sy(()=>{Do()?setTimeout(()=>{v=i,x=s,t(13,i=p.offsetWidth),t(14,s=p.offsetHeight-(h?Wo:0)),D(g.wrapper,{width:g.iframe.offsetWidth,height:g.iframe.offsetHeight})},0):(t(13,i=v),t(14,s=x),D(g.wrapper,{width:g.iframe.offsetWidth,height:g.iframe.offsetHeight}))})}),ya(()=>{b&&b()});function pe(S){je[S?"unshift":"push"](()=>{y=S,t(9,y)})}function be(S){je[S?"unshift":"push"](()=>{k=S,t(10,k)})}const A=()=>W();function C(S){je[S?"unshift":"push"](()=>{p=S,t(8,p)})}return r.$$set=S=>{t(39,e=xn(xn({},e),An(S))),"width"in S&&t(13,i=S.width),"height"in S&&t(14,s=S.height),"maxScale"in S&&t(15,n=S.maxScale),"events"in S&&t(16,o=S.events),"skipInactive"in S&&t(0,a=S.skipInactive),"autoPlay"in S&&t(1,l=S.autoPlay),"speedOption"in S&&t(2,c=S.speedOption),"speed"in S&&t(17,u=S.speed),"showController"in S&&t(3,h=S.showController),"tags"in S&&t(4,f=S.tags),"inactiveColor"in S&&t(5,d=S.inactiveColor)},r.$$.update=()=>{r.$$.dirty[0]&24576&&t(11,N=_o({width:`${i}px`,height:`${s}px`})),r.$$.dirty[0]&24584&&t(12,F=_o({width:`${i}px`,height:`${s+(h?Wo:0)}px`}))},e=An(e),[a,l,c,h,f,d,W,g,p,y,k,N,F,i,s,n,o,u,w,J,de,ce,ee,B,ae,L,V,le,ne,re,q,pe,be,A,C]}let Oy=class extends Os{constructor(e){super(),Ts(this,e,Ty,Dy,_s,{width:13,height:14,maxScale:15,events:16,skipInactive:0,autoPlay:1,speedOption:2,speed:17,showController:3,tags:4,inactiveColor:5,getMirror:18,triggerResize:19,toggleFullscreen:6,addEventListener:20,addEvent:21,getMetaData:22,getReplayer:23,toggle:24,setSpeed:25,toggleSkipInactive:26,play:27,pause:28,goto:29,playRange:30},null,[-1,-1])}get getMirror(){return this.$$.ctx[18]}get triggerResize(){return this.$$.ctx[19]}get toggleFullscreen(){return this.$$.ctx[6]}get addEventListener(){return this.$$.ctx[20]}get addEvent(){return this.$$.ctx[21]}get getMetaData(){return this.$$.ctx[22]}get getReplayer(){return this.$$.ctx[23]}get toggle(){return this.$$.ctx[24]}get setSpeed(){return this.$$.ctx[25]}get toggleSkipInactive(){return this.$$.ctx[26]}get play(){return this.$$.ctx[27]}get pause(){return this.$$.ctx[28]}get goto(){return this.$$.ctx[29]}get playRange(){return this.$$.ctx[30]}};class Py extends Oy{constructor(e){super({target:e.target,props:e.data||e.props})}}const Ly=["image/png","image/jpeg","image/webp","image/gif","application/pdf","text/plain","application/json"],$y=2*1024*1024,Cs=5;function jy(r){const[e,t]=oe.useState(""),[i,s]=oe.useState([]),[n,o]=oe.useState(!1),[a,l]=oe.useState("console"),c=e.trim().length>0;return m.jsxs(Yy,{children:[m.jsxs("div",{style:Zy,children:[m.jsx("h2",{style:{margin:0,fontSize:18,fontWeight:700},children:"Review & send"}),m.jsx("span",{style:{fontSize:12,color:"#6b7280"},children:"You're seeing exactly what we'll upload."})]}),m.jsx(By,{hasReplay:r.hasReplay&&r.replayEvents.length>0,events:r.replayEvents,audioBlobUrl:r.audioBlobUrl,screenshotUrl:r.screenshotUrl,durationMs:r.durationMs,capturedViewport:r.capturedViewport,consoleCount:r.consoleLogs.length,networkCount:r.networkEvents.length,redactionSummary:r.redactionSummary}),m.jsxs("div",{style:{marginTop:18},children:[m.jsxs("label",{style:Yo,children:["What happened? ",m.jsx("span",{style:{color:"#ef4444"},children:"*"})]}),m.jsx("textarea",{value:e,onChange:u=>t(u.target.value),rows:4,placeholder:"Describe the bug — what you expected, what happened instead…",style:Xy})]}),m.jsxs("div",{style:{marginTop:14},children:[m.jsxs("label",{style:Yo,children:["Attachments"," ",m.jsxs("span",{style:{color:"#9ca3af",fontWeight:400},children:["(max ",Cs,", 2 MB each)"]})]}),m.jsx("input",{type:"file",multiple:!0,accept:".png,.jpg,.jpeg,.webp,.gif,.pdf,.txt,.log,.json",onChange:u=>Fy(u.target.files,i,s),style:{fontSize:12}}),i.length>0&&m.jsx("ul",{style:{margin:"8px 0 0 0",paddingLeft:16,fontSize:12,color:"#4b5563"},children:i.map((u,h)=>m.jsxs("li",{children:[u.name," (",Math.round(u.size/1024)," KB)"]},h))})]}),m.jsxs("div",{style:{marginTop:18},children:[m.jsxs("button",{type:"button",onClick:()=>o(u=>!u),style:Jy,children:[m.jsx("span",{children:n?"▾":"▸"}),m.jsx("span",{style:{fontWeight:600},children:"Inspect what's being sent"}),m.jsxs("span",{style:{color:"#9ca3af",fontWeight:400},children:["· ",r.consoleLogs.length," logs · ",r.networkEvents.length," requests ·"," ",r.redactionSummary.totalMatches," redactions"]})]}),n&&m.jsxs("div",{style:Ky,children:[m.jsxs("div",{style:qy,children:[m.jsxs(br,{active:a==="console",onClick:()=>l("console"),children:["Console (",r.consoleLogs.length,")"]}),m.jsxs(br,{active:a==="network",onClick:()=>l("network"),children:["Network (",r.networkEvents.length,")"]}),m.jsxs(br,{active:a==="redactions",onClick:()=>l("redactions"),children:["Redactions (",r.redactionSummary.totalMatches,")"]}),m.jsx(br,{active:a==="metadata",onClick:()=>l("metadata"),children:"Metadata"})]}),m.jsxs("div",{style:{padding:"12px 14px",maxHeight:240,overflow:"auto"},children:[a==="console"&&m.jsx(Uy,{logs:r.consoleLogs}),a==="network"&&m.jsx(zy,{events:r.networkEvents}),a==="redactions"&&m.jsx(Wy,{summary:r.redactionSummary}),a==="metadata"&&m.jsx(Vy,{pageUrl:r.pageUrl,userAgent:r.userAgent,durationMs:r.durationMs,viewport:r.capturedViewport,hasReplay:r.hasReplay,hasAudio:!!r.audioBlobUrl,attachments:i})]})]})]}),m.jsxs("div",{style:ew,children:[m.jsxs("div",{style:{display:"flex",gap:8},children:[m.jsx(Go,{onClick:r.onCancel,children:"Cancel"}),m.jsx(Go,{onClick:r.onBackToMarkup,children:"← Back to edit"})]}),m.jsx(Hy,{color:r.color,onClick:()=>r.onSend({description:e,annotations:[],attachments:i}),disabled:!c,title:c?void 0:"Description is required",children:"Send report"})]})]})}function Fy(r,e,t){if(!r)return;const i=[...e];for(const s of Array.from(r))if(Ly.includes(s.type)&&!(s.size>$y)&&(i.push(s),i.length>=Cs))break;t(i.slice(0,Cs))}function By(r){const[e,t]=oe.useState(r.hasReplay?"replay":"screenshot");return m.jsxs("div",{style:{background:"#0E1117",borderRadius:10,padding:14,border:"1px solid #1f2937"},children:[m.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:10},children:[r.hasReplay?m.jsxs("div",{style:{display:"flex",gap:4},children:[m.jsxs(Vo,{active:e==="replay",onClick:()=>t("replay"),children:["Replay · ",ln(r.durationMs),r.audioBlobUrl?" · audio":""]}),m.jsx(Vo,{active:e==="screenshot",onClick:()=>t("screenshot"),children:"Screenshot"})]}):m.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10},children:[m.jsx("span",{style:{display:"inline-block",width:8,height:8,borderRadius:"50%",background:"#9ca3af"}}),m.jsx("span",{style:{color:"#e5e7eb",fontSize:12,fontWeight:600},children:"Screenshot only"})]}),m.jsxs("div",{style:{color:"#9ca3af",fontSize:11,display:"flex",gap:12},children:[m.jsxs("span",{children:[r.consoleCount," logs"]}),m.jsx("span",{children:"·"}),m.jsxs("span",{children:[r.networkCount," requests"]}),m.jsx("span",{children:"·"}),m.jsxs("span",{style:{color:"#34d399"},children:[r.redactionSummary.totalMatches," redactions"]})]})]}),e==="replay"&&r.hasReplay?m.jsx(Gy,{events:r.events,audioBlobUrl:r.audioBlobUrl,capturedViewport:r.capturedViewport}):m.jsx("div",{style:{maxHeight:"60vh",overflow:"auto",background:"#000",borderRadius:6},children:m.jsx("img",{src:r.screenshotUrl,alt:"annotated page",style:{width:"100%",display:"block"}})})]})}function Uy({logs:r}){return r.length===0?m.jsx(an,{children:"Nothing was logged during the recording."}):m.jsx("pre",{style:Qy,children:r.map(e=>`[${ln(e.timestamp)}] [${e.level}] ${e.message}`).join(`
117
- `)})}function zy({events:r}){return r.length===0?m.jsx(an,{children:"No network requests captured."}):m.jsxs("table",{style:{width:"100%",fontSize:11,borderCollapse:"collapse"},children:[m.jsx("thead",{children:m.jsxs("tr",{style:{color:"#6b7280",textAlign:"left"},children:[m.jsx("th",{style:vr,children:"method"}),m.jsx("th",{style:vr,children:"status"}),m.jsx("th",{style:vr,children:"url"}),m.jsx("th",{style:{...vr,textAlign:"right"},children:"ms"})]})}),m.jsx("tbody",{children:r.map((e,t)=>m.jsxs("tr",{style:{color:e.ok?"#1f2937":"#b91c1c",borderTop:"1px solid #f3f4f6"},children:[m.jsx("td",{style:Sr,children:e.method}),m.jsx("td",{style:Sr,children:e.status??"—"}),m.jsx("td",{style:{...Sr,fontFamily:"monospace",wordBreak:"break-all"},children:e.url}),m.jsx("td",{style:{...Sr,textAlign:"right"},children:e.durationMs!=null?Math.round(e.durationMs):"—"})]},t))})]})}function Wy({summary:r}){const e=Object.entries(r.counts).filter(([,t])=>t>0);return e.length===0?m.jsx(an,{children:"No regex matches. Form input values are still automatically masked by rrweb."}):m.jsxs("div",{children:[m.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:10},children:e.map(([t,i])=>m.jsxs("span",{style:{background:"#dcfce7",color:"#065f46",padding:"3px 9px",borderRadius:999,fontSize:11,fontWeight:600},children:[i," × ",t.replace(/_/g," ")]},t))}),m.jsxs("p",{style:{margin:0,fontSize:11,color:"#6b7280",lineHeight:1.55},children:["Pattern matches were replaced with"," ",m.jsx("code",{style:{background:"#f3f4f6",padding:"1px 4px",borderRadius:3},children:"[REDACTED:<category>]"})," ","before this preview rendered. The original values are not in the upload payload."]})]})}function Vy(r){const e=[["Page URL",r.pageUrl],["User agent",r.userAgent],["Viewport",`${r.viewport.width} × ${r.viewport.height}`],["Recording",r.hasReplay?`${ln(r.durationMs)} (replay)`:"screenshot only"],["Audio",r.hasAudio?"attached":"none"],["Attachments",r.attachments.length===0?"none":r.attachments.map(t=>`${t.name} (${Math.round(t.size/1024)} KB)`).join(", ")]];return m.jsx("table",{style:{width:"100%",fontSize:12,borderCollapse:"collapse"},children:m.jsx("tbody",{children:e.map(([t,i])=>m.jsxs("tr",{style:{borderTop:"1px solid #f3f4f6"},children:[m.jsx("td",{style:{padding:"7px 8px",color:"#6b7280",fontWeight:500,width:130,verticalAlign:"top"},children:t}),m.jsx("td",{style:{padding:"7px 8px",color:"#1f2937",fontFamily:"monospace",wordBreak:"break-all"},children:i})]},t))})})}function an({children:r}){return m.jsx("div",{style:{fontSize:12,color:"#9ca3af",fontStyle:"italic",padding:"20px 0",textAlign:"center"},children:r})}function br({active:r,onClick:e,children:t}){return m.jsx("button",{type:"button",onClick:e,style:{padding:"8px 12px",background:r?"white":"transparent",border:"none",borderBottom:r?"2px solid #ea580c":"2px solid transparent",fontSize:12,fontWeight:r?600:500,color:r?"#1f2937":"#6b7280",cursor:"pointer"},children:t})}function Vo({active:r,onClick:e,children:t}){return m.jsx("button",{type:"button",onClick:e,style:{padding:"5px 10px",background:r?"#1f2937":"transparent",border:"1px solid",borderColor:r?"#374151":"transparent",borderRadius:6,fontSize:12,fontWeight:600,color:r?"#e5e7eb":"#6b7280",cursor:"pointer",fontFamily:"inherit"},children:t})}function Gy(r){const e=oe.useRef(null),t=oe.useRef(null);return oe.useEffect(()=>{const i=e.current;if(!i||r.events.length===0)return;i.replaceChildren();const s=Math.min(720,i.clientWidth||720),n=r.capturedViewport.height/Math.max(1,r.capturedViewport.width),o=s,a=Math.max(280,Math.min(420,Math.round(o*n))),l=new Py({target:i,props:{events:r.events,width:o,height:a,autoPlay:!1,skipInactive:!1,showController:!0}}),c=h=>{const f=h?.payload??0,d=t.current;if(d?.duration&&!Number.isNaN(d.duration)){const g=f/1e3;Math.abs(d.currentTime-g)>.15&&(d.currentTime=Math.min(g,d.duration))}},u=h=>{const f=h?.payload,d=t.current;d&&(f==="playing"?d.play().catch(()=>{}):(f==="paused"||f==="ended"||f==="live")&&d.pause())};return l.addEventListener("ui-update-current-time",c),l.addEventListener("ui-update-player-state",u),()=>{try{l.$destroy?.()}catch{}i.replaceChildren()}},[r.events,r.capturedViewport.width,r.capturedViewport.height]),m.jsxs("div",{children:[m.jsx("div",{ref:e,style:{minHeight:280,maxWidth:"100%",background:"#000",borderRadius:6,overflow:"hidden",position:"relative",margin:"0 auto"}}),r.audioBlobUrl&&m.jsx("audio",{ref:t,src:r.audioBlobUrl,preload:"auto",style:{display:"none"}})]})}function Yy({children:r}){return m.jsx("div",{style:{position:"fixed",inset:0,background:"rgba(17, 24, 39, 0.55)",display:"flex",alignItems:"center",justifyContent:"center",padding:20,zIndex:2147483647},children:m.jsx("div",{style:{background:"white",borderRadius:14,padding:22,width:820,maxWidth:"100%",maxHeight:"92vh",overflow:"auto",fontFamily:"system-ui, -apple-system, sans-serif",color:"#111827",boxShadow:"0 20px 60px rgba(0,0,0,0.3)"},children:r})})}function Hy({color:r,onClick:e,children:t,disabled:i,title:s}){return m.jsx("button",{onClick:e,disabled:i,title:s,style:{background:i?"#cbd5e1":r,color:"white",border:"none",borderRadius:6,padding:"10px 18px",fontWeight:600,fontSize:13,cursor:i?"not-allowed":"pointer"},children:t})}function Go({onClick:r,children:e}){return m.jsx("button",{onClick:r,style:{background:"white",color:"#111827",border:"1px solid #d1d5db",borderRadius:6,padding:"10px 18px",fontWeight:500,fontSize:13,cursor:"pointer"},children:e})}const Zy={display:"flex",alignItems:"baseline",justifyContent:"space-between",marginBottom:14},Yo={display:"block",fontSize:12,fontWeight:600,marginBottom:6,color:"#374151"},Xy={width:"100%",boxSizing:"border-box",padding:10,borderRadius:6,border:"1px solid #d1d5db",fontFamily:"inherit",fontSize:13,resize:"vertical"},Jy={width:"100%",display:"flex",alignItems:"center",gap:8,background:"#f9fafb",border:"1px solid #e5e7eb",borderRadius:8,padding:"10px 14px",fontSize:13,color:"#1f2937",cursor:"pointer",textAlign:"left"},Ky={marginTop:8,border:"1px solid #e5e7eb",borderRadius:8,background:"#fafafa",overflow:"hidden"},qy={display:"flex",gap:4,background:"#f3f4f6",borderBottom:"1px solid #e5e7eb",padding:"0 8px"},Qy={margin:0,fontFamily:"ui-monospace, monospace",fontSize:11,lineHeight:1.5,color:"#1f2937",whiteSpace:"pre-wrap",wordBreak:"break-all"},vr={padding:"6px 8px",fontSize:10,fontWeight:600,textTransform:"uppercase",letterSpacing:.5,borderBottom:"1px solid #e5e7eb"},Sr={padding:"6px 8px",verticalAlign:"top"},ew={position:"sticky",bottom:-22,marginTop:22,marginLeft:-22,marginRight:-22,marginBottom:-22,padding:"14px 22px 22px 22px",display:"flex",gap:8,justifyContent:"space-between",background:"rgba(255,255,255,0.96)",backdropFilter:"blur(6px)",borderTop:"1px solid #e5e7eb",zIndex:1};function ln(r){const e=Math.floor(r/1e3),t=Math.floor(e/60),i=e%60;return`${t}:${String(i).padStart(2,"0")}`}const tw={"bottom-right":{right:20,bottom:20},"bottom-left":{left:20,bottom:20},"top-right":{right:20,top:20},"top-left":{left:20,top:20}};function rw(r){return m.jsxs("div",{"data-bugjar-block":"true",style:{position:"fixed",zIndex:2147483e3,...tw[r.position]},children:[r.view==="idle"&&r.triggerVisible&&m.jsx(sw,{color:r.primaryColor,label:r.triggerLabel,onClick:r.onOpenActive}),r.view==="active"&&m.jsx(xh,{primaryColor:r.primaryColor,isRecording:r.isRecording,hasRecording:r.hasRecording,elapsedMs:r.elapsedMs,maxDurationSec:r.maxDurationSec,onSelectTool:r.onSelectTool,onSelectColor:r.onSelectColor,onUndo:r.onUndoMarkup,onStartRecording:()=>{r.onStartRecording()},onStopRecording:()=>{r.onStopRecording()},onToggleMicMute:r.onToggleMicMute,onDone:()=>{r.onFinalize()},onCancel:r.onCancel}),r.view==="preview"&&r.preview&&m.jsx(jy,{color:r.primaryColor,hasReplay:r.preview.hasReplay,durationMs:r.preview.durationMs,replayEvents:r.preview.replayEvents,audioBlobUrl:r.preview.audioBlobUrl,screenshotUrl:r.preview.screenshotUrl,consoleLogs:r.preview.consoleLogs,networkEvents:r.preview.networkEvents,redactionSummary:r.preview.redactionSummary,capturedViewport:r.preview.capturedViewport,pageUrl:r.preview.pageUrl,userAgent:r.preview.userAgent,onCancel:r.onCancel,onBackToMarkup:r.onBackToMarkup,onSend:r.onSendReport}),r.view==="uploading"&&m.jsx(lw,{color:r.primaryColor}),r.view==="success"&&m.jsx(cw,{color:r.primaryColor,url:r.preview?.reportUrl??null,onDismiss:r.onCancel}),r.view==="failed"&&m.jsx(uw,{error:r.error??"Upload failed",onDismiss:r.onCancel,onDownload:()=>{r.onDownloadFailed()}}),r.resumingToast&&m.jsx(iw,{color:r.primaryColor,remainingMs:r.resumingToast.remainingMs})]})}function iw({color:r,remainingMs:e}){const t=Math.max(1,Math.ceil(e/1e3));return m.jsxs("div",{style:{position:"fixed",left:"50%",top:24,transform:"translateX(-50%)",background:"#111827",color:"white",padding:"10px 14px",borderRadius:10,fontFamily:"system-ui, -apple-system, sans-serif",fontSize:13,boxShadow:"0 10px 30px rgba(0,0,0,0.35)",display:"flex",alignItems:"center",gap:10,zIndex:2147483002,userSelect:"none",maxWidth:"calc(100vw - 32px)"},children:[m.jsx("span",{style:{width:8,height:8,borderRadius:"50%",background:r,animation:"bugjar-pulse 1.2s infinite",flexShrink:0}}),m.jsx("style",{children:"@keyframes bugjar-pulse { 0%,100%{opacity:1} 50%{opacity:0.35} }"}),m.jsxs("span",{children:["Continuing recording — ",t,"s left"]})]})}function sw({color:r,label:e,onClick:t}){const i=nw(r,.12),s=ow(r,.33);return m.jsxs(m.Fragment,{children:[m.jsx("style",{children:`
117
+ `)})}function zy({events:r}){return r.length===0?m.jsx(an,{children:"No network requests captured."}):m.jsxs("table",{style:{width:"100%",fontSize:11,borderCollapse:"collapse"},children:[m.jsx("thead",{children:m.jsxs("tr",{style:{color:"#6b7280",textAlign:"left"},children:[m.jsx("th",{style:vr,children:"method"}),m.jsx("th",{style:vr,children:"status"}),m.jsx("th",{style:vr,children:"url"}),m.jsx("th",{style:{...vr,textAlign:"right"},children:"ms"})]})}),m.jsx("tbody",{children:r.map((e,t)=>m.jsxs("tr",{style:{color:e.ok?"#1f2937":"#b91c1c",borderTop:"1px solid #f3f4f6"},children:[m.jsx("td",{style:Sr,children:e.method}),m.jsx("td",{style:Sr,children:e.status??"—"}),m.jsx("td",{style:{...Sr,fontFamily:"monospace",wordBreak:"break-all"},children:e.url}),m.jsx("td",{style:{...Sr,textAlign:"right"},children:e.durationMs!=null?Math.round(e.durationMs):"—"})]},t))})]})}function Wy({summary:r}){const e=Object.entries(r.counts).filter(([,t])=>t>0);return e.length===0?m.jsx(an,{children:"No regex matches. Form input values are still automatically masked by rrweb."}):m.jsxs("div",{children:[m.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:10},children:e.map(([t,i])=>m.jsxs("span",{style:{background:"#dcfce7",color:"#065f46",padding:"3px 9px",borderRadius:999,fontSize:11,fontWeight:600},children:[i," × ",t.replace(/_/g," ")]},t))}),m.jsxs("p",{style:{margin:0,fontSize:11,color:"#6b7280",lineHeight:1.55},children:["Pattern matches were replaced with"," ",m.jsx("code",{style:{background:"#f3f4f6",padding:"1px 4px",borderRadius:3},children:"[REDACTED:<category>]"})," ","before this preview rendered. The original values are not in the upload payload."]})]})}function Vy(r){const e=[["Page URL",r.pageUrl],["User agent",r.userAgent],["Viewport",`${r.viewport.width} × ${r.viewport.height}`],["Recording",r.hasReplay?`${ln(r.durationMs)} (replay)`:"screenshot only"],["Audio",r.hasAudio?"attached":"none"],["Attachments",r.attachments.length===0?"none":r.attachments.map(t=>`${t.name} (${Math.round(t.size/1024)} KB)`).join(", ")]];return m.jsx("table",{style:{width:"100%",fontSize:12,borderCollapse:"collapse"},children:m.jsx("tbody",{children:e.map(([t,i])=>m.jsxs("tr",{style:{borderTop:"1px solid #f3f4f6"},children:[m.jsx("td",{style:{padding:"7px 8px",color:"#6b7280",fontWeight:500,width:130,verticalAlign:"top"},children:t}),m.jsx("td",{style:{padding:"7px 8px",color:"#1f2937",fontFamily:"monospace",wordBreak:"break-all"},children:i})]},t))})})}function an({children:r}){return m.jsx("div",{style:{fontSize:12,color:"#9ca3af",fontStyle:"italic",padding:"20px 0",textAlign:"center"},children:r})}function br({active:r,onClick:e,children:t}){return m.jsx("button",{type:"button",onClick:e,style:{padding:"8px 12px",background:r?"white":"transparent",border:"none",borderBottom:r?"2px solid #ea580c":"2px solid transparent",fontSize:12,fontWeight:r?600:500,color:r?"#1f2937":"#6b7280",cursor:"pointer"},children:t})}function Vo({active:r,onClick:e,children:t}){return m.jsx("button",{type:"button",onClick:e,style:{padding:"5px 10px",background:r?"#1f2937":"transparent",border:"1px solid",borderColor:r?"#374151":"transparent",borderRadius:6,fontSize:12,fontWeight:600,color:r?"#e5e7eb":"#6b7280",cursor:"pointer",fontFamily:"inherit"},children:t})}function Gy(r){const e=oe.useRef(null),t=oe.useRef(null);return oe.useEffect(()=>{const i=e.current;if(!i||r.events.length===0)return;i.replaceChildren();const s=Math.min(720,i.clientWidth||720),n=r.capturedViewport.height/Math.max(1,r.capturedViewport.width),o=s,a=Math.max(280,Math.min(420,Math.round(o*n))),l=new Py({target:i,props:{events:r.events,width:o,height:a,autoPlay:!1,skipInactive:!1,showController:!0}}),c=h=>{const f=h?.payload??0,d=t.current;if(d?.duration&&!Number.isNaN(d.duration)){const g=f/1e3;Math.abs(d.currentTime-g)>.15&&(d.currentTime=Math.min(g,d.duration))}},u=h=>{const f=h?.payload,d=t.current;d&&(f==="playing"?d.play().catch(()=>{}):(f==="paused"||f==="ended"||f==="live")&&d.pause())};return l.addEventListener("ui-update-current-time",c),l.addEventListener("ui-update-player-state",u),()=>{try{l.$destroy?.()}catch{}i.replaceChildren()}},[r.events,r.capturedViewport.width,r.capturedViewport.height]),m.jsxs("div",{children:[m.jsx("div",{ref:e,style:{minHeight:280,maxWidth:"100%",background:"#000",borderRadius:6,overflow:"hidden",position:"relative",margin:"0 auto"}}),r.audioBlobUrl&&m.jsx("audio",{ref:t,src:r.audioBlobUrl,preload:"auto",style:{display:"none"}})]})}function Yy({children:r}){return m.jsx("div",{style:{position:"fixed",inset:0,background:"rgba(17, 24, 39, 0.55)",display:"flex",alignItems:"center",justifyContent:"center",padding:20,zIndex:2147483647},children:m.jsx("div",{style:{background:"white",borderRadius:14,padding:22,width:820,maxWidth:"100%",maxHeight:"92vh",overflow:"auto",fontFamily:"system-ui, -apple-system, sans-serif",color:"#111827",boxShadow:"0 20px 60px rgba(0,0,0,0.3)"},children:r})})}function Hy({color:r,onClick:e,children:t,disabled:i,title:s}){return m.jsx("button",{onClick:e,disabled:i,title:s,style:{background:i?"#cbd5e1":r,color:"white",border:"none",borderRadius:6,padding:"10px 18px",fontWeight:600,fontSize:13,cursor:i?"not-allowed":"pointer"},children:t})}function Go({onClick:r,children:e}){return m.jsx("button",{onClick:r,style:{background:"white",color:"#111827",border:"1px solid #d1d5db",borderRadius:6,padding:"10px 18px",fontWeight:500,fontSize:13,cursor:"pointer"},children:e})}const Zy={display:"flex",alignItems:"baseline",justifyContent:"space-between",marginBottom:14},Yo={display:"block",fontSize:12,fontWeight:600,marginBottom:6,color:"#374151"},Xy={width:"100%",boxSizing:"border-box",padding:10,borderRadius:6,border:"1px solid #d1d5db",fontFamily:"inherit",fontSize:13,resize:"vertical"},Jy={width:"100%",display:"flex",alignItems:"center",gap:8,background:"#f9fafb",border:"1px solid #e5e7eb",borderRadius:8,padding:"10px 14px",fontSize:13,color:"#1f2937",cursor:"pointer",textAlign:"left"},Ky={marginTop:8,border:"1px solid #e5e7eb",borderRadius:8,background:"#fafafa",overflow:"hidden"},qy={display:"flex",gap:4,background:"#f3f4f6",borderBottom:"1px solid #e5e7eb",padding:"0 8px"},Qy={margin:0,fontFamily:"ui-monospace, monospace",fontSize:11,lineHeight:1.5,color:"#1f2937",whiteSpace:"pre-wrap",wordBreak:"break-all"},vr={padding:"6px 8px",fontSize:10,fontWeight:600,textTransform:"uppercase",letterSpacing:.5,borderBottom:"1px solid #e5e7eb"},Sr={padding:"6px 8px",verticalAlign:"top"},ew={position:"sticky",bottom:-22,marginTop:22,marginLeft:-22,marginRight:-22,marginBottom:-22,padding:"14px 22px 22px 22px",display:"flex",gap:8,justifyContent:"space-between",background:"rgba(255,255,255,0.96)",backdropFilter:"blur(6px)",borderTop:"1px solid #e5e7eb",zIndex:1};function ln(r){const e=Math.floor(r/1e3),t=Math.floor(e/60),i=e%60;return`${t}:${String(i).padStart(2,"0")}`}const tw={"bottom-right":{right:20,bottom:20},"bottom-left":{left:20,bottom:20},"top-right":{right:20,top:20},"top-left":{left:20,top:20}};function rw(r){return m.jsxs("div",{"data-bugjar-block":"true",style:{position:"fixed",zIndex:2147483e3,...tw[r.position]},children:[r.view==="idle"&&r.triggerVisible&&m.jsx(sw,{color:r.primaryColor,label:r.triggerLabel,onClick:r.onOpenActive}),r.view==="active"&&m.jsx(xh,{primaryColor:r.primaryColor,isRecording:r.isRecording,hasRecording:r.hasRecording,elapsedMs:r.elapsedMs,maxDurationSec:r.maxDurationSec,onSelectTool:r.onSelectTool,onSelectColor:r.onSelectColor,onUndo:r.onUndoMarkup,onStartRecording:()=>{r.onStartRecording()},onStopRecording:()=>{r.onStopRecording()},onToggleMicMute:r.onToggleMicMute,onDone:()=>{r.onFinalize()},onCancel:r.onCancel}),r.view==="preview"&&r.preview&&m.jsx(jy,{color:r.primaryColor,hasReplay:r.preview.hasReplay,durationMs:r.preview.durationMs,replayEvents:r.preview.replayEvents,audioBlobUrl:r.preview.audioBlobUrl,screenshotUrl:r.preview.screenshotUrl,consoleLogs:r.preview.consoleLogs,networkEvents:r.preview.networkEvents,redactionSummary:r.preview.redactionSummary,capturedViewport:r.preview.capturedViewport,pageUrl:r.preview.pageUrl,userAgent:r.preview.userAgent,onCancel:r.onCancel,onBackToMarkup:r.onBackToMarkup,onSend:r.onSendReport}),r.view==="uploading"&&m.jsx(lw,{color:r.primaryColor}),r.view==="success"&&m.jsx(cw,{color:r.primaryColor,onDismiss:r.onCancel}),r.view==="failed"&&m.jsx(uw,{error:r.error??"Upload failed",onDismiss:r.onCancel,onDownload:()=>{r.onDownloadFailed()}}),r.resumingToast&&m.jsx(iw,{color:r.primaryColor,remainingMs:r.resumingToast.remainingMs})]})}function iw({color:r,remainingMs:e}){const t=Math.max(1,Math.ceil(e/1e3));return m.jsxs("div",{style:{position:"fixed",left:"50%",top:24,transform:"translateX(-50%)",background:"#111827",color:"white",padding:"10px 14px",borderRadius:10,fontFamily:"system-ui, -apple-system, sans-serif",fontSize:13,boxShadow:"0 10px 30px rgba(0,0,0,0.35)",display:"flex",alignItems:"center",gap:10,zIndex:2147483002,userSelect:"none",maxWidth:"calc(100vw - 32px)"},children:[m.jsx("span",{style:{width:8,height:8,borderRadius:"50%",background:r,animation:"bugjar-pulse 1.2s infinite",flexShrink:0}}),m.jsx("style",{children:"@keyframes bugjar-pulse { 0%,100%{opacity:1} 50%{opacity:0.35} }"}),m.jsxs("span",{children:["Continuing recording — ",t,"s left"]})]})}function sw({color:r,label:e,onClick:t}){const i=nw(r,.12),s=ow(r,.33);return m.jsxs(m.Fragment,{children:[m.jsx("style",{children:`
118
118
  [data-bugjar-block] .bugjar-trigger {
119
119
  background: ${r};
120
120
  color: #fff;
@@ -173,4 +173,4 @@ PERFORMANCE OF THIS SOFTWARE.
173
173
  margin-top: 8px;
174
174
  border-radius: 2px;
175
175
  }
176
- `}),m.jsxs("div",{style:{background:"#111827",color:"white",padding:"12px 16px",borderRadius:10,fontFamily:"system-ui, -apple-system, sans-serif",fontSize:13,boxShadow:"0 10px 30px rgba(0,0,0,0.3)",minWidth:240,maxWidth:320},children:[m.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10},children:[m.jsx("span",{className:"bugjar-spinner"}),m.jsx("span",{children:i[e]})]}),m.jsx("div",{className:"bugjar-upload-bar"})]})]})}function cw({color:r,url:e,onDismiss:t}){return m.jsxs("div",{style:{background:"white",padding:16,borderRadius:8,border:`2px solid ${r}`,fontFamily:"system-ui",fontSize:13,boxShadow:"0 10px 30px rgba(0,0,0,0.2)",maxWidth:320},children:[m.jsx("div",{style:{fontWeight:600,marginBottom:6},children:"Report sent — thank you!"}),e&&m.jsx("a",{href:e,target:"_blank",rel:"noreferrer",style:{color:r},children:"View in dashboard →"}),m.jsx("div",{style:{marginTop:12,textAlign:"right"},children:m.jsx(xs,{onClick:t,children:"Close"})})]})}function uw({error:r,onDismiss:e,onDownload:t}){return m.jsxs("div",{style:{background:"white",padding:16,borderRadius:8,border:"2px solid #ef4444",fontFamily:"system-ui",fontSize:13,boxShadow:"0 10px 30px rgba(0,0,0,0.2)",maxWidth:360},children:[m.jsx("div",{style:{fontWeight:600,marginBottom:6,color:"#b91c1c"},children:"Upload failed"}),m.jsx("div",{style:{color:"#4b5563",marginBottom:4,fontFamily:"ui-monospace, monospace",fontSize:12,wordBreak:"break-word"},children:r}),m.jsx("div",{style:{color:"#9ca3af",fontSize:11,lineHeight:1.5,marginTop:6},children:"Your report is still in memory. You can save it as a file and email it to support, or dismiss this toast to discard."}),m.jsxs("div",{style:{marginTop:12,display:"flex",gap:8,justifyContent:"flex-end"},children:[m.jsx(xs,{onClick:e,children:"Discard"}),m.jsx(xs,{onClick:t,children:"Download as file"})]})]})}function xs({onClick:r,children:e}){return m.jsx("button",{onClick:r,style:{background:"white",color:"#111827",border:"1px solid #d1d5db",borderRadius:6,padding:"10px 18px",fontWeight:500,fontSize:13,cursor:"pointer"},children:e})}const hw=typeof window<"u"?window.fetch.bind(window):fetch;async function fw(r){const{apiUrl:e,projectKey:t,userToken:i,captureToken:s,report:n,attachments:o}=r,a=n.rrwebEvents.length>0,l={replay:a?{sizeBytes:yw(n.rrwebEvents),durationMs:n.durationMs}:null,audio:n.audioBlob?{sizeBytes:n.audioBlob.size}:null,screenshot:{sizeBytes:n.screenshotBlob.size},attachments:o.map(p=>({filename:p.name,sizeBytes:p.size,mimeType:p.type}))},c=await Es(`${e}/upload-url`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({projectKey:t,manifest:l,...i?{userToken:i}:{},...s?{captureToken:s}:{}})});if(!c.ok)throw new Error(`upload-url failed: ${c.status} ${(await c.text()).slice(0,200)}`);const{reportId:u,finalizeToken:h,uploads:f}=await c.json(),d=[];f.replay&&a&&d.push(Cr(f.replay.url,new Blob([JSON.stringify(n.rrwebEvents)],{type:"application/json"}))),f.audio&&n.audioBlob&&d.push(Cr(f.audio.url,n.audioBlob)),d.push(Cr(f.screenshot.url,n.screenshotBlob));for(let p=0;p<o.length;p++){const y=o[p],b=f.attachments[p];if(!y||!b)throw new Error(`Server returned ${f.attachments.length} presigns for ${o.length} attachments`);d.push(Cr(b.url,y))}await Promise.all(d);const g=await Es(`${e}/reports/${u}/finalize`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({projectKey:t,finalizeToken:h,description:n.description,durationMs:n.durationMs,consoleLogs:n.consoleLogs,networkEvents:n.networkEvents,annotations:n.annotations,url:n.url,userAgent:n.userAgent,viewport:n.viewport,redactionSummary:n.redactionSummary,strictMode:n.strictMode,attachmentIds:f.attachments.map(p=>p.id)})});if(!g.ok)throw new Error(`finalize failed: ${g.status}`);const{dashboardUrl:w}=await g.json();return{reportId:u,dashboardUrl:w}}async function Cr(r,e){const t=await Es(r,{method:"PUT",headers:{"Content-Type":e.type||"application/octet-stream"},body:e});if(!t.ok){const i=await t.text().catch(()=>"");throw new Error(`PUT ${Yr(r)} failed: ${t.status} ${i.slice(0,160)}`)}}const xr=[200,800,3200],Ho=3e4;async function Es(r,e){let t=null;for(let i=0;i<=xr.length;i++){try{const o=await gw(r,e);if(!dw(o.status)||i===xr.length)return o}catch(o){if(t=o,i===xr.length)throw o}const s=xr[i],n=(Math.random()-.5)*.5*s;await pw(s+n)}throw t instanceof Error?t:new Error(`retryingFetch exhausted attempts for ${Yr(r)}`)}function dw(r){return r===408||r===502||r===503||r===504}function pw(r){return new Promise(e=>setTimeout(e,Math.max(0,r)))}function mw(r,e){return!r||typeof AbortSignal.any!="function"?e:AbortSignal.any([r,e])}async function gw(r,e){const t=AbortSignal.timeout(Ho),i=mw(e.signal,t);try{return await hw(r,{...e,signal:i})}catch(s){const n=(e.method??"GET").toUpperCase();if(t.aborted&&!e.signal?.aborted)throw new Error(`${n} ${Yr(r)} timed out after ${Ho/1e3}s`);const a=s,l=a?.cause instanceof Error?`: ${a.cause.message}`:a?.cause?`: ${String(a.cause)}`:"",c=s instanceof Error?s.message:String(s);throw new Error(`${n} ${Yr(r)} failed: ${c}${l}`)}}function Yr(r){try{const e=new URL(r),t=e.pathname.length>60?`${e.pathname.slice(0,57)}…`:e.pathname;return`${e.host}${t}`}catch{return r.slice(0,80)}}function yw(r){try{return new Blob([JSON.stringify(r)]).size}catch{return 0}}async function ww(r,e){const t={reportId:r.reportId,createdAt:r.createdAt,durationMs:r.durationMs,description:r.description,url:r.url,userAgent:r.userAgent,viewport:r.viewport,consoleLogs:r.consoleLogs,networkEvents:r.networkEvents,annotations:r.annotations,redactionSummary:r.redactionSummary,strictMode:r.strictMode,attachmentNames:e.map(n=>n.name)},i=new Blob([JSON.stringify({manifest:t,rrwebEvents:r.rrwebEvents},null,2)],{type:"application/json"}),s=document.createElement("a");s.href=URL.createObjectURL(i),s.download=`bugjar-report-${r.reportId}.json`,s.click(),URL.revokeObjectURL(s.href)}class bw{constructor(){M(this,"config",null);M(this,"root",null);M(this,"host",null);M(this,"markupHost",null);M(this,"markupController",null);M(this,"consoleCapture",null);M(this,"networkCapture",null);M(this,"recorder",null);M(this,"view","idle");M(this,"isRecording",!1);M(this,"elapsedMs",0);M(this,"capturedReport",null);M(this,"preview",null);M(this,"previewObjectUrls",[]);M(this,"error",null);M(this,"failedAttachments",null);M(this,"errorObserved",!1);M(this,"sessionId",null);M(this,"persistedActiveMs",0);M(this,"resumingToast",null);M(this,"lastRecording",null);M(this,"finalizingInFlight",!1)}init(e){if(this.config)return this.publicApi();this.config=vw(e),this.host=document.createElement("div"),this.host.setAttribute("data-bugjar-block","true"),this.host.id="bugjar-root",document.body.appendChild(this.host),this.root=Ii(this.host);const t=()=>this.onErrorObserved();this.consoleCapture=Tc(this.config.capture.consoleBufferSize,t),this.networkCapture=$c(this.config.capture.networkBufferSize,t);const i=Sw(this.config.captureTokenParam);return i&&this.applyCaptureToken(i),this.render(),this.attemptRecovery(),this.publicApi()}async attemptRecovery(){if(!this.config)return;const e=this.config.projectKey,t=Zc(e);if(!t)return;if(!Xc(t)){We(e);try{await Yt(t.sessionId)}catch{}return}let i=null;try{i=await Uc(t.sessionId)}catch{We(e);return}if(!i){We(e);return}const s=Math.max(0,i.maxDurationMs-i.activeMs);if(s<500){We(e);try{await Yt(i.sessionId)}catch{}return}try{this.consoleCapture.hydrate(i.consoleEntries),this.networkCapture.hydrate(i.networkEvents)}catch(o){this.config.onError?.(o instanceof Error?o:new Error(String(o)))}this.sessionId=i.sessionId,this.persistedActiveMs=i.activeMs,this.view="active",this.isRecording=!0,this.elapsedMs=i.activeMs,this.resumingToast={remainingMs:s},this.ensureMarkupLayer(),this.render();const n=new pn({sessionId:i.sessionId,projectKey:e,persistedActiveMs:i.activeMs,strictMode:this.config.strictMode,disabledCategories:this.config.disabledCategories,captureMicrophone:this.config.capture.captureMicrophone,maxDurationSec:this.config.capture.maxDurationSec,consoleCapture:this.consoleCapture,networkCapture:this.networkCapture,onTick:o=>{this.elapsedMs=o,this.render()},onStop:o=>{this.lastRecording={events:o.events,audioBlob:o.audioBlob,durationMs:o.durationMs},this.isRecording=!1,this.recorder=null,this.render()}});n.hydrateEvents(i.events),n.hydrateAudioChunks(i.audioChunks),this.recorder=n;try{await n.start()}catch(o){this.recorder=null,this.sessionId=null,this.persistedActiveMs=0,this.isRecording=!1,this.view="idle",this.resumingToast=null,We(e);try{await Yt(i.sessionId)}catch{}this.config.onError?.(o instanceof Error?o:new Error(String(o))),this.render();return}window.setTimeout(()=>{this.resumingToast=null,this.render()},3500)}onErrorObserved(){this.errorObserved||(this.errorObserved=!0,this.render())}publicApi(){return{open:()=>this.open(),close:()=>this.close()}}async applyCaptureToken(e){if(this.config&&this.config.captureToken!==e)try{const t=await fetch(`${this.config.apiUrl}/capture-invitations/${encodeURIComponent(e)}/scope`,{method:"GET",headers:{Accept:"application/json"}});if(!t.ok){const n=await t.json().catch(()=>({}));throw new Error(`capture-token scope fetch failed (${t.status}): ${n.error?.code??"unknown"}`)}const{disableCategories:i}=await t.json(),s=eu(i);this.config.captureToken=e,this.config.disabledCategories=s}catch(t){this.config.onError?.(t instanceof Error?t:new Error(String(t)))}}ensureMarkupLayer(){if(this.markupController)return this.markupController;const e=document.createElement("div");return e.id="bugjar-markup-layer",document.body.appendChild(e),this.markupHost=e,this.markupController=new Pc(e),this.markupController}teardownMarkupLayer(){this.markupController&&(this.markupController.destroy(),this.markupController=null),this.markupHost&&(this.markupHost.remove(),this.markupHost=null)}open(){if(!this.config)throw new Error("BugJar.init() must be called first");this.view="active",this.isRecording=!1,this.elapsedMs=0,this.lastRecording=null,this.ensureMarkupLayer(),this.render()}close(){this.view="idle",this.isRecording=!1,this.elapsedMs=0,this.capturedReport=null,this.preview=null,this.error=null,this.lastRecording=null,this.resumingToast=null,this.releasePreviewObjectUrls(),this.recorder&&(this.recorder.stop().catch(()=>{}),this.recorder=null),this.discardPersistedSession(),this.teardownMarkupLayer(),this.render()}discardPersistedSession(){if(!this.config||!this.sessionId)return;const e=this.config.projectKey,t=this.sessionId;We(e),Yt(t).catch(()=>{}),this.sessionId=null,this.persistedActiveMs=0}releasePreviewObjectUrls(){for(const e of this.previewObjectUrls)try{URL.revokeObjectURL(e)}catch{}this.previewObjectUrls=[]}render(){if(!this.root||!this.config)return;const{showTrigger:e,showOnError:t}=this.config.ui,i=e&&(this.errorObserved||!t);this.root.render(m.jsx(oe.StrictMode,{children:m.jsx(rw,{projectKey:this.config.projectKey,primaryColor:this.config.ui.primaryColor,position:this.config.ui.position,maxDurationSec:this.config.capture.maxDurationSec,strictMode:this.config.strictMode,triggerVisible:i,triggerLabel:this.config.ui.triggerLabel,view:this.view,isRecording:this.isRecording,hasRecording:this.lastRecording!==null,elapsedMs:this.elapsedMs,preview:this.preview,error:this.error,resumingToast:this.resumingToast,onOpenActive:()=>this.open(),onCancel:()=>this.close(),onStartRecording:async()=>{await this.startRecording()},onStopRecording:async()=>{await this.stopRecording()},onToggleMicMute:s=>this.recorder?.toggleMic(s),onFinalize:async()=>{await this.finalizeReport()},onBackToMarkup:()=>this.backToMarkup(),onSendReport:async s=>{await this.sendReport(s)},onDownloadFailed:async()=>{await this.downloadOnDemand()},onSelectTool:s=>this.markupController?.setTool(s),onSelectColor:s=>this.markupController?.setColor(s),onUndoMarkup:()=>this.markupController?.undo()})}))}async startRecording(){if(!this.config||this.isRecording||this.recorder)return;this.discardPersistedSession(),this.isRecording=!0,this.elapsedMs=0,this.lastRecording=null,this.persistedActiveMs=0;const e=hn();this.sessionId=e;const t={sessionId:e,projectKey:this.config.projectKey,startedAt:Date.now(),activeMs:0,maxDurationMs:this.config.capture.maxDurationSec*1e3,events:[],audioChunks:[],consoleEntries:[],networkEvents:[],lastSeenAt:Date.now()};try{await zc(t)}catch(i){this.config.onError?.(i instanceof Error?i:new Error(String(i)))}this.render(),this.recorder=new pn({sessionId:e,projectKey:this.config.projectKey,persistedActiveMs:0,strictMode:this.config.strictMode,disabledCategories:this.config.disabledCategories,captureMicrophone:this.config.capture.captureMicrophone,maxDurationSec:this.config.capture.maxDurationSec,consoleCapture:this.consoleCapture,networkCapture:this.networkCapture,onTick:i=>{this.elapsedMs=i,this.render()},onStop:i=>{this.lastRecording={events:i.events,audioBlob:i.audioBlob,durationMs:i.durationMs},this.isRecording=!1,this.recorder=null,this.render()}});try{await this.recorder.start()}catch(i){await this.recorder.stop().catch(()=>{}),this.recorder=null,this.isRecording=!1,this.lastRecording=null,this.discardPersistedSession(),this.error=i instanceof Error?i.message:String(i),this.config.onError?.(i instanceof Error?i:new Error(String(i))),this.render()}}async stopRecording(){this.recorder&&await this.recorder.stop()}async finalizeReport(){if(this.config&&!this.finalizingInFlight){this.finalizingInFlight=!0;try{this.recorder&&await this.recorder.stop(),this.discardPersistedSession();const e=Jo(),t={disabledCategories:this.config.disabledCategories},i=this.lastRecording,s=i?nu(i.events,e,t):[],n=i?this.consoleCapture.snapshot().map(g=>xt(g,e,t)):[],o=i?this.networkCapture.snapshot().map(g=>{const w=xt(g,e,t);return{...w,url:Di(w.url,e)}}):[],a=await gh(),l={width:window.innerWidth,height:window.innerHeight},c=i?.audioBlob??null,u=i?.durationMs??0,h={reportId:hn(),createdAt:Date.now(),durationMs:u,rrwebEvents:s,audioBlob:c,screenshotBlob:a,consoleLogs:n,networkEvents:o,annotations:[],description:"",url:Di(location.href,e),userAgent:navigator.userAgent,viewport:l,redactionSummary:e,strictMode:this.config.strictMode};this.capturedReport=h,this.releasePreviewObjectUrls();const f=URL.createObjectURL(a),d=c?URL.createObjectURL(c):null;this.previewObjectUrls=[f,d].filter(g=>g!==null),this.preview={hasReplay:s.length>0,durationMs:u,replayEvents:s,replayEventCount:s.length,hasAudio:c!==null,audioBlobUrl:d,consoleLogs:n,networkEvents:o,redactionSummary:e,screenshotUrl:f,capturedViewport:l,pageUrl:location.href,userAgent:navigator.userAgent,reportUrl:null},this.view="preview",this.render()}finally{this.finalizingInFlight=!1}}}backToMarkup(){this.preview=null,this.capturedReport=null,this.view="active",this.render()}async sendReport(e){if(!(!this.capturedReport||!this.config)){this.capturedReport.description=e.description,this.capturedReport.annotations=e.annotations,this.view="uploading",this.render();try{const{reportId:t,dashboardUrl:i}=await fw({apiUrl:this.config.apiUrl,projectKey:this.config.projectKey,userToken:this.config.userToken,captureToken:this.config.captureToken,report:this.capturedReport,attachments:e.attachments});this.preview&&(this.preview.reportUrl=i),this.view="success",this.teardownMarkupLayer(),this.config.onReportSubmitted?.(t),this.render()}catch(t){this.error=t instanceof Error?t.message:String(t),this.failedAttachments=e.attachments,this.view="failed",this.config.onError?.(t instanceof Error?t:new Error(String(t))),this.render()}}}async downloadOnDemand(){if(this.capturedReport)try{await ww(this.capturedReport,this.failedAttachments??[])}catch(e){this.config?.onError?.(e instanceof Error?e:new Error(String(e)))}}}function vw(r){return{projectKey:r.projectKey,apiUrl:Ch,userToken:r.userToken??null,user:r.user??{id:""},strictMode:r.strictMode??!1,capture:{...vh,...r.capture??{}},ui:{...Sh,...r.ui??{}},onReportSubmitted:r.onReportSubmitted??(()=>{}),onError:r.onError??(()=>{}),captureTokenParam:r.captureTokenParam??"bugjar_capture",captureToken:null,disabledCategories:new Set}}function Sw(r){if(typeof window>"u"||!window.location)return null;try{const t=new URLSearchParams(window.location.search).get(r);return t&&t.length>0?t:null}catch{return null}}const yc=new bw,_i=yc,wc={init:r=>_i.init(r),open:()=>_i.open(),close:()=>_i.close()};typeof window<"u"&&(window.BugJar=wc);exports.BugJar=wc;exports._client=yc;
176
+ `}),m.jsxs("div",{style:{background:"#111827",color:"white",padding:"12px 16px",borderRadius:10,fontFamily:"system-ui, -apple-system, sans-serif",fontSize:13,boxShadow:"0 10px 30px rgba(0,0,0,0.3)",minWidth:240,maxWidth:320},children:[m.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10},children:[m.jsx("span",{className:"bugjar-spinner"}),m.jsx("span",{children:i[e]})]}),m.jsx("div",{className:"bugjar-upload-bar"})]})]})}function cw({color:r,onDismiss:e}){return m.jsxs("div",{style:{background:"white",padding:16,borderRadius:8,border:`2px solid ${r}`,fontFamily:"system-ui",fontSize:13,boxShadow:"0 10px 30px rgba(0,0,0,0.2)",maxWidth:320},children:[m.jsx("div",{style:{fontWeight:600,marginBottom:6},children:"Report sent — thank you!"}),m.jsx("div",{style:{color:"#475569",fontSize:12,lineHeight:1.5},children:"The team has been notified and will follow up by email if they need more from you."}),m.jsx("div",{style:{marginTop:12,textAlign:"right"},children:m.jsx(xs,{onClick:e,children:"Close"})})]})}function uw({error:r,onDismiss:e,onDownload:t}){return m.jsxs("div",{style:{background:"white",padding:16,borderRadius:8,border:"2px solid #ef4444",fontFamily:"system-ui",fontSize:13,boxShadow:"0 10px 30px rgba(0,0,0,0.2)",maxWidth:360},children:[m.jsx("div",{style:{fontWeight:600,marginBottom:6,color:"#b91c1c"},children:"Upload failed"}),m.jsx("div",{style:{color:"#4b5563",marginBottom:4,fontFamily:"ui-monospace, monospace",fontSize:12,wordBreak:"break-word"},children:r}),m.jsx("div",{style:{color:"#9ca3af",fontSize:11,lineHeight:1.5,marginTop:6},children:"Your report is still in memory. You can save it as a file and email it to support, or dismiss this toast to discard."}),m.jsxs("div",{style:{marginTop:12,display:"flex",gap:8,justifyContent:"flex-end"},children:[m.jsx(xs,{onClick:e,children:"Discard"}),m.jsx(xs,{onClick:t,children:"Download as file"})]})]})}function xs({onClick:r,children:e}){return m.jsx("button",{onClick:r,style:{background:"white",color:"#111827",border:"1px solid #d1d5db",borderRadius:6,padding:"10px 18px",fontWeight:500,fontSize:13,cursor:"pointer"},children:e})}const hw=typeof window<"u"?window.fetch.bind(window):fetch;async function fw(r){const{apiUrl:e,projectKey:t,userToken:i,captureToken:s,report:n,attachments:o}=r,a=n.rrwebEvents.length>0,l={replay:a?{sizeBytes:yw(n.rrwebEvents),durationMs:n.durationMs}:null,audio:n.audioBlob?{sizeBytes:n.audioBlob.size}:null,screenshot:{sizeBytes:n.screenshotBlob.size},attachments:o.map(p=>({filename:p.name,sizeBytes:p.size,mimeType:p.type}))},c=await Es(`${e}/upload-url`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({projectKey:t,manifest:l,...i?{userToken:i}:{},...s?{captureToken:s}:{}})});if(!c.ok)throw new Error(`upload-url failed: ${c.status} ${(await c.text()).slice(0,200)}`);const{reportId:u,finalizeToken:h,uploads:f}=await c.json(),d=[];f.replay&&a&&d.push(Cr(f.replay.url,new Blob([JSON.stringify(n.rrwebEvents)],{type:"application/json"}))),f.audio&&n.audioBlob&&d.push(Cr(f.audio.url,n.audioBlob)),d.push(Cr(f.screenshot.url,n.screenshotBlob));for(let p=0;p<o.length;p++){const y=o[p],b=f.attachments[p];if(!y||!b)throw new Error(`Server returned ${f.attachments.length} presigns for ${o.length} attachments`);d.push(Cr(b.url,y))}await Promise.all(d);const g=await Es(`${e}/reports/${u}/finalize`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({projectKey:t,finalizeToken:h,description:n.description,durationMs:n.durationMs,consoleLogs:n.consoleLogs,networkEvents:n.networkEvents,annotations:n.annotations,url:n.url,userAgent:n.userAgent,viewport:n.viewport,redactionSummary:n.redactionSummary,strictMode:n.strictMode,attachmentIds:f.attachments.map(p=>p.id)})});if(!g.ok)throw new Error(`finalize failed: ${g.status}`);const{dashboardUrl:w}=await g.json();return{reportId:u,dashboardUrl:w}}async function Cr(r,e){const t=await Es(r,{method:"PUT",headers:{"Content-Type":e.type||"application/octet-stream"},body:e});if(!t.ok){const i=await t.text().catch(()=>"");throw new Error(`PUT ${Yr(r)} failed: ${t.status} ${i.slice(0,160)}`)}}const xr=[200,800,3200],Ho=3e4;async function Es(r,e){let t=null;for(let i=0;i<=xr.length;i++){try{const o=await gw(r,e);if(!dw(o.status)||i===xr.length)return o}catch(o){if(t=o,i===xr.length)throw o}const s=xr[i],n=(Math.random()-.5)*.5*s;await pw(s+n)}throw t instanceof Error?t:new Error(`retryingFetch exhausted attempts for ${Yr(r)}`)}function dw(r){return r===408||r===502||r===503||r===504}function pw(r){return new Promise(e=>setTimeout(e,Math.max(0,r)))}function mw(r,e){return!r||typeof AbortSignal.any!="function"?e:AbortSignal.any([r,e])}async function gw(r,e){const t=AbortSignal.timeout(Ho),i=mw(e.signal,t);try{return await hw(r,{...e,signal:i})}catch(s){const n=(e.method??"GET").toUpperCase();if(t.aborted&&!e.signal?.aborted)throw new Error(`${n} ${Yr(r)} timed out after ${Ho/1e3}s`);const a=s,l=a?.cause instanceof Error?`: ${a.cause.message}`:a?.cause?`: ${String(a.cause)}`:"",c=s instanceof Error?s.message:String(s);throw new Error(`${n} ${Yr(r)} failed: ${c}${l}`)}}function Yr(r){try{const e=new URL(r),t=e.pathname.length>60?`${e.pathname.slice(0,57)}…`:e.pathname;return`${e.host}${t}`}catch{return r.slice(0,80)}}function yw(r){try{return new Blob([JSON.stringify(r)]).size}catch{return 0}}async function ww(r,e){const t={reportId:r.reportId,createdAt:r.createdAt,durationMs:r.durationMs,description:r.description,url:r.url,userAgent:r.userAgent,viewport:r.viewport,consoleLogs:r.consoleLogs,networkEvents:r.networkEvents,annotations:r.annotations,redactionSummary:r.redactionSummary,strictMode:r.strictMode,attachmentNames:e.map(n=>n.name)},i=new Blob([JSON.stringify({manifest:t,rrwebEvents:r.rrwebEvents},null,2)],{type:"application/json"}),s=document.createElement("a");s.href=URL.createObjectURL(i),s.download=`bugjar-report-${r.reportId}.json`,s.click(),URL.revokeObjectURL(s.href)}class bw{constructor(){M(this,"config",null);M(this,"root",null);M(this,"host",null);M(this,"markupHost",null);M(this,"markupController",null);M(this,"consoleCapture",null);M(this,"networkCapture",null);M(this,"recorder",null);M(this,"view","idle");M(this,"isRecording",!1);M(this,"elapsedMs",0);M(this,"capturedReport",null);M(this,"preview",null);M(this,"previewObjectUrls",[]);M(this,"error",null);M(this,"failedAttachments",null);M(this,"errorObserved",!1);M(this,"sessionId",null);M(this,"persistedActiveMs",0);M(this,"resumingToast",null);M(this,"lastRecording",null);M(this,"finalizingInFlight",!1)}init(e){if(this.config)return this.publicApi();this.config=vw(e),this.host=document.createElement("div"),this.host.setAttribute("data-bugjar-block","true"),this.host.id="bugjar-root",document.body.appendChild(this.host),this.root=Ii(this.host);const t=()=>this.onErrorObserved();this.consoleCapture=Tc(this.config.capture.consoleBufferSize,t),this.networkCapture=$c(this.config.capture.networkBufferSize,t);const i=Sw(this.config.captureTokenParam);return i&&this.applyCaptureToken(i),this.render(),this.attemptRecovery(),this.publicApi()}async attemptRecovery(){if(!this.config)return;const e=this.config.projectKey,t=Zc(e);if(!t)return;if(!Xc(t)){We(e);try{await Yt(t.sessionId)}catch{}return}let i=null;try{i=await Uc(t.sessionId)}catch{We(e);return}if(!i){We(e);return}const s=Math.max(0,i.maxDurationMs-i.activeMs);if(s<500){We(e);try{await Yt(i.sessionId)}catch{}return}try{this.consoleCapture.hydrate(i.consoleEntries),this.networkCapture.hydrate(i.networkEvents)}catch(o){this.config.onError?.(o instanceof Error?o:new Error(String(o)))}this.sessionId=i.sessionId,this.persistedActiveMs=i.activeMs,this.view="active",this.isRecording=!0,this.elapsedMs=i.activeMs,this.resumingToast={remainingMs:s},this.ensureMarkupLayer(),this.render();const n=new pn({sessionId:i.sessionId,projectKey:e,persistedActiveMs:i.activeMs,strictMode:this.config.strictMode,disabledCategories:this.config.disabledCategories,captureMicrophone:this.config.capture.captureMicrophone,maxDurationSec:this.config.capture.maxDurationSec,consoleCapture:this.consoleCapture,networkCapture:this.networkCapture,onTick:o=>{this.elapsedMs=o,this.render()},onStop:o=>{this.lastRecording={events:o.events,audioBlob:o.audioBlob,durationMs:o.durationMs},this.isRecording=!1,this.recorder=null,this.render()}});n.hydrateEvents(i.events),n.hydrateAudioChunks(i.audioChunks),this.recorder=n;try{await n.start()}catch(o){this.recorder=null,this.sessionId=null,this.persistedActiveMs=0,this.isRecording=!1,this.view="idle",this.resumingToast=null,We(e);try{await Yt(i.sessionId)}catch{}this.config.onError?.(o instanceof Error?o:new Error(String(o))),this.render();return}window.setTimeout(()=>{this.resumingToast=null,this.render()},3500)}onErrorObserved(){this.errorObserved||(this.errorObserved=!0,this.render())}publicApi(){return{open:()=>this.open(),close:()=>this.close()}}async applyCaptureToken(e){if(this.config&&this.config.captureToken!==e)try{const t=await fetch(`${this.config.apiUrl}/capture-invitations/${encodeURIComponent(e)}/scope`,{method:"GET",headers:{Accept:"application/json"}});if(!t.ok){const n=await t.json().catch(()=>({}));throw new Error(`capture-token scope fetch failed (${t.status}): ${n.error?.code??"unknown"}`)}const{disableCategories:i}=await t.json(),s=eu(i);this.config.captureToken=e,this.config.disabledCategories=s,this.view==="idle"&&this.open()}catch(t){this.config.onError?.(t instanceof Error?t:new Error(String(t)))}}ensureMarkupLayer(){if(this.markupController)return this.markupController;const e=document.createElement("div");return e.id="bugjar-markup-layer",document.body.appendChild(e),this.markupHost=e,this.markupController=new Pc(e),this.markupController}teardownMarkupLayer(){this.markupController&&(this.markupController.destroy(),this.markupController=null),this.markupHost&&(this.markupHost.remove(),this.markupHost=null)}open(){if(!this.config)throw new Error("BugJar.init() must be called first");this.view="active",this.isRecording=!1,this.elapsedMs=0,this.lastRecording=null,this.ensureMarkupLayer(),this.render()}close(){this.view="idle",this.isRecording=!1,this.elapsedMs=0,this.capturedReport=null,this.preview=null,this.error=null,this.lastRecording=null,this.resumingToast=null,this.releasePreviewObjectUrls(),this.recorder&&(this.recorder.stop().catch(()=>{}),this.recorder=null),this.discardPersistedSession(),this.teardownMarkupLayer(),this.render()}discardPersistedSession(){if(!this.config||!this.sessionId)return;const e=this.config.projectKey,t=this.sessionId;We(e),Yt(t).catch(()=>{}),this.sessionId=null,this.persistedActiveMs=0}releasePreviewObjectUrls(){for(const e of this.previewObjectUrls)try{URL.revokeObjectURL(e)}catch{}this.previewObjectUrls=[]}render(){if(!this.root||!this.config)return;const{showTrigger:e,showOnError:t}=this.config.ui,i=e&&(this.errorObserved||!t);this.root.render(m.jsx(oe.StrictMode,{children:m.jsx(rw,{projectKey:this.config.projectKey,primaryColor:this.config.ui.primaryColor,position:this.config.ui.position,maxDurationSec:this.config.capture.maxDurationSec,strictMode:this.config.strictMode,triggerVisible:i,triggerLabel:this.config.ui.triggerLabel,view:this.view,isRecording:this.isRecording,hasRecording:this.lastRecording!==null,elapsedMs:this.elapsedMs,preview:this.preview,error:this.error,resumingToast:this.resumingToast,onOpenActive:()=>this.open(),onCancel:()=>this.close(),onStartRecording:async()=>{await this.startRecording()},onStopRecording:async()=>{await this.stopRecording()},onToggleMicMute:s=>this.recorder?.toggleMic(s),onFinalize:async()=>{await this.finalizeReport()},onBackToMarkup:()=>this.backToMarkup(),onSendReport:async s=>{await this.sendReport(s)},onDownloadFailed:async()=>{await this.downloadOnDemand()},onSelectTool:s=>this.markupController?.setTool(s),onSelectColor:s=>this.markupController?.setColor(s),onUndoMarkup:()=>this.markupController?.undo()})}))}async startRecording(){if(!this.config||this.isRecording||this.recorder)return;this.discardPersistedSession(),this.isRecording=!0,this.elapsedMs=0,this.lastRecording=null,this.persistedActiveMs=0;const e=hn();this.sessionId=e;const t={sessionId:e,projectKey:this.config.projectKey,startedAt:Date.now(),activeMs:0,maxDurationMs:this.config.capture.maxDurationSec*1e3,events:[],audioChunks:[],consoleEntries:[],networkEvents:[],lastSeenAt:Date.now()};try{await zc(t)}catch(i){this.config.onError?.(i instanceof Error?i:new Error(String(i)))}this.render(),this.recorder=new pn({sessionId:e,projectKey:this.config.projectKey,persistedActiveMs:0,strictMode:this.config.strictMode,disabledCategories:this.config.disabledCategories,captureMicrophone:this.config.capture.captureMicrophone,maxDurationSec:this.config.capture.maxDurationSec,consoleCapture:this.consoleCapture,networkCapture:this.networkCapture,onTick:i=>{this.elapsedMs=i,this.render()},onStop:i=>{this.lastRecording={events:i.events,audioBlob:i.audioBlob,durationMs:i.durationMs},this.isRecording=!1,this.recorder=null,this.render()}});try{await this.recorder.start()}catch(i){await this.recorder.stop().catch(()=>{}),this.recorder=null,this.isRecording=!1,this.lastRecording=null,this.discardPersistedSession(),this.error=i instanceof Error?i.message:String(i),this.config.onError?.(i instanceof Error?i:new Error(String(i))),this.render()}}async stopRecording(){this.recorder&&await this.recorder.stop()}async finalizeReport(){if(this.config&&!this.finalizingInFlight){this.finalizingInFlight=!0;try{this.recorder&&await this.recorder.stop(),this.discardPersistedSession();const e=Jo(),t={disabledCategories:this.config.disabledCategories},i=this.lastRecording,s=i?nu(i.events,e,t):[],n=i?this.consoleCapture.snapshot().map(g=>xt(g,e,t)):[],o=i?this.networkCapture.snapshot().map(g=>{const w=xt(g,e,t);return{...w,url:Di(w.url,e)}}):[],a=await gh(),l={width:window.innerWidth,height:window.innerHeight},c=i?.audioBlob??null,u=i?.durationMs??0,h={reportId:hn(),createdAt:Date.now(),durationMs:u,rrwebEvents:s,audioBlob:c,screenshotBlob:a,consoleLogs:n,networkEvents:o,annotations:[],description:"",url:Di(location.href,e),userAgent:navigator.userAgent,viewport:l,redactionSummary:e,strictMode:this.config.strictMode};this.capturedReport=h,this.releasePreviewObjectUrls();const f=URL.createObjectURL(a),d=c?URL.createObjectURL(c):null;this.previewObjectUrls=[f,d].filter(g=>g!==null),this.preview={hasReplay:s.length>0,durationMs:u,replayEvents:s,replayEventCount:s.length,hasAudio:c!==null,audioBlobUrl:d,consoleLogs:n,networkEvents:o,redactionSummary:e,screenshotUrl:f,capturedViewport:l,pageUrl:location.href,userAgent:navigator.userAgent,reportUrl:null},this.view="preview",this.render()}finally{this.finalizingInFlight=!1}}}backToMarkup(){this.preview=null,this.capturedReport=null,this.view="active",this.render()}async sendReport(e){if(!(!this.capturedReport||!this.config)){this.capturedReport.description=e.description,this.capturedReport.annotations=e.annotations,this.teardownMarkupLayer(),this.view="uploading",this.render();try{const{reportId:t,dashboardUrl:i}=await fw({apiUrl:this.config.apiUrl,projectKey:this.config.projectKey,userToken:this.config.userToken,captureToken:this.config.captureToken,report:this.capturedReport,attachments:e.attachments});this.preview&&(this.preview.reportUrl=i),this.view="success",this.config.onReportSubmitted?.(t),this.render()}catch(t){this.error=t instanceof Error?t.message:String(t),this.failedAttachments=e.attachments,this.view="failed",this.config.onError?.(t instanceof Error?t:new Error(String(t))),this.render()}}}async downloadOnDemand(){if(this.capturedReport)try{await ww(this.capturedReport,this.failedAttachments??[])}catch(e){this.config?.onError?.(e instanceof Error?e:new Error(String(e)))}}}function vw(r){return{projectKey:r.projectKey,apiUrl:Ch,userToken:r.userToken??null,user:r.user??{id:""},strictMode:r.strictMode??!1,capture:{...vh,...r.capture??{}},ui:{...Sh,...r.ui??{}},onReportSubmitted:r.onReportSubmitted??(()=>{}),onError:r.onError??(()=>{}),captureTokenParam:r.captureTokenParam??"bugjar_capture",captureToken:null,disabledCategories:new Set}}function Sw(r){if(typeof window>"u"||!window.location)return null;try{const t=new URLSearchParams(window.location.search).get(r);return t&&t.length>0?t:null}catch{return null}}const yc=new bw,_i=yc,wc={init:r=>_i.init(r),open:()=>_i.open(),close:()=>_i.close()};typeof window<"u"&&(window.BugJar=wc);exports.BugJar=wc;exports._client=yc;
package/dist/index.js CHANGED
@@ -12985,7 +12985,6 @@ function nw(r) {
12985
12985
  fw,
12986
12986
  {
12987
12987
  color: r.primaryColor,
12988
- url: r.preview?.reportUrl ?? null,
12989
12988
  onDismiss: r.onCancel
12990
12989
  }
12991
12990
  ),
@@ -13201,8 +13200,7 @@ function hw({ color: r }) {
13201
13200
  }
13202
13201
  function fw({
13203
13202
  color: r,
13204
- url: e,
13205
- onDismiss: t
13203
+ onDismiss: e
13206
13204
  }) {
13207
13205
  return /* @__PURE__ */ k(
13208
13206
  "div",
@@ -13219,8 +13217,8 @@ function fw({
13219
13217
  },
13220
13218
  children: [
13221
13219
  /* @__PURE__ */ y("div", { style: { fontWeight: 600, marginBottom: 6 }, children: "Report sent — thank you!" }),
13222
- e && /* @__PURE__ */ y("a", { href: e, target: "_blank", rel: "noreferrer", style: { color: r }, children: "View in dashboard " }),
13223
- /* @__PURE__ */ y("div", { style: { marginTop: 12, textAlign: "right" }, children: /* @__PURE__ */ y(As, { onClick: t, children: "Close" }) })
13220
+ /* @__PURE__ */ y("div", { style: { color: "#475569", fontSize: 12, lineHeight: 1.5 }, children: "The team has been notified and will follow up by email if they need more from you." }),
13221
+ /* @__PURE__ */ y("div", { style: { marginTop: 12, textAlign: "right" }, children: /* @__PURE__ */ y(As, { onClick: e, children: "Close" }) })
13224
13222
  ]
13225
13223
  }
13226
13224
  );
@@ -13598,6 +13596,14 @@ class Cw {
13598
13596
  * it on the resolved config. Idempotent — re-running with the same
13599
13597
  * token is a no-op. Failures don't throw; they call onError and
13600
13598
  * leave default redaction in place.
13599
+ *
13600
+ * On success, auto-opens the markup toolbar (`view = 'active'`).
13601
+ * Rationale: the user arrived here from clicking "Allow" on the
13602
+ * consent page — their explicit intent is to record. Making them
13603
+ * hunt for the trigger button after that is unnecessary friction.
13604
+ * Recording itself stays manual (one more Record click) because
13605
+ * the browser's getUserMedia permission prompt needs the user's
13606
+ * explicit gesture to fire cleanly.
13601
13607
  */
13602
13608
  async applyCaptureToken(e) {
13603
13609
  if (this.config && this.config.captureToken !== e)
@@ -13613,7 +13619,7 @@ class Cw {
13613
13619
  );
13614
13620
  }
13615
13621
  const { disableCategories: i } = await t.json(), s = iu(i);
13616
- this.config.captureToken = e, this.config.disabledCategories = s;
13622
+ this.config.captureToken = e, this.config.disabledCategories = s, this.view === "idle" && this.open();
13617
13623
  } catch (t) {
13618
13624
  this.config.onError?.(t instanceof Error ? t : new Error(String(t)));
13619
13625
  }
@@ -13816,7 +13822,7 @@ class Cw {
13816
13822
  }
13817
13823
  async sendReport(e) {
13818
13824
  if (!(!this.capturedReport || !this.config)) {
13819
- this.capturedReport.description = e.description, this.capturedReport.annotations = e.annotations, this.view = "uploading", this.render();
13825
+ this.capturedReport.description = e.description, this.capturedReport.annotations = e.annotations, this.teardownMarkupLayer(), this.view = "uploading", this.render();
13820
13826
  try {
13821
13827
  const { reportId: t, dashboardUrl: i } = await mw({
13822
13828
  apiUrl: this.config.apiUrl,
@@ -13826,7 +13832,7 @@ class Cw {
13826
13832
  report: this.capturedReport,
13827
13833
  attachments: e.attachments
13828
13834
  });
13829
- this.preview && (this.preview.reportUrl = i), this.view = "success", this.teardownMarkupLayer(), this.config.onReportSubmitted?.(t), this.render();
13835
+ this.preview && (this.preview.reportUrl = i), this.view = "success", this.config.onReportSubmitted?.(t), this.render();
13830
13836
  } catch (t) {
13831
13837
  this.error = t instanceof Error ? t.message : String(t), this.failedAttachments = e.attachments, this.view = "failed", this.config.onError?.(t instanceof Error ? t : new Error(String(t))), this.render();
13832
13838
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bugjar/reporter",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Privacy-first bug reporting SDK. DOM replay + redaction + markup, runs only on user consent.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",
@@ -36,7 +36,8 @@
36
36
  "lint": "biome check src",
37
37
  "typecheck": "tsc --noEmit",
38
38
  "bundle-size": "size-limit",
39
- "prepublishOnly": "npm run build:production && npm run test && npm run bundle-size"
39
+ "prepublishOnly": "npm run build:production && npm run test && npm run bundle-size",
40
+ "release": "node ./scripts/publish.mjs"
40
41
  },
41
42
  "size-limit": [
42
43
  {