@lumen-stack/react 0.8.1 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
'use strict';var Ut=require('react'),sonner=require('sonner'),jsxRuntime=require('react/jsx-runtime'),reactDom=require('react-dom');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Ut__namespace=/*#__PURE__*/_interopNamespace(Ut);var T=class extends Error{constructor(e,t,n){super(e),this.code=t,this.status=n,this.name="LumenError";}code;status},bt=class extends T{constructor(){super("Origin not allowed. Add this origin in your Lumen project settings.","ORIGIN_NOT_ALLOWED",403),this.name="LumenOriginError";}},vt=class extends T{constructor(e){super(`Rate limited \u2014 retry after ${e}s.`,"RATE_LIMITED",429),this.retryAfter=e,this.name="LumenRateLimitError";}retryAfter},_e=class extends T{constructor(e){super(e,"NETWORK_ERROR"),this.name="LumenNetworkError";}},On="https://shakebugs.vercel.app",Hn="/api/v1/sdk/submit",Bn=new Set([502,503,504]),St=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??On).replace(/\/$/,""),this.user=e.user,this.amplitude=e.amplitude;}async submit(e,t={}){let n=`${this.apiUrl}${Hn}`,r=this.#e(e),o=null;for(let a=0;a<3;a++){a>0&&await _n(2**a*250);try{return await this.#t(n,r,t)}catch(i){if(o=i,i instanceof bt||i instanceof vt||i instanceof T&&typeof i.status=="number"&&!Bn.has(i.status))throw i}}throw o instanceof Error?o:new _e("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 n=e.context.amplitude??this.amplitude,r=n?{...e.context,amplitude:n}:e.context;return t.append("context",JSON.stringify(r)),e.screenshot&&t.append("screenshot",e.screenshot,Vn(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,n){return new Promise((r,o)=>{let a=new XMLHttpRequest;a.open("POST",e,true),a.setRequestHeader("X-Lumen-Api-Key",this.apiKey),a.responseType="text";let{onUploadProgress:i,signal:l}=n;i&&a.upload.addEventListener("progress",m=>{m.lengthComputable&&m.total>0&&i(Math.min(1,m.loaded/m.total));});let u=()=>{a.abort(),o(new _e("Submit aborted."));};if(l){if(l.aborted){o(new _e("Submit aborted."));return}l.addEventListener("abort",u,{once:true});}a.addEventListener("load",()=>{if(l&&l.removeEventListener("abort",u),a.status===403){o(new bt);return}if(a.status===429){let m=Number(a.getResponseHeader("Retry-After"))||60;o(new vt(m));return}if(a.status<200||a.status>=300){o(new T(Fn(a.responseText)??`HTTP ${a.status}`,"HTTP_ERROR",a.status));return}try{let m=JSON.parse(a.responseText);r(m);}catch{o(new T("Malformed response from server.","BAD_RESPONSE"));}}),a.addEventListener("error",()=>{l&&l.removeEventListener("abort",u),o(new _e("Network error during submit."));}),a.send(t);})}};function Vn(e){return `screenshot.${e.type==="image/jpeg"?"jpg":e.type==="image/webp"?"webp":"png"}`}function _n(e){return new Promise(t=>setTimeout(t,e))}function Fn(e){try{let t=JSON.parse(e);return t.error??t.message??null}catch{return e||null}}var Un=2,Ne=8*1024*1024;async function We(e={}){Pt();let t=e.mode??"auto";if(e.provider&&(t==="auto"||t==="custom"))try{return qn(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 T("Manual screenshot upload is required for this capture mode.","MANUAL_CAPTURE_REQUIRED");if(t==="true-screen")return yt(e);if(t==="dom")return wt(e);if(t==="custom")throw new T("`capture.provider` is required when capture mode is `custom`.","CAPTURE_PROVIDER_REQUIRED");try{return await wt(e)}catch(n){if(Tt()){let r=await yt(e);return r.warnings=Ie(["DOM screenshot failed; used browser screen permission fallback.",...r.warnings]),e.onWarning?.(r.warnings),r}throw n}}function Ae(e,t=[]){Pt();let n=$e();return {blob:e,method:"manual-upload",platform:"web",viewport:n,pixelRatio:window.devicePixelRatio??1,warnings:Ie(t)}}async function wt(e){let t=await zn(),n=e.target??document.documentElement,r=$e(),o=Math.max(1,Math.min(window.devicePixelRatio??1,e.maxScale??Un)),a=jn(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:o,ignoreElements:u=>u instanceof HTMLElement&&(u.dataset.lumenCaptureIgnore==="true"||!!u.closest("[data-lumen-capture-ignore='true']")),onclone:$n}),l={blob:await Mt(i,a),method:"web-dom",platform:"web",viewport:r,pixelRatio:o,warnings:Ie(a)};return l.warnings.length>0&&e.onWarning?.(l.warnings),l}var Wn=['input[type="password"]','input[autocomplete^="cc-"]','input[autocomplete="one-time-code"]',"[data-lumen-mask]"].join(", ");function $n(e){for(let t of Array.from(e.querySelectorAll(Wn))){if(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement){t.value&&(t.value="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022");continue}t instanceof HTMLElement&&(t.style.visibility="hidden");}}async function zn(){let{default:e}=await import('html2canvas-pro');return e}async function yt(e){if(!Tt())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 n=document.createElement("video");n.muted=!0,n.playsInline=!0,n.srcObject=t,await Kn(n);let r=document.createElement("canvas");r.width=n.videoWidth,r.height=n.videoHeight;let o=r.getContext("2d");if(!o)throw new T("Could not create a drawing context for screen capture.","CANVAS_CONTEXT_UNAVAILABLE");o.drawImage(n,0,0,r.width,r.height);let a=$e(),i=["Browser screen capture uses the window or tab selected by the user."],l={blob:await Mt(r,i),method:"web-display-media",platform:"web",viewport:a,pixelRatio:a.width>0?r.width/a.width:void 0,warnings:Ie(i)};return e.onWarning?.(l.warnings),l}finally{for(let n of t.getTracks())n.stop();}}function qn(e,t){let n=$e(),r={...e,method:e.method??"custom",platform:e.platform??"custom",viewport:e.viewport??n,pixelRatio:e.pixelRatio??window.devicePixelRatio??1,warnings:Ie(e.warnings??[])};return r.warnings.length>0&&t.onWarning?.(r.warnings),r}function jn(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 o=r.currentSrc||r.src;if(o)try{new URL(o,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 Mt(e,t){let n=await Et(e,"image/png",.92);if(n.size<=Ne)return n;t.push("Screenshot exceeded the upload cap and was compressed.");let r=e,o=0;for(;n.size>Ne&&o<6;){let a=Math.max(.35,Math.min(.95,Math.sqrt(Ne/n.size)*.9)),i=document.createElement("canvas");i.width=Math.max(1,Math.round(r.width*a)),i.height=Math.max(1,Math.round(r.height*a));let l=i.getContext("2d");if(!l)return n;l.drawImage(r,0,0,i.width,i.height),r=i;for(let u of [.86,.74,.62,.5])if(n=await Et(r,"image/jpeg",u),n.size<=Ne)return n;if(o+=1,i.width<480||i.height<320)break}return n.size>Ne&&t.push("Screenshot remained large after compression; upload may be rejected."),n}function Et(e,t,n){return new Promise((r,o)=>{e.toBlob(a=>{if(!a){o(new T("Could not encode screenshot.","ENCODE_FAILED"));return}r(a);},t,n);})}function $e(){let e=window.visualViewport;return {width:Math.round(e?.width??window.innerWidth),height:Math.round(e?.height??window.innerHeight)}}function Tt(){return !!navigator.mediaDevices?.getDisplayMedia}async function Kn(e){await new Promise((r,o)=>{let a=()=>r(),i=()=>o(new T("Could not read screen capture video.","VIDEO_FAILED"));e.addEventListener("loadedmetadata",a,{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 T("Screen capture did not produce a frame in time.","VIDEO_TIMEOUT");await new Promise(r=>requestAnimationFrame(()=>r()));}}function Pt(){if(typeof window>"u"||typeof document>"u")throw new T("Screenshot capture can only run in the browser.","INVALID_ENV")}function Ie(e){return Array.from(new Set(e.filter(Boolean)))}var Lt=/^(token|access_token|refresh_token|id_token|api_?key|key|secret|password|passwd|pwd|auth|authorization|sig|signature|session|sessionid|sid|email|jwt)$/i;function Ze(e){let t=e;return t=t.replace(/\b(Bearer|Basic)\s+[A-Za-z0-9._\-+/=]+/gi,"$1 ***"),t=t.replace(/\b([A-Za-z_][\w-]*)\s*[=:]\s*("?)([^"\s&]{6,})\2/g,(n,r,o,a)=>/^(Bearer|Basic)$/i.test(a)?n:Lt.test(r)?`${r}=${o}***${o}`:a.length>=24&&/^[A-Za-z0-9._\-+/=]+$/.test(a)&&!a.includes(" ")?`${r}=${o}${a.slice(0,4)}\u2026${o}`:n),t=t.replace(/\b[\w.+-]+@[\w-]+\.[\w.-]+\b/g,"***@***"),t}function Nt(e){try{let t=new URL(e,"http://relative.invalid");for(let r of [...t.searchParams.keys()])Lt.test(r)&&t.searchParams.set(r,"***");t.hash="";let n=t.toString();return Ze(t.host==="relative.invalid"?n.replace(/^http:\/\/relative\.invalid/,""):n)}catch{return Ze(e)}}function At(e){try{let t=new URL(e);return `${t.origin}${t.pathname}`}catch{return Nt(e)}}var Ct=200,Rt=4096,It=[],Fe=[],xt=false,Qe=null;function Dt(e={}){xt||typeof window>"u"||(xt=true,Qe=e.ignoreUrlPrefix??null,Jn(),Zn(),Qn());}function Gn(){return {consoleLog:It.slice(),networkLog:Fe.slice()}}function Ue(e,t){e.push(t),e.length>Ct&&e.splice(0,e.length-Ct);}function Yn(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,Xn));}catch{t.push(String(r));}}let n=t.join(" ");return n.length>Rt?n.slice(0,Rt)+"\u2026[truncated]":n}function Xn(e,t){return t instanceof Element?`[Element ${t.tagName}]`:typeof t=="function"?"[Function]":t}function Jn(){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]=(...o)=>{try{Ue(It,{level:n,ts:Date.now(),message:Ze(Yn(o))});}catch{}r(...o);});}}function Ot(e){return Qe?e.startsWith(Qe):false}function Zn(){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,o=(n?.method??(t instanceof Request?t.method:"GET")).toUpperCase();if(Ot(r))return e.call(window,t,n);let a=performance.now();try{let i=await e.call(window,t,n);return Ue(Fe,{type:"fetch",method:o,url:et(r),status:i.status,ok:i.ok,durationMs:Math.round(performance.now()-a),ts:Date.now()}),i}catch(i){throw Ue(Fe,{type:"fetch",method:o,url:et(r),status:0,ok:false,durationMs:Math.round(performance.now()-a),ts:Date.now(),error:i instanceof Error?i.message:"fetch error"}),i}});}function Qn(){let e=window.XMLHttpRequest;if(!e)return;let t=e.prototype.open,n=e.prototype.send;e.prototype.open=function(r,o,...a){return this.__lumen={method:String(r).toUpperCase(),url:typeof o=="string"?o:o.toString(),t:0},t.call(this,r,o,...a)},e.prototype.send=function(r){let o=this.__lumen;if(o&&!Ot(o.url)){o.t=performance.now();let a=()=>{try{Ue(Fe,{type:"xhr",method:o.method,url:et(o.url),status:this.status,ok:this.status>=200&&this.status<400,durationMs:Math.round(performance.now()-o.t),ts:Date.now()});}catch{}this.removeEventListener("loadend",a);};this.addEventListener("loadend",a);}return n.call(this,r??null)};}function er(e){return e.length>512?e.slice(0,512)+"\u2026":e}function et(e){return er(Nt(e))}function Ht(e){if(typeof window>"u")return {url:"",userAgent:"",viewport:{width:0,height:0},capture:kt(e),consoleLog:[],networkLog:[]};let t=Gn();return {url:At(window.location.href),userAgent:navigator.userAgent,viewport:{width:window.innerWidth,height:window.innerHeight},capture:kt(e),device:tr(),consoleLog:t.consoleLog,networkLog:t.networkLog}}function tr(){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?At(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 kt(e){if(e)return {method:e.method,platform:e.platform,viewport:e.viewport,pixelRatio:e.pixelRatio,warnings:e.warnings}}var ze="lumen:shake",nr=8e3,rr=50,or='[data-lumen-root], [data-lumen-capture-ignore="true"]';function ar(e={}){return async function(){if(typeof window>"u")throw new T("Native capture bridge requires a WebView/browser window.","INVALID_ENV");let t=lr(),n=e.send??ir,r=e.timeoutMs??nr,o=e.captureSettleMs??rr,a=pr(),i=ur(e.concealSelector===void 0?or:e.concealSelector);try{await cr(o);let l=await new Promise((c,p)=>{let v=window.setTimeout(()=>{t.pending.delete(a),p(new T("Native screenshot timed out; the host did not respond.","NATIVE_CAPTURE_TIMEOUT"));},r);t.pending.set(a,{resolve:h=>{window.clearTimeout(v),c(h);},reject:h=>{window.clearTimeout(v),p(h);}});try{n({type:"lumen:capture-request",id:a,afterScreenUpdates:!0});}catch{t.pending.delete(a),window.clearTimeout(v),p(new T("Could not reach the native host for screen capture.","NATIVE_CAPTURE_UNAVAILABLE"));}});if(l.error||!l.dataUrl)throw new T(l.error??"Native screenshot returned no image.","NATIVE_CAPTURE_FAILED");let u=fr(l.dataUrl),m=e.platform??mr();return {blob:u,method:m==="android"?"android-native":"ios-native",platform:m,viewport:{width:Math.round(window.innerWidth),height:Math.round(window.innerHeight)},pixelRatio:l.pixelRatio??window.devicePixelRatio??1,warnings:[]}}finally{i();}}}function ir(e){let t=window.ReactNativeWebView;if(!t?.postMessage)throw new T("window.ReactNativeWebView is unavailable; pass a custom `send`.","NATIVE_CAPTURE_UNAVAILABLE");t.postMessage(JSON.stringify(e));}function lr(){if(window.__lumenNativeCapture)return window.__lumenNativeCapture;let e={pending:new Map,resolve(n,r,o){let a=e.pending.get(n);a&&(e.pending.delete(n),a.resolve({type:"lumen:capture-response",id:n,dataUrl:r,pixelRatio:o}));},reject(n,r){let o=e.pending.get(n);o&&(e.pending.delete(n),o.resolve({type:"lumen:capture-response",id:n,error:r}));}},t=n=>{let r=sr(n.data);if(!r||r.type!=="lumen:capture-response")return;let o=e.pending.get(r.id);o&&(e.pending.delete(r.id),o.resolve(r));};return window.addEventListener("message",t),document.addEventListener("message",t),window.__lumenNativeCapture=e,e}function sr(e){if(e&&typeof e=="object"&&"type"in e)return e;if(typeof e=="string")try{let t=JSON.parse(e);if(t&&typeof t=="object"&&t.type)return t}catch{}return null}function ur(e){if(!e||typeof document>"u")return ()=>{};let t=[];for(let n of Array.from(document.querySelectorAll(e)))t.push({el:n,prev:n.style.visibility}),n.style.visibility="hidden";return ()=>{for(let{el:n,prev:r}of t)n.style.visibility=r;}}async function cr(e){await dr(),e>0&&await new Promise(t=>window.setTimeout(t,e));}function dr(){return new Promise(e=>{requestAnimationFrame(()=>e());})}function mr(){let e=navigator.userAgent||"";return /android/i.test(e)?"android":"ios"}function pr(){return `lumen-cap-${typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():Math.random().toString(36).slice(2)}`}function fr(e){let t=/^data:([^;,]*)(;base64)?,(.*)$/s.exec(e);if(!t)throw new T("Native host returned an invalid image data URL.","NATIVE_CAPTURE_FAILED");let n=t[1]||"image/png",r=!!t[2],o=t[3]??"";if(!r)return new Blob([decodeURIComponent(o)],{type:n});let a=atob(o),i=new Uint8Array(a.length);for(let l=0;l<a.length;l++)i[l]=a.charCodeAt(l);return new Blob([i],{type:n})}var gr="[data-lumen-root]",hr="[data-lumen-root], [data-lumen-trigger], [data-lumen-capture-ignore='true']";function br(e){let t=typeof e.composedPath=="function"?e.composedPath():[];for(let n of t)if(tt(n))return true;return tt(e.target)}function tt(e){return e?typeof Element<"u"&&e instanceof Element?e.matches(hr)?true:!!e.closest(gr):typeof ShadowRoot<"u"&&e instanceof ShadowRoot?tt(e.host):false:false}async function Bt(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 n=["audio/webm;codecs=opus","audio/webm","audio/mp4","audio/ogg;codecs=opus"].find(h=>MediaRecorder.isTypeSupported(h))??"",r=new MediaRecorder(t,n?{mimeType:n}:void 0),o=[],a=performance.now(),i=null,l=false,u=false,m,c,p=new Promise((h,y)=>{m=h,c=y;});p.catch(()=>{}),r.addEventListener("dataavailable",h=>{h.data&&h.data.size>0&&o.push(h.data);}),r.addEventListener("stop",()=>{i!==null&&window.clearTimeout(i),i=null;for(let b of t.getTracks())b.stop();if(u)return;if(u=true,l){c(new T("Recording cancelled.","RECORDER_STOPPED"));return}let h=performance.now()-a,y=r.mimeType||n||"audio/webm",w=new Blob(o,{type:y});m({blob:w,durationMs:h,mimeType:y});}),r.start(),i=window.setTimeout(()=>{r.state!=="inactive"&&r.stop();},e*1e3);function v(){if(r.state!=="inactive")try{r.stop();}catch{}}return {stream:t,cancel(){l=true,v(),i!==null&&window.clearTimeout(i),i=null;for(let h of t.getTracks())h.stop();},stop(){return v(),p}}}async function Vt(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 n=["video/webm;codecs=vp9,opus","video/webm;codecs=vp8,opus","video/webm","video/mp4"].find(y=>MediaRecorder.isTypeSupported(y))??"",r=new MediaRecorder(t,n?{mimeType:n}:void 0),o=[],a=performance.now(),i=null,l=false,u=false,m,c,p=new Promise((y,w)=>{m=y,c=w;});p.catch(()=>{});function v(){i!==null&&(window.clearTimeout(i),i=null);for(let y of t.getTracks())y.stop();}r.addEventListener("dataavailable",y=>{y.data&&y.data.size>0&&o.push(y.data);}),r.addEventListener("stop",()=>{if(l)return;if(l=true,v(),u){c(new T("Recording cancelled.","RECORDER_STOPPED"));return}let y=r.mimeType||n||"video/webm";m({blob:new Blob(o,{type:y}),durationMs:performance.now()-a,mimeType:y});});function h(){r.state!=="inactive"&&r.stop();}return r.start(),i=window.setTimeout(h,e*1e3),t.getVideoTracks()[0]?.addEventListener("ended",h),{stream:t,result:p,stop:h,cancel(){u=true,r.state!=="inactive"?r.stop():l||(l=true,v(),c(new T("Recording cancelled.","RECORDER_STOPPED")));}}}var nt=Ut.createContext(null);function De(){let e=Ut.useContext(nt);if(!e)throw new Error("useLumen() must be used inside <LumenProvider>.");return e}var ot='-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, ui-sans-serif, sans-serif';function Ft(e,t=1){return Math.max(0,Math.min(t,e))}var Wt=Ut__namespace.forwardRef(function({screenshot:t,tool:n,color:r="rgb(239, 68, 68)",strokeWidth:o=4,onDrawingChange:a},i){let l=Ut.useRef(null),u=Ut.useRef(null),m=Ut.useRef(null),[c,p]=Ut.useState(null),[v,h]=Ut.useState([]),y=Ut.useRef(null),w=Ut.useRef(false),b=Ut.useRef(0),x=Ut.useRef(false),[M,P]=Ut.useState([]),A=Ut.useRef(0),I=Ut.useRef([]),N=Ut.useRef(null),F=Ut.useCallback((f,g)=>{P(R=>R.map(k=>k.id===f?{...k,text:g}:k));},[]),ee=Ut.useCallback(f=>{P(R=>R.filter(k=>k.id!==f));let g=I.current.lastIndexOf("comment");g>=0&&I.current.splice(g,1);},[]);Ut.useEffect(()=>{let f=N.current;if(f==null)return;N.current=null,m.current?.querySelector(`[data-bubble-id="${f}"] .lumen-bubble-text`)?.focus();},[M]),Ut.useEffect(()=>{let f=false,g=null;return (async()=>{try{let R=await createImageBitmap(t);if(f){R.close?.();return}g=R,p(R);}catch{}})(),()=>{f=true,g?.close?.();}},[t]),Ut.useEffect(()=>{if(!c)return;let f=l.current,g=u.current;if(!f||!g)return;f.width=c.width,f.height=c.height,g.width=c.width,g.height=c.height;let R=f.getContext("2d");R&&(R.imageSmoothingEnabled=false,R.drawImage(c,0,0));},[c]),Ut.useEffect(()=>{let f=u.current;f&&qe(f,v,y.current);},[v]),Ut.useImperativeHandle(i,()=>({hasAnnotations:()=>v.length>0||M.some(f=>f.text.trim().length>0),reset:()=>{h([]),P([]),I.current=[];},undo:()=>{(I.current.pop()??"anno")==="comment"?P(g=>g.length===0?g:g.slice(0,-1)):h(g=>g.length===0?g:g.slice(0,-1));},async flatten(){let f=y.current,g=f?[...v,f]:v,R=M.filter(L=>L.text.trim().length>0);if(g.length===0&&R.length===0||!c)return t;let k=document.createElement("canvas");k.width=c.width,k.height=c.height;let _=k.getContext("2d");if(!_)return t;_.imageSmoothingEnabled=false,_.drawImage(c,0,0);for(let L of g)at(_,L);let O=l.current?.clientWidth||c.width,X=c.width/Math.max(O,1);for(let L of R)xr(_,L,c.width,c.height,X);return await new Promise(L=>{k.toBlob(K=>{L(K??t);},"image/jpeg",.85);})}}),[v,M,c,t]);function W(f){let g=u.current;if(!g)return {x:0,y:0};let R=g.getBoundingClientRect(),k=g.width/Math.max(R.width,1),_=g.height/Math.max(R.height,1);return {x:(f.clientX-R.left)*k,y:(f.clientY-R.top)*_}}function q(){x.current||(x.current=true,requestAnimationFrame(()=>{x.current=false;let f=u.current;f&&qe(f,v,y.current);}));}function re(f){if(f.button!==void 0&&f.button!==0)return;if(n==="comment"){let R=u.current;if(!R)return;let k=R.getBoundingClientRect(),_=Ft((f.clientX-k.left)/Math.max(k.width,1),.72),O=Ft((f.clientY-k.top)/Math.max(k.height,1),.8),X=++A.current;P(L=>[...L,{id:X,x:_,y:O,text:"",color:r}]),I.current.push("comment"),N.current=X;return}try{f.currentTarget.setPointerCapture(f.pointerId);}catch{}w.current=true,a?.(true);let g=W(f);n==="arrow"?y.current={kind:"arrow",from:g,to:g,color:r,width:o}:n==="rect"?y.current={kind:"rect",from:g,to:g,color:r,width:o}:y.current={kind:"freehand",points:[g],color:r,width:o},b.current=performance.now(),q();}function se(f){if(!w.current||!y.current)return;let g=W(f),R=y.current;if(R.kind==="arrow"||R.kind==="rect")R.to=g;else {let k=R.points[R.points.length-1],_=k?(k.x-g.x)**2+(k.y-g.y)**2:1/0,O=performance.now(),X=O-b.current;(_>16||X>16)&&(R.points.push(g),b.current=O);}q();}function $(){if(!w.current)return;w.current=false,a?.(false);let f=y.current;if(y.current=null,!!f){if(f.kind==="arrow"||f.kind==="rect"){let g=f.to.x-f.from.x,R=f.to.y-f.from.y;if(g*g+R*R<16){let k=u.current;k&&qe(k,v,null);return}}else if(f.points.length<2){let g=u.current;g&&qe(g,v,null);return}h(g=>[...g,f].slice(-50)),I.current.push("anno");}}return jsxRuntime.jsxs("div",{ref:m,className:"lumen-annotate-frame","data-lumen-tool":n,children:[jsxRuntime.jsx("canvas",{ref:l}),jsxRuntime.jsx("canvas",{ref:u,className:"lumen-annotate-overlay",onPointerDown:re,onPointerMove:se,onPointerUp:$,onPointerCancel:$}),jsxRuntime.jsx("div",{className:"lumen-bubble-layer",children:M.map(f=>jsxRuntime.jsx(Cr,{comment:f,onChange:F,onRemove:ee},f.id))})]})});function Cr({comment:e,onChange:t,onRemove:n}){let r=Ut.useRef(null);return Ut.useEffect(()=>{let o=r.current;o&&o.textContent!==e.text&&(o.textContent=e.text);},[]),jsxRuntime.jsxs("div",{className:"lumen-bubble","data-bubble-id":e.id,style:{left:`${e.x*100}%`,top:`${e.y*100}%`,"--lumen-bubble-accent":e.color},onPointerDown:o=>o.stopPropagation(),children:[jsxRuntime.jsx("span",{className:"lumen-bubble-label",children:"Comment"}),jsxRuntime.jsx("div",{ref:r,className:"lumen-bubble-text",contentEditable:true,suppressContentEditableWarning:true,role:"textbox","aria-label":"Comment text","data-placeholder":"Type a note\u2026",onInput:o=>t(e.id,o.currentTarget.textContent??"")}),jsxRuntime.jsx("button",{type:"button",className:"lumen-bubble-del","aria-label":"Remove comment",onPointerDown:o=>o.stopPropagation(),onClick:()=>n(e.id),children:"\xD7"})]})}function qe(e,t,n){let r=e.getContext("2d");if(r){r.clearRect(0,0,e.width,e.height);for(let o of t)at(r,o);n&&at(r,n);}}function at(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),o=Math.abs(t.to.x-t.from.x),a=Math.abs(t.to.y-t.from.y);e.strokeRect(n,r,o,a);}else if(t.kind==="freehand")Rr(e,t.points);else {let{from:n,to:r,width:o}=t;e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(r.x,r.y),e.stroke();let a=Math.atan2(r.y-n.y,r.x-n.x),i=Math.max(12,o*4);e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(r.x-i*Math.cos(a-Math.PI/7),r.y-i*Math.sin(a-Math.PI/7)),e.lineTo(r.x-i*Math.cos(a+Math.PI/7),r.y-i*Math.sin(a+Math.PI/7)),e.closePath(),e.fill();}e.restore();}function Rr(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 o=t[1];e.lineTo(o.x,o.y),e.stroke();return}for(let o=1;o<t.length-1;o++){let a=t[o],i=t[o+1],l=(a.x+i.x)/2,u=(a.y+i.y)/2;e.quadraticCurveTo(a.x,a.y,l,u);}let r=t[t.length-1];e.lineTo(r.x,r.y),e.stroke();}function xr(e,t,n,r,o){let a=t.text.trim();if(!a)return;let i=10*o,l=14*o,u=10*o,m=12*o,c=l*1.35,p=u*1.7,v=t.x*n,h=t.y*r,y=Math.min(n*.6,n-v-8*o);e.save(),e.font=`500 ${l}px ${ot}`,e.textBaseline="top";let w=kr(e,a,y-i*2),b=w.reduce((N,F)=>Math.max(N,e.measureText(F).width),0),x=Math.min(y,Math.max(b,56*o)+i*2),M=i*2+p+w.length*c;Sr(e,v,h,x,M,m),e.fillStyle="#ffffff",e.fill(),e.lineWidth=Math.max(1,o),e.strokeStyle="rgba(0,0,0,0.10)",e.stroke();let P=v+18*o,A=h+M;e.beginPath(),e.moveTo(P,A-o),e.lineTo(P+13*o,A-o),e.lineTo(P+4*o,A+9*o),e.closePath(),e.fillStyle="#ffffff",e.fill(),e.fillStyle=t.color||"rgb(239, 68, 68)",e.font=`700 ${u}px ${ot}`,e.fillText("COMMENT",v+i,h+i),e.fillStyle="#111318",e.font=`500 ${l}px ${ot}`;let I=h+i+p;for(let N of w)e.fillText(N,v+i,I),I+=c;e.restore();}function kr(e,t,n){let r=t.split(/\s+/).filter(Boolean),o=[],a="";for(let i of r){let l=a?`${a} ${i}`:i;a&&e.measureText(l).width>n?(o.push(a),a=i):a=l;}return a&&o.push(a),o.length?o:[t]}function Sr(e,t,n,r,o,a){let i=Math.min(a,r/2,o/2);e.beginPath();let l=e;if(typeof l.roundRect=="function"){l.roundRect(t,n,r,o,i);return}e.moveTo(t+i,n),e.arcTo(t+r,n,t+r,n+o,i),e.arcTo(t+r,n+o,t,n+o,i),e.arcTo(t,n+o,t,n,i),e.arcTo(t,n,t+r,n,i),e.closePath();}function it({children:e,...t}){return jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.8,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",...t,children:e})}function Mr(e){return jsxRuntime.jsxs(it,{...e,children:[jsxRuntime.jsx("path",{d:"M3 9a2 2 0 0 1 2-2h1.5l1-1.5h5l1 1.5H19a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"}),jsxRuntime.jsx("circle",{cx:"12",cy:"13",r:"3.2"})]})}function Tr(e){return jsxRuntime.jsxs(it,{...e,children:[jsxRuntime.jsx("rect",{x:"3",y:"6",width:"13",height:"12",rx:"2.5"}),jsxRuntime.jsx("path",{d:"m16 10 5-3v10l-5-3"})]})}function Pr(e){return jsxRuntime.jsxs(it,{...e,children:[jsxRuntime.jsx("path",{d:"M12 16V4m0 0 4 4m-4-4-4 4"}),jsxRuntime.jsx("path",{d:"M4 16v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2"})]})}var lt={shot:Mr,video:Tr,upload:Pr};function zt(e){let t=e.videoWidth||1280,n=e.videoHeight||720,r=document.createElement("canvas");r.width=t,r.height=n;let o=r.getContext("2d");return o?(o.drawImage(e,0,0,t,n),new Promise(a=>r.toBlob(i=>a(i),"image/jpeg",.82))):Promise.resolve(null)}function Lr(e,t){return !Number.isFinite(t)||t<=0?Promise.resolve():new Promise(n=>{e.addEventListener("seeked",()=>n(),{once:true});try{e.currentTime=t;}catch{n();}})}async function ut(e){if(typeof document>"u")return {poster:null,durationMs:0};let t=URL.createObjectURL(e),n=document.createElement("video");n.muted=true,n.playsInline=true,n.preload="metadata",n.src=t;try{await new Promise((a,i)=>{n.addEventListener("loadeddata",()=>a(),{once:!0}),n.addEventListener("error",()=>i(new Error("video decode failed")),{once:!0});}),await Lr(n,Math.min(.1,(n.duration||0)/2));let r=await zt(n),o=Number.isFinite(n.duration)?n.duration*1e3:0;return {poster:r,durationMs:o}}catch{return {poster:null,durationMs:0}}finally{URL.revokeObjectURL(t);}}async function ct(e){if(typeof document>"u")return null;let t=document.createElement("video");t.muted=true,t.playsInline=true,t.srcObject=e;try{return await t.play().catch(()=>{}),await new Promise(n=>{if(t.readyState>=2)return n();t.addEventListener("loadeddata",()=>n(),{once:!0}),window.setTimeout(n,600);}),await zt(t)}catch{return null}finally{t.srcObject=null;}}async function dt(){if(typeof document>"u")return null;let e=document.createElement("canvas");e.width=1280,e.height=720;let t=e.getContext("2d");return t?(t.fillStyle="#0e0e12",t.fillRect(0,0,e.width,e.height),t.fillStyle="#52525b",t.beginPath(),t.moveTo(590,312),t.lineTo(590,408),t.lineTo(694,360),t.closePath(),t.fill(),new Promise(n=>e.toBlob(r=>n(r),"image/jpeg",.8))):null}var mt=60,Nr=25*1024*1024,qt=[{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)"}],jt=[{label:"Small",value:2,dot:6},{label:"Medium",value:4,dot:9},{label:"Large",value:6,dot:12}],Kt=[{value:"bug",label:"Bug"},{value:"feature",label:"Idea"},{value:"other",label:"Other"}],Gt=[{value:"shot",label:"Screenshot",hint:"This page, instantly",primary:true},{value:"video",label:"Video",hint:"Record up to 60s"},{value:"upload",label:"Upload",hint:"Image or video"}];function pt(){let{client:e,isOpen:t,closeCapture:n,user:r,capture:o,initialCapture:a,initialCaptureError:i,startVideoSession:l,consumePendingVideo:u,canRecordScreen:m,consumeRecordStartError:c}=De(),[p,v]=Ut.useState(1),[h,y]=Ut.useState(null),[w,b]=Ut.useState({kind:"idle"}),[x,M]=Ut.useState(false),[P,A]=Ut.useState(0),[I,N]=Ut.useState(null),[F,ee]=Ut.useState(false),[W,q]=Ut.useState("arrow"),[re,se]=Ut.useState(qt[0].value),[$,f]=Ut.useState(jt[1].value),[g,R]=Ut.useState(""),[k,_]=Ut.useState("bug"),[O,X]=Ut.useState(r?.email??""),[L,K]=Ut.useState(null),[H,ue]=Ut.useState(null),[Ce,te]=Ut.useState(0),[z,j]=Ut.useState(null),[J,me]=Ut.useState(null),[he,Re]=Ut.useState(false),be=Ut.useRef(null),Pe=Ut.useRef(null),xe=Ut.useRef(null),oe=Ut.useRef(false),ke=Ut.useRef(false);Ut.useEffect(()=>{t||(ke.current=false);},[t]),Ut.useEffect(()=>{if(!t||ke.current)return;ke.current=true,oe.current=false,v(1),y(null),R(""),ue(null),te(0),j(null),M(false),A(0),N(null),ee(false),me(null);let s=u();if(s)y("video"),j({blob:s.blob,durationMs:s.durationMs}),s.blob.size>Nr&&sonner.toast.warning("This recording is large and may be too big to upload. Try a shorter clip if the upload fails."),s.poster?b({kind:"ready",capture:Ae(s.poster,["Screen recording; preview is the first frame."])}):(b({kind:"capturing"}),(async()=>{let C=null;if(s.deriveBlobPoster)try{C=(await ut(s.blob)).poster;}catch{C=null;}C=C??await dt(),!oe.current&&b(C?{kind:"ready",capture:Ae(C,["Screen recording; preview is the first frame."])}:{kind:"manual"});})());else {let C=c();C?(y("video"),me(C),b({kind:"idle"})):a?(y("shot"),b({kind:"ready",capture:a})):o?.mode==="manual"?b({kind:"manual"}):o?.provider&&!i?(y("shot"),Le(o.mode??"auto")):b({kind:"manual",error:i?.message??"Automatic screenshot capture was unavailable."});}return ()=>{oe.current=true;}},[t,o,a,i]),Ut.useEffect(()=>{if(!t)return;xe.current=document.activeElement??null;let s=document.documentElement,C=s.style.overflow,U=s.style.paddingRight,G=window.innerWidth-s.clientWidth;s.style.overflow="hidden",G>0&&(s.style.paddingRight=`${G}px`);let Q=false,fe=()=>{if(!Q){Q=true,s.style.overflow=C,s.style.paddingRight=U;try{xe.current?.focus?.();}catch{}}};return window.addEventListener("pagehide",fe),()=>{window.removeEventListener("pagehide",fe),fe();}},[t]),Ut.useEffect(()=>{if(!t)return;function s(C){if(C.key==="Escape"){C.preventDefault(),n();return}if(C.key!=="Tab")return;let U=Pe.current;if(!U)return;let G=Ur(U);if(G.length===0)return;let Q=G[0],fe=G[G.length-1],Je=document.activeElement;C.shiftKey&&(Je===Q||!U.contains(Je))?(C.preventDefault(),fe.focus()):!C.shiftKey&&Je===fe&&(C.preventDefault(),Q.focus());}return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[t,n]),Ut.useEffect(()=>{if(!t||w.kind!=="manual")return;function s(C){let Q=Array.from(C.clipboardData?.items??[]).find(fe=>fe.type.startsWith("image/"))?.getAsFile();Q&&(C.preventDefault(),Me(Q));}return window.addEventListener("paste",s),()=>window.removeEventListener("paste",s)},[t,w.kind]),Ut.useEffect(()=>{if(!L)return;let s=Date.now(),C=window.setInterval(()=>{let U=Math.floor((Date.now()-s)/1e3);te(U),U>=mt&&Z();},250);return ()=>window.clearInterval(C)},[L]);let pe=Ut.useRef(null);if(pe.current=L,Ut.useEffect(()=>{t||pe.current&&(pe.current.cancel(),pe.current=null,K(null),te(0));},[t]),Ut.useEffect(()=>()=>{pe.current?.cancel();},[]),!t)return null;async function Le(s){oe.current=false,b({kind:"capturing"});try{let C=await We({...o,mode:s,target:o?.target??document.documentElement});return oe.current?!1:(Ge(C),b({kind:"ready",capture:C}),!0)}catch(C){return oe.current||b({kind:"manual",error:C instanceof Error?C.message:"Automatic screenshot capture was unavailable."}),false}}async function Se(s){y(s),me(null),N(null),s!=="video"&&V(),s==="shot"?await Le(o?.mode??"auto"):s==="video"?(j(null),b({kind:"idle"})):b({kind:"manual"});}async function Me(s){if(s.type.startsWith("image/")){V();let C=Ae(s,["Manual image upload used."]);b({kind:"ready",capture:C});return}if(s.type.startsWith("video/")){b({kind:"capturing"});try{let{poster:C,durationMs:U}=await ut(s),G=C??await dt();if(!G){b({kind:"manual",error:"Could not read that video."});return}let Q=Ae(G,["Uploaded video; preview is the first frame."]);j({blob:s,durationMs:U}),b({kind:"ready",capture:Q});}catch{b({kind:"manual",error:"Could not read that video."});}return}sonner.toast.error("Choose an image (PNG, JPEG, WebP) or a video (MP4, WebM).");}function Ge(s){s.warnings.length!==0&&sonner.toast.warning("Screenshot captured, but iframe, video, canvas, or cross-origin content may be incomplete.");}async function Be(){try{let s=await Bt(mt);K(s);}catch(s){sonner.toast.error(s instanceof Error?s.message:"Microphone unavailable");}}async function Z(){if(L)try{let s=await L.stop();ue({blob:s.blob,durationMs:s.durationMs});}catch(s){sonner.toast.error(s instanceof Error?s.message:"Could not stop recording");}finally{K(null);}}function S(){L?.cancel(),K(null),ue(null),te(0);}async function B(){me(null);try{await l();}catch(s){sonner.toast.error(s instanceof Error?s.message:"Screen capture unavailable");}}function V(){j(null);}let Ye=w.kind==="ready";async function Pn(){if(L&&await Z(),p===1){if(w.kind==="ready"){let s=await be.current?.flatten();N(s??w.capture.blob),ee(s!=null&&s!==w.capture.blob);}v(2);}else p===2?v(3):await Nn();}function Ln(){p>1&&v(s=>s-1);}async function Nn(){if(w.kind!=="ready")return;let s=g.trim(),{capture:C}=w;M(true),A(0);try{let U=I??C.blob,G=await e.submit({rawText:s.length>0?s:void 0,category:k,submitterEmail:O.trim()||void 0,screenshot:U,audio:H?.blob,audioDurationMs:H?.durationMs,video:z?.blob,videoDurationMs:z?.durationMs,context:Ht(C)},{onUploadProgress:Q=>A(Math.min(.95,Q))});A(1),sonner.toast.success("Feedback sent \u2014 thank you."),G.id,n();}catch(U){sonner.toast.error(U instanceof Error?U.message:"Could not submit feedback"),M(false);}}function An(s){s.target===s.currentTarget&&!x&&n();}let Ve=Math.round(P*100),Xe=h==="video",In=p===1&&!Ye||x,Dn=p<3?"Next":x?Ve<95?`Uploading ${Ve}%\u2026`:"Almost done\u2026":"Send feedback";return jsxRuntime.jsx("div",{role:"dialog","aria-modal":"true","aria-label":"Send feedback",className:"lumen-modal-backdrop","data-lumen-capture-ignore":"true",onMouseDown:An,children:jsxRuntime.jsxs("div",{ref:Pe,className:"lumen-modal","data-lumen-drawing":he?"true":void 0,children:[jsxRuntime.jsx(Or,{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.jsx(Ar,{step:p}),jsxRuntime.jsxs("div",{className:"lumen-modal-body",children:[p===1?jsxRuntime.jsx("div",{className:"lumen-pane",children:h===null?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"lumen-method",role:"group","aria-label":"Capture method",children:Gt.map(s=>{let C=lt[s.value];return jsxRuntime.jsxs("button",{type:"button",className:"lumen-method-btn"+(s.primary?" lumen-method-primary":""),onClick:()=>Se(s.value),disabled:w.kind==="capturing",children:[jsxRuntime.jsx("span",{className:"lumen-method-ico",children:jsxRuntime.jsx(C,{})}),s.primary?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{className:"lumen-method-text",children:[jsxRuntime.jsx("span",{className:"lumen-method-label",children:s.label}),jsxRuntime.jsx("span",{className:"lumen-method-hint",children:s.hint})]}),jsxRuntime.jsx("span",{className:"lumen-method-badge",children:"Fastest"})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"lumen-method-label",children:s.label}),jsxRuntime.jsx("span",{className:"lumen-method-hint",children:s.hint})]})]},s.value)})}),jsxRuntime.jsx("p",{className:"lumen-status lumen-method-help",children:"Choose how to capture your feedback."})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"lumen-method-switch",role:"group","aria-label":"Switch capture method",children:Gt.map(s=>{let C=lt[s.value];return jsxRuntime.jsxs("button",{type:"button","aria-pressed":h===s.value,onClick:()=>Se(s.value),disabled:w.kind==="capturing",children:[jsxRuntime.jsx(C,{}),s.label]},s.value)})}),h==="video"&&w.kind==="idle"?jsxRuntime.jsx(Ir,{canRecord:m,onRecord:B,error:J}):null,w.kind==="capturing"?jsxRuntime.jsxs("p",{className:"lumen-status",children:[jsxRuntime.jsx("span",{className:"lumen-spinner","aria-hidden":"true"}),"Capturing\u2026"]}):null,w.kind==="manual"?jsxRuntime.jsxs("div",{className:"lumen-manual-capture",children:[jsxRuntime.jsx("p",{className:"lumen-status",children:h==="upload"?"Choose an image or video to attach \u2014 or paste an image.":w.error?"Automatic capture was unavailable. Upload or paste an image to continue.":"Upload or paste an image to continue."}),jsxRuntime.jsxs("label",{className:"lumen-manual-drop",children:[jsxRuntime.jsx("span",{children:h==="upload"?"Choose a file \u2014 image or video":"Choose or paste an image"}),jsxRuntime.jsx("input",{type:"file",accept:h==="upload"?"image/png,image/jpeg,image/webp,video/mp4,video/webm,video/quicktime":"image/png,image/jpeg,image/webp",onChange:s=>{let C=s.currentTarget.files?.[0];C&&Me(C),s.currentTarget.value="";}})]})]}):null,w.kind==="ready"?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[Xe?null:jsxRuntime.jsxs("div",{className:"lumen-toolbar",children:[jsxRuntime.jsxs("div",{className:"lumen-segmented",role:"group","aria-label":"Annotation tool",children:[jsxRuntime.jsx(je,{label:"Arrow",active:W==="arrow",onClick:()=>q("arrow")}),jsxRuntime.jsx(je,{label:"Box",active:W==="rect",onClick:()=>q("rect")}),jsxRuntime.jsx(je,{label:"Draw",active:W==="freehand",onClick:()=>q("freehand")}),jsxRuntime.jsx(je,{label:"Comment",active:W==="comment",onClick:()=>q("comment")})]}),jsxRuntime.jsx("span",{className:"lumen-toolbar-sep"}),jsxRuntime.jsx("div",{className:"lumen-swatches",role:"group","aria-label":"Color",children:qt.map(s=>jsxRuntime.jsx("button",{type:"button",className:"lumen-swatch",style:{background:s.value},"aria-label":s.label,"aria-pressed":re===s.value,onClick:()=>se(s.value)},s.value))}),jsxRuntime.jsx("div",{className:"lumen-stroke-sizes",role:"group","aria-label":"Stroke width",children:jt.map(s=>jsxRuntime.jsx("button",{type:"button",className:"lumen-stroke-size","aria-label":s.label,"aria-pressed":$===s.value,onClick:()=>f(s.value),children:jsxRuntime.jsx("span",{className:"lumen-stroke-size-dot",style:{width:s.dot,height:s.dot}})},s.value))}),jsxRuntime.jsx("span",{className:"lumen-toolbar-spacer"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:()=>be.current?.undo(),children:"Undo"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:()=>be.current?.reset(),children:"Clear"})]}),jsxRuntime.jsx("div",{className:"lumen-annotate",children:jsxRuntime.jsx(Wt,{ref:be,screenshot:w.capture.blob,tool:W,color:re,strokeWidth:$,onDrawingChange:Re})}),jsxRuntime.jsxs("div",{className:"lumen-cap-actions",children:[jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:()=>h&&Se(h),children:Xe?"\u21BB Re-record":"\u21BB Recapture"}),Xe?z?jsxRuntime.jsxs("span",{className:"lumen-cap-note",children:["\u2713 ",Math.round(z.durationMs/1e3),"s recorded"]}):null:jsxRuntime.jsxs("span",{className:"lumen-cap-note",children:[Yt(h)," captured \xB7 switch method above anytime"]})]})]}):null]})}):null,p===2?jsxRuntime.jsxs("div",{className:"lumen-pane lumen-form",children:[jsxRuntime.jsxs("label",{className:"lumen-label",children:[jsxRuntime.jsx("span",{children:"What happened?"}),jsxRuntime.jsx("textarea",{value:g,onChange:s=>R(s.target.value),rows:3,placeholder:"Describe the issue or idea\u2026",className:"lumen-input",autoFocus:true})]}),jsxRuntime.jsxs("div",{className:"lumen-label",children:[jsxRuntime.jsx("span",{children:"Add a voice note (optional)"}),jsxRuntime.jsxs("div",{className:"lumen-audio-row",children:[!L&&!H?jsxRuntime.jsx("button",{type:"button",onClick:Be,className:"lumen-btn-ghost",children:"Record voice note"}):null,L?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{className:"lumen-recording",children:[jsxRuntime.jsx("span",{className:"lumen-rec-dot","aria-hidden":"true"}),jsxRuntime.jsx(Hr,{stream:L.stream}),jsxRuntime.jsxs("span",{className:"lumen-rec-time",children:[Ce,"s / ",mt,"s"]})]}),jsxRuntime.jsx("button",{type:"button",onClick:Z,className:"lumen-btn-ghost",children:"Stop"}),jsxRuntime.jsx("button",{type:"button",onClick:S,className:"lumen-btn-ghost",children:"Cancel"})]}):null,H&&!L?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(Vr,{blob:H.blob,durationMs:H.durationMs}),jsxRuntime.jsx("button",{type:"button",onClick:()=>ue(null),className:"lumen-btn-ghost",children:"Remove"})]}):null]})]}),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:Kt.map(s=>jsxRuntime.jsx("button",{type:"button",className:"lumen-category-opt","aria-pressed":k===s.value,onClick:()=>_(s.value),children:s.label},s.value))})]}),jsxRuntime.jsxs("label",{className:"lumen-label",children:[jsxRuntime.jsx("span",{children:"Your email (optional)"}),jsxRuntime.jsx("input",{type:"email",value:O,onChange:s=>X(s.target.value),placeholder:"you@example.com",className:"lumen-input"})]})]}):null,p===3?jsxRuntime.jsxs("div",{className:"lumen-pane lumen-review",children:[jsxRuntime.jsxs("div",{className:"lumen-review-row",children:[jsxRuntime.jsx("span",{className:"lumen-review-k",children:"Capture"}),jsxRuntime.jsxs("span",{className:"lumen-review-v",children:[Yt(h),F?" \xB7 annotated":"",jsxRuntime.jsx("button",{type:"button",className:"lumen-edit",onClick:()=>v(1),children:"edit"})]})]}),jsxRuntime.jsxs("div",{className:"lumen-review-row",children:[jsxRuntime.jsx("span",{className:"lumen-review-k",children:"Category"}),jsxRuntime.jsxs("span",{className:"lumen-review-v",children:[jsxRuntime.jsx("span",{className:"lumen-chip",children:Kt.find(s=>s.value===k)?.label}),jsxRuntime.jsx("button",{type:"button",className:"lumen-edit",onClick:()=>v(2),children:"edit"})]})]}),jsxRuntime.jsxs("div",{className:"lumen-review-row",children:[jsxRuntime.jsx("span",{className:"lumen-review-k",children:"Description"}),jsxRuntime.jsxs("span",{className:"lumen-review-v",children:[g.trim()?g.trim():jsxRuntime.jsx("span",{className:"lumen-muted-empty",children:"\u2014"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-edit",onClick:()=>v(2),children:"edit"})]})]}),jsxRuntime.jsxs("div",{className:"lumen-review-row",children:[jsxRuntime.jsx("span",{className:"lumen-review-k",children:"Material"}),jsxRuntime.jsxs("span",{className:"lumen-review-v lumen-attach-row",children:[H?jsxRuntime.jsxs("span",{className:"lumen-attach",children:["\u{1F399} Voice ",Math.round(H.durationMs/1e3),"s",jsxRuntime.jsx("button",{type:"button",className:"lumen-att-x","aria-label":"Remove voice note",onClick:()=>ue(null),children:"\xD7"})]}):null,z?jsxRuntime.jsxs("span",{className:"lumen-attach",children:["\u25B6 Video ",Math.round(z.durationMs/1e3),"s",jsxRuntime.jsx("button",{type:"button",className:"lumen-att-x","aria-label":"Remove video",onClick:V,children:"\xD7"})]}):null,O.trim()?jsxRuntime.jsxs("span",{className:"lumen-attach",children:["\u2709 ",O.trim()]}):null,!H&&!L?jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost lumen-add-btn",onClick:()=>{v(2),Be();},children:"+ Voice note"}):null]})]})]}):null]}),jsxRuntime.jsxs("footer",{className:"lumen-modal-footer",children:[x?jsxRuntime.jsx("div",{className:"lumen-progress",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Ve,children:jsxRuntime.jsx("div",{className:"lumen-progress-fill",style:{width:`${Ve}%`}})}):null,jsxRuntime.jsxs("div",{className:"lumen-modal-actions",children:[jsxRuntime.jsx("button",{type:"button",onClick:p===1?n:Ln,className:"lumen-btn-ghost",disabled:x,children:p===1?"Cancel":"Back"}),jsxRuntime.jsx("button",{type:"button",onClick:Pn,className:"lumen-btn-primary",disabled:In,children:Dn})]})]})]})})}function Yt(e){return e==="video"?"Screen recording":e==="upload"?"Upload":"Screenshot"}function Ar({step:e}){let t=[{n:1,label:"Capture"},{n:2,label:"Describe"},{n:3,label:"Review"}];return jsxRuntime.jsx("div",{className:"lumen-stepper","aria-hidden":"true",children:t.map((n,r)=>jsxRuntime.jsxs("div",{className:"lumen-step"+(e===n.n?" lumen-step-active":"")+(e>n.n?" lumen-step-done":""),children:[jsxRuntime.jsx("span",{className:"lumen-step-num",children:n.n}),jsxRuntime.jsx("span",{className:"lumen-step-lbl",children:n.label}),r<t.length-1?jsxRuntime.jsx("span",{className:"lumen-step-bar"}):null]},n.n))})}function Ir({canRecord:e,onRecord:t,error:n}){return e?jsxRuntime.jsxs("div",{className:"lumen-record-prompt",children:[n?jsxRuntime.jsxs("p",{className:"lumen-record-unavailable",role:"alert",children:[n," Try again, or switch to ",jsxRuntime.jsx("strong",{children:"Upload"})," to attach a video instead."]}):null,jsxRuntime.jsx("button",{type:"button",className:"lumen-record-btn","aria-label":"Start screen recording",onClick:t}),jsxRuntime.jsxs("div",{className:"lumen-record-copy",children:[jsxRuntime.jsx("div",{className:"lumen-record-title",children:"Record your screen"}),jsxRuntime.jsx("div",{className:"lumen-record-sub",children:"Tap to start. The sheet closes so you can record freely \u2014 a Stop button stays on screen, then the sheet returns with your clip. Max 60s."})]})]}):jsxRuntime.jsx("div",{className:"lumen-record-prompt",children:jsxRuntime.jsx("p",{className:"lumen-record-unavailable",children:Dr()?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:["Screen recording isn\u2019t available on iOS browsers. Record with Control Center\u2019s screen recorder, then attach the clip via"," ",jsxRuntime.jsx("strong",{children:"Upload"}),"."]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:["Screen recording isn\u2019t available in this browser. Switch to"," ",jsxRuntime.jsx("strong",{children:"Upload"})," to attach a video instead."]})})})}function Dr(){if(typeof navigator>"u")return false;let e=navigator.userAgent||"";return /iPad|iPhone|iPod/.test(e)?true:/Macintosh/.test(e)&&typeof document<"u"&&"ontouchend"in document}function je({label:e,active:t,onClick:n}){return jsxRuntime.jsx("button",{type:"button",onClick:n,className:"lumen-tool","aria-pressed":t,children:e})}function Or({onDismiss:e}){let t=Ut.useRef(null),n=Ut.useRef(0),r=Ut.useRef(null);function o(l){l.currentTarget.setPointerCapture(l.pointerId),t.current=l.clientY,n.current=performance.now(),r.current=l.currentTarget.parentElement;}function a(l){if(t.current==null||!r.current)return;let u=Math.max(0,l.clientY-t.current);r.current.style.transform=`translateY(${u}px)`;}function i(l){if(t.current==null||!r.current)return;let u=Math.max(0,l.clientY-t.current),m=Math.max(1,performance.now()-n.current),c=u/m;r.current.style.transform="",r.current.style.transition="",t.current=null,(u>80||c>.6)&&e();}return jsxRuntime.jsx("div",{className:"lumen-modal-grabber","aria-hidden":"true",onPointerDown:o,onPointerMove:a,onPointerUp:i,onPointerCancel:i})}function Hr({stream:e}){let t=Ut.useRef(null);return Ut.useEffect(()=>{let n=t.current;if(!n)return;let r=Math.min(window.devicePixelRatio||1,2),o=n.clientWidth||88,a=n.clientHeight||22;n.width=Math.round(o*r),n.height=Math.round(a*r);let i=n.getContext("2d");if(!i)return;i.scale(r,r);let l=window.AudioContext??window.webkitAudioContext;if(!l)return;let u=new l,m=u.createMediaStreamSource(e),c=u.createAnalyser();c.fftSize=1024,c.smoothingTimeConstant=.6,m.connect(c);let p=new Uint8Array(c.fftSize),v=18,h=3,y=3,w=Math.max(2,(o-h*(v-1))/v),b=Math.min(w/2,3),x=new Array(v).fill(0),M=0,P=false;function A(){if(P)return;c.getByteTimeDomainData(p);let I=Math.floor(p.length/v);i.clearRect(0,0,o,a),i.fillStyle=_r("--lumen-danger")||"rgb(239,68,68)";for(let N=0;N<v;N++){let F=0;for(let $=0;$<I;$++){let f=Math.abs((p[N*I+$]??128)-128);f>F&&(F=f);}let ee=Math.min(1,F/128*1.8),W=x[N]??0;x[N]=ee>W?ee:W+(ee-W)*.35;let q=Math.max(y,x[N]*a),re=N*(w+h),se=(a-q)/2;Br(i,re,se,w,q,b),i.fill();}M=requestAnimationFrame(A);}return M=requestAnimationFrame(A),()=>{P=true,cancelAnimationFrame(M);try{m.disconnect();}catch{}u.close();}},[e]),jsxRuntime.jsx("canvas",{ref:t,className:"lumen-waveform","aria-hidden":"true"})}function Br(e,t,n,r,o,a){let i=Math.min(a,r/2,o/2);e.beginPath();let l=e;if(typeof l.roundRect=="function"){l.roundRect(t,n,r,o,i);return}e.moveTo(t+i,n),e.arcTo(t+r,n,t+r,n+o,i),e.arcTo(t+r,n+o,t,n+o,i),e.arcTo(t,n+o,t,n,i),e.arcTo(t,n,t+r,n,i),e.closePath();}function Vr({blob:e,durationMs:t}){let[n,r]=Ut.useState("");return Ut.useEffect(()=>{let o=URL.createObjectURL(e);return r(o),()=>{URL.revokeObjectURL(o);}},[e]),jsxRuntime.jsxs("div",{className:"lumen-audio-preview",children:[jsxRuntime.jsx("audio",{controls:true,preload:"metadata",src:n,className:"lumen-audio-el"}),jsxRuntime.jsxs("span",{className:"lumen-audio-meta",children:[Math.round(t/1e3),"s"]})]})}function _r(e){return typeof window>"u"?"":getComputedStyle(document.documentElement).getPropertyValue(e).trim()}var Fr='a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';function Ur(e){return Array.from(e.querySelectorAll(Fr)).filter(t=>!t.hasAttribute("disabled")&&t.offsetParent!==null)}function Qt({state:e,portalTarget:t,onStop:n,onCancel:r}){let[o,a]=Ut.useState(false);if(Ut.useEffect(()=>a(true),[]),!o||typeof document>"u")return null;let i=t??document.body;return e.phase==="recording"?reactDom.createPortal(jsxRuntime.jsx(Wr,{startedAt:e.startedAt,maxSeconds:e.maxSeconds,onStop:n,onCancel:r}),i):reactDom.createPortal(jsxRuntime.jsxs("div",{className:"lumen-rec-hud lumen-rec-hud-pending",role:"status","aria-live":"polite","data-lumen-root":"true","data-lumen-capture-ignore":"true",children:[jsxRuntime.jsx("span",{className:"lumen-rec-hud-spinner","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:"lumen-rec-hud-time",children:e.phase==="starting"?"Starting\u2026":"Processing\u2026"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-rec-hud-cancel",onClick:r,"aria-label":"Discard recording",children:"Discard"})]}),i)}function Wr({startedAt:e,maxSeconds:t,onStop:n,onCancel:r}){let[o,a]=Ut.useState(0);Ut.useEffect(()=>{let l=()=>a(Math.min(t,Math.max(0,Math.floor((Date.now()-e)/1e3))));l();let u=window.setInterval(l,250);return ()=>window.clearInterval(u)},[e,t]);let i=l=>`${Math.floor(l/60)}:${String(l%60).padStart(2,"0")}`;return jsxRuntime.jsxs("div",{className:"lumen-rec-hud",role:"status","aria-live":"polite","data-lumen-root":"true","data-lumen-capture-ignore":"true",children:[jsxRuntime.jsx("span",{className:"lumen-rec-hud-dot","aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"lumen-rec-hud-time",children:[i(o)," ",jsxRuntime.jsxs("span",{className:"lumen-rec-hud-max",children:["/ ",i(t)]})]}),jsxRuntime.jsx("button",{type:"button",className:"lumen-rec-hud-cancel",onClick:r,"aria-label":"Discard recording",children:"Discard"}),jsxRuntime.jsxs("button",{type:"button",className:"lumen-rec-hud-stop",onClick:n,"aria-label":"Stop recording and return to feedback",children:[jsxRuntime.jsx("span",{className:"lumen-rec-hud-square","aria-hidden":"true"}),"Stop"]})]})}function ft(e){let t=e.hasProvider&&e.providerAvailable!==false;return {canRecord:t||e.hasGetDisplayMedia,usingProvider:t}}function en(e){return typeof e=="object"&&e!==null&&e.code==="RECORDER_STOPPED"}function tn(e){return e instanceof Error?e:new Error(String(e))}function nn(e,t,n){let r=false,o=false,a=false,i=null;function l(){o||(o=true,n.onCancelled());}function u(c){o||(o=true,n.onResult(c));}function m(c){o||(o=true,n.onError(c));}return n.onStarting(),Promise.resolve().then(()=>e(t)).then(c=>{if(i=c,r){try{c.cancel();}catch{}l();return}if(n.onActive(c),a){n.onProcessing();try{c.stop();}catch{}}Promise.resolve(c.result).then(p=>{r?l():u(p);}).catch(p=>{r||en(p)?l():m(tn(p));});}).catch(c=>{r||en(c)?l():m(tn(c));}),{stop(){if(!(o||r||a)&&(a=true,i)){n.onProcessing();try{i.stop();}catch{}}},cancel(){if(!(o&&r)){if(r=true,i)try{i.cancel();}catch{}l();}}}}function rn(){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)],o=new Set,a=0;for(let i of r){let l=document.elementsFromPoint(i,n);for(let u of l){if(o.has(u))continue;o.add(u);let m=window.getComputedStyle(u);if(m.position!=="fixed"&&m.position!=="sticky")continue;let c=u.getBoundingClientRect();c.bottom<t-8||c.bottom>t+8||c.width<e*.6||c.height>a&&(a=c.height);}}return a}function gt(e,t){if(typeof document>"u"||typeof window>"u")return 0;let n=window.innerWidth,r=window.innerHeight,o=0;for(let a of e){let i;try{i=document.querySelectorAll(a);}catch{continue}for(let l of Array.from(i)){let u=l.getBoundingClientRect();if(u.height===0||u.width===0)continue;let m=0;switch(t){case "bottom":if(u.bottom<r-8)break;m=Math.max(0,r-u.top);break;case "top":if(u.top>8)break;m=Math.max(0,u.bottom);break;case "left":if(u.left>8)break;m=Math.max(0,u.right);break;case "right":if(u.right<n-8)break;m=Math.max(0,n-u.left);break}m>o&&(o=m);}}return o}function on(e){let[t,n]=Ut.useState(()=>({bottom:e.offset.y,right:e.offset.x,left:e.offset.x,top:e.offset.y})),r=Ut.useRef(t),o=jr(e.avoid),a=e.placement,i=e.offset.x,l=e.offset.y;return Ut.useEffect(()=>{if(typeof window>"u")return;let u=0,m=false,c=()=>{if(u=0,m)return;let w=a[0]==="b"?"bottom":"top",b=a[1]==="r"?"right":"left",x=0,M=0;e.avoid==="auto"&&w==="bottom"?x=rn():Array.isArray(e.avoid)&&(x=gt(e.avoid,w),M=gt(e.avoid,b));let P={bottom:w==="bottom"?l+x:0,top:w==="top"?l+x:0,right:b==="right"?i+M:0,left:b==="left"?i+M:0},A=r.current;(P.bottom!==A.bottom||P.top!==A.top||P.right!==A.right||P.left!==A.left)&&(r.current=P,n(P));},p=()=>{u||(u=window.requestAnimationFrame(c));};p();let v=typeof ResizeObserver<"u"?new ResizeObserver(p):null;v?.observe(document.documentElement);let h=typeof MutationObserver<"u"?new MutationObserver(p):null;h?.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:["class","style","hidden"]}),window.addEventListener("resize",p);let y=window.visualViewport;return y?.addEventListener("resize",p),y?.addEventListener("scroll",p),()=>{m=true,u&&window.cancelAnimationFrame(u),v?.disconnect(),h?.disconnect(),window.removeEventListener("resize",p),y?.removeEventListener("resize",p),y?.removeEventListener("scroll",p);}},[a,i,l,o]),t}function jr(e){return e===false?"false":e==="auto"?"auto":e.join("|")}function an(e){let[t,n]=Ut.useState(false);return Ut.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 o=100,a=0,i=()=>{a=0;let u=window.innerHeight-r.height;n(u>o);},l=()=>{a||(a=window.requestAnimationFrame(i));};return l(),r.addEventListener("resize",l),r.addEventListener("scroll",l),()=>{a&&window.cancelAnimationFrame(a),r.removeEventListener("resize",l),r.removeEventListener("scroll",l);}},[e]),t}function cn({config:e,portalTarget:t,hidden:n,onPointerDown:r,onClick:o}){let[a,i]=Ut.useState(null),l=Ut.useRef(null),u=on(e),m=an(e.hideOnKeyboard);if(Ut.useEffect(()=>{typeof document>"u"||i(t??document.body);},[t]),Jr(l,!n&&!m),!a)return null;let c=e.placement,p=c[0]==="b"?"bottom":"top",v=c[1]==="r"?"right":"left",h=p==="bottom"?u.bottom:u.top,y=v==="right"?u.right:u.left,w={position:"fixed",[p]:e.safeArea?`calc(${h}px + env(safe-area-inset-${p}, 0px))`:`${h}px`,[v]:e.safeArea?`calc(${y}px + env(safe-area-inset-${v}, 0px))`:`${y}px`,zIndex:e.zIndex,opacity:n||m?0:1,pointerEvents:n||m?"none":"auto",transition:"opacity 160ms ease"};return reactDom.createPortal(jsxRuntime.jsxs("button",{ref:l,type:"button",className:"lumen-btn lumen-btn-primary lumen-btn-floating",style:w,"aria-label":e.label,"aria-hidden":n||m?true:void 0,tabIndex:n||m?-1:0,onPointerDown:b=>r?.(b.nativeEvent),onClick:b=>o(b.nativeEvent),"data-lumen-trigger":"","data-lumen-capture-ignore":"true",children:[e.icon,jsxRuntime.jsx("span",{children:e.label})]}),a)}function Jr(e,t){let n=Ut.useRef(false);Ut.useEffect(()=>{if(process.env.NODE_ENV==="production"||!t||n.current||typeof window>"u")return;let r=window.setTimeout(()=>{let o=e.current;if(!o)return;let a=o.getBoundingClientRect();if(a.width===0||a.height===0)return;let i=a.left+a.width/2,l=a.top+a.height/2,u=document.elementsFromPoint(i,l),m=ln(window.getComputedStyle(o).zIndex);for(let c of u){if(c===o||o.contains(c))continue;if(ln(window.getComputedStyle(c).zIndex)>m){n.current=true,console.warn("[lumen] trigger is occluded by",c);break}}},250);return ()=>window.clearTimeout(r)},[t,e]);}function ln(e){let t=parseInt(e,10);return Number.isNaN(t)?0:t}function dn({mount:e,label:t,icon:n,onPointerDown:r,onClick:o}){let[a,i]=Ut.useState(null);return Ut.useEffect(()=>{if(typeof document>"u")return;let l=e instanceof HTMLElement?e:e.current??null;i(l);},[e]),a?reactDom.createPortal(jsxRuntime.jsxs("button",{type:"button",className:"lumen-btn lumen-btn-primary",onPointerDown:l=>r?.(l.nativeEvent),onClick:l=>o(l.nativeEvent),"aria-label":t,"data-lumen-trigger":"","data-lumen-capture-ignore":"true",children:[n,jsxRuntime.jsx("span",{children:t})]}),a):null}function fn({config:e,portalTarget:t,hidden:n,onPointerDown:r,onClick:o}){let[a,i]=Ut.useState(null),[l,u]=Ut.useState(false),m=Ut.useRef(null);if(Ut.useEffect(()=>{typeof document>"u"||i(t??document.body);},[t]),!a)return null;let c=`lumen-notch lumen-notch-${e.edge}${l?" lumen-notch-expanded":""}`;function p(w){r?.(w.nativeEvent),m.current={x:w.clientX,y:w.clientY},u(true),w.currentTarget.setPointerCapture(w.pointerId);}function v(w){let b=m.current;if(!b)return;let x=w.clientX-b.x,M=w.clientY-b.y;(e.edge==="top"&&M>16||e.edge==="bottom"&&M<-16||e.edge==="right"&&x<-16||e.edge==="left"&&x>16)&&(m.current=null,o(w.nativeEvent));}function h(){m.current=null,u(false);}function y(){m.current=null,u(false);}return reactDom.createPortal(jsxRuntime.jsxs("button",{type:"button",className:c,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:w=>o(w.nativeEvent),onPointerDown:p,onPointerMove:v,onPointerUp:h,onPointerCancel:y,onMouseEnter:()=>u(true),onMouseLeave:()=>u(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 gn(e){return {kind:"notch",edge:e.edge??"top",label:e.label??"Feedback",icon:e.icon,zIndex:e.zIndex??2147483600}}function hn(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 mo={"--lumen-bg":"background","--lumen-fg":"foreground","--lumen-primary":"accent","--lumen-radius":"radius"};function bn(e){let t=Ut.useId();Ut.useEffect(()=>{if(typeof document>"u")return;let n=document.documentElement,r=`data-lumen-theme-${po(t)}`,o={};if(e==="auto"||e==null)n.removeAttribute("data-lumen-theme");else if(e==="light"||e==="dark")o["data-lumen-theme"]=n.getAttribute("data-lumen-theme"),n.setAttribute("data-lumen-theme",e);else for(let[a,i]of Object.entries(mo)){let l=e[i];typeof l=="string"&&l.length>0&&(o[a]=n.style.getPropertyValue(a)||null,n.style.setProperty(a,l));}return n.setAttribute(r,""),()=>{n.removeAttribute(r);for(let[a,i]of Object.entries(o))a.startsWith("--")?i?n.style.setProperty(a,i):n.style.removeProperty(a):i==null?n.removeAttribute(a):n.setAttribute(a,i);}},[e,t]);}function po(e){return e.replace(/[^a-zA-Z0-9]/g,"")}var vn=Symbol.for("lumen.history.patched"),ht="lumen:locationchange";function ho(){if(typeof window>"u")return;let e=window;if(e[vn])return;e[vn]=true;let t=()=>window.dispatchEvent(new Event(ht)),n=history.pushState;history.pushState=function(...o){let a=n.apply(this,o);return t(),a};let r=history.replaceState;history.replaceState=function(...o){let a=r.apply(this,o);return t(),a},window.addEventListener("popstate",t);}function wn(e){let[t,n]=Ut.useState(false);return Ut.useEffect(()=>{if(!e){n(false);return}if(typeof window>"u")return;ho();let r=()=>{try{n(!!e({pathname:window.location.pathname}));}catch{n(false);}};return r(),window.addEventListener(ht,r),window.addEventListener("popstate",r),()=>{window.removeEventListener(ht,r),window.removeEventListener("popstate",r);}},[e]),t}var wo=["wv","Capacitor","Cordova","Expo","FBAN","FBAV","Instagram","Line/","Twitter"];function yn(){let[e,t]=Ut.useState(false);return Ut.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 o=navigator.userAgent||"";wo.some(a=>o.includes(a))&&t(true);},[]),e}var Cn="lumen.config.v1.",Co=3600*1e3;function Rn(e,t){let[n,r]=Ut.useState(()=>({trigger:null,enabled:true,shakeToOpen:false,loading:true}));return Ut.useEffect(()=>{if(typeof window>"u")return;let o=So(e);o&&r({trigger:o.trigger,enabled:En(o.trigger),shakeToOpen:o.shake,loading:false});let a=new AbortController,i=window.setTimeout(()=>a.abort(),5e3),l=`${t.replace(/\/$/,"")}/api/v1/sdk/config?apiKey=${encodeURIComponent(e)}`;return fetch(l,{method:"GET",mode:"cors",credentials:"omit",signal:a.signal}).then(async u=>{if(!u.ok)throw new Error(`HTTP ${u.status}`);let m=await u.json(),c=xn(m.trigger);if(!c)throw new Error("Malformed config response");let p=ko(m.trigger);Mo(e,c,p),r({trigger:c,enabled:En(c),shakeToOpen:p,loading:false});}).catch(()=>{r(u=>u.loading?{trigger:null,enabled:true,shakeToOpen:false,loading:false}:u);}).finally(()=>window.clearTimeout(i)),()=>{window.clearTimeout(i),a.abort();}},[e,t]),n}function En(e){return e.kind!=="headless"}var Ro=["br","bl","tr","tl"],xo=["top","right","bottom","left"];function xn(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:Ro.find(o=>o===t.placement)??"br",label:n}:t.kind==="notch"?{kind:"notch",edge:xo.find(o=>o===t.edge)??"top",label:n}:null}function ko(e){return !e||typeof e!="object"?false:e.shake===true}function So(e){try{let t=window.localStorage.getItem(Cn+e);if(!t)return null;let n=JSON.parse(t);if(typeof n?.fetchedAt!="number"||Date.now()-n.fetchedAt>Co)return null;let r=xn(n.trigger);return r?{fetchedAt:n.fetchedAt,trigger:r,shake:n.shake===!0}:null}catch{return null}}function Mo(e,t,n){try{window.localStorage.setItem(Cn+e,JSON.stringify({fetchedAt:Date.now(),trigger:t,shake:n}));}catch{}}function Po(e){if(e&&typeof e=="object")return e.type===ze;if(typeof e=="string")try{return JSON.parse(e).type===ze}catch{return false}return false}function Lo(e={}){let t=e.threshold??18,n=e.neededHits??3,r=e.windowMs??700,o=e.throttleMs??60,a=null,i=[];return {push(l,u,m,c){if(!a)return a={x:l,y:u,z:m,t:c},false;if(c-a.t<o)return false;let p=Math.abs(l-a.x)+Math.abs(u-a.y)+Math.abs(m-a.z);return a={x:l,y:u,z:m,t:c},p<t?false:(i=i.filter(v=>c-v<r),i.push(c),i.length>=n?(i=[],true):false)}}}function kn(e,t,n){Ut.useEffect(()=>{if(!e||typeof window>"u")return;let r=0,o=1500;function a(){let c=Date.now();n||c-r<o||(r=c,t());}let i=c=>{Po(c.data)&&a();};window.addEventListener("message",i),document.addEventListener("message",i);let l=Lo(),u=c=>{let p=c.accelerationIncludingGravity??c.acceleration;!p||p.x==null||p.y==null||p.z==null||l.push(p.x,p.y,p.z,Date.now())&&a();},m=typeof window.DeviceMotionEvent<"u"&&typeof window.DeviceMotionEvent.requestPermission!="function";return m&&window.addEventListener("devicemotion",u),()=>{window.removeEventListener("message",i),document.removeEventListener("message",i),m&&window.removeEventListener("devicemotion",u);}},[e,t,n]);}var Mn="https://shakebugs.vercel.app",Ke=60;function Tn(){return typeof navigator<"u"&&!!navigator.mediaDevices&&typeof navigator.mediaDevices.getDisplayMedia=="function"}function Ao({apiKey:e,apiUrl:t,user:n,amplitude:r,floatingButton:o=true,trigger:a,hideOn:i,theme:l,portalTarget:u,capture:m,record:c,shakeToOpen:p,onOpenChange:v,beforeOpen:h,onTriggerActivate:y,children:w}){let[b,x]=Ut.useState(false),[M,P]=Ut.useState(false),[A,I]=Ut.useState(null),[N,F]=Ut.useState(null),[ee]=Ut.useState(false),[W]=Ut.useState(null),q=Ut.useRef(false),re=Ut.useRef(false),se=Ut.useRef(null),$=Ut.useMemo(()=>new St({apiKey:e,apiUrl:t,user:n,amplitude:r}),[e,t,n?.id,n?.email,n?.name,r?.userId,r?.deviceId,r?.sessionId]);Ut.useEffect(()=>{Dt({ignoreUrlPrefix:(t??Mn).replace(/\/$/,"")});},[t]);let f=Ut.useRef(v);f.current=v,Ut.useEffect(()=>{if(!(typeof document>"u"))return b?document.body.setAttribute("data-lumen-open","true"):document.body.removeAttribute("data-lumen-open"),()=>{document.body.removeAttribute("data-lumen-open");}},[b]);let g=Ut.useRef(null);Ut.useEffect(()=>{if(g.current===b)return;let S=g.current;g.current=b,S!==null&&f.current?.(b);},[b]);let R=Ut.useRef(h);R.current=h;let k=Ut.useRef(y);k.current=y;let _=Ut.useCallback(S=>{re.current=true,se.current=Promise.resolve().then(()=>R.current?.(S)).then(()=>k.current?.(S)).then(()=>{});},[]),O=Ut.useCallback(S=>{q.current||b||j.current||(q.current=true,P(true),I(null),F(null),(async()=>{try{if(re.current?await se.current:(await R.current?.(S),await k.current?.(S)),m?.mode==="manual")I(null),F(null);else if(m?.provider)I(null),F(null);else {let B=await We({...m,mode:m?.mode??"auto",target:m?.target??document.documentElement});I(B);}}catch(B){F(B instanceof Error?B:new Error(String(B)));}finally{re.current=false,se.current=null,q.current=false,P(false),x(true);}})());},[m,b]),X=Ut.useCallback(()=>x(false),[]),L=Ut.useCallback($.submit.bind($),[$]),[K,H]=Ut.useState(null),[ue,Ce]=Ut.useState(null),te=Ut.useRef(null),z=Ut.useRef(null),j=Ut.useRef(false),J=Ut.useRef(null),me=Ut.useRef(null),he=Ut.useRef(null),Re=Ut.useCallback((S,B=false)=>{if(te.current=null,z.current=null,j.current=false,H(null),!S){J.current=null;return}me.current={blob:S.blob,durationMs:S.durationMs,poster:J.current,deriveBlobPoster:B},J.current=null,x(true);},[]);Ut.useEffect(()=>{if(!b)return;if(!c?.provider){Ce(null);return}let S=c.isAvailable;if(!S){Ce(true);return}let B=false;return Promise.resolve().then(()=>S()).then(V=>{B||Ce(V);}).catch(()=>{B||Ce(false);}),()=>{B=true;}},[b,c?.provider,c?.isAvailable]);let be=ft({hasProvider:!!c?.provider,providerAvailable:ue,hasGetDisplayMedia:Tn()}).canRecord,Pe=Ut.useCallback(async()=>{if(j.current)return;if(he.current=null,ft({hasProvider:!!c?.provider,providerAvailable:ue,hasGetDisplayMedia:Tn()}).usingProvider&&c?.provider){j.current=true,J.current=null,x(false),z.current=nn(c.provider,{maxDurationSeconds:Ke},{onStarting:()=>H({phase:"starting"}),onActive:V=>{H({phase:"recording",stream:V.stream??null,startedAt:Date.now(),maxSeconds:Ke}),V.stream&&ct(V.stream).then(Ye=>{J.current=Ye;}).catch(()=>{});},onProcessing:()=>H({phase:"processing"}),onResult:V=>Re({blob:V.blob,durationMs:V.durationMs},true),onCancelled:()=>{z.current=null,j.current=false,J.current=null,H(null),I(null),F(null),x(true);},onError:V=>{z.current=null,j.current=false,J.current=null,H(null),he.current=V.message||"Screen recording could not start.",x(true);}});return}if(te.current)return;let B=await Vt(Ke);te.current=B,j.current=true,J.current=null,H({phase:"recording",stream:B.stream,startedAt:Date.now(),maxSeconds:Ke}),x(false),ct(B.stream).then(V=>{J.current=V;}).catch(()=>{}),B.result.then(V=>Re(V)).catch(()=>Re(null));},[Re,c?.provider,ue]),xe=Ut.useCallback(()=>{z.current?z.current.stop():te.current?.stop();},[]),oe=Ut.useCallback(()=>{if(z.current){z.current.cancel();return}let S=te.current;te.current=null,j.current=false,J.current=null,H(null),S?.cancel(),I(null),F(null),x(true);},[]),ke=Ut.useCallback(()=>{let S=me.current;return me.current=null,S},[]),pe=Ut.useCallback(()=>{let S=he.current;return he.current=null,S},[]);Ut.useEffect(()=>{b||(he.current=null);},[b]);let Le=yn(),Se=wn(i);bn(l);let Me=Rn(a?"":e,t??Mn),Ge=p??Me.shakeToOpen;kn(Ge,O,b);let Be=Ut.useMemo(()=>({client:$,user:n,isOpen:b,isSubmitting:ee,error:W,open:O,close:X,openCapture:O,closeCapture:X,submit:L,isNativeShell:Le,capture:m,initialCapture:A,initialCaptureError:N,isOpening:M,startVideoSession:Pe,stopVideoSession:xe,cancelVideoSession:oe,recording:K,consumePendingVideo:ke,canRecordScreen:be,consumeRecordStartError:pe}),[$,n,b,ee,W,O,X,L,Le,m,A,N,Pe,xe,oe,K,ke,be,pe,M]),Z=Do({explicit:a,remote:Me.trigger,remoteLoading:Me.loading,floatingButton:o});return jsxRuntime.jsxs(nt.Provider,{value:Be,children:[w,Z?.kind==="floating"?jsxRuntime.jsx(cn,{config:hn(Z),portalTarget:u,hidden:Se||M||K!=null,onPointerDown:_,onClick:S=>O(S)}):null,Z?.kind==="notch"?jsxRuntime.jsx(fn,{config:gn(Z),portalTarget:u,hidden:Se||M||K!=null,onPointerDown:_,onClick:S=>O(S)}):null,Z?.kind==="inline"?jsxRuntime.jsx(dn,{mount:Z.mount,label:Z.label??"Feedback",icon:Z.icon,onPointerDown:_,onClick:S=>O(S)}):null,K?jsxRuntime.jsx(Qt,{state:K,portalTarget:u,onStop:xe,onCancel:oe}):null,jsxRuntime.jsx(pt,{}),jsxRuntime.jsx(Io,{})]})}function Io(){let[e,t]=Ut.useState(false);return Ut.useEffect(()=>{t(!document.querySelector("[data-sonner-toaster]"));},[]),e?jsxRuntime.jsx(sonner.Toaster,{position:"top-center",style:{zIndex:2147483647}}):null}function Do(e){return e.explicit?e.explicit:e.floatingButton===false?{kind:"headless"}:e.remote?e.remote:e.remoteLoading?null:{kind:"floating"}}function Ho({variant:e="default",floating:t=false,className:n,children:r="Feedback",onClick:o,...a}){let{openCapture:i}=De(),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,"data-lumen-trigger":"",onClick:u=>{o?.(u),u.defaultPrevented||i(u.nativeEvent);},...a,children:r})}
|
|
4
|
-
exports.CaptureModal=pt;exports.FeedbackButton=
|
|
2
|
+
'use strict';var Ut=require('react'),sonner=require('sonner'),jsxRuntime=require('react/jsx-runtime'),reactDom=require('react-dom');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Ut__namespace=/*#__PURE__*/_interopNamespace(Ut);var T=class extends Error{constructor(e,t,n){super(e),this.code=t,this.status=n,this.name="LumenError";}code;status},bt=class extends T{constructor(){super("Origin not allowed. Add this origin in your Lumen project settings.","ORIGIN_NOT_ALLOWED",403),this.name="LumenOriginError";}},vt=class extends T{constructor(e){super(`Rate limited \u2014 retry after ${e}s.`,"RATE_LIMITED",429),this.retryAfter=e,this.name="LumenRateLimitError";}retryAfter},_e=class extends T{constructor(e){super(e,"NETWORK_ERROR"),this.name="LumenNetworkError";}},On="https://shakebugs.vercel.app",Hn="/api/v1/sdk/submit",Bn=new Set([502,503,504]),kt=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??On).replace(/\/$/,""),this.user=e.user,this.amplitude=e.amplitude;}async submit(e,t={}){let n=`${this.apiUrl}${Hn}`,r=this.#e(e),o=null;for(let a=0;a<3;a++){a>0&&await _n(2**a*250);try{return await this.#t(n,r,t)}catch(i){if(o=i,i instanceof bt||i instanceof vt||i instanceof T&&typeof i.status=="number"&&!Bn.has(i.status))throw i}}throw o instanceof Error?o:new _e("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 n=e.context.amplitude??this.amplitude,r=n?{...e.context,amplitude:n}:e.context;return t.append("context",JSON.stringify(r)),e.screenshot&&t.append("screenshot",e.screenshot,Vn(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,n){return new Promise((r,o)=>{let a=new XMLHttpRequest;a.open("POST",e,true),a.setRequestHeader("X-Lumen-Api-Key",this.apiKey),a.responseType="text";let{onUploadProgress:i,signal:l}=n;i&&a.upload.addEventListener("progress",m=>{m.lengthComputable&&m.total>0&&i(Math.min(1,m.loaded/m.total));});let s=()=>{a.abort(),o(new _e("Submit aborted."));};if(l){if(l.aborted){o(new _e("Submit aborted."));return}l.addEventListener("abort",s,{once:true});}a.addEventListener("load",()=>{if(l&&l.removeEventListener("abort",s),a.status===403){o(new bt);return}if(a.status===429){let m=Number(a.getResponseHeader("Retry-After"))||60;o(new vt(m));return}if(a.status<200||a.status>=300){o(new T(Fn(a.responseText)??`HTTP ${a.status}`,"HTTP_ERROR",a.status));return}try{let m=JSON.parse(a.responseText);r(m);}catch{o(new T("Malformed response from server.","BAD_RESPONSE"));}}),a.addEventListener("error",()=>{l&&l.removeEventListener("abort",s),o(new _e("Network error during submit."));}),a.send(t);})}};function Vn(e){return `screenshot.${e.type==="image/jpeg"?"jpg":e.type==="image/webp"?"webp":"png"}`}function _n(e){return new Promise(t=>setTimeout(t,e))}function Fn(e){try{let t=JSON.parse(e);return t.error??t.message??null}catch{return e||null}}var Un=2,Ne=8*1024*1024;async function We(e={}){Pt();let t=e.mode??"auto";if(e.provider&&(t==="auto"||t==="custom"))try{return qn(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 T("Manual screenshot upload is required for this capture mode.","MANUAL_CAPTURE_REQUIRED");if(t==="true-screen")return yt(e);if(t==="dom")return wt(e);if(t==="custom")throw new T("`capture.provider` is required when capture mode is `custom`.","CAPTURE_PROVIDER_REQUIRED");try{return await wt(e)}catch(n){if(Tt()){let r=await yt(e);return r.warnings=Ie(["DOM screenshot failed; used browser screen permission fallback.",...r.warnings]),e.onWarning?.(r.warnings),r}throw n}}function Ae(e,t=[]){Pt();let n=$e();return {blob:e,method:"manual-upload",platform:"web",viewport:n,pixelRatio:window.devicePixelRatio??1,warnings:Ie(t)}}async function wt(e){let t=await zn(),n=e.target??document.documentElement,r=$e(),o=Math.max(1,Math.min(window.devicePixelRatio??1,e.maxScale??Un)),a=jn(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:o,ignoreElements:s=>s instanceof HTMLElement&&(s.dataset.lumenCaptureIgnore==="true"||!!s.closest("[data-lumen-capture-ignore='true']")),onclone:$n}),l={blob:await Mt(i,a),method:"web-dom",platform:"web",viewport:r,pixelRatio:o,warnings:Ie(a)};return l.warnings.length>0&&e.onWarning?.(l.warnings),l}var Wn=['input[type="password"]','input[autocomplete^="cc-"]','input[autocomplete="one-time-code"]',"[data-lumen-mask]"].join(", ");function $n(e){for(let t of Array.from(e.querySelectorAll(Wn))){if(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement){t.value&&(t.value="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022");continue}t instanceof HTMLElement&&(t.style.visibility="hidden");}}async function zn(){let{default:e}=await import('html2canvas-pro');return e}async function yt(e){if(!Tt())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 n=document.createElement("video");n.muted=!0,n.playsInline=!0,n.srcObject=t,await Kn(n);let r=document.createElement("canvas");r.width=n.videoWidth,r.height=n.videoHeight;let o=r.getContext("2d");if(!o)throw new T("Could not create a drawing context for screen capture.","CANVAS_CONTEXT_UNAVAILABLE");o.drawImage(n,0,0,r.width,r.height);let a=$e(),i=["Browser screen capture uses the window or tab selected by the user."],l={blob:await Mt(r,i),method:"web-display-media",platform:"web",viewport:a,pixelRatio:a.width>0?r.width/a.width:void 0,warnings:Ie(i)};return e.onWarning?.(l.warnings),l}finally{for(let n of t.getTracks())n.stop();}}function qn(e,t){let n=$e(),r={...e,method:e.method??"custom",platform:e.platform??"custom",viewport:e.viewport??n,pixelRatio:e.pixelRatio??window.devicePixelRatio??1,warnings:Ie(e.warnings??[])};return r.warnings.length>0&&t.onWarning?.(r.warnings),r}function jn(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 o=r.currentSrc||r.src;if(o)try{new URL(o,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 Mt(e,t){let n=await Et(e,"image/png",.92);if(n.size<=Ne)return n;t.push("Screenshot exceeded the upload cap and was compressed.");let r=e,o=0;for(;n.size>Ne&&o<6;){let a=Math.max(.35,Math.min(.95,Math.sqrt(Ne/n.size)*.9)),i=document.createElement("canvas");i.width=Math.max(1,Math.round(r.width*a)),i.height=Math.max(1,Math.round(r.height*a));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 Et(r,"image/jpeg",s),n.size<=Ne)return n;if(o+=1,i.width<480||i.height<320)break}return n.size>Ne&&t.push("Screenshot remained large after compression; upload may be rejected."),n}function Et(e,t,n){return new Promise((r,o)=>{e.toBlob(a=>{if(!a){o(new T("Could not encode screenshot.","ENCODE_FAILED"));return}r(a);},t,n);})}function $e(){let e=window.visualViewport;return {width:Math.round(e?.width??window.innerWidth),height:Math.round(e?.height??window.innerHeight)}}function Tt(){return !!navigator.mediaDevices?.getDisplayMedia}async function Kn(e){await new Promise((r,o)=>{let a=()=>r(),i=()=>o(new T("Could not read screen capture video.","VIDEO_FAILED"));e.addEventListener("loadedmetadata",a,{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 T("Screen capture did not produce a frame in time.","VIDEO_TIMEOUT");await new Promise(r=>requestAnimationFrame(()=>r()));}}function Pt(){if(typeof window>"u"||typeof document>"u")throw new T("Screenshot capture can only run in the browser.","INVALID_ENV")}function Ie(e){return Array.from(new Set(e.filter(Boolean)))}var Lt=/^(token|access_token|refresh_token|id_token|api_?key|key|secret|password|passwd|pwd|auth|authorization|sig|signature|session|sessionid|sid|email|jwt)$/i;function Ze(e){let t=e;return t=t.replace(/\b(Bearer|Basic)\s+[A-Za-z0-9._\-+/=]+/gi,"$1 ***"),t=t.replace(/\b([A-Za-z_][\w-]*)\s*[=:]\s*("?)([^"\s&]{6,})\2/g,(n,r,o,a)=>/^(Bearer|Basic)$/i.test(a)?n:Lt.test(r)?`${r}=${o}***${o}`:a.length>=24&&/^[A-Za-z0-9._\-+/=]+$/.test(a)&&!a.includes(" ")?`${r}=${o}${a.slice(0,4)}\u2026${o}`:n),t=t.replace(/\b[\w.+-]+@[\w-]+\.[\w.-]+\b/g,"***@***"),t}function Nt(e){try{let t=new URL(e,"http://relative.invalid");for(let r of [...t.searchParams.keys()])Lt.test(r)&&t.searchParams.set(r,"***");t.hash="";let n=t.toString();return Ze(t.host==="relative.invalid"?n.replace(/^http:\/\/relative\.invalid/,""):n)}catch{return Ze(e)}}function At(e){try{let t=new URL(e);return `${t.origin}${t.pathname}`}catch{return Nt(e)}}var Ct=200,Rt=4096,It=[],Fe=[],xt=false,Qe=null;function Dt(e={}){xt||typeof window>"u"||(xt=true,Qe=e.ignoreUrlPrefix??null,Jn(),Zn(),Qn());}function Gn(){return {consoleLog:It.slice(),networkLog:Fe.slice()}}function Ue(e,t){e.push(t),e.length>Ct&&e.splice(0,e.length-Ct);}function Yn(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,Xn));}catch{t.push(String(r));}}let n=t.join(" ");return n.length>Rt?n.slice(0,Rt)+"\u2026[truncated]":n}function Xn(e,t){return t instanceof Element?`[Element ${t.tagName}]`:typeof t=="function"?"[Function]":t}function Jn(){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]=(...o)=>{try{Ue(It,{level:n,ts:Date.now(),message:Ze(Yn(o))});}catch{}r(...o);});}}function Ot(e){return Qe?e.startsWith(Qe):false}function Zn(){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,o=(n?.method??(t instanceof Request?t.method:"GET")).toUpperCase();if(Ot(r))return e.call(window,t,n);let a=performance.now();try{let i=await e.call(window,t,n);return Ue(Fe,{type:"fetch",method:o,url:et(r),status:i.status,ok:i.ok,durationMs:Math.round(performance.now()-a),ts:Date.now()}),i}catch(i){throw Ue(Fe,{type:"fetch",method:o,url:et(r),status:0,ok:false,durationMs:Math.round(performance.now()-a),ts:Date.now(),error:i instanceof Error?i.message:"fetch error"}),i}});}function Qn(){let e=window.XMLHttpRequest;if(!e)return;let t=e.prototype.open,n=e.prototype.send;e.prototype.open=function(r,o,...a){return this.__lumen={method:String(r).toUpperCase(),url:typeof o=="string"?o:o.toString(),t:0},t.call(this,r,o,...a)},e.prototype.send=function(r){let o=this.__lumen;if(o&&!Ot(o.url)){o.t=performance.now();let a=()=>{try{Ue(Fe,{type:"xhr",method:o.method,url:et(o.url),status:this.status,ok:this.status>=200&&this.status<400,durationMs:Math.round(performance.now()-o.t),ts:Date.now()});}catch{}this.removeEventListener("loadend",a);};this.addEventListener("loadend",a);}return n.call(this,r??null)};}function er(e){return e.length>512?e.slice(0,512)+"\u2026":e}function et(e){return er(Nt(e))}function Ht(e){if(typeof window>"u")return {url:"",userAgent:"",viewport:{width:0,height:0},capture:St(e),consoleLog:[],networkLog:[]};let t=Gn();return {url:At(window.location.href),userAgent:navigator.userAgent,viewport:{width:window.innerWidth,height:window.innerHeight},capture:St(e),device:tr(),consoleLog:t.consoleLog,networkLog:t.networkLog}}function tr(){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?At(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 St(e){if(e)return {method:e.method,platform:e.platform,viewport:e.viewport,pixelRatio:e.pixelRatio,warnings:e.warnings}}var ze="lumen:shake",nr=8e3,rr=50,or='[data-lumen-root], [data-lumen-capture-ignore="true"]';function ar(e={}){return async function(){if(typeof window>"u")throw new T("Native capture bridge requires a WebView/browser window.","INVALID_ENV");let t=lr(),n=e.send??ir,r=e.timeoutMs??nr,o=e.captureSettleMs??rr,a=pr(),i=ur(e.concealSelector===void 0?or:e.concealSelector);try{await cr(o);let l=await new Promise((c,p)=>{let v=window.setTimeout(()=>{t.pending.delete(a),p(new T("Native screenshot timed out; the host did not respond.","NATIVE_CAPTURE_TIMEOUT"));},r);t.pending.set(a,{resolve:h=>{window.clearTimeout(v),c(h);},reject:h=>{window.clearTimeout(v),p(h);}});try{n({type:"lumen:capture-request",id:a,afterScreenUpdates:!0});}catch{t.pending.delete(a),window.clearTimeout(v),p(new T("Could not reach the native host for screen capture.","NATIVE_CAPTURE_UNAVAILABLE"));}});if(l.error||!l.dataUrl)throw new T(l.error??"Native screenshot returned no image.","NATIVE_CAPTURE_FAILED");let s=fr(l.dataUrl),m=e.platform??mr();return {blob:s,method:m==="android"?"android-native":"ios-native",platform:m,viewport:{width:Math.round(window.innerWidth),height:Math.round(window.innerHeight)},pixelRatio:l.pixelRatio??window.devicePixelRatio??1,warnings:[]}}finally{i();}}}function ir(e){let t=window.ReactNativeWebView;if(!t?.postMessage)throw new T("window.ReactNativeWebView is unavailable; pass a custom `send`.","NATIVE_CAPTURE_UNAVAILABLE");t.postMessage(JSON.stringify(e));}function lr(){if(window.__lumenNativeCapture)return window.__lumenNativeCapture;let e={pending:new Map,resolve(n,r,o){let a=e.pending.get(n);a&&(e.pending.delete(n),a.resolve({type:"lumen:capture-response",id:n,dataUrl:r,pixelRatio:o}));},reject(n,r){let o=e.pending.get(n);o&&(e.pending.delete(n),o.resolve({type:"lumen:capture-response",id:n,error:r}));}},t=n=>{let r=sr(n.data);if(!r||r.type!=="lumen:capture-response")return;let o=e.pending.get(r.id);o&&(e.pending.delete(r.id),o.resolve(r));};return window.addEventListener("message",t),document.addEventListener("message",t),window.__lumenNativeCapture=e,e}function sr(e){if(e&&typeof e=="object"&&"type"in e)return e;if(typeof e=="string")try{let t=JSON.parse(e);if(t&&typeof t=="object"&&t.type)return t}catch{}return null}function ur(e){if(!e||typeof document>"u")return ()=>{};let t=[];for(let n of Array.from(document.querySelectorAll(e)))t.push({el:n,prev:n.style.visibility}),n.style.visibility="hidden";return ()=>{for(let{el:n,prev:r}of t)n.style.visibility=r;}}async function cr(e){await dr(),e>0&&await new Promise(t=>window.setTimeout(t,e));}function dr(){return new Promise(e=>{requestAnimationFrame(()=>e());})}function mr(){let e=navigator.userAgent||"";return /android/i.test(e)?"android":"ios"}function pr(){return `lumen-cap-${typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():Math.random().toString(36).slice(2)}`}function fr(e){let t=/^data:([^;,]*)(;base64)?,(.*)$/s.exec(e);if(!t)throw new T("Native host returned an invalid image data URL.","NATIVE_CAPTURE_FAILED");let n=t[1]||"image/png",r=!!t[2],o=t[3]??"";if(!r)return new Blob([decodeURIComponent(o)],{type:n});let a=atob(o),i=new Uint8Array(a.length);for(let l=0;l<a.length;l++)i[l]=a.charCodeAt(l);return new Blob([i],{type:n})}var gr="[data-lumen-root]",hr="[data-lumen-root], [data-lumen-trigger], [data-lumen-capture-ignore='true']";function br(e){let t=typeof e.composedPath=="function"?e.composedPath():[];for(let n of t)if(tt(n))return true;return tt(e.target)}function tt(e){return e?typeof Element<"u"&&e instanceof Element?e.matches(hr)?true:!!e.closest(gr):typeof ShadowRoot<"u"&&e instanceof ShadowRoot?tt(e.host):false:false}async function Bt(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 n=["audio/webm;codecs=opus","audio/webm","audio/mp4","audio/ogg;codecs=opus"].find(h=>MediaRecorder.isTypeSupported(h))??"",r=new MediaRecorder(t,n?{mimeType:n}:void 0),o=[],a=performance.now(),i=null,l=false,s=false,m,c,p=new Promise((h,y)=>{m=h,c=y;});p.catch(()=>{}),r.addEventListener("dataavailable",h=>{h.data&&h.data.size>0&&o.push(h.data);}),r.addEventListener("stop",()=>{i!==null&&window.clearTimeout(i),i=null;for(let b of t.getTracks())b.stop();if(s)return;if(s=true,l){c(new T("Recording cancelled.","RECORDER_STOPPED"));return}let h=performance.now()-a,y=r.mimeType||n||"audio/webm",w=new Blob(o,{type:y});m({blob:w,durationMs:h,mimeType:y});}),r.start(),i=window.setTimeout(()=>{r.state!=="inactive"&&r.stop();},e*1e3);function v(){if(r.state!=="inactive")try{r.stop();}catch{}}return {stream:t,cancel(){l=true,v(),i!==null&&window.clearTimeout(i),i=null;for(let h of t.getTracks())h.stop();},stop(){return v(),p}}}async function Vt(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 n=["video/webm;codecs=vp9,opus","video/webm;codecs=vp8,opus","video/webm","video/mp4"].find(y=>MediaRecorder.isTypeSupported(y))??"",r=new MediaRecorder(t,n?{mimeType:n}:void 0),o=[],a=performance.now(),i=null,l=false,s=false,m,c,p=new Promise((y,w)=>{m=y,c=w;});p.catch(()=>{});function v(){i!==null&&(window.clearTimeout(i),i=null);for(let y of t.getTracks())y.stop();}r.addEventListener("dataavailable",y=>{y.data&&y.data.size>0&&o.push(y.data);}),r.addEventListener("stop",()=>{if(l)return;if(l=true,v(),s){c(new T("Recording cancelled.","RECORDER_STOPPED"));return}let y=r.mimeType||n||"video/webm";m({blob:new Blob(o,{type:y}),durationMs:performance.now()-a,mimeType:y});});function h(){r.state!=="inactive"&&r.stop();}return r.start(),i=window.setTimeout(h,e*1e3),t.getVideoTracks()[0]?.addEventListener("ended",h),{stream:t,result:p,stop:h,cancel(){s=true,r.state!=="inactive"?r.stop():l||(l=true,v(),c(new T("Recording cancelled.","RECORDER_STOPPED")));}}}var nt=Ut.createContext(null);function De(){let e=Ut.useContext(nt);if(!e)throw new Error("useLumen() must be used inside <LumenProvider>.");return e}var ot='-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, ui-sans-serif, sans-serif';function Ft(e,t=1){return Math.max(0,Math.min(t,e))}var Wt=Ut__namespace.forwardRef(function({screenshot:t,tool:n,color:r="rgb(239, 68, 68)",strokeWidth:o=4,onDrawingChange:a},i){let l=Ut.useRef(null),s=Ut.useRef(null),m=Ut.useRef(null),[c,p]=Ut.useState(null),[v,h]=Ut.useState([]),y=Ut.useRef(null),w=Ut.useRef(false),b=Ut.useRef(0),x=Ut.useRef(false),[M,P]=Ut.useState([]),A=Ut.useRef(0),I=Ut.useRef([]),N=Ut.useRef(null),F=Ut.useCallback((f,g)=>{P(R=>R.map(S=>S.id===f?{...S,text:g}:S));},[]),ee=Ut.useCallback(f=>{P(R=>R.filter(S=>S.id!==f));let g=I.current.lastIndexOf("comment");g>=0&&I.current.splice(g,1);},[]);Ut.useEffect(()=>{let f=N.current;if(f==null)return;N.current=null,m.current?.querySelector(`[data-bubble-id="${f}"] .lumen-bubble-text`)?.focus();},[M]),Ut.useEffect(()=>{let f=false,g=null;return (async()=>{try{let R=await createImageBitmap(t);if(f){R.close?.();return}g=R,p(R);}catch{}})(),()=>{f=true,g?.close?.();}},[t]),Ut.useEffect(()=>{if(!c)return;let f=l.current,g=s.current;if(!f||!g)return;f.width=c.width,f.height=c.height,g.width=c.width,g.height=c.height;let R=f.getContext("2d");R&&(R.imageSmoothingEnabled=false,R.drawImage(c,0,0));},[c]),Ut.useEffect(()=>{let f=s.current;f&&qe(f,v,y.current);},[v]),Ut.useImperativeHandle(i,()=>({hasAnnotations:()=>v.length>0||M.some(f=>f.text.trim().length>0),reset:()=>{h([]),P([]),I.current=[];},undo:()=>{(I.current.pop()??"anno")==="comment"?P(g=>g.length===0?g:g.slice(0,-1)):h(g=>g.length===0?g:g.slice(0,-1));},async flatten(){let f=y.current,g=f?[...v,f]:v,R=M.filter(L=>L.text.trim().length>0);if(g.length===0&&R.length===0||!c)return t;let S=document.createElement("canvas");S.width=c.width,S.height=c.height;let _=S.getContext("2d");if(!_)return t;_.imageSmoothingEnabled=false,_.drawImage(c,0,0);for(let L of g)at(_,L);let O=l.current?.clientWidth||c.width,X=c.width/Math.max(O,1);for(let L of R)xr(_,L,c.width,c.height,X);return await new Promise(L=>{S.toBlob(K=>{L(K??t);},"image/jpeg",.85);})}}),[v,M,c,t]);function W(f){let g=s.current;if(!g)return {x:0,y:0};let R=g.getBoundingClientRect(),S=g.width/Math.max(R.width,1),_=g.height/Math.max(R.height,1);return {x:(f.clientX-R.left)*S,y:(f.clientY-R.top)*_}}function q(){x.current||(x.current=true,requestAnimationFrame(()=>{x.current=false;let f=s.current;f&&qe(f,v,y.current);}));}function oe(f){if(f.button!==void 0&&f.button!==0)return;if(n==="comment"){let R=s.current;if(!R)return;let S=R.getBoundingClientRect(),_=Ft((f.clientX-S.left)/Math.max(S.width,1),.72),O=Ft((f.clientY-S.top)/Math.max(S.height,1),.8),X=++A.current;P(L=>[...L,{id:X,x:_,y:O,text:"",color:r}]),I.current.push("comment"),N.current=X;return}try{f.currentTarget.setPointerCapture(f.pointerId);}catch{}w.current=true,a?.(true);let g=W(f);n==="arrow"?y.current={kind:"arrow",from:g,to:g,color:r,width:o}:n==="rect"?y.current={kind:"rect",from:g,to:g,color:r,width:o}:y.current={kind:"freehand",points:[g],color:r,width:o},b.current=performance.now(),q();}function se(f){if(!w.current||!y.current)return;let g=W(f),R=y.current;if(R.kind==="arrow"||R.kind==="rect")R.to=g;else {let S=R.points[R.points.length-1],_=S?(S.x-g.x)**2+(S.y-g.y)**2:1/0,O=performance.now(),X=O-b.current;(_>16||X>16)&&(R.points.push(g),b.current=O);}q();}function $(){if(!w.current)return;w.current=false,a?.(false);let f=y.current;if(y.current=null,!!f){if(f.kind==="arrow"||f.kind==="rect"){let g=f.to.x-f.from.x,R=f.to.y-f.from.y;if(g*g+R*R<16){let S=s.current;S&&qe(S,v,null);return}}else if(f.points.length<2){let g=s.current;g&&qe(g,v,null);return}h(g=>[...g,f].slice(-50)),I.current.push("anno");}}return jsxRuntime.jsxs("div",{ref:m,className:"lumen-annotate-frame","data-lumen-tool":n,children:[jsxRuntime.jsx("canvas",{ref:l}),jsxRuntime.jsx("canvas",{ref:s,className:"lumen-annotate-overlay",onPointerDown:oe,onPointerMove:se,onPointerUp:$,onPointerCancel:$}),jsxRuntime.jsx("div",{className:"lumen-bubble-layer",children:M.map(f=>jsxRuntime.jsx(Cr,{comment:f,onChange:F,onRemove:ee},f.id))})]})});function Cr({comment:e,onChange:t,onRemove:n}){let r=Ut.useRef(null);return Ut.useEffect(()=>{let o=r.current;o&&o.textContent!==e.text&&(o.textContent=e.text);},[]),jsxRuntime.jsxs("div",{className:"lumen-bubble","data-bubble-id":e.id,style:{left:`${e.x*100}%`,top:`${e.y*100}%`,"--lumen-bubble-accent":e.color},onPointerDown:o=>o.stopPropagation(),children:[jsxRuntime.jsx("span",{className:"lumen-bubble-label",children:"Comment"}),jsxRuntime.jsx("div",{ref:r,className:"lumen-bubble-text",contentEditable:true,suppressContentEditableWarning:true,role:"textbox","aria-label":"Comment text","data-placeholder":"Type a note\u2026",onInput:o=>t(e.id,o.currentTarget.textContent??"")}),jsxRuntime.jsx("button",{type:"button",className:"lumen-bubble-del","aria-label":"Remove comment",onPointerDown:o=>o.stopPropagation(),onClick:()=>n(e.id),children:"\xD7"})]})}function qe(e,t,n){let r=e.getContext("2d");if(r){r.clearRect(0,0,e.width,e.height);for(let o of t)at(r,o);n&&at(r,n);}}function at(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),o=Math.abs(t.to.x-t.from.x),a=Math.abs(t.to.y-t.from.y);e.strokeRect(n,r,o,a);}else if(t.kind==="freehand")Rr(e,t.points);else {let{from:n,to:r,width:o}=t;e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(r.x,r.y),e.stroke();let a=Math.atan2(r.y-n.y,r.x-n.x),i=Math.max(12,o*4);e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(r.x-i*Math.cos(a-Math.PI/7),r.y-i*Math.sin(a-Math.PI/7)),e.lineTo(r.x-i*Math.cos(a+Math.PI/7),r.y-i*Math.sin(a+Math.PI/7)),e.closePath(),e.fill();}e.restore();}function Rr(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 o=t[1];e.lineTo(o.x,o.y),e.stroke();return}for(let o=1;o<t.length-1;o++){let a=t[o],i=t[o+1],l=(a.x+i.x)/2,s=(a.y+i.y)/2;e.quadraticCurveTo(a.x,a.y,l,s);}let r=t[t.length-1];e.lineTo(r.x,r.y),e.stroke();}function xr(e,t,n,r,o){let a=t.text.trim();if(!a)return;let i=10*o,l=14*o,s=10*o,m=12*o,c=l*1.35,p=s*1.7,v=t.x*n,h=t.y*r,y=Math.min(n*.6,n-v-8*o);e.save(),e.font=`500 ${l}px ${ot}`,e.textBaseline="top";let w=Sr(e,a,y-i*2),b=w.reduce((N,F)=>Math.max(N,e.measureText(F).width),0),x=Math.min(y,Math.max(b,56*o)+i*2),M=i*2+p+w.length*c;kr(e,v,h,x,M,m),e.fillStyle="#ffffff",e.fill(),e.lineWidth=Math.max(1,o),e.strokeStyle="rgba(0,0,0,0.10)",e.stroke();let P=v+18*o,A=h+M;e.beginPath(),e.moveTo(P,A-o),e.lineTo(P+13*o,A-o),e.lineTo(P+4*o,A+9*o),e.closePath(),e.fillStyle="#ffffff",e.fill(),e.fillStyle=t.color||"rgb(239, 68, 68)",e.font=`700 ${s}px ${ot}`,e.fillText("COMMENT",v+i,h+i),e.fillStyle="#111318",e.font=`500 ${l}px ${ot}`;let I=h+i+p;for(let N of w)e.fillText(N,v+i,I),I+=c;e.restore();}function Sr(e,t,n){let r=t.split(/\s+/).filter(Boolean),o=[],a="";for(let i of r){let l=a?`${a} ${i}`:i;a&&e.measureText(l).width>n?(o.push(a),a=i):a=l;}return a&&o.push(a),o.length?o:[t]}function kr(e,t,n,r,o,a){let i=Math.min(a,r/2,o/2);e.beginPath();let l=e;if(typeof l.roundRect=="function"){l.roundRect(t,n,r,o,i);return}e.moveTo(t+i,n),e.arcTo(t+r,n,t+r,n+o,i),e.arcTo(t+r,n+o,t,n+o,i),e.arcTo(t,n+o,t,n,i),e.arcTo(t,n,t+r,n,i),e.closePath();}function it({children:e,...t}){return jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.8,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",...t,children:e})}function Mr(e){return jsxRuntime.jsxs(it,{...e,children:[jsxRuntime.jsx("path",{d:"M3 9a2 2 0 0 1 2-2h1.5l1-1.5h5l1 1.5H19a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"}),jsxRuntime.jsx("circle",{cx:"12",cy:"13",r:"3.2"})]})}function Tr(e){return jsxRuntime.jsxs(it,{...e,children:[jsxRuntime.jsx("rect",{x:"3",y:"6",width:"13",height:"12",rx:"2.5"}),jsxRuntime.jsx("path",{d:"m16 10 5-3v10l-5-3"})]})}function Pr(e){return jsxRuntime.jsxs(it,{...e,children:[jsxRuntime.jsx("path",{d:"M12 16V4m0 0 4 4m-4-4-4 4"}),jsxRuntime.jsx("path",{d:"M4 16v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2"})]})}var lt={shot:Mr,video:Tr,upload:Pr};function zt(e){let t=e.videoWidth||1280,n=e.videoHeight||720,r=document.createElement("canvas");r.width=t,r.height=n;let o=r.getContext("2d");return o?(o.drawImage(e,0,0,t,n),new Promise(a=>r.toBlob(i=>a(i),"image/jpeg",.82))):Promise.resolve(null)}function Lr(e,t){return !Number.isFinite(t)||t<=0?Promise.resolve():new Promise(n=>{e.addEventListener("seeked",()=>n(),{once:true});try{e.currentTime=t;}catch{n();}})}var Nr=4e3;async function ut(e){if(typeof document>"u")return {poster:null,durationMs:0};let t=URL.createObjectURL(e),n=document.createElement("video");n.muted=true,n.playsInline=true,n.preload="auto",n.src=t;let r=async()=>{await new Promise((s,m)=>{if(n.readyState>=2)return s();n.addEventListener("loadeddata",()=>s(),{once:true}),n.addEventListener("error",()=>m(new Error("video decode failed")),{once:true});}),await Lr(n,Math.min(.1,(n.duration||0)/2));let i=await zt(n),l=Number.isFinite(n.duration)?n.duration*1e3:0;return {poster:i,durationMs:l}},o,a=new Promise(i=>{o=window.setTimeout(()=>i({poster:null,durationMs:0}),Nr);});try{return await Promise.race([r().catch(()=>({poster:null,durationMs:0})),a])}finally{window.clearTimeout(o),n.removeAttribute("src"),URL.revokeObjectURL(t);}}async function ct(e){if(typeof document>"u")return null;let t=document.createElement("video");t.muted=true,t.playsInline=true,t.srcObject=e;try{return await t.play().catch(()=>{}),await new Promise(n=>{if(t.readyState>=2)return n();t.addEventListener("loadeddata",()=>n(),{once:!0}),window.setTimeout(n,600);}),await zt(t)}catch{return null}finally{t.srcObject=null;}}async function dt(){if(typeof document>"u")return null;let e=document.createElement("canvas");e.width=1280,e.height=720;let t=e.getContext("2d");return t?(t.fillStyle="#0e0e12",t.fillRect(0,0,e.width,e.height),t.fillStyle="#52525b",t.beginPath(),t.moveTo(590,312),t.lineTo(590,408),t.lineTo(694,360),t.closePath(),t.fill(),new Promise(n=>e.toBlob(r=>n(r),"image/jpeg",.8))):null}var mt=60,Ar=25*1024*1024,qt=[{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)"}],jt=[{label:"Small",value:2,dot:6},{label:"Medium",value:4,dot:9},{label:"Large",value:6,dot:12}],Kt=[{value:"bug",label:"Bug"},{value:"feature",label:"Idea"},{value:"other",label:"Other"}],Gt=[{value:"shot",label:"Screenshot",hint:"This page, instantly",primary:true},{value:"video",label:"Video",hint:"Record up to 60s"},{value:"upload",label:"Upload",hint:"Image or video"}];function pt(){let{client:e,isOpen:t,closeCapture:n,user:r,capture:o,initialCapture:a,initialCaptureError:i,startVideoSession:l,consumePendingVideo:s,canRecordScreen:m,consumeRecordStartError:c}=De(),[p,v]=Ut.useState(1),[h,y]=Ut.useState(null),[w,b]=Ut.useState({kind:"idle"}),[x,M]=Ut.useState(false),[P,A]=Ut.useState(0),[I,N]=Ut.useState(null),[F,ee]=Ut.useState(false),[W,q]=Ut.useState("arrow"),[oe,se]=Ut.useState(qt[0].value),[$,f]=Ut.useState(jt[1].value),[g,R]=Ut.useState(""),[S,_]=Ut.useState("bug"),[O,X]=Ut.useState(r?.email??""),[L,K]=Ut.useState(null),[H,ue]=Ut.useState(null),[Ce,te]=Ut.useState(0),[z,j]=Ut.useState(null),[J,me]=Ut.useState(null),[he,Re]=Ut.useState(false),be=Ut.useRef(null),Pe=Ut.useRef(null),xe=Ut.useRef(null),ne=Ut.useRef(false),Se=Ut.useRef(false);Ut.useEffect(()=>{t||(Se.current=false);},[t]),Ut.useEffect(()=>{if(!t)return;if(Se.current){ne.current=false;return}Se.current=true,ne.current=false,v(1),y(null),R(""),ue(null),te(0),j(null),M(false),A(0),N(null),ee(false),me(null);let u=s();if(u)y("video"),j({blob:u.blob,durationMs:u.durationMs}),u.blob.size>Ar&&sonner.toast.warning("This recording is large and may be too big to upload. Try a shorter clip if the upload fails."),u.poster?b({kind:"ready",capture:Ae(u.poster,["Screen recording; preview is the first frame."])}):(b({kind:"capturing"}),(async()=>{let C=null;if(u.deriveBlobPoster)try{C=(await ut(u.blob)).poster;}catch{C=null;}C=C??await dt(),!ne.current&&b(C?{kind:"ready",capture:Ae(C,["Screen recording; preview is the first frame."])}:{kind:"manual"});})());else {let C=c();C?(y("video"),me(C),b({kind:"idle"})):a?(y("shot"),b({kind:"ready",capture:a})):o?.mode==="manual"?b({kind:"manual"}):o?.provider&&!i?(y("shot"),Le(o.mode??"auto")):b({kind:"manual",error:i?.message??"Automatic screenshot capture was unavailable."});}return ()=>{ne.current=true;}},[t,o,a,i]),Ut.useEffect(()=>{if(!t)return;xe.current=document.activeElement??null;let u=document.documentElement,C=u.style.overflow,U=u.style.paddingRight,G=window.innerWidth-u.clientWidth;u.style.overflow="hidden",G>0&&(u.style.paddingRight=`${G}px`);let Q=false,fe=()=>{if(!Q){Q=true,u.style.overflow=C,u.style.paddingRight=U;try{xe.current?.focus?.();}catch{}}};return window.addEventListener("pagehide",fe),()=>{window.removeEventListener("pagehide",fe),fe();}},[t]),Ut.useEffect(()=>{if(!t)return;function u(C){if(C.key==="Escape"){C.preventDefault(),n();return}if(C.key!=="Tab")return;let U=Pe.current;if(!U)return;let G=Wr(U);if(G.length===0)return;let Q=G[0],fe=G[G.length-1],Je=document.activeElement;C.shiftKey&&(Je===Q||!U.contains(Je))?(C.preventDefault(),fe.focus()):!C.shiftKey&&Je===fe&&(C.preventDefault(),Q.focus());}return document.addEventListener("keydown",u),()=>document.removeEventListener("keydown",u)},[t,n]),Ut.useEffect(()=>{if(!t||w.kind!=="manual")return;function u(C){let Q=Array.from(C.clipboardData?.items??[]).find(fe=>fe.type.startsWith("image/"))?.getAsFile();Q&&(C.preventDefault(),Me(Q));}return window.addEventListener("paste",u),()=>window.removeEventListener("paste",u)},[t,w.kind]),Ut.useEffect(()=>{if(!L)return;let u=Date.now(),C=window.setInterval(()=>{let U=Math.floor((Date.now()-u)/1e3);te(U),U>=mt&&Z();},250);return ()=>window.clearInterval(C)},[L]);let pe=Ut.useRef(null);if(pe.current=L,Ut.useEffect(()=>{t||pe.current&&(pe.current.cancel(),pe.current=null,K(null),te(0));},[t]),Ut.useEffect(()=>()=>{pe.current?.cancel();},[]),!t)return null;async function Le(u){ne.current=false,b({kind:"capturing"});try{let C=await We({...o,mode:u,target:o?.target??document.documentElement});return ne.current?!1:(Ge(C),b({kind:"ready",capture:C}),!0)}catch(C){return ne.current||b({kind:"manual",error:C instanceof Error?C.message:"Automatic screenshot capture was unavailable."}),false}}async function ke(u){y(u),me(null),N(null),u!=="video"&&V(),u==="shot"?await Le(o?.mode??"auto"):u==="video"?(j(null),b({kind:"idle"})):b({kind:"manual"});}async function Me(u){if(u.type.startsWith("image/")){V();let C=Ae(u,["Manual image upload used."]);b({kind:"ready",capture:C});return}if(u.type.startsWith("video/")){b({kind:"capturing"});try{let{poster:C,durationMs:U}=await ut(u),G=C??await dt();if(!G){b({kind:"manual",error:"Could not read that video."});return}let Q=Ae(G,["Uploaded video; preview is the first frame."]);j({blob:u,durationMs:U}),b({kind:"ready",capture:Q});}catch{b({kind:"manual",error:"Could not read that video."});}return}sonner.toast.error("Choose an image (PNG, JPEG, WebP) or a video (MP4, WebM).");}function Ge(u){u.warnings.length!==0&&sonner.toast.warning("Screenshot captured, but iframe, video, canvas, or cross-origin content may be incomplete.");}async function Be(){try{let u=await Bt(mt);K(u);}catch(u){sonner.toast.error(u instanceof Error?u.message:"Microphone unavailable");}}async function Z(){if(L)try{let u=await L.stop();ue({blob:u.blob,durationMs:u.durationMs});}catch(u){sonner.toast.error(u instanceof Error?u.message:"Could not stop recording");}finally{K(null);}}function k(){L?.cancel(),K(null),ue(null),te(0);}async function B(){me(null);try{await l();}catch(u){sonner.toast.error(u instanceof Error?u.message:"Screen capture unavailable");}}function V(){j(null);}let Ye=w.kind==="ready";async function Pn(){if(L&&await Z(),p===1){if(w.kind==="ready"){let u=await be.current?.flatten();N(u??w.capture.blob),ee(u!=null&&u!==w.capture.blob);}v(2);}else p===2?v(3):await Nn();}function Ln(){p>1&&v(u=>u-1);}async function Nn(){if(w.kind!=="ready")return;let u=g.trim(),{capture:C}=w;M(true),A(0);try{let U=I??C.blob,G=await e.submit({rawText:u.length>0?u:void 0,category:S,submitterEmail:O.trim()||void 0,screenshot:U,audio:H?.blob,audioDurationMs:H?.durationMs,video:z?.blob,videoDurationMs:z?.durationMs,context:Ht(C)},{onUploadProgress:Q=>A(Math.min(.95,Q))});A(1),sonner.toast.success("Feedback sent \u2014 thank you."),G.id,n();}catch(U){sonner.toast.error(U instanceof Error?U.message:"Could not submit feedback"),M(false);}}function An(u){u.target===u.currentTarget&&!x&&n();}let Ve=Math.round(P*100),Xe=h==="video",In=p===1&&!Ye||x,Dn=p<3?"Next":x?Ve<95?`Uploading ${Ve}%\u2026`:"Almost done\u2026":"Send feedback";return jsxRuntime.jsx("div",{role:"dialog","aria-modal":"true","aria-label":"Send feedback",className:"lumen-modal-backdrop","data-lumen-capture-ignore":"true",onMouseDown:An,children:jsxRuntime.jsxs("div",{ref:Pe,className:"lumen-modal","data-lumen-drawing":he?"true":void 0,children:[jsxRuntime.jsx(Hr,{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.jsx(Ir,{step:p}),jsxRuntime.jsxs("div",{className:"lumen-modal-body",children:[p===1?jsxRuntime.jsx("div",{className:"lumen-pane",children:h===null?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"lumen-method",role:"group","aria-label":"Capture method",children:Gt.map(u=>{let C=lt[u.value];return jsxRuntime.jsxs("button",{type:"button",className:"lumen-method-btn"+(u.primary?" lumen-method-primary":""),onClick:()=>ke(u.value),disabled:w.kind==="capturing",children:[jsxRuntime.jsx("span",{className:"lumen-method-ico",children:jsxRuntime.jsx(C,{})}),u.primary?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{className:"lumen-method-text",children:[jsxRuntime.jsx("span",{className:"lumen-method-label",children:u.label}),jsxRuntime.jsx("span",{className:"lumen-method-hint",children:u.hint})]}),jsxRuntime.jsx("span",{className:"lumen-method-badge",children:"Fastest"})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"lumen-method-label",children:u.label}),jsxRuntime.jsx("span",{className:"lumen-method-hint",children:u.hint})]})]},u.value)})}),jsxRuntime.jsx("p",{className:"lumen-status lumen-method-help",children:"Choose how to capture your feedback."})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"lumen-method-switch",role:"group","aria-label":"Switch capture method",children:Gt.map(u=>{let C=lt[u.value];return jsxRuntime.jsxs("button",{type:"button","aria-pressed":h===u.value,onClick:()=>ke(u.value),disabled:w.kind==="capturing",children:[jsxRuntime.jsx(C,{}),u.label]},u.value)})}),h==="video"&&w.kind==="idle"?jsxRuntime.jsx(Dr,{canRecord:m,onRecord:B,error:J}):null,w.kind==="capturing"?jsxRuntime.jsxs("p",{className:"lumen-status",children:[jsxRuntime.jsx("span",{className:"lumen-spinner","aria-hidden":"true"}),"Capturing\u2026"]}):null,w.kind==="manual"?jsxRuntime.jsxs("div",{className:"lumen-manual-capture",children:[jsxRuntime.jsx("p",{className:"lumen-status",children:h==="upload"?"Choose an image or video to attach \u2014 or paste an image.":w.error?"Automatic capture was unavailable. Upload or paste an image to continue.":"Upload or paste an image to continue."}),jsxRuntime.jsxs("label",{className:"lumen-manual-drop",children:[jsxRuntime.jsx("span",{children:h==="upload"?"Choose a file \u2014 image or video":"Choose or paste an image"}),jsxRuntime.jsx("input",{type:"file",accept:h==="upload"?"image/png,image/jpeg,image/webp,video/mp4,video/webm,video/quicktime":"image/png,image/jpeg,image/webp",onChange:u=>{let C=u.currentTarget.files?.[0];C&&Me(C),u.currentTarget.value="";}})]})]}):null,w.kind==="ready"?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[Xe?null:jsxRuntime.jsxs("div",{className:"lumen-toolbar",children:[jsxRuntime.jsxs("div",{className:"lumen-segmented",role:"group","aria-label":"Annotation tool",children:[jsxRuntime.jsx(je,{label:"Arrow",active:W==="arrow",onClick:()=>q("arrow")}),jsxRuntime.jsx(je,{label:"Box",active:W==="rect",onClick:()=>q("rect")}),jsxRuntime.jsx(je,{label:"Draw",active:W==="freehand",onClick:()=>q("freehand")}),jsxRuntime.jsx(je,{label:"Comment",active:W==="comment",onClick:()=>q("comment")})]}),jsxRuntime.jsx("span",{className:"lumen-toolbar-sep"}),jsxRuntime.jsx("div",{className:"lumen-swatches",role:"group","aria-label":"Color",children:qt.map(u=>jsxRuntime.jsx("button",{type:"button",className:"lumen-swatch",style:{background:u.value},"aria-label":u.label,"aria-pressed":oe===u.value,onClick:()=>se(u.value)},u.value))}),jsxRuntime.jsx("div",{className:"lumen-stroke-sizes",role:"group","aria-label":"Stroke width",children:jt.map(u=>jsxRuntime.jsx("button",{type:"button",className:"lumen-stroke-size","aria-label":u.label,"aria-pressed":$===u.value,onClick:()=>f(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:()=>be.current?.undo(),children:"Undo"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:()=>be.current?.reset(),children:"Clear"})]}),jsxRuntime.jsx("div",{className:"lumen-annotate",children:jsxRuntime.jsx(Wt,{ref:be,screenshot:w.capture.blob,tool:W,color:oe,strokeWidth:$,onDrawingChange:Re})}),jsxRuntime.jsxs("div",{className:"lumen-cap-actions",children:[jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost",onClick:()=>h&&ke(h),children:Xe?"\u21BB Re-record":"\u21BB Recapture"}),Xe?z?jsxRuntime.jsxs("span",{className:"lumen-cap-note",children:["\u2713 ",Math.round(z.durationMs/1e3),"s recorded"]}):null:jsxRuntime.jsxs("span",{className:"lumen-cap-note",children:[Yt(h)," captured \xB7 switch method above anytime"]})]})]}):null]})}):null,p===2?jsxRuntime.jsxs("div",{className:"lumen-pane lumen-form",children:[jsxRuntime.jsxs("label",{className:"lumen-label",children:[jsxRuntime.jsx("span",{children:"What happened?"}),jsxRuntime.jsx("textarea",{value:g,onChange:u=>R(u.target.value),rows:3,placeholder:"Describe the issue or idea\u2026",className:"lumen-input",autoFocus:true})]}),jsxRuntime.jsxs("div",{className:"lumen-label",children:[jsxRuntime.jsx("span",{children:"Add a voice note (optional)"}),jsxRuntime.jsxs("div",{className:"lumen-audio-row",children:[!L&&!H?jsxRuntime.jsx("button",{type:"button",onClick:Be,className:"lumen-btn-ghost",children:"Record voice note"}):null,L?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{className:"lumen-recording",children:[jsxRuntime.jsx("span",{className:"lumen-rec-dot","aria-hidden":"true"}),jsxRuntime.jsx(Br,{stream:L.stream}),jsxRuntime.jsxs("span",{className:"lumen-rec-time",children:[Ce,"s / ",mt,"s"]})]}),jsxRuntime.jsx("button",{type:"button",onClick:Z,className:"lumen-btn-ghost",children:"Stop"}),jsxRuntime.jsx("button",{type:"button",onClick:k,className:"lumen-btn-ghost",children:"Cancel"})]}):null,H&&!L?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(_r,{blob:H.blob,durationMs:H.durationMs}),jsxRuntime.jsx("button",{type:"button",onClick:()=>ue(null),className:"lumen-btn-ghost",children:"Remove"})]}):null]})]}),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:Kt.map(u=>jsxRuntime.jsx("button",{type:"button",className:"lumen-category-opt","aria-pressed":S===u.value,onClick:()=>_(u.value),children:u.label},u.value))})]}),jsxRuntime.jsxs("label",{className:"lumen-label",children:[jsxRuntime.jsx("span",{children:"Your email (optional)"}),jsxRuntime.jsx("input",{type:"email",value:O,onChange:u=>X(u.target.value),placeholder:"you@example.com",className:"lumen-input"})]})]}):null,p===3?jsxRuntime.jsxs("div",{className:"lumen-pane lumen-review",children:[jsxRuntime.jsxs("div",{className:"lumen-review-row",children:[jsxRuntime.jsx("span",{className:"lumen-review-k",children:"Capture"}),jsxRuntime.jsxs("span",{className:"lumen-review-v",children:[Yt(h),F?" \xB7 annotated":"",jsxRuntime.jsx("button",{type:"button",className:"lumen-edit",onClick:()=>v(1),children:"edit"})]})]}),jsxRuntime.jsxs("div",{className:"lumen-review-row",children:[jsxRuntime.jsx("span",{className:"lumen-review-k",children:"Category"}),jsxRuntime.jsxs("span",{className:"lumen-review-v",children:[jsxRuntime.jsx("span",{className:"lumen-chip",children:Kt.find(u=>u.value===S)?.label}),jsxRuntime.jsx("button",{type:"button",className:"lumen-edit",onClick:()=>v(2),children:"edit"})]})]}),jsxRuntime.jsxs("div",{className:"lumen-review-row",children:[jsxRuntime.jsx("span",{className:"lumen-review-k",children:"Description"}),jsxRuntime.jsxs("span",{className:"lumen-review-v",children:[g.trim()?g.trim():jsxRuntime.jsx("span",{className:"lumen-muted-empty",children:"\u2014"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-edit",onClick:()=>v(2),children:"edit"})]})]}),jsxRuntime.jsxs("div",{className:"lumen-review-row",children:[jsxRuntime.jsx("span",{className:"lumen-review-k",children:"Material"}),jsxRuntime.jsxs("span",{className:"lumen-review-v lumen-attach-row",children:[H?jsxRuntime.jsxs("span",{className:"lumen-attach",children:["\u{1F399} Voice ",Math.round(H.durationMs/1e3),"s",jsxRuntime.jsx("button",{type:"button",className:"lumen-att-x","aria-label":"Remove voice note",onClick:()=>ue(null),children:"\xD7"})]}):null,z?jsxRuntime.jsxs("span",{className:"lumen-attach",children:["\u25B6 Video ",Math.round(z.durationMs/1e3),"s",jsxRuntime.jsx("button",{type:"button",className:"lumen-att-x","aria-label":"Remove video",onClick:V,children:"\xD7"})]}):null,O.trim()?jsxRuntime.jsxs("span",{className:"lumen-attach",children:["\u2709 ",O.trim()]}):null,!H&&!L?jsxRuntime.jsx("button",{type:"button",className:"lumen-btn-ghost lumen-add-btn",onClick:()=>{v(2),Be();},children:"+ Voice note"}):null]})]})]}):null]}),jsxRuntime.jsxs("footer",{className:"lumen-modal-footer",children:[x?jsxRuntime.jsx("div",{className:"lumen-progress",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Ve,children:jsxRuntime.jsx("div",{className:"lumen-progress-fill",style:{width:`${Ve}%`}})}):null,jsxRuntime.jsxs("div",{className:"lumen-modal-actions",children:[jsxRuntime.jsx("button",{type:"button",onClick:p===1?n:Ln,className:"lumen-btn-ghost",disabled:x,children:p===1?"Cancel":"Back"}),jsxRuntime.jsx("button",{type:"button",onClick:Pn,className:"lumen-btn-primary",disabled:In,children:Dn})]})]})]})})}function Yt(e){return e==="video"?"Screen recording":e==="upload"?"Upload":"Screenshot"}function Ir({step:e}){let t=[{n:1,label:"Capture"},{n:2,label:"Describe"},{n:3,label:"Review"}];return jsxRuntime.jsx("div",{className:"lumen-stepper","aria-hidden":"true",children:t.map((n,r)=>jsxRuntime.jsxs("div",{className:"lumen-step"+(e===n.n?" lumen-step-active":"")+(e>n.n?" lumen-step-done":""),children:[jsxRuntime.jsx("span",{className:"lumen-step-num",children:n.n}),jsxRuntime.jsx("span",{className:"lumen-step-lbl",children:n.label}),r<t.length-1?jsxRuntime.jsx("span",{className:"lumen-step-bar"}):null]},n.n))})}function Dr({canRecord:e,onRecord:t,error:n}){return e?jsxRuntime.jsxs("div",{className:"lumen-record-prompt",children:[n?jsxRuntime.jsxs("p",{className:"lumen-record-unavailable",role:"alert",children:[n," Try again, or switch to ",jsxRuntime.jsx("strong",{children:"Upload"})," to attach a video instead."]}):null,jsxRuntime.jsx("button",{type:"button",className:"lumen-record-btn","aria-label":"Start screen recording",onClick:t}),jsxRuntime.jsxs("div",{className:"lumen-record-copy",children:[jsxRuntime.jsx("div",{className:"lumen-record-title",children:"Record your screen"}),jsxRuntime.jsx("div",{className:"lumen-record-sub",children:"Tap to start. The sheet closes so you can record freely \u2014 a Stop button stays on screen, then the sheet returns with your clip. Max 60s."})]})]}):jsxRuntime.jsx("div",{className:"lumen-record-prompt",children:jsxRuntime.jsx("p",{className:"lumen-record-unavailable",children:Or()?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:["Screen recording isn\u2019t available on iOS browsers. Record with Control Center\u2019s screen recorder, then attach the clip via"," ",jsxRuntime.jsx("strong",{children:"Upload"}),"."]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:["Screen recording isn\u2019t available in this browser. Switch to"," ",jsxRuntime.jsx("strong",{children:"Upload"})," to attach a video instead."]})})})}function Or(){if(typeof navigator>"u")return false;let e=navigator.userAgent||"";return /iPad|iPhone|iPod/.test(e)?true:/Macintosh/.test(e)&&typeof document<"u"&&"ontouchend"in document}function je({label:e,active:t,onClick:n}){return jsxRuntime.jsx("button",{type:"button",onClick:n,className:"lumen-tool","aria-pressed":t,children:e})}function Hr({onDismiss:e}){let t=Ut.useRef(null),n=Ut.useRef(0),r=Ut.useRef(null);function o(l){l.currentTarget.setPointerCapture(l.pointerId),t.current=l.clientY,n.current=performance.now(),r.current=l.currentTarget.parentElement;}function a(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),m=Math.max(1,performance.now()-n.current),c=s/m;r.current.style.transform="",r.current.style.transition="",t.current=null,(s>80||c>.6)&&e();}return jsxRuntime.jsx("div",{className:"lumen-modal-grabber","aria-hidden":"true",onPointerDown:o,onPointerMove:a,onPointerUp:i,onPointerCancel:i})}function Br({stream:e}){let t=Ut.useRef(null);return Ut.useEffect(()=>{let n=t.current;if(!n)return;let r=Math.min(window.devicePixelRatio||1,2),o=n.clientWidth||88,a=n.clientHeight||22;n.width=Math.round(o*r),n.height=Math.round(a*r);let i=n.getContext("2d");if(!i)return;i.scale(r,r);let l=window.AudioContext??window.webkitAudioContext;if(!l)return;let s=new l,m=s.createMediaStreamSource(e),c=s.createAnalyser();c.fftSize=1024,c.smoothingTimeConstant=.6,m.connect(c);let p=new Uint8Array(c.fftSize),v=18,h=3,y=3,w=Math.max(2,(o-h*(v-1))/v),b=Math.min(w/2,3),x=new Array(v).fill(0),M=0,P=false;function A(){if(P)return;c.getByteTimeDomainData(p);let I=Math.floor(p.length/v);i.clearRect(0,0,o,a),i.fillStyle=Fr("--lumen-danger")||"rgb(239,68,68)";for(let N=0;N<v;N++){let F=0;for(let $=0;$<I;$++){let f=Math.abs((p[N*I+$]??128)-128);f>F&&(F=f);}let ee=Math.min(1,F/128*1.8),W=x[N]??0;x[N]=ee>W?ee:W+(ee-W)*.35;let q=Math.max(y,x[N]*a),oe=N*(w+h),se=(a-q)/2;Vr(i,oe,se,w,q,b),i.fill();}M=requestAnimationFrame(A);}return M=requestAnimationFrame(A),()=>{P=true,cancelAnimationFrame(M);try{m.disconnect();}catch{}s.close();}},[e]),jsxRuntime.jsx("canvas",{ref:t,className:"lumen-waveform","aria-hidden":"true"})}function Vr(e,t,n,r,o,a){let i=Math.min(a,r/2,o/2);e.beginPath();let l=e;if(typeof l.roundRect=="function"){l.roundRect(t,n,r,o,i);return}e.moveTo(t+i,n),e.arcTo(t+r,n,t+r,n+o,i),e.arcTo(t+r,n+o,t,n+o,i),e.arcTo(t,n+o,t,n,i),e.arcTo(t,n,t+r,n,i),e.closePath();}function _r({blob:e,durationMs:t}){let[n,r]=Ut.useState("");return Ut.useEffect(()=>{let o=URL.createObjectURL(e);return r(o),()=>{URL.revokeObjectURL(o);}},[e]),jsxRuntime.jsxs("div",{className:"lumen-audio-preview",children:[jsxRuntime.jsx("audio",{controls:true,preload:"metadata",src:n,className:"lumen-audio-el"}),jsxRuntime.jsxs("span",{className:"lumen-audio-meta",children:[Math.round(t/1e3),"s"]})]})}function Fr(e){return typeof window>"u"?"":getComputedStyle(document.documentElement).getPropertyValue(e).trim()}var Ur='a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';function Wr(e){return Array.from(e.querySelectorAll(Ur)).filter(t=>!t.hasAttribute("disabled")&&t.offsetParent!==null)}function Qt({state:e,portalTarget:t,onStop:n,onCancel:r}){let[o,a]=Ut.useState(false);if(Ut.useEffect(()=>a(true),[]),!o||typeof document>"u")return null;let i=t??document.body;return e.phase==="recording"?reactDom.createPortal(jsxRuntime.jsx($r,{startedAt:e.startedAt,maxSeconds:e.maxSeconds,onStop:n,onCancel:r}),i):reactDom.createPortal(jsxRuntime.jsxs("div",{className:"lumen-rec-hud lumen-rec-hud-pending",role:"status","aria-live":"polite","data-lumen-root":"true","data-lumen-capture-ignore":"true",children:[jsxRuntime.jsx("span",{className:"lumen-rec-hud-spinner","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:"lumen-rec-hud-time",children:e.phase==="starting"?"Starting\u2026":"Processing\u2026"}),jsxRuntime.jsx("button",{type:"button",className:"lumen-rec-hud-cancel",onClick:r,"aria-label":"Discard recording",children:"Discard"})]}),i)}function $r({startedAt:e,maxSeconds:t,onStop:n,onCancel:r}){let[o,a]=Ut.useState(0);Ut.useEffect(()=>{let l=()=>a(Math.min(t,Math.max(0,Math.floor((Date.now()-e)/1e3))));l();let s=window.setInterval(l,250);return ()=>window.clearInterval(s)},[e,t]);let i=l=>`${Math.floor(l/60)}:${String(l%60).padStart(2,"0")}`;return jsxRuntime.jsxs("div",{className:"lumen-rec-hud",role:"status","aria-live":"polite","data-lumen-root":"true","data-lumen-capture-ignore":"true",children:[jsxRuntime.jsx("span",{className:"lumen-rec-hud-dot","aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"lumen-rec-hud-time",children:[i(o)," ",jsxRuntime.jsxs("span",{className:"lumen-rec-hud-max",children:["/ ",i(t)]})]}),jsxRuntime.jsx("button",{type:"button",className:"lumen-rec-hud-cancel",onClick:r,"aria-label":"Discard recording",children:"Discard"}),jsxRuntime.jsxs("button",{type:"button",className:"lumen-rec-hud-stop",onClick:n,"aria-label":"Stop recording and return to feedback",children:[jsxRuntime.jsx("span",{className:"lumen-rec-hud-square","aria-hidden":"true"}),"Stop"]})]})}function ft(e){let t=e.hasProvider&&e.providerAvailable!==false;return {canRecord:t||e.hasGetDisplayMedia,usingProvider:t}}function en(e){return typeof e=="object"&&e!==null&&e.code==="RECORDER_STOPPED"}function tn(e){return e instanceof Error?e:new Error(String(e))}function nn(e,t,n){let r=false,o=false,a=false,i=null;function l(){o||(o=true,n.onCancelled());}function s(c){o||(o=true,n.onResult(c));}function m(c){o||(o=true,n.onError(c));}return n.onStarting(),Promise.resolve().then(()=>e(t)).then(c=>{if(i=c,r){try{c.cancel();}catch{}l();return}if(n.onActive(c),a){n.onProcessing();try{c.stop();}catch{}}Promise.resolve(c.result).then(p=>{r?l():s(p);}).catch(p=>{r||en(p)?l():m(tn(p));});}).catch(c=>{r||en(c)?l():m(tn(c));}),{stop(){if(!(o||r||a)&&(a=true,i)){n.onProcessing();try{i.stop();}catch{}}},cancel(){if(!(o&&r)){if(r=true,i)try{i.cancel();}catch{}l();}}}}function rn(){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)],o=new Set,a=0;for(let i of r){let l=document.elementsFromPoint(i,n);for(let s of l){if(o.has(s))continue;o.add(s);let m=window.getComputedStyle(s);if(m.position!=="fixed"&&m.position!=="sticky")continue;let c=s.getBoundingClientRect();c.bottom<t-8||c.bottom>t+8||c.width<e*.6||c.height>a&&(a=c.height);}}return a}function gt(e,t){if(typeof document>"u"||typeof window>"u")return 0;let n=window.innerWidth,r=window.innerHeight,o=0;for(let a of e){let i;try{i=document.querySelectorAll(a);}catch{continue}for(let l of Array.from(i)){let s=l.getBoundingClientRect();if(s.height===0||s.width===0)continue;let m=0;switch(t){case "bottom":if(s.bottom<r-8)break;m=Math.max(0,r-s.top);break;case "top":if(s.top>8)break;m=Math.max(0,s.bottom);break;case "left":if(s.left>8)break;m=Math.max(0,s.right);break;case "right":if(s.right<n-8)break;m=Math.max(0,n-s.left);break}m>o&&(o=m);}}return o}function on(e){let[t,n]=Ut.useState(()=>({bottom:e.offset.y,right:e.offset.x,left:e.offset.x,top:e.offset.y})),r=Ut.useRef(t),o=Kr(e.avoid),a=e.placement,i=e.offset.x,l=e.offset.y;return Ut.useEffect(()=>{if(typeof window>"u")return;let s=0,m=false,c=()=>{if(s=0,m)return;let w=a[0]==="b"?"bottom":"top",b=a[1]==="r"?"right":"left",x=0,M=0;e.avoid==="auto"&&w==="bottom"?x=rn():Array.isArray(e.avoid)&&(x=gt(e.avoid,w),M=gt(e.avoid,b));let P={bottom:w==="bottom"?l+x:0,top:w==="top"?l+x:0,right:b==="right"?i+M:0,left:b==="left"?i+M:0},A=r.current;(P.bottom!==A.bottom||P.top!==A.top||P.right!==A.right||P.left!==A.left)&&(r.current=P,n(P));},p=()=>{s||(s=window.requestAnimationFrame(c));};p();let v=typeof ResizeObserver<"u"?new ResizeObserver(p):null;v?.observe(document.documentElement);let h=typeof MutationObserver<"u"?new MutationObserver(p):null;h?.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:["class","style","hidden"]}),window.addEventListener("resize",p);let y=window.visualViewport;return y?.addEventListener("resize",p),y?.addEventListener("scroll",p),()=>{m=true,s&&window.cancelAnimationFrame(s),v?.disconnect(),h?.disconnect(),window.removeEventListener("resize",p),y?.removeEventListener("resize",p),y?.removeEventListener("scroll",p);}},[a,i,l,o]),t}function Kr(e){return e===false?"false":e==="auto"?"auto":e.join("|")}function an(e){let[t,n]=Ut.useState(false);return Ut.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 o=100,a=0,i=()=>{a=0;let s=window.innerHeight-r.height;n(s>o);},l=()=>{a||(a=window.requestAnimationFrame(i));};return l(),r.addEventListener("resize",l),r.addEventListener("scroll",l),()=>{a&&window.cancelAnimationFrame(a),r.removeEventListener("resize",l),r.removeEventListener("scroll",l);}},[e]),t}function cn({config:e,portalTarget:t,hidden:n,onPointerDown:r,onClick:o}){let[a,i]=Ut.useState(null),l=Ut.useRef(null),s=on(e),m=an(e.hideOnKeyboard);if(Ut.useEffect(()=>{typeof document>"u"||i(t??document.body);},[t]),Zr(l,!n&&!m),!a)return null;let c=e.placement,p=c[0]==="b"?"bottom":"top",v=c[1]==="r"?"right":"left",h=p==="bottom"?s.bottom:s.top,y=v==="right"?s.right:s.left,w={position:"fixed",[p]:e.safeArea?`calc(${h}px + env(safe-area-inset-${p}, 0px))`:`${h}px`,[v]:e.safeArea?`calc(${y}px + env(safe-area-inset-${v}, 0px))`:`${y}px`,zIndex:e.zIndex,opacity:n||m?0:1,pointerEvents:n||m?"none":"auto",transition:"opacity 160ms ease"};return reactDom.createPortal(jsxRuntime.jsxs("button",{ref:l,type:"button",className:"lumen-btn lumen-btn-primary lumen-btn-floating",style:w,"aria-label":e.label,"aria-hidden":n||m?true:void 0,tabIndex:n||m?-1:0,onPointerDown:b=>r?.(b.nativeEvent),onClick:b=>o(b.nativeEvent),"data-lumen-trigger":"","data-lumen-capture-ignore":"true",children:[e.icon,jsxRuntime.jsx("span",{children:e.label})]}),a)}function Zr(e,t){let n=Ut.useRef(false);Ut.useEffect(()=>{if(process.env.NODE_ENV==="production"||!t||n.current||typeof window>"u")return;let r=window.setTimeout(()=>{let o=e.current;if(!o)return;let a=o.getBoundingClientRect();if(a.width===0||a.height===0)return;let i=a.left+a.width/2,l=a.top+a.height/2,s=document.elementsFromPoint(i,l),m=ln(window.getComputedStyle(o).zIndex);for(let c of s){if(c===o||o.contains(c))continue;if(ln(window.getComputedStyle(c).zIndex)>m){n.current=true,console.warn("[lumen] trigger is occluded by",c);break}}},250);return ()=>window.clearTimeout(r)},[t,e]);}function ln(e){let t=parseInt(e,10);return Number.isNaN(t)?0:t}function dn({mount:e,label:t,icon:n,onPointerDown:r,onClick:o}){let[a,i]=Ut.useState(null);return Ut.useEffect(()=>{if(typeof document>"u")return;let l=e instanceof HTMLElement?e:e.current??null;i(l);},[e]),a?reactDom.createPortal(jsxRuntime.jsxs("button",{type:"button",className:"lumen-btn lumen-btn-primary",onPointerDown:l=>r?.(l.nativeEvent),onClick:l=>o(l.nativeEvent),"aria-label":t,"data-lumen-trigger":"","data-lumen-capture-ignore":"true",children:[n,jsxRuntime.jsx("span",{children:t})]}),a):null}function fn({config:e,portalTarget:t,hidden:n,onPointerDown:r,onClick:o}){let[a,i]=Ut.useState(null),[l,s]=Ut.useState(false),m=Ut.useRef(null);if(Ut.useEffect(()=>{typeof document>"u"||i(t??document.body);},[t]),!a)return null;let c=`lumen-notch lumen-notch-${e.edge}${l?" lumen-notch-expanded":""}`;function p(w){r?.(w.nativeEvent),m.current={x:w.clientX,y:w.clientY},s(true),w.currentTarget.setPointerCapture(w.pointerId);}function v(w){let b=m.current;if(!b)return;let x=w.clientX-b.x,M=w.clientY-b.y;(e.edge==="top"&&M>16||e.edge==="bottom"&&M<-16||e.edge==="right"&&x<-16||e.edge==="left"&&x>16)&&(m.current=null,o(w.nativeEvent));}function h(){m.current=null,s(false);}function y(){m.current=null,s(false);}return reactDom.createPortal(jsxRuntime.jsxs("button",{type:"button",className:c,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:w=>o(w.nativeEvent),onPointerDown:p,onPointerMove:v,onPointerUp:h,onPointerCancel:y,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 gn(e){return {kind:"notch",edge:e.edge??"top",label:e.label??"Feedback",icon:e.icon,zIndex:e.zIndex??2147483600}}function hn(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 po={"--lumen-bg":"background","--lumen-fg":"foreground","--lumen-primary":"accent","--lumen-radius":"radius"};function bn(e){let t=Ut.useId();Ut.useEffect(()=>{if(typeof document>"u")return;let n=document.documentElement,r=`data-lumen-theme-${fo(t)}`,o={};if(e==="auto"||e==null)n.removeAttribute("data-lumen-theme");else if(e==="light"||e==="dark")o["data-lumen-theme"]=n.getAttribute("data-lumen-theme"),n.setAttribute("data-lumen-theme",e);else for(let[a,i]of Object.entries(po)){let l=e[i];typeof l=="string"&&l.length>0&&(o[a]=n.style.getPropertyValue(a)||null,n.style.setProperty(a,l));}return n.setAttribute(r,""),()=>{n.removeAttribute(r);for(let[a,i]of Object.entries(o))a.startsWith("--")?i?n.style.setProperty(a,i):n.style.removeProperty(a):i==null?n.removeAttribute(a):n.setAttribute(a,i);}},[e,t]);}function fo(e){return e.replace(/[^a-zA-Z0-9]/g,"")}var vn=Symbol.for("lumen.history.patched"),ht="lumen:locationchange";function bo(){if(typeof window>"u")return;let e=window;if(e[vn])return;e[vn]=true;let t=()=>window.dispatchEvent(new Event(ht)),n=history.pushState;history.pushState=function(...o){let a=n.apply(this,o);return t(),a};let r=history.replaceState;history.replaceState=function(...o){let a=r.apply(this,o);return t(),a},window.addEventListener("popstate",t);}function wn(e){let[t,n]=Ut.useState(false);return Ut.useEffect(()=>{if(!e){n(false);return}if(typeof window>"u")return;bo();let r=()=>{try{n(!!e({pathname:window.location.pathname}));}catch{n(false);}};return r(),window.addEventListener(ht,r),window.addEventListener("popstate",r),()=>{window.removeEventListener(ht,r),window.removeEventListener("popstate",r);}},[e]),t}var yo=["wv","Capacitor","Cordova","Expo","FBAN","FBAV","Instagram","Line/","Twitter"];function yn(){let[e,t]=Ut.useState(false);return Ut.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 o=navigator.userAgent||"";yo.some(a=>o.includes(a))&&t(true);},[]),e}var Cn="lumen.config.v1.",Ro=3600*1e3;function Rn(e,t){let[n,r]=Ut.useState(()=>({trigger:null,enabled:true,shakeToOpen:false,loading:true}));return Ut.useEffect(()=>{if(typeof window>"u")return;let o=Mo(e);o&&r({trigger:o.trigger,enabled:En(o.trigger),shakeToOpen:o.shake,loading:false});let a=new AbortController,i=window.setTimeout(()=>a.abort(),5e3),l=`${t.replace(/\/$/,"")}/api/v1/sdk/config?apiKey=${encodeURIComponent(e)}`;return fetch(l,{method:"GET",mode:"cors",credentials:"omit",signal:a.signal}).then(async s=>{if(!s.ok)throw new Error(`HTTP ${s.status}`);let m=await s.json(),c=xn(m.trigger);if(!c)throw new Error("Malformed config response");let p=ko(m.trigger);To(e,c,p),r({trigger:c,enabled:En(c),shakeToOpen:p,loading:false});}).catch(()=>{r(s=>s.loading?{trigger:null,enabled:true,shakeToOpen:false,loading:false}:s);}).finally(()=>window.clearTimeout(i)),()=>{window.clearTimeout(i),a.abort();}},[e,t]),n}function En(e){return e.kind!=="headless"}var xo=["br","bl","tr","tl"],So=["top","right","bottom","left"];function xn(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:xo.find(o=>o===t.placement)??"br",label:n}:t.kind==="notch"?{kind:"notch",edge:So.find(o=>o===t.edge)??"top",label:n}:null}function ko(e){return !e||typeof e!="object"?false:e.shake===true}function Mo(e){try{let t=window.localStorage.getItem(Cn+e);if(!t)return null;let n=JSON.parse(t);if(typeof n?.fetchedAt!="number"||Date.now()-n.fetchedAt>Ro)return null;let r=xn(n.trigger);return r?{fetchedAt:n.fetchedAt,trigger:r,shake:n.shake===!0}:null}catch{return null}}function To(e,t,n){try{window.localStorage.setItem(Cn+e,JSON.stringify({fetchedAt:Date.now(),trigger:t,shake:n}));}catch{}}function Lo(e){if(e&&typeof e=="object")return e.type===ze;if(typeof e=="string")try{return JSON.parse(e).type===ze}catch{return false}return false}function No(e={}){let t=e.threshold??18,n=e.neededHits??3,r=e.windowMs??700,o=e.throttleMs??60,a=null,i=[];return {push(l,s,m,c){if(!a)return a={x:l,y:s,z:m,t:c},false;if(c-a.t<o)return false;let p=Math.abs(l-a.x)+Math.abs(s-a.y)+Math.abs(m-a.z);return a={x:l,y:s,z:m,t:c},p<t?false:(i=i.filter(v=>c-v<r),i.push(c),i.length>=n?(i=[],true):false)}}}function Sn(e,t,n){Ut.useEffect(()=>{if(!e||typeof window>"u")return;let r=0,o=1500;function a(){let c=Date.now();n||c-r<o||(r=c,t());}let i=c=>{Lo(c.data)&&a();};window.addEventListener("message",i),document.addEventListener("message",i);let l=No(),s=c=>{let p=c.accelerationIncludingGravity??c.acceleration;!p||p.x==null||p.y==null||p.z==null||l.push(p.x,p.y,p.z,Date.now())&&a();},m=typeof window.DeviceMotionEvent<"u"&&typeof window.DeviceMotionEvent.requestPermission!="function";return m&&window.addEventListener("devicemotion",s),()=>{window.removeEventListener("message",i),document.removeEventListener("message",i),m&&window.removeEventListener("devicemotion",s);}},[e,t,n]);}var Mn="https://shakebugs.vercel.app",Ke=60;function Tn(){return typeof navigator<"u"&&!!navigator.mediaDevices&&typeof navigator.mediaDevices.getDisplayMedia=="function"}function Io({apiKey:e,apiUrl:t,user:n,amplitude:r,floatingButton:o=true,trigger:a,hideOn:i,theme:l,portalTarget:s,capture:m,record:c,shakeToOpen:p,onOpenChange:v,beforeOpen:h,onTriggerActivate:y,children:w}){let[b,x]=Ut.useState(false),[M,P]=Ut.useState(false),[A,I]=Ut.useState(null),[N,F]=Ut.useState(null),[ee]=Ut.useState(false),[W]=Ut.useState(null),q=Ut.useRef(false),oe=Ut.useRef(false),se=Ut.useRef(null),$=Ut.useMemo(()=>new kt({apiKey:e,apiUrl:t,user:n,amplitude:r}),[e,t,n?.id,n?.email,n?.name,r?.userId,r?.deviceId,r?.sessionId]);Ut.useEffect(()=>{Dt({ignoreUrlPrefix:(t??Mn).replace(/\/$/,"")});},[t]);let f=Ut.useRef(v);f.current=v,Ut.useEffect(()=>{if(!(typeof document>"u"))return b?document.body.setAttribute("data-lumen-open","true"):document.body.removeAttribute("data-lumen-open"),()=>{document.body.removeAttribute("data-lumen-open");}},[b]);let g=Ut.useRef(null);Ut.useEffect(()=>{if(g.current===b)return;let k=g.current;g.current=b,k!==null&&f.current?.(b);},[b]);let R=Ut.useRef(h);R.current=h;let S=Ut.useRef(y);S.current=y;let _=Ut.useCallback(k=>{oe.current=true,se.current=Promise.resolve().then(()=>R.current?.(k)).then(()=>S.current?.(k)).then(()=>{});},[]),O=Ut.useCallback(k=>{q.current||b||j.current||(q.current=true,P(true),I(null),F(null),(async()=>{try{if(oe.current?await se.current:(await R.current?.(k),await S.current?.(k)),m?.mode==="manual")I(null),F(null);else if(m?.provider)I(null),F(null);else {let B=await We({...m,mode:m?.mode??"auto",target:m?.target??document.documentElement});I(B);}}catch(B){F(B instanceof Error?B:new Error(String(B)));}finally{oe.current=false,se.current=null,q.current=false,P(false),x(true);}})());},[m,b]),X=Ut.useCallback(()=>x(false),[]),L=Ut.useCallback($.submit.bind($),[$]),[K,H]=Ut.useState(null),[ue,Ce]=Ut.useState(null),te=Ut.useRef(null),z=Ut.useRef(null),j=Ut.useRef(false),J=Ut.useRef(null),me=Ut.useRef(null),he=Ut.useRef(null),Re=Ut.useCallback((k,B=false)=>{if(te.current=null,z.current=null,j.current=false,H(null),!k){J.current=null;return}me.current={blob:k.blob,durationMs:k.durationMs,poster:J.current,deriveBlobPoster:B},J.current=null,x(true);},[]);Ut.useEffect(()=>{if(!b)return;if(!c?.provider){Ce(null);return}let k=c.isAvailable;if(!k){Ce(true);return}let B=false;return Promise.resolve().then(()=>k()).then(V=>{B||Ce(V);}).catch(()=>{B||Ce(false);}),()=>{B=true;}},[b,c?.provider,c?.isAvailable]);let be=ft({hasProvider:!!c?.provider,providerAvailable:ue,hasGetDisplayMedia:Tn()}).canRecord,Pe=Ut.useCallback(async()=>{if(j.current)return;if(he.current=null,ft({hasProvider:!!c?.provider,providerAvailable:ue,hasGetDisplayMedia:Tn()}).usingProvider&&c?.provider){j.current=true,J.current=null,x(false),z.current=nn(c.provider,{maxDurationSeconds:Ke},{onStarting:()=>H({phase:"starting"}),onActive:V=>{H({phase:"recording",stream:V.stream??null,startedAt:Date.now(),maxSeconds:Ke}),V.stream&&ct(V.stream).then(Ye=>{J.current=Ye;}).catch(()=>{});},onProcessing:()=>H({phase:"processing"}),onResult:V=>Re({blob:V.blob,durationMs:V.durationMs},true),onCancelled:()=>{z.current=null,j.current=false,J.current=null,H(null),I(null),F(null),x(true);},onError:V=>{z.current=null,j.current=false,J.current=null,H(null),he.current=V.message||"Screen recording could not start.",x(true);}});return}if(te.current)return;let B=await Vt(Ke);te.current=B,j.current=true,J.current=null,H({phase:"recording",stream:B.stream,startedAt:Date.now(),maxSeconds:Ke}),x(false),ct(B.stream).then(V=>{J.current=V;}).catch(()=>{}),B.result.then(V=>Re(V)).catch(()=>Re(null));},[Re,c?.provider,ue]),xe=Ut.useCallback(()=>{z.current?z.current.stop():te.current?.stop();},[]),ne=Ut.useCallback(()=>{if(z.current){z.current.cancel();return}let k=te.current;te.current=null,j.current=false,J.current=null,H(null),k?.cancel(),I(null),F(null),x(true);},[]),Se=Ut.useCallback(()=>{let k=me.current;return me.current=null,k},[]),pe=Ut.useCallback(()=>{let k=he.current;return he.current=null,k},[]);Ut.useEffect(()=>{b||(he.current=null);},[b]);let Le=yn(),ke=wn(i);bn(l);let Me=Rn(a?"":e,t??Mn),Ge=p??Me.shakeToOpen;Sn(Ge,O,b);let Be=Ut.useMemo(()=>({client:$,user:n,isOpen:b,isSubmitting:ee,error:W,open:O,close:X,openCapture:O,closeCapture:X,submit:L,isNativeShell:Le,capture:m,initialCapture:A,initialCaptureError:N,isOpening:M,startVideoSession:Pe,stopVideoSession:xe,cancelVideoSession:ne,recording:K,consumePendingVideo:Se,canRecordScreen:be,consumeRecordStartError:pe}),[$,n,b,ee,W,O,X,L,Le,m,A,N,Pe,xe,ne,K,Se,be,pe,M]),Z=Oo({explicit:a,remote:Me.trigger,remoteLoading:Me.loading,floatingButton:o});return jsxRuntime.jsxs(nt.Provider,{value:Be,children:[w,Z?.kind==="floating"?jsxRuntime.jsx(cn,{config:hn(Z),portalTarget:s,hidden:ke||M||K!=null,onPointerDown:_,onClick:k=>O(k)}):null,Z?.kind==="notch"?jsxRuntime.jsx(fn,{config:gn(Z),portalTarget:s,hidden:ke||M||K!=null,onPointerDown:_,onClick:k=>O(k)}):null,Z?.kind==="inline"?jsxRuntime.jsx(dn,{mount:Z.mount,label:Z.label??"Feedback",icon:Z.icon,onPointerDown:_,onClick:k=>O(k)}):null,K?jsxRuntime.jsx(Qt,{state:K,portalTarget:s,onStop:xe,onCancel:ne}):null,jsxRuntime.jsx(pt,{}),jsxRuntime.jsx(Do,{})]})}function Do(){let[e,t]=Ut.useState(false);return Ut.useEffect(()=>{t(!document.querySelector("[data-sonner-toaster]"));},[]),e?jsxRuntime.jsx(sonner.Toaster,{position:"top-center",style:{zIndex:2147483647}}):null}function Oo(e){return e.explicit?e.explicit:e.floatingButton===false?{kind:"headless"}:e.remote?e.remote:e.remoteLoading?null:{kind:"floating"}}function Bo({variant:e="default",floating:t=false,className:n,children:r="Feedback",onClick:o,...a}){let{openCapture:i}=De(),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,"data-lumen-trigger":"",onClick:s=>{o?.(s),s.defaultPrevented||i(s.nativeEvent);},...a,children:r})}
|
|
4
|
+
exports.CaptureModal=pt;exports.FeedbackButton=Bo;exports.LUMEN_SHAKE_MESSAGE=ze;exports.LumenProvider=Io;exports.createNativeCaptureProvider=ar;exports.isLumenEventTarget=br;exports.useLumen=De;//# sourceMappingURL=index.cjs.map
|
|
5
5
|
//# sourceMappingURL=index.cjs.map
|