blocfeed 0.16.0 → 0.17.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.17.0 — 2026-04-28
4
+
5
+ ### Added
6
+ - **Session replay (rrweb-based capture).** Records full DOM event sessions by default for every visitor. Buffer flushes every 30s or 1MB to a Wasabi-backed ingestion endpoint. Linked to behavioral signals via `session_id` so when a bug fires, the dashboard can play back the user's actual experience leading up to it.
7
+ - New `BehavioralConfig.sessionReplay` config block: `{ enabled, sampling, masking, flushIntervalMs, maxDurationMs }`. Enabled by default.
8
+
9
+ ### Privacy
10
+ - Conservative masking by default: all `<input>` values masked, password/email/tel inputs always masked, opt-in `data-blocfeed-mask` selector for any element to mask its text, opt-in `data-blocfeed-block` selector to skip recording an element entirely.
11
+ - 5-minute max session duration. Chunks expire automatically after 30 days via Wasabi lifecycle policy.
12
+
13
+ ---
14
+
15
+ ## 0.16.1 — 2026-04-27
16
+
17
+ ### Fixed
18
+ - **Dead-click false positive on file-upload buttons.** Buttons that programmatically open a native file picker (the standard React pattern: `<button onClick={() => inputRef.current.click()}>` with a hidden `<input type=file>`) were generating false dead-click events because the OS dialog opening produces no DOM mutation, URL change, or network request inside the observation window. The detector now patches `HTMLInputElement.prototype.click` and treats programmatic file-picker invocations as an observed reaction. Catches every uploader pattern regardless of where the file input sits in the DOM.
19
+
20
+ ---
21
+
3
22
  ## 0.16.0 — 2026-04-25
4
23
 
5
24
  ### Added
@@ -0,0 +1,2 @@
1
+ 'use strict';var rrweb=require('rrweb');function S(){return typeof window<"u"&&typeof document<"u"}function He(e){let t=globalThis.CSS;return typeof t?.escape=="function"?t.escape(e):e.replace(/[^a-zA-Z0-9_-]/g,n=>{let o=n.codePointAt(0);return o===void 0?"":`\\${o.toString(16)} `})}function we(e){return {x:e.x,y:e.y,width:e.width,height:e.height}}function Ot(e){return {x:e.x+window.scrollX,y:e.y+window.scrollY,width:e.width,height:e.height}}function Ut(e){return e.replace(/\s+/g," ").trim()}function N(e,t=140){let n=e.textContent;if(!n)return;let o=Ut(n);if(o)return o.length<=t?o:`${o.slice(0,t-1)}\u2026`}function Ht(e){let t=1;for(let n=e.previousElementSibling;n;n=n.previousElementSibling)n.tagName===e.tagName&&(t+=1);return t}var ze=["data-testid","data-test-id","data-test","data-qa","data-cy"],qe="data-blocfeed-component";function H(e){let t=e.closest(`[${qe}]`);if(!t)return;let o=t.getAttribute(qe)?.trim();return o||void 0}function K(e,t=5){let n=[],o=e,r=0;for(;o&&r<t*4;){let i=H(o);if(i&&n[n.length-1]!==i&&(n.push(i),n.length>=t))break;o=o.parentElement,r++;}return n}function qt(e){for(let t of ze){let n=e.closest(`[${t}]`);if(!n)continue;let r=n.getAttribute(t)?.trim();if(r)return r}}function Ve(e){try{let t=e,n=Object.getOwnPropertyNames(t);for(let o of n)if(o.startsWith("__reactFiber$")||o.startsWith("__reactInternalInstance$")){let r=t[o];if(r&&typeof r=="object")return r}}catch{}return null}function z(e){if(e.length<=1||e.length===2&&e[0]===e[0].toLowerCase()||e.startsWith("__")&&e.endsWith("__"))return true;let t=e[0];return t>="a"&&t<="z"}function Q(e){if(e){for(let t of e)if(typeof t.name=="string"&&t.name&&!z(t.name))return t.name}}function L(e){if(e&&typeof e!="string"){if(typeof e=="function"){let t=e;return typeof t.displayName=="string"&&t.displayName?t.displayName:typeof t.name=="string"&&t.name?t.name:void 0}if(typeof e=="object"){let t=e,n=t.displayName;if(typeof n=="string"&&n)return n;let o=t.render;if(typeof o=="function"){let i=o;if(typeof i.displayName=="string"&&i.displayName)return i.displayName;if(typeof i.name=="string"&&i.name)return i.name}let r=t.type;return L(r)}}}function ve(e){let t=Ve(e);if(!t)return;let n=Q(t._debugInfo);if(n)return n;let o=t._debugOwner!==void 0;if(o){let a=t._debugOwner;for(let l=0;a&&l<50;l+=1){let u=Q(a._debugInfo);if(u)return u;let f=L(a.type)??L(a.elementType);if(f&&!z(f))return f;a=a._debugOwner;}}if(t._owner!==void 0&&t._owner!==t._debugOwner){let a=t._owner;for(let l=0;a&&l<50;l+=1){let u=Q(a._debugInfo);if(u)return u;let f=L(a.type)??L(a.elementType);if(f&&!z(f))return f;a=a._owner;}}let i=t,c=o?80:25;for(let a=0;i&&a<c;a+=1){let l=Q(i._debugInfo);if(l)return l;let u=L(i.type)??L(i.elementType);if(u&&!z(u))return u;i=i.return;}let s=e.parentElement;for(let a=0;s&&a<15;a+=1){let l=Ve(s);if(l){let u=Q(l._debugInfo);if(u)return u;let f=L(l.type)??L(l.elementType);if(f&&!z(f))return f;if(l._debugOwner){let p=L(l._debugOwner.type)??L(l._debugOwner.elementType);if(p&&!z(p))return p}if(l._owner&&l._owner!==l._debugOwner){let p=L(l._owner.type)??L(l._owner.elementType);if(p&&!z(p))return p}}s=s.parentElement;}}function Vt(e){let t=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n)return `#${He(n)}`;for(let o of ze){let r=e.getAttribute(o);if(r)return `${t}[${o}="${He(r)}"]`}return `${t}:nth-of-type(${Ht(e)})`}function $(e,t=10){let n=[],o=e;for(;o&&n.length<t;){let r=Vt(o);if(n.unshift(r),r.startsWith("#"))break;o=o.parentElement;}return n.join(" > ")}var Xt=new Set(["button","link","tab","menuitem"]);function $e(e){if(e.tagName==="BUTTON")return e.disabled?null:"button";if(e.tagName==="A"||e.tagName==="a"){let n=e.getAttribute("href")?.trim();return !n||n==="#"||n.toLowerCase().startsWith("javascript:")?null:"link"}let t=e.getAttribute("role");if(t&&Xt.has(t))return "role";try{if(window.getComputedStyle(e).cursor==="pointer")return "cursor_pointer"}catch{}return null}function Xe(e,t){if(!t||t.length===0)return false;for(let n of t)if(e.closest(n))return true;return false}function Ee(e,t){if(!e||Xe(e,t.ignoreSelectors))return null;let n=e;for(;n;){if(Xe(n,t.ignoreSelectors))return null;if(t.isSelectable?t.isSelectable(n):zt(n))return n;n=n.parentElement;}return null}function re(e,t){if(t.length===0)return false;for(let n of t)try{if(e.matches(n)||e.closest(n))return !0}catch{}return false}function zt(e){let t=e.tagName;return !(t==="HTML"||t==="BODY")}function je(e){let t=e.getBoundingClientRect(),n={selector:$(e),tagName:e.tagName.toLowerCase(),rect:we(t),pageRect:Ot(t)},o=e.getAttribute("id");o&&(n.id=o);let r=e.className;typeof r=="string"&&r.trim()&&(n.className=r);let i=N(e);i&&(n.textSnippet=i);let c=H(e)??ve(e);c&&(n.componentName=c);let s=qt(e);return s&&(n.testId=s),n}var Se=null;async function We(){return Se||(Se=import('html-to-image')),Se}async function $t(e){return await new Promise((t,n)=>{let o=new Image;o.onload=()=>t({width:o.naturalWidth,height:o.naturalHeight}),o.onerror=()=>n(new Error("Failed to load generated screenshot")),o.src=e;})}async function Ke(e,t){let{width:n,height:o}=await $t(e);return {dataUrl:e,mime:t,width:n,height:o}}function Z(e){if(e?.aborted)throw new Error("Aborted")}function Ze(){return {async captureElement(e,t){if(!S())throw new Error("captureElement can only run in the browser");Z(t.signal);let n=await We();Z(t.signal);let o=t.mime==="image/jpeg"?await n.toJpeg(e,{quality:t.quality??.92,pixelRatio:t.pixelRatio}):await n.toPng(e,{pixelRatio:t.pixelRatio});return Z(t.signal),await Ke(o,t.mime)},async captureFullPage(e){if(!S())throw new Error("captureFullPage can only run in the browser");Z(e.signal);let t=document.documentElement,n=Math.max(t.scrollWidth,t.clientWidth),o=Math.max(t.scrollHeight,t.clientHeight),r=Math.min(1,e.maxDimension/Math.max(n,o)),i=Math.max(1,Math.round(n*r)),c=Math.max(1,Math.round(o*r)),s=await We();Z(e.signal);let a=e.mime==="image/jpeg"?await s.toJpeg(t,{width:i,height:c,quality:e.quality??.92,pixelRatio:e.pixelRatio}):await s.toPng(t,{width:i,height:c,pixelRatio:e.pixelRatio});return Z(e.signal),await Ke(a,e.mime)}}}function jt(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return "Unknown error"}}function y(e,t,n){let o={kind:e,message:jt(t)};return n&&(o.detail=n),o}var Wt=12e3,Kt=2048,Zt=.92;function Ge(){return Date.now()}function Gt(e){return new Promise((t,n)=>{let o=()=>n(new Error("Aborted"));if(e.aborted){o();return}e.addEventListener("abort",o,{once:true});})}async function Ye(e,t,n){let o=new Promise((i,c)=>{let s=setTimeout(()=>c(new Error("Timeout")),t);typeof s.unref=="function"&&s.unref();}),r=[e,o];return n&&r.push(Gt(n)),await Promise.race(r)}function Yt(e){if(!S())return 1;let t=window.devicePixelRatio||1,n=e?.pixelRatio??Math.min(t,2);return Math.max(.1,n)}function Qt(e){return !!(e?.element||e?.fullPage)}function Qe(e){let t={mime:e.mime,pixelRatio:e.pixelRatio,maxDimension:e.maxDimension};return e.includeQuality&&(t.quality=e.quality),e.signal&&(t.signal=e.signal),t}async function Je(e){let{selectionElement:t,capture:n,signal:o}=e;if(!S()||!Qt(n))return;let r=Ge(),i=[],c=n?.timeoutMs??Wt,s=n?.maxDimension??Kt,a=n?.mime??"image/png",l=n?.quality??Zt,u=n?.adapter??Ze(),f={},p=Yt(n);if(n?.element&&t)try{let g=t.getBoundingClientRect(),h=Math.min(1,s/Math.max(g.width,g.height)),E=Math.min(p,p*h),w=await Ye(Promise.resolve(u.captureElement(t,{...Qe({mime:a,quality:l,pixelRatio:E,maxDimension:s,includeQuality:a==="image/jpeg",...o?{signal:o}:{}})})),c,o);f.element=w;}catch(g){if(o?.aborted)throw g;i.push(y("capture_failed",g,{target:"element"}));}if(n?.fullPage)try{let g=await Ye(Promise.resolve(u.captureFullPage(Qe({mime:a,quality:l,pixelRatio:p,maxDimension:s,includeQuality:a==="image/jpeg",...o?{signal:o}:{}}))),c,o);f.fullPage=g;}catch(g){if(o?.aborted)throw g;i.push(y("capture_failed",g,{target:"fullPage"}));}let m=Ge(),d={startedAt:r,finishedAt:m,durationMs:Math.max(0,m-r)};return i.length>0&&(d.errors=i),{...f,diagnostics:d}}function Jt(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function en(){return S()?{url:window.location.href,title:document.title,referrer:document.referrer||void 0,userAgent:navigator.userAgent,language:navigator.language,platform:navigator.platform,viewport:{width:window.innerWidth,height:window.innerHeight},screen:{width:window.screen.width,height:window.screen.height},scroll:{x:window.scrollX,y:window.scrollY},devicePixelRatio:window.devicePixelRatio||1,timezone:Jt()}:{}}function tn(e){if(!e)return {};let t={};return e.id&&(t.userId=e.id),e.email&&(t.userEmail=e.email),e.name&&(t.userName=e.name),t}async function et(e){let{config:t,context:n,user:o}=e;if(t?.enabled===false)return {};let r={...en(),...tn(o)},i=t?.enrich;if(!i)return r;try{let c=await i(n);return {...r,...c}}catch(c){let s=y("unknown",c);return {...r,blocfeedMetadataError:s.message}}}var J="blocfeed-queue",nn=50;function _e(){if(!S())return [];try{let e=localStorage.getItem(J);if(!e)return [];let t=JSON.parse(e);if(Array.isArray(t))return t;console.warn("[BlocFeed] offline queue was corrupt (non-array) \u2014 resetting");try{localStorage.removeItem(J);}catch{}return []}catch(e){console.warn("[BlocFeed] offline queue could not be read \u2014 resetting",e);try{localStorage.removeItem(J);}catch{}return []}}function ke(e){if(S())try{e.length===0?localStorage.removeItem(J):localStorage.setItem(J,JSON.stringify(e));}catch(t){let n=t instanceof DOMException?t.name:"";console.warn(`[BlocFeed] failed to persist offline queue${n?` (${n})`:""} \u2014 feedback may be lost if page is closed`);}}function on(e){let t={...e};if(t.screenshots){let n={...t.screenshots};n.element&&(n.element={...n.element,dataUrl:""}),n.fullPage&&(n.fullPage={...n.fullPage,dataUrl:""}),t.screenshots=n;}return delete t.video,t}function Ce(e){let t=_e(),n=on(e);for(n.metadata={...n.metadata,_queued:true},t.push({payload:n,timestamp:Date.now()});t.length>nn;)t.shift();ke(t);}function tt(){let e=_e();return e.length===0?[]:(ke([]),e.map(t=>t.payload))}function go(){ke([]);}function ho(){return _e().length}var rn=200,ee=[],nt=0,ie=false;function ot(e){let t=e.target;if(!(t instanceof Element)||t.closest("[data-blocfeed-ui]"))return;let n={timestampMs:Date.now()-nt,path:window.location.pathname,tagName:t.tagName.toLowerCase()},o=N(t,100);o&&(n.textSnippet=o);let r=H(t)??ve(t);r&&(n.componentName=r),ee.length<rn&&ee.push(n);}var rt={capture:true,passive:true};function it(){ie||!S()||(ie=true,ee=[],nt=Date.now(),document.addEventListener("click",ot,rt));}function st(){ie&&(ie=false,document.removeEventListener("click",ot,rt));}function sn(){return [...ee]}function an(){ee=[];}var ln=3e4,cn=25e5,at="video/webm",un=250,dn=1e3,fn=["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];function lt(){if(typeof MediaRecorder>"u")return null;for(let e of fn)if(MediaRecorder.isTypeSupported(e))return e;return null}function pn(){return !S()||typeof navigator?.mediaDevices?.getDisplayMedia!="function"?false:lt()!==null}async function Te(e){let{config:t,signal:n}=e;if(!S()||typeof navigator?.mediaDevices?.getDisplayMedia!="function")throw y("recording_failed",new Error("Screen recording is not supported in this browser"));let o=lt();if(!o)throw y("recording_failed",new Error("No supported video codec found (WebM required)"));if(n?.aborted)throw y("aborted",new Error("Recording aborted before start"));let r;try{r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1});}catch(h){let E=h instanceof DOMException&&h.name==="NotAllowedError"?"Screen share permission denied":"Failed to start screen share";throw y("recording_failed",new Error(E))}if(n?.aborted)throw r.getTracks().forEach(h=>h.stop()),y("aborted",new Error("Recording aborted after permission"));let i=t?.maxDurationMs??ln,c=t?.videoBitsPerSecond??cn,s=new MediaRecorder(r,{mimeType:o,videoBitsPerSecond:c}),a=[],l=[],u=0,f=null,p=null,m=false,d=()=>{st(),f!==null&&(clearInterval(f),f=null),p!==null&&(clearTimeout(p),p=null),r.getTracks().forEach(h=>h.stop());},g=new Promise((h,E)=>{s.ondataavailable=C=>{C.data.size>0&&a.push(C.data);},s.onstop=()=>{if(m)return;m=true,d();let C=Date.now()-u,A=new Blob(a,{type:at}),v=URL.createObjectURL(A);h({mime:at,blobUrl:v,blob:A,durationMs:C,sizeBytes:A.size});},s.onerror=()=>{m||(m=true,d(),E(y("recording_failed",new Error("MediaRecorder error"))));};let w=r.getVideoTracks()[0];if(w&&w.addEventListener("ended",()=>{s.state!=="inactive"&&s.stop();}),n){let C=()=>{m||(m=true,s.state!=="inactive"&&s.stop(),d(),E(y("aborted",new Error("Recording aborted"))));};n.addEventListener("abort",C,{once:true});}});return s.start(dn),it(),u=Date.now(),f=setInterval(()=>{let h=Date.now()-u;for(let E of l)E(h);},un),p=setTimeout(()=>{!m&&s.state!=="inactive"&&s.stop();},i),{result:g,stop(){!m&&s.state!=="inactive"&&s.stop();},onTick(h){l.push(h);},abort(){m||(m=true,s.state!=="inactive"&&s.stop(),d());}}}var mn=6e4,ct="audio/webm",gn=250,hn=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus"];function ut(){if(typeof MediaRecorder>"u")return null;for(let e of hn)if(MediaRecorder.isTypeSupported(e))return e;return null}function bn(){return !S()||typeof navigator?.mediaDevices?.getUserMedia!="function"?false:ut()!==null}async function Re(e){let{config:t,signal:n}=e;if(!S()||typeof navigator?.mediaDevices?.getUserMedia!="function")throw y("recording_failed",new Error("Microphone recording is not supported in this browser"));let o=ut();if(!o)throw y("recording_failed",new Error("No supported audio codec found"));if(n?.aborted)throw y("aborted",new Error("Voice recording aborted before start"));let r;try{r=await navigator.mediaDevices.getUserMedia({audio:!0});}catch(g){let h=g instanceof DOMException&&g.name==="NotAllowedError"?"Microphone permission denied":"Failed to access microphone";throw y("recording_failed",new Error(h))}if(n?.aborted)throw r.getTracks().forEach(g=>g.stop()),y("aborted",new Error("Voice recording aborted after permission"));let i=t?.maxDurationMs??mn,c=new MediaRecorder(r,{mimeType:o}),s=[],a=[],l=0,u=null,f=null,p=false,m=()=>{u!==null&&(clearInterval(u),u=null),f!==null&&(clearTimeout(f),f=null),r.getTracks().forEach(g=>g.stop());},d=new Promise((g,h)=>{if(c.ondataavailable=E=>{E.data.size>0&&s.push(E.data);},c.onstop=()=>{if(p)return;p=true,m();let E=Date.now()-l,w=new Blob(s,{type:ct});g({blob:w,mime:ct,durationMs:E});},c.onerror=()=>{p||(p=true,m(),h(y("recording_failed",new Error("MediaRecorder error"))));},n){let E=()=>{p||(p=true,c.state!=="inactive"&&c.stop(),m(),h(y("aborted",new Error("Voice recording aborted"))));};n.addEventListener("abort",E,{once:true});}});return c.start(1e3),l=Date.now(),u=setInterval(()=>{let g=Date.now()-l;for(let h of a)h(g);},gn),f=setTimeout(()=>{f=null,!p&&c.state!=="inactive"&&c.stop();},i),{result:d,stop(){!p&&c.state!=="inactive"&&c.stop();},onTick(g){a.push(g);},abort(){p||(p=true,c.state!=="inactive"&&c.stop(),m());}}}var yn=12e3,wn=2,vn=500,En=2e3,xe="https://blocfeed.com/api/feedback",Sn="https://blocfeed.com/api/feedback/voice",dt=0,mt="blocfeed-viewer-token",gt="blocfeed-my-feedback-url";function _n(){try{return localStorage.getItem(mt)}catch{return null}}function Po(){try{return localStorage.getItem(gt)}catch{return null}}function kn(e,t){try{localStorage.setItem(mt,e),t&&localStorage.setItem(gt,t);}catch{}}function ft(e,t){return new Promise((n,o)=>{if(t?.aborted){o(new Error("Aborted"));return}let r=setTimeout(n,e),i=()=>{clearTimeout(r),o(new Error("Aborted"));};t?.addEventListener("abort",i,{once:true});})}function Cn(e){return e>=500&&e<=599}function Tn(e){let[t,n]=e.split(",",2);if(!t||!n)throw new Error("Invalid data URL");let r=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(n),c=new Uint8Array(i.length);for(let s=0;s<i.length;s+=1)c[s]=i.charCodeAt(s);return new Blob([c],{type:r})}function Rn(e){let t={},n={},o={...e};if(o.screenshots){let r={},i={...o.screenshots};i.element&&(t.element=i.element.dataUrl,r.element={mime:i.element.mime,width:i.element.width,height:i.element.height},i.element={...i.element,dataUrl:""}),i.fullPage&&(t.fullPage=i.fullPage.dataUrl,r.fullPage={mime:i.fullPage.mime,width:i.fullPage.width,height:i.fullPage.height},i.fullPage={...i.fullPage,dataUrl:""}),o.screenshots=i,(r.element||r.fullPage)&&(o.screenshot_intent=r);}return o.video&&(n.blob=o.video.blob,o.video_intent={mime:o.video.mime,durationMs:o.video.durationMs,sizeBytes:o.video.sizeBytes},delete o.video),{lean:o,extracted:t,extractedVideo:n}}async function pt(e,t,n){let o=Tn(t);await fetch(e,{method:"PUT",body:o,headers:{"content-type":o.type},...n?{signal:n}:{}});}async function xn(e){let{feedbackId:t,extracted:n,screenshots:o,signal:r}=e,i={};n.element&&o?.element&&(i.element={dataUrl:n.element,mime:o.element.mime,width:o.element.width,height:o.element.height}),n.fullPage&&o?.fullPage&&(i.fullPage={dataUrl:n.fullPage,mime:o.fullPage.mime,width:o.fullPage.width,height:o.fullPage.height}),Object.keys(i).length!==0&&await fetch(`${xe}/${t}/screenshots`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i),...r?{signal:r}:{}});}async function An(e){await fetch(`${xe}/${e.feedbackId}/video`,{method:"POST",body:e.blob,headers:{"content-type":e.blob.type},...e.signal?{signal:e.signal}:{}});}async function ht(e){let{signal:t,transport:n}=e;if(Date.now()-dt<En)return {ok:false,error:y("configuration",new Error("Please wait before submitting again"))};let r=n?.timeoutMs??yn,i=n?.maxAttempts??wn,c=n?.backoffMs??vn,s=!!(e.payload.screenshots?.element?.dataUrl||e.payload.screenshots?.fullPage?.dataUrl),a=!!e.payload.video?.blob,l=s||a,{lean:u,extracted:f,extractedVideo:p}=l?Rn(e.payload):{lean:e.payload,extracted:{},extractedVideo:{}},m=_n();m&&(u.viewer_token=m);let d={...f,...e.screenshotDataUrls};for(let g=1;g<=i;g+=1){let h=new AbortController,E=setTimeout(()=>h.abort(),r),w=()=>h.abort();t&&t.addEventListener("abort",w,{once:true});try{let C=await fetch(xe,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(u),signal:h.signal});if(C.ok){dt=Date.now();let v;try{v=await C.json();}catch{}if(v?.viewer_token&&kn(v.viewer_token,v.my_feedback_url),(d.element||d.fullPage)&&v){let F=v.upload_urls;if(F){let q=[];d.element&&F.element&&q.push(pt(F.element,d.element,t)),d.fullPage&&F.fullPage&&q.push(pt(F.fullPage,d.fullPage,t));try{await Promise.all(q);}catch{}}else if(v.feedback_id)try{await xn({feedbackId:v.feedback_id,extracted:d,screenshots:e.payload.screenshots,...t?{signal:t}:{}});}catch{}}if(p.blob&&v){let F=v.upload_urls;if(F?.video)try{await fetch(F.video,{method:"PUT",body:p.blob,headers:{"content-type":p.blob.type},...t?{signal:t}:{}});}catch{}else if(v.feedback_id)try{await An({feedbackId:v.feedback_id,blob:p.blob,...t?{signal:t}:{}});}catch{}}let B={ok:!0,status:C.status};return v&&(B.apiResponse=v),B}if(g<i&&Cn(C.status)){let v=.85+Math.random()*.3,W=Math.round(c*2**(g-1)*v);await ft(W,t);continue}let A=`HTTP ${C.status}`;try{let v=await C.json();v?.error&&(A=v.error);}catch{}return {ok:!1,status:C.status,error:y("api_failed",new Error(A))}}catch(C){if(h.signal.aborted||t?.aborted)return {ok:false,error:y("aborted",C)};if(g<i){let A=.85+Math.random()*.3,v=Math.round(c*2**(g-1)*A);await ft(v,t);continue}return {ok:false,error:y("api_failed",C)}}finally{clearTimeout(E),t&&t.removeEventListener("abort",w);}}return {ok:false,error:y("api_failed",new Error("Failed"))}}async function bt(e){let{blob:t,mime:n,blocfeedId:o,signal:r}=e,i=await fetch(Sn,{method:"POST",headers:{"Content-Type":n,"X-Blocfeed-Id":o},body:t,...r?{signal:r}:{}});if(!i.ok){let s=await i.json().catch(()=>({error:"Unknown error"}));throw y("api_failed",new Error(s?.error??`Voice API returned ${i.status}`))}let c=await i.json();return {text:c.text??"",warning:c.warning}}var Mn={enabled:true,sampling:1,ignoreSelectors:["[data-blocfeed-ui]","[data-blocfeed-ignore]"],rageClick:{enabled:true,threshold:3,windowMs:1e3},httpFail:{enabled:true,statusCodes:[400,401,403,422,500,502,503,504],ignoreUrls:["/api/behavioral-events","/api/feedback"]},redirectLoop:{enabled:true,threshold:3,windowMs:2e3},formDataLoss:{enabled:true},deadClick:{enabled:true,observationWindowMs:300,rateLimitPerSelector:5}};function yt(e){let t=Mn;return {enabled:e?.enabled??t.enabled,sampling:e?.sampling??t.sampling,ignoreSelectors:e?.ignoreSelectors??t.ignoreSelectors,rageClick:{...t.rageClick,...e?.rageClick??{}},httpFail:{...t.httpFail,...e?.httpFail??{}},redirectLoop:{...t.redirectLoop,...e?.redirectLoop??{}},formDataLoss:{...t.formDataLoss,...e?.formDataLoss??{}},deadClick:{...t.deadClick,...e?.deadClick??{}}}}function wt(e){let t=[];async function n(){if(t.length===0)return;let r=t.splice(0,50);try{await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-blocfeed-id":e.blocfeedId},body:JSON.stringify({events:r}),keepalive:!0});}catch{}}function o(){if(t.length===0)return;if(typeof navigator>"u"||typeof navigator.sendBeacon!="function"){n();return}let r=t.splice(0,50),i=new Blob([JSON.stringify({events:r})],{type:"application/json"}),c=`${e.endpoint}?_bfid=${encodeURIComponent(e.blocfeedId)}`;try{navigator.sendBeacon(c,i);}catch{}}return {enqueue(r){t.push(r);},flush:n,flushBeacon:o,size(){return t.length}}}var vt="bf_behavioral_session",se=null;function P(){try{let e=sessionStorage.getItem(vt);if(e)return e;let t=Et();return sessionStorage.setItem(vt,t),t}catch{return se||(se=Et(),se)}}function Et(){let e=Math.random().toString(36).slice(2,10).padEnd(8,"0");return `bf_${Date.now()}_${e}`}function St(e,t){if(!e.rageClick.enabled)return ()=>{};let{threshold:n,windowMs:o}=e.rageClick,r=new Map;function i(c){try{let s=c.target;if(!s||!(s instanceof Element)||re(s,e.ignoreSelectors))return;let a=$(s,4);if(!a)return;let l=Date.now(),f=(r.get(a)??[]).filter(p=>l-p<=o);if(f.push(l),r.set(a,f),f.length>=n){let p=Ln(s),m=N(s,200)??null,d=s.tagName.toLowerCase(),g=s.id||null,h=H(s)??null,E=K(s,5),w={session_id:P(),event_type:"rage_click",page_url:typeof window>"u"?"":window.location.href,selector:a,element_text:m,event_data:{click_count:f.length,window_ms:o,...p?{disabled:!0}:{},tag_name:d,...g?{element_id:g}:{},...h?{component_name:h}:{},...E.length>0?{parent_components:E}:{}},created_at:new Date().toISOString()};t(w),r.set(a,[]);}}catch{}}return document.addEventListener("click",i,{capture:true,passive:true}),()=>document.removeEventListener("click",i,{capture:true})}function Ln(e){if(e.hasAttribute("disabled")||e.getAttribute("aria-disabled")==="true")return true;try{if(window.getComputedStyle(e).pointerEvents==="none")return !0}catch{}return false}var kt=0,Ct=null,ae=null,le=[],Fn=1500;function Pn(){function e(t){try{let n=t.target;if(!n)return;let o=n.closest('button[type="submit"], input[type="submit"], [data-blocfeed-submit]');if(!o)return;kt=Date.now();let r=o.closest("form");Ct=(r?$(r,3):"")||null,ae=N(o,100)??null,le=K(o,5);}catch{}}return document.addEventListener("click",e,{capture:true,passive:true}),()=>document.removeEventListener("click",e,{capture:true})}function Tt(e,t){if(!e.httpFail.enabled)return ()=>{};let{statusCodes:n,ignoreUrls:o}=e.httpFail,r=new Set(n),i=Pn(),c=globalThis.fetch,s=async(f,p)=>{let m=typeof f=="string"?f:f instanceof URL?f.toString():f.url,d=(p?.method??f.method??"GET").toUpperCase(),g=await c.call(globalThis,f,p);try{!_t(m,o)&&r.has(g.status)&&t(u(g.status,m,d));}catch{}return g};globalThis.fetch=s;let a=XMLHttpRequest.prototype.open,l=XMLHttpRequest.prototype.send;return XMLHttpRequest.prototype.open=function(f,p,...m){return this.__bf_url=p,this.__bf_method=f.toUpperCase(),a.call(this,f,p,...m)},XMLHttpRequest.prototype.send=function(f){let p=()=>{try{let m=this.__bf_url??"",d=this.__bf_method??"GET";!_t(m,o)&&r.has(this.status)&&t(u(this.status,m,d));}catch{}};return this.__bf_handler=p,this.addEventListener("loadend",p),l.call(this,f??null)},()=>{globalThis.fetch=c,XMLHttpRequest.prototype.open=a,XMLHttpRequest.prototype.send=l,i(),ae=null,le=[];};function u(f,p,m){let g=Date.now()-kt<Fn;return {session_id:P(),event_type:"error",page_url:typeof window>"u"?"":window.location.href,selector:null,element_text:null,event_data:{http_status:f,request_url:p,method:m,form_selector:g?Ct:null,...g&&ae?{button_text:ae}:{},...g&&le.length>0?{parent_components:le}:{}},created_at:new Date().toISOString()}}}function _t(e,t){if(t.length===0)return false;for(let n of t)if(e.includes(n))return true;return false}var In=3e4;function Rt(e,t){if(!e.redirectLoop.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let{threshold:n,windowMs:o}=e.redirectLoop,r=new Map,i=new Map,c=history.pushState,s=history.replaceState;function a(u){try{let f=Date.now(),p=i.get(u)??0;if(f<p)return;let d=(r.get(u)??[]).filter(g=>f-g<=o);if(d.push(f),r.set(u,d),d.length>=n){let g={session_id:P(),event_type:"thrashing",page_url:window.location.href,selector:null,element_text:null,event_data:{count:d.length,url:u,window_ms:o},created_at:new Date().toISOString()};t(g),i.set(u,f+In),r.set(u,[]);}}catch{}}function l(){let u=window.location.pathname+window.location.search;a(u);}return history.pushState=function(...u){let f=c.apply(this,u);return l(),f},history.replaceState=function(...u){let f=s.apply(this,u);return l(),f},window.addEventListener("popstate",l),()=>{history.pushState=c,history.replaceState=s,window.removeEventListener("popstate",l);}}function xt(e,t){if(!e.formDataLoss.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let n=new Set,o=0;function r(l){let u=l.closest("form");return u?u.id?`#${u.id}`:"form":null}function i(l){try{let u=l.target;if(!u||!(u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement||u instanceof HTMLSelectElement))return;let f=r(u);if(!f)return;n.has(f)||n.add(f),o++;}catch{}}function c(l){if(n.size===0)return;let u=Array.from(n),f={session_id:P(),event_type:"form_abandonment",page_url:window.location.href,selector:u[0]??null,element_text:null,event_data:{cause:l,field_count:o,forms:u},created_at:new Date().toISOString()};t(f);}function s(l){l.persisted&&c("bfcache_restore");}function a(){c("beforeunload_after_edit");}return document.addEventListener("input",i,{capture:true,passive:true}),window.addEventListener("pageshow",s),window.addEventListener("beforeunload",a),()=>{document.removeEventListener("input",i,{capture:true}),window.removeEventListener("pageshow",s),window.removeEventListener("beforeunload",a);}}function Bn(){let e={domMutationCount:0,urlChangeCount:0,networkCount:0,filePickerCount:0,uninstall:()=>{}},t=new MutationObserver(()=>{e.domMutationCount+=1;});t.observe(document.body,{childList:true,attributes:true,characterData:true,subtree:true});let n=history.pushState,o=history.replaceState;history.pushState=function(...a){return e.urlChangeCount+=1,n.apply(this,a)},history.replaceState=function(...a){return e.urlChangeCount+=1,o.apply(this,a)};let r=()=>{e.urlChangeCount+=1;};window.addEventListener("popstate",r);let i=globalThis.fetch;if(i){let a=(l,u)=>(e.networkCount+=1,i.call(globalThis,l,u));globalThis.fetch=a;}let c=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(a,l,...u){return e.networkCount+=1,c.call(this,a,l,...u)};let s=HTMLInputElement.prototype.click;return HTMLInputElement.prototype.click=function(){return this.type==="file"&&(e.filePickerCount+=1),s.call(this)},e.uninstall=()=>{t.disconnect(),history.pushState=n,history.replaceState=o,window.removeEventListener("popstate",r),i&&(globalThis.fetch=i),XMLHttpRequest.prototype.open=c,HTMLInputElement.prototype.click=s;},e}function At(e,t){if(!e.deadClick.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let{observationWindowMs:n,rateLimitPerSelector:o}=e.deadClick,r=new Map,i=Bn();function c(s){try{let a=s.target;if(!a||!(a instanceof Element)||s.button!==0||s.metaKey||s.ctrlKey||s.altKey||s.shiftKey||re(a,e.ignoreSelectors)||a.closest("label"))return;if(a instanceof HTMLInputElement){let v=a.type;if(v==="checkbox"||v==="radio"||v==="file")return}if(a instanceof HTMLSelectElement||a.closest("a[target='_blank'], a[download]")||a.closest('[contenteditable="true"]'))return;try{let v=window.getSelection();if(v&&v.toString().length>0)return}catch{}let l=$e(a);if(!l)return;let u=$(a,4);if(!u)return;let f=i.domMutationCount,p=i.urlChangeCount,m=i.networkCount,d=i.filePickerCount,g=new Date().toISOString(),h=N(a,200)??null,E=a.tagName.toLowerCase(),w=a.id||null,C=H(a)??null,A=K(a,5);setTimeout(()=>{if(i.domMutationCount!==f||i.urlChangeCount!==p||i.networkCount!==m||i.filePickerCount!==d)return;let v=r.get(u)??0;if(v>=o)return;r.set(u,v+1);let W={session_id:P(),event_type:"dead_click",page_url:typeof window>"u"?"":window.location.href,selector:u,element_text:h,event_data:{tag_name:E,...w?{element_id:w}:{},...C?{component_name:C}:{},...A.length>0?{parent_components:A}:{},clickable_reason:l},created_at:g};t(W);},n);}catch{}}return document.addEventListener("click",c,{capture:true,passive:true}),()=>{document.removeEventListener("click",c,{capture:true}),i.uninstall();}}var Nn="https://blocfeed.com/api/replay-events";function Mt(e){if(!e.config.enabled)return ()=>{};if(typeof window>"u")return ()=>{};if(typeof globalThis.matchMedia>"u")return ()=>{};let t=P();if(Un(t)%100/100>=e.config.sampling)return ()=>{};let o=e.config.endpoint??Nn,r=[],i=0,c=0,s=false,a=null,l=(h=false)=>{if(r.length===0)return;let E=r;r=[],c=0;let w=i++;Hn({blocfeedId:e.blocfeedId,sessionId:t,chunkSeq:w,events:E,endpoint:o,useBeacon:h});},u=setInterval(()=>{s||l();},e.config.flushIntervalMs),f=setTimeout(()=>{l(),g();},e.config.maxDurationMs),p=()=>{l(true);};window.addEventListener("pagehide",p);let m=e.config.masking,d={emit(h){s||(r.push(h),c+=On(h),c>=e.config.flushSizeBytes&&l());},recordCanvas:false,sampling:{mousemove:50}};m.maskAllInputs!==void 0&&(d.maskAllInputs=m.maskAllInputs),m.maskTextSelector!==void 0&&(d.maskTextSelector=m.maskTextSelector),m.maskTextClass!==void 0&&(d.maskTextClass=m.maskTextClass),m.blockSelector!==void 0&&(d.blockSelector=m.blockSelector),a=rrweb.record(d)??null;function g(){if(!s&&(s=true,clearInterval(u),clearTimeout(f),window.removeEventListener("pagehide",p),a))try{a();}catch{}}return g}function On(e){try{return JSON.stringify(e).length}catch{return 1024}}function Un(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)|0;return Math.abs(t)}async function Hn(e){let t=JSON.stringify({blocfeed_id:e.blocfeedId,session_id:e.sessionId,chunk_seq:e.chunkSeq,events:e.events,page_url:typeof window<"u"?window.location.href:"",user_agent:typeof navigator<"u"?navigator.userAgent:""});if(e.useBeacon&&typeof navigator<"u"&&typeof navigator.sendBeacon=="function")try{let n=new Blob([t],{type:"application/json"});navigator.sendBeacon(e.endpoint,n);return}catch{}try{await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:t,keepalive:!0});}catch{}}var qn={enabled:true,endpoint:null,maxDurationMs:3e5,flushIntervalMs:3e4,flushSizeBytes:1048576,sampling:1,masking:{maskAllInputs:true,maskTextSelector:"[data-blocfeed-mask]",maskTextClass:"blocfeed-mask",blockSelector:"[data-blocfeed-block]"}};function Lt(e){let t=qn;return {enabled:e?.enabled??t.enabled,endpoint:e?.endpoint??t.endpoint,maxDurationMs:e?.maxDurationMs??t.maxDurationMs,flushIntervalMs:e?.flushIntervalMs??t.flushIntervalMs,flushSizeBytes:e?.flushSizeBytes??t.flushSizeBytes,sampling:e?.sampling??t.sampling,masking:{...t.masking,...e?.masking??{}}}}var Vn=5e3,ce=class{constructor(t){this.submitter=null;this.detectorUninstallers=[];this.flushTimer=null;this.pageHideHandler=null;this.installed=false;this.opts=t,this.resolved=yt(t.config);}install(){if(this.installed||!this.resolved.enabled||!(this.opts.passiveSampler??(()=>Math.random()<this.resolved.sampling))())return;let n=this.opts.endpoint??"https://blocfeed.com/api/behavioral-events";this.submitter=this.opts.submitter??wt({endpoint:n,blocfeedId:this.opts.blocfeedId});let o=i=>{this.submitter?.enqueue(i);};this.detectorUninstallers.push(St(this.resolved,o)),this.detectorUninstallers.push(Tt(this.resolved,o)),this.detectorUninstallers.push(Rt(this.resolved,o)),this.detectorUninstallers.push(xt(this.resolved,o)),this.detectorUninstallers.push(At(this.resolved,o));let r=Lt(this.opts.config?.sessionReplay);this.detectorUninstallers.push(Mt({blocfeedId:this.opts.blocfeedId,config:r})),this.flushTimer=setInterval(()=>{this.submitter?.flush();},Vn),this.pageHideHandler=()=>{this.submitter?.flushBeacon();},typeof window<"u"&&window.addEventListener("pagehide",this.pageHideHandler),this.installed=true;}uninstall(){if(this.installed){for(let t of [...this.detectorUninstallers].reverse())try{t();}catch{}this.detectorUninstallers=[],this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.pageHideHandler&&typeof window<"u"&&(window.removeEventListener("pagehide",this.pageHideHandler),this.pageHideHandler=null);try{this.submitter?.flush();}catch{}this.submitter=null,this.installed=false;}}};function Ae(e){let t=null,n=null,o=(...r)=>{n=r,t===null&&(t=requestAnimationFrame(()=>{if(t=null,!n)return;let i=n;n=null,e(...i);}));};return o.cancel=()=>{t!==null&&cancelAnimationFrame(t),t=null,n=null;},o}function ue(e){return e instanceof Element?!!e.closest("[data-blocfeed-ui]"):false}function de(e){e.stopPropagation(),e.stopImmediatePropagation?.();}function Ft(e,t){if(!S())throw new Error("BlocFeed picker can only run in a browser environment.");let n=e.ignoreSelectors,o=e.isSelectable,r={};n&&n.length>0&&(r.ignoreSelectors=n),o&&(r.isSelectable=o);let i=null,c=null,s=(d,g=false)=>{if(!d){i=null,c=null,t.onHover(null);return}let h=we(d.getBoundingClientRect()),E=`${Math.round(h.x)}:${Math.round(h.y)}:${Math.round(h.width)}:${Math.round(h.height)}`;!g&&d===i&&E===c||(i=d,c=E,t.onHover({element:d,rect:h}));},a=Ae(d=>{if(ue(d.target))return;let g=document.elementFromPoint(d.clientX,d.clientY),h=Ee(g,r);s(h);}),l=Ae(()=>{i&&s(i,true);}),u=d=>{ue(d.target)||(de(d),d.pointerType==="mouse"&&d.preventDefault());},f=d=>{ue(d.target)||(de(d),d.pointerType==="mouse"&&d.preventDefault());},p=d=>{if(ue(d.target))return;de(d),d.preventDefault();let g=document.elementFromPoint(d.clientX,d.clientY),h=Ee(g,r);h&&t.onSelect({element:h,descriptor:je(h)});},m=d=>{d.key==="Escape"&&(de(d),d.preventDefault(),t.onCancel());};return window.addEventListener("pointermove",a,{capture:true,passive:true}),window.addEventListener("pointerdown",u,{capture:true}),window.addEventListener("pointerup",f,{capture:true}),window.addEventListener("click",p,{capture:true}),window.addEventListener("keydown",m,{capture:true}),window.addEventListener("scroll",l,{capture:true,passive:true}),window.addEventListener("resize",l,{passive:true}),{stop(){window.removeEventListener("pointermove",a,{capture:true}),window.removeEventListener("pointerdown",u,{capture:true}),window.removeEventListener("pointerup",f,{capture:true}),window.removeEventListener("click",p,{capture:true}),window.removeEventListener("keydown",m,{capture:true}),window.removeEventListener("scroll",l,{capture:true}),window.removeEventListener("resize",l),a.cancel(),l.cancel(),t.onHover(null);}}}async function Me(e){let{signal:t,transport:n}=e,o={ok:false};try{let r={payload:e.payload,...t?{signal:t}:{},...n?{transport:n}:{}};o.api=await ht(r),o.ok=!!o.api?.ok;}catch(r){o.api={ok:false,error:y("api_failed",r)},o.ok=false;}return {payload:e.payload,result:o}}var Xn=["[data-blocfeed-ui]","[data-blocfeed-ignore]"];function zn(e){let t=[...Xn,...e?.ignoreSelectors??[]],n=Array.from(new Set(t));return {...e,ignoreSelectors:n}}function Pt(){return {phase:"idle"}}function $n(e){if(e.ok)return false;let t=e.api;return t?t.status&&t.status>=400&&t.status<500||t.error?.kind==="aborted"||t.error?.kind==="configuration"?false:!t.ok:true}function Mr(e){let t=e,n=new ce({blocfeedId:t.blocfeed_id??"",...t.behavioral!==void 0?{config:t.behavioral}:{}});n.install();let o=Pt(),r=new Set,i=new Set,c=null,s=null,a=null,l=null,u=0,f=null,p=null,m=null,d=null,g=false,h=()=>{for(let b of r)b(o);},E=b=>{for(let _ of i)_(b);},w=b=>{o=b,h();},C=()=>{u+=1,l?.abort(),l=null;},A=()=>{c?.stop(),c=null,E(null),a!==null&&S()&&(document.documentElement.style.cursor=a,a=null);},v=()=>{if(m){try{URL.revokeObjectURL(m.blobUrl);}catch{}m=null;}},W=()=>{p&&(p.abort(),p=null),v();},B=null,F=()=>{d&&(d.abort(),d=null),B&&(B.abort(),B=null);},q=()=>{C(),A(),W(),F(),s=null,w(Pt());},Ne=()=>{if(!S())return;A(),s=null;let b=zn(t.picker);a=document.documentElement.style.cursor,document.documentElement.style.cursor="crosshair",w({phase:"picking"}),c=Ft(b,{onHover:E,onSelect:({element:_,descriptor:M})=>{s=_,A(),w({phase:"review",selection:M});},onCancel:()=>{q();}});},Oe=()=>{let b=tt();if(b.length!==0)for(let _ of b)Me({payload:_,...t.transport?{transport:t.transport}:{}}).catch(()=>{Ce(_);});};if(S()){setTimeout(Oe,1e3);let b=()=>Oe();window.addEventListener("online",b),f=()=>window.removeEventListener("online",b);}return {getState:()=>o,getConfig:()=>t,subscribe(b){return r.add(b),()=>r.delete(b)},subscribeHover(b){return i.add(b),()=>i.delete(b)},start(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||o.phase!=="picking"&&Ne();},stop(){q();},clearSelection(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||Ne();},setConfig(b){t=b;},async submit(b,_){if(!S()){let T=y("configuration",new Error("BlocFeed submit can only run in the browser"));return w({phase:"error",lastError:T}),{ok:false}}let M=t.blocfeed_id?.trim?.()??"";if(!M){let I={phase:"error",lastError:y("configuration",new Error("Missing blocfeed_id. Create a project in BlocFeed and pass its blocfeed_id."))};return o.selection&&(I.selection=o.selection),w(I),{ok:false}}if(g)return {ok:false};if(o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording")return {ok:false};g=true;let x=u+1;u=x,l?.abort(),l=new AbortController;let R=l.signal,k=o.selection,D=_?.capture?{...t.capture,..._.capture}:t.capture,V=!!(D?.element||D?.fullPage),G={phase:V?"capturing":"submitting"};k&&(G.selection=k),w(G);try{let T=V?await Je({selectionElement:s,capture:D,signal:R}):void 0;if(R.aborted||u!==x)return {ok:!1};let I={phase:"submitting"};k&&(I.selection=k),T&&(I.capture=T),w(I);let O={};k&&(O.selection=k),T&&(O.capture=T);let Y=await et({config:t.metadata,context:O,...t.user?{user:t.user}:{}}),X={version:1,createdAt:new Date().toISOString(),blocfeed_id:M,message:b,metadata:Y};_?.category&&(X.category=_.category),t.user&&(X.user=t.user),k&&(X.selection=k),T&&(X.screenshots=T),m&&(X.video=m);let{result:U}=await Me({payload:X,signal:R,...t.transport?{transport:t.transport}:{}});if(R.aborted||u!==x)return U;if(U.ok){v(),s=null;let ye={phase:"success",lastSubmit:U};return k&&(ye.selection=k),T&&(ye.capture=T),w(ye),U}$n(U)&&Ce(X);let Nt=U.api?.error??y("unknown",new Error("Submission failed")),be={phase:"error",lastSubmit:U,lastError:Nt};return k&&(be.selection=k),T&&(be.capture=T),w(be),U}catch(T){if(R.aborted||u!==x)return {ok:false};let O={phase:"error",lastError:R.aborted?y("aborted",T):y("unknown",T)};return k&&(O.selection=k),w(O),{ok:false}}finally{g=false,u===x&&(l=null);}},async startRecording(){if(o.phase!=="review"||!t.recording?.enabled||d||p)return;let b=o.selection,_={phase:"recording",recordingElapsedMs:0};b&&(_.selection=b),w(_);try{let M={config:t.recording};l&&(M.signal=l.signal);let x=await Te(M);p=x,x.onTick(D=>{if(o.phase==="recording"){let V={phase:"recording",recordingElapsedMs:D};b&&(V.selection=b),w(V);}});let R=await x.result;p=null,m=R;let k={phase:"review",video:R};b&&(k.selection=b),w(k);}catch(M){p=null;let R={phase:"review",lastError:M?.kind?M:y("recording_failed",M)};b&&(R.selection=b),w(R);}},stopRecording(){o.phase!=="recording"||!p||p.stop();},removeVideo(){v();let b=o.selection,_={phase:"review"};b&&(_.selection=b),w(_);},async startVoice(){if(o.phase!=="review"){console.warn("[BlocFeed] startVoice: ignored \u2014 phase is",o.phase,'(expected "review")');return}let b=t.voice;if(!b?.enabled){console.warn("[BlocFeed] startVoice: ignored \u2014 voice is not enabled in config");return}if(p){console.warn("[BlocFeed] startVoice: ignored \u2014 a screen recording is already in progress");return}F();let _=o.selection,M={phase:"review",voiceRecording:true,voiceElapsedMs:0};_&&(M.selection=_),m&&(M.video=m),w(M);try{let x={config:b};l&&(x.signal=l.signal);let R=await Re(x);d=R,R.onTick(O=>{let Y={phase:"review",voiceRecording:!0,voiceElapsedMs:O};_&&(Y.selection=_),m&&(Y.video=m),w(Y);});let k=await R.result;d=null;let D={phase:"review",voiceRecording:!1,voiceTranscribing:!0};_&&(D.selection=_),m&&(D.video=m),w(D),B=new AbortController;let V={blob:k.blob,mime:k.mime,blocfeedId:t.blocfeed_id,signal:B.signal},{text:Ue,warning:G}=await bt(V);B=null;let T={phase:"review",voiceRecording:!1,voiceTranscribing:!1};_&&(T.selection=_),m&&(T.video=m),w(T);let I={text:Ue};return G&&(I.warning=G),I}catch(x){F();let R=x?.kind?x:y("recording_failed",x);console.warn("[BlocFeed] Voice error:",R.message);let k={phase:"review",voiceRecording:false,voiceTranscribing:false,lastError:R};_&&(k.selection=_),m&&(k.video=m),w(k);return}},stopVoice(){d&&d.stop();},__unsafeGetSelectedElement(){return s},destroy(){n.uninstall(),q(),r.clear(),i.clear(),f?.(),f=null;}}}var te=[],ne=[],It=20,Bt=15,fe=[],Dt=typeof console<"u"?{log:console.log?.bind(console),warn:console.warn?.bind(console),error:console.error?.bind(console),info:console.info?.bind(console),debug:console.debug?.bind(console)}:{},pe=typeof globalThis<"u"&&typeof globalThis.fetch=="function"?globalThis.fetch:void 0,me=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.open:void 0,ge=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.send:void 0,Fe=new Set,Pe=false,Ie=false,he=false,jn=["blocfeed.com","google-analytics.com","googletagmanager.com","analytics.google.com","googleads.g.doubleclick.net","googlesyndication.com","googleadservices.com","google.com/pagead","google.com/ads","facebook.net","facebook.com/tr","connect.facebook.net","graph.facebook.com","api.mixpanel.com","api-js.mixpanel.com","api.amplitude.com","api2.amplitude.com","api.segment.io","cdn.segment.com","vars.hotjar.com","in.hotjar.com","script.hotjar.com","heapanalytics.com","fullstory.com/s/fs.js","rs.fullstory.com","app.posthog.com","us.posthog.com","eu.posthog.com","api-iam.intercom.io","widget.intercom.io","sentry.io/api","browser.sentry-cdn.com","browser-intake-datadoghq.com","clarity.ms","js.hs-analytics.net","api.hubapi.com","forms.hubspot.com","plausible.io/api","client.crisp.chat","js.driftt.com","r.logrocket.com","app.pendo.io","events.launchdarkly.com","app.launchdarkly.com","grammarly.com","gnar.grammarly.com","capi.grammarly.com","api.languagetool.org","api.languagetoolplus.com","fonts.googleapis.com","fonts.gstatic.com","cdn.cookielaw.org","consent.cookiebot.com","js.stripe.com","api.stripe.com/v1/tokens","google.com/recaptcha","hcaptcha.com","bam.nr-data.net","rec.smartlook.com","o2.mouseflow.com","api.luckyorange.com","static.zdassets.com","ekr.zdassets.com"];function Wn(e){if(e instanceof Error)return e.name&&e.name!=="Error"?`${e.name}: ${e.message}`:e.message||String(e);if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Kn(e,t){let n=t.map(Wn).join(" "),o=t.find(i=>i instanceof Error),r={level:e,message:n.slice(0,2e3),timestamp:Date.now()};for(o?.stack&&(r.stack=o.stack.slice(0,2e3)),te.push(r);te.length>It;)te.shift();}function Le(e){let t=e.url.toLowerCase();for(let n of fe)if(t.includes(n))return;for(ne.push(e);ne.length>Bt;)ne.shift();}function Pr(e={}){if(he||!S())return;he=true,It=e.consoleLimit??20,Bt=e.networkLimit??15;let t=e.ignoreUrls;if(t!==void 0?fe=t.map(n=>n.toLowerCase()):fe=[...jn],e.console!==false){let n=e.consoleLevels??["error","warn"];for(let o of n){let r=Dt[o];r&&(Fe.add(o),console[o]=(...i)=>{Kn(o,i),r.apply(console,i);});}}if(e.network!==false&&pe){let n=pe;Pe=true,window.fetch=async function(r,i){let c=typeof r=="string"?r:r instanceof URL?r.toString():r.url,s=(i?.method??"GET").toUpperCase(),a=Date.now();try{let l=await n.call(window,r,i);return l.ok||Le({url:c.slice(0,500),method:s,status:l.status,statusText:l.statusText,timestamp:a,durationMs:Date.now()-a}),l}catch(l){throw Le({url:c.slice(0,500),method:s,status:0,statusText:l instanceof Error?l.message:"Network error",timestamp:a,durationMs:Date.now()-a}),l}};}if(e.network!==false&&me&&ge){let n=me,o=ge;Ie=true,XMLHttpRequest.prototype.open=function(r,i,...c){return this.__bf_method=r.toUpperCase(),this.__bf_url=String(i),n.apply(this,[r,i,...c])},XMLHttpRequest.prototype.send=function(...r){let i=this.__bf_method||"GET",c=this.__bf_url||"",s=Date.now();return this.addEventListener("loadend",function(){if(this.status>=400||this.status===0){let a={url:c.slice(0,500),method:i,status:this.status,timestamp:s,durationMs:Date.now()-s};this.statusText&&(a.statusText=this.statusText),Le(a);}},{once:true}),o.apply(this,r)};}}function Ir(){if(he){for(let e of Fe){let t=Dt[e];t&&(console[e]=t);}Fe.clear(),Pe&&pe&&(window.fetch=pe,Pe=false),Ie&&me&&ge&&(XMLHttpRequest.prototype.open=me,XMLHttpRequest.prototype.send=ge,Ie=false),fe=[],he=false;}}function Br(){return {consoleLogs:[...te],networkErrors:[...ne]}}function Dr(){te=[],ne=[];}var Zn=[{name:"supabase_service_role_key",pattern:/SUPABASE_SERVICE_ROLE_KEY["'=:\s]{1,8}[A-Za-z0-9_.=-]{30,400}/},{name:"supabase_db_password",pattern:/SUPABASE_DB_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"postgres_password",pattern:/POSTGRES_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"database_url_with_creds",pattern:/(?:postgres|postgresql|mysql|mongodb|redis|amqp):\/\/[^:\s"']{1,100}:[^@\s"']{1,200}@/},{name:"aws_access_key",pattern:/AKIA[0-9A-Z]{16}/},{name:"aws_secret_key",pattern:/AWS_SECRET_ACCESS_KEY["'=:\s]{1,8}[A-Za-z0-9/+=]{30,200}/},{name:"aws_session_token",pattern:/AWS_SESSION_TOKEN["'=:\s]{1,8}[A-Za-z0-9/+=]{30,600}/},{name:"stripe_secret_key",pattern:/sk_live_[a-zA-Z0-9]{10,200}/},{name:"stripe_secret_key_test",pattern:/sk_test_[a-zA-Z0-9]{10,200}/},{name:"stripe_restricted_key",pattern:/rk_(?:live|test)_[a-zA-Z0-9]{10,200}/},{name:"github_pat",pattern:/ghp_[A-Za-z0-9_]{36,100}/},{name:"github_oauth",pattern:/gho_[A-Za-z0-9_]{36,100}/},{name:"github_user_token",pattern:/ghu_[A-Za-z0-9_]{36,100}/},{name:"github_server_token",pattern:/ghs_[A-Za-z0-9_]{36,100}/},{name:"github_fine_grained",pattern:/github_pat_[A-Za-z0-9_]{22,200}/},{name:"openai_api_key",pattern:/sk-[a-zA-Z0-9]{20,200}(?![a-zA-Z0-9_])/},{name:"anthropic_api_key",pattern:/sk-ant-[a-zA-Z0-9\-_]{20,200}/},{name:"private_key",pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"sendgrid_api_key",pattern:/SG\.[a-zA-Z0-9_-]{22,100}\.[a-zA-Z0-9_-]{22,100}/},{name:"twilio_auth_token",pattern:/TWILIO_AUTH_TOKEN["'=:\s]{1,8}[a-f0-9]{32}/},{name:"generic_secret_key",pattern:/[A-Z_]{2,60}_SECRET_KEY["'=:\s]{1,8}[^\s"']{8,200}/},{name:"generic_secret",pattern:/[A-Z_]{2,60}_SECRET["'=:\s]{1,8}[^\s"']{8,200}/},{name:"generic_password",pattern:/[A-Z_]{2,60}_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"generic_private_key_var",pattern:/[A-Z_]{2,60}_PRIVATE_KEY["'=:\s]{1,8}[^\s"']{8,400}/}],j=[],De=0,Be=false;function Gn(e){let t=e.slice(0,80);return t.length<=6?"***":t.slice(0,6)+"***"}function Yn(e,t,n,o){if(j.some(c=>c.rule===e&&c.source===t))return;let i={rule:e,source:t,hint:Gn(n),timestamp:Date.now()};o&&(i.location=o),j.push(i);}function oe(e,t,n,o){for(let{name:r,pattern:i}of n){let c=i.exec(e);c&&Yn(r,t,c[0],o);}}function Qn(e){try{let t=window;if(t.__NEXT_DATA__){let n=JSON.stringify(t.__NEXT_DATA__);oe(n,"hydration",e,"__NEXT_DATA__");}if(t.__NUXT__){let n=JSON.stringify(t.__NUXT__);oe(n,"hydration",e,"__NUXT__");}}catch{}}function Jn(e){try{document.querySelectorAll("script:not([src])").forEach((n,o)=>{let r=n.textContent;r&&r.length>0&&oe(r,"scripts",e,`inline-script[${o}]`);});}catch{}}function eo(e){try{document.querySelectorAll("meta[content]").forEach(n=>{let o=n.getAttribute("content"),r=n.getAttribute("name")||n.getAttribute("property")||"";o&&o.length>10&&oe(o,"meta",e,r?`meta[${r}]`:void 0);});}catch{}}function to(e){try{document.querySelectorAll("[data-api-key], [data-secret], [data-token], [data-password]").forEach(n=>{let o=n.attributes;for(let r=0;r<o.length;r++){let i=o[r];i.name.startsWith("data-")&&i.value.length>10&&oe(i.value,"dom",e,`${n.tagName.toLowerCase()}[${i.name}]`);}});}catch{}}function Ur(e={}){if(Be||!S()||(Be=true,e.secretScan===false))return;let t=[...Zn,...e.customPatterns??[]],n=e.scanTargets??["hydration","scripts","meta","dom"];setTimeout(()=>{De=Date.now(),n.includes("hydration")&&Qn(t),n.includes("scripts")&&Jn(t),n.includes("meta")&&eo(t),n.includes("dom")&&to(t);let o=e.notify??"both";j.length>0&&(o==="console"||o==="both")&&console.warn(`[BlocFeed Security] Found ${j.length} potential secret(s) exposed in client code:`,j.map(r=>`${r.rule} (${r.source}${r.location?`: ${r.location}`:""})`));},100);}function Hr(){return {findings:[...j],scannedAt:De}}function qr(){j=[],De=0,Be=false;}
2
+ exports.A=qr;exports.a=S;exports.b=we;exports.c=Ze;exports.d=Je;exports.e=et;exports.f=Ce;exports.g=tt;exports.h=go;exports.i=ho;exports.j=sn;exports.k=an;exports.l=pn;exports.m=Te;exports.n=bn;exports.o=Re;exports.p=_n;exports.q=Po;exports.r=bt;exports.s=ce;exports.t=Mr;exports.u=Pr;exports.v=Ir;exports.w=Br;exports.x=Dr;exports.y=Ur;exports.z=Hr;
@@ -0,0 +1,2 @@
1
+ import {record}from'rrweb';function S(){return typeof window<"u"&&typeof document<"u"}function He(e){let t=globalThis.CSS;return typeof t?.escape=="function"?t.escape(e):e.replace(/[^a-zA-Z0-9_-]/g,n=>{let o=n.codePointAt(0);return o===void 0?"":`\\${o.toString(16)} `})}function we(e){return {x:e.x,y:e.y,width:e.width,height:e.height}}function Ot(e){return {x:e.x+window.scrollX,y:e.y+window.scrollY,width:e.width,height:e.height}}function Ut(e){return e.replace(/\s+/g," ").trim()}function N(e,t=140){let n=e.textContent;if(!n)return;let o=Ut(n);if(o)return o.length<=t?o:`${o.slice(0,t-1)}\u2026`}function Ht(e){let t=1;for(let n=e.previousElementSibling;n;n=n.previousElementSibling)n.tagName===e.tagName&&(t+=1);return t}var ze=["data-testid","data-test-id","data-test","data-qa","data-cy"],qe="data-blocfeed-component";function H(e){let t=e.closest(`[${qe}]`);if(!t)return;let o=t.getAttribute(qe)?.trim();return o||void 0}function K(e,t=5){let n=[],o=e,r=0;for(;o&&r<t*4;){let i=H(o);if(i&&n[n.length-1]!==i&&(n.push(i),n.length>=t))break;o=o.parentElement,r++;}return n}function qt(e){for(let t of ze){let n=e.closest(`[${t}]`);if(!n)continue;let r=n.getAttribute(t)?.trim();if(r)return r}}function Ve(e){try{let t=e,n=Object.getOwnPropertyNames(t);for(let o of n)if(o.startsWith("__reactFiber$")||o.startsWith("__reactInternalInstance$")){let r=t[o];if(r&&typeof r=="object")return r}}catch{}return null}function z(e){if(e.length<=1||e.length===2&&e[0]===e[0].toLowerCase()||e.startsWith("__")&&e.endsWith("__"))return true;let t=e[0];return t>="a"&&t<="z"}function Q(e){if(e){for(let t of e)if(typeof t.name=="string"&&t.name&&!z(t.name))return t.name}}function L(e){if(e&&typeof e!="string"){if(typeof e=="function"){let t=e;return typeof t.displayName=="string"&&t.displayName?t.displayName:typeof t.name=="string"&&t.name?t.name:void 0}if(typeof e=="object"){let t=e,n=t.displayName;if(typeof n=="string"&&n)return n;let o=t.render;if(typeof o=="function"){let i=o;if(typeof i.displayName=="string"&&i.displayName)return i.displayName;if(typeof i.name=="string"&&i.name)return i.name}let r=t.type;return L(r)}}}function ve(e){let t=Ve(e);if(!t)return;let n=Q(t._debugInfo);if(n)return n;let o=t._debugOwner!==void 0;if(o){let a=t._debugOwner;for(let l=0;a&&l<50;l+=1){let u=Q(a._debugInfo);if(u)return u;let f=L(a.type)??L(a.elementType);if(f&&!z(f))return f;a=a._debugOwner;}}if(t._owner!==void 0&&t._owner!==t._debugOwner){let a=t._owner;for(let l=0;a&&l<50;l+=1){let u=Q(a._debugInfo);if(u)return u;let f=L(a.type)??L(a.elementType);if(f&&!z(f))return f;a=a._owner;}}let i=t,c=o?80:25;for(let a=0;i&&a<c;a+=1){let l=Q(i._debugInfo);if(l)return l;let u=L(i.type)??L(i.elementType);if(u&&!z(u))return u;i=i.return;}let s=e.parentElement;for(let a=0;s&&a<15;a+=1){let l=Ve(s);if(l){let u=Q(l._debugInfo);if(u)return u;let f=L(l.type)??L(l.elementType);if(f&&!z(f))return f;if(l._debugOwner){let p=L(l._debugOwner.type)??L(l._debugOwner.elementType);if(p&&!z(p))return p}if(l._owner&&l._owner!==l._debugOwner){let p=L(l._owner.type)??L(l._owner.elementType);if(p&&!z(p))return p}}s=s.parentElement;}}function Vt(e){let t=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n)return `#${He(n)}`;for(let o of ze){let r=e.getAttribute(o);if(r)return `${t}[${o}="${He(r)}"]`}return `${t}:nth-of-type(${Ht(e)})`}function $(e,t=10){let n=[],o=e;for(;o&&n.length<t;){let r=Vt(o);if(n.unshift(r),r.startsWith("#"))break;o=o.parentElement;}return n.join(" > ")}var Xt=new Set(["button","link","tab","menuitem"]);function $e(e){if(e.tagName==="BUTTON")return e.disabled?null:"button";if(e.tagName==="A"||e.tagName==="a"){let n=e.getAttribute("href")?.trim();return !n||n==="#"||n.toLowerCase().startsWith("javascript:")?null:"link"}let t=e.getAttribute("role");if(t&&Xt.has(t))return "role";try{if(window.getComputedStyle(e).cursor==="pointer")return "cursor_pointer"}catch{}return null}function Xe(e,t){if(!t||t.length===0)return false;for(let n of t)if(e.closest(n))return true;return false}function Ee(e,t){if(!e||Xe(e,t.ignoreSelectors))return null;let n=e;for(;n;){if(Xe(n,t.ignoreSelectors))return null;if(t.isSelectable?t.isSelectable(n):zt(n))return n;n=n.parentElement;}return null}function re(e,t){if(t.length===0)return false;for(let n of t)try{if(e.matches(n)||e.closest(n))return !0}catch{}return false}function zt(e){let t=e.tagName;return !(t==="HTML"||t==="BODY")}function je(e){let t=e.getBoundingClientRect(),n={selector:$(e),tagName:e.tagName.toLowerCase(),rect:we(t),pageRect:Ot(t)},o=e.getAttribute("id");o&&(n.id=o);let r=e.className;typeof r=="string"&&r.trim()&&(n.className=r);let i=N(e);i&&(n.textSnippet=i);let c=H(e)??ve(e);c&&(n.componentName=c);let s=qt(e);return s&&(n.testId=s),n}var Se=null;async function We(){return Se||(Se=import('html-to-image')),Se}async function $t(e){return await new Promise((t,n)=>{let o=new Image;o.onload=()=>t({width:o.naturalWidth,height:o.naturalHeight}),o.onerror=()=>n(new Error("Failed to load generated screenshot")),o.src=e;})}async function Ke(e,t){let{width:n,height:o}=await $t(e);return {dataUrl:e,mime:t,width:n,height:o}}function Z(e){if(e?.aborted)throw new Error("Aborted")}function Ze(){return {async captureElement(e,t){if(!S())throw new Error("captureElement can only run in the browser");Z(t.signal);let n=await We();Z(t.signal);let o=t.mime==="image/jpeg"?await n.toJpeg(e,{quality:t.quality??.92,pixelRatio:t.pixelRatio}):await n.toPng(e,{pixelRatio:t.pixelRatio});return Z(t.signal),await Ke(o,t.mime)},async captureFullPage(e){if(!S())throw new Error("captureFullPage can only run in the browser");Z(e.signal);let t=document.documentElement,n=Math.max(t.scrollWidth,t.clientWidth),o=Math.max(t.scrollHeight,t.clientHeight),r=Math.min(1,e.maxDimension/Math.max(n,o)),i=Math.max(1,Math.round(n*r)),c=Math.max(1,Math.round(o*r)),s=await We();Z(e.signal);let a=e.mime==="image/jpeg"?await s.toJpeg(t,{width:i,height:c,quality:e.quality??.92,pixelRatio:e.pixelRatio}):await s.toPng(t,{width:i,height:c,pixelRatio:e.pixelRatio});return Z(e.signal),await Ke(a,e.mime)}}}function jt(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return "Unknown error"}}function y(e,t,n){let o={kind:e,message:jt(t)};return n&&(o.detail=n),o}var Wt=12e3,Kt=2048,Zt=.92;function Ge(){return Date.now()}function Gt(e){return new Promise((t,n)=>{let o=()=>n(new Error("Aborted"));if(e.aborted){o();return}e.addEventListener("abort",o,{once:true});})}async function Ye(e,t,n){let o=new Promise((i,c)=>{let s=setTimeout(()=>c(new Error("Timeout")),t);typeof s.unref=="function"&&s.unref();}),r=[e,o];return n&&r.push(Gt(n)),await Promise.race(r)}function Yt(e){if(!S())return 1;let t=window.devicePixelRatio||1,n=e?.pixelRatio??Math.min(t,2);return Math.max(.1,n)}function Qt(e){return !!(e?.element||e?.fullPage)}function Qe(e){let t={mime:e.mime,pixelRatio:e.pixelRatio,maxDimension:e.maxDimension};return e.includeQuality&&(t.quality=e.quality),e.signal&&(t.signal=e.signal),t}async function Je(e){let{selectionElement:t,capture:n,signal:o}=e;if(!S()||!Qt(n))return;let r=Ge(),i=[],c=n?.timeoutMs??Wt,s=n?.maxDimension??Kt,a=n?.mime??"image/png",l=n?.quality??Zt,u=n?.adapter??Ze(),f={},p=Yt(n);if(n?.element&&t)try{let g=t.getBoundingClientRect(),h=Math.min(1,s/Math.max(g.width,g.height)),E=Math.min(p,p*h),w=await Ye(Promise.resolve(u.captureElement(t,{...Qe({mime:a,quality:l,pixelRatio:E,maxDimension:s,includeQuality:a==="image/jpeg",...o?{signal:o}:{}})})),c,o);f.element=w;}catch(g){if(o?.aborted)throw g;i.push(y("capture_failed",g,{target:"element"}));}if(n?.fullPage)try{let g=await Ye(Promise.resolve(u.captureFullPage(Qe({mime:a,quality:l,pixelRatio:p,maxDimension:s,includeQuality:a==="image/jpeg",...o?{signal:o}:{}}))),c,o);f.fullPage=g;}catch(g){if(o?.aborted)throw g;i.push(y("capture_failed",g,{target:"fullPage"}));}let m=Ge(),d={startedAt:r,finishedAt:m,durationMs:Math.max(0,m-r)};return i.length>0&&(d.errors=i),{...f,diagnostics:d}}function Jt(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function en(){return S()?{url:window.location.href,title:document.title,referrer:document.referrer||void 0,userAgent:navigator.userAgent,language:navigator.language,platform:navigator.platform,viewport:{width:window.innerWidth,height:window.innerHeight},screen:{width:window.screen.width,height:window.screen.height},scroll:{x:window.scrollX,y:window.scrollY},devicePixelRatio:window.devicePixelRatio||1,timezone:Jt()}:{}}function tn(e){if(!e)return {};let t={};return e.id&&(t.userId=e.id),e.email&&(t.userEmail=e.email),e.name&&(t.userName=e.name),t}async function et(e){let{config:t,context:n,user:o}=e;if(t?.enabled===false)return {};let r={...en(),...tn(o)},i=t?.enrich;if(!i)return r;try{let c=await i(n);return {...r,...c}}catch(c){let s=y("unknown",c);return {...r,blocfeedMetadataError:s.message}}}var J="blocfeed-queue",nn=50;function _e(){if(!S())return [];try{let e=localStorage.getItem(J);if(!e)return [];let t=JSON.parse(e);if(Array.isArray(t))return t;console.warn("[BlocFeed] offline queue was corrupt (non-array) \u2014 resetting");try{localStorage.removeItem(J);}catch{}return []}catch(e){console.warn("[BlocFeed] offline queue could not be read \u2014 resetting",e);try{localStorage.removeItem(J);}catch{}return []}}function ke(e){if(S())try{e.length===0?localStorage.removeItem(J):localStorage.setItem(J,JSON.stringify(e));}catch(t){let n=t instanceof DOMException?t.name:"";console.warn(`[BlocFeed] failed to persist offline queue${n?` (${n})`:""} \u2014 feedback may be lost if page is closed`);}}function on(e){let t={...e};if(t.screenshots){let n={...t.screenshots};n.element&&(n.element={...n.element,dataUrl:""}),n.fullPage&&(n.fullPage={...n.fullPage,dataUrl:""}),t.screenshots=n;}return delete t.video,t}function Ce(e){let t=_e(),n=on(e);for(n.metadata={...n.metadata,_queued:true},t.push({payload:n,timestamp:Date.now()});t.length>nn;)t.shift();ke(t);}function tt(){let e=_e();return e.length===0?[]:(ke([]),e.map(t=>t.payload))}function go(){ke([]);}function ho(){return _e().length}var rn=200,ee=[],nt=0,ie=false;function ot(e){let t=e.target;if(!(t instanceof Element)||t.closest("[data-blocfeed-ui]"))return;let n={timestampMs:Date.now()-nt,path:window.location.pathname,tagName:t.tagName.toLowerCase()},o=N(t,100);o&&(n.textSnippet=o);let r=H(t)??ve(t);r&&(n.componentName=r),ee.length<rn&&ee.push(n);}var rt={capture:true,passive:true};function it(){ie||!S()||(ie=true,ee=[],nt=Date.now(),document.addEventListener("click",ot,rt));}function st(){ie&&(ie=false,document.removeEventListener("click",ot,rt));}function sn(){return [...ee]}function an(){ee=[];}var ln=3e4,cn=25e5,at="video/webm",un=250,dn=1e3,fn=["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];function lt(){if(typeof MediaRecorder>"u")return null;for(let e of fn)if(MediaRecorder.isTypeSupported(e))return e;return null}function pn(){return !S()||typeof navigator?.mediaDevices?.getDisplayMedia!="function"?false:lt()!==null}async function Te(e){let{config:t,signal:n}=e;if(!S()||typeof navigator?.mediaDevices?.getDisplayMedia!="function")throw y("recording_failed",new Error("Screen recording is not supported in this browser"));let o=lt();if(!o)throw y("recording_failed",new Error("No supported video codec found (WebM required)"));if(n?.aborted)throw y("aborted",new Error("Recording aborted before start"));let r;try{r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1});}catch(h){let E=h instanceof DOMException&&h.name==="NotAllowedError"?"Screen share permission denied":"Failed to start screen share";throw y("recording_failed",new Error(E))}if(n?.aborted)throw r.getTracks().forEach(h=>h.stop()),y("aborted",new Error("Recording aborted after permission"));let i=t?.maxDurationMs??ln,c=t?.videoBitsPerSecond??cn,s=new MediaRecorder(r,{mimeType:o,videoBitsPerSecond:c}),a=[],l=[],u=0,f=null,p=null,m=false,d=()=>{st(),f!==null&&(clearInterval(f),f=null),p!==null&&(clearTimeout(p),p=null),r.getTracks().forEach(h=>h.stop());},g=new Promise((h,E)=>{s.ondataavailable=C=>{C.data.size>0&&a.push(C.data);},s.onstop=()=>{if(m)return;m=true,d();let C=Date.now()-u,A=new Blob(a,{type:at}),v=URL.createObjectURL(A);h({mime:at,blobUrl:v,blob:A,durationMs:C,sizeBytes:A.size});},s.onerror=()=>{m||(m=true,d(),E(y("recording_failed",new Error("MediaRecorder error"))));};let w=r.getVideoTracks()[0];if(w&&w.addEventListener("ended",()=>{s.state!=="inactive"&&s.stop();}),n){let C=()=>{m||(m=true,s.state!=="inactive"&&s.stop(),d(),E(y("aborted",new Error("Recording aborted"))));};n.addEventListener("abort",C,{once:true});}});return s.start(dn),it(),u=Date.now(),f=setInterval(()=>{let h=Date.now()-u;for(let E of l)E(h);},un),p=setTimeout(()=>{!m&&s.state!=="inactive"&&s.stop();},i),{result:g,stop(){!m&&s.state!=="inactive"&&s.stop();},onTick(h){l.push(h);},abort(){m||(m=true,s.state!=="inactive"&&s.stop(),d());}}}var mn=6e4,ct="audio/webm",gn=250,hn=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus"];function ut(){if(typeof MediaRecorder>"u")return null;for(let e of hn)if(MediaRecorder.isTypeSupported(e))return e;return null}function bn(){return !S()||typeof navigator?.mediaDevices?.getUserMedia!="function"?false:ut()!==null}async function Re(e){let{config:t,signal:n}=e;if(!S()||typeof navigator?.mediaDevices?.getUserMedia!="function")throw y("recording_failed",new Error("Microphone recording is not supported in this browser"));let o=ut();if(!o)throw y("recording_failed",new Error("No supported audio codec found"));if(n?.aborted)throw y("aborted",new Error("Voice recording aborted before start"));let r;try{r=await navigator.mediaDevices.getUserMedia({audio:!0});}catch(g){let h=g instanceof DOMException&&g.name==="NotAllowedError"?"Microphone permission denied":"Failed to access microphone";throw y("recording_failed",new Error(h))}if(n?.aborted)throw r.getTracks().forEach(g=>g.stop()),y("aborted",new Error("Voice recording aborted after permission"));let i=t?.maxDurationMs??mn,c=new MediaRecorder(r,{mimeType:o}),s=[],a=[],l=0,u=null,f=null,p=false,m=()=>{u!==null&&(clearInterval(u),u=null),f!==null&&(clearTimeout(f),f=null),r.getTracks().forEach(g=>g.stop());},d=new Promise((g,h)=>{if(c.ondataavailable=E=>{E.data.size>0&&s.push(E.data);},c.onstop=()=>{if(p)return;p=true,m();let E=Date.now()-l,w=new Blob(s,{type:ct});g({blob:w,mime:ct,durationMs:E});},c.onerror=()=>{p||(p=true,m(),h(y("recording_failed",new Error("MediaRecorder error"))));},n){let E=()=>{p||(p=true,c.state!=="inactive"&&c.stop(),m(),h(y("aborted",new Error("Voice recording aborted"))));};n.addEventListener("abort",E,{once:true});}});return c.start(1e3),l=Date.now(),u=setInterval(()=>{let g=Date.now()-l;for(let h of a)h(g);},gn),f=setTimeout(()=>{f=null,!p&&c.state!=="inactive"&&c.stop();},i),{result:d,stop(){!p&&c.state!=="inactive"&&c.stop();},onTick(g){a.push(g);},abort(){p||(p=true,c.state!=="inactive"&&c.stop(),m());}}}var yn=12e3,wn=2,vn=500,En=2e3,xe="https://blocfeed.com/api/feedback",Sn="https://blocfeed.com/api/feedback/voice",dt=0,mt="blocfeed-viewer-token",gt="blocfeed-my-feedback-url";function _n(){try{return localStorage.getItem(mt)}catch{return null}}function Po(){try{return localStorage.getItem(gt)}catch{return null}}function kn(e,t){try{localStorage.setItem(mt,e),t&&localStorage.setItem(gt,t);}catch{}}function ft(e,t){return new Promise((n,o)=>{if(t?.aborted){o(new Error("Aborted"));return}let r=setTimeout(n,e),i=()=>{clearTimeout(r),o(new Error("Aborted"));};t?.addEventListener("abort",i,{once:true});})}function Cn(e){return e>=500&&e<=599}function Tn(e){let[t,n]=e.split(",",2);if(!t||!n)throw new Error("Invalid data URL");let r=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(n),c=new Uint8Array(i.length);for(let s=0;s<i.length;s+=1)c[s]=i.charCodeAt(s);return new Blob([c],{type:r})}function Rn(e){let t={},n={},o={...e};if(o.screenshots){let r={},i={...o.screenshots};i.element&&(t.element=i.element.dataUrl,r.element={mime:i.element.mime,width:i.element.width,height:i.element.height},i.element={...i.element,dataUrl:""}),i.fullPage&&(t.fullPage=i.fullPage.dataUrl,r.fullPage={mime:i.fullPage.mime,width:i.fullPage.width,height:i.fullPage.height},i.fullPage={...i.fullPage,dataUrl:""}),o.screenshots=i,(r.element||r.fullPage)&&(o.screenshot_intent=r);}return o.video&&(n.blob=o.video.blob,o.video_intent={mime:o.video.mime,durationMs:o.video.durationMs,sizeBytes:o.video.sizeBytes},delete o.video),{lean:o,extracted:t,extractedVideo:n}}async function pt(e,t,n){let o=Tn(t);await fetch(e,{method:"PUT",body:o,headers:{"content-type":o.type},...n?{signal:n}:{}});}async function xn(e){let{feedbackId:t,extracted:n,screenshots:o,signal:r}=e,i={};n.element&&o?.element&&(i.element={dataUrl:n.element,mime:o.element.mime,width:o.element.width,height:o.element.height}),n.fullPage&&o?.fullPage&&(i.fullPage={dataUrl:n.fullPage,mime:o.fullPage.mime,width:o.fullPage.width,height:o.fullPage.height}),Object.keys(i).length!==0&&await fetch(`${xe}/${t}/screenshots`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i),...r?{signal:r}:{}});}async function An(e){await fetch(`${xe}/${e.feedbackId}/video`,{method:"POST",body:e.blob,headers:{"content-type":e.blob.type},...e.signal?{signal:e.signal}:{}});}async function ht(e){let{signal:t,transport:n}=e;if(Date.now()-dt<En)return {ok:false,error:y("configuration",new Error("Please wait before submitting again"))};let r=n?.timeoutMs??yn,i=n?.maxAttempts??wn,c=n?.backoffMs??vn,s=!!(e.payload.screenshots?.element?.dataUrl||e.payload.screenshots?.fullPage?.dataUrl),a=!!e.payload.video?.blob,l=s||a,{lean:u,extracted:f,extractedVideo:p}=l?Rn(e.payload):{lean:e.payload,extracted:{},extractedVideo:{}},m=_n();m&&(u.viewer_token=m);let d={...f,...e.screenshotDataUrls};for(let g=1;g<=i;g+=1){let h=new AbortController,E=setTimeout(()=>h.abort(),r),w=()=>h.abort();t&&t.addEventListener("abort",w,{once:true});try{let C=await fetch(xe,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(u),signal:h.signal});if(C.ok){dt=Date.now();let v;try{v=await C.json();}catch{}if(v?.viewer_token&&kn(v.viewer_token,v.my_feedback_url),(d.element||d.fullPage)&&v){let F=v.upload_urls;if(F){let q=[];d.element&&F.element&&q.push(pt(F.element,d.element,t)),d.fullPage&&F.fullPage&&q.push(pt(F.fullPage,d.fullPage,t));try{await Promise.all(q);}catch{}}else if(v.feedback_id)try{await xn({feedbackId:v.feedback_id,extracted:d,screenshots:e.payload.screenshots,...t?{signal:t}:{}});}catch{}}if(p.blob&&v){let F=v.upload_urls;if(F?.video)try{await fetch(F.video,{method:"PUT",body:p.blob,headers:{"content-type":p.blob.type},...t?{signal:t}:{}});}catch{}else if(v.feedback_id)try{await An({feedbackId:v.feedback_id,blob:p.blob,...t?{signal:t}:{}});}catch{}}let B={ok:!0,status:C.status};return v&&(B.apiResponse=v),B}if(g<i&&Cn(C.status)){let v=.85+Math.random()*.3,W=Math.round(c*2**(g-1)*v);await ft(W,t);continue}let A=`HTTP ${C.status}`;try{let v=await C.json();v?.error&&(A=v.error);}catch{}return {ok:!1,status:C.status,error:y("api_failed",new Error(A))}}catch(C){if(h.signal.aborted||t?.aborted)return {ok:false,error:y("aborted",C)};if(g<i){let A=.85+Math.random()*.3,v=Math.round(c*2**(g-1)*A);await ft(v,t);continue}return {ok:false,error:y("api_failed",C)}}finally{clearTimeout(E),t&&t.removeEventListener("abort",w);}}return {ok:false,error:y("api_failed",new Error("Failed"))}}async function bt(e){let{blob:t,mime:n,blocfeedId:o,signal:r}=e,i=await fetch(Sn,{method:"POST",headers:{"Content-Type":n,"X-Blocfeed-Id":o},body:t,...r?{signal:r}:{}});if(!i.ok){let s=await i.json().catch(()=>({error:"Unknown error"}));throw y("api_failed",new Error(s?.error??`Voice API returned ${i.status}`))}let c=await i.json();return {text:c.text??"",warning:c.warning}}var Mn={enabled:true,sampling:1,ignoreSelectors:["[data-blocfeed-ui]","[data-blocfeed-ignore]"],rageClick:{enabled:true,threshold:3,windowMs:1e3},httpFail:{enabled:true,statusCodes:[400,401,403,422,500,502,503,504],ignoreUrls:["/api/behavioral-events","/api/feedback"]},redirectLoop:{enabled:true,threshold:3,windowMs:2e3},formDataLoss:{enabled:true},deadClick:{enabled:true,observationWindowMs:300,rateLimitPerSelector:5}};function yt(e){let t=Mn;return {enabled:e?.enabled??t.enabled,sampling:e?.sampling??t.sampling,ignoreSelectors:e?.ignoreSelectors??t.ignoreSelectors,rageClick:{...t.rageClick,...e?.rageClick??{}},httpFail:{...t.httpFail,...e?.httpFail??{}},redirectLoop:{...t.redirectLoop,...e?.redirectLoop??{}},formDataLoss:{...t.formDataLoss,...e?.formDataLoss??{}},deadClick:{...t.deadClick,...e?.deadClick??{}}}}function wt(e){let t=[];async function n(){if(t.length===0)return;let r=t.splice(0,50);try{await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-blocfeed-id":e.blocfeedId},body:JSON.stringify({events:r}),keepalive:!0});}catch{}}function o(){if(t.length===0)return;if(typeof navigator>"u"||typeof navigator.sendBeacon!="function"){n();return}let r=t.splice(0,50),i=new Blob([JSON.stringify({events:r})],{type:"application/json"}),c=`${e.endpoint}?_bfid=${encodeURIComponent(e.blocfeedId)}`;try{navigator.sendBeacon(c,i);}catch{}}return {enqueue(r){t.push(r);},flush:n,flushBeacon:o,size(){return t.length}}}var vt="bf_behavioral_session",se=null;function P(){try{let e=sessionStorage.getItem(vt);if(e)return e;let t=Et();return sessionStorage.setItem(vt,t),t}catch{return se||(se=Et(),se)}}function Et(){let e=Math.random().toString(36).slice(2,10).padEnd(8,"0");return `bf_${Date.now()}_${e}`}function St(e,t){if(!e.rageClick.enabled)return ()=>{};let{threshold:n,windowMs:o}=e.rageClick,r=new Map;function i(c){try{let s=c.target;if(!s||!(s instanceof Element)||re(s,e.ignoreSelectors))return;let a=$(s,4);if(!a)return;let l=Date.now(),f=(r.get(a)??[]).filter(p=>l-p<=o);if(f.push(l),r.set(a,f),f.length>=n){let p=Ln(s),m=N(s,200)??null,d=s.tagName.toLowerCase(),g=s.id||null,h=H(s)??null,E=K(s,5),w={session_id:P(),event_type:"rage_click",page_url:typeof window>"u"?"":window.location.href,selector:a,element_text:m,event_data:{click_count:f.length,window_ms:o,...p?{disabled:!0}:{},tag_name:d,...g?{element_id:g}:{},...h?{component_name:h}:{},...E.length>0?{parent_components:E}:{}},created_at:new Date().toISOString()};t(w),r.set(a,[]);}}catch{}}return document.addEventListener("click",i,{capture:true,passive:true}),()=>document.removeEventListener("click",i,{capture:true})}function Ln(e){if(e.hasAttribute("disabled")||e.getAttribute("aria-disabled")==="true")return true;try{if(window.getComputedStyle(e).pointerEvents==="none")return !0}catch{}return false}var kt=0,Ct=null,ae=null,le=[],Fn=1500;function Pn(){function e(t){try{let n=t.target;if(!n)return;let o=n.closest('button[type="submit"], input[type="submit"], [data-blocfeed-submit]');if(!o)return;kt=Date.now();let r=o.closest("form");Ct=(r?$(r,3):"")||null,ae=N(o,100)??null,le=K(o,5);}catch{}}return document.addEventListener("click",e,{capture:true,passive:true}),()=>document.removeEventListener("click",e,{capture:true})}function Tt(e,t){if(!e.httpFail.enabled)return ()=>{};let{statusCodes:n,ignoreUrls:o}=e.httpFail,r=new Set(n),i=Pn(),c=globalThis.fetch,s=async(f,p)=>{let m=typeof f=="string"?f:f instanceof URL?f.toString():f.url,d=(p?.method??f.method??"GET").toUpperCase(),g=await c.call(globalThis,f,p);try{!_t(m,o)&&r.has(g.status)&&t(u(g.status,m,d));}catch{}return g};globalThis.fetch=s;let a=XMLHttpRequest.prototype.open,l=XMLHttpRequest.prototype.send;return XMLHttpRequest.prototype.open=function(f,p,...m){return this.__bf_url=p,this.__bf_method=f.toUpperCase(),a.call(this,f,p,...m)},XMLHttpRequest.prototype.send=function(f){let p=()=>{try{let m=this.__bf_url??"",d=this.__bf_method??"GET";!_t(m,o)&&r.has(this.status)&&t(u(this.status,m,d));}catch{}};return this.__bf_handler=p,this.addEventListener("loadend",p),l.call(this,f??null)},()=>{globalThis.fetch=c,XMLHttpRequest.prototype.open=a,XMLHttpRequest.prototype.send=l,i(),ae=null,le=[];};function u(f,p,m){let g=Date.now()-kt<Fn;return {session_id:P(),event_type:"error",page_url:typeof window>"u"?"":window.location.href,selector:null,element_text:null,event_data:{http_status:f,request_url:p,method:m,form_selector:g?Ct:null,...g&&ae?{button_text:ae}:{},...g&&le.length>0?{parent_components:le}:{}},created_at:new Date().toISOString()}}}function _t(e,t){if(t.length===0)return false;for(let n of t)if(e.includes(n))return true;return false}var In=3e4;function Rt(e,t){if(!e.redirectLoop.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let{threshold:n,windowMs:o}=e.redirectLoop,r=new Map,i=new Map,c=history.pushState,s=history.replaceState;function a(u){try{let f=Date.now(),p=i.get(u)??0;if(f<p)return;let d=(r.get(u)??[]).filter(g=>f-g<=o);if(d.push(f),r.set(u,d),d.length>=n){let g={session_id:P(),event_type:"thrashing",page_url:window.location.href,selector:null,element_text:null,event_data:{count:d.length,url:u,window_ms:o},created_at:new Date().toISOString()};t(g),i.set(u,f+In),r.set(u,[]);}}catch{}}function l(){let u=window.location.pathname+window.location.search;a(u);}return history.pushState=function(...u){let f=c.apply(this,u);return l(),f},history.replaceState=function(...u){let f=s.apply(this,u);return l(),f},window.addEventListener("popstate",l),()=>{history.pushState=c,history.replaceState=s,window.removeEventListener("popstate",l);}}function xt(e,t){if(!e.formDataLoss.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let n=new Set,o=0;function r(l){let u=l.closest("form");return u?u.id?`#${u.id}`:"form":null}function i(l){try{let u=l.target;if(!u||!(u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement||u instanceof HTMLSelectElement))return;let f=r(u);if(!f)return;n.has(f)||n.add(f),o++;}catch{}}function c(l){if(n.size===0)return;let u=Array.from(n),f={session_id:P(),event_type:"form_abandonment",page_url:window.location.href,selector:u[0]??null,element_text:null,event_data:{cause:l,field_count:o,forms:u},created_at:new Date().toISOString()};t(f);}function s(l){l.persisted&&c("bfcache_restore");}function a(){c("beforeunload_after_edit");}return document.addEventListener("input",i,{capture:true,passive:true}),window.addEventListener("pageshow",s),window.addEventListener("beforeunload",a),()=>{document.removeEventListener("input",i,{capture:true}),window.removeEventListener("pageshow",s),window.removeEventListener("beforeunload",a);}}function Bn(){let e={domMutationCount:0,urlChangeCount:0,networkCount:0,filePickerCount:0,uninstall:()=>{}},t=new MutationObserver(()=>{e.domMutationCount+=1;});t.observe(document.body,{childList:true,attributes:true,characterData:true,subtree:true});let n=history.pushState,o=history.replaceState;history.pushState=function(...a){return e.urlChangeCount+=1,n.apply(this,a)},history.replaceState=function(...a){return e.urlChangeCount+=1,o.apply(this,a)};let r=()=>{e.urlChangeCount+=1;};window.addEventListener("popstate",r);let i=globalThis.fetch;if(i){let a=(l,u)=>(e.networkCount+=1,i.call(globalThis,l,u));globalThis.fetch=a;}let c=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(a,l,...u){return e.networkCount+=1,c.call(this,a,l,...u)};let s=HTMLInputElement.prototype.click;return HTMLInputElement.prototype.click=function(){return this.type==="file"&&(e.filePickerCount+=1),s.call(this)},e.uninstall=()=>{t.disconnect(),history.pushState=n,history.replaceState=o,window.removeEventListener("popstate",r),i&&(globalThis.fetch=i),XMLHttpRequest.prototype.open=c,HTMLInputElement.prototype.click=s;},e}function At(e,t){if(!e.deadClick.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let{observationWindowMs:n,rateLimitPerSelector:o}=e.deadClick,r=new Map,i=Bn();function c(s){try{let a=s.target;if(!a||!(a instanceof Element)||s.button!==0||s.metaKey||s.ctrlKey||s.altKey||s.shiftKey||re(a,e.ignoreSelectors)||a.closest("label"))return;if(a instanceof HTMLInputElement){let v=a.type;if(v==="checkbox"||v==="radio"||v==="file")return}if(a instanceof HTMLSelectElement||a.closest("a[target='_blank'], a[download]")||a.closest('[contenteditable="true"]'))return;try{let v=window.getSelection();if(v&&v.toString().length>0)return}catch{}let l=$e(a);if(!l)return;let u=$(a,4);if(!u)return;let f=i.domMutationCount,p=i.urlChangeCount,m=i.networkCount,d=i.filePickerCount,g=new Date().toISOString(),h=N(a,200)??null,E=a.tagName.toLowerCase(),w=a.id||null,C=H(a)??null,A=K(a,5);setTimeout(()=>{if(i.domMutationCount!==f||i.urlChangeCount!==p||i.networkCount!==m||i.filePickerCount!==d)return;let v=r.get(u)??0;if(v>=o)return;r.set(u,v+1);let W={session_id:P(),event_type:"dead_click",page_url:typeof window>"u"?"":window.location.href,selector:u,element_text:h,event_data:{tag_name:E,...w?{element_id:w}:{},...C?{component_name:C}:{},...A.length>0?{parent_components:A}:{},clickable_reason:l},created_at:g};t(W);},n);}catch{}}return document.addEventListener("click",c,{capture:true,passive:true}),()=>{document.removeEventListener("click",c,{capture:true}),i.uninstall();}}var Nn="https://blocfeed.com/api/replay-events";function Mt(e){if(!e.config.enabled)return ()=>{};if(typeof window>"u")return ()=>{};if(typeof globalThis.matchMedia>"u")return ()=>{};let t=P();if(Un(t)%100/100>=e.config.sampling)return ()=>{};let o=e.config.endpoint??Nn,r=[],i=0,c=0,s=false,a=null,l=(h=false)=>{if(r.length===0)return;let E=r;r=[],c=0;let w=i++;Hn({blocfeedId:e.blocfeedId,sessionId:t,chunkSeq:w,events:E,endpoint:o,useBeacon:h});},u=setInterval(()=>{s||l();},e.config.flushIntervalMs),f=setTimeout(()=>{l(),g();},e.config.maxDurationMs),p=()=>{l(true);};window.addEventListener("pagehide",p);let m=e.config.masking,d={emit(h){s||(r.push(h),c+=On(h),c>=e.config.flushSizeBytes&&l());},recordCanvas:false,sampling:{mousemove:50}};m.maskAllInputs!==void 0&&(d.maskAllInputs=m.maskAllInputs),m.maskTextSelector!==void 0&&(d.maskTextSelector=m.maskTextSelector),m.maskTextClass!==void 0&&(d.maskTextClass=m.maskTextClass),m.blockSelector!==void 0&&(d.blockSelector=m.blockSelector),a=record(d)??null;function g(){if(!s&&(s=true,clearInterval(u),clearTimeout(f),window.removeEventListener("pagehide",p),a))try{a();}catch{}}return g}function On(e){try{return JSON.stringify(e).length}catch{return 1024}}function Un(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)|0;return Math.abs(t)}async function Hn(e){let t=JSON.stringify({blocfeed_id:e.blocfeedId,session_id:e.sessionId,chunk_seq:e.chunkSeq,events:e.events,page_url:typeof window<"u"?window.location.href:"",user_agent:typeof navigator<"u"?navigator.userAgent:""});if(e.useBeacon&&typeof navigator<"u"&&typeof navigator.sendBeacon=="function")try{let n=new Blob([t],{type:"application/json"});navigator.sendBeacon(e.endpoint,n);return}catch{}try{await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:t,keepalive:!0});}catch{}}var qn={enabled:true,endpoint:null,maxDurationMs:3e5,flushIntervalMs:3e4,flushSizeBytes:1048576,sampling:1,masking:{maskAllInputs:true,maskTextSelector:"[data-blocfeed-mask]",maskTextClass:"blocfeed-mask",blockSelector:"[data-blocfeed-block]"}};function Lt(e){let t=qn;return {enabled:e?.enabled??t.enabled,endpoint:e?.endpoint??t.endpoint,maxDurationMs:e?.maxDurationMs??t.maxDurationMs,flushIntervalMs:e?.flushIntervalMs??t.flushIntervalMs,flushSizeBytes:e?.flushSizeBytes??t.flushSizeBytes,sampling:e?.sampling??t.sampling,masking:{...t.masking,...e?.masking??{}}}}var Vn=5e3,ce=class{constructor(t){this.submitter=null;this.detectorUninstallers=[];this.flushTimer=null;this.pageHideHandler=null;this.installed=false;this.opts=t,this.resolved=yt(t.config);}install(){if(this.installed||!this.resolved.enabled||!(this.opts.passiveSampler??(()=>Math.random()<this.resolved.sampling))())return;let n=this.opts.endpoint??"https://blocfeed.com/api/behavioral-events";this.submitter=this.opts.submitter??wt({endpoint:n,blocfeedId:this.opts.blocfeedId});let o=i=>{this.submitter?.enqueue(i);};this.detectorUninstallers.push(St(this.resolved,o)),this.detectorUninstallers.push(Tt(this.resolved,o)),this.detectorUninstallers.push(Rt(this.resolved,o)),this.detectorUninstallers.push(xt(this.resolved,o)),this.detectorUninstallers.push(At(this.resolved,o));let r=Lt(this.opts.config?.sessionReplay);this.detectorUninstallers.push(Mt({blocfeedId:this.opts.blocfeedId,config:r})),this.flushTimer=setInterval(()=>{this.submitter?.flush();},Vn),this.pageHideHandler=()=>{this.submitter?.flushBeacon();},typeof window<"u"&&window.addEventListener("pagehide",this.pageHideHandler),this.installed=true;}uninstall(){if(this.installed){for(let t of [...this.detectorUninstallers].reverse())try{t();}catch{}this.detectorUninstallers=[],this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.pageHideHandler&&typeof window<"u"&&(window.removeEventListener("pagehide",this.pageHideHandler),this.pageHideHandler=null);try{this.submitter?.flush();}catch{}this.submitter=null,this.installed=false;}}};function Ae(e){let t=null,n=null,o=(...r)=>{n=r,t===null&&(t=requestAnimationFrame(()=>{if(t=null,!n)return;let i=n;n=null,e(...i);}));};return o.cancel=()=>{t!==null&&cancelAnimationFrame(t),t=null,n=null;},o}function ue(e){return e instanceof Element?!!e.closest("[data-blocfeed-ui]"):false}function de(e){e.stopPropagation(),e.stopImmediatePropagation?.();}function Ft(e,t){if(!S())throw new Error("BlocFeed picker can only run in a browser environment.");let n=e.ignoreSelectors,o=e.isSelectable,r={};n&&n.length>0&&(r.ignoreSelectors=n),o&&(r.isSelectable=o);let i=null,c=null,s=(d,g=false)=>{if(!d){i=null,c=null,t.onHover(null);return}let h=we(d.getBoundingClientRect()),E=`${Math.round(h.x)}:${Math.round(h.y)}:${Math.round(h.width)}:${Math.round(h.height)}`;!g&&d===i&&E===c||(i=d,c=E,t.onHover({element:d,rect:h}));},a=Ae(d=>{if(ue(d.target))return;let g=document.elementFromPoint(d.clientX,d.clientY),h=Ee(g,r);s(h);}),l=Ae(()=>{i&&s(i,true);}),u=d=>{ue(d.target)||(de(d),d.pointerType==="mouse"&&d.preventDefault());},f=d=>{ue(d.target)||(de(d),d.pointerType==="mouse"&&d.preventDefault());},p=d=>{if(ue(d.target))return;de(d),d.preventDefault();let g=document.elementFromPoint(d.clientX,d.clientY),h=Ee(g,r);h&&t.onSelect({element:h,descriptor:je(h)});},m=d=>{d.key==="Escape"&&(de(d),d.preventDefault(),t.onCancel());};return window.addEventListener("pointermove",a,{capture:true,passive:true}),window.addEventListener("pointerdown",u,{capture:true}),window.addEventListener("pointerup",f,{capture:true}),window.addEventListener("click",p,{capture:true}),window.addEventListener("keydown",m,{capture:true}),window.addEventListener("scroll",l,{capture:true,passive:true}),window.addEventListener("resize",l,{passive:true}),{stop(){window.removeEventListener("pointermove",a,{capture:true}),window.removeEventListener("pointerdown",u,{capture:true}),window.removeEventListener("pointerup",f,{capture:true}),window.removeEventListener("click",p,{capture:true}),window.removeEventListener("keydown",m,{capture:true}),window.removeEventListener("scroll",l,{capture:true}),window.removeEventListener("resize",l),a.cancel(),l.cancel(),t.onHover(null);}}}async function Me(e){let{signal:t,transport:n}=e,o={ok:false};try{let r={payload:e.payload,...t?{signal:t}:{},...n?{transport:n}:{}};o.api=await ht(r),o.ok=!!o.api?.ok;}catch(r){o.api={ok:false,error:y("api_failed",r)},o.ok=false;}return {payload:e.payload,result:o}}var Xn=["[data-blocfeed-ui]","[data-blocfeed-ignore]"];function zn(e){let t=[...Xn,...e?.ignoreSelectors??[]],n=Array.from(new Set(t));return {...e,ignoreSelectors:n}}function Pt(){return {phase:"idle"}}function $n(e){if(e.ok)return false;let t=e.api;return t?t.status&&t.status>=400&&t.status<500||t.error?.kind==="aborted"||t.error?.kind==="configuration"?false:!t.ok:true}function Mr(e){let t=e,n=new ce({blocfeedId:t.blocfeed_id??"",...t.behavioral!==void 0?{config:t.behavioral}:{}});n.install();let o=Pt(),r=new Set,i=new Set,c=null,s=null,a=null,l=null,u=0,f=null,p=null,m=null,d=null,g=false,h=()=>{for(let b of r)b(o);},E=b=>{for(let _ of i)_(b);},w=b=>{o=b,h();},C=()=>{u+=1,l?.abort(),l=null;},A=()=>{c?.stop(),c=null,E(null),a!==null&&S()&&(document.documentElement.style.cursor=a,a=null);},v=()=>{if(m){try{URL.revokeObjectURL(m.blobUrl);}catch{}m=null;}},W=()=>{p&&(p.abort(),p=null),v();},B=null,F=()=>{d&&(d.abort(),d=null),B&&(B.abort(),B=null);},q=()=>{C(),A(),W(),F(),s=null,w(Pt());},Ne=()=>{if(!S())return;A(),s=null;let b=zn(t.picker);a=document.documentElement.style.cursor,document.documentElement.style.cursor="crosshair",w({phase:"picking"}),c=Ft(b,{onHover:E,onSelect:({element:_,descriptor:M})=>{s=_,A(),w({phase:"review",selection:M});},onCancel:()=>{q();}});},Oe=()=>{let b=tt();if(b.length!==0)for(let _ of b)Me({payload:_,...t.transport?{transport:t.transport}:{}}).catch(()=>{Ce(_);});};if(S()){setTimeout(Oe,1e3);let b=()=>Oe();window.addEventListener("online",b),f=()=>window.removeEventListener("online",b);}return {getState:()=>o,getConfig:()=>t,subscribe(b){return r.add(b),()=>r.delete(b)},subscribeHover(b){return i.add(b),()=>i.delete(b)},start(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||o.phase!=="picking"&&Ne();},stop(){q();},clearSelection(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||Ne();},setConfig(b){t=b;},async submit(b,_){if(!S()){let T=y("configuration",new Error("BlocFeed submit can only run in the browser"));return w({phase:"error",lastError:T}),{ok:false}}let M=t.blocfeed_id?.trim?.()??"";if(!M){let I={phase:"error",lastError:y("configuration",new Error("Missing blocfeed_id. Create a project in BlocFeed and pass its blocfeed_id."))};return o.selection&&(I.selection=o.selection),w(I),{ok:false}}if(g)return {ok:false};if(o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording")return {ok:false};g=true;let x=u+1;u=x,l?.abort(),l=new AbortController;let R=l.signal,k=o.selection,D=_?.capture?{...t.capture,..._.capture}:t.capture,V=!!(D?.element||D?.fullPage),G={phase:V?"capturing":"submitting"};k&&(G.selection=k),w(G);try{let T=V?await Je({selectionElement:s,capture:D,signal:R}):void 0;if(R.aborted||u!==x)return {ok:!1};let I={phase:"submitting"};k&&(I.selection=k),T&&(I.capture=T),w(I);let O={};k&&(O.selection=k),T&&(O.capture=T);let Y=await et({config:t.metadata,context:O,...t.user?{user:t.user}:{}}),X={version:1,createdAt:new Date().toISOString(),blocfeed_id:M,message:b,metadata:Y};_?.category&&(X.category=_.category),t.user&&(X.user=t.user),k&&(X.selection=k),T&&(X.screenshots=T),m&&(X.video=m);let{result:U}=await Me({payload:X,signal:R,...t.transport?{transport:t.transport}:{}});if(R.aborted||u!==x)return U;if(U.ok){v(),s=null;let ye={phase:"success",lastSubmit:U};return k&&(ye.selection=k),T&&(ye.capture=T),w(ye),U}$n(U)&&Ce(X);let Nt=U.api?.error??y("unknown",new Error("Submission failed")),be={phase:"error",lastSubmit:U,lastError:Nt};return k&&(be.selection=k),T&&(be.capture=T),w(be),U}catch(T){if(R.aborted||u!==x)return {ok:false};let O={phase:"error",lastError:R.aborted?y("aborted",T):y("unknown",T)};return k&&(O.selection=k),w(O),{ok:false}}finally{g=false,u===x&&(l=null);}},async startRecording(){if(o.phase!=="review"||!t.recording?.enabled||d||p)return;let b=o.selection,_={phase:"recording",recordingElapsedMs:0};b&&(_.selection=b),w(_);try{let M={config:t.recording};l&&(M.signal=l.signal);let x=await Te(M);p=x,x.onTick(D=>{if(o.phase==="recording"){let V={phase:"recording",recordingElapsedMs:D};b&&(V.selection=b),w(V);}});let R=await x.result;p=null,m=R;let k={phase:"review",video:R};b&&(k.selection=b),w(k);}catch(M){p=null;let R={phase:"review",lastError:M?.kind?M:y("recording_failed",M)};b&&(R.selection=b),w(R);}},stopRecording(){o.phase!=="recording"||!p||p.stop();},removeVideo(){v();let b=o.selection,_={phase:"review"};b&&(_.selection=b),w(_);},async startVoice(){if(o.phase!=="review"){console.warn("[BlocFeed] startVoice: ignored \u2014 phase is",o.phase,'(expected "review")');return}let b=t.voice;if(!b?.enabled){console.warn("[BlocFeed] startVoice: ignored \u2014 voice is not enabled in config");return}if(p){console.warn("[BlocFeed] startVoice: ignored \u2014 a screen recording is already in progress");return}F();let _=o.selection,M={phase:"review",voiceRecording:true,voiceElapsedMs:0};_&&(M.selection=_),m&&(M.video=m),w(M);try{let x={config:b};l&&(x.signal=l.signal);let R=await Re(x);d=R,R.onTick(O=>{let Y={phase:"review",voiceRecording:!0,voiceElapsedMs:O};_&&(Y.selection=_),m&&(Y.video=m),w(Y);});let k=await R.result;d=null;let D={phase:"review",voiceRecording:!1,voiceTranscribing:!0};_&&(D.selection=_),m&&(D.video=m),w(D),B=new AbortController;let V={blob:k.blob,mime:k.mime,blocfeedId:t.blocfeed_id,signal:B.signal},{text:Ue,warning:G}=await bt(V);B=null;let T={phase:"review",voiceRecording:!1,voiceTranscribing:!1};_&&(T.selection=_),m&&(T.video=m),w(T);let I={text:Ue};return G&&(I.warning=G),I}catch(x){F();let R=x?.kind?x:y("recording_failed",x);console.warn("[BlocFeed] Voice error:",R.message);let k={phase:"review",voiceRecording:false,voiceTranscribing:false,lastError:R};_&&(k.selection=_),m&&(k.video=m),w(k);return}},stopVoice(){d&&d.stop();},__unsafeGetSelectedElement(){return s},destroy(){n.uninstall(),q(),r.clear(),i.clear(),f?.(),f=null;}}}var te=[],ne=[],It=20,Bt=15,fe=[],Dt=typeof console<"u"?{log:console.log?.bind(console),warn:console.warn?.bind(console),error:console.error?.bind(console),info:console.info?.bind(console),debug:console.debug?.bind(console)}:{},pe=typeof globalThis<"u"&&typeof globalThis.fetch=="function"?globalThis.fetch:void 0,me=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.open:void 0,ge=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.send:void 0,Fe=new Set,Pe=false,Ie=false,he=false,jn=["blocfeed.com","google-analytics.com","googletagmanager.com","analytics.google.com","googleads.g.doubleclick.net","googlesyndication.com","googleadservices.com","google.com/pagead","google.com/ads","facebook.net","facebook.com/tr","connect.facebook.net","graph.facebook.com","api.mixpanel.com","api-js.mixpanel.com","api.amplitude.com","api2.amplitude.com","api.segment.io","cdn.segment.com","vars.hotjar.com","in.hotjar.com","script.hotjar.com","heapanalytics.com","fullstory.com/s/fs.js","rs.fullstory.com","app.posthog.com","us.posthog.com","eu.posthog.com","api-iam.intercom.io","widget.intercom.io","sentry.io/api","browser.sentry-cdn.com","browser-intake-datadoghq.com","clarity.ms","js.hs-analytics.net","api.hubapi.com","forms.hubspot.com","plausible.io/api","client.crisp.chat","js.driftt.com","r.logrocket.com","app.pendo.io","events.launchdarkly.com","app.launchdarkly.com","grammarly.com","gnar.grammarly.com","capi.grammarly.com","api.languagetool.org","api.languagetoolplus.com","fonts.googleapis.com","fonts.gstatic.com","cdn.cookielaw.org","consent.cookiebot.com","js.stripe.com","api.stripe.com/v1/tokens","google.com/recaptcha","hcaptcha.com","bam.nr-data.net","rec.smartlook.com","o2.mouseflow.com","api.luckyorange.com","static.zdassets.com","ekr.zdassets.com"];function Wn(e){if(e instanceof Error)return e.name&&e.name!=="Error"?`${e.name}: ${e.message}`:e.message||String(e);if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Kn(e,t){let n=t.map(Wn).join(" "),o=t.find(i=>i instanceof Error),r={level:e,message:n.slice(0,2e3),timestamp:Date.now()};for(o?.stack&&(r.stack=o.stack.slice(0,2e3)),te.push(r);te.length>It;)te.shift();}function Le(e){let t=e.url.toLowerCase();for(let n of fe)if(t.includes(n))return;for(ne.push(e);ne.length>Bt;)ne.shift();}function Pr(e={}){if(he||!S())return;he=true,It=e.consoleLimit??20,Bt=e.networkLimit??15;let t=e.ignoreUrls;if(t!==void 0?fe=t.map(n=>n.toLowerCase()):fe=[...jn],e.console!==false){let n=e.consoleLevels??["error","warn"];for(let o of n){let r=Dt[o];r&&(Fe.add(o),console[o]=(...i)=>{Kn(o,i),r.apply(console,i);});}}if(e.network!==false&&pe){let n=pe;Pe=true,window.fetch=async function(r,i){let c=typeof r=="string"?r:r instanceof URL?r.toString():r.url,s=(i?.method??"GET").toUpperCase(),a=Date.now();try{let l=await n.call(window,r,i);return l.ok||Le({url:c.slice(0,500),method:s,status:l.status,statusText:l.statusText,timestamp:a,durationMs:Date.now()-a}),l}catch(l){throw Le({url:c.slice(0,500),method:s,status:0,statusText:l instanceof Error?l.message:"Network error",timestamp:a,durationMs:Date.now()-a}),l}};}if(e.network!==false&&me&&ge){let n=me,o=ge;Ie=true,XMLHttpRequest.prototype.open=function(r,i,...c){return this.__bf_method=r.toUpperCase(),this.__bf_url=String(i),n.apply(this,[r,i,...c])},XMLHttpRequest.prototype.send=function(...r){let i=this.__bf_method||"GET",c=this.__bf_url||"",s=Date.now();return this.addEventListener("loadend",function(){if(this.status>=400||this.status===0){let a={url:c.slice(0,500),method:i,status:this.status,timestamp:s,durationMs:Date.now()-s};this.statusText&&(a.statusText=this.statusText),Le(a);}},{once:true}),o.apply(this,r)};}}function Ir(){if(he){for(let e of Fe){let t=Dt[e];t&&(console[e]=t);}Fe.clear(),Pe&&pe&&(window.fetch=pe,Pe=false),Ie&&me&&ge&&(XMLHttpRequest.prototype.open=me,XMLHttpRequest.prototype.send=ge,Ie=false),fe=[],he=false;}}function Br(){return {consoleLogs:[...te],networkErrors:[...ne]}}function Dr(){te=[],ne=[];}var Zn=[{name:"supabase_service_role_key",pattern:/SUPABASE_SERVICE_ROLE_KEY["'=:\s]{1,8}[A-Za-z0-9_.=-]{30,400}/},{name:"supabase_db_password",pattern:/SUPABASE_DB_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"postgres_password",pattern:/POSTGRES_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"database_url_with_creds",pattern:/(?:postgres|postgresql|mysql|mongodb|redis|amqp):\/\/[^:\s"']{1,100}:[^@\s"']{1,200}@/},{name:"aws_access_key",pattern:/AKIA[0-9A-Z]{16}/},{name:"aws_secret_key",pattern:/AWS_SECRET_ACCESS_KEY["'=:\s]{1,8}[A-Za-z0-9/+=]{30,200}/},{name:"aws_session_token",pattern:/AWS_SESSION_TOKEN["'=:\s]{1,8}[A-Za-z0-9/+=]{30,600}/},{name:"stripe_secret_key",pattern:/sk_live_[a-zA-Z0-9]{10,200}/},{name:"stripe_secret_key_test",pattern:/sk_test_[a-zA-Z0-9]{10,200}/},{name:"stripe_restricted_key",pattern:/rk_(?:live|test)_[a-zA-Z0-9]{10,200}/},{name:"github_pat",pattern:/ghp_[A-Za-z0-9_]{36,100}/},{name:"github_oauth",pattern:/gho_[A-Za-z0-9_]{36,100}/},{name:"github_user_token",pattern:/ghu_[A-Za-z0-9_]{36,100}/},{name:"github_server_token",pattern:/ghs_[A-Za-z0-9_]{36,100}/},{name:"github_fine_grained",pattern:/github_pat_[A-Za-z0-9_]{22,200}/},{name:"openai_api_key",pattern:/sk-[a-zA-Z0-9]{20,200}(?![a-zA-Z0-9_])/},{name:"anthropic_api_key",pattern:/sk-ant-[a-zA-Z0-9\-_]{20,200}/},{name:"private_key",pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"sendgrid_api_key",pattern:/SG\.[a-zA-Z0-9_-]{22,100}\.[a-zA-Z0-9_-]{22,100}/},{name:"twilio_auth_token",pattern:/TWILIO_AUTH_TOKEN["'=:\s]{1,8}[a-f0-9]{32}/},{name:"generic_secret_key",pattern:/[A-Z_]{2,60}_SECRET_KEY["'=:\s]{1,8}[^\s"']{8,200}/},{name:"generic_secret",pattern:/[A-Z_]{2,60}_SECRET["'=:\s]{1,8}[^\s"']{8,200}/},{name:"generic_password",pattern:/[A-Z_]{2,60}_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"generic_private_key_var",pattern:/[A-Z_]{2,60}_PRIVATE_KEY["'=:\s]{1,8}[^\s"']{8,400}/}],j=[],De=0,Be=false;function Gn(e){let t=e.slice(0,80);return t.length<=6?"***":t.slice(0,6)+"***"}function Yn(e,t,n,o){if(j.some(c=>c.rule===e&&c.source===t))return;let i={rule:e,source:t,hint:Gn(n),timestamp:Date.now()};o&&(i.location=o),j.push(i);}function oe(e,t,n,o){for(let{name:r,pattern:i}of n){let c=i.exec(e);c&&Yn(r,t,c[0],o);}}function Qn(e){try{let t=window;if(t.__NEXT_DATA__){let n=JSON.stringify(t.__NEXT_DATA__);oe(n,"hydration",e,"__NEXT_DATA__");}if(t.__NUXT__){let n=JSON.stringify(t.__NUXT__);oe(n,"hydration",e,"__NUXT__");}}catch{}}function Jn(e){try{document.querySelectorAll("script:not([src])").forEach((n,o)=>{let r=n.textContent;r&&r.length>0&&oe(r,"scripts",e,`inline-script[${o}]`);});}catch{}}function eo(e){try{document.querySelectorAll("meta[content]").forEach(n=>{let o=n.getAttribute("content"),r=n.getAttribute("name")||n.getAttribute("property")||"";o&&o.length>10&&oe(o,"meta",e,r?`meta[${r}]`:void 0);});}catch{}}function to(e){try{document.querySelectorAll("[data-api-key], [data-secret], [data-token], [data-password]").forEach(n=>{let o=n.attributes;for(let r=0;r<o.length;r++){let i=o[r];i.name.startsWith("data-")&&i.value.length>10&&oe(i.value,"dom",e,`${n.tagName.toLowerCase()}[${i.name}]`);}});}catch{}}function Ur(e={}){if(Be||!S()||(Be=true,e.secretScan===false))return;let t=[...Zn,...e.customPatterns??[]],n=e.scanTargets??["hydration","scripts","meta","dom"];setTimeout(()=>{De=Date.now(),n.includes("hydration")&&Qn(t),n.includes("scripts")&&Jn(t),n.includes("meta")&&eo(t),n.includes("dom")&&to(t);let o=e.notify??"both";j.length>0&&(o==="console"||o==="both")&&console.warn(`[BlocFeed Security] Found ${j.length} potential secret(s) exposed in client code:`,j.map(r=>`${r.rule} (${r.source}${r.location?`: ${r.location}`:""})`));},100);}function Hr(){return {findings:[...j],scannedAt:De}}function qr(){j=[],De=0,Be=false;}
2
+ export{qr as A,S as a,we as b,Ze as c,Je as d,et as e,Ce as f,tt as g,go as h,ho as i,sn as j,an as k,pn as l,Te as m,bn as n,Re as o,_n as p,Po as q,bt as r,ce as s,Mr as t,Pr as u,Ir as v,Br as w,Dr as x,Ur as y,Hr as z};
@@ -1,7 +1,23 @@
1
+ interface SessionReplayConfig {
2
+ enabled?: boolean;
3
+ endpoint?: string;
4
+ maxDurationMs?: number;
5
+ flushIntervalMs?: number;
6
+ flushSizeBytes?: number;
7
+ sampling?: number;
8
+ masking?: {
9
+ maskAllInputs?: boolean;
10
+ maskTextSelector?: string;
11
+ maskTextClass?: string;
12
+ blockSelector?: string;
13
+ };
14
+ }
15
+
1
16
  /**
2
17
  * Behavioral tracking types. Keep this file free of runtime imports —
3
18
  * pure type declarations only.
4
19
  */
20
+
5
21
  type BehavioralEventType = "rage_click" | "error" | "thrashing" | "form_abandonment" | "dead_click";
6
22
  interface BehavioralEvent {
7
23
  session_id: string;
@@ -44,6 +60,7 @@ interface BehavioralConfig {
44
60
  redirectLoop?: RedirectLoopConfig;
45
61
  formDataLoss?: FormDataLossConfig;
46
62
  deadClick?: DeadClickConfig;
63
+ sessionReplay?: SessionReplayConfig;
47
64
  }
48
65
 
49
66
  type MaybePromise<T> = T | Promise<T>;
@@ -1,7 +1,23 @@
1
+ interface SessionReplayConfig {
2
+ enabled?: boolean;
3
+ endpoint?: string;
4
+ maxDurationMs?: number;
5
+ flushIntervalMs?: number;
6
+ flushSizeBytes?: number;
7
+ sampling?: number;
8
+ masking?: {
9
+ maskAllInputs?: boolean;
10
+ maskTextSelector?: string;
11
+ maskTextClass?: string;
12
+ blockSelector?: string;
13
+ };
14
+ }
15
+
1
16
  /**
2
17
  * Behavioral tracking types. Keep this file free of runtime imports —
3
18
  * pure type declarations only.
4
19
  */
20
+
5
21
  type BehavioralEventType = "rage_click" | "error" | "thrashing" | "form_abandonment" | "dead_click";
6
22
  interface BehavioralEvent {
7
23
  session_id: string;
@@ -44,6 +60,7 @@ interface BehavioralConfig {
44
60
  redirectLoop?: RedirectLoopConfig;
45
61
  formDataLoss?: FormDataLossConfig;
46
62
  deadClick?: DeadClickConfig;
63
+ sessionReplay?: SessionReplayConfig;
47
64
  }
48
65
 
49
66
  type MaybePromise<T> = T | Promise<T>;
package/dist/engine.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';var chunkMHR322QG_cjs=require('./chunk-MHR322QG.cjs');function s(o){if(o?.aborted)throw new Error("Aborted")}async function v(o){return await new Promise((t,e)=>{let r=new Image;r.onload=()=>t({width:r.naturalWidth,height:r.naturalHeight}),r.onerror=()=>e(new Error("Failed to load generated screenshot")),r.src=o;})}async function l(o,t){let{width:e,height:r}=await v(o);return {dataUrl:o,mime:t,width:e,height:r}}function U(o){return {async captureElement(t,e){if(!chunkMHR322QG_cjs.a())throw new Error("captureElement can only run in the browser");s(e.signal);let r={scale:e.pixelRatio},n=e.mime==="image/jpeg"?await o.domToJpeg(t,{...r,quality:e.quality??.92}):await o.domToPng(t,r);return s(e.signal),await l(n,e.mime)},async captureFullPage(t){if(!chunkMHR322QG_cjs.a())throw new Error("captureFullPage can only run in the browser");s(t.signal);let e=document.documentElement,r=Math.max(e.scrollWidth,e.clientWidth),n=Math.max(e.scrollHeight,e.clientHeight),i=Math.min(1,t.maxDimension/Math.max(r,n)),c={width:Math.max(1,Math.round(r*i)),height:Math.max(1,Math.round(n*i)),scale:t.pixelRatio},a=t.mime==="image/jpeg"?await o.domToJpeg(e,{...c,quality:t.quality??.92}):await o.domToPng(e,c);return s(t.signal),await l(a,t.mime)}}}function O(o){let[t,e]=o.split(",",2);if(!t||!e)throw new Error("Invalid data URL");let n=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(e),c=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)c[a]=i.charCodeAt(a);return new Blob([c],{type:n})}Object.defineProperty(exports,"clearClickEvents",{enumerable:true,get:function(){return chunkMHR322QG_cjs.k}});Object.defineProperty(exports,"clearDiagnostics",{enumerable:true,get:function(){return chunkMHR322QG_cjs.x}});Object.defineProperty(exports,"clearQueue",{enumerable:true,get:function(){return chunkMHR322QG_cjs.h}});Object.defineProperty(exports,"clearSecurityFindings",{enumerable:true,get:function(){return chunkMHR322QG_cjs.A}});Object.defineProperty(exports,"collectMetadata",{enumerable:true,get:function(){return chunkMHR322QG_cjs.e}});Object.defineProperty(exports,"createBlocFeedController",{enumerable:true,get:function(){return chunkMHR322QG_cjs.t}});Object.defineProperty(exports,"createHtmlToImageAdapter",{enumerable:true,get:function(){return chunkMHR322QG_cjs.c}});Object.defineProperty(exports,"dequeueAll",{enumerable:true,get:function(){return chunkMHR322QG_cjs.g}});Object.defineProperty(exports,"drainClickEvents",{enumerable:true,get:function(){return chunkMHR322QG_cjs.j}});Object.defineProperty(exports,"drainDiagnostics",{enumerable:true,get:function(){return chunkMHR322QG_cjs.w}});Object.defineProperty(exports,"enqueue",{enumerable:true,get:function(){return chunkMHR322QG_cjs.f}});Object.defineProperty(exports,"getMyFeedbackUrl",{enumerable:true,get:function(){return chunkMHR322QG_cjs.q}});Object.defineProperty(exports,"getQueueSize",{enumerable:true,get:function(){return chunkMHR322QG_cjs.i}});Object.defineProperty(exports,"getSecurityFindings",{enumerable:true,get:function(){return chunkMHR322QG_cjs.z}});Object.defineProperty(exports,"getViewerToken",{enumerable:true,get:function(){return chunkMHR322QG_cjs.p}});Object.defineProperty(exports,"installDiagnostics",{enumerable:true,get:function(){return chunkMHR322QG_cjs.u}});Object.defineProperty(exports,"isRecordingSupported",{enumerable:true,get:function(){return chunkMHR322QG_cjs.l}});Object.defineProperty(exports,"isVoiceSupported",{enumerable:true,get:function(){return chunkMHR322QG_cjs.n}});Object.defineProperty(exports,"runCapture",{enumerable:true,get:function(){return chunkMHR322QG_cjs.d}});Object.defineProperty(exports,"runSecretScan",{enumerable:true,get:function(){return chunkMHR322QG_cjs.y}});Object.defineProperty(exports,"startRecording",{enumerable:true,get:function(){return chunkMHR322QG_cjs.m}});Object.defineProperty(exports,"startVoiceRecording",{enumerable:true,get:function(){return chunkMHR322QG_cjs.o}});Object.defineProperty(exports,"transcribeAudio",{enumerable:true,get:function(){return chunkMHR322QG_cjs.r}});Object.defineProperty(exports,"uninstallDiagnostics",{enumerable:true,get:function(){return chunkMHR322QG_cjs.v}});exports.createModernScreenshotAdapter=U;exports.dataUrlToBlob=O;
1
+ 'use strict';var chunkMEMJU6VF_cjs=require('./chunk-MEMJU6VF.cjs');function s(o){if(o?.aborted)throw new Error("Aborted")}async function v(o){return await new Promise((t,e)=>{let r=new Image;r.onload=()=>t({width:r.naturalWidth,height:r.naturalHeight}),r.onerror=()=>e(new Error("Failed to load generated screenshot")),r.src=o;})}async function l(o,t){let{width:e,height:r}=await v(o);return {dataUrl:o,mime:t,width:e,height:r}}function U(o){return {async captureElement(t,e){if(!chunkMEMJU6VF_cjs.a())throw new Error("captureElement can only run in the browser");s(e.signal);let r={scale:e.pixelRatio},n=e.mime==="image/jpeg"?await o.domToJpeg(t,{...r,quality:e.quality??.92}):await o.domToPng(t,r);return s(e.signal),await l(n,e.mime)},async captureFullPage(t){if(!chunkMEMJU6VF_cjs.a())throw new Error("captureFullPage can only run in the browser");s(t.signal);let e=document.documentElement,r=Math.max(e.scrollWidth,e.clientWidth),n=Math.max(e.scrollHeight,e.clientHeight),i=Math.min(1,t.maxDimension/Math.max(r,n)),c={width:Math.max(1,Math.round(r*i)),height:Math.max(1,Math.round(n*i)),scale:t.pixelRatio},a=t.mime==="image/jpeg"?await o.domToJpeg(e,{...c,quality:t.quality??.92}):await o.domToPng(e,c);return s(t.signal),await l(a,t.mime)}}}function O(o){let[t,e]=o.split(",",2);if(!t||!e)throw new Error("Invalid data URL");let n=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(e),c=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)c[a]=i.charCodeAt(a);return new Blob([c],{type:n})}Object.defineProperty(exports,"clearClickEvents",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.k}});Object.defineProperty(exports,"clearDiagnostics",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.x}});Object.defineProperty(exports,"clearQueue",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.h}});Object.defineProperty(exports,"clearSecurityFindings",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.A}});Object.defineProperty(exports,"collectMetadata",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.e}});Object.defineProperty(exports,"createBlocFeedController",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.t}});Object.defineProperty(exports,"createHtmlToImageAdapter",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.c}});Object.defineProperty(exports,"dequeueAll",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.g}});Object.defineProperty(exports,"drainClickEvents",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.j}});Object.defineProperty(exports,"drainDiagnostics",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.w}});Object.defineProperty(exports,"enqueue",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.f}});Object.defineProperty(exports,"getMyFeedbackUrl",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.q}});Object.defineProperty(exports,"getQueueSize",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.i}});Object.defineProperty(exports,"getSecurityFindings",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.z}});Object.defineProperty(exports,"getViewerToken",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.p}});Object.defineProperty(exports,"installDiagnostics",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.u}});Object.defineProperty(exports,"isRecordingSupported",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.l}});Object.defineProperty(exports,"isVoiceSupported",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.n}});Object.defineProperty(exports,"runCapture",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.d}});Object.defineProperty(exports,"runSecretScan",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.y}});Object.defineProperty(exports,"startRecording",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.m}});Object.defineProperty(exports,"startVoiceRecording",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.o}});Object.defineProperty(exports,"transcribeAudio",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.r}});Object.defineProperty(exports,"uninstallDiagnostics",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.v}});exports.createModernScreenshotAdapter=U;exports.dataUrlToBlob=O;
package/dist/engine.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { r as ScreenshotAdapter, C as CaptureConfig, k as CaptureResult, V as VideoAsset, R as RecordingConfig, L as ClickEvent, K as VoiceConfig, o as MetadataConfig, p as MetadataContext, i as BlocFeedUser, n as FeedbackPayload, x as SecuritySnapshot, v as SecurityConfig } from './controller-CZvGT9Dj.cjs';
2
- export { B as BlocFeedConfig, c as BlocFeedController, g as BlocFeedError, a as BlocFeedHandle, b as BlocFeedState, h as BlocFeedStrings, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, F as FeedbackCategory, O as HoverListener, I as ImageAsset, N as NetworkEntry, q as Rect, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, w as SecurityFinding, y as SessionPhase, Q as StateListener, S as SubmitResult, T as ThemeConfig, z as TransportConfig, G as TriggerStyle, H as VideoIntent, J as VideoMime, W as WidgetPosition, U as createBlocFeedController } from './controller-CZvGT9Dj.cjs';
1
+ import { r as ScreenshotAdapter, C as CaptureConfig, k as CaptureResult, V as VideoAsset, R as RecordingConfig, L as ClickEvent, K as VoiceConfig, o as MetadataConfig, p as MetadataContext, i as BlocFeedUser, n as FeedbackPayload, x as SecuritySnapshot, v as SecurityConfig } from './controller-BLGypDNA.cjs';
2
+ export { B as BlocFeedConfig, c as BlocFeedController, g as BlocFeedError, a as BlocFeedHandle, b as BlocFeedState, h as BlocFeedStrings, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, F as FeedbackCategory, O as HoverListener, I as ImageAsset, N as NetworkEntry, q as Rect, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, w as SecurityFinding, y as SessionPhase, Q as StateListener, S as SubmitResult, T as ThemeConfig, z as TransportConfig, G as TriggerStyle, H as VideoIntent, J as VideoMime, W as WidgetPosition, U as createBlocFeedController } from './controller-BLGypDNA.cjs';
3
3
 
4
4
  declare function createHtmlToImageAdapter(): ScreenshotAdapter;
5
5
 
package/dist/engine.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { r as ScreenshotAdapter, C as CaptureConfig, k as CaptureResult, V as VideoAsset, R as RecordingConfig, L as ClickEvent, K as VoiceConfig, o as MetadataConfig, p as MetadataContext, i as BlocFeedUser, n as FeedbackPayload, x as SecuritySnapshot, v as SecurityConfig } from './controller-CZvGT9Dj.js';
2
- export { B as BlocFeedConfig, c as BlocFeedController, g as BlocFeedError, a as BlocFeedHandle, b as BlocFeedState, h as BlocFeedStrings, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, F as FeedbackCategory, O as HoverListener, I as ImageAsset, N as NetworkEntry, q as Rect, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, w as SecurityFinding, y as SessionPhase, Q as StateListener, S as SubmitResult, T as ThemeConfig, z as TransportConfig, G as TriggerStyle, H as VideoIntent, J as VideoMime, W as WidgetPosition, U as createBlocFeedController } from './controller-CZvGT9Dj.js';
1
+ import { r as ScreenshotAdapter, C as CaptureConfig, k as CaptureResult, V as VideoAsset, R as RecordingConfig, L as ClickEvent, K as VoiceConfig, o as MetadataConfig, p as MetadataContext, i as BlocFeedUser, n as FeedbackPayload, x as SecuritySnapshot, v as SecurityConfig } from './controller-BLGypDNA.js';
2
+ export { B as BlocFeedConfig, c as BlocFeedController, g as BlocFeedError, a as BlocFeedHandle, b as BlocFeedState, h as BlocFeedStrings, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, F as FeedbackCategory, O as HoverListener, I as ImageAsset, N as NetworkEntry, q as Rect, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, w as SecurityFinding, y as SessionPhase, Q as StateListener, S as SubmitResult, T as ThemeConfig, z as TransportConfig, G as TriggerStyle, H as VideoIntent, J as VideoMime, W as WidgetPosition, U as createBlocFeedController } from './controller-BLGypDNA.js';
3
3
 
4
4
  declare function createHtmlToImageAdapter(): ScreenshotAdapter;
5
5
 
package/dist/engine.js CHANGED
@@ -1 +1 @@
1
- import {a}from'./chunk-PSQNFGK6.js';export{k as clearClickEvents,x as clearDiagnostics,h as clearQueue,A as clearSecurityFindings,e as collectMetadata,t as createBlocFeedController,c as createHtmlToImageAdapter,g as dequeueAll,j as drainClickEvents,w as drainDiagnostics,f as enqueue,q as getMyFeedbackUrl,i as getQueueSize,z as getSecurityFindings,p as getViewerToken,u as installDiagnostics,l as isRecordingSupported,n as isVoiceSupported,d as runCapture,y as runSecretScan,m as startRecording,o as startVoiceRecording,r as transcribeAudio,v as uninstallDiagnostics}from'./chunk-PSQNFGK6.js';function s(o){if(o?.aborted)throw new Error("Aborted")}async function v(o){return await new Promise((t,e)=>{let r=new Image;r.onload=()=>t({width:r.naturalWidth,height:r.naturalHeight}),r.onerror=()=>e(new Error("Failed to load generated screenshot")),r.src=o;})}async function l(o,t){let{width:e,height:r}=await v(o);return {dataUrl:o,mime:t,width:e,height:r}}function U(o){return {async captureElement(t,e){if(!a())throw new Error("captureElement can only run in the browser");s(e.signal);let r={scale:e.pixelRatio},n=e.mime==="image/jpeg"?await o.domToJpeg(t,{...r,quality:e.quality??.92}):await o.domToPng(t,r);return s(e.signal),await l(n,e.mime)},async captureFullPage(t){if(!a())throw new Error("captureFullPage can only run in the browser");s(t.signal);let e=document.documentElement,r=Math.max(e.scrollWidth,e.clientWidth),n=Math.max(e.scrollHeight,e.clientHeight),i=Math.min(1,t.maxDimension/Math.max(r,n)),c={width:Math.max(1,Math.round(r*i)),height:Math.max(1,Math.round(n*i)),scale:t.pixelRatio},a$1=t.mime==="image/jpeg"?await o.domToJpeg(e,{...c,quality:t.quality??.92}):await o.domToPng(e,c);return s(t.signal),await l(a$1,t.mime)}}}function O(o){let[t,e]=o.split(",",2);if(!t||!e)throw new Error("Invalid data URL");let n=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(e),c=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)c[a]=i.charCodeAt(a);return new Blob([c],{type:n})}export{U as createModernScreenshotAdapter,O as dataUrlToBlob};
1
+ import {a}from'./chunk-MENIMIF7.js';export{k as clearClickEvents,x as clearDiagnostics,h as clearQueue,A as clearSecurityFindings,e as collectMetadata,t as createBlocFeedController,c as createHtmlToImageAdapter,g as dequeueAll,j as drainClickEvents,w as drainDiagnostics,f as enqueue,q as getMyFeedbackUrl,i as getQueueSize,z as getSecurityFindings,p as getViewerToken,u as installDiagnostics,l as isRecordingSupported,n as isVoiceSupported,d as runCapture,y as runSecretScan,m as startRecording,o as startVoiceRecording,r as transcribeAudio,v as uninstallDiagnostics}from'./chunk-MENIMIF7.js';function s(o){if(o?.aborted)throw new Error("Aborted")}async function v(o){return await new Promise((t,e)=>{let r=new Image;r.onload=()=>t({width:r.naturalWidth,height:r.naturalHeight}),r.onerror=()=>e(new Error("Failed to load generated screenshot")),r.src=o;})}async function l(o,t){let{width:e,height:r}=await v(o);return {dataUrl:o,mime:t,width:e,height:r}}function U(o){return {async captureElement(t,e){if(!a())throw new Error("captureElement can only run in the browser");s(e.signal);let r={scale:e.pixelRatio},n=e.mime==="image/jpeg"?await o.domToJpeg(t,{...r,quality:e.quality??.92}):await o.domToPng(t,r);return s(e.signal),await l(n,e.mime)},async captureFullPage(t){if(!a())throw new Error("captureFullPage can only run in the browser");s(t.signal);let e=document.documentElement,r=Math.max(e.scrollWidth,e.clientWidth),n=Math.max(e.scrollHeight,e.clientHeight),i=Math.min(1,t.maxDimension/Math.max(r,n)),c={width:Math.max(1,Math.round(r*i)),height:Math.max(1,Math.round(n*i)),scale:t.pixelRatio},a$1=t.mime==="image/jpeg"?await o.domToJpeg(e,{...c,quality:t.quality??.92}):await o.domToPng(e,c);return s(t.signal),await l(a$1,t.mime)}}}function O(o){let[t,e]=o.split(",",2);if(!t||!e)throw new Error("Invalid data URL");let n=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(e),c=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)c[a]=i.charCodeAt(a);return new Blob([c],{type:n})}export{U as createModernScreenshotAdapter,O as dataUrlToBlob};
package/dist/main.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- 'use strict';var chunkMHR322QG_cjs=require('./chunk-MHR322QG.cjs'),react=require('react'),jsxRuntime=require('react/jsx-runtime'),reactDom=require('react-dom'),framerMotion=require('framer-motion');var Y=react.createContext(null);function ie(t){let e=react.useMemo(()=>chunkMHR322QG_cjs.t({...t.config??{},blocfeed_id:t.blocfeed_id}),[]),[i,r]=react.useState(()=>e.getState());return react.useEffect(()=>e.subscribe(r),[e]),react.useEffect(()=>e.setConfig({...t.config??{},blocfeed_id:t.blocfeed_id}),[e,t.config,t.blocfeed_id]),react.useEffect(()=>()=>e.destroy(),[e]),jsxRuntime.jsx(Y.Provider,{value:{controller:e,state:i},children:t.children})}var Re="blocfeed-styles-v1",It=`
2
+ 'use strict';var chunkMEMJU6VF_cjs=require('./chunk-MEMJU6VF.cjs'),react=require('react'),jsxRuntime=require('react/jsx-runtime'),reactDom=require('react-dom'),framerMotion=require('framer-motion');var Y=react.createContext(null);function ie(t){let e=react.useMemo(()=>chunkMEMJU6VF_cjs.t({...t.config??{},blocfeed_id:t.blocfeed_id}),[]),[i,r]=react.useState(()=>e.getState());return react.useEffect(()=>e.subscribe(r),[e]),react.useEffect(()=>e.setConfig({...t.config??{},blocfeed_id:t.blocfeed_id}),[e,t.config,t.blocfeed_id]),react.useEffect(()=>()=>e.destroy(),[e]),jsxRuntime.jsx(Y.Provider,{value:{controller:e,state:i},children:t.children})}var Re="blocfeed-styles-v1",It=`
3
3
  :where([data-blocfeed-ui-root]),
4
4
  :where([data-blocfeed-ui-root]) * {
5
5
  box-sizing: border-box;
@@ -881,5 +881,5 @@
881
881
  animation: none;
882
882
  }
883
883
  }
884
- `;function Me(){if(!chunkMHR322QG_cjs.a()||document.getElementById(Re))return;let t=document.createElement("style");t.id=Re,t.textContent=It,document.head.appendChild(t);}var Le={triggerLabel:"Feedback",panelTitle:"Feedback",hintText:"Click an element to attach your feedback. Press Esc to cancel.",cancelButton:"Cancel",rePickButton:"Re-pick",closeButton:"Close",textareaPlaceholder:"What's happening? What did you expect?",screenshotElement:"Screenshot element",screenshotFullPage:"Full page",capturingText:"Capturing screenshots\u2026",submittingText:"Submitting\u2026",successText:"Sent. Thank you!",toastText:"Feedback sent",sendButton:"Send",categoryBug:"Bug",categoryFeature:"Feature",categoryUx:"UX",categoryGeneral:"General",recordButton:"Record",stopRecordButton:"Stop",recordingText:"Recording\u2026",recordingDeniedText:"Screen share was denied",videoPreviewLabel:"Video attached",removeVideoButton:"Remove",voiceButton:"Voice",voiceStopButton:"Stop",voiceRecordingText:"Recording\u2026",voiceTranscribingText:"Transcribing\u2026",voiceDeniedText:"Microphone access was denied",voiceErrorText:"Voice transcription failed. Please type instead.",voiceEmptyText:"No speech detected. Try again or type instead."};function ze(t){return t?{...Le,...t}:Le}function ae(){let t=react.useContext(Y);if(!t)throw new Error("useBlocFeed must be used within a <BlocFeedProvider />");return {state:t.state,controller:t.controller,start:t.controller.start,stop:t.controller.stop,clearSelection:t.controller.clearSelection,submit:t.controller.submit,startRecording:t.controller.startRecording,stopRecording:t.controller.stopRecording,removeVideo:t.controller.removeVideo}}function y(t){switch(t){case "bottom-left":return "bf-trigger bf-trigger-bl";case "top-right":return "bf-trigger bf-trigger-tr";case "top-left":return "bf-trigger bf-trigger-tl";default:return "bf-trigger"}}function g({size:t=14}){return jsxRuntime.jsx("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:jsxRuntime.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ie({size:t=14}){return jsxRuntime.jsx("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:jsxRuntime.jsx("path",{d:"M21 11.5a8.38 8.38 0 01-.9 3.8 8.5 8.5 0 01-7.6 4.7 8.38 8.38 0 01-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 01-.9-3.8 8.5 8.5 0 014.7-7.6 8.38 8.38 0 013.8-.9h.5a8.48 8.48 0 018 8v.5z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ae({size:t=16}){return jsxRuntime.jsxs("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[jsxRuntime.jsx("path",{d:"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),jsxRuntime.jsx("path",{d:"M22 6l-10 7L2 6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}function _e({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){return i?jsxRuntime.jsxs("button",{className:y(t),type:"button",onClick:e,"aria-label":r,children:[p?jsxRuntime.jsx("span",{style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"bf-dot","aria-hidden":"true"}),r]}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]}):null}function h(){let[t,e]=react.useState(()=>typeof window>"u"?false:window.matchMedia("(prefers-reduced-motion: reduce)").matches);return react.useEffect(()=>{let i=window.matchMedia("(prefers-reduced-motion: reduce)"),r=a=>e(a.matches);return i.addEventListener("change",r),()=>i.removeEventListener("change",r)},[]),t}var Vt={duration:.18,ease:"easeOut"},$t={duration:0};function Oe({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?$t:Vt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.92},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(framerMotion.motion.span,{className:"bf-dot","aria-hidden":"true",animate:o?{}:{scale:n?1:[1,1.2,1],boxShadow:n?"0 0 0 4px rgba(99, 102, 241, 0.18)":["0 0 0 4px rgba(99, 102, 241, 0.18)","0 0 0 8px rgba(99, 102, 241, 0.28)","0 0 0 4px rgba(99, 102, 241, 0.18)"]},transition:n||o?c:{duration:2,repeat:1/0,ease:"easeInOut"}}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-6},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-6},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"dot")})}var Yt={duration:.18,ease:"easeOut"},Ve={duration:0};function Ke({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?Ve:Yt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsxs(framerMotion.motion.div,{className:y(t),initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{y:8,opacity:0},transition:c,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),style:{background:"transparent",border:"none",boxShadow:"none",padding:0},children:[jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.div,{initial:{opacity:0,y:o?0:4},animate:{opacity:1,y:0},exit:{opacity:0,y:o?0:4},transition:c,style:{position:"absolute",bottom:"calc(100% + 8px)",left:"50%",transform:"translateX(-50%)",padding:"6px 12px",borderRadius:"8px",background:"var(--bf-panel-bg)",border:"1px solid var(--bf-border)",boxShadow:"var(--bf-shadow)",whiteSpace:"nowrap",fontSize:"12px",color:"var(--bf-panel-fg)",pointerEvents:"none"},children:r},"tooltip")}),jsxRuntime.jsxs(framerMotion.motion.button,{type:"button",onClick:e,"aria-label":r,style:{position:"relative",display:"flex",alignItems:"center",justifyContent:"center",width:"40px",height:"40px",borderRadius:"50%",border:"1px solid var(--bf-border)",background:"var(--bf-panel-bg)",color:"var(--bf-panel-fg)",boxShadow:"var(--bf-shadow)",cursor:"pointer",padding:0},animate:o?{}:{y:[0,-3,0]},transition:o?Ve:{y:{duration:3,repeat:1/0,ease:"easeInOut"}},whileHover:{scale:1.1,borderColor:"var(--bf-accent)"},whileTap:{scale:.9},children:[p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:16})},"success"):jsxRuntime.jsx(Ie,{size:16}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge bf-badge-float","aria-label":`${a} queued`,children:a})]})]},"bubble")})}var Qt={duration:.2,ease:"easeOut"},qt={duration:0};function Xe(t){return t==="bottom-left"||t==="top-left"}function Jt(t){return `bf-trigger-edge ${Xe(t)?"bf-trigger-edge-left":"bf-trigger-edge-right"}`}function Ye({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=Xe(t),c=h(),x=c?qt:Qt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:Jt(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{opacity:0,width:0},animate:{opacity:1,width:n?140:22,height:n?40:90},exit:{width:0,opacity:0},transition:x,whileTap:{scale:.97},style:{top:"50%",translateY:"-50%"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:x,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs(framerMotion.motion.span,{animate:{rotate:c||n?0:o?-90:90,opacity:n?1:.6},transition:x,style:{display:"flex",alignItems:"center",gap:"8px",whiteSpace:"nowrap",fontSize:"12px",letterSpacing:"0.5px",textTransform:"uppercase"},children:[n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:{duration:.12},style:{width:"6px",height:"6px",borderRadius:"50%",background:"var(--bf-accent)",flexShrink:0}}),r]}),jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",animate:{opacity:n?1:0},transition:{duration:.12},style:{position:"absolute",top:0,bottom:0,[o?"left":"right"]:0,width:"2px",background:"var(--bf-accent)"}}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"edge-tab")})}var to={duration:.18,ease:"easeOut"},oo={duration:0};function je({delay:t,hovered:e,reduced:i}){return i?null:jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{position:"absolute",width:"10px",height:"10px",borderRadius:"50%",border:"2px solid var(--bf-accent)",pointerEvents:"none"},animate:e?{scale:1,opacity:0}:{scale:[1,1.8],opacity:[.5,0]},transition:e?{duration:.15}:{duration:2,repeat:1/0,delay:t,ease:"easeOut"}})}function qe({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?oo:to;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.92},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{style:{position:"relative",display:"flex",alignItems:"center",justifyContent:"center",width:"10px",height:"10px",flexShrink:0},children:[jsxRuntime.jsx(je,{delay:0,hovered:n,reduced:o}),jsxRuntime.jsx(je,{delay:.7,hovered:n,reduced:o}),jsxRuntime.jsx(framerMotion.motion.span,{className:"bf-dot","aria-hidden":"true",style:{position:"relative",zIndex:1}})]}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-6},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-6},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"pulse-ring")})}var no={duration:.18,ease:"easeOut"},so={duration:0};function co(t){switch(t){case "bottom-left":return "bf-trigger-minimal bf-trigger-bl";case "top-right":return "bf-trigger-minimal bf-trigger-tr";case "top-left":return "bf-trigger-minimal bf-trigger-tl";default:return "bf-trigger-minimal"}}function et({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?so:no;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsxs(framerMotion.motion.button,{className:co(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{opacity:0,y:o?0:5},animate:{opacity:n?1:.65,y:0},exit:{opacity:0,y:o?0:5},transition:c,whileTap:{scale:.95},children:[p?jsxRuntime.jsx("span",{style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{children:r}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge",style:{marginLeft:"4px"},"aria-label":`${a} queued`,children:a})]}),!o&&jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{position:"absolute",bottom:4,left:4,right:4,height:"2px",background:"var(--bf-accent)",borderRadius:"1px",transformOrigin:"left"},initial:false,animate:{scaleX:n?1:0},transition:c})]},"minimal")})}var po={duration:.18,ease:"easeOut"},uo={duration:0};function ot({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?uo:po;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.9},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(framerMotion.motion.span,{style:{display:"inline-flex",flexShrink:0},animate:o?{}:n?{scale:1.2,rotate:0}:{rotate:[-5,5,-5]},transition:n||o?c:{duration:3,repeat:1/0,ease:"easeInOut"},children:jsxRuntime.jsx(Ae,{size:16})}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-8},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-8},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"icon-pop")})}var ho={duration:.18,ease:"easeOut"},xo={duration:0};function at({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?xo:ho;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.92},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{style:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",width:"10px",height:"10px",flexShrink:0},children:[jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{width:"10px",height:"10px",borderRadius:"50%",background:"var(--bf-accent)",position:"relative",zIndex:1},animate:o?{}:{opacity:n?1:[.5,1,.5],boxShadow:n?"0 0 8px 2px var(--bf-accent)":["0 0 4px 1px var(--bf-accent)","0 0 12px 4px var(--bf-accent)","0 0 4px 1px var(--bf-accent)"]},transition:n||o?c:{duration:2,repeat:1/0,ease:"easeInOut"}}),!n&&!o&&jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{position:"absolute",width:"18px",height:"2px",background:"linear-gradient(90deg, var(--bf-accent), transparent)",transformOrigin:"left center",left:"5px",top:"4px"},animate:{rotate:[0,360]},transition:{duration:4,repeat:1/0,ease:"linear"}})]}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-6},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-6},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"beacon")})}var To={duration:.18,ease:"easeOut"},Eo={duration:0};function lt({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),[o,c]=react.useState(0),x=h(),z=x?Eo:To,f=react.useRef(null);react.useEffect(()=>{if(f.current&&(clearInterval(f.current),f.current=null),!i||n||x){c(n||x?r.length:0);return}let b=8,T=r.length*2+b*2,m=0;return f.current=setInterval(()=>{m=(m+1)%T,m<=r.length?c(m):m<=r.length+b?c(r.length):m<=r.length*2+b?c(r.length*2+b-m):c(0);},100),()=>{f.current&&(clearInterval(f.current),f.current=null);}},[i,n,x,r]);let S=r.slice(0,o);return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{opacity:0,y:x?0:5},animate:{opacity:1,y:0},exit:{opacity:0,y:x?0:5},transition:z,whileTap:{scale:.95},style:{minWidth:"44px"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:z,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"bf-dot","aria-hidden":"true"}),jsxRuntime.jsxs("span",{style:{whiteSpace:"nowrap",minWidth:"1ch"},children:[S,jsxRuntime.jsx("span",{className:"bf-cursor","aria-hidden":"true"})]}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"typewriter")})}function dt(t){switch(t){case "dot":return Oe;case "bubble":return Ke;case "edge-tab":return Ye;case "pulse-ring":return qe;case "minimal":return et;case "icon-pop":return ot;case "beacon":return at;case "typewriter":return lt;default:return _e}}function ft(t,e,i){return Math.max(e,Math.min(i,t))}function No(t,e,i="bottom-right"){let a=window.innerWidth,p=window.innerHeight,n;n=ft(t.x,12,Math.max(12,a-e-12));let l=t.y+t.height+12,o=Math.max(12,t.y-240);return {top:l+240<=p?l:o,left:n}}function Fo(t){let{rect:e}=t,i={left:`${e.x}px`,top:`${e.y}px`,width:`${Math.max(0,e.width)}px`,height:`${Math.max(0,e.height)}px`};return jsxRuntime.jsx("div",{className:"bf-highlight",style:i,"aria-hidden":"true"})}function Ro(t){let e=react.useRef(null);return react.useEffect(()=>{if(!t||!e.current)return;let i=e.current,r=i.querySelector(".bf-textarea");r?.focus();let a=n=>{if(n.key!=="Tab")return;let l=i.querySelectorAll('button:not([disabled]), textarea:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])');if(l.length===0)return;let o=l[0],c=l[l.length-1];n.shiftKey&&document.activeElement===o?(n.preventDefault(),c.focus()):!n.shiftKey&&document.activeElement===c&&(n.preventDefault(),o.focus());},p=n=>{let l=n.target;l&&(i.contains(l)||(n.stopImmediatePropagation(),r?.focus()));};return document.addEventListener("keydown",a,{capture:true}),document.addEventListener("focusin",p,{capture:true}),()=>{document.removeEventListener("keydown",a,{capture:true}),document.removeEventListener("focusin",p,{capture:true});}},[t]),e}function Mo(t,e){return t?typeof t=="function"?t(e):t.some(i=>i.endsWith("*")?e.startsWith(i.slice(0,-1)):e===i):true}var ce=new Set,pt=false;function Lo(){if(pt||typeof window>"u")return;pt=true;let t=history.pushState,e=history.replaceState,i=()=>{for(let r of ce)r();};history.pushState=function(...r){t.apply(this,r),setTimeout(i,0);},history.replaceState=function(...r){e.apply(this,r),setTimeout(i,0);};}function zo(t){let[e,i]=react.useState(()=>typeof window<"u"?window.location.pathname:"/");return react.useEffect(()=>{if(typeof window>"u")return;let r=()=>i(window.location.pathname);return window.addEventListener("popstate",r),Lo(),ce.add(r),()=>{window.removeEventListener("popstate",r),ce.delete(r);}},[]),Mo(t,e)}function Io(t){let[e,i]=react.useState(()=>!t||t==="dark"?"dark":t==="light"?"light":typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return react.useEffect(()=>{if(t!=="auto"){i(t==="light"?"light":"dark");return}let r=window.matchMedia("(prefers-color-scheme: dark)"),a=p=>i(p.matches?"dark":"light");return i(r.matches?"dark":"light"),r.addEventListener("change",a),()=>r.removeEventListener("change",a)},[t]),e}var Ao=["bug","feature","ux","general"],Wo={bug:"categoryBug",feature:"categoryFeature",ux:"categoryUx",general:"categoryGeneral"};function X(t){let e=Math.floor(t/1e3),i=Math.floor(e/60),r=e%60;return `${i}:${String(r).padStart(2,"0")}`}function _o(t){return t<1024*1024?`${Math.round(t/1024)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function Ho(t){let{state:e,controller:i,start:r,stop:a,clearSelection:p,submit:n}=ae(),l=t.config.ui?.position,o=ze(t.config.ui?.strings),c=t.config.ui?.branding!==false,[x,z]=react.useState(null),[f,S]=react.useState(""),[b,T]=react.useState(t.config.capture?.element??true),[m,C]=react.useState(t.config.capture?.fullPage??false),[bt,de]=react.useState(null),[D,fe]=react.useState(void 0),pe=t.config.ui?.categories??Ao,gt=t.config.recording?.enabled===true&&chunkMHR322QG_cjs.l(),mt=t.config.recording?.maxDurationMs??3e4,ue=i.getConfig().voice,ht=ue?.enabled===true&&chunkMHR322QG_cjs.n(),xt=ue?.maxDurationMs??6e4,[vt,yt]=react.useState(false),[J,wt]=react.useState(0);react.useEffect(()=>{let s=window.setTimeout(()=>{let v=chunkMHR322QG_cjs.z();wt(v.findings.length);},500);return ()=>window.clearTimeout(s)},[]),react.useImperativeHandle(t.handleRef,()=>({open:r,close:a,submit:s=>n(s),startRecording:()=>i.startRecording(),stopRecording:()=>i.stopRecording(),get isOpen(){return e.phase!=="idle"}}),[r,a,n,i,e.phase]);let be=e.phase==="review"||e.phase==="capturing"||e.phase==="submitting"||e.phase==="error"||e.phase==="success",kt=Ro(be),[Tt,Et]=react.useState(0);react.useEffect(()=>{e.phase==="idle"&&Et(chunkMHR322QG_cjs.i());},[e.phase]);let[St,ge]=react.useState(false),me=react.useRef(e.phase);react.useEffect(()=>{if(me.current==="success"&&e.phase==="idle"){ge(true);let s=window.setTimeout(()=>ge(false),1500);return ()=>window.clearTimeout(s)}me.current=e.phase;},[e.phase]),react.useEffect(()=>{let s=t.config.ui?.shortcut;if(!s)return;let v=s.toLowerCase().split("+").map(N=>N.trim()),B=v[v.length-1]||"",I=new Set(v.slice(0,-1)),ve=N=>{let Nt=/Mac|iPod|iPhone|iPad/.test(navigator.platform);if(I.has("mod")){if(Nt?!N.metaKey:!N.ctrlKey)return}else if(I.has("ctrl")&&!N.ctrlKey||(I.has("meta")||I.has("cmd"))&&!N.metaKey)return;I.has("shift")&&!N.shiftKey||(I.has("alt")||I.has("option"))&&!N.altKey||N.key.toLowerCase()===B&&(N.preventDefault(),e.phase==="idle"?r():a());};return document.addEventListener("keydown",ve),()=>document.removeEventListener("keydown",ve)},[t.config.ui?.shortcut,e.phase,r,a]),react.useEffect(()=>i.subscribeHover(z),[i]),react.useEffect(()=>{let s=i.__unsafeGetSelectedElement();if(!s||e.phase==="idle"||e.phase==="picking"){de(null);return}let v=()=>{de(chunkMHR322QG_cjs.b(s.getBoundingClientRect()));};v();let B=()=>v();return window.addEventListener("scroll",B,{capture:true,passive:true}),window.addEventListener("resize",B,{passive:true}),()=>{window.removeEventListener("scroll",B,{capture:true}),window.removeEventListener("resize",B);}},[i,e.phase,e.selection?.selector]),react.useEffect(()=>{e.phase==="review"&&(S(""),T(t.config.capture?.element??true),C(t.config.capture?.fullPage??false),fe(void 0),V(null));},[e.phase,e.selection?.selector,t.config.capture?.element,t.config.capture?.fullPage]),react.useEffect(()=>{if(e.phase!=="success")return;let s=window.setTimeout(()=>a(),1200);return ()=>window.clearTimeout(s)},[e.phase,a]);let E=e.phase==="capturing"||e.phase==="submitting",M=e.phase==="picking"?x?.rect??null:bt??e.selection?.rect??null,Z=react.useMemo(()=>M?No(M,360,l):null,[M?.x,M?.y,M?.width,M?.height,l]),he=e.lastError?.message,ee=react.useCallback(()=>{let s={capture:{element:b,fullPage:m}};D&&(s.category=D),n(f,s);},[n,f,b,m,D]),Ct=react.useCallback(s=>{(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&f.trim().length>0&&!E&&(s.preventDefault(),ee());},[ee,f,E]),[xe,V]=react.useState(null),Pt=react.useCallback(async()=>{if(e.voiceRecording){i.stopVoice();return}V(null);let s=await i.startVoice();if(s?.text)S(v=>v?v+" "+s.text:s.text);else if(s?.warning)V(o.voiceEmptyText);else if(!s){let v=i.getState().lastError;if(v){let B=v.message?.toLowerCase()??"";B.includes("denied")||B.includes("permission")||B.includes("not allowed")?V(o.voiceDeniedText):V(o.voiceErrorText);}}},[e.voiceRecording,i,o]),Bt=dt(t.config.ui?.triggerStyle);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(Bt,{position:l,onClick:()=>r(),isVisible:e.phase==="idle",label:t.config.ui?.triggerLabel??o.triggerLabel,queueCount:Tt,showSuccess:St}),e.phase!=="idle"&&e.phase!=="recording"&&jsxRuntime.jsxs("div",{className:"bf-overlay",role:"presentation",children:[e.phase!=="picking"&&jsxRuntime.jsx("div",{className:"bf-blocker",role:"presentation",onClick:()=>a()}),M&&jsxRuntime.jsx(Fo,{rect:M}),e.phase==="picking"&&jsxRuntime.jsxs("div",{className:"bf-hint",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("p",{id:"bf-hint-text",children:o.hintText}),jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),"aria-label":o.cancelButton,children:o.cancelButton})]}),be&&Z&&jsxRuntime.jsxs("div",{ref:kt,className:"bf-panel",style:{left:Z.left,top:Z.top},role:"dialog","aria-modal":"true","aria-label":"Feedback form",children:[jsxRuntime.jsxs("div",{className:"bf-panelHeader",children:[jsxRuntime.jsx("div",{className:"bf-title",id:"bf-panel-title",children:o.panelTitle}),jsxRuntime.jsxs("div",{className:"bf-row",style:{justifyContent:"flex-end"},children:[jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>p(),disabled:E,"aria-label":o.rePickButton,children:o.rePickButton}),jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),disabled:E,"aria-label":o.closeButton,children:o.closeButton})]})]}),jsxRuntime.jsxs("div",{className:"bf-panelBody",children:[jsxRuntime.jsx("textarea",{className:"bf-textarea",placeholder:o.textareaPlaceholder,value:f,onChange:s=>S(s.target.value),onKeyDown:Ct,disabled:E,"aria-label":o.panelTitle}),pe.length>0&&jsxRuntime.jsx("div",{className:"bf-pills",role:"group","aria-label":"Feedback category",children:pe.map(s=>jsxRuntime.jsx("button",{type:"button",className:`bf-pill${D===s?" bf-pill-active":""}`,onClick:()=>fe(D===s?void 0:s),disabled:E,children:o[Wo[s]]},s))}),jsxRuntime.jsxs("div",{className:"bf-row",role:"group","aria-label":o.screenshotElement,children:[jsxRuntime.jsxs("label",{children:[jsxRuntime.jsx("input",{type:"checkbox",checked:b,onChange:s=>T(s.target.checked),disabled:E}),o.screenshotElement]}),jsxRuntime.jsxs("label",{children:[jsxRuntime.jsx("input",{type:"checkbox",checked:m,onChange:s=>C(s.target.checked),disabled:E}),o.screenshotFullPage]})]}),ht&&e.phase==="review"&&!e.voiceTranscribing&&jsxRuntime.jsx("button",{type:"button",className:`bf-voice-btn${e.voiceRecording?" bf-voice-btn-active":""}`,onClick:Pt,disabled:E,"aria-label":e.voiceRecording?o.voiceStopButton:o.voiceButton,children:e.voiceRecording?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"bf-rec-dot bf-rec-dot-pulse","aria-hidden":"true"}),o.voiceRecordingText," ",X(e.voiceElapsedMs??0)," / ",X(xt)," \u2014 ",o.voiceStopButton]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("svg",{className:"bf-mic-icon",viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[jsxRuntime.jsx("rect",{x:"9",y:"1",width:"6",height:"11",rx:"3"}),jsxRuntime.jsx("path",{d:"M19 10v1a7 7 0 0 1-14 0v-1"}),jsxRuntime.jsx("line",{x1:"12",y1:"19",x2:"12",y2:"23"}),jsxRuntime.jsx("line",{x1:"8",y1:"23",x2:"16",y2:"23"})]}),o.voiceButton]})}),e.voiceTranscribing&&jsxRuntime.jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.voiceTranscribingText]}),xe&&!e.voiceRecording&&!e.voiceTranscribing&&jsxRuntime.jsx("div",{className:"bf-error",role:"alert",children:xe}),gt&&e.phase==="review"&&!e.video&&jsxRuntime.jsxs("button",{type:"button",className:"bf-record-btn",onClick:()=>i.startRecording(),disabled:E,"aria-label":o.recordButton,children:[jsxRuntime.jsx("span",{className:"bf-rec-dot","aria-hidden":"true"}),o.recordButton]}),e.video&&e.phase==="review"&&jsxRuntime.jsxs("div",{className:"bf-video-preview",children:[jsxRuntime.jsx("video",{src:e.video.blobUrl,controls:true,muted:true,playsInline:true}),jsxRuntime.jsx("button",{type:"button",className:"bf-video-remove",onClick:()=>i.removeVideo(),"aria-label":o.removeVideoButton,children:"\xD7"}),jsxRuntime.jsxs("div",{className:"bf-video-meta",children:[o.videoPreviewLabel," (",X(e.video.durationMs),", ",_o(e.video.sizeBytes),")"]})]}),e.phase==="capturing"&&jsxRuntime.jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.capturingText]}),e.phase==="submitting"&&jsxRuntime.jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.submittingText]}),e.phase==="success"&&jsxRuntime.jsx("div",{className:"bf-status",role:"status","aria-live":"polite",children:o.successText}),e.phase==="error"&&he&&jsxRuntime.jsx("div",{className:"bf-error",role:"alert",children:he}),jsxRuntime.jsxs("div",{className:"bf-actions",children:[jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),disabled:E,"aria-label":o.cancelButton,children:o.cancelButton}),jsxRuntime.jsx("button",{type:"button",className:"bf-btn bf-btnPrimary",onClick:ee,disabled:E||f.trim().length===0,"aria-label":o.sendButton,children:o.sendButton})]})]}),c&&jsxRuntime.jsxs("div",{className:"bf-watermark",children:[(()=>{let s=chunkMHR322QG_cjs.q();return s?jsxRuntime.jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"bf-my-feedback-link",children:"View my feedback"}):null})(),jsxRuntime.jsx("a",{href:"https://blocfeed.com",target:"_blank",rel:"noopener noreferrer",children:"Powered by BlocFeed"})]})]})]}),e.phase==="recording"&&jsxRuntime.jsxs("div",{className:`bf-recording-bar bf-pos-${l}`,role:"status","aria-live":"polite","data-blocfeed-ui":"true",children:[jsxRuntime.jsx("span",{className:"bf-rec-dot bf-rec-dot-pulse","aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"bf-recording-bar-timer",children:[o.recordingText," ",X(e.recordingElapsedMs??0)," / ",X(mt)]}),jsxRuntime.jsx("button",{type:"button",className:"bf-recording-bar-stop",onClick:()=>i.stopRecording(),"aria-label":o.stopRecordButton,children:o.stopRecordButton})]}),e.phase==="success"&&jsxRuntime.jsxs("div",{className:"bf-toast",role:"status","aria-live":"polite",children:[o.toastText,(()=>{let s=chunkMHR322QG_cjs.q();return s?jsxRuntime.jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"bf-toast-link",children:"View my feedback"}):null})()]}),J>0&&!vt&&jsxRuntime.jsxs("div",{className:"bf-security-banner",role:"alert",children:[jsxRuntime.jsx("button",{type:"button",className:"bf-security-banner-dismiss",onClick:()=>yt(true),"aria-label":"Dismiss",children:"\xD7"}),jsxRuntime.jsx("strong",{children:"Security Warning"}),J," potential secret",J>1?"s":""," exposed in client code. Check your environment variables."]})]})}var Oo=react.forwardRef(function(e,i){let r={...e.config??{},blocfeed_id:e.blocfeed_id},[a,p]=react.useState(null),n=zo(r.ui?.showOn),l=Io(r.ui?.theme?.mode),o=!!r.diagnostics;react.useEffect(()=>{if(o)return chunkMHR322QG_cjs.u(r.diagnostics),()=>chunkMHR322QG_cjs.v()},[o]);let c=!!r.security;react.useEffect(()=>{c&&chunkMHR322QG_cjs.y(r.security);},[c]);let x=react.useRef(e.config?.metadata?.enrich);x.current=e.config?.metadata?.enrich;let z=react.useMemo(()=>{if(e.config)return {...e.config,metadata:{...e.config.metadata,enrich:async f=>{let S=x.current,b=S?await S(f):{},T=chunkMHR322QG_cjs.w(),m=chunkMHR322QG_cjs.z(),C=chunkMHR322QG_cjs.j();return {...b,...T.consoleLogs.length>0?{_consoleLogs:T.consoleLogs}:{},...T.networkErrors.length>0?{_networkErrors:T.networkErrors}:{},...m.findings.length>0?{_securityFindings:m.findings}:{},...C.length>0?{_clickEvents:C}:{}}}}}},[]);return react.useEffect(()=>{Me();let f=document.createElement("div");f.setAttribute("data-blocfeed-ui-root","true"),f.setAttribute("data-blocfeed-ui","true"),f.setAttribute("data-bf-theme",l);let S=r.ui?.zIndex;typeof S=="number"&&f.style.setProperty("--bf-z",String(S));let b=r.ui?.theme;b&&(b.accentColor&&f.style.setProperty("--bf-accent",b.accentColor),b.panelBackground&&f.style.setProperty("--bf-panel-bg",b.panelBackground),b.panelForeground&&f.style.setProperty("--bf-panel-fg",b.panelForeground),b.fontFamily&&f.style.setProperty("--bf-font",b.fontFamily));let T=C=>C.stopPropagation(),m=["pointerdown","pointerup","mousedown","mouseup","click","touchstart","touchend"];for(let C of m)f.addEventListener(C,T);try{document.body.appendChild(f);}catch{return}return p(f),()=>{for(let C of m)f.removeEventListener(C,T);f.remove(),p(null);}},[r.ui?.zIndex,r.ui?.theme?.accentColor,r.ui?.theme?.panelBackground,r.ui?.theme?.panelForeground,r.ui?.theme?.fontFamily,l]),!n||!a?null:reactDom.createPortal(jsxRuntime.jsx(ie,{blocfeed_id:r.blocfeed_id,...z?{config:z}:{},children:jsxRuntime.jsx(Ho,{config:r,handleRef:i})}),a)});
885
- Object.defineProperty(exports,"BehavioralTracker",{enumerable:true,get:function(){return chunkMHR322QG_cjs.s}});exports.BlocFeedProvider=ie;exports.BlocFeedWidget=Oo;exports.useBlocFeed=ae;
884
+ `;function Me(){if(!chunkMEMJU6VF_cjs.a()||document.getElementById(Re))return;let t=document.createElement("style");t.id=Re,t.textContent=It,document.head.appendChild(t);}var Le={triggerLabel:"Feedback",panelTitle:"Feedback",hintText:"Click an element to attach your feedback. Press Esc to cancel.",cancelButton:"Cancel",rePickButton:"Re-pick",closeButton:"Close",textareaPlaceholder:"What's happening? What did you expect?",screenshotElement:"Screenshot element",screenshotFullPage:"Full page",capturingText:"Capturing screenshots\u2026",submittingText:"Submitting\u2026",successText:"Sent. Thank you!",toastText:"Feedback sent",sendButton:"Send",categoryBug:"Bug",categoryFeature:"Feature",categoryUx:"UX",categoryGeneral:"General",recordButton:"Record",stopRecordButton:"Stop",recordingText:"Recording\u2026",recordingDeniedText:"Screen share was denied",videoPreviewLabel:"Video attached",removeVideoButton:"Remove",voiceButton:"Voice",voiceStopButton:"Stop",voiceRecordingText:"Recording\u2026",voiceTranscribingText:"Transcribing\u2026",voiceDeniedText:"Microphone access was denied",voiceErrorText:"Voice transcription failed. Please type instead.",voiceEmptyText:"No speech detected. Try again or type instead."};function ze(t){return t?{...Le,...t}:Le}function ae(){let t=react.useContext(Y);if(!t)throw new Error("useBlocFeed must be used within a <BlocFeedProvider />");return {state:t.state,controller:t.controller,start:t.controller.start,stop:t.controller.stop,clearSelection:t.controller.clearSelection,submit:t.controller.submit,startRecording:t.controller.startRecording,stopRecording:t.controller.stopRecording,removeVideo:t.controller.removeVideo}}function y(t){switch(t){case "bottom-left":return "bf-trigger bf-trigger-bl";case "top-right":return "bf-trigger bf-trigger-tr";case "top-left":return "bf-trigger bf-trigger-tl";default:return "bf-trigger"}}function g({size:t=14}){return jsxRuntime.jsx("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:jsxRuntime.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ie({size:t=14}){return jsxRuntime.jsx("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:jsxRuntime.jsx("path",{d:"M21 11.5a8.38 8.38 0 01-.9 3.8 8.5 8.5 0 01-7.6 4.7 8.38 8.38 0 01-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 01-.9-3.8 8.5 8.5 0 014.7-7.6 8.38 8.38 0 013.8-.9h.5a8.48 8.48 0 018 8v.5z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ae({size:t=16}){return jsxRuntime.jsxs("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[jsxRuntime.jsx("path",{d:"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),jsxRuntime.jsx("path",{d:"M22 6l-10 7L2 6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}function _e({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){return i?jsxRuntime.jsxs("button",{className:y(t),type:"button",onClick:e,"aria-label":r,children:[p?jsxRuntime.jsx("span",{style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"bf-dot","aria-hidden":"true"}),r]}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]}):null}function h(){let[t,e]=react.useState(()=>typeof window>"u"?false:window.matchMedia("(prefers-reduced-motion: reduce)").matches);return react.useEffect(()=>{let i=window.matchMedia("(prefers-reduced-motion: reduce)"),r=a=>e(a.matches);return i.addEventListener("change",r),()=>i.removeEventListener("change",r)},[]),t}var Vt={duration:.18,ease:"easeOut"},$t={duration:0};function Oe({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?$t:Vt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.92},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(framerMotion.motion.span,{className:"bf-dot","aria-hidden":"true",animate:o?{}:{scale:n?1:[1,1.2,1],boxShadow:n?"0 0 0 4px rgba(99, 102, 241, 0.18)":["0 0 0 4px rgba(99, 102, 241, 0.18)","0 0 0 8px rgba(99, 102, 241, 0.28)","0 0 0 4px rgba(99, 102, 241, 0.18)"]},transition:n||o?c:{duration:2,repeat:1/0,ease:"easeInOut"}}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-6},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-6},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"dot")})}var Yt={duration:.18,ease:"easeOut"},Ve={duration:0};function Ke({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?Ve:Yt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsxs(framerMotion.motion.div,{className:y(t),initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{y:8,opacity:0},transition:c,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),style:{background:"transparent",border:"none",boxShadow:"none",padding:0},children:[jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.div,{initial:{opacity:0,y:o?0:4},animate:{opacity:1,y:0},exit:{opacity:0,y:o?0:4},transition:c,style:{position:"absolute",bottom:"calc(100% + 8px)",left:"50%",transform:"translateX(-50%)",padding:"6px 12px",borderRadius:"8px",background:"var(--bf-panel-bg)",border:"1px solid var(--bf-border)",boxShadow:"var(--bf-shadow)",whiteSpace:"nowrap",fontSize:"12px",color:"var(--bf-panel-fg)",pointerEvents:"none"},children:r},"tooltip")}),jsxRuntime.jsxs(framerMotion.motion.button,{type:"button",onClick:e,"aria-label":r,style:{position:"relative",display:"flex",alignItems:"center",justifyContent:"center",width:"40px",height:"40px",borderRadius:"50%",border:"1px solid var(--bf-border)",background:"var(--bf-panel-bg)",color:"var(--bf-panel-fg)",boxShadow:"var(--bf-shadow)",cursor:"pointer",padding:0},animate:o?{}:{y:[0,-3,0]},transition:o?Ve:{y:{duration:3,repeat:1/0,ease:"easeInOut"}},whileHover:{scale:1.1,borderColor:"var(--bf-accent)"},whileTap:{scale:.9},children:[p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:16})},"success"):jsxRuntime.jsx(Ie,{size:16}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge bf-badge-float","aria-label":`${a} queued`,children:a})]})]},"bubble")})}var Qt={duration:.2,ease:"easeOut"},qt={duration:0};function Xe(t){return t==="bottom-left"||t==="top-left"}function Jt(t){return `bf-trigger-edge ${Xe(t)?"bf-trigger-edge-left":"bf-trigger-edge-right"}`}function Ye({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=Xe(t),c=h(),x=c?qt:Qt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:Jt(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{opacity:0,width:0},animate:{opacity:1,width:n?140:22,height:n?40:90},exit:{width:0,opacity:0},transition:x,whileTap:{scale:.97},style:{top:"50%",translateY:"-50%"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:x,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs(framerMotion.motion.span,{animate:{rotate:c||n?0:o?-90:90,opacity:n?1:.6},transition:x,style:{display:"flex",alignItems:"center",gap:"8px",whiteSpace:"nowrap",fontSize:"12px",letterSpacing:"0.5px",textTransform:"uppercase"},children:[n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:{duration:.12},style:{width:"6px",height:"6px",borderRadius:"50%",background:"var(--bf-accent)",flexShrink:0}}),r]}),jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",animate:{opacity:n?1:0},transition:{duration:.12},style:{position:"absolute",top:0,bottom:0,[o?"left":"right"]:0,width:"2px",background:"var(--bf-accent)"}}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"edge-tab")})}var to={duration:.18,ease:"easeOut"},oo={duration:0};function je({delay:t,hovered:e,reduced:i}){return i?null:jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{position:"absolute",width:"10px",height:"10px",borderRadius:"50%",border:"2px solid var(--bf-accent)",pointerEvents:"none"},animate:e?{scale:1,opacity:0}:{scale:[1,1.8],opacity:[.5,0]},transition:e?{duration:.15}:{duration:2,repeat:1/0,delay:t,ease:"easeOut"}})}function qe({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?oo:to;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.92},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{style:{position:"relative",display:"flex",alignItems:"center",justifyContent:"center",width:"10px",height:"10px",flexShrink:0},children:[jsxRuntime.jsx(je,{delay:0,hovered:n,reduced:o}),jsxRuntime.jsx(je,{delay:.7,hovered:n,reduced:o}),jsxRuntime.jsx(framerMotion.motion.span,{className:"bf-dot","aria-hidden":"true",style:{position:"relative",zIndex:1}})]}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-6},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-6},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"pulse-ring")})}var no={duration:.18,ease:"easeOut"},so={duration:0};function co(t){switch(t){case "bottom-left":return "bf-trigger-minimal bf-trigger-bl";case "top-right":return "bf-trigger-minimal bf-trigger-tr";case "top-left":return "bf-trigger-minimal bf-trigger-tl";default:return "bf-trigger-minimal"}}function et({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?so:no;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsxs(framerMotion.motion.button,{className:co(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{opacity:0,y:o?0:5},animate:{opacity:n?1:.65,y:0},exit:{opacity:0,y:o?0:5},transition:c,whileTap:{scale:.95},children:[p?jsxRuntime.jsx("span",{style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{children:r}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge",style:{marginLeft:"4px"},"aria-label":`${a} queued`,children:a})]}),!o&&jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{position:"absolute",bottom:4,left:4,right:4,height:"2px",background:"var(--bf-accent)",borderRadius:"1px",transformOrigin:"left"},initial:false,animate:{scaleX:n?1:0},transition:c})]},"minimal")})}var po={duration:.18,ease:"easeOut"},uo={duration:0};function ot({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?uo:po;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.9},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(framerMotion.motion.span,{style:{display:"inline-flex",flexShrink:0},animate:o?{}:n?{scale:1.2,rotate:0}:{rotate:[-5,5,-5]},transition:n||o?c:{duration:3,repeat:1/0,ease:"easeInOut"},children:jsxRuntime.jsx(Ae,{size:16})}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-8},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-8},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"icon-pop")})}var ho={duration:.18,ease:"easeOut"},xo={duration:0};function at({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?xo:ho;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.92},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{style:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",width:"10px",height:"10px",flexShrink:0},children:[jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{width:"10px",height:"10px",borderRadius:"50%",background:"var(--bf-accent)",position:"relative",zIndex:1},animate:o?{}:{opacity:n?1:[.5,1,.5],boxShadow:n?"0 0 8px 2px var(--bf-accent)":["0 0 4px 1px var(--bf-accent)","0 0 12px 4px var(--bf-accent)","0 0 4px 1px var(--bf-accent)"]},transition:n||o?c:{duration:2,repeat:1/0,ease:"easeInOut"}}),!n&&!o&&jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{position:"absolute",width:"18px",height:"2px",background:"linear-gradient(90deg, var(--bf-accent), transparent)",transformOrigin:"left center",left:"5px",top:"4px"},animate:{rotate:[0,360]},transition:{duration:4,repeat:1/0,ease:"linear"}})]}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-6},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-6},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"beacon")})}var To={duration:.18,ease:"easeOut"},Eo={duration:0};function lt({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),[o,c]=react.useState(0),x=h(),z=x?Eo:To,f=react.useRef(null);react.useEffect(()=>{if(f.current&&(clearInterval(f.current),f.current=null),!i||n||x){c(n||x?r.length:0);return}let b=8,T=r.length*2+b*2,m=0;return f.current=setInterval(()=>{m=(m+1)%T,m<=r.length?c(m):m<=r.length+b?c(r.length):m<=r.length*2+b?c(r.length*2+b-m):c(0);},100),()=>{f.current&&(clearInterval(f.current),f.current=null);}},[i,n,x,r]);let S=r.slice(0,o);return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{opacity:0,y:x?0:5},animate:{opacity:1,y:0},exit:{opacity:0,y:x?0:5},transition:z,whileTap:{scale:.95},style:{minWidth:"44px"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:z,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"bf-dot","aria-hidden":"true"}),jsxRuntime.jsxs("span",{style:{whiteSpace:"nowrap",minWidth:"1ch"},children:[S,jsxRuntime.jsx("span",{className:"bf-cursor","aria-hidden":"true"})]}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"typewriter")})}function dt(t){switch(t){case "dot":return Oe;case "bubble":return Ke;case "edge-tab":return Ye;case "pulse-ring":return qe;case "minimal":return et;case "icon-pop":return ot;case "beacon":return at;case "typewriter":return lt;default:return _e}}function ft(t,e,i){return Math.max(e,Math.min(i,t))}function No(t,e,i="bottom-right"){let a=window.innerWidth,p=window.innerHeight,n;n=ft(t.x,12,Math.max(12,a-e-12));let l=t.y+t.height+12,o=Math.max(12,t.y-240);return {top:l+240<=p?l:o,left:n}}function Fo(t){let{rect:e}=t,i={left:`${e.x}px`,top:`${e.y}px`,width:`${Math.max(0,e.width)}px`,height:`${Math.max(0,e.height)}px`};return jsxRuntime.jsx("div",{className:"bf-highlight",style:i,"aria-hidden":"true"})}function Ro(t){let e=react.useRef(null);return react.useEffect(()=>{if(!t||!e.current)return;let i=e.current,r=i.querySelector(".bf-textarea");r?.focus();let a=n=>{if(n.key!=="Tab")return;let l=i.querySelectorAll('button:not([disabled]), textarea:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])');if(l.length===0)return;let o=l[0],c=l[l.length-1];n.shiftKey&&document.activeElement===o?(n.preventDefault(),c.focus()):!n.shiftKey&&document.activeElement===c&&(n.preventDefault(),o.focus());},p=n=>{let l=n.target;l&&(i.contains(l)||(n.stopImmediatePropagation(),r?.focus()));};return document.addEventListener("keydown",a,{capture:true}),document.addEventListener("focusin",p,{capture:true}),()=>{document.removeEventListener("keydown",a,{capture:true}),document.removeEventListener("focusin",p,{capture:true});}},[t]),e}function Mo(t,e){return t?typeof t=="function"?t(e):t.some(i=>i.endsWith("*")?e.startsWith(i.slice(0,-1)):e===i):true}var ce=new Set,pt=false;function Lo(){if(pt||typeof window>"u")return;pt=true;let t=history.pushState,e=history.replaceState,i=()=>{for(let r of ce)r();};history.pushState=function(...r){t.apply(this,r),setTimeout(i,0);},history.replaceState=function(...r){e.apply(this,r),setTimeout(i,0);};}function zo(t){let[e,i]=react.useState(()=>typeof window<"u"?window.location.pathname:"/");return react.useEffect(()=>{if(typeof window>"u")return;let r=()=>i(window.location.pathname);return window.addEventListener("popstate",r),Lo(),ce.add(r),()=>{window.removeEventListener("popstate",r),ce.delete(r);}},[]),Mo(t,e)}function Io(t){let[e,i]=react.useState(()=>!t||t==="dark"?"dark":t==="light"?"light":typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return react.useEffect(()=>{if(t!=="auto"){i(t==="light"?"light":"dark");return}let r=window.matchMedia("(prefers-color-scheme: dark)"),a=p=>i(p.matches?"dark":"light");return i(r.matches?"dark":"light"),r.addEventListener("change",a),()=>r.removeEventListener("change",a)},[t]),e}var Ao=["bug","feature","ux","general"],Wo={bug:"categoryBug",feature:"categoryFeature",ux:"categoryUx",general:"categoryGeneral"};function X(t){let e=Math.floor(t/1e3),i=Math.floor(e/60),r=e%60;return `${i}:${String(r).padStart(2,"0")}`}function _o(t){return t<1024*1024?`${Math.round(t/1024)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function Ho(t){let{state:e,controller:i,start:r,stop:a,clearSelection:p,submit:n}=ae(),l=t.config.ui?.position,o=ze(t.config.ui?.strings),c=t.config.ui?.branding!==false,[x,z]=react.useState(null),[f,S]=react.useState(""),[b,T]=react.useState(t.config.capture?.element??true),[m,C]=react.useState(t.config.capture?.fullPage??false),[bt,de]=react.useState(null),[D,fe]=react.useState(void 0),pe=t.config.ui?.categories??Ao,gt=t.config.recording?.enabled===true&&chunkMEMJU6VF_cjs.l(),mt=t.config.recording?.maxDurationMs??3e4,ue=i.getConfig().voice,ht=ue?.enabled===true&&chunkMEMJU6VF_cjs.n(),xt=ue?.maxDurationMs??6e4,[vt,yt]=react.useState(false),[J,wt]=react.useState(0);react.useEffect(()=>{let s=window.setTimeout(()=>{let v=chunkMEMJU6VF_cjs.z();wt(v.findings.length);},500);return ()=>window.clearTimeout(s)},[]),react.useImperativeHandle(t.handleRef,()=>({open:r,close:a,submit:s=>n(s),startRecording:()=>i.startRecording(),stopRecording:()=>i.stopRecording(),get isOpen(){return e.phase!=="idle"}}),[r,a,n,i,e.phase]);let be=e.phase==="review"||e.phase==="capturing"||e.phase==="submitting"||e.phase==="error"||e.phase==="success",kt=Ro(be),[Tt,Et]=react.useState(0);react.useEffect(()=>{e.phase==="idle"&&Et(chunkMEMJU6VF_cjs.i());},[e.phase]);let[St,ge]=react.useState(false),me=react.useRef(e.phase);react.useEffect(()=>{if(me.current==="success"&&e.phase==="idle"){ge(true);let s=window.setTimeout(()=>ge(false),1500);return ()=>window.clearTimeout(s)}me.current=e.phase;},[e.phase]),react.useEffect(()=>{let s=t.config.ui?.shortcut;if(!s)return;let v=s.toLowerCase().split("+").map(N=>N.trim()),B=v[v.length-1]||"",I=new Set(v.slice(0,-1)),ve=N=>{let Nt=/Mac|iPod|iPhone|iPad/.test(navigator.platform);if(I.has("mod")){if(Nt?!N.metaKey:!N.ctrlKey)return}else if(I.has("ctrl")&&!N.ctrlKey||(I.has("meta")||I.has("cmd"))&&!N.metaKey)return;I.has("shift")&&!N.shiftKey||(I.has("alt")||I.has("option"))&&!N.altKey||N.key.toLowerCase()===B&&(N.preventDefault(),e.phase==="idle"?r():a());};return document.addEventListener("keydown",ve),()=>document.removeEventListener("keydown",ve)},[t.config.ui?.shortcut,e.phase,r,a]),react.useEffect(()=>i.subscribeHover(z),[i]),react.useEffect(()=>{let s=i.__unsafeGetSelectedElement();if(!s||e.phase==="idle"||e.phase==="picking"){de(null);return}let v=()=>{de(chunkMEMJU6VF_cjs.b(s.getBoundingClientRect()));};v();let B=()=>v();return window.addEventListener("scroll",B,{capture:true,passive:true}),window.addEventListener("resize",B,{passive:true}),()=>{window.removeEventListener("scroll",B,{capture:true}),window.removeEventListener("resize",B);}},[i,e.phase,e.selection?.selector]),react.useEffect(()=>{e.phase==="review"&&(S(""),T(t.config.capture?.element??true),C(t.config.capture?.fullPage??false),fe(void 0),V(null));},[e.phase,e.selection?.selector,t.config.capture?.element,t.config.capture?.fullPage]),react.useEffect(()=>{if(e.phase!=="success")return;let s=window.setTimeout(()=>a(),1200);return ()=>window.clearTimeout(s)},[e.phase,a]);let E=e.phase==="capturing"||e.phase==="submitting",M=e.phase==="picking"?x?.rect??null:bt??e.selection?.rect??null,Z=react.useMemo(()=>M?No(M,360,l):null,[M?.x,M?.y,M?.width,M?.height,l]),he=e.lastError?.message,ee=react.useCallback(()=>{let s={capture:{element:b,fullPage:m}};D&&(s.category=D),n(f,s);},[n,f,b,m,D]),Ct=react.useCallback(s=>{(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&f.trim().length>0&&!E&&(s.preventDefault(),ee());},[ee,f,E]),[xe,V]=react.useState(null),Pt=react.useCallback(async()=>{if(e.voiceRecording){i.stopVoice();return}V(null);let s=await i.startVoice();if(s?.text)S(v=>v?v+" "+s.text:s.text);else if(s?.warning)V(o.voiceEmptyText);else if(!s){let v=i.getState().lastError;if(v){let B=v.message?.toLowerCase()??"";B.includes("denied")||B.includes("permission")||B.includes("not allowed")?V(o.voiceDeniedText):V(o.voiceErrorText);}}},[e.voiceRecording,i,o]),Bt=dt(t.config.ui?.triggerStyle);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(Bt,{position:l,onClick:()=>r(),isVisible:e.phase==="idle",label:t.config.ui?.triggerLabel??o.triggerLabel,queueCount:Tt,showSuccess:St}),e.phase!=="idle"&&e.phase!=="recording"&&jsxRuntime.jsxs("div",{className:"bf-overlay",role:"presentation",children:[e.phase!=="picking"&&jsxRuntime.jsx("div",{className:"bf-blocker",role:"presentation",onClick:()=>a()}),M&&jsxRuntime.jsx(Fo,{rect:M}),e.phase==="picking"&&jsxRuntime.jsxs("div",{className:"bf-hint",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("p",{id:"bf-hint-text",children:o.hintText}),jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),"aria-label":o.cancelButton,children:o.cancelButton})]}),be&&Z&&jsxRuntime.jsxs("div",{ref:kt,className:"bf-panel",style:{left:Z.left,top:Z.top},role:"dialog","aria-modal":"true","aria-label":"Feedback form",children:[jsxRuntime.jsxs("div",{className:"bf-panelHeader",children:[jsxRuntime.jsx("div",{className:"bf-title",id:"bf-panel-title",children:o.panelTitle}),jsxRuntime.jsxs("div",{className:"bf-row",style:{justifyContent:"flex-end"},children:[jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>p(),disabled:E,"aria-label":o.rePickButton,children:o.rePickButton}),jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),disabled:E,"aria-label":o.closeButton,children:o.closeButton})]})]}),jsxRuntime.jsxs("div",{className:"bf-panelBody",children:[jsxRuntime.jsx("textarea",{className:"bf-textarea",placeholder:o.textareaPlaceholder,value:f,onChange:s=>S(s.target.value),onKeyDown:Ct,disabled:E,"aria-label":o.panelTitle}),pe.length>0&&jsxRuntime.jsx("div",{className:"bf-pills",role:"group","aria-label":"Feedback category",children:pe.map(s=>jsxRuntime.jsx("button",{type:"button",className:`bf-pill${D===s?" bf-pill-active":""}`,onClick:()=>fe(D===s?void 0:s),disabled:E,children:o[Wo[s]]},s))}),jsxRuntime.jsxs("div",{className:"bf-row",role:"group","aria-label":o.screenshotElement,children:[jsxRuntime.jsxs("label",{children:[jsxRuntime.jsx("input",{type:"checkbox",checked:b,onChange:s=>T(s.target.checked),disabled:E}),o.screenshotElement]}),jsxRuntime.jsxs("label",{children:[jsxRuntime.jsx("input",{type:"checkbox",checked:m,onChange:s=>C(s.target.checked),disabled:E}),o.screenshotFullPage]})]}),ht&&e.phase==="review"&&!e.voiceTranscribing&&jsxRuntime.jsx("button",{type:"button",className:`bf-voice-btn${e.voiceRecording?" bf-voice-btn-active":""}`,onClick:Pt,disabled:E,"aria-label":e.voiceRecording?o.voiceStopButton:o.voiceButton,children:e.voiceRecording?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"bf-rec-dot bf-rec-dot-pulse","aria-hidden":"true"}),o.voiceRecordingText," ",X(e.voiceElapsedMs??0)," / ",X(xt)," \u2014 ",o.voiceStopButton]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("svg",{className:"bf-mic-icon",viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[jsxRuntime.jsx("rect",{x:"9",y:"1",width:"6",height:"11",rx:"3"}),jsxRuntime.jsx("path",{d:"M19 10v1a7 7 0 0 1-14 0v-1"}),jsxRuntime.jsx("line",{x1:"12",y1:"19",x2:"12",y2:"23"}),jsxRuntime.jsx("line",{x1:"8",y1:"23",x2:"16",y2:"23"})]}),o.voiceButton]})}),e.voiceTranscribing&&jsxRuntime.jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.voiceTranscribingText]}),xe&&!e.voiceRecording&&!e.voiceTranscribing&&jsxRuntime.jsx("div",{className:"bf-error",role:"alert",children:xe}),gt&&e.phase==="review"&&!e.video&&jsxRuntime.jsxs("button",{type:"button",className:"bf-record-btn",onClick:()=>i.startRecording(),disabled:E,"aria-label":o.recordButton,children:[jsxRuntime.jsx("span",{className:"bf-rec-dot","aria-hidden":"true"}),o.recordButton]}),e.video&&e.phase==="review"&&jsxRuntime.jsxs("div",{className:"bf-video-preview",children:[jsxRuntime.jsx("video",{src:e.video.blobUrl,controls:true,muted:true,playsInline:true}),jsxRuntime.jsx("button",{type:"button",className:"bf-video-remove",onClick:()=>i.removeVideo(),"aria-label":o.removeVideoButton,children:"\xD7"}),jsxRuntime.jsxs("div",{className:"bf-video-meta",children:[o.videoPreviewLabel," (",X(e.video.durationMs),", ",_o(e.video.sizeBytes),")"]})]}),e.phase==="capturing"&&jsxRuntime.jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.capturingText]}),e.phase==="submitting"&&jsxRuntime.jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.submittingText]}),e.phase==="success"&&jsxRuntime.jsx("div",{className:"bf-status",role:"status","aria-live":"polite",children:o.successText}),e.phase==="error"&&he&&jsxRuntime.jsx("div",{className:"bf-error",role:"alert",children:he}),jsxRuntime.jsxs("div",{className:"bf-actions",children:[jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),disabled:E,"aria-label":o.cancelButton,children:o.cancelButton}),jsxRuntime.jsx("button",{type:"button",className:"bf-btn bf-btnPrimary",onClick:ee,disabled:E||f.trim().length===0,"aria-label":o.sendButton,children:o.sendButton})]})]}),c&&jsxRuntime.jsxs("div",{className:"bf-watermark",children:[(()=>{let s=chunkMEMJU6VF_cjs.q();return s?jsxRuntime.jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"bf-my-feedback-link",children:"View my feedback"}):null})(),jsxRuntime.jsx("a",{href:"https://blocfeed.com",target:"_blank",rel:"noopener noreferrer",children:"Powered by BlocFeed"})]})]})]}),e.phase==="recording"&&jsxRuntime.jsxs("div",{className:`bf-recording-bar bf-pos-${l}`,role:"status","aria-live":"polite","data-blocfeed-ui":"true",children:[jsxRuntime.jsx("span",{className:"bf-rec-dot bf-rec-dot-pulse","aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"bf-recording-bar-timer",children:[o.recordingText," ",X(e.recordingElapsedMs??0)," / ",X(mt)]}),jsxRuntime.jsx("button",{type:"button",className:"bf-recording-bar-stop",onClick:()=>i.stopRecording(),"aria-label":o.stopRecordButton,children:o.stopRecordButton})]}),e.phase==="success"&&jsxRuntime.jsxs("div",{className:"bf-toast",role:"status","aria-live":"polite",children:[o.toastText,(()=>{let s=chunkMEMJU6VF_cjs.q();return s?jsxRuntime.jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"bf-toast-link",children:"View my feedback"}):null})()]}),J>0&&!vt&&jsxRuntime.jsxs("div",{className:"bf-security-banner",role:"alert",children:[jsxRuntime.jsx("button",{type:"button",className:"bf-security-banner-dismiss",onClick:()=>yt(true),"aria-label":"Dismiss",children:"\xD7"}),jsxRuntime.jsx("strong",{children:"Security Warning"}),J," potential secret",J>1?"s":""," exposed in client code. Check your environment variables."]})]})}var Oo=react.forwardRef(function(e,i){let r={...e.config??{},blocfeed_id:e.blocfeed_id},[a,p]=react.useState(null),n=zo(r.ui?.showOn),l=Io(r.ui?.theme?.mode),o=!!r.diagnostics;react.useEffect(()=>{if(o)return chunkMEMJU6VF_cjs.u(r.diagnostics),()=>chunkMEMJU6VF_cjs.v()},[o]);let c=!!r.security;react.useEffect(()=>{c&&chunkMEMJU6VF_cjs.y(r.security);},[c]);let x=react.useRef(e.config?.metadata?.enrich);x.current=e.config?.metadata?.enrich;let z=react.useMemo(()=>{if(e.config)return {...e.config,metadata:{...e.config.metadata,enrich:async f=>{let S=x.current,b=S?await S(f):{},T=chunkMEMJU6VF_cjs.w(),m=chunkMEMJU6VF_cjs.z(),C=chunkMEMJU6VF_cjs.j();return {...b,...T.consoleLogs.length>0?{_consoleLogs:T.consoleLogs}:{},...T.networkErrors.length>0?{_networkErrors:T.networkErrors}:{},...m.findings.length>0?{_securityFindings:m.findings}:{},...C.length>0?{_clickEvents:C}:{}}}}}},[]);return react.useEffect(()=>{Me();let f=document.createElement("div");f.setAttribute("data-blocfeed-ui-root","true"),f.setAttribute("data-blocfeed-ui","true"),f.setAttribute("data-bf-theme",l);let S=r.ui?.zIndex;typeof S=="number"&&f.style.setProperty("--bf-z",String(S));let b=r.ui?.theme;b&&(b.accentColor&&f.style.setProperty("--bf-accent",b.accentColor),b.panelBackground&&f.style.setProperty("--bf-panel-bg",b.panelBackground),b.panelForeground&&f.style.setProperty("--bf-panel-fg",b.panelForeground),b.fontFamily&&f.style.setProperty("--bf-font",b.fontFamily));let T=C=>C.stopPropagation(),m=["pointerdown","pointerup","mousedown","mouseup","click","touchstart","touchend"];for(let C of m)f.addEventListener(C,T);try{document.body.appendChild(f);}catch{return}return p(f),()=>{for(let C of m)f.removeEventListener(C,T);f.remove(),p(null);}},[r.ui?.zIndex,r.ui?.theme?.accentColor,r.ui?.theme?.panelBackground,r.ui?.theme?.panelForeground,r.ui?.theme?.fontFamily,l]),!n||!a?null:reactDom.createPortal(jsxRuntime.jsx(ie,{blocfeed_id:r.blocfeed_id,...z?{config:z}:{},children:jsxRuntime.jsx(Ho,{config:r,handleRef:i})}),a)});
885
+ Object.defineProperty(exports,"BehavioralTracker",{enumerable:true,get:function(){return chunkMEMJU6VF_cjs.s}});exports.BlocFeedProvider=ie;exports.BlocFeedWidget=Oo;exports.useBlocFeed=ae;
package/dist/main.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult, d as BehavioralEvent, e as BehavioralConfig } from './controller-CZvGT9Dj.cjs';
2
- export { f as BehavioralEventType, g as BlocFeedError, h as BlocFeedStrings, i as BlocFeedUser, j as CaptureDiagnostics, k as CaptureResult, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, n as FeedbackPayload, I as ImageAsset, M as MaybePromise, o as MetadataConfig, p as MetadataContext, N as NetworkEntry, P as PickerConfig, R as RecordingConfig, q as Rect, r as ScreenshotAdapter, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, v as SecurityConfig, w as SecurityFinding, x as SecuritySnapshot, y as SessionPhase, T as ThemeConfig, z as TransportConfig, A as TransportResult, G as TriggerStyle, V as VideoAsset, H as VideoIntent, J as VideoMime, K as VoiceConfig, W as WidgetPosition } from './controller-CZvGT9Dj.cjs';
1
+ import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult, d as BehavioralEvent, e as BehavioralConfig } from './controller-BLGypDNA.cjs';
2
+ export { f as BehavioralEventType, g as BlocFeedError, h as BlocFeedStrings, i as BlocFeedUser, j as CaptureDiagnostics, k as CaptureResult, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, n as FeedbackPayload, I as ImageAsset, M as MaybePromise, o as MetadataConfig, p as MetadataContext, N as NetworkEntry, P as PickerConfig, R as RecordingConfig, q as Rect, r as ScreenshotAdapter, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, v as SecurityConfig, w as SecurityFinding, x as SecuritySnapshot, y as SessionPhase, T as ThemeConfig, z as TransportConfig, A as TransportResult, G as TriggerStyle, V as VideoAsset, H as VideoIntent, J as VideoMime, K as VoiceConfig, W as WidgetPosition } from './controller-BLGypDNA.cjs';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as react from 'react';
5
5
  import { ReactNode } from 'react';
package/dist/main.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult, d as BehavioralEvent, e as BehavioralConfig } from './controller-CZvGT9Dj.js';
2
- export { f as BehavioralEventType, g as BlocFeedError, h as BlocFeedStrings, i as BlocFeedUser, j as CaptureDiagnostics, k as CaptureResult, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, n as FeedbackPayload, I as ImageAsset, M as MaybePromise, o as MetadataConfig, p as MetadataContext, N as NetworkEntry, P as PickerConfig, R as RecordingConfig, q as Rect, r as ScreenshotAdapter, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, v as SecurityConfig, w as SecurityFinding, x as SecuritySnapshot, y as SessionPhase, T as ThemeConfig, z as TransportConfig, A as TransportResult, G as TriggerStyle, V as VideoAsset, H as VideoIntent, J as VideoMime, K as VoiceConfig, W as WidgetPosition } from './controller-CZvGT9Dj.js';
1
+ import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult, d as BehavioralEvent, e as BehavioralConfig } from './controller-BLGypDNA.js';
2
+ export { f as BehavioralEventType, g as BlocFeedError, h as BlocFeedStrings, i as BlocFeedUser, j as CaptureDiagnostics, k as CaptureResult, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, n as FeedbackPayload, I as ImageAsset, M as MaybePromise, o as MetadataConfig, p as MetadataContext, N as NetworkEntry, P as PickerConfig, R as RecordingConfig, q as Rect, r as ScreenshotAdapter, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, v as SecurityConfig, w as SecurityFinding, x as SecuritySnapshot, y as SessionPhase, T as ThemeConfig, z as TransportConfig, A as TransportResult, G as TriggerStyle, V as VideoAsset, H as VideoIntent, J as VideoMime, K as VoiceConfig, W as WidgetPosition } from './controller-BLGypDNA.js';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as react from 'react';
5
5
  import { ReactNode } from 'react';
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import {u,v,y as y$1,w,z,j,a,t,l,n,i,q,b}from'./chunk-PSQNFGK6.js';export{s as BehavioralTracker}from'./chunk-PSQNFGK6.js';import {createContext,forwardRef,useState,useEffect,useRef,useMemo,useImperativeHandle,useCallback,useContext}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {createPortal}from'react-dom';import {AnimatePresence,motion}from'framer-motion';var Y=createContext(null);function ie(t$1){let e=useMemo(()=>t({...t$1.config??{},blocfeed_id:t$1.blocfeed_id}),[]),[i,r]=useState(()=>e.getState());return useEffect(()=>e.subscribe(r),[e]),useEffect(()=>e.setConfig({...t$1.config??{},blocfeed_id:t$1.blocfeed_id}),[e,t$1.config,t$1.blocfeed_id]),useEffect(()=>()=>e.destroy(),[e]),jsx(Y.Provider,{value:{controller:e,state:i},children:t$1.children})}var Re="blocfeed-styles-v1",It=`
2
+ import {u,v,y as y$1,w,z,j,a,t,l,n,i,q,b}from'./chunk-MENIMIF7.js';export{s as BehavioralTracker}from'./chunk-MENIMIF7.js';import {createContext,forwardRef,useState,useEffect,useRef,useMemo,useImperativeHandle,useCallback,useContext}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {createPortal}from'react-dom';import {AnimatePresence,motion}from'framer-motion';var Y=createContext(null);function ie(t$1){let e=useMemo(()=>t({...t$1.config??{},blocfeed_id:t$1.blocfeed_id}),[]),[i,r]=useState(()=>e.getState());return useEffect(()=>e.subscribe(r),[e]),useEffect(()=>e.setConfig({...t$1.config??{},blocfeed_id:t$1.blocfeed_id}),[e,t$1.config,t$1.blocfeed_id]),useEffect(()=>()=>e.destroy(),[e]),jsx(Y.Provider,{value:{controller:e,state:i},children:t$1.children})}var Re="blocfeed-styles-v1",It=`
3
3
  :where([data-blocfeed-ui-root]),
4
4
  :where([data-blocfeed-ui-root]) * {
5
5
  box-sizing: border-box;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blocfeed",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "Drop-in feedback widget for React — element picking, screenshots, video recording, and voice feedback.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -80,7 +80,8 @@
80
80
  }
81
81
  },
82
82
  "dependencies": {
83
- "html-to-image": "^1.11.11"
83
+ "html-to-image": "^1.11.11",
84
+ "rrweb": "^2.0.0-alpha.20"
84
85
  },
85
86
  "devDependencies": {
86
87
  "@types/react": "^18.2.55",
@@ -1,2 +0,0 @@
1
- 'use strict';function y(){return typeof window<"u"&&typeof document<"u"}function He(e){let t=globalThis.CSS;return typeof t?.escape=="function"?t.escape(e):e.replace(/[^a-zA-Z0-9_-]/g,n=>{let o=n.codePointAt(0);return o===void 0?"":`\\${o.toString(16)} `})}function ve(e){return {x:e.x,y:e.y,width:e.width,height:e.height}}function Dt(e){return {x:e.x+window.scrollX,y:e.y+window.scrollY,width:e.width,height:e.height}}function Nt(e){return e.replace(/\s+/g," ").trim()}function N(e,t=140){let n=e.textContent;if(!n)return;let o=Nt(n);if(o)return o.length<=t?o:`${o.slice(0,t-1)}\u2026`}function Ot(e){let t=1;for(let n=e.previousElementSibling;n;n=n.previousElementSibling)n.tagName===e.tagName&&(t+=1);return t}var $e=["data-testid","data-test-id","data-test","data-qa","data-cy"],qe="data-blocfeed-component";function H(e){let t=e.closest(`[${qe}]`);if(!t)return;let o=t.getAttribute(qe)?.trim();return o||void 0}function K(e,t=5){let n=[],o=e,r=0;for(;o&&r<t*4;){let i=H(o);if(i&&n[n.length-1]!==i&&(n.push(i),n.length>=t))break;o=o.parentElement,r++;}return n}function Ut(e){for(let t of $e){let n=e.closest(`[${t}]`);if(!n)continue;let r=n.getAttribute(t)?.trim();if(r)return r}}function Ve(e){try{let t=e,n=Object.getOwnPropertyNames(t);for(let o of n)if(o.startsWith("__reactFiber$")||o.startsWith("__reactInternalInstance$")){let r=t[o];if(r&&typeof r=="object")return r}}catch{}return null}function $(e){if(e.length<=1||e.length===2&&e[0]===e[0].toLowerCase()||e.startsWith("__")&&e.endsWith("__"))return true;let t=e[0];return t>="a"&&t<="z"}function Y(e){if(e){for(let t of e)if(typeof t.name=="string"&&t.name&&!$(t.name))return t.name}}function M(e){if(e&&typeof e!="string"){if(typeof e=="function"){let t=e;return typeof t.displayName=="string"&&t.displayName?t.displayName:typeof t.name=="string"&&t.name?t.name:void 0}if(typeof e=="object"){let t=e,n=t.displayName;if(typeof n=="string"&&n)return n;let o=t.render;if(typeof o=="function"){let i=o;if(typeof i.displayName=="string"&&i.displayName)return i.displayName;if(typeof i.name=="string"&&i.name)return i.name}let r=t.type;return M(r)}}}function ye(e){let t=Ve(e);if(!t)return;let n=Y(t._debugInfo);if(n)return n;let o=t._debugOwner!==void 0;if(o){let a=t._debugOwner;for(let c=0;a&&c<50;c+=1){let u=Y(a._debugInfo);if(u)return u;let d=M(a.type)??M(a.elementType);if(d&&!$(d))return d;a=a._debugOwner;}}if(t._owner!==void 0&&t._owner!==t._debugOwner){let a=t._owner;for(let c=0;a&&c<50;c+=1){let u=Y(a._debugInfo);if(u)return u;let d=M(a.type)??M(a.elementType);if(d&&!$(d))return d;a=a._owner;}}let i=t,l=o?80:25;for(let a=0;i&&a<l;a+=1){let c=Y(i._debugInfo);if(c)return c;let u=M(i.type)??M(i.elementType);if(u&&!$(u))return u;i=i.return;}let s=e.parentElement;for(let a=0;s&&a<15;a+=1){let c=Ve(s);if(c){let u=Y(c._debugInfo);if(u)return u;let d=M(c.type)??M(c.elementType);if(d&&!$(d))return d;if(c._debugOwner){let p=M(c._debugOwner.type)??M(c._debugOwner.elementType);if(p&&!$(p))return p}if(c._owner&&c._owner!==c._debugOwner){let p=M(c._owner.type)??M(c._owner.elementType);if(p&&!$(p))return p}}s=s.parentElement;}}function Ht(e){let t=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n)return `#${He(n)}`;for(let o of $e){let r=e.getAttribute(o);if(r)return `${t}[${o}="${He(r)}"]`}return `${t}:nth-of-type(${Ot(e)})`}function z(e,t=10){let n=[],o=e;for(;o&&n.length<t;){let r=Ht(o);if(n.unshift(r),r.startsWith("#"))break;o=o.parentElement;}return n.join(" > ")}var qt=new Set(["button","link","tab","menuitem"]);function ze(e){if(e.tagName==="BUTTON")return e.disabled?null:"button";if(e.tagName==="A"||e.tagName==="a"){let n=e.getAttribute("href")?.trim();return !n||n==="#"||n.toLowerCase().startsWith("javascript:")?null:"link"}let t=e.getAttribute("role");if(t&&qt.has(t))return "role";try{if(window.getComputedStyle(e).cursor==="pointer")return "cursor_pointer"}catch{}return null}function Xe(e,t){if(!t||t.length===0)return false;for(let n of t)if(e.closest(n))return true;return false}function Ee(e,t){if(!e||Xe(e,t.ignoreSelectors))return null;let n=e;for(;n;){if(Xe(n,t.ignoreSelectors))return null;if(t.isSelectable?t.isSelectable(n):Vt(n))return n;n=n.parentElement;}return null}function re(e,t){if(t.length===0)return false;for(let n of t)try{if(e.matches(n)||e.closest(n))return !0}catch{}return false}function Vt(e){let t=e.tagName;return !(t==="HTML"||t==="BODY")}function je(e){let t=e.getBoundingClientRect(),n={selector:z(e),tagName:e.tagName.toLowerCase(),rect:ve(t),pageRect:Dt(t)},o=e.getAttribute("id");o&&(n.id=o);let r=e.className;typeof r=="string"&&r.trim()&&(n.className=r);let i=N(e);i&&(n.textSnippet=i);let l=H(e)??ye(e);l&&(n.componentName=l);let s=Ut(e);return s&&(n.testId=s),n}var _e=null;async function Ke(){return _e||(_e=import('html-to-image')),_e}async function Xt(e){return await new Promise((t,n)=>{let o=new Image;o.onload=()=>t({width:o.naturalWidth,height:o.naturalHeight}),o.onerror=()=>n(new Error("Failed to load generated screenshot")),o.src=e;})}async function We(e,t){let{width:n,height:o}=await Xt(e);return {dataUrl:e,mime:t,width:n,height:o}}function W(e){if(e?.aborted)throw new Error("Aborted")}function Ze(){return {async captureElement(e,t){if(!y())throw new Error("captureElement can only run in the browser");W(t.signal);let n=await Ke();W(t.signal);let o=t.mime==="image/jpeg"?await n.toJpeg(e,{quality:t.quality??.92,pixelRatio:t.pixelRatio}):await n.toPng(e,{pixelRatio:t.pixelRatio});return W(t.signal),await We(o,t.mime)},async captureFullPage(e){if(!y())throw new Error("captureFullPage can only run in the browser");W(e.signal);let t=document.documentElement,n=Math.max(t.scrollWidth,t.clientWidth),o=Math.max(t.scrollHeight,t.clientHeight),r=Math.min(1,e.maxDimension/Math.max(n,o)),i=Math.max(1,Math.round(n*r)),l=Math.max(1,Math.round(o*r)),s=await Ke();W(e.signal);let a=e.mime==="image/jpeg"?await s.toJpeg(t,{width:i,height:l,quality:e.quality??.92,pixelRatio:e.pixelRatio}):await s.toPng(t,{width:i,height:l,pixelRatio:e.pixelRatio});return W(e.signal),await We(a,e.mime)}}}function $t(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return "Unknown error"}}function w(e,t,n){let o={kind:e,message:$t(t)};return n&&(o.detail=n),o}var zt=12e3,jt=2048,Kt=.92;function Ge(){return Date.now()}function Wt(e){return new Promise((t,n)=>{let o=()=>n(new Error("Aborted"));if(e.aborted){o();return}e.addEventListener("abort",o,{once:true});})}async function Ye(e,t,n){let o=new Promise((i,l)=>{let s=setTimeout(()=>l(new Error("Timeout")),t);typeof s.unref=="function"&&s.unref();}),r=[e,o];return n&&r.push(Wt(n)),await Promise.race(r)}function Zt(e){if(!y())return 1;let t=window.devicePixelRatio||1,n=e?.pixelRatio??Math.min(t,2);return Math.max(.1,n)}function Gt(e){return !!(e?.element||e?.fullPage)}function Qe(e){let t={mime:e.mime,pixelRatio:e.pixelRatio,maxDimension:e.maxDimension};return e.includeQuality&&(t.quality=e.quality),e.signal&&(t.signal=e.signal),t}async function Je(e){let{selectionElement:t,capture:n,signal:o}=e;if(!y()||!Gt(n))return;let r=Ge(),i=[],l=n?.timeoutMs??zt,s=n?.maxDimension??jt,a=n?.mime??"image/png",c=n?.quality??Kt,u=n?.adapter??Ze(),d={},p=Zt(n);if(n?.element&&t)try{let m=t.getBoundingClientRect(),h=Math.min(1,s/Math.max(m.width,m.height)),E=Math.min(p,p*h),v=await Ye(Promise.resolve(u.captureElement(t,{...Qe({mime:a,quality:c,pixelRatio:E,maxDimension:s,includeQuality:a==="image/jpeg",...o?{signal:o}:{}})})),l,o);d.element=v;}catch(m){if(o?.aborted)throw m;i.push(w("capture_failed",m,{target:"element"}));}if(n?.fullPage)try{let m=await Ye(Promise.resolve(u.captureFullPage(Qe({mime:a,quality:c,pixelRatio:p,maxDimension:s,includeQuality:a==="image/jpeg",...o?{signal:o}:{}}))),l,o);d.fullPage=m;}catch(m){if(o?.aborted)throw m;i.push(w("capture_failed",m,{target:"fullPage"}));}let g=Ge(),f={startedAt:r,finishedAt:g,durationMs:Math.max(0,g-r)};return i.length>0&&(f.errors=i),{...d,diagnostics:f}}function Yt(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function Qt(){return y()?{url:window.location.href,title:document.title,referrer:document.referrer||void 0,userAgent:navigator.userAgent,language:navigator.language,platform:navigator.platform,viewport:{width:window.innerWidth,height:window.innerHeight},screen:{width:window.screen.width,height:window.screen.height},scroll:{x:window.scrollX,y:window.scrollY},devicePixelRatio:window.devicePixelRatio||1,timezone:Yt()}:{}}function Jt(e){if(!e)return {};let t={};return e.id&&(t.userId=e.id),e.email&&(t.userEmail=e.email),e.name&&(t.userName=e.name),t}async function et(e){let{config:t,context:n,user:o}=e;if(t?.enabled===false)return {};let r={...Qt(),...Jt(o)},i=t?.enrich;if(!i)return r;try{let l=await i(n);return {...r,...l}}catch(l){let s=w("unknown",l);return {...r,blocfeedMetadataError:s.message}}}var Q="blocfeed-queue",en=50;function Se(){if(!y())return [];try{let e=localStorage.getItem(Q);if(!e)return [];let t=JSON.parse(e);if(Array.isArray(t))return t;console.warn("[BlocFeed] offline queue was corrupt (non-array) \u2014 resetting");try{localStorage.removeItem(Q);}catch{}return []}catch(e){console.warn("[BlocFeed] offline queue could not be read \u2014 resetting",e);try{localStorage.removeItem(Q);}catch{}return []}}function ke(e){if(y())try{e.length===0?localStorage.removeItem(Q):localStorage.setItem(Q,JSON.stringify(e));}catch(t){let n=t instanceof DOMException?t.name:"";console.warn(`[BlocFeed] failed to persist offline queue${n?` (${n})`:""} \u2014 feedback may be lost if page is closed`);}}function tn(e){let t={...e};if(t.screenshots){let n={...t.screenshots};n.element&&(n.element={...n.element,dataUrl:""}),n.fullPage&&(n.fullPage={...n.fullPage,dataUrl:""}),t.screenshots=n;}return delete t.video,t}function Ce(e){let t=Se(),n=tn(e);for(n.metadata={...n.metadata,_queued:true},t.push({payload:n,timestamp:Date.now()});t.length>en;)t.shift();ke(t);}function tt(){let e=Se();return e.length===0?[]:(ke([]),e.map(t=>t.payload))}function so(){ke([]);}function ao(){return Se().length}var nn=200,J=[],nt=0,ie=false;function ot(e){let t=e.target;if(!(t instanceof Element)||t.closest("[data-blocfeed-ui]"))return;let n={timestampMs:Date.now()-nt,path:window.location.pathname,tagName:t.tagName.toLowerCase()},o=N(t,100);o&&(n.textSnippet=o);let r=H(t)??ye(t);r&&(n.componentName=r),J.length<nn&&J.push(n);}var rt={capture:true,passive:true};function it(){ie||!y()||(ie=true,J=[],nt=Date.now(),document.addEventListener("click",ot,rt));}function st(){ie&&(ie=false,document.removeEventListener("click",ot,rt));}function on(){return [...J]}function rn(){J=[];}var sn=3e4,an=25e5,at="video/webm",cn=250,ln=1e3,un=["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];function ct(){if(typeof MediaRecorder>"u")return null;for(let e of un)if(MediaRecorder.isTypeSupported(e))return e;return null}function dn(){return !y()||typeof navigator?.mediaDevices?.getDisplayMedia!="function"?false:ct()!==null}async function Te(e){let{config:t,signal:n}=e;if(!y()||typeof navigator?.mediaDevices?.getDisplayMedia!="function")throw w("recording_failed",new Error("Screen recording is not supported in this browser"));let o=ct();if(!o)throw w("recording_failed",new Error("No supported video codec found (WebM required)"));if(n?.aborted)throw w("aborted",new Error("Recording aborted before start"));let r;try{r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1});}catch(h){let E=h instanceof DOMException&&h.name==="NotAllowedError"?"Screen share permission denied":"Failed to start screen share";throw w("recording_failed",new Error(E))}if(n?.aborted)throw r.getTracks().forEach(h=>h.stop()),w("aborted",new Error("Recording aborted after permission"));let i=t?.maxDurationMs??sn,l=t?.videoBitsPerSecond??an,s=new MediaRecorder(r,{mimeType:o,videoBitsPerSecond:l}),a=[],c=[],u=0,d=null,p=null,g=false,f=()=>{st(),d!==null&&(clearInterval(d),d=null),p!==null&&(clearTimeout(p),p=null),r.getTracks().forEach(h=>h.stop());},m=new Promise((h,E)=>{s.ondataavailable=C=>{C.data.size>0&&a.push(C.data);},s.onstop=()=>{if(g)return;g=true,f();let C=Date.now()-u,T=new Blob(a,{type:at}),_=URL.createObjectURL(T);h({mime:at,blobUrl:_,blob:T,durationMs:C,sizeBytes:T.size});},s.onerror=()=>{g||(g=true,f(),E(w("recording_failed",new Error("MediaRecorder error"))));};let v=r.getVideoTracks()[0];if(v&&v.addEventListener("ended",()=>{s.state!=="inactive"&&s.stop();}),n){let C=()=>{g||(g=true,s.state!=="inactive"&&s.stop(),f(),E(w("aborted",new Error("Recording aborted"))));};n.addEventListener("abort",C,{once:true});}});return s.start(ln),it(),u=Date.now(),d=setInterval(()=>{let h=Date.now()-u;for(let E of c)E(h);},cn),p=setTimeout(()=>{!g&&s.state!=="inactive"&&s.stop();},i),{result:m,stop(){!g&&s.state!=="inactive"&&s.stop();},onTick(h){c.push(h);},abort(){g||(g=true,s.state!=="inactive"&&s.stop(),f());}}}var fn=6e4,lt="audio/webm",pn=250,mn=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus"];function ut(){if(typeof MediaRecorder>"u")return null;for(let e of mn)if(MediaRecorder.isTypeSupported(e))return e;return null}function gn(){return !y()||typeof navigator?.mediaDevices?.getUserMedia!="function"?false:ut()!==null}async function Re(e){let{config:t,signal:n}=e;if(!y()||typeof navigator?.mediaDevices?.getUserMedia!="function")throw w("recording_failed",new Error("Microphone recording is not supported in this browser"));let o=ut();if(!o)throw w("recording_failed",new Error("No supported audio codec found"));if(n?.aborted)throw w("aborted",new Error("Voice recording aborted before start"));let r;try{r=await navigator.mediaDevices.getUserMedia({audio:!0});}catch(m){let h=m instanceof DOMException&&m.name==="NotAllowedError"?"Microphone permission denied":"Failed to access microphone";throw w("recording_failed",new Error(h))}if(n?.aborted)throw r.getTracks().forEach(m=>m.stop()),w("aborted",new Error("Voice recording aborted after permission"));let i=t?.maxDurationMs??fn,l=new MediaRecorder(r,{mimeType:o}),s=[],a=[],c=0,u=null,d=null,p=false,g=()=>{u!==null&&(clearInterval(u),u=null),d!==null&&(clearTimeout(d),d=null),r.getTracks().forEach(m=>m.stop());},f=new Promise((m,h)=>{if(l.ondataavailable=E=>{E.data.size>0&&s.push(E.data);},l.onstop=()=>{if(p)return;p=true,g();let E=Date.now()-c,v=new Blob(s,{type:lt});m({blob:v,mime:lt,durationMs:E});},l.onerror=()=>{p||(p=true,g(),h(w("recording_failed",new Error("MediaRecorder error"))));},n){let E=()=>{p||(p=true,l.state!=="inactive"&&l.stop(),g(),h(w("aborted",new Error("Voice recording aborted"))));};n.addEventListener("abort",E,{once:true});}});return l.start(1e3),c=Date.now(),u=setInterval(()=>{let m=Date.now()-c;for(let h of a)h(m);},pn),d=setTimeout(()=>{d=null,!p&&l.state!=="inactive"&&l.stop();},i),{result:f,stop(){!p&&l.state!=="inactive"&&l.stop();},onTick(m){a.push(m);},abort(){p||(p=true,l.state!=="inactive"&&l.stop(),g());}}}var hn=12e3,bn=2,wn=500,vn=2e3,xe="https://blocfeed.com/api/feedback",yn="https://blocfeed.com/api/feedback/voice",dt=0,mt="blocfeed-viewer-token",gt="blocfeed-my-feedback-url";function En(){try{return localStorage.getItem(mt)}catch{return null}}function Co(){try{return localStorage.getItem(gt)}catch{return null}}function _n(e,t){try{localStorage.setItem(mt,e),t&&localStorage.setItem(gt,t);}catch{}}function ft(e,t){return new Promise((n,o)=>{if(t?.aborted){o(new Error("Aborted"));return}let r=setTimeout(n,e),i=()=>{clearTimeout(r),o(new Error("Aborted"));};t?.addEventListener("abort",i,{once:true});})}function Sn(e){return e>=500&&e<=599}function kn(e){let[t,n]=e.split(",",2);if(!t||!n)throw new Error("Invalid data URL");let r=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(n),l=new Uint8Array(i.length);for(let s=0;s<i.length;s+=1)l[s]=i.charCodeAt(s);return new Blob([l],{type:r})}function Cn(e){let t={},n={},o={...e};if(o.screenshots){let r={},i={...o.screenshots};i.element&&(t.element=i.element.dataUrl,r.element={mime:i.element.mime,width:i.element.width,height:i.element.height},i.element={...i.element,dataUrl:""}),i.fullPage&&(t.fullPage=i.fullPage.dataUrl,r.fullPage={mime:i.fullPage.mime,width:i.fullPage.width,height:i.fullPage.height},i.fullPage={...i.fullPage,dataUrl:""}),o.screenshots=i,(r.element||r.fullPage)&&(o.screenshot_intent=r);}return o.video&&(n.blob=o.video.blob,o.video_intent={mime:o.video.mime,durationMs:o.video.durationMs,sizeBytes:o.video.sizeBytes},delete o.video),{lean:o,extracted:t,extractedVideo:n}}async function pt(e,t,n){let o=kn(t);await fetch(e,{method:"PUT",body:o,headers:{"content-type":o.type},...n?{signal:n}:{}});}async function Tn(e){let{feedbackId:t,extracted:n,screenshots:o,signal:r}=e,i={};n.element&&o?.element&&(i.element={dataUrl:n.element,mime:o.element.mime,width:o.element.width,height:o.element.height}),n.fullPage&&o?.fullPage&&(i.fullPage={dataUrl:n.fullPage,mime:o.fullPage.mime,width:o.fullPage.width,height:o.fullPage.height}),Object.keys(i).length!==0&&await fetch(`${xe}/${t}/screenshots`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i),...r?{signal:r}:{}});}async function Rn(e){await fetch(`${xe}/${e.feedbackId}/video`,{method:"POST",body:e.blob,headers:{"content-type":e.blob.type},...e.signal?{signal:e.signal}:{}});}async function ht(e){let{signal:t,transport:n}=e;if(Date.now()-dt<vn)return {ok:false,error:w("configuration",new Error("Please wait before submitting again"))};let r=n?.timeoutMs??hn,i=n?.maxAttempts??bn,l=n?.backoffMs??wn,s=!!(e.payload.screenshots?.element?.dataUrl||e.payload.screenshots?.fullPage?.dataUrl),a=!!e.payload.video?.blob,c=s||a,{lean:u,extracted:d,extractedVideo:p}=c?Cn(e.payload):{lean:e.payload,extracted:{},extractedVideo:{}},g=En();g&&(u.viewer_token=g);let f={...d,...e.screenshotDataUrls};for(let m=1;m<=i;m+=1){let h=new AbortController,E=setTimeout(()=>h.abort(),r),v=()=>h.abort();t&&t.addEventListener("abort",v,{once:true});try{let C=await fetch(xe,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(u),signal:h.signal});if(C.ok){dt=Date.now();let _;try{_=await C.json();}catch{}if(_?.viewer_token&&_n(_.viewer_token,_.my_feedback_url),(f.element||f.fullPage)&&_){let L=_.upload_urls;if(L){let q=[];f.element&&L.element&&q.push(pt(L.element,f.element,t)),f.fullPage&&L.fullPage&&q.push(pt(L.fullPage,f.fullPage,t));try{await Promise.all(q);}catch{}}else if(_.feedback_id)try{await Tn({feedbackId:_.feedback_id,extracted:f,screenshots:e.payload.screenshots,...t?{signal:t}:{}});}catch{}}if(p.blob&&_){let L=_.upload_urls;if(L?.video)try{await fetch(L.video,{method:"PUT",body:p.blob,headers:{"content-type":p.blob.type},...t?{signal:t}:{}});}catch{}else if(_.feedback_id)try{await Rn({feedbackId:_.feedback_id,blob:p.blob,...t?{signal:t}:{}});}catch{}}let I={ok:!0,status:C.status};return _&&(I.apiResponse=_),I}if(m<i&&Sn(C.status)){let _=.85+Math.random()*.3,oe=Math.round(l*2**(m-1)*_);await ft(oe,t);continue}let T=`HTTP ${C.status}`;try{let _=await C.json();_?.error&&(T=_.error);}catch{}return {ok:!1,status:C.status,error:w("api_failed",new Error(T))}}catch(C){if(h.signal.aborted||t?.aborted)return {ok:false,error:w("aborted",C)};if(m<i){let T=.85+Math.random()*.3,_=Math.round(l*2**(m-1)*T);await ft(_,t);continue}return {ok:false,error:w("api_failed",C)}}finally{clearTimeout(E),t&&t.removeEventListener("abort",v);}}return {ok:false,error:w("api_failed",new Error("Failed"))}}async function bt(e){let{blob:t,mime:n,blocfeedId:o,signal:r}=e,i=await fetch(yn,{method:"POST",headers:{"Content-Type":n,"X-Blocfeed-Id":o},body:t,...r?{signal:r}:{}});if(!i.ok){let s=await i.json().catch(()=>({error:"Unknown error"}));throw w("api_failed",new Error(s?.error??`Voice API returned ${i.status}`))}let l=await i.json();return {text:l.text??"",warning:l.warning}}var xn={enabled:true,sampling:1,ignoreSelectors:["[data-blocfeed-ui]","[data-blocfeed-ignore]"],rageClick:{enabled:true,threshold:3,windowMs:1e3},httpFail:{enabled:true,statusCodes:[400,401,403,422,500,502,503,504],ignoreUrls:["/api/behavioral-events","/api/feedback"]},redirectLoop:{enabled:true,threshold:3,windowMs:2e3},formDataLoss:{enabled:true},deadClick:{enabled:true,observationWindowMs:300,rateLimitPerSelector:5}};function wt(e){let t=xn;return {enabled:e?.enabled??t.enabled,sampling:e?.sampling??t.sampling,ignoreSelectors:e?.ignoreSelectors??t.ignoreSelectors,rageClick:{...t.rageClick,...e?.rageClick??{}},httpFail:{...t.httpFail,...e?.httpFail??{}},redirectLoop:{...t.redirectLoop,...e?.redirectLoop??{}},formDataLoss:{...t.formDataLoss,...e?.formDataLoss??{}},deadClick:{...t.deadClick,...e?.deadClick??{}}}}function vt(e){let t=[];async function n(){if(t.length===0)return;let r=t.splice(0,50);try{await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-blocfeed-id":e.blocfeedId},body:JSON.stringify({events:r}),keepalive:!0});}catch{}}function o(){if(t.length===0)return;if(typeof navigator>"u"||typeof navigator.sendBeacon!="function"){n();return}let r=t.splice(0,50),i=new Blob([JSON.stringify({events:r})],{type:"application/json"}),l=`${e.endpoint}?_bfid=${encodeURIComponent(e.blocfeedId)}`;try{navigator.sendBeacon(l,i);}catch{}}return {enqueue(r){t.push(r);},flush:n,flushBeacon:o,size(){return t.length}}}var yt="bf_behavioral_session",se=null;function B(){try{let e=sessionStorage.getItem(yt);if(e)return e;let t=Et();return sessionStorage.setItem(yt,t),t}catch{return se||(se=Et(),se)}}function Et(){let e=Math.random().toString(36).slice(2,10).padEnd(8,"0");return `bf_${Date.now()}_${e}`}function _t(e,t){if(!e.rageClick.enabled)return ()=>{};let{threshold:n,windowMs:o}=e.rageClick,r=new Map;function i(l){try{let s=l.target;if(!s||!(s instanceof Element)||re(s,e.ignoreSelectors))return;let a=z(s,4);if(!a)return;let c=Date.now(),d=(r.get(a)??[]).filter(p=>c-p<=o);if(d.push(c),r.set(a,d),d.length>=n){let p=An(s),g=N(s,200)??null,f=s.tagName.toLowerCase(),m=s.id||null,h=H(s)??null,E=K(s,5),v={session_id:B(),event_type:"rage_click",page_url:typeof window>"u"?"":window.location.href,selector:a,element_text:g,event_data:{click_count:d.length,window_ms:o,...p?{disabled:!0}:{},tag_name:f,...m?{element_id:m}:{},...h?{component_name:h}:{},...E.length>0?{parent_components:E}:{}},created_at:new Date().toISOString()};t(v),r.set(a,[]);}}catch{}}return document.addEventListener("click",i,{capture:true,passive:true}),()=>document.removeEventListener("click",i,{capture:true})}function An(e){if(e.hasAttribute("disabled")||e.getAttribute("aria-disabled")==="true")return true;try{if(window.getComputedStyle(e).pointerEvents==="none")return !0}catch{}return false}var kt=0,Ct=null,ae=null,ce=[],Fn=1500;function Mn(){function e(t){try{let n=t.target;if(!n)return;let o=n.closest('button[type="submit"], input[type="submit"], [data-blocfeed-submit]');if(!o)return;kt=Date.now();let r=o.closest("form");Ct=(r?z(r,3):"")||null,ae=N(o,100)??null,ce=K(o,5);}catch{}}return document.addEventListener("click",e,{capture:true,passive:true}),()=>document.removeEventListener("click",e,{capture:true})}function Tt(e,t){if(!e.httpFail.enabled)return ()=>{};let{statusCodes:n,ignoreUrls:o}=e.httpFail,r=new Set(n),i=Mn(),l=globalThis.fetch,s=async(d,p)=>{let g=typeof d=="string"?d:d instanceof URL?d.toString():d.url,f=(p?.method??d.method??"GET").toUpperCase(),m=await l.call(globalThis,d,p);try{!St(g,o)&&r.has(m.status)&&t(u(m.status,g,f));}catch{}return m};globalThis.fetch=s;let a=XMLHttpRequest.prototype.open,c=XMLHttpRequest.prototype.send;return XMLHttpRequest.prototype.open=function(d,p,...g){return this.__bf_url=p,this.__bf_method=d.toUpperCase(),a.call(this,d,p,...g)},XMLHttpRequest.prototype.send=function(d){let p=()=>{try{let g=this.__bf_url??"",f=this.__bf_method??"GET";!St(g,o)&&r.has(this.status)&&t(u(this.status,g,f));}catch{}};return this.__bf_handler=p,this.addEventListener("loadend",p),c.call(this,d??null)},()=>{globalThis.fetch=l,XMLHttpRequest.prototype.open=a,XMLHttpRequest.prototype.send=c,i(),ae=null,ce=[];};function u(d,p,g){let m=Date.now()-kt<Fn;return {session_id:B(),event_type:"error",page_url:typeof window>"u"?"":window.location.href,selector:null,element_text:null,event_data:{http_status:d,request_url:p,method:g,form_selector:m?Ct:null,...m&&ae?{button_text:ae}:{},...m&&ce.length>0?{parent_components:ce}:{}},created_at:new Date().toISOString()}}}function St(e,t){if(t.length===0)return false;for(let n of t)if(e.includes(n))return true;return false}var Ln=3e4;function Rt(e,t){if(!e.redirectLoop.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let{threshold:n,windowMs:o}=e.redirectLoop,r=new Map,i=new Map,l=history.pushState,s=history.replaceState;function a(u){try{let d=Date.now(),p=i.get(u)??0;if(d<p)return;let f=(r.get(u)??[]).filter(m=>d-m<=o);if(f.push(d),r.set(u,f),f.length>=n){let m={session_id:B(),event_type:"thrashing",page_url:window.location.href,selector:null,element_text:null,event_data:{count:f.length,url:u,window_ms:o},created_at:new Date().toISOString()};t(m),i.set(u,d+Ln),r.set(u,[]);}}catch{}}function c(){let u=window.location.pathname+window.location.search;a(u);}return history.pushState=function(...u){let d=l.apply(this,u);return c(),d},history.replaceState=function(...u){let d=s.apply(this,u);return c(),d},window.addEventListener("popstate",c),()=>{history.pushState=l,history.replaceState=s,window.removeEventListener("popstate",c);}}function xt(e,t){if(!e.formDataLoss.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let n=new Set,o=0;function r(c){let u=c.closest("form");return u?u.id?`#${u.id}`:"form":null}function i(c){try{let u=c.target;if(!u||!(u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement||u instanceof HTMLSelectElement))return;let d=r(u);if(!d)return;n.has(d)||n.add(d),o++;}catch{}}function l(c){if(n.size===0)return;let u=Array.from(n),d={session_id:B(),event_type:"form_abandonment",page_url:window.location.href,selector:u[0]??null,element_text:null,event_data:{cause:c,field_count:o,forms:u},created_at:new Date().toISOString()};t(d);}function s(c){c.persisted&&l("bfcache_restore");}function a(){l("beforeunload_after_edit");}return document.addEventListener("input",i,{capture:true,passive:true}),window.addEventListener("pageshow",s),window.addEventListener("beforeunload",a),()=>{document.removeEventListener("input",i,{capture:true}),window.removeEventListener("pageshow",s),window.removeEventListener("beforeunload",a);}}function Pn(){let e={domMutationCount:0,urlChangeCount:0,networkCount:0,uninstall:()=>{}},t=new MutationObserver(()=>{e.domMutationCount+=1;});t.observe(document.body,{childList:true,attributes:true,characterData:true,subtree:true});let n=history.pushState,o=history.replaceState;history.pushState=function(...s){return e.urlChangeCount+=1,n.apply(this,s)},history.replaceState=function(...s){return e.urlChangeCount+=1,o.apply(this,s)};let r=()=>{e.urlChangeCount+=1;};window.addEventListener("popstate",r);let i=globalThis.fetch;if(i){let s=(a,c)=>(e.networkCount+=1,i.call(globalThis,a,c));globalThis.fetch=s;}let l=XMLHttpRequest.prototype.open;return XMLHttpRequest.prototype.open=function(s,a,...c){return e.networkCount+=1,l.call(this,s,a,...c)},e.uninstall=()=>{t.disconnect(),history.pushState=n,history.replaceState=o,window.removeEventListener("popstate",r),i&&(globalThis.fetch=i),XMLHttpRequest.prototype.open=l;},e}function At(e,t){if(!e.deadClick.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let{observationWindowMs:n,rateLimitPerSelector:o}=e.deadClick,r=new Map,i=Pn();function l(s){try{let a=s.target;if(!a||!(a instanceof Element)||s.button!==0||s.metaKey||s.ctrlKey||s.altKey||s.shiftKey||re(a,e.ignoreSelectors)||a.closest("label"))return;if(a instanceof HTMLInputElement){let T=a.type;if(T==="checkbox"||T==="radio"||T==="file")return}if(a instanceof HTMLSelectElement||a.closest("a[target='_blank'], a[download]")||a.closest('[contenteditable="true"]'))return;try{let T=window.getSelection();if(T&&T.toString().length>0)return}catch{}let c=ze(a);if(!c)return;let u=z(a,4);if(!u)return;let d=i.domMutationCount,p=i.urlChangeCount,g=i.networkCount,f=new Date().toISOString(),m=N(a,200)??null,h=a.tagName.toLowerCase(),E=a.id||null,v=H(a)??null,C=K(a,5);setTimeout(()=>{if(i.domMutationCount!==d||i.urlChangeCount!==p||i.networkCount!==g)return;let T=r.get(u)??0;if(T>=o)return;r.set(u,T+1);let _={session_id:B(),event_type:"dead_click",page_url:typeof window>"u"?"":window.location.href,selector:u,element_text:m,event_data:{tag_name:h,...E?{element_id:E}:{},...v?{component_name:v}:{},...C.length>0?{parent_components:C}:{},clickable_reason:c},created_at:f};t(_);},n);}catch{}}return document.addEventListener("click",l,{capture:true,passive:true}),()=>{document.removeEventListener("click",l,{capture:true}),i.uninstall();}}var Bn=5e3,le=class{constructor(t){this.submitter=null;this.detectorUninstallers=[];this.flushTimer=null;this.pageHideHandler=null;this.installed=false;this.opts=t,this.resolved=wt(t.config);}install(){if(this.installed||!this.resolved.enabled||!(this.opts.passiveSampler??(()=>Math.random()<this.resolved.sampling))())return;let n=this.opts.endpoint??"https://blocfeed.com/api/behavioral-events";this.submitter=this.opts.submitter??vt({endpoint:n,blocfeedId:this.opts.blocfeedId});let o=r=>{this.submitter?.enqueue(r);};this.detectorUninstallers.push(_t(this.resolved,o)),this.detectorUninstallers.push(Tt(this.resolved,o)),this.detectorUninstallers.push(Rt(this.resolved,o)),this.detectorUninstallers.push(xt(this.resolved,o)),this.detectorUninstallers.push(At(this.resolved,o)),this.flushTimer=setInterval(()=>{this.submitter?.flush();},Bn),this.pageHideHandler=()=>{this.submitter?.flushBeacon();},typeof window<"u"&&window.addEventListener("pagehide",this.pageHideHandler),this.installed=true;}uninstall(){if(this.installed){for(let t of [...this.detectorUninstallers].reverse())try{t();}catch{}this.detectorUninstallers=[],this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.pageHideHandler&&typeof window<"u"&&(window.removeEventListener("pagehide",this.pageHideHandler),this.pageHideHandler=null);try{this.submitter?.flush();}catch{}this.submitter=null,this.installed=false;}}};function Ae(e){let t=null,n=null,o=(...r)=>{n=r,t===null&&(t=requestAnimationFrame(()=>{if(t=null,!n)return;let i=n;n=null,e(...i);}));};return o.cancel=()=>{t!==null&&cancelAnimationFrame(t),t=null,n=null;},o}function ue(e){return e instanceof Element?!!e.closest("[data-blocfeed-ui]"):false}function de(e){e.stopPropagation(),e.stopImmediatePropagation?.();}function Ft(e,t){if(!y())throw new Error("BlocFeed picker can only run in a browser environment.");let n=e.ignoreSelectors,o=e.isSelectable,r={};n&&n.length>0&&(r.ignoreSelectors=n),o&&(r.isSelectable=o);let i=null,l=null,s=(f,m=false)=>{if(!f){i=null,l=null,t.onHover(null);return}let h=ve(f.getBoundingClientRect()),E=`${Math.round(h.x)}:${Math.round(h.y)}:${Math.round(h.width)}:${Math.round(h.height)}`;!m&&f===i&&E===l||(i=f,l=E,t.onHover({element:f,rect:h}));},a=Ae(f=>{if(ue(f.target))return;let m=document.elementFromPoint(f.clientX,f.clientY),h=Ee(m,r);s(h);}),c=Ae(()=>{i&&s(i,true);}),u=f=>{ue(f.target)||(de(f),f.pointerType==="mouse"&&f.preventDefault());},d=f=>{ue(f.target)||(de(f),f.pointerType==="mouse"&&f.preventDefault());},p=f=>{if(ue(f.target))return;de(f),f.preventDefault();let m=document.elementFromPoint(f.clientX,f.clientY),h=Ee(m,r);h&&t.onSelect({element:h,descriptor:je(h)});},g=f=>{f.key==="Escape"&&(de(f),f.preventDefault(),t.onCancel());};return window.addEventListener("pointermove",a,{capture:true,passive:true}),window.addEventListener("pointerdown",u,{capture:true}),window.addEventListener("pointerup",d,{capture:true}),window.addEventListener("click",p,{capture:true}),window.addEventListener("keydown",g,{capture:true}),window.addEventListener("scroll",c,{capture:true,passive:true}),window.addEventListener("resize",c,{passive:true}),{stop(){window.removeEventListener("pointermove",a,{capture:true}),window.removeEventListener("pointerdown",u,{capture:true}),window.removeEventListener("pointerup",d,{capture:true}),window.removeEventListener("click",p,{capture:true}),window.removeEventListener("keydown",g,{capture:true}),window.removeEventListener("scroll",c,{capture:true}),window.removeEventListener("resize",c),a.cancel(),c.cancel(),t.onHover(null);}}}async function Fe(e){let{signal:t,transport:n}=e,o={ok:false};try{let r={payload:e.payload,...t?{signal:t}:{},...n?{transport:n}:{}};o.api=await ht(r),o.ok=!!o.api?.ok;}catch(r){o.api={ok:false,error:w("api_failed",r)},o.ok=false;}return {payload:e.payload,result:o}}var In=["[data-blocfeed-ui]","[data-blocfeed-ignore]"];function Dn(e){let t=[...In,...e?.ignoreSelectors??[]],n=Array.from(new Set(t));return {...e,ignoreSelectors:n}}function Mt(){return {phase:"idle"}}function Nn(e){if(e.ok)return false;let t=e.api;return t?t.status&&t.status>=400&&t.status<500||t.error?.kind==="aborted"||t.error?.kind==="configuration"?false:!t.ok:true}function hr(e){let t=e,n=new le({blocfeedId:t.blocfeed_id??"",...t.behavioral!==void 0?{config:t.behavioral}:{}});n.install();let o=Mt(),r=new Set,i=new Set,l=null,s=null,a=null,c=null,u=0,d=null,p=null,g=null,f=null,m=false,h=()=>{for(let b of r)b(o);},E=b=>{for(let S of i)S(b);},v=b=>{o=b,h();},C=()=>{u+=1,c?.abort(),c=null;},T=()=>{l?.stop(),l=null,E(null),a!==null&&y()&&(document.documentElement.style.cursor=a,a=null);},_=()=>{if(g){try{URL.revokeObjectURL(g.blobUrl);}catch{}g=null;}},oe=()=>{p&&(p.abort(),p=null),_();},I=null,L=()=>{f&&(f.abort(),f=null),I&&(I.abort(),I=null);},q=()=>{C(),T(),oe(),L(),s=null,v(Mt());},Ne=()=>{if(!y())return;T(),s=null;let b=Dn(t.picker);a=document.documentElement.style.cursor,document.documentElement.style.cursor="crosshair",v({phase:"picking"}),l=Ft(b,{onHover:E,onSelect:({element:S,descriptor:F})=>{s=S,T(),v({phase:"review",selection:F});},onCancel:()=>{q();}});},Oe=()=>{let b=tt();if(b.length!==0)for(let S of b)Fe({payload:S,...t.transport?{transport:t.transport}:{}}).catch(()=>{Ce(S);});};if(y()){setTimeout(Oe,1e3);let b=()=>Oe();window.addEventListener("online",b),d=()=>window.removeEventListener("online",b);}return {getState:()=>o,getConfig:()=>t,subscribe(b){return r.add(b),()=>r.delete(b)},subscribeHover(b){return i.add(b),()=>i.delete(b)},start(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||o.phase!=="picking"&&Ne();},stop(){q();},clearSelection(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||Ne();},setConfig(b){t=b;},async submit(b,S){if(!y()){let R=w("configuration",new Error("BlocFeed submit can only run in the browser"));return v({phase:"error",lastError:R}),{ok:false}}let F=t.blocfeed_id?.trim?.()??"";if(!F){let P={phase:"error",lastError:w("configuration",new Error("Missing blocfeed_id. Create a project in BlocFeed and pass its blocfeed_id."))};return o.selection&&(P.selection=o.selection),v(P),{ok:false}}if(m)return {ok:false};if(o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording")return {ok:false};m=true;let A=u+1;u=A,c?.abort(),c=new AbortController;let x=c.signal,k=o.selection,D=S?.capture?{...t.capture,...S.capture}:t.capture,V=!!(D?.element||D?.fullPage),Z={phase:V?"capturing":"submitting"};k&&(Z.selection=k),v(Z);try{let R=V?await Je({selectionElement:s,capture:D,signal:x}):void 0;if(x.aborted||u!==A)return {ok:!1};let P={phase:"submitting"};k&&(P.selection=k),R&&(P.capture=R),v(P);let O={};k&&(O.selection=k),R&&(O.capture=R);let G=await et({config:t.metadata,context:O,...t.user?{user:t.user}:{}}),X={version:1,createdAt:new Date().toISOString(),blocfeed_id:F,message:b,metadata:G};S?.category&&(X.category=S.category),t.user&&(X.user=t.user),k&&(X.selection=k),R&&(X.screenshots=R),g&&(X.video=g);let{result:U}=await Fe({payload:X,signal:x,...t.transport?{transport:t.transport}:{}});if(x.aborted||u!==A)return U;if(U.ok){_(),s=null;let we={phase:"success",lastSubmit:U};return k&&(we.selection=k),R&&(we.capture=R),v(we),U}Nn(U)&&Ce(X);let It=U.api?.error??w("unknown",new Error("Submission failed")),be={phase:"error",lastSubmit:U,lastError:It};return k&&(be.selection=k),R&&(be.capture=R),v(be),U}catch(R){if(x.aborted||u!==A)return {ok:false};let O={phase:"error",lastError:x.aborted?w("aborted",R):w("unknown",R)};return k&&(O.selection=k),v(O),{ok:false}}finally{m=false,u===A&&(c=null);}},async startRecording(){if(o.phase!=="review"||!t.recording?.enabled||f||p)return;let b=o.selection,S={phase:"recording",recordingElapsedMs:0};b&&(S.selection=b),v(S);try{let F={config:t.recording};c&&(F.signal=c.signal);let A=await Te(F);p=A,A.onTick(D=>{if(o.phase==="recording"){let V={phase:"recording",recordingElapsedMs:D};b&&(V.selection=b),v(V);}});let x=await A.result;p=null,g=x;let k={phase:"review",video:x};b&&(k.selection=b),v(k);}catch(F){p=null;let x={phase:"review",lastError:F?.kind?F:w("recording_failed",F)};b&&(x.selection=b),v(x);}},stopRecording(){o.phase!=="recording"||!p||p.stop();},removeVideo(){_();let b=o.selection,S={phase:"review"};b&&(S.selection=b),v(S);},async startVoice(){if(o.phase!=="review"){console.warn("[BlocFeed] startVoice: ignored \u2014 phase is",o.phase,'(expected "review")');return}let b=t.voice;if(!b?.enabled){console.warn("[BlocFeed] startVoice: ignored \u2014 voice is not enabled in config");return}if(p){console.warn("[BlocFeed] startVoice: ignored \u2014 a screen recording is already in progress");return}L();let S=o.selection,F={phase:"review",voiceRecording:true,voiceElapsedMs:0};S&&(F.selection=S),g&&(F.video=g),v(F);try{let A={config:b};c&&(A.signal=c.signal);let x=await Re(A);f=x,x.onTick(O=>{let G={phase:"review",voiceRecording:!0,voiceElapsedMs:O};S&&(G.selection=S),g&&(G.video=g),v(G);});let k=await x.result;f=null;let D={phase:"review",voiceRecording:!1,voiceTranscribing:!0};S&&(D.selection=S),g&&(D.video=g),v(D),I=new AbortController;let V={blob:k.blob,mime:k.mime,blocfeedId:t.blocfeed_id,signal:I.signal},{text:Ue,warning:Z}=await bt(V);I=null;let R={phase:"review",voiceRecording:!1,voiceTranscribing:!1};S&&(R.selection=S),g&&(R.video=g),v(R);let P={text:Ue};return Z&&(P.warning=Z),P}catch(A){L();let x=A?.kind?A:w("recording_failed",A);console.warn("[BlocFeed] Voice error:",x.message);let k={phase:"review",voiceRecording:false,voiceTranscribing:false,lastError:x};S&&(k.selection=S),g&&(k.video=g),v(k);return}},stopVoice(){f&&f.stop();},__unsafeGetSelectedElement(){return s},destroy(){n.uninstall(),q(),r.clear(),i.clear(),d?.(),d=null;}}}var ee=[],te=[],Lt=20,Pt=15,fe=[],Bt=typeof console<"u"?{log:console.log?.bind(console),warn:console.warn?.bind(console),error:console.error?.bind(console),info:console.info?.bind(console),debug:console.debug?.bind(console)}:{},pe=typeof globalThis<"u"&&typeof globalThis.fetch=="function"?globalThis.fetch:void 0,me=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.open:void 0,ge=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.send:void 0,Le=new Set,Pe=false,Be=false,he=false,On=["blocfeed.com","google-analytics.com","googletagmanager.com","analytics.google.com","googleads.g.doubleclick.net","googlesyndication.com","googleadservices.com","google.com/pagead","google.com/ads","facebook.net","facebook.com/tr","connect.facebook.net","graph.facebook.com","api.mixpanel.com","api-js.mixpanel.com","api.amplitude.com","api2.amplitude.com","api.segment.io","cdn.segment.com","vars.hotjar.com","in.hotjar.com","script.hotjar.com","heapanalytics.com","fullstory.com/s/fs.js","rs.fullstory.com","app.posthog.com","us.posthog.com","eu.posthog.com","api-iam.intercom.io","widget.intercom.io","sentry.io/api","browser.sentry-cdn.com","browser-intake-datadoghq.com","clarity.ms","js.hs-analytics.net","api.hubapi.com","forms.hubspot.com","plausible.io/api","client.crisp.chat","js.driftt.com","r.logrocket.com","app.pendo.io","events.launchdarkly.com","app.launchdarkly.com","grammarly.com","gnar.grammarly.com","capi.grammarly.com","api.languagetool.org","api.languagetoolplus.com","fonts.googleapis.com","fonts.gstatic.com","cdn.cookielaw.org","consent.cookiebot.com","js.stripe.com","api.stripe.com/v1/tokens","google.com/recaptcha","hcaptcha.com","bam.nr-data.net","rec.smartlook.com","o2.mouseflow.com","api.luckyorange.com","static.zdassets.com","ekr.zdassets.com"];function Un(e){if(e instanceof Error)return e.name&&e.name!=="Error"?`${e.name}: ${e.message}`:e.message||String(e);if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Hn(e,t){let n=t.map(Un).join(" "),o=t.find(i=>i instanceof Error),r={level:e,message:n.slice(0,2e3),timestamp:Date.now()};for(o?.stack&&(r.stack=o.stack.slice(0,2e3)),ee.push(r);ee.length>Lt;)ee.shift();}function Me(e){let t=e.url.toLowerCase();for(let n of fe)if(t.includes(n))return;for(te.push(e);te.length>Pt;)te.shift();}function vr(e={}){if(he||!y())return;he=true,Lt=e.consoleLimit??20,Pt=e.networkLimit??15;let t=e.ignoreUrls;if(t!==void 0?fe=t.map(n=>n.toLowerCase()):fe=[...On],e.console!==false){let n=e.consoleLevels??["error","warn"];for(let o of n){let r=Bt[o];r&&(Le.add(o),console[o]=(...i)=>{Hn(o,i),r.apply(console,i);});}}if(e.network!==false&&pe){let n=pe;Pe=true,window.fetch=async function(r,i){let l=typeof r=="string"?r:r instanceof URL?r.toString():r.url,s=(i?.method??"GET").toUpperCase(),a=Date.now();try{let c=await n.call(window,r,i);return c.ok||Me({url:l.slice(0,500),method:s,status:c.status,statusText:c.statusText,timestamp:a,durationMs:Date.now()-a}),c}catch(c){throw Me({url:l.slice(0,500),method:s,status:0,statusText:c instanceof Error?c.message:"Network error",timestamp:a,durationMs:Date.now()-a}),c}};}if(e.network!==false&&me&&ge){let n=me,o=ge;Be=true,XMLHttpRequest.prototype.open=function(r,i,...l){return this.__bf_method=r.toUpperCase(),this.__bf_url=String(i),n.apply(this,[r,i,...l])},XMLHttpRequest.prototype.send=function(...r){let i=this.__bf_method||"GET",l=this.__bf_url||"",s=Date.now();return this.addEventListener("loadend",function(){if(this.status>=400||this.status===0){let a={url:l.slice(0,500),method:i,status:this.status,timestamp:s,durationMs:Date.now()-s};this.statusText&&(a.statusText=this.statusText),Me(a);}},{once:true}),o.apply(this,r)};}}function yr(){if(he){for(let e of Le){let t=Bt[e];t&&(console[e]=t);}Le.clear(),Pe&&pe&&(window.fetch=pe,Pe=false),Be&&me&&ge&&(XMLHttpRequest.prototype.open=me,XMLHttpRequest.prototype.send=ge,Be=false),fe=[],he=false;}}function Er(){return {consoleLogs:[...ee],networkErrors:[...te]}}function _r(){ee=[],te=[];}var qn=[{name:"supabase_service_role_key",pattern:/SUPABASE_SERVICE_ROLE_KEY["'=:\s]{1,8}[A-Za-z0-9_.=-]{30,400}/},{name:"supabase_db_password",pattern:/SUPABASE_DB_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"postgres_password",pattern:/POSTGRES_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"database_url_with_creds",pattern:/(?:postgres|postgresql|mysql|mongodb|redis|amqp):\/\/[^:\s"']{1,100}:[^@\s"']{1,200}@/},{name:"aws_access_key",pattern:/AKIA[0-9A-Z]{16}/},{name:"aws_secret_key",pattern:/AWS_SECRET_ACCESS_KEY["'=:\s]{1,8}[A-Za-z0-9/+=]{30,200}/},{name:"aws_session_token",pattern:/AWS_SESSION_TOKEN["'=:\s]{1,8}[A-Za-z0-9/+=]{30,600}/},{name:"stripe_secret_key",pattern:/sk_live_[a-zA-Z0-9]{10,200}/},{name:"stripe_secret_key_test",pattern:/sk_test_[a-zA-Z0-9]{10,200}/},{name:"stripe_restricted_key",pattern:/rk_(?:live|test)_[a-zA-Z0-9]{10,200}/},{name:"github_pat",pattern:/ghp_[A-Za-z0-9_]{36,100}/},{name:"github_oauth",pattern:/gho_[A-Za-z0-9_]{36,100}/},{name:"github_user_token",pattern:/ghu_[A-Za-z0-9_]{36,100}/},{name:"github_server_token",pattern:/ghs_[A-Za-z0-9_]{36,100}/},{name:"github_fine_grained",pattern:/github_pat_[A-Za-z0-9_]{22,200}/},{name:"openai_api_key",pattern:/sk-[a-zA-Z0-9]{20,200}(?![a-zA-Z0-9_])/},{name:"anthropic_api_key",pattern:/sk-ant-[a-zA-Z0-9\-_]{20,200}/},{name:"private_key",pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"sendgrid_api_key",pattern:/SG\.[a-zA-Z0-9_-]{22,100}\.[a-zA-Z0-9_-]{22,100}/},{name:"twilio_auth_token",pattern:/TWILIO_AUTH_TOKEN["'=:\s]{1,8}[a-f0-9]{32}/},{name:"generic_secret_key",pattern:/[A-Z_]{2,60}_SECRET_KEY["'=:\s]{1,8}[^\s"']{8,200}/},{name:"generic_secret",pattern:/[A-Z_]{2,60}_SECRET["'=:\s]{1,8}[^\s"']{8,200}/},{name:"generic_password",pattern:/[A-Z_]{2,60}_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"generic_private_key_var",pattern:/[A-Z_]{2,60}_PRIVATE_KEY["'=:\s]{1,8}[^\s"']{8,400}/}],j=[],De=0,Ie=false;function Vn(e){let t=e.slice(0,80);return t.length<=6?"***":t.slice(0,6)+"***"}function Xn(e,t,n,o){if(j.some(l=>l.rule===e&&l.source===t))return;let i={rule:e,source:t,hint:Vn(n),timestamp:Date.now()};o&&(i.location=o),j.push(i);}function ne(e,t,n,o){for(let{name:r,pattern:i}of n){let l=i.exec(e);l&&Xn(r,t,l[0],o);}}function $n(e){try{let t=window;if(t.__NEXT_DATA__){let n=JSON.stringify(t.__NEXT_DATA__);ne(n,"hydration",e,"__NEXT_DATA__");}if(t.__NUXT__){let n=JSON.stringify(t.__NUXT__);ne(n,"hydration",e,"__NUXT__");}}catch{}}function zn(e){try{document.querySelectorAll("script:not([src])").forEach((n,o)=>{let r=n.textContent;r&&r.length>0&&ne(r,"scripts",e,`inline-script[${o}]`);});}catch{}}function jn(e){try{document.querySelectorAll("meta[content]").forEach(n=>{let o=n.getAttribute("content"),r=n.getAttribute("name")||n.getAttribute("property")||"";o&&o.length>10&&ne(o,"meta",e,r?`meta[${r}]`:void 0);});}catch{}}function Kn(e){try{document.querySelectorAll("[data-api-key], [data-secret], [data-token], [data-password]").forEach(n=>{let o=n.attributes;for(let r=0;r<o.length;r++){let i=o[r];i.name.startsWith("data-")&&i.value.length>10&&ne(i.value,"dom",e,`${n.tagName.toLowerCase()}[${i.name}]`);}});}catch{}}function Cr(e={}){if(Ie||!y()||(Ie=true,e.secretScan===false))return;let t=[...qn,...e.customPatterns??[]],n=e.scanTargets??["hydration","scripts","meta","dom"];setTimeout(()=>{De=Date.now(),n.includes("hydration")&&$n(t),n.includes("scripts")&&zn(t),n.includes("meta")&&jn(t),n.includes("dom")&&Kn(t);let o=e.notify??"both";j.length>0&&(o==="console"||o==="both")&&console.warn(`[BlocFeed Security] Found ${j.length} potential secret(s) exposed in client code:`,j.map(r=>`${r.rule} (${r.source}${r.location?`: ${r.location}`:""})`));},100);}function Tr(){return {findings:[...j],scannedAt:De}}function Rr(){j=[],De=0,Ie=false;}
2
- exports.A=Rr;exports.a=y;exports.b=ve;exports.c=Ze;exports.d=Je;exports.e=et;exports.f=Ce;exports.g=tt;exports.h=so;exports.i=ao;exports.j=on;exports.k=rn;exports.l=dn;exports.m=Te;exports.n=gn;exports.o=Re;exports.p=En;exports.q=Co;exports.r=bt;exports.s=le;exports.t=hr;exports.u=vr;exports.v=yr;exports.w=Er;exports.x=_r;exports.y=Cr;exports.z=Tr;
@@ -1,2 +0,0 @@
1
- function y(){return typeof window<"u"&&typeof document<"u"}function He(e){let t=globalThis.CSS;return typeof t?.escape=="function"?t.escape(e):e.replace(/[^a-zA-Z0-9_-]/g,n=>{let o=n.codePointAt(0);return o===void 0?"":`\\${o.toString(16)} `})}function ve(e){return {x:e.x,y:e.y,width:e.width,height:e.height}}function Dt(e){return {x:e.x+window.scrollX,y:e.y+window.scrollY,width:e.width,height:e.height}}function Nt(e){return e.replace(/\s+/g," ").trim()}function N(e,t=140){let n=e.textContent;if(!n)return;let o=Nt(n);if(o)return o.length<=t?o:`${o.slice(0,t-1)}\u2026`}function Ot(e){let t=1;for(let n=e.previousElementSibling;n;n=n.previousElementSibling)n.tagName===e.tagName&&(t+=1);return t}var $e=["data-testid","data-test-id","data-test","data-qa","data-cy"],qe="data-blocfeed-component";function H(e){let t=e.closest(`[${qe}]`);if(!t)return;let o=t.getAttribute(qe)?.trim();return o||void 0}function K(e,t=5){let n=[],o=e,r=0;for(;o&&r<t*4;){let i=H(o);if(i&&n[n.length-1]!==i&&(n.push(i),n.length>=t))break;o=o.parentElement,r++;}return n}function Ut(e){for(let t of $e){let n=e.closest(`[${t}]`);if(!n)continue;let r=n.getAttribute(t)?.trim();if(r)return r}}function Ve(e){try{let t=e,n=Object.getOwnPropertyNames(t);for(let o of n)if(o.startsWith("__reactFiber$")||o.startsWith("__reactInternalInstance$")){let r=t[o];if(r&&typeof r=="object")return r}}catch{}return null}function $(e){if(e.length<=1||e.length===2&&e[0]===e[0].toLowerCase()||e.startsWith("__")&&e.endsWith("__"))return true;let t=e[0];return t>="a"&&t<="z"}function Y(e){if(e){for(let t of e)if(typeof t.name=="string"&&t.name&&!$(t.name))return t.name}}function M(e){if(e&&typeof e!="string"){if(typeof e=="function"){let t=e;return typeof t.displayName=="string"&&t.displayName?t.displayName:typeof t.name=="string"&&t.name?t.name:void 0}if(typeof e=="object"){let t=e,n=t.displayName;if(typeof n=="string"&&n)return n;let o=t.render;if(typeof o=="function"){let i=o;if(typeof i.displayName=="string"&&i.displayName)return i.displayName;if(typeof i.name=="string"&&i.name)return i.name}let r=t.type;return M(r)}}}function ye(e){let t=Ve(e);if(!t)return;let n=Y(t._debugInfo);if(n)return n;let o=t._debugOwner!==void 0;if(o){let a=t._debugOwner;for(let c=0;a&&c<50;c+=1){let u=Y(a._debugInfo);if(u)return u;let d=M(a.type)??M(a.elementType);if(d&&!$(d))return d;a=a._debugOwner;}}if(t._owner!==void 0&&t._owner!==t._debugOwner){let a=t._owner;for(let c=0;a&&c<50;c+=1){let u=Y(a._debugInfo);if(u)return u;let d=M(a.type)??M(a.elementType);if(d&&!$(d))return d;a=a._owner;}}let i=t,l=o?80:25;for(let a=0;i&&a<l;a+=1){let c=Y(i._debugInfo);if(c)return c;let u=M(i.type)??M(i.elementType);if(u&&!$(u))return u;i=i.return;}let s=e.parentElement;for(let a=0;s&&a<15;a+=1){let c=Ve(s);if(c){let u=Y(c._debugInfo);if(u)return u;let d=M(c.type)??M(c.elementType);if(d&&!$(d))return d;if(c._debugOwner){let p=M(c._debugOwner.type)??M(c._debugOwner.elementType);if(p&&!$(p))return p}if(c._owner&&c._owner!==c._debugOwner){let p=M(c._owner.type)??M(c._owner.elementType);if(p&&!$(p))return p}}s=s.parentElement;}}function Ht(e){let t=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n)return `#${He(n)}`;for(let o of $e){let r=e.getAttribute(o);if(r)return `${t}[${o}="${He(r)}"]`}return `${t}:nth-of-type(${Ot(e)})`}function z(e,t=10){let n=[],o=e;for(;o&&n.length<t;){let r=Ht(o);if(n.unshift(r),r.startsWith("#"))break;o=o.parentElement;}return n.join(" > ")}var qt=new Set(["button","link","tab","menuitem"]);function ze(e){if(e.tagName==="BUTTON")return e.disabled?null:"button";if(e.tagName==="A"||e.tagName==="a"){let n=e.getAttribute("href")?.trim();return !n||n==="#"||n.toLowerCase().startsWith("javascript:")?null:"link"}let t=e.getAttribute("role");if(t&&qt.has(t))return "role";try{if(window.getComputedStyle(e).cursor==="pointer")return "cursor_pointer"}catch{}return null}function Xe(e,t){if(!t||t.length===0)return false;for(let n of t)if(e.closest(n))return true;return false}function Ee(e,t){if(!e||Xe(e,t.ignoreSelectors))return null;let n=e;for(;n;){if(Xe(n,t.ignoreSelectors))return null;if(t.isSelectable?t.isSelectable(n):Vt(n))return n;n=n.parentElement;}return null}function re(e,t){if(t.length===0)return false;for(let n of t)try{if(e.matches(n)||e.closest(n))return !0}catch{}return false}function Vt(e){let t=e.tagName;return !(t==="HTML"||t==="BODY")}function je(e){let t=e.getBoundingClientRect(),n={selector:z(e),tagName:e.tagName.toLowerCase(),rect:ve(t),pageRect:Dt(t)},o=e.getAttribute("id");o&&(n.id=o);let r=e.className;typeof r=="string"&&r.trim()&&(n.className=r);let i=N(e);i&&(n.textSnippet=i);let l=H(e)??ye(e);l&&(n.componentName=l);let s=Ut(e);return s&&(n.testId=s),n}var _e=null;async function Ke(){return _e||(_e=import('html-to-image')),_e}async function Xt(e){return await new Promise((t,n)=>{let o=new Image;o.onload=()=>t({width:o.naturalWidth,height:o.naturalHeight}),o.onerror=()=>n(new Error("Failed to load generated screenshot")),o.src=e;})}async function We(e,t){let{width:n,height:o}=await Xt(e);return {dataUrl:e,mime:t,width:n,height:o}}function W(e){if(e?.aborted)throw new Error("Aborted")}function Ze(){return {async captureElement(e,t){if(!y())throw new Error("captureElement can only run in the browser");W(t.signal);let n=await Ke();W(t.signal);let o=t.mime==="image/jpeg"?await n.toJpeg(e,{quality:t.quality??.92,pixelRatio:t.pixelRatio}):await n.toPng(e,{pixelRatio:t.pixelRatio});return W(t.signal),await We(o,t.mime)},async captureFullPage(e){if(!y())throw new Error("captureFullPage can only run in the browser");W(e.signal);let t=document.documentElement,n=Math.max(t.scrollWidth,t.clientWidth),o=Math.max(t.scrollHeight,t.clientHeight),r=Math.min(1,e.maxDimension/Math.max(n,o)),i=Math.max(1,Math.round(n*r)),l=Math.max(1,Math.round(o*r)),s=await Ke();W(e.signal);let a=e.mime==="image/jpeg"?await s.toJpeg(t,{width:i,height:l,quality:e.quality??.92,pixelRatio:e.pixelRatio}):await s.toPng(t,{width:i,height:l,pixelRatio:e.pixelRatio});return W(e.signal),await We(a,e.mime)}}}function $t(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return "Unknown error"}}function w(e,t,n){let o={kind:e,message:$t(t)};return n&&(o.detail=n),o}var zt=12e3,jt=2048,Kt=.92;function Ge(){return Date.now()}function Wt(e){return new Promise((t,n)=>{let o=()=>n(new Error("Aborted"));if(e.aborted){o();return}e.addEventListener("abort",o,{once:true});})}async function Ye(e,t,n){let o=new Promise((i,l)=>{let s=setTimeout(()=>l(new Error("Timeout")),t);typeof s.unref=="function"&&s.unref();}),r=[e,o];return n&&r.push(Wt(n)),await Promise.race(r)}function Zt(e){if(!y())return 1;let t=window.devicePixelRatio||1,n=e?.pixelRatio??Math.min(t,2);return Math.max(.1,n)}function Gt(e){return !!(e?.element||e?.fullPage)}function Qe(e){let t={mime:e.mime,pixelRatio:e.pixelRatio,maxDimension:e.maxDimension};return e.includeQuality&&(t.quality=e.quality),e.signal&&(t.signal=e.signal),t}async function Je(e){let{selectionElement:t,capture:n,signal:o}=e;if(!y()||!Gt(n))return;let r=Ge(),i=[],l=n?.timeoutMs??zt,s=n?.maxDimension??jt,a=n?.mime??"image/png",c=n?.quality??Kt,u=n?.adapter??Ze(),d={},p=Zt(n);if(n?.element&&t)try{let m=t.getBoundingClientRect(),h=Math.min(1,s/Math.max(m.width,m.height)),E=Math.min(p,p*h),v=await Ye(Promise.resolve(u.captureElement(t,{...Qe({mime:a,quality:c,pixelRatio:E,maxDimension:s,includeQuality:a==="image/jpeg",...o?{signal:o}:{}})})),l,o);d.element=v;}catch(m){if(o?.aborted)throw m;i.push(w("capture_failed",m,{target:"element"}));}if(n?.fullPage)try{let m=await Ye(Promise.resolve(u.captureFullPage(Qe({mime:a,quality:c,pixelRatio:p,maxDimension:s,includeQuality:a==="image/jpeg",...o?{signal:o}:{}}))),l,o);d.fullPage=m;}catch(m){if(o?.aborted)throw m;i.push(w("capture_failed",m,{target:"fullPage"}));}let g=Ge(),f={startedAt:r,finishedAt:g,durationMs:Math.max(0,g-r)};return i.length>0&&(f.errors=i),{...d,diagnostics:f}}function Yt(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function Qt(){return y()?{url:window.location.href,title:document.title,referrer:document.referrer||void 0,userAgent:navigator.userAgent,language:navigator.language,platform:navigator.platform,viewport:{width:window.innerWidth,height:window.innerHeight},screen:{width:window.screen.width,height:window.screen.height},scroll:{x:window.scrollX,y:window.scrollY},devicePixelRatio:window.devicePixelRatio||1,timezone:Yt()}:{}}function Jt(e){if(!e)return {};let t={};return e.id&&(t.userId=e.id),e.email&&(t.userEmail=e.email),e.name&&(t.userName=e.name),t}async function et(e){let{config:t,context:n,user:o}=e;if(t?.enabled===false)return {};let r={...Qt(),...Jt(o)},i=t?.enrich;if(!i)return r;try{let l=await i(n);return {...r,...l}}catch(l){let s=w("unknown",l);return {...r,blocfeedMetadataError:s.message}}}var Q="blocfeed-queue",en=50;function Se(){if(!y())return [];try{let e=localStorage.getItem(Q);if(!e)return [];let t=JSON.parse(e);if(Array.isArray(t))return t;console.warn("[BlocFeed] offline queue was corrupt (non-array) \u2014 resetting");try{localStorage.removeItem(Q);}catch{}return []}catch(e){console.warn("[BlocFeed] offline queue could not be read \u2014 resetting",e);try{localStorage.removeItem(Q);}catch{}return []}}function ke(e){if(y())try{e.length===0?localStorage.removeItem(Q):localStorage.setItem(Q,JSON.stringify(e));}catch(t){let n=t instanceof DOMException?t.name:"";console.warn(`[BlocFeed] failed to persist offline queue${n?` (${n})`:""} \u2014 feedback may be lost if page is closed`);}}function tn(e){let t={...e};if(t.screenshots){let n={...t.screenshots};n.element&&(n.element={...n.element,dataUrl:""}),n.fullPage&&(n.fullPage={...n.fullPage,dataUrl:""}),t.screenshots=n;}return delete t.video,t}function Ce(e){let t=Se(),n=tn(e);for(n.metadata={...n.metadata,_queued:true},t.push({payload:n,timestamp:Date.now()});t.length>en;)t.shift();ke(t);}function tt(){let e=Se();return e.length===0?[]:(ke([]),e.map(t=>t.payload))}function so(){ke([]);}function ao(){return Se().length}var nn=200,J=[],nt=0,ie=false;function ot(e){let t=e.target;if(!(t instanceof Element)||t.closest("[data-blocfeed-ui]"))return;let n={timestampMs:Date.now()-nt,path:window.location.pathname,tagName:t.tagName.toLowerCase()},o=N(t,100);o&&(n.textSnippet=o);let r=H(t)??ye(t);r&&(n.componentName=r),J.length<nn&&J.push(n);}var rt={capture:true,passive:true};function it(){ie||!y()||(ie=true,J=[],nt=Date.now(),document.addEventListener("click",ot,rt));}function st(){ie&&(ie=false,document.removeEventListener("click",ot,rt));}function on(){return [...J]}function rn(){J=[];}var sn=3e4,an=25e5,at="video/webm",cn=250,ln=1e3,un=["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];function ct(){if(typeof MediaRecorder>"u")return null;for(let e of un)if(MediaRecorder.isTypeSupported(e))return e;return null}function dn(){return !y()||typeof navigator?.mediaDevices?.getDisplayMedia!="function"?false:ct()!==null}async function Te(e){let{config:t,signal:n}=e;if(!y()||typeof navigator?.mediaDevices?.getDisplayMedia!="function")throw w("recording_failed",new Error("Screen recording is not supported in this browser"));let o=ct();if(!o)throw w("recording_failed",new Error("No supported video codec found (WebM required)"));if(n?.aborted)throw w("aborted",new Error("Recording aborted before start"));let r;try{r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1});}catch(h){let E=h instanceof DOMException&&h.name==="NotAllowedError"?"Screen share permission denied":"Failed to start screen share";throw w("recording_failed",new Error(E))}if(n?.aborted)throw r.getTracks().forEach(h=>h.stop()),w("aborted",new Error("Recording aborted after permission"));let i=t?.maxDurationMs??sn,l=t?.videoBitsPerSecond??an,s=new MediaRecorder(r,{mimeType:o,videoBitsPerSecond:l}),a=[],c=[],u=0,d=null,p=null,g=false,f=()=>{st(),d!==null&&(clearInterval(d),d=null),p!==null&&(clearTimeout(p),p=null),r.getTracks().forEach(h=>h.stop());},m=new Promise((h,E)=>{s.ondataavailable=C=>{C.data.size>0&&a.push(C.data);},s.onstop=()=>{if(g)return;g=true,f();let C=Date.now()-u,T=new Blob(a,{type:at}),_=URL.createObjectURL(T);h({mime:at,blobUrl:_,blob:T,durationMs:C,sizeBytes:T.size});},s.onerror=()=>{g||(g=true,f(),E(w("recording_failed",new Error("MediaRecorder error"))));};let v=r.getVideoTracks()[0];if(v&&v.addEventListener("ended",()=>{s.state!=="inactive"&&s.stop();}),n){let C=()=>{g||(g=true,s.state!=="inactive"&&s.stop(),f(),E(w("aborted",new Error("Recording aborted"))));};n.addEventListener("abort",C,{once:true});}});return s.start(ln),it(),u=Date.now(),d=setInterval(()=>{let h=Date.now()-u;for(let E of c)E(h);},cn),p=setTimeout(()=>{!g&&s.state!=="inactive"&&s.stop();},i),{result:m,stop(){!g&&s.state!=="inactive"&&s.stop();},onTick(h){c.push(h);},abort(){g||(g=true,s.state!=="inactive"&&s.stop(),f());}}}var fn=6e4,lt="audio/webm",pn=250,mn=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus"];function ut(){if(typeof MediaRecorder>"u")return null;for(let e of mn)if(MediaRecorder.isTypeSupported(e))return e;return null}function gn(){return !y()||typeof navigator?.mediaDevices?.getUserMedia!="function"?false:ut()!==null}async function Re(e){let{config:t,signal:n}=e;if(!y()||typeof navigator?.mediaDevices?.getUserMedia!="function")throw w("recording_failed",new Error("Microphone recording is not supported in this browser"));let o=ut();if(!o)throw w("recording_failed",new Error("No supported audio codec found"));if(n?.aborted)throw w("aborted",new Error("Voice recording aborted before start"));let r;try{r=await navigator.mediaDevices.getUserMedia({audio:!0});}catch(m){let h=m instanceof DOMException&&m.name==="NotAllowedError"?"Microphone permission denied":"Failed to access microphone";throw w("recording_failed",new Error(h))}if(n?.aborted)throw r.getTracks().forEach(m=>m.stop()),w("aborted",new Error("Voice recording aborted after permission"));let i=t?.maxDurationMs??fn,l=new MediaRecorder(r,{mimeType:o}),s=[],a=[],c=0,u=null,d=null,p=false,g=()=>{u!==null&&(clearInterval(u),u=null),d!==null&&(clearTimeout(d),d=null),r.getTracks().forEach(m=>m.stop());},f=new Promise((m,h)=>{if(l.ondataavailable=E=>{E.data.size>0&&s.push(E.data);},l.onstop=()=>{if(p)return;p=true,g();let E=Date.now()-c,v=new Blob(s,{type:lt});m({blob:v,mime:lt,durationMs:E});},l.onerror=()=>{p||(p=true,g(),h(w("recording_failed",new Error("MediaRecorder error"))));},n){let E=()=>{p||(p=true,l.state!=="inactive"&&l.stop(),g(),h(w("aborted",new Error("Voice recording aborted"))));};n.addEventListener("abort",E,{once:true});}});return l.start(1e3),c=Date.now(),u=setInterval(()=>{let m=Date.now()-c;for(let h of a)h(m);},pn),d=setTimeout(()=>{d=null,!p&&l.state!=="inactive"&&l.stop();},i),{result:f,stop(){!p&&l.state!=="inactive"&&l.stop();},onTick(m){a.push(m);},abort(){p||(p=true,l.state!=="inactive"&&l.stop(),g());}}}var hn=12e3,bn=2,wn=500,vn=2e3,xe="https://blocfeed.com/api/feedback",yn="https://blocfeed.com/api/feedback/voice",dt=0,mt="blocfeed-viewer-token",gt="blocfeed-my-feedback-url";function En(){try{return localStorage.getItem(mt)}catch{return null}}function Co(){try{return localStorage.getItem(gt)}catch{return null}}function _n(e,t){try{localStorage.setItem(mt,e),t&&localStorage.setItem(gt,t);}catch{}}function ft(e,t){return new Promise((n,o)=>{if(t?.aborted){o(new Error("Aborted"));return}let r=setTimeout(n,e),i=()=>{clearTimeout(r),o(new Error("Aborted"));};t?.addEventListener("abort",i,{once:true});})}function Sn(e){return e>=500&&e<=599}function kn(e){let[t,n]=e.split(",",2);if(!t||!n)throw new Error("Invalid data URL");let r=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(n),l=new Uint8Array(i.length);for(let s=0;s<i.length;s+=1)l[s]=i.charCodeAt(s);return new Blob([l],{type:r})}function Cn(e){let t={},n={},o={...e};if(o.screenshots){let r={},i={...o.screenshots};i.element&&(t.element=i.element.dataUrl,r.element={mime:i.element.mime,width:i.element.width,height:i.element.height},i.element={...i.element,dataUrl:""}),i.fullPage&&(t.fullPage=i.fullPage.dataUrl,r.fullPage={mime:i.fullPage.mime,width:i.fullPage.width,height:i.fullPage.height},i.fullPage={...i.fullPage,dataUrl:""}),o.screenshots=i,(r.element||r.fullPage)&&(o.screenshot_intent=r);}return o.video&&(n.blob=o.video.blob,o.video_intent={mime:o.video.mime,durationMs:o.video.durationMs,sizeBytes:o.video.sizeBytes},delete o.video),{lean:o,extracted:t,extractedVideo:n}}async function pt(e,t,n){let o=kn(t);await fetch(e,{method:"PUT",body:o,headers:{"content-type":o.type},...n?{signal:n}:{}});}async function Tn(e){let{feedbackId:t,extracted:n,screenshots:o,signal:r}=e,i={};n.element&&o?.element&&(i.element={dataUrl:n.element,mime:o.element.mime,width:o.element.width,height:o.element.height}),n.fullPage&&o?.fullPage&&(i.fullPage={dataUrl:n.fullPage,mime:o.fullPage.mime,width:o.fullPage.width,height:o.fullPage.height}),Object.keys(i).length!==0&&await fetch(`${xe}/${t}/screenshots`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i),...r?{signal:r}:{}});}async function Rn(e){await fetch(`${xe}/${e.feedbackId}/video`,{method:"POST",body:e.blob,headers:{"content-type":e.blob.type},...e.signal?{signal:e.signal}:{}});}async function ht(e){let{signal:t,transport:n}=e;if(Date.now()-dt<vn)return {ok:false,error:w("configuration",new Error("Please wait before submitting again"))};let r=n?.timeoutMs??hn,i=n?.maxAttempts??bn,l=n?.backoffMs??wn,s=!!(e.payload.screenshots?.element?.dataUrl||e.payload.screenshots?.fullPage?.dataUrl),a=!!e.payload.video?.blob,c=s||a,{lean:u,extracted:d,extractedVideo:p}=c?Cn(e.payload):{lean:e.payload,extracted:{},extractedVideo:{}},g=En();g&&(u.viewer_token=g);let f={...d,...e.screenshotDataUrls};for(let m=1;m<=i;m+=1){let h=new AbortController,E=setTimeout(()=>h.abort(),r),v=()=>h.abort();t&&t.addEventListener("abort",v,{once:true});try{let C=await fetch(xe,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(u),signal:h.signal});if(C.ok){dt=Date.now();let _;try{_=await C.json();}catch{}if(_?.viewer_token&&_n(_.viewer_token,_.my_feedback_url),(f.element||f.fullPage)&&_){let L=_.upload_urls;if(L){let q=[];f.element&&L.element&&q.push(pt(L.element,f.element,t)),f.fullPage&&L.fullPage&&q.push(pt(L.fullPage,f.fullPage,t));try{await Promise.all(q);}catch{}}else if(_.feedback_id)try{await Tn({feedbackId:_.feedback_id,extracted:f,screenshots:e.payload.screenshots,...t?{signal:t}:{}});}catch{}}if(p.blob&&_){let L=_.upload_urls;if(L?.video)try{await fetch(L.video,{method:"PUT",body:p.blob,headers:{"content-type":p.blob.type},...t?{signal:t}:{}});}catch{}else if(_.feedback_id)try{await Rn({feedbackId:_.feedback_id,blob:p.blob,...t?{signal:t}:{}});}catch{}}let I={ok:!0,status:C.status};return _&&(I.apiResponse=_),I}if(m<i&&Sn(C.status)){let _=.85+Math.random()*.3,oe=Math.round(l*2**(m-1)*_);await ft(oe,t);continue}let T=`HTTP ${C.status}`;try{let _=await C.json();_?.error&&(T=_.error);}catch{}return {ok:!1,status:C.status,error:w("api_failed",new Error(T))}}catch(C){if(h.signal.aborted||t?.aborted)return {ok:false,error:w("aborted",C)};if(m<i){let T=.85+Math.random()*.3,_=Math.round(l*2**(m-1)*T);await ft(_,t);continue}return {ok:false,error:w("api_failed",C)}}finally{clearTimeout(E),t&&t.removeEventListener("abort",v);}}return {ok:false,error:w("api_failed",new Error("Failed"))}}async function bt(e){let{blob:t,mime:n,blocfeedId:o,signal:r}=e,i=await fetch(yn,{method:"POST",headers:{"Content-Type":n,"X-Blocfeed-Id":o},body:t,...r?{signal:r}:{}});if(!i.ok){let s=await i.json().catch(()=>({error:"Unknown error"}));throw w("api_failed",new Error(s?.error??`Voice API returned ${i.status}`))}let l=await i.json();return {text:l.text??"",warning:l.warning}}var xn={enabled:true,sampling:1,ignoreSelectors:["[data-blocfeed-ui]","[data-blocfeed-ignore]"],rageClick:{enabled:true,threshold:3,windowMs:1e3},httpFail:{enabled:true,statusCodes:[400,401,403,422,500,502,503,504],ignoreUrls:["/api/behavioral-events","/api/feedback"]},redirectLoop:{enabled:true,threshold:3,windowMs:2e3},formDataLoss:{enabled:true},deadClick:{enabled:true,observationWindowMs:300,rateLimitPerSelector:5}};function wt(e){let t=xn;return {enabled:e?.enabled??t.enabled,sampling:e?.sampling??t.sampling,ignoreSelectors:e?.ignoreSelectors??t.ignoreSelectors,rageClick:{...t.rageClick,...e?.rageClick??{}},httpFail:{...t.httpFail,...e?.httpFail??{}},redirectLoop:{...t.redirectLoop,...e?.redirectLoop??{}},formDataLoss:{...t.formDataLoss,...e?.formDataLoss??{}},deadClick:{...t.deadClick,...e?.deadClick??{}}}}function vt(e){let t=[];async function n(){if(t.length===0)return;let r=t.splice(0,50);try{await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-blocfeed-id":e.blocfeedId},body:JSON.stringify({events:r}),keepalive:!0});}catch{}}function o(){if(t.length===0)return;if(typeof navigator>"u"||typeof navigator.sendBeacon!="function"){n();return}let r=t.splice(0,50),i=new Blob([JSON.stringify({events:r})],{type:"application/json"}),l=`${e.endpoint}?_bfid=${encodeURIComponent(e.blocfeedId)}`;try{navigator.sendBeacon(l,i);}catch{}}return {enqueue(r){t.push(r);},flush:n,flushBeacon:o,size(){return t.length}}}var yt="bf_behavioral_session",se=null;function B(){try{let e=sessionStorage.getItem(yt);if(e)return e;let t=Et();return sessionStorage.setItem(yt,t),t}catch{return se||(se=Et(),se)}}function Et(){let e=Math.random().toString(36).slice(2,10).padEnd(8,"0");return `bf_${Date.now()}_${e}`}function _t(e,t){if(!e.rageClick.enabled)return ()=>{};let{threshold:n,windowMs:o}=e.rageClick,r=new Map;function i(l){try{let s=l.target;if(!s||!(s instanceof Element)||re(s,e.ignoreSelectors))return;let a=z(s,4);if(!a)return;let c=Date.now(),d=(r.get(a)??[]).filter(p=>c-p<=o);if(d.push(c),r.set(a,d),d.length>=n){let p=An(s),g=N(s,200)??null,f=s.tagName.toLowerCase(),m=s.id||null,h=H(s)??null,E=K(s,5),v={session_id:B(),event_type:"rage_click",page_url:typeof window>"u"?"":window.location.href,selector:a,element_text:g,event_data:{click_count:d.length,window_ms:o,...p?{disabled:!0}:{},tag_name:f,...m?{element_id:m}:{},...h?{component_name:h}:{},...E.length>0?{parent_components:E}:{}},created_at:new Date().toISOString()};t(v),r.set(a,[]);}}catch{}}return document.addEventListener("click",i,{capture:true,passive:true}),()=>document.removeEventListener("click",i,{capture:true})}function An(e){if(e.hasAttribute("disabled")||e.getAttribute("aria-disabled")==="true")return true;try{if(window.getComputedStyle(e).pointerEvents==="none")return !0}catch{}return false}var kt=0,Ct=null,ae=null,ce=[],Fn=1500;function Mn(){function e(t){try{let n=t.target;if(!n)return;let o=n.closest('button[type="submit"], input[type="submit"], [data-blocfeed-submit]');if(!o)return;kt=Date.now();let r=o.closest("form");Ct=(r?z(r,3):"")||null,ae=N(o,100)??null,ce=K(o,5);}catch{}}return document.addEventListener("click",e,{capture:true,passive:true}),()=>document.removeEventListener("click",e,{capture:true})}function Tt(e,t){if(!e.httpFail.enabled)return ()=>{};let{statusCodes:n,ignoreUrls:o}=e.httpFail,r=new Set(n),i=Mn(),l=globalThis.fetch,s=async(d,p)=>{let g=typeof d=="string"?d:d instanceof URL?d.toString():d.url,f=(p?.method??d.method??"GET").toUpperCase(),m=await l.call(globalThis,d,p);try{!St(g,o)&&r.has(m.status)&&t(u(m.status,g,f));}catch{}return m};globalThis.fetch=s;let a=XMLHttpRequest.prototype.open,c=XMLHttpRequest.prototype.send;return XMLHttpRequest.prototype.open=function(d,p,...g){return this.__bf_url=p,this.__bf_method=d.toUpperCase(),a.call(this,d,p,...g)},XMLHttpRequest.prototype.send=function(d){let p=()=>{try{let g=this.__bf_url??"",f=this.__bf_method??"GET";!St(g,o)&&r.has(this.status)&&t(u(this.status,g,f));}catch{}};return this.__bf_handler=p,this.addEventListener("loadend",p),c.call(this,d??null)},()=>{globalThis.fetch=l,XMLHttpRequest.prototype.open=a,XMLHttpRequest.prototype.send=c,i(),ae=null,ce=[];};function u(d,p,g){let m=Date.now()-kt<Fn;return {session_id:B(),event_type:"error",page_url:typeof window>"u"?"":window.location.href,selector:null,element_text:null,event_data:{http_status:d,request_url:p,method:g,form_selector:m?Ct:null,...m&&ae?{button_text:ae}:{},...m&&ce.length>0?{parent_components:ce}:{}},created_at:new Date().toISOString()}}}function St(e,t){if(t.length===0)return false;for(let n of t)if(e.includes(n))return true;return false}var Ln=3e4;function Rt(e,t){if(!e.redirectLoop.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let{threshold:n,windowMs:o}=e.redirectLoop,r=new Map,i=new Map,l=history.pushState,s=history.replaceState;function a(u){try{let d=Date.now(),p=i.get(u)??0;if(d<p)return;let f=(r.get(u)??[]).filter(m=>d-m<=o);if(f.push(d),r.set(u,f),f.length>=n){let m={session_id:B(),event_type:"thrashing",page_url:window.location.href,selector:null,element_text:null,event_data:{count:f.length,url:u,window_ms:o},created_at:new Date().toISOString()};t(m),i.set(u,d+Ln),r.set(u,[]);}}catch{}}function c(){let u=window.location.pathname+window.location.search;a(u);}return history.pushState=function(...u){let d=l.apply(this,u);return c(),d},history.replaceState=function(...u){let d=s.apply(this,u);return c(),d},window.addEventListener("popstate",c),()=>{history.pushState=l,history.replaceState=s,window.removeEventListener("popstate",c);}}function xt(e,t){if(!e.formDataLoss.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let n=new Set,o=0;function r(c){let u=c.closest("form");return u?u.id?`#${u.id}`:"form":null}function i(c){try{let u=c.target;if(!u||!(u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement||u instanceof HTMLSelectElement))return;let d=r(u);if(!d)return;n.has(d)||n.add(d),o++;}catch{}}function l(c){if(n.size===0)return;let u=Array.from(n),d={session_id:B(),event_type:"form_abandonment",page_url:window.location.href,selector:u[0]??null,element_text:null,event_data:{cause:c,field_count:o,forms:u},created_at:new Date().toISOString()};t(d);}function s(c){c.persisted&&l("bfcache_restore");}function a(){l("beforeunload_after_edit");}return document.addEventListener("input",i,{capture:true,passive:true}),window.addEventListener("pageshow",s),window.addEventListener("beforeunload",a),()=>{document.removeEventListener("input",i,{capture:true}),window.removeEventListener("pageshow",s),window.removeEventListener("beforeunload",a);}}function Pn(){let e={domMutationCount:0,urlChangeCount:0,networkCount:0,uninstall:()=>{}},t=new MutationObserver(()=>{e.domMutationCount+=1;});t.observe(document.body,{childList:true,attributes:true,characterData:true,subtree:true});let n=history.pushState,o=history.replaceState;history.pushState=function(...s){return e.urlChangeCount+=1,n.apply(this,s)},history.replaceState=function(...s){return e.urlChangeCount+=1,o.apply(this,s)};let r=()=>{e.urlChangeCount+=1;};window.addEventListener("popstate",r);let i=globalThis.fetch;if(i){let s=(a,c)=>(e.networkCount+=1,i.call(globalThis,a,c));globalThis.fetch=s;}let l=XMLHttpRequest.prototype.open;return XMLHttpRequest.prototype.open=function(s,a,...c){return e.networkCount+=1,l.call(this,s,a,...c)},e.uninstall=()=>{t.disconnect(),history.pushState=n,history.replaceState=o,window.removeEventListener("popstate",r),i&&(globalThis.fetch=i),XMLHttpRequest.prototype.open=l;},e}function At(e,t){if(!e.deadClick.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let{observationWindowMs:n,rateLimitPerSelector:o}=e.deadClick,r=new Map,i=Pn();function l(s){try{let a=s.target;if(!a||!(a instanceof Element)||s.button!==0||s.metaKey||s.ctrlKey||s.altKey||s.shiftKey||re(a,e.ignoreSelectors)||a.closest("label"))return;if(a instanceof HTMLInputElement){let T=a.type;if(T==="checkbox"||T==="radio"||T==="file")return}if(a instanceof HTMLSelectElement||a.closest("a[target='_blank'], a[download]")||a.closest('[contenteditable="true"]'))return;try{let T=window.getSelection();if(T&&T.toString().length>0)return}catch{}let c=ze(a);if(!c)return;let u=z(a,4);if(!u)return;let d=i.domMutationCount,p=i.urlChangeCount,g=i.networkCount,f=new Date().toISOString(),m=N(a,200)??null,h=a.tagName.toLowerCase(),E=a.id||null,v=H(a)??null,C=K(a,5);setTimeout(()=>{if(i.domMutationCount!==d||i.urlChangeCount!==p||i.networkCount!==g)return;let T=r.get(u)??0;if(T>=o)return;r.set(u,T+1);let _={session_id:B(),event_type:"dead_click",page_url:typeof window>"u"?"":window.location.href,selector:u,element_text:m,event_data:{tag_name:h,...E?{element_id:E}:{},...v?{component_name:v}:{},...C.length>0?{parent_components:C}:{},clickable_reason:c},created_at:f};t(_);},n);}catch{}}return document.addEventListener("click",l,{capture:true,passive:true}),()=>{document.removeEventListener("click",l,{capture:true}),i.uninstall();}}var Bn=5e3,le=class{constructor(t){this.submitter=null;this.detectorUninstallers=[];this.flushTimer=null;this.pageHideHandler=null;this.installed=false;this.opts=t,this.resolved=wt(t.config);}install(){if(this.installed||!this.resolved.enabled||!(this.opts.passiveSampler??(()=>Math.random()<this.resolved.sampling))())return;let n=this.opts.endpoint??"https://blocfeed.com/api/behavioral-events";this.submitter=this.opts.submitter??vt({endpoint:n,blocfeedId:this.opts.blocfeedId});let o=r=>{this.submitter?.enqueue(r);};this.detectorUninstallers.push(_t(this.resolved,o)),this.detectorUninstallers.push(Tt(this.resolved,o)),this.detectorUninstallers.push(Rt(this.resolved,o)),this.detectorUninstallers.push(xt(this.resolved,o)),this.detectorUninstallers.push(At(this.resolved,o)),this.flushTimer=setInterval(()=>{this.submitter?.flush();},Bn),this.pageHideHandler=()=>{this.submitter?.flushBeacon();},typeof window<"u"&&window.addEventListener("pagehide",this.pageHideHandler),this.installed=true;}uninstall(){if(this.installed){for(let t of [...this.detectorUninstallers].reverse())try{t();}catch{}this.detectorUninstallers=[],this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.pageHideHandler&&typeof window<"u"&&(window.removeEventListener("pagehide",this.pageHideHandler),this.pageHideHandler=null);try{this.submitter?.flush();}catch{}this.submitter=null,this.installed=false;}}};function Ae(e){let t=null,n=null,o=(...r)=>{n=r,t===null&&(t=requestAnimationFrame(()=>{if(t=null,!n)return;let i=n;n=null,e(...i);}));};return o.cancel=()=>{t!==null&&cancelAnimationFrame(t),t=null,n=null;},o}function ue(e){return e instanceof Element?!!e.closest("[data-blocfeed-ui]"):false}function de(e){e.stopPropagation(),e.stopImmediatePropagation?.();}function Ft(e,t){if(!y())throw new Error("BlocFeed picker can only run in a browser environment.");let n=e.ignoreSelectors,o=e.isSelectable,r={};n&&n.length>0&&(r.ignoreSelectors=n),o&&(r.isSelectable=o);let i=null,l=null,s=(f,m=false)=>{if(!f){i=null,l=null,t.onHover(null);return}let h=ve(f.getBoundingClientRect()),E=`${Math.round(h.x)}:${Math.round(h.y)}:${Math.round(h.width)}:${Math.round(h.height)}`;!m&&f===i&&E===l||(i=f,l=E,t.onHover({element:f,rect:h}));},a=Ae(f=>{if(ue(f.target))return;let m=document.elementFromPoint(f.clientX,f.clientY),h=Ee(m,r);s(h);}),c=Ae(()=>{i&&s(i,true);}),u=f=>{ue(f.target)||(de(f),f.pointerType==="mouse"&&f.preventDefault());},d=f=>{ue(f.target)||(de(f),f.pointerType==="mouse"&&f.preventDefault());},p=f=>{if(ue(f.target))return;de(f),f.preventDefault();let m=document.elementFromPoint(f.clientX,f.clientY),h=Ee(m,r);h&&t.onSelect({element:h,descriptor:je(h)});},g=f=>{f.key==="Escape"&&(de(f),f.preventDefault(),t.onCancel());};return window.addEventListener("pointermove",a,{capture:true,passive:true}),window.addEventListener("pointerdown",u,{capture:true}),window.addEventListener("pointerup",d,{capture:true}),window.addEventListener("click",p,{capture:true}),window.addEventListener("keydown",g,{capture:true}),window.addEventListener("scroll",c,{capture:true,passive:true}),window.addEventListener("resize",c,{passive:true}),{stop(){window.removeEventListener("pointermove",a,{capture:true}),window.removeEventListener("pointerdown",u,{capture:true}),window.removeEventListener("pointerup",d,{capture:true}),window.removeEventListener("click",p,{capture:true}),window.removeEventListener("keydown",g,{capture:true}),window.removeEventListener("scroll",c,{capture:true}),window.removeEventListener("resize",c),a.cancel(),c.cancel(),t.onHover(null);}}}async function Fe(e){let{signal:t,transport:n}=e,o={ok:false};try{let r={payload:e.payload,...t?{signal:t}:{},...n?{transport:n}:{}};o.api=await ht(r),o.ok=!!o.api?.ok;}catch(r){o.api={ok:false,error:w("api_failed",r)},o.ok=false;}return {payload:e.payload,result:o}}var In=["[data-blocfeed-ui]","[data-blocfeed-ignore]"];function Dn(e){let t=[...In,...e?.ignoreSelectors??[]],n=Array.from(new Set(t));return {...e,ignoreSelectors:n}}function Mt(){return {phase:"idle"}}function Nn(e){if(e.ok)return false;let t=e.api;return t?t.status&&t.status>=400&&t.status<500||t.error?.kind==="aborted"||t.error?.kind==="configuration"?false:!t.ok:true}function hr(e){let t=e,n=new le({blocfeedId:t.blocfeed_id??"",...t.behavioral!==void 0?{config:t.behavioral}:{}});n.install();let o=Mt(),r=new Set,i=new Set,l=null,s=null,a=null,c=null,u=0,d=null,p=null,g=null,f=null,m=false,h=()=>{for(let b of r)b(o);},E=b=>{for(let S of i)S(b);},v=b=>{o=b,h();},C=()=>{u+=1,c?.abort(),c=null;},T=()=>{l?.stop(),l=null,E(null),a!==null&&y()&&(document.documentElement.style.cursor=a,a=null);},_=()=>{if(g){try{URL.revokeObjectURL(g.blobUrl);}catch{}g=null;}},oe=()=>{p&&(p.abort(),p=null),_();},I=null,L=()=>{f&&(f.abort(),f=null),I&&(I.abort(),I=null);},q=()=>{C(),T(),oe(),L(),s=null,v(Mt());},Ne=()=>{if(!y())return;T(),s=null;let b=Dn(t.picker);a=document.documentElement.style.cursor,document.documentElement.style.cursor="crosshair",v({phase:"picking"}),l=Ft(b,{onHover:E,onSelect:({element:S,descriptor:F})=>{s=S,T(),v({phase:"review",selection:F});},onCancel:()=>{q();}});},Oe=()=>{let b=tt();if(b.length!==0)for(let S of b)Fe({payload:S,...t.transport?{transport:t.transport}:{}}).catch(()=>{Ce(S);});};if(y()){setTimeout(Oe,1e3);let b=()=>Oe();window.addEventListener("online",b),d=()=>window.removeEventListener("online",b);}return {getState:()=>o,getConfig:()=>t,subscribe(b){return r.add(b),()=>r.delete(b)},subscribeHover(b){return i.add(b),()=>i.delete(b)},start(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||o.phase!=="picking"&&Ne();},stop(){q();},clearSelection(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||Ne();},setConfig(b){t=b;},async submit(b,S){if(!y()){let R=w("configuration",new Error("BlocFeed submit can only run in the browser"));return v({phase:"error",lastError:R}),{ok:false}}let F=t.blocfeed_id?.trim?.()??"";if(!F){let P={phase:"error",lastError:w("configuration",new Error("Missing blocfeed_id. Create a project in BlocFeed and pass its blocfeed_id."))};return o.selection&&(P.selection=o.selection),v(P),{ok:false}}if(m)return {ok:false};if(o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording")return {ok:false};m=true;let A=u+1;u=A,c?.abort(),c=new AbortController;let x=c.signal,k=o.selection,D=S?.capture?{...t.capture,...S.capture}:t.capture,V=!!(D?.element||D?.fullPage),Z={phase:V?"capturing":"submitting"};k&&(Z.selection=k),v(Z);try{let R=V?await Je({selectionElement:s,capture:D,signal:x}):void 0;if(x.aborted||u!==A)return {ok:!1};let P={phase:"submitting"};k&&(P.selection=k),R&&(P.capture=R),v(P);let O={};k&&(O.selection=k),R&&(O.capture=R);let G=await et({config:t.metadata,context:O,...t.user?{user:t.user}:{}}),X={version:1,createdAt:new Date().toISOString(),blocfeed_id:F,message:b,metadata:G};S?.category&&(X.category=S.category),t.user&&(X.user=t.user),k&&(X.selection=k),R&&(X.screenshots=R),g&&(X.video=g);let{result:U}=await Fe({payload:X,signal:x,...t.transport?{transport:t.transport}:{}});if(x.aborted||u!==A)return U;if(U.ok){_(),s=null;let we={phase:"success",lastSubmit:U};return k&&(we.selection=k),R&&(we.capture=R),v(we),U}Nn(U)&&Ce(X);let It=U.api?.error??w("unknown",new Error("Submission failed")),be={phase:"error",lastSubmit:U,lastError:It};return k&&(be.selection=k),R&&(be.capture=R),v(be),U}catch(R){if(x.aborted||u!==A)return {ok:false};let O={phase:"error",lastError:x.aborted?w("aborted",R):w("unknown",R)};return k&&(O.selection=k),v(O),{ok:false}}finally{m=false,u===A&&(c=null);}},async startRecording(){if(o.phase!=="review"||!t.recording?.enabled||f||p)return;let b=o.selection,S={phase:"recording",recordingElapsedMs:0};b&&(S.selection=b),v(S);try{let F={config:t.recording};c&&(F.signal=c.signal);let A=await Te(F);p=A,A.onTick(D=>{if(o.phase==="recording"){let V={phase:"recording",recordingElapsedMs:D};b&&(V.selection=b),v(V);}});let x=await A.result;p=null,g=x;let k={phase:"review",video:x};b&&(k.selection=b),v(k);}catch(F){p=null;let x={phase:"review",lastError:F?.kind?F:w("recording_failed",F)};b&&(x.selection=b),v(x);}},stopRecording(){o.phase!=="recording"||!p||p.stop();},removeVideo(){_();let b=o.selection,S={phase:"review"};b&&(S.selection=b),v(S);},async startVoice(){if(o.phase!=="review"){console.warn("[BlocFeed] startVoice: ignored \u2014 phase is",o.phase,'(expected "review")');return}let b=t.voice;if(!b?.enabled){console.warn("[BlocFeed] startVoice: ignored \u2014 voice is not enabled in config");return}if(p){console.warn("[BlocFeed] startVoice: ignored \u2014 a screen recording is already in progress");return}L();let S=o.selection,F={phase:"review",voiceRecording:true,voiceElapsedMs:0};S&&(F.selection=S),g&&(F.video=g),v(F);try{let A={config:b};c&&(A.signal=c.signal);let x=await Re(A);f=x,x.onTick(O=>{let G={phase:"review",voiceRecording:!0,voiceElapsedMs:O};S&&(G.selection=S),g&&(G.video=g),v(G);});let k=await x.result;f=null;let D={phase:"review",voiceRecording:!1,voiceTranscribing:!0};S&&(D.selection=S),g&&(D.video=g),v(D),I=new AbortController;let V={blob:k.blob,mime:k.mime,blocfeedId:t.blocfeed_id,signal:I.signal},{text:Ue,warning:Z}=await bt(V);I=null;let R={phase:"review",voiceRecording:!1,voiceTranscribing:!1};S&&(R.selection=S),g&&(R.video=g),v(R);let P={text:Ue};return Z&&(P.warning=Z),P}catch(A){L();let x=A?.kind?A:w("recording_failed",A);console.warn("[BlocFeed] Voice error:",x.message);let k={phase:"review",voiceRecording:false,voiceTranscribing:false,lastError:x};S&&(k.selection=S),g&&(k.video=g),v(k);return}},stopVoice(){f&&f.stop();},__unsafeGetSelectedElement(){return s},destroy(){n.uninstall(),q(),r.clear(),i.clear(),d?.(),d=null;}}}var ee=[],te=[],Lt=20,Pt=15,fe=[],Bt=typeof console<"u"?{log:console.log?.bind(console),warn:console.warn?.bind(console),error:console.error?.bind(console),info:console.info?.bind(console),debug:console.debug?.bind(console)}:{},pe=typeof globalThis<"u"&&typeof globalThis.fetch=="function"?globalThis.fetch:void 0,me=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.open:void 0,ge=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.send:void 0,Le=new Set,Pe=false,Be=false,he=false,On=["blocfeed.com","google-analytics.com","googletagmanager.com","analytics.google.com","googleads.g.doubleclick.net","googlesyndication.com","googleadservices.com","google.com/pagead","google.com/ads","facebook.net","facebook.com/tr","connect.facebook.net","graph.facebook.com","api.mixpanel.com","api-js.mixpanel.com","api.amplitude.com","api2.amplitude.com","api.segment.io","cdn.segment.com","vars.hotjar.com","in.hotjar.com","script.hotjar.com","heapanalytics.com","fullstory.com/s/fs.js","rs.fullstory.com","app.posthog.com","us.posthog.com","eu.posthog.com","api-iam.intercom.io","widget.intercom.io","sentry.io/api","browser.sentry-cdn.com","browser-intake-datadoghq.com","clarity.ms","js.hs-analytics.net","api.hubapi.com","forms.hubspot.com","plausible.io/api","client.crisp.chat","js.driftt.com","r.logrocket.com","app.pendo.io","events.launchdarkly.com","app.launchdarkly.com","grammarly.com","gnar.grammarly.com","capi.grammarly.com","api.languagetool.org","api.languagetoolplus.com","fonts.googleapis.com","fonts.gstatic.com","cdn.cookielaw.org","consent.cookiebot.com","js.stripe.com","api.stripe.com/v1/tokens","google.com/recaptcha","hcaptcha.com","bam.nr-data.net","rec.smartlook.com","o2.mouseflow.com","api.luckyorange.com","static.zdassets.com","ekr.zdassets.com"];function Un(e){if(e instanceof Error)return e.name&&e.name!=="Error"?`${e.name}: ${e.message}`:e.message||String(e);if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Hn(e,t){let n=t.map(Un).join(" "),o=t.find(i=>i instanceof Error),r={level:e,message:n.slice(0,2e3),timestamp:Date.now()};for(o?.stack&&(r.stack=o.stack.slice(0,2e3)),ee.push(r);ee.length>Lt;)ee.shift();}function Me(e){let t=e.url.toLowerCase();for(let n of fe)if(t.includes(n))return;for(te.push(e);te.length>Pt;)te.shift();}function vr(e={}){if(he||!y())return;he=true,Lt=e.consoleLimit??20,Pt=e.networkLimit??15;let t=e.ignoreUrls;if(t!==void 0?fe=t.map(n=>n.toLowerCase()):fe=[...On],e.console!==false){let n=e.consoleLevels??["error","warn"];for(let o of n){let r=Bt[o];r&&(Le.add(o),console[o]=(...i)=>{Hn(o,i),r.apply(console,i);});}}if(e.network!==false&&pe){let n=pe;Pe=true,window.fetch=async function(r,i){let l=typeof r=="string"?r:r instanceof URL?r.toString():r.url,s=(i?.method??"GET").toUpperCase(),a=Date.now();try{let c=await n.call(window,r,i);return c.ok||Me({url:l.slice(0,500),method:s,status:c.status,statusText:c.statusText,timestamp:a,durationMs:Date.now()-a}),c}catch(c){throw Me({url:l.slice(0,500),method:s,status:0,statusText:c instanceof Error?c.message:"Network error",timestamp:a,durationMs:Date.now()-a}),c}};}if(e.network!==false&&me&&ge){let n=me,o=ge;Be=true,XMLHttpRequest.prototype.open=function(r,i,...l){return this.__bf_method=r.toUpperCase(),this.__bf_url=String(i),n.apply(this,[r,i,...l])},XMLHttpRequest.prototype.send=function(...r){let i=this.__bf_method||"GET",l=this.__bf_url||"",s=Date.now();return this.addEventListener("loadend",function(){if(this.status>=400||this.status===0){let a={url:l.slice(0,500),method:i,status:this.status,timestamp:s,durationMs:Date.now()-s};this.statusText&&(a.statusText=this.statusText),Me(a);}},{once:true}),o.apply(this,r)};}}function yr(){if(he){for(let e of Le){let t=Bt[e];t&&(console[e]=t);}Le.clear(),Pe&&pe&&(window.fetch=pe,Pe=false),Be&&me&&ge&&(XMLHttpRequest.prototype.open=me,XMLHttpRequest.prototype.send=ge,Be=false),fe=[],he=false;}}function Er(){return {consoleLogs:[...ee],networkErrors:[...te]}}function _r(){ee=[],te=[];}var qn=[{name:"supabase_service_role_key",pattern:/SUPABASE_SERVICE_ROLE_KEY["'=:\s]{1,8}[A-Za-z0-9_.=-]{30,400}/},{name:"supabase_db_password",pattern:/SUPABASE_DB_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"postgres_password",pattern:/POSTGRES_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"database_url_with_creds",pattern:/(?:postgres|postgresql|mysql|mongodb|redis|amqp):\/\/[^:\s"']{1,100}:[^@\s"']{1,200}@/},{name:"aws_access_key",pattern:/AKIA[0-9A-Z]{16}/},{name:"aws_secret_key",pattern:/AWS_SECRET_ACCESS_KEY["'=:\s]{1,8}[A-Za-z0-9/+=]{30,200}/},{name:"aws_session_token",pattern:/AWS_SESSION_TOKEN["'=:\s]{1,8}[A-Za-z0-9/+=]{30,600}/},{name:"stripe_secret_key",pattern:/sk_live_[a-zA-Z0-9]{10,200}/},{name:"stripe_secret_key_test",pattern:/sk_test_[a-zA-Z0-9]{10,200}/},{name:"stripe_restricted_key",pattern:/rk_(?:live|test)_[a-zA-Z0-9]{10,200}/},{name:"github_pat",pattern:/ghp_[A-Za-z0-9_]{36,100}/},{name:"github_oauth",pattern:/gho_[A-Za-z0-9_]{36,100}/},{name:"github_user_token",pattern:/ghu_[A-Za-z0-9_]{36,100}/},{name:"github_server_token",pattern:/ghs_[A-Za-z0-9_]{36,100}/},{name:"github_fine_grained",pattern:/github_pat_[A-Za-z0-9_]{22,200}/},{name:"openai_api_key",pattern:/sk-[a-zA-Z0-9]{20,200}(?![a-zA-Z0-9_])/},{name:"anthropic_api_key",pattern:/sk-ant-[a-zA-Z0-9\-_]{20,200}/},{name:"private_key",pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"sendgrid_api_key",pattern:/SG\.[a-zA-Z0-9_-]{22,100}\.[a-zA-Z0-9_-]{22,100}/},{name:"twilio_auth_token",pattern:/TWILIO_AUTH_TOKEN["'=:\s]{1,8}[a-f0-9]{32}/},{name:"generic_secret_key",pattern:/[A-Z_]{2,60}_SECRET_KEY["'=:\s]{1,8}[^\s"']{8,200}/},{name:"generic_secret",pattern:/[A-Z_]{2,60}_SECRET["'=:\s]{1,8}[^\s"']{8,200}/},{name:"generic_password",pattern:/[A-Z_]{2,60}_PASSWORD["'=:\s]{1,8}[^\s"']{6,200}/},{name:"generic_private_key_var",pattern:/[A-Z_]{2,60}_PRIVATE_KEY["'=:\s]{1,8}[^\s"']{8,400}/}],j=[],De=0,Ie=false;function Vn(e){let t=e.slice(0,80);return t.length<=6?"***":t.slice(0,6)+"***"}function Xn(e,t,n,o){if(j.some(l=>l.rule===e&&l.source===t))return;let i={rule:e,source:t,hint:Vn(n),timestamp:Date.now()};o&&(i.location=o),j.push(i);}function ne(e,t,n,o){for(let{name:r,pattern:i}of n){let l=i.exec(e);l&&Xn(r,t,l[0],o);}}function $n(e){try{let t=window;if(t.__NEXT_DATA__){let n=JSON.stringify(t.__NEXT_DATA__);ne(n,"hydration",e,"__NEXT_DATA__");}if(t.__NUXT__){let n=JSON.stringify(t.__NUXT__);ne(n,"hydration",e,"__NUXT__");}}catch{}}function zn(e){try{document.querySelectorAll("script:not([src])").forEach((n,o)=>{let r=n.textContent;r&&r.length>0&&ne(r,"scripts",e,`inline-script[${o}]`);});}catch{}}function jn(e){try{document.querySelectorAll("meta[content]").forEach(n=>{let o=n.getAttribute("content"),r=n.getAttribute("name")||n.getAttribute("property")||"";o&&o.length>10&&ne(o,"meta",e,r?`meta[${r}]`:void 0);});}catch{}}function Kn(e){try{document.querySelectorAll("[data-api-key], [data-secret], [data-token], [data-password]").forEach(n=>{let o=n.attributes;for(let r=0;r<o.length;r++){let i=o[r];i.name.startsWith("data-")&&i.value.length>10&&ne(i.value,"dom",e,`${n.tagName.toLowerCase()}[${i.name}]`);}});}catch{}}function Cr(e={}){if(Ie||!y()||(Ie=true,e.secretScan===false))return;let t=[...qn,...e.customPatterns??[]],n=e.scanTargets??["hydration","scripts","meta","dom"];setTimeout(()=>{De=Date.now(),n.includes("hydration")&&$n(t),n.includes("scripts")&&zn(t),n.includes("meta")&&jn(t),n.includes("dom")&&Kn(t);let o=e.notify??"both";j.length>0&&(o==="console"||o==="both")&&console.warn(`[BlocFeed Security] Found ${j.length} potential secret(s) exposed in client code:`,j.map(r=>`${r.rule} (${r.source}${r.location?`: ${r.location}`:""})`));},100);}function Tr(){return {findings:[...j],scannedAt:De}}function Rr(){j=[],De=0,Ie=false;}
2
- export{Rr as A,y as a,ve as b,Ze as c,Je as d,et as e,Ce as f,tt as g,so as h,ao as i,on as j,rn as k,dn as l,Te as m,gn as n,Re as o,En as p,Co as q,bt as r,le as s,hr as t,vr as u,yr as v,Er as w,_r as x,Cr as y,Tr as z};