blocfeed 0.19.0 → 0.20.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.
@@ -28,6 +28,17 @@ interface BehavioralEvent {
28
28
  element_text: string | null;
29
29
  event_data: Record<string, unknown> | null;
30
30
  created_at: string;
31
+ /**
32
+ * A render-stable identifier for the element associated with the event.
33
+ * Built from `data-blocfeed-component`, then a `data-testid`-family
34
+ * attribute, then the element id (walking up to a few ancestors). When
35
+ * none of those are available the field is `null`. Used by the backend
36
+ * to dedupe events for the "same logical element" across re-renders, even
37
+ * when the CSS selector changes.
38
+ *
39
+ * See `buildStableElementKey` in `src/shared/dom.ts`.
40
+ */
41
+ stable_key: string | null;
31
42
  }
32
43
  interface RageClickConfig {
33
44
  enabled?: boolean;
@@ -28,6 +28,17 @@ interface BehavioralEvent {
28
28
  element_text: string | null;
29
29
  event_data: Record<string, unknown> | null;
30
30
  created_at: string;
31
+ /**
32
+ * A render-stable identifier for the element associated with the event.
33
+ * Built from `data-blocfeed-component`, then a `data-testid`-family
34
+ * attribute, then the element id (walking up to a few ancestors). When
35
+ * none of those are available the field is `null`. Used by the backend
36
+ * to dedupe events for the "same logical element" across re-renders, even
37
+ * when the CSS selector changes.
38
+ *
39
+ * See `buildStableElementKey` in `src/shared/dom.ts`.
40
+ */
41
+ stable_key: string | null;
31
42
  }
32
43
  interface RageClickConfig {
33
44
  enabled?: boolean;
package/dist/engine.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';var chunkZQDABCPT_cjs=require('./chunk-ZQDABCPT.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(!chunkZQDABCPT_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(!chunkZQDABCPT_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 chunkZQDABCPT_cjs.j}});Object.defineProperty(exports,"clearDiagnostics",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.y}});Object.defineProperty(exports,"clearQueue",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.g}});Object.defineProperty(exports,"clearSecurityFindings",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.B}});Object.defineProperty(exports,"collectMetadata",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.d}});Object.defineProperty(exports,"createBlocFeedController",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.t}});Object.defineProperty(exports,"createHtmlToImageAdapter",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.b}});Object.defineProperty(exports,"dequeueAll",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.f}});Object.defineProperty(exports,"drainClickEvents",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.i}});Object.defineProperty(exports,"drainDiagnostics",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.x}});Object.defineProperty(exports,"enqueue",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.e}});Object.defineProperty(exports,"getMyFeedbackUrl",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.p}});Object.defineProperty(exports,"getQueueSize",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.h}});Object.defineProperty(exports,"getSecurityFindings",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.A}});Object.defineProperty(exports,"getViewerToken",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.o}});Object.defineProperty(exports,"installDiagnostics",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.v}});Object.defineProperty(exports,"isRecordingSupported",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.k}});Object.defineProperty(exports,"isVoiceSupported",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.m}});Object.defineProperty(exports,"runCapture",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.c}});Object.defineProperty(exports,"runSecretScan",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.z}});Object.defineProperty(exports,"startRecording",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.l}});Object.defineProperty(exports,"startVoiceRecording",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.n}});Object.defineProperty(exports,"transcribeAudio",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.q}});Object.defineProperty(exports,"uninstallDiagnostics",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.w}});exports.createModernScreenshotAdapter=U;exports.dataUrlToBlob=O;
1
+ 'use strict';var chunkX4ON6DOW_cjs=require('./chunk-X4ON6DOW.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(!chunkX4ON6DOW_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(!chunkX4ON6DOW_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 chunkX4ON6DOW_cjs.j}});Object.defineProperty(exports,"clearDiagnostics",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.y}});Object.defineProperty(exports,"clearQueue",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.g}});Object.defineProperty(exports,"clearSecurityFindings",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.B}});Object.defineProperty(exports,"collectMetadata",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.d}});Object.defineProperty(exports,"createBlocFeedController",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.t}});Object.defineProperty(exports,"createHtmlToImageAdapter",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.b}});Object.defineProperty(exports,"dequeueAll",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.f}});Object.defineProperty(exports,"drainClickEvents",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.i}});Object.defineProperty(exports,"drainDiagnostics",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.x}});Object.defineProperty(exports,"enqueue",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.e}});Object.defineProperty(exports,"getMyFeedbackUrl",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.p}});Object.defineProperty(exports,"getQueueSize",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.h}});Object.defineProperty(exports,"getSecurityFindings",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.A}});Object.defineProperty(exports,"getViewerToken",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.o}});Object.defineProperty(exports,"installDiagnostics",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.v}});Object.defineProperty(exports,"isRecordingSupported",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.k}});Object.defineProperty(exports,"isVoiceSupported",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.m}});Object.defineProperty(exports,"runCapture",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.c}});Object.defineProperty(exports,"runSecretScan",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.z}});Object.defineProperty(exports,"startRecording",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.l}});Object.defineProperty(exports,"startVoiceRecording",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.n}});Object.defineProperty(exports,"transcribeAudio",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.q}});Object.defineProperty(exports,"uninstallDiagnostics",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.w}});exports.createModernScreenshotAdapter=U;exports.dataUrlToBlob=O;
package/dist/engine.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { r as ScreenshotAdapter, C as CaptureConfig, k as CaptureResult, V as VideoAsset, R as RecordingConfig, L as ClickEvent, K as VoiceConfig, o as MetadataConfig, p as MetadataContext, i as BlocFeedUser, n as FeedbackPayload, x as SecuritySnapshot, v as SecurityConfig } from './controller-C5mxpGk4.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-C5mxpGk4.cjs';
1
+ import { r as ScreenshotAdapter, C as CaptureConfig, k as CaptureResult, V as VideoAsset, R as RecordingConfig, L as ClickEvent, K as VoiceConfig, o as MetadataConfig, p as MetadataContext, i as BlocFeedUser, n as FeedbackPayload, x as SecuritySnapshot, v as SecurityConfig } from './controller-DrQ--KwA.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-DrQ--KwA.cjs';
3
3
 
4
4
  declare function createHtmlToImageAdapter(): ScreenshotAdapter;
5
5
 
package/dist/engine.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { r as ScreenshotAdapter, C as CaptureConfig, k as CaptureResult, V as VideoAsset, R as RecordingConfig, L as ClickEvent, K as VoiceConfig, o as MetadataConfig, p as MetadataContext, i as BlocFeedUser, n as FeedbackPayload, x as SecuritySnapshot, v as SecurityConfig } from './controller-C5mxpGk4.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-C5mxpGk4.js';
1
+ import { r as ScreenshotAdapter, C as CaptureConfig, k as CaptureResult, V as VideoAsset, R as RecordingConfig, L as ClickEvent, K as VoiceConfig, o as MetadataConfig, p as MetadataContext, i as BlocFeedUser, n as FeedbackPayload, x as SecuritySnapshot, v as SecurityConfig } from './controller-DrQ--KwA.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-DrQ--KwA.js';
3
3
 
4
4
  declare function createHtmlToImageAdapter(): ScreenshotAdapter;
5
5
 
package/dist/engine.js CHANGED
@@ -1 +1 @@
1
- import {a}from'./chunk-XVMFV46F.js';export{j as clearClickEvents,y as clearDiagnostics,g as clearQueue,B as clearSecurityFindings,d as collectMetadata,t as createBlocFeedController,b as createHtmlToImageAdapter,f as dequeueAll,i as drainClickEvents,x as drainDiagnostics,e as enqueue,p as getMyFeedbackUrl,h as getQueueSize,A as getSecurityFindings,o as getViewerToken,v as installDiagnostics,k as isRecordingSupported,m as isVoiceSupported,c as runCapture,z as runSecretScan,l as startRecording,n as startVoiceRecording,q as transcribeAudio,w as uninstallDiagnostics}from'./chunk-XVMFV46F.js';function s(o){if(o?.aborted)throw new Error("Aborted")}async function v(o){return await new Promise((t,e)=>{let r=new Image;r.onload=()=>t({width:r.naturalWidth,height:r.naturalHeight}),r.onerror=()=>e(new Error("Failed to load generated screenshot")),r.src=o;})}async function l(o,t){let{width:e,height:r}=await v(o);return {dataUrl:o,mime:t,width:e,height:r}}function U(o){return {async captureElement(t,e){if(!a())throw new Error("captureElement can only run in the browser");s(e.signal);let r={scale:e.pixelRatio},n=e.mime==="image/jpeg"?await o.domToJpeg(t,{...r,quality:e.quality??.92}):await o.domToPng(t,r);return s(e.signal),await l(n,e.mime)},async captureFullPage(t){if(!a())throw new Error("captureFullPage can only run in the browser");s(t.signal);let e=document.documentElement,r=Math.max(e.scrollWidth,e.clientWidth),n=Math.max(e.scrollHeight,e.clientHeight),i=Math.min(1,t.maxDimension/Math.max(r,n)),c={width:Math.max(1,Math.round(r*i)),height:Math.max(1,Math.round(n*i)),scale:t.pixelRatio},a$1=t.mime==="image/jpeg"?await o.domToJpeg(e,{...c,quality:t.quality??.92}):await o.domToPng(e,c);return s(t.signal),await l(a$1,t.mime)}}}function O(o){let[t,e]=o.split(",",2);if(!t||!e)throw new Error("Invalid data URL");let n=/data:(.*?);base64/.exec(t)?.[1]||"application/octet-stream",i=atob(e),c=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)c[a]=i.charCodeAt(a);return new Blob([c],{type:n})}export{U as createModernScreenshotAdapter,O as dataUrlToBlob};
1
+ import {a}from'./chunk-VWILLYYY.js';export{j as clearClickEvents,y as clearDiagnostics,g as clearQueue,B as clearSecurityFindings,d as collectMetadata,t as createBlocFeedController,b as createHtmlToImageAdapter,f as dequeueAll,i as drainClickEvents,x as drainDiagnostics,e as enqueue,p as getMyFeedbackUrl,h as getQueueSize,A as getSecurityFindings,o as getViewerToken,v as installDiagnostics,k as isRecordingSupported,m as isVoiceSupported,c as runCapture,z as runSecretScan,l as startRecording,n as startVoiceRecording,q as transcribeAudio,w as uninstallDiagnostics}from'./chunk-VWILLYYY.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,2 +1,2 @@
1
1
  "use client";
2
- 'use strict';var chunkZQDABCPT_cjs=require('./chunk-ZQDABCPT.cjs');Object.defineProperty(exports,"BehavioralTracker",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.s}});Object.defineProperty(exports,"BlocFeed",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.F}});Object.defineProperty(exports,"BlocFeedProvider",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.u}});Object.defineProperty(exports,"BlocFeedWidget",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.D}});Object.defineProperty(exports,"SDK_VERSION",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.E}});Object.defineProperty(exports,"track",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.r}});Object.defineProperty(exports,"useBlocFeed",{enumerable:true,get:function(){return chunkZQDABCPT_cjs.C}});
2
+ 'use strict';var chunkX4ON6DOW_cjs=require('./chunk-X4ON6DOW.cjs');Object.defineProperty(exports,"BehavioralTracker",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.s}});Object.defineProperty(exports,"BlocFeed",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.F}});Object.defineProperty(exports,"BlocFeedProvider",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.u}});Object.defineProperty(exports,"BlocFeedWidget",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.D}});Object.defineProperty(exports,"SDK_VERSION",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.E}});Object.defineProperty(exports,"track",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.r}});Object.defineProperty(exports,"useBlocFeed",{enumerable:true,get:function(){return chunkX4ON6DOW_cjs.C}});
package/dist/main.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult, d as BehavioralEvent, e as BehavioralConfig } from './controller-C5mxpGk4.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-C5mxpGk4.cjs';
1
+ import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult, d as BehavioralEvent, e as BehavioralConfig } from './controller-DrQ--KwA.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-DrQ--KwA.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';
@@ -103,7 +103,7 @@ declare function track(name: string, properties?: TrackProperties, options?: Tra
103
103
  * Pinned at publish time. Sent with the heartbeat so the dashboard can
104
104
  * surface SDK version drift to customers.
105
105
  */
106
- declare const SDK_VERSION = "0.19.0";
106
+ declare const SDK_VERSION = "0.20.0";
107
107
 
108
108
  /**
109
109
  * Non-React entry point. Mirrors the shape of the rest of the SDK exports;
package/dist/main.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult, d as BehavioralEvent, e as BehavioralConfig } from './controller-C5mxpGk4.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-C5mxpGk4.js';
1
+ import { B as BlocFeedConfig, a as BlocFeedHandle, b as BlocFeedState, c as BlocFeedController, C as CaptureConfig, F as FeedbackCategory, S as SubmitResult, d as BehavioralEvent, e as BehavioralConfig } from './controller-DrQ--KwA.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-DrQ--KwA.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';
@@ -103,7 +103,7 @@ declare function track(name: string, properties?: TrackProperties, options?: Tra
103
103
  * Pinned at publish time. Sent with the heartbeat so the dashboard can
104
104
  * surface SDK version drift to customers.
105
105
  */
106
- declare const SDK_VERSION = "0.19.0";
106
+ declare const SDK_VERSION = "0.20.0";
107
107
 
108
108
  /**
109
109
  * Non-React entry point. Mirrors the shape of the rest of the SDK exports;
package/dist/main.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- export{s as BehavioralTracker,F as BlocFeed,u as BlocFeedProvider,D as BlocFeedWidget,E as SDK_VERSION,r as track,C as useBlocFeed}from'./chunk-XVMFV46F.js';
2
+ export{s as BehavioralTracker,F as BlocFeed,u as BlocFeedProvider,D as BlocFeedWidget,E as SDK_VERSION,r as track,C as useBlocFeed}from'./chunk-VWILLYYY.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blocfeed",
3
- "version": "0.19.0",
3
+ "version": "0.20.0",
4
4
  "description": "Drop-in feedback widget for React — element picking, screenshots, video recording, and voice feedback.",
5
5
  "license": "MIT",
6
6
  "type": "module",