blocfeed 0.13.0 → 0.14.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,32 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.14.0 — 2026-04-22
4
+
5
+ ### Bug fixes (QA pass)
6
+
7
+ - **Modal/overlay compatibility** — widget no longer dismisses Radix Dialog, HeadlessUI Dialog, MUI Modal, Floating UI Popover, etc. when users interact with the trigger, panel, or overlay. The portal root now stops pointer-event propagation in bubble phase so modal libraries listening at `document` level do not treat blocfeed clicks as "outside" clicks.
8
+ - **Focus trap coordination** — panel textarea remains focusable/typable when an external focus trap (Radix, HeadlessUI) is active. A capture-phase `focusin` handler reclaims focus inside the panel before external managers run.
9
+ - **History API patching coordination** — `pushState`/`replaceState` are now patched once at module level with a subscriber Set, so multiple widget instances cooperate and `showOn` route matching survives unmount of any one instance.
10
+ - **Submit race guard** — rapid double-clicks on Send can no longer issue overlapping submissions.
11
+ - **Diagnostics double-install safety** — pristine `console`/`fetch`/`XHR` originals are captured at module load, so nested patchers never corrupt `uninstallDiagnostics()`.
12
+ - **XHR listener leak** — `loadend` listener now uses `{ once: true }`, preventing accumulation in long-lived SPAs.
13
+ - **Console stack preservation** — `console.error("label:", err)` now retains the Error's `name: message` (e.g. `TypeError: x is not a function`) instead of dropping it through `JSON.stringify`.
14
+ - **Offline queue observability** — corrupted `localStorage` data and quota-exceeded writes now surface a `console.warn` instead of failing silently.
15
+ - **Secret scanner ReDoS hardening** — all unbounded quantifiers in detection patterns now have upper bounds, preventing catastrophic regex backtracking on large inline JSON.
16
+ - **Video blob URL double-revoke** — revocation is now guarded and centralised in `revokeVideoAsset`.
17
+ - **Voice/screen-recording mutex** — the two media APIs cannot be started concurrently via the programmatic handle.
18
+ - **Voice transcription cancellation** — closing the widget during transcription now aborts the HTTP request instead of letting it complete in the background.
19
+ - **Selected element memory** — the selected DOM node reference is cleared after a successful submission, so long-lived widgets do not retain detached nodes.
20
+ - **Click-tracker listener removal** — `addEventListener`/`removeEventListener` now use a shared options object to ensure cross-browser listener identity.
21
+ - **Voice auto-stop timer race** — timer self-nulls and re-checks `settled` before calling `recorder.stop()`.
22
+ - **Custom `isSelectable` override** — user-provided predicate now fully replaces the HTML/BODY default instead of being ignored due to `??` short-circuit.
23
+ - **Portal mount error safety** — `document.body.appendChild` is wrapped in `try/catch` for restricted environments.
24
+ - **Theme effect consolidation** — removed redundant second effect that re-applied `data-bf-theme`.
25
+
26
+ No breaking changes. Consumers on `0.12.x` / `0.13.x` can upgrade without code changes.
27
+
28
+ ---
29
+
3
30
  ## 0.11.0 — 2026-03-03
4
31
 
5
32
  ### New features
@@ -0,0 +1,2 @@
1
+ 'use strict';function E(){return typeof window<"u"&&typeof document<"u"}function Fe(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 le(e){return {x:e.x,y:e.y,width:e.width,height:e.height}}function pt(e){return {x:e.x+window.scrollX,y:e.y+window.scrollY,width:e.width,height:e.height}}function gt(e){return e.replace(/\s+/g," ").trim()}function de(e,t=140){let n=e.textContent;if(!n)return;let o=gt(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 De=["data-testid","data-test-id","data-test","data-qa","data-cy"],Me="data-blocfeed-component";function ue(e){let t=e.closest(`[${Me}]`);if(!t)return;let o=t.getAttribute(Me)?.trim();return o||void 0}function wt(e){for(let t of De){let n=e.closest(`[${t}]`);if(!n)continue;let r=n.getAttribute(t)?.trim();if(r)return r}}function Ie(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 V(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 Z(e){if(e){for(let t of e)if(typeof t.name=="string"&&t.name&&!V(t.name))return t.name}}function P(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 P(r)}}}function fe(e){let t=Ie(e);if(!t)return;let n=Z(t._debugInfo);if(n)return n;let o=t._debugOwner!==void 0;if(o){let c=t._debugOwner;for(let l=0;c&&l<50;l+=1){let b=Z(c._debugInfo);if(b)return b;let f=P(c.type)??P(c.elementType);if(f&&!V(f))return f;c=c._debugOwner;}}if(t._owner!==void 0&&t._owner!==t._debugOwner){let c=t._owner;for(let l=0;c&&l<50;l+=1){let b=Z(c._debugInfo);if(b)return b;let f=P(c.type)??P(c.elementType);if(f&&!V(f))return f;c=c._owner;}}let i=t,s=o?80:25;for(let c=0;i&&c<s;c+=1){let l=Z(i._debugInfo);if(l)return l;let b=P(i.type)??P(i.elementType);if(b&&!V(b))return b;i=i.return;}let a=e.parentElement;for(let c=0;a&&c<15;c+=1){let l=Ie(a);if(l){let b=Z(l._debugInfo);if(b)return b;let f=P(l.type)??P(l.elementType);if(f&&!V(f))return f;if(l._debugOwner){let d=P(l._debugOwner.type)??P(l._debugOwner.elementType);if(d&&!V(d))return d}if(l._owner&&l._owner!==l._debugOwner){let d=P(l._owner.type)??P(l._owner.elementType);if(d&&!V(d))return d}}a=a.parentElement;}}function bt(e){let t=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n)return `#${Fe(n)}`;for(let o of De){let r=e.getAttribute(o);if(r)return `${t}[${o}="${Fe(r)}"]`}return `${t}:nth-of-type(${ht(e)})`}function yt(e,t=10){let n=[],o=e;for(;o&&n.length<t;){let r=bt(o);if(n.unshift(r),r.startsWith("#"))break;o=o.parentElement;}return n.join(" > ")}function Be(e,t){if(!t||t.length===0)return false;for(let n of t)if(e.closest(n))return true;return false}function me(e,t){if(!e||Be(e,t.ignoreSelectors))return null;let n=e;for(;n;){if(Be(n,t.ignoreSelectors))return null;if(t.isSelectable?t.isSelectable(n):Et(n))return n;n=n.parentElement;}return null}function Et(e){let t=e.tagName;return !(t==="HTML"||t==="BODY")}function Le(e){let t=e.getBoundingClientRect(),n={selector:yt(e),tagName:e.tagName.toLowerCase(),rect:le(t),pageRect:pt(t)},o=e.getAttribute("id");o&&(n.id=o);let r=e.className;typeof r=="string"&&r.trim()&&(n.className=r);let i=de(e);i&&(n.textSnippet=i);let s=ue(e)??fe(e);s&&(n.componentName=s);let a=wt(e);return a&&(n.testId=a),n}var pe=null;async function Ne(){return pe||(pe=import('html-to-image')),pe}async function vt(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 Oe(e,t){let{width:n,height:o}=await vt(e);return {dataUrl:e,mime:t,width:n,height:o}}function z(e){if(e?.aborted)throw new Error("Aborted")}function Ue(){return {async captureElement(e,t){if(!E())throw new Error("captureElement can only run in the browser");z(t.signal);let n=await Ne();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 Oe(o,t.mime)},async captureFullPage(e){if(!E())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)),s=Math.max(1,Math.round(o*r)),a=await Ne();z(e.signal);let c=e.mime==="image/jpeg"?await a.toJpeg(t,{width:i,height:s,quality:e.quality??.92,pixelRatio:e.pixelRatio}):await a.toPng(t,{width:i,height:s,pixelRatio:e.pixelRatio});return z(e.signal),await Oe(c,e.mime)}}}function St(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:St(t)};return n&&(o.detail=n),o}var kt=12e3,_t=2048,Tt=.92;function Ve(){return Date.now()}function At(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 He(e,t,n){let o=new Promise((i,s)=>{let a=setTimeout(()=>s(new Error("Timeout")),t);typeof a.unref=="function"&&a.unref();}),r=[e,o];return n&&r.push(At(n)),await Promise.race(r)}function Rt(e){if(!E())return 1;let t=window.devicePixelRatio||1,n=e?.pixelRatio??Math.min(t,2);return Math.max(.1,n)}function xt(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 $e(e){let{selectionElement:t,capture:n,signal:o}=e;if(!E()||!xt(n))return;let r=Ve(),i=[],s=n?.timeoutMs??kt,a=n?.maxDimension??_t,c=n?.mime??"image/png",l=n?.quality??Tt,b=n?.adapter??Ue(),f={},d=Rt(n);if(n?.element&&t)try{let g=t.getBoundingClientRect(),m=Math.min(1,a/Math.max(g.width,g.height)),p=Math.min(d,d*m),M=await He(Promise.resolve(b.captureElement(t,{...qe({mime:c,quality:l,pixelRatio:p,maxDimension:a,includeQuality:c==="image/jpeg",...o?{signal:o}:{}})})),s,o);f.element=M;}catch(g){if(o?.aborted)throw g;i.push(w("capture_failed",g,{target:"element"}));}if(n?.fullPage)try{let g=await He(Promise.resolve(b.captureFullPage(qe({mime:c,quality:l,pixelRatio:d,maxDimension:a,includeQuality:c==="image/jpeg",...o?{signal:o}:{}}))),s,o);f.fullPage=g;}catch(g){if(o?.aborted)throw g;i.push(w("capture_failed",g,{target:"fullPage"}));}let y=Ve(),u={startedAt:r,finishedAt:y,durationMs:Math.max(0,y-r)};return i.length>0&&(u.errors=i),{...f,diagnostics:u}}function Pt(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function Ct(){return E()?{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:Pt()}:{}}function Ft(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 ze(e){let{config:t,context:n,user:o}=e;if(t?.enabled===false)return {};let r={...Ct(),...Ft(o)},i=t?.enrich;if(!i)return r;try{let s=await i(n);return {...r,...s}}catch(s){let a=w("unknown",s);return {...r,blocfeedMetadataError:a.message}}}var K="blocfeed-queue",Mt=50;function ge(){if(!E())return [];try{let e=localStorage.getItem(K);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(K);}catch{}return []}catch(e){console.warn("[BlocFeed] offline queue could not be read \u2014 resetting",e);try{localStorage.removeItem(K);}catch{}return []}}function he(e){if(E())try{e.length===0?localStorage.removeItem(K):localStorage.setItem(K,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 It(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 we(e){let t=ge(),n=It(e);for(n.metadata={...n.metadata,_queued:true},t.push({payload:n,timestamp:Date.now()});t.length>Mt;)t.shift();he(t);}function Xe(){let e=ge();return e.length===0?[]:(he([]),e.map(t=>t.payload))}function Fn(){he([]);}function Mn(){return ge().length}var Bt=200,W=[],je=0,J=false;function Ze(e){let t=e.target;if(!(t instanceof Element)||t.closest("[data-blocfeed-ui]"))return;let n={timestampMs:Date.now()-je,path:window.location.pathname,tagName:t.tagName.toLowerCase()},o=de(t,100);o&&(n.textSnippet=o);let r=ue(t)??fe(t);r&&(n.componentName=r),W.length<Bt&&W.push(n);}var Ke={capture:true,passive:true};function We(){J||!E()||(J=true,W=[],je=Date.now(),document.addEventListener("click",Ze,Ke));}function Qe(){J&&(J=false,document.removeEventListener("click",Ze,Ke));}function Dt(){return [...W]}function Lt(){W=[];}var Nt=3e4,Ot=25e5,Ye="video/webm",Ut=250,Vt=1e3,Ht=["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];function Ge(){if(typeof MediaRecorder>"u")return null;for(let e of Ht)if(MediaRecorder.isTypeSupported(e))return e;return null}function qt(){return !E()||typeof navigator?.mediaDevices?.getDisplayMedia!="function"?false:Ge()!==null}async function be(e){let{config:t,signal:n}=e;if(!E()||typeof navigator?.mediaDevices?.getDisplayMedia!="function")throw w("recording_failed",new Error("Screen recording is not supported in this browser"));let o=Ge();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(m){let p=m instanceof DOMException&&m.name==="NotAllowedError"?"Screen share permission denied":"Failed to start screen share";throw w("recording_failed",new Error(p))}if(n?.aborted)throw r.getTracks().forEach(m=>m.stop()),w("aborted",new Error("Recording aborted after permission"));let i=t?.maxDurationMs??Nt,s=t?.videoBitsPerSecond??Ot,a=new MediaRecorder(r,{mimeType:o,videoBitsPerSecond:s}),c=[],l=[],b=0,f=null,d=null,y=false,u=()=>{Qe(),f!==null&&(clearInterval(f),f=null),d!==null&&(clearTimeout(d),d=null),r.getTracks().forEach(m=>m.stop());},g=new Promise((m,p)=>{a.ondataavailable=_=>{_.data.size>0&&c.push(_.data);},a.onstop=()=>{if(y)return;y=true,u();let _=Date.now()-b,C=new Blob(c,{type:Ye}),S=URL.createObjectURL(C);m({mime:Ye,blobUrl:S,blob:C,durationMs:_,sizeBytes:C.size});},a.onerror=()=>{y||(y=true,u(),p(w("recording_failed",new Error("MediaRecorder error"))));};let M=r.getVideoTracks()[0];if(M&&M.addEventListener("ended",()=>{a.state!=="inactive"&&a.stop();}),n){let _=()=>{y||(y=true,a.state!=="inactive"&&a.stop(),u(),p(w("aborted",new Error("Recording aborted"))));};n.addEventListener("abort",_,{once:true});}});return a.start(Vt),We(),b=Date.now(),f=setInterval(()=>{let m=Date.now()-b;for(let p of l)p(m);},Ut),d=setTimeout(()=>{!y&&a.state!=="inactive"&&a.stop();},i),{result:g,stop(){!y&&a.state!=="inactive"&&a.stop();},onTick(m){l.push(m);},abort(){y||(y=true,a.state!=="inactive"&&a.stop(),u());}}}var $t=6e4,Je="audio/webm",zt=250,Xt=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus"];function et(){if(typeof MediaRecorder>"u")return null;for(let e of Xt)if(MediaRecorder.isTypeSupported(e))return e;return null}function jt(){return !E()||typeof navigator?.mediaDevices?.getUserMedia!="function"?false:et()!==null}async function ye(e){let{config:t,signal:n}=e;if(!E()||typeof navigator?.mediaDevices?.getUserMedia!="function")throw w("recording_failed",new Error("Microphone recording is not supported in this browser"));let o=et();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(g){let m=g instanceof DOMException&&g.name==="NotAllowedError"?"Microphone permission denied":"Failed to access microphone";throw w("recording_failed",new Error(m))}if(n?.aborted)throw r.getTracks().forEach(g=>g.stop()),w("aborted",new Error("Voice recording aborted after permission"));let i=t?.maxDurationMs??$t,s=new MediaRecorder(r,{mimeType:o}),a=[],c=[],l=0,b=null,f=null,d=false,y=()=>{b!==null&&(clearInterval(b),b=null),f!==null&&(clearTimeout(f),f=null),r.getTracks().forEach(g=>g.stop());},u=new Promise((g,m)=>{if(s.ondataavailable=p=>{p.data.size>0&&a.push(p.data);},s.onstop=()=>{if(d)return;d=true,y();let p=Date.now()-l,M=new Blob(a,{type:Je});g({blob:M,mime:Je,durationMs:p});},s.onerror=()=>{d||(d=true,y(),m(w("recording_failed",new Error("MediaRecorder error"))));},n){let p=()=>{d||(d=true,s.state!=="inactive"&&s.stop(),y(),m(w("aborted",new Error("Voice recording aborted"))));};n.addEventListener("abort",p,{once:true});}});return s.start(1e3),l=Date.now(),b=setInterval(()=>{let g=Date.now()-l;for(let m of c)m(g);},zt),f=setTimeout(()=>{f=null,!d&&s.state!=="inactive"&&s.stop();},i),{result:u,stop(){!d&&s.state!=="inactive"&&s.stop();},onTick(g){c.push(g);},abort(){d||(d=true,s.state!=="inactive"&&s.stop(),y());}}}var Zt=12e3,Kt=2,Wt=500,Qt=2e3,Ee="https://blocfeed.com/api/feedback",Yt="https://blocfeed.com/api/feedback/voice",tt=0,rt="blocfeed-viewer-token",it="blocfeed-my-feedback-url";function Gt(){try{return localStorage.getItem(rt)}catch{return null}}function Wn(){try{return localStorage.getItem(it)}catch{return null}}function Jt(e,t){try{localStorage.setItem(rt,e),t&&localStorage.setItem(it,t);}catch{}}function nt(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 en(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),s=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)s[a]=i.charCodeAt(a);return new Blob([s],{type:r})}function nn(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 ot(e,t,n){let o=tn(t);await fetch(e,{method:"PUT",body:o,headers:{"content-type":o.type},...n?{signal:n}:{}});}async function on(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(`${Ee}/${t}/screenshots`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i),...r?{signal:r}:{}});}async function rn(e){await fetch(`${Ee}/${e.feedbackId}/video`,{method:"POST",body:e.blob,headers:{"content-type":e.blob.type},...e.signal?{signal:e.signal}:{}});}async function st(e){let{signal:t,transport:n}=e;if(Date.now()-tt<Qt)return {ok:false,error:w("configuration",new Error("Please wait before submitting again"))};let r=n?.timeoutMs??Zt,i=n?.maxAttempts??Kt,s=n?.backoffMs??Wt,a=!!(e.payload.screenshots?.element?.dataUrl||e.payload.screenshots?.fullPage?.dataUrl),c=!!e.payload.video?.blob,l=a||c,{lean:b,extracted:f,extractedVideo:d}=l?nn(e.payload):{lean:e.payload,extracted:{},extractedVideo:{}},y=Gt();y&&(b.viewer_token=y);let u={...f,...e.screenshotDataUrls};for(let g=1;g<=i;g+=1){let m=new AbortController,p=setTimeout(()=>m.abort(),r),M=()=>m.abort();t&&t.addEventListener("abort",M,{once:true});try{let _=await fetch(Ee,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b),signal:m.signal});if(_.ok){tt=Date.now();let S;try{S=await _.json();}catch{}if(S?.viewer_token&&Jt(S.viewer_token,S.my_feedback_url),(u.element||u.fullPage)&&S){let F=S.upload_urls;if(F){let $=[];u.element&&F.element&&$.push(ot(F.element,u.element,t)),u.fullPage&&F.fullPage&&$.push(ot(F.fullPage,u.fullPage,t));try{await Promise.all($);}catch{}}else if(S.feedback_id)try{await on({feedbackId:S.feedback_id,extracted:u,screenshots:e.payload.screenshots,...t?{signal:t}:{}});}catch{}}if(d.blob&&S){let F=S.upload_urls;if(F?.video)try{await fetch(F.video,{method:"PUT",body:d.blob,headers:{"content-type":d.blob.type},...t?{signal:t}:{}});}catch{}else if(S.feedback_id)try{await rn({feedbackId:S.feedback_id,blob:d.blob,...t?{signal:t}:{}});}catch{}}let q={ok:!0,status:_.status};return S&&(q.apiResponse=S),q}if(g<i&&en(_.status)){let S=.85+Math.random()*.3,B=Math.round(s*2**(g-1)*S);await nt(B,t);continue}let C=`HTTP ${_.status}`;try{let S=await _.json();S?.error&&(C=S.error);}catch{}return {ok:!1,status:_.status,error:w("api_failed",new Error(C))}}catch(_){if(m.signal.aborted||t?.aborted)return {ok:false,error:w("aborted",_)};if(g<i){let C=.85+Math.random()*.3,S=Math.round(s*2**(g-1)*C);await nt(S,t);continue}return {ok:false,error:w("api_failed",_)}}finally{clearTimeout(p),t&&t.removeEventListener("abort",M);}}return {ok:false,error:w("api_failed",new Error("Failed"))}}async function at(e){let{blob:t,mime:n,blocfeedId:o,signal:r}=e,i=await fetch(Yt,{method:"POST",headers:{"Content-Type":n,"X-Blocfeed-Id":o},body:t,...r?{signal:r}:{}});if(!i.ok){let a=await i.json().catch(()=>({error:"Unknown error"}));throw w("api_failed",new Error(a?.error??`Voice API returned ${i.status}`))}let s=await i.json();return {text:s.text??"",warning:s.warning}}function ve(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 ee(e){return e instanceof Element?!!e.closest("[data-blocfeed-ui]"):false}function te(e){e.stopPropagation(),e.stopImmediatePropagation?.();}function ct(e,t){if(!E())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,s=null,a=(u,g=false)=>{if(!u){i=null,s=null,t.onHover(null);return}let m=le(u.getBoundingClientRect()),p=`${Math.round(m.x)}:${Math.round(m.y)}:${Math.round(m.width)}:${Math.round(m.height)}`;!g&&u===i&&p===s||(i=u,s=p,t.onHover({element:u,rect:m}));},c=ve(u=>{if(ee(u.target))return;let g=document.elementFromPoint(u.clientX,u.clientY),m=me(g,r);a(m);}),l=ve(()=>{i&&a(i,true);}),b=u=>{ee(u.target)||(te(u),u.pointerType==="mouse"&&u.preventDefault());},f=u=>{ee(u.target)||(te(u),u.pointerType==="mouse"&&u.preventDefault());},d=u=>{if(ee(u.target))return;te(u),u.preventDefault();let g=document.elementFromPoint(u.clientX,u.clientY),m=me(g,r);m&&t.onSelect({element:m,descriptor:Le(m)});},y=u=>{u.key==="Escape"&&(te(u),u.preventDefault(),t.onCancel());};return window.addEventListener("pointermove",c,{capture:true,passive:true}),window.addEventListener("pointerdown",b,{capture:true}),window.addEventListener("pointerup",f,{capture:true}),window.addEventListener("click",d,{capture:true}),window.addEventListener("keydown",y,{capture:true}),window.addEventListener("scroll",l,{capture:true,passive:true}),window.addEventListener("resize",l,{passive:true}),{stop(){window.removeEventListener("pointermove",c,{capture:true}),window.removeEventListener("pointerdown",b,{capture:true}),window.removeEventListener("pointerup",f,{capture:true}),window.removeEventListener("click",d,{capture:true}),window.removeEventListener("keydown",y,{capture:true}),window.removeEventListener("scroll",l,{capture:true}),window.removeEventListener("resize",l),c.cancel(),l.cancel(),t.onHover(null);}}}async function Se(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 st(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 sn=["[data-blocfeed-ui]","[data-blocfeed-ignore]"];function an(e){let t=[...sn,...e?.ignoreSelectors??[]],n=Array.from(new Set(t));return {...e,ignoreSelectors:n}}function lt(){return {phase:"idle"}}function cn(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 go(e){let t=e,n=lt(),o=new Set,r=new Set,i=null,s=null,a=null,c=null,l=0,b=null,f=null,d=null,y=null,u=false,g=()=>{for(let h of o)h(n);},m=h=>{for(let v of r)v(h);},p=h=>{n=h,g();},M=()=>{l+=1,c?.abort(),c=null;},_=()=>{i?.stop(),i=null,m(null),a!==null&&E()&&(document.documentElement.style.cursor=a,a=null);},C=()=>{if(d){try{URL.revokeObjectURL(d.blobUrl);}catch{}d=null;}},S=()=>{f&&(f.abort(),f=null),C();},B=null,q=()=>{y&&(y.abort(),y=null),B&&(B.abort(),B=null);},F=()=>{M(),_(),S(),q(),s=null,p(lt());},$=()=>{if(!E())return;_(),s=null;let h=an(t.picker);a=document.documentElement.style.cursor,document.documentElement.style.cursor="crosshair",p({phase:"picking"}),i=ct(h,{onHover:m,onSelect:({element:v,descriptor:x})=>{s=v,_(),p({phase:"review",selection:x});},onCancel:()=>{F();}});},Pe=()=>{let h=Xe();if(h.length!==0)for(let v of h)Se({payload:v,...t.transport?{transport:t.transport}:{}}).catch(()=>{we(v);});};if(E()){setTimeout(Pe,1e3);let h=()=>Pe();window.addEventListener("online",h),b=()=>window.removeEventListener("online",h);}return {getState:()=>n,getConfig:()=>t,subscribe(h){return o.add(h),()=>o.delete(h)},subscribeHover(h){return r.add(h),()=>r.delete(h)},start(){n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording"||n.phase!=="picking"&&$();},stop(){F();},clearSelection(){n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording"||$();},setConfig(h){t=h;},async submit(h,v){if(!E()){let T=w("configuration",new Error("BlocFeed submit can only run in the browser"));return p({phase:"error",lastError:T}),{ok:false}}let x=t.blocfeed_id?.trim?.()??"";if(!x){let I={phase:"error",lastError:w("configuration",new Error("Missing blocfeed_id. Create a project in BlocFeed and pass its blocfeed_id."))};return n.selection&&(I.selection=n.selection),p(I),{ok:false}}if(u)return {ok:false};if(n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording")return {ok:false};u=true;let R=l+1;l=R,c?.abort(),c=new AbortController;let A=c.signal,k=n.selection,D=v?.capture?{...t.capture,...v.capture}:t.capture,O=!!(D?.element||D?.fullPage),X={phase:O?"capturing":"submitting"};k&&(X.selection=k),p(X);try{let T=O?await $e({selectionElement:s,capture:D,signal:A}):void 0;if(A.aborted||l!==R)return {ok:!1};let I={phase:"submitting"};k&&(I.selection=k),T&&(I.capture=T),p(I);let L={};k&&(L.selection=k),T&&(L.capture=T);let j=await ze({config:t.metadata,context:L,...t.user?{user:t.user}:{}}),U={version:1,createdAt:new Date().toISOString(),blocfeed_id:x,message:h,metadata:j};v?.category&&(U.category=v.category),t.user&&(U.user=t.user),k&&(U.selection=k),T&&(U.screenshots=T),d&&(U.video=d);let{result:N}=await Se({payload:U,signal:A,...t.transport?{transport:t.transport}:{}});if(A.aborted||l!==R)return N;if(N.ok){C(),s=null;let ce={phase:"success",lastSubmit:N};return k&&(ce.selection=k),T&&(ce.capture=T),p(ce),N}cn(N)&&we(U);let mt=N.api?.error??w("unknown",new Error("Submission failed")),ae={phase:"error",lastSubmit:N,lastError:mt};return k&&(ae.selection=k),T&&(ae.capture=T),p(ae),N}catch(T){if(A.aborted||l!==R)return {ok:false};let L={phase:"error",lastError:A.aborted?w("aborted",T):w("unknown",T)};return k&&(L.selection=k),p(L),{ok:false}}finally{u=false,l===R&&(c=null);}},async startRecording(){if(n.phase!=="review"||!t.recording?.enabled||y||f)return;let h=n.selection,v={phase:"recording",recordingElapsedMs:0};h&&(v.selection=h),p(v);try{let x={config:t.recording};c&&(x.signal=c.signal);let R=await be(x);f=R,R.onTick(D=>{if(n.phase==="recording"){let O={phase:"recording",recordingElapsedMs:D};h&&(O.selection=h),p(O);}});let A=await R.result;f=null,d=A;let k={phase:"review",video:A};h&&(k.selection=h),p(k);}catch(x){f=null;let A={phase:"review",lastError:x?.kind?x:w("recording_failed",x)};h&&(A.selection=h),p(A);}},stopRecording(){n.phase!=="recording"||!f||f.stop();},removeVideo(){C();let h=n.selection,v={phase:"review"};h&&(v.selection=h),p(v);},async startVoice(){if(n.phase!=="review"){console.warn("[BlocFeed] startVoice: ignored \u2014 phase is",n.phase,'(expected "review")');return}let h=t.voice;if(!h?.enabled){console.warn("[BlocFeed] startVoice: ignored \u2014 voice is not enabled in config");return}if(f){console.warn("[BlocFeed] startVoice: ignored \u2014 a screen recording is already in progress");return}q();let v=n.selection,x={phase:"review",voiceRecording:true,voiceElapsedMs:0};v&&(x.selection=v),d&&(x.video=d),p(x);try{let R={config:h};c&&(R.signal=c.signal);let A=await ye(R);y=A,A.onTick(L=>{let j={phase:"review",voiceRecording:!0,voiceElapsedMs:L};v&&(j.selection=v),d&&(j.video=d),p(j);});let k=await A.result;y=null;let D={phase:"review",voiceRecording:!1,voiceTranscribing:!0};v&&(D.selection=v),d&&(D.video=d),p(D),B=new AbortController;let O={blob:k.blob,mime:k.mime,blocfeedId:t.blocfeed_id,signal:B.signal},{text:Ce,warning:X}=await at(O);B=null;let T={phase:"review",voiceRecording:!1,voiceTranscribing:!1};v&&(T.selection=v),d&&(T.video=d),p(T);let I={text:Ce};return X&&(I.warning=X),I}catch(R){q();let A=R?.kind?R:w("recording_failed",R);console.warn("[BlocFeed] Voice error:",A.message);let k={phase:"review",voiceRecording:false,voiceTranscribing:false,lastError:A};v&&(k.selection=v),d&&(k.video=d),p(k);return}},stopVoice(){y&&y.stop();},__unsafeGetSelectedElement(){return s},destroy(){F(),o.clear(),r.clear(),b?.(),b=null;}}}var Q=[],Y=[],dt=20,ut=15,ne=[],ft=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)}:{},oe=typeof globalThis<"u"&&typeof globalThis.fetch=="function"?globalThis.fetch:void 0,re=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.open:void 0,ie=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.send:void 0,_e=new Set,Te=false,Ae=false,se=false,ln=["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 dn(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 un(e,t){let n=t.map(dn).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)),Q.push(r);Q.length>dt;)Q.shift();}function ke(e){let t=e.url.toLowerCase();for(let n of ne)if(t.includes(n))return;for(Y.push(e);Y.length>ut;)Y.shift();}function bo(e={}){if(se||!E())return;se=true,dt=e.consoleLimit??20,ut=e.networkLimit??15;let t=e.ignoreUrls;if(t!==void 0?ne=t.map(n=>n.toLowerCase()):ne=[...ln],e.console!==false){let n=e.consoleLevels??["error","warn"];for(let o of n){let r=ft[o];r&&(_e.add(o),console[o]=(...i)=>{un(o,i),r.apply(console,i);});}}if(e.network!==false&&oe){let n=oe;Te=true,window.fetch=async function(r,i){let s=typeof r=="string"?r:r instanceof URL?r.toString():r.url,a=(i?.method??"GET").toUpperCase(),c=Date.now();try{let l=await n.call(window,r,i);return l.ok||ke({url:s.slice(0,500),method:a,status:l.status,statusText:l.statusText,timestamp:c,durationMs:Date.now()-c}),l}catch(l){throw ke({url:s.slice(0,500),method:a,status:0,statusText:l instanceof Error?l.message:"Network error",timestamp:c,durationMs:Date.now()-c}),l}};}if(e.network!==false&&re&&ie){let n=re,o=ie;Ae=true,XMLHttpRequest.prototype.open=function(r,i,...s){return this.__bf_method=r.toUpperCase(),this.__bf_url=String(i),n.apply(this,[r,i,...s])},XMLHttpRequest.prototype.send=function(...r){let i=this.__bf_method||"GET",s=this.__bf_url||"",a=Date.now();return this.addEventListener("loadend",function(){if(this.status>=400||this.status===0){let c={url:s.slice(0,500),method:i,status:this.status,timestamp:a,durationMs:Date.now()-a};this.statusText&&(c.statusText=this.statusText),ke(c);}},{once:true}),o.apply(this,r)};}}function yo(){if(se){for(let e of _e){let t=ft[e];t&&(console[e]=t);}_e.clear(),Te&&oe&&(window.fetch=oe,Te=false),Ae&&re&&ie&&(XMLHttpRequest.prototype.open=re,XMLHttpRequest.prototype.send=ie,Ae=false),ne=[],se=false;}}function Eo(){return {consoleLogs:[...Q],networkErrors:[...Y]}}function vo(){Q=[],Y=[];}var fn=[{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}/}],H=[],xe=0,Re=false;function mn(e){let t=e.slice(0,80);return t.length<=6?"***":t.slice(0,6)+"***"}function pn(e,t,n,o){if(H.some(s=>s.rule===e&&s.source===t))return;let i={rule:e,source:t,hint:mn(n),timestamp:Date.now()};o&&(i.location=o),H.push(i);}function G(e,t,n,o){for(let{name:r,pattern:i}of n){let s=i.exec(e);s&&pn(r,t,s[0],o);}}function gn(e){try{let t=window;if(t.__NEXT_DATA__){let n=JSON.stringify(t.__NEXT_DATA__);G(n,"hydration",e,"__NEXT_DATA__");}if(t.__NUXT__){let n=JSON.stringify(t.__NUXT__);G(n,"hydration",e,"__NUXT__");}}catch{}}function hn(e){try{document.querySelectorAll("script:not([src])").forEach((n,o)=>{let r=n.textContent;r&&r.length>0&&G(r,"scripts",e,`inline-script[${o}]`);});}catch{}}function wn(e){try{document.querySelectorAll("meta[content]").forEach(n=>{let o=n.getAttribute("content"),r=n.getAttribute("name")||n.getAttribute("property")||"";o&&o.length>10&&G(o,"meta",e,r?`meta[${r}]`:void 0);});}catch{}}function bn(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&&G(i.value,"dom",e,`${n.tagName.toLowerCase()}[${i.name}]`);}});}catch{}}function _o(e={}){if(Re||!E()||(Re=true,e.secretScan===false))return;let t=[...fn,...e.customPatterns??[]],n=e.scanTargets??["hydration","scripts","meta","dom"];setTimeout(()=>{xe=Date.now(),n.includes("hydration")&&gn(t),n.includes("scripts")&&hn(t),n.includes("meta")&&wn(t),n.includes("dom")&&bn(t);let o=e.notify??"both";H.length>0&&(o==="console"||o==="both")&&console.warn(`[BlocFeed Security] Found ${H.length} potential secret(s) exposed in client code:`,H.map(r=>`${r.rule} (${r.source}${r.location?`: ${r.location}`:""})`));},100);}function To(){return {findings:[...H],scannedAt:xe}}function Ao(){H=[],xe=0,Re=false;}
2
+ exports.a=E;exports.b=le;exports.c=Ue;exports.d=$e;exports.e=ze;exports.f=we;exports.g=Xe;exports.h=Fn;exports.i=Mn;exports.j=Dt;exports.k=Lt;exports.l=qt;exports.m=be;exports.n=jt;exports.o=ye;exports.p=Gt;exports.q=Wn;exports.r=at;exports.s=go;exports.t=bo;exports.u=yo;exports.v=Eo;exports.w=vo;exports.x=_o;exports.y=To;exports.z=Ao;
@@ -0,0 +1,2 @@
1
+ function E(){return typeof window<"u"&&typeof document<"u"}function Fe(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 le(e){return {x:e.x,y:e.y,width:e.width,height:e.height}}function pt(e){return {x:e.x+window.scrollX,y:e.y+window.scrollY,width:e.width,height:e.height}}function gt(e){return e.replace(/\s+/g," ").trim()}function de(e,t=140){let n=e.textContent;if(!n)return;let o=gt(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 De=["data-testid","data-test-id","data-test","data-qa","data-cy"],Me="data-blocfeed-component";function ue(e){let t=e.closest(`[${Me}]`);if(!t)return;let o=t.getAttribute(Me)?.trim();return o||void 0}function wt(e){for(let t of De){let n=e.closest(`[${t}]`);if(!n)continue;let r=n.getAttribute(t)?.trim();if(r)return r}}function Ie(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 V(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 Z(e){if(e){for(let t of e)if(typeof t.name=="string"&&t.name&&!V(t.name))return t.name}}function P(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 P(r)}}}function fe(e){let t=Ie(e);if(!t)return;let n=Z(t._debugInfo);if(n)return n;let o=t._debugOwner!==void 0;if(o){let c=t._debugOwner;for(let l=0;c&&l<50;l+=1){let b=Z(c._debugInfo);if(b)return b;let f=P(c.type)??P(c.elementType);if(f&&!V(f))return f;c=c._debugOwner;}}if(t._owner!==void 0&&t._owner!==t._debugOwner){let c=t._owner;for(let l=0;c&&l<50;l+=1){let b=Z(c._debugInfo);if(b)return b;let f=P(c.type)??P(c.elementType);if(f&&!V(f))return f;c=c._owner;}}let i=t,s=o?80:25;for(let c=0;i&&c<s;c+=1){let l=Z(i._debugInfo);if(l)return l;let b=P(i.type)??P(i.elementType);if(b&&!V(b))return b;i=i.return;}let a=e.parentElement;for(let c=0;a&&c<15;c+=1){let l=Ie(a);if(l){let b=Z(l._debugInfo);if(b)return b;let f=P(l.type)??P(l.elementType);if(f&&!V(f))return f;if(l._debugOwner){let d=P(l._debugOwner.type)??P(l._debugOwner.elementType);if(d&&!V(d))return d}if(l._owner&&l._owner!==l._debugOwner){let d=P(l._owner.type)??P(l._owner.elementType);if(d&&!V(d))return d}}a=a.parentElement;}}function bt(e){let t=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n)return `#${Fe(n)}`;for(let o of De){let r=e.getAttribute(o);if(r)return `${t}[${o}="${Fe(r)}"]`}return `${t}:nth-of-type(${ht(e)})`}function yt(e,t=10){let n=[],o=e;for(;o&&n.length<t;){let r=bt(o);if(n.unshift(r),r.startsWith("#"))break;o=o.parentElement;}return n.join(" > ")}function Be(e,t){if(!t||t.length===0)return false;for(let n of t)if(e.closest(n))return true;return false}function me(e,t){if(!e||Be(e,t.ignoreSelectors))return null;let n=e;for(;n;){if(Be(n,t.ignoreSelectors))return null;if(t.isSelectable?t.isSelectable(n):Et(n))return n;n=n.parentElement;}return null}function Et(e){let t=e.tagName;return !(t==="HTML"||t==="BODY")}function Le(e){let t=e.getBoundingClientRect(),n={selector:yt(e),tagName:e.tagName.toLowerCase(),rect:le(t),pageRect:pt(t)},o=e.getAttribute("id");o&&(n.id=o);let r=e.className;typeof r=="string"&&r.trim()&&(n.className=r);let i=de(e);i&&(n.textSnippet=i);let s=ue(e)??fe(e);s&&(n.componentName=s);let a=wt(e);return a&&(n.testId=a),n}var pe=null;async function Ne(){return pe||(pe=import('html-to-image')),pe}async function vt(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 Oe(e,t){let{width:n,height:o}=await vt(e);return {dataUrl:e,mime:t,width:n,height:o}}function z(e){if(e?.aborted)throw new Error("Aborted")}function Ue(){return {async captureElement(e,t){if(!E())throw new Error("captureElement can only run in the browser");z(t.signal);let n=await Ne();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 Oe(o,t.mime)},async captureFullPage(e){if(!E())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)),s=Math.max(1,Math.round(o*r)),a=await Ne();z(e.signal);let c=e.mime==="image/jpeg"?await a.toJpeg(t,{width:i,height:s,quality:e.quality??.92,pixelRatio:e.pixelRatio}):await a.toPng(t,{width:i,height:s,pixelRatio:e.pixelRatio});return z(e.signal),await Oe(c,e.mime)}}}function St(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:St(t)};return n&&(o.detail=n),o}var kt=12e3,_t=2048,Tt=.92;function Ve(){return Date.now()}function At(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 He(e,t,n){let o=new Promise((i,s)=>{let a=setTimeout(()=>s(new Error("Timeout")),t);typeof a.unref=="function"&&a.unref();}),r=[e,o];return n&&r.push(At(n)),await Promise.race(r)}function Rt(e){if(!E())return 1;let t=window.devicePixelRatio||1,n=e?.pixelRatio??Math.min(t,2);return Math.max(.1,n)}function xt(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 $e(e){let{selectionElement:t,capture:n,signal:o}=e;if(!E()||!xt(n))return;let r=Ve(),i=[],s=n?.timeoutMs??kt,a=n?.maxDimension??_t,c=n?.mime??"image/png",l=n?.quality??Tt,b=n?.adapter??Ue(),f={},d=Rt(n);if(n?.element&&t)try{let g=t.getBoundingClientRect(),m=Math.min(1,a/Math.max(g.width,g.height)),p=Math.min(d,d*m),M=await He(Promise.resolve(b.captureElement(t,{...qe({mime:c,quality:l,pixelRatio:p,maxDimension:a,includeQuality:c==="image/jpeg",...o?{signal:o}:{}})})),s,o);f.element=M;}catch(g){if(o?.aborted)throw g;i.push(w("capture_failed",g,{target:"element"}));}if(n?.fullPage)try{let g=await He(Promise.resolve(b.captureFullPage(qe({mime:c,quality:l,pixelRatio:d,maxDimension:a,includeQuality:c==="image/jpeg",...o?{signal:o}:{}}))),s,o);f.fullPage=g;}catch(g){if(o?.aborted)throw g;i.push(w("capture_failed",g,{target:"fullPage"}));}let y=Ve(),u={startedAt:r,finishedAt:y,durationMs:Math.max(0,y-r)};return i.length>0&&(u.errors=i),{...f,diagnostics:u}}function Pt(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function Ct(){return E()?{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:Pt()}:{}}function Ft(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 ze(e){let{config:t,context:n,user:o}=e;if(t?.enabled===false)return {};let r={...Ct(),...Ft(o)},i=t?.enrich;if(!i)return r;try{let s=await i(n);return {...r,...s}}catch(s){let a=w("unknown",s);return {...r,blocfeedMetadataError:a.message}}}var K="blocfeed-queue",Mt=50;function ge(){if(!E())return [];try{let e=localStorage.getItem(K);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(K);}catch{}return []}catch(e){console.warn("[BlocFeed] offline queue could not be read \u2014 resetting",e);try{localStorage.removeItem(K);}catch{}return []}}function he(e){if(E())try{e.length===0?localStorage.removeItem(K):localStorage.setItem(K,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 It(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 we(e){let t=ge(),n=It(e);for(n.metadata={...n.metadata,_queued:true},t.push({payload:n,timestamp:Date.now()});t.length>Mt;)t.shift();he(t);}function Xe(){let e=ge();return e.length===0?[]:(he([]),e.map(t=>t.payload))}function Fn(){he([]);}function Mn(){return ge().length}var Bt=200,W=[],je=0,J=false;function Ze(e){let t=e.target;if(!(t instanceof Element)||t.closest("[data-blocfeed-ui]"))return;let n={timestampMs:Date.now()-je,path:window.location.pathname,tagName:t.tagName.toLowerCase()},o=de(t,100);o&&(n.textSnippet=o);let r=ue(t)??fe(t);r&&(n.componentName=r),W.length<Bt&&W.push(n);}var Ke={capture:true,passive:true};function We(){J||!E()||(J=true,W=[],je=Date.now(),document.addEventListener("click",Ze,Ke));}function Qe(){J&&(J=false,document.removeEventListener("click",Ze,Ke));}function Dt(){return [...W]}function Lt(){W=[];}var Nt=3e4,Ot=25e5,Ye="video/webm",Ut=250,Vt=1e3,Ht=["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];function Ge(){if(typeof MediaRecorder>"u")return null;for(let e of Ht)if(MediaRecorder.isTypeSupported(e))return e;return null}function qt(){return !E()||typeof navigator?.mediaDevices?.getDisplayMedia!="function"?false:Ge()!==null}async function be(e){let{config:t,signal:n}=e;if(!E()||typeof navigator?.mediaDevices?.getDisplayMedia!="function")throw w("recording_failed",new Error("Screen recording is not supported in this browser"));let o=Ge();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(m){let p=m instanceof DOMException&&m.name==="NotAllowedError"?"Screen share permission denied":"Failed to start screen share";throw w("recording_failed",new Error(p))}if(n?.aborted)throw r.getTracks().forEach(m=>m.stop()),w("aborted",new Error("Recording aborted after permission"));let i=t?.maxDurationMs??Nt,s=t?.videoBitsPerSecond??Ot,a=new MediaRecorder(r,{mimeType:o,videoBitsPerSecond:s}),c=[],l=[],b=0,f=null,d=null,y=false,u=()=>{Qe(),f!==null&&(clearInterval(f),f=null),d!==null&&(clearTimeout(d),d=null),r.getTracks().forEach(m=>m.stop());},g=new Promise((m,p)=>{a.ondataavailable=_=>{_.data.size>0&&c.push(_.data);},a.onstop=()=>{if(y)return;y=true,u();let _=Date.now()-b,C=new Blob(c,{type:Ye}),S=URL.createObjectURL(C);m({mime:Ye,blobUrl:S,blob:C,durationMs:_,sizeBytes:C.size});},a.onerror=()=>{y||(y=true,u(),p(w("recording_failed",new Error("MediaRecorder error"))));};let M=r.getVideoTracks()[0];if(M&&M.addEventListener("ended",()=>{a.state!=="inactive"&&a.stop();}),n){let _=()=>{y||(y=true,a.state!=="inactive"&&a.stop(),u(),p(w("aborted",new Error("Recording aborted"))));};n.addEventListener("abort",_,{once:true});}});return a.start(Vt),We(),b=Date.now(),f=setInterval(()=>{let m=Date.now()-b;for(let p of l)p(m);},Ut),d=setTimeout(()=>{!y&&a.state!=="inactive"&&a.stop();},i),{result:g,stop(){!y&&a.state!=="inactive"&&a.stop();},onTick(m){l.push(m);},abort(){y||(y=true,a.state!=="inactive"&&a.stop(),u());}}}var $t=6e4,Je="audio/webm",zt=250,Xt=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus"];function et(){if(typeof MediaRecorder>"u")return null;for(let e of Xt)if(MediaRecorder.isTypeSupported(e))return e;return null}function jt(){return !E()||typeof navigator?.mediaDevices?.getUserMedia!="function"?false:et()!==null}async function ye(e){let{config:t,signal:n}=e;if(!E()||typeof navigator?.mediaDevices?.getUserMedia!="function")throw w("recording_failed",new Error("Microphone recording is not supported in this browser"));let o=et();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(g){let m=g instanceof DOMException&&g.name==="NotAllowedError"?"Microphone permission denied":"Failed to access microphone";throw w("recording_failed",new Error(m))}if(n?.aborted)throw r.getTracks().forEach(g=>g.stop()),w("aborted",new Error("Voice recording aborted after permission"));let i=t?.maxDurationMs??$t,s=new MediaRecorder(r,{mimeType:o}),a=[],c=[],l=0,b=null,f=null,d=false,y=()=>{b!==null&&(clearInterval(b),b=null),f!==null&&(clearTimeout(f),f=null),r.getTracks().forEach(g=>g.stop());},u=new Promise((g,m)=>{if(s.ondataavailable=p=>{p.data.size>0&&a.push(p.data);},s.onstop=()=>{if(d)return;d=true,y();let p=Date.now()-l,M=new Blob(a,{type:Je});g({blob:M,mime:Je,durationMs:p});},s.onerror=()=>{d||(d=true,y(),m(w("recording_failed",new Error("MediaRecorder error"))));},n){let p=()=>{d||(d=true,s.state!=="inactive"&&s.stop(),y(),m(w("aborted",new Error("Voice recording aborted"))));};n.addEventListener("abort",p,{once:true});}});return s.start(1e3),l=Date.now(),b=setInterval(()=>{let g=Date.now()-l;for(let m of c)m(g);},zt),f=setTimeout(()=>{f=null,!d&&s.state!=="inactive"&&s.stop();},i),{result:u,stop(){!d&&s.state!=="inactive"&&s.stop();},onTick(g){c.push(g);},abort(){d||(d=true,s.state!=="inactive"&&s.stop(),y());}}}var Zt=12e3,Kt=2,Wt=500,Qt=2e3,Ee="https://blocfeed.com/api/feedback",Yt="https://blocfeed.com/api/feedback/voice",tt=0,rt="blocfeed-viewer-token",it="blocfeed-my-feedback-url";function Gt(){try{return localStorage.getItem(rt)}catch{return null}}function Wn(){try{return localStorage.getItem(it)}catch{return null}}function Jt(e,t){try{localStorage.setItem(rt,e),t&&localStorage.setItem(it,t);}catch{}}function nt(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 en(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),s=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)s[a]=i.charCodeAt(a);return new Blob([s],{type:r})}function nn(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 ot(e,t,n){let o=tn(t);await fetch(e,{method:"PUT",body:o,headers:{"content-type":o.type},...n?{signal:n}:{}});}async function on(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(`${Ee}/${t}/screenshots`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i),...r?{signal:r}:{}});}async function rn(e){await fetch(`${Ee}/${e.feedbackId}/video`,{method:"POST",body:e.blob,headers:{"content-type":e.blob.type},...e.signal?{signal:e.signal}:{}});}async function st(e){let{signal:t,transport:n}=e;if(Date.now()-tt<Qt)return {ok:false,error:w("configuration",new Error("Please wait before submitting again"))};let r=n?.timeoutMs??Zt,i=n?.maxAttempts??Kt,s=n?.backoffMs??Wt,a=!!(e.payload.screenshots?.element?.dataUrl||e.payload.screenshots?.fullPage?.dataUrl),c=!!e.payload.video?.blob,l=a||c,{lean:b,extracted:f,extractedVideo:d}=l?nn(e.payload):{lean:e.payload,extracted:{},extractedVideo:{}},y=Gt();y&&(b.viewer_token=y);let u={...f,...e.screenshotDataUrls};for(let g=1;g<=i;g+=1){let m=new AbortController,p=setTimeout(()=>m.abort(),r),M=()=>m.abort();t&&t.addEventListener("abort",M,{once:true});try{let _=await fetch(Ee,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b),signal:m.signal});if(_.ok){tt=Date.now();let S;try{S=await _.json();}catch{}if(S?.viewer_token&&Jt(S.viewer_token,S.my_feedback_url),(u.element||u.fullPage)&&S){let F=S.upload_urls;if(F){let $=[];u.element&&F.element&&$.push(ot(F.element,u.element,t)),u.fullPage&&F.fullPage&&$.push(ot(F.fullPage,u.fullPage,t));try{await Promise.all($);}catch{}}else if(S.feedback_id)try{await on({feedbackId:S.feedback_id,extracted:u,screenshots:e.payload.screenshots,...t?{signal:t}:{}});}catch{}}if(d.blob&&S){let F=S.upload_urls;if(F?.video)try{await fetch(F.video,{method:"PUT",body:d.blob,headers:{"content-type":d.blob.type},...t?{signal:t}:{}});}catch{}else if(S.feedback_id)try{await rn({feedbackId:S.feedback_id,blob:d.blob,...t?{signal:t}:{}});}catch{}}let q={ok:!0,status:_.status};return S&&(q.apiResponse=S),q}if(g<i&&en(_.status)){let S=.85+Math.random()*.3,B=Math.round(s*2**(g-1)*S);await nt(B,t);continue}let C=`HTTP ${_.status}`;try{let S=await _.json();S?.error&&(C=S.error);}catch{}return {ok:!1,status:_.status,error:w("api_failed",new Error(C))}}catch(_){if(m.signal.aborted||t?.aborted)return {ok:false,error:w("aborted",_)};if(g<i){let C=.85+Math.random()*.3,S=Math.round(s*2**(g-1)*C);await nt(S,t);continue}return {ok:false,error:w("api_failed",_)}}finally{clearTimeout(p),t&&t.removeEventListener("abort",M);}}return {ok:false,error:w("api_failed",new Error("Failed"))}}async function at(e){let{blob:t,mime:n,blocfeedId:o,signal:r}=e,i=await fetch(Yt,{method:"POST",headers:{"Content-Type":n,"X-Blocfeed-Id":o},body:t,...r?{signal:r}:{}});if(!i.ok){let a=await i.json().catch(()=>({error:"Unknown error"}));throw w("api_failed",new Error(a?.error??`Voice API returned ${i.status}`))}let s=await i.json();return {text:s.text??"",warning:s.warning}}function ve(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 ee(e){return e instanceof Element?!!e.closest("[data-blocfeed-ui]"):false}function te(e){e.stopPropagation(),e.stopImmediatePropagation?.();}function ct(e,t){if(!E())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,s=null,a=(u,g=false)=>{if(!u){i=null,s=null,t.onHover(null);return}let m=le(u.getBoundingClientRect()),p=`${Math.round(m.x)}:${Math.round(m.y)}:${Math.round(m.width)}:${Math.round(m.height)}`;!g&&u===i&&p===s||(i=u,s=p,t.onHover({element:u,rect:m}));},c=ve(u=>{if(ee(u.target))return;let g=document.elementFromPoint(u.clientX,u.clientY),m=me(g,r);a(m);}),l=ve(()=>{i&&a(i,true);}),b=u=>{ee(u.target)||(te(u),u.pointerType==="mouse"&&u.preventDefault());},f=u=>{ee(u.target)||(te(u),u.pointerType==="mouse"&&u.preventDefault());},d=u=>{if(ee(u.target))return;te(u),u.preventDefault();let g=document.elementFromPoint(u.clientX,u.clientY),m=me(g,r);m&&t.onSelect({element:m,descriptor:Le(m)});},y=u=>{u.key==="Escape"&&(te(u),u.preventDefault(),t.onCancel());};return window.addEventListener("pointermove",c,{capture:true,passive:true}),window.addEventListener("pointerdown",b,{capture:true}),window.addEventListener("pointerup",f,{capture:true}),window.addEventListener("click",d,{capture:true}),window.addEventListener("keydown",y,{capture:true}),window.addEventListener("scroll",l,{capture:true,passive:true}),window.addEventListener("resize",l,{passive:true}),{stop(){window.removeEventListener("pointermove",c,{capture:true}),window.removeEventListener("pointerdown",b,{capture:true}),window.removeEventListener("pointerup",f,{capture:true}),window.removeEventListener("click",d,{capture:true}),window.removeEventListener("keydown",y,{capture:true}),window.removeEventListener("scroll",l,{capture:true}),window.removeEventListener("resize",l),c.cancel(),l.cancel(),t.onHover(null);}}}async function Se(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 st(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 sn=["[data-blocfeed-ui]","[data-blocfeed-ignore]"];function an(e){let t=[...sn,...e?.ignoreSelectors??[]],n=Array.from(new Set(t));return {...e,ignoreSelectors:n}}function lt(){return {phase:"idle"}}function cn(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 go(e){let t=e,n=lt(),o=new Set,r=new Set,i=null,s=null,a=null,c=null,l=0,b=null,f=null,d=null,y=null,u=false,g=()=>{for(let h of o)h(n);},m=h=>{for(let v of r)v(h);},p=h=>{n=h,g();},M=()=>{l+=1,c?.abort(),c=null;},_=()=>{i?.stop(),i=null,m(null),a!==null&&E()&&(document.documentElement.style.cursor=a,a=null);},C=()=>{if(d){try{URL.revokeObjectURL(d.blobUrl);}catch{}d=null;}},S=()=>{f&&(f.abort(),f=null),C();},B=null,q=()=>{y&&(y.abort(),y=null),B&&(B.abort(),B=null);},F=()=>{M(),_(),S(),q(),s=null,p(lt());},$=()=>{if(!E())return;_(),s=null;let h=an(t.picker);a=document.documentElement.style.cursor,document.documentElement.style.cursor="crosshair",p({phase:"picking"}),i=ct(h,{onHover:m,onSelect:({element:v,descriptor:x})=>{s=v,_(),p({phase:"review",selection:x});},onCancel:()=>{F();}});},Pe=()=>{let h=Xe();if(h.length!==0)for(let v of h)Se({payload:v,...t.transport?{transport:t.transport}:{}}).catch(()=>{we(v);});};if(E()){setTimeout(Pe,1e3);let h=()=>Pe();window.addEventListener("online",h),b=()=>window.removeEventListener("online",h);}return {getState:()=>n,getConfig:()=>t,subscribe(h){return o.add(h),()=>o.delete(h)},subscribeHover(h){return r.add(h),()=>r.delete(h)},start(){n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording"||n.phase!=="picking"&&$();},stop(){F();},clearSelection(){n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording"||$();},setConfig(h){t=h;},async submit(h,v){if(!E()){let T=w("configuration",new Error("BlocFeed submit can only run in the browser"));return p({phase:"error",lastError:T}),{ok:false}}let x=t.blocfeed_id?.trim?.()??"";if(!x){let I={phase:"error",lastError:w("configuration",new Error("Missing blocfeed_id. Create a project in BlocFeed and pass its blocfeed_id."))};return n.selection&&(I.selection=n.selection),p(I),{ok:false}}if(u)return {ok:false};if(n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording")return {ok:false};u=true;let R=l+1;l=R,c?.abort(),c=new AbortController;let A=c.signal,k=n.selection,D=v?.capture?{...t.capture,...v.capture}:t.capture,O=!!(D?.element||D?.fullPage),X={phase:O?"capturing":"submitting"};k&&(X.selection=k),p(X);try{let T=O?await $e({selectionElement:s,capture:D,signal:A}):void 0;if(A.aborted||l!==R)return {ok:!1};let I={phase:"submitting"};k&&(I.selection=k),T&&(I.capture=T),p(I);let L={};k&&(L.selection=k),T&&(L.capture=T);let j=await ze({config:t.metadata,context:L,...t.user?{user:t.user}:{}}),U={version:1,createdAt:new Date().toISOString(),blocfeed_id:x,message:h,metadata:j};v?.category&&(U.category=v.category),t.user&&(U.user=t.user),k&&(U.selection=k),T&&(U.screenshots=T),d&&(U.video=d);let{result:N}=await Se({payload:U,signal:A,...t.transport?{transport:t.transport}:{}});if(A.aborted||l!==R)return N;if(N.ok){C(),s=null;let ce={phase:"success",lastSubmit:N};return k&&(ce.selection=k),T&&(ce.capture=T),p(ce),N}cn(N)&&we(U);let mt=N.api?.error??w("unknown",new Error("Submission failed")),ae={phase:"error",lastSubmit:N,lastError:mt};return k&&(ae.selection=k),T&&(ae.capture=T),p(ae),N}catch(T){if(A.aborted||l!==R)return {ok:false};let L={phase:"error",lastError:A.aborted?w("aborted",T):w("unknown",T)};return k&&(L.selection=k),p(L),{ok:false}}finally{u=false,l===R&&(c=null);}},async startRecording(){if(n.phase!=="review"||!t.recording?.enabled||y||f)return;let h=n.selection,v={phase:"recording",recordingElapsedMs:0};h&&(v.selection=h),p(v);try{let x={config:t.recording};c&&(x.signal=c.signal);let R=await be(x);f=R,R.onTick(D=>{if(n.phase==="recording"){let O={phase:"recording",recordingElapsedMs:D};h&&(O.selection=h),p(O);}});let A=await R.result;f=null,d=A;let k={phase:"review",video:A};h&&(k.selection=h),p(k);}catch(x){f=null;let A={phase:"review",lastError:x?.kind?x:w("recording_failed",x)};h&&(A.selection=h),p(A);}},stopRecording(){n.phase!=="recording"||!f||f.stop();},removeVideo(){C();let h=n.selection,v={phase:"review"};h&&(v.selection=h),p(v);},async startVoice(){if(n.phase!=="review"){console.warn("[BlocFeed] startVoice: ignored \u2014 phase is",n.phase,'(expected "review")');return}let h=t.voice;if(!h?.enabled){console.warn("[BlocFeed] startVoice: ignored \u2014 voice is not enabled in config");return}if(f){console.warn("[BlocFeed] startVoice: ignored \u2014 a screen recording is already in progress");return}q();let v=n.selection,x={phase:"review",voiceRecording:true,voiceElapsedMs:0};v&&(x.selection=v),d&&(x.video=d),p(x);try{let R={config:h};c&&(R.signal=c.signal);let A=await ye(R);y=A,A.onTick(L=>{let j={phase:"review",voiceRecording:!0,voiceElapsedMs:L};v&&(j.selection=v),d&&(j.video=d),p(j);});let k=await A.result;y=null;let D={phase:"review",voiceRecording:!1,voiceTranscribing:!0};v&&(D.selection=v),d&&(D.video=d),p(D),B=new AbortController;let O={blob:k.blob,mime:k.mime,blocfeedId:t.blocfeed_id,signal:B.signal},{text:Ce,warning:X}=await at(O);B=null;let T={phase:"review",voiceRecording:!1,voiceTranscribing:!1};v&&(T.selection=v),d&&(T.video=d),p(T);let I={text:Ce};return X&&(I.warning=X),I}catch(R){q();let A=R?.kind?R:w("recording_failed",R);console.warn("[BlocFeed] Voice error:",A.message);let k={phase:"review",voiceRecording:false,voiceTranscribing:false,lastError:A};v&&(k.selection=v),d&&(k.video=d),p(k);return}},stopVoice(){y&&y.stop();},__unsafeGetSelectedElement(){return s},destroy(){F(),o.clear(),r.clear(),b?.(),b=null;}}}var Q=[],Y=[],dt=20,ut=15,ne=[],ft=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)}:{},oe=typeof globalThis<"u"&&typeof globalThis.fetch=="function"?globalThis.fetch:void 0,re=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.open:void 0,ie=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.send:void 0,_e=new Set,Te=false,Ae=false,se=false,ln=["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 dn(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 un(e,t){let n=t.map(dn).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)),Q.push(r);Q.length>dt;)Q.shift();}function ke(e){let t=e.url.toLowerCase();for(let n of ne)if(t.includes(n))return;for(Y.push(e);Y.length>ut;)Y.shift();}function bo(e={}){if(se||!E())return;se=true,dt=e.consoleLimit??20,ut=e.networkLimit??15;let t=e.ignoreUrls;if(t!==void 0?ne=t.map(n=>n.toLowerCase()):ne=[...ln],e.console!==false){let n=e.consoleLevels??["error","warn"];for(let o of n){let r=ft[o];r&&(_e.add(o),console[o]=(...i)=>{un(o,i),r.apply(console,i);});}}if(e.network!==false&&oe){let n=oe;Te=true,window.fetch=async function(r,i){let s=typeof r=="string"?r:r instanceof URL?r.toString():r.url,a=(i?.method??"GET").toUpperCase(),c=Date.now();try{let l=await n.call(window,r,i);return l.ok||ke({url:s.slice(0,500),method:a,status:l.status,statusText:l.statusText,timestamp:c,durationMs:Date.now()-c}),l}catch(l){throw ke({url:s.slice(0,500),method:a,status:0,statusText:l instanceof Error?l.message:"Network error",timestamp:c,durationMs:Date.now()-c}),l}};}if(e.network!==false&&re&&ie){let n=re,o=ie;Ae=true,XMLHttpRequest.prototype.open=function(r,i,...s){return this.__bf_method=r.toUpperCase(),this.__bf_url=String(i),n.apply(this,[r,i,...s])},XMLHttpRequest.prototype.send=function(...r){let i=this.__bf_method||"GET",s=this.__bf_url||"",a=Date.now();return this.addEventListener("loadend",function(){if(this.status>=400||this.status===0){let c={url:s.slice(0,500),method:i,status:this.status,timestamp:a,durationMs:Date.now()-a};this.statusText&&(c.statusText=this.statusText),ke(c);}},{once:true}),o.apply(this,r)};}}function yo(){if(se){for(let e of _e){let t=ft[e];t&&(console[e]=t);}_e.clear(),Te&&oe&&(window.fetch=oe,Te=false),Ae&&re&&ie&&(XMLHttpRequest.prototype.open=re,XMLHttpRequest.prototype.send=ie,Ae=false),ne=[],se=false;}}function Eo(){return {consoleLogs:[...Q],networkErrors:[...Y]}}function vo(){Q=[],Y=[];}var fn=[{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}/}],H=[],xe=0,Re=false;function mn(e){let t=e.slice(0,80);return t.length<=6?"***":t.slice(0,6)+"***"}function pn(e,t,n,o){if(H.some(s=>s.rule===e&&s.source===t))return;let i={rule:e,source:t,hint:mn(n),timestamp:Date.now()};o&&(i.location=o),H.push(i);}function G(e,t,n,o){for(let{name:r,pattern:i}of n){let s=i.exec(e);s&&pn(r,t,s[0],o);}}function gn(e){try{let t=window;if(t.__NEXT_DATA__){let n=JSON.stringify(t.__NEXT_DATA__);G(n,"hydration",e,"__NEXT_DATA__");}if(t.__NUXT__){let n=JSON.stringify(t.__NUXT__);G(n,"hydration",e,"__NUXT__");}}catch{}}function hn(e){try{document.querySelectorAll("script:not([src])").forEach((n,o)=>{let r=n.textContent;r&&r.length>0&&G(r,"scripts",e,`inline-script[${o}]`);});}catch{}}function wn(e){try{document.querySelectorAll("meta[content]").forEach(n=>{let o=n.getAttribute("content"),r=n.getAttribute("name")||n.getAttribute("property")||"";o&&o.length>10&&G(o,"meta",e,r?`meta[${r}]`:void 0);});}catch{}}function bn(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&&G(i.value,"dom",e,`${n.tagName.toLowerCase()}[${i.name}]`);}});}catch{}}function _o(e={}){if(Re||!E()||(Re=true,e.secretScan===false))return;let t=[...fn,...e.customPatterns??[]],n=e.scanTargets??["hydration","scripts","meta","dom"];setTimeout(()=>{xe=Date.now(),n.includes("hydration")&&gn(t),n.includes("scripts")&&hn(t),n.includes("meta")&&wn(t),n.includes("dom")&&bn(t);let o=e.notify??"both";H.length>0&&(o==="console"||o==="both")&&console.warn(`[BlocFeed Security] Found ${H.length} potential secret(s) exposed in client code:`,H.map(r=>`${r.rule} (${r.source}${r.location?`: ${r.location}`:""})`));},100);}function To(){return {findings:[...H],scannedAt:xe}}function Ao(){H=[],xe=0,Re=false;}
2
+ export{E as a,le as b,Ue as c,$e as d,ze as e,we as f,Xe as g,Fn as h,Mn as i,Dt as j,Lt as k,qt as l,be as m,jt as n,ye as o,Gt as p,Wn as q,at as r,go as s,bo as t,yo as u,Eo as v,vo as w,_o as x,To as y,Ao as z};
package/dist/engine.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';var chunkVK43CZAG_cjs=require('./chunk-VK43CZAG.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(!chunkVK43CZAG_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(!chunkVK43CZAG_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 chunkVK43CZAG_cjs.k}});Object.defineProperty(exports,"clearDiagnostics",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.w}});Object.defineProperty(exports,"clearQueue",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.h}});Object.defineProperty(exports,"clearSecurityFindings",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.z}});Object.defineProperty(exports,"collectMetadata",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.e}});Object.defineProperty(exports,"createBlocFeedController",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.s}});Object.defineProperty(exports,"createHtmlToImageAdapter",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.c}});Object.defineProperty(exports,"dequeueAll",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.g}});Object.defineProperty(exports,"drainClickEvents",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.j}});Object.defineProperty(exports,"drainDiagnostics",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.v}});Object.defineProperty(exports,"enqueue",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.f}});Object.defineProperty(exports,"getMyFeedbackUrl",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.q}});Object.defineProperty(exports,"getQueueSize",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.i}});Object.defineProperty(exports,"getSecurityFindings",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.y}});Object.defineProperty(exports,"getViewerToken",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.p}});Object.defineProperty(exports,"installDiagnostics",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.t}});Object.defineProperty(exports,"isRecordingSupported",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.l}});Object.defineProperty(exports,"isVoiceSupported",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.n}});Object.defineProperty(exports,"runCapture",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.d}});Object.defineProperty(exports,"runSecretScan",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.x}});Object.defineProperty(exports,"startRecording",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.m}});Object.defineProperty(exports,"startVoiceRecording",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.o}});Object.defineProperty(exports,"transcribeAudio",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.r}});Object.defineProperty(exports,"uninstallDiagnostics",{enumerable:true,get:function(){return chunkVK43CZAG_cjs.u}});exports.createModernScreenshotAdapter=U;exports.dataUrlToBlob=O;
1
+ 'use strict';var chunkEZWTVVJ5_cjs=require('./chunk-EZWTVVJ5.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(!chunkEZWTVVJ5_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(!chunkEZWTVVJ5_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 chunkEZWTVVJ5_cjs.k}});Object.defineProperty(exports,"clearDiagnostics",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.w}});Object.defineProperty(exports,"clearQueue",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.h}});Object.defineProperty(exports,"clearSecurityFindings",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.z}});Object.defineProperty(exports,"collectMetadata",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.e}});Object.defineProperty(exports,"createBlocFeedController",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.s}});Object.defineProperty(exports,"createHtmlToImageAdapter",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.c}});Object.defineProperty(exports,"dequeueAll",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.g}});Object.defineProperty(exports,"drainClickEvents",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.j}});Object.defineProperty(exports,"drainDiagnostics",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.v}});Object.defineProperty(exports,"enqueue",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.f}});Object.defineProperty(exports,"getMyFeedbackUrl",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.q}});Object.defineProperty(exports,"getQueueSize",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.i}});Object.defineProperty(exports,"getSecurityFindings",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.y}});Object.defineProperty(exports,"getViewerToken",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.p}});Object.defineProperty(exports,"installDiagnostics",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.t}});Object.defineProperty(exports,"isRecordingSupported",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.l}});Object.defineProperty(exports,"isVoiceSupported",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.n}});Object.defineProperty(exports,"runCapture",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.d}});Object.defineProperty(exports,"runSecretScan",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.x}});Object.defineProperty(exports,"startRecording",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.m}});Object.defineProperty(exports,"startVoiceRecording",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.o}});Object.defineProperty(exports,"transcribeAudio",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.r}});Object.defineProperty(exports,"uninstallDiagnostics",{enumerable:true,get:function(){return chunkEZWTVVJ5_cjs.u}});exports.createModernScreenshotAdapter=U;exports.dataUrlToBlob=O;
package/dist/engine.js CHANGED
@@ -1 +1 @@
1
- import {a}from'./chunk-EADEWOWW.js';export{k as clearClickEvents,w as clearDiagnostics,h as clearQueue,z as clearSecurityFindings,e as collectMetadata,s as createBlocFeedController,c as createHtmlToImageAdapter,g as dequeueAll,j as drainClickEvents,v as drainDiagnostics,f as enqueue,q as getMyFeedbackUrl,i as getQueueSize,y as getSecurityFindings,p as getViewerToken,t as installDiagnostics,l as isRecordingSupported,n as isVoiceSupported,d as runCapture,x as runSecretScan,m as startRecording,o as startVoiceRecording,r as transcribeAudio,u as uninstallDiagnostics}from'./chunk-EADEWOWW.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-PUVKSWVE.js';export{k as clearClickEvents,w as clearDiagnostics,h as clearQueue,z as clearSecurityFindings,e as collectMetadata,s as createBlocFeedController,c as createHtmlToImageAdapter,g as dequeueAll,j as drainClickEvents,v as drainDiagnostics,f as enqueue,q as getMyFeedbackUrl,i as getQueueSize,y as getSecurityFindings,p as getViewerToken,t as installDiagnostics,l as isRecordingSupported,n as isVoiceSupported,d as runCapture,x as runSecretScan,m as startRecording,o as startVoiceRecording,r as transcribeAudio,u as uninstallDiagnostics}from'./chunk-PUVKSWVE.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 chunkVK43CZAG_cjs=require('./chunk-VK43CZAG.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(()=>chunkVK43CZAG_cjs.s({...t.config??{},blocfeed_id:t.blocfeed_id}),[]),[a,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:a},children:t.children})}var Fe="blocfeed-styles-v1",Mt=`
2
+ 'use strict';var chunkEZWTVVJ5_cjs=require('./chunk-EZWTVVJ5.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(()=>chunkEZWTVVJ5_cjs.s({...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",zt=`
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 Re(){if(!chunkVK43CZAG_cjs.a()||document.getElementById(Fe))return;let t=document.createElement("style");t.id=Fe,t.textContent=Mt,document.head.appendChild(t);}var Me={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?{...Me,...t}:Me}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 w(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 Le({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 We({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){return a?jsxRuntime.jsxs("button",{className:w(t),type:"button",onClick:e,"aria-label":r,children:[f?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]}),i>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]}):null}function m(){let[t,e]=react.useState(()=>typeof window>"u"?false:window.matchMedia("(prefers-reduced-motion: reduce)").matches);return react.useEffect(()=>{let a=window.matchMedia("(prefers-reduced-motion: reduce)"),r=i=>e(i.matches);return a.addEventListener("change",r),()=>a.removeEventListener("change",r)},[]),t}var Ht={duration:.18,ease:"easeOut"},Ot={duration:0};function He({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=react.useState(false),o=m(),c=o?Ot:Ht;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:a&&jsxRuntime.jsx(framerMotion.motion.button,{className:w(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:f?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")}),i>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"dot")})}var Kt={duration:.18,ease:"easeOut"},De={duration:0};function $e({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=react.useState(false),o=m(),c=o?De:Kt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:a&&jsxRuntime.jsxs(framerMotion.motion.div,{className:w(t),initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{y:8,opacity:0},transition:c,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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?De:{y:{duration:3,repeat:1/0,ease:"easeInOut"}},whileHover:{scale:1.1,borderColor:"var(--bf-accent)"},whileTap:{scale:.9},children:[f?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(Le,{size:16}),i>0&&jsxRuntime.jsx("span",{className:"bf-badge bf-badge-float","aria-label":`${i} queued`,children:i})]})]},"bubble")})}var Yt={duration:.2,ease:"easeOut"},Gt={duration:0};function Ue(t){return t==="bottom-left"||t==="top-left"}function jt(t){return `bf-trigger-edge ${Ue(t)?"bf-trigger-edge-left":"bf-trigger-edge-right"}`}function Xe({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=react.useState(false),o=Ue(t),c=m(),h=c?Gt:Yt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:a&&jsxRuntime.jsx(framerMotion.motion.button,{className:jt(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:h,whileTap:{scale:.97},style:{top:"50%",translateY:"-50%"},children:f?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:h,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:h,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)"}}),i>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"edge-tab")})}var Jt={duration:.18,ease:"easeOut"},Zt={duration:0};function Ge({delay:t,hovered:e,reduced:a}){return a?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:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=react.useState(false),o=m(),c=o?Zt:Jt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:a&&jsxRuntime.jsx(framerMotion.motion.button,{className:w(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:f?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(Ge,{delay:0,hovered:n,reduced:o}),jsxRuntime.jsx(Ge,{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")}),i>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"pulse-ring")})}var ro={duration:.18,ease:"easeOut"},io={duration:0};function ao(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 Ze({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=react.useState(false),o=m(),c=o?io:ro;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:a&&jsxRuntime.jsxs(framerMotion.motion.button,{className:ao(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:[f?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}),i>0&&jsxRuntime.jsx("span",{className:"bf-badge",style:{marginLeft:"4px"},"aria-label":`${i} queued`,children:i})]}),!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 co={duration:.18,ease:"easeOut"},lo={duration:0};function tt({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=react.useState(false),o=m(),c=o?lo:co;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:a&&jsxRuntime.jsx(framerMotion.motion.button,{className:w(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:f?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")}),i>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"icon-pop")})}var bo={duration:.18,ease:"easeOut"},go={duration:0};function it({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=react.useState(false),o=m(),c=o?go:bo;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:a&&jsxRuntime.jsx(framerMotion.motion.button,{className:w(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:f?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")}),i>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"beacon")})}var yo={duration:.18,ease:"easeOut"},wo={duration:0};function ct({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=react.useState(false),[o,c]=react.useState(0),h=m(),z=h?wo:yo,p=react.useRef(null);react.useEffect(()=>{if(p.current&&(clearInterval(p.current),p.current=null),!a||n||h){c(n||h?r.length:0);return}let b=8,B=r.length*2+b*2,v=0;return p.current=setInterval(()=>{v=(v+1)%B,v<=r.length?c(v):v<=r.length+b?c(r.length):v<=r.length*2+b?c(r.length*2+b-v):c(0);},100),()=>{p.current&&(clearInterval(p.current),p.current=null);}},[a,n,h,r]);let S=r.slice(0,o);return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:a&&jsxRuntime.jsx(framerMotion.motion.button,{className:w(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(false),"aria-label":r,initial:{opacity:0,y:h?0:5},animate:{opacity:1,y:0},exit:{opacity:0,y:h?0:5},transition:z,whileTap:{scale:.95},style:{minWidth:"44px"},children:f?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"})]}),i>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"typewriter")})}function lt(t){switch(t){case "dot":return He;case "bubble":return $e;case "edge-tab":return Xe;case "pulse-ring":return Qe;case "minimal":return Ze;case "icon-pop":return tt;case "beacon":return it;case "typewriter":return ct;default:return We}}function dt(t,e,a){return Math.max(e,Math.min(a,t))}function Co(t,e,a="bottom-right"){let i=window.innerWidth,f=window.innerHeight,n;n=dt(t.x,12,Math.max(12,i-e-12));let d=t.y+t.height+12,o=Math.max(12,t.y-240);return {top:d+240<=f?d:o,left:n}}function Po(t){let{rect:e}=t,a={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:a,"aria-hidden":"true"})}function Bo(t){let e=react.useRef(null);return react.useEffect(()=>{if(!t||!e.current)return;e.current.querySelector(".bf-textarea")?.focus();let r=i=>{if(i.key!=="Tab"||!e.current)return;let f=e.current.querySelectorAll('button:not([disabled]), textarea:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])');if(f.length===0)return;let n=f[0],d=f[f.length-1];i.shiftKey&&document.activeElement===n?(i.preventDefault(),d.focus()):!i.shiftKey&&document.activeElement===d&&(i.preventDefault(),n.focus());};return document.addEventListener("keydown",r,{capture:true}),()=>document.removeEventListener("keydown",r,{capture:true})},[t]),e}function No(t,e){return t?typeof t=="function"?t(e):t.some(a=>a.endsWith("*")?e.startsWith(a.slice(0,-1)):e===a):true}function Fo(t){let[e,a]=react.useState(()=>typeof window<"u"?window.location.pathname:"/");return react.useEffect(()=>{if(typeof window>"u")return;let r=()=>a(window.location.pathname);window.addEventListener("popstate",r);let i=history.pushState,f=history.replaceState;return history.pushState=function(...n){i.apply(this,n),setTimeout(r,0);},history.replaceState=function(...n){f.apply(this,n),setTimeout(r,0);},()=>{window.removeEventListener("popstate",r),history.pushState=i,history.replaceState=f;}},[]),No(t,e)}function Ro(t){let[e,a]=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"){a(t==="light"?"light":"dark");return}let r=window.matchMedia("(prefers-color-scheme: dark)"),i=f=>a(f.matches?"dark":"light");return a(r.matches?"dark":"light"),r.addEventListener("change",i),()=>r.removeEventListener("change",i)},[t]),e}var Mo=["bug","feature","ux","general"],zo={bug:"categoryBug",feature:"categoryFeature",ux:"categoryUx",general:"categoryGeneral"};function X(t){let e=Math.floor(t/1e3),a=Math.floor(e/60),r=e%60;return `${a}:${String(r).padStart(2,"0")}`}function Lo(t){return t<1024*1024?`${Math.round(t/1024)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function Ao(t){let{state:e,controller:a,start:r,stop:i,clearSelection:f,submit:n}=ae(),d=t.config.ui?.position,o=ze(t.config.ui?.strings),c=t.config.ui?.branding!==false,[h,z]=react.useState(null),[p,S]=react.useState(""),[b,B]=react.useState(t.config.capture?.element??true),[v,O]=react.useState(t.config.capture?.fullPage??false),[pt,le]=react.useState(null),[D,de]=react.useState(void 0),fe=t.config.ui?.categories??Mo,ut=t.config.recording?.enabled===true&&chunkVK43CZAG_cjs.l(),bt=t.config.recording?.maxDurationMs??3e4,pe=a.getConfig().voice,gt=pe?.enabled===true&&chunkVK43CZAG_cjs.n(),mt=pe?.maxDurationMs??6e4,[ht,xt]=react.useState(false),[J,vt]=react.useState(0);react.useEffect(()=>{let s=window.setTimeout(()=>{let y=chunkVK43CZAG_cjs.y();vt(y.findings.length);},500);return ()=>window.clearTimeout(s)},[]),react.useImperativeHandle(t.handleRef,()=>({open:r,close:i,submit:s=>n(s),startRecording:()=>a.startRecording(),stopRecording:()=>a.stopRecording(),get isOpen(){return e.phase!=="idle"}}),[r,i,n,a,e.phase]);let ue=e.phase==="review"||e.phase==="capturing"||e.phase==="submitting"||e.phase==="error"||e.phase==="success",yt=Bo(ue),[wt,kt]=react.useState(0);react.useEffect(()=>{e.phase==="idle"&&kt(chunkVK43CZAG_cjs.i());},[e.phase]);let[Tt,be]=react.useState(false),ge=react.useRef(e.phase);react.useEffect(()=>{if(ge.current==="success"&&e.phase==="idle"){be(true);let s=window.setTimeout(()=>be(false),1500);return ()=>window.clearTimeout(s)}ge.current=e.phase;},[e.phase]),react.useEffect(()=>{let s=t.config.ui?.shortcut;if(!s)return;let y=s.toLowerCase().split("+").map(P=>P.trim()),C=y[y.length-1]||"",L=new Set(y.slice(0,-1)),xe=P=>{let Pt=/Mac|iPod|iPhone|iPad/.test(navigator.platform);if(L.has("mod")){if(Pt?!P.metaKey:!P.ctrlKey)return}else if(L.has("ctrl")&&!P.ctrlKey||(L.has("meta")||L.has("cmd"))&&!P.metaKey)return;L.has("shift")&&!P.shiftKey||(L.has("alt")||L.has("option"))&&!P.altKey||P.key.toLowerCase()===C&&(P.preventDefault(),e.phase==="idle"?r():i());};return document.addEventListener("keydown",xe),()=>document.removeEventListener("keydown",xe)},[t.config.ui?.shortcut,e.phase,r,i]),react.useEffect(()=>a.subscribeHover(z),[a]),react.useEffect(()=>{let s=a.__unsafeGetSelectedElement();if(!s||e.phase==="idle"||e.phase==="picking"){le(null);return}let y=()=>{le(chunkVK43CZAG_cjs.b(s.getBoundingClientRect()));};y();let C=()=>y();return window.addEventListener("scroll",C,{capture:true,passive:true}),window.addEventListener("resize",C,{passive:true}),()=>{window.removeEventListener("scroll",C,{capture:true}),window.removeEventListener("resize",C);}},[a,e.phase,e.selection?.selector]),react.useEffect(()=>{e.phase==="review"&&(S(""),B(t.config.capture?.element??true),O(t.config.capture?.fullPage??false),de(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(()=>i(),1200);return ()=>window.clearTimeout(s)},[e.phase,i]);let T=e.phase==="capturing"||e.phase==="submitting",R=e.phase==="picking"?h?.rect??null:pt??e.selection?.rect??null,Z=react.useMemo(()=>R?Co(R,360,d):null,[R?.x,R?.y,R?.width,R?.height,d]),me=e.lastError?.message,ee=react.useCallback(()=>{let s={capture:{element:b,fullPage:v}};D&&(s.category=D),n(p,s);},[n,p,b,v,D]),St=react.useCallback(s=>{(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&p.trim().length>0&&!T&&(s.preventDefault(),ee());},[ee,p,T]),[he,V]=react.useState(null),Et=react.useCallback(async()=>{if(e.voiceRecording){a.stopVoice();return}V(null);let s=await a.startVoice();if(s?.text)S(y=>y?y+" "+s.text:s.text);else if(s?.warning)V(o.voiceEmptyText);else if(!s){let y=a.getState().lastError;if(y){let C=y.message?.toLowerCase()??"";C.includes("denied")||C.includes("permission")||C.includes("not allowed")?V(o.voiceDeniedText):V(o.voiceErrorText);}}},[e.voiceRecording,a,o]),Ct=lt(t.config.ui?.triggerStyle);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(Ct,{position:d,onClick:()=>r(),isVisible:e.phase==="idle",label:t.config.ui?.triggerLabel??o.triggerLabel,queueCount:wt,showSuccess:Tt}),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:()=>i()}),R&&jsxRuntime.jsx(Po,{rect:R}),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:()=>i(),"aria-label":o.cancelButton,children:o.cancelButton})]}),ue&&Z&&jsxRuntime.jsxs("div",{ref:yt,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:()=>f(),disabled:T,"aria-label":o.rePickButton,children:o.rePickButton}),jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>i(),disabled:T,"aria-label":o.closeButton,children:o.closeButton})]})]}),jsxRuntime.jsxs("div",{className:"bf-panelBody",children:[jsxRuntime.jsx("textarea",{className:"bf-textarea",placeholder:o.textareaPlaceholder,value:p,onChange:s=>S(s.target.value),onKeyDown:St,disabled:T,"aria-label":o.panelTitle}),fe.length>0&&jsxRuntime.jsx("div",{className:"bf-pills",role:"group","aria-label":"Feedback category",children:fe.map(s=>jsxRuntime.jsx("button",{type:"button",className:`bf-pill${D===s?" bf-pill-active":""}`,onClick:()=>de(D===s?void 0:s),disabled:T,children:o[zo[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=>B(s.target.checked),disabled:T}),o.screenshotElement]}),jsxRuntime.jsxs("label",{children:[jsxRuntime.jsx("input",{type:"checkbox",checked:v,onChange:s=>O(s.target.checked),disabled:T}),o.screenshotFullPage]})]}),gt&&e.phase==="review"&&!e.voiceTranscribing&&jsxRuntime.jsx("button",{type:"button",className:`bf-voice-btn${e.voiceRecording?" bf-voice-btn-active":""}`,onClick:Et,disabled:T,"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(mt)," \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]}),he&&!e.voiceRecording&&!e.voiceTranscribing&&jsxRuntime.jsx("div",{className:"bf-error",role:"alert",children:he}),ut&&e.phase==="review"&&!e.video&&jsxRuntime.jsxs("button",{type:"button",className:"bf-record-btn",onClick:()=>a.startRecording(),disabled:T,"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:()=>a.removeVideo(),"aria-label":o.removeVideoButton,children:"\xD7"}),jsxRuntime.jsxs("div",{className:"bf-video-meta",children:[o.videoPreviewLabel," (",X(e.video.durationMs),", ",Lo(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"&&me&&jsxRuntime.jsx("div",{className:"bf-error",role:"alert",children:me}),jsxRuntime.jsxs("div",{className:"bf-actions",children:[jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>i(),disabled:T,"aria-label":o.cancelButton,children:o.cancelButton}),jsxRuntime.jsx("button",{type:"button",className:"bf-btn bf-btnPrimary",onClick:ee,disabled:T||p.trim().length===0,"aria-label":o.sendButton,children:o.sendButton})]})]}),c&&jsxRuntime.jsxs("div",{className:"bf-watermark",children:[(()=>{let s=chunkVK43CZAG_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-${d}`,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(bt)]}),jsxRuntime.jsx("button",{type:"button",className:"bf-recording-bar-stop",onClick:()=>a.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=chunkVK43CZAG_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&&!ht&&jsxRuntime.jsxs("div",{className:"bf-security-banner",role:"alert",children:[jsxRuntime.jsx("button",{type:"button",className:"bf-security-banner-dismiss",onClick:()=>xt(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 Io=react.forwardRef(function(e,a){let r={...e.config??{},blocfeed_id:e.blocfeed_id},[i,f]=react.useState(null),n=Fo(r.ui?.showOn),d=Ro(r.ui?.theme?.mode),o=!!r.diagnostics;react.useEffect(()=>{if(o)return chunkVK43CZAG_cjs.t(r.diagnostics),()=>chunkVK43CZAG_cjs.u()},[o]);let c=!!r.security;react.useEffect(()=>{c&&chunkVK43CZAG_cjs.x(r.security);},[c]);let h=react.useRef(e.config?.metadata?.enrich);h.current=e.config?.metadata?.enrich;let z=react.useMemo(()=>{if(e.config)return {...e.config,metadata:{...e.config.metadata,enrich:async p=>{let S=h.current,b=S?await S(p):{},B=chunkVK43CZAG_cjs.v(),v=chunkVK43CZAG_cjs.y(),O=chunkVK43CZAG_cjs.j();return {...b,...B.consoleLogs.length>0?{_consoleLogs:B.consoleLogs}:{},...B.networkErrors.length>0?{_networkErrors:B.networkErrors}:{},...v.findings.length>0?{_securityFindings:v.findings}:{},...O.length>0?{_clickEvents:O}:{}}}}}},[]);return react.useEffect(()=>{Re();let p=document.createElement("div");p.setAttribute("data-blocfeed-ui-root","true"),p.setAttribute("data-blocfeed-ui","true"),p.setAttribute("data-bf-theme",d);let S=r.ui?.zIndex;typeof S=="number"&&p.style.setProperty("--bf-z",String(S));let b=r.ui?.theme;return b&&(b.accentColor&&p.style.setProperty("--bf-accent",b.accentColor),b.panelBackground&&p.style.setProperty("--bf-panel-bg",b.panelBackground),b.panelForeground&&p.style.setProperty("--bf-panel-fg",b.panelForeground),b.fontFamily&&p.style.setProperty("--bf-font",b.fontFamily)),document.body.appendChild(p),f(p),()=>{p.remove(),f(null);}},[r.ui?.zIndex,r.ui?.theme?.accentColor,r.ui?.theme?.panelBackground,r.ui?.theme?.panelForeground,r.ui?.theme?.fontFamily,d]),react.useEffect(()=>{i&&i.setAttribute("data-bf-theme",d);},[i,d]),!n||!i?null:reactDom.createPortal(jsxRuntime.jsx(ie,{blocfeed_id:r.blocfeed_id,...z?{config:z}:{},children:jsxRuntime.jsx(Ao,{config:r,handleRef:a})}),i)});
885
- exports.BlocFeedProvider=ie;exports.BlocFeedWidget=Io;exports.useBlocFeed=ae;
884
+ `;function Me(){if(!chunkEZWTVVJ5_cjs.a()||document.getElementById(Re))return;let t=document.createElement("style");t.id=Re,t.textContent=zt,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 Dt={duration:.18,ease:"easeOut"},Vt={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?Vt:Dt;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 Xt={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:Xt;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 jt={duration:.2,ease:"easeOut"},Qt={duration:0};function Xe(t){return t==="bottom-left"||t==="top-left"}function qt(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:jt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:qt(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 eo={duration:.18,ease:"easeOut"},to={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?to:eo;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 ao={duration:.18,ease:"easeOut"},no={duration:0};function so(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?no:ao;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsxs(framerMotion.motion.button,{className:so(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 fo={duration:.18,ease:"easeOut"},po={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?po:fo;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 mo={duration:.18,ease:"easeOut"},ho={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?ho:mo;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 ko={duration:.18,ease:"easeOut"},To={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?To:ko,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 Bo(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 No(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 Fo(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 Ro(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 Mo(){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 Lo(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),Mo(),ce.add(r),()=>{window.removeEventListener("popstate",r),ce.delete(r);}},[]),Ro(t,e)}function zo(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 Io=["bug","feature","ux","general"],Ao={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 Wo(t){return t<1024*1024?`${Math.round(t/1024)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function _o(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??Io,gt=t.config.recording?.enabled===true&&chunkEZWTVVJ5_cjs.l(),mt=t.config.recording?.maxDurationMs??3e4,ue=i.getConfig().voice,ht=ue?.enabled===true&&chunkEZWTVVJ5_cjs.n(),xt=ue?.maxDurationMs??6e4,[vt,yt]=react.useState(false),[J,wt]=react.useState(0);react.useEffect(()=>{let s=window.setTimeout(()=>{let v=chunkEZWTVVJ5_cjs.y();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=Fo(be),[Tt,Et]=react.useState(0);react.useEffect(()=>{e.phase==="idle"&&Et(chunkEZWTVVJ5_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(chunkEZWTVVJ5_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?Bo(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(No,{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[Ao[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),", ",Wo(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=chunkEZWTVVJ5_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=chunkEZWTVVJ5_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 Ho=react.forwardRef(function(e,i){let r={...e.config??{},blocfeed_id:e.blocfeed_id},[a,p]=react.useState(null),n=Lo(r.ui?.showOn),l=zo(r.ui?.theme?.mode),o=!!r.diagnostics;react.useEffect(()=>{if(o)return chunkEZWTVVJ5_cjs.t(r.diagnostics),()=>chunkEZWTVVJ5_cjs.u()},[o]);let c=!!r.security;react.useEffect(()=>{c&&chunkEZWTVVJ5_cjs.x(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=chunkEZWTVVJ5_cjs.v(),m=chunkEZWTVVJ5_cjs.y(),C=chunkEZWTVVJ5_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(_o,{config:r,handleRef:i})}),a)});
885
+ exports.BlocFeedProvider=ie;exports.BlocFeedWidget=Ho;exports.useBlocFeed=ae;
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import {t,u,x,v,y,j,a,s,l,n,i,q,b}from'./chunk-EADEWOWW.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){let e=useMemo(()=>s({...t.config??{},blocfeed_id:t.blocfeed_id}),[]),[a,r]=useState(()=>e.getState());return useEffect(()=>e.subscribe(r),[e]),useEffect(()=>e.setConfig({...t.config??{},blocfeed_id:t.blocfeed_id}),[e,t.config,t.blocfeed_id]),useEffect(()=>()=>e.destroy(),[e]),jsx(Y.Provider,{value:{controller:e,state:a},children:t.children})}var Fe="blocfeed-styles-v1",Mt=`
2
+ import {t,u,x,v,y as y$1,j,a,s,l,n,i,q,b}from'./chunk-PUVKSWVE.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){let e=useMemo(()=>s({...t.config??{},blocfeed_id:t.blocfeed_id}),[]),[i,r]=useState(()=>e.getState());return useEffect(()=>e.subscribe(r),[e]),useEffect(()=>e.setConfig({...t.config??{},blocfeed_id:t.blocfeed_id}),[e,t.config,t.blocfeed_id]),useEffect(()=>()=>e.destroy(),[e]),jsx(Y.Provider,{value:{controller:e,state:i},children:t.children})}var Re="blocfeed-styles-v1",zt=`
3
3
  :where([data-blocfeed-ui-root]),
4
4
  :where([data-blocfeed-ui-root]) * {
5
5
  box-sizing: border-box;
@@ -881,5 +881,5 @@ import {t,u,x,v,y,j,a,s,l,n,i,q,b}from'./chunk-EADEWOWW.js';import {createContex
881
881
  animation: none;
882
882
  }
883
883
  }
884
- `;function Re(){if(!a()||document.getElementById(Fe))return;let t=document.createElement("style");t.id=Fe,t.textContent=Mt,document.head.appendChild(t);}var Me={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?{...Me,...t}:Me}function ae(){let t=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 w(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 jsx("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function Le({size:t=14}){return jsx("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children: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 jsxs("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[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"}),jsx("path",{d:"M22 6l-10 7L2 6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}function We({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){return a?jsxs("button",{className:w(t),type:"button",onClick:e,"aria-label":r,children:[f?jsx("span",{style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})}):jsxs(Fragment,{children:[jsx("span",{className:"bf-dot","aria-hidden":"true"}),r]}),i>0&&jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]}):null}function m(){let[t,e]=useState(()=>typeof window>"u"?false:window.matchMedia("(prefers-reduced-motion: reduce)").matches);return useEffect(()=>{let a=window.matchMedia("(prefers-reduced-motion: reduce)"),r=i=>e(i.matches);return a.addEventListener("change",r),()=>a.removeEventListener("change",r)},[]),t}var Ht={duration:.18,ease:"easeOut"},Ot={duration:0};function He({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=useState(false),o=m(),c=o?Ot:Ht;return jsx(AnimatePresence,{mode:"wait",children:a&&jsx(motion.button,{className:w(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:f?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsx(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"}}),jsx(AnimatePresence,{mode:"wait",children:n&&jsx(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")}),i>0&&jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"dot")})}var Kt={duration:.18,ease:"easeOut"},De={duration:0};function $e({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=useState(false),o=m(),c=o?De:Kt;return jsx(AnimatePresence,{mode:"wait",children:a&&jsxs(motion.div,{className:w(t),initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{y:8,opacity:0},transition:c,onMouseEnter:()=>d(true),onMouseLeave:()=>d(false),style:{background:"transparent",border:"none",boxShadow:"none",padding:0},children:[jsx(AnimatePresence,{mode:"wait",children:n&&jsx(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")}),jsxs(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?De:{y:{duration:3,repeat:1/0,ease:"easeInOut"}},whileHover:{scale:1.1,borderColor:"var(--bf-accent)"},whileTap:{scale:.9},children:[f?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:16})},"success"):jsx(Le,{size:16}),i>0&&jsx("span",{className:"bf-badge bf-badge-float","aria-label":`${i} queued`,children:i})]})]},"bubble")})}var Yt={duration:.2,ease:"easeOut"},Gt={duration:0};function Ue(t){return t==="bottom-left"||t==="top-left"}function jt(t){return `bf-trigger-edge ${Ue(t)?"bf-trigger-edge-left":"bf-trigger-edge-right"}`}function Xe({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=useState(false),o=Ue(t),c=m(),h=c?Gt:Yt;return jsx(AnimatePresence,{mode:"wait",children:a&&jsx(motion.button,{className:jt(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:h,whileTap:{scale:.97},style:{top:"50%",translateY:"-50%"},children:f?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:h,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsxs(motion.span,{animate:{rotate:c||n?0:o?-90:90,opacity:n?1:.6},transition:h,style:{display:"flex",alignItems:"center",gap:"8px",whiteSpace:"nowrap",fontSize:"12px",letterSpacing:"0.5px",textTransform:"uppercase"},children:[n&&jsx(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]}),jsx(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)"}}),i>0&&jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"edge-tab")})}var Jt={duration:.18,ease:"easeOut"},Zt={duration:0};function Ge({delay:t,hovered:e,reduced:a}){return a?null:jsx(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:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=useState(false),o=m(),c=o?Zt:Jt;return jsx(AnimatePresence,{mode:"wait",children:a&&jsx(motion.button,{className:w(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:f?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsxs("span",{style:{position:"relative",display:"flex",alignItems:"center",justifyContent:"center",width:"10px",height:"10px",flexShrink:0},children:[jsx(Ge,{delay:0,hovered:n,reduced:o}),jsx(Ge,{delay:.7,hovered:n,reduced:o}),jsx(motion.span,{className:"bf-dot","aria-hidden":"true",style:{position:"relative",zIndex:1}})]}),jsx(AnimatePresence,{mode:"wait",children:n&&jsx(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")}),i>0&&jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"pulse-ring")})}var ro={duration:.18,ease:"easeOut"},io={duration:0};function ao(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 Ze({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=useState(false),o=m(),c=o?io:ro;return jsx(AnimatePresence,{mode:"wait",children:a&&jsxs(motion.button,{className:ao(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:[f?jsx("span",{style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})}):jsxs(Fragment,{children:[jsx("span",{children:r}),i>0&&jsx("span",{className:"bf-badge",style:{marginLeft:"4px"},"aria-label":`${i} queued`,children:i})]}),!o&&jsx(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 co={duration:.18,ease:"easeOut"},lo={duration:0};function tt({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=useState(false),o=m(),c=o?lo:co;return jsx(AnimatePresence,{mode:"wait",children:a&&jsx(motion.button,{className:w(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:f?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsx(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:jsx(Ae,{size:16})}),jsx(AnimatePresence,{mode:"wait",children:n&&jsx(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")}),i>0&&jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"icon-pop")})}var bo={duration:.18,ease:"easeOut"},go={duration:0};function it({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=useState(false),o=m(),c=o?go:bo;return jsx(AnimatePresence,{mode:"wait",children:a&&jsx(motion.button,{className:w(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(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:f?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsxs("span",{style:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",width:"10px",height:"10px",flexShrink:0},children:[jsx(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&&jsx(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"}})]}),jsx(AnimatePresence,{mode:"wait",children:n&&jsx(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")}),i>0&&jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"beacon")})}var yo={duration:.18,ease:"easeOut"},wo={duration:0};function ct({position:t,onClick:e,isVisible:a,label:r,queueCount:i,showSuccess:f}){let[n,d]=useState(false),[o,c]=useState(0),h=m(),z=h?wo:yo,p=useRef(null);useEffect(()=>{if(p.current&&(clearInterval(p.current),p.current=null),!a||n||h){c(n||h?r.length:0);return}let b=8,B=r.length*2+b*2,v=0;return p.current=setInterval(()=>{v=(v+1)%B,v<=r.length?c(v):v<=r.length+b?c(r.length):v<=r.length*2+b?c(r.length*2+b-v):c(0);},100),()=>{p.current&&(clearInterval(p.current),p.current=null);}},[a,n,h,r]);let S=r.slice(0,o);return jsx(AnimatePresence,{mode:"wait",children:a&&jsx(motion.button,{className:w(t),type:"button",onClick:e,onMouseEnter:()=>d(true),onMouseLeave:()=>d(false),"aria-label":r,initial:{opacity:0,y:h?0:5},animate:{opacity:1,y:0},exit:{opacity:0,y:h?0:5},transition:z,whileTap:{scale:.95},style:{minWidth:"44px"},children:f?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:z,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsx("span",{className:"bf-dot","aria-hidden":"true"}),jsxs("span",{style:{whiteSpace:"nowrap",minWidth:"1ch"},children:[S,jsx("span",{className:"bf-cursor","aria-hidden":"true"})]}),i>0&&jsx("span",{className:"bf-badge","aria-label":`${i} queued`,children:i})]})},"typewriter")})}function lt(t){switch(t){case "dot":return He;case "bubble":return $e;case "edge-tab":return Xe;case "pulse-ring":return Qe;case "minimal":return Ze;case "icon-pop":return tt;case "beacon":return it;case "typewriter":return ct;default:return We}}function dt(t,e,a){return Math.max(e,Math.min(a,t))}function Co(t,e,a="bottom-right"){let i=window.innerWidth,f=window.innerHeight,n;n=dt(t.x,12,Math.max(12,i-e-12));let d=t.y+t.height+12,o=Math.max(12,t.y-240);return {top:d+240<=f?d:o,left:n}}function Po(t){let{rect:e}=t,a={left:`${e.x}px`,top:`${e.y}px`,width:`${Math.max(0,e.width)}px`,height:`${Math.max(0,e.height)}px`};return jsx("div",{className:"bf-highlight",style:a,"aria-hidden":"true"})}function Bo(t){let e=useRef(null);return useEffect(()=>{if(!t||!e.current)return;e.current.querySelector(".bf-textarea")?.focus();let r=i=>{if(i.key!=="Tab"||!e.current)return;let f=e.current.querySelectorAll('button:not([disabled]), textarea:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])');if(f.length===0)return;let n=f[0],d=f[f.length-1];i.shiftKey&&document.activeElement===n?(i.preventDefault(),d.focus()):!i.shiftKey&&document.activeElement===d&&(i.preventDefault(),n.focus());};return document.addEventListener("keydown",r,{capture:true}),()=>document.removeEventListener("keydown",r,{capture:true})},[t]),e}function No(t,e){return t?typeof t=="function"?t(e):t.some(a=>a.endsWith("*")?e.startsWith(a.slice(0,-1)):e===a):true}function Fo(t){let[e,a]=useState(()=>typeof window<"u"?window.location.pathname:"/");return useEffect(()=>{if(typeof window>"u")return;let r=()=>a(window.location.pathname);window.addEventListener("popstate",r);let i=history.pushState,f=history.replaceState;return history.pushState=function(...n){i.apply(this,n),setTimeout(r,0);},history.replaceState=function(...n){f.apply(this,n),setTimeout(r,0);},()=>{window.removeEventListener("popstate",r),history.pushState=i,history.replaceState=f;}},[]),No(t,e)}function Ro(t){let[e,a]=useState(()=>!t||t==="dark"?"dark":t==="light"?"light":typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return useEffect(()=>{if(t!=="auto"){a(t==="light"?"light":"dark");return}let r=window.matchMedia("(prefers-color-scheme: dark)"),i=f=>a(f.matches?"dark":"light");return a(r.matches?"dark":"light"),r.addEventListener("change",i),()=>r.removeEventListener("change",i)},[t]),e}var Mo=["bug","feature","ux","general"],zo={bug:"categoryBug",feature:"categoryFeature",ux:"categoryUx",general:"categoryGeneral"};function X(t){let e=Math.floor(t/1e3),a=Math.floor(e/60),r=e%60;return `${a}:${String(r).padStart(2,"0")}`}function Lo(t){return t<1024*1024?`${Math.round(t/1024)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function Ao(t){let{state:e,controller:a,start:r,stop:i$1,clearSelection:f,submit:n$1}=ae(),d=t.config.ui?.position,o=ze(t.config.ui?.strings),c=t.config.ui?.branding!==false,[h,z]=useState(null),[p,S]=useState(""),[b$1,B]=useState(t.config.capture?.element??true),[v,O]=useState(t.config.capture?.fullPage??false),[pt,le]=useState(null),[D,de]=useState(void 0),fe=t.config.ui?.categories??Mo,ut=t.config.recording?.enabled===true&&l(),bt=t.config.recording?.maxDurationMs??3e4,pe=a.getConfig().voice,gt=pe?.enabled===true&&n(),mt=pe?.maxDurationMs??6e4,[ht,xt]=useState(false),[J,vt]=useState(0);useEffect(()=>{let s=window.setTimeout(()=>{let y$1=y();vt(y$1.findings.length);},500);return ()=>window.clearTimeout(s)},[]),useImperativeHandle(t.handleRef,()=>({open:r,close:i$1,submit:s=>n$1(s),startRecording:()=>a.startRecording(),stopRecording:()=>a.stopRecording(),get isOpen(){return e.phase!=="idle"}}),[r,i$1,n$1,a,e.phase]);let ue=e.phase==="review"||e.phase==="capturing"||e.phase==="submitting"||e.phase==="error"||e.phase==="success",yt=Bo(ue),[wt,kt]=useState(0);useEffect(()=>{e.phase==="idle"&&kt(i());},[e.phase]);let[Tt,be]=useState(false),ge=useRef(e.phase);useEffect(()=>{if(ge.current==="success"&&e.phase==="idle"){be(true);let s=window.setTimeout(()=>be(false),1500);return ()=>window.clearTimeout(s)}ge.current=e.phase;},[e.phase]),useEffect(()=>{let s=t.config.ui?.shortcut;if(!s)return;let y=s.toLowerCase().split("+").map(P=>P.trim()),C=y[y.length-1]||"",L=new Set(y.slice(0,-1)),xe=P=>{let Pt=/Mac|iPod|iPhone|iPad/.test(navigator.platform);if(L.has("mod")){if(Pt?!P.metaKey:!P.ctrlKey)return}else if(L.has("ctrl")&&!P.ctrlKey||(L.has("meta")||L.has("cmd"))&&!P.metaKey)return;L.has("shift")&&!P.shiftKey||(L.has("alt")||L.has("option"))&&!P.altKey||P.key.toLowerCase()===C&&(P.preventDefault(),e.phase==="idle"?r():i$1());};return document.addEventListener("keydown",xe),()=>document.removeEventListener("keydown",xe)},[t.config.ui?.shortcut,e.phase,r,i$1]),useEffect(()=>a.subscribeHover(z),[a]),useEffect(()=>{let s=a.__unsafeGetSelectedElement();if(!s||e.phase==="idle"||e.phase==="picking"){le(null);return}let y=()=>{le(b(s.getBoundingClientRect()));};y();let C=()=>y();return window.addEventListener("scroll",C,{capture:true,passive:true}),window.addEventListener("resize",C,{passive:true}),()=>{window.removeEventListener("scroll",C,{capture:true}),window.removeEventListener("resize",C);}},[a,e.phase,e.selection?.selector]),useEffect(()=>{e.phase==="review"&&(S(""),B(t.config.capture?.element??true),O(t.config.capture?.fullPage??false),de(void 0),V(null));},[e.phase,e.selection?.selector,t.config.capture?.element,t.config.capture?.fullPage]),useEffect(()=>{if(e.phase!=="success")return;let s=window.setTimeout(()=>i$1(),1200);return ()=>window.clearTimeout(s)},[e.phase,i$1]);let T=e.phase==="capturing"||e.phase==="submitting",R=e.phase==="picking"?h?.rect??null:pt??e.selection?.rect??null,Z=useMemo(()=>R?Co(R,360,d):null,[R?.x,R?.y,R?.width,R?.height,d]),me=e.lastError?.message,ee=useCallback(()=>{let s={capture:{element:b$1,fullPage:v}};D&&(s.category=D),n$1(p,s);},[n$1,p,b$1,v,D]),St=useCallback(s=>{(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&p.trim().length>0&&!T&&(s.preventDefault(),ee());},[ee,p,T]),[he,V]=useState(null),Et=useCallback(async()=>{if(e.voiceRecording){a.stopVoice();return}V(null);let s=await a.startVoice();if(s?.text)S(y=>y?y+" "+s.text:s.text);else if(s?.warning)V(o.voiceEmptyText);else if(!s){let y=a.getState().lastError;if(y){let C=y.message?.toLowerCase()??"";C.includes("denied")||C.includes("permission")||C.includes("not allowed")?V(o.voiceDeniedText):V(o.voiceErrorText);}}},[e.voiceRecording,a,o]),Ct=lt(t.config.ui?.triggerStyle);return jsxs(Fragment,{children:[jsx(Ct,{position:d,onClick:()=>r(),isVisible:e.phase==="idle",label:t.config.ui?.triggerLabel??o.triggerLabel,queueCount:wt,showSuccess:Tt}),e.phase!=="idle"&&e.phase!=="recording"&&jsxs("div",{className:"bf-overlay",role:"presentation",children:[e.phase!=="picking"&&jsx("div",{className:"bf-blocker",role:"presentation",onClick:()=>i$1()}),R&&jsx(Po,{rect:R}),e.phase==="picking"&&jsxs("div",{className:"bf-hint",role:"status","aria-live":"polite",children:[jsx("p",{id:"bf-hint-text",children:o.hintText}),jsx("button",{type:"button",className:"bf-btn",onClick:()=>i$1(),"aria-label":o.cancelButton,children:o.cancelButton})]}),ue&&Z&&jsxs("div",{ref:yt,className:"bf-panel",style:{left:Z.left,top:Z.top},role:"dialog","aria-modal":"true","aria-label":"Feedback form",children:[jsxs("div",{className:"bf-panelHeader",children:[jsx("div",{className:"bf-title",id:"bf-panel-title",children:o.panelTitle}),jsxs("div",{className:"bf-row",style:{justifyContent:"flex-end"},children:[jsx("button",{type:"button",className:"bf-btn",onClick:()=>f(),disabled:T,"aria-label":o.rePickButton,children:o.rePickButton}),jsx("button",{type:"button",className:"bf-btn",onClick:()=>i$1(),disabled:T,"aria-label":o.closeButton,children:o.closeButton})]})]}),jsxs("div",{className:"bf-panelBody",children:[jsx("textarea",{className:"bf-textarea",placeholder:o.textareaPlaceholder,value:p,onChange:s=>S(s.target.value),onKeyDown:St,disabled:T,"aria-label":o.panelTitle}),fe.length>0&&jsx("div",{className:"bf-pills",role:"group","aria-label":"Feedback category",children:fe.map(s=>jsx("button",{type:"button",className:`bf-pill${D===s?" bf-pill-active":""}`,onClick:()=>de(D===s?void 0:s),disabled:T,children:o[zo[s]]},s))}),jsxs("div",{className:"bf-row",role:"group","aria-label":o.screenshotElement,children:[jsxs("label",{children:[jsx("input",{type:"checkbox",checked:b$1,onChange:s=>B(s.target.checked),disabled:T}),o.screenshotElement]}),jsxs("label",{children:[jsx("input",{type:"checkbox",checked:v,onChange:s=>O(s.target.checked),disabled:T}),o.screenshotFullPage]})]}),gt&&e.phase==="review"&&!e.voiceTranscribing&&jsx("button",{type:"button",className:`bf-voice-btn${e.voiceRecording?" bf-voice-btn-active":""}`,onClick:Et,disabled:T,"aria-label":e.voiceRecording?o.voiceStopButton:o.voiceButton,children:e.voiceRecording?jsxs(Fragment,{children:[jsx("span",{className:"bf-rec-dot bf-rec-dot-pulse","aria-hidden":"true"}),o.voiceRecordingText," ",X(e.voiceElapsedMs??0)," / ",X(mt)," \u2014 ",o.voiceStopButton]}):jsxs(Fragment,{children:[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:[jsx("rect",{x:"9",y:"1",width:"6",height:"11",rx:"3"}),jsx("path",{d:"M19 10v1a7 7 0 0 1-14 0v-1"}),jsx("line",{x1:"12",y1:"19",x2:"12",y2:"23"}),jsx("line",{x1:"8",y1:"23",x2:"16",y2:"23"})]}),o.voiceButton]})}),e.voiceTranscribing&&jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.voiceTranscribingText]}),he&&!e.voiceRecording&&!e.voiceTranscribing&&jsx("div",{className:"bf-error",role:"alert",children:he}),ut&&e.phase==="review"&&!e.video&&jsxs("button",{type:"button",className:"bf-record-btn",onClick:()=>a.startRecording(),disabled:T,"aria-label":o.recordButton,children:[jsx("span",{className:"bf-rec-dot","aria-hidden":"true"}),o.recordButton]}),e.video&&e.phase==="review"&&jsxs("div",{className:"bf-video-preview",children:[jsx("video",{src:e.video.blobUrl,controls:true,muted:true,playsInline:true}),jsx("button",{type:"button",className:"bf-video-remove",onClick:()=>a.removeVideo(),"aria-label":o.removeVideoButton,children:"\xD7"}),jsxs("div",{className:"bf-video-meta",children:[o.videoPreviewLabel," (",X(e.video.durationMs),", ",Lo(e.video.sizeBytes),")"]})]}),e.phase==="capturing"&&jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.capturingText]}),e.phase==="submitting"&&jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.submittingText]}),e.phase==="success"&&jsx("div",{className:"bf-status",role:"status","aria-live":"polite",children:o.successText}),e.phase==="error"&&me&&jsx("div",{className:"bf-error",role:"alert",children:me}),jsxs("div",{className:"bf-actions",children:[jsx("button",{type:"button",className:"bf-btn",onClick:()=>i$1(),disabled:T,"aria-label":o.cancelButton,children:o.cancelButton}),jsx("button",{type:"button",className:"bf-btn bf-btnPrimary",onClick:ee,disabled:T||p.trim().length===0,"aria-label":o.sendButton,children:o.sendButton})]})]}),c&&jsxs("div",{className:"bf-watermark",children:[(()=>{let s=q();return s?jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"bf-my-feedback-link",children:"View my feedback"}):null})(),jsx("a",{href:"https://blocfeed.com",target:"_blank",rel:"noopener noreferrer",children:"Powered by BlocFeed"})]})]})]}),e.phase==="recording"&&jsxs("div",{className:`bf-recording-bar bf-pos-${d}`,role:"status","aria-live":"polite","data-blocfeed-ui":"true",children:[jsx("span",{className:"bf-rec-dot bf-rec-dot-pulse","aria-hidden":"true"}),jsxs("span",{className:"bf-recording-bar-timer",children:[o.recordingText," ",X(e.recordingElapsedMs??0)," / ",X(bt)]}),jsx("button",{type:"button",className:"bf-recording-bar-stop",onClick:()=>a.stopRecording(),"aria-label":o.stopRecordButton,children:o.stopRecordButton})]}),e.phase==="success"&&jsxs("div",{className:"bf-toast",role:"status","aria-live":"polite",children:[o.toastText,(()=>{let s=q();return s?jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"bf-toast-link",children:"View my feedback"}):null})()]}),J>0&&!ht&&jsxs("div",{className:"bf-security-banner",role:"alert",children:[jsx("button",{type:"button",className:"bf-security-banner-dismiss",onClick:()=>xt(true),"aria-label":"Dismiss",children:"\xD7"}),jsx("strong",{children:"Security Warning"}),J," potential secret",J>1?"s":""," exposed in client code. Check your environment variables."]})]})}var Io=forwardRef(function(e,a){let r={...e.config??{},blocfeed_id:e.blocfeed_id},[i,f]=useState(null),n=Fo(r.ui?.showOn),d=Ro(r.ui?.theme?.mode),o=!!r.diagnostics;useEffect(()=>{if(o)return t(r.diagnostics),()=>u()},[o]);let c=!!r.security;useEffect(()=>{c&&x(r.security);},[c]);let h=useRef(e.config?.metadata?.enrich);h.current=e.config?.metadata?.enrich;let z=useMemo(()=>{if(e.config)return {...e.config,metadata:{...e.config.metadata,enrich:async p=>{let S=h.current,b=S?await S(p):{},B=v(),v$1=y(),O=j();return {...b,...B.consoleLogs.length>0?{_consoleLogs:B.consoleLogs}:{},...B.networkErrors.length>0?{_networkErrors:B.networkErrors}:{},...v$1.findings.length>0?{_securityFindings:v$1.findings}:{},...O.length>0?{_clickEvents:O}:{}}}}}},[]);return useEffect(()=>{Re();let p=document.createElement("div");p.setAttribute("data-blocfeed-ui-root","true"),p.setAttribute("data-blocfeed-ui","true"),p.setAttribute("data-bf-theme",d);let S=r.ui?.zIndex;typeof S=="number"&&p.style.setProperty("--bf-z",String(S));let b=r.ui?.theme;return b&&(b.accentColor&&p.style.setProperty("--bf-accent",b.accentColor),b.panelBackground&&p.style.setProperty("--bf-panel-bg",b.panelBackground),b.panelForeground&&p.style.setProperty("--bf-panel-fg",b.panelForeground),b.fontFamily&&p.style.setProperty("--bf-font",b.fontFamily)),document.body.appendChild(p),f(p),()=>{p.remove(),f(null);}},[r.ui?.zIndex,r.ui?.theme?.accentColor,r.ui?.theme?.panelBackground,r.ui?.theme?.panelForeground,r.ui?.theme?.fontFamily,d]),useEffect(()=>{i&&i.setAttribute("data-bf-theme",d);},[i,d]),!n||!i?null:createPortal(jsx(ie,{blocfeed_id:r.blocfeed_id,...z?{config:z}:{},children:jsx(Ao,{config:r,handleRef:a})}),i)});
885
- export{ie as BlocFeedProvider,Io as BlocFeedWidget,ae as useBlocFeed};
884
+ `;function Me(){if(!a()||document.getElementById(Re))return;let t=document.createElement("style");t.id=Re,t.textContent=zt,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=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 jsx("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ie({size:t=14}){return jsx("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children: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 jsxs("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[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"}),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?jsxs("button",{className:y(t),type:"button",onClick:e,"aria-label":r,children:[p?jsx("span",{style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})}):jsxs(Fragment,{children:[jsx("span",{className:"bf-dot","aria-hidden":"true"}),r]}),a>0&&jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]}):null}function h(){let[t,e]=useState(()=>typeof window>"u"?false:window.matchMedia("(prefers-reduced-motion: reduce)").matches);return 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 Dt={duration:.18,ease:"easeOut"},Vt={duration:0};function Oe({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),o=h(),c=o?Vt:Dt;return jsx(AnimatePresence,{mode:"wait",children:i&&jsx(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?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsx(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"}}),jsx(AnimatePresence,{mode:"wait",children:n&&jsx(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&&jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"dot")})}var Xt={duration:.18,ease:"easeOut"},Ve={duration:0};function Ke({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),o=h(),c=o?Ve:Xt;return jsx(AnimatePresence,{mode:"wait",children:i&&jsxs(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:[jsx(AnimatePresence,{mode:"wait",children:n&&jsx(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")}),jsxs(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?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:16})},"success"):jsx(Ie,{size:16}),a>0&&jsx("span",{className:"bf-badge bf-badge-float","aria-label":`${a} queued`,children:a})]})]},"bubble")})}var jt={duration:.2,ease:"easeOut"},Qt={duration:0};function Xe(t){return t==="bottom-left"||t==="top-left"}function qt(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]=useState(false),o=Xe(t),c=h(),x=c?Qt:jt;return jsx(AnimatePresence,{mode:"wait",children:i&&jsx(motion.button,{className:qt(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?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:x,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsxs(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&&jsx(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]}),jsx(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&&jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"edge-tab")})}var eo={duration:.18,ease:"easeOut"},to={duration:0};function je({delay:t,hovered:e,reduced:i}){return i?null:jsx(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]=useState(false),o=h(),c=o?to:eo;return jsx(AnimatePresence,{mode:"wait",children:i&&jsx(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?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsxs("span",{style:{position:"relative",display:"flex",alignItems:"center",justifyContent:"center",width:"10px",height:"10px",flexShrink:0},children:[jsx(je,{delay:0,hovered:n,reduced:o}),jsx(je,{delay:.7,hovered:n,reduced:o}),jsx(motion.span,{className:"bf-dot","aria-hidden":"true",style:{position:"relative",zIndex:1}})]}),jsx(AnimatePresence,{mode:"wait",children:n&&jsx(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&&jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"pulse-ring")})}var ao={duration:.18,ease:"easeOut"},no={duration:0};function so(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]=useState(false),o=h(),c=o?no:ao;return jsx(AnimatePresence,{mode:"wait",children:i&&jsxs(motion.button,{className:so(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?jsx("span",{style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})}):jsxs(Fragment,{children:[jsx("span",{children:r}),a>0&&jsx("span",{className:"bf-badge",style:{marginLeft:"4px"},"aria-label":`${a} queued`,children:a})]}),!o&&jsx(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 fo={duration:.18,ease:"easeOut"},po={duration:0};function ot({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),o=h(),c=o?po:fo;return jsx(AnimatePresence,{mode:"wait",children:i&&jsx(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?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsx(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:jsx(Ae,{size:16})}),jsx(AnimatePresence,{mode:"wait",children:n&&jsx(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&&jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"icon-pop")})}var mo={duration:.18,ease:"easeOut"},ho={duration:0};function at({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),o=h(),c=o?ho:mo;return jsx(AnimatePresence,{mode:"wait",children:i&&jsx(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?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsxs("span",{style:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",width:"10px",height:"10px",flexShrink:0},children:[jsx(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&&jsx(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"}})]}),jsx(AnimatePresence,{mode:"wait",children:n&&jsx(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&&jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"beacon")})}var ko={duration:.18,ease:"easeOut"},To={duration:0};function lt({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),[o,c]=useState(0),x=h(),z=x?To:ko,f=useRef(null);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 jsx(AnimatePresence,{mode:"wait",children:i&&jsx(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?jsx(motion.span,{initial:{scale:0},animate:{scale:1},transition:z,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsx(g,{size:14})},"success"):jsxs(Fragment,{children:[jsx("span",{className:"bf-dot","aria-hidden":"true"}),jsxs("span",{style:{whiteSpace:"nowrap",minWidth:"1ch"},children:[S,jsx("span",{className:"bf-cursor","aria-hidden":"true"})]}),a>0&&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 Bo(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 No(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 jsx("div",{className:"bf-highlight",style:i,"aria-hidden":"true"})}function Fo(t){let e=useRef(null);return 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 Ro(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 Mo(){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 Lo(t){let[e,i]=useState(()=>typeof window<"u"?window.location.pathname:"/");return useEffect(()=>{if(typeof window>"u")return;let r=()=>i(window.location.pathname);return window.addEventListener("popstate",r),Mo(),ce.add(r),()=>{window.removeEventListener("popstate",r),ce.delete(r);}},[]),Ro(t,e)}function zo(t){let[e,i]=useState(()=>!t||t==="dark"?"dark":t==="light"?"light":typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return 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 Io=["bug","feature","ux","general"],Ao={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 Wo(t){return t<1024*1024?`${Math.round(t/1024)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function _o(t){let{state:e,controller:i$1,start:r,stop:a,clearSelection:p,submit:n$1}=ae(),l$1=t.config.ui?.position,o=ze(t.config.ui?.strings),c=t.config.ui?.branding!==false,[x,z]=useState(null),[f,S]=useState(""),[b$1,T]=useState(t.config.capture?.element??true),[m,C]=useState(t.config.capture?.fullPage??false),[bt,de]=useState(null),[D,fe]=useState(void 0),pe=t.config.ui?.categories??Io,gt=t.config.recording?.enabled===true&&l(),mt=t.config.recording?.maxDurationMs??3e4,ue=i$1.getConfig().voice,ht=ue?.enabled===true&&n(),xt=ue?.maxDurationMs??6e4,[vt,yt]=useState(false),[J,wt]=useState(0);useEffect(()=>{let s=window.setTimeout(()=>{let v=y$1();wt(v.findings.length);},500);return ()=>window.clearTimeout(s)},[]),useImperativeHandle(t.handleRef,()=>({open:r,close:a,submit:s=>n$1(s),startRecording:()=>i$1.startRecording(),stopRecording:()=>i$1.stopRecording(),get isOpen(){return e.phase!=="idle"}}),[r,a,n$1,i$1,e.phase]);let be=e.phase==="review"||e.phase==="capturing"||e.phase==="submitting"||e.phase==="error"||e.phase==="success",kt=Fo(be),[Tt,Et]=useState(0);useEffect(()=>{e.phase==="idle"&&Et(i());},[e.phase]);let[St,ge]=useState(false),me=useRef(e.phase);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]),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]),useEffect(()=>i$1.subscribeHover(z),[i$1]),useEffect(()=>{let s=i$1.__unsafeGetSelectedElement();if(!s||e.phase==="idle"||e.phase==="picking"){de(null);return}let v=()=>{de(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$1,e.phase,e.selection?.selector]),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]),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=useMemo(()=>M?Bo(M,360,l$1):null,[M?.x,M?.y,M?.width,M?.height,l$1]),he=e.lastError?.message,ee=useCallback(()=>{let s={capture:{element:b$1,fullPage:m}};D&&(s.category=D),n$1(f,s);},[n$1,f,b$1,m,D]),Ct=useCallback(s=>{(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&f.trim().length>0&&!E&&(s.preventDefault(),ee());},[ee,f,E]),[xe,V]=useState(null),Pt=useCallback(async()=>{if(e.voiceRecording){i$1.stopVoice();return}V(null);let s=await i$1.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$1.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$1,o]),Bt=dt(t.config.ui?.triggerStyle);return jsxs(Fragment,{children:[jsx(Bt,{position:l$1,onClick:()=>r(),isVisible:e.phase==="idle",label:t.config.ui?.triggerLabel??o.triggerLabel,queueCount:Tt,showSuccess:St}),e.phase!=="idle"&&e.phase!=="recording"&&jsxs("div",{className:"bf-overlay",role:"presentation",children:[e.phase!=="picking"&&jsx("div",{className:"bf-blocker",role:"presentation",onClick:()=>a()}),M&&jsx(No,{rect:M}),e.phase==="picking"&&jsxs("div",{className:"bf-hint",role:"status","aria-live":"polite",children:[jsx("p",{id:"bf-hint-text",children:o.hintText}),jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),"aria-label":o.cancelButton,children:o.cancelButton})]}),be&&Z&&jsxs("div",{ref:kt,className:"bf-panel",style:{left:Z.left,top:Z.top},role:"dialog","aria-modal":"true","aria-label":"Feedback form",children:[jsxs("div",{className:"bf-panelHeader",children:[jsx("div",{className:"bf-title",id:"bf-panel-title",children:o.panelTitle}),jsxs("div",{className:"bf-row",style:{justifyContent:"flex-end"},children:[jsx("button",{type:"button",className:"bf-btn",onClick:()=>p(),disabled:E,"aria-label":o.rePickButton,children:o.rePickButton}),jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),disabled:E,"aria-label":o.closeButton,children:o.closeButton})]})]}),jsxs("div",{className:"bf-panelBody",children:[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&&jsx("div",{className:"bf-pills",role:"group","aria-label":"Feedback category",children:pe.map(s=>jsx("button",{type:"button",className:`bf-pill${D===s?" bf-pill-active":""}`,onClick:()=>fe(D===s?void 0:s),disabled:E,children:o[Ao[s]]},s))}),jsxs("div",{className:"bf-row",role:"group","aria-label":o.screenshotElement,children:[jsxs("label",{children:[jsx("input",{type:"checkbox",checked:b$1,onChange:s=>T(s.target.checked),disabled:E}),o.screenshotElement]}),jsxs("label",{children:[jsx("input",{type:"checkbox",checked:m,onChange:s=>C(s.target.checked),disabled:E}),o.screenshotFullPage]})]}),ht&&e.phase==="review"&&!e.voiceTranscribing&&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?jsxs(Fragment,{children:[jsx("span",{className:"bf-rec-dot bf-rec-dot-pulse","aria-hidden":"true"}),o.voiceRecordingText," ",X(e.voiceElapsedMs??0)," / ",X(xt)," \u2014 ",o.voiceStopButton]}):jsxs(Fragment,{children:[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:[jsx("rect",{x:"9",y:"1",width:"6",height:"11",rx:"3"}),jsx("path",{d:"M19 10v1a7 7 0 0 1-14 0v-1"}),jsx("line",{x1:"12",y1:"19",x2:"12",y2:"23"}),jsx("line",{x1:"8",y1:"23",x2:"16",y2:"23"})]}),o.voiceButton]})}),e.voiceTranscribing&&jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.voiceTranscribingText]}),xe&&!e.voiceRecording&&!e.voiceTranscribing&&jsx("div",{className:"bf-error",role:"alert",children:xe}),gt&&e.phase==="review"&&!e.video&&jsxs("button",{type:"button",className:"bf-record-btn",onClick:()=>i$1.startRecording(),disabled:E,"aria-label":o.recordButton,children:[jsx("span",{className:"bf-rec-dot","aria-hidden":"true"}),o.recordButton]}),e.video&&e.phase==="review"&&jsxs("div",{className:"bf-video-preview",children:[jsx("video",{src:e.video.blobUrl,controls:true,muted:true,playsInline:true}),jsx("button",{type:"button",className:"bf-video-remove",onClick:()=>i$1.removeVideo(),"aria-label":o.removeVideoButton,children:"\xD7"}),jsxs("div",{className:"bf-video-meta",children:[o.videoPreviewLabel," (",X(e.video.durationMs),", ",Wo(e.video.sizeBytes),")"]})]}),e.phase==="capturing"&&jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.capturingText]}),e.phase==="submitting"&&jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.submittingText]}),e.phase==="success"&&jsx("div",{className:"bf-status",role:"status","aria-live":"polite",children:o.successText}),e.phase==="error"&&he&&jsx("div",{className:"bf-error",role:"alert",children:he}),jsxs("div",{className:"bf-actions",children:[jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),disabled:E,"aria-label":o.cancelButton,children:o.cancelButton}),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&&jsxs("div",{className:"bf-watermark",children:[(()=>{let s=q();return s?jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"bf-my-feedback-link",children:"View my feedback"}):null})(),jsx("a",{href:"https://blocfeed.com",target:"_blank",rel:"noopener noreferrer",children:"Powered by BlocFeed"})]})]})]}),e.phase==="recording"&&jsxs("div",{className:`bf-recording-bar bf-pos-${l$1}`,role:"status","aria-live":"polite","data-blocfeed-ui":"true",children:[jsx("span",{className:"bf-rec-dot bf-rec-dot-pulse","aria-hidden":"true"}),jsxs("span",{className:"bf-recording-bar-timer",children:[o.recordingText," ",X(e.recordingElapsedMs??0)," / ",X(mt)]}),jsx("button",{type:"button",className:"bf-recording-bar-stop",onClick:()=>i$1.stopRecording(),"aria-label":o.stopRecordButton,children:o.stopRecordButton})]}),e.phase==="success"&&jsxs("div",{className:"bf-toast",role:"status","aria-live":"polite",children:[o.toastText,(()=>{let s=q();return s?jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"bf-toast-link",children:"View my feedback"}):null})()]}),J>0&&!vt&&jsxs("div",{className:"bf-security-banner",role:"alert",children:[jsx("button",{type:"button",className:"bf-security-banner-dismiss",onClick:()=>yt(true),"aria-label":"Dismiss",children:"\xD7"}),jsx("strong",{children:"Security Warning"}),J," potential secret",J>1?"s":""," exposed in client code. Check your environment variables."]})]})}var Ho=forwardRef(function(e,i){let r={...e.config??{},blocfeed_id:e.blocfeed_id},[a,p]=useState(null),n=Lo(r.ui?.showOn),l=zo(r.ui?.theme?.mode),o=!!r.diagnostics;useEffect(()=>{if(o)return t(r.diagnostics),()=>u()},[o]);let c=!!r.security;useEffect(()=>{c&&x(r.security);},[c]);let x$1=useRef(e.config?.metadata?.enrich);x$1.current=e.config?.metadata?.enrich;let z=useMemo(()=>{if(e.config)return {...e.config,metadata:{...e.config.metadata,enrich:async f=>{let S=x$1.current,b=S?await S(f):{},T=v(),m=y$1(),C=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 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:createPortal(jsx(ie,{blocfeed_id:r.blocfeed_id,...z?{config:z}:{},children:jsx(_o,{config:r,handleRef:i})}),a)});
885
+ export{ie as BlocFeedProvider,Ho as BlocFeedWidget,ae as useBlocFeed};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "blocfeed",
3
- "version": "0.13.0",
4
- "description": "Drop-in feedback widget for React — element picking, screenshots, video recording, voice feedback, and behavioral signal tracking.",
3
+ "version": "0.14.0",
4
+ "description": "Drop-in feedback widget for React — element picking, screenshots, video recording, and voice feedback.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "sideEffects": false,
@@ -18,11 +18,7 @@
18
18
  "element-picker",
19
19
  "voice-feedback",
20
20
  "speech-to-text",
21
- "transcription",
22
- "session-replay",
23
- "behavioral-analytics",
24
- "rage-click",
25
- "posthog"
21
+ "transcription"
26
22
  ],
27
23
  "publishConfig": {
28
24
  "access": "public"
@@ -1,2 +0,0 @@
1
- function E(){return typeof window<"u"&&typeof document<"u"}function Re(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 ae(e){return {x:e.x,y:e.y,width:e.width,height:e.height}}function at(e){return {x:e.x+window.scrollX,y:e.y+window.scrollY,width:e.width,height:e.height}}function ct(e){return e.replace(/\s+/g," ").trim()}function ce(e,t=140){let n=e.textContent;if(!n)return;let o=ct(n);if(o)return o.length<=t?o:`${o.slice(0,t-1)}\u2026`}function lt(e){let t=1;for(let n=e.previousElementSibling;n;n=n.previousElementSibling)n.tagName===e.tagName&&(t+=1);return t}var Ce=["data-testid","data-test-id","data-test","data-qa","data-cy"],Ae="data-blocfeed-component";function le(e){let t=e.closest(`[${Ae}]`);if(!t)return;let o=t.getAttribute(Ae)?.trim();return o||void 0}function ut(e){for(let t of Ce){let n=e.closest(`[${t}]`);if(!n)continue;let r=n.getAttribute(t)?.trim();if(r)return r}}function xe(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 O(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 $(e){if(e){for(let t of e)if(typeof t.name=="string"&&t.name&&!O(t.name))return t.name}}function C(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 C(r)}}}function ue(e){let t=xe(e);if(!t)return;let n=$(t._debugInfo);if(n)return n;let o=t._debugOwner!==void 0;if(o){let c=t._debugOwner;for(let d=0;c&&d<50;d+=1){let w=$(c._debugInfo);if(w)return w;let g=C(c.type)??C(c.elementType);if(g&&!O(g))return g;c=c._debugOwner;}}if(t._owner!==void 0&&t._owner!==t._debugOwner){let c=t._owner;for(let d=0;c&&d<50;d+=1){let w=$(c._debugInfo);if(w)return w;let g=C(c.type)??C(c.elementType);if(g&&!O(g))return g;c=c._owner;}}let i=t,s=o?80:25;for(let c=0;i&&c<s;c+=1){let d=$(i._debugInfo);if(d)return d;let w=C(i.type)??C(i.elementType);if(w&&!O(w))return w;i=i.return;}let a=e.parentElement;for(let c=0;a&&c<15;c+=1){let d=xe(a);if(d){let w=$(d._debugInfo);if(w)return w;let g=C(d.type)??C(d.elementType);if(g&&!O(g))return g;if(d._debugOwner){let u=C(d._debugOwner.type)??C(d._debugOwner.elementType);if(u&&!O(u))return u}if(d._owner&&d._owner!==d._debugOwner){let u=C(d._owner.type)??C(d._owner.elementType);if(u&&!O(u))return u}}a=a.parentElement;}}function dt(e){let t=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n)return `#${Re(n)}`;for(let o of Ce){let r=e.getAttribute(o);if(r)return `${t}[${o}="${Re(r)}"]`}return `${t}:nth-of-type(${lt(e)})`}function ft(e,t=10){let n=[],o=e;for(;o&&n.length<t;){let r=dt(o);if(n.unshift(r),r.startsWith("#"))break;o=o.parentElement;}return n.join(" > ")}function Pe(e,t){if(!t||t.length===0)return false;for(let n of t)if(e.closest(n))return true;return false}function de(e,t){if(!e||Pe(e,t.ignoreSelectors))return null;let n=e;for(;n;){if(Pe(n,t.ignoreSelectors))return null;if(t.isSelectable?.(n)??mt(n))return n;n=n.parentElement;}return null}function mt(e){let t=e.tagName;return !(t==="HTML"||t==="BODY")}function Fe(e){let t=e.getBoundingClientRect(),n={selector:ft(e),tagName:e.tagName.toLowerCase(),rect:ae(t),pageRect:at(t)},o=e.getAttribute("id");o&&(n.id=o);let r=e.className;typeof r=="string"&&r.trim()&&(n.className=r);let i=ce(e);i&&(n.textSnippet=i);let s=le(e)??ue(e);s&&(n.componentName=s);let a=ut(e);return a&&(n.testId=a),n}var fe=null;async function Me(){return fe||(fe=import('html-to-image')),fe}async function pt(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 Ie(e,t){let{width:n,height:o}=await pt(e);return {dataUrl:e,mime:t,width:n,height:o}}function V(e){if(e?.aborted)throw new Error("Aborted")}function Be(){return {async captureElement(e,t){if(!E())throw new Error("captureElement can only run in the browser");V(t.signal);let n=await Me();V(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 V(t.signal),await Ie(o,t.mime)},async captureFullPage(e){if(!E())throw new Error("captureFullPage can only run in the browser");V(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)),s=Math.max(1,Math.round(o*r)),a=await Me();V(e.signal);let c=e.mime==="image/jpeg"?await a.toJpeg(t,{width:i,height:s,quality:e.quality??.92,pixelRatio:e.pixelRatio}):await a.toPng(t,{width:i,height:s,pixelRatio:e.pixelRatio});return V(e.signal),await Ie(c,e.mime)}}}function gt(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return "Unknown error"}}function h(e,t,n){let o={kind:e,message:gt(t)};return n&&(o.detail=n),o}var ht=12e3,wt=2048,bt=.92;function De(){return Date.now()}function yt(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 Le(e,t,n){let o=new Promise((i,s)=>{let a=setTimeout(()=>s(new Error("Timeout")),t);typeof a.unref=="function"&&a.unref();}),r=[e,o];return n&&r.push(yt(n)),await Promise.race(r)}function Et(e){if(!E())return 1;let t=window.devicePixelRatio||1,n=e?.pixelRatio??Math.min(t,2);return Math.max(.1,n)}function vt(e){return !!(e?.element||e?.fullPage)}function Ne(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 Oe(e){let{selectionElement:t,capture:n,signal:o}=e;if(!E()||!vt(n))return;let r=De(),i=[],s=n?.timeoutMs??ht,a=n?.maxDimension??wt,c=n?.mime??"image/png",d=n?.quality??bt,w=n?.adapter??Be(),g={},u=Et(n);if(n?.element&&t)try{let p=t.getBoundingClientRect(),l=Math.min(1,a/Math.max(p.width,p.height)),k=Math.min(u,u*l),P=await Le(Promise.resolve(w.captureElement(t,{...Ne({mime:c,quality:d,pixelRatio:k,maxDimension:a,includeQuality:c==="image/jpeg",...o?{signal:o}:{}})})),s,o);g.element=P;}catch(p){if(o?.aborted)throw p;i.push(h("capture_failed",p,{target:"element"}));}if(n?.fullPage)try{let p=await Le(Promise.resolve(w.captureFullPage(Ne({mime:c,quality:d,pixelRatio:u,maxDimension:a,includeQuality:c==="image/jpeg",...o?{signal:o}:{}}))),s,o);g.fullPage=p;}catch(p){if(o?.aborted)throw p;i.push(h("capture_failed",p,{target:"fullPage"}));}let b=De(),f={startedAt:r,finishedAt:b,durationMs:Math.max(0,b-r)};return i.length>0&&(f.errors=i),{...g,diagnostics:f}}function St(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function kt(){return E()?{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:St()}:{}}function _t(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 Ue(e){let{config:t,context:n,user:o}=e;if(t?.enabled===false)return {};let r={...kt(),..._t(o)},i=t?.enrich;if(!i)return r;try{let s=await i(n);return {...r,...s}}catch(s){let a=h("unknown",s);return {...r,blocfeedMetadataError:a.message}}}var me="blocfeed-queue",Tt=50;function pe(){if(!E())return [];try{let e=localStorage.getItem(me);if(!e)return [];let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return []}}function ge(e){if(E())try{e.length===0?localStorage.removeItem(me):localStorage.setItem(me,JSON.stringify(e));}catch{}}function Rt(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 he(e){let t=pe(),n=Rt(e);for(n.metadata={...n.metadata,_queued:true},t.push({payload:n,timestamp:Date.now()});t.length>Tt;)t.shift();ge(t);}function Ve(){let e=pe();return e.length===0?[]:(ge([]),e.map(t=>t.payload))}function _n(){ge([]);}function Tn(){return pe().length}var At=200,X=[],He=0,ee=false;function qe(e){let t=e.target;if(!(t instanceof Element)||t.closest("[data-blocfeed-ui]"))return;let n={timestampMs:Date.now()-He,path:window.location.pathname,tagName:t.tagName.toLowerCase()},o=ce(t,100);o&&(n.textSnippet=o);let r=le(t)??ue(t);r&&(n.componentName=r),X.length<At&&X.push(n);}function ze(){ee||!E()||(ee=true,X=[],He=Date.now(),document.addEventListener("click",qe,{capture:true,passive:true}));}function je(){ee&&(ee=false,document.removeEventListener("click",qe,{capture:true}));}function xt(){return [...X]}function Pt(){X=[];}var Ct=3e4,Ft=25e5,$e="video/webm",Mt=250,It=1e3,Bt=["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];function Xe(){if(typeof MediaRecorder>"u")return null;for(let e of Bt)if(MediaRecorder.isTypeSupported(e))return e;return null}function Dt(){return !E()||typeof navigator?.mediaDevices?.getDisplayMedia!="function"?false:Xe()!==null}async function we(e){let{config:t,signal:n}=e;if(!E()||typeof navigator?.mediaDevices?.getDisplayMedia!="function")throw h("recording_failed",new Error("Screen recording is not supported in this browser"));let o=Xe();if(!o)throw h("recording_failed",new Error("No supported video codec found (WebM required)"));if(n?.aborted)throw h("aborted",new Error("Recording aborted before start"));let r;try{r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1});}catch(l){let k=l instanceof DOMException&&l.name==="NotAllowedError"?"Screen share permission denied":"Failed to start screen share";throw h("recording_failed",new Error(k))}if(n?.aborted)throw r.getTracks().forEach(l=>l.stop()),h("aborted",new Error("Recording aborted after permission"));let i=t?.maxDurationMs??Ct,s=t?.videoBitsPerSecond??Ft,a=new MediaRecorder(r,{mimeType:o,videoBitsPerSecond:s}),c=[],d=[],w=0,g=null,u=null,b=false,f=()=>{je(),g!==null&&(clearInterval(g),g=null),u!==null&&(clearTimeout(u),u=null),r.getTracks().forEach(l=>l.stop());},p=new Promise((l,k)=>{a.ondataavailable=T=>{T.data.size>0&&c.push(T.data);},a.onstop=()=>{if(b)return;b=true,f();let T=Date.now()-w,F=new Blob(c,{type:$e}),v=URL.createObjectURL(F);l({mime:$e,blobUrl:v,blob:F,durationMs:T,sizeBytes:F.size});},a.onerror=()=>{b||(b=true,f(),k(h("recording_failed",new Error("MediaRecorder error"))));};let P=r.getVideoTracks()[0];if(P&&P.addEventListener("ended",()=>{a.state!=="inactive"&&a.stop();}),n){let T=()=>{b||(b=true,a.state!=="inactive"&&a.stop(),f(),k(h("aborted",new Error("Recording aborted"))));};n.addEventListener("abort",T,{once:true});}});return a.start(It),ze(),w=Date.now(),g=setInterval(()=>{let l=Date.now()-w;for(let k of d)k(l);},Mt),u=setTimeout(()=>{!b&&a.state!=="inactive"&&a.stop();},i),{result:p,stop(){!b&&a.state!=="inactive"&&a.stop();},onTick(l){d.push(l);},abort(){b||(b=true,a.state!=="inactive"&&a.stop(),f());}}}var Lt=6e4,Ze="audio/webm",Nt=250,Ot=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus"];function Ke(){if(typeof MediaRecorder>"u")return null;for(let e of Ot)if(MediaRecorder.isTypeSupported(e))return e;return null}function Ut(){return !E()||typeof navigator?.mediaDevices?.getUserMedia!="function"?false:Ke()!==null}async function be(e){let{config:t,signal:n}=e;if(!E()||typeof navigator?.mediaDevices?.getUserMedia!="function")throw h("recording_failed",new Error("Microphone recording is not supported in this browser"));let o=Ke();if(!o)throw h("recording_failed",new Error("No supported audio codec found"));if(n?.aborted)throw h("aborted",new Error("Voice recording aborted before start"));let r;try{r=await navigator.mediaDevices.getUserMedia({audio:!0});}catch(p){let l=p instanceof DOMException&&p.name==="NotAllowedError"?"Microphone permission denied":"Failed to access microphone";throw h("recording_failed",new Error(l))}if(n?.aborted)throw r.getTracks().forEach(p=>p.stop()),h("aborted",new Error("Voice recording aborted after permission"));let i=t?.maxDurationMs??Lt,s=new MediaRecorder(r,{mimeType:o}),a=[],c=[],d=0,w=null,g=null,u=false,b=()=>{w!==null&&(clearInterval(w),w=null),g!==null&&(clearTimeout(g),g=null),r.getTracks().forEach(p=>p.stop());},f=new Promise((p,l)=>{if(s.ondataavailable=k=>{k.data.size>0&&a.push(k.data);},s.onstop=()=>{if(u)return;u=true,b();let k=Date.now()-d,P=new Blob(a,{type:Ze});p({blob:P,mime:Ze,durationMs:k});},s.onerror=()=>{u||(u=true,b(),l(h("recording_failed",new Error("MediaRecorder error"))));},n){let k=()=>{u||(u=true,s.state!=="inactive"&&s.stop(),b(),l(h("aborted",new Error("Voice recording aborted"))));};n.addEventListener("abort",k,{once:true});}});return s.start(1e3),d=Date.now(),w=setInterval(()=>{let p=Date.now()-d;for(let l of c)l(p);},Nt),g=setTimeout(()=>{!u&&s.state!=="inactive"&&s.stop();},i),{result:f,stop(){!u&&s.state!=="inactive"&&s.stop();},onTick(p){c.push(p);},abort(){u||(u=true,s.state!=="inactive"&&s.stop(),b());}}}var Vt=12e3,Ht=2,qt=500,zt=2e3,ye="https://blocfeed.com/api/feedback",jt="https://blocfeed.com/api/feedback/voice",We=0,Ge="blocfeed-viewer-token",Je="blocfeed-my-feedback-url";function $t(){try{return localStorage.getItem(Ge)}catch{return null}}function qn(){try{return localStorage.getItem(Je)}catch{return null}}function Xt(e,t){try{localStorage.setItem(Ge,e),t&&localStorage.setItem(Je,t);}catch{}}function Qe(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 Zt(e){return e>=500&&e<=599}function Kt(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),s=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)s[a]=i.charCodeAt(a);return new Blob([s],{type:r})}function Wt(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 Ye(e,t,n){let o=Kt(t);await fetch(e,{method:"PUT",body:o,headers:{"content-type":o.type},...n?{signal:n}:{}});}async function Qt(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(`${ye}/${t}/screenshots`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i),...r?{signal:r}:{}});}async function Yt(e){await fetch(`${ye}/${e.feedbackId}/video`,{method:"POST",body:e.blob,headers:{"content-type":e.blob.type},...e.signal?{signal:e.signal}:{}});}async function et(e){let{signal:t,transport:n}=e;if(Date.now()-We<zt)return {ok:false,error:h("configuration",new Error("Please wait before submitting again"))};let r=n?.timeoutMs??Vt,i=n?.maxAttempts??Ht,s=n?.backoffMs??qt,a=!!(e.payload.screenshots?.element?.dataUrl||e.payload.screenshots?.fullPage?.dataUrl),c=!!e.payload.video?.blob,d=a||c,{lean:w,extracted:g,extractedVideo:u}=d?Wt(e.payload):{lean:e.payload,extracted:{},extractedVideo:{}},b=$t();b&&(w.viewer_token=b);let f={...g,...e.screenshotDataUrls};for(let p=1;p<=i;p+=1){let l=new AbortController,k=setTimeout(()=>l.abort(),r),P=()=>l.abort();t&&t.addEventListener("abort",P,{once:true});try{let T=await fetch(ye,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(w),signal:l.signal});if(T.ok){We=Date.now();let v;try{v=await T.json();}catch{}if(v?.viewer_token&&Xt(v.viewer_token,v.my_feedback_url),(f.element||f.fullPage)&&v){let m=v.upload_urls;if(m){let y=[];f.element&&m.element&&y.push(Ye(m.element,f.element,t)),f.fullPage&&m.fullPage&&y.push(Ye(m.fullPage,f.fullPage,t));try{await Promise.all(y);}catch{}}else if(v.feedback_id)try{await Qt({feedbackId:v.feedback_id,extracted:f,screenshots:e.payload.screenshots,...t?{signal:t}:{}});}catch{}}if(u.blob&&v){let m=v.upload_urls;if(m?.video)try{await fetch(m.video,{method:"PUT",body:u.blob,headers:{"content-type":u.blob.type},...t?{signal:t}:{}});}catch{}else if(v.feedback_id)try{await Yt({feedbackId:v.feedback_id,blob:u.blob,...t?{signal:t}:{}});}catch{}}let q={ok:!0,status:T.status};return v&&(q.apiResponse=v),q}if(p<i&&Zt(T.status)){let v=.85+Math.random()*.3,H=Math.round(s*2**(p-1)*v);await Qe(H,t);continue}let F=`HTTP ${T.status}`;try{let v=await T.json();v?.error&&(F=v.error);}catch{}return {ok:!1,status:T.status,error:h("api_failed",new Error(F))}}catch(T){if(l.signal.aborted||t?.aborted)return {ok:false,error:h("aborted",T)};if(p<i){let F=.85+Math.random()*.3,v=Math.round(s*2**(p-1)*F);await Qe(v,t);continue}return {ok:false,error:h("api_failed",T)}}finally{clearTimeout(k),t&&t.removeEventListener("abort",P);}}return {ok:false,error:h("api_failed",new Error("Failed"))}}async function tt(e){let{blob:t,mime:n,blocfeedId:o,signal:r}=e,i=await fetch(jt,{method:"POST",headers:{"Content-Type":n,"X-Blocfeed-Id":o},body:t,...r?{signal:r}:{}});if(!i.ok){let a=await i.json().catch(()=>({error:"Unknown error"}));throw h("api_failed",new Error(a?.error??`Voice API returned ${i.status}`))}let s=await i.json();return {text:s.text??"",warning:s.warning}}function Ee(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 te(e){return e instanceof Element?!!e.closest("[data-blocfeed-ui]"):false}function ne(e){e.stopPropagation(),e.stopImmediatePropagation?.();}function nt(e,t){if(!E())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,s=null,a=(f,p=false)=>{if(!f){i=null,s=null,t.onHover(null);return}let l=ae(f.getBoundingClientRect()),k=`${Math.round(l.x)}:${Math.round(l.y)}:${Math.round(l.width)}:${Math.round(l.height)}`;!p&&f===i&&k===s||(i=f,s=k,t.onHover({element:f,rect:l}));},c=Ee(f=>{if(te(f.target))return;let p=document.elementFromPoint(f.clientX,f.clientY),l=de(p,r);a(l);}),d=Ee(()=>{i&&a(i,true);}),w=f=>{te(f.target)||(ne(f),f.pointerType==="mouse"&&f.preventDefault());},g=f=>{te(f.target)||(ne(f),f.pointerType==="mouse"&&f.preventDefault());},u=f=>{if(te(f.target))return;ne(f),f.preventDefault();let p=document.elementFromPoint(f.clientX,f.clientY),l=de(p,r);l&&t.onSelect({element:l,descriptor:Fe(l)});},b=f=>{f.key==="Escape"&&(ne(f),f.preventDefault(),t.onCancel());};return window.addEventListener("pointermove",c,{capture:true,passive:true}),window.addEventListener("pointerdown",w,{capture:true}),window.addEventListener("pointerup",g,{capture:true}),window.addEventListener("click",u,{capture:true}),window.addEventListener("keydown",b,{capture:true}),window.addEventListener("scroll",d,{capture:true,passive:true}),window.addEventListener("resize",d,{passive:true}),{stop(){window.removeEventListener("pointermove",c,{capture:true}),window.removeEventListener("pointerdown",w,{capture:true}),window.removeEventListener("pointerup",g,{capture:true}),window.removeEventListener("click",u,{capture:true}),window.removeEventListener("keydown",b,{capture:true}),window.removeEventListener("scroll",d,{capture:true}),window.removeEventListener("resize",d),c.cancel(),d.cancel(),t.onHover(null);}}}async function ve(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 et(r),o.ok=!!o.api?.ok;}catch(r){o.api={ok:false,error:h("api_failed",r)},o.ok=false;}return {payload:e.payload,result:o}}var Gt=["[data-blocfeed-ui]","[data-blocfeed-ignore]"];function Jt(e){let t=[...Gt,...e?.ignoreSelectors??[]],n=Array.from(new Set(t));return {...e,ignoreSelectors:n}}function ot(){return {phase:"idle"}}function en(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 ao(e){let t=e,n=ot(),o=new Set,r=new Set,i=null,s=null,a=null,c=null,d=0,w=null,g=null,u=null,b=null,f=()=>{for(let m of o)m(n);},p=m=>{for(let y of r)y(m);},l=m=>{n=m,f();},k=()=>{d+=1,c?.abort(),c=null;},P=()=>{i?.stop(),i=null,p(null),a!==null&&E()&&(document.documentElement.style.cursor=a,a=null);},T=()=>{g&&(g.abort(),g=null),u&&(URL.revokeObjectURL(u.blobUrl),u=null);},F=()=>{b&&(b.abort(),b=null);},v=()=>{k(),P(),T(),F(),s=null,l(ot());},H=()=>{if(!E())return;P(),s=null;let m=Jt(t.picker);a=document.documentElement.style.cursor,document.documentElement.style.cursor="crosshair",l({phase:"picking"}),i=nt(m,{onHover:p,onSelect:({element:y,descriptor:x})=>{s=y,P(),l({phase:"review",selection:x});},onCancel:()=>{v();}});},q=()=>{let m=Ve();if(m.length!==0)for(let y of m)ve({payload:y,...t.transport?{transport:t.transport}:{}}).catch(()=>{he(y);});};if(E()){setTimeout(q,1e3);let m=()=>q();window.addEventListener("online",m),w=()=>window.removeEventListener("online",m);}return {getState:()=>n,getConfig:()=>t,subscribe(m){return o.add(m),()=>o.delete(m)},subscribeHover(m){return r.add(m),()=>r.delete(m)},start(){n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording"||n.phase!=="picking"&&H();},stop(){v();},clearSelection(){n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording"||H();},setConfig(m){t=m;},async submit(m,y){if(!E()){let _=h("configuration",new Error("BlocFeed submit can only run in the browser"));return l({phase:"error",lastError:_}),{ok:false}}let x=t.blocfeed_id?.trim?.()??"";if(!x){let M={phase:"error",lastError:h("configuration",new Error("Missing blocfeed_id. Create a project in BlocFeed and pass its blocfeed_id."))};return n.selection&&(M.selection=n.selection),l(M),{ok:false}}if(n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording")return {ok:false};let A=d+1;d=A,c?.abort(),c=new AbortController;let R=c.signal,S=n.selection,I=y?.capture?{...t.capture,...y.capture}:t.capture,B=!!(I?.element||I?.fullPage),z={phase:B?"capturing":"submitting"};S&&(z.selection=S),l(z);try{let _=B?await Oe({selectionElement:s,capture:I,signal:R}):void 0;if(R.aborted||d!==A)return {ok:!1};let M={phase:"submitting"};S&&(M.selection=S),_&&(M.capture=_),l(M);let D={};S&&(D.selection=S),_&&(D.capture=_);let j=await Ue({config:t.metadata,context:D,...t.user?{user:t.user}:{}}),N={version:1,createdAt:new Date().toISOString(),blocfeed_id:x,message:m,metadata:j};y?.category&&(N.category=y.category),t.user&&(N.user=t.user),S&&(N.selection=S),_&&(N.screenshots=_),u&&(N.video=u);let{result:L}=await ve({payload:N,signal:R,...t.transport?{transport:t.transport}:{}});if(R.aborted||d!==A)return L;if(L.ok){u&&(URL.revokeObjectURL(u.blobUrl),u=null);let se={phase:"success",lastSubmit:L};return S&&(se.selection=S),_&&(se.capture=_),l(se),L}en(L)&&he(N);let st=L.api?.error??h("unknown",new Error("Submission failed")),ie={phase:"error",lastSubmit:L,lastError:st};return S&&(ie.selection=S),_&&(ie.capture=_),l(ie),L}catch(_){if(R.aborted||d!==A)return {ok:false};let D={phase:"error",lastError:R.aborted?h("aborted",_):h("unknown",_)};return S&&(D.selection=S),l(D),{ok:false}}finally{d===A&&(c=null);}},async startRecording(){if(n.phase!=="review"||!t.recording?.enabled)return;let m=n.selection,y={phase:"recording",recordingElapsedMs:0};m&&(y.selection=m),l(y);try{let x={config:t.recording};c&&(x.signal=c.signal);let A=await we(x);g=A,A.onTick(I=>{if(n.phase==="recording"){let B={phase:"recording",recordingElapsedMs:I};m&&(B.selection=m),l(B);}});let R=await A.result;g=null,u=R;let S={phase:"review",video:R};m&&(S.selection=m),l(S);}catch(x){g=null;let R={phase:"review",lastError:x?.kind?x:h("recording_failed",x)};m&&(R.selection=m),l(R);}},stopRecording(){n.phase!=="recording"||!g||g.stop();},removeVideo(){u&&(URL.revokeObjectURL(u.blobUrl),u=null);let m=n.selection,y={phase:"review"};m&&(y.selection=m),l(y);},async startVoice(){if(n.phase!=="review"){console.warn("[BlocFeed] startVoice: ignored \u2014 phase is",n.phase,'(expected "review")');return}let m=t.voice;if(!m?.enabled){console.warn("[BlocFeed] startVoice: ignored \u2014 voice is not enabled in config");return}F();let y=n.selection,x={phase:"review",voiceRecording:true,voiceElapsedMs:0};y&&(x.selection=y),u&&(x.video=u),l(x);try{let A={config:m};c&&(A.signal=c.signal);let R=await be(A);b=R,R.onTick(D=>{let j={phase:"review",voiceRecording:!0,voiceElapsedMs:D};y&&(j.selection=y),u&&(j.video=u),l(j);});let S=await R.result;b=null;let I={phase:"review",voiceRecording:!1,voiceTranscribing:!0};y&&(I.selection=y),u&&(I.video=u),l(I);let B={blob:S.blob,mime:S.mime,blocfeedId:t.blocfeed_id};c&&(B.signal=c.signal);let{text:Te,warning:z}=await tt(B),_={phase:"review",voiceRecording:!1,voiceTranscribing:!1};y&&(_.selection=y),u&&(_.video=u),l(_);let M={text:Te};return z&&(M.warning=z),M}catch(A){F();let R=A?.kind?A:h("recording_failed",A);console.warn("[BlocFeed] Voice error:",R.message);let S={phase:"review",voiceRecording:false,voiceTranscribing:false,lastError:R};y&&(S.selection=y),u&&(S.video=u),l(S);return}},stopVoice(){b&&b.stop();},__unsafeGetSelectedElement(){return s},destroy(){v(),o.clear(),r.clear(),w?.(),w=null;}}}var Z=[],K=[],rt=20,it=15,oe=[],W={},Q=null,Y=null,G=null,re=false,tn=["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 nn(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function on(e,t){let n=t.map(nn).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)),Z.push(r);Z.length>rt;)Z.shift();}function Se(e){let t=e.url.toLowerCase();for(let n of oe)if(t.includes(n))return;for(K.push(e);K.length>it;)K.shift();}function uo(e={}){if(re||!E())return;re=true,rt=e.consoleLimit??20,it=e.networkLimit??15;let t=e.ignoreUrls;if(t!==void 0?oe=t.map(n=>n.toLowerCase()):oe=[...tn],e.console!==false){let n=e.consoleLevels??["error","warn"];for(let o of n)W[o]=console[o],console[o]=(...r)=>{on(o,r),W[o]?.apply(console,r);};}if(e.network!==false&&typeof window.fetch=="function"){Q=window.fetch;let n=Q;window.fetch=async function(r,i){let s=typeof r=="string"?r:r instanceof URL?r.toString():r.url,a=(i?.method??"GET").toUpperCase(),c=Date.now();try{let d=await n.call(window,r,i);return d.ok||Se({url:s.slice(0,500),method:a,status:d.status,statusText:d.statusText,timestamp:c,durationMs:Date.now()-c}),d}catch(d){throw Se({url:s.slice(0,500),method:a,status:0,statusText:d instanceof Error?d.message:"Network error",timestamp:c,durationMs:Date.now()-c}),d}};}if(e.network!==false&&typeof XMLHttpRequest<"u"){Y=XMLHttpRequest.prototype.open,G=XMLHttpRequest.prototype.send;let n=Y,o=G;XMLHttpRequest.prototype.open=function(r,i,...s){return this.__bf_method=r.toUpperCase(),this.__bf_url=String(i),n.apply(this,[r,i,...s])},XMLHttpRequest.prototype.send=function(...r){let i=this.__bf_method||"GET",s=this.__bf_url||"",a=Date.now();return this.addEventListener("loadend",function(){if(this.status>=400||this.status===0){let c={url:s.slice(0,500),method:i,status:this.status,timestamp:a,durationMs:Date.now()-a};this.statusText&&(c.statusText=this.statusText),Se(c);}}),o.apply(this,r)};}}function fo(){if(re){for(let[e,t]of Object.entries(W))console[e]=t;for(let e of Object.keys(W))delete W[e];Q&&(window.fetch=Q,Q=null),Y&&(XMLHttpRequest.prototype.open=Y,Y=null),G&&(XMLHttpRequest.prototype.send=G,G=null),oe=[],re=false;}}function mo(){return {consoleLogs:[...Z],networkErrors:[...K]}}function po(){Z=[],K=[];}var rn=[{name:"supabase_service_role_key",pattern:/SUPABASE_SERVICE_ROLE_KEY["'=:\s]+[A-Za-z0-9_.=-]{30,}/},{name:"supabase_db_password",pattern:/SUPABASE_DB_PASSWORD["'=:\s]+[^\s"']{6,}/},{name:"postgres_password",pattern:/POSTGRES_PASSWORD["'=:\s]+[^\s"']{6,}/},{name:"database_url_with_creds",pattern:/(?:postgres|postgresql|mysql|mongodb|redis|amqp):\/\/[^:]+:[^@\s"']+@/},{name:"aws_access_key",pattern:/AKIA[0-9A-Z]{16}/},{name:"aws_secret_key",pattern:/AWS_SECRET_ACCESS_KEY["'=:\s]+[A-Za-z0-9/+=]{30,}/},{name:"aws_session_token",pattern:/AWS_SESSION_TOKEN["'=:\s]+[A-Za-z0-9/+=]{30,}/},{name:"stripe_secret_key",pattern:/sk_live_[a-zA-Z0-9]{10,}/},{name:"stripe_secret_key_test",pattern:/sk_test_[a-zA-Z0-9]{10,}/},{name:"stripe_restricted_key",pattern:/rk_(?:live|test)_[a-zA-Z0-9]{10,}/},{name:"github_pat",pattern:/ghp_[A-Za-z0-9_]{36,}/},{name:"github_oauth",pattern:/gho_[A-Za-z0-9_]{36,}/},{name:"github_user_token",pattern:/ghu_[A-Za-z0-9_]{36,}/},{name:"github_server_token",pattern:/ghs_[A-Za-z0-9_]{36,}/},{name:"github_fine_grained",pattern:/github_pat_[A-Za-z0-9_]{22,}/},{name:"openai_api_key",pattern:/sk-[a-zA-Z0-9]{20,}(?![a-zA-Z0-9_])/},{name:"anthropic_api_key",pattern:/sk-ant-[a-zA-Z0-9\-_]{20,}/},{name:"private_key",pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"sendgrid_api_key",pattern:/SG\.[a-zA-Z0-9_-]{22,}\.[a-zA-Z0-9_-]{22,}/},{name:"twilio_auth_token",pattern:/TWILIO_AUTH_TOKEN["'=:\s]+[a-f0-9]{32}/},{name:"generic_secret_key",pattern:/[A-Z_]{2,}_SECRET_KEY["'=:\s]+[^\s"']{8,}/},{name:"generic_secret",pattern:/[A-Z_]{2,}_SECRET["'=:\s]+[^\s"']{8,}/},{name:"generic_password",pattern:/[A-Z_]{2,}_PASSWORD["'=:\s]+[^\s"']{6,}/},{name:"generic_private_key_var",pattern:/[A-Z_]{2,}_PRIVATE_KEY["'=:\s]+[^\s"']{8,}/}],U=[],_e=0,ke=false;function sn(e){let t=e.slice(0,80);return t.length<=6?"***":t.slice(0,6)+"***"}function an(e,t,n,o){if(U.some(s=>s.rule===e&&s.source===t))return;let i={rule:e,source:t,hint:sn(n),timestamp:Date.now()};o&&(i.location=o),U.push(i);}function J(e,t,n,o){for(let{name:r,pattern:i}of n){let s=i.exec(e);s&&an(r,t,s[0],o);}}function cn(e){try{let t=window;if(t.__NEXT_DATA__){let n=JSON.stringify(t.__NEXT_DATA__);J(n,"hydration",e,"__NEXT_DATA__");}if(t.__NUXT__){let n=JSON.stringify(t.__NUXT__);J(n,"hydration",e,"__NUXT__");}}catch{}}function ln(e){try{document.querySelectorAll("script:not([src])").forEach((n,o)=>{let r=n.textContent;r&&r.length>0&&J(r,"scripts",e,`inline-script[${o}]`);});}catch{}}function un(e){try{document.querySelectorAll("meta[content]").forEach(n=>{let o=n.getAttribute("content"),r=n.getAttribute("name")||n.getAttribute("property")||"";o&&o.length>10&&J(o,"meta",e,r?`meta[${r}]`:void 0);});}catch{}}function dn(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&&J(i.value,"dom",e,`${n.tagName.toLowerCase()}[${i.name}]`);}});}catch{}}function wo(e={}){if(ke||!E()||(ke=true,e.secretScan===false))return;let t=[...rn,...e.customPatterns??[]],n=e.scanTargets??["hydration","scripts","meta","dom"];setTimeout(()=>{_e=Date.now(),n.includes("hydration")&&cn(t),n.includes("scripts")&&ln(t),n.includes("meta")&&un(t),n.includes("dom")&&dn(t);let o=e.notify??"both";U.length>0&&(o==="console"||o==="both")&&console.warn(`[BlocFeed Security] Found ${U.length} potential secret(s) exposed in client code:`,U.map(r=>`${r.rule} (${r.source}${r.location?`: ${r.location}`:""})`));},100);}function bo(){return {findings:[...U],scannedAt:_e}}function yo(){U=[],_e=0,ke=false;}
2
- export{E as a,ae as b,Be as c,Oe as d,Ue as e,he as f,Ve as g,_n as h,Tn as i,xt as j,Pt as k,Dt as l,we as m,Ut as n,be as o,$t as p,qn as q,tt as r,ao as s,uo as t,fo as u,mo as v,po as w,wo as x,bo as y,yo as z};
@@ -1,2 +0,0 @@
1
- 'use strict';function E(){return typeof window<"u"&&typeof document<"u"}function Re(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 ae(e){return {x:e.x,y:e.y,width:e.width,height:e.height}}function at(e){return {x:e.x+window.scrollX,y:e.y+window.scrollY,width:e.width,height:e.height}}function ct(e){return e.replace(/\s+/g," ").trim()}function ce(e,t=140){let n=e.textContent;if(!n)return;let o=ct(n);if(o)return o.length<=t?o:`${o.slice(0,t-1)}\u2026`}function lt(e){let t=1;for(let n=e.previousElementSibling;n;n=n.previousElementSibling)n.tagName===e.tagName&&(t+=1);return t}var Ce=["data-testid","data-test-id","data-test","data-qa","data-cy"],Ae="data-blocfeed-component";function le(e){let t=e.closest(`[${Ae}]`);if(!t)return;let o=t.getAttribute(Ae)?.trim();return o||void 0}function ut(e){for(let t of Ce){let n=e.closest(`[${t}]`);if(!n)continue;let r=n.getAttribute(t)?.trim();if(r)return r}}function xe(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 O(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 $(e){if(e){for(let t of e)if(typeof t.name=="string"&&t.name&&!O(t.name))return t.name}}function C(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 C(r)}}}function ue(e){let t=xe(e);if(!t)return;let n=$(t._debugInfo);if(n)return n;let o=t._debugOwner!==void 0;if(o){let c=t._debugOwner;for(let d=0;c&&d<50;d+=1){let w=$(c._debugInfo);if(w)return w;let g=C(c.type)??C(c.elementType);if(g&&!O(g))return g;c=c._debugOwner;}}if(t._owner!==void 0&&t._owner!==t._debugOwner){let c=t._owner;for(let d=0;c&&d<50;d+=1){let w=$(c._debugInfo);if(w)return w;let g=C(c.type)??C(c.elementType);if(g&&!O(g))return g;c=c._owner;}}let i=t,s=o?80:25;for(let c=0;i&&c<s;c+=1){let d=$(i._debugInfo);if(d)return d;let w=C(i.type)??C(i.elementType);if(w&&!O(w))return w;i=i.return;}let a=e.parentElement;for(let c=0;a&&c<15;c+=1){let d=xe(a);if(d){let w=$(d._debugInfo);if(w)return w;let g=C(d.type)??C(d.elementType);if(g&&!O(g))return g;if(d._debugOwner){let u=C(d._debugOwner.type)??C(d._debugOwner.elementType);if(u&&!O(u))return u}if(d._owner&&d._owner!==d._debugOwner){let u=C(d._owner.type)??C(d._owner.elementType);if(u&&!O(u))return u}}a=a.parentElement;}}function dt(e){let t=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n)return `#${Re(n)}`;for(let o of Ce){let r=e.getAttribute(o);if(r)return `${t}[${o}="${Re(r)}"]`}return `${t}:nth-of-type(${lt(e)})`}function ft(e,t=10){let n=[],o=e;for(;o&&n.length<t;){let r=dt(o);if(n.unshift(r),r.startsWith("#"))break;o=o.parentElement;}return n.join(" > ")}function Pe(e,t){if(!t||t.length===0)return false;for(let n of t)if(e.closest(n))return true;return false}function de(e,t){if(!e||Pe(e,t.ignoreSelectors))return null;let n=e;for(;n;){if(Pe(n,t.ignoreSelectors))return null;if(t.isSelectable?.(n)??mt(n))return n;n=n.parentElement;}return null}function mt(e){let t=e.tagName;return !(t==="HTML"||t==="BODY")}function Fe(e){let t=e.getBoundingClientRect(),n={selector:ft(e),tagName:e.tagName.toLowerCase(),rect:ae(t),pageRect:at(t)},o=e.getAttribute("id");o&&(n.id=o);let r=e.className;typeof r=="string"&&r.trim()&&(n.className=r);let i=ce(e);i&&(n.textSnippet=i);let s=le(e)??ue(e);s&&(n.componentName=s);let a=ut(e);return a&&(n.testId=a),n}var fe=null;async function Me(){return fe||(fe=import('html-to-image')),fe}async function pt(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 Ie(e,t){let{width:n,height:o}=await pt(e);return {dataUrl:e,mime:t,width:n,height:o}}function V(e){if(e?.aborted)throw new Error("Aborted")}function Be(){return {async captureElement(e,t){if(!E())throw new Error("captureElement can only run in the browser");V(t.signal);let n=await Me();V(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 V(t.signal),await Ie(o,t.mime)},async captureFullPage(e){if(!E())throw new Error("captureFullPage can only run in the browser");V(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)),s=Math.max(1,Math.round(o*r)),a=await Me();V(e.signal);let c=e.mime==="image/jpeg"?await a.toJpeg(t,{width:i,height:s,quality:e.quality??.92,pixelRatio:e.pixelRatio}):await a.toPng(t,{width:i,height:s,pixelRatio:e.pixelRatio});return V(e.signal),await Ie(c,e.mime)}}}function gt(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return "Unknown error"}}function h(e,t,n){let o={kind:e,message:gt(t)};return n&&(o.detail=n),o}var ht=12e3,wt=2048,bt=.92;function De(){return Date.now()}function yt(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 Le(e,t,n){let o=new Promise((i,s)=>{let a=setTimeout(()=>s(new Error("Timeout")),t);typeof a.unref=="function"&&a.unref();}),r=[e,o];return n&&r.push(yt(n)),await Promise.race(r)}function Et(e){if(!E())return 1;let t=window.devicePixelRatio||1,n=e?.pixelRatio??Math.min(t,2);return Math.max(.1,n)}function vt(e){return !!(e?.element||e?.fullPage)}function Ne(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 Oe(e){let{selectionElement:t,capture:n,signal:o}=e;if(!E()||!vt(n))return;let r=De(),i=[],s=n?.timeoutMs??ht,a=n?.maxDimension??wt,c=n?.mime??"image/png",d=n?.quality??bt,w=n?.adapter??Be(),g={},u=Et(n);if(n?.element&&t)try{let p=t.getBoundingClientRect(),l=Math.min(1,a/Math.max(p.width,p.height)),k=Math.min(u,u*l),P=await Le(Promise.resolve(w.captureElement(t,{...Ne({mime:c,quality:d,pixelRatio:k,maxDimension:a,includeQuality:c==="image/jpeg",...o?{signal:o}:{}})})),s,o);g.element=P;}catch(p){if(o?.aborted)throw p;i.push(h("capture_failed",p,{target:"element"}));}if(n?.fullPage)try{let p=await Le(Promise.resolve(w.captureFullPage(Ne({mime:c,quality:d,pixelRatio:u,maxDimension:a,includeQuality:c==="image/jpeg",...o?{signal:o}:{}}))),s,o);g.fullPage=p;}catch(p){if(o?.aborted)throw p;i.push(h("capture_failed",p,{target:"fullPage"}));}let b=De(),f={startedAt:r,finishedAt:b,durationMs:Math.max(0,b-r)};return i.length>0&&(f.errors=i),{...g,diagnostics:f}}function St(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function kt(){return E()?{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:St()}:{}}function _t(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 Ue(e){let{config:t,context:n,user:o}=e;if(t?.enabled===false)return {};let r={...kt(),..._t(o)},i=t?.enrich;if(!i)return r;try{let s=await i(n);return {...r,...s}}catch(s){let a=h("unknown",s);return {...r,blocfeedMetadataError:a.message}}}var me="blocfeed-queue",Tt=50;function pe(){if(!E())return [];try{let e=localStorage.getItem(me);if(!e)return [];let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return []}}function ge(e){if(E())try{e.length===0?localStorage.removeItem(me):localStorage.setItem(me,JSON.stringify(e));}catch{}}function Rt(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 he(e){let t=pe(),n=Rt(e);for(n.metadata={...n.metadata,_queued:true},t.push({payload:n,timestamp:Date.now()});t.length>Tt;)t.shift();ge(t);}function Ve(){let e=pe();return e.length===0?[]:(ge([]),e.map(t=>t.payload))}function _n(){ge([]);}function Tn(){return pe().length}var At=200,X=[],He=0,ee=false;function qe(e){let t=e.target;if(!(t instanceof Element)||t.closest("[data-blocfeed-ui]"))return;let n={timestampMs:Date.now()-He,path:window.location.pathname,tagName:t.tagName.toLowerCase()},o=ce(t,100);o&&(n.textSnippet=o);let r=le(t)??ue(t);r&&(n.componentName=r),X.length<At&&X.push(n);}function ze(){ee||!E()||(ee=true,X=[],He=Date.now(),document.addEventListener("click",qe,{capture:true,passive:true}));}function je(){ee&&(ee=false,document.removeEventListener("click",qe,{capture:true}));}function xt(){return [...X]}function Pt(){X=[];}var Ct=3e4,Ft=25e5,$e="video/webm",Mt=250,It=1e3,Bt=["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];function Xe(){if(typeof MediaRecorder>"u")return null;for(let e of Bt)if(MediaRecorder.isTypeSupported(e))return e;return null}function Dt(){return !E()||typeof navigator?.mediaDevices?.getDisplayMedia!="function"?false:Xe()!==null}async function we(e){let{config:t,signal:n}=e;if(!E()||typeof navigator?.mediaDevices?.getDisplayMedia!="function")throw h("recording_failed",new Error("Screen recording is not supported in this browser"));let o=Xe();if(!o)throw h("recording_failed",new Error("No supported video codec found (WebM required)"));if(n?.aborted)throw h("aborted",new Error("Recording aborted before start"));let r;try{r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1});}catch(l){let k=l instanceof DOMException&&l.name==="NotAllowedError"?"Screen share permission denied":"Failed to start screen share";throw h("recording_failed",new Error(k))}if(n?.aborted)throw r.getTracks().forEach(l=>l.stop()),h("aborted",new Error("Recording aborted after permission"));let i=t?.maxDurationMs??Ct,s=t?.videoBitsPerSecond??Ft,a=new MediaRecorder(r,{mimeType:o,videoBitsPerSecond:s}),c=[],d=[],w=0,g=null,u=null,b=false,f=()=>{je(),g!==null&&(clearInterval(g),g=null),u!==null&&(clearTimeout(u),u=null),r.getTracks().forEach(l=>l.stop());},p=new Promise((l,k)=>{a.ondataavailable=T=>{T.data.size>0&&c.push(T.data);},a.onstop=()=>{if(b)return;b=true,f();let T=Date.now()-w,F=new Blob(c,{type:$e}),v=URL.createObjectURL(F);l({mime:$e,blobUrl:v,blob:F,durationMs:T,sizeBytes:F.size});},a.onerror=()=>{b||(b=true,f(),k(h("recording_failed",new Error("MediaRecorder error"))));};let P=r.getVideoTracks()[0];if(P&&P.addEventListener("ended",()=>{a.state!=="inactive"&&a.stop();}),n){let T=()=>{b||(b=true,a.state!=="inactive"&&a.stop(),f(),k(h("aborted",new Error("Recording aborted"))));};n.addEventListener("abort",T,{once:true});}});return a.start(It),ze(),w=Date.now(),g=setInterval(()=>{let l=Date.now()-w;for(let k of d)k(l);},Mt),u=setTimeout(()=>{!b&&a.state!=="inactive"&&a.stop();},i),{result:p,stop(){!b&&a.state!=="inactive"&&a.stop();},onTick(l){d.push(l);},abort(){b||(b=true,a.state!=="inactive"&&a.stop(),f());}}}var Lt=6e4,Ze="audio/webm",Nt=250,Ot=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus"];function Ke(){if(typeof MediaRecorder>"u")return null;for(let e of Ot)if(MediaRecorder.isTypeSupported(e))return e;return null}function Ut(){return !E()||typeof navigator?.mediaDevices?.getUserMedia!="function"?false:Ke()!==null}async function be(e){let{config:t,signal:n}=e;if(!E()||typeof navigator?.mediaDevices?.getUserMedia!="function")throw h("recording_failed",new Error("Microphone recording is not supported in this browser"));let o=Ke();if(!o)throw h("recording_failed",new Error("No supported audio codec found"));if(n?.aborted)throw h("aborted",new Error("Voice recording aborted before start"));let r;try{r=await navigator.mediaDevices.getUserMedia({audio:!0});}catch(p){let l=p instanceof DOMException&&p.name==="NotAllowedError"?"Microphone permission denied":"Failed to access microphone";throw h("recording_failed",new Error(l))}if(n?.aborted)throw r.getTracks().forEach(p=>p.stop()),h("aborted",new Error("Voice recording aborted after permission"));let i=t?.maxDurationMs??Lt,s=new MediaRecorder(r,{mimeType:o}),a=[],c=[],d=0,w=null,g=null,u=false,b=()=>{w!==null&&(clearInterval(w),w=null),g!==null&&(clearTimeout(g),g=null),r.getTracks().forEach(p=>p.stop());},f=new Promise((p,l)=>{if(s.ondataavailable=k=>{k.data.size>0&&a.push(k.data);},s.onstop=()=>{if(u)return;u=true,b();let k=Date.now()-d,P=new Blob(a,{type:Ze});p({blob:P,mime:Ze,durationMs:k});},s.onerror=()=>{u||(u=true,b(),l(h("recording_failed",new Error("MediaRecorder error"))));},n){let k=()=>{u||(u=true,s.state!=="inactive"&&s.stop(),b(),l(h("aborted",new Error("Voice recording aborted"))));};n.addEventListener("abort",k,{once:true});}});return s.start(1e3),d=Date.now(),w=setInterval(()=>{let p=Date.now()-d;for(let l of c)l(p);},Nt),g=setTimeout(()=>{!u&&s.state!=="inactive"&&s.stop();},i),{result:f,stop(){!u&&s.state!=="inactive"&&s.stop();},onTick(p){c.push(p);},abort(){u||(u=true,s.state!=="inactive"&&s.stop(),b());}}}var Vt=12e3,Ht=2,qt=500,zt=2e3,ye="https://blocfeed.com/api/feedback",jt="https://blocfeed.com/api/feedback/voice",We=0,Ge="blocfeed-viewer-token",Je="blocfeed-my-feedback-url";function $t(){try{return localStorage.getItem(Ge)}catch{return null}}function qn(){try{return localStorage.getItem(Je)}catch{return null}}function Xt(e,t){try{localStorage.setItem(Ge,e),t&&localStorage.setItem(Je,t);}catch{}}function Qe(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 Zt(e){return e>=500&&e<=599}function Kt(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),s=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)s[a]=i.charCodeAt(a);return new Blob([s],{type:r})}function Wt(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 Ye(e,t,n){let o=Kt(t);await fetch(e,{method:"PUT",body:o,headers:{"content-type":o.type},...n?{signal:n}:{}});}async function Qt(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(`${ye}/${t}/screenshots`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i),...r?{signal:r}:{}});}async function Yt(e){await fetch(`${ye}/${e.feedbackId}/video`,{method:"POST",body:e.blob,headers:{"content-type":e.blob.type},...e.signal?{signal:e.signal}:{}});}async function et(e){let{signal:t,transport:n}=e;if(Date.now()-We<zt)return {ok:false,error:h("configuration",new Error("Please wait before submitting again"))};let r=n?.timeoutMs??Vt,i=n?.maxAttempts??Ht,s=n?.backoffMs??qt,a=!!(e.payload.screenshots?.element?.dataUrl||e.payload.screenshots?.fullPage?.dataUrl),c=!!e.payload.video?.blob,d=a||c,{lean:w,extracted:g,extractedVideo:u}=d?Wt(e.payload):{lean:e.payload,extracted:{},extractedVideo:{}},b=$t();b&&(w.viewer_token=b);let f={...g,...e.screenshotDataUrls};for(let p=1;p<=i;p+=1){let l=new AbortController,k=setTimeout(()=>l.abort(),r),P=()=>l.abort();t&&t.addEventListener("abort",P,{once:true});try{let T=await fetch(ye,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(w),signal:l.signal});if(T.ok){We=Date.now();let v;try{v=await T.json();}catch{}if(v?.viewer_token&&Xt(v.viewer_token,v.my_feedback_url),(f.element||f.fullPage)&&v){let m=v.upload_urls;if(m){let y=[];f.element&&m.element&&y.push(Ye(m.element,f.element,t)),f.fullPage&&m.fullPage&&y.push(Ye(m.fullPage,f.fullPage,t));try{await Promise.all(y);}catch{}}else if(v.feedback_id)try{await Qt({feedbackId:v.feedback_id,extracted:f,screenshots:e.payload.screenshots,...t?{signal:t}:{}});}catch{}}if(u.blob&&v){let m=v.upload_urls;if(m?.video)try{await fetch(m.video,{method:"PUT",body:u.blob,headers:{"content-type":u.blob.type},...t?{signal:t}:{}});}catch{}else if(v.feedback_id)try{await Yt({feedbackId:v.feedback_id,blob:u.blob,...t?{signal:t}:{}});}catch{}}let q={ok:!0,status:T.status};return v&&(q.apiResponse=v),q}if(p<i&&Zt(T.status)){let v=.85+Math.random()*.3,H=Math.round(s*2**(p-1)*v);await Qe(H,t);continue}let F=`HTTP ${T.status}`;try{let v=await T.json();v?.error&&(F=v.error);}catch{}return {ok:!1,status:T.status,error:h("api_failed",new Error(F))}}catch(T){if(l.signal.aborted||t?.aborted)return {ok:false,error:h("aborted",T)};if(p<i){let F=.85+Math.random()*.3,v=Math.round(s*2**(p-1)*F);await Qe(v,t);continue}return {ok:false,error:h("api_failed",T)}}finally{clearTimeout(k),t&&t.removeEventListener("abort",P);}}return {ok:false,error:h("api_failed",new Error("Failed"))}}async function tt(e){let{blob:t,mime:n,blocfeedId:o,signal:r}=e,i=await fetch(jt,{method:"POST",headers:{"Content-Type":n,"X-Blocfeed-Id":o},body:t,...r?{signal:r}:{}});if(!i.ok){let a=await i.json().catch(()=>({error:"Unknown error"}));throw h("api_failed",new Error(a?.error??`Voice API returned ${i.status}`))}let s=await i.json();return {text:s.text??"",warning:s.warning}}function Ee(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 te(e){return e instanceof Element?!!e.closest("[data-blocfeed-ui]"):false}function ne(e){e.stopPropagation(),e.stopImmediatePropagation?.();}function nt(e,t){if(!E())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,s=null,a=(f,p=false)=>{if(!f){i=null,s=null,t.onHover(null);return}let l=ae(f.getBoundingClientRect()),k=`${Math.round(l.x)}:${Math.round(l.y)}:${Math.round(l.width)}:${Math.round(l.height)}`;!p&&f===i&&k===s||(i=f,s=k,t.onHover({element:f,rect:l}));},c=Ee(f=>{if(te(f.target))return;let p=document.elementFromPoint(f.clientX,f.clientY),l=de(p,r);a(l);}),d=Ee(()=>{i&&a(i,true);}),w=f=>{te(f.target)||(ne(f),f.pointerType==="mouse"&&f.preventDefault());},g=f=>{te(f.target)||(ne(f),f.pointerType==="mouse"&&f.preventDefault());},u=f=>{if(te(f.target))return;ne(f),f.preventDefault();let p=document.elementFromPoint(f.clientX,f.clientY),l=de(p,r);l&&t.onSelect({element:l,descriptor:Fe(l)});},b=f=>{f.key==="Escape"&&(ne(f),f.preventDefault(),t.onCancel());};return window.addEventListener("pointermove",c,{capture:true,passive:true}),window.addEventListener("pointerdown",w,{capture:true}),window.addEventListener("pointerup",g,{capture:true}),window.addEventListener("click",u,{capture:true}),window.addEventListener("keydown",b,{capture:true}),window.addEventListener("scroll",d,{capture:true,passive:true}),window.addEventListener("resize",d,{passive:true}),{stop(){window.removeEventListener("pointermove",c,{capture:true}),window.removeEventListener("pointerdown",w,{capture:true}),window.removeEventListener("pointerup",g,{capture:true}),window.removeEventListener("click",u,{capture:true}),window.removeEventListener("keydown",b,{capture:true}),window.removeEventListener("scroll",d,{capture:true}),window.removeEventListener("resize",d),c.cancel(),d.cancel(),t.onHover(null);}}}async function ve(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 et(r),o.ok=!!o.api?.ok;}catch(r){o.api={ok:false,error:h("api_failed",r)},o.ok=false;}return {payload:e.payload,result:o}}var Gt=["[data-blocfeed-ui]","[data-blocfeed-ignore]"];function Jt(e){let t=[...Gt,...e?.ignoreSelectors??[]],n=Array.from(new Set(t));return {...e,ignoreSelectors:n}}function ot(){return {phase:"idle"}}function en(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 ao(e){let t=e,n=ot(),o=new Set,r=new Set,i=null,s=null,a=null,c=null,d=0,w=null,g=null,u=null,b=null,f=()=>{for(let m of o)m(n);},p=m=>{for(let y of r)y(m);},l=m=>{n=m,f();},k=()=>{d+=1,c?.abort(),c=null;},P=()=>{i?.stop(),i=null,p(null),a!==null&&E()&&(document.documentElement.style.cursor=a,a=null);},T=()=>{g&&(g.abort(),g=null),u&&(URL.revokeObjectURL(u.blobUrl),u=null);},F=()=>{b&&(b.abort(),b=null);},v=()=>{k(),P(),T(),F(),s=null,l(ot());},H=()=>{if(!E())return;P(),s=null;let m=Jt(t.picker);a=document.documentElement.style.cursor,document.documentElement.style.cursor="crosshair",l({phase:"picking"}),i=nt(m,{onHover:p,onSelect:({element:y,descriptor:x})=>{s=y,P(),l({phase:"review",selection:x});},onCancel:()=>{v();}});},q=()=>{let m=Ve();if(m.length!==0)for(let y of m)ve({payload:y,...t.transport?{transport:t.transport}:{}}).catch(()=>{he(y);});};if(E()){setTimeout(q,1e3);let m=()=>q();window.addEventListener("online",m),w=()=>window.removeEventListener("online",m);}return {getState:()=>n,getConfig:()=>t,subscribe(m){return o.add(m),()=>o.delete(m)},subscribeHover(m){return r.add(m),()=>r.delete(m)},start(){n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording"||n.phase!=="picking"&&H();},stop(){v();},clearSelection(){n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording"||H();},setConfig(m){t=m;},async submit(m,y){if(!E()){let _=h("configuration",new Error("BlocFeed submit can only run in the browser"));return l({phase:"error",lastError:_}),{ok:false}}let x=t.blocfeed_id?.trim?.()??"";if(!x){let M={phase:"error",lastError:h("configuration",new Error("Missing blocfeed_id. Create a project in BlocFeed and pass its blocfeed_id."))};return n.selection&&(M.selection=n.selection),l(M),{ok:false}}if(n.phase==="capturing"||n.phase==="submitting"||n.phase==="recording")return {ok:false};let A=d+1;d=A,c?.abort(),c=new AbortController;let R=c.signal,S=n.selection,I=y?.capture?{...t.capture,...y.capture}:t.capture,B=!!(I?.element||I?.fullPage),z={phase:B?"capturing":"submitting"};S&&(z.selection=S),l(z);try{let _=B?await Oe({selectionElement:s,capture:I,signal:R}):void 0;if(R.aborted||d!==A)return {ok:!1};let M={phase:"submitting"};S&&(M.selection=S),_&&(M.capture=_),l(M);let D={};S&&(D.selection=S),_&&(D.capture=_);let j=await Ue({config:t.metadata,context:D,...t.user?{user:t.user}:{}}),N={version:1,createdAt:new Date().toISOString(),blocfeed_id:x,message:m,metadata:j};y?.category&&(N.category=y.category),t.user&&(N.user=t.user),S&&(N.selection=S),_&&(N.screenshots=_),u&&(N.video=u);let{result:L}=await ve({payload:N,signal:R,...t.transport?{transport:t.transport}:{}});if(R.aborted||d!==A)return L;if(L.ok){u&&(URL.revokeObjectURL(u.blobUrl),u=null);let se={phase:"success",lastSubmit:L};return S&&(se.selection=S),_&&(se.capture=_),l(se),L}en(L)&&he(N);let st=L.api?.error??h("unknown",new Error("Submission failed")),ie={phase:"error",lastSubmit:L,lastError:st};return S&&(ie.selection=S),_&&(ie.capture=_),l(ie),L}catch(_){if(R.aborted||d!==A)return {ok:false};let D={phase:"error",lastError:R.aborted?h("aborted",_):h("unknown",_)};return S&&(D.selection=S),l(D),{ok:false}}finally{d===A&&(c=null);}},async startRecording(){if(n.phase!=="review"||!t.recording?.enabled)return;let m=n.selection,y={phase:"recording",recordingElapsedMs:0};m&&(y.selection=m),l(y);try{let x={config:t.recording};c&&(x.signal=c.signal);let A=await we(x);g=A,A.onTick(I=>{if(n.phase==="recording"){let B={phase:"recording",recordingElapsedMs:I};m&&(B.selection=m),l(B);}});let R=await A.result;g=null,u=R;let S={phase:"review",video:R};m&&(S.selection=m),l(S);}catch(x){g=null;let R={phase:"review",lastError:x?.kind?x:h("recording_failed",x)};m&&(R.selection=m),l(R);}},stopRecording(){n.phase!=="recording"||!g||g.stop();},removeVideo(){u&&(URL.revokeObjectURL(u.blobUrl),u=null);let m=n.selection,y={phase:"review"};m&&(y.selection=m),l(y);},async startVoice(){if(n.phase!=="review"){console.warn("[BlocFeed] startVoice: ignored \u2014 phase is",n.phase,'(expected "review")');return}let m=t.voice;if(!m?.enabled){console.warn("[BlocFeed] startVoice: ignored \u2014 voice is not enabled in config");return}F();let y=n.selection,x={phase:"review",voiceRecording:true,voiceElapsedMs:0};y&&(x.selection=y),u&&(x.video=u),l(x);try{let A={config:m};c&&(A.signal=c.signal);let R=await be(A);b=R,R.onTick(D=>{let j={phase:"review",voiceRecording:!0,voiceElapsedMs:D};y&&(j.selection=y),u&&(j.video=u),l(j);});let S=await R.result;b=null;let I={phase:"review",voiceRecording:!1,voiceTranscribing:!0};y&&(I.selection=y),u&&(I.video=u),l(I);let B={blob:S.blob,mime:S.mime,blocfeedId:t.blocfeed_id};c&&(B.signal=c.signal);let{text:Te,warning:z}=await tt(B),_={phase:"review",voiceRecording:!1,voiceTranscribing:!1};y&&(_.selection=y),u&&(_.video=u),l(_);let M={text:Te};return z&&(M.warning=z),M}catch(A){F();let R=A?.kind?A:h("recording_failed",A);console.warn("[BlocFeed] Voice error:",R.message);let S={phase:"review",voiceRecording:false,voiceTranscribing:false,lastError:R};y&&(S.selection=y),u&&(S.video=u),l(S);return}},stopVoice(){b&&b.stop();},__unsafeGetSelectedElement(){return s},destroy(){v(),o.clear(),r.clear(),w?.(),w=null;}}}var Z=[],K=[],rt=20,it=15,oe=[],W={},Q=null,Y=null,G=null,re=false,tn=["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 nn(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function on(e,t){let n=t.map(nn).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)),Z.push(r);Z.length>rt;)Z.shift();}function Se(e){let t=e.url.toLowerCase();for(let n of oe)if(t.includes(n))return;for(K.push(e);K.length>it;)K.shift();}function uo(e={}){if(re||!E())return;re=true,rt=e.consoleLimit??20,it=e.networkLimit??15;let t=e.ignoreUrls;if(t!==void 0?oe=t.map(n=>n.toLowerCase()):oe=[...tn],e.console!==false){let n=e.consoleLevels??["error","warn"];for(let o of n)W[o]=console[o],console[o]=(...r)=>{on(o,r),W[o]?.apply(console,r);};}if(e.network!==false&&typeof window.fetch=="function"){Q=window.fetch;let n=Q;window.fetch=async function(r,i){let s=typeof r=="string"?r:r instanceof URL?r.toString():r.url,a=(i?.method??"GET").toUpperCase(),c=Date.now();try{let d=await n.call(window,r,i);return d.ok||Se({url:s.slice(0,500),method:a,status:d.status,statusText:d.statusText,timestamp:c,durationMs:Date.now()-c}),d}catch(d){throw Se({url:s.slice(0,500),method:a,status:0,statusText:d instanceof Error?d.message:"Network error",timestamp:c,durationMs:Date.now()-c}),d}};}if(e.network!==false&&typeof XMLHttpRequest<"u"){Y=XMLHttpRequest.prototype.open,G=XMLHttpRequest.prototype.send;let n=Y,o=G;XMLHttpRequest.prototype.open=function(r,i,...s){return this.__bf_method=r.toUpperCase(),this.__bf_url=String(i),n.apply(this,[r,i,...s])},XMLHttpRequest.prototype.send=function(...r){let i=this.__bf_method||"GET",s=this.__bf_url||"",a=Date.now();return this.addEventListener("loadend",function(){if(this.status>=400||this.status===0){let c={url:s.slice(0,500),method:i,status:this.status,timestamp:a,durationMs:Date.now()-a};this.statusText&&(c.statusText=this.statusText),Se(c);}}),o.apply(this,r)};}}function fo(){if(re){for(let[e,t]of Object.entries(W))console[e]=t;for(let e of Object.keys(W))delete W[e];Q&&(window.fetch=Q,Q=null),Y&&(XMLHttpRequest.prototype.open=Y,Y=null),G&&(XMLHttpRequest.prototype.send=G,G=null),oe=[],re=false;}}function mo(){return {consoleLogs:[...Z],networkErrors:[...K]}}function po(){Z=[],K=[];}var rn=[{name:"supabase_service_role_key",pattern:/SUPABASE_SERVICE_ROLE_KEY["'=:\s]+[A-Za-z0-9_.=-]{30,}/},{name:"supabase_db_password",pattern:/SUPABASE_DB_PASSWORD["'=:\s]+[^\s"']{6,}/},{name:"postgres_password",pattern:/POSTGRES_PASSWORD["'=:\s]+[^\s"']{6,}/},{name:"database_url_with_creds",pattern:/(?:postgres|postgresql|mysql|mongodb|redis|amqp):\/\/[^:]+:[^@\s"']+@/},{name:"aws_access_key",pattern:/AKIA[0-9A-Z]{16}/},{name:"aws_secret_key",pattern:/AWS_SECRET_ACCESS_KEY["'=:\s]+[A-Za-z0-9/+=]{30,}/},{name:"aws_session_token",pattern:/AWS_SESSION_TOKEN["'=:\s]+[A-Za-z0-9/+=]{30,}/},{name:"stripe_secret_key",pattern:/sk_live_[a-zA-Z0-9]{10,}/},{name:"stripe_secret_key_test",pattern:/sk_test_[a-zA-Z0-9]{10,}/},{name:"stripe_restricted_key",pattern:/rk_(?:live|test)_[a-zA-Z0-9]{10,}/},{name:"github_pat",pattern:/ghp_[A-Za-z0-9_]{36,}/},{name:"github_oauth",pattern:/gho_[A-Za-z0-9_]{36,}/},{name:"github_user_token",pattern:/ghu_[A-Za-z0-9_]{36,}/},{name:"github_server_token",pattern:/ghs_[A-Za-z0-9_]{36,}/},{name:"github_fine_grained",pattern:/github_pat_[A-Za-z0-9_]{22,}/},{name:"openai_api_key",pattern:/sk-[a-zA-Z0-9]{20,}(?![a-zA-Z0-9_])/},{name:"anthropic_api_key",pattern:/sk-ant-[a-zA-Z0-9\-_]{20,}/},{name:"private_key",pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"sendgrid_api_key",pattern:/SG\.[a-zA-Z0-9_-]{22,}\.[a-zA-Z0-9_-]{22,}/},{name:"twilio_auth_token",pattern:/TWILIO_AUTH_TOKEN["'=:\s]+[a-f0-9]{32}/},{name:"generic_secret_key",pattern:/[A-Z_]{2,}_SECRET_KEY["'=:\s]+[^\s"']{8,}/},{name:"generic_secret",pattern:/[A-Z_]{2,}_SECRET["'=:\s]+[^\s"']{8,}/},{name:"generic_password",pattern:/[A-Z_]{2,}_PASSWORD["'=:\s]+[^\s"']{6,}/},{name:"generic_private_key_var",pattern:/[A-Z_]{2,}_PRIVATE_KEY["'=:\s]+[^\s"']{8,}/}],U=[],_e=0,ke=false;function sn(e){let t=e.slice(0,80);return t.length<=6?"***":t.slice(0,6)+"***"}function an(e,t,n,o){if(U.some(s=>s.rule===e&&s.source===t))return;let i={rule:e,source:t,hint:sn(n),timestamp:Date.now()};o&&(i.location=o),U.push(i);}function J(e,t,n,o){for(let{name:r,pattern:i}of n){let s=i.exec(e);s&&an(r,t,s[0],o);}}function cn(e){try{let t=window;if(t.__NEXT_DATA__){let n=JSON.stringify(t.__NEXT_DATA__);J(n,"hydration",e,"__NEXT_DATA__");}if(t.__NUXT__){let n=JSON.stringify(t.__NUXT__);J(n,"hydration",e,"__NUXT__");}}catch{}}function ln(e){try{document.querySelectorAll("script:not([src])").forEach((n,o)=>{let r=n.textContent;r&&r.length>0&&J(r,"scripts",e,`inline-script[${o}]`);});}catch{}}function un(e){try{document.querySelectorAll("meta[content]").forEach(n=>{let o=n.getAttribute("content"),r=n.getAttribute("name")||n.getAttribute("property")||"";o&&o.length>10&&J(o,"meta",e,r?`meta[${r}]`:void 0);});}catch{}}function dn(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&&J(i.value,"dom",e,`${n.tagName.toLowerCase()}[${i.name}]`);}});}catch{}}function wo(e={}){if(ke||!E()||(ke=true,e.secretScan===false))return;let t=[...rn,...e.customPatterns??[]],n=e.scanTargets??["hydration","scripts","meta","dom"];setTimeout(()=>{_e=Date.now(),n.includes("hydration")&&cn(t),n.includes("scripts")&&ln(t),n.includes("meta")&&un(t),n.includes("dom")&&dn(t);let o=e.notify??"both";U.length>0&&(o==="console"||o==="both")&&console.warn(`[BlocFeed Security] Found ${U.length} potential secret(s) exposed in client code:`,U.map(r=>`${r.rule} (${r.source}${r.location?`: ${r.location}`:""})`));},100);}function bo(){return {findings:[...U],scannedAt:_e}}function yo(){U=[],_e=0,ke=false;}
2
- exports.a=E;exports.b=ae;exports.c=Be;exports.d=Oe;exports.e=Ue;exports.f=he;exports.g=Ve;exports.h=_n;exports.i=Tn;exports.j=xt;exports.k=Pt;exports.l=Dt;exports.m=we;exports.n=Ut;exports.o=be;exports.p=$t;exports.q=qn;exports.r=tt;exports.s=ao;exports.t=uo;exports.u=fo;exports.v=mo;exports.w=po;exports.x=wo;exports.y=bo;exports.z=yo;