@lumen-stack/react 0.3.0 → 0.3.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.
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- 'use strict';var react=require('react'),sonner=require('sonner'),jsxRuntime=require('react/jsx-runtime'),reactDom=require('react-dom');var C=class extends Error{constructor(e,t,n){super(e),this.code=t,this.status=n,this.name="LumenError";}code;status},ve=class extends C{constructor(){super("Origin not allowed. Add this origin in your Lumen project settings.","ORIGIN_NOT_ALLOWED",403),this.name="LumenOriginError";}},xe=class extends C{constructor(e){super(`Rate limited \u2014 retry after ${e}s.`,"RATE_LIMITED",429),this.retryAfter=e,this.name="LumenRateLimitError";}retryAfter},X=class extends C{constructor(e){super(e,"NETWORK_ERROR"),this.name="LumenNetworkError";}},bt="https://shakebugs.vercel.app",wt="/api/v1/sdk/submit",yt=new Set([502,503,504]),Re=class{apiKey;apiUrl;user;constructor(e){if(!e.apiKey||!e.apiKey.startsWith("lk_pub_"))throw new C("Invalid Lumen apiKey \u2014 expected a key starting with `lk_pub_`.","INVALID_API_KEY");this.apiKey=e.apiKey,this.apiUrl=(e.apiUrl??bt).replace(/\/$/,""),this.user=e.user;}async submit(e,t={}){let n=`${this.apiUrl}${wt}`,r=this.#e(e),a=null;for(let o=0;o<3;o++){o>0&&await xt(2**o*250);try{return await this.#t(n,r,t)}catch(i){if(a=i,i instanceof ve||i instanceof xe||i instanceof C&&typeof i.status=="number"&&!yt.has(i.status))throw i}}throw a instanceof Error?a:new X("Submit failed after 3 attempts.")}#e(e){let t=new FormData;return e.rawText&&t.append("rawText",e.rawText),e.category&&t.append("category",e.category),e.submitterEmail&&t.append("submitterEmail",e.submitterEmail),e.submitterFingerprint&&t.append("submitterFingerprint",e.submitterFingerprint),t.append("context",JSON.stringify(e.context)),e.screenshot&&t.append("screenshot",e.screenshot,vt(e.screenshot)),e.audio&&t.append("audio",e.audio,"audio"),e.audioDurationMs!=null&&t.append("audioDurationMs",String(e.audioDurationMs)),t}#t(e,t,n){return new Promise((r,a)=>{let o=new XMLHttpRequest;o.open("POST",e,true),o.setRequestHeader("X-Lumen-Api-Key",this.apiKey),o.responseType="text";let{onUploadProgress:i,signal:l}=n;i&&o.upload.addEventListener("progress",d=>{d.lengthComputable&&d.total>0&&i(Math.min(1,d.loaded/d.total));});let s=()=>{o.abort(),a(new X("Submit aborted."));};if(l){if(l.aborted){a(new X("Submit aborted."));return}l.addEventListener("abort",s,{once:true});}o.addEventListener("load",()=>{if(l&&l.removeEventListener("abort",s),o.status===403){a(new ve);return}if(o.status===429){let d=Number(o.getResponseHeader("Retry-After"))||60;a(new xe(d));return}if(o.status<200||o.status>=300){a(new C(Et(o.responseText)??`HTTP ${o.status}`,"HTTP_ERROR",o.status));return}try{let d=JSON.parse(o.responseText);r(d);}catch{a(new C("Malformed response from server.","BAD_RESPONSE"));}}),o.addEventListener("error",()=>{l&&l.removeEventListener("abort",s),a(new X("Network error during submit."));}),o.send(t);})}};function vt(e){return `screenshot.${e.type==="image/jpeg"?"jpg":e.type==="image/webp"?"webp":"png"}`}function xt(e){return new Promise(t=>setTimeout(t,e))}function Et(e){try{let t=JSON.parse(e);return t.error??t.message??null}catch{return e||null}}var kt=2,$=8*1024*1024;async function oe(e={}){Pe();let t=e.mode??"auto";if(e.provider&&(t==="auto"||t==="custom"))try{return Lt(await e.provider(),e)}catch(n){if(t==="custom")throw n;e.onWarning?.(["Custom capture provider failed; falling back to browser DOM capture."]);}if(t==="manual")throw new C("Manual screenshot upload is required for this capture mode.","MANUAL_CAPTURE_REQUIRED");if(t==="true-screen")return ke(e);if(t==="dom")return Ee(e);if(t==="custom")throw new C("`capture.provider` is required when capture mode is `custom`.","CAPTURE_PROVIDER_REQUIRED");try{return await Ee(e)}catch(n){if(Se()){let r=await ke(e);return r.warnings=q(["DOM screenshot failed; used browser screen permission fallback.",...r.warnings]),e.onWarning?.(r.warnings),r}throw n}}function Ae(e,t=[]){Pe();let n=Z();return {blob:e,method:"manual-upload",platform:"web",viewport:n,pixelRatio:window.devicePixelRatio??1,warnings:q(t)}}async function Ee(e){let t=await Ct(),n=e.target??document.documentElement,r=Z(),a=Math.max(1,Math.min(window.devicePixelRatio??1,e.maxScale??kt)),o=Tt(n),i=await t(n,{backgroundColor:null,logging:false,useCORS:true,allowTaint:false,width:r.width,height:r.height,windowWidth:r.width,windowHeight:r.height,scrollX:window.scrollX,scrollY:window.scrollY,x:window.scrollX,y:window.scrollY,scale:a,ignoreElements:s=>s instanceof HTMLElement&&(s.dataset.lumenCaptureIgnore==="true"||!!s.closest("[data-lumen-capture-ignore='true']"))}),l={blob:await Me(i,o),method:"web-dom",platform:"web",viewport:r,pixelRatio:a,warnings:q(o)};return l.warnings.length>0&&e.onWarning?.(l.warnings),l}async function Ct(){let{default:e}=await import('html2canvas-pro');return e}async function ke(e){if(!Se())throw new C("Browser screen capture is unavailable in this environment.","DISPLAY_MEDIA_UNAVAILABLE");let t=await navigator.mediaDevices.getDisplayMedia({video:true,audio:false});try{let n=document.createElement("video");n.muted=!0,n.playsInline=!0,n.srcObject=t,await Rt(n);let r=document.createElement("canvas");r.width=n.videoWidth,r.height=n.videoHeight;let a=r.getContext("2d");if(!a)throw new C("Could not create a drawing context for screen capture.","CANVAS_CONTEXT_UNAVAILABLE");a.drawImage(n,0,0,r.width,r.height);let o=Z(),i=["Browser screen capture uses the window or tab selected by the user."],l={blob:await Me(r,i),method:"web-display-media",platform:"web",viewport:o,pixelRatio:o.width>0?r.width/o.width:void 0,warnings:q(i)};return e.onWarning?.(l.warnings),l}finally{for(let n of t.getTracks())n.stop();}}function Lt(e,t){let n=Z(),r={...e,method:e.method??"custom",platform:e.platform??"custom",viewport:e.viewport??n,pixelRatio:e.pixelRatio??window.devicePixelRatio??1,warnings:q(e.warnings??[])};return r.warnings.length>0&&t.onWarning?.(r.warnings),r}function Tt(e){let t=new Set;e.querySelector("iframe")&&t.add("Embedded iframes may be blank or incomplete in DOM capture."),e.querySelector("video")&&t.add("Video frames may be blank or stale in DOM capture."),e.querySelector("canvas")&&t.add("Canvas/WebGL content may be blank if it is cross-origin tainted."),document.fonts&&document.fonts.status!=="loaded"&&t.add("Web fonts were still loading when the screenshot was captured.");let n=0;for(let r of Array.from(e.querySelectorAll("img"))){let a=r.currentSrc||r.src;if(a)try{new URL(a,window.location.href).origin!==window.location.origin&&!r.crossOrigin&&(n+=1);}catch{}}return n>0&&t.add(`${n} cross-origin image${n===1?"":"s"} without CORS may be omitted from the screenshot.`),Array.from(t)}async function Me(e,t){let n=await Ce(e,"image/png",.92);if(n.size<=$)return n;t.push("Screenshot exceeded the upload cap and was compressed.");let r=e,a=0;for(;n.size>$&&a<6;){let o=Math.max(.35,Math.min(.95,Math.sqrt($/n.size)*.9)),i=document.createElement("canvas");i.width=Math.max(1,Math.round(r.width*o)),i.height=Math.max(1,Math.round(r.height*o));let l=i.getContext("2d");if(!l)return n;l.drawImage(r,0,0,i.width,i.height),r=i;for(let s of [.86,.74,.62,.5])if(n=await Ce(r,"image/jpeg",s),n.size<=$)return n;if(a+=1,i.width<480||i.height<320)break}return n.size>$&&t.push("Screenshot remained large after compression; upload may be rejected."),n}function Ce(e,t,n){return new Promise((r,a)=>{e.toBlob(o=>{if(!o){a(new C("Could not encode screenshot.","ENCODE_FAILED"));return}r(o);},t,n);})}function Z(){let e=window.visualViewport;return {width:Math.round(e?.width??window.innerWidth),height:Math.round(e?.height??window.innerHeight)}}function Se(){return !!navigator.mediaDevices?.getDisplayMedia}async function Rt(e){await new Promise((r,a)=>{let o=()=>r(),i=()=>a(new C("Could not read screen capture video.","VIDEO_FAILED"));e.addEventListener("loadedmetadata",o,{once:true}),e.addEventListener("error",i,{once:true}),e.play().catch(i);});let t=performance.now(),n=1500;for(;e.videoWidth===0||e.videoHeight===0;){if(performance.now()-t>n)throw new C("Screen capture did not produce a frame in time.","VIDEO_TIMEOUT");await new Promise(r=>requestAnimationFrame(()=>r()));}}function Pe(){if(typeof window>"u"||typeof document>"u")throw new C("Screenshot capture can only run in the browser.","INVALID_ENV")}function q(e){return Array.from(new Set(e.filter(Boolean)))}var Ne=[],G=[],Le=false,ne=null;function Ie(e={}){Le||typeof window>"u"||(Le=true,ne=e.ignoreUrlPrefix??null,Pt(),Nt(),It());}function At(){return {consoleLog:Ne.slice(),networkLog:G.slice()}}function J(e,t){e.push(t),e.length>200&&e.splice(0,e.length-200);}function Mt(e){let t=[];for(let r of e){if(typeof r=="string"){t.push(r);continue}if(r instanceof Error){t.push(`${r.name}: ${r.message}${r.stack?`
3
- ${r.stack}`:""}`);continue}try{t.push(JSON.stringify(r,St));}catch{t.push(String(r));}}let n=t.join(" ");return n.length>4096?n.slice(0,4096)+"\u2026[truncated]":n}function St(e,t){return t instanceof Element?`[Element ${t.tagName}]`:typeof t=="function"?"[Function]":t}function Pt(){let e=window.console;if(!e)return;let t=["log","info","warn","error","debug"];for(let n of t){let r=e[n]?.bind(e);r&&(e[n]=(...a)=>{try{J(Ne,{level:n,ts:Date.now(),message:Mt(a)});}catch{}r(...a);});}}function Oe(e){return ne?e.startsWith(ne):false}function Nt(){let e=window.fetch;typeof e=="function"&&(window.fetch=async function(t,n){let r=typeof t=="string"?t:t instanceof URL?t.toString():t.url,a=(n?.method??(t instanceof Request?t.method:"GET")).toUpperCase();if(Oe(r))return e.call(window,t,n);let o=performance.now();try{let i=await e.call(window,t,n);return J(G,{type:"fetch",method:a,url:re(r),status:i.status,ok:i.ok,durationMs:Math.round(performance.now()-o),ts:Date.now()}),i}catch(i){throw J(G,{type:"fetch",method:a,url:re(r),status:0,ok:false,durationMs:Math.round(performance.now()-o),ts:Date.now(),error:i instanceof Error?i.message:"fetch error"}),i}});}function It(){let e=window.XMLHttpRequest;if(!e)return;let t=e.prototype.open,n=e.prototype.send;e.prototype.open=function(r,a,...o){return this.__lumen={method:String(r).toUpperCase(),url:typeof a=="string"?a:a.toString(),t:0},t.call(this,r,a,...o)},e.prototype.send=function(r){let a=this.__lumen;if(a&&!Oe(a.url)){a.t=performance.now();let o=()=>{try{J(G,{type:"xhr",method:a.method,url:re(a.url),status:this.status,ok:this.status>=200&&this.status<400,durationMs:Math.round(performance.now()-a.t),ts:Date.now()});}catch{}this.removeEventListener("loadend",o);};this.addEventListener("loadend",o);}return n.call(this,r??null)};}function re(e){return e.length>512?e.slice(0,512)+"\u2026":e}function De(e){if(typeof window>"u")return {url:"",userAgent:"",viewport:{width:0,height:0},capture:Te(e),consoleLog:[],networkLog:[]};let t=At();return {url:window.location.href,userAgent:navigator.userAgent,viewport:{width:window.innerWidth,height:window.innerHeight},capture:Te(e),device:Ot(),consoleLog:t.consoleLog,networkLog:t.networkLog}}function Ot(){let e={};try{e.screen={width:window.screen?.width??0,height:window.screen?.height??0},e.pixelRatio=window.devicePixelRatio??1,e.language=navigator.language,e.languages=Array.from(navigator.languages??[]),e.timezone=Intl.DateTimeFormat().resolvedOptions().timeZone,e.colorScheme=window.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light",e.referrer=document.referrer||void 0,e.title=document.title||void 0,e.online=navigator.onLine,performance.getEntriesByType("navigation")[0]&&(e.uptimeMs=Math.round(performance.now()));}catch{}return e}function Te(e){if(e)return {method:e.method,platform:e.platform,viewport:e.viewport,pixelRatio:e.pixelRatio,warnings:e.warnings}}async function He(e=60){if(typeof window>"u"||!navigator.mediaDevices)throw new C("Audio recording requires a browser with MediaDevices.","INVALID_ENV");let t;try{t=await navigator.mediaDevices.getUserMedia({audio:!0});}catch{throw new C("Microphone access denied or unavailable.","MIC_DENIED")}let n=["audio/webm;codecs=opus","audio/webm","audio/mp4","audio/ogg;codecs=opus"].find(s=>MediaRecorder.isTypeSupported(s))??"",r=new MediaRecorder(t,n?{mimeType:n}:void 0),a=[],o=performance.now(),i=null;r.addEventListener("dataavailable",s=>{s.data&&s.data.size>0&&a.push(s.data);}),r.start(),i=window.setTimeout(()=>{r.state!=="inactive"&&r.stop();},e*1e3);function l(){i!==null&&window.clearTimeout(i),i=null;for(let s of t.getTracks())s.stop();}return {stream:t,cancel(){try{r.state!=="inactive"&&r.stop();}catch{}l();},stop(){return new Promise((s,d)=>{if(r.state==="inactive"){l(),d(new C("Recorder already stopped.","RECORDER_STOPPED"));return}r.addEventListener("stop",()=>{let g=performance.now()-o,f=r.mimeType||n||"audio/webm",k=new Blob(a,{type:f});l(),s({blob:k,durationMs:g,mimeType:f});},{once:true}),r.stop();})}}}var ae=react.createContext(null);function K(){let e=react.useContext(ae);if(!e)throw new Error("useLumen() must be used inside <LumenProvider>.");return e}function _e({screenshot:e,tool:t,color:n="rgb(239, 68, 68)",strokeWidth:r=4,onDrawingChange:a,ref:o}){let i=react.useRef(null),l=react.useRef(null),s=react.useRef(null),[d,g]=react.useState(null),[f,k]=react.useState([]),y=react.useRef(null),b=react.useRef(false),v=react.useRef(0),L=react.useRef(false);react.useEffect(()=>{let c=false,p=null;return (async()=>{try{let h=await createImageBitmap(e);if(c){h.close?.();return}p=h,g(h);}catch{}})(),()=>{c=true,p?.close?.();}},[e]),react.useEffect(()=>{if(!d)return;let c=i.current,p=l.current;if(!c||!p)return;c.width=d.width,c.height=d.height,p.width=d.width,p.height=d.height;let h=c.getContext("2d");h&&(h.imageSmoothingEnabled=false,h.drawImage(d,0,0));},[d]),react.useEffect(()=>{let c=l.current;c&&Q(c,f,y.current);},[f]),react.useImperativeHandle(o,()=>({hasAnnotations:()=>f.length>0,reset:()=>k([]),undo:()=>k(c=>c.length===0?c:c.slice(0,-1)),async flatten(){let c=y.current,p=c?[...f,c]:f;if(p.length===0||!d)return e;let h=document.createElement("canvas");h.width=d.width,h.height=d.height;let R=h.getContext("2d");if(!R)return e;R.imageSmoothingEnabled=false,R.drawImage(d,0,0);for(let H of p)le(R,H);return await new Promise(H=>{h.toBlob(F=>{H(F??e);},"image/jpeg",.85);})}}),[f,d,e]);function T(c){let p=l.current;if(!p)return {x:0,y:0};let h=p.getBoundingClientRect(),R=p.width/Math.max(h.width,1),H=p.height/Math.max(h.height,1);return {x:(c.clientX-h.left)*R,y:(c.clientY-h.top)*H}}function S(){L.current||(L.current=true,requestAnimationFrame(()=>{L.current=false;let c=l.current;c&&Q(c,f,y.current);}));}function E(c){if(c.button!==void 0&&c.button!==0)return;c.currentTarget.setPointerCapture(c.pointerId),b.current=true,a?.(true);let p=T(c);t==="arrow"?y.current={kind:"arrow",from:p,to:p,color:n,width:r}:t==="rect"?y.current={kind:"rect",from:p,to:p,color:n,width:r}:y.current={kind:"freehand",points:[p],color:n,width:r},v.current=performance.now(),S();}function A(c){if(!b.current||!y.current)return;let p=T(c),h=y.current;if(h.kind==="arrow"||h.kind==="rect")h.to=p;else {let R=h.points[h.points.length-1],H=R?(R.x-p.x)**2+(R.y-p.y)**2:1/0,F=performance.now(),W=F-v.current;(H>16||W>16)&&(h.points.push(p),v.current=F);}S();}function P(){if(!b.current)return;b.current=false,a?.(false);let c=y.current;if(y.current=null,!!c){if(c.kind==="arrow"||c.kind==="rect"){let p=c.to.x-c.from.x,h=c.to.y-c.from.y;if(p*p+h*h<16){let R=l.current;R&&Q(R,f,null);return}}else if(c.points.length<2){let p=l.current;p&&Q(p,f,null);return}k(p=>[...p,c].slice(-50));}}return jsxRuntime.jsxs("div",{ref:s,className:"lumen-annotate-frame",children:[jsxRuntime.jsx("canvas",{ref:i}),jsxRuntime.jsx("canvas",{ref:l,className:"lumen-annotate-overlay",onPointerDown:E,onPointerMove:A,onPointerUp:P,onPointerCancel:P})]})}function Q(e,t,n){let r=e.getContext("2d");if(r){r.clearRect(0,0,e.width,e.height);for(let a of t)le(r,a);n&&le(r,n);}}function le(e,t){if(e.save(),e.strokeStyle=t.color,e.fillStyle=t.color,e.lineWidth=t.width,e.lineCap="round",e.lineJoin="round",t.kind==="rect"){let n=Math.min(t.from.x,t.to.x),r=Math.min(t.from.y,t.to.y),a=Math.abs(t.to.x-t.from.x),o=Math.abs(t.to.y-t.from.y);e.strokeRect(n,r,a,o);}else if(t.kind==="freehand")_t(e,t.points);else {let{from:n,to:r,width:a}=t;e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(r.x,r.y),e.stroke();let o=Math.atan2(r.y-n.y,r.x-n.x),i=Math.max(12,a*4);e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(r.x-i*Math.cos(o-Math.PI/7),r.y-i*Math.sin(o-Math.PI/7)),e.lineTo(r.x-i*Math.cos(o+Math.PI/7),r.y-i*Math.sin(o+Math.PI/7)),e.closePath(),e.fill();}e.restore();}function _t(e,t){if(t.length===0)return;e.beginPath();let n=t[0];if(!n)return;if(e.moveTo(n.x,n.y),t.length===1){e.arc(n.x,n.y,e.lineWidth/2,0,Math.PI*2),e.fill();return}if(t.length===2){let a=t[1];e.lineTo(a.x,a.y),e.stroke();return}for(let a=1;a<t.length-1;a++){let o=t[a],i=t[a+1],l=(o.x+i.x)/2,s=(o.y+i.y)/2;e.quadraticCurveTo(o.x,o.y,l,s);}let r=t[t.length-1];e.lineTo(r.x,r.y),e.stroke();}var se=60,Ue=[{label:"Red",value:"rgb(239, 68, 68)"},{label:"Amber",value:"rgb(245, 158, 11)"},{label:"Blue",value:"rgb(59, 130, 246)"},{label:"Green",value:"rgb(34, 197, 94)"},{label:"Neutral",value:"rgb(244, 244, 245)"}],ze=[{label:"Small",value:2,dot:6},{label:"Medium",value:4,dot:9},{label:"Large",value:6,dot:12}],zt=[{value:"bug",label:"Bug"},{value:"feature",label:"Idea"},{value:"other",label:"Other"}];function de(){let{client:e,isOpen:t,closeCapture:n,user:r,capture:a}=K(),[o,i]=react.useState({kind:"idle"}),[l,s]=react.useState("arrow"),[d,g]=react.useState(Ue[0].value),[f,k]=react.useState(ze[1].value),[y,b]=react.useState(""),[v,L]=react.useState("bug"),[T,S]=react.useState(r?.email??""),[E,A]=react.useState(null),[P,c]=react.useState(null),[p,h]=react.useState(0),[R,H]=react.useState(false),F=react.useRef(null),W=react.useRef(null),he=react.useRef(null),V=react.useRef(false);if(react.useEffect(()=>{if(t)return V.current=false,i({kind:"capturing"}),b(""),c(null),h(0),(async()=>{if(a?.mode==="manual"){V.current||i({kind:"manual"});return}try{let u=await oe({...a,target:a?.target??document.documentElement});if(V.current)return;ye(u),i({kind:"ready",capture:u});}catch(u){if(V.current)return;i({kind:"manual",error:u instanceof Error?u.message:"Automatic screenshot capture was unavailable."});}})(),()=>{V.current=true;}},[t,a]),react.useEffect(()=>{if(!t)return;he.current=document.activeElement??null;let u=document.documentElement,w=u.style.overflow,N=u.style.paddingRight,M=window.innerWidth-u.clientWidth;u.style.overflow="hidden",M>0&&(u.style.paddingRight=`${M}px`);let O=false,D=()=>{if(!O){O=true,u.style.overflow=w,u.style.paddingRight=N;try{he.current?.focus?.();}catch{}}};return window.addEventListener("pagehide",D),()=>{window.removeEventListener("pagehide",D),D();}},[t]),react.useEffect(()=>{if(!t)return;function u(w){if(w.key==="Escape"){w.preventDefault(),n();return}if(w.key!=="Tab")return;let N=W.current;if(!N)return;let M=We(N);if(M.length===0)return;let O=M[0],D=M[M.length-1],te=document.activeElement;w.shiftKey&&(te===O||!N.contains(te))?(w.preventDefault(),D.focus()):!w.shiftKey&&te===D&&(w.preventDefault(),O.focus());}return document.addEventListener("keydown",u),()=>document.removeEventListener("keydown",u)},[t,n]),react.useEffect(()=>{if(!t||o.kind!=="ready"&&o.kind!=="manual")return;let u=W.current;if(!u)return;let w=We(u);(u.querySelector("textarea.lumen-input")??w[0])?.focus();},[t,o.kind]),react.useEffect(()=>{if(!t||o.kind!=="manual")return;function u(w){let O=Array.from(w.clipboardData?.items??[]).find(D=>D.type.startsWith("image/"))?.getAsFile();O&&(w.preventDefault(),we(O));}return window.addEventListener("paste",u),()=>window.removeEventListener("paste",u)},[t,o.kind]),react.useEffect(()=>{if(!E)return;let u=Date.now(),w=window.setInterval(()=>{let N=Math.floor((Date.now()-u)/1e3);h(N),N>=se&&be();},250);return ()=>window.clearInterval(w)},[E]),!t)return null;async function mt(){try{let u=await He(se);A(u);}catch(u){sonner.toast.error(u instanceof Error?u.message:"Microphone unavailable");}}async function be(){if(E)try{let u=await E.stop();c({blob:u.blob,durationMs:u.durationMs});}catch(u){sonner.toast.error(u instanceof Error?u.message:"Could not stop recording");}finally{A(null);}}function ft(){E?.cancel(),A(null),c(null),h(0);}function we(u){if(!u.type.startsWith("image/")){sonner.toast.error("Choose a PNG, JPEG, or WebP screenshot.");return}let w=Ae(u,["Manual screenshot upload used."]);i({kind:"ready",capture:w});}async function pt(){i({kind:"capturing"});try{let u=await oe({...a,mode:"true-screen",target:a?.target??document.documentElement});ye(u),i({kind:"ready",capture:u});}catch(u){i({kind:"manual",error:u instanceof Error?u.message:"Browser screen capture was unavailable."});}}function ye(u){u.warnings.length!==0&&sonner.toast.warning("Screenshot captured, but iframe, video, canvas, or cross-origin content may be incomplete.");}async function gt(){if(o.kind!=="ready")return;let u=y.trim();if(!P&&u.length===0){sonner.toast.error("Add a voice note or write a description.");return}let{capture:w}=o,N=w.blob;i({kind:"uploading",capture:w,progress:0});try{let M=await F.current?.flatten()??N,O=await e.submit({rawText:u.length>0?u:void 0,category:v,submitterEmail:T.trim()||void 0,screenshot:M,audio:P?.blob,audioDurationMs:P?.durationMs,context:De(w)},{onUploadProgress:D=>{i({kind:"uploading",capture:w,progress:Math.min(.95,D)});}});i({kind:"uploading",capture:w,progress:1}),sonner.toast.success("Feedback sent \u2014 thank you."),O.id,n();}catch(M){sonner.toast.error(M instanceof Error?M.message:"Could not submit feedback"),i({kind:"ready",capture:w});}}let Y=o.kind==="uploading"?Math.round(o.progress*100):0,j=o.kind==="uploading";function ht(u){u.target===u.currentTarget&&n();}return jsxRuntime.jsx("div",{role:"dialog","aria-modal":"true","aria-label":"Send feedback",className:"lumen-modal-backdrop","data-lumen-capture-ignore":"true",onMouseDown:ht,children:jsxRuntime.jsxs("div",{ref:W,className:"lumen-modal","data-lumen-drawing":R?"true":void 0,children:[jsxRuntime.jsx(Wt,{onDismiss:n}),jsxRuntime.jsxs("header",{className:"lumen-modal-header",children:[jsxRuntime.jsxs("h2",{className:"lumen-modal-title",children:[jsxRuntime.jsx("span",{className:"lumen-modal-title-dot","aria-hidden":"true"}),"Send feedback"]}),jsxRuntime.jsx("button",{type:"button",onClick:n,className:"lumen-icon-btn","aria-label":"Close",children:"\xD7"})]}),jsxRuntime.jsxs("div",{className:"lumen-modal-body",children:[o.kind==="capturing"?jsxRuntime.jsxs("p",{className:"lumen-status",children:[jsxRuntime.jsx("span",{className:"lumen-spinner","aria-hidden":"true"}),"Capturing screenshot\u2026"]}):null,o.kind==="manual"?jsxRuntime.jsxs("div",{className:"lumen-manual-capture",children:[jsxRuntime.jsx("p",{className:"lumen-status",children:o.error?"Automatic screenshot capture was unavailable. Upload or paste a screenshot to continue.":"Upload or paste a screenshot to continue."}),jsxRuntime.jsxs("label",{className:"lumen-manual-drop",children:[jsxRuntime.jsx("span",{children:"Choose or paste a screenshot"}),jsxRuntime.jsx("input",{type:"file",accept:"image/png,image/jpeg,image/webp",onChange:u=>{let w=u.currentTarget.files?.[0];w&&we(w),u.currentTarget.value="";}})]})]}):null,o.kind==="ready"||o.kind==="uploading"?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{className:"lumen-toolbar",children:[jsxRuntime.jsxs("div",{className:"lumen-segmented",role:"group","aria-label":"Annotation tool",children:[jsxRuntime.jsx(ue,{label:"Arrow",active:l==="arrow",onClick:()=>s("arrow")}),jsxRuntime.jsx(ue,{label:"Box",active:l==="rect",onClick:()=>s("rect")}),jsxRuntime.jsx(ue,{label:"Draw",active:l==="freehand",onClick:()=>s("freehand")})]}),jsxRuntime.jsx("span",{className:"lumen-toolbar-sep"}),jsxRuntime.jsx("div",{className:"lumen-swatches",role:"group","aria-label":"Color",children:Ue.map(u=>jsxRuntime.jsx("button",{type:"button",className:"lumen-swatch",style:{background:u.value},"aria-label":u.label,"aria-pressed":d===u.value,onClick:()=>g(u.value)},u.value))}),jsxRuntime.jsx("div",{className:"lumen-stroke-sizes",role:"group","aria-label":"Stroke width",children:ze.map(u=>jsxRuntime.jsx("button",{type:"button",className:"lumen-stroke-size","aria-label":u.label,"aria-pressed":f===u.value,onClick:()=>k(u.value),children:jsxRuntime.jsx("span",{className:"lumen-stroke-size-dot",style:{width:u.dot,height:u.dot}})},u.value))}),jsxRuntime.jsx("span",{className:"lumen-toolbar-spacer"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:()=>F.current?.undo(),title:"Undo",children:"Undo"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:()=>F.current?.reset(),title:"Clear all annotations",children:"Clear"})]}),jsxRuntime.jsx("div",{className:"lumen-annotate",children:jsxRuntime.jsx(_e,{ref:F,screenshot:o.capture.blob,tool:l,color:d,strokeWidth:f,onDrawingChange:H})}),jsxRuntime.jsxs("div",{className:"lumen-form",children:[jsxRuntime.jsxs("div",{className:"lumen-label",children:[jsxRuntime.jsx("span",{children:"Category"}),jsxRuntime.jsx("div",{className:"lumen-category",role:"group","aria-label":"Feedback category",children:zt.map(u=>jsxRuntime.jsx("button",{type:"button",className:"lumen-category-opt","aria-pressed":v===u.value,onClick:()=>L(u.value),children:u.label},u.value))})]}),jsxRuntime.jsxs("label",{className:"lumen-label",children:[jsxRuntime.jsxs("span",{children:["Description ",P?"(optional with audio)":""]}),jsxRuntime.jsx("textarea",{value:y,onChange:u=>b(u.target.value),rows:3,placeholder:"What happened?",className:"lumen-input"})]}),jsxRuntime.jsxs("label",{className:"lumen-label",children:[jsxRuntime.jsx("span",{children:"Your email (optional)"}),jsxRuntime.jsx("input",{type:"email",value:T,onChange:u=>S(u.target.value),placeholder:"you@example.com",className:"lumen-input"})]}),jsxRuntime.jsxs("div",{className:"lumen-audio-row",children:[!E&&!P?jsxRuntime.jsx("button",{type:"button",onClick:mt,className:"lumen-btn-ghost",children:"Record voice note"}):null,E?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{className:"lumen-recording",children:[jsxRuntime.jsx("span",{className:"lumen-rec-dot","aria-hidden":"true"}),p,"s / ",se,"s"]}),jsxRuntime.jsx("button",{type:"button",onClick:be,className:"lumen-btn-ghost",children:"Stop"}),jsxRuntime.jsx("button",{type:"button",onClick:ft,className:"lumen-btn-ghost",children:"Cancel"})]}):null,P&&!E?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{className:"lumen-audio-meta",children:["Voice note \xB7 ",Math.round(P.durationMs/1e3),"s"]}),jsxRuntime.jsx("button",{type:"button",onClick:()=>c(null),className:"lumen-btn-ghost",children:"Remove"})]}):null,jsxRuntime.jsx("span",{className:"lumen-toolbar-spacer"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:pt,title:"Use the browser's screen capture",children:"Screen capture"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:()=>i({kind:"manual"}),title:"Upload a screenshot file",children:"Upload"})]})]})]}):null]}),o.kind==="ready"||o.kind==="uploading"?jsxRuntime.jsxs("footer",{className:"lumen-modal-footer",children:[j?jsxRuntime.jsx("div",{className:"lumen-progress",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Y,children:jsxRuntime.jsx("div",{className:"lumen-progress-fill",style:{width:`${Y}%`}})}):null,jsxRuntime.jsxs("div",{className:"lumen-modal-actions",children:[jsxRuntime.jsx("button",{type:"button",onClick:n,className:"lumen-btn-ghost",disabled:j,children:"Cancel"}),jsxRuntime.jsx("button",{type:"button",onClick:gt,className:"lumen-btn-primary",disabled:j,children:j?Y<95?`Uploading ${Y}%\u2026`:"Almost done\u2026":"Send feedback"})]})]}):null]})})}function ue({label:e,active:t,onClick:n}){return jsxRuntime.jsx("button",{type:"button",onClick:n,className:"lumen-tool","aria-pressed":t,children:e})}function Wt({onDismiss:e}){let t=react.useRef(null),n=react.useRef(0),r=react.useRef(null);function a(l){l.currentTarget.setPointerCapture(l.pointerId),t.current=l.clientY,n.current=performance.now(),r.current=l.currentTarget.parentElement;}function o(l){if(t.current==null||!r.current)return;let s=Math.max(0,l.clientY-t.current);r.current.style.transform=`translateY(${s}px)`;}function i(l){if(t.current==null||!r.current)return;let s=Math.max(0,l.clientY-t.current),d=Math.max(1,performance.now()-n.current),g=s/d;r.current.style.transform="",r.current.style.transition="",t.current=null,(s>80||g>.6)&&e();}return jsxRuntime.jsx("div",{className:"lumen-modal-grabber","aria-hidden":"true",onPointerDown:a,onPointerMove:o,onPointerUp:i,onPointerCancel:i})}var Vt='a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';function We(e){return Array.from(e.querySelectorAll(Vt)).filter(t=>!t.hasAttribute("disabled")&&t.offsetParent!==null)}function Ve(){if(typeof document>"u"||typeof window>"u")return 0;let e=window.innerWidth,t=window.innerHeight;if(e===0||t===0)return 0;let n=t-4,r=[Math.round(e*.1),Math.round(e*.5),Math.round(e*.9)],a=new Set,o=0;for(let i of r){let l=document.elementsFromPoint(i,n);for(let s of l){if(a.has(s))continue;a.add(s);let d=window.getComputedStyle(s);if(d.position!=="fixed"&&d.position!=="sticky")continue;let g=s.getBoundingClientRect();g.bottom<t-8||g.bottom>t+8||g.width<e*.6||g.height>o&&(o=g.height);}}return o}function me(e,t){if(typeof document>"u"||typeof window>"u")return 0;let n=window.innerWidth,r=window.innerHeight,a=0;for(let o of e){let i;try{i=document.querySelectorAll(o);}catch{continue}for(let l of Array.from(i)){let s=l.getBoundingClientRect();if(s.height===0||s.width===0)continue;let d=0;switch(t){case "bottom":if(s.bottom<r-8)break;d=Math.max(0,r-s.top);break;case "top":if(s.top>8)break;d=Math.max(0,s.bottom);break;case "left":if(s.left>8)break;d=Math.max(0,s.right);break;case "right":if(s.right<n-8)break;d=Math.max(0,n-s.left);break}d>a&&(a=d);}}return a}function $e(e){let[t,n]=react.useState(()=>({bottom:e.offset.y,right:e.offset.x,left:e.offset.x,top:e.offset.y})),r=react.useRef(t),a=Yt(e.avoid),o=e.placement,i=e.offset.x,l=e.offset.y;return react.useEffect(()=>{if(typeof window>"u")return;let s=0,d=false,g=()=>{if(s=0,d)return;let v=o[0]==="b"?"bottom":"top",L=o[1]==="r"?"right":"left",T=0,S=0;e.avoid==="auto"&&v==="bottom"?T=Ve():Array.isArray(e.avoid)&&(T=me(e.avoid,v),S=me(e.avoid,L));let E={bottom:v==="bottom"?l+T:0,top:v==="top"?l+T:0,right:L==="right"?i+S:0,left:L==="left"?i+S:0},A=r.current;(E.bottom!==A.bottom||E.top!==A.top||E.right!==A.right||E.left!==A.left)&&(r.current=E,n(E));},f=()=>{s||(s=window.requestAnimationFrame(g));};f();let k=typeof ResizeObserver<"u"?new ResizeObserver(f):null;k?.observe(document.documentElement);let y=typeof MutationObserver<"u"?new MutationObserver(f):null;y?.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:["class","style","hidden"]}),window.addEventListener("resize",f);let b=window.visualViewport;return b?.addEventListener("resize",f),b?.addEventListener("scroll",f),()=>{d=true,s&&window.cancelAnimationFrame(s),k?.disconnect(),y?.disconnect(),window.removeEventListener("resize",f),b?.removeEventListener("resize",f),b?.removeEventListener("scroll",f);}},[o,i,l,a]),t}function Yt(e){return e===false?"false":e==="auto"?"auto":e.join("|")}function qe(e){let[t,n]=react.useState(false);return react.useEffect(()=>{if(!e){n(false);return}if(typeof window>"u")return;let r=window.visualViewport;if(!r||typeof window.matchMedia!="function"||!window.matchMedia("(pointer: coarse)").matches)return;let a=100,o=0,i=()=>{o=0;let s=window.innerHeight-r.height;n(s>a);},l=()=>{o||(o=window.requestAnimationFrame(i));};return l(),r.addEventListener("resize",l),r.addEventListener("scroll",l),()=>{o&&window.cancelAnimationFrame(o),r.removeEventListener("resize",l),r.removeEventListener("scroll",l);}},[e]),t}function Xe({config:e,portalTarget:t,hidden:n,onClick:r}){let[a,o]=react.useState(null),i=react.useRef(null),l=$e(e),s=qe(e.hideOnKeyboard);if(react.useEffect(()=>{typeof document>"u"||o(t??document.body);},[t]),Zt(i,!n&&!s),!a)return null;let d=e.placement,g=d[0]==="b"?"bottom":"top",f=d[1]==="r"?"right":"left",k=g==="bottom"?l.bottom:l.top,y=f==="right"?l.right:l.left,b={position:"fixed",[g]:e.safeArea?`calc(${k}px + env(safe-area-inset-${g}, 0px))`:`${k}px`,[f]:e.safeArea?`calc(${y}px + env(safe-area-inset-${f}, 0px))`:`${y}px`,zIndex:e.zIndex,opacity:n||s?0:1,pointerEvents:n||s?"none":"auto",transition:"opacity 160ms ease"};return reactDom.createPortal(jsxRuntime.jsxs("button",{ref:i,type:"button",className:"lumen-btn lumen-btn-primary lumen-btn-floating",style:b,"aria-label":e.label,"aria-hidden":n||s?true:void 0,tabIndex:n||s?-1:0,onClick:r,"data-lumen-trigger":"",children:[e.icon,jsxRuntime.jsx("span",{children:e.label})]}),a)}function Zt(e,t){let n=react.useRef(false);react.useEffect(()=>{if(process.env.NODE_ENV==="production"||!t||n.current||typeof window>"u")return;let r=window.setTimeout(()=>{let a=e.current;if(!a)return;let o=a.getBoundingClientRect();if(o.width===0||o.height===0)return;let i=o.left+o.width/2,l=o.top+o.height/2,s=document.elementsFromPoint(i,l),d=Ke(window.getComputedStyle(a).zIndex);for(let g of s){if(g===a||a.contains(g))continue;if(Ke(window.getComputedStyle(g).zIndex)>d){n.current=true,console.warn("[lumen] trigger is occluded by",g);break}}},250);return ()=>window.clearTimeout(r)},[t,e]);}function Ke(e){let t=parseInt(e,10);return Number.isNaN(t)?0:t}function Ge({mount:e,label:t,icon:n,onClick:r}){let[a,o]=react.useState(null);return react.useEffect(()=>{if(typeof document>"u")return;let i=e instanceof HTMLElement?e:e.current??null;o(i);},[e]),a?reactDom.createPortal(jsxRuntime.jsxs("button",{type:"button",className:"lumen-btn lumen-btn-primary",onClick:r,"aria-label":t,"data-lumen-trigger":"",children:[n,jsxRuntime.jsx("span",{children:t})]}),a):null}function Qe({config:e,portalTarget:t,hidden:n,onClick:r}){let[a,o]=react.useState(null),[i,l]=react.useState(false),s=react.useRef(null);if(react.useEffect(()=>{typeof document>"u"||o(t??document.body);},[t]),!a)return null;let d=`lumen-notch lumen-notch-${e.edge}${i?" lumen-notch-expanded":""}`;function g(b){s.current={x:b.clientX,y:b.clientY},l(true),b.currentTarget.setPointerCapture(b.pointerId);}function f(b){let v=s.current;if(!v)return;let L=b.clientX-v.x,T=b.clientY-v.y;(e.edge==="top"&&T>16||e.edge==="bottom"&&T<-16||e.edge==="right"&&L<-16||e.edge==="left"&&L>16)&&(s.current=null,r());}function k(){s.current=null,l(false);}function y(){s.current=null,l(false);}return reactDom.createPortal(jsxRuntime.jsxs("button",{type:"button",className:d,style:{zIndex:e.zIndex,opacity:n?0:1,pointerEvents:n?"none":"auto"},"aria-label":e.label,"aria-hidden":n?true:void 0,tabIndex:n?-1:0,onClick:r,onPointerDown:g,onPointerMove:f,onPointerUp:k,onPointerCancel:y,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"data-lumen-trigger":"",children:[jsxRuntime.jsx("span",{className:"lumen-notch-handle","aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"lumen-notch-label",children:[e.icon,e.label]})]}),a)}function et(e){return {kind:"notch",edge:e.edge??"top",label:e.label??"Feedback",icon:e.icon,zIndex:e.zIndex??2147483600}}function tt(e){return {kind:"floating",placement:e.placement??"br",offset:{x:e.offset?.x??16,y:e.offset?.y??16},safeArea:e.safeArea??true,avoid:e.avoid===false?false:e.avoid==null?"auto":Array.isArray(e.avoid)?e.avoid:[e.avoid],hideOnKeyboard:e.hideOnKeyboard??true,zIndex:e.zIndex??2147483600,label:e.label??"Feedback",icon:e.icon}}var fn={"--lumen-bg":"background","--lumen-fg":"foreground","--lumen-primary":"accent","--lumen-radius":"radius"};function nt(e){let t=react.useId();react.useEffect(()=>{if(typeof document>"u")return;let n=document.documentElement,r=`data-lumen-theme-${pn(t)}`,a={};if(e==="auto"||e==null)n.removeAttribute("data-lumen-theme");else if(e==="light"||e==="dark")a["data-lumen-theme"]=n.getAttribute("data-lumen-theme"),n.setAttribute("data-lumen-theme",e);else for(let[o,i]of Object.entries(fn)){let l=e[i];typeof l=="string"&&l.length>0&&(a[o]=n.style.getPropertyValue(o)||null,n.style.setProperty(o,l));}return n.setAttribute(r,""),()=>{n.removeAttribute(r);for(let[o,i]of Object.entries(a))o.startsWith("--")?i?n.style.setProperty(o,i):n.style.removeProperty(o):i==null?n.removeAttribute(o):n.setAttribute(o,i);}},[e,t]);}function pn(e){return e.replace(/[^a-zA-Z0-9]/g,"")}var rt=Symbol.for("lumen.history.patched"),fe="lumen:locationchange";function bn(){if(typeof window>"u")return;let e=window;if(e[rt])return;e[rt]=true;let t=()=>window.dispatchEvent(new Event(fe)),n=history.pushState;history.pushState=function(...a){let o=n.apply(this,a);return t(),o};let r=history.replaceState;history.replaceState=function(...a){let o=r.apply(this,a);return t(),o},window.addEventListener("popstate",t);}function ot(e){let[t,n]=react.useState(false);return react.useEffect(()=>{if(!e){n(false);return}if(typeof window>"u")return;bn();let r=()=>{try{n(!!e({pathname:window.location.pathname}));}catch{n(false);}};return r(),window.addEventListener(fe,r),window.addEventListener("popstate",r),()=>{window.removeEventListener(fe,r),window.removeEventListener("popstate",r);}},[e]),t}var vn=["wv","Capacitor","Cordova","Expo","FBAN","FBAV","Instagram","Line/","Twitter"];function at(){let[e,t]=react.useState(false);return react.useEffect(()=>{if(typeof window>"u")return;let n=window;if(n.ReactNativeWebView){t(true);return}let r=n.webkit;if(r&&r.messageHandlers){t(true);return}let a=navigator.userAgent||"";vn.some(o=>a.includes(o))&&t(true);},[]),e}var lt="lumen.config.v1.",kn=3600*1e3;function st(e,t){let[n,r]=react.useState(()=>({trigger:null,enabled:true,loading:true}));return react.useEffect(()=>{if(typeof window>"u")return;let a=Tn(e);a&&r({trigger:a.trigger,enabled:it(a.trigger),loading:false});let o=new AbortController,i=window.setTimeout(()=>o.abort(),5e3),l=`${t.replace(/\/$/,"")}/api/v1/sdk/config?apiKey=${encodeURIComponent(e)}`;return fetch(l,{method:"GET",mode:"cors",credentials:"omit",signal:o.signal}).then(async s=>{if(!s.ok)throw new Error(`HTTP ${s.status}`);let d=await s.json(),g=ut(d.trigger);if(!g)throw new Error("Malformed config response");Rn(e,g),r({trigger:g,enabled:it(g),loading:false});}).catch(()=>{r(s=>s.loading?{trigger:null,enabled:true,loading:false}:s);}).finally(()=>window.clearTimeout(i)),()=>{window.clearTimeout(i),o.abort();}},[e,t]),n}function it(e){return e.kind!=="headless"}var Cn=["br","bl","tr","tl"],Ln=["top","right","bottom","left"];function ut(e){if(!e||typeof e!="object")return null;let t=e;if(t.enabled===false)return {kind:"headless"};let n=typeof t.label=="string"?t.label:"Feedback";return t.kind==="floating"?{kind:"floating",placement:Cn.find(a=>a===t.placement)??"br",label:n}:t.kind==="notch"?{kind:"notch",edge:Ln.find(a=>a===t.edge)??"top",label:n}:null}function Tn(e){try{let t=window.localStorage.getItem(lt+e);if(!t)return null;let n=JSON.parse(t);if(typeof n?.fetchedAt!="number"||Date.now()-n.fetchedAt>kn)return null;let r=ut(n.trigger);return r?{fetchedAt:n.fetchedAt,trigger:r}:null}catch{return null}}function Rn(e,t){try{window.localStorage.setItem(lt+e,JSON.stringify({fetchedAt:Date.now(),trigger:t}));}catch{}}var dt="https://shakebugs.vercel.app";function Mn({apiKey:e,apiUrl:t,user:n,floatingButton:r=true,trigger:a,hideOn:o,theme:i,portalTarget:l,capture:s,children:d}){let[g,f]=react.useState(false),[k]=react.useState(false),[y]=react.useState(null),b=react.useMemo(()=>new Re({apiKey:e,apiUrl:t,user:n}),[e,t,n?.id,n?.email,n?.name]);react.useEffect(()=>{Ie({ignoreUrlPrefix:(t??dt).replace(/\/$/,"")});},[t]);let v=react.useCallback(()=>f(true),[]),L=react.useCallback(()=>f(false),[]),T=react.useCallback(b.submit.bind(b),[b]),S=at(),E=ot(o);nt(i);let A=st(a?"":e,t??dt),P=react.useMemo(()=>({client:b,user:n,isOpen:g,isSubmitting:k,error:y,open:v,close:L,openCapture:v,closeCapture:L,submit:T,isNativeShell:S,capture:s}),[b,n,g,k,y,v,L,T,S,s]),c=Sn({explicit:a,remote:A.trigger,remoteLoading:A.loading,floatingButton:r});return jsxRuntime.jsxs(ae.Provider,{value:P,children:[d,c?.kind==="floating"?jsxRuntime.jsx(Xe,{config:tt(c),portalTarget:l,hidden:E,onClick:v}):null,c?.kind==="notch"?jsxRuntime.jsx(Qe,{config:et(c),portalTarget:l,hidden:E,onClick:v}):null,c?.kind==="inline"?jsxRuntime.jsx(Ge,{mount:c.mount,label:c.label??"Feedback",icon:c.icon,onClick:v}):null,jsxRuntime.jsx(de,{})]})}function Sn(e){return e.explicit?e.explicit:e.floatingButton===false?{kind:"headless"}:e.remote?e.remote:e.remoteLoading?null:{kind:"floating"}}function Nn({variant:e="default",floating:t=false,className:n,children:r="Feedback",onClick:a,...o}){let{openCapture:i}=K(),l=["lumen-btn",e==="default"?"lumen-btn-primary":null,e==="ghost"?"lumen-btn-ghost":null,e==="outline"?"lumen-btn-outline":null,t?"lumen-btn-floating":null,n].filter(Boolean).join(" ");return jsxRuntime.jsx("button",{type:"button",className:l,onClick:s=>{a?.(s),s.defaultPrevented||i();},...o,children:r})}
4
- exports.CaptureModal=de;exports.FeedbackButton=Nn;exports.LumenProvider=Mn;exports.useLumen=K;//# sourceMappingURL=index.cjs.map
2
+ 'use strict';var react=require('react'),sonner=require('sonner'),jsxRuntime=require('react/jsx-runtime'),reactDom=require('react-dom');var T=class extends Error{constructor(e,t,r){super(e),this.code=t,this.status=r,this.name="LumenError";}code;status},Re=class extends T{constructor(){super("Origin not allowed. Add this origin in your Lumen project settings.","ORIGIN_NOT_ALLOWED",403),this.name="LumenOriginError";}},Te=class extends T{constructor(e){super(`Rate limited \u2014 retry after ${e}s.`,"RATE_LIMITED",429),this.retryAfter=e,this.name="LumenRateLimitError";}retryAfter},Q=class extends T{constructor(e){super(e,"NETWORK_ERROR"),this.name="LumenNetworkError";}},Lt="https://shakebugs.vercel.app",Rt="/api/v1/sdk/submit",Tt=new Set([502,503,504]),Ie=class{apiKey;apiUrl;user;amplitude;constructor(e){if(!e.apiKey||!e.apiKey.startsWith("lk_pub_"))throw new T("Invalid Lumen apiKey \u2014 expected a key starting with `lk_pub_`.","INVALID_API_KEY");this.apiKey=e.apiKey,this.apiUrl=(e.apiUrl??Lt).replace(/\/$/,""),this.user=e.user,this.amplitude=e.amplitude;}async submit(e,t={}){let r=`${this.apiUrl}${Rt}`,n=this.#e(e),a=null;for(let o=0;o<3;o++){o>0&&await At(2**o*250);try{return await this.#t(r,n,t)}catch(i){if(a=i,i instanceof Re||i instanceof Te||i instanceof T&&typeof i.status=="number"&&!Tt.has(i.status))throw i}}throw a instanceof Error?a:new Q("Submit failed after 3 attempts.")}#e(e){let t=new FormData;e.rawText&&t.append("rawText",e.rawText),e.category&&t.append("category",e.category),e.submitterEmail&&t.append("submitterEmail",e.submitterEmail),e.submitterFingerprint&&t.append("submitterFingerprint",e.submitterFingerprint);let r=e.context.amplitude??this.amplitude,n=r?{...e.context,amplitude:r}:e.context;return t.append("context",JSON.stringify(n)),e.screenshot&&t.append("screenshot",e.screenshot,Mt(e.screenshot)),e.audio&&t.append("audio",e.audio,"audio"),e.audioDurationMs!=null&&t.append("audioDurationMs",String(e.audioDurationMs)),e.video&&t.append("video",e.video,"video"),e.videoDurationMs!=null&&t.append("videoDurationMs",String(e.videoDurationMs)),t}#t(e,t,r){return new Promise((n,a)=>{let o=new XMLHttpRequest;o.open("POST",e,true),o.setRequestHeader("X-Lumen-Api-Key",this.apiKey),o.responseType="text";let{onUploadProgress:i,signal:s}=r;i&&o.upload.addEventListener("progress",c=>{c.lengthComputable&&c.total>0&&i(Math.min(1,c.loaded/c.total));});let l=()=>{o.abort(),a(new Q("Submit aborted."));};if(s){if(s.aborted){a(new Q("Submit aborted."));return}s.addEventListener("abort",l,{once:true});}o.addEventListener("load",()=>{if(s&&s.removeEventListener("abort",l),o.status===403){a(new Re);return}if(o.status===429){let c=Number(o.getResponseHeader("Retry-After"))||60;a(new Te(c));return}if(o.status<200||o.status>=300){a(new T(St(o.responseText)??`HTTP ${o.status}`,"HTTP_ERROR",o.status));return}try{let c=JSON.parse(o.responseText);n(c);}catch{a(new T("Malformed response from server.","BAD_RESPONSE"));}}),o.addEventListener("error",()=>{s&&s.removeEventListener("abort",l),a(new Q("Network error during submit."));}),o.send(t);})}};function Mt(e){return `screenshot.${e.type==="image/jpeg"?"jpg":e.type==="image/webp"?"webp":"png"}`}function At(e){return new Promise(t=>setTimeout(t,e))}function St(e){try{let t=JSON.parse(e);return t.error??t.message??null}catch{return e||null}}var Nt=2,q=8*1024*1024;async function ue(e={}){Fe();let t=e.mode??"auto";if(e.provider&&(t==="auto"||t==="custom"))try{return It(await e.provider(),e)}catch(r){if(t==="custom")throw r;e.onWarning?.(["Custom capture provider failed; falling back to browser DOM capture."]);}if(t==="manual")throw new T("Manual screenshot upload is required for this capture mode.","MANUAL_CAPTURE_REQUIRED");if(t==="true-screen")return Ae(e);if(t==="dom")return Me(e);if(t==="custom")throw new T("`capture.provider` is required when capture mode is `custom`.","CAPTURE_PROVIDER_REQUIRED");try{return await Me(e)}catch(r){if(He()){let n=await Ae(e);return n.warnings=K(["DOM screenshot failed; used browser screen permission fallback.",...n.warnings]),e.onWarning?.(n.warnings),n}throw r}}function De(e,t=[]){Fe();let r=ne();return {blob:e,method:"manual-upload",platform:"web",viewport:r,pixelRatio:window.devicePixelRatio??1,warnings:K(t)}}async function Me(e){let t=await Pt(),r=e.target??document.documentElement,n=ne(),a=Math.max(1,Math.min(window.devicePixelRatio??1,e.maxScale??Nt)),o=Dt(r),i=await t(r,{backgroundColor:null,logging:false,useCORS:true,allowTaint:false,width:n.width,height:n.height,windowWidth:n.width,windowHeight:n.height,scrollX:window.scrollX,scrollY:window.scrollY,x:window.scrollX,y:window.scrollY,scale:a,ignoreElements:l=>l instanceof HTMLElement&&(l.dataset.lumenCaptureIgnore==="true"||!!l.closest("[data-lumen-capture-ignore='true']"))}),s={blob:await Oe(i,o),method:"web-dom",platform:"web",viewport:n,pixelRatio:a,warnings:K(o)};return s.warnings.length>0&&e.onWarning?.(s.warnings),s}async function Pt(){let{default:e}=await import('html2canvas-pro');return e}async function Ae(e){if(!He())throw new T("Browser screen capture is unavailable in this environment.","DISPLAY_MEDIA_UNAVAILABLE");let t=await navigator.mediaDevices.getDisplayMedia({video:true,audio:false});try{let r=document.createElement("video");r.muted=!0,r.playsInline=!0,r.srcObject=t,await Ot(r);let n=document.createElement("canvas");n.width=r.videoWidth,n.height=r.videoHeight;let a=n.getContext("2d");if(!a)throw new T("Could not create a drawing context for screen capture.","CANVAS_CONTEXT_UNAVAILABLE");a.drawImage(r,0,0,n.width,n.height);let o=ne(),i=["Browser screen capture uses the window or tab selected by the user."],s={blob:await Oe(n,i),method:"web-display-media",platform:"web",viewport:o,pixelRatio:o.width>0?n.width/o.width:void 0,warnings:K(i)};return e.onWarning?.(s.warnings),s}finally{for(let r of t.getTracks())r.stop();}}function It(e,t){let r=ne(),n={...e,method:e.method??"custom",platform:e.platform??"custom",viewport:e.viewport??r,pixelRatio:e.pixelRatio??window.devicePixelRatio??1,warnings:K(e.warnings??[])};return n.warnings.length>0&&t.onWarning?.(n.warnings),n}function Dt(e){let t=new Set;e.querySelector("iframe")&&t.add("Embedded iframes may be blank or incomplete in DOM capture."),e.querySelector("video")&&t.add("Video frames may be blank or stale in DOM capture."),e.querySelector("canvas")&&t.add("Canvas/WebGL content may be blank if it is cross-origin tainted."),document.fonts&&document.fonts.status!=="loaded"&&t.add("Web fonts were still loading when the screenshot was captured.");let r=0;for(let n of Array.from(e.querySelectorAll("img"))){let a=n.currentSrc||n.src;if(a)try{new URL(a,window.location.href).origin!==window.location.origin&&!n.crossOrigin&&(r+=1);}catch{}}return r>0&&t.add(`${r} cross-origin image${r===1?"":"s"} without CORS may be omitted from the screenshot.`),Array.from(t)}async function Oe(e,t){let r=await Se(e,"image/png",.92);if(r.size<=q)return r;t.push("Screenshot exceeded the upload cap and was compressed.");let n=e,a=0;for(;r.size>q&&a<6;){let o=Math.max(.35,Math.min(.95,Math.sqrt(q/r.size)*.9)),i=document.createElement("canvas");i.width=Math.max(1,Math.round(n.width*o)),i.height=Math.max(1,Math.round(n.height*o));let s=i.getContext("2d");if(!s)return r;s.drawImage(n,0,0,i.width,i.height),n=i;for(let l of [.86,.74,.62,.5])if(r=await Se(n,"image/jpeg",l),r.size<=q)return r;if(a+=1,i.width<480||i.height<320)break}return r.size>q&&t.push("Screenshot remained large after compression; upload may be rejected."),r}function Se(e,t,r){return new Promise((n,a)=>{e.toBlob(o=>{if(!o){a(new T("Could not encode screenshot.","ENCODE_FAILED"));return}n(o);},t,r);})}function ne(){let e=window.visualViewport;return {width:Math.round(e?.width??window.innerWidth),height:Math.round(e?.height??window.innerHeight)}}function He(){return !!navigator.mediaDevices?.getDisplayMedia}async function Ot(e){await new Promise((n,a)=>{let o=()=>n(),i=()=>a(new T("Could not read screen capture video.","VIDEO_FAILED"));e.addEventListener("loadedmetadata",o,{once:true}),e.addEventListener("error",i,{once:true}),e.play().catch(i);});let t=performance.now(),r=1500;for(;e.videoWidth===0||e.videoHeight===0;){if(performance.now()-t>r)throw new T("Screen capture did not produce a frame in time.","VIDEO_TIMEOUT");await new Promise(n=>requestAnimationFrame(()=>n()));}}function Fe(){if(typeof window>"u"||typeof document>"u")throw new T("Screenshot capture can only run in the browser.","INVALID_ENV")}function K(e){return Array.from(new Set(e.filter(Boolean)))}var Be=[],ee=[],Ne=false,se=null;function _e(e={}){Ne||typeof window>"u"||(Ne=true,se=e.ignoreUrlPrefix??null,_t(),Ut(),Vt());}function Ht(){return {consoleLog:Be.slice(),networkLog:ee.slice()}}function te(e,t){e.push(t),e.length>200&&e.splice(0,e.length-200);}function Ft(e){let t=[];for(let n of e){if(typeof n=="string"){t.push(n);continue}if(n instanceof Error){t.push(`${n.name}: ${n.message}${n.stack?`
3
+ ${n.stack}`:""}`);continue}try{t.push(JSON.stringify(n,Bt));}catch{t.push(String(n));}}let r=t.join(" ");return r.length>4096?r.slice(0,4096)+"\u2026[truncated]":r}function Bt(e,t){return t instanceof Element?`[Element ${t.tagName}]`:typeof t=="function"?"[Function]":t}function _t(){let e=window.console;if(!e)return;let t=["log","info","warn","error","debug"];for(let r of t){let n=e[r]?.bind(e);n&&(e[r]=(...a)=>{try{te(Be,{level:r,ts:Date.now(),message:Ft(a)});}catch{}n(...a);});}}function Ue(e){return se?e.startsWith(se):false}function Ut(){let e=window.fetch;typeof e=="function"&&(window.fetch=async function(t,r){let n=typeof t=="string"?t:t instanceof URL?t.toString():t.url,a=(r?.method??(t instanceof Request?t.method:"GET")).toUpperCase();if(Ue(n))return e.call(window,t,r);let o=performance.now();try{let i=await e.call(window,t,r);return te(ee,{type:"fetch",method:a,url:le(n),status:i.status,ok:i.ok,durationMs:Math.round(performance.now()-o),ts:Date.now()}),i}catch(i){throw te(ee,{type:"fetch",method:a,url:le(n),status:0,ok:false,durationMs:Math.round(performance.now()-o),ts:Date.now(),error:i instanceof Error?i.message:"fetch error"}),i}});}function Vt(){let e=window.XMLHttpRequest;if(!e)return;let t=e.prototype.open,r=e.prototype.send;e.prototype.open=function(n,a,...o){return this.__lumen={method:String(n).toUpperCase(),url:typeof a=="string"?a:a.toString(),t:0},t.call(this,n,a,...o)},e.prototype.send=function(n){let a=this.__lumen;if(a&&!Ue(a.url)){a.t=performance.now();let o=()=>{try{te(ee,{type:"xhr",method:a.method,url:le(a.url),status:this.status,ok:this.status>=200&&this.status<400,durationMs:Math.round(performance.now()-a.t),ts:Date.now()});}catch{}this.removeEventListener("loadend",o);};this.addEventListener("loadend",o);}return r.call(this,n??null)};}function le(e){return e.length>512?e.slice(0,512)+"\u2026":e}function Ve(e){if(typeof window>"u")return {url:"",userAgent:"",viewport:{width:0,height:0},capture:Pe(e),consoleLog:[],networkLog:[]};let t=Ht();return {url:window.location.href,userAgent:navigator.userAgent,viewport:{width:window.innerWidth,height:window.innerHeight},capture:Pe(e),device:zt(),consoleLog:t.consoleLog,networkLog:t.networkLog}}function zt(){let e={};try{e.screen={width:window.screen?.width??0,height:window.screen?.height??0},e.pixelRatio=window.devicePixelRatio??1,e.language=navigator.language,e.languages=Array.from(navigator.languages??[]),e.timezone=Intl.DateTimeFormat().resolvedOptions().timeZone,e.colorScheme=window.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light",e.referrer=document.referrer||void 0,e.title=document.title||void 0,e.online=navigator.onLine,performance.getEntriesByType("navigation")[0]&&(e.uptimeMs=Math.round(performance.now()));}catch{}return e}function Pe(e){if(e)return {method:e.method,platform:e.platform,viewport:e.viewport,pixelRatio:e.pixelRatio,warnings:e.warnings}}async function ze(e=60){if(typeof window>"u"||!navigator.mediaDevices)throw new T("Audio recording requires a browser with MediaDevices.","INVALID_ENV");let t;try{t=await navigator.mediaDevices.getUserMedia({audio:!0});}catch{throw new T("Microphone access denied or unavailable.","MIC_DENIED")}let r=["audio/webm;codecs=opus","audio/webm","audio/mp4","audio/ogg;codecs=opus"].find(l=>MediaRecorder.isTypeSupported(l))??"",n=new MediaRecorder(t,r?{mimeType:r}:void 0),a=[],o=performance.now(),i=null;n.addEventListener("dataavailable",l=>{l.data&&l.data.size>0&&a.push(l.data);}),n.start(),i=window.setTimeout(()=>{n.state!=="inactive"&&n.stop();},e*1e3);function s(){i!==null&&window.clearTimeout(i),i=null;for(let l of t.getTracks())l.stop();}return {stream:t,cancel(){try{n.state!=="inactive"&&n.stop();}catch{}s();},stop(){return new Promise((l,c)=>{if(n.state==="inactive"){s(),c(new T("Recorder already stopped.","RECORDER_STOPPED"));return}n.addEventListener("stop",()=>{let f=performance.now()-o,g=n.mimeType||r||"audio/webm",v=new Blob(a,{type:g});s(),l({blob:v,durationMs:f,mimeType:g});},{once:true}),n.stop();})}}}async function We(e=60){if(typeof window>"u"||!navigator.mediaDevices||typeof navigator.mediaDevices.getDisplayMedia!="function")throw new T("Screen recording requires a browser with getDisplayMedia.","INVALID_ENV");let t;try{t=await navigator.mediaDevices.getDisplayMedia({video:!0,audio:!0});}catch{throw new T("Screen capture was denied or cancelled.","SCREEN_DENIED")}let r=["video/webm;codecs=vp9,opus","video/webm;codecs=vp8,opus","video/webm","video/mp4"].find(c=>MediaRecorder.isTypeSupported(c))??"",n=new MediaRecorder(t,r?{mimeType:r}:void 0),a=[],o=performance.now(),i=null;n.addEventListener("dataavailable",c=>{c.data&&c.data.size>0&&a.push(c.data);}),n.start(),i=window.setTimeout(()=>{n.state!=="inactive"&&n.stop();},e*1e3);let s=t.getVideoTracks()[0];s&&s.addEventListener("ended",()=>{n.state!=="inactive"&&n.stop();});function l(){i!==null&&window.clearTimeout(i),i=null;for(let c of t.getTracks())c.stop();}return {stream:t,cancel(){try{n.state!=="inactive"&&n.stop();}catch{}l();},stop(){return new Promise((c,f)=>{if(n.state==="inactive"){l(),f(new T("Recorder already stopped.","RECORDER_STOPPED"));return}n.addEventListener("stop",()=>{let g=performance.now()-o,v=n.mimeType||r||"video/webm",w=new Blob(a,{type:v});l(),c({blob:w,durationMs:g,mimeType:v});},{once:true}),n.stop();})}}}var ce=react.createContext(null);function j(){let e=react.useContext(ce);if(!e)throw new Error("useLumen() must be used inside <LumenProvider>.");return e}function Ke({screenshot:e,tool:t,color:r="rgb(239, 68, 68)",strokeWidth:n=4,onDrawingChange:a,ref:o}){let i=react.useRef(null),s=react.useRef(null),l=react.useRef(null),[c,f]=react.useState(null),[g,v]=react.useState([]),w=react.useRef(null),E=react.useRef(false),x=react.useRef(0),L=react.useRef(false);react.useEffect(()=>{let d=false,p=null;return (async()=>{try{let b=await createImageBitmap(e);if(d){b.close?.();return}p=b,f(b);}catch{}})(),()=>{d=true,p?.close?.();}},[e]),react.useEffect(()=>{if(!c)return;let d=i.current,p=s.current;if(!d||!p)return;d.width=c.width,d.height=c.height,p.width=c.width,p.height=c.height;let b=d.getContext("2d");b&&(b.imageSmoothingEnabled=false,b.drawImage(c,0,0));},[c]),react.useEffect(()=>{let d=s.current;d&&re(d,g,w.current);},[g]),react.useImperativeHandle(o,()=>({hasAnnotations:()=>g.length>0,reset:()=>v([]),undo:()=>v(d=>d.length===0?d:d.slice(0,-1)),async flatten(){let d=w.current,p=d?[...g,d]:g;if(p.length===0||!c)return e;let b=document.createElement("canvas");b.width=c.width,b.height=c.height;let k=b.getContext("2d");if(!k)return e;k.imageSmoothingEnabled=false,k.drawImage(c,0,0);for(let N of p)me(k,N);return await new Promise(N=>{b.toBlob(I=>{N(I??e);},"image/jpeg",.85);})}}),[g,c,e]);function R(d){let p=s.current;if(!p)return {x:0,y:0};let b=p.getBoundingClientRect(),k=p.width/Math.max(b.width,1),N=p.height/Math.max(b.height,1);return {x:(d.clientX-b.left)*k,y:(d.clientY-b.top)*N}}function A(){L.current||(L.current=true,requestAnimationFrame(()=>{L.current=false;let d=s.current;d&&re(d,g,w.current);}));}function C(d){if(d.button!==void 0&&d.button!==0)return;try{d.currentTarget.setPointerCapture(d.pointerId);}catch{}E.current=true,a?.(true);let p=R(d);t==="arrow"?w.current={kind:"arrow",from:p,to:p,color:r,width:n}:t==="rect"?w.current={kind:"rect",from:p,to:p,color:r,width:n}:w.current={kind:"freehand",points:[p],color:r,width:n},x.current=performance.now(),A();}function S(d){if(!E.current||!w.current)return;let p=R(d),b=w.current;if(b.kind==="arrow"||b.kind==="rect")b.to=p;else {let k=b.points[b.points.length-1],N=k?(k.x-p.x)**2+(k.y-p.y)**2:1/0,I=performance.now(),V=I-x.current;(N>16||V>16)&&(b.points.push(p),x.current=I);}A();}function M(){if(!E.current)return;E.current=false,a?.(false);let d=w.current;if(w.current=null,!!d){if(d.kind==="arrow"||d.kind==="rect"){let p=d.to.x-d.from.x,b=d.to.y-d.from.y;if(p*p+b*b<16){let k=s.current;k&&re(k,g,null);return}}else if(d.points.length<2){let p=s.current;p&&re(p,g,null);return}v(p=>[...p,d].slice(-50));}}return jsxRuntime.jsxs("div",{ref:l,className:"lumen-annotate-frame",children:[jsxRuntime.jsx("canvas",{ref:i}),jsxRuntime.jsx("canvas",{ref:s,className:"lumen-annotate-overlay",onPointerDown:C,onPointerMove:S,onPointerUp:M,onPointerCancel:M})]})}function re(e,t,r){let n=e.getContext("2d");if(n){n.clearRect(0,0,e.width,e.height);for(let a of t)me(n,a);r&&me(n,r);}}function me(e,t){if(e.save(),e.strokeStyle=t.color,e.fillStyle=t.color,e.lineWidth=t.width,e.lineCap="round",e.lineJoin="round",t.kind==="rect"){let r=Math.min(t.from.x,t.to.x),n=Math.min(t.from.y,t.to.y),a=Math.abs(t.to.x-t.from.x),o=Math.abs(t.to.y-t.from.y);e.strokeRect(r,n,a,o);}else if(t.kind==="freehand")jt(e,t.points);else {let{from:r,to:n,width:a}=t;e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(n.x,n.y),e.stroke();let o=Math.atan2(n.y-r.y,n.x-r.x),i=Math.max(12,a*4);e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(n.x-i*Math.cos(o-Math.PI/7),n.y-i*Math.sin(o-Math.PI/7)),e.lineTo(n.x-i*Math.cos(o+Math.PI/7),n.y-i*Math.sin(o+Math.PI/7)),e.closePath(),e.fill();}e.restore();}function jt(e,t){if(t.length===0)return;e.beginPath();let r=t[0];if(!r)return;if(e.moveTo(r.x,r.y),t.length===1){e.arc(r.x,r.y,e.lineWidth/2,0,Math.PI*2),e.fill();return}if(t.length===2){let a=t[1];e.lineTo(a.x,a.y),e.stroke();return}for(let a=1;a<t.length-1;a++){let o=t[a],i=t[a+1],s=(o.x+i.x)/2,l=(o.y+i.y)/2;e.quadraticCurveTo(o.x,o.y,s,l);}let n=t[t.length-1];e.lineTo(n.x,n.y),e.stroke();}var pe=60,Xt=60,je=[{label:"Red",value:"rgb(239, 68, 68)"},{label:"Amber",value:"rgb(245, 158, 11)"},{label:"Blue",value:"rgb(59, 130, 246)"},{label:"Green",value:"rgb(34, 197, 94)"},{label:"Neutral",value:"rgb(244, 244, 245)"}],Ye=[{label:"Small",value:2,dot:6},{label:"Medium",value:4,dot:9},{label:"Large",value:6,dot:12}],Gt=[{value:"bug",label:"Bug"},{value:"feature",label:"Idea"},{value:"other",label:"Other"}];function ge(){let{client:e,isOpen:t,closeCapture:r,user:n,capture:a}=j(),[o,i]=react.useState({kind:"idle"}),[s,l]=react.useState("arrow"),[c,f]=react.useState(je[0].value),[g,v]=react.useState(Ye[1].value),[w,E]=react.useState(""),[x,L]=react.useState("bug"),[R,A]=react.useState(n?.email??""),[C,S]=react.useState(null),[M,d]=react.useState(null),[p,b]=react.useState(0),[k,N]=react.useState(null),[I,V]=react.useState(null),[W,X]=react.useState(false),G=react.useRef(null),ae=react.useRef(null),ve=react.useRef(null),$=react.useRef(false);if(react.useEffect(()=>{if(t)return $.current=false,i({kind:"capturing"}),E(""),d(null),b(0),V(null),N(u=>(u?.cancel(),null)),(async()=>{if(a?.mode==="manual"){$.current||i({kind:"manual"});return}try{let u=await ue({...a,target:a?.target??document.documentElement});if($.current)return;Le(u),i({kind:"ready",capture:u});}catch(u){if($.current)return;i({kind:"manual",error:u instanceof Error?u.message:"Automatic screenshot capture was unavailable."});}})(),()=>{$.current=true;}},[t,a]),react.useEffect(()=>{if(!t)return;ve.current=document.activeElement??null;let u=document.documentElement,h=u.style.overflow,O=u.style.paddingRight,D=window.innerWidth-u.clientWidth;u.style.overflow="hidden",D>0&&(u.style.paddingRight=`${D}px`);let H=false,F=()=>{if(!H){H=true,u.style.overflow=h,u.style.paddingRight=O;try{ve.current?.focus?.();}catch{}}};return window.addEventListener("pagehide",F),()=>{window.removeEventListener("pagehide",F),F();}},[t]),react.useEffect(()=>{if(!t)return;function u(h){if(h.key==="Escape"){h.preventDefault(),r();return}if(h.key!=="Tab")return;let O=ae.current;if(!O)return;let D=Xe(O);if(D.length===0)return;let H=D[0],F=D[D.length-1],ie=document.activeElement;h.shiftKey&&(ie===H||!O.contains(ie))?(h.preventDefault(),F.focus()):!h.shiftKey&&ie===F&&(h.preventDefault(),H.focus());}return document.addEventListener("keydown",u),()=>document.removeEventListener("keydown",u)},[t,r]),react.useEffect(()=>{if(!t||o.kind!=="ready"&&o.kind!=="manual")return;let u=ae.current;if(!u)return;let h=Xe(u);(u.querySelector("textarea.lumen-input")??h[0])?.focus();},[t,o.kind]),react.useEffect(()=>{if(!t||o.kind!=="manual")return;function u(h){let H=Array.from(h.clipboardData?.items??[]).find(F=>F.type.startsWith("image/"))?.getAsFile();H&&(h.preventDefault(),ke(H));}return window.addEventListener("paste",u),()=>window.removeEventListener("paste",u)},[t,o.kind]),react.useEffect(()=>{if(!C)return;let u=Date.now(),h=window.setInterval(()=>{let O=Math.floor((Date.now()-u)/1e3);b(O),O>=pe&&Ee();},250);return ()=>window.clearInterval(h)},[C]),!t)return null;async function yt(){try{let u=await ze(pe);S(u);}catch(u){sonner.toast.error(u instanceof Error?u.message:"Microphone unavailable");}}async function Ee(){if(C)try{let u=await C.stop();d({blob:u.blob,durationMs:u.durationMs});}catch(u){sonner.toast.error(u instanceof Error?u.message:"Could not stop recording");}finally{S(null);}}function vt(){C?.cancel(),S(null),d(null),b(0);}async function Et(){try{let u=await We(Xt);N(u),u.stream.getVideoTracks()[0]?.addEventListener("ended",()=>{xe();});}catch(u){sonner.toast.error(u instanceof Error?u.message:"Screen capture unavailable");}}async function xe(){if(!k)return;let u=k;N(null);try{let h=await u.stop();V({blob:h.blob,durationMs:h.durationMs});}catch(h){sonner.toast.error(h instanceof Error?h.message:"Could not stop recording");}}function Ce(){k?.cancel(),N(null),V(null);}function ke(u){if(!u.type.startsWith("image/")){sonner.toast.error("Choose a PNG, JPEG, or WebP screenshot.");return}let h=De(u,["Manual screenshot upload used."]);i({kind:"ready",capture:h});}async function xt(){i({kind:"capturing"});try{let u=await ue({...a,mode:"true-screen",target:a?.target??document.documentElement});Le(u),i({kind:"ready",capture:u});}catch(u){i({kind:"manual",error:u instanceof Error?u.message:"Browser screen capture was unavailable."});}}function Le(u){u.warnings.length!==0&&sonner.toast.warning("Screenshot captured, but iframe, video, canvas, or cross-origin content may be incomplete.");}async function Ct(){if(o.kind!=="ready")return;let u=w.trim();if(!M&&u.length===0){sonner.toast.error("Add a voice note or write a description.");return}let{capture:h}=o,O=h.blob;i({kind:"uploading",capture:h,progress:0});try{let D=await G.current?.flatten()??O,H=await e.submit({rawText:u.length>0?u:void 0,category:x,submitterEmail:R.trim()||void 0,screenshot:D,audio:M?.blob,audioDurationMs:M?.durationMs,video:I?.blob,videoDurationMs:I?.durationMs,context:Ve(h)},{onUploadProgress:F=>{i({kind:"uploading",capture:h,progress:Math.min(.95,F)});}});i({kind:"uploading",capture:h,progress:1}),sonner.toast.success("Feedback sent \u2014 thank you."),H.id,r();}catch(D){sonner.toast.error(D instanceof Error?D.message:"Could not submit feedback"),i({kind:"ready",capture:h});}}let J=o.kind==="uploading"?Math.round(o.progress*100):0,Z=o.kind==="uploading";function kt(u){u.target===u.currentTarget&&r();}return jsxRuntime.jsx("div",{role:"dialog","aria-modal":"true","aria-label":"Send feedback",className:"lumen-modal-backdrop","data-lumen-capture-ignore":"true",onMouseDown:kt,children:jsxRuntime.jsxs("div",{ref:ae,className:"lumen-modal","data-lumen-drawing":W?"true":void 0,children:[jsxRuntime.jsx(Jt,{onDismiss:r}),jsxRuntime.jsxs("header",{className:"lumen-modal-header",children:[jsxRuntime.jsxs("h2",{className:"lumen-modal-title",children:[jsxRuntime.jsx("span",{className:"lumen-modal-title-dot","aria-hidden":"true"}),"Send feedback"]}),jsxRuntime.jsx("button",{type:"button",onClick:r,className:"lumen-icon-btn","aria-label":"Close",children:"\xD7"})]}),jsxRuntime.jsxs("div",{className:"lumen-modal-body",children:[o.kind==="capturing"?jsxRuntime.jsxs("p",{className:"lumen-status",children:[jsxRuntime.jsx("span",{className:"lumen-spinner","aria-hidden":"true"}),"Capturing screenshot\u2026"]}):null,o.kind==="manual"?jsxRuntime.jsxs("div",{className:"lumen-manual-capture",children:[jsxRuntime.jsx("p",{className:"lumen-status",children:o.error?"Automatic screenshot capture was unavailable. Upload or paste a screenshot to continue.":"Upload or paste a screenshot to continue."}),jsxRuntime.jsxs("label",{className:"lumen-manual-drop",children:[jsxRuntime.jsx("span",{children:"Choose or paste a screenshot"}),jsxRuntime.jsx("input",{type:"file",accept:"image/png,image/jpeg,image/webp",onChange:u=>{let h=u.currentTarget.files?.[0];h&&ke(h),u.currentTarget.value="";}})]})]}):null,o.kind==="ready"||o.kind==="uploading"?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{className:"lumen-toolbar",children:[jsxRuntime.jsxs("div",{className:"lumen-segmented",role:"group","aria-label":"Annotation tool",children:[jsxRuntime.jsx(fe,{label:"Arrow",active:s==="arrow",onClick:()=>l("arrow")}),jsxRuntime.jsx(fe,{label:"Box",active:s==="rect",onClick:()=>l("rect")}),jsxRuntime.jsx(fe,{label:"Draw",active:s==="freehand",onClick:()=>l("freehand")})]}),jsxRuntime.jsx("span",{className:"lumen-toolbar-sep"}),jsxRuntime.jsx("div",{className:"lumen-swatches",role:"group","aria-label":"Color",children:je.map(u=>jsxRuntime.jsx("button",{type:"button",className:"lumen-swatch",style:{background:u.value},"aria-label":u.label,"aria-pressed":c===u.value,onClick:()=>f(u.value)},u.value))}),jsxRuntime.jsx("div",{className:"lumen-stroke-sizes",role:"group","aria-label":"Stroke width",children:Ye.map(u=>jsxRuntime.jsx("button",{type:"button",className:"lumen-stroke-size","aria-label":u.label,"aria-pressed":g===u.value,onClick:()=>v(u.value),children:jsxRuntime.jsx("span",{className:"lumen-stroke-size-dot",style:{width:u.dot,height:u.dot}})},u.value))}),jsxRuntime.jsx("span",{className:"lumen-toolbar-spacer"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:()=>G.current?.undo(),title:"Undo",children:"Undo"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:()=>G.current?.reset(),title:"Clear all annotations",children:"Clear"})]}),jsxRuntime.jsx("div",{className:"lumen-annotate",children:jsxRuntime.jsx(Ke,{ref:G,screenshot:o.capture.blob,tool:s,color:c,strokeWidth:g,onDrawingChange:X})}),jsxRuntime.jsxs("div",{className:"lumen-form",children:[jsxRuntime.jsxs("div",{className:"lumen-label",children:[jsxRuntime.jsx("span",{children:"Category"}),jsxRuntime.jsx("div",{className:"lumen-category",role:"group","aria-label":"Feedback category",children:Gt.map(u=>jsxRuntime.jsx("button",{type:"button",className:"lumen-category-opt","aria-pressed":x===u.value,onClick:()=>L(u.value),children:u.label},u.value))})]}),jsxRuntime.jsxs("label",{className:"lumen-label",children:[jsxRuntime.jsxs("span",{children:["Description ",M?"(optional with audio)":""]}),jsxRuntime.jsx("textarea",{value:w,onChange:u=>E(u.target.value),rows:3,placeholder:"What happened?",className:"lumen-input"})]}),jsxRuntime.jsxs("label",{className:"lumen-label",children:[jsxRuntime.jsx("span",{children:"Your email (optional)"}),jsxRuntime.jsx("input",{type:"email",value:R,onChange:u=>A(u.target.value),placeholder:"you@example.com",className:"lumen-input"})]}),jsxRuntime.jsxs("div",{className:"lumen-audio-row",children:[!C&&!M?jsxRuntime.jsx("button",{type:"button",onClick:yt,className:"lumen-btn-ghost",children:"Record voice note"}):null,C?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{className:"lumen-recording",children:[jsxRuntime.jsx("span",{className:"lumen-rec-dot","aria-hidden":"true"}),jsxRuntime.jsx(Zt,{stream:C.stream}),jsxRuntime.jsxs("span",{className:"lumen-rec-time",children:[p,"s / ",pe,"s"]})]}),jsxRuntime.jsx("button",{type:"button",onClick:Ee,className:"lumen-btn-ghost",children:"Stop"}),jsxRuntime.jsx("button",{type:"button",onClick:vt,className:"lumen-btn-ghost",children:"Cancel"})]}):null,M&&!C?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(en,{blob:M.blob,durationMs:M.durationMs}),jsxRuntime.jsx("button",{type:"button",onClick:()=>d(null),className:"lumen-btn-ghost",children:"Remove"})]}):null,!k&&!I?jsxRuntime.jsx("button",{type:"button",onClick:Et,className:"lumen-btn-ghost",title:"Record your screen",children:"Record screen"}):null,k?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{className:"lumen-recording",children:[jsxRuntime.jsx("span",{className:"lumen-rec-dot","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:"lumen-rec-time",children:"Recording\u2026"})]}),jsxRuntime.jsx("button",{type:"button",onClick:xe,className:"lumen-btn-ghost",children:"Stop"}),jsxRuntime.jsx("button",{type:"button",onClick:Ce,className:"lumen-btn-ghost",children:"Cancel"})]}):null,I&&!k?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(tn,{blob:I.blob,durationMs:I.durationMs}),jsxRuntime.jsx("button",{type:"button",onClick:Ce,className:"lumen-btn-ghost",children:"Remove"})]}):null,jsxRuntime.jsx("span",{className:"lumen-toolbar-spacer"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:xt,title:"Use the browser's screen capture",children:"Screen capture"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:()=>i({kind:"manual"}),title:"Upload a screenshot file",children:"Upload"})]})]})]}):null]}),o.kind==="ready"||o.kind==="uploading"?jsxRuntime.jsxs("footer",{className:"lumen-modal-footer",children:[Z?jsxRuntime.jsx("div",{className:"lumen-progress",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":J,children:jsxRuntime.jsx("div",{className:"lumen-progress-fill",style:{width:`${J}%`}})}):null,jsxRuntime.jsxs("div",{className:"lumen-modal-actions",children:[jsxRuntime.jsx("button",{type:"button",onClick:r,className:"lumen-btn-ghost",disabled:Z,children:"Cancel"}),jsxRuntime.jsx("button",{type:"button",onClick:Ct,className:"lumen-btn-primary",disabled:Z,children:Z?J<95?`Uploading ${J}%\u2026`:"Almost done\u2026":"Send feedback"})]})]}):null]})})}function fe({label:e,active:t,onClick:r}){return jsxRuntime.jsx("button",{type:"button",onClick:r,className:"lumen-tool","aria-pressed":t,children:e})}function Jt({onDismiss:e}){let t=react.useRef(null),r=react.useRef(0),n=react.useRef(null);function a(s){s.currentTarget.setPointerCapture(s.pointerId),t.current=s.clientY,r.current=performance.now(),n.current=s.currentTarget.parentElement;}function o(s){if(t.current==null||!n.current)return;let l=Math.max(0,s.clientY-t.current);n.current.style.transform=`translateY(${l}px)`;}function i(s){if(t.current==null||!n.current)return;let l=Math.max(0,s.clientY-t.current),c=Math.max(1,performance.now()-r.current),f=l/c;n.current.style.transform="",n.current.style.transition="",t.current=null,(l>80||f>.6)&&e();}return jsxRuntime.jsx("div",{className:"lumen-modal-grabber","aria-hidden":"true",onPointerDown:a,onPointerMove:o,onPointerUp:i,onPointerCancel:i})}function Zt({stream:e}){let t=react.useRef(null);return react.useEffect(()=>{let r=t.current;if(!r)return;let n=Math.min(window.devicePixelRatio||1,2),a=r.clientWidth||88,o=r.clientHeight||22;r.width=Math.round(a*n),r.height=Math.round(o*n);let i=r.getContext("2d");if(!i)return;i.scale(n,n);let s=window.AudioContext??window.webkitAudioContext;if(!s)return;let l=new s,c=l.createMediaStreamSource(e),f=l.createAnalyser();f.fftSize=1024,f.smoothingTimeConstant=.6,c.connect(f);let g=new Uint8Array(f.fftSize),v=18,w=3,E=3,x=Math.max(2,(a-w*(v-1))/v),L=Math.min(x/2,3),R=new Array(v).fill(0),A=0,C=false;function S(){if(C)return;f.getByteTimeDomainData(g);let M=Math.floor(g.length/v);i.clearRect(0,0,a,o),i.fillStyle=nn("--lumen-danger")||"rgb(239,68,68)";for(let d=0;d<v;d++){let p=0;for(let W=0;W<M;W++){let X=Math.abs((g[d*M+W]??128)-128);X>p&&(p=X);}let b=Math.min(1,p/128*1.8),k=R[d]??0;R[d]=b>k?b:k+(b-k)*.35;let N=Math.max(E,R[d]*o),I=d*(x+w),V=(o-N)/2;Qt(i,I,V,x,N,L),i.fill();}A=requestAnimationFrame(S);}return A=requestAnimationFrame(S),()=>{C=true,cancelAnimationFrame(A);try{c.disconnect();}catch{}l.close();}},[e]),jsxRuntime.jsx("canvas",{ref:t,className:"lumen-waveform","aria-hidden":"true"})}function Qt(e,t,r,n,a,o){let i=Math.min(o,n/2,a/2);e.beginPath();let s=e;if(typeof s.roundRect=="function"){s.roundRect(t,r,n,a,i);return}e.moveTo(t+i,r),e.arcTo(t+n,r,t+n,r+a,i),e.arcTo(t+n,r+a,t,r+a,i),e.arcTo(t,r+a,t,r,i),e.arcTo(t,r,t+n,r,i),e.closePath();}function en({blob:e,durationMs:t}){let[r,n]=react.useState("");return react.useEffect(()=>{let a=URL.createObjectURL(e);return n(a),()=>{URL.revokeObjectURL(a);}},[e]),jsxRuntime.jsxs("div",{className:"lumen-audio-preview",children:[jsxRuntime.jsx("audio",{controls:true,preload:"metadata",src:r,className:"lumen-audio-el"}),jsxRuntime.jsxs("span",{className:"lumen-audio-meta",children:[Math.round(t/1e3),"s"]})]})}function tn({blob:e,durationMs:t}){let[r,n]=react.useState("");return react.useEffect(()=>{let a=URL.createObjectURL(e);return n(a),()=>{URL.revokeObjectURL(a);}},[e]),jsxRuntime.jsxs("div",{className:"lumen-audio-preview",children:[jsxRuntime.jsx("video",{controls:true,preload:"metadata",src:r,className:"lumen-video-el",style:{maxHeight:72,borderRadius:6}}),jsxRuntime.jsxs("span",{className:"lumen-audio-meta",children:[Math.round(t/1e3),"s"]})]})}function nn(e){return typeof window>"u"?"":getComputedStyle(document.documentElement).getPropertyValue(e).trim()}var rn='a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';function Xe(e){return Array.from(e.querySelectorAll(rn)).filter(t=>!t.hasAttribute("disabled")&&t.offsetParent!==null)}function Ge(){if(typeof document>"u"||typeof window>"u")return 0;let e=window.innerWidth,t=window.innerHeight;if(e===0||t===0)return 0;let r=t-4,n=[Math.round(e*.1),Math.round(e*.5),Math.round(e*.9)],a=new Set,o=0;for(let i of n){let s=document.elementsFromPoint(i,r);for(let l of s){if(a.has(l))continue;a.add(l);let c=window.getComputedStyle(l);if(c.position!=="fixed"&&c.position!=="sticky")continue;let f=l.getBoundingClientRect();f.bottom<t-8||f.bottom>t+8||f.width<e*.6||f.height>o&&(o=f.height);}}return o}function be(e,t){if(typeof document>"u"||typeof window>"u")return 0;let r=window.innerWidth,n=window.innerHeight,a=0;for(let o of e){let i;try{i=document.querySelectorAll(o);}catch{continue}for(let s of Array.from(i)){let l=s.getBoundingClientRect();if(l.height===0||l.width===0)continue;let c=0;switch(t){case "bottom":if(l.bottom<n-8)break;c=Math.max(0,n-l.top);break;case "top":if(l.top>8)break;c=Math.max(0,l.bottom);break;case "left":if(l.left>8)break;c=Math.max(0,l.right);break;case "right":if(l.right<r-8)break;c=Math.max(0,r-l.left);break}c>a&&(a=c);}}return a}function Je(e){let[t,r]=react.useState(()=>({bottom:e.offset.y,right:e.offset.x,left:e.offset.x,top:e.offset.y})),n=react.useRef(t),a=ln(e.avoid),o=e.placement,i=e.offset.x,s=e.offset.y;return react.useEffect(()=>{if(typeof window>"u")return;let l=0,c=false,f=()=>{if(l=0,c)return;let x=o[0]==="b"?"bottom":"top",L=o[1]==="r"?"right":"left",R=0,A=0;e.avoid==="auto"&&x==="bottom"?R=Ge():Array.isArray(e.avoid)&&(R=be(e.avoid,x),A=be(e.avoid,L));let C={bottom:x==="bottom"?s+R:0,top:x==="top"?s+R:0,right:L==="right"?i+A:0,left:L==="left"?i+A:0},S=n.current;(C.bottom!==S.bottom||C.top!==S.top||C.right!==S.right||C.left!==S.left)&&(n.current=C,r(C));},g=()=>{l||(l=window.requestAnimationFrame(f));};g();let v=typeof ResizeObserver<"u"?new ResizeObserver(g):null;v?.observe(document.documentElement);let w=typeof MutationObserver<"u"?new MutationObserver(g):null;w?.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:["class","style","hidden"]}),window.addEventListener("resize",g);let E=window.visualViewport;return E?.addEventListener("resize",g),E?.addEventListener("scroll",g),()=>{c=true,l&&window.cancelAnimationFrame(l),v?.disconnect(),w?.disconnect(),window.removeEventListener("resize",g),E?.removeEventListener("resize",g),E?.removeEventListener("scroll",g);}},[o,i,s,a]),t}function ln(e){return e===false?"false":e==="auto"?"auto":e.join("|")}function Ze(e){let[t,r]=react.useState(false);return react.useEffect(()=>{if(!e){r(false);return}if(typeof window>"u")return;let n=window.visualViewport;if(!n||typeof window.matchMedia!="function"||!window.matchMedia("(pointer: coarse)").matches)return;let a=100,o=0,i=()=>{o=0;let l=window.innerHeight-n.height;r(l>a);},s=()=>{o||(o=window.requestAnimationFrame(i));};return s(),n.addEventListener("resize",s),n.addEventListener("scroll",s),()=>{o&&window.cancelAnimationFrame(o),n.removeEventListener("resize",s),n.removeEventListener("scroll",s);}},[e]),t}function nt({config:e,portalTarget:t,hidden:r,onClick:n}){let[a,o]=react.useState(null),i=react.useRef(null),s=Je(e),l=Ze(e.hideOnKeyboard);if(react.useEffect(()=>{typeof document>"u"||o(t??document.body);},[t]),pn(i,!r&&!l),!a)return null;let c=e.placement,f=c[0]==="b"?"bottom":"top",g=c[1]==="r"?"right":"left",v=f==="bottom"?s.bottom:s.top,w=g==="right"?s.right:s.left,E={position:"fixed",[f]:e.safeArea?`calc(${v}px + env(safe-area-inset-${f}, 0px))`:`${v}px`,[g]:e.safeArea?`calc(${w}px + env(safe-area-inset-${g}, 0px))`:`${w}px`,zIndex:e.zIndex,opacity:r||l?0:1,pointerEvents:r||l?"none":"auto",transition:"opacity 160ms ease"};return reactDom.createPortal(jsxRuntime.jsxs("button",{ref:i,type:"button",className:"lumen-btn lumen-btn-primary lumen-btn-floating",style:E,"aria-label":e.label,"aria-hidden":r||l?true:void 0,tabIndex:r||l?-1:0,onClick:n,"data-lumen-trigger":"","data-lumen-capture-ignore":"true",children:[e.icon,jsxRuntime.jsx("span",{children:e.label})]}),a)}function pn(e,t){let r=react.useRef(false);react.useEffect(()=>{if(process.env.NODE_ENV==="production"||!t||r.current||typeof window>"u")return;let n=window.setTimeout(()=>{let a=e.current;if(!a)return;let o=a.getBoundingClientRect();if(o.width===0||o.height===0)return;let i=o.left+o.width/2,s=o.top+o.height/2,l=document.elementsFromPoint(i,s),c=Qe(window.getComputedStyle(a).zIndex);for(let f of l){if(f===a||a.contains(f))continue;if(Qe(window.getComputedStyle(f).zIndex)>c){r.current=true,console.warn("[lumen] trigger is occluded by",f);break}}},250);return ()=>window.clearTimeout(n)},[t,e]);}function Qe(e){let t=parseInt(e,10);return Number.isNaN(t)?0:t}function rt({mount:e,label:t,icon:r,onClick:n}){let[a,o]=react.useState(null);return react.useEffect(()=>{if(typeof document>"u")return;let i=e instanceof HTMLElement?e:e.current??null;o(i);},[e]),a?reactDom.createPortal(jsxRuntime.jsxs("button",{type:"button",className:"lumen-btn lumen-btn-primary",onClick:n,"aria-label":t,"data-lumen-trigger":"","data-lumen-capture-ignore":"true",children:[r,jsxRuntime.jsx("span",{children:t})]}),a):null}function it({config:e,portalTarget:t,hidden:r,onClick:n}){let[a,o]=react.useState(null),[i,s]=react.useState(false),l=react.useRef(null);if(react.useEffect(()=>{typeof document>"u"||o(t??document.body);},[t]),!a)return null;let c=`lumen-notch lumen-notch-${e.edge}${i?" lumen-notch-expanded":""}`;function f(E){l.current={x:E.clientX,y:E.clientY},s(true),E.currentTarget.setPointerCapture(E.pointerId);}function g(E){let x=l.current;if(!x)return;let L=E.clientX-x.x,R=E.clientY-x.y;(e.edge==="top"&&R>16||e.edge==="bottom"&&R<-16||e.edge==="right"&&L<-16||e.edge==="left"&&L>16)&&(l.current=null,n());}function v(){l.current=null,s(false);}function w(){l.current=null,s(false);}return reactDom.createPortal(jsxRuntime.jsxs("button",{type:"button",className:c,style:{zIndex:e.zIndex,opacity:r?0:1,pointerEvents:r?"none":"auto"},"aria-label":e.label,"aria-hidden":r?true:void 0,tabIndex:r?-1:0,onClick:n,onPointerDown:f,onPointerMove:g,onPointerUp:v,onPointerCancel:w,onMouseEnter:()=>s(true),onMouseLeave:()=>s(false),"data-lumen-trigger":"","data-lumen-capture-ignore":"true",children:[jsxRuntime.jsx("span",{className:"lumen-notch-handle","aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"lumen-notch-label",children:[e.icon,e.label]})]}),a)}function st(e){return {kind:"notch",edge:e.edge??"top",label:e.label??"Feedback",icon:e.icon,zIndex:e.zIndex??2147483600}}function lt(e){return {kind:"floating",placement:e.placement??"br",offset:{x:e.offset?.x??16,y:e.offset?.y??16},safeArea:e.safeArea??true,avoid:e.avoid===false?false:e.avoid==null?"auto":Array.isArray(e.avoid)?e.avoid:[e.avoid],hideOnKeyboard:e.hideOnKeyboard??true,zIndex:e.zIndex??2147483600,label:e.label??"Feedback",icon:e.icon}}var Tn={"--lumen-bg":"background","--lumen-fg":"foreground","--lumen-primary":"accent","--lumen-radius":"radius"};function ut(e){let t=react.useId();react.useEffect(()=>{if(typeof document>"u")return;let r=document.documentElement,n=`data-lumen-theme-${Mn(t)}`,a={};if(e==="auto"||e==null)r.removeAttribute("data-lumen-theme");else if(e==="light"||e==="dark")a["data-lumen-theme"]=r.getAttribute("data-lumen-theme"),r.setAttribute("data-lumen-theme",e);else for(let[o,i]of Object.entries(Tn)){let s=e[i];typeof s=="string"&&s.length>0&&(a[o]=r.style.getPropertyValue(o)||null,r.style.setProperty(o,s));}return r.setAttribute(n,""),()=>{r.removeAttribute(n);for(let[o,i]of Object.entries(a))o.startsWith("--")?i?r.style.setProperty(o,i):r.style.removeProperty(o):i==null?r.removeAttribute(o):r.setAttribute(o,i);}},[e,t]);}function Mn(e){return e.replace(/[^a-zA-Z0-9]/g,"")}var ct=Symbol.for("lumen.history.patched"),he="lumen:locationchange";function Nn(){if(typeof window>"u")return;let e=window;if(e[ct])return;e[ct]=true;let t=()=>window.dispatchEvent(new Event(he)),r=history.pushState;history.pushState=function(...a){let o=r.apply(this,a);return t(),o};let n=history.replaceState;history.replaceState=function(...a){let o=n.apply(this,a);return t(),o},window.addEventListener("popstate",t);}function dt(e){let[t,r]=react.useState(false);return react.useEffect(()=>{if(!e){r(false);return}if(typeof window>"u")return;Nn();let n=()=>{try{r(!!e({pathname:window.location.pathname}));}catch{r(false);}};return n(),window.addEventListener(he,n),window.addEventListener("popstate",n),()=>{window.removeEventListener(he,n),window.removeEventListener("popstate",n);}},[e]),t}var Dn=["wv","Capacitor","Cordova","Expo","FBAN","FBAV","Instagram","Line/","Twitter"];function mt(){let[e,t]=react.useState(false);return react.useEffect(()=>{if(typeof window>"u")return;let r=window;if(r.ReactNativeWebView){t(true);return}let n=r.webkit;if(n&&n.messageHandlers){t(true);return}let a=navigator.userAgent||"";Dn.some(o=>a.includes(o))&&t(true);},[]),e}var ft="lumen.config.v1.",Fn=3600*1e3;function gt(e,t){let[r,n]=react.useState(()=>({trigger:null,enabled:true,loading:true}));return react.useEffect(()=>{if(typeof window>"u")return;let a=Un(e);a&&n({trigger:a.trigger,enabled:pt(a.trigger),loading:false});let o=new AbortController,i=window.setTimeout(()=>o.abort(),5e3),s=`${t.replace(/\/$/,"")}/api/v1/sdk/config?apiKey=${encodeURIComponent(e)}`;return fetch(s,{method:"GET",mode:"cors",credentials:"omit",signal:o.signal}).then(async l=>{if(!l.ok)throw new Error(`HTTP ${l.status}`);let c=await l.json(),f=bt(c.trigger);if(!f)throw new Error("Malformed config response");Vn(e,f),n({trigger:f,enabled:pt(f),loading:false});}).catch(()=>{n(l=>l.loading?{trigger:null,enabled:true,loading:false}:l);}).finally(()=>window.clearTimeout(i)),()=>{window.clearTimeout(i),o.abort();}},[e,t]),r}function pt(e){return e.kind!=="headless"}var Bn=["br","bl","tr","tl"],_n=["top","right","bottom","left"];function bt(e){if(!e||typeof e!="object")return null;let t=e;if(t.enabled===false)return {kind:"headless"};let r=typeof t.label=="string"?t.label:"Feedback";return t.kind==="floating"?{kind:"floating",placement:Bn.find(a=>a===t.placement)??"br",label:r}:t.kind==="notch"?{kind:"notch",edge:_n.find(a=>a===t.edge)??"top",label:r}:null}function Un(e){try{let t=window.localStorage.getItem(ft+e);if(!t)return null;let r=JSON.parse(t);if(typeof r?.fetchedAt!="number"||Date.now()-r.fetchedAt>Fn)return null;let n=bt(r.trigger);return n?{fetchedAt:r.fetchedAt,trigger:n}:null}catch{return null}}function Vn(e,t){try{window.localStorage.setItem(ft+e,JSON.stringify({fetchedAt:Date.now(),trigger:t}));}catch{}}var wt="https://shakebugs.vercel.app";function Wn({apiKey:e,apiUrl:t,user:r,amplitude:n,floatingButton:a=true,trigger:o,hideOn:i,theme:s,portalTarget:l,capture:c,children:f}){let[g,v]=react.useState(false),[w]=react.useState(false),[E]=react.useState(null),x=react.useMemo(()=>new Ie({apiKey:e,apiUrl:t,user:r,amplitude:n}),[e,t,r?.id,r?.email,r?.name,n?.userId,n?.deviceId,n?.sessionId]);react.useEffect(()=>{_e({ignoreUrlPrefix:(t??wt).replace(/\/$/,"")});},[t]);let L=react.useCallback(()=>v(true),[]),R=react.useCallback(()=>v(false),[]),A=react.useCallback(x.submit.bind(x),[x]),C=mt(),S=dt(i);ut(s);let M=gt(o?"":e,t??wt),d=react.useMemo(()=>({client:x,user:r,isOpen:g,isSubmitting:w,error:E,open:L,close:R,openCapture:L,closeCapture:R,submit:A,isNativeShell:C,capture:c}),[x,r,g,w,E,L,R,A,C,c]),p=$n({explicit:o,remote:M.trigger,remoteLoading:M.loading,floatingButton:a});return jsxRuntime.jsxs(ce.Provider,{value:d,children:[f,p?.kind==="floating"?jsxRuntime.jsx(nt,{config:lt(p),portalTarget:l,hidden:S,onClick:L}):null,p?.kind==="notch"?jsxRuntime.jsx(it,{config:st(p),portalTarget:l,hidden:S,onClick:L}):null,p?.kind==="inline"?jsxRuntime.jsx(rt,{mount:p.mount,label:p.label??"Feedback",icon:p.icon,onClick:L}):null,jsxRuntime.jsx(ge,{})]})}function $n(e){return e.explicit?e.explicit:e.floatingButton===false?{kind:"headless"}:e.remote?e.remote:e.remoteLoading?null:{kind:"floating"}}function Kn({variant:e="default",floating:t=false,className:r,children:n="Feedback",onClick:a,...o}){let{openCapture:i}=j(),s=["lumen-btn",e==="default"?"lumen-btn-primary":null,e==="ghost"?"lumen-btn-ghost":null,e==="outline"?"lumen-btn-outline":null,t?"lumen-btn-floating":null,r].filter(Boolean).join(" ");return jsxRuntime.jsx("button",{type:"button",className:s,onClick:l=>{a?.(l),l.defaultPrevented||i();},...o,children:n})}
4
+ exports.CaptureModal=ge;exports.FeedbackButton=Kn;exports.LumenProvider=Wn;exports.useLumen=j;//# sourceMappingURL=index.cjs.map
5
5
  //# sourceMappingURL=index.cjs.map