blocfeed 0.14.0 → 0.15.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/README.md +39 -0
- package/dist/chunk-ACMIGJ32.cjs +2 -0
- package/dist/chunk-C4BWWDCF.js +2 -0
- package/dist/{controller-JCtPYbzs.d.cts → controller-6fm9oK63.d.cts} +48 -1
- package/dist/{controller-JCtPYbzs.d.ts → controller-6fm9oK63.d.ts} +48 -1
- package/dist/engine.cjs +1 -1
- package/dist/engine.d.cts +2 -2
- package/dist/engine.d.ts +2 -2
- package/dist/engine.js +1 -1
- package/dist/main.cjs +3 -3
- package/dist/main.d.cts +30 -3
- package/dist/main.d.ts +30 -3
- package/dist/main.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-EZWTVVJ5.cjs +0 -2
- package/dist/chunk-PUVKSWVE.js +0 -2
package/README.md
CHANGED
|
@@ -999,6 +999,45 @@ import type {
|
|
|
999
999
|
} from "blocfeed";
|
|
1000
1000
|
```
|
|
1001
1001
|
|
|
1002
|
+
## Passive pattern detection (v0.15.0+)
|
|
1003
|
+
|
|
1004
|
+
The widget now automatically detects and reports four common UX failures —
|
|
1005
|
+
no code changes required after upgrading:
|
|
1006
|
+
|
|
1007
|
+
- **Rage-clicks on disabled buttons** — "I clicked Save five times and nothing happened"
|
|
1008
|
+
- **Silent HTTP form failures** — 4xx/5xx responses to form submits (checkout, upgrade flows)
|
|
1009
|
+
- **Redirect loops** — repeated navigation to the same URL in a short window
|
|
1010
|
+
- **Form data loss** — fields filled in, then lost to a browser back or bfcache restore
|
|
1011
|
+
|
|
1012
|
+
Events ship to the same `/api/behavioral-events` endpoint and surface in the
|
|
1013
|
+
blocfeed dashboard alongside user-reported feedback.
|
|
1014
|
+
|
|
1015
|
+
### Opt out or tune
|
|
1016
|
+
|
|
1017
|
+
```tsx
|
|
1018
|
+
<BlocFeedWidget
|
|
1019
|
+
blocfeed_id="bf_your_project"
|
|
1020
|
+
config={{
|
|
1021
|
+
behavioral: {
|
|
1022
|
+
enabled: true, // default true
|
|
1023
|
+
sampling: 1.0, // 0..1 per-session
|
|
1024
|
+
ignoreSelectors: ["[data-blocfeed-ignore]"],
|
|
1025
|
+
rageClick: { threshold: 3, windowMs: 1000 },
|
|
1026
|
+
httpFail: { statusCodes: [400, 422, 500], ignoreUrls: ["/health"] },
|
|
1027
|
+
redirectLoop:{ threshold: 3, windowMs: 2000 },
|
|
1028
|
+
formDataLoss:{ enabled: true },
|
|
1029
|
+
}
|
|
1030
|
+
}}
|
|
1031
|
+
/>
|
|
1032
|
+
```
|
|
1033
|
+
|
|
1034
|
+
### Privacy
|
|
1035
|
+
|
|
1036
|
+
- **No request or response bodies are captured.** URLs, status codes, and DOM selectors only.
|
|
1037
|
+
- URL is sent as-is — use `httpFail.ignoreUrls` to skip URLs that contain PII in query params.
|
|
1038
|
+
- No user identity is attached to behavioral events.
|
|
1039
|
+
- On widget unmount, `window.fetch`, `XMLHttpRequest`, and `history.pushState` are restored to their originals.
|
|
1040
|
+
|
|
1002
1041
|
## Local development
|
|
1003
1042
|
|
|
1004
1043
|
```bash
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';function y(){return typeof window<"u"&&typeof document<"u"}function De(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 fe(e){return {x:e.x,y:e.y,width:e.width,height:e.height}}function Ft(e){return {x:e.x+window.scrollX,y:e.y+window.scrollY,width:e.width,height:e.height}}function Pt(e){return e.replace(/\s+/g," ").trim()}function pe(e,t=140){let n=e.textContent;if(!n)return;let o=Pt(n);if(o)return o.length<=t?o:`${o.slice(0,t-1)}\u2026`}function Mt(e){let t=1;for(let n=e.previousElementSibling;n;n=n.previousElementSibling)n.tagName===e.tagName&&(t+=1);return t}var He=["data-testid","data-test-id","data-test","data-qa","data-cy"],Oe="data-blocfeed-component";function me(e){let t=e.closest(`[${Oe}]`);if(!t)return;let o=t.getAttribute(Oe)?.trim();return o||void 0}function Lt(e){for(let t of He){let n=e.closest(`[${t}]`);if(!n)continue;let r=n.getAttribute(t)?.trim();if(r)return r}}function Ne(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 K(e){if(e){for(let t of e)if(typeof t.name=="string"&&t.name&&!V(t.name))return t.name}}function F(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 F(r)}}}function ge(e){let t=Ne(e);if(!t)return;let n=K(t._debugInfo);if(n)return n;let o=t._debugOwner!==void 0;if(o){let f=t._debugOwner;for(let s=0;f&&s<50;s+=1){let d=K(f._debugInfo);if(d)return d;let l=F(f.type)??F(f.elementType);if(l&&!V(l))return l;f=f._debugOwner;}}if(t._owner!==void 0&&t._owner!==t._debugOwner){let f=t._owner;for(let s=0;f&&s<50;s+=1){let d=K(f._debugInfo);if(d)return d;let l=F(f.type)??F(f.elementType);if(l&&!V(l))return l;f=f._owner;}}let i=t,c=o?80:25;for(let f=0;i&&f<c;f+=1){let s=K(i._debugInfo);if(s)return s;let d=F(i.type)??F(i.elementType);if(d&&!V(d))return d;i=i.return;}let a=e.parentElement;for(let f=0;a&&f<15;f+=1){let s=Ne(a);if(s){let d=K(s._debugInfo);if(d)return d;let l=F(s.type)??F(s.elementType);if(l&&!V(l))return l;if(s._debugOwner){let p=F(s._debugOwner.type)??F(s._debugOwner.elementType);if(p&&!V(p))return p}if(s._owner&&s._owner!==s._debugOwner){let p=F(s._owner.type)??F(s._owner.elementType);if(p&&!V(p))return p}}a=a.parentElement;}}function Bt(e){let t=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n)return `#${De(n)}`;for(let o of He){let r=e.getAttribute(o);if(r)return `${t}[${o}="${De(r)}"]`}return `${t}:nth-of-type(${Mt(e)})`}function he(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 Ue(e,t){if(!t||t.length===0)return false;for(let n of t)if(e.closest(n))return true;return false}function be(e,t){if(!e||Ue(e,t.ignoreSelectors))return null;let n=e;for(;n;){if(Ue(n,t.ignoreSelectors))return null;if(t.isSelectable?t.isSelectable(n):It(n))return n;n=n.parentElement;}return null}function It(e){let t=e.tagName;return !(t==="HTML"||t==="BODY")}function qe(e){let t=e.getBoundingClientRect(),n={selector:he(e),tagName:e.tagName.toLowerCase(),rect:fe(t),pageRect:Ft(t)},o=e.getAttribute("id");o&&(n.id=o);let r=e.className;typeof r=="string"&&r.trim()&&(n.className=r);let i=pe(e);i&&(n.textSnippet=i);let c=me(e)??ge(e);c&&(n.componentName=c);let a=Lt(e);return a&&(n.testId=a),n}var we=null;async function Ve(){return we||(we=import('html-to-image')),we}async function Dt(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 Xe(e,t){let{width:n,height:o}=await Dt(e);return {dataUrl:e,mime:t,width:n,height:o}}function $(e){if(e?.aborted)throw new Error("Aborted")}function $e(){return {async captureElement(e,t){if(!y())throw new Error("captureElement can only run in the browser");$(t.signal);let n=await Ve();$(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 $(t.signal),await Xe(o,t.mime)},async captureFullPage(e){if(!y())throw new Error("captureFullPage can only run in the browser");$(e.signal);let t=document.documentElement,n=Math.max(t.scrollWidth,t.clientWidth),o=Math.max(t.scrollHeight,t.clientHeight),r=Math.min(1,e.maxDimension/Math.max(n,o)),i=Math.max(1,Math.round(n*r)),c=Math.max(1,Math.round(o*r)),a=await Ve();$(e.signal);let f=e.mime==="image/jpeg"?await a.toJpeg(t,{width:i,height:c,quality:e.quality??.92,pixelRatio:e.pixelRatio}):await a.toPng(t,{width:i,height:c,pixelRatio:e.pixelRatio});return $(e.signal),await Xe(f,e.mime)}}}function Ot(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:Ot(t)};return n&&(o.detail=n),o}var Nt=12e3,Ut=2048,Ht=.92;function ze(){return Date.now()}function qt(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 je(e,t,n){let o=new Promise((i,c)=>{let a=setTimeout(()=>c(new Error("Timeout")),t);typeof a.unref=="function"&&a.unref();}),r=[e,o];return n&&r.push(qt(n)),await Promise.race(r)}function Vt(e){if(!y())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 Ke(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 We(e){let{selectionElement:t,capture:n,signal:o}=e;if(!y()||!Xt(n))return;let r=ze(),i=[],c=n?.timeoutMs??Nt,a=n?.maxDimension??Ut,f=n?.mime??"image/png",s=n?.quality??Ht,d=n?.adapter??$e(),l={},p=Vt(n);if(n?.element&&t)try{let g=t.getBoundingClientRect(),h=Math.min(1,a/Math.max(g.width,g.height)),k=Math.min(p,p*h),v=await je(Promise.resolve(d.captureElement(t,{...Ke({mime:f,quality:s,pixelRatio:k,maxDimension:a,includeQuality:f==="image/jpeg",...o?{signal:o}:{}})})),c,o);l.element=v;}catch(g){if(o?.aborted)throw g;i.push(w("capture_failed",g,{target:"element"}));}if(n?.fullPage)try{let g=await je(Promise.resolve(d.captureFullPage(Ke({mime:f,quality:s,pixelRatio:p,maxDimension:a,includeQuality:f==="image/jpeg",...o?{signal:o}:{}}))),c,o);l.fullPage=g;}catch(g){if(o?.aborted)throw g;i.push(w("capture_failed",g,{target:"fullPage"}));}let m=ze(),u={startedAt:r,finishedAt:m,durationMs:Math.max(0,m-r)};return i.length>0&&(u.errors=i),{...l,diagnostics:u}}function $t(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function zt(){return y()?{url:window.location.href,title:document.title,referrer:document.referrer||void 0,userAgent:navigator.userAgent,language:navigator.language,platform:navigator.platform,viewport:{width:window.innerWidth,height:window.innerHeight},screen:{width:window.screen.width,height:window.screen.height},scroll:{x:window.scrollX,y:window.scrollY},devicePixelRatio:window.devicePixelRatio||1,timezone:$t()}:{}}function jt(e){if(!e)return {};let t={};return e.id&&(t.userId=e.id),e.email&&(t.userEmail=e.email),e.name&&(t.userName=e.name),t}async function Ze(e){let{config:t,context:n,user:o}=e;if(t?.enabled===false)return {};let r={...zt(),...jt(o)},i=t?.enrich;if(!i)return r;try{let c=await i(n);return {...r,...c}}catch(c){let a=w("unknown",c);return {...r,blocfeedMetadataError:a.message}}}var W="blocfeed-queue",Kt=50;function ve(){if(!y())return [];try{let e=localStorage.getItem(W);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(W);}catch{}return []}catch(e){console.warn("[BlocFeed] offline queue could not be read \u2014 resetting",e);try{localStorage.removeItem(W);}catch{}return []}}function ye(e){if(y())try{e.length===0?localStorage.removeItem(W):localStorage.setItem(W,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 Wt(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 Ee(e){let t=ve(),n=Wt(e);for(n.metadata={...n.metadata,_queued:true},t.push({payload:n,timestamp:Date.now()});t.length>Kt;)t.shift();ye(t);}function Ge(){let e=ve();return e.length===0?[]:(ye([]),e.map(t=>t.payload))}function Jn(){ye([]);}function eo(){return ve().length}var Zt=200,Z=[],Ye=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()-Ye,path:window.location.pathname,tagName:t.tagName.toLowerCase()},o=pe(t,100);o&&(n.textSnippet=o);let r=me(t)??ge(t);r&&(n.componentName=r),Z.length<Zt&&Z.push(n);}var Je={capture:true,passive:true};function et(){ee||!y()||(ee=true,Z=[],Ye=Date.now(),document.addEventListener("click",Qe,Je));}function tt(){ee&&(ee=false,document.removeEventListener("click",Qe,Je));}function Gt(){return [...Z]}function Yt(){Z=[];}var Qt=3e4,Jt=25e5,nt="video/webm",en=250,tn=1e3,nn=["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];function ot(){if(typeof MediaRecorder>"u")return null;for(let e of nn)if(MediaRecorder.isTypeSupported(e))return e;return null}function on(){return !y()||typeof navigator?.mediaDevices?.getDisplayMedia!="function"?false:ot()!==null}async function _e(e){let{config:t,signal:n}=e;if(!y()||typeof navigator?.mediaDevices?.getDisplayMedia!="function")throw w("recording_failed",new Error("Screen recording is not supported in this browser"));let o=ot();if(!o)throw w("recording_failed",new Error("No supported video codec found (WebM required)"));if(n?.aborted)throw w("aborted",new Error("Recording aborted before start"));let r;try{r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1});}catch(h){let k=h instanceof DOMException&&h.name==="NotAllowedError"?"Screen share permission denied":"Failed to start screen share";throw w("recording_failed",new Error(k))}if(n?.aborted)throw r.getTracks().forEach(h=>h.stop()),w("aborted",new Error("Recording aborted after permission"));let i=t?.maxDurationMs??Qt,c=t?.videoBitsPerSecond??Jt,a=new MediaRecorder(r,{mimeType:o,videoBitsPerSecond:c}),f=[],s=[],d=0,l=null,p=null,m=false,u=()=>{tt(),l!==null&&(clearInterval(l),l=null),p!==null&&(clearTimeout(p),p=null),r.getTracks().forEach(h=>h.stop());},g=new Promise((h,k)=>{a.ondataavailable=R=>{R.data.size>0&&f.push(R.data);},a.onstop=()=>{if(m)return;m=true,u();let R=Date.now()-d,P=new Blob(f,{type:nt}),_=URL.createObjectURL(P);h({mime:nt,blobUrl:_,blob:P,durationMs:R,sizeBytes:P.size});},a.onerror=()=>{m||(m=true,u(),k(w("recording_failed",new Error("MediaRecorder error"))));};let v=r.getVideoTracks()[0];if(v&&v.addEventListener("ended",()=>{a.state!=="inactive"&&a.stop();}),n){let R=()=>{m||(m=true,a.state!=="inactive"&&a.stop(),u(),k(w("aborted",new Error("Recording aborted"))));};n.addEventListener("abort",R,{once:true});}});return a.start(tn),et(),d=Date.now(),l=setInterval(()=>{let h=Date.now()-d;for(let k of s)k(h);},en),p=setTimeout(()=>{!m&&a.state!=="inactive"&&a.stop();},i),{result:g,stop(){!m&&a.state!=="inactive"&&a.stop();},onTick(h){s.push(h);},abort(){m||(m=true,a.state!=="inactive"&&a.stop(),u());}}}var rn=6e4,rt="audio/webm",sn=250,an=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus"];function it(){if(typeof MediaRecorder>"u")return null;for(let e of an)if(MediaRecorder.isTypeSupported(e))return e;return null}function cn(){return !y()||typeof navigator?.mediaDevices?.getUserMedia!="function"?false:it()!==null}async function Se(e){let{config:t,signal:n}=e;if(!y()||typeof navigator?.mediaDevices?.getUserMedia!="function")throw w("recording_failed",new Error("Microphone recording is not supported in this browser"));let o=it();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 h=g instanceof DOMException&&g.name==="NotAllowedError"?"Microphone permission denied":"Failed to access microphone";throw w("recording_failed",new Error(h))}if(n?.aborted)throw r.getTracks().forEach(g=>g.stop()),w("aborted",new Error("Voice recording aborted after permission"));let i=t?.maxDurationMs??rn,c=new MediaRecorder(r,{mimeType:o}),a=[],f=[],s=0,d=null,l=null,p=false,m=()=>{d!==null&&(clearInterval(d),d=null),l!==null&&(clearTimeout(l),l=null),r.getTracks().forEach(g=>g.stop());},u=new Promise((g,h)=>{if(c.ondataavailable=k=>{k.data.size>0&&a.push(k.data);},c.onstop=()=>{if(p)return;p=true,m();let k=Date.now()-s,v=new Blob(a,{type:rt});g({blob:v,mime:rt,durationMs:k});},c.onerror=()=>{p||(p=true,m(),h(w("recording_failed",new Error("MediaRecorder error"))));},n){let k=()=>{p||(p=true,c.state!=="inactive"&&c.stop(),m(),h(w("aborted",new Error("Voice recording aborted"))));};n.addEventListener("abort",k,{once:true});}});return c.start(1e3),s=Date.now(),d=setInterval(()=>{let g=Date.now()-s;for(let h of f)h(g);},sn),l=setTimeout(()=>{l=null,!p&&c.state!=="inactive"&&c.stop();},i),{result:u,stop(){!p&&c.state!=="inactive"&&c.stop();},onTick(g){f.push(g);},abort(){p||(p=true,c.state!=="inactive"&&c.stop(),m());}}}var ln=12e3,dn=2,un=500,fn=2e3,ke="https://blocfeed.com/api/feedback",pn="https://blocfeed.com/api/feedback/voice",st=0,lt="blocfeed-viewer-token",dt="blocfeed-my-feedback-url";function mn(){try{return localStorage.getItem(lt)}catch{return null}}function wo(){try{return localStorage.getItem(dt)}catch{return null}}function gn(e,t){try{localStorage.setItem(lt,e),t&&localStorage.setItem(dt,t);}catch{}}function at(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 hn(e){return e>=500&&e<=599}function bn(e){let[t,n]=e.split(",",2);if(!t||!n)throw new Error("Invalid data URL");let r=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(n),c=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)c[a]=i.charCodeAt(a);return new Blob([c],{type:r})}function wn(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 ct(e,t,n){let o=bn(t);await fetch(e,{method:"PUT",body:o,headers:{"content-type":o.type},...n?{signal:n}:{}});}async function vn(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(`${ke}/${t}/screenshots`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i),...r?{signal:r}:{}});}async function yn(e){await fetch(`${ke}/${e.feedbackId}/video`,{method:"POST",body:e.blob,headers:{"content-type":e.blob.type},...e.signal?{signal:e.signal}:{}});}async function ut(e){let{signal:t,transport:n}=e;if(Date.now()-st<fn)return {ok:false,error:w("configuration",new Error("Please wait before submitting again"))};let r=n?.timeoutMs??ln,i=n?.maxAttempts??dn,c=n?.backoffMs??un,a=!!(e.payload.screenshots?.element?.dataUrl||e.payload.screenshots?.fullPage?.dataUrl),f=!!e.payload.video?.blob,s=a||f,{lean:d,extracted:l,extractedVideo:p}=s?wn(e.payload):{lean:e.payload,extracted:{},extractedVideo:{}},m=mn();m&&(d.viewer_token=m);let u={...l,...e.screenshotDataUrls};for(let g=1;g<=i;g+=1){let h=new AbortController,k=setTimeout(()=>h.abort(),r),v=()=>h.abort();t&&t.addEventListener("abort",v,{once:true});try{let R=await fetch(ke,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(d),signal:h.signal});if(R.ok){st=Date.now();let _;try{_=await R.json();}catch{}if(_?.viewer_token&&gn(_.viewer_token,_.my_feedback_url),(u.element||u.fullPage)&&_){let M=_.upload_urls;if(M){let U=[];u.element&&M.element&&U.push(ct(M.element,u.element,t)),u.fullPage&&M.fullPage&&U.push(ct(M.fullPage,u.fullPage,t));try{await Promise.all(U);}catch{}}else if(_.feedback_id)try{await vn({feedbackId:_.feedback_id,extracted:u,screenshots:e.payload.screenshots,...t?{signal:t}:{}});}catch{}}if(p.blob&&_){let M=_.upload_urls;if(M?.video)try{await fetch(M.video,{method:"PUT",body:p.blob,headers:{"content-type":p.blob.type},...t?{signal:t}:{}});}catch{}else if(_.feedback_id)try{await yn({feedbackId:_.feedback_id,blob:p.blob,...t?{signal:t}:{}});}catch{}}let B={ok:!0,status:R.status};return _&&(B.apiResponse=_),B}if(g<i&&hn(R.status)){let _=.85+Math.random()*.3,J=Math.round(c*2**(g-1)*_);await at(J,t);continue}let P=`HTTP ${R.status}`;try{let _=await R.json();_?.error&&(P=_.error);}catch{}return {ok:!1,status:R.status,error:w("api_failed",new Error(P))}}catch(R){if(h.signal.aborted||t?.aborted)return {ok:false,error:w("aborted",R)};if(g<i){let P=.85+Math.random()*.3,_=Math.round(c*2**(g-1)*P);await at(_,t);continue}return {ok:false,error:w("api_failed",R)}}finally{clearTimeout(k),t&&t.removeEventListener("abort",v);}}return {ok:false,error:w("api_failed",new Error("Failed"))}}async function ft(e){let{blob:t,mime:n,blocfeedId:o,signal:r}=e,i=await fetch(pn,{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 c=await i.json();return {text:c.text??"",warning:c.warning}}var En={enabled:true,sampling:1,ignoreSelectors:["[data-blocfeed-ui]","[data-blocfeed-ignore]"],rageClick:{enabled:true,threshold:3,windowMs:1e3},httpFail:{enabled:true,statusCodes:[400,401,403,422,500,502,503,504],ignoreUrls:[]},redirectLoop:{enabled:true,threshold:3,windowMs:2e3},formDataLoss:{enabled:true}};function pt(e){let t=En;return {enabled:e?.enabled??t.enabled,sampling:e?.sampling??t.sampling,ignoreSelectors:e?.ignoreSelectors??t.ignoreSelectors,rageClick:{...t.rageClick,...e?.rageClick??{}},httpFail:{...t.httpFail,...e?.httpFail??{}},redirectLoop:{...t.redirectLoop,...e?.redirectLoop??{}},formDataLoss:{...t.formDataLoss,...e?.formDataLoss??{}}}}function mt(e){let t=[];async function n(){if(t.length===0)return;let r=t.splice(0,50);try{await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-blocfeed-id":e.blocfeedId},body:JSON.stringify({events:r}),keepalive:!0});}catch{}}function o(){if(t.length===0)return;if(typeof navigator>"u"||typeof navigator.sendBeacon!="function"){n();return}let r=t.splice(0,50),i=new Blob([JSON.stringify({events:r})],{type:"application/json"}),c=`${e.endpoint}?_bfid=${encodeURIComponent(e.blocfeedId)}`;try{navigator.sendBeacon(c,i);}catch{}}return {enqueue(r){t.push(r);},flush:n,flushBeacon:o,size(){return t.length}}}var gt="bf_behavioral_session",te=null;function N(){try{let e=sessionStorage.getItem(gt);if(e)return e;let t=ht();return sessionStorage.setItem(gt,t),t}catch{return te||(te=ht(),te)}}function ht(){let e=Math.random().toString(36).slice(2,10).padEnd(8,"0");return `bf_${Date.now()}_${e}`}function bt(e,t){if(!e.rageClick.enabled)return ()=>{};let{threshold:n,windowMs:o}=e.rageClick,r=new Map;function i(c){try{let a=c.target;if(!a||!(a instanceof Element)||Sn(a,e.ignoreSelectors))return;let f=he(a,4);if(!f)return;let s=Date.now(),l=(r.get(f)??[]).filter(p=>s-p<=o);if(l.push(s),r.set(f,l),l.length>=n){let p=_n(a),m={session_id:N(),event_type:"rage_click",page_url:typeof window>"u"?"":window.location.href,selector:f,event_data:{click_count:l.length,window_ms:o,disabled:p||void 0},created_at:new Date().toISOString()};t(m),r.set(f,[]);}}catch{}}return document.addEventListener("click",i,{capture:true,passive:true}),()=>document.removeEventListener("click",i,{capture:true})}function _n(e){if(e.hasAttribute("disabled")||e.getAttribute("aria-disabled")==="true")return true;try{if(window.getComputedStyle(e).pointerEvents==="none")return !0}catch{}return false}function Sn(e,t){if(t.length===0)return false;for(let n of t)try{if(e.matches(n)||e.closest(n))return !0}catch{}return false}var vt=0,yt=null,kn=1500;function Tn(){function e(t){try{let n=t.target;if(!n)return;let o=n.closest('button[type="submit"], input[type="submit"], [data-blocfeed-submit]');if(!o)return;vt=Date.now();let r=o.closest("form");yt=r?.id?`#${r.id}`:r?"form":null;}catch{}}return document.addEventListener("click",e,{capture:true,passive:true}),()=>document.removeEventListener("click",e,{capture:true})}function Et(e,t){if(!e.httpFail.enabled)return ()=>{};let{statusCodes:n,ignoreUrls:o}=e.httpFail,r=new Set(n),i=Tn(),c=globalThis.fetch,a=async(l,p)=>{let m=typeof l=="string"?l:l instanceof URL?l.toString():l.url,u=(p?.method??l.method??"GET").toUpperCase(),g=await c.call(globalThis,l,p);try{!wt(m,o)&&r.has(g.status)&&t(d(g.status,m,u));}catch{}return g};globalThis.fetch=a;let f=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;return XMLHttpRequest.prototype.open=function(l,p,...m){return this.__bf_url=p,this.__bf_method=l.toUpperCase(),f.call(this,l,p,...m)},XMLHttpRequest.prototype.send=function(l){let p=()=>{try{let m=this.__bf_url??"",u=this.__bf_method??"GET";!wt(m,o)&&r.has(this.status)&&t(d(this.status,m,u));}catch{}};return this.__bf_handler=p,this.addEventListener("loadend",p),s.call(this,l??null)},()=>{globalThis.fetch=c,XMLHttpRequest.prototype.open=f,XMLHttpRequest.prototype.send=s,i();};function d(l,p,m){let g=Date.now()-vt<kn;return {session_id:N(),event_type:"error",page_url:typeof window>"u"?"":window.location.href,selector:null,event_data:{http_status:l,request_url:p,method:m,form_selector:g?yt:null},created_at:new Date().toISOString()}}}function wt(e,t){if(t.length===0)return false;for(let n of t)if(e.includes(n))return true;return false}var Rn=3e4;function _t(e,t){if(!e.redirectLoop.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let{threshold:n,windowMs:o}=e.redirectLoop,r=new Map,i=new Map,c=history.pushState,a=history.replaceState;function f(d){try{let l=Date.now(),p=i.get(d)??0;if(l<p)return;let u=(r.get(d)??[]).filter(g=>l-g<=o);if(u.push(l),r.set(d,u),u.length>=n){let g={session_id:N(),event_type:"thrashing",page_url:window.location.href,selector:null,event_data:{count:u.length,url:d,window_ms:o},created_at:new Date().toISOString()};t(g),i.set(d,l+Rn),r.set(d,[]);}}catch{}}function s(){let d=window.location.pathname+window.location.search;f(d);}return history.pushState=function(...d){let l=c.apply(this,d);return s(),l},history.replaceState=function(...d){let l=a.apply(this,d);return s(),l},window.addEventListener("popstate",s),()=>{history.pushState=c,history.replaceState=a,window.removeEventListener("popstate",s);}}function St(e,t){if(!e.formDataLoss.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let n=new Set,o=0;function r(s){let d=s.closest("form");return d?d.id?`#${d.id}`:"form":null}function i(s){try{let d=s.target;if(!d||!(d instanceof HTMLInputElement||d instanceof HTMLTextAreaElement||d instanceof HTMLSelectElement))return;let l=r(d);if(!l)return;n.has(l)||n.add(l),o++;}catch{}}function c(s){if(n.size===0)return;let d=Array.from(n),l={session_id:N(),event_type:"form_abandonment",page_url:window.location.href,selector:d[0]??null,event_data:{cause:s,field_count:o,forms:d},created_at:new Date().toISOString()};t(l);}function a(s){s.persisted&&c("bfcache_restore");}function f(){c("beforeunload_after_edit");}return document.addEventListener("input",i,{capture:true,passive:true}),window.addEventListener("pageshow",a),window.addEventListener("beforeunload",f),()=>{document.removeEventListener("input",i,{capture:true}),window.removeEventListener("pageshow",a),window.removeEventListener("beforeunload",f);}}var Cn=5e3,ne=class{constructor(t){this.submitter=null;this.detectorUninstallers=[];this.flushTimer=null;this.pageHideHandler=null;this.installed=false;this.opts=t,this.resolved=pt(t.config);}install(){if(this.installed||!this.resolved.enabled||!(this.opts.passiveSampler??(()=>Math.random()<this.resolved.sampling))())return;let n=this.opts.endpoint??"https://blocfeed.com/api/behavioral-events";this.submitter=this.opts.submitter??mt({endpoint:n,blocfeedId:this.opts.blocfeedId});let o=r=>{this.submitter?.enqueue(r);};this.detectorUninstallers.push(bt(this.resolved,o)),this.detectorUninstallers.push(Et(this.resolved,o)),this.detectorUninstallers.push(_t(this.resolved,o)),this.detectorUninstallers.push(St(this.resolved,o)),this.flushTimer=setInterval(()=>{this.submitter?.flush();},Cn),this.pageHideHandler=()=>{this.submitter?.flushBeacon();},typeof window<"u"&&window.addEventListener("pagehide",this.pageHideHandler),this.installed=true;}uninstall(){if(this.installed){for(let t of this.detectorUninstallers)try{t();}catch{}this.detectorUninstallers=[],this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.pageHideHandler&&typeof window<"u"&&(window.removeEventListener("pagehide",this.pageHideHandler),this.pageHideHandler=null);try{this.submitter?.flush();}catch{}this.submitter=null,this.installed=false;}}};function Te(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 oe(e){return e instanceof Element?!!e.closest("[data-blocfeed-ui]"):false}function re(e){e.stopPropagation(),e.stopImmediatePropagation?.();}function kt(e,t){if(!y())throw new Error("BlocFeed picker can only run in a browser environment.");let n=e.ignoreSelectors,o=e.isSelectable,r={};n&&n.length>0&&(r.ignoreSelectors=n),o&&(r.isSelectable=o);let i=null,c=null,a=(u,g=false)=>{if(!u){i=null,c=null,t.onHover(null);return}let h=fe(u.getBoundingClientRect()),k=`${Math.round(h.x)}:${Math.round(h.y)}:${Math.round(h.width)}:${Math.round(h.height)}`;!g&&u===i&&k===c||(i=u,c=k,t.onHover({element:u,rect:h}));},f=Te(u=>{if(oe(u.target))return;let g=document.elementFromPoint(u.clientX,u.clientY),h=be(g,r);a(h);}),s=Te(()=>{i&&a(i,true);}),d=u=>{oe(u.target)||(re(u),u.pointerType==="mouse"&&u.preventDefault());},l=u=>{oe(u.target)||(re(u),u.pointerType==="mouse"&&u.preventDefault());},p=u=>{if(oe(u.target))return;re(u),u.preventDefault();let g=document.elementFromPoint(u.clientX,u.clientY),h=be(g,r);h&&t.onSelect({element:h,descriptor:qe(h)});},m=u=>{u.key==="Escape"&&(re(u),u.preventDefault(),t.onCancel());};return window.addEventListener("pointermove",f,{capture:true,passive:true}),window.addEventListener("pointerdown",d,{capture:true}),window.addEventListener("pointerup",l,{capture:true}),window.addEventListener("click",p,{capture:true}),window.addEventListener("keydown",m,{capture:true}),window.addEventListener("scroll",s,{capture:true,passive:true}),window.addEventListener("resize",s,{passive:true}),{stop(){window.removeEventListener("pointermove",f,{capture:true}),window.removeEventListener("pointerdown",d,{capture:true}),window.removeEventListener("pointerup",l,{capture:true}),window.removeEventListener("click",p,{capture:true}),window.removeEventListener("keydown",m,{capture:true}),window.removeEventListener("scroll",s,{capture:true}),window.removeEventListener("resize",s),f.cancel(),s.cancel(),t.onHover(null);}}}async function Re(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 ut(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 An=["[data-blocfeed-ui]","[data-blocfeed-ignore]"];function xn(e){let t=[...An,...e?.ignoreSelectors??[]],n=Array.from(new Set(t));return {...e,ignoreSelectors:n}}function Tt(){return {phase:"idle"}}function Fn(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 rr(e){let t=e,n=new ne({blocfeedId:t.blocfeed_id??"",...t.behavioral!==void 0?{config:t.behavioral}:{}});n.install();let o=Tt(),r=new Set,i=new Set,c=null,a=null,f=null,s=null,d=0,l=null,p=null,m=null,u=null,g=false,h=()=>{for(let b of r)b(o);},k=b=>{for(let E of i)E(b);},v=b=>{o=b,h();},R=()=>{d+=1,s?.abort(),s=null;},P=()=>{c?.stop(),c=null,k(null),f!==null&&y()&&(document.documentElement.style.cursor=f,f=null);},_=()=>{if(m){try{URL.revokeObjectURL(m.blobUrl);}catch{}m=null;}},J=()=>{p&&(p.abort(),p=null),_();},B=null,M=()=>{u&&(u.abort(),u=null),B&&(B.abort(),B=null);},U=()=>{R(),P(),J(),M(),a=null,v(Tt());},Le=()=>{if(!y())return;P(),a=null;let b=xn(t.picker);f=document.documentElement.style.cursor,document.documentElement.style.cursor="crosshair",v({phase:"picking"}),c=kt(b,{onHover:k,onSelect:({element:E,descriptor:x})=>{a=E,P(),v({phase:"review",selection:x});},onCancel:()=>{U();}});},Be=()=>{let b=Ge();if(b.length!==0)for(let E of b)Re({payload:E,...t.transport?{transport:t.transport}:{}}).catch(()=>{Ee(E);});};if(y()){setTimeout(Be,1e3);let b=()=>Be();window.addEventListener("online",b),l=()=>window.removeEventListener("online",b);}return {getState:()=>o,getConfig:()=>t,subscribe(b){return r.add(b),()=>r.delete(b)},subscribeHover(b){return i.add(b),()=>i.delete(b)},start(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||o.phase!=="picking"&&Le();},stop(){U();},clearSelection(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||Le();},setConfig(b){t=b;},async submit(b,E){if(!y()){let T=w("configuration",new Error("BlocFeed submit can only run in the browser"));return v({phase:"error",lastError:T}),{ok:false}}let x=t.blocfeed_id?.trim?.()??"";if(!x){let L={phase:"error",lastError:w("configuration",new Error("Missing blocfeed_id. Create a project in BlocFeed and pass its blocfeed_id."))};return o.selection&&(L.selection=o.selection),v(L),{ok:false}}if(g)return {ok:false};if(o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording")return {ok:false};g=true;let A=d+1;d=A,s?.abort(),s=new AbortController;let C=s.signal,S=o.selection,I=E?.capture?{...t.capture,...E.capture}:t.capture,H=!!(I?.element||I?.fullPage),z={phase:H?"capturing":"submitting"};S&&(z.selection=S),v(z);try{let T=H?await We({selectionElement:a,capture:I,signal:C}):void 0;if(C.aborted||d!==A)return {ok:!1};let L={phase:"submitting"};S&&(L.selection=S),T&&(L.capture=T),v(L);let D={};S&&(D.selection=S),T&&(D.capture=T);let j=await Ze({config:t.metadata,context:D,...t.user?{user:t.user}:{}}),q={version:1,createdAt:new Date().toISOString(),blocfeed_id:x,message:b,metadata:j};E?.category&&(q.category=E.category),t.user&&(q.user=t.user),S&&(q.selection=S),T&&(q.screenshots=T),m&&(q.video=m);let{result:O}=await Re({payload:q,signal:C,...t.transport?{transport:t.transport}:{}});if(C.aborted||d!==A)return O;if(O.ok){_(),a=null;let ue={phase:"success",lastSubmit:O};return S&&(ue.selection=S),T&&(ue.capture=T),v(ue),O}Fn(O)&&Ee(q);let xt=O.api?.error??w("unknown",new Error("Submission failed")),de={phase:"error",lastSubmit:O,lastError:xt};return S&&(de.selection=S),T&&(de.capture=T),v(de),O}catch(T){if(C.aborted||d!==A)return {ok:false};let D={phase:"error",lastError:C.aborted?w("aborted",T):w("unknown",T)};return S&&(D.selection=S),v(D),{ok:false}}finally{g=false,d===A&&(s=null);}},async startRecording(){if(o.phase!=="review"||!t.recording?.enabled||u||p)return;let b=o.selection,E={phase:"recording",recordingElapsedMs:0};b&&(E.selection=b),v(E);try{let x={config:t.recording};s&&(x.signal=s.signal);let A=await _e(x);p=A,A.onTick(I=>{if(o.phase==="recording"){let H={phase:"recording",recordingElapsedMs:I};b&&(H.selection=b),v(H);}});let C=await A.result;p=null,m=C;let S={phase:"review",video:C};b&&(S.selection=b),v(S);}catch(x){p=null;let C={phase:"review",lastError:x?.kind?x:w("recording_failed",x)};b&&(C.selection=b),v(C);}},stopRecording(){o.phase!=="recording"||!p||p.stop();},removeVideo(){_();let b=o.selection,E={phase:"review"};b&&(E.selection=b),v(E);},async startVoice(){if(o.phase!=="review"){console.warn("[BlocFeed] startVoice: ignored \u2014 phase is",o.phase,'(expected "review")');return}let b=t.voice;if(!b?.enabled){console.warn("[BlocFeed] startVoice: ignored \u2014 voice is not enabled in config");return}if(p){console.warn("[BlocFeed] startVoice: ignored \u2014 a screen recording is already in progress");return}M();let E=o.selection,x={phase:"review",voiceRecording:true,voiceElapsedMs:0};E&&(x.selection=E),m&&(x.video=m),v(x);try{let A={config:b};s&&(A.signal=s.signal);let C=await Se(A);u=C,C.onTick(D=>{let j={phase:"review",voiceRecording:!0,voiceElapsedMs:D};E&&(j.selection=E),m&&(j.video=m),v(j);});let S=await C.result;u=null;let I={phase:"review",voiceRecording:!1,voiceTranscribing:!0};E&&(I.selection=E),m&&(I.video=m),v(I),B=new AbortController;let H={blob:S.blob,mime:S.mime,blocfeedId:t.blocfeed_id,signal:B.signal},{text:Ie,warning:z}=await ft(H);B=null;let T={phase:"review",voiceRecording:!1,voiceTranscribing:!1};E&&(T.selection=E),m&&(T.video=m),v(T);let L={text:Ie};return z&&(L.warning=z),L}catch(A){M();let C=A?.kind?A:w("recording_failed",A);console.warn("[BlocFeed] Voice error:",C.message);let S={phase:"review",voiceRecording:false,voiceTranscribing:false,lastError:C};E&&(S.selection=E),m&&(S.video=m),v(S);return}},stopVoice(){u&&u.stop();},__unsafeGetSelectedElement(){return a},destroy(){n.uninstall(),U(),r.clear(),i.clear(),l?.(),l=null;}}}var G=[],Y=[],Rt=20,Ct=15,ie=[],At=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)}:{},se=typeof globalThis<"u"&&typeof globalThis.fetch=="function"?globalThis.fetch:void 0,ae=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.open:void 0,ce=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.send:void 0,Ae=new Set,xe=false,Fe=false,le=false,Pn=["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 Mn(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 Ln(e,t){let n=t.map(Mn).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)),G.push(r);G.length>Rt;)G.shift();}function Ce(e){let t=e.url.toLowerCase();for(let n of ie)if(t.includes(n))return;for(Y.push(e);Y.length>Ct;)Y.shift();}function ar(e={}){if(le||!y())return;le=true,Rt=e.consoleLimit??20,Ct=e.networkLimit??15;let t=e.ignoreUrls;if(t!==void 0?ie=t.map(n=>n.toLowerCase()):ie=[...Pn],e.console!==false){let n=e.consoleLevels??["error","warn"];for(let o of n){let r=At[o];r&&(Ae.add(o),console[o]=(...i)=>{Ln(o,i),r.apply(console,i);});}}if(e.network!==false&&se){let n=se;xe=true,window.fetch=async function(r,i){let c=typeof r=="string"?r:r instanceof URL?r.toString():r.url,a=(i?.method??"GET").toUpperCase(),f=Date.now();try{let s=await n.call(window,r,i);return s.ok||Ce({url:c.slice(0,500),method:a,status:s.status,statusText:s.statusText,timestamp:f,durationMs:Date.now()-f}),s}catch(s){throw Ce({url:c.slice(0,500),method:a,status:0,statusText:s instanceof Error?s.message:"Network error",timestamp:f,durationMs:Date.now()-f}),s}};}if(e.network!==false&&ae&&ce){let n=ae,o=ce;Fe=true,XMLHttpRequest.prototype.open=function(r,i,...c){return this.__bf_method=r.toUpperCase(),this.__bf_url=String(i),n.apply(this,[r,i,...c])},XMLHttpRequest.prototype.send=function(...r){let i=this.__bf_method||"GET",c=this.__bf_url||"",a=Date.now();return this.addEventListener("loadend",function(){if(this.status>=400||this.status===0){let f={url:c.slice(0,500),method:i,status:this.status,timestamp:a,durationMs:Date.now()-a};this.statusText&&(f.statusText=this.statusText),Ce(f);}},{once:true}),o.apply(this,r)};}}function cr(){if(le){for(let e of Ae){let t=At[e];t&&(console[e]=t);}Ae.clear(),xe&&se&&(window.fetch=se,xe=false),Fe&&ae&&ce&&(XMLHttpRequest.prototype.open=ae,XMLHttpRequest.prototype.send=ce,Fe=false),ie=[],le=false;}}function lr(){return {consoleLogs:[...G],networkErrors:[...Y]}}function dr(){G=[],Y=[];}var Bn=[{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}/}],X=[],Me=0,Pe=false;function In(e){let t=e.slice(0,80);return t.length<=6?"***":t.slice(0,6)+"***"}function Dn(e,t,n,o){if(X.some(c=>c.rule===e&&c.source===t))return;let i={rule:e,source:t,hint:In(n),timestamp:Date.now()};o&&(i.location=o),X.push(i);}function Q(e,t,n,o){for(let{name:r,pattern:i}of n){let c=i.exec(e);c&&Dn(r,t,c[0],o);}}function On(e){try{let t=window;if(t.__NEXT_DATA__){let n=JSON.stringify(t.__NEXT_DATA__);Q(n,"hydration",e,"__NEXT_DATA__");}if(t.__NUXT__){let n=JSON.stringify(t.__NUXT__);Q(n,"hydration",e,"__NUXT__");}}catch{}}function Nn(e){try{document.querySelectorAll("script:not([src])").forEach((n,o)=>{let r=n.textContent;r&&r.length>0&&Q(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&&Q(o,"meta",e,r?`meta[${r}]`:void 0);});}catch{}}function Hn(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&&Q(i.value,"dom",e,`${n.tagName.toLowerCase()}[${i.name}]`);}});}catch{}}function pr(e={}){if(Pe||!y()||(Pe=true,e.secretScan===false))return;let t=[...Bn,...e.customPatterns??[]],n=e.scanTargets??["hydration","scripts","meta","dom"];setTimeout(()=>{Me=Date.now(),n.includes("hydration")&&On(t),n.includes("scripts")&&Nn(t),n.includes("meta")&&Un(t),n.includes("dom")&&Hn(t);let o=e.notify??"both";X.length>0&&(o==="console"||o==="both")&&console.warn(`[BlocFeed Security] Found ${X.length} potential secret(s) exposed in client code:`,X.map(r=>`${r.rule} (${r.source}${r.location?`: ${r.location}`:""})`));},100);}function mr(){return {findings:[...X],scannedAt:Me}}function gr(){X=[],Me=0,Pe=false;}
|
|
2
|
+
exports.A=gr;exports.a=y;exports.b=fe;exports.c=$e;exports.d=We;exports.e=Ze;exports.f=Ee;exports.g=Ge;exports.h=Jn;exports.i=eo;exports.j=Gt;exports.k=Yt;exports.l=on;exports.m=_e;exports.n=cn;exports.o=Se;exports.p=mn;exports.q=wo;exports.r=ft;exports.s=ne;exports.t=rr;exports.u=ar;exports.v=cr;exports.w=lr;exports.x=dr;exports.y=pr;exports.z=mr;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function y(){return typeof window<"u"&&typeof document<"u"}function De(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 fe(e){return {x:e.x,y:e.y,width:e.width,height:e.height}}function Ft(e){return {x:e.x+window.scrollX,y:e.y+window.scrollY,width:e.width,height:e.height}}function Pt(e){return e.replace(/\s+/g," ").trim()}function pe(e,t=140){let n=e.textContent;if(!n)return;let o=Pt(n);if(o)return o.length<=t?o:`${o.slice(0,t-1)}\u2026`}function Mt(e){let t=1;for(let n=e.previousElementSibling;n;n=n.previousElementSibling)n.tagName===e.tagName&&(t+=1);return t}var He=["data-testid","data-test-id","data-test","data-qa","data-cy"],Oe="data-blocfeed-component";function me(e){let t=e.closest(`[${Oe}]`);if(!t)return;let o=t.getAttribute(Oe)?.trim();return o||void 0}function Lt(e){for(let t of He){let n=e.closest(`[${t}]`);if(!n)continue;let r=n.getAttribute(t)?.trim();if(r)return r}}function Ne(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 K(e){if(e){for(let t of e)if(typeof t.name=="string"&&t.name&&!V(t.name))return t.name}}function F(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 F(r)}}}function ge(e){let t=Ne(e);if(!t)return;let n=K(t._debugInfo);if(n)return n;let o=t._debugOwner!==void 0;if(o){let f=t._debugOwner;for(let s=0;f&&s<50;s+=1){let d=K(f._debugInfo);if(d)return d;let l=F(f.type)??F(f.elementType);if(l&&!V(l))return l;f=f._debugOwner;}}if(t._owner!==void 0&&t._owner!==t._debugOwner){let f=t._owner;for(let s=0;f&&s<50;s+=1){let d=K(f._debugInfo);if(d)return d;let l=F(f.type)??F(f.elementType);if(l&&!V(l))return l;f=f._owner;}}let i=t,c=o?80:25;for(let f=0;i&&f<c;f+=1){let s=K(i._debugInfo);if(s)return s;let d=F(i.type)??F(i.elementType);if(d&&!V(d))return d;i=i.return;}let a=e.parentElement;for(let f=0;a&&f<15;f+=1){let s=Ne(a);if(s){let d=K(s._debugInfo);if(d)return d;let l=F(s.type)??F(s.elementType);if(l&&!V(l))return l;if(s._debugOwner){let p=F(s._debugOwner.type)??F(s._debugOwner.elementType);if(p&&!V(p))return p}if(s._owner&&s._owner!==s._debugOwner){let p=F(s._owner.type)??F(s._owner.elementType);if(p&&!V(p))return p}}a=a.parentElement;}}function Bt(e){let t=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n)return `#${De(n)}`;for(let o of He){let r=e.getAttribute(o);if(r)return `${t}[${o}="${De(r)}"]`}return `${t}:nth-of-type(${Mt(e)})`}function he(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 Ue(e,t){if(!t||t.length===0)return false;for(let n of t)if(e.closest(n))return true;return false}function be(e,t){if(!e||Ue(e,t.ignoreSelectors))return null;let n=e;for(;n;){if(Ue(n,t.ignoreSelectors))return null;if(t.isSelectable?t.isSelectable(n):It(n))return n;n=n.parentElement;}return null}function It(e){let t=e.tagName;return !(t==="HTML"||t==="BODY")}function qe(e){let t=e.getBoundingClientRect(),n={selector:he(e),tagName:e.tagName.toLowerCase(),rect:fe(t),pageRect:Ft(t)},o=e.getAttribute("id");o&&(n.id=o);let r=e.className;typeof r=="string"&&r.trim()&&(n.className=r);let i=pe(e);i&&(n.textSnippet=i);let c=me(e)??ge(e);c&&(n.componentName=c);let a=Lt(e);return a&&(n.testId=a),n}var we=null;async function Ve(){return we||(we=import('html-to-image')),we}async function Dt(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 Xe(e,t){let{width:n,height:o}=await Dt(e);return {dataUrl:e,mime:t,width:n,height:o}}function $(e){if(e?.aborted)throw new Error("Aborted")}function $e(){return {async captureElement(e,t){if(!y())throw new Error("captureElement can only run in the browser");$(t.signal);let n=await Ve();$(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 $(t.signal),await Xe(o,t.mime)},async captureFullPage(e){if(!y())throw new Error("captureFullPage can only run in the browser");$(e.signal);let t=document.documentElement,n=Math.max(t.scrollWidth,t.clientWidth),o=Math.max(t.scrollHeight,t.clientHeight),r=Math.min(1,e.maxDimension/Math.max(n,o)),i=Math.max(1,Math.round(n*r)),c=Math.max(1,Math.round(o*r)),a=await Ve();$(e.signal);let f=e.mime==="image/jpeg"?await a.toJpeg(t,{width:i,height:c,quality:e.quality??.92,pixelRatio:e.pixelRatio}):await a.toPng(t,{width:i,height:c,pixelRatio:e.pixelRatio});return $(e.signal),await Xe(f,e.mime)}}}function Ot(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:Ot(t)};return n&&(o.detail=n),o}var Nt=12e3,Ut=2048,Ht=.92;function ze(){return Date.now()}function qt(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 je(e,t,n){let o=new Promise((i,c)=>{let a=setTimeout(()=>c(new Error("Timeout")),t);typeof a.unref=="function"&&a.unref();}),r=[e,o];return n&&r.push(qt(n)),await Promise.race(r)}function Vt(e){if(!y())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 Ke(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 We(e){let{selectionElement:t,capture:n,signal:o}=e;if(!y()||!Xt(n))return;let r=ze(),i=[],c=n?.timeoutMs??Nt,a=n?.maxDimension??Ut,f=n?.mime??"image/png",s=n?.quality??Ht,d=n?.adapter??$e(),l={},p=Vt(n);if(n?.element&&t)try{let g=t.getBoundingClientRect(),h=Math.min(1,a/Math.max(g.width,g.height)),k=Math.min(p,p*h),v=await je(Promise.resolve(d.captureElement(t,{...Ke({mime:f,quality:s,pixelRatio:k,maxDimension:a,includeQuality:f==="image/jpeg",...o?{signal:o}:{}})})),c,o);l.element=v;}catch(g){if(o?.aborted)throw g;i.push(w("capture_failed",g,{target:"element"}));}if(n?.fullPage)try{let g=await je(Promise.resolve(d.captureFullPage(Ke({mime:f,quality:s,pixelRatio:p,maxDimension:a,includeQuality:f==="image/jpeg",...o?{signal:o}:{}}))),c,o);l.fullPage=g;}catch(g){if(o?.aborted)throw g;i.push(w("capture_failed",g,{target:"fullPage"}));}let m=ze(),u={startedAt:r,finishedAt:m,durationMs:Math.max(0,m-r)};return i.length>0&&(u.errors=i),{...l,diagnostics:u}}function $t(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function zt(){return y()?{url:window.location.href,title:document.title,referrer:document.referrer||void 0,userAgent:navigator.userAgent,language:navigator.language,platform:navigator.platform,viewport:{width:window.innerWidth,height:window.innerHeight},screen:{width:window.screen.width,height:window.screen.height},scroll:{x:window.scrollX,y:window.scrollY},devicePixelRatio:window.devicePixelRatio||1,timezone:$t()}:{}}function jt(e){if(!e)return {};let t={};return e.id&&(t.userId=e.id),e.email&&(t.userEmail=e.email),e.name&&(t.userName=e.name),t}async function Ze(e){let{config:t,context:n,user:o}=e;if(t?.enabled===false)return {};let r={...zt(),...jt(o)},i=t?.enrich;if(!i)return r;try{let c=await i(n);return {...r,...c}}catch(c){let a=w("unknown",c);return {...r,blocfeedMetadataError:a.message}}}var W="blocfeed-queue",Kt=50;function ve(){if(!y())return [];try{let e=localStorage.getItem(W);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(W);}catch{}return []}catch(e){console.warn("[BlocFeed] offline queue could not be read \u2014 resetting",e);try{localStorage.removeItem(W);}catch{}return []}}function ye(e){if(y())try{e.length===0?localStorage.removeItem(W):localStorage.setItem(W,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 Wt(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 Ee(e){let t=ve(),n=Wt(e);for(n.metadata={...n.metadata,_queued:true},t.push({payload:n,timestamp:Date.now()});t.length>Kt;)t.shift();ye(t);}function Ge(){let e=ve();return e.length===0?[]:(ye([]),e.map(t=>t.payload))}function Jn(){ye([]);}function eo(){return ve().length}var Zt=200,Z=[],Ye=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()-Ye,path:window.location.pathname,tagName:t.tagName.toLowerCase()},o=pe(t,100);o&&(n.textSnippet=o);let r=me(t)??ge(t);r&&(n.componentName=r),Z.length<Zt&&Z.push(n);}var Je={capture:true,passive:true};function et(){ee||!y()||(ee=true,Z=[],Ye=Date.now(),document.addEventListener("click",Qe,Je));}function tt(){ee&&(ee=false,document.removeEventListener("click",Qe,Je));}function Gt(){return [...Z]}function Yt(){Z=[];}var Qt=3e4,Jt=25e5,nt="video/webm",en=250,tn=1e3,nn=["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];function ot(){if(typeof MediaRecorder>"u")return null;for(let e of nn)if(MediaRecorder.isTypeSupported(e))return e;return null}function on(){return !y()||typeof navigator?.mediaDevices?.getDisplayMedia!="function"?false:ot()!==null}async function _e(e){let{config:t,signal:n}=e;if(!y()||typeof navigator?.mediaDevices?.getDisplayMedia!="function")throw w("recording_failed",new Error("Screen recording is not supported in this browser"));let o=ot();if(!o)throw w("recording_failed",new Error("No supported video codec found (WebM required)"));if(n?.aborted)throw w("aborted",new Error("Recording aborted before start"));let r;try{r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1});}catch(h){let k=h instanceof DOMException&&h.name==="NotAllowedError"?"Screen share permission denied":"Failed to start screen share";throw w("recording_failed",new Error(k))}if(n?.aborted)throw r.getTracks().forEach(h=>h.stop()),w("aborted",new Error("Recording aborted after permission"));let i=t?.maxDurationMs??Qt,c=t?.videoBitsPerSecond??Jt,a=new MediaRecorder(r,{mimeType:o,videoBitsPerSecond:c}),f=[],s=[],d=0,l=null,p=null,m=false,u=()=>{tt(),l!==null&&(clearInterval(l),l=null),p!==null&&(clearTimeout(p),p=null),r.getTracks().forEach(h=>h.stop());},g=new Promise((h,k)=>{a.ondataavailable=R=>{R.data.size>0&&f.push(R.data);},a.onstop=()=>{if(m)return;m=true,u();let R=Date.now()-d,P=new Blob(f,{type:nt}),_=URL.createObjectURL(P);h({mime:nt,blobUrl:_,blob:P,durationMs:R,sizeBytes:P.size});},a.onerror=()=>{m||(m=true,u(),k(w("recording_failed",new Error("MediaRecorder error"))));};let v=r.getVideoTracks()[0];if(v&&v.addEventListener("ended",()=>{a.state!=="inactive"&&a.stop();}),n){let R=()=>{m||(m=true,a.state!=="inactive"&&a.stop(),u(),k(w("aborted",new Error("Recording aborted"))));};n.addEventListener("abort",R,{once:true});}});return a.start(tn),et(),d=Date.now(),l=setInterval(()=>{let h=Date.now()-d;for(let k of s)k(h);},en),p=setTimeout(()=>{!m&&a.state!=="inactive"&&a.stop();},i),{result:g,stop(){!m&&a.state!=="inactive"&&a.stop();},onTick(h){s.push(h);},abort(){m||(m=true,a.state!=="inactive"&&a.stop(),u());}}}var rn=6e4,rt="audio/webm",sn=250,an=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus"];function it(){if(typeof MediaRecorder>"u")return null;for(let e of an)if(MediaRecorder.isTypeSupported(e))return e;return null}function cn(){return !y()||typeof navigator?.mediaDevices?.getUserMedia!="function"?false:it()!==null}async function Se(e){let{config:t,signal:n}=e;if(!y()||typeof navigator?.mediaDevices?.getUserMedia!="function")throw w("recording_failed",new Error("Microphone recording is not supported in this browser"));let o=it();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 h=g instanceof DOMException&&g.name==="NotAllowedError"?"Microphone permission denied":"Failed to access microphone";throw w("recording_failed",new Error(h))}if(n?.aborted)throw r.getTracks().forEach(g=>g.stop()),w("aborted",new Error("Voice recording aborted after permission"));let i=t?.maxDurationMs??rn,c=new MediaRecorder(r,{mimeType:o}),a=[],f=[],s=0,d=null,l=null,p=false,m=()=>{d!==null&&(clearInterval(d),d=null),l!==null&&(clearTimeout(l),l=null),r.getTracks().forEach(g=>g.stop());},u=new Promise((g,h)=>{if(c.ondataavailable=k=>{k.data.size>0&&a.push(k.data);},c.onstop=()=>{if(p)return;p=true,m();let k=Date.now()-s,v=new Blob(a,{type:rt});g({blob:v,mime:rt,durationMs:k});},c.onerror=()=>{p||(p=true,m(),h(w("recording_failed",new Error("MediaRecorder error"))));},n){let k=()=>{p||(p=true,c.state!=="inactive"&&c.stop(),m(),h(w("aborted",new Error("Voice recording aborted"))));};n.addEventListener("abort",k,{once:true});}});return c.start(1e3),s=Date.now(),d=setInterval(()=>{let g=Date.now()-s;for(let h of f)h(g);},sn),l=setTimeout(()=>{l=null,!p&&c.state!=="inactive"&&c.stop();},i),{result:u,stop(){!p&&c.state!=="inactive"&&c.stop();},onTick(g){f.push(g);},abort(){p||(p=true,c.state!=="inactive"&&c.stop(),m());}}}var ln=12e3,dn=2,un=500,fn=2e3,ke="https://blocfeed.com/api/feedback",pn="https://blocfeed.com/api/feedback/voice",st=0,lt="blocfeed-viewer-token",dt="blocfeed-my-feedback-url";function mn(){try{return localStorage.getItem(lt)}catch{return null}}function wo(){try{return localStorage.getItem(dt)}catch{return null}}function gn(e,t){try{localStorage.setItem(lt,e),t&&localStorage.setItem(dt,t);}catch{}}function at(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 hn(e){return e>=500&&e<=599}function bn(e){let[t,n]=e.split(",",2);if(!t||!n)throw new Error("Invalid data URL");let r=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(n),c=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)c[a]=i.charCodeAt(a);return new Blob([c],{type:r})}function wn(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 ct(e,t,n){let o=bn(t);await fetch(e,{method:"PUT",body:o,headers:{"content-type":o.type},...n?{signal:n}:{}});}async function vn(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(`${ke}/${t}/screenshots`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i),...r?{signal:r}:{}});}async function yn(e){await fetch(`${ke}/${e.feedbackId}/video`,{method:"POST",body:e.blob,headers:{"content-type":e.blob.type},...e.signal?{signal:e.signal}:{}});}async function ut(e){let{signal:t,transport:n}=e;if(Date.now()-st<fn)return {ok:false,error:w("configuration",new Error("Please wait before submitting again"))};let r=n?.timeoutMs??ln,i=n?.maxAttempts??dn,c=n?.backoffMs??un,a=!!(e.payload.screenshots?.element?.dataUrl||e.payload.screenshots?.fullPage?.dataUrl),f=!!e.payload.video?.blob,s=a||f,{lean:d,extracted:l,extractedVideo:p}=s?wn(e.payload):{lean:e.payload,extracted:{},extractedVideo:{}},m=mn();m&&(d.viewer_token=m);let u={...l,...e.screenshotDataUrls};for(let g=1;g<=i;g+=1){let h=new AbortController,k=setTimeout(()=>h.abort(),r),v=()=>h.abort();t&&t.addEventListener("abort",v,{once:true});try{let R=await fetch(ke,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(d),signal:h.signal});if(R.ok){st=Date.now();let _;try{_=await R.json();}catch{}if(_?.viewer_token&&gn(_.viewer_token,_.my_feedback_url),(u.element||u.fullPage)&&_){let M=_.upload_urls;if(M){let U=[];u.element&&M.element&&U.push(ct(M.element,u.element,t)),u.fullPage&&M.fullPage&&U.push(ct(M.fullPage,u.fullPage,t));try{await Promise.all(U);}catch{}}else if(_.feedback_id)try{await vn({feedbackId:_.feedback_id,extracted:u,screenshots:e.payload.screenshots,...t?{signal:t}:{}});}catch{}}if(p.blob&&_){let M=_.upload_urls;if(M?.video)try{await fetch(M.video,{method:"PUT",body:p.blob,headers:{"content-type":p.blob.type},...t?{signal:t}:{}});}catch{}else if(_.feedback_id)try{await yn({feedbackId:_.feedback_id,blob:p.blob,...t?{signal:t}:{}});}catch{}}let B={ok:!0,status:R.status};return _&&(B.apiResponse=_),B}if(g<i&&hn(R.status)){let _=.85+Math.random()*.3,J=Math.round(c*2**(g-1)*_);await at(J,t);continue}let P=`HTTP ${R.status}`;try{let _=await R.json();_?.error&&(P=_.error);}catch{}return {ok:!1,status:R.status,error:w("api_failed",new Error(P))}}catch(R){if(h.signal.aborted||t?.aborted)return {ok:false,error:w("aborted",R)};if(g<i){let P=.85+Math.random()*.3,_=Math.round(c*2**(g-1)*P);await at(_,t);continue}return {ok:false,error:w("api_failed",R)}}finally{clearTimeout(k),t&&t.removeEventListener("abort",v);}}return {ok:false,error:w("api_failed",new Error("Failed"))}}async function ft(e){let{blob:t,mime:n,blocfeedId:o,signal:r}=e,i=await fetch(pn,{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 c=await i.json();return {text:c.text??"",warning:c.warning}}var En={enabled:true,sampling:1,ignoreSelectors:["[data-blocfeed-ui]","[data-blocfeed-ignore]"],rageClick:{enabled:true,threshold:3,windowMs:1e3},httpFail:{enabled:true,statusCodes:[400,401,403,422,500,502,503,504],ignoreUrls:[]},redirectLoop:{enabled:true,threshold:3,windowMs:2e3},formDataLoss:{enabled:true}};function pt(e){let t=En;return {enabled:e?.enabled??t.enabled,sampling:e?.sampling??t.sampling,ignoreSelectors:e?.ignoreSelectors??t.ignoreSelectors,rageClick:{...t.rageClick,...e?.rageClick??{}},httpFail:{...t.httpFail,...e?.httpFail??{}},redirectLoop:{...t.redirectLoop,...e?.redirectLoop??{}},formDataLoss:{...t.formDataLoss,...e?.formDataLoss??{}}}}function mt(e){let t=[];async function n(){if(t.length===0)return;let r=t.splice(0,50);try{await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-blocfeed-id":e.blocfeedId},body:JSON.stringify({events:r}),keepalive:!0});}catch{}}function o(){if(t.length===0)return;if(typeof navigator>"u"||typeof navigator.sendBeacon!="function"){n();return}let r=t.splice(0,50),i=new Blob([JSON.stringify({events:r})],{type:"application/json"}),c=`${e.endpoint}?_bfid=${encodeURIComponent(e.blocfeedId)}`;try{navigator.sendBeacon(c,i);}catch{}}return {enqueue(r){t.push(r);},flush:n,flushBeacon:o,size(){return t.length}}}var gt="bf_behavioral_session",te=null;function N(){try{let e=sessionStorage.getItem(gt);if(e)return e;let t=ht();return sessionStorage.setItem(gt,t),t}catch{return te||(te=ht(),te)}}function ht(){let e=Math.random().toString(36).slice(2,10).padEnd(8,"0");return `bf_${Date.now()}_${e}`}function bt(e,t){if(!e.rageClick.enabled)return ()=>{};let{threshold:n,windowMs:o}=e.rageClick,r=new Map;function i(c){try{let a=c.target;if(!a||!(a instanceof Element)||Sn(a,e.ignoreSelectors))return;let f=he(a,4);if(!f)return;let s=Date.now(),l=(r.get(f)??[]).filter(p=>s-p<=o);if(l.push(s),r.set(f,l),l.length>=n){let p=_n(a),m={session_id:N(),event_type:"rage_click",page_url:typeof window>"u"?"":window.location.href,selector:f,event_data:{click_count:l.length,window_ms:o,disabled:p||void 0},created_at:new Date().toISOString()};t(m),r.set(f,[]);}}catch{}}return document.addEventListener("click",i,{capture:true,passive:true}),()=>document.removeEventListener("click",i,{capture:true})}function _n(e){if(e.hasAttribute("disabled")||e.getAttribute("aria-disabled")==="true")return true;try{if(window.getComputedStyle(e).pointerEvents==="none")return !0}catch{}return false}function Sn(e,t){if(t.length===0)return false;for(let n of t)try{if(e.matches(n)||e.closest(n))return !0}catch{}return false}var vt=0,yt=null,kn=1500;function Tn(){function e(t){try{let n=t.target;if(!n)return;let o=n.closest('button[type="submit"], input[type="submit"], [data-blocfeed-submit]');if(!o)return;vt=Date.now();let r=o.closest("form");yt=r?.id?`#${r.id}`:r?"form":null;}catch{}}return document.addEventListener("click",e,{capture:true,passive:true}),()=>document.removeEventListener("click",e,{capture:true})}function Et(e,t){if(!e.httpFail.enabled)return ()=>{};let{statusCodes:n,ignoreUrls:o}=e.httpFail,r=new Set(n),i=Tn(),c=globalThis.fetch,a=async(l,p)=>{let m=typeof l=="string"?l:l instanceof URL?l.toString():l.url,u=(p?.method??l.method??"GET").toUpperCase(),g=await c.call(globalThis,l,p);try{!wt(m,o)&&r.has(g.status)&&t(d(g.status,m,u));}catch{}return g};globalThis.fetch=a;let f=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;return XMLHttpRequest.prototype.open=function(l,p,...m){return this.__bf_url=p,this.__bf_method=l.toUpperCase(),f.call(this,l,p,...m)},XMLHttpRequest.prototype.send=function(l){let p=()=>{try{let m=this.__bf_url??"",u=this.__bf_method??"GET";!wt(m,o)&&r.has(this.status)&&t(d(this.status,m,u));}catch{}};return this.__bf_handler=p,this.addEventListener("loadend",p),s.call(this,l??null)},()=>{globalThis.fetch=c,XMLHttpRequest.prototype.open=f,XMLHttpRequest.prototype.send=s,i();};function d(l,p,m){let g=Date.now()-vt<kn;return {session_id:N(),event_type:"error",page_url:typeof window>"u"?"":window.location.href,selector:null,event_data:{http_status:l,request_url:p,method:m,form_selector:g?yt:null},created_at:new Date().toISOString()}}}function wt(e,t){if(t.length===0)return false;for(let n of t)if(e.includes(n))return true;return false}var Rn=3e4;function _t(e,t){if(!e.redirectLoop.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let{threshold:n,windowMs:o}=e.redirectLoop,r=new Map,i=new Map,c=history.pushState,a=history.replaceState;function f(d){try{let l=Date.now(),p=i.get(d)??0;if(l<p)return;let u=(r.get(d)??[]).filter(g=>l-g<=o);if(u.push(l),r.set(d,u),u.length>=n){let g={session_id:N(),event_type:"thrashing",page_url:window.location.href,selector:null,event_data:{count:u.length,url:d,window_ms:o},created_at:new Date().toISOString()};t(g),i.set(d,l+Rn),r.set(d,[]);}}catch{}}function s(){let d=window.location.pathname+window.location.search;f(d);}return history.pushState=function(...d){let l=c.apply(this,d);return s(),l},history.replaceState=function(...d){let l=a.apply(this,d);return s(),l},window.addEventListener("popstate",s),()=>{history.pushState=c,history.replaceState=a,window.removeEventListener("popstate",s);}}function St(e,t){if(!e.formDataLoss.enabled)return ()=>{};if(typeof window>"u")return ()=>{};let n=new Set,o=0;function r(s){let d=s.closest("form");return d?d.id?`#${d.id}`:"form":null}function i(s){try{let d=s.target;if(!d||!(d instanceof HTMLInputElement||d instanceof HTMLTextAreaElement||d instanceof HTMLSelectElement))return;let l=r(d);if(!l)return;n.has(l)||n.add(l),o++;}catch{}}function c(s){if(n.size===0)return;let d=Array.from(n),l={session_id:N(),event_type:"form_abandonment",page_url:window.location.href,selector:d[0]??null,event_data:{cause:s,field_count:o,forms:d},created_at:new Date().toISOString()};t(l);}function a(s){s.persisted&&c("bfcache_restore");}function f(){c("beforeunload_after_edit");}return document.addEventListener("input",i,{capture:true,passive:true}),window.addEventListener("pageshow",a),window.addEventListener("beforeunload",f),()=>{document.removeEventListener("input",i,{capture:true}),window.removeEventListener("pageshow",a),window.removeEventListener("beforeunload",f);}}var Cn=5e3,ne=class{constructor(t){this.submitter=null;this.detectorUninstallers=[];this.flushTimer=null;this.pageHideHandler=null;this.installed=false;this.opts=t,this.resolved=pt(t.config);}install(){if(this.installed||!this.resolved.enabled||!(this.opts.passiveSampler??(()=>Math.random()<this.resolved.sampling))())return;let n=this.opts.endpoint??"https://blocfeed.com/api/behavioral-events";this.submitter=this.opts.submitter??mt({endpoint:n,blocfeedId:this.opts.blocfeedId});let o=r=>{this.submitter?.enqueue(r);};this.detectorUninstallers.push(bt(this.resolved,o)),this.detectorUninstallers.push(Et(this.resolved,o)),this.detectorUninstallers.push(_t(this.resolved,o)),this.detectorUninstallers.push(St(this.resolved,o)),this.flushTimer=setInterval(()=>{this.submitter?.flush();},Cn),this.pageHideHandler=()=>{this.submitter?.flushBeacon();},typeof window<"u"&&window.addEventListener("pagehide",this.pageHideHandler),this.installed=true;}uninstall(){if(this.installed){for(let t of this.detectorUninstallers)try{t();}catch{}this.detectorUninstallers=[],this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.pageHideHandler&&typeof window<"u"&&(window.removeEventListener("pagehide",this.pageHideHandler),this.pageHideHandler=null);try{this.submitter?.flush();}catch{}this.submitter=null,this.installed=false;}}};function Te(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 oe(e){return e instanceof Element?!!e.closest("[data-blocfeed-ui]"):false}function re(e){e.stopPropagation(),e.stopImmediatePropagation?.();}function kt(e,t){if(!y())throw new Error("BlocFeed picker can only run in a browser environment.");let n=e.ignoreSelectors,o=e.isSelectable,r={};n&&n.length>0&&(r.ignoreSelectors=n),o&&(r.isSelectable=o);let i=null,c=null,a=(u,g=false)=>{if(!u){i=null,c=null,t.onHover(null);return}let h=fe(u.getBoundingClientRect()),k=`${Math.round(h.x)}:${Math.round(h.y)}:${Math.round(h.width)}:${Math.round(h.height)}`;!g&&u===i&&k===c||(i=u,c=k,t.onHover({element:u,rect:h}));},f=Te(u=>{if(oe(u.target))return;let g=document.elementFromPoint(u.clientX,u.clientY),h=be(g,r);a(h);}),s=Te(()=>{i&&a(i,true);}),d=u=>{oe(u.target)||(re(u),u.pointerType==="mouse"&&u.preventDefault());},l=u=>{oe(u.target)||(re(u),u.pointerType==="mouse"&&u.preventDefault());},p=u=>{if(oe(u.target))return;re(u),u.preventDefault();let g=document.elementFromPoint(u.clientX,u.clientY),h=be(g,r);h&&t.onSelect({element:h,descriptor:qe(h)});},m=u=>{u.key==="Escape"&&(re(u),u.preventDefault(),t.onCancel());};return window.addEventListener("pointermove",f,{capture:true,passive:true}),window.addEventListener("pointerdown",d,{capture:true}),window.addEventListener("pointerup",l,{capture:true}),window.addEventListener("click",p,{capture:true}),window.addEventListener("keydown",m,{capture:true}),window.addEventListener("scroll",s,{capture:true,passive:true}),window.addEventListener("resize",s,{passive:true}),{stop(){window.removeEventListener("pointermove",f,{capture:true}),window.removeEventListener("pointerdown",d,{capture:true}),window.removeEventListener("pointerup",l,{capture:true}),window.removeEventListener("click",p,{capture:true}),window.removeEventListener("keydown",m,{capture:true}),window.removeEventListener("scroll",s,{capture:true}),window.removeEventListener("resize",s),f.cancel(),s.cancel(),t.onHover(null);}}}async function Re(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 ut(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 An=["[data-blocfeed-ui]","[data-blocfeed-ignore]"];function xn(e){let t=[...An,...e?.ignoreSelectors??[]],n=Array.from(new Set(t));return {...e,ignoreSelectors:n}}function Tt(){return {phase:"idle"}}function Fn(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 rr(e){let t=e,n=new ne({blocfeedId:t.blocfeed_id??"",...t.behavioral!==void 0?{config:t.behavioral}:{}});n.install();let o=Tt(),r=new Set,i=new Set,c=null,a=null,f=null,s=null,d=0,l=null,p=null,m=null,u=null,g=false,h=()=>{for(let b of r)b(o);},k=b=>{for(let E of i)E(b);},v=b=>{o=b,h();},R=()=>{d+=1,s?.abort(),s=null;},P=()=>{c?.stop(),c=null,k(null),f!==null&&y()&&(document.documentElement.style.cursor=f,f=null);},_=()=>{if(m){try{URL.revokeObjectURL(m.blobUrl);}catch{}m=null;}},J=()=>{p&&(p.abort(),p=null),_();},B=null,M=()=>{u&&(u.abort(),u=null),B&&(B.abort(),B=null);},U=()=>{R(),P(),J(),M(),a=null,v(Tt());},Le=()=>{if(!y())return;P(),a=null;let b=xn(t.picker);f=document.documentElement.style.cursor,document.documentElement.style.cursor="crosshair",v({phase:"picking"}),c=kt(b,{onHover:k,onSelect:({element:E,descriptor:x})=>{a=E,P(),v({phase:"review",selection:x});},onCancel:()=>{U();}});},Be=()=>{let b=Ge();if(b.length!==0)for(let E of b)Re({payload:E,...t.transport?{transport:t.transport}:{}}).catch(()=>{Ee(E);});};if(y()){setTimeout(Be,1e3);let b=()=>Be();window.addEventListener("online",b),l=()=>window.removeEventListener("online",b);}return {getState:()=>o,getConfig:()=>t,subscribe(b){return r.add(b),()=>r.delete(b)},subscribeHover(b){return i.add(b),()=>i.delete(b)},start(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||o.phase!=="picking"&&Le();},stop(){U();},clearSelection(){o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording"||Le();},setConfig(b){t=b;},async submit(b,E){if(!y()){let T=w("configuration",new Error("BlocFeed submit can only run in the browser"));return v({phase:"error",lastError:T}),{ok:false}}let x=t.blocfeed_id?.trim?.()??"";if(!x){let L={phase:"error",lastError:w("configuration",new Error("Missing blocfeed_id. Create a project in BlocFeed and pass its blocfeed_id."))};return o.selection&&(L.selection=o.selection),v(L),{ok:false}}if(g)return {ok:false};if(o.phase==="capturing"||o.phase==="submitting"||o.phase==="recording")return {ok:false};g=true;let A=d+1;d=A,s?.abort(),s=new AbortController;let C=s.signal,S=o.selection,I=E?.capture?{...t.capture,...E.capture}:t.capture,H=!!(I?.element||I?.fullPage),z={phase:H?"capturing":"submitting"};S&&(z.selection=S),v(z);try{let T=H?await We({selectionElement:a,capture:I,signal:C}):void 0;if(C.aborted||d!==A)return {ok:!1};let L={phase:"submitting"};S&&(L.selection=S),T&&(L.capture=T),v(L);let D={};S&&(D.selection=S),T&&(D.capture=T);let j=await Ze({config:t.metadata,context:D,...t.user?{user:t.user}:{}}),q={version:1,createdAt:new Date().toISOString(),blocfeed_id:x,message:b,metadata:j};E?.category&&(q.category=E.category),t.user&&(q.user=t.user),S&&(q.selection=S),T&&(q.screenshots=T),m&&(q.video=m);let{result:O}=await Re({payload:q,signal:C,...t.transport?{transport:t.transport}:{}});if(C.aborted||d!==A)return O;if(O.ok){_(),a=null;let ue={phase:"success",lastSubmit:O};return S&&(ue.selection=S),T&&(ue.capture=T),v(ue),O}Fn(O)&&Ee(q);let xt=O.api?.error??w("unknown",new Error("Submission failed")),de={phase:"error",lastSubmit:O,lastError:xt};return S&&(de.selection=S),T&&(de.capture=T),v(de),O}catch(T){if(C.aborted||d!==A)return {ok:false};let D={phase:"error",lastError:C.aborted?w("aborted",T):w("unknown",T)};return S&&(D.selection=S),v(D),{ok:false}}finally{g=false,d===A&&(s=null);}},async startRecording(){if(o.phase!=="review"||!t.recording?.enabled||u||p)return;let b=o.selection,E={phase:"recording",recordingElapsedMs:0};b&&(E.selection=b),v(E);try{let x={config:t.recording};s&&(x.signal=s.signal);let A=await _e(x);p=A,A.onTick(I=>{if(o.phase==="recording"){let H={phase:"recording",recordingElapsedMs:I};b&&(H.selection=b),v(H);}});let C=await A.result;p=null,m=C;let S={phase:"review",video:C};b&&(S.selection=b),v(S);}catch(x){p=null;let C={phase:"review",lastError:x?.kind?x:w("recording_failed",x)};b&&(C.selection=b),v(C);}},stopRecording(){o.phase!=="recording"||!p||p.stop();},removeVideo(){_();let b=o.selection,E={phase:"review"};b&&(E.selection=b),v(E);},async startVoice(){if(o.phase!=="review"){console.warn("[BlocFeed] startVoice: ignored \u2014 phase is",o.phase,'(expected "review")');return}let b=t.voice;if(!b?.enabled){console.warn("[BlocFeed] startVoice: ignored \u2014 voice is not enabled in config");return}if(p){console.warn("[BlocFeed] startVoice: ignored \u2014 a screen recording is already in progress");return}M();let E=o.selection,x={phase:"review",voiceRecording:true,voiceElapsedMs:0};E&&(x.selection=E),m&&(x.video=m),v(x);try{let A={config:b};s&&(A.signal=s.signal);let C=await Se(A);u=C,C.onTick(D=>{let j={phase:"review",voiceRecording:!0,voiceElapsedMs:D};E&&(j.selection=E),m&&(j.video=m),v(j);});let S=await C.result;u=null;let I={phase:"review",voiceRecording:!1,voiceTranscribing:!0};E&&(I.selection=E),m&&(I.video=m),v(I),B=new AbortController;let H={blob:S.blob,mime:S.mime,blocfeedId:t.blocfeed_id,signal:B.signal},{text:Ie,warning:z}=await ft(H);B=null;let T={phase:"review",voiceRecording:!1,voiceTranscribing:!1};E&&(T.selection=E),m&&(T.video=m),v(T);let L={text:Ie};return z&&(L.warning=z),L}catch(A){M();let C=A?.kind?A:w("recording_failed",A);console.warn("[BlocFeed] Voice error:",C.message);let S={phase:"review",voiceRecording:false,voiceTranscribing:false,lastError:C};E&&(S.selection=E),m&&(S.video=m),v(S);return}},stopVoice(){u&&u.stop();},__unsafeGetSelectedElement(){return a},destroy(){n.uninstall(),U(),r.clear(),i.clear(),l?.(),l=null;}}}var G=[],Y=[],Rt=20,Ct=15,ie=[],At=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)}:{},se=typeof globalThis<"u"&&typeof globalThis.fetch=="function"?globalThis.fetch:void 0,ae=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.open:void 0,ce=typeof XMLHttpRequest<"u"?XMLHttpRequest.prototype.send:void 0,Ae=new Set,xe=false,Fe=false,le=false,Pn=["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 Mn(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 Ln(e,t){let n=t.map(Mn).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)),G.push(r);G.length>Rt;)G.shift();}function Ce(e){let t=e.url.toLowerCase();for(let n of ie)if(t.includes(n))return;for(Y.push(e);Y.length>Ct;)Y.shift();}function ar(e={}){if(le||!y())return;le=true,Rt=e.consoleLimit??20,Ct=e.networkLimit??15;let t=e.ignoreUrls;if(t!==void 0?ie=t.map(n=>n.toLowerCase()):ie=[...Pn],e.console!==false){let n=e.consoleLevels??["error","warn"];for(let o of n){let r=At[o];r&&(Ae.add(o),console[o]=(...i)=>{Ln(o,i),r.apply(console,i);});}}if(e.network!==false&&se){let n=se;xe=true,window.fetch=async function(r,i){let c=typeof r=="string"?r:r instanceof URL?r.toString():r.url,a=(i?.method??"GET").toUpperCase(),f=Date.now();try{let s=await n.call(window,r,i);return s.ok||Ce({url:c.slice(0,500),method:a,status:s.status,statusText:s.statusText,timestamp:f,durationMs:Date.now()-f}),s}catch(s){throw Ce({url:c.slice(0,500),method:a,status:0,statusText:s instanceof Error?s.message:"Network error",timestamp:f,durationMs:Date.now()-f}),s}};}if(e.network!==false&&ae&&ce){let n=ae,o=ce;Fe=true,XMLHttpRequest.prototype.open=function(r,i,...c){return this.__bf_method=r.toUpperCase(),this.__bf_url=String(i),n.apply(this,[r,i,...c])},XMLHttpRequest.prototype.send=function(...r){let i=this.__bf_method||"GET",c=this.__bf_url||"",a=Date.now();return this.addEventListener("loadend",function(){if(this.status>=400||this.status===0){let f={url:c.slice(0,500),method:i,status:this.status,timestamp:a,durationMs:Date.now()-a};this.statusText&&(f.statusText=this.statusText),Ce(f);}},{once:true}),o.apply(this,r)};}}function cr(){if(le){for(let e of Ae){let t=At[e];t&&(console[e]=t);}Ae.clear(),xe&&se&&(window.fetch=se,xe=false),Fe&&ae&&ce&&(XMLHttpRequest.prototype.open=ae,XMLHttpRequest.prototype.send=ce,Fe=false),ie=[],le=false;}}function lr(){return {consoleLogs:[...G],networkErrors:[...Y]}}function dr(){G=[],Y=[];}var Bn=[{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}/}],X=[],Me=0,Pe=false;function In(e){let t=e.slice(0,80);return t.length<=6?"***":t.slice(0,6)+"***"}function Dn(e,t,n,o){if(X.some(c=>c.rule===e&&c.source===t))return;let i={rule:e,source:t,hint:In(n),timestamp:Date.now()};o&&(i.location=o),X.push(i);}function Q(e,t,n,o){for(let{name:r,pattern:i}of n){let c=i.exec(e);c&&Dn(r,t,c[0],o);}}function On(e){try{let t=window;if(t.__NEXT_DATA__){let n=JSON.stringify(t.__NEXT_DATA__);Q(n,"hydration",e,"__NEXT_DATA__");}if(t.__NUXT__){let n=JSON.stringify(t.__NUXT__);Q(n,"hydration",e,"__NUXT__");}}catch{}}function Nn(e){try{document.querySelectorAll("script:not([src])").forEach((n,o)=>{let r=n.textContent;r&&r.length>0&&Q(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&&Q(o,"meta",e,r?`meta[${r}]`:void 0);});}catch{}}function Hn(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&&Q(i.value,"dom",e,`${n.tagName.toLowerCase()}[${i.name}]`);}});}catch{}}function pr(e={}){if(Pe||!y()||(Pe=true,e.secretScan===false))return;let t=[...Bn,...e.customPatterns??[]],n=e.scanTargets??["hydration","scripts","meta","dom"];setTimeout(()=>{Me=Date.now(),n.includes("hydration")&&On(t),n.includes("scripts")&&Nn(t),n.includes("meta")&&Un(t),n.includes("dom")&&Hn(t);let o=e.notify??"both";X.length>0&&(o==="console"||o==="both")&&console.warn(`[BlocFeed Security] Found ${X.length} potential secret(s) exposed in client code:`,X.map(r=>`${r.rule} (${r.source}${r.location?`: ${r.location}`:""})`));},100);}function mr(){return {findings:[...X],scannedAt:Me}}function gr(){X=[],Me=0,Pe=false;}
|
|
2
|
+
export{gr as A,y as a,fe as b,$e as c,We as d,Ze as e,Ee as f,Ge as g,Jn as h,eo as i,Gt as j,Yt as k,on as l,_e as m,cn as n,Se as o,mn as p,wo as q,ft as r,ne as s,rr as t,ar as u,cr as v,lr as w,dr as x,pr as y,mr as z};
|
|
@@ -1,3 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Behavioral tracking types. Keep this file free of runtime imports —
|
|
3
|
+
* pure type declarations only.
|
|
4
|
+
*/
|
|
5
|
+
type BehavioralEventType = "rage_click" | "error" | "thrashing" | "form_abandonment";
|
|
6
|
+
interface BehavioralEvent {
|
|
7
|
+
session_id: string;
|
|
8
|
+
event_type: BehavioralEventType;
|
|
9
|
+
page_url: string;
|
|
10
|
+
selector: string | null;
|
|
11
|
+
event_data: Record<string, unknown> | null;
|
|
12
|
+
created_at: string;
|
|
13
|
+
}
|
|
14
|
+
interface RageClickConfig {
|
|
15
|
+
enabled?: boolean;
|
|
16
|
+
threshold?: number;
|
|
17
|
+
windowMs?: number;
|
|
18
|
+
}
|
|
19
|
+
interface HttpFailConfig {
|
|
20
|
+
enabled?: boolean;
|
|
21
|
+
statusCodes?: number[];
|
|
22
|
+
ignoreUrls?: string[];
|
|
23
|
+
}
|
|
24
|
+
interface RedirectLoopConfig {
|
|
25
|
+
enabled?: boolean;
|
|
26
|
+
threshold?: number;
|
|
27
|
+
windowMs?: number;
|
|
28
|
+
}
|
|
29
|
+
interface FormDataLossConfig {
|
|
30
|
+
enabled?: boolean;
|
|
31
|
+
}
|
|
32
|
+
interface BehavioralConfig {
|
|
33
|
+
enabled?: boolean;
|
|
34
|
+
sampling?: number;
|
|
35
|
+
ignoreSelectors?: string[];
|
|
36
|
+
rageClick?: RageClickConfig;
|
|
37
|
+
httpFail?: HttpFailConfig;
|
|
38
|
+
redirectLoop?: RedirectLoopConfig;
|
|
39
|
+
formDataLoss?: FormDataLossConfig;
|
|
40
|
+
}
|
|
41
|
+
|
|
1
42
|
type MaybePromise<T> = T | Promise<T>;
|
|
2
43
|
type ScreenshotMime = "image/png" | "image/jpeg";
|
|
3
44
|
interface ImageAsset {
|
|
@@ -326,6 +367,12 @@ interface BlocFeedConfig {
|
|
|
326
367
|
/** Which feedback categories to show as pills. Default: all four. */
|
|
327
368
|
categories?: FeedbackCategory[];
|
|
328
369
|
};
|
|
370
|
+
/**
|
|
371
|
+
* Passive behavioral pattern detection (rage clicks, HTTP failures,
|
|
372
|
+
* redirect loops, form data loss). Defaults to enabled. See
|
|
373
|
+
* docs/design-docs/2026-04-22-widget-pattern-detectors-design.md.
|
|
374
|
+
*/
|
|
375
|
+
behavioral?: BehavioralConfig;
|
|
329
376
|
}
|
|
330
377
|
interface ScreenshotIntent {
|
|
331
378
|
element?: {
|
|
@@ -432,4 +479,4 @@ interface BlocFeedController {
|
|
|
432
479
|
}
|
|
433
480
|
declare function createBlocFeedController(config: BlocFeedConfig): BlocFeedController;
|
|
434
481
|
|
|
435
|
-
export { type
|
|
482
|
+
export { type TransportResult as A, type BlocFeedConfig as B, type CaptureConfig as C, type DiagnosticsConfig as D, type ElementDescriptor as E, type FeedbackCategory as F, type TriggerStyle as G, type VideoIntent as H, type ImageAsset as I, type VideoMime as J, type VoiceConfig as K, type ClickEvent as L, type MaybePromise as M, type NetworkEntry as N, type HoverListener as O, type PickerConfig as P, type StateListener as Q, type RecordingConfig as R, type SubmitResult as S, type ThemeConfig as T, createBlocFeedController as U, type VideoAsset as V, type WidgetPosition as W, type BlocFeedHandle as a, type BlocFeedState as b, type BlocFeedController as c, type BehavioralEvent as d, type BehavioralConfig as e, type BehavioralEventType as f, type BlocFeedError as g, type BlocFeedStrings as h, type BlocFeedUser as i, type CaptureDiagnostics as j, type CaptureResult as k, type ConsoleEntry as l, type FeedbackApiResponse as m, type FeedbackPayload as n, type MetadataConfig as o, type MetadataContext as p, type Rect as q, type ScreenshotAdapter as r, type ScreenshotAdapterOptions as s, type ScreenshotIntent as t, type ScreenshotMime as u, type SecurityConfig as v, type SecurityFinding as w, type SecuritySnapshot as x, type SessionPhase as y, type TransportConfig as z };
|
|
@@ -1,3 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Behavioral tracking types. Keep this file free of runtime imports —
|
|
3
|
+
* pure type declarations only.
|
|
4
|
+
*/
|
|
5
|
+
type BehavioralEventType = "rage_click" | "error" | "thrashing" | "form_abandonment";
|
|
6
|
+
interface BehavioralEvent {
|
|
7
|
+
session_id: string;
|
|
8
|
+
event_type: BehavioralEventType;
|
|
9
|
+
page_url: string;
|
|
10
|
+
selector: string | null;
|
|
11
|
+
event_data: Record<string, unknown> | null;
|
|
12
|
+
created_at: string;
|
|
13
|
+
}
|
|
14
|
+
interface RageClickConfig {
|
|
15
|
+
enabled?: boolean;
|
|
16
|
+
threshold?: number;
|
|
17
|
+
windowMs?: number;
|
|
18
|
+
}
|
|
19
|
+
interface HttpFailConfig {
|
|
20
|
+
enabled?: boolean;
|
|
21
|
+
statusCodes?: number[];
|
|
22
|
+
ignoreUrls?: string[];
|
|
23
|
+
}
|
|
24
|
+
interface RedirectLoopConfig {
|
|
25
|
+
enabled?: boolean;
|
|
26
|
+
threshold?: number;
|
|
27
|
+
windowMs?: number;
|
|
28
|
+
}
|
|
29
|
+
interface FormDataLossConfig {
|
|
30
|
+
enabled?: boolean;
|
|
31
|
+
}
|
|
32
|
+
interface BehavioralConfig {
|
|
33
|
+
enabled?: boolean;
|
|
34
|
+
sampling?: number;
|
|
35
|
+
ignoreSelectors?: string[];
|
|
36
|
+
rageClick?: RageClickConfig;
|
|
37
|
+
httpFail?: HttpFailConfig;
|
|
38
|
+
redirectLoop?: RedirectLoopConfig;
|
|
39
|
+
formDataLoss?: FormDataLossConfig;
|
|
40
|
+
}
|
|
41
|
+
|
|
1
42
|
type MaybePromise<T> = T | Promise<T>;
|
|
2
43
|
type ScreenshotMime = "image/png" | "image/jpeg";
|
|
3
44
|
interface ImageAsset {
|
|
@@ -326,6 +367,12 @@ interface BlocFeedConfig {
|
|
|
326
367
|
/** Which feedback categories to show as pills. Default: all four. */
|
|
327
368
|
categories?: FeedbackCategory[];
|
|
328
369
|
};
|
|
370
|
+
/**
|
|
371
|
+
* Passive behavioral pattern detection (rage clicks, HTTP failures,
|
|
372
|
+
* redirect loops, form data loss). Defaults to enabled. See
|
|
373
|
+
* docs/design-docs/2026-04-22-widget-pattern-detectors-design.md.
|
|
374
|
+
*/
|
|
375
|
+
behavioral?: BehavioralConfig;
|
|
329
376
|
}
|
|
330
377
|
interface ScreenshotIntent {
|
|
331
378
|
element?: {
|
|
@@ -432,4 +479,4 @@ interface BlocFeedController {
|
|
|
432
479
|
}
|
|
433
480
|
declare function createBlocFeedController(config: BlocFeedConfig): BlocFeedController;
|
|
434
481
|
|
|
435
|
-
export { type
|
|
482
|
+
export { type TransportResult as A, type BlocFeedConfig as B, type CaptureConfig as C, type DiagnosticsConfig as D, type ElementDescriptor as E, type FeedbackCategory as F, type TriggerStyle as G, type VideoIntent as H, type ImageAsset as I, type VideoMime as J, type VoiceConfig as K, type ClickEvent as L, type MaybePromise as M, type NetworkEntry as N, type HoverListener as O, type PickerConfig as P, type StateListener as Q, type RecordingConfig as R, type SubmitResult as S, type ThemeConfig as T, createBlocFeedController as U, type VideoAsset as V, type WidgetPosition as W, type BlocFeedHandle as a, type BlocFeedState as b, type BlocFeedController as c, type BehavioralEvent as d, type BehavioralConfig as e, type BehavioralEventType as f, type BlocFeedError as g, type BlocFeedStrings as h, type BlocFeedUser as i, type CaptureDiagnostics as j, type CaptureResult as k, type ConsoleEntry as l, type FeedbackApiResponse as m, type FeedbackPayload as n, type MetadataConfig as o, type MetadataContext as p, type Rect as q, type ScreenshotAdapter as r, type ScreenshotAdapterOptions as s, type ScreenshotIntent as t, type ScreenshotMime as u, type SecurityConfig as v, type SecurityFinding as w, type SecuritySnapshot as x, type SessionPhase as y, type TransportConfig as z };
|
package/dist/engine.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunkACMIGJ32_cjs=require('./chunk-ACMIGJ32.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(!chunkACMIGJ32_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(!chunkACMIGJ32_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 chunkACMIGJ32_cjs.k}});Object.defineProperty(exports,"clearDiagnostics",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.x}});Object.defineProperty(exports,"clearQueue",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.h}});Object.defineProperty(exports,"clearSecurityFindings",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.A}});Object.defineProperty(exports,"collectMetadata",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.e}});Object.defineProperty(exports,"createBlocFeedController",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.t}});Object.defineProperty(exports,"createHtmlToImageAdapter",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.c}});Object.defineProperty(exports,"dequeueAll",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.g}});Object.defineProperty(exports,"drainClickEvents",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.j}});Object.defineProperty(exports,"drainDiagnostics",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.w}});Object.defineProperty(exports,"enqueue",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.f}});Object.defineProperty(exports,"getMyFeedbackUrl",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.q}});Object.defineProperty(exports,"getQueueSize",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.i}});Object.defineProperty(exports,"getSecurityFindings",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.z}});Object.defineProperty(exports,"getViewerToken",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.p}});Object.defineProperty(exports,"installDiagnostics",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.u}});Object.defineProperty(exports,"isRecordingSupported",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.l}});Object.defineProperty(exports,"isVoiceSupported",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.n}});Object.defineProperty(exports,"runCapture",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.d}});Object.defineProperty(exports,"runSecretScan",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.y}});Object.defineProperty(exports,"startRecording",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.m}});Object.defineProperty(exports,"startVoiceRecording",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.o}});Object.defineProperty(exports,"transcribeAudio",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.r}});Object.defineProperty(exports,"uninstallDiagnostics",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.v}});exports.createModernScreenshotAdapter=U;exports.dataUrlToBlob=O;
|
package/dist/engine.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { B as BlocFeedConfig, c as BlocFeedController,
|
|
1
|
+
import { r as ScreenshotAdapter, C as CaptureConfig, k as CaptureResult, V as VideoAsset, R as RecordingConfig, L as ClickEvent, K as VoiceConfig, o as MetadataConfig, p as MetadataContext, i as BlocFeedUser, n as FeedbackPayload, x as SecuritySnapshot, v as SecurityConfig } from './controller-6fm9oK63.cjs';
|
|
2
|
+
export { B as BlocFeedConfig, c as BlocFeedController, g as BlocFeedError, a as BlocFeedHandle, b as BlocFeedState, h as BlocFeedStrings, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, F as FeedbackCategory, O as HoverListener, I as ImageAsset, N as NetworkEntry, q as Rect, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, w as SecurityFinding, y as SessionPhase, Q as StateListener, S as SubmitResult, T as ThemeConfig, z as TransportConfig, G as TriggerStyle, H as VideoIntent, J as VideoMime, W as WidgetPosition, U as createBlocFeedController } from './controller-6fm9oK63.cjs';
|
|
3
3
|
|
|
4
4
|
declare function createHtmlToImageAdapter(): ScreenshotAdapter;
|
|
5
5
|
|
package/dist/engine.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { B as BlocFeedConfig, c as BlocFeedController,
|
|
1
|
+
import { r as ScreenshotAdapter, C as CaptureConfig, k as CaptureResult, V as VideoAsset, R as RecordingConfig, L as ClickEvent, K as VoiceConfig, o as MetadataConfig, p as MetadataContext, i as BlocFeedUser, n as FeedbackPayload, x as SecuritySnapshot, v as SecurityConfig } from './controller-6fm9oK63.js';
|
|
2
|
+
export { B as BlocFeedConfig, c as BlocFeedController, g as BlocFeedError, a as BlocFeedHandle, b as BlocFeedState, h as BlocFeedStrings, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, F as FeedbackCategory, O as HoverListener, I as ImageAsset, N as NetworkEntry, q as Rect, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, w as SecurityFinding, y as SessionPhase, Q as StateListener, S as SubmitResult, T as ThemeConfig, z as TransportConfig, G as TriggerStyle, H as VideoIntent, J as VideoMime, W as WidgetPosition, U as createBlocFeedController } from './controller-6fm9oK63.js';
|
|
3
3
|
|
|
4
4
|
declare function createHtmlToImageAdapter(): ScreenshotAdapter;
|
|
5
5
|
|
package/dist/engine.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {a}from'./chunk-
|
|
1
|
+
import {a}from'./chunk-C4BWWDCF.js';export{k as clearClickEvents,x as clearDiagnostics,h as clearQueue,A as clearSecurityFindings,e as collectMetadata,t as createBlocFeedController,c as createHtmlToImageAdapter,g as dequeueAll,j as drainClickEvents,w as drainDiagnostics,f as enqueue,q as getMyFeedbackUrl,i as getQueueSize,z as getSecurityFindings,p as getViewerToken,u as installDiagnostics,l as isRecordingSupported,n as isVoiceSupported,d as runCapture,y as runSecretScan,m as startRecording,o as startVoiceRecording,r as transcribeAudio,v as uninstallDiagnostics}from'./chunk-C4BWWDCF.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
|
|
2
|
+
'use strict';var chunkACMIGJ32_cjs=require('./chunk-ACMIGJ32.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(()=>chunkACMIGJ32_cjs.t({...t.config??{},blocfeed_id:t.blocfeed_id}),[]),[i,r]=react.useState(()=>e.getState());return react.useEffect(()=>e.subscribe(r),[e]),react.useEffect(()=>e.setConfig({...t.config??{},blocfeed_id:t.blocfeed_id}),[e,t.config,t.blocfeed_id]),react.useEffect(()=>()=>e.destroy(),[e]),jsxRuntime.jsx(Y.Provider,{value:{controller:e,state:i},children:t.children})}var Re="blocfeed-styles-v1",It=`
|
|
3
3
|
:where([data-blocfeed-ui-root]),
|
|
4
4
|
:where([data-blocfeed-ui-root]) * {
|
|
5
5
|
box-sizing: border-box;
|
|
@@ -881,5 +881,5 @@
|
|
|
881
881
|
animation: none;
|
|
882
882
|
}
|
|
883
883
|
}
|
|
884
|
-
`;function Me(){if(!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=
|
|
884
|
+
`;function Me(){if(!chunkACMIGJ32_cjs.a()||document.getElementById(Re))return;let t=document.createElement("style");t.id=Re,t.textContent=It,document.head.appendChild(t);}var Le={triggerLabel:"Feedback",panelTitle:"Feedback",hintText:"Click an element to attach your feedback. Press Esc to cancel.",cancelButton:"Cancel",rePickButton:"Re-pick",closeButton:"Close",textareaPlaceholder:"What's happening? What did you expect?",screenshotElement:"Screenshot element",screenshotFullPage:"Full page",capturingText:"Capturing screenshots\u2026",submittingText:"Submitting\u2026",successText:"Sent. Thank you!",toastText:"Feedback sent",sendButton:"Send",categoryBug:"Bug",categoryFeature:"Feature",categoryUx:"UX",categoryGeneral:"General",recordButton:"Record",stopRecordButton:"Stop",recordingText:"Recording\u2026",recordingDeniedText:"Screen share was denied",videoPreviewLabel:"Video attached",removeVideoButton:"Remove",voiceButton:"Voice",voiceStopButton:"Stop",voiceRecordingText:"Recording\u2026",voiceTranscribingText:"Transcribing\u2026",voiceDeniedText:"Microphone access was denied",voiceErrorText:"Voice transcription failed. Please type instead.",voiceEmptyText:"No speech detected. Try again or type instead."};function ze(t){return t?{...Le,...t}:Le}function ae(){let t=react.useContext(Y);if(!t)throw new Error("useBlocFeed must be used within a <BlocFeedProvider />");return {state:t.state,controller:t.controller,start:t.controller.start,stop:t.controller.stop,clearSelection:t.controller.clearSelection,submit:t.controller.submit,startRecording:t.controller.startRecording,stopRecording:t.controller.stopRecording,removeVideo:t.controller.removeVideo}}function y(t){switch(t){case "bottom-left":return "bf-trigger bf-trigger-bl";case "top-right":return "bf-trigger bf-trigger-tr";case "top-left":return "bf-trigger bf-trigger-tl";default:return "bf-trigger"}}function g({size:t=14}){return jsxRuntime.jsx("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:jsxRuntime.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ie({size:t=14}){return jsxRuntime.jsx("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:jsxRuntime.jsx("path",{d:"M21 11.5a8.38 8.38 0 01-.9 3.8 8.5 8.5 0 01-7.6 4.7 8.38 8.38 0 01-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 01-.9-3.8 8.5 8.5 0 014.7-7.6 8.38 8.38 0 013.8-.9h.5a8.48 8.48 0 018 8v.5z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ae({size:t=16}){return jsxRuntime.jsxs("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[jsxRuntime.jsx("path",{d:"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),jsxRuntime.jsx("path",{d:"M22 6l-10 7L2 6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}function _e({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){return i?jsxRuntime.jsxs("button",{className:y(t),type:"button",onClick:e,"aria-label":r,children:[p?jsxRuntime.jsx("span",{style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"bf-dot","aria-hidden":"true"}),r]}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]}):null}function h(){let[t,e]=react.useState(()=>typeof window>"u"?false:window.matchMedia("(prefers-reduced-motion: reduce)").matches);return react.useEffect(()=>{let i=window.matchMedia("(prefers-reduced-motion: reduce)"),r=a=>e(a.matches);return i.addEventListener("change",r),()=>i.removeEventListener("change",r)},[]),t}var Vt={duration:.18,ease:"easeOut"},$t={duration:0};function Oe({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?$t:Vt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.92},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(framerMotion.motion.span,{className:"bf-dot","aria-hidden":"true",animate:o?{}:{scale:n?1:[1,1.2,1],boxShadow:n?"0 0 0 4px rgba(99, 102, 241, 0.18)":["0 0 0 4px rgba(99, 102, 241, 0.18)","0 0 0 8px rgba(99, 102, 241, 0.28)","0 0 0 4px rgba(99, 102, 241, 0.18)"]},transition:n||o?c:{duration:2,repeat:1/0,ease:"easeInOut"}}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-6},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-6},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"dot")})}var Yt={duration:.18,ease:"easeOut"},Ve={duration:0};function Ke({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?Ve:Yt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsxs(framerMotion.motion.div,{className:y(t),initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{y:8,opacity:0},transition:c,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),style:{background:"transparent",border:"none",boxShadow:"none",padding:0},children:[jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.div,{initial:{opacity:0,y:o?0:4},animate:{opacity:1,y:0},exit:{opacity:0,y:o?0:4},transition:c,style:{position:"absolute",bottom:"calc(100% + 8px)",left:"50%",transform:"translateX(-50%)",padding:"6px 12px",borderRadius:"8px",background:"var(--bf-panel-bg)",border:"1px solid var(--bf-border)",boxShadow:"var(--bf-shadow)",whiteSpace:"nowrap",fontSize:"12px",color:"var(--bf-panel-fg)",pointerEvents:"none"},children:r},"tooltip")}),jsxRuntime.jsxs(framerMotion.motion.button,{type:"button",onClick:e,"aria-label":r,style:{position:"relative",display:"flex",alignItems:"center",justifyContent:"center",width:"40px",height:"40px",borderRadius:"50%",border:"1px solid var(--bf-border)",background:"var(--bf-panel-bg)",color:"var(--bf-panel-fg)",boxShadow:"var(--bf-shadow)",cursor:"pointer",padding:0},animate:o?{}:{y:[0,-3,0]},transition:o?Ve:{y:{duration:3,repeat:1/0,ease:"easeInOut"}},whileHover:{scale:1.1,borderColor:"var(--bf-accent)"},whileTap:{scale:.9},children:[p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:16})},"success"):jsxRuntime.jsx(Ie,{size:16}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge bf-badge-float","aria-label":`${a} queued`,children:a})]})]},"bubble")})}var Qt={duration:.2,ease:"easeOut"},qt={duration:0};function Xe(t){return t==="bottom-left"||t==="top-left"}function Jt(t){return `bf-trigger-edge ${Xe(t)?"bf-trigger-edge-left":"bf-trigger-edge-right"}`}function Ye({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=Xe(t),c=h(),x=c?qt:Qt;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:Jt(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{opacity:0,width:0},animate:{opacity:1,width:n?140:22,height:n?40:90},exit:{width:0,opacity:0},transition:x,whileTap:{scale:.97},style:{top:"50%",translateY:"-50%"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:x,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs(framerMotion.motion.span,{animate:{rotate:c||n?0:o?-90:90,opacity:n?1:.6},transition:x,style:{display:"flex",alignItems:"center",gap:"8px",whiteSpace:"nowrap",fontSize:"12px",letterSpacing:"0.5px",textTransform:"uppercase"},children:[n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:{duration:.12},style:{width:"6px",height:"6px",borderRadius:"50%",background:"var(--bf-accent)",flexShrink:0}}),r]}),jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",animate:{opacity:n?1:0},transition:{duration:.12},style:{position:"absolute",top:0,bottom:0,[o?"left":"right"]:0,width:"2px",background:"var(--bf-accent)"}}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"edge-tab")})}var to={duration:.18,ease:"easeOut"},oo={duration:0};function je({delay:t,hovered:e,reduced:i}){return i?null:jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{position:"absolute",width:"10px",height:"10px",borderRadius:"50%",border:"2px solid var(--bf-accent)",pointerEvents:"none"},animate:e?{scale:1,opacity:0}:{scale:[1,1.8],opacity:[.5,0]},transition:e?{duration:.15}:{duration:2,repeat:1/0,delay:t,ease:"easeOut"}})}function qe({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?oo:to;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.92},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{style:{position:"relative",display:"flex",alignItems:"center",justifyContent:"center",width:"10px",height:"10px",flexShrink:0},children:[jsxRuntime.jsx(je,{delay:0,hovered:n,reduced:o}),jsxRuntime.jsx(je,{delay:.7,hovered:n,reduced:o}),jsxRuntime.jsx(framerMotion.motion.span,{className:"bf-dot","aria-hidden":"true",style:{position:"relative",zIndex:1}})]}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-6},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-6},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"pulse-ring")})}var no={duration:.18,ease:"easeOut"},so={duration:0};function co(t){switch(t){case "bottom-left":return "bf-trigger-minimal bf-trigger-bl";case "top-right":return "bf-trigger-minimal bf-trigger-tr";case "top-left":return "bf-trigger-minimal bf-trigger-tl";default:return "bf-trigger-minimal"}}function et({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?so:no;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsxs(framerMotion.motion.button,{className:co(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{opacity:0,y:o?0:5},animate:{opacity:n?1:.65,y:0},exit:{opacity:0,y:o?0:5},transition:c,whileTap:{scale:.95},children:[p?jsxRuntime.jsx("span",{style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{children:r}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge",style:{marginLeft:"4px"},"aria-label":`${a} queued`,children:a})]}),!o&&jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{position:"absolute",bottom:4,left:4,right:4,height:"2px",background:"var(--bf-accent)",borderRadius:"1px",transformOrigin:"left"},initial:false,animate:{scaleX:n?1:0},transition:c})]},"minimal")})}var po={duration:.18,ease:"easeOut"},uo={duration:0};function ot({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?uo:po;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.9},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(framerMotion.motion.span,{style:{display:"inline-flex",flexShrink:0},animate:o?{}:n?{scale:1.2,rotate:0}:{rotate:[-5,5,-5]},transition:n||o?c:{duration:3,repeat:1/0,ease:"easeInOut"},children:jsxRuntime.jsx(Ae,{size:16})}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-8},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-8},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"icon-pop")})}var ho={duration:.18,ease:"easeOut"},xo={duration:0};function at({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),o=h(),c=o?xo:ho;return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{scale:0,opacity:0},animate:{scale:1,opacity:1},exit:{scale:0,opacity:0},transition:c,whileTap:{scale:.92},style:{overflow:"hidden"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:c,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("span",{style:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",width:"10px",height:"10px",flexShrink:0},children:[jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{width:"10px",height:"10px",borderRadius:"50%",background:"var(--bf-accent)",position:"relative",zIndex:1},animate:o?{}:{opacity:n?1:[.5,1,.5],boxShadow:n?"0 0 8px 2px var(--bf-accent)":["0 0 4px 1px var(--bf-accent)","0 0 12px 4px var(--bf-accent)","0 0 4px 1px var(--bf-accent)"]},transition:n||o?c:{duration:2,repeat:1/0,ease:"easeInOut"}}),!n&&!o&&jsxRuntime.jsx(framerMotion.motion.span,{"aria-hidden":"true",style:{position:"absolute",width:"18px",height:"2px",background:"linear-gradient(90deg, var(--bf-accent), transparent)",transformOrigin:"left center",left:"5px",top:"4px"},animate:{rotate:[0,360]},transition:{duration:4,repeat:1/0,ease:"linear"}})]}),jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:n&&jsxRuntime.jsx(framerMotion.motion.span,{initial:{opacity:0,x:o?0:-6},animate:{opacity:1,x:0},exit:{opacity:0,x:o?0:-6},transition:c,style:{whiteSpace:"nowrap"},children:r},"label")}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"beacon")})}var To={duration:.18,ease:"easeOut"},Eo={duration:0};function lt({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=react.useState(false),[o,c]=react.useState(0),x=h(),z=x?Eo:To,f=react.useRef(null);react.useEffect(()=>{if(f.current&&(clearInterval(f.current),f.current=null),!i||n||x){c(n||x?r.length:0);return}let b=8,T=r.length*2+b*2,m=0;return f.current=setInterval(()=>{m=(m+1)%T,m<=r.length?c(m):m<=r.length+b?c(r.length):m<=r.length*2+b?c(r.length*2+b-m):c(0);},100),()=>{f.current&&(clearInterval(f.current),f.current=null);}},[i,n,x,r]);let S=r.slice(0,o);return jsxRuntime.jsx(framerMotion.AnimatePresence,{mode:"wait",children:i&&jsxRuntime.jsx(framerMotion.motion.button,{className:y(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{opacity:0,y:x?0:5},animate:{opacity:1,y:0},exit:{opacity:0,y:x?0:5},transition:z,whileTap:{scale:.95},style:{minWidth:"44px"},children:p?jsxRuntime.jsx(framerMotion.motion.span,{initial:{scale:0},animate:{scale:1},transition:z,style:{display:"inline-flex",color:"var(--bf-accent)"},children:jsxRuntime.jsx(g,{size:14})},"success"):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"bf-dot","aria-hidden":"true"}),jsxRuntime.jsxs("span",{style:{whiteSpace:"nowrap",minWidth:"1ch"},children:[S,jsxRuntime.jsx("span",{className:"bf-cursor","aria-hidden":"true"})]}),a>0&&jsxRuntime.jsx("span",{className:"bf-badge","aria-label":`${a} queued`,children:a})]})},"typewriter")})}function dt(t){switch(t){case "dot":return Oe;case "bubble":return Ke;case "edge-tab":return Ye;case "pulse-ring":return qe;case "minimal":return et;case "icon-pop":return ot;case "beacon":return at;case "typewriter":return lt;default:return _e}}function ft(t,e,i){return Math.max(e,Math.min(i,t))}function No(t,e,i="bottom-right"){let a=window.innerWidth,p=window.innerHeight,n;n=ft(t.x,12,Math.max(12,a-e-12));let l=t.y+t.height+12,o=Math.max(12,t.y-240);return {top:l+240<=p?l:o,left:n}}function Fo(t){let{rect:e}=t,i={left:`${e.x}px`,top:`${e.y}px`,width:`${Math.max(0,e.width)}px`,height:`${Math.max(0,e.height)}px`};return jsxRuntime.jsx("div",{className:"bf-highlight",style:i,"aria-hidden":"true"})}function Ro(t){let e=react.useRef(null);return react.useEffect(()=>{if(!t||!e.current)return;let i=e.current,r=i.querySelector(".bf-textarea");r?.focus();let a=n=>{if(n.key!=="Tab")return;let l=i.querySelectorAll('button:not([disabled]), textarea:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])');if(l.length===0)return;let o=l[0],c=l[l.length-1];n.shiftKey&&document.activeElement===o?(n.preventDefault(),c.focus()):!n.shiftKey&&document.activeElement===c&&(n.preventDefault(),o.focus());},p=n=>{let l=n.target;l&&(i.contains(l)||(n.stopImmediatePropagation(),r?.focus()));};return document.addEventListener("keydown",a,{capture:true}),document.addEventListener("focusin",p,{capture:true}),()=>{document.removeEventListener("keydown",a,{capture:true}),document.removeEventListener("focusin",p,{capture:true});}},[t]),e}function Mo(t,e){return t?typeof t=="function"?t(e):t.some(i=>i.endsWith("*")?e.startsWith(i.slice(0,-1)):e===i):true}var ce=new Set,pt=false;function Lo(){if(pt||typeof window>"u")return;pt=true;let t=history.pushState,e=history.replaceState,i=()=>{for(let r of ce)r();};history.pushState=function(...r){t.apply(this,r),setTimeout(i,0);},history.replaceState=function(...r){e.apply(this,r),setTimeout(i,0);};}function zo(t){let[e,i]=react.useState(()=>typeof window<"u"?window.location.pathname:"/");return react.useEffect(()=>{if(typeof window>"u")return;let r=()=>i(window.location.pathname);return window.addEventListener("popstate",r),Lo(),ce.add(r),()=>{window.removeEventListener("popstate",r),ce.delete(r);}},[]),Mo(t,e)}function Io(t){let[e,i]=react.useState(()=>!t||t==="dark"?"dark":t==="light"?"light":typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return react.useEffect(()=>{if(t!=="auto"){i(t==="light"?"light":"dark");return}let r=window.matchMedia("(prefers-color-scheme: dark)"),a=p=>i(p.matches?"dark":"light");return i(r.matches?"dark":"light"),r.addEventListener("change",a),()=>r.removeEventListener("change",a)},[t]),e}var Ao=["bug","feature","ux","general"],Wo={bug:"categoryBug",feature:"categoryFeature",ux:"categoryUx",general:"categoryGeneral"};function X(t){let e=Math.floor(t/1e3),i=Math.floor(e/60),r=e%60;return `${i}:${String(r).padStart(2,"0")}`}function _o(t){return t<1024*1024?`${Math.round(t/1024)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function Ho(t){let{state:e,controller:i,start:r,stop:a,clearSelection:p,submit:n}=ae(),l=t.config.ui?.position,o=ze(t.config.ui?.strings),c=t.config.ui?.branding!==false,[x,z]=react.useState(null),[f,S]=react.useState(""),[b,T]=react.useState(t.config.capture?.element??true),[m,C]=react.useState(t.config.capture?.fullPage??false),[bt,de]=react.useState(null),[D,fe]=react.useState(void 0),pe=t.config.ui?.categories??Ao,gt=t.config.recording?.enabled===true&&chunkACMIGJ32_cjs.l(),mt=t.config.recording?.maxDurationMs??3e4,ue=i.getConfig().voice,ht=ue?.enabled===true&&chunkACMIGJ32_cjs.n(),xt=ue?.maxDurationMs??6e4,[vt,yt]=react.useState(false),[J,wt]=react.useState(0);react.useEffect(()=>{let s=window.setTimeout(()=>{let v=chunkACMIGJ32_cjs.z();wt(v.findings.length);},500);return ()=>window.clearTimeout(s)},[]),react.useImperativeHandle(t.handleRef,()=>({open:r,close:a,submit:s=>n(s),startRecording:()=>i.startRecording(),stopRecording:()=>i.stopRecording(),get isOpen(){return e.phase!=="idle"}}),[r,a,n,i,e.phase]);let be=e.phase==="review"||e.phase==="capturing"||e.phase==="submitting"||e.phase==="error"||e.phase==="success",kt=Ro(be),[Tt,Et]=react.useState(0);react.useEffect(()=>{e.phase==="idle"&&Et(chunkACMIGJ32_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(chunkACMIGJ32_cjs.b(s.getBoundingClientRect()));};v();let B=()=>v();return window.addEventListener("scroll",B,{capture:true,passive:true}),window.addEventListener("resize",B,{passive:true}),()=>{window.removeEventListener("scroll",B,{capture:true}),window.removeEventListener("resize",B);}},[i,e.phase,e.selection?.selector]),react.useEffect(()=>{e.phase==="review"&&(S(""),T(t.config.capture?.element??true),C(t.config.capture?.fullPage??false),fe(void 0),V(null));},[e.phase,e.selection?.selector,t.config.capture?.element,t.config.capture?.fullPage]),react.useEffect(()=>{if(e.phase!=="success")return;let s=window.setTimeout(()=>a(),1200);return ()=>window.clearTimeout(s)},[e.phase,a]);let E=e.phase==="capturing"||e.phase==="submitting",M=e.phase==="picking"?x?.rect??null:bt??e.selection?.rect??null,Z=react.useMemo(()=>M?No(M,360,l):null,[M?.x,M?.y,M?.width,M?.height,l]),he=e.lastError?.message,ee=react.useCallback(()=>{let s={capture:{element:b,fullPage:m}};D&&(s.category=D),n(f,s);},[n,f,b,m,D]),Ct=react.useCallback(s=>{(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&f.trim().length>0&&!E&&(s.preventDefault(),ee());},[ee,f,E]),[xe,V]=react.useState(null),Pt=react.useCallback(async()=>{if(e.voiceRecording){i.stopVoice();return}V(null);let s=await i.startVoice();if(s?.text)S(v=>v?v+" "+s.text:s.text);else if(s?.warning)V(o.voiceEmptyText);else if(!s){let v=i.getState().lastError;if(v){let B=v.message?.toLowerCase()??"";B.includes("denied")||B.includes("permission")||B.includes("not allowed")?V(o.voiceDeniedText):V(o.voiceErrorText);}}},[e.voiceRecording,i,o]),Bt=dt(t.config.ui?.triggerStyle);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(Bt,{position:l,onClick:()=>r(),isVisible:e.phase==="idle",label:t.config.ui?.triggerLabel??o.triggerLabel,queueCount:Tt,showSuccess:St}),e.phase!=="idle"&&e.phase!=="recording"&&jsxRuntime.jsxs("div",{className:"bf-overlay",role:"presentation",children:[e.phase!=="picking"&&jsxRuntime.jsx("div",{className:"bf-blocker",role:"presentation",onClick:()=>a()}),M&&jsxRuntime.jsx(Fo,{rect:M}),e.phase==="picking"&&jsxRuntime.jsxs("div",{className:"bf-hint",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("p",{id:"bf-hint-text",children:o.hintText}),jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),"aria-label":o.cancelButton,children:o.cancelButton})]}),be&&Z&&jsxRuntime.jsxs("div",{ref:kt,className:"bf-panel",style:{left:Z.left,top:Z.top},role:"dialog","aria-modal":"true","aria-label":"Feedback form",children:[jsxRuntime.jsxs("div",{className:"bf-panelHeader",children:[jsxRuntime.jsx("div",{className:"bf-title",id:"bf-panel-title",children:o.panelTitle}),jsxRuntime.jsxs("div",{className:"bf-row",style:{justifyContent:"flex-end"},children:[jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>p(),disabled:E,"aria-label":o.rePickButton,children:o.rePickButton}),jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),disabled:E,"aria-label":o.closeButton,children:o.closeButton})]})]}),jsxRuntime.jsxs("div",{className:"bf-panelBody",children:[jsxRuntime.jsx("textarea",{className:"bf-textarea",placeholder:o.textareaPlaceholder,value:f,onChange:s=>S(s.target.value),onKeyDown:Ct,disabled:E,"aria-label":o.panelTitle}),pe.length>0&&jsxRuntime.jsx("div",{className:"bf-pills",role:"group","aria-label":"Feedback category",children:pe.map(s=>jsxRuntime.jsx("button",{type:"button",className:`bf-pill${D===s?" bf-pill-active":""}`,onClick:()=>fe(D===s?void 0:s),disabled:E,children:o[Wo[s]]},s))}),jsxRuntime.jsxs("div",{className:"bf-row",role:"group","aria-label":o.screenshotElement,children:[jsxRuntime.jsxs("label",{children:[jsxRuntime.jsx("input",{type:"checkbox",checked:b,onChange:s=>T(s.target.checked),disabled:E}),o.screenshotElement]}),jsxRuntime.jsxs("label",{children:[jsxRuntime.jsx("input",{type:"checkbox",checked:m,onChange:s=>C(s.target.checked),disabled:E}),o.screenshotFullPage]})]}),ht&&e.phase==="review"&&!e.voiceTranscribing&&jsxRuntime.jsx("button",{type:"button",className:`bf-voice-btn${e.voiceRecording?" bf-voice-btn-active":""}`,onClick:Pt,disabled:E,"aria-label":e.voiceRecording?o.voiceStopButton:o.voiceButton,children:e.voiceRecording?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"bf-rec-dot bf-rec-dot-pulse","aria-hidden":"true"}),o.voiceRecordingText," ",X(e.voiceElapsedMs??0)," / ",X(xt)," \u2014 ",o.voiceStopButton]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("svg",{className:"bf-mic-icon",viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[jsxRuntime.jsx("rect",{x:"9",y:"1",width:"6",height:"11",rx:"3"}),jsxRuntime.jsx("path",{d:"M19 10v1a7 7 0 0 1-14 0v-1"}),jsxRuntime.jsx("line",{x1:"12",y1:"19",x2:"12",y2:"23"}),jsxRuntime.jsx("line",{x1:"8",y1:"23",x2:"16",y2:"23"})]}),o.voiceButton]})}),e.voiceTranscribing&&jsxRuntime.jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.voiceTranscribingText]}),xe&&!e.voiceRecording&&!e.voiceTranscribing&&jsxRuntime.jsx("div",{className:"bf-error",role:"alert",children:xe}),gt&&e.phase==="review"&&!e.video&&jsxRuntime.jsxs("button",{type:"button",className:"bf-record-btn",onClick:()=>i.startRecording(),disabled:E,"aria-label":o.recordButton,children:[jsxRuntime.jsx("span",{className:"bf-rec-dot","aria-hidden":"true"}),o.recordButton]}),e.video&&e.phase==="review"&&jsxRuntime.jsxs("div",{className:"bf-video-preview",children:[jsxRuntime.jsx("video",{src:e.video.blobUrl,controls:true,muted:true,playsInline:true}),jsxRuntime.jsx("button",{type:"button",className:"bf-video-remove",onClick:()=>i.removeVideo(),"aria-label":o.removeVideoButton,children:"\xD7"}),jsxRuntime.jsxs("div",{className:"bf-video-meta",children:[o.videoPreviewLabel," (",X(e.video.durationMs),", ",_o(e.video.sizeBytes),")"]})]}),e.phase==="capturing"&&jsxRuntime.jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.capturingText]}),e.phase==="submitting"&&jsxRuntime.jsxs("div",{className:"bf-status",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("span",{className:"bf-spinner","aria-hidden":"true"}),o.submittingText]}),e.phase==="success"&&jsxRuntime.jsx("div",{className:"bf-status",role:"status","aria-live":"polite",children:o.successText}),e.phase==="error"&&he&&jsxRuntime.jsx("div",{className:"bf-error",role:"alert",children:he}),jsxRuntime.jsxs("div",{className:"bf-actions",children:[jsxRuntime.jsx("button",{type:"button",className:"bf-btn",onClick:()=>a(),disabled:E,"aria-label":o.cancelButton,children:o.cancelButton}),jsxRuntime.jsx("button",{type:"button",className:"bf-btn bf-btnPrimary",onClick:ee,disabled:E||f.trim().length===0,"aria-label":o.sendButton,children:o.sendButton})]})]}),c&&jsxRuntime.jsxs("div",{className:"bf-watermark",children:[(()=>{let s=chunkACMIGJ32_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=chunkACMIGJ32_cjs.q();return s?jsxRuntime.jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"bf-toast-link",children:"View my feedback"}):null})()]}),J>0&&!vt&&jsxRuntime.jsxs("div",{className:"bf-security-banner",role:"alert",children:[jsxRuntime.jsx("button",{type:"button",className:"bf-security-banner-dismiss",onClick:()=>yt(true),"aria-label":"Dismiss",children:"\xD7"}),jsxRuntime.jsx("strong",{children:"Security Warning"}),J," potential secret",J>1?"s":""," exposed in client code. Check your environment variables."]})]})}var Oo=react.forwardRef(function(e,i){let r={...e.config??{},blocfeed_id:e.blocfeed_id},[a,p]=react.useState(null),n=zo(r.ui?.showOn),l=Io(r.ui?.theme?.mode),o=!!r.diagnostics;react.useEffect(()=>{if(o)return chunkACMIGJ32_cjs.u(r.diagnostics),()=>chunkACMIGJ32_cjs.v()},[o]);let c=!!r.security;react.useEffect(()=>{c&&chunkACMIGJ32_cjs.y(r.security);},[c]);let x=react.useRef(e.config?.metadata?.enrich);x.current=e.config?.metadata?.enrich;let z=react.useMemo(()=>{if(e.config)return {...e.config,metadata:{...e.config.metadata,enrich:async f=>{let S=x.current,b=S?await S(f):{},T=chunkACMIGJ32_cjs.w(),m=chunkACMIGJ32_cjs.z(),C=chunkACMIGJ32_cjs.j();return {...b,...T.consoleLogs.length>0?{_consoleLogs:T.consoleLogs}:{},...T.networkErrors.length>0?{_networkErrors:T.networkErrors}:{},...m.findings.length>0?{_securityFindings:m.findings}:{},...C.length>0?{_clickEvents:C}:{}}}}}},[]);return react.useEffect(()=>{Me();let f=document.createElement("div");f.setAttribute("data-blocfeed-ui-root","true"),f.setAttribute("data-blocfeed-ui","true"),f.setAttribute("data-bf-theme",l);let S=r.ui?.zIndex;typeof S=="number"&&f.style.setProperty("--bf-z",String(S));let b=r.ui?.theme;b&&(b.accentColor&&f.style.setProperty("--bf-accent",b.accentColor),b.panelBackground&&f.style.setProperty("--bf-panel-bg",b.panelBackground),b.panelForeground&&f.style.setProperty("--bf-panel-fg",b.panelForeground),b.fontFamily&&f.style.setProperty("--bf-font",b.fontFamily));let T=C=>C.stopPropagation(),m=["pointerdown","pointerup","mousedown","mouseup","click","touchstart","touchend"];for(let C of m)f.addEventListener(C,T);try{document.body.appendChild(f);}catch{return}return p(f),()=>{for(let C of m)f.removeEventListener(C,T);f.remove(),p(null);}},[r.ui?.zIndex,r.ui?.theme?.accentColor,r.ui?.theme?.panelBackground,r.ui?.theme?.panelForeground,r.ui?.theme?.fontFamily,l]),!n||!a?null:reactDom.createPortal(jsxRuntime.jsx(ie,{blocfeed_id:r.blocfeed_id,...z?{config:z}:{},children:jsxRuntime.jsx(Ho,{config:r,handleRef:i})}),a)});
|
|
885
|
+
Object.defineProperty(exports,"BehavioralTracker",{enumerable:true,get:function(){return chunkACMIGJ32_cjs.s}});exports.BlocFeedProvider=ie;exports.BlocFeedWidget=Oo;exports.useBlocFeed=ae;
|
package/dist/main.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult } from './controller-
|
|
2
|
-
export {
|
|
1
|
+
import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult, d as BehavioralEvent, e as BehavioralConfig } from './controller-6fm9oK63.cjs';
|
|
2
|
+
export { f as BehavioralEventType, g as BlocFeedError, h as BlocFeedStrings, i as BlocFeedUser, j as CaptureDiagnostics, k as CaptureResult, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, n as FeedbackPayload, I as ImageAsset, M as MaybePromise, o as MetadataConfig, p as MetadataContext, N as NetworkEntry, P as PickerConfig, R as RecordingConfig, q as Rect, r as ScreenshotAdapter, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, v as SecurityConfig, w as SecurityFinding, x as SecuritySnapshot, y as SessionPhase, T as ThemeConfig, z as TransportConfig, A as TransportResult, G as TriggerStyle, V as VideoAsset, H as VideoIntent, J as VideoMime, K as VoiceConfig, W as WidgetPosition } from './controller-6fm9oK63.cjs';
|
|
3
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
4
|
import * as react from 'react';
|
|
5
5
|
import { ReactNode } from 'react';
|
|
@@ -33,4 +33,31 @@ type BlocFeedApi = {
|
|
|
33
33
|
};
|
|
34
34
|
declare function useBlocFeed(): BlocFeedApi;
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
interface Submitter {
|
|
37
|
+
enqueue(event: BehavioralEvent): void;
|
|
38
|
+
flush(): Promise<void>;
|
|
39
|
+
flushBeacon(): void;
|
|
40
|
+
size(): number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface TrackerOpts {
|
|
44
|
+
blocfeedId: string;
|
|
45
|
+
endpoint?: string;
|
|
46
|
+
config?: BehavioralConfig;
|
|
47
|
+
submitter?: Submitter;
|
|
48
|
+
passiveSampler?: () => boolean;
|
|
49
|
+
}
|
|
50
|
+
declare class BehavioralTracker {
|
|
51
|
+
private readonly opts;
|
|
52
|
+
private readonly resolved;
|
|
53
|
+
private submitter;
|
|
54
|
+
private detectorUninstallers;
|
|
55
|
+
private flushTimer;
|
|
56
|
+
private pageHideHandler;
|
|
57
|
+
private installed;
|
|
58
|
+
constructor(opts: TrackerOpts);
|
|
59
|
+
install(): void;
|
|
60
|
+
uninstall(): void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export { BehavioralConfig, BehavioralEvent, BehavioralTracker, type BlocFeedApi, BlocFeedConfig, BlocFeedHandle, BlocFeedProvider, BlocFeedState, BlocFeedWidget, CaptureConfig, FeedbackCategory, SubmitResult, useBlocFeed };
|
package/dist/main.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult } from './controller-
|
|
2
|
-
export {
|
|
1
|
+
import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult, d as BehavioralEvent, e as BehavioralConfig } from './controller-6fm9oK63.js';
|
|
2
|
+
export { f as BehavioralEventType, g as BlocFeedError, h as BlocFeedStrings, i as BlocFeedUser, j as CaptureDiagnostics, k as CaptureResult, l as ConsoleEntry, D as DiagnosticsConfig, E as ElementDescriptor, m as FeedbackApiResponse, n as FeedbackPayload, I as ImageAsset, M as MaybePromise, o as MetadataConfig, p as MetadataContext, N as NetworkEntry, P as PickerConfig, R as RecordingConfig, q as Rect, r as ScreenshotAdapter, s as ScreenshotAdapterOptions, t as ScreenshotIntent, u as ScreenshotMime, v as SecurityConfig, w as SecurityFinding, x as SecuritySnapshot, y as SessionPhase, T as ThemeConfig, z as TransportConfig, A as TransportResult, G as TriggerStyle, V as VideoAsset, H as VideoIntent, J as VideoMime, K as VoiceConfig, W as WidgetPosition } from './controller-6fm9oK63.js';
|
|
3
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
4
|
import * as react from 'react';
|
|
5
5
|
import { ReactNode } from 'react';
|
|
@@ -33,4 +33,31 @@ type BlocFeedApi = {
|
|
|
33
33
|
};
|
|
34
34
|
declare function useBlocFeed(): BlocFeedApi;
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
interface Submitter {
|
|
37
|
+
enqueue(event: BehavioralEvent): void;
|
|
38
|
+
flush(): Promise<void>;
|
|
39
|
+
flushBeacon(): void;
|
|
40
|
+
size(): number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface TrackerOpts {
|
|
44
|
+
blocfeedId: string;
|
|
45
|
+
endpoint?: string;
|
|
46
|
+
config?: BehavioralConfig;
|
|
47
|
+
submitter?: Submitter;
|
|
48
|
+
passiveSampler?: () => boolean;
|
|
49
|
+
}
|
|
50
|
+
declare class BehavioralTracker {
|
|
51
|
+
private readonly opts;
|
|
52
|
+
private readonly resolved;
|
|
53
|
+
private submitter;
|
|
54
|
+
private detectorUninstallers;
|
|
55
|
+
private flushTimer;
|
|
56
|
+
private pageHideHandler;
|
|
57
|
+
private installed;
|
|
58
|
+
constructor(opts: TrackerOpts);
|
|
59
|
+
install(): void;
|
|
60
|
+
uninstall(): void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export { BehavioralConfig, BehavioralEvent, BehavioralTracker, type BlocFeedApi, BlocFeedConfig, BlocFeedHandle, BlocFeedProvider, BlocFeedState, BlocFeedWidget, CaptureConfig, FeedbackCategory, SubmitResult, useBlocFeed };
|
package/dist/main.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
2
|
+
import {u,v,y as y$1,w,z,j,a,t,l,n,i,q,b}from'./chunk-C4BWWDCF.js';export{s as BehavioralTracker}from'./chunk-C4BWWDCF.js';import {createContext,forwardRef,useState,useEffect,useRef,useMemo,useImperativeHandle,useCallback,useContext}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {createPortal}from'react-dom';import {AnimatePresence,motion}from'framer-motion';var Y=createContext(null);function ie(t$1){let e=useMemo(()=>t({...t$1.config??{},blocfeed_id:t$1.blocfeed_id}),[]),[i,r]=useState(()=>e.getState());return useEffect(()=>e.subscribe(r),[e]),useEffect(()=>e.setConfig({...t$1.config??{},blocfeed_id:t$1.blocfeed_id}),[e,t$1.config,t$1.blocfeed_id]),useEffect(()=>()=>e.destroy(),[e]),jsx(Y.Provider,{value:{controller:e,state:i},children:t$1.children})}var Re="blocfeed-styles-v1",It=`
|
|
3
3
|
:where([data-blocfeed-ui-root]),
|
|
4
4
|
:where([data-blocfeed-ui-root]) * {
|
|
5
5
|
box-sizing: border-box;
|
|
@@ -881,5 +881,5 @@ import {t,u,x,v,y as y$1,j,a,s,l,n,i,q,b}from'./chunk-PUVKSWVE.js';import {creat
|
|
|
881
881
|
animation: none;
|
|
882
882
|
}
|
|
883
883
|
}
|
|
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,
|
|
884
|
+
`;function Me(){if(!a()||document.getElementById(Re))return;let t=document.createElement("style");t.id=Re,t.textContent=It,document.head.appendChild(t);}var Le={triggerLabel:"Feedback",panelTitle:"Feedback",hintText:"Click an element to attach your feedback. Press Esc to cancel.",cancelButton:"Cancel",rePickButton:"Re-pick",closeButton:"Close",textareaPlaceholder:"What's happening? What did you expect?",screenshotElement:"Screenshot element",screenshotFullPage:"Full page",capturingText:"Capturing screenshots\u2026",submittingText:"Submitting\u2026",successText:"Sent. Thank you!",toastText:"Feedback sent",sendButton:"Send",categoryBug:"Bug",categoryFeature:"Feature",categoryUx:"UX",categoryGeneral:"General",recordButton:"Record",stopRecordButton:"Stop",recordingText:"Recording\u2026",recordingDeniedText:"Screen share was denied",videoPreviewLabel:"Video attached",removeVideoButton:"Remove",voiceButton:"Voice",voiceStopButton:"Stop",voiceRecordingText:"Recording\u2026",voiceTranscribingText:"Transcribing\u2026",voiceDeniedText:"Microphone access was denied",voiceErrorText:"Voice transcription failed. Please type instead.",voiceEmptyText:"No speech detected. Try again or type instead."};function ze(t){return t?{...Le,...t}:Le}function ae(){let t=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 Vt={duration:.18,ease:"easeOut"},$t={duration:0};function Oe({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),o=h(),c=o?$t:Vt;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 Yt={duration:.18,ease:"easeOut"},Ve={duration:0};function Ke({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),o=h(),c=o?Ve:Yt;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 Qt={duration:.2,ease:"easeOut"},qt={duration:0};function Xe(t){return t==="bottom-left"||t==="top-left"}function Jt(t){return `bf-trigger-edge ${Xe(t)?"bf-trigger-edge-left":"bf-trigger-edge-right"}`}function Ye({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),o=Xe(t),c=h(),x=c?qt:Qt;return jsx(AnimatePresence,{mode:"wait",children:i&&jsx(motion.button,{className:Jt(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{opacity:0,width:0},animate:{opacity:1,width:n?140:22,height:n?40:90},exit:{width:0,opacity:0},transition:x,whileTap:{scale:.97},style:{top:"50%",translateY:"-50%"},children:p?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 to={duration:.18,ease:"easeOut"},oo={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?oo:to;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 no={duration:.18,ease:"easeOut"},so={duration:0};function co(t){switch(t){case "bottom-left":return "bf-trigger-minimal bf-trigger-bl";case "top-right":return "bf-trigger-minimal bf-trigger-tr";case "top-left":return "bf-trigger-minimal bf-trigger-tl";default:return "bf-trigger-minimal"}}function et({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),o=h(),c=o?so:no;return jsx(AnimatePresence,{mode:"wait",children:i&&jsxs(motion.button,{className:co(t),type:"button",onClick:e,onMouseEnter:()=>l(true),onMouseLeave:()=>l(false),"aria-label":r,initial:{opacity:0,y:o?0:5},animate:{opacity:n?1:.65,y:0},exit:{opacity:0,y:o?0:5},transition:c,whileTap:{scale:.95},children:[p?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 po={duration:.18,ease:"easeOut"},uo={duration:0};function ot({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),o=h(),c=o?uo:po;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 ho={duration:.18,ease:"easeOut"},xo={duration:0};function at({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),o=h(),c=o?xo:ho;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 To={duration:.18,ease:"easeOut"},Eo={duration:0};function lt({position:t,onClick:e,isVisible:i,label:r,queueCount:a,showSuccess:p}){let[n,l]=useState(false),[o,c]=useState(0),x=h(),z=x?Eo:To,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 No(t,e,i="bottom-right"){let a=window.innerWidth,p=window.innerHeight,n;n=ft(t.x,12,Math.max(12,a-e-12));let l=t.y+t.height+12,o=Math.max(12,t.y-240);return {top:l+240<=p?l:o,left:n}}function Fo(t){let{rect:e}=t,i={left:`${e.x}px`,top:`${e.y}px`,width:`${Math.max(0,e.width)}px`,height:`${Math.max(0,e.height)}px`};return jsx("div",{className:"bf-highlight",style:i,"aria-hidden":"true"})}function Ro(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 Mo(t,e){return t?typeof t=="function"?t(e):t.some(i=>i.endsWith("*")?e.startsWith(i.slice(0,-1)):e===i):true}var ce=new Set,pt=false;function Lo(){if(pt||typeof window>"u")return;pt=true;let t=history.pushState,e=history.replaceState,i=()=>{for(let r of ce)r();};history.pushState=function(...r){t.apply(this,r),setTimeout(i,0);},history.replaceState=function(...r){e.apply(this,r),setTimeout(i,0);};}function zo(t){let[e,i]=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),Lo(),ce.add(r),()=>{window.removeEventListener("popstate",r),ce.delete(r);}},[]),Mo(t,e)}function Io(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 Ao=["bug","feature","ux","general"],Wo={bug:"categoryBug",feature:"categoryFeature",ux:"categoryUx",general:"categoryGeneral"};function X(t){let e=Math.floor(t/1e3),i=Math.floor(e/60),r=e%60;return `${i}:${String(r).padStart(2,"0")}`}function _o(t){return t<1024*1024?`${Math.round(t/1024)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function Ho(t){let{state:e,controller:i$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$1]=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??Ao,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=z();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=Ro(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$1),[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?No(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(Fo,{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[Wo[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),", ",_o(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 Oo=forwardRef(function(e,i){let r={...e.config??{},blocfeed_id:e.blocfeed_id},[a,p]=useState(null),n=zo(r.ui?.showOn),l=Io(r.ui?.theme?.mode),o=!!r.diagnostics;useEffect(()=>{if(o)return u(r.diagnostics),()=>v()},[o]);let c=!!r.security;useEffect(()=>{c&&y$1(r.security);},[c]);let x=useRef(e.config?.metadata?.enrich);x.current=e.config?.metadata?.enrich;let z$1=useMemo(()=>{if(e.config)return {...e.config,metadata:{...e.config.metadata,enrich:async f=>{let S=x.current,b=S?await S(f):{},T=w(),m=z(),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$1?{config:z$1}:{},children:jsx(Ho,{config:r,handleRef:i})}),a)});
|
|
885
|
+
export{ie as BlocFeedProvider,Oo as BlocFeedWidget,ae as useBlocFeed};
|
package/package.json
CHANGED
package/dist/chunk-EZWTVVJ5.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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;
|
package/dist/chunk-PUVKSWVE.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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};
|