@pxlabz/tracey-react 0.0.1
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 +83 -0
- package/dist/LauncherTrigger-5pNAvA05.js +1056 -0
- package/dist/LauncherTrigger-5pNAvA05.js.map +1 -0
- package/dist/LauncherTrigger-DjXDXHTm.cjs +1055 -0
- package/dist/LauncherTrigger-DjXDXHTm.cjs.map +1 -0
- package/dist/__tests__/api-client.test.d.ts +2 -0
- package/dist/__tests__/api-client.test.d.ts.map +1 -0
- package/dist/__tests__/events.test.d.ts +2 -0
- package/dist/__tests__/events.test.d.ts.map +1 -0
- package/dist/__tests__/survey-logic.test.d.ts +2 -0
- package/dist/__tests__/survey-logic.test.d.ts.map +1 -0
- package/dist/components/announcements/AnnouncementBell.d.ts +9 -0
- package/dist/components/announcements/AnnouncementBell.d.ts.map +1 -0
- package/dist/components/announcements/AnnouncementList.d.ts +7 -0
- package/dist/components/announcements/AnnouncementList.d.ts.map +1 -0
- package/dist/components/announcements/AnnouncementModal.d.ts +9 -0
- package/dist/components/announcements/AnnouncementModal.d.ts.map +1 -0
- package/dist/components/announcements/headless/AnnouncementClose.d.ts +9 -0
- package/dist/components/announcements/headless/AnnouncementClose.d.ts.map +1 -0
- package/dist/components/announcements/headless/AnnouncementContent.d.ts +7 -0
- package/dist/components/announcements/headless/AnnouncementContent.d.ts.map +1 -0
- package/dist/components/announcements/headless/AnnouncementNavigation.d.ts +15 -0
- package/dist/components/announcements/headless/AnnouncementNavigation.d.ts.map +1 -0
- package/dist/components/announcements/headless/AnnouncementPortal.d.ts +7 -0
- package/dist/components/announcements/headless/AnnouncementPortal.d.ts.map +1 -0
- package/dist/components/announcements/headless/AnnouncementRoot.d.ts +24 -0
- package/dist/components/announcements/headless/AnnouncementRoot.d.ts.map +1 -0
- package/dist/components/announcements/headless/AnnouncementSlidePrimitive.d.ts +14 -0
- package/dist/components/announcements/headless/AnnouncementSlidePrimitive.d.ts.map +1 -0
- package/dist/components/announcements/headless/AnnouncementTrigger.d.ts +9 -0
- package/dist/components/announcements/headless/AnnouncementTrigger.d.ts.map +1 -0
- package/dist/components/announcements/headless/index.d.ts +8 -0
- package/dist/components/announcements/headless/index.d.ts.map +1 -0
- package/dist/components/announcements/index.d.ts +4 -0
- package/dist/components/announcements/index.d.ts.map +1 -0
- package/dist/components/feedback/FeedbackForm.d.ts +8 -0
- package/dist/components/feedback/FeedbackForm.d.ts.map +1 -0
- package/dist/components/feedback/FeedbackWidget.d.ts +9 -0
- package/dist/components/feedback/FeedbackWidget.d.ts.map +1 -0
- package/dist/components/feedback/headless/FeedbackClose.d.ts +9 -0
- package/dist/components/feedback/headless/FeedbackClose.d.ts.map +1 -0
- package/dist/components/feedback/headless/FeedbackContent.d.ts +6 -0
- package/dist/components/feedback/headless/FeedbackContent.d.ts.map +1 -0
- package/dist/components/feedback/headless/FeedbackFormPrimitive.d.ts +28 -0
- package/dist/components/feedback/headless/FeedbackFormPrimitive.d.ts.map +1 -0
- package/dist/components/feedback/headless/FeedbackPortal.d.ts +7 -0
- package/dist/components/feedback/headless/FeedbackPortal.d.ts.map +1 -0
- package/dist/components/feedback/headless/FeedbackRoot.d.ts +16 -0
- package/dist/components/feedback/headless/FeedbackRoot.d.ts.map +1 -0
- package/dist/components/feedback/headless/FeedbackTrigger.d.ts +9 -0
- package/dist/components/feedback/headless/FeedbackTrigger.d.ts.map +1 -0
- package/dist/components/feedback/headless/index.d.ts +7 -0
- package/dist/components/feedback/headless/index.d.ts.map +1 -0
- package/dist/components/feedback/index.d.ts +4 -0
- package/dist/components/feedback/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/launcher/TraceyLauncher.d.ts +8 -0
- package/dist/components/launcher/TraceyLauncher.d.ts.map +1 -0
- package/dist/components/launcher/headless/LauncherBadge.d.ts +8 -0
- package/dist/components/launcher/headless/LauncherBadge.d.ts.map +1 -0
- package/dist/components/launcher/headless/LauncherMenu.d.ts +6 -0
- package/dist/components/launcher/headless/LauncherMenu.d.ts.map +1 -0
- package/dist/components/launcher/headless/LauncherMenuItem.d.ts +9 -0
- package/dist/components/launcher/headless/LauncherMenuItem.d.ts.map +1 -0
- package/dist/components/launcher/headless/LauncherPanel.d.ts +6 -0
- package/dist/components/launcher/headless/LauncherPanel.d.ts.map +1 -0
- package/dist/components/launcher/headless/LauncherPortal.d.ts +7 -0
- package/dist/components/launcher/headless/LauncherPortal.d.ts.map +1 -0
- package/dist/components/launcher/headless/LauncherRoot.d.ts +21 -0
- package/dist/components/launcher/headless/LauncherRoot.d.ts.map +1 -0
- package/dist/components/launcher/headless/LauncherTab.d.ts +8 -0
- package/dist/components/launcher/headless/LauncherTab.d.ts.map +1 -0
- package/dist/components/launcher/headless/LauncherTabContent.d.ts +8 -0
- package/dist/components/launcher/headless/LauncherTabContent.d.ts.map +1 -0
- package/dist/components/launcher/headless/LauncherTrigger.d.ts +10 -0
- package/dist/components/launcher/headless/LauncherTrigger.d.ts.map +1 -0
- package/dist/components/launcher/headless/index.d.ts +10 -0
- package/dist/components/launcher/headless/index.d.ts.map +1 -0
- package/dist/components/launcher/index.d.ts +3 -0
- package/dist/components/launcher/index.d.ts.map +1 -0
- package/dist/components/surveys/SurveyWidget.d.ts +10 -0
- package/dist/components/surveys/SurveyWidget.d.ts.map +1 -0
- package/dist/components/surveys/index.d.ts +2 -0
- package/dist/components/surveys/index.d.ts.map +1 -0
- package/dist/core/api-client.d.ts +33 -0
- package/dist/core/api-client.d.ts.map +1 -0
- package/dist/core/events.d.ts +11 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/screenshot.d.ts +12 -0
- package/dist/core/screenshot.d.ts.map +1 -0
- package/dist/core/survey-logic.d.ts +7 -0
- package/dist/core/survey-logic.d.ts.map +1 -0
- package/dist/headless.cjs +100 -0
- package/dist/headless.cjs.map +1 -0
- package/dist/headless.d.ts +11 -0
- package/dist/headless.d.ts.map +1 -0
- package/dist/headless.js +101 -0
- package/dist/headless.js.map +1 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/useAnnouncements.d.ts +14 -0
- package/dist/hooks/useAnnouncements.d.ts.map +1 -0
- package/dist/hooks/useFeedback.d.ts +10 -0
- package/dist/hooks/useFeedback.d.ts.map +1 -0
- package/dist/hooks/useMyFeedback.d.ts +16 -0
- package/dist/hooks/useMyFeedback.d.ts.map +1 -0
- package/dist/hooks/useSurvey.d.ts +22 -0
- package/dist/hooks/useSurvey.d.ts.map +1 -0
- package/dist/hooks/useTracey.d.ts +3 -0
- package/dist/hooks/useTracey.d.ts.map +1 -0
- package/dist/hooks/useTraceyEvents.d.ts +14 -0
- package/dist/hooks/useTraceyEvents.d.ts.map +1 -0
- package/dist/index.cjs +4913 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4892 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/provider/MockTraceyProvider.d.ts +14 -0
- package/dist/provider/MockTraceyProvider.d.ts.map +1 -0
- package/dist/provider/TraceyProvider.d.ts +11 -0
- package/dist/provider/TraceyProvider.d.ts.map +1 -0
- package/dist/provider/context.d.ts +19 -0
- package/dist/provider/context.d.ts.map +1 -0
- package/dist/provider/index.d.ts +4 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/styles.css +800 -0
- package/dist/types.d.ts +188 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LauncherTrigger-5pNAvA05.js","sources":["../src/provider/context.ts","../src/core/api-client.ts","../src/core/events.ts","../src/provider/TraceyProvider.tsx","../src/provider/MockTraceyProvider.tsx","../src/hooks/useTracey.ts","../src/hooks/useFeedback.ts","../src/hooks/useAnnouncements.ts","../src/hooks/useTraceyEvents.ts","../src/components/feedback/headless/FeedbackRoot.tsx","../src/components/feedback/headless/FeedbackClose.tsx","../src/components/feedback/headless/FeedbackFormPrimitive.tsx","../src/components/feedback/headless/FeedbackContent.tsx","../src/components/feedback/headless/FeedbackPortal.tsx","../src/components/feedback/headless/FeedbackTrigger.tsx","../src/components/announcements/headless/AnnouncementRoot.tsx","../src/components/announcements/headless/AnnouncementClose.tsx","../src/components/announcements/headless/AnnouncementContent.tsx","../src/components/announcements/headless/AnnouncementNavigation.tsx","../src/components/announcements/headless/AnnouncementPortal.tsx","../src/components/launcher/headless/LauncherBadge.tsx","../src/components/launcher/headless/LauncherRoot.tsx","../src/components/launcher/headless/LauncherPanel.tsx","../src/components/launcher/headless/LauncherPortal.tsx","../src/components/launcher/headless/LauncherTab.tsx","../src/components/launcher/headless/LauncherTabContent.tsx","../src/components/launcher/headless/LauncherTrigger.tsx"],"sourcesContent":["import { createContext } from \"react\";\n\nimport type { TraceyApiClient } from \"../core/api-client\";\nimport type { TraceyEventEmitter } from \"../core/events\";\nimport type { TraceyConfig, TraceyUser, Announcement } from \"../types\";\n\nexport interface TraceyContextValue {\n\tconfig: TraceyConfig;\n\tclient: TraceyApiClient;\n\tevents: TraceyEventEmitter;\n\tuser: TraceyUser | null;\n\tisIdentified: boolean;\n\tisLoading: boolean;\n\terror: Error | null;\n\tannouncements: Announcement[];\n\tannouncementsLoading: boolean;\n\trefetchAnnouncements: () => Promise<void>;\n\tunreadCount: number;\n\tsetUnreadCount: (count: number) => void;\n}\n\nexport const TraceyContext = createContext<TraceyContextValue | null>(null);\n","import type {\n\tTraceyConfig,\n\tTraceyUser,\n\tFeedback,\n\tFeedbackResponse,\n\tMyFeedbackItem,\n\tPaginatedResponse,\n\tAnnouncement,\n\tSurvey,\n\tSurveyAnswerInput,\n\tSurveyResponseResult,\n\tApiError,\n} from \"../types\";\n\nexport class TraceyApiClient {\n\t#apiKey: string;\n\t#baseUrl: string;\n\t#customerId: string | null = null;\n\n\tconstructor(config: TraceyConfig) {\n\t\tthis.#apiKey = config.apiKey;\n\t\tthis.#baseUrl = config.baseUrl ?? \"https://api.tracey.dev\";\n\t}\n\n\tsetCustomerId(id: string): void {\n\t\tthis.#customerId = id;\n\t}\n\n\tgetCustomerId(): string | null {\n\t\treturn this.#customerId;\n\t}\n\n\tasync #request<T>(path: string, options: RequestInit = {}): Promise<T> {\n\t\tconst url = `${this.#baseUrl}${path}`;\n\t\tconst headers = new Headers(options.headers);\n\t\theaders.set(\"Authorization\", `Bearer ${this.#apiKey}`);\n\t\theaders.set(\"Content-Type\", \"application/json\");\n\n\t\tconst response = await fetch(url, {\n\t\t\t...options,\n\t\t\theaders,\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst error: ApiError = await response.json().catch(() => ({\n\t\t\t\tmessage: `HTTP ${response.status}: ${response.statusText}`,\n\t\t\t}));\n\t\t\tthrow new Error(error.message);\n\t\t}\n\n\t\treturn response.json() as Promise<T>;\n\t}\n\n\tasync identify(user: TraceyUser): Promise<{ success: boolean }> {\n\t\tconst { userHash, ...userData } = user;\n\t\treturn this.#request(\"/api/sdk/identify\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\t...userData,\n\t\t\t\t...(userHash ? { userHash } : {}),\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync getAnnouncements(\n\t\tfilter: \"unread\" | \"all\" = \"unread\",\n\t): Promise<Announcement[]> {\n\t\tconst params = new URLSearchParams();\n\t\tif (this.#customerId) {\n\t\t\tparams.set(\"customerId\", this.#customerId);\n\t\t}\n\t\tparams.set(\"filter\", filter);\n\t\treturn this.#request(`/api/sdk/announcements?${params.toString()}`);\n\t}\n\n\tasync getUnreadCount(): Promise<{ count: number }> {\n\t\tif (!this.#customerId) {\n\t\t\tthrow new Error(\"Customer ID not set. Call identify first.\");\n\t\t}\n\t\treturn this.#request(\n\t\t\t`/api/sdk/announcements/unread-count?customerId=${encodeURIComponent(this.#customerId)}`,\n\t\t);\n\t}\n\n\tasync trackAnnouncementView(announcementId: number): Promise<void> {\n\t\tif (!this.#customerId) {\n\t\t\tthrow new Error(\"Customer ID not set. Call identify first.\");\n\t\t}\n\t\tawait this.#request(`/api/sdk/announcements/${announcementId}/view`, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({ customerId: this.#customerId }),\n\t\t});\n\t}\n\n\tasync trackAnnouncementCta(announcementId: number): Promise<void> {\n\t\tif (!this.#customerId) {\n\t\t\tthrow new Error(\"Customer ID not set. Call identify first.\");\n\t\t}\n\t\tawait this.#request(`/api/sdk/announcements/${announcementId}/cta`, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({ customerId: this.#customerId }),\n\t\t});\n\t}\n\n\tasync submitFeedback(feedback: Feedback): Promise<FeedbackResponse> {\n\t\treturn this.#request(\"/api/sdk/feedback\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\t...feedback,\n\t\t\t\tcustomerId: this.#customerId ?? undefined,\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync getMyFeedback(params?: {\n\t\tlimit?: number;\n\t\toffset?: number;\n\t}): Promise<PaginatedResponse<MyFeedbackItem>> {\n\t\tif (!this.#customerId) {\n\t\t\tthrow new Error(\"Customer ID not set. Call identify first.\");\n\t\t}\n\t\tconst searchParams = new URLSearchParams();\n\t\tsearchParams.set(\"customerId\", this.#customerId);\n\t\tif (params?.limit !== undefined) {\n\t\t\tsearchParams.set(\"limit\", String(params.limit));\n\t\t}\n\t\tif (params?.offset !== undefined) {\n\t\t\tsearchParams.set(\"offset\", String(params.offset));\n\t\t}\n\t\treturn this.#request(`/api/sdk/feedback/mine?${searchParams.toString()}`);\n\t}\n\n\tasync getActiveSurvey(context?: {\n\t\tanonymousSessionId?: string;\n\t\turl?: string;\n\t}): Promise<Survey | null> {\n\t\tconst params = new URLSearchParams();\n\t\tif (this.#customerId) params.set(\"customerId\", this.#customerId);\n\t\tif (context?.anonymousSessionId) {\n\t\t\tparams.set(\"anonymousSessionId\", context.anonymousSessionId);\n\t\t}\n\t\tif (context?.url) params.set(\"url\", context.url);\n\n\t\tconst query = params.toString();\n\t\tconst response = await this.#request<{ survey: Survey | null }>(\n\t\t\t`/api/sdk/surveys${query ? `?${query}` : \"\"}`,\n\t\t);\n\t\treturn response.survey;\n\t}\n\n\tasync submitSurveyResponse(\n\t\tsurveyId: number,\n\t\tpayload: {\n\t\t\tanswers: SurveyAnswerInput[];\n\t\t\tanonymousSessionId?: string;\n\t\t\trespondentEmail?: string;\n\t\t\trespondentName?: string;\n\t\t\tmetadata?: Record<string, unknown>;\n\t\t},\n\t): Promise<SurveyResponseResult> {\n\t\treturn this.#request(`/api/sdk/surveys/${surveyId}/responses`, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tcustomerId: this.#customerId ?? undefined,\n\t\t\t\tanonymousSessionId: payload.anonymousSessionId,\n\t\t\t\trespondentEmail: payload.respondentEmail,\n\t\t\t\trespondentName: payload.respondentName,\n\t\t\t\tmetadata: payload.metadata,\n\t\t\t\tanswers: payload.answers,\n\t\t\t}),\n\t\t});\n\t}\n}\n","import type { TraceyEvents } from \"../types\";\n\ntype EventCallback<K extends keyof TraceyEvents> = (\n\tdata: TraceyEvents[K],\n) => void;\n\n \ntype AnyCallback = (data: any) => void;\n\nexport class TraceyEventEmitter {\n\t#listeners: Map<keyof TraceyEvents, Set<AnyCallback>> = new Map();\n\n\tsubscribe<K extends keyof TraceyEvents>(\n\t\tevent: K,\n\t\tcallback: EventCallback<K>,\n\t): () => void {\n\t\tif (!this.#listeners.has(event)) {\n\t\t\tthis.#listeners.set(event, new Set());\n\t\t}\n\n\t\tconst listeners = this.#listeners.get(event)!;\n\t\tlisteners.add(callback as AnyCallback);\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tlisteners.delete(callback as AnyCallback);\n\t\t};\n\t}\n\n\tunsubscribe<K extends keyof TraceyEvents>(\n\t\tevent: K,\n\t\tcallback: EventCallback<K>,\n\t): void {\n\t\tconst listeners = this.#listeners.get(event);\n\t\tif (listeners) {\n\t\t\tlisteners.delete(callback as AnyCallback);\n\t\t}\n\t}\n\n\temit<K extends keyof TraceyEvents>(event: K, data: TraceyEvents[K]): void {\n\t\tconst listeners = this.#listeners.get(event);\n\t\tif (listeners) {\n\t\t\tlisteners.forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`Error in event listener for ${event}:`, error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis.#listeners.clear();\n\t}\n}\n","import {\n\tuseEffect,\n\tuseState,\n\tuseCallback,\n\tuseRef,\n\tuseMemo,\n\ttype ReactNode,\n} from \"react\";\n\nimport { TraceyContext, type TraceyContextValue } from \"./context\";\nimport { TraceyApiClient } from \"../core/api-client\";\nimport { TraceyEventEmitter } from \"../core/events\";\nimport type { TraceyConfig, TraceyUser, Announcement } from \"../types\";\n\nconst UNREAD_POLL_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\n\nfunction getUnreadCacheKey(apiKey: string, userId: string): string {\n\treturn `tracey:unread:${apiKey}:${userId}`;\n}\n\nfunction readCachedUnreadCount(apiKey: string, userId: string): number {\n\ttry {\n\t\tconst raw = localStorage.getItem(getUnreadCacheKey(apiKey, userId));\n\t\tif (raw !== null) {\n\t\t\tconst parsed = parseInt(raw, 10);\n\t\t\treturn isNaN(parsed) ? 0 : parsed;\n\t\t}\n\t} catch {\n\t\t// localStorage unavailable\n\t}\n\treturn 0;\n}\n\nfunction writeCachedUnreadCount(\n\tapiKey: string,\n\tuserId: string,\n\tcount: number,\n): void {\n\ttry {\n\t\tlocalStorage.setItem(getUnreadCacheKey(apiKey, userId), String(count));\n\t} catch {\n\t\t// localStorage unavailable\n\t}\n}\n\nexport interface TraceyProviderProps {\n\tapiKey: string;\n\tbaseUrl?: string;\n\tuser: TraceyUser;\n\tchildren: ReactNode;\n\tdebug?: boolean;\n}\n\nexport function TraceyProvider({\n\tapiKey,\n\tbaseUrl,\n\tuser,\n\tchildren,\n\tdebug = false,\n}: TraceyProviderProps) {\n\tconst config: TraceyConfig = useMemo(\n\t\t() => ({ apiKey, baseUrl, debug }),\n\t\t[apiKey, baseUrl, debug],\n\t);\n\n\tconst client = useMemo(() => new TraceyApiClient(config), [config]);\n\tconst events = useMemo(() => new TraceyEventEmitter(), []);\n\n\tconst [isIdentified, setIsIdentified] = useState(false);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst [announcements, setAnnouncements] = useState<Announcement[]>([]);\n\tconst [announcementsLoading, setAnnouncementsLoading] = useState(false);\n\tconst [unreadCount, setUnreadCountState] = useState(() =>\n\t\treadCachedUnreadCount(apiKey, user.id),\n\t);\n\n\tconst unreadCountRef = useRef(unreadCount);\n\n\tconst setUnreadCount = useCallback(\n\t\t(count: number) => {\n\t\t\tconst previousCount = unreadCountRef.current;\n\t\t\tunreadCountRef.current = count;\n\t\t\tsetUnreadCountState(count);\n\t\t\twriteCachedUnreadCount(apiKey, user.id, count);\n\t\t\tif (count !== previousCount) {\n\t\t\t\tevents.emit(\"unread-count-changed\", {\n\t\t\t\t\tcount,\n\t\t\t\t\tpreviousCount,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[apiKey, user.id, events],\n\t);\n\n\t// Fetch unread count from server\n\tconst fetchUnreadCount = useCallback(async () => {\n\t\ttry {\n\t\t\tconst { count } = await client.getUnreadCount();\n\t\t\tsetUnreadCount(count);\n\t\t} catch {\n\t\t\t// Silently fail - cached count remains\n\t\t}\n\t}, [client, setUnreadCount]);\n\n\t// Identify user on mount\n\tuseEffect(() => {\n\t\tlet mounted = true;\n\n\t\tconst identify = async () => {\n\t\t\tsetIsLoading(true);\n\t\t\tsetError(null);\n\n\t\t\ttry {\n\t\t\t\tawait client.identify(user);\n\t\t\t\t// Set customerId for subsequent API calls\n\t\t\t\tclient.setCustomerId(user.id);\n\t\t\t\tif (mounted) {\n\t\t\t\t\tsetIsIdentified(true);\n\t\t\t\t\tevents.emit(\"user:identified\", { user });\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tif (mounted) {\n\t\t\t\t\tconst error =\n\t\t\t\t\t\terr instanceof Error ? err : new Error(\"Failed to identify user\");\n\t\t\t\t\tsetError(error);\n\t\t\t\t\tevents.emit(\"error\", { error, context: \"identify\" });\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (mounted) {\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tidentify();\n\n\t\treturn () => {\n\t\t\tmounted = false;\n\t\t};\n\t}, [client, user, events]);\n\n\t// Fetch announcements after identification\n\tconst fetchAnnouncements = useCallback(async () => {\n\t\tif (!isIdentified) return;\n\n\t\tsetAnnouncementsLoading(true);\n\t\ttry {\n\t\t\tconst data = await client.getAnnouncements();\n\t\t\tsetAnnouncements(data);\n\t\t} catch (err) {\n\t\t\tconst error =\n\t\t\t\terr instanceof Error ? err : new Error(\"Failed to fetch announcements\");\n\t\t\tevents.emit(\"error\", { error, context: \"announcements\" });\n\t\t} finally {\n\t\t\tsetAnnouncementsLoading(false);\n\t\t}\n\t}, [client, events, isIdentified]);\n\n\tuseEffect(() => {\n\t\tif (isIdentified) {\n\t\t\tfetchAnnouncements();\n\t\t\tfetchUnreadCount();\n\t\t}\n\t}, [isIdentified, fetchAnnouncements, fetchUnreadCount]);\n\n\t// Poll unread count every 5 minutes\n\tuseEffect(() => {\n\t\tif (!isIdentified) return;\n\n\t\tconst interval = setInterval(fetchUnreadCount, UNREAD_POLL_INTERVAL_MS);\n\n\t\treturn () => clearInterval(interval);\n\t}, [isIdentified, fetchUnreadCount]);\n\n\tconst contextValue: TraceyContextValue = useMemo(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tclient,\n\t\t\tevents,\n\t\t\tuser: isIdentified ? user : null,\n\t\t\tisIdentified,\n\t\t\tisLoading,\n\t\t\terror,\n\t\t\tannouncements,\n\t\t\tannouncementsLoading,\n\t\t\trefetchAnnouncements: fetchAnnouncements,\n\t\t\tunreadCount,\n\t\t\tsetUnreadCount,\n\t\t}),\n\t\t[\n\t\t\tconfig,\n\t\t\tclient,\n\t\t\tevents,\n\t\t\tuser,\n\t\t\tisIdentified,\n\t\t\tisLoading,\n\t\t\terror,\n\t\t\tannouncements,\n\t\t\tannouncementsLoading,\n\t\t\tfetchAnnouncements,\n\t\t\tunreadCount,\n\t\t\tsetUnreadCount,\n\t\t],\n\t);\n\n\treturn (\n\t\t<TraceyContext.Provider value={contextValue}>\n\t\t\t{children}\n\t\t</TraceyContext.Provider>\n\t);\n}\n","import { useState, useMemo, useCallback, type ReactNode } from \"react\";\n\nimport { TraceyContext, type TraceyContextValue } from \"./context\";\nimport { TraceyApiClient } from \"../core/api-client\";\nimport { TraceyEventEmitter } from \"../core/events\";\nimport type { TraceyConfig, TraceyUser, Announcement } from \"../types\";\n\nexport interface MockTraceyProviderProps {\n\tchildren: ReactNode;\n\tmockUser?: TraceyUser;\n\tmockAnnouncements?: Announcement[];\n\tmockConfig?: {\n\t\tdelay?: number;\n\t\tfailIdentify?: boolean;\n\t\tfailFeedback?: boolean;\n\t};\n}\n\nconst defaultMockUser: TraceyUser = {\n\tid: \"mock-user-1\",\n\temail: \"demo@example.com\",\n\tname: \"Demo User\",\n\trole: \"user\",\n};\n\nconst defaultMockAnnouncements: Announcement[] = [\n\t{\n\t\tid: 1,\n\t\ttitle: \"Welcome to Our App!\",\n\t\tstatus: \"published\",\n\t\tdisplayType: \"modal\",\n\t\tpublishAt: null,\n\t\texpiresAt: null,\n\t\tslides: [\n\t\t\t{\n\t\t\t\tid: 1,\n\t\t\t\torder: 0,\n\t\t\t\ttitle: \"Getting Started\",\n\t\t\t\tbody: \"Here's how to get the most out of our platform.\",\n\t\t\t\timageUrl: null,\n\t\t\t\tvideoUrl: null,\n\t\t\t\tctaText: \"Learn More\",\n\t\t\t\tctaUrl: \"https://example.com/docs\",\n\t\t\t},\n\t\t],\n\t\tviewed: false,\n\t\tctaClicked: false,\n\t},\n];\n\nexport function MockTraceyProvider({\n\tchildren,\n\tmockUser = defaultMockUser,\n\tmockAnnouncements = defaultMockAnnouncements,\n}: MockTraceyProviderProps) {\n\tconst config: TraceyConfig = useMemo(\n\t\t() => ({\n\t\t\tapiKey: \"mock-api-key\",\n\t\t\tbaseUrl: \"https://mock.tracey.dev\",\n\t\t\tdebug: true,\n\t\t}),\n\t\t[],\n\t);\n\n\t// Create a mock client that doesn't make real requests\n\tconst client = useMemo(() => {\n\t\tconst apiClient = new TraceyApiClient(config);\n\t\t// Set customer ID so tracking methods don't throw\n\t\tapiClient.setCustomerId(mockUser.id);\n\t\t// Stub network methods to return mock data\n\t\tapiClient.trackAnnouncementView = async () => {};\n\t\tapiClient.trackAnnouncementCta = async () => {};\n\t\tapiClient.submitFeedback = async (feedback) => ({\n\t\t\tid: Date.now(),\n\t\t\ttitle: feedback.title,\n\t\t\tdescription: feedback.description ?? null,\n\t\t\ttype: feedback.type,\n\t\t\tstatus: \"new\",\n\t\t\tcategory: feedback.category ?? null,\n\t\t\ttags: feedback.tags ?? null,\n\t\t\tcreatedAt: new Date().toISOString(),\n\t\t});\n\t\tapiClient.identify = async () => ({ success: true });\n\t\tapiClient.getAnnouncements = async () => mockAnnouncements;\n\t\tapiClient.getUnreadCount = async () => ({\n\t\t\tcount: mockAnnouncements.filter((a) => !a.viewed).length,\n\t\t});\n\t\tapiClient.getActiveSurvey = async () => null;\n\t\tapiClient.submitSurveyResponse = async () => ({\n\t\t\tsuccess: true,\n\t\t\tresponseId: Date.now(),\n\t\t});\n\t\treturn apiClient;\n\t}, [config, mockUser, mockAnnouncements]);\n\tconst events = useMemo(() => new TraceyEventEmitter(), []);\n\n\tconst [announcements, setAnnouncements] =\n\t\tuseState<Announcement[]>(mockAnnouncements);\n\tconst [unreadCount, setUnreadCount] = useState(\n\t\t() => mockAnnouncements.filter((a) => !a.viewed).length,\n\t);\n\n\tconst refetchAnnouncements = useCallback(async () => {\n\t\t// In mock mode, just reset to mock data\n\t\tsetAnnouncements(mockAnnouncements);\n\t}, [mockAnnouncements]);\n\n\tconst contextValue: TraceyContextValue = useMemo(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tclient,\n\t\t\tevents,\n\t\t\tuser: mockUser,\n\t\t\tisIdentified: true,\n\t\t\tisLoading: false,\n\t\t\terror: null,\n\t\t\tannouncements,\n\t\t\tannouncementsLoading: false,\n\t\t\trefetchAnnouncements,\n\t\t\tunreadCount,\n\t\t\tsetUnreadCount,\n\t\t}),\n\t\t[\n\t\t\tconfig,\n\t\t\tclient,\n\t\t\tevents,\n\t\t\tmockUser,\n\t\t\tannouncements,\n\t\t\trefetchAnnouncements,\n\t\t\tunreadCount,\n\t\t],\n\t);\n\n\treturn (\n\t\t<TraceyContext.Provider value={contextValue}>\n\t\t\t{children}\n\t\t</TraceyContext.Provider>\n\t);\n}\n","import { useContext } from \"react\";\n\nimport { TraceyContext, type TraceyContextValue } from \"../provider/context\";\n\nexport function useTracey(): TraceyContextValue {\n\tconst context = useContext(TraceyContext);\n\n\tif (!context) {\n\t\tthrow new Error(\"useTracey must be used within a TraceyProvider\");\n\t}\n\n\treturn context;\n}\n","import { useState, useCallback, useRef } from \"react\";\n\nimport type { Feedback, FeedbackResponse } from \"../types\";\nimport { useTracey } from \"./useTracey\";\n\nconst MAX_SUBMISSIONS_PER_MINUTE = 5;\nconst RATE_LIMIT_WINDOW_MS = 60_000;\n\nexport interface UseFeedbackReturn {\n\tsubmit: (feedback: Feedback) => Promise<FeedbackResponse | null>;\n\tisSubmitting: boolean;\n\terror: Error | null;\n\tlastSubmission: FeedbackResponse | null;\n\treset: () => void;\n}\n\nexport function useFeedback(): UseFeedbackReturn {\n\tconst { client, events } = useTracey();\n\tconst [isSubmitting, setIsSubmitting] = useState(false);\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst [lastSubmission, setLastSubmission] = useState<FeedbackResponse | null>(\n\t\tnull,\n\t);\n\tconst submissionTimestamps = useRef<number[]>([]);\n\n\tconst submit = useCallback(\n\t\tasync (feedback: Feedback): Promise<FeedbackResponse | null> => {\n\t\t\t// Client-side rate limiting\n\t\t\tconst now = Date.now();\n\t\t\tsubmissionTimestamps.current = submissionTimestamps.current.filter(\n\t\t\t\t(ts) => now - ts < RATE_LIMIT_WINDOW_MS,\n\t\t\t);\n\n\t\t\tif (submissionTimestamps.current.length >= MAX_SUBMISSIONS_PER_MINUTE) {\n\t\t\t\tconst oldestInWindow = submissionTimestamps.current[0]!;\n\t\t\t\tconst retryAfterMs = RATE_LIMIT_WINDOW_MS - (now - oldestInWindow);\n\t\t\t\tconst rateLimitError = new Error(\n\t\t\t\t\t\"Too many submissions. Please wait before submitting again.\",\n\t\t\t\t);\n\t\t\t\tsetError(rateLimitError);\n\t\t\t\tevents.emit(\"feedback:rate-limited\", { retryAfterMs });\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tsetIsSubmitting(true);\n\t\t\tsetError(null);\n\n\t\t\ttry {\n\t\t\t\tconst response = await client.submitFeedback(feedback);\n\t\t\t\tsubmissionTimestamps.current.push(Date.now());\n\t\t\t\tsetLastSubmission(response);\n\t\t\t\tevents.emit(\"feedback:submitted\", { feedback: response });\n\t\t\t\treturn response;\n\t\t\t} catch (err) {\n\t\t\t\tconst error =\n\t\t\t\t\terr instanceof Error ? err : new Error(\"Failed to submit feedback\");\n\t\t\t\tsetError(error);\n\t\t\t\tevents.emit(\"feedback:error\", { error });\n\t\t\t\treturn null;\n\t\t\t} finally {\n\t\t\t\tsetIsSubmitting(false);\n\t\t\t}\n\t\t},\n\t\t[client, events],\n\t);\n\n\tconst reset = useCallback(() => {\n\t\tsetError(null);\n\t\tsetLastSubmission(null);\n\t}, []);\n\n\treturn {\n\t\tsubmit,\n\t\tisSubmitting,\n\t\terror,\n\t\tlastSubmission,\n\t\treset,\n\t};\n}\n","import { useMemo, useCallback } from \"react\";\n\nimport type { Announcement } from \"../types\";\nimport { useTracey } from \"./useTracey\";\n\nexport interface UseAnnouncementsReturn {\n\tannouncements: Announcement[];\n\tunread: Announcement[];\n\tunreadCount: number;\n\tisLoading: boolean;\n\tmarkAsViewed: (announcementId: number) => Promise<void>;\n\tmarkAsRead: (announcementId: number) => Promise<void>;\n\tmarkAllAsRead: () => Promise<void>;\n\tmarkCtaClicked: (announcementId: number, slideIndex: number) => Promise<void>;\n\trefetch: () => Promise<void>;\n}\n\nexport function useAnnouncements(): UseAnnouncementsReturn {\n\tconst {\n\t\tclient,\n\t\tevents,\n\t\tannouncements,\n\t\tannouncementsLoading,\n\t\trefetchAnnouncements,\n\t\tunreadCount,\n\t\tsetUnreadCount,\n\t} = useTracey();\n\n\tconst unread = useMemo(\n\t\t() => announcements.filter((a) => !a.viewed),\n\t\t[announcements],\n\t);\n\n\tconst markAsViewed = useCallback(\n\t\tasync (announcementId: number) => {\n\t\t\ttry {\n\t\t\t\tawait client.trackAnnouncementView(announcementId);\n\t\t\t\tconst announcement = announcements.find((a) => a.id === announcementId);\n\t\t\t\tif (announcement) {\n\t\t\t\t\tevents.emit(\"announcement:viewed\", { announcement });\n\t\t\t\t}\n\t\t\t\t// Optimistically decrement unread count\n\t\t\t\tsetUnreadCount(Math.max(0, unreadCount - 1));\n\t\t\t\t// Refetch to update local state\n\t\t\t\tawait refetchAnnouncements();\n\t\t\t} catch (err) {\n\t\t\t\tconst error =\n\t\t\t\t\terr instanceof Error\n\t\t\t\t\t\t? err\n\t\t\t\t\t\t: new Error(\"Failed to mark announcement as viewed\");\n\t\t\t\tevents.emit(\"error\", { error, context: \"announcement:view\" });\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tclient,\n\t\t\tevents,\n\t\t\tannouncements,\n\t\t\trefetchAnnouncements,\n\t\t\tunreadCount,\n\t\t\tsetUnreadCount,\n\t\t],\n\t);\n\n\tconst markAsRead = useCallback(\n\t\tasync (announcementId: number) => {\n\t\t\tawait markAsViewed(announcementId);\n\t\t},\n\t\t[markAsViewed],\n\t);\n\n\tconst markAllAsRead = useCallback(async () => {\n\t\tconst unreadAnnouncements = announcements.filter((a) => !a.viewed);\n\t\tif (unreadAnnouncements.length === 0) return;\n\n\t\t// Optimistically set count to 0\n\t\tsetUnreadCount(0);\n\n\t\ttry {\n\t\t\tawait Promise.all(\n\t\t\t\tunreadAnnouncements.map((a) => client.trackAnnouncementView(a.id)),\n\t\t\t);\n\t\t\tawait refetchAnnouncements();\n\t\t} catch (err) {\n\t\t\tconst error =\n\t\t\t\terr instanceof Error\n\t\t\t\t\t? err\n\t\t\t\t\t: new Error(\"Failed to mark all announcements as read\");\n\t\t\tevents.emit(\"error\", { error, context: \"announcement:mark-all-read\" });\n\t\t\t// Revert optimistic update on failure\n\t\t\tsetUnreadCount(unreadAnnouncements.length);\n\t\t}\n\t}, [announcements, client, events, refetchAnnouncements, setUnreadCount]);\n\n\tconst markCtaClicked = useCallback(\n\t\tasync (announcementId: number, slideIndex: number) => {\n\t\t\ttry {\n\t\t\t\tawait client.trackAnnouncementCta(announcementId);\n\t\t\t\tconst announcement = announcements.find((a) => a.id === announcementId);\n\t\t\t\tif (announcement) {\n\t\t\t\t\tevents.emit(\"announcement:cta-clicked\", {\n\t\t\t\t\t\tannouncement,\n\t\t\t\t\t\tslideIndex,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst error =\n\t\t\t\t\terr instanceof Error ? err : new Error(\"Failed to track CTA click\");\n\t\t\t\tevents.emit(\"error\", { error, context: \"announcement:cta\" });\n\t\t\t}\n\t\t},\n\t\t[client, events, announcements],\n\t);\n\n\treturn {\n\t\tannouncements,\n\t\tunread,\n\t\tunreadCount,\n\t\tisLoading: announcementsLoading,\n\t\tmarkAsViewed,\n\t\tmarkAsRead,\n\t\tmarkAllAsRead,\n\t\tmarkCtaClicked,\n\t\trefetch: refetchAnnouncements,\n\t};\n}\n","import { useCallback, useEffect, useRef } from \"react\";\n\nimport type { TraceyEvents } from \"../types\";\nimport { useTracey } from \"./useTracey\";\n\ntype EventCallback<K extends keyof TraceyEvents> = (\n\tdata: TraceyEvents[K],\n) => void;\n\nexport interface UseTraceyEventsReturn {\n\tsubscribe: <K extends keyof TraceyEvents>(\n\t\tevent: K,\n\t\tcallback: EventCallback<K>,\n\t) => () => void;\n\temit: <K extends keyof TraceyEvents>(event: K, data: TraceyEvents[K]) => void;\n}\n\nexport function useTraceyEvents(): UseTraceyEventsReturn {\n\tconst { events } = useTracey();\n\n\tconst subscribe = useCallback(\n\t\t<K extends keyof TraceyEvents>(\n\t\t\tevent: K,\n\t\t\tcallback: EventCallback<K>,\n\t\t): (() => void) => {\n\t\t\treturn events.subscribe(event, callback);\n\t\t},\n\t\t[events],\n\t);\n\n\tconst emit = useCallback(\n\t\t<K extends keyof TraceyEvents>(event: K, data: TraceyEvents[K]): void => {\n\t\t\tevents.emit(event, data);\n\t\t},\n\t\t[events],\n\t);\n\n\treturn { subscribe, emit };\n}\n\n/**\n * Hook that subscribes to a specific event and automatically cleans up on unmount.\n * Useful for simple single-event subscriptions.\n */\nexport function useTraceyEvent<K extends keyof TraceyEvents>(\n\tevent: K,\n\tcallback: EventCallback<K>,\n): void {\n\tconst { events } = useTracey();\n\tconst callbackRef = useRef(callback);\n\tcallbackRef.current = callback;\n\n\tuseEffect(() => {\n\t\tconst handler: EventCallback<K> = (data) => {\n\t\t\tcallbackRef.current(data);\n\t\t};\n\t\treturn events.subscribe(event, handler);\n\t}, [events, event]);\n}\n","import {\n\tcreateContext,\n\tuseContext,\n\tuseState,\n\tuseCallback,\n\ttype ReactNode,\n} from \"react\";\n\ninterface FeedbackContextValue {\n\tisOpen: boolean;\n\tsetIsOpen: (open: boolean) => void;\n\ttoggle: () => void;\n}\n\nconst FeedbackContext = createContext<FeedbackContextValue | null>(null);\n\nexport function useFeedbackContext(): FeedbackContextValue {\n\tconst context = useContext(FeedbackContext);\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Feedback compound components must be used within FeedbackRoot\",\n\t\t);\n\t}\n\treturn context;\n}\n\nexport interface FeedbackRootProps {\n\tchildren: ReactNode;\n\tdefaultOpen?: boolean;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}\n\nexport function FeedbackRoot({\n\tchildren,\n\tdefaultOpen = false,\n\topen,\n\tonOpenChange,\n}: FeedbackRootProps) {\n\tconst [internalOpen, setInternalOpen] = useState(defaultOpen);\n\n\tconst isOpen = open ?? internalOpen;\n\n\tconst setIsOpen = useCallback(\n\t\t(newOpen: boolean) => {\n\t\t\tif (open === undefined) {\n\t\t\t\tsetInternalOpen(newOpen);\n\t\t\t}\n\t\t\tonOpenChange?.(newOpen);\n\t\t},\n\t\t[open, onOpenChange],\n\t);\n\n\tconst toggle = useCallback(() => {\n\t\tsetIsOpen(!isOpen);\n\t}, [isOpen, setIsOpen]);\n\n\treturn (\n\t\t<FeedbackContext.Provider value={{ isOpen, setIsOpen, toggle }}>\n\t\t\t{children}\n\t\t</FeedbackContext.Provider>\n\t);\n}\n","import { type ReactElement, cloneElement, type MouseEvent } from \"react\";\n\nimport { useFeedbackContext } from \"./FeedbackRoot\";\n\nexport interface FeedbackCloseProps {\n\tchildren: ReactElement<{ onClick?: (e: MouseEvent) => void }>;\n\tasChild?: boolean;\n}\n\nexport function FeedbackClose({\n\tchildren,\n\tasChild = true,\n}: FeedbackCloseProps) {\n\tconst { setIsOpen } = useFeedbackContext();\n\n\tconst handleClose = (e: MouseEvent) => {\n\t\tchildren.props.onClick?.(e);\n\t\tsetIsOpen(false);\n\t};\n\n\tif (asChild) {\n\t\treturn cloneElement(children, { onClick: handleClose });\n\t}\n\n\treturn (\n\t\t<button type=\"button\" onClick={handleClose}>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n","import { type FormEvent, type ReactNode, useState, useCallback } from \"react\";\n\nimport { useFeedbackContext } from \"./FeedbackRoot\";\nimport { useFeedback } from \"../../../hooks/useFeedback\";\nimport type { FeedbackType } from \"../../../types\";\n\nexport interface FeedbackFormData {\n\ttitle: string;\n\tdescription: string;\n\ttype: FeedbackType;\n\tscreenshot: string | null;\n}\n\nexport interface FeedbackFormRenderProps {\n\ttitle: string;\n\tsetTitle: (value: string) => void;\n\tdescription: string;\n\tsetDescription: (value: string) => void;\n\ttype: FeedbackType;\n\tsetType: (value: FeedbackType) => void;\n\tscreenshot: string | null;\n\tsetScreenshot: (value: string | null) => void;\n\tisSubmitting: boolean;\n\terror: Error | null;\n\thandleSubmit: (e: FormEvent) => void;\n}\n\nexport interface FeedbackFormPrimitiveProps {\n\tchildren: (props: FeedbackFormRenderProps) => ReactNode;\n\tonSuccess?: () => void;\n\tcloseOnSuccess?: boolean;\n}\n\nexport function FeedbackFormPrimitive({\n\tchildren,\n\tonSuccess,\n\tcloseOnSuccess = true,\n}: FeedbackFormPrimitiveProps) {\n\tconst { setIsOpen } = useFeedbackContext();\n\tconst { submit, isSubmitting, error } = useFeedback();\n\n\tconst [title, setTitle] = useState(\"\");\n\tconst [description, setDescription] = useState(\"\");\n\tconst [type, setType] = useState<FeedbackType>(\"general\");\n\tconst [screenshot, setScreenshot] = useState<string | null>(null);\n\n\tconst handleSubmit = useCallback(\n\t\tasync (e: FormEvent) => {\n\t\t\te.preventDefault();\n\n\t\t\tconst result = await submit({\n\t\t\t\ttitle,\n\t\t\t\tdescription: description || undefined,\n\t\t\t\ttype,\n\t\t\t\tscreenshot: screenshot ?? undefined,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tsetTitle(\"\");\n\t\t\t\tsetDescription(\"\");\n\t\t\t\tsetType(\"general\");\n\t\t\t\tsetScreenshot(null);\n\t\t\t\tonSuccess?.();\n\t\t\t\tif (closeOnSuccess) {\n\t\t\t\t\tsetIsOpen(false);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tsubmit,\n\t\t\ttitle,\n\t\t\tdescription,\n\t\t\ttype,\n\t\t\tscreenshot,\n\t\t\tonSuccess,\n\t\t\tcloseOnSuccess,\n\t\t\tsetIsOpen,\n\t\t],\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t{children({\n\t\t\t\ttitle,\n\t\t\t\tsetTitle,\n\t\t\t\tdescription,\n\t\t\t\tsetDescription,\n\t\t\t\ttype,\n\t\t\t\tsetType,\n\t\t\t\tscreenshot,\n\t\t\t\tsetScreenshot,\n\t\t\t\tisSubmitting,\n\t\t\t\terror,\n\t\t\t\thandleSubmit,\n\t\t\t})}\n\t\t</>\n\t);\n}\n","import { type ReactNode, type HTMLAttributes } from \"react\";\n\nimport { useFeedbackContext } from \"./FeedbackRoot\";\n\nexport interface FeedbackContentProps extends HTMLAttributes<HTMLDivElement> {\n\tchildren: ReactNode;\n}\n\nexport function FeedbackContent({ children, ...props }: FeedbackContentProps) {\n\tconst { isOpen } = useFeedbackContext();\n\n\tif (!isOpen) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div role=\"dialog\" aria-modal=\"true\" {...props}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import { type ReactNode, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface FeedbackPortalProps {\n\tchildren: ReactNode;\n\tcontainer?: HTMLElement;\n}\n\nexport function FeedbackPortal({ children, container }: FeedbackPortalProps) {\n\tconst [mounted, setMounted] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetMounted(true);\n\t}, []);\n\n\tif (!mounted) {\n\t\treturn null;\n\t}\n\n\tconst target = container ?? document.body;\n\treturn createPortal(children, target);\n}\n","import { type ReactElement, cloneElement, type MouseEvent } from \"react\";\n\nimport { useFeedbackContext } from \"./FeedbackRoot\";\n\nexport interface FeedbackTriggerProps {\n\tchildren: ReactElement<{ onClick?: (e: MouseEvent) => void }>;\n\tasChild?: boolean;\n}\n\nexport function FeedbackTrigger({\n\tchildren,\n\tasChild = true,\n}: FeedbackTriggerProps) {\n\tconst { toggle } = useFeedbackContext();\n\n\tif (asChild) {\n\t\treturn cloneElement(children, {\n\t\t\tonClick: (e: MouseEvent) => {\n\t\t\t\tchildren.props.onClick?.(e);\n\t\t\t\ttoggle();\n\t\t\t},\n\t\t});\n\t}\n\n\treturn (\n\t\t<button type=\"button\" onClick={toggle}>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n","import {\n\tcreateContext,\n\tuseContext,\n\tuseState,\n\tuseCallback,\n\tuseEffect,\n\ttype ReactNode,\n} from \"react\";\n\nimport type { Announcement } from \"../../../types\";\n\ninterface AnnouncementContextValue {\n\tisOpen: boolean;\n\tsetIsOpen: (open: boolean) => void;\n\tcurrentAnnouncement: Announcement | null;\n\tsetCurrentAnnouncement: (announcement: Announcement | null) => void;\n\tcurrentSlideIndex: number;\n\tsetCurrentSlideIndex: (index: number) => void;\n\tnextSlide: () => void;\n\tprevSlide: () => void;\n\ttotalSlides: number;\n}\n\nconst AnnouncementContext = createContext<AnnouncementContextValue | null>(\n\tnull,\n);\n\nexport function useAnnouncementContext(): AnnouncementContextValue {\n\tconst context = useContext(AnnouncementContext);\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Announcement compound components must be used within AnnouncementRoot\",\n\t\t);\n\t}\n\treturn context;\n}\n\nexport interface AnnouncementRootProps {\n\tchildren: ReactNode;\n\tannouncement?: Announcement | null;\n\tdefaultOpen?: boolean;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}\n\nexport function AnnouncementRoot({\n\tchildren,\n\tannouncement = null,\n\tdefaultOpen = false,\n\topen,\n\tonOpenChange,\n}: AnnouncementRootProps) {\n\tconst [internalOpen, setInternalOpen] = useState(defaultOpen);\n\tconst [currentAnnouncement, setCurrentAnnouncement] =\n\t\tuseState<Announcement | null>(announcement);\n\tconst [currentSlideIndex, setCurrentSlideIndex] = useState(0);\n\n\t// Sync announcement prop changes and reset slide index\n\tuseEffect(() => {\n\t\tsetCurrentAnnouncement(announcement);\n\t\tsetCurrentSlideIndex(0);\n\t}, [announcement]);\n\n\tconst isOpen = open ?? internalOpen;\n\tconst totalSlides = currentAnnouncement?.slides.length ?? 0;\n\n\tconst setIsOpen = useCallback(\n\t\t(newOpen: boolean) => {\n\t\t\tif (open === undefined) {\n\t\t\t\tsetInternalOpen(newOpen);\n\t\t\t}\n\t\t\tonOpenChange?.(newOpen);\n\t\t},\n\t\t[open, onOpenChange],\n\t);\n\n\tconst nextSlide = useCallback(() => {\n\t\tif (currentSlideIndex < totalSlides - 1) {\n\t\t\tsetCurrentSlideIndex((prev) => prev + 1);\n\t\t}\n\t}, [currentSlideIndex, totalSlides]);\n\n\tconst prevSlide = useCallback(() => {\n\t\tif (currentSlideIndex > 0) {\n\t\t\tsetCurrentSlideIndex((prev) => prev - 1);\n\t\t}\n\t}, [currentSlideIndex]);\n\n\treturn (\n\t\t<AnnouncementContext.Provider\n\t\t\tvalue={{\n\t\t\t\tisOpen,\n\t\t\t\tsetIsOpen,\n\t\t\t\tcurrentAnnouncement,\n\t\t\t\tsetCurrentAnnouncement,\n\t\t\t\tcurrentSlideIndex,\n\t\t\t\tsetCurrentSlideIndex,\n\t\t\t\tnextSlide,\n\t\t\t\tprevSlide,\n\t\t\t\ttotalSlides,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</AnnouncementContext.Provider>\n\t);\n}\n","import { type ReactElement, cloneElement, type MouseEvent } from \"react\";\n\nimport { useAnnouncementContext } from \"./AnnouncementRoot\";\n\nexport interface AnnouncementCloseProps {\n\tchildren: ReactElement<{ onClick?: (e: MouseEvent) => void }>;\n\tasChild?: boolean;\n}\n\nexport function AnnouncementClose({\n\tchildren,\n\tasChild = true,\n}: AnnouncementCloseProps) {\n\tconst { setIsOpen } = useAnnouncementContext();\n\n\tconst handleClose = (e: MouseEvent) => {\n\t\tchildren.props.onClick?.(e);\n\t\tsetIsOpen(false);\n\t};\n\n\tif (asChild) {\n\t\treturn cloneElement(children, { onClick: handleClose });\n\t}\n\n\treturn (\n\t\t<button type=\"button\" onClick={handleClose}>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n","import { type ReactNode, type HTMLAttributes, useEffect, useRef } from \"react\";\n\nimport { useAnnouncementContext } from \"./AnnouncementRoot\";\nimport { useAnnouncements } from \"../../../hooks/useAnnouncements\";\n\nexport interface AnnouncementContentProps\n\textends HTMLAttributes<HTMLDivElement> {\n\tchildren: ReactNode;\n\ttrackView?: boolean;\n}\n\nexport function AnnouncementContent({\n\tchildren,\n\ttrackView = true,\n\t...props\n}: AnnouncementContentProps) {\n\tconst { isOpen, currentAnnouncement } = useAnnouncementContext();\n\tconst { markAsViewed } = useAnnouncements();\n\t// Track which announcements have been viewed in this session to prevent duplicates\n\tconst viewedRef = useRef<Set<number>>(new Set());\n\n\tuseEffect(() => {\n\t\tif (\n\t\t\tisOpen &&\n\t\t\ttrackView &&\n\t\t\tcurrentAnnouncement &&\n\t\t\t!currentAnnouncement.viewed &&\n\t\t\t!viewedRef.current.has(currentAnnouncement.id)\n\t\t) {\n\t\t\tviewedRef.current.add(currentAnnouncement.id);\n\t\t\tmarkAsViewed(currentAnnouncement.id);\n\t\t}\n\t}, [isOpen, trackView, currentAnnouncement, markAsViewed]);\n\n\tif (!isOpen) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div role=\"dialog\" aria-modal=\"true\" {...props}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import { type ReactNode } from \"react\";\n\nimport { useAnnouncementContext } from \"./AnnouncementRoot\";\n\nexport interface AnnouncementNavigationRenderProps {\n\tcurrentSlide: number;\n\ttotalSlides: number;\n\tcanGoNext: boolean;\n\tcanGoPrev: boolean;\n\tnextSlide: () => void;\n\tprevSlide: () => void;\n\tgoToSlide: (index: number) => void;\n}\n\nexport interface AnnouncementNavigationProps {\n\tchildren: (props: AnnouncementNavigationRenderProps) => ReactNode;\n}\n\nexport function AnnouncementNavigation({\n\tchildren,\n}: AnnouncementNavigationProps) {\n\tconst {\n\t\tcurrentSlideIndex,\n\t\ttotalSlides,\n\t\tnextSlide,\n\t\tprevSlide,\n\t\tsetCurrentSlideIndex,\n\t} = useAnnouncementContext();\n\n\tconst canGoNext = currentSlideIndex < totalSlides - 1;\n\tconst canGoPrev = currentSlideIndex > 0;\n\n\treturn (\n\t\t<>\n\t\t\t{children({\n\t\t\t\tcurrentSlide: currentSlideIndex,\n\t\t\t\ttotalSlides,\n\t\t\t\tcanGoNext,\n\t\t\t\tcanGoPrev,\n\t\t\t\tnextSlide,\n\t\t\t\tprevSlide,\n\t\t\t\tgoToSlide: setCurrentSlideIndex,\n\t\t\t})}\n\t\t</>\n\t);\n}\n","import { type ReactNode, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface AnnouncementPortalProps {\n\tchildren: ReactNode;\n\tcontainer?: HTMLElement;\n}\n\nexport function AnnouncementPortal({\n\tchildren,\n\tcontainer,\n}: AnnouncementPortalProps) {\n\tconst [mounted, setMounted] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetMounted(true);\n\t}, []);\n\n\tif (!mounted) {\n\t\treturn null;\n\t}\n\n\tconst target = container ?? document.body;\n\treturn createPortal(children, target);\n}\n","import { type ReactNode } from \"react\";\n\nexport interface LauncherBadgeProps {\n\tcount: number;\n\tchildren?: (count: number) => ReactNode;\n\tmax?: number;\n}\n\nexport function LauncherBadge({\n\tcount,\n\tchildren,\n\tmax = 99,\n}: LauncherBadgeProps) {\n\tif (count <= 0) {\n\t\treturn null;\n\t}\n\n\tif (children) {\n\t\treturn <>{children(count)}</>;\n\t}\n\n\treturn <span>{count > max ? `${max}+` : count}</span>;\n}\n","import {\n\tcreateContext,\n\tuseContext,\n\tuseState,\n\tuseCallback,\n\tuseRef,\n\ttype ReactNode,\n\ttype RefObject,\n} from \"react\";\n\nexport type LauncherActiveItem = \"feedback\" | \"announcements\" | null;\n\ninterface LauncherContextValue {\n\tisOpen: boolean;\n\tsetIsOpen: (open: boolean) => void;\n\ttoggle: () => void;\n\tactiveItem: LauncherActiveItem;\n\tsetActiveItem: (item: LauncherActiveItem) => void;\n\ttriggerRef: RefObject<HTMLElement | null>;\n}\n\nconst LauncherContext = createContext<LauncherContextValue | null>(null);\n\nexport function useLauncherContext(): LauncherContextValue {\n\tconst context = useContext(LauncherContext);\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Launcher compound components must be used within LauncherRoot\",\n\t\t);\n\t}\n\treturn context;\n}\n\nexport interface LauncherRootProps {\n\tchildren: ReactNode;\n\tdefaultOpen?: boolean;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tdefaultActiveItem?: LauncherActiveItem;\n}\n\nexport function LauncherRoot({\n\tchildren,\n\tdefaultOpen = false,\n\topen,\n\tonOpenChange,\n\tdefaultActiveItem = null,\n}: LauncherRootProps) {\n\tconst [internalOpen, setInternalOpen] = useState(defaultOpen);\n\tconst [activeItem, setActiveItem] =\n\t\tuseState<LauncherActiveItem>(defaultActiveItem);\n\tconst triggerRef = useRef<HTMLElement | null>(null);\n\n\tconst isOpen = open ?? internalOpen;\n\n\tconst setIsOpen = useCallback(\n\t\t(newOpen: boolean) => {\n\t\t\tif (open === undefined) {\n\t\t\t\tsetInternalOpen(newOpen);\n\t\t\t}\n\t\t\tif (!newOpen) {\n\t\t\t\tsetActiveItem(defaultActiveItem);\n\t\t\t}\n\t\t\tonOpenChange?.(newOpen);\n\t\t},\n\t\t[open, onOpenChange, defaultActiveItem],\n\t);\n\n\tconst toggle = useCallback(() => {\n\t\tsetIsOpen(!isOpen);\n\t}, [isOpen, setIsOpen]);\n\n\treturn (\n\t\t<LauncherContext.Provider\n\t\t\tvalue={{\n\t\t\t\tisOpen,\n\t\t\t\tsetIsOpen,\n\t\t\t\ttoggle,\n\t\t\t\tactiveItem,\n\t\t\t\tsetActiveItem,\n\t\t\t\ttriggerRef,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</LauncherContext.Provider>\n\t);\n}\n","import { type ReactNode, type HTMLAttributes, useRef, useEffect } from \"react\";\n\nimport { useLauncherContext } from \"./LauncherRoot\";\n\nexport interface LauncherPanelProps extends HTMLAttributes<HTMLDivElement> {\n\tchildren: ReactNode;\n}\n\nexport function LauncherPanel({ children, ...props }: LauncherPanelProps) {\n\tconst { isOpen, setIsOpen, triggerRef } = useLauncherContext();\n\tconst panelRef = useRef<HTMLDivElement>(null);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\n\t\tconst handleClickOutside = (e: MouseEvent) => {\n\t\t\tconst target = e.target as Node;\n\t\t\tif (\n\t\t\t\tpanelRef.current &&\n\t\t\t\t!panelRef.current.contains(target) &&\n\t\t\t\ttriggerRef.current &&\n\t\t\t\t!triggerRef.current.contains(target)\n\t\t\t) {\n\t\t\t\tsetIsOpen(false);\n\t\t\t}\n\t\t};\n\n\t\tconst handleEscape = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") {\n\t\t\t\tsetIsOpen(false);\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"mousedown\", handleClickOutside);\n\t\tdocument.addEventListener(\"keydown\", handleEscape);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousedown\", handleClickOutside);\n\t\t\tdocument.removeEventListener(\"keydown\", handleEscape);\n\t\t};\n\t}, [isOpen, setIsOpen, triggerRef]);\n\n\tif (!isOpen) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div ref={panelRef} role=\"dialog\" aria-label=\"Tracey widget\" {...props}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import { type ReactNode, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface LauncherPortalProps {\n\tchildren: ReactNode;\n\tcontainer?: HTMLElement;\n}\n\nexport function LauncherPortal({ children, container }: LauncherPortalProps) {\n\tconst [mounted, setMounted] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetMounted(true);\n\t}, []);\n\n\tif (!mounted) {\n\t\treturn null;\n\t}\n\n\tconst target = container ?? document.body;\n\treturn createPortal(children, target);\n}\n","import type { ReactNode, HTMLAttributes } from \"react\";\n\nimport { useLauncherContext, type LauncherActiveItem } from \"./LauncherRoot\";\n\nexport interface LauncherTabProps\n\textends Omit<HTMLAttributes<HTMLButtonElement>, \"children\"> {\n\tvalue: LauncherActiveItem;\n\tchildren: ReactNode;\n}\n\nexport function LauncherTab({ value, children, ...props }: LauncherTabProps) {\n\tconst { activeItem, setActiveItem } = useLauncherContext();\n\tconst isActive = activeItem === value;\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\trole=\"tab\"\n\t\t\taria-selected={isActive}\n\t\t\tdata-state={isActive ? \"active\" : \"inactive\"}\n\t\t\tonClick={() => setActiveItem(value)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n","import type { ReactNode, HTMLAttributes } from \"react\";\n\nimport { useLauncherContext, type LauncherActiveItem } from \"./LauncherRoot\";\n\nexport interface LauncherTabContentProps\n\textends HTMLAttributes<HTMLDivElement> {\n\tvalue: LauncherActiveItem;\n\tchildren: ReactNode;\n}\n\nexport function LauncherTabContent({\n\tvalue,\n\tchildren,\n\t...props\n}: LauncherTabContentProps) {\n\tconst { activeItem } = useLauncherContext();\n\n\tif (activeItem !== value) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div role=\"tabpanel\" {...props}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import {\n\ttype ReactElement,\n\tcloneElement,\n\ttype MouseEvent,\n\ttype Ref,\n\tuseCallback,\n} from \"react\";\n\nimport { useLauncherContext } from \"./LauncherRoot\";\n\nexport interface LauncherTriggerProps {\n\tchildren: ReactElement<{\n\t\tonClick?: (e: MouseEvent) => void;\n\t\tref?: Ref<HTMLElement>;\n\t}>;\n\tasChild?: boolean;\n}\n\nexport function LauncherTrigger({\n\tchildren,\n\tasChild = true,\n}: LauncherTriggerProps) {\n\tconst { toggle, triggerRef } = useLauncherContext();\n\n\tconst refCallback = useCallback(\n\t\t(node: HTMLElement | null) => {\n\t\t\ttriggerRef.current = node;\n\t\t},\n\t\t[triggerRef],\n\t);\n\n\tif (asChild) {\n\t\treturn cloneElement(children, {\n\t\t\tref: refCallback,\n\t\t\tonClick: (e: MouseEvent) => {\n\t\t\t\tchildren.props.onClick?.(e);\n\t\t\t\ttoggle();\n\t\t\t},\n\t\t});\n\t}\n\n\treturn (\n\t\t<button type=\"button\" ref={refCallback} onClick={toggle}>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n"],"names":["error"],"mappings":"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"}
|