gotcha-feedback 1.0.18 → 1.1.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 CHANGED
@@ -41,6 +41,9 @@ function FeatureCard() {
41
41
  - **Feedback Mode** - Star rating + text input
42
42
  - **Vote Mode** - Thumbs up/down with customizable labels
43
43
  - **Poll Mode** - Custom options (single or multi-select)
44
+ - **NPS Mode** - 0-10 Net Promoter Score with optional follow-up
45
+ - **Score Component** - Embeddable `<GotchaScore />` to display aggregate ratings inline
46
+ - **Bug Flagging** - Let users flag feedback as issues/bugs with a single toggle
44
47
  - **User Segmentation** - Analyze feedback by custom user attributes
45
48
  - **Edit Support** - Users can update their previous submissions
46
49
  - **Customizable** - Themes, sizes, positions
@@ -65,15 +68,24 @@ function FeatureCard() {
65
68
  | Prop | Type | Default | Description |
66
69
  |------|------|---------|-------------|
67
70
  | `elementId` | `string` | Required | Unique identifier for this element |
68
- | `mode` | `'feedback' \| 'vote' \| 'poll'` | `'feedback'` | Feedback mode |
71
+ | `mode` | `'feedback' \| 'vote' \| 'poll' \| 'nps'` | `'feedback'` | Feedback mode |
69
72
  | `position` | `'top-right' \| 'top-left' \| 'bottom-right' \| 'bottom-left' \| 'inline'` | `'top-right'` | Button position |
70
73
  | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Button size |
71
74
  | `theme` | `'light' \| 'dark' \| 'auto'` | `'light'` | Color theme |
72
75
  | `showOnHover` | `boolean` | `true` | Only show on hover |
76
+ | `showText` | `boolean` | `true` | Show the text input in feedback mode |
77
+ | `showRating` | `boolean` | `true` | Show the star rating in feedback mode |
73
78
  | `promptText` | `string` | Mode-specific | Custom prompt text |
74
79
  | `voteLabels` | `{ up: string, down: string }` | `{ up: 'Like', down: 'Dislike' }` | Custom vote button labels |
75
80
  | `options` | `string[]` | - | Poll options (2-6 items, required for poll mode) |
76
81
  | `allowMultiple` | `boolean` | `false` | Allow selecting multiple poll options |
82
+ | `npsQuestion` | `string` | `'How likely are you to recommend us?'` | Custom NPS question |
83
+ | `npsFollowUp` | `boolean` | `true` | Show follow-up textarea after NPS score |
84
+ | `npsFollowUpPlaceholder` | `string` | - | Placeholder for NPS follow-up textarea |
85
+ | `npsLowLabel` | `string` | `'Not likely'` | Label for low end of NPS scale |
86
+ | `npsHighLabel` | `string` | `'Very likely'` | Label for high end of NPS scale |
87
+ | `enableBugFlag` | `boolean` | `false` | Show "Report an issue" toggle in feedback form |
88
+ | `bugFlagLabel` | `string` | `'Report an issue'` | Custom label for the bug flag toggle |
77
89
  | `user` | `object` | - | User metadata for segmentation |
78
90
  | `onSubmit` | `function` | - | Callback after submission |
79
91
  | `onOpen` | `function` | - | Callback when modal opens |
@@ -134,6 +146,69 @@ function FeatureCard() {
134
146
  />
135
147
  ```
136
148
 
149
+ ### NPS Mode
150
+
151
+ ```tsx
152
+ <Gotcha
153
+ elementId="nps-survey"
154
+ mode="nps"
155
+ npsQuestion="How likely are you to recommend us?"
156
+ npsLowLabel="Not likely"
157
+ npsHighLabel="Very likely"
158
+ />
159
+ ```
160
+
161
+ ### Bug Flagging
162
+
163
+ Add a "Report an issue" toggle to any feedback form. When toggled on, the submission is automatically flagged as a bug and creates a ticket in your dashboard.
164
+
165
+ ```tsx
166
+ <Gotcha
167
+ elementId="checkout"
168
+ mode="feedback"
169
+ enableBugFlag
170
+ />
171
+ ```
172
+
173
+ ```tsx
174
+ // Custom label for non-technical users
175
+ <Gotcha
176
+ elementId="portal"
177
+ mode="feedback"
178
+ enableBugFlag
179
+ bugFlagLabel="Something isn't working"
180
+ />
181
+ ```
182
+
183
+ ### Feedback Field Options
184
+
185
+ By default, feedback mode shows both a star rating and a text input. Use `showText` and `showRating` to control which fields appear.
186
+
187
+ ```tsx
188
+ // Text only (no star rating)
189
+ <Gotcha
190
+ elementId="text-only"
191
+ showRating={false}
192
+ />
193
+ ```
194
+
195
+ ```tsx
196
+ // Rating only (no text input)
197
+ <Gotcha
198
+ elementId="rating-only"
199
+ showText={false}
200
+ />
201
+ ```
202
+
203
+ ```tsx
204
+ // Both fields (default behavior)
205
+ <Gotcha
206
+ elementId="full-feedback"
207
+ showText={true}
208
+ showRating={true}
209
+ />
210
+ ```
211
+
137
212
  ### Dark Theme
138
213
 
139
214
  ```tsx
@@ -279,12 +354,41 @@ When you provide a `user.id`, users can update their previous feedback instead o
279
354
 
280
355
  The modal will show "Update" instead of "Submit" when editing, and previous values will be pre-filled.
281
356
 
357
+ ## GotchaScore Component
358
+
359
+ Display aggregate feedback scores inline — star ratings, vote percentages, or raw numbers.
360
+
361
+ ```tsx
362
+ import { GotchaScore } from 'gotcha-feedback';
363
+
364
+ // Star rating display
365
+ <GotchaScore elementId="feature-card" variant="stars" />
366
+
367
+ // Compact pill (star + number)
368
+ <GotchaScore elementId="feature-card" variant="compact" />
369
+
370
+ // Vote percentage bar
371
+ <GotchaScore elementId="pricing" variant="votes" />
372
+
373
+ // Plain number
374
+ <GotchaScore elementId="feature-card" variant="number" />
375
+ ```
376
+
377
+ ### GotchaScore Props
378
+
379
+ | Prop | Type | Default | Description |
380
+ |------|------|---------|-------------|
381
+ | `elementId` | `string` | Required | Element to show score for |
382
+ | `variant` | `'stars' \| 'number' \| 'compact' \| 'votes'` | `'stars'` | Display variant |
383
+ | `theme` | `'light' \| 'dark' \| 'auto'` | `'auto'` | Color theme |
384
+ | `refreshInterval` | `number` | - | Auto-refresh interval in ms |
385
+
282
386
  ## TypeScript
283
387
 
284
388
  The package includes full TypeScript definitions:
285
389
 
286
390
  ```tsx
287
- import type { GotchaProps, GotchaProviderProps } from 'gotcha-feedback';
391
+ import type { GotchaProps, GotchaProviderProps, ScoreData } from 'gotcha-feedback';
288
392
  ```
289
393
 
290
394
  ## Requirements
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React$1 from 'react';
3
3
 
4
- type ResponseMode = 'feedback' | 'vote' | 'poll' | 'feature-request' | 'ab';
4
+ type ResponseMode = 'feedback' | 'vote' | 'poll' | 'nps';
5
5
  type VoteType = 'up' | 'down';
6
6
  interface GotchaUser {
7
7
  id?: string;
@@ -26,8 +26,7 @@ interface SubmitResponsePayload {
26
26
  vote?: VoteType;
27
27
  pollOptions?: string[];
28
28
  pollSelected?: string[];
29
- experimentId?: string;
30
- variant?: string;
29
+ isBug?: boolean;
31
30
  user?: GotchaUser;
32
31
  context?: {
33
32
  url?: string;
@@ -59,7 +58,19 @@ interface GotchaError {
59
58
  message: string;
60
59
  status: number;
61
60
  }
62
- type ErrorCode = 'INVALID_API_KEY' | 'ORIGIN_NOT_ALLOWED' | 'RATE_LIMITED' | 'QUOTA_EXCEEDED' | 'INVALID_REQUEST' | 'USER_NOT_FOUND' | 'INTERNAL_ERROR';
61
+ type ErrorCode = 'INVALID_API_KEY' | 'ORIGIN_NOT_ALLOWED' | 'RATE_LIMITED' | 'QUOTA_EXCEEDED' | 'INVALID_REQUEST' | 'USER_NOT_FOUND' | 'INTERNAL_ERROR' | 'PARSE_ERROR';
62
+ interface ScoreData {
63
+ elementId: string;
64
+ averageRating: number | null;
65
+ totalResponses: number;
66
+ ratingCount: number;
67
+ voteCount: {
68
+ up: number;
69
+ down: number;
70
+ };
71
+ positiveRate: number | null;
72
+ npsScore: number | null;
73
+ }
63
74
 
64
75
  interface GotchaProviderProps {
65
76
  /** Your Gotcha API key */
@@ -84,10 +95,6 @@ interface GotchaProps {
84
95
  user?: GotchaUser;
85
96
  /** Feedback mode */
86
97
  mode?: ResponseMode;
87
- /** Required if mode is 'ab' */
88
- experimentId?: string;
89
- /** Current A/B variant shown to user */
90
- variant?: string;
91
98
  /** Show the text input in feedback mode (default: true) */
92
99
  showText?: boolean;
93
100
  /** Show the star rating in feedback mode (default: true) */
@@ -101,8 +108,16 @@ interface GotchaProps {
101
108
  options?: string[];
102
109
  /** Allow selecting multiple options */
103
110
  allowMultiple?: boolean;
104
- /** Show results after voting */
105
- showResults?: boolean;
111
+ /** Custom NPS question (default: "How likely are you to recommend us?") */
112
+ npsQuestion?: string;
113
+ /** Show follow-up textarea after score selection (default: true) */
114
+ npsFollowUp?: boolean;
115
+ /** Placeholder for NPS follow-up textarea */
116
+ npsFollowUpPlaceholder?: string;
117
+ /** Label for low end of NPS scale (default: "Not likely") */
118
+ npsLowLabel?: string;
119
+ /** Label for high end of NPS scale (default: "Very likely") */
120
+ npsHighLabel?: string;
106
121
  /** Button position relative to parent */
107
122
  position?: Position;
108
123
  /** Button size */
@@ -125,6 +140,12 @@ interface GotchaProps {
125
140
  submitText?: string;
126
141
  /** Post-submission message */
127
142
  thankYouMessage?: string;
143
+ /** Show "Report an issue" toggle in feedback form (default: false) */
144
+ enableBugFlag?: boolean;
145
+ /** Custom label for the bug flag toggle (default: "Report an issue") */
146
+ bugFlagLabel?: string;
147
+ /** When true and user has already responded, show submitted state and allow review/edit instead of new submission */
148
+ onePerUser?: boolean;
128
149
  /** Called after successful submission */
129
150
  onSubmit?: (response: GotchaResponse) => void;
130
151
  /** Called when modal opens */
@@ -134,7 +155,19 @@ interface GotchaProps {
134
155
  /** Called on error */
135
156
  onError?: (error: GotchaError) => void;
136
157
  }
137
- declare function Gotcha({ elementId, user, mode, showText, showRating, experimentId, variant, voteLabels, options, allowMultiple, showResults, position, size, theme, customStyles, visible, showOnHover, touchBehavior, promptText, placeholder, submitText, thankYouMessage, onSubmit, onOpen, onClose, onError, }: GotchaProps): react_jsx_runtime.JSX.Element | null;
158
+ declare function Gotcha({ elementId, user, mode, showText, showRating, voteLabels, options, allowMultiple, npsQuestion, npsFollowUp, npsFollowUpPlaceholder, npsLowLabel, npsHighLabel, enableBugFlag, bugFlagLabel, onePerUser, position, size, theme, customStyles, visible, showOnHover, touchBehavior, promptText, placeholder, submitText, thankYouMessage, onSubmit, onOpen, onClose, onError, }: GotchaProps): react_jsx_runtime.JSX.Element | null;
159
+
160
+ type ScoreVariant = 'stars' | 'number' | 'compact' | 'votes';
161
+ interface GotchaScoreProps {
162
+ elementId: string;
163
+ variant?: ScoreVariant;
164
+ showCount?: boolean;
165
+ size?: Size;
166
+ theme?: Theme;
167
+ refreshInterval?: number;
168
+ style?: React$1.CSSProperties;
169
+ }
170
+ declare function GotchaScore({ elementId, variant, showCount, size, theme, refreshInterval, style, }: GotchaScoreProps): react_jsx_runtime.JSX.Element | null;
138
171
 
139
172
  /**
140
173
  * Hook to access Gotcha context
@@ -152,6 +185,11 @@ declare function useGotcha(): {
152
185
  vote?: VoteType;
153
186
  pollSelected?: string[];
154
187
  }, userId?: string): Promise<GotchaResponse>;
188
+ getScore(elementId: string): Promise<ScoreData>;
189
+ flagAsBug(responseId: string): Promise<{
190
+ ticketId: string;
191
+ status: string;
192
+ }>;
155
193
  getBaseUrl(): string;
156
194
  };
157
195
  /** Whether Gotcha is globally disabled */
@@ -164,4 +202,4 @@ declare function useGotcha(): {
164
202
  submitFeedback: (payload: Omit<SubmitResponsePayload, "context">) => Promise<GotchaResponse>;
165
203
  };
166
204
 
167
- export { Gotcha, type GotchaError, type GotchaProps, GotchaProvider, type GotchaProviderProps, type GotchaResponse, type GotchaStyles, type GotchaUser, type Position, type ResponseMode, type Size, type Theme, type TouchBehavior, type VoteType, useGotcha };
205
+ export { Gotcha, type GotchaError, type GotchaProps, GotchaProvider, type GotchaProviderProps, type GotchaResponse, GotchaScore, type GotchaScoreProps, type GotchaStyles, type GotchaUser, type Position, type ResponseMode, type ScoreData, type Size, type Theme, type TouchBehavior, type VoteType, useGotcha };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React$1 from 'react';
3
3
 
4
- type ResponseMode = 'feedback' | 'vote' | 'poll' | 'feature-request' | 'ab';
4
+ type ResponseMode = 'feedback' | 'vote' | 'poll' | 'nps';
5
5
  type VoteType = 'up' | 'down';
6
6
  interface GotchaUser {
7
7
  id?: string;
@@ -26,8 +26,7 @@ interface SubmitResponsePayload {
26
26
  vote?: VoteType;
27
27
  pollOptions?: string[];
28
28
  pollSelected?: string[];
29
- experimentId?: string;
30
- variant?: string;
29
+ isBug?: boolean;
31
30
  user?: GotchaUser;
32
31
  context?: {
33
32
  url?: string;
@@ -59,7 +58,19 @@ interface GotchaError {
59
58
  message: string;
60
59
  status: number;
61
60
  }
62
- type ErrorCode = 'INVALID_API_KEY' | 'ORIGIN_NOT_ALLOWED' | 'RATE_LIMITED' | 'QUOTA_EXCEEDED' | 'INVALID_REQUEST' | 'USER_NOT_FOUND' | 'INTERNAL_ERROR';
61
+ type ErrorCode = 'INVALID_API_KEY' | 'ORIGIN_NOT_ALLOWED' | 'RATE_LIMITED' | 'QUOTA_EXCEEDED' | 'INVALID_REQUEST' | 'USER_NOT_FOUND' | 'INTERNAL_ERROR' | 'PARSE_ERROR';
62
+ interface ScoreData {
63
+ elementId: string;
64
+ averageRating: number | null;
65
+ totalResponses: number;
66
+ ratingCount: number;
67
+ voteCount: {
68
+ up: number;
69
+ down: number;
70
+ };
71
+ positiveRate: number | null;
72
+ npsScore: number | null;
73
+ }
63
74
 
64
75
  interface GotchaProviderProps {
65
76
  /** Your Gotcha API key */
@@ -84,10 +95,6 @@ interface GotchaProps {
84
95
  user?: GotchaUser;
85
96
  /** Feedback mode */
86
97
  mode?: ResponseMode;
87
- /** Required if mode is 'ab' */
88
- experimentId?: string;
89
- /** Current A/B variant shown to user */
90
- variant?: string;
91
98
  /** Show the text input in feedback mode (default: true) */
92
99
  showText?: boolean;
93
100
  /** Show the star rating in feedback mode (default: true) */
@@ -101,8 +108,16 @@ interface GotchaProps {
101
108
  options?: string[];
102
109
  /** Allow selecting multiple options */
103
110
  allowMultiple?: boolean;
104
- /** Show results after voting */
105
- showResults?: boolean;
111
+ /** Custom NPS question (default: "How likely are you to recommend us?") */
112
+ npsQuestion?: string;
113
+ /** Show follow-up textarea after score selection (default: true) */
114
+ npsFollowUp?: boolean;
115
+ /** Placeholder for NPS follow-up textarea */
116
+ npsFollowUpPlaceholder?: string;
117
+ /** Label for low end of NPS scale (default: "Not likely") */
118
+ npsLowLabel?: string;
119
+ /** Label for high end of NPS scale (default: "Very likely") */
120
+ npsHighLabel?: string;
106
121
  /** Button position relative to parent */
107
122
  position?: Position;
108
123
  /** Button size */
@@ -125,6 +140,12 @@ interface GotchaProps {
125
140
  submitText?: string;
126
141
  /** Post-submission message */
127
142
  thankYouMessage?: string;
143
+ /** Show "Report an issue" toggle in feedback form (default: false) */
144
+ enableBugFlag?: boolean;
145
+ /** Custom label for the bug flag toggle (default: "Report an issue") */
146
+ bugFlagLabel?: string;
147
+ /** When true and user has already responded, show submitted state and allow review/edit instead of new submission */
148
+ onePerUser?: boolean;
128
149
  /** Called after successful submission */
129
150
  onSubmit?: (response: GotchaResponse) => void;
130
151
  /** Called when modal opens */
@@ -134,7 +155,19 @@ interface GotchaProps {
134
155
  /** Called on error */
135
156
  onError?: (error: GotchaError) => void;
136
157
  }
137
- declare function Gotcha({ elementId, user, mode, showText, showRating, experimentId, variant, voteLabels, options, allowMultiple, showResults, position, size, theme, customStyles, visible, showOnHover, touchBehavior, promptText, placeholder, submitText, thankYouMessage, onSubmit, onOpen, onClose, onError, }: GotchaProps): react_jsx_runtime.JSX.Element | null;
158
+ declare function Gotcha({ elementId, user, mode, showText, showRating, voteLabels, options, allowMultiple, npsQuestion, npsFollowUp, npsFollowUpPlaceholder, npsLowLabel, npsHighLabel, enableBugFlag, bugFlagLabel, onePerUser, position, size, theme, customStyles, visible, showOnHover, touchBehavior, promptText, placeholder, submitText, thankYouMessage, onSubmit, onOpen, onClose, onError, }: GotchaProps): react_jsx_runtime.JSX.Element | null;
159
+
160
+ type ScoreVariant = 'stars' | 'number' | 'compact' | 'votes';
161
+ interface GotchaScoreProps {
162
+ elementId: string;
163
+ variant?: ScoreVariant;
164
+ showCount?: boolean;
165
+ size?: Size;
166
+ theme?: Theme;
167
+ refreshInterval?: number;
168
+ style?: React$1.CSSProperties;
169
+ }
170
+ declare function GotchaScore({ elementId, variant, showCount, size, theme, refreshInterval, style, }: GotchaScoreProps): react_jsx_runtime.JSX.Element | null;
138
171
 
139
172
  /**
140
173
  * Hook to access Gotcha context
@@ -152,6 +185,11 @@ declare function useGotcha(): {
152
185
  vote?: VoteType;
153
186
  pollSelected?: string[];
154
187
  }, userId?: string): Promise<GotchaResponse>;
188
+ getScore(elementId: string): Promise<ScoreData>;
189
+ flagAsBug(responseId: string): Promise<{
190
+ ticketId: string;
191
+ status: string;
192
+ }>;
155
193
  getBaseUrl(): string;
156
194
  };
157
195
  /** Whether Gotcha is globally disabled */
@@ -164,4 +202,4 @@ declare function useGotcha(): {
164
202
  submitFeedback: (payload: Omit<SubmitResponsePayload, "context">) => Promise<GotchaResponse>;
165
203
  };
166
204
 
167
- export { Gotcha, type GotchaError, type GotchaProps, GotchaProvider, type GotchaProviderProps, type GotchaResponse, type GotchaStyles, type GotchaUser, type Position, type ResponseMode, type Size, type Theme, type TouchBehavior, type VoteType, useGotcha };
205
+ export { Gotcha, type GotchaError, type GotchaProps, GotchaProvider, type GotchaProviderProps, type GotchaResponse, GotchaScore, type GotchaScoreProps, type GotchaStyles, type GotchaUser, type Position, type ResponseMode, type ScoreData, type Size, type Theme, type TouchBehavior, type VoteType, useGotcha };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime'),reactDom=require('react-dom');var Ce="https://gotcha.cx/api/v1";var ue={ANONYMOUS_ID:"gotcha_anonymous_id"},P={POSITION:"top-right",SIZE:"md",THEME:"light",SHOW_ON_HOVER:true,TOUCH_BEHAVIOR:"always-visible",SUBMIT_TEXT:"Submit",THANK_YOU_MESSAGE:"Thanks for your feedback!"};var J={MAX_RETRIES:2,BASE_DELAY_MS:500,MAX_DELAY_MS:5e3};function Me(){if(typeof window>"u")return `anon_${crypto.randomUUID()}`;let e=localStorage.getItem(ue.ANONYMOUS_ID);if(e)return e;let a=`anon_${crypto.randomUUID()}`;return localStorage.setItem(ue.ANONYMOUS_ID,a),a}var ee={maxRetries:J.MAX_RETRIES,baseDelayMs:J.BASE_DELAY_MS,maxDelayMs:J.MAX_DELAY_MS};async function pe(e,a,l=ee,n=false){let g=null;for(let b=0;b<=l.maxRetries;b++){try{n&&b>0&&console.log(`[Gotcha] Retry attempt ${b}/${l.maxRetries}`);let t=await fetch(e,a);if(t.status>=400&&t.status<500&&t.status!==429||t.ok)return t;g=new Error(`HTTP ${t.status}`);}catch(t){g=t,n&&console.log(`[Gotcha] Network error: ${g.message}`);}if(b<l.maxRetries){let t=Math.min(l.baseDelayMs*Math.pow(2,b),l.maxDelayMs);await new Promise(i=>setTimeout(i,t));}}throw g}function Ie(e){let{apiKey:a,baseUrl:l=Ce,debug:n=false}=e,g={"Content-Type":"application/json",Authorization:`Bearer ${a}`};async function b(t,i,s){let r=`${l}${i}`,d=crypto.randomUUID();n&&console.log(`[Gotcha] ${t} ${i}`,s);let c=await pe(r,{method:t,headers:{...g,"Idempotency-Key":d},body:s?JSON.stringify(s):void 0},ee,n),u=await c.json();if(!c.ok){let p=u.error;throw n&&console.error(`[Gotcha] Error: ${p.code} - ${p.message}`),p}return n&&console.log("[Gotcha] Response:",u),u}return {async submitResponse(t){let i=t.user||{};i.id||(i.id=Me());let s={...t,user:i,context:{url:typeof window<"u"?window.location.href:void 0,userAgent:typeof navigator<"u"?navigator.userAgent:void 0}};return b("POST","/responses",s)},async checkExistingResponse(t,i){let s=`${l}/responses/check?elementId=${encodeURIComponent(t)}&userId=${encodeURIComponent(i)}`;n&&console.log("[Gotcha] GET /responses/check");let r=await pe(s,{method:"GET",headers:g},ee,n),d=await r.json();if(!r.ok){let c=d.error;throw n&&console.error(`[Gotcha] Error: ${c.code} - ${c.message}`),c}return d.exists?(n&&console.log("[Gotcha] Found existing response:",d.response),d.response):null},async updateResponse(t,i,s){let r=`${l}/responses/${t}${s?`?userId=${encodeURIComponent(s)}`:""}`;n&&console.log(`[Gotcha] PATCH /responses/${t}`,i);let d=await pe(r,{method:"PATCH",headers:g,body:JSON.stringify(i)},ee,n),c=await d.json();if(!d.ok){let u=c.error;throw n&&console.error(`[Gotcha] Error: ${u.code} - ${u.message}`),u}return n&&console.log("[Gotcha] Response updated:",c),c},getBaseUrl(){return l}}}var Ae=react.createContext(null);function qe({apiKey:e,children:a,baseUrl:l,debug:n=false,disabled:g=false,defaultUser:b={}}){let[t,i]=react.useState(null),s=react.useMemo(()=>Ie({apiKey:e,baseUrl:l,debug:n}),[e,l,n]),r=react.useCallback(u=>{i(u);},[]),d=react.useCallback(()=>{i(null);},[]),c=react.useMemo(()=>({client:s,disabled:g,defaultUser:b,debug:n,activeModalId:t,openModal:r,closeModal:d}),[s,g,b,n,t,r,d]);return jsxRuntime.jsx(Ae.Provider,{value:c,children:a})}function U(){let e=react.useContext(Ae);if(!e)throw new Error("useGotchaContext must be used within a GotchaProvider");return e}function Oe(e){let{client:a,defaultUser:l}=U(),[n,g]=react.useState(false),[b,t]=react.useState(false),[i,s]=react.useState(null),[r,d]=react.useState(null);return react.useEffect(()=>{let u=e.user?.id||l?.id;if(!u){d(null);return}let p=false;return (async()=>{t(true);try{let f=await a.checkExistingResponse(e.elementId,u);p||d(f);}catch{p||d(null);}finally{p||t(false);}})(),()=>{p=true;}},[a,e.elementId,e.user?.id,l?.id]),{submit:react.useCallback(async u=>{g(true),s(null);try{let p=e.user?.id||l?.id,m;return r&&p?m=await a.updateResponse(r.id,{content:u.content,title:u.title,rating:u.rating,vote:u.vote,pollSelected:u.pollSelected},p):m=await a.submitResponse({elementId:e.elementId,mode:e.mode,content:u.content,title:u.title,rating:u.rating,vote:u.vote,pollOptions:e.pollOptions,pollSelected:u.pollSelected,experimentId:e.experimentId,variant:e.variant,user:{...l,...e.user}}),e.onSuccess?.(m),m}catch(p){let m=p instanceof Error?p.message:"Something went wrong";throw s(m),e.onError?.(p instanceof Error?p:new Error(m)),p}finally{g(false);}},[a,l,e,r]),isLoading:n,isCheckingExisting:b,error:i,existingResponse:r,isEditing:!!r,clearError:()=>s(null)}}function oe(...e){return e.filter(Boolean).join(" ")}var A=()=>typeof window>"u"?false:"ontouchstart"in window||navigator.maxTouchPoints>0,_e=(e,a)=>{let l={sm:{desktop:24,mobile:32},md:{desktop:32,mobile:36},lg:{desktop:40,mobile:40}};return a?l[e].mobile:l[e].desktop};function tt(){return typeof window>"u"?"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function Ue({size:e,theme:a,customStyles:l,showOnHover:n,touchBehavior:g,onClick:b,isOpen:t,isParentHovered:i=false}){let[s,r]=react.useState(false),[d,c]=react.useState(false),[u,p]=react.useState(tt);react.useEffect(()=>{r(A());let C=window.matchMedia("(prefers-color-scheme: dark)"),h=G=>p(G.matches?"dark":"light");return C.addEventListener("change",h),()=>C.removeEventListener("change",h)},[]);let m=t?true:!s&&n?i:s&&g==="tap-to-reveal"?d:true,f=()=>{if(s&&g==="tap-to-reveal"&&!d){c(true);return}b();},o=_e(e,s),v=(a==="auto"?u:a)==="dark",I={width:o,height:o,borderRadius:"50%",border:v?"1px solid rgba(255,255,255,0.15)":"none",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",background:v?"linear-gradient(180deg, rgba(255,255,255,0.16) 0%, rgba(255,255,255,0.04) 60%, rgba(0,0,0,0.05) 100%)":"linear-gradient(160deg, rgba(255,255,255,0.7) 0%, rgba(200,210,230,0.4) 40%, rgba(180,192,220,0.5) 100%)",backdropFilter:"blur(16px) saturate(170%)",WebkitBackdropFilter:"blur(16px) saturate(170%)",color:v?"rgba(255,255,255,0.88)":"rgba(0,0,0,0.75)",boxShadow:v?"0 4px 14px rgba(0,0,0,0.45), 0 1px 3px rgba(0,0,0,0.35)":"0 3px 12px rgba(0,0,0,0.12), 0 0 1px rgba(0,0,0,0.2)",transition:"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)",opacity:m?1:0,transform:m?"scale(1)":"scale(0.6)",pointerEvents:m?"auto":"none",...l?.button};return jsxRuntime.jsx("button",{type:"button",onClick:f,style:I,className:oe("gotcha-button",t&&"gotcha-button--open"),"aria-label":"Give feedback on this feature","aria-expanded":t,"aria-haspopup":"dialog",children:jsxRuntime.jsx(nt,{size:o*.65})})}var De="gotcha-carter-one";function ot(){react.useEffect(()=>{if(document.getElementById(De))return;let e=document.createElement("link");e.id=De,e.rel="stylesheet",e.href="https://fonts.googleapis.com/css2?family=Carter+One&display=swap",document.head.appendChild(e);},[]);}function nt({size:e}){return ot(),jsxRuntime.jsx("span",{"aria-hidden":"true",style:{fontFamily:"'Carter One', cursive",fontSize:e,lineHeight:1,display:"flex",alignItems:"center",justifyContent:"center",marginTop:e*.05,marginRight:e*.05,userSelect:"none"},children:"G"})}function D({size:e=16,color:a="currentColor"}){return jsxRuntime.jsxs("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",style:{animation:"gotcha-spin 0.8s linear infinite"},children:[jsxRuntime.jsx("style",{children:`
1
+ 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime'),reactDom=require('react-dom');var Fe="https://gotcha.cx/api/v1";var we={ANONYMOUS_ID:"gotcha_anonymous_id",OFFLINE_QUEUE:"gotcha_offline_queue"},N={POSITION:"top-right",SIZE:"md",THEME:"light",SHOW_ON_HOVER:true,TOUCH_BEHAVIOR:"always-visible",SUBMIT_TEXT:"Submit",THANK_YOU_MESSAGE:"Thanks for your feedback!"};var fe={MAX_RETRIES:2,BASE_DELAY_MS:500,MAX_DELAY_MS:5e3};function Ne(){if(typeof window>"u")return `anon_${crypto.randomUUID()}`;try{let e=localStorage.getItem(we.ANONYMOUS_ID);if(e)return e;let r=`anon_${crypto.randomUUID()}`;return localStorage.setItem(we.ANONYMOUS_ID,r),r}catch{return `anon_${crypto.randomUUID()}`}}var Q={maxRetries:fe.MAX_RETRIES,baseDelayMs:fe.BASE_DELAY_MS,maxDelayMs:fe.MAX_DELAY_MS};async function oe(e,r,s=Q,o=false){let b=null;for(let g=0;g<=s.maxRetries;g++){try{o&&g>0&&console.log(`[Gotcha] Retry attempt ${g}/${s.maxRetries}`);let t=await fetch(e,r);if(t.status>=400&&t.status<500&&t.status!==429||t.ok)return t;b=new Error(`HTTP ${t.status}`);}catch(t){b=t,o&&console.log(`[Gotcha] Network error: ${b.message}`);}if(g<s.maxRetries){let t=Math.min(s.baseDelayMs*Math.pow(2,g),s.maxDelayMs);await new Promise(u=>setTimeout(u,t));}}throw b}function He(e){let{apiKey:r,baseUrl:s=Fe,debug:o=false}=e,b={"Content-Type":"application/json",Authorization:`Bearer ${r}`};async function g(t,u,a){let n=`${s}${u}`,l=crypto.randomUUID();o&&console.log(`[Gotcha] ${t} ${u}`,a);let f=await oe(n,{method:t,headers:{...b,"Idempotency-Key":l},body:a?JSON.stringify(a):void 0},Q,o),i;try{i=await f.json();}catch{throw {code:"PARSE_ERROR",message:"Invalid response from server",status:f.status}}if(!f.ok){let d=i.error;throw o&&console.error(`[Gotcha] Error: ${d.code} - ${d.message}`),d}return o&&console.log("[Gotcha] Response:",i),i}return {async submitResponse(t){let u=t.user||{};u.id||(u.id=Ne());let a={...t,user:u,context:{url:typeof window<"u"?window.location.href:void 0,userAgent:typeof navigator<"u"?navigator.userAgent:void 0},...t.isBug?{isBug:true}:{}};return g("POST","/responses",a)},async checkExistingResponse(t,u){let a=`${s}/responses/check?elementId=${encodeURIComponent(t)}&userId=${encodeURIComponent(u)}`;o&&console.log("[Gotcha] GET /responses/check");let n=await oe(a,{method:"GET",headers:b},Q,o),l=await n.json();if(!n.ok){let f=l.error;throw o&&console.error(`[Gotcha] Error: ${f.code} - ${f.message}`),f}return l.exists?(o&&console.log("[Gotcha] Found existing response:",l.response),l.response):null},async updateResponse(t,u,a){let n=`${s}/responses/${t}${a?`?userId=${encodeURIComponent(a)}`:""}`;o&&console.log(`[Gotcha] PATCH /responses/${t}`,u);let l=await oe(n,{method:"PATCH",headers:b,body:JSON.stringify(u)},Q,o),f=await l.json();if(!l.ok){let i=f.error;throw o&&console.error(`[Gotcha] Error: ${i.code} - ${i.message}`),i}return o&&console.log("[Gotcha] Response updated:",f),f},async getScore(t){let u=`${s}/scores/${encodeURIComponent(t)}`;o&&console.log(`[Gotcha] GET /scores/${t}`);let a=await oe(u,{method:"GET",headers:b},Q,o),n=await a.json();if(!a.ok){let l=n.error;throw o&&console.error(`[Gotcha] Error: ${l.code} - ${l.message}`),l}return o&&console.log("[Gotcha] Score:",n),n},async flagAsBug(t){let u=`${s}/responses/${encodeURIComponent(t)}/bug`;o&&console.log(`[Gotcha] POST /responses/${t}/bug`);let a=await oe(u,{method:"POST",headers:b},Q,o),n=await a.json();if(!a.ok){let l=n.error;throw o&&console.error(`[Gotcha] Error: ${l.code} - ${l.message}`),l}return o&&console.log("[Gotcha] Bug flagged:",n),n},getBaseUrl(){return s}}}var Ve=react.createContext(null);function pt({apiKey:e,children:r,baseUrl:s,debug:o=false,disabled:b=false,defaultUser:g={}}){let[t,u]=react.useState(null),a=react.useMemo(()=>He({apiKey:e,baseUrl:s,debug:o}),[e,s,o]),n=react.useCallback(i=>{u(i);},[]),l=react.useCallback(()=>{u(null);},[]),f=react.useMemo(()=>({client:a,disabled:b,defaultUser:g,debug:o,activeModalId:t,openModal:n,closeModal:l}),[a,b,g,o,t,n,l]);return jsxRuntime.jsx(Ve.Provider,{value:f,children:r})}function H(){let e=react.useContext(Ve);if(!e)throw new Error("useGotchaContext must be used within a GotchaProvider");return e}function je(e){let{client:r,defaultUser:s}=H(),[o,b]=react.useState(false),[g,t]=react.useState(false),[u,a]=react.useState(null),[n,l]=react.useState(null);return react.useEffect(()=>{let i=e.user?.id||s?.id;if(!i){l(null);return}let d=false;return (async()=>{t(true);try{let p=await r.checkExistingResponse(e.elementId,i);d||l(p);}catch{d||l(null);}finally{d||t(false);}})(),()=>{d=true;}},[r,e.elementId,e.user?.id,s?.id]),{submit:react.useCallback(async i=>{b(true),a(null);try{let d=e.user?.id||s?.id,y;return n&&d?y=await r.updateResponse(n.id,{content:i.content,title:i.title,rating:i.rating,vote:i.vote,pollSelected:i.pollSelected},d):y=await r.submitResponse({elementId:e.elementId,mode:e.mode,content:i.content,title:i.title,rating:i.rating,vote:i.vote,pollOptions:e.pollOptions,pollSelected:i.pollSelected,isBug:i.isBug,user:{...s,...e.user}}),l({id:y.id,mode:e.mode,content:i.content??null,title:i.title??null,rating:i.rating??null,vote:i.vote??null,pollSelected:i.pollSelected??null,createdAt:y.createdAt}),e.onSuccess?.(y),y}catch(d){let y=d instanceof Error?d.message:"Something went wrong";throw a(y),e.onError?.(d instanceof Error?d:new Error(y)),d}finally{b(false);}},[r,s,e,n]),isLoading:o,isCheckingExisting:g,error:u,existingResponse:n,isEditing:!!n,clearError:()=>a(null)}}function ge(...e){return e.filter(Boolean).join(" ")}var D=()=>typeof window>"u"?false:"ontouchstart"in window||navigator.maxTouchPoints>0,Ke=(e,r)=>{let s={sm:{desktop:24,mobile:32},md:{desktop:32,mobile:36},lg:{desktop:40,mobile:40}};return r?s[e].mobile:s[e].desktop};function mt(){return typeof window>"u"?"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function qe({size:e,theme:r,customStyles:s,showOnHover:o,touchBehavior:b,onClick:g,isOpen:t,isParentHovered:u=false}){let[a,n]=react.useState(false),[l,f]=react.useState(false),[i,d]=react.useState(mt);react.useEffect(()=>{n(D());let h=window.matchMedia("(prefers-color-scheme: dark)"),M=x=>d(x.matches?"dark":"light");return h.addEventListener("change",M),()=>h.removeEventListener("change",M)},[]);let y=t?true:!a&&o?u:a&&b==="tap-to-reveal"?l:true,p=()=>{if(a&&b==="tap-to-reveal"&&!l){f(true);return}g();},c=Ke(e,a),v=(r==="auto"?i:r)==="dark",S={width:c,height:c,borderRadius:"50%",border:v?"1px solid rgba(255,255,255,0.15)":"none",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",background:v?"linear-gradient(180deg, rgba(255,255,255,0.16) 0%, rgba(255,255,255,0.04) 60%, rgba(0,0,0,0.05) 100%)":"linear-gradient(160deg, rgba(255,255,255,0.7) 0%, rgba(200,210,230,0.4) 40%, rgba(180,192,220,0.5) 100%)",backdropFilter:"blur(16px) saturate(170%)",WebkitBackdropFilter:"blur(16px) saturate(170%)",color:v?"rgba(255,255,255,0.88)":"rgba(0,0,0,0.75)",boxShadow:v?"0 4px 14px rgba(0,0,0,0.45), 0 1px 3px rgba(0,0,0,0.35)":"0 3px 12px rgba(0,0,0,0.12), 0 0 1px rgba(0,0,0,0.2)",transition:"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)",opacity:y?1:0,transform:y?"scale(1)":"scale(0.6)",pointerEvents:y?"auto":"none",...s?.button};return jsxRuntime.jsx("button",{type:"button",onClick:p,style:S,className:ge("gotcha-button",t&&"gotcha-button--open"),"aria-label":"Give feedback on this feature","aria-expanded":t,"aria-haspopup":"dialog",children:jsxRuntime.jsx(St,{size:c*.65})})}var Qe="gotcha-carter-one";function yt(){react.useEffect(()=>{if(document.getElementById(Qe))return;let e=document.createElement("link");e.id=Qe,e.rel="stylesheet",e.href="https://fonts.googleapis.com/css2?family=Carter+One&display=swap",document.head.appendChild(e);},[]);}function St({size:e}){return yt(),jsxRuntime.jsx("span",{"aria-hidden":"true",style:{fontFamily:"'Carter One', cursive",fontSize:e,lineHeight:1,display:"flex",alignItems:"center",justifyContent:"center",marginTop:e*.05,marginRight:e*.05,userSelect:"none"},children:"G"})}function _({size:e=16,color:r="currentColor"}){return jsxRuntime.jsxs("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",style:{animation:"gotcha-spin 0.8s linear infinite"},children:[jsxRuntime.jsx("style",{children:`
2
2
  @keyframes gotcha-spin {
3
3
  from { transform: rotate(0deg); }
4
4
  to { transform: rotate(360deg); }
@@ -8,5 +8,5 @@
8
8
  50% { stroke-dasharray: 40, 62; stroke-dashoffset: -12; }
9
9
  100% { stroke-dasharray: 1, 62; stroke-dashoffset: -62; }
10
10
  }
11
- `}),jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"10",stroke:a,strokeWidth:"2",strokeOpacity:"0.12"}),jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"10",stroke:a,strokeWidth:"2",strokeLinecap:"round",style:{animation:"gotcha-dash 1.2s ease-in-out infinite"}})]})}function Be({theme:e,placeholder:a,submitText:l,isLoading:n,onSubmit:g,customStyles:b,initialValues:t,isEditing:i=false,showText:s=true,showRating:r=true}){let[d,c]=react.useState(t?.content||""),[u,p]=react.useState(t?.rating??null),[m,f]=react.useState(false);react.useEffect(()=>{f(A());},[]),react.useEffect(()=>{t?.content!==void 0&&c(t.content||""),t?.rating!==void 0&&p(t.rating??null);},[t?.content,t?.rating]);let o=e==="dark",x=s&&r?d.trim().length>0||u!==null:s?d.trim().length>0:r?u!==null:false,v=h=>{h.preventDefault(),x&&g({content:s&&d.trim()?d.trim():void 0,rating:r&&u!==null?u:void 0});},I={width:"100%",padding:m?"12px 14px":"10px 12px",border:`1px solid ${o?"rgba(255,255,255,0.08)":"#e2e8f0"}`,borderRadius:8,backgroundColor:o?"rgba(55,65,81,0.5)":"#fafbfc",color:o?"#f9fafb":"#111827",fontSize:m?16:14,resize:"vertical",minHeight:m?100:80,fontFamily:"inherit",outline:"none",transition:"border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1)",lineHeight:1.5,...b?.input},C={width:"100%",padding:m?"14px 16px":"10px 16px",border:"none",borderRadius:8,backgroundColor:o?"#e2e8f0":"#1e293b",color:o?"#1e293b":"#ffffff",fontSize:m?16:14,fontWeight:500,cursor:n?"not-allowed":"pointer",transition:"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)",letterSpacing:"0.01em",...b?.submitButton};return jsxRuntime.jsxs("form",{onSubmit:v,children:[r&&jsxRuntime.jsx("div",{style:{marginBottom:s?m?16:12:0,...s?{}:{display:"flex",justifyContent:"center",padding:"8px 0"}},children:jsxRuntime.jsx(st,{value:u,onChange:p,isDark:o,isTouch:m,large:!s})}),s&&jsxRuntime.jsx("textarea",{value:d,onChange:h=>c(h.target.value),placeholder:a||"Share your thoughts...",style:I,disabled:n,"aria-label":"Your feedback",onFocus:h=>{h.currentTarget.style.borderColor="#1e293b",h.currentTarget.style.boxShadow="0 0 0 2px rgba(30,41,59,0.15)",h.currentTarget.style.backgroundColor=o?"rgba(55,65,81,0.7)":"#ffffff";},onBlur:h=>{h.currentTarget.style.borderColor=o?"rgba(255,255,255,0.08)":"#e2e8f0",h.currentTarget.style.boxShadow="none",h.currentTarget.style.backgroundColor=o?"rgba(55,65,81,0.5)":"#fafbfc";}}),jsxRuntime.jsxs("button",{type:"submit",disabled:n||!x,style:{...C,marginTop:12,opacity:n?.8:1,backgroundColor:x?o?"#e2e8f0":"#1e293b":o?"#374151":"#e2e8f0",color:x?o?"#1e293b":"#ffffff":o?"#6b7280":"#94a3b8",display:"flex",alignItems:"center",justifyContent:"center",gap:8},onMouseEnter:h=>{h.currentTarget.disabled||(h.currentTarget.style.backgroundColor=o?"#cbd5e1":"#334155");},onMouseLeave:h=>{h.currentTarget.disabled||(h.currentTarget.style.backgroundColor=o?"#e2e8f0":"#1e293b");},children:[n&&jsxRuntime.jsx(D,{size:m?18:16,color:o?"#1e293b":"#ffffff"}),n?i?"Updating...":"Submitting...":i?"Update":l]})]})}function st({value:e,onChange:a,isDark:l,isTouch:n,large:g=false}){let[b,t]=react.useState(null),i=g?n?36:28:n?28:18,s=g?n?8:5:n?6:3;return jsxRuntime.jsx("div",{style:{display:"flex",gap:g?n?8:6:n?6:2},role:"group","aria-label":"Rating",children:[1,2,3,4,5].map(r=>{let d=(b??e??0)>=r;return jsxRuntime.jsx("button",{type:"button",onClick:()=>a(r),onMouseEnter:()=>t(r),onMouseLeave:()=>t(null),"aria-label":`Rate ${r} out of 5`,"aria-pressed":e===r,style:{background:"none",border:"none",cursor:"pointer",padding:s,color:d?"#f59e0b":l?"rgba(255,255,255,0.12)":"#e2e8f0",transition:"color 0.15s cubic-bezier(0.4, 0, 0.2, 1), transform 0.15s cubic-bezier(0.4, 0, 0.2, 1)",transform:b!==null&&b>=r?"scale(1.1)":"scale(1)"},children:jsxRuntime.jsx("svg",{width:i,height:i,viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"})})},r)})})}function He({theme:e,isLoading:a,onSubmit:l,initialVote:n,isEditing:g=false,labels:b}){let[t,i]=react.useState(false),[s,r]=react.useState(n||null),[d,c]=react.useState(n||null);react.useEffect(()=>{i(A());},[]),react.useEffect(()=>{n!==void 0&&(c(n),r(n));},[n]),react.useEffect(()=>{!a&&!g&&r(null);},[a,g]);let u=o=>{r(o),l({vote:o});},p=e==="dark",m=o=>{let x=d===o;return {flex:1,minWidth:0,overflow:"hidden",padding:t?"14px 18px":"10px 14px",border:`1px solid ${x?o==="up"?p?"rgba(16,185,129,0.3)":"rgba(16,185,129,0.25)":p?"rgba(239,68,68,0.3)":"rgba(239,68,68,0.25)":p?"rgba(255,255,255,0.08)":"#e2e8f0"}`,borderRadius:t?10:8,backgroundColor:x?o==="up"?p?"rgba(16,185,129,0.08)":"rgba(16,185,129,0.06)":p?"rgba(239,68,68,0.08)":"rgba(239,68,68,0.06)":p?"rgba(55,65,81,0.5)":"#fafbfc",color:x?o==="up"?"#10b981":"#ef4444":p?"#d1d5db":"#64748b",fontSize:t?28:24,cursor:a?"not-allowed":"pointer",transition:"background-color 0.2s, border-color 0.2s, color 0.2s, transform 0.2s, box-shadow 0.2s",display:"flex",alignItems:"center",justifyContent:"center",gap:t?10:8}},f=t?24:20;return jsxRuntime.jsxs("div",{style:{display:"flex",gap:t?12:10},role:"group","aria-label":"Vote",children:[jsxRuntime.jsx("button",{type:"button",onClick:()=>u("up"),disabled:a,style:m("up"),"aria-label":"Vote up - I like this","aria-pressed":d==="up",onMouseEnter:o=>{a||(o.currentTarget.style.transform="translateY(-1px)",o.currentTarget.style.boxShadow="0 2px 8px rgba(0,0,0,0.06)");},onMouseLeave:o=>{o.currentTarget.style.transform="translateY(0)",o.currentTarget.style.boxShadow="none";},children:a&&s==="up"?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(D,{size:f,color:p?"#f9fafb":"#111827"}),jsxRuntime.jsx("span",{style:{fontSize:t?15:13,fontWeight:500,letterSpacing:"0.01em"},children:g?"Updating...":"Sending..."})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(at,{size:f}),jsxRuntime.jsx("span",{style:{fontSize:t?15:13,fontWeight:500,letterSpacing:"0.01em"},children:b?.up||(d==="up"?"Liked":"Like")})]})}),jsxRuntime.jsx("button",{type:"button",onClick:()=>u("down"),disabled:a,style:m("down"),"aria-label":"Vote down - I don't like this","aria-pressed":d==="down",onMouseEnter:o=>{a||(o.currentTarget.style.transform="translateY(-1px)",o.currentTarget.style.boxShadow="0 2px 8px rgba(0,0,0,0.06)");},onMouseLeave:o=>{o.currentTarget.style.transform="translateY(0)",o.currentTarget.style.boxShadow="none";},children:a&&s==="down"?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(D,{size:f,color:p?"#f9fafb":"#111827"}),jsxRuntime.jsx("span",{style:{fontSize:t?15:13,fontWeight:500,letterSpacing:"0.01em"},children:g?"Updating...":"Sending..."})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(it,{size:f}),jsxRuntime.jsx("span",{style:{fontSize:t?15:13,fontWeight:500,letterSpacing:"0.01em"},children:b?.down||(d==="down"?"Disliked":"Dislike")})]})})]})}function at({size:e=24}){return jsxRuntime.jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.75",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"})})}function it({size:e=24}){return jsxRuntime.jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.75",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"})})}function Fe({theme:e,options:a,allowMultiple:l,isLoading:n,onSubmit:g,initialSelected:b,isEditing:t=false}){let[i,s]=react.useState(b||[]),[r,d]=react.useState(false);react.useEffect(()=>{d(A());},[]),react.useEffect(()=>{b&&s(b);},[b]);let c=e==="dark",u=f=>{s(l?o=>o.includes(f)?o.filter(x=>x!==f):[...o,f]:o=>o.includes(f)?[]:[f]);},p=()=>{i.length!==0&&g({pollSelected:i});},m=f=>{let o=i.includes(f);return {width:"100%",padding:r?"12px 14px":"9px 12px",border:`1px solid ${o?c?"rgba(226,232,240,0.25)":"rgba(30,41,59,0.25)":c?"rgba(255,255,255,0.08)":"#e2e8f0"}`,borderRadius:r?10:8,backgroundColor:o?c?"rgba(226,232,240,0.08)":"rgba(30,41,59,0.05)":c?"rgba(55,65,81,0.5)":"#fafbfc",color:o?c?"#e2e8f0":"#1e293b":c?"#d1d5db":"#374151",fontSize:r?15:13,fontWeight:500,cursor:n?"not-allowed":"pointer",transition:"background-color 0.2s, border-color 0.2s, color 0.2s",textAlign:"left",letterSpacing:"0.01em",display:"flex",alignItems:"center",gap:8}};return jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:{display:"flex",flexDirection:"column",gap:r?8:6},role:"group","aria-label":l?"Select one or more options":"Select an option",children:a.map(f=>{let o=i.includes(f);return jsxRuntime.jsxs("button",{type:"button",onClick:()=>u(f),disabled:n,style:m(f),"aria-pressed":o,children:[jsxRuntime.jsx("span",{style:{width:16,height:16,borderRadius:l?4:"50%",border:`2px solid ${o?c?"#e2e8f0":"#1e293b":c?"rgba(255,255,255,0.2)":"#cbd5e1"}`,backgroundColor:o?c?"#e2e8f0":"#1e293b":"transparent",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0,transition:"all 0.15s"},children:o&&jsxRuntime.jsx("svg",{width:10,height:10,viewBox:"0 0 12 12",fill:"none",children:jsxRuntime.jsx("path",{d:"M2 6l3 3 5-5",stroke:"#fff",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}),f]},f)})}),jsxRuntime.jsxs("button",{type:"button",onClick:p,disabled:n||i.length===0,style:{width:"100%",marginTop:12,padding:r?"14px 16px":"10px 16px",border:"none",borderRadius:8,backgroundColor:i.length===0?c?"#374151":"#e2e8f0":c?"#e2e8f0":"#1e293b",color:i.length===0?c?"#6b7280":"#94a3b8":c?"#1e293b":"#ffffff",fontSize:r?16:14,fontWeight:500,cursor:n||i.length===0?"not-allowed":"pointer",transition:"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)",letterSpacing:"0.01em",display:"flex",alignItems:"center",justifyContent:"center",gap:8,opacity:n?.8:1},onMouseEnter:f=>{f.currentTarget.disabled||(f.currentTarget.style.backgroundColor=c?"#cbd5e1":"#334155");},onMouseLeave:f=>{f.currentTarget.disabled||(f.currentTarget.style.backgroundColor=i.length===0?c?"#374151":"#e2e8f0":c?"#e2e8f0":"#1e293b");},children:[n&&jsxRuntime.jsx(D,{size:r?18:16,color:c?"#1e293b":"#ffffff"}),n?t?"Updating...":"Submitting...":t?"Update":"Submit"]})]})}function ve({mode:e,theme:a,customStyles:l,promptText:n,placeholder:g,submitText:b,thankYouMessage:t,isLoading:i,isSubmitted:s,error:r,existingResponse:d,isEditing:c=false,showText:u=true,showRating:p=true,voteLabels:m,options:f,allowMultiple:o=false,onSubmit:x,onClose:v,anchorRect:I}){let C=react.useRef(null),h=react.useRef(null),[G,W]=react.useState(false),[E,ie]=react.useState(false),[le,V]=react.useState("light");react.useEffect(()=>{ie(window.innerWidth<640);let S=window.matchMedia("(prefers-color-scheme: dark)");V(S.matches?"dark":"light");let M=R=>V(R.matches?"dark":"light");return S.addEventListener("change",M),()=>S.removeEventListener("change",M)},[]),react.useEffect(()=>{let S=requestAnimationFrame(()=>W(true));return ()=>cancelAnimationFrame(S)},[]);let _=a==="auto"?le:a,y=_==="dark",j=(I?window.innerHeight-I.bottom:window.innerHeight/2)<280+20;react.useEffect(()=>{let S=C.current;if(!S)return;h.current?.focus();let M=R=>{if(R.key==="Escape"){v();return}if(R.key==="Tab"){let L=S.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),N=L[0],B=L[L.length-1];R.shiftKey&&document.activeElement===N?(R.preventDefault(),B?.focus()):!R.shiftKey&&document.activeElement===B&&(R.preventDefault(),N?.focus());}};return document.addEventListener("keydown",M),()=>document.removeEventListener("keydown",M)},[v]);let X=e==="vote"?"What do you think?":e==="poll"?"Cast your vote":"What do you think of this feature?",z=E?20:16,Q=y?"0 1px 2px rgba(0,0,0,0.2), 0 4px 12px rgba(0,0,0,0.3), 0 12px 32px rgba(0,0,0,0.2)":"0 1px 2px rgba(0,0,0,0.04), 0 4px 12px rgba(0,0,0,0.06), 0 12px 32px rgba(0,0,0,0.06)",q=E?{position:"fixed",left:"50%",top:"50%",width:"calc(100vw - 32px)",maxWidth:320,padding:z,borderRadius:12,backgroundColor:y?"#1f2937":"#ffffff",color:y?"#f9fafb":"#111827",boxShadow:Q,border:`1px solid ${y?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)"}`,zIndex:9999,transition:"opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)",opacity:G?1:0,transform:G?"translate(-50%, -50%) scale(1)":"translate(-50%, -50%) scale(0.96)",...l?.modal,textAlign:"left"}:{position:"absolute",left:"50%",width:320,padding:z,borderRadius:10,backgroundColor:y?"#1f2937":"#ffffff",color:y?"#f9fafb":"#111827",boxShadow:Q,border:`1px solid ${y?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)"}`,zIndex:9999,...j?{bottom:"100%",marginBottom:8}:{top:"100%",marginTop:8},transition:"opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)",opacity:G?1:0,transform:G?"translateX(-50%) scale(1) translateY(0)":`translateX(-50%) scale(0.96) translateY(${j?"6px":"-6px"})`,...l?.modal,textAlign:"left"};return jsxRuntime.jsxs("div",{ref:C,role:"dialog","aria-modal":"true","aria-labelledby":"gotcha-modal-title",style:q,className:oe("gotcha-modal",y&&"gotcha-modal--dark"),children:[jsxRuntime.jsx("button",{ref:h,type:"button",onClick:v,"aria-label":"Close feedback form",style:{position:"absolute",top:E?12:8,right:E?12:8,width:E?36:28,height:E?36:28,border:"none",background:"transparent",cursor:"pointer",color:y?"#6b7280":"#9ca3af",display:"flex",alignItems:"center",justifyContent:"center",borderRadius:6,transition:"all 0.15s cubic-bezier(0.4, 0, 0.2, 1)"},onMouseEnter:S=>{S.currentTarget.style.backgroundColor=y?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.04)",S.currentTarget.style.color=y?"#9ca3af":"#6b7280";},onMouseLeave:S=>{S.currentTarget.style.backgroundColor="transparent",S.currentTarget.style.color=y?"#6b7280":"#9ca3af";},children:jsxRuntime.jsx("svg",{width:E?16:12,height:E?16:12,viewBox:"0 0 14 14",fill:"none",children:jsxRuntime.jsx("path",{d:"M1 1L13 13M1 13L13 1",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}),jsxRuntime.jsx("h2",{id:"gotcha-modal-title",style:{margin:"0 0 16px 0",fontSize:E?16:14,fontWeight:600,paddingRight:E?40:32,letterSpacing:"-0.01em",lineHeight:1.4,textAlign:"left"},children:n||X}),s&&jsxRuntime.jsxs("div",{style:{textAlign:"center",padding:"24px 0",color:y?"#10b981":"#059669"},children:[jsxRuntime.jsx("div",{style:{width:44,height:44,borderRadius:"50%",backgroundColor:y?"rgba(16,185,129,0.1)":"rgba(5,150,105,0.08)",display:"flex",alignItems:"center",justifyContent:"center",margin:"0 auto 12px"},children:jsxRuntime.jsx("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",children:jsxRuntime.jsx("path",{d:"M20 6L9 17L4 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}),jsxRuntime.jsx("p",{style:{margin:0,fontSize:13,fontWeight:500,color:y?"#d1d5db":"#374151"},children:t})]}),r&&!s&&jsxRuntime.jsx("div",{style:{padding:"8px 10px",marginBottom:12,borderRadius:8,backgroundColor:y?"rgba(127,29,29,0.3)":"#fef2f2",border:`1px solid ${y?"rgba(254,202,202,0.1)":"rgba(220,38,38,0.1)"}`,color:y?"#fecaca":"#dc2626",fontSize:13,lineHeight:1.4},children:r}),!s&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[e==="feedback"&&jsxRuntime.jsx(Be,{theme:_,placeholder:g,submitText:b,isLoading:i,onSubmit:x,customStyles:l,initialValues:d?{content:d.content,rating:d.rating}:void 0,isEditing:c,showText:u,showRating:p}),e==="vote"&&jsxRuntime.jsx(He,{theme:_,isLoading:i,onSubmit:x,initialVote:d?.vote||void 0,isEditing:c,labels:m}),e==="poll"&&f&&f.length>0&&jsxRuntime.jsx(Fe,{theme:_,options:f,allowMultiple:o,isLoading:i,onSubmit:x,initialSelected:d?.pollSelected||void 0,isEditing:c})]}),jsxRuntime.jsxs("div",{"aria-live":"polite",className:"sr-only",style:{position:"absolute",left:-9999},children:[s&&"Thank you! Your feedback has been submitted.",r&&`Error: ${r}`]})]})}function ut({elementId:e,user:a,mode:l="feedback",showText:n=true,showRating:g=true,experimentId:b,variant:t,voteLabels:i,options:s,allowMultiple:r=false,showResults:d=true,position:c=P.POSITION,size:u=P.SIZE,theme:p=P.THEME,customStyles:m,visible:f=true,showOnHover:o=P.SHOW_ON_HOVER,touchBehavior:x=P.TOUCH_BEHAVIOR,promptText:v,placeholder:I,submitText:C=P.SUBMIT_TEXT,thankYouMessage:h=P.THANK_YOU_MESSAGE,onSubmit:G,onOpen:W,onClose:E,onError:ie}){let{disabled:le,activeModalId:V,openModal:_,closeModal:y}=U(),[ce,K]=react.useState(false),[j,X]=react.useState(false),[z,Q]=react.useState(null),[q,S]=react.useState(false),M=react.useRef(null);react.useEffect(()=>{S(window.innerWidth<640);},[]);let R=V===e;react.useEffect(()=>{if(!o)return;let w=M.current;if(!w)return;let H=w.parentElement;if(!H)return;let we=()=>X(true),Te=()=>X(false);return H.addEventListener("mouseenter",we),H.addEventListener("mouseleave",Te),()=>{H.removeEventListener("mouseenter",we),H.removeEventListener("mouseleave",Te);}},[o]);let{submit:L,isLoading:N,error:B,existingResponse:Ee,isEditing:Z}=Oe({elementId:e,mode:l,experimentId:b,variant:t,pollOptions:s,user:a,onSuccess:w=>{K(true),G?.(w),setTimeout(()=>{y(),K(false);},3e3);},onError:w=>{console.warn("[Gotcha] Submission failed:",w instanceof Error?w.message:w),ie?.(w);}}),Ke=react.useCallback(()=>{M.current&&Q(M.current.getBoundingClientRect()),_(e),W?.();},[e,_,W]),de=react.useCallback(()=>{y(),K(false),E?.();},[y,E]),Re=react.useCallback(w=>{L(w);},[L]);return le||!f?null:jsxRuntime.jsxs("div",{ref:M,style:{...{"top-right":{position:"absolute",top:0,right:0,transform:"translate(50%, -50%)"},"top-left":{position:"absolute",top:0,left:0,transform:"translate(-50%, -50%)"},"bottom-right":{position:"absolute",bottom:0,right:0,transform:"translate(50%, 50%)"},"bottom-left":{position:"absolute",bottom:0,left:0,transform:"translate(-50%, 50%)"},inline:{position:"relative",display:"inline-flex"}}[c],zIndex:R?1e4:"auto"},className:"gotcha-container","data-gotcha-element":e,children:[jsxRuntime.jsx(Ue,{size:u,theme:p,customStyles:m,showOnHover:o,touchBehavior:x,onClick:Ke,isOpen:R,isParentHovered:j}),R&&!q&&jsxRuntime.jsx(ve,{mode:l,theme:p,customStyles:m,promptText:v,placeholder:I,submitText:C,thankYouMessage:Z?"Your feedback has been updated!":h,isLoading:N,isSubmitted:ce,error:B,existingResponse:Ee,isEditing:Z,showText:n,showRating:g,voteLabels:i,options:s,allowMultiple:r,onSubmit:Re,onClose:de,anchorRect:z||void 0}),R&&q&&reactDom.createPortal(jsxRuntime.jsx("div",{style:{position:"fixed",inset:0,zIndex:99999,backgroundColor:"rgba(0, 0, 0, 0.3)"},onClick:de,"aria-hidden":"true",children:jsxRuntime.jsx("div",{onClick:w=>w.stopPropagation(),children:jsxRuntime.jsx(ve,{mode:l,theme:p,customStyles:m,promptText:v,placeholder:I,submitText:C,thankYouMessage:Z?"Your feedback has been updated!":h,isLoading:N,isSubmitted:ce,error:B,existingResponse:Ee,isEditing:Z,showText:n,showRating:g,voteLabels:i,options:s,allowMultiple:r,onSubmit:Re,onClose:de,anchorRect:z||void 0})})}),document.body)]})}function ft(){let{client:e,disabled:a,defaultUser:l,debug:n}=U();return {client:e,disabled:a,defaultUser:l,debug:n,submitFeedback:e.submitResponse.bind(e)}}exports.Gotcha=ut;exports.GotchaProvider=qe;exports.useGotcha=ft;//# sourceMappingURL=index.js.map
11
+ `}),jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"10",stroke:r,strokeWidth:"2",strokeOpacity:"0.12"}),jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"10",stroke:r,strokeWidth:"2",strokeLinecap:"round",style:{animation:"gotcha-dash 1.2s ease-in-out infinite"}})]})}function Je({theme:e,placeholder:r,submitText:s,isLoading:o,onSubmit:b,customStyles:g,initialValues:t,isEditing:u=false,showText:a=true,showRating:n=true,enableBugFlag:l=false,bugFlagLabel:f}){let[i,d]=react.useState(t?.content||""),[y,p]=react.useState(t?.rating??null),[c,I]=react.useState(false),[v,S]=react.useState(false);react.useEffect(()=>{S(D());},[]),react.useEffect(()=>{t?.content!==void 0&&d(t.content||""),t?.rating!==void 0&&p(t.rating??null);},[t?.content,t?.rating]);let h=e==="dark",M=a&&n?i.trim().length>0||y!==null:a?i.trim().length>0:n?y!==null:false,x=m=>{m.preventDefault(),M&&b({content:a&&i.trim()?i.trim():void 0,rating:n&&y!==null?y:void 0,isBug:c||void 0});},R={width:"100%",padding:v?"12px 14px":"10px 12px",border:`1px solid ${h?"rgba(255,255,255,0.08)":"#e2e8f0"}`,borderRadius:8,backgroundColor:h?"rgba(55,65,81,0.5)":"#fafbfc",color:h?"#f9fafb":"#111827",fontSize:v?16:14,resize:"vertical",minHeight:v?100:80,fontFamily:"inherit",outline:"none",transition:"border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1)",lineHeight:1.5,...g?.input},w={width:"100%",padding:v?"14px 16px":"10px 16px",border:"none",borderRadius:8,backgroundColor:h?"#e2e8f0":"#1e293b",color:h?"#1e293b":"#ffffff",fontSize:v?16:14,fontWeight:500,cursor:o?"not-allowed":"pointer",transition:"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)",letterSpacing:"0.01em",...g?.submitButton};return jsxRuntime.jsxs("form",{onSubmit:x,children:[n&&jsxRuntime.jsx("div",{style:{marginBottom:a?v?16:12:0,...a?{}:{display:"flex",justifyContent:"center",padding:"8px 0"}},children:jsxRuntime.jsx(vt,{value:y,onChange:p,isDark:h,isTouch:v,large:!a})}),a&&jsxRuntime.jsx("textarea",{value:i,onChange:m=>d(m.target.value),placeholder:r||"Share your thoughts...",style:R,disabled:o,"aria-label":"Your feedback",onFocus:m=>{m.currentTarget.style.borderColor="#1e293b",m.currentTarget.style.boxShadow="0 0 0 2px rgba(30,41,59,0.15)",m.currentTarget.style.backgroundColor=h?"rgba(55,65,81,0.7)":"#ffffff";},onBlur:m=>{m.currentTarget.style.borderColor=h?"rgba(255,255,255,0.08)":"#e2e8f0",m.currentTarget.style.boxShadow="none",m.currentTarget.style.backgroundColor=h?"rgba(55,65,81,0.5)":"#fafbfc";}}),l&&jsxRuntime.jsxs("button",{type:"button",onClick:()=>I(!c),style:{display:"flex",alignItems:"center",gap:7,width:"100%",marginTop:10,padding:"7px 10px",border:`1px solid ${c?h?"rgba(245,158,11,0.3)":"rgba(217,119,6,0.25)":h?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)"}`,borderRadius:7,backgroundColor:c?h?"rgba(245,158,11,0.08)":"rgba(251,191,36,0.08)":"transparent",cursor:"pointer",transition:"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)"},onMouseEnter:m=>{c||(m.currentTarget.style.backgroundColor=h?"rgba(255,255,255,0.03)":"rgba(0,0,0,0.02)");},onMouseLeave:m=>{c||(m.currentTarget.style.backgroundColor="transparent");},children:[jsxRuntime.jsx("svg",{width:14,height:14,viewBox:"0 0 24 24",fill:"none",stroke:c?h?"#fbbf24":"#d97706":h?"#6b7280":"#9ca3af",strokeWidth:1.75,strokeLinecap:"round",strokeLinejoin:"round",style:{flexShrink:0,transition:"stroke 0.2s"},children:jsxRuntime.jsx("path",{d:"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"})}),jsxRuntime.jsx("span",{style:{fontSize:12,fontWeight:c?500:400,color:c?h?"#fbbf24":"#b45309":h?"#6b7280":"#9ca3af",transition:"color 0.2s",letterSpacing:"0.01em"},children:c?"Issue reported":f||"Report an issue"}),jsxRuntime.jsx("div",{style:{marginLeft:"auto",width:28,height:16,borderRadius:8,backgroundColor:c?h?"#f59e0b":"#d97706":h?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.08)",position:"relative",transition:"background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1)",flexShrink:0},children:jsxRuntime.jsx("div",{style:{position:"absolute",top:2,left:c?14:2,width:12,height:12,borderRadius:"50%",backgroundColor:c?"#ffffff":h?"#4b5563":"#d1d5db",transition:"left 0.2s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.2s",boxShadow:"0 1px 2px rgba(0,0,0,0.15)"}})})]}),jsxRuntime.jsxs("button",{type:"submit",disabled:o||!M,style:{...w,marginTop:12,opacity:o?.8:1,backgroundColor:M?h?"#e2e8f0":"#1e293b":h?"#374151":"#e2e8f0",color:M?h?"#1e293b":"#ffffff":h?"#6b7280":"#94a3b8",display:"flex",alignItems:"center",justifyContent:"center",gap:8},onMouseEnter:m=>{m.currentTarget.disabled||(m.currentTarget.style.backgroundColor=h?"#cbd5e1":"#334155");},onMouseLeave:m=>{m.currentTarget.disabled||(m.currentTarget.style.backgroundColor=h?"#e2e8f0":"#1e293b");},children:[o&&jsxRuntime.jsx(_,{size:v?18:16,color:h?"#1e293b":"#ffffff"}),o?u?"Updating...":"Submitting...":u?"Update":s]})]})}function vt({value:e,onChange:r,isDark:s,isTouch:o,large:b=false}){let[g,t]=react.useState(null),u=b?o?36:28:o?28:18,a=b?o?8:5:o?6:3;return jsxRuntime.jsx("div",{style:{display:"flex",gap:b?o?8:6:o?6:2},role:"group","aria-label":"Rating",children:[1,2,3,4,5].map(n=>{let l=(g??e??0)>=n;return jsxRuntime.jsx("button",{type:"button",onClick:()=>r(n),onMouseEnter:()=>t(n),onMouseLeave:()=>t(null),"aria-label":`Rate ${n} out of 5`,"aria-pressed":e===n,style:{background:"none",border:"none",cursor:"pointer",padding:a,color:l?"#f59e0b":s?"rgba(255,255,255,0.12)":"#e2e8f0",transition:"color 0.15s cubic-bezier(0.4, 0, 0.2, 1), transform 0.15s cubic-bezier(0.4, 0, 0.2, 1)",transform:g!==null&&g>=n?"scale(1.1)":"scale(1)"},children:jsxRuntime.jsx("svg",{width:u,height:u,viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"})})},n)})})}function et({theme:e,isLoading:r,onSubmit:s,initialVote:o,isEditing:b=false,labels:g}){let[t,u]=react.useState(false),[a,n]=react.useState(o||null),[l,f]=react.useState(o||null);react.useEffect(()=>{u(D());},[]),react.useEffect(()=>{o!==void 0&&(f(o),n(o));},[o]),react.useEffect(()=>{!r&&!b&&n(null);},[r,b]);let i=c=>{n(c),s({vote:c});},d=e==="dark",y=c=>{let I=l===c;return {flex:1,minWidth:0,overflow:"hidden",padding:t?"14px 18px":"10px 14px",border:`1px solid ${I?c==="up"?d?"rgba(16,185,129,0.3)":"rgba(16,185,129,0.25)":d?"rgba(239,68,68,0.3)":"rgba(239,68,68,0.25)":d?"rgba(255,255,255,0.08)":"#e2e8f0"}`,borderRadius:t?10:8,backgroundColor:I?c==="up"?d?"rgba(16,185,129,0.08)":"rgba(16,185,129,0.06)":d?"rgba(239,68,68,0.08)":"rgba(239,68,68,0.06)":d?"rgba(55,65,81,0.5)":"#fafbfc",color:I?c==="up"?"#10b981":"#ef4444":d?"#d1d5db":"#64748b",fontSize:t?28:24,cursor:r?"not-allowed":"pointer",transition:"background-color 0.2s, border-color 0.2s, color 0.2s, transform 0.2s, box-shadow 0.2s",display:"flex",alignItems:"center",justifyContent:"center",gap:t?10:8}},p=t?24:20;return jsxRuntime.jsxs("div",{style:{display:"flex",gap:t?12:10},role:"group","aria-label":"Vote",children:[jsxRuntime.jsx("button",{type:"button",onClick:()=>i("up"),disabled:r,style:y("up"),"aria-label":"Vote up - I like this","aria-pressed":l==="up",onMouseEnter:c=>{r||(c.currentTarget.style.transform="translateY(-1px)",c.currentTarget.style.boxShadow="0 2px 8px rgba(0,0,0,0.06)");},onMouseLeave:c=>{c.currentTarget.style.transform="translateY(0)",c.currentTarget.style.boxShadow="none";},children:r&&a==="up"?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(_,{size:p,color:d?"#f9fafb":"#111827"}),jsxRuntime.jsx("span",{style:{fontSize:t?15:13,fontWeight:500,letterSpacing:"0.01em"},children:b?"Updating...":"Sending..."})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(kt,{size:p}),jsxRuntime.jsx("span",{style:{fontSize:t?15:13,fontWeight:500,letterSpacing:"0.01em"},children:g?.up||(l==="up"?"Liked":"Like")})]})}),jsxRuntime.jsx("button",{type:"button",onClick:()=>i("down"),disabled:r,style:y("down"),"aria-label":"Vote down - I don't like this","aria-pressed":l==="down",onMouseEnter:c=>{r||(c.currentTarget.style.transform="translateY(-1px)",c.currentTarget.style.boxShadow="0 2px 8px rgba(0,0,0,0.06)");},onMouseLeave:c=>{c.currentTarget.style.transform="translateY(0)",c.currentTarget.style.boxShadow="none";},children:r&&a==="down"?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(_,{size:p,color:d?"#f9fafb":"#111827"}),jsxRuntime.jsx("span",{style:{fontSize:t?15:13,fontWeight:500,letterSpacing:"0.01em"},children:b?"Updating...":"Sending..."})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(wt,{size:p}),jsxRuntime.jsx("span",{style:{fontSize:t?15:13,fontWeight:500,letterSpacing:"0.01em"},children:g?.down||(l==="down"?"Disliked":"Dislike")})]})})]})}function kt({size:e=24}){return jsxRuntime.jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.75",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"})})}function wt({size:e=24}){return jsxRuntime.jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.75",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"})})}function nt({theme:e,options:r,allowMultiple:s,isLoading:o,onSubmit:b,initialSelected:g,isEditing:t=false}){let[u,a]=react.useState(g||[]),[n,l]=react.useState(false);react.useEffect(()=>{l(D());},[]),react.useEffect(()=>{g&&a(g);},[g]);let f=e==="dark",i=p=>{a(s?c=>c.includes(p)?c.filter(I=>I!==p):[...c,p]:c=>c.includes(p)?[]:[p]);},d=()=>{u.length!==0&&b({pollSelected:u});},y=p=>{let c=u.includes(p);return {width:"100%",padding:n?"12px 14px":"9px 12px",border:`1px solid ${c?f?"rgba(226,232,240,0.25)":"rgba(30,41,59,0.25)":f?"rgba(255,255,255,0.08)":"#e2e8f0"}`,borderRadius:n?10:8,backgroundColor:c?f?"rgba(226,232,240,0.08)":"rgba(30,41,59,0.05)":f?"rgba(55,65,81,0.5)":"#fafbfc",color:c?f?"#e2e8f0":"#1e293b":f?"#d1d5db":"#374151",fontSize:n?15:13,fontWeight:500,cursor:o?"not-allowed":"pointer",transition:"background-color 0.2s, border-color 0.2s, color 0.2s",textAlign:"left",letterSpacing:"0.01em",display:"flex",alignItems:"center",gap:8}};return jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:{display:"flex",flexDirection:"column",gap:n?8:6},role:"group","aria-label":s?"Select one or more options":"Select an option",children:r.map(p=>{let c=u.includes(p);return jsxRuntime.jsxs("button",{type:"button",onClick:()=>i(p),disabled:o,style:y(p),"aria-pressed":c,children:[jsxRuntime.jsx("span",{style:{width:16,height:16,borderRadius:s?4:"50%",border:`2px solid ${c?f?"#e2e8f0":"#1e293b":f?"rgba(255,255,255,0.2)":"#cbd5e1"}`,backgroundColor:c?f?"#e2e8f0":"#1e293b":"transparent",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0,transition:"all 0.15s"},children:c&&jsxRuntime.jsx("svg",{width:10,height:10,viewBox:"0 0 12 12",fill:"none",children:jsxRuntime.jsx("path",{d:"M2 6l3 3 5-5",stroke:"#fff",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}),p]},p)})}),jsxRuntime.jsxs("button",{type:"button",onClick:d,disabled:o||u.length===0,style:{width:"100%",marginTop:12,padding:n?"14px 16px":"10px 16px",border:"none",borderRadius:8,backgroundColor:u.length===0?f?"#374151":"#e2e8f0":f?"#e2e8f0":"#1e293b",color:u.length===0?f?"#6b7280":"#94a3b8":f?"#1e293b":"#ffffff",fontSize:n?16:14,fontWeight:500,cursor:o||u.length===0?"not-allowed":"pointer",transition:"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)",letterSpacing:"0.01em",display:"flex",alignItems:"center",justifyContent:"center",gap:8,opacity:o?.8:1},onMouseEnter:p=>{p.currentTarget.disabled||(p.currentTarget.style.backgroundColor=f?"#cbd5e1":"#334155");},onMouseLeave:p=>{p.currentTarget.disabled||(p.currentTarget.style.backgroundColor=u.length===0?f?"#374151":"#e2e8f0":f?"#e2e8f0":"#1e293b");},children:[o&&jsxRuntime.jsx(_,{size:n?18:16,color:f?"#1e293b":"#ffffff"}),o?t?"Updating...":"Submitting...":t?"Update":"Submit"]})]})}var Et=["#ef4444","#f05540","#f1663c","#f27738","#f38834","#f59e0b","#d4a30e","#b3a812","#79b841","#45c870","#10b981"];function st({theme:e,submitText:r,isLoading:s,onSubmit:o,customStyles:b,showFollowUp:g=true,followUpPlaceholder:t,lowLabel:u="Not likely",highLabel:a="Very likely",initialValues:n,isEditing:l=false}){let[f,i]=react.useState(n?.rating??null),[d,y]=react.useState(n?.content||""),[p,c]=react.useState(false),[I,v]=react.useState(null);react.useEffect(()=>{c(D());},[]),react.useEffect(()=>{n?.rating!==void 0&&i(n.rating??null),n?.content!==void 0&&y(n.content||"");},[n?.rating,n?.content]);let S=e==="dark",h=f!==null;return jsxRuntime.jsxs("form",{onSubmit:x=>{x.preventDefault(),h&&o({rating:f??void 0,content:g&&d.trim()?d.trim():void 0});},children:[jsxRuntime.jsxs("div",{style:{marginBottom:g&&f!==null?p?14:12:0},children:[jsxRuntime.jsx("div",{style:{display:"flex",gap:p?8:6,justifyContent:"center"},role:"group","aria-label":"NPS Score",children:Array.from({length:11},(x,R)=>{let w=f===R,m=I===R,k=Et[R];return jsxRuntime.jsx("button",{type:"button",onClick:()=>i(R),onMouseEnter:()=>v(R),onMouseLeave:()=>v(null),"aria-label":`Score ${R} out of 10`,"aria-pressed":w,style:{flex:1,height:p?36:32,borderRadius:8,border:w?`2px solid ${k}`:`1.5px solid ${S?`${k}30`:`${k}25`}`,backgroundColor:w?k:m?S?`${k}30`:`${k}18`:S?`${k}15`:`${k}0c`,color:w?"#fff":m?k:S?`${k}cc`:`${k}bb`,fontSize:p?13:12,fontWeight:w?700:600,fontFamily:"inherit",cursor:"pointer",padding:0,display:"flex",alignItems:"center",justifyContent:"center",transition:"all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1)",transform:w?"scale(1.08)":m?"scale(1.04)":"scale(1)",boxShadow:w?`0 2px 8px ${k}40`:"none",flexShrink:0},children:R},R)})}),jsxRuntime.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginTop:10,padding:"0 2px"},children:[jsxRuntime.jsx("span",{style:{fontSize:10,color:S?"rgba(255,255,255,0.3)":"rgba(0,0,0,0.3)",fontWeight:500},children:u}),jsxRuntime.jsx("span",{style:{fontSize:10,color:S?"rgba(255,255,255,0.3)":"rgba(0,0,0,0.3)",fontWeight:500},children:a})]})]}),g&&f!==null&&jsxRuntime.jsx("textarea",{value:d,onChange:x=>y(x.target.value),placeholder:t||"What's the main reason for your score?",style:{width:"100%",padding:p?"12px 14px":"10px 12px",border:`1px solid ${S?"rgba(255,255,255,0.08)":"#e2e8f0"}`,borderRadius:8,backgroundColor:S?"rgba(55,65,81,0.5)":"#fafbfc",color:S?"#f9fafb":"#111827",fontSize:p?16:14,resize:"vertical",minHeight:p?80:60,fontFamily:"inherit",outline:"none",transition:"border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1)",lineHeight:1.5,...b?.input},disabled:s,"aria-label":"Follow-up feedback",onFocus:x=>{x.currentTarget.style.borderColor=S?"rgba(255,255,255,0.2)":"#94a3b8",x.currentTarget.style.boxShadow=`0 0 0 2px ${S?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)"}`,x.currentTarget.style.backgroundColor=S?"rgba(55,65,81,0.7)":"#ffffff";},onBlur:x=>{x.currentTarget.style.borderColor=S?"rgba(255,255,255,0.08)":"#e2e8f0",x.currentTarget.style.boxShadow="none",x.currentTarget.style.backgroundColor=S?"rgba(55,65,81,0.5)":"#fafbfc";}}),jsxRuntime.jsxs("button",{type:"submit",disabled:s||!h,style:{width:"100%",padding:p?"14px 16px":"10px 16px",border:"none",borderRadius:8,backgroundColor:h?S?"#e2e8f0":"#1e293b":S?"#374151":"#e2e8f0",color:h?S?"#1e293b":"#ffffff":S?"#6b7280":"#94a3b8",fontSize:p?16:14,fontWeight:500,cursor:s?"not-allowed":"pointer",transition:"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)",letterSpacing:"0.01em",opacity:s?.8:1,display:"flex",alignItems:"center",justifyContent:"center",gap:8,marginTop:12,...b?.submitButton},onMouseEnter:x=>{x.currentTarget.disabled||(x.currentTarget.style.backgroundColor=S?"#cbd5e1":"#334155");},onMouseLeave:x=>{x.currentTarget.disabled||(x.currentTarget.style.backgroundColor=S?"#e2e8f0":"#1e293b");},children:[s&&jsxRuntime.jsx(_,{size:p?18:16,color:S?"#1e293b":"#ffffff"}),s?l?"Updating...":"Submitting...":l?"Update":r]})]})}function Le({mode:e,theme:r,customStyles:s,promptText:o,placeholder:b,submitText:g,thankYouMessage:t,isLoading:u,isSubmitted:a,error:n,existingResponse:l,isEditing:f=false,showText:i=true,showRating:d=true,voteLabels:y,options:p,allowMultiple:c=false,npsQuestion:I,npsFollowUp:v=true,npsFollowUpPlaceholder:S,npsLowLabel:h,npsHighLabel:M,enableBugFlag:x=false,bugFlagLabel:R,onSubmit:w,onClose:m,anchorRect:k}){let U=react.useRef(null),q=react.useRef(null),[W,xe]=react.useState(false),[A,ve]=react.useState(false),[ie,Y]=react.useState("light");react.useEffect(()=>{ve(window.innerWidth<640);let C=window.matchMedia("(prefers-color-scheme: dark)");Y(C.matches?"dark":"light");let B=O=>Y(O.matches?"dark":"light");return C.addEventListener("change",B),()=>C.removeEventListener("change",B)},[]),react.useEffect(()=>{let C=requestAnimationFrame(()=>xe(true));return ()=>cancelAnimationFrame(C)},[]);let V=r==="auto"?ie:r,E=V==="dark",Z=(k?window.innerHeight-k.bottom:window.innerHeight/2)<280+20;react.useEffect(()=>{let C=U.current;if(!C)return;q.current?.focus();let B=O=>{if(O.key==="Escape"){m();return}if(O.key==="Tab"){let K=C.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),ee=K[0],F=K[K.length-1];O.shiftKey&&document.activeElement===ee?(O.preventDefault(),F?.focus()):!O.shiftKey&&document.activeElement===F&&(O.preventDefault(),ee?.focus());}};return document.addEventListener("keydown",B),()=>document.removeEventListener("keydown",B)},[m]);let ce=e==="vote"?"What do you think?":e==="poll"?"Cast your vote":e==="nps"?I||"How likely are you to recommend us?":"What do you think of this feature?",ue=A?20:16,J=e==="nps"?420:320,de=E?"0 1px 2px rgba(0,0,0,0.2), 0 4px 12px rgba(0,0,0,0.3), 0 12px 32px rgba(0,0,0,0.2)":"0 1px 2px rgba(0,0,0,0.04), 0 4px 12px rgba(0,0,0,0.06), 0 12px 32px rgba(0,0,0,0.06)",j=A?{position:"fixed",left:"50%",top:"50%",width:"calc(100vw - 32px)",maxWidth:J,padding:ue,borderRadius:12,backgroundColor:E?"#1f2937":"#ffffff",color:E?"#f9fafb":"#111827",boxShadow:de,border:`1px solid ${E?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)"}`,zIndex:9999,transition:"opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)",opacity:W?1:0,transform:W?"translate(-50%, -50%) scale(1)":"translate(-50%, -50%) scale(0.96)",...s?.modal,textAlign:"left"}:{position:"absolute",left:"50%",width:J,padding:ue,borderRadius:10,backgroundColor:E?"#1f2937":"#ffffff",color:E?"#f9fafb":"#111827",boxShadow:de,border:`1px solid ${E?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)"}`,zIndex:9999,...Z?{bottom:"100%",marginBottom:8}:{top:"100%",marginTop:8},transition:"opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)",opacity:W?1:0,transform:W?"translateX(-50%) scale(1) translateY(0)":`translateX(-50%) scale(0.96) translateY(${Z?"6px":"-6px"})`,...s?.modal,textAlign:"left"};return jsxRuntime.jsxs("div",{ref:U,role:"dialog","aria-modal":"true","aria-labelledby":"gotcha-modal-title",style:j,className:ge("gotcha-modal",E&&"gotcha-modal--dark"),children:[jsxRuntime.jsx("button",{ref:q,type:"button",onClick:m,"aria-label":"Close feedback form",style:{position:"absolute",top:A?12:8,right:A?12:8,width:A?36:28,height:A?36:28,border:"none",background:"transparent",cursor:"pointer",color:E?"#6b7280":"#9ca3af",display:"flex",alignItems:"center",justifyContent:"center",borderRadius:6,transition:"all 0.15s cubic-bezier(0.4, 0, 0.2, 1)"},onMouseEnter:C=>{C.currentTarget.style.backgroundColor=E?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.04)",C.currentTarget.style.color=E?"#9ca3af":"#6b7280";},onMouseLeave:C=>{C.currentTarget.style.backgroundColor="transparent",C.currentTarget.style.color=E?"#6b7280":"#9ca3af";},children:jsxRuntime.jsx("svg",{width:A?16:12,height:A?16:12,viewBox:"0 0 14 14",fill:"none",children:jsxRuntime.jsx("path",{d:"M1 1L13 13M1 13L13 1",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}),jsxRuntime.jsx("h2",{id:"gotcha-modal-title",style:{margin:"0 0 16px 0",fontSize:A?16:14,fontWeight:600,paddingRight:A?40:32,letterSpacing:"-0.01em",lineHeight:1.4,textAlign:"left"},children:o||ce}),a&&jsxRuntime.jsxs("div",{style:{textAlign:"center",padding:"24px 0",color:E?"#10b981":"#059669"},children:[jsxRuntime.jsx("div",{style:{width:44,height:44,borderRadius:"50%",backgroundColor:E?"rgba(16,185,129,0.1)":"rgba(5,150,105,0.08)",display:"flex",alignItems:"center",justifyContent:"center",margin:"0 auto 12px"},children:jsxRuntime.jsx("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",children:jsxRuntime.jsx("path",{d:"M20 6L9 17L4 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}),jsxRuntime.jsx("p",{style:{margin:0,fontSize:13,fontWeight:500,color:E?"#d1d5db":"#374151"},children:t})]}),n&&!a&&jsxRuntime.jsx("div",{style:{padding:"8px 10px",marginBottom:12,borderRadius:8,backgroundColor:E?"rgba(127,29,29,0.3)":"#fef2f2",border:`1px solid ${E?"rgba(254,202,202,0.1)":"rgba(220,38,38,0.1)"}`,color:E?"#fecaca":"#dc2626",fontSize:13,lineHeight:1.4},children:n}),!a&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[e==="feedback"&&jsxRuntime.jsx(Je,{theme:V,placeholder:b,submitText:g,isLoading:u,onSubmit:w,customStyles:s,initialValues:l?{content:l.content,rating:l.rating}:void 0,isEditing:f,showText:i,showRating:d,enableBugFlag:x,bugFlagLabel:R}),e==="vote"&&jsxRuntime.jsx(et,{theme:V,isLoading:u,onSubmit:w,initialVote:l?.vote||void 0,isEditing:f,labels:y}),e==="nps"&&jsxRuntime.jsx(st,{theme:V,submitText:g,isLoading:u,onSubmit:w,showFollowUp:v,followUpPlaceholder:S,lowLabel:h,highLabel:M,customStyles:s,initialValues:l?{rating:l.rating,content:l.content}:void 0,isEditing:f}),e==="poll"&&p&&p.length>0&&jsxRuntime.jsx(nt,{theme:V,options:p,allowMultiple:c,isLoading:u,onSubmit:w,initialSelected:l?.pollSelected||void 0,isEditing:f})]}),jsxRuntime.jsxs("div",{"aria-live":"polite",className:"sr-only",style:{position:"absolute",left:-9999},children:[a&&"Thank you! Your feedback has been submitted.",n&&`Error: ${n}`]})]})}function Mt({elementId:e,user:r,mode:s="feedback",showText:o=true,showRating:b=true,voteLabels:g,options:t,allowMultiple:u=false,npsQuestion:a,npsFollowUp:n=true,npsFollowUpPlaceholder:l,npsLowLabel:f,npsHighLabel:i,enableBugFlag:d=false,bugFlagLabel:y,onePerUser:p=false,position:c=N.POSITION,size:I=N.SIZE,theme:v=N.THEME,customStyles:S,visible:h=true,showOnHover:M=N.SHOW_ON_HOVER,touchBehavior:x=N.TOUCH_BEHAVIOR,promptText:R,placeholder:w,submitText:m=N.SUBMIT_TEXT,thankYouMessage:k=N.THANK_YOU_MESSAGE,onSubmit:U,onOpen:q,onClose:W,onError:xe}){let{disabled:A,activeModalId:ve,openModal:ie,closeModal:Y,client:V}=H(),[E,le]=react.useState(false),[Oe,Z]=react.useState(false),[ce,ue]=react.useState(null),[J,de]=react.useState(false),j=react.useRef(null);react.useEffect(()=>{de(window.innerWidth<640);},[]);let C=ve===e;react.useEffect(()=>{if(!M)return;let G=j.current;if(!G)return;let te=G.parentElement;if(!te)return;let $e=()=>Z(true),Be=()=>Z(false);return te.addEventListener("mouseenter",$e),te.addEventListener("mouseleave",Be),()=>{te.removeEventListener("mouseenter",$e),te.removeEventListener("mouseleave",Be);}},[M]);let{submit:B,isLoading:O,error:K,existingResponse:ee,isEditing:F}=je({elementId:e,mode:s,pollOptions:t,user:r,onSuccess:G=>{le(true),U?.(G),setTimeout(()=>{Y(),le(false);},1500);},onError:G=>{console.warn("[Gotcha] Submission failed:",G instanceof Error?G.message:G),xe?.(G);}}),ct=react.useCallback(()=>{j.current&&ue(j.current.getBoundingClientRect()),ie(e),q?.();},[e,ie,q]),ke=react.useCallback(()=>{Y(),le(false),W?.();},[Y,W]),De=react.useCallback(G=>{B(G);},[B]),_e=F?"Update":m;return A||!h?null:jsxRuntime.jsxs("div",{ref:j,style:{...{"top-right":{position:"absolute",top:0,right:0,transform:"translate(50%, -50%)"},"top-left":{position:"absolute",top:0,left:0,transform:"translate(-50%, -50%)"},"bottom-right":{position:"absolute",bottom:0,right:0,transform:"translate(50%, 50%)"},"bottom-left":{position:"absolute",bottom:0,left:0,transform:"translate(-50%, 50%)"},inline:{position:"relative",display:"inline-flex"}}[c],zIndex:C?1e4:"auto"},className:"gotcha-container","data-gotcha-element":e,children:[jsxRuntime.jsx(qe,{size:I,theme:v,customStyles:S,showOnHover:M,touchBehavior:x,onClick:ct,isOpen:C,isParentHovered:Oe}),C&&!J&&jsxRuntime.jsx(Le,{mode:s,theme:v,customStyles:S,promptText:R,placeholder:w,submitText:_e,thankYouMessage:F?"Your feedback has been updated!":k,isLoading:O,isSubmitted:E,error:K,existingResponse:ee,isEditing:F,showText:o,showRating:b,voteLabels:g,options:t,allowMultiple:u,npsQuestion:a,npsFollowUp:n,npsFollowUpPlaceholder:l,npsLowLabel:f,npsHighLabel:i,enableBugFlag:d,bugFlagLabel:y,onSubmit:De,onClose:ke,anchorRect:ce||void 0}),C&&J&&reactDom.createPortal(jsxRuntime.jsx("div",{style:{position:"fixed",inset:0,zIndex:99999,backgroundColor:"rgba(0, 0, 0, 0.3)"},onClick:ke,children:jsxRuntime.jsx("div",{onClick:G=>G.stopPropagation(),children:jsxRuntime.jsx(Le,{mode:s,theme:v,customStyles:S,promptText:R,placeholder:w,submitText:_e,thankYouMessage:F?"Your feedback has been updated!":k,isLoading:O,isSubmitted:E,error:K,existingResponse:ee,isEditing:F,showText:o,showRating:b,voteLabels:g,options:t,allowMultiple:u,npsQuestion:a,npsFollowUp:n,npsFollowUpPlaceholder:l,npsLowLabel:f,npsHighLabel:i,enableBugFlag:d,bugFlagLabel:y,onSubmit:De,onClose:ke,anchorRect:ce||void 0})})}),document.body)]})}function lt({elementId:e,refreshInterval:r}){let{client:s}=H(),[o,b]=react.useState(null),[g,t]=react.useState(true),[u,a]=react.useState(null);return react.useEffect(()=>{let n=false,l=async()=>{try{let i=await s.getScore(e);n||(b(i),a(null));}catch(i){n||a(i instanceof Error?i.message:"Failed to load score");}finally{n||t(false);}};l();let f;return r&&r>0&&(f=setInterval(l,r)),()=>{n=true,f&&clearInterval(f);}},[s,e,r]),{score:o,isLoading:g,error:u}}var Lt={sm:{fontSize:11,ratingFontSize:13,starSize:13,gap:5,pillPx:8,pillPy:4,barHeight:3,iconSize:12},md:{fontSize:12.5,ratingFontSize:15,starSize:15,gap:6,pillPx:10,pillPy:5,barHeight:4,iconSize:14},lg:{fontSize:14,ratingFontSize:18,starSize:18,gap:8,pillPx:12,pillPy:6,barHeight:5,iconSize:16}};function At(e,r){return e==="auto"?r:e}function Ut({rating:e,size:r,filledColor:s,emptyColor:o}){let b=`gotcha-star-clip-${Math.random().toString(36).slice(2,8)}`,g=[];for(let t=1;t<=5;t++){let u=Math.min(1,Math.max(0,e-(t-1))),a=`${b}-${t}`;g.push(jsxRuntime.jsxs("svg",{width:r,height:r,viewBox:"0 0 24 24",style:{display:"block"},children:[jsxRuntime.jsx("defs",{children:jsxRuntime.jsx("clipPath",{id:a,children:jsxRuntime.jsx("rect",{x:"0",y:"0",width:24*u,height:"24"})})}),jsxRuntime.jsx("path",{d:"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z",fill:o}),jsxRuntime.jsx("path",{d:"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z",fill:s,clipPath:`url(#${a})`})]},t));}return jsxRuntime.jsx("span",{style:{display:"inline-flex",gap:Math.max(1,r*.08),alignItems:"center"},children:g})}function Ot({rate:e,height:r,filledColor:s,trackColor:o}){return jsxRuntime.jsx("span",{style:{display:"inline-block",width:48,height:r,borderRadius:r,backgroundColor:o,overflow:"hidden",verticalAlign:"middle"},children:jsxRuntime.jsx("span",{style:{display:"block",width:`${e}%`,height:"100%",borderRadius:r,background:s,transition:"width 0.6s cubic-bezier(0.4, 0, 0.2, 1)"}})})}function Dt({size:e,color:r}){return jsxRuntime.jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:r,style:{display:"block"},children:jsxRuntime.jsx("path",{d:"M2 20h2c.55 0 1-.45 1-1v-9c0-.55-.45-1-1-1H2v11zm19.83-7.12c.11-.25.17-.52.17-.8V11c0-1.1-.9-2-2-2h-5.5l.92-4.65c.05-.22.02-.46-.08-.66a4.8 4.8 0 00-.88-1.12L14 2 7.59 8.41C7.21 8.79 7 9.3 7 9.83v7.84C7 18.95 8.05 20 9.34 20h8.11c.7 0 1.36-.37 1.72-.97l2.66-6.15z"})})}function _t({elementId:e,variant:r="stars",showCount:s=true,size:o="md",theme:b="auto",refreshInterval:g,style:t}){let{score:u,isLoading:a}=lt({elementId:e,refreshInterval:g}),[n,l]=react.useState("light");if(react.useEffect(()=>{if(typeof window>"u")return;let m=window.matchMedia("(prefers-color-scheme: dark)");l(m.matches?"dark":"light");let k=U=>l(U.matches?"dark":"light");return m.addEventListener("change",k),()=>m.removeEventListener("change",k)},[]),a||!u)return null;let i=At(b,n)==="dark",d=Lt[o],y=i?"#f3f4f6":"#000000",p="#9ca3af",c=i?"#facc15":"#eab308",I=i?"#374151":"#e5e7eb",v=i?"#6ee7b7":"#16a34a",S=i?"#374151":"#e5e7eb",h={display:"inline-flex",alignItems:"center",gap:d.gap,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',lineHeight:1,letterSpacing:"-0.01em",WebkitFontSmoothing:"antialiased",...t},M=(m,k)=>{let U=m===1?k:`${k}s`;return `${m.toLocaleString()} ${U}`};if(r==="votes"){let{voteCount:m,positiveRate:k}=u,U=m.up+m.down;return U===0?null:jsxRuntime.jsxs("span",{style:h,children:[jsxRuntime.jsx(Dt,{size:d.iconSize,color:v}),jsxRuntime.jsxs("span",{style:{fontSize:d.ratingFontSize,fontWeight:600,color:v,fontVariantNumeric:"tabular-nums"},children:[k,"%"]}),jsxRuntime.jsx(Ot,{rate:k??0,height:d.barHeight,filledColor:v,trackColor:S}),s&&jsxRuntime.jsx("span",{style:{fontSize:d.fontSize,color:p,fontWeight:400},children:M(U,"vote")})]})}let{averageRating:x,totalResponses:R}=u;if(x===null||R===0)return null;let w=x.toFixed(1);return r==="compact"?jsxRuntime.jsxs("span",{style:h,children:[jsxRuntime.jsx("svg",{width:d.starSize,height:d.starSize,viewBox:"0 0 24 24",style:{display:"block",flexShrink:0},children:jsxRuntime.jsx("path",{d:"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z",fill:c})}),jsxRuntime.jsx("span",{style:{fontSize:d.ratingFontSize,fontWeight:700,color:y,fontVariantNumeric:"tabular-nums"},children:w}),s&&jsxRuntime.jsxs("span",{style:{fontSize:d.fontSize,color:p,fontWeight:400},children:["(",R.toLocaleString(),")"]})]}):r==="number"?jsxRuntime.jsxs("span",{style:h,children:[jsxRuntime.jsx("span",{style:{fontSize:d.ratingFontSize,fontWeight:700,color:y,fontVariantNumeric:"tabular-nums"},children:w}),jsxRuntime.jsx("span",{style:{fontSize:d.fontSize,color:p,fontWeight:400},children:"/ 5"}),s&&jsxRuntime.jsxs("span",{style:{fontSize:d.fontSize,color:p,fontWeight:400,marginLeft:2},children:["(",M(R,"response"),")"]})]}):jsxRuntime.jsxs("span",{style:h,children:[jsxRuntime.jsx(Ut,{rating:x,size:d.starSize,filledColor:c,emptyColor:I}),jsxRuntime.jsx("span",{style:{fontSize:d.ratingFontSize,fontWeight:700,color:y,fontVariantNumeric:"tabular-nums"},children:w}),s&&jsxRuntime.jsxs("span",{style:{fontSize:d.fontSize,color:p,fontWeight:400},children:["(",M(R,"response"),")"]})]})}function $t(){let{client:e,disabled:r,defaultUser:s,debug:o}=H();return {client:e,disabled:r,defaultUser:s,debug:o,submitFeedback:e.submitResponse.bind(e)}}exports.Gotcha=Mt;exports.GotchaProvider=pt;exports.GotchaScore=_t;exports.useGotcha=$t;//# sourceMappingURL=index.js.map
12
12
  //# sourceMappingURL=index.js.map