@framed-dev/react 0.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/client.ts","../src/data/SyncDataLayer.ts","../src/providers/AuthProvider.tsx","../src/data/LocalDataLayer.ts","../src/providers/FramedProvider.tsx","../../widget-core/src/store/widgetStore.ts","../../widget-core/src/components/Icons.tsx","../../widget-core/src/components/Toast.tsx","../../widget-core/src/utils/helpers.ts","../../widget-core/src/utils/screenshot.ts","../../widget-core/src/components/Toolbar.tsx","../../widget-core/src/components/FeedbackDrawer.tsx","../../widget-core/src/components/RichTextEditor.tsx","../../widget-core/src/components/QuickInput.tsx","../../widget-core/src/components/ChatModal.tsx","../../widget-core/src/components/ElementSelector.tsx","../../widget-core/src/components/TextEditOverlay.tsx","../../widget-core/src/components/RegionSelectOverlay.tsx","../../widget-core/src/components/ExportModal.tsx","../../widget-core/src/components/MultiSelectOverlay.tsx","../../widget-core/src/components/AreaAnnotationOverlay.tsx","../../widget-core/src/styles/widgetStyles.ts","../../widget-core/src/components/Widget.tsx","../src/utils/promptGenerator.ts","../src/utils/siteScanner.ts","../src/hooks/useFramedTasks.ts","../src/components/FeedbackWidget.tsx","../src/components/TasksReadyPanel.tsx"],"names":["STORAGE_KEYS","newUsage","createContext","useState","useEffect","jsx","useContext","generateId","jsxs","useCallback","useRef","getElementPath","left","top","Fragment","useMemo","getPriorityIcon"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","file":"index.js","sourcesContent":["// Framed API Client - Supabase Edge Functions\nimport type { Task, Session, TaskType, TaskStatus } from '@framed/core';\n\nexport interface FramedAPIConfig {\n apiKey: string;\n supabaseUrl: string; // https://xxx.supabase.co\n}\n\n// API response format from Edge Functions (nested but different field names)\ninterface APITask {\n id: string;\n status: string;\n priority?: string;\n type: string;\n page?: {\n url?: string | null;\n title?: string | null;\n };\n element?: {\n selector?: string | null;\n path?: string | null;\n };\n feedback?: {\n raw?: string | null;\n };\n task?: {\n action?: string | null;\n details?: string | null;\n };\n author?: {\n name?: string | null;\n email?: string | null;\n };\n attachments?: Array<{\n id: string;\n url: string;\n type: string;\n mimeType?: string;\n size?: number;\n }>;\n createdAt: string;\n updatedAt: string;\n completedAt?: string | null;\n}\n\ninterface APITasksResponse {\n tasks: APITask[];\n meta: {\n total: number;\n limit?: number;\n offset?: number;\n hasMore?: boolean;\n };\n}\n\n// Convert API format to SDK Task format\nfunction mapAPITaskToTask(apiTask: APITask): Task {\n return {\n id: apiTask.id,\n type: apiTask.type as TaskType,\n status: apiTask.status as TaskStatus,\n page: {\n url: apiTask.page?.url || '',\n path: apiTask.page?.url ? new URL(apiTask.page.url).pathname : '/',\n title: apiTask.page?.title || '',\n },\n element: apiTask.element?.selector\n ? {\n selector: apiTask.element.selector,\n xpath: apiTask.element.path || '',\n tagName: 'div',\n rect: {} as DOMRect,\n }\n : undefined,\n feedback: {\n text: apiTask.feedback?.raw || '',\n },\n task: {\n title: apiTask.task?.action || apiTask.feedback?.raw || '',\n description: apiTask.task?.details || apiTask.feedback?.raw || '',\n },\n attachments: apiTask.attachments?.map((att) => ({\n id: att.id,\n type: (att.type || 'screenshot') as 'screenshot' | 'recording' | 'annotation',\n url: att.url,\n mimeType: att.mimeType || 'image/png',\n size: att.size || 0,\n })),\n meta: {\n createdAt: apiTask.createdAt,\n updatedAt: apiTask.updatedAt,\n createdBy: apiTask.author?.name || 'Anonymous',\n projectId: '',\n },\n };\n}\n\nexport interface TasksResponse {\n tasks: Task[];\n meta: {\n total: number;\n projectId: string;\n projectName: string;\n };\n}\n\nexport interface UploadResponse {\n url: string;\n path: string;\n expiresAt?: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n session?: Session;\n error?: string;\n}\n\nexport class FramedAPIClient {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(config: FramedAPIConfig) {\n this.apiKey = config.apiKey;\n // Remove trailing slash if present\n const supabaseUrl = config.supabaseUrl.replace(/\\/$/, '');\n this.baseUrl = `${supabaseUrl}/functions/v1`;\n }\n\n private async request<T>(\n functionName: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.baseUrl}/${functionName}`;\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.apiKey,\n ...options.headers,\n };\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Request failed' }));\n throw new Error(error.message || `HTTP ${response.status}`);\n }\n\n return response.json();\n }\n\n // Tasks\n\n async getTasks(options?: {\n status?: 'open' | 'in_progress' | 'done' | 'rejected';\n page?: string;\n }): Promise<TasksResponse> {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.page) params.set('page', options.page);\n\n const query = params.toString();\n const response = await this.request<APITasksResponse>(\n `sdk-list-tasks${query ? `?${query}` : ''}`\n );\n\n // Map API response to SDK Task format\n return {\n tasks: response.tasks.map(mapAPITaskToTask),\n meta: {\n total: response.meta.total,\n projectId: '',\n projectName: '',\n },\n };\n }\n\n async createTask(task: Omit<Task, 'id' | 'meta'>): Promise<Task> {\n // Send nested format - Edge Function handles the mapping\n const response = await this.request<APITask>('sdk-create-task', {\n method: 'POST',\n body: JSON.stringify(task),\n });\n\n return mapAPITaskToTask(response);\n }\n\n async updateTask(\n taskId: string,\n updates: Partial<Task>\n ): Promise<Task> {\n const response = await this.request<APITask>('sdk-create-task', {\n method: 'POST',\n body: JSON.stringify({ id: taskId, ...updates }),\n });\n\n return mapAPITaskToTask(response);\n }\n\n async markTaskDone(taskId: string): Promise<{ success: boolean; task: Task }> {\n const response = await this.request<{ success: boolean; task: APITask }>(\n 'sdk-complete-task',\n {\n method: 'POST',\n body: JSON.stringify({ taskId }),\n }\n );\n\n return {\n success: response.success,\n task: mapAPITaskToTask(response.task),\n };\n }\n\n // File Upload\n\n async uploadFile(file: File): Promise<UploadResponse> {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(`${this.baseUrl}/sdk-upload`, {\n method: 'POST',\n headers: {\n 'X-API-Key': this.apiKey,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Upload failed' }));\n throw new Error(error.message || `Upload failed: HTTP ${response.status}`);\n }\n\n return response.json();\n }\n\n // Auth\n\n async validateMagicToken(token: string): Promise<ValidationResult> {\n return this.request<ValidationResult>('/v1/auth/validate-token', {\n method: 'POST',\n body: JSON.stringify({ token }),\n });\n }\n\n async exchangeSessionToken(sessionToken: string): Promise<ValidationResult> {\n return this.request<ValidationResult>('/v1/auth/exchange-session', {\n method: 'POST',\n body: JSON.stringify({ sessionToken }),\n });\n }\n\n async getSession(): Promise<Session | null> {\n try {\n return await this.request<Session>('/v1/auth/session');\n } catch {\n return null;\n }\n }\n}\n","// SyncDataLayer - API-based storage for Pro/Team tier\nimport type {\n Task,\n Session,\n WidgetDataLayer,\n LimitStatus,\n SyncResult,\n} from '@framed/core';\nimport { FramedAPIClient, type FramedAPIConfig } from '../api/client';\n\nconst STORAGE_KEYS = {\n SESSION: 'framed_session',\n PENDING_TASKS: 'framed_pending_tasks',\n} as const;\n\ninterface PendingTask {\n task: Task;\n action: 'create' | 'update';\n timestamp: number;\n}\n\nexport class SyncDataLayer implements WidgetDataLayer {\n private projectId: string;\n private client: FramedAPIClient;\n private session: Session | null = null;\n\n constructor(projectId: string, config: FramedAPIConfig) {\n this.projectId = projectId;\n this.client = new FramedAPIClient(config);\n this.loadCachedSession();\n }\n\n private loadCachedSession(): void {\n if (typeof window === 'undefined') return;\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.SESSION);\n if (stored) {\n const session = JSON.parse(stored) as Session;\n if (new Date(session.expiresAt) > new Date()) {\n this.session = session;\n } else {\n localStorage.removeItem(STORAGE_KEYS.SESSION);\n }\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n private cacheSession(session: Session): void {\n if (typeof window === 'undefined') return;\n this.session = session;\n localStorage.setItem(STORAGE_KEYS.SESSION, JSON.stringify(session));\n }\n\n async getSession(): Promise<Session | null> {\n if (this.session) {\n return this.session;\n }\n\n const session = await this.client.getSession();\n if (session) {\n this.cacheSession(session);\n }\n return session;\n }\n\n async loadTasks(page?: string): Promise<Task[]> {\n try {\n const response = await this.client.getTasks({\n status: 'open',\n page,\n });\n return response.tasks;\n } catch (error) {\n // Return cached pending tasks on network error\n const pending = this.getPendingTasks();\n return pending.map((p) => p.task);\n }\n }\n\n async saveTask(task: Task): Promise<void> {\n const taskWithMeta: Task = {\n ...task,\n meta: {\n ...task.meta,\n projectId: this.projectId,\n createdAt: task.meta?.createdAt || new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n createdBy: task.meta?.createdBy || this.session?.user.id || 'unknown',\n },\n };\n\n try {\n await this.client.createTask(taskWithMeta);\n } catch (error) {\n // Store pending for later sync\n this.addPendingTask(taskWithMeta, 'create');\n throw error;\n }\n }\n\n async updateTask(id: string, updates: Partial<Task>): Promise<void> {\n try {\n await this.client.updateTask(id, updates);\n } catch (error) {\n // Store pending for later sync\n const pending = this.getPendingTasks();\n const existing = pending.find((p) => p.task.id === id);\n if (existing) {\n existing.task = { ...existing.task, ...updates };\n existing.action = 'update';\n existing.timestamp = Date.now();\n this.savePendingTasks(pending);\n }\n throw error;\n }\n }\n\n async uploadFile(file: File): Promise<{ url: string; path: string }> {\n // Try user's API route first\n try {\n const localResponse = await fetch('/api/framed/upload', {\n method: 'POST',\n body: this.createFormData(file),\n });\n\n if (localResponse.ok) {\n return localResponse.json();\n }\n } catch {\n // Local route not available, fall back to Framed CDN\n }\n\n // Fall back to Framed temp storage\n const response = await this.client.uploadFile(file);\n return response;\n }\n\n private createFormData(file: File): FormData {\n const formData = new FormData();\n formData.append('file', file);\n return formData;\n }\n\n async checkLimits(): Promise<LimitStatus> {\n const session = await this.getSession();\n if (!session) {\n return {\n canSubmitFeedback: false,\n feedbackRemaining: 0,\n canUseAI: false,\n aiParsesRemaining: 0,\n };\n }\n\n const { limits } = session;\n const feedbackRemaining = limits.feedbackPerMonth - limits.feedbackUsed;\n const aiParsesRemaining = limits.aiParsesPerMonth - limits.aiParsesUsed;\n\n return {\n canSubmitFeedback: feedbackRemaining > 0,\n feedbackRemaining: Math.max(0, feedbackRemaining),\n canUseAI: aiParsesRemaining > 0,\n aiParsesRemaining: Math.max(0, aiParsesRemaining),\n };\n }\n\n async sync(): Promise<SyncResult> {\n const pending = this.getPendingTasks();\n if (pending.length === 0) {\n return { success: true, syncedTasks: 0 };\n }\n\n const errors: string[] = [];\n let synced = 0;\n\n for (const item of pending) {\n try {\n if (item.action === 'create') {\n await this.client.createTask(item.task);\n } else {\n await this.client.updateTask(item.task.id, item.task);\n }\n synced++;\n } catch (error) {\n errors.push(\n `Failed to sync task ${item.task.id}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n // Remove synced tasks from pending (keep only those that failed)\n const remaining = pending.filter((item) => {\n return errors.some((e) => e.includes(item.task.id));\n });\n this.savePendingTasks(remaining);\n\n return {\n success: errors.length === 0,\n syncedTasks: synced,\n errors: errors.length > 0 ? errors : undefined,\n };\n }\n\n // Pending tasks management for offline support\n\n private getPendingTasks(): PendingTask[] {\n if (typeof window === 'undefined') return [];\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.PENDING_TASKS);\n return stored ? JSON.parse(stored) : [];\n } catch {\n return [];\n }\n }\n\n private savePendingTasks(tasks: PendingTask[]): void {\n if (typeof window === 'undefined') return;\n localStorage.setItem(STORAGE_KEYS.PENDING_TASKS, JSON.stringify(tasks));\n }\n\n private addPendingTask(task: Task, action: 'create' | 'update'): void {\n const pending = this.getPendingTasks();\n pending.push({ task, action, timestamp: Date.now() });\n this.savePendingTasks(pending);\n }\n\n // Auth methods\n\n async validateMagicToken(\n token: string\n ): Promise<{ valid: boolean; session?: Session; error?: string }> {\n const result = await this.client.validateMagicToken(token);\n if (result.valid && result.session) {\n this.cacheSession(result.session);\n }\n return result;\n }\n\n async exchangeSessionToken(\n sessionToken: string\n ): Promise<{ valid: boolean; session?: Session; error?: string }> {\n const result = await this.client.exchangeSessionToken(sessionToken);\n if (result.valid && result.session) {\n this.cacheSession(result.session);\n }\n return result;\n }\n\n clearSession(): void {\n this.session = null;\n if (typeof window !== 'undefined') {\n localStorage.removeItem(STORAGE_KEYS.SESSION);\n }\n }\n\n // Mark task as done (used by AI tools)\n async markTaskDone(taskId: string): Promise<void> {\n await this.client.markTaskDone(taskId);\n }\n}\n","import React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n type ReactNode,\n} from 'react';\nimport type { AuthConfig, Session, UsageLimits } from '@framed/core';\nimport { SyncDataLayer } from '../data/SyncDataLayer';\n\ninterface AuthContextValue {\n isAuthenticated: boolean;\n session: Session | null;\n isLoading: boolean;\n error: string | null;\n login: () => void;\n logout: () => void;\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nconst FRAMED_AUTH_URL = 'https://framed.dev/auth/sdk';\n\nfunction createDevSession(): Session {\n return {\n id: 'dev_session',\n user: {\n id: 'dev_user',\n name: 'Developer',\n },\n permissions: {\n canSubmitFeedback: true,\n canViewTasks: true,\n canEditTasks: true,\n },\n limits: {\n feedbackPerMonth: 999,\n feedbackUsed: 0,\n aiParsesPerMonth: 999,\n aiParsesUsed: 0,\n projects: 999,\n reviewersPerProject: 999,\n historyRetentionDays: 365,\n },\n expiresAt: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),\n };\n}\n\nfunction createLocalSession(): Session {\n return {\n id: 'local_session',\n user: {\n id: 'local_user',\n name: 'Local User',\n },\n permissions: {\n canSubmitFeedback: true,\n canViewTasks: true,\n canEditTasks: true,\n },\n limits: {\n feedbackPerMonth: 10,\n feedbackUsed: 0,\n aiParsesPerMonth: 0,\n aiParsesUsed: 0,\n projects: 1,\n reviewersPerProject: 0,\n historyRetentionDays: 30,\n },\n expiresAt: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),\n };\n}\n\nfunction cleanUrl(param: string): void {\n if (typeof window === 'undefined') return;\n const url = new URL(window.location.href);\n url.searchParams.delete(param);\n window.history.replaceState({}, '', url.toString());\n}\n\ninterface AuthProviderProps {\n config: AuthConfig;\n projectId: string;\n apiKey?: string;\n supabaseUrl?: string;\n children: ReactNode;\n}\n\nexport function AuthProvider({\n config,\n projectId,\n apiKey,\n supabaseUrl,\n children,\n}: AuthProviderProps) {\n const [session, setSession] = useState<Session | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const initAuth = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n // Dev mode: always authenticated\n if (config.mode === 'dev') {\n setSession(createDevSession());\n setIsLoading(false);\n return;\n }\n\n // Local mode: anonymous session with limits\n if (config.mode === 'local') {\n setSession(createLocalSession());\n setIsLoading(false);\n return;\n }\n\n // For sync modes, we need an API key and supabaseUrl\n if (!apiKey || !supabaseUrl) {\n setError('API key and Supabase URL required for sync mode');\n setIsLoading(false);\n return;\n }\n\n const dataLayer = new SyncDataLayer(projectId, { apiKey, supabaseUrl });\n\n // Check existing session\n const existingSession = await dataLayer.getSession();\n if (existingSession) {\n setSession(existingSession);\n setIsLoading(false);\n return;\n }\n\n // Magic link: check URL for token\n if (config.mode === 'magic_link') {\n const token = new URLSearchParams(window.location.search).get(\n 'framed_token'\n );\n if (token) {\n const result = await dataLayer.validateMagicToken(token);\n if (result.valid && result.session) {\n setSession(result.session);\n cleanUrl('framed_token');\n } else {\n setError(result.error || 'Invalid or expired link');\n }\n }\n }\n\n // Framed login: check callback\n if (config.mode === 'framed_login') {\n const sessionToken = new URLSearchParams(window.location.search).get(\n 'framed_session'\n );\n if (sessionToken) {\n const result = await dataLayer.exchangeSessionToken(sessionToken);\n if (result.valid && result.session) {\n setSession(result.session);\n cleanUrl('framed_session');\n } else {\n setError(result.error || 'Login failed');\n }\n }\n }\n } catch (err) {\n setError('Authentication failed');\n } finally {\n setIsLoading(false);\n }\n }, [config.mode, projectId, apiKey, supabaseUrl]);\n\n useEffect(() => {\n initAuth();\n }, [initAuth]);\n\n const login = useCallback(() => {\n if (config.mode !== 'framed_login') return;\n\n const returnUrl = encodeURIComponent(window.location.href);\n window.location.href = `${FRAMED_AUTH_URL}?project=${projectId}&return=${returnUrl}`;\n }, [config.mode, projectId]);\n\n const logout = useCallback(() => {\n if (apiKey && supabaseUrl) {\n const dataLayer = new SyncDataLayer(projectId, { apiKey, supabaseUrl });\n dataLayer.clearSession();\n }\n setSession(null);\n }, [projectId, apiKey, supabaseUrl]);\n\n const isAuthenticated = session !== null;\n\n return (\n <AuthContext.Provider\n value={{\n isAuthenticated,\n session,\n isLoading,\n error,\n login,\n logout,\n }}\n >\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport function useAuth(): AuthContextValue {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n}\n","// LocalDataLayer - localStorage-based storage for Free tier\nimport type {\n Task,\n Session,\n WidgetDataLayer,\n LimitStatus,\n SyncResult,\n} from '@framed/core';\n\nconst STORAGE_KEYS = {\n TASKS: 'framed_tasks',\n SESSION: 'framed_session',\n USAGE: 'framed_usage',\n} as const;\n\nconst FREE_TIER_LIMITS = {\n feedbackPerMonth: 10,\n aiParsesPerMonth: 0,\n historyRetentionDays: 30,\n};\n\ninterface LocalUsage {\n feedbackUsed: number;\n resetDate: string;\n}\n\nfunction generateId(): string {\n return `local_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction getStoredTasks(): Task[] {\n if (typeof window === 'undefined') return [];\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.TASKS);\n return stored ? JSON.parse(stored) : [];\n } catch {\n return [];\n }\n}\n\nfunction setStoredTasks(tasks: Task[]): void {\n if (typeof window === 'undefined') return;\n localStorage.setItem(STORAGE_KEYS.TASKS, JSON.stringify(tasks));\n}\n\nfunction getUsage(): LocalUsage {\n if (typeof window === 'undefined') {\n return { feedbackUsed: 0, resetDate: getResetDate() };\n }\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.USAGE);\n if (stored) {\n const usage = JSON.parse(stored) as LocalUsage;\n // Reset if new month\n if (new Date(usage.resetDate) < new Date()) {\n const newUsage = { feedbackUsed: 0, resetDate: getResetDate() };\n localStorage.setItem(STORAGE_KEYS.USAGE, JSON.stringify(newUsage));\n return newUsage;\n }\n return usage;\n }\n const newUsage = { feedbackUsed: 0, resetDate: getResetDate() };\n localStorage.setItem(STORAGE_KEYS.USAGE, JSON.stringify(newUsage));\n return newUsage;\n } catch {\n return { feedbackUsed: 0, resetDate: getResetDate() };\n }\n}\n\nfunction incrementUsage(): void {\n if (typeof window === 'undefined') return;\n const usage = getUsage();\n usage.feedbackUsed += 1;\n localStorage.setItem(STORAGE_KEYS.USAGE, JSON.stringify(usage));\n}\n\nfunction getResetDate(): string {\n const now = new Date();\n return new Date(now.getFullYear(), now.getMonth() + 1, 1).toISOString();\n}\n\nexport class LocalDataLayer implements WidgetDataLayer {\n private projectId: string;\n\n constructor(projectId: string) {\n this.projectId = projectId;\n }\n\n async getSession(): Promise<Session | null> {\n // Local mode uses anonymous session\n const usage = getUsage();\n return {\n id: 'local_session',\n user: {\n id: 'local_user',\n name: 'Local User',\n },\n permissions: {\n canSubmitFeedback: true,\n canViewTasks: true,\n canEditTasks: true,\n },\n limits: {\n feedbackPerMonth: FREE_TIER_LIMITS.feedbackPerMonth,\n feedbackUsed: usage.feedbackUsed,\n aiParsesPerMonth: FREE_TIER_LIMITS.aiParsesPerMonth,\n aiParsesUsed: 0,\n projects: 1,\n reviewersPerProject: 0,\n historyRetentionDays: FREE_TIER_LIMITS.historyRetentionDays,\n },\n expiresAt: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),\n };\n }\n\n async loadTasks(page?: string): Promise<Task[]> {\n const tasks = getStoredTasks().filter(\n (t) => t.meta.projectId === this.projectId\n );\n\n if (page) {\n return tasks.filter((t) => t.page.path === page);\n }\n\n return tasks;\n }\n\n async saveTask(task: Task): Promise<void> {\n const limits = await this.checkLimits();\n if (!limits.canSubmitFeedback) {\n throw new Error(\n `Monthly feedback limit reached (${FREE_TIER_LIMITS.feedbackPerMonth}). Upgrade to Pro for unlimited feedback.`\n );\n }\n\n const tasks = getStoredTasks();\n const newTask: Task = {\n ...task,\n id: task.id || generateId(),\n meta: {\n ...task.meta,\n projectId: this.projectId,\n createdAt: task.meta?.createdAt || new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n createdBy: task.meta?.createdBy || 'local_user',\n },\n };\n\n tasks.push(newTask);\n setStoredTasks(tasks);\n incrementUsage();\n }\n\n async updateTask(id: string, updates: Partial<Task>): Promise<void> {\n const tasks = getStoredTasks();\n const existingTask = tasks.find((t) => t.id === id);\n\n if (!existingTask) {\n throw new Error(`Task ${id} not found`);\n }\n\n const updatedTask: Task = {\n ...existingTask,\n ...updates,\n id: existingTask.id, // Preserve required fields\n type: updates.type ?? existingTask.type,\n status: updates.status ?? existingTask.status,\n page: updates.page ?? existingTask.page,\n feedback: updates.feedback ?? existingTask.feedback,\n task: updates.task ?? existingTask.task,\n meta: {\n ...existingTask.meta,\n ...updates.meta,\n updatedAt: new Date().toISOString(),\n },\n };\n\n const index = tasks.findIndex((t) => t.id === id);\n tasks[index] = updatedTask;\n setStoredTasks(tasks);\n }\n\n async uploadFile(file: File): Promise<{ url: string; path: string }> {\n // Local mode stores files as data URLs (limited but works offline)\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n const path = `local/${this.projectId}/${Date.now()}_${file.name}`;\n resolve({ url: dataUrl, path });\n };\n reader.onerror = () => reject(new Error('Failed to read file'));\n reader.readAsDataURL(file);\n });\n }\n\n async checkLimits(): Promise<LimitStatus> {\n const usage = getUsage();\n const feedbackRemaining =\n FREE_TIER_LIMITS.feedbackPerMonth - usage.feedbackUsed;\n\n return {\n canSubmitFeedback: feedbackRemaining > 0,\n feedbackRemaining: Math.max(0, feedbackRemaining),\n canUseAI: false, // AI not available in local mode\n aiParsesRemaining: 0,\n };\n }\n\n // Local mode doesn't have sync\n sync = undefined;\n\n // Utility methods for local data management\n\n async deleteTask(id: string): Promise<void> {\n const tasks = getStoredTasks();\n const filtered = tasks.filter((t) => t.id !== id);\n setStoredTasks(filtered);\n }\n\n async clearAllTasks(): Promise<void> {\n const tasks = getStoredTasks().filter(\n (t) => t.meta.projectId !== this.projectId\n );\n setStoredTasks(tasks);\n }\n\n async exportTasks(): Promise<string> {\n const tasks = await this.loadTasks();\n return JSON.stringify(tasks, null, 2);\n }\n}\n","import React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n type ReactNode,\n} from 'react';\nimport type {\n FramedConfig,\n Task,\n Session,\n WidgetDataLayer,\n LimitStatus,\n WidgetFeatures,\n} from '@framed/core';\nimport { AuthProvider, useAuth } from './AuthProvider';\nimport { LocalDataLayer } from '../data/LocalDataLayer';\nimport { SyncDataLayer } from '../data/SyncDataLayer';\n\nconst CDN_BASE_URL = 'https://cdn.framed.dev/widget';\n\ntype WidgetVersion = 'latest' | 'v3' | string;\ntype WidgetSource = 'cdn' | 'bundled';\n\nexport interface FramedProviderConfig extends FramedConfig {\n widgetVersion?: WidgetVersion;\n widgetSource?: WidgetSource;\n}\n\ninterface FramedContextValue {\n // Config\n config: FramedProviderConfig;\n projectId: string;\n\n // Auth\n isAuthenticated: boolean;\n session: Session | null;\n isAuthLoading: boolean;\n authError: string | null;\n login: () => void;\n logout: () => void;\n\n // Data layer\n dataLayer: WidgetDataLayer;\n\n // Tasks\n tasks: Task[];\n openTasks: Task[];\n isTasksLoading: boolean;\n refreshTasks: () => Promise<void>;\n saveTask: (task: Task) => Promise<void>;\n updateTask: (id: string, updates: Partial<Task>) => Promise<void>;\n\n // Limits\n limits: LimitStatus | null;\n checkLimits: () => Promise<LimitStatus>;\n\n // Features\n features: WidgetFeatures;\n\n // Widget ready state\n isWidgetReady: boolean;\n}\n\nconst FramedContext = createContext<FramedContextValue | null>(null);\n\n// Default features for free tier\nconst DEFAULT_FEATURES: WidgetFeatures = {\n elementSelect: true,\n textEdit: true,\n annotate: true,\n screenshot: true,\n regionSelect: true,\n screenRecording: false,\n voiceInput: false,\n mobilePreview: false,\n feedbackDrawer: true,\n multiplayer: false,\n presence: false,\n assignments: false,\n mentions: false,\n activityFeed: false,\n teamRoles: false,\n};\n\nfunction loadWidgetFromCDN(version: WidgetVersion): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if already loaded\n if ((window as unknown as { __FRAMED_WIDGET_LOADED__?: boolean }).__FRAMED_WIDGET_LOADED__) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n const versionPath = version === 'latest' ? 'latest' : version;\n script.src = `${CDN_BASE_URL}/${versionPath}/widget.js`;\n script.async = true;\n\n script.onload = () => {\n (window as unknown as { __FRAMED_WIDGET_LOADED__?: boolean }).__FRAMED_WIDGET_LOADED__ = true;\n resolve();\n };\n script.onerror = () => {\n reject(new Error(`Failed to load widget from CDN: ${script.src}`));\n };\n\n document.head.appendChild(script);\n });\n}\n\ninterface FramedProviderInnerProps {\n config: FramedProviderConfig;\n children: ReactNode;\n}\n\nfunction FramedProviderInner({ config, children }: FramedProviderInnerProps) {\n const auth = useAuth();\n const [tasks, setTasks] = useState<Task[]>([]);\n const [isTasksLoading, setIsTasksLoading] = useState(false);\n const [limits, setLimits] = useState<LimitStatus | null>(null);\n const [isWidgetReady, setIsWidgetReady] = useState(false);\n\n // Create data layer based on mode\n const dataLayer = useMemo<WidgetDataLayer>(() => {\n if (config.mode === 'local') {\n return new LocalDataLayer(config.projectId);\n }\n return new SyncDataLayer(config.projectId, {\n apiKey: config.sync?.apiKey || '',\n supabaseUrl: config.sync?.supabaseUrl || '',\n });\n }, [config.mode, config.projectId, config.sync?.apiKey, config.sync?.supabaseUrl]);\n\n // Load widget from CDN\n useEffect(() => {\n const widgetSource = config.widgetSource || 'cdn';\n const widgetVersion = config.widgetVersion || 'latest';\n\n if (widgetSource === 'cdn') {\n loadWidgetFromCDN(widgetVersion)\n .then(() => setIsWidgetReady(true))\n .catch((error) => {\n console.error('Failed to load Framed widget:', error);\n // Still mark as ready to allow bundled fallback\n setIsWidgetReady(true);\n });\n } else {\n // Bundled mode - widget is already included\n setIsWidgetReady(true);\n }\n }, [config.widgetSource, config.widgetVersion]);\n\n // Load tasks when authenticated\n const refreshTasks = async () => {\n if (!auth.isAuthenticated) return;\n\n setIsTasksLoading(true);\n try {\n const loadedTasks = await dataLayer.loadTasks();\n setTasks(loadedTasks);\n } catch (error) {\n console.error('Failed to load tasks:', error);\n } finally {\n setIsTasksLoading(false);\n }\n };\n\n useEffect(() => {\n if (auth.isAuthenticated && !auth.isLoading) {\n refreshTasks();\n }\n }, [auth.isAuthenticated, auth.isLoading]);\n\n // Check limits\n const checkLimits = async (): Promise<LimitStatus> => {\n const newLimits = await dataLayer.checkLimits();\n setLimits(newLimits);\n return newLimits;\n };\n\n // Save task\n const saveTask = async (task: Task) => {\n await dataLayer.saveTask(task);\n await refreshTasks();\n };\n\n // Update task\n const updateTask = async (id: string, updates: Partial<Task>) => {\n await dataLayer.updateTask(id, updates);\n await refreshTasks();\n };\n\n // Compute open tasks\n const openTasks = useMemo(\n () => tasks.filter((t) => t.status === 'open'),\n [tasks]\n );\n\n // Merge default features with config\n const features = useMemo<WidgetFeatures>(\n () => ({\n ...DEFAULT_FEATURES,\n ...config.features,\n }),\n [config.features]\n );\n\n const value: FramedContextValue = {\n config,\n projectId: config.projectId,\n\n isAuthenticated: auth.isAuthenticated,\n session: auth.session,\n isAuthLoading: auth.isLoading,\n authError: auth.error,\n login: auth.login,\n logout: auth.logout,\n\n dataLayer,\n\n tasks,\n openTasks,\n isTasksLoading,\n refreshTasks,\n saveTask,\n updateTask,\n\n limits,\n checkLimits,\n\n features,\n\n isWidgetReady,\n };\n\n return (\n <FramedContext.Provider value={value}>{children}</FramedContext.Provider>\n );\n}\n\nexport interface FramedProviderProps {\n config: FramedProviderConfig;\n children: ReactNode;\n}\n\nexport function FramedProvider({ config, children }: FramedProviderProps) {\n return (\n <AuthProvider\n config={config.auth}\n projectId={config.projectId}\n apiKey={config.sync?.apiKey}\n supabaseUrl={config.sync?.supabaseUrl}\n >\n <FramedProviderInner config={config}>{children}</FramedProviderInner>\n </AuthProvider>\n );\n}\n\nexport function useFramed(): FramedContextValue {\n const context = useContext(FramedContext);\n if (!context) {\n throw new Error('useFramed must be used within a FramedProvider');\n }\n return context;\n}\n","// Widget store using Zustand\n\nimport { create } from 'zustand';\nimport type {\n AnnotationMode,\n ViewportMode,\n FeedbackComment,\n PendingAttachment,\n Position,\n WidgetFeatures,\n} from '@framed/core';\n\nexport interface WidgetState {\n // Widget visibility\n isOpen: boolean;\n\n // Panel state\n feedbackPanelOpen: boolean;\n quickInputOpen: boolean;\n chatModalOpen: boolean;\n exportModalOpen: boolean;\n\n // Annotation mode\n annotationMode: AnnotationMode;\n annotationColor: string;\n\n // Selection\n selectedElement: HTMLElement | null;\n hoveredElement: HTMLElement | null;\n originalText: string;\n editedText: string;\n\n // Drawing\n isDrawing: boolean;\n drawingPaths: { points: Position[]; color: string }[];\n currentPath: Position[];\n\n // Feedback\n comments: FeedbackComment[];\n showResolved: boolean;\n\n // Capture\n isCapturing: boolean;\n isRegionSelectMode: boolean;\n isRecording: boolean;\n\n // Animation control\n animationsPaused: boolean;\n\n // Multi-select\n isMultiSelectMode: boolean;\n multiSelectedElements: HTMLElement[];\n selectionRect: { startX: number; startY: number; endX: number; endY: number } | null;\n\n // Area annotation\n isAreaAnnotateMode: boolean;\n areaAnnotations: { id: string; x: number; y: number; width: number; height: number }[];\n\n // Attachments\n pendingAttachments: PendingAttachment[];\n\n // Viewport\n viewportMode: ViewportMode;\n\n // Current page\n currentPageUrl: string;\n\n // Features (from tier)\n features: WidgetFeatures;\n\n // Toast messages\n toast: { message: string; type: 'info' | 'success' | 'error' } | null;\n}\n\nexport interface WidgetActions {\n // Widget visibility\n open: () => void;\n close: () => void;\n toggle: () => void;\n\n // Panel actions\n openFeedbackPanel: () => void;\n closeFeedbackPanel: () => void;\n toggleFeedbackPanel: () => void;\n openQuickInput: () => void;\n closeQuickInput: () => void;\n openChatModal: () => void;\n closeChatModal: () => void;\n openExportModal: () => void;\n closeExportModal: () => void;\n\n // Annotation mode\n setAnnotationMode: (mode: AnnotationMode) => void;\n setAnnotationColor: (color: string) => void;\n\n // Selection\n setSelectedElement: (element: HTMLElement | null) => void;\n setHoveredElement: (element: HTMLElement | null) => void;\n setOriginalText: (text: string) => void;\n setEditedText: (text: string) => void;\n clearSelection: () => void;\n\n // Drawing\n setIsDrawing: (drawing: boolean) => void;\n addDrawingPath: (path: { points: Position[]; color: string }) => void;\n clearDrawingPaths: () => void;\n setCurrentPath: (path: Position[]) => void;\n addToCurrentPath: (point: Position) => void;\n\n // Feedback\n setComments: (comments: FeedbackComment[]) => void;\n addComment: (comment: FeedbackComment) => void;\n updateComment: (id: string, updates: Partial<FeedbackComment>) => void;\n toggleResolved: (id: string) => void;\n setShowResolved: (show: boolean) => void;\n\n // Capture\n setIsCapturing: (capturing: boolean) => void;\n setIsRegionSelectMode: (mode: boolean) => void;\n setIsRecording: (recording: boolean) => void;\n\n // Animation control\n toggleAnimationsPaused: () => void;\n setAnimationsPaused: (paused: boolean) => void;\n\n // Multi-select\n setIsMultiSelectMode: (mode: boolean) => void;\n setMultiSelectedElements: (elements: HTMLElement[]) => void;\n addMultiSelectedElement: (element: HTMLElement) => void;\n clearMultiSelection: () => void;\n setSelectionRect: (rect: { startX: number; startY: number; endX: number; endY: number } | null) => void;\n\n // Area annotation\n setIsAreaAnnotateMode: (mode: boolean) => void;\n addAreaAnnotation: (annotation: { id: string; x: number; y: number; width: number; height: number }) => void;\n removeAreaAnnotation: (id: string) => void;\n clearAreaAnnotations: () => void;\n\n // Attachments\n addAttachment: (attachment: PendingAttachment) => void;\n removeAttachment: (id: string) => void;\n clearAttachments: () => void;\n\n // Viewport\n setViewportMode: (mode: ViewportMode) => void;\n\n // Page\n setCurrentPageUrl: (url: string) => void;\n\n // Features\n setFeatures: (features: WidgetFeatures) => void;\n\n // Toast\n showToast: (message: string, type?: 'info' | 'success' | 'error') => void;\n hideToast: () => void;\n\n // Reset\n reset: () => void;\n}\n\nexport type WidgetStore = WidgetState & WidgetActions;\n\nconst defaultFeatures: WidgetFeatures = {\n elementSelect: true,\n textEdit: true,\n annotate: true,\n screenshot: true,\n regionSelect: true,\n screenRecording: false,\n voiceInput: false,\n mobilePreview: false,\n feedbackDrawer: true,\n multiplayer: false,\n presence: false,\n assignments: false,\n mentions: false,\n activityFeed: false,\n teamRoles: false,\n};\n\nconst initialState: WidgetState = {\n isOpen: true,\n feedbackPanelOpen: false,\n quickInputOpen: false,\n chatModalOpen: false,\n exportModalOpen: false,\n annotationMode: null,\n annotationColor: '#3b82f6',\n selectedElement: null,\n hoveredElement: null,\n originalText: '',\n editedText: '',\n isDrawing: false,\n drawingPaths: [],\n currentPath: [],\n comments: [],\n showResolved: false,\n isCapturing: false,\n isRegionSelectMode: false,\n isRecording: false,\n animationsPaused: false,\n isMultiSelectMode: false,\n multiSelectedElements: [],\n selectionRect: null,\n isAreaAnnotateMode: false,\n areaAnnotations: [],\n pendingAttachments: [],\n viewportMode: 'desktop',\n currentPageUrl: typeof window !== 'undefined' ? window.location.href : '',\n features: defaultFeatures,\n toast: null,\n};\n\nexport const useWidgetStore = create<WidgetStore>((set, get) => ({\n ...initialState,\n\n // Widget visibility\n open: () => set({ isOpen: true }),\n close: () => set({ isOpen: false }),\n toggle: () => set((state) => ({ isOpen: !state.isOpen })),\n\n // Panel actions\n openFeedbackPanel: () => set({ feedbackPanelOpen: true }),\n closeFeedbackPanel: () => set({ feedbackPanelOpen: false }),\n toggleFeedbackPanel: () =>\n set((state) => ({ feedbackPanelOpen: !state.feedbackPanelOpen })),\n openQuickInput: () => set({ quickInputOpen: true }),\n closeQuickInput: () => {\n const { selectedElement, originalText } = get();\n\n // Restore original text if element was being edited\n if (selectedElement?.getAttribute('data-framed-editing')) {\n const original =\n selectedElement.getAttribute('data-framed-original') || originalText;\n if (original) {\n selectedElement.textContent = original;\n }\n selectedElement.removeAttribute('data-framed-editing');\n selectedElement.removeAttribute('data-framed-original');\n }\n\n set({\n quickInputOpen: false,\n selectedElement: null,\n originalText: '',\n editedText: '',\n });\n },\n openChatModal: () => set({ chatModalOpen: true }),\n closeChatModal: () => set({ chatModalOpen: false }),\n openExportModal: () => set({ exportModalOpen: true }),\n closeExportModal: () => set({ exportModalOpen: false }),\n\n // Annotation mode\n setAnnotationMode: (mode) => {\n const { annotationMode, closeQuickInput } = get();\n\n // Toggle off if same mode\n if (annotationMode === mode) {\n set({ annotationMode: null });\n document.body.style.cursor = '';\n } else {\n // Clean up previous mode\n closeQuickInput();\n set({\n annotationMode: mode,\n isRegionSelectMode: false,\n });\n document.body.style.cursor = mode ? 'crosshair' : '';\n }\n },\n setAnnotationColor: (color) => set({ annotationColor: color }),\n\n // Selection\n setSelectedElement: (element) => set({ selectedElement: element }),\n setHoveredElement: (element) => set({ hoveredElement: element }),\n setOriginalText: (text) => set({ originalText: text }),\n setEditedText: (text) => set({ editedText: text }),\n clearSelection: () =>\n set({\n selectedElement: null,\n hoveredElement: null,\n originalText: '',\n editedText: '',\n }),\n\n // Drawing\n setIsDrawing: (drawing) => set({ isDrawing: drawing }),\n addDrawingPath: (path) =>\n set((state) => ({ drawingPaths: [...state.drawingPaths, path] })),\n clearDrawingPaths: () => set({ drawingPaths: [], currentPath: [] }),\n setCurrentPath: (path) => set({ currentPath: path }),\n addToCurrentPath: (point) =>\n set((state) => ({ currentPath: [...state.currentPath, point] })),\n\n // Feedback\n setComments: (comments) => set({ comments }),\n addComment: (comment) =>\n set((state) => ({ comments: [...state.comments, comment] })),\n updateComment: (id, updates) =>\n set((state) => ({\n comments: state.comments.map((c) =>\n c.id === id ? { ...c, ...updates } : c\n ),\n })),\n toggleResolved: (id) =>\n set((state) => ({\n comments: state.comments.map((c) =>\n c.id === id ? { ...c, resolved: !c.resolved } : c\n ),\n })),\n setShowResolved: (show) => set({ showResolved: show }),\n\n // Capture\n setIsCapturing: (capturing) => set({ isCapturing: capturing }),\n setIsRegionSelectMode: (mode) => set({ isRegionSelectMode: mode }),\n setIsRecording: (recording) => set({ isRecording: recording }),\n\n // Animation control\n toggleAnimationsPaused: () => {\n const { animationsPaused } = get();\n const newPaused = !animationsPaused;\n\n // Apply or remove the animation pause style\n const styleId = 'framed-animation-pause';\n const existingStyle = document.getElementById(styleId);\n\n if (newPaused) {\n if (!existingStyle) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `\n *, *::before, *::after {\n animation-play-state: paused !important;\n transition: none !important;\n }\n `;\n document.head.appendChild(style);\n }\n } else {\n existingStyle?.remove();\n }\n\n set({ animationsPaused: newPaused });\n },\n setAnimationsPaused: (paused) => {\n const styleId = 'framed-animation-pause';\n const existingStyle = document.getElementById(styleId);\n\n if (paused) {\n if (!existingStyle) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `\n *, *::before, *::after {\n animation-play-state: paused !important;\n transition: none !important;\n }\n `;\n document.head.appendChild(style);\n }\n } else {\n existingStyle?.remove();\n }\n\n set({ animationsPaused: paused });\n },\n\n // Multi-select\n setIsMultiSelectMode: (mode) => {\n set({\n isMultiSelectMode: mode,\n multiSelectedElements: mode ? [] : [],\n selectionRect: null,\n });\n },\n setMultiSelectedElements: (elements) => set({ multiSelectedElements: elements }),\n addMultiSelectedElement: (element) =>\n set((state) => {\n if (state.multiSelectedElements.includes(element)) {\n return state;\n }\n return { multiSelectedElements: [...state.multiSelectedElements, element] };\n }),\n clearMultiSelection: () => set({ multiSelectedElements: [], selectionRect: null }),\n setSelectionRect: (rect) => set({ selectionRect: rect }),\n\n // Area annotation\n setIsAreaAnnotateMode: (mode) => set({ isAreaAnnotateMode: mode }),\n addAreaAnnotation: (annotation) =>\n set((state) => ({ areaAnnotations: [...state.areaAnnotations, annotation] })),\n removeAreaAnnotation: (id) =>\n set((state) => ({\n areaAnnotations: state.areaAnnotations.filter((a) => a.id !== id),\n })),\n clearAreaAnnotations: () => set({ areaAnnotations: [] }),\n\n // Attachments\n addAttachment: (attachment) =>\n set((state) => ({\n pendingAttachments: [...state.pendingAttachments, attachment],\n })),\n removeAttachment: (id) =>\n set((state) => ({\n pendingAttachments: state.pendingAttachments.filter((a) => a.id !== id),\n })),\n clearAttachments: () => set({ pendingAttachments: [] }),\n\n // Viewport\n setViewportMode: (mode) => set({ viewportMode: mode }),\n\n // Page\n setCurrentPageUrl: (url) => set({ currentPageUrl: url }),\n\n // Features\n setFeatures: (features) => set({ features }),\n\n // Toast\n showToast: (message, type = 'info') => {\n set({ toast: { message, type } });\n // Auto-hide after 3 seconds\n setTimeout(() => {\n set({ toast: null });\n }, 3000);\n },\n hideToast: () => set({ toast: null }),\n\n // Reset\n reset: () => set(initialState),\n}));\n\n// Selector hooks for better performance\nexport const useIsOpen = () => useWidgetStore((state) => state.isOpen);\nexport const useFeedbackPanelOpen = () =>\n useWidgetStore((state) => state.feedbackPanelOpen);\nexport const useQuickInputOpen = () =>\n useWidgetStore((state) => state.quickInputOpen);\nexport const useAnnotationMode = () =>\n useWidgetStore((state) => state.annotationMode);\nexport const useAnnotationColor = () =>\n useWidgetStore((state) => state.annotationColor);\nexport const useSelectedElement = () =>\n useWidgetStore((state) => state.selectedElement);\nexport const useComments = () => useWidgetStore((state) => state.comments);\nexport const useFeatures = () => useWidgetStore((state) => state.features);\nexport const useToast = () => useWidgetStore((state) => state.toast);\nexport const useAnimationsPaused = () =>\n useWidgetStore((state) => state.animationsPaused);\nexport const useIsMultiSelectMode = () =>\n useWidgetStore((state) => state.isMultiSelectMode);\nexport const useMultiSelectedElements = () =>\n useWidgetStore((state) => state.multiSelectedElements);\nexport const useSelectionRect = () =>\n useWidgetStore((state) => state.selectionRect);\nexport const useIsAreaAnnotateMode = () =>\n useWidgetStore((state) => state.isAreaAnnotateMode);\nexport const useAreaAnnotations = () =>\n useWidgetStore((state) => state.areaAnnotations);\n","// SVG Icons for the widget toolbar\n\nimport React from 'react';\n\ninterface IconProps {\n size?: number;\n className?: string;\n}\n\n// Framed Logo\nexport function FramedLogo({ size = 16 }: IconProps) {\n const height = Math.round((size / 67) * 93);\n return (\n <svg width={size} height={height} viewBox=\"0 0 67 93\" fill=\"none\">\n <path\n d=\"M22.2461 74V28.335C22.2461 25.2627 22.8428 22.7109 24.0361 20.6797C25.2549 18.6484 26.9053 17.125 28.9873 16.1094C31.0947 15.0938 33.4814 14.5859 36.1475 14.5859C37.9756 14.5859 39.6387 14.7383 41.1367 15.043C42.6602 15.3223 43.7773 15.5635 44.4883 15.7666L42.4316 24.6025C41.9492 24.4756 41.3779 24.3486 40.7178 24.2217C40.0576 24.0947 39.3594 24.0312 38.623 24.0312C36.8965 24.0312 35.6904 24.4375 35.0049 25.25C34.3193 26.0371 33.9766 27.1543 33.9766 28.6016V74H22.2461Z\"\n fill=\"#313131\"\n />\n <path\n d=\"M42.4697 31.4199V40.332H16.2285V31.4199H42.4697Z\"\n fill=\"#313131\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M49 17L47 26H58.5V17H49Z\"\n fill=\"#FFD500\"\n />\n </svg>\n );\n}\n\n// Cursor/Select icon\nexport function CursorIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <path d=\"M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z\" />\n <path d=\"M13 13l6 6\" />\n </svg>\n );\n}\n\n// Text Edit icon\nexport function TextEditIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n );\n}\n\n// Screenshot icon\nexport function ScreenshotIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <polyline points=\"21 15 16 10 5 21\" />\n </svg>\n );\n}\n\n// Region select icon\nexport function RegionIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <path d=\"M6 3H3v3M18 3h3v3M6 21H3v-3M18 21h3v-3\" />\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" />\n </svg>\n );\n}\n\n// Record icon\nexport function RecordIcon({\n size = 18,\n className,\n recording = false,\n}: IconProps & { recording?: boolean }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"4\"\n fill={recording ? '#ef4444' : 'currentColor'}\n />\n </svg>\n );\n}\n\n// Plus icon\nexport function PlusIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n\n// Chat/Comment icon\nexport function ChatIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n );\n}\n\n// Close icon\nexport function CloseIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\n// Check icon\nexport function CheckIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n// Send/Submit icon\nexport function SendIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n );\n}\n\n// File/Attachment icon\nexport function FileIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </svg>\n );\n}\n\n// Rich text/Underline icon\nexport function RichTextIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <path d=\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\" />\n <line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n </svg>\n );\n}\n\n// Info icon\nexport function InfoIcon({ size = 14, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n );\n}\n\n// Success/Check circle icon\nexport function SuccessIcon({ size = 14, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n );\n}\n\n// Error/X circle icon\nexport function ErrorIcon({ size = 14, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n}\n\n// Export icon\nexport function ExportIcon({ size = 16, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" />\n </svg>\n );\n}\n\n// Locate/Navigate icon\nexport function LocateIcon({ size = 14, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n <path d=\"M12 21.7C17.3 17 20 13 20 10a8 8 0 1 0-16 0c0 3 2.7 7 8 11.7z\" />\n </svg>\n );\n}\n\n// Copy icon\nexport function CopyIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\n// Download icon\nexport function DownloadIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n );\n}\n\n// Pause animations icon\nexport function PauseAnimationsIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"10\" y1=\"15\" x2=\"10\" y2=\"9\" />\n <line x1=\"14\" y1=\"15\" x2=\"14\" y2=\"9\" />\n </svg>\n );\n}\n\n// Play animations icon\nexport function PlayAnimationsIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polygon points=\"10 8 16 12 10 16 10 8\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// Multi-select icon (for drag selection mode)\nexport function MultiSelectIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n </svg>\n );\n}\n\n// Area annotation icon\nexport function AreaAnnotateIcon({ size = 18, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" strokeDasharray=\"4 2\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\" />\n <line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\" />\n </svg>\n );\n}\n","// Toast notification component - Dynamic Island style\n\nimport React from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport { InfoIcon, SuccessIcon, ErrorIcon, CloseIcon } from './Icons';\n\nexport function Toast() {\n const { toast, hideToast } = useWidgetStore();\n\n if (!toast) return null;\n\n const getIcon = () => {\n switch (toast.type) {\n case 'success':\n return <SuccessIcon size={14} />;\n case 'error':\n return <ErrorIcon size={14} />;\n default:\n return <InfoIcon size={14} />;\n }\n };\n\n const getIconColor = () => {\n switch (toast.type) {\n case 'success':\n return '#10b981';\n case 'error':\n return '#ef4444';\n default:\n return '#3b82f6';\n }\n };\n\n return (\n <div className=\"framed-toast\" data-framed-widget>\n <span className=\"framed-toast-icon\" style={{ color: getIconColor() }}>\n {getIcon()}\n </span>\n <span className=\"framed-toast-message\">{toast.message}</span>\n <button\n className=\"framed-toast-close\"\n onClick={hideToast}\n type=\"button\"\n aria-label=\"Dismiss\"\n >\n <CloseIcon size={14} />\n </button>\n </div>\n );\n}\n","// Utility functions for the widget\n\n/**\n * Normalize a page URL by removing query params (except hash routes)\n */\nexport function normalizePageUrl(url: string): string {\n try {\n const parsed = new URL(url);\n let normalized = parsed.origin + parsed.pathname;\n\n // Keep hash if it's a route\n if (\n parsed.hash &&\n (parsed.hash.startsWith('#/') ||\n parsed.hash.startsWith('#!') ||\n parsed.hash.includes('framed-view'))\n ) {\n normalized += parsed.hash;\n }\n\n return normalized.replace(/\\/$/, '').toLowerCase();\n } catch {\n const base = url.split('?')[0] ?? url;\n return base.replace(/\\/$/, '').toLowerCase();\n }\n}\n\n/**\n * Escape HTML to prevent XSS\n */\nexport function escapeHtml(text: string): string {\n if (!text) return '';\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n}\n\n/**\n * Format a date as relative time (e.g., \"2h ago\")\n */\nexport function formatTimeAgo(date: string | Date): string {\n const now = new Date();\n const d = new Date(date);\n const diff = Math.floor((now.getTime() - d.getTime()) / 1000);\n\n if (diff < 60) return 'just now';\n if (diff < 3600) return Math.floor(diff / 60) + 'm ago';\n if (diff < 86400) return Math.floor(diff / 3600) + 'h ago';\n if (diff < 604800) return Math.floor(diff / 86400) + 'd ago';\n return d.toLocaleDateString();\n}\n\n/**\n * Generate a unique ID\n */\nexport function generateId(): string {\n return (\n 'id-' + Date.now() + '-' + Math.random().toString(36).substring(2, 11)\n );\n}\n\n/**\n * Get a CSS selector for an element\n */\nexport function getElementSelector(element: HTMLElement): string {\n if (element.id) {\n return `#${element.id}`;\n }\n\n const path: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current !== document.body) {\n let selector = current.tagName.toLowerCase();\n\n if (current.id) {\n selector = `#${current.id}`;\n path.unshift(selector);\n break;\n }\n\n if (current.className) {\n const classes = current.className\n .split(' ')\n .filter((c) => c && !c.startsWith('framed-'))\n .slice(0, 2)\n .join('.');\n if (classes) {\n selector += `.${classes}`;\n }\n }\n\n // Add nth-child if needed\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (child) => child.tagName === current!.tagName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n selector += `:nth-of-type(${index})`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n}\n\n/**\n * Get element position as percentage of document\n */\nexport function getElementPosition(element: HTMLElement): {\n x: number;\n y: number;\n} {\n const rect = element.getBoundingClientRect();\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const docWidth = Math.max(\n document.body.scrollWidth,\n document.documentElement.scrollWidth\n );\n const docHeight = Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n );\n\n return {\n x: Math.round(((rect.left + rect.width / 2 + scrollX) / docWidth) * 100),\n y: Math.round(((rect.top + rect.height / 2 + scrollY) / docHeight) * 100),\n };\n}\n\n/**\n * Build element path string (e.g., \"div.container > h1\")\n */\nexport function getElementPath(element: HTMLElement): string {\n const pathParts: string[] = [];\n\n // Get parent info\n if (element.parentElement && element.parentElement.tagName !== 'BODY') {\n const parentTag = element.parentElement.tagName.toLowerCase();\n const parentClass = element.parentElement.className\n ? '.' + element.parentElement.className.split(' ')[0]\n : '';\n pathParts.push(parentTag + parentClass);\n }\n\n // Get element info\n const tag = element.tagName.toLowerCase();\n const text = element.textContent\n ? element.textContent.substring(0, 20).trim()\n : tag;\n const displayText =\n element.textContent && element.textContent.length > 20 ? text + '...' : text;\n pathParts.push(displayText || tag);\n\n return pathParts.join(' > ');\n}\n\n/**\n * Check if an element belongs to the Framed widget\n */\nexport function isFramedElement(element: HTMLElement | null): boolean {\n if (!element) return false;\n\n return !!(\n element.closest('#framed-widget-container') ||\n element.closest('[data-framed-widget]') ||\n element.closest('.framed-annotation')\n );\n}\n\n/**\n * Get current viewport type based on width\n */\nexport function getViewportType(): 'mobile' | 'tablet' | 'desktop' {\n const width = window.innerWidth;\n if (width <= 480) return 'mobile';\n if (width <= 768) return 'tablet';\n return 'desktop';\n}\n\n/**\n * Isolate keyboard events for an element (prevent propagation to host page)\n * Uses bubble phase to allow React synthetic events to work first\n */\nexport function isolateKeyboardEvents(element: HTMLElement): void {\n const eventTypes = ['keydown', 'keyup', 'keypress', 'input'];\n eventTypes.forEach((eventType) => {\n element.addEventListener(\n eventType,\n (e) => {\n // Stop propagation to host page, but don't use stopImmediatePropagation\n // as that would block React's event handlers\n e.stopPropagation();\n },\n false // Use bubble phase instead of capture phase\n );\n });\n}\n\n/**\n * Get parent element hierarchy (up to 3 levels)\n */\nexport function getParentHierarchy(\n element: HTMLElement,\n levels: number = 3\n): { tagName: string; id?: string; className?: string }[] {\n const hierarchy: { tagName: string; id?: string; className?: string }[] = [];\n let current: HTMLElement | null = element.parentElement;\n let count = 0;\n\n while (current && current !== document.body && count < levels) {\n const entry: { tagName: string; id?: string; className?: string } = {\n tagName: current.tagName.toLowerCase(),\n };\n\n if (current.id) {\n entry.id = current.id;\n }\n\n if (current.className && typeof current.className === 'string') {\n // Filter out framed-* classes and take first meaningful class\n const meaningfulClass = current.className\n .split(' ')\n .filter((c) => c && !c.startsWith('framed-'))\n .slice(0, 2)\n .join(' ');\n if (meaningfulClass) {\n entry.className = meaningfulClass;\n }\n }\n\n hierarchy.push(entry);\n current = current.parentElement;\n count++;\n }\n\n return hierarchy;\n}\n\n/**\n * Get page info\n */\nexport function getPageInfo(): { url: string; title: string } {\n return {\n url: window.location.href,\n title: document.title || window.location.pathname,\n };\n}\n\n/**\n * Get element metadata including ID, class, and parent hierarchy\n */\nexport function getElementMetadata(element: HTMLElement): {\n elementId?: string;\n elementClassName?: string;\n parentHierarchy: { tagName: string; id?: string; className?: string }[];\n} {\n const result: {\n elementId?: string;\n elementClassName?: string;\n parentHierarchy: { tagName: string; id?: string; className?: string }[];\n } = {\n parentHierarchy: getParentHierarchy(element),\n };\n\n if (element.id) {\n result.elementId = element.id;\n }\n\n if (element.className && typeof element.className === 'string') {\n const meaningfulClass = element.className\n .split(' ')\n .filter((c) => c && !c.startsWith('framed-'))\n .slice(0, 3)\n .join(' ');\n if (meaningfulClass) {\n result.elementClassName = meaningfulClass;\n }\n }\n\n return result;\n}\n","// Screenshot capture utility using html2canvas\n\nlet html2canvasLoaded = false;\nlet html2canvasPromise: Promise<void> | null = null;\n\n/**\n * Load html2canvas from CDN\n */\nexport function loadHtml2Canvas(): Promise<void> {\n if (html2canvasLoaded || (window as unknown as { html2canvas?: unknown }).html2canvas) {\n html2canvasLoaded = true;\n return Promise.resolve();\n }\n\n if (html2canvasPromise) {\n return html2canvasPromise;\n }\n\n html2canvasPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js';\n script.async = true;\n\n script.onload = () => {\n html2canvasLoaded = true;\n console.log('[Framed Widget] html2canvas loaded');\n resolve();\n };\n\n script.onerror = () => {\n html2canvasPromise = null;\n reject(new Error('Failed to load html2canvas'));\n };\n\n document.head.appendChild(script);\n });\n\n return html2canvasPromise;\n}\n\nexport interface CaptureOptions {\n /** Element to hide during capture (e.g., the widget itself) */\n hideElement?: HTMLElement | null;\n /** Region to capture (if not specified, captures full page) */\n region?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n /** Quality for JPEG/PNG (0-1) */\n quality?: number;\n /** Scale factor (default: devicePixelRatio, max 2) */\n scale?: number;\n}\n\nexport interface CaptureResult {\n blob: Blob;\n file: File;\n previewUrl: string;\n width: number;\n height: number;\n}\n\n/**\n * Capture a screenshot of the page or a specific region\n */\nexport async function captureScreenshot(\n options: CaptureOptions = {}\n): Promise<CaptureResult> {\n const { hideElement, region, quality = 0.9, scale } = options;\n\n // Load html2canvas if needed\n await loadHtml2Canvas();\n\n const html2canvas = (window as unknown as { html2canvas: (element: HTMLElement, options: Record<string, unknown>) => Promise<HTMLCanvasElement> }).html2canvas;\n\n if (!html2canvas) {\n throw new Error('html2canvas not available');\n }\n\n // Hide widget during capture\n const originalDisplay = hideElement?.style.display;\n if (hideElement) {\n hideElement.style.display = 'none';\n }\n\n try {\n const captureScale = scale ?? Math.min(window.devicePixelRatio, 2);\n\n const canvasOptions: Record<string, unknown> = {\n useCORS: true,\n allowTaint: true,\n backgroundColor: '#ffffff',\n scale: captureScale,\n logging: false,\n ignoreElements: (el: Element) => {\n // Ignore the Framed widget elements\n return (\n el.id === 'framed-widget-container' ||\n el.hasAttribute('data-framed-widget') ||\n el.id === 'framed-drawing-canvas' ||\n el.id === 'framed-region-overlay'\n );\n },\n };\n\n // Add region-specific options\n if (region) {\n canvasOptions.x = region.x + window.scrollX;\n canvasOptions.y = region.y + window.scrollY;\n canvasOptions.width = region.width;\n canvasOptions.height = region.height;\n }\n\n const canvas = await html2canvas(document.body, canvasOptions);\n\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error('Failed to create screenshot blob'));\n return;\n }\n\n const filename = `screenshot-${Date.now()}.png`;\n const file = new File([blob], filename, { type: 'image/png' });\n const previewUrl = URL.createObjectURL(blob);\n\n resolve({\n blob,\n file,\n previewUrl,\n width: canvas.width,\n height: canvas.height,\n });\n },\n 'image/png',\n quality\n );\n });\n } finally {\n // Restore widget visibility\n if (hideElement && originalDisplay !== undefined) {\n hideElement.style.display = originalDisplay;\n }\n }\n}\n\n/**\n * Revoke a preview URL to free memory\n */\nexport function revokePreviewUrl(url: string): void {\n URL.revokeObjectURL(url);\n}\n","// Figma-style floating toolbar component\n\nimport React, { useCallback, useRef } from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport {\n FramedLogo,\n CursorIcon,\n TextEditIcon,\n ScreenshotIcon,\n RegionIcon,\n RecordIcon,\n PlusIcon,\n ChatIcon,\n CloseIcon,\n PauseAnimationsIcon,\n PlayAnimationsIcon,\n MultiSelectIcon,\n AreaAnnotateIcon,\n} from './Icons';\nimport { Toast } from './Toast';\nimport { captureScreenshot, generateId } from '../utils';\n\ninterface ToolbarButtonProps {\n icon: React.ReactNode;\n active?: boolean;\n disabled?: boolean;\n title?: string;\n badge?: number;\n recording?: boolean;\n onClick: () => void;\n}\n\nfunction ToolbarButton({\n icon,\n active,\n disabled,\n title,\n badge,\n recording,\n onClick,\n}: ToolbarButtonProps) {\n return (\n <button\n className={`framed-toolbar-btn ${active ? 'active' : ''} ${recording ? 'recording' : ''}`}\n disabled={disabled}\n title={title}\n onClick={onClick}\n type=\"button\"\n >\n {icon}\n {badge !== undefined && badge > 0 && (\n <span className=\"framed-badge\">{badge}</span>\n )}\n </button>\n );\n}\n\nfunction ToolbarDivider() {\n return <div className=\"framed-toolbar-divider\" />;\n}\n\nexport interface ToolbarProps {\n onScreenshot?: () => void;\n onClose?: () => void;\n}\n\nexport function Toolbar({ onScreenshot, onClose }: ToolbarProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const {\n isOpen,\n features,\n annotationMode,\n isRegionSelectMode,\n isRecording,\n isCapturing,\n feedbackPanelOpen,\n comments,\n animationsPaused,\n isMultiSelectMode,\n isAreaAnnotateMode,\n setAnnotationMode,\n setIsRegionSelectMode,\n setIsRecording,\n setIsCapturing,\n toggleFeedbackPanel,\n openChatModal,\n addAttachment,\n close,\n showToast,\n toggleAnimationsPaused,\n setIsMultiSelectMode,\n setIsAreaAnnotateMode,\n } = useWidgetStore();\n\n // Default screenshot handler using html2canvas\n const handleDefaultScreenshot = useCallback(async () => {\n if (isCapturing) return;\n\n setIsCapturing(true);\n showToast('Capturing screenshot...', 'info');\n\n try {\n // Find the widget container to hide during capture\n const widgetContainer = document.getElementById('framed-widget-container');\n\n const result = await captureScreenshot({\n hideElement: widgetContainer,\n });\n\n // Add as pending attachment\n addAttachment({\n id: generateId(),\n file: result.file,\n type: 'screenshot',\n previewUrl: result.previewUrl,\n });\n\n // Open chat modal with screenshot attached\n openChatModal();\n showToast('Screenshot captured!', 'success');\n } catch (error) {\n console.error('[Framed Widget] Screenshot error:', error);\n showToast('Failed to capture screenshot', 'error');\n } finally {\n setIsCapturing(false);\n }\n }, [isCapturing, setIsCapturing, showToast, addAttachment, openChatModal]);\n\n if (!isOpen) return null;\n\n const unresolvedCount = comments.filter((c) => !c.resolved).length;\n\n const handleSelect = () => {\n setAnnotationMode('select');\n showToast(\n annotationMode === 'select'\n ? 'Selection mode off'\n : 'Click to select an element',\n 'info'\n );\n };\n\n const handleTextEdit = () => {\n setAnnotationMode('text-edit');\n showToast(\n annotationMode === 'text-edit'\n ? 'Text edit mode off'\n : 'Click text to edit',\n 'info'\n );\n };\n\n const handleScreenshot = () => {\n if (onScreenshot) {\n onScreenshot();\n } else {\n handleDefaultScreenshot();\n }\n };\n\n const handleRegion = () => {\n setIsRegionSelectMode(!isRegionSelectMode);\n if (annotationMode) {\n setAnnotationMode(null);\n }\n showToast(\n isRegionSelectMode ? 'Region select off' : 'Drag to select a region',\n 'info'\n );\n };\n\n const handleRecord = () => {\n if (!features.screenRecording) {\n showToast('Screen recording requires Pro plan', 'error');\n return;\n }\n setIsRecording(!isRecording);\n showToast(\n isRecording ? 'Recording stopped' : 'Recording started',\n isRecording ? 'success' : 'info'\n );\n };\n\n const handleAddFeedback = () => {\n openChatModal();\n };\n\n const handleFeedback = () => {\n toggleFeedbackPanel();\n };\n\n const handleClose = () => {\n if (onClose) {\n onClose();\n } else {\n close();\n }\n };\n\n const handleToggleAnimations = () => {\n toggleAnimationsPaused();\n showToast(\n animationsPaused ? 'Animations resumed' : 'Animations paused',\n 'info'\n );\n };\n\n const handleMultiSelect = () => {\n setIsMultiSelectMode(!isMultiSelectMode);\n if (annotationMode) {\n setAnnotationMode(null);\n }\n showToast(\n isMultiSelectMode ? 'Multi-select off' : 'Drag to select multiple elements',\n 'info'\n );\n };\n\n const handleAreaAnnotate = () => {\n setIsAreaAnnotateMode(!isAreaAnnotateMode);\n if (annotationMode) {\n setAnnotationMode(null);\n }\n showToast(\n isAreaAnnotateMode ? 'Area annotation off' : 'Drag to annotate an area',\n 'info'\n );\n };\n\n return (\n <div className=\"framed-toolbar-container\" data-framed-widget>\n {/* Toast notifications - positioned relative to toolbar container */}\n <Toast />\n\n <div className=\"framed-toolbar\">\n {/* Framed Logo Badge */}\n <div className=\"framed-logo-badge\" title=\"Powered by Framed\">\n <FramedLogo size={16} />\n </div>\n\n <ToolbarDivider />\n\n {/* Selection Tools Group */}\n <div className=\"framed-toolbar-group\">\n {features.elementSelect && (\n <ToolbarButton\n icon={<CursorIcon />}\n active={annotationMode === 'select'}\n title=\"Select Element (V)\"\n onClick={handleSelect}\n />\n )}\n {features.textEdit && (\n <ToolbarButton\n icon={<TextEditIcon />}\n active={annotationMode === 'text-edit'}\n title=\"Suggest Text Edit (T)\"\n onClick={handleTextEdit}\n />\n )}\n {features.elementSelect && (\n <ToolbarButton\n icon={<MultiSelectIcon />}\n active={isMultiSelectMode}\n title=\"Multi-select (M)\"\n onClick={handleMultiSelect}\n />\n )}\n {features.annotate && (\n <ToolbarButton\n icon={<AreaAnnotateIcon />}\n active={isAreaAnnotateMode}\n title=\"Annotate Area (A)\"\n onClick={handleAreaAnnotate}\n />\n )}\n </div>\n\n <ToolbarDivider />\n\n {/* Capture Tools Group */}\n <div className=\"framed-toolbar-group\">\n {features.screenshot && (\n <ToolbarButton\n icon={<ScreenshotIcon />}\n title=\"Screenshot (S)\"\n onClick={handleScreenshot}\n />\n )}\n {features.regionSelect && (\n <ToolbarButton\n icon={<RegionIcon />}\n active={isRegionSelectMode}\n title=\"Select Region (R)\"\n onClick={handleRegion}\n />\n )}\n <ToolbarButton\n icon={<RecordIcon recording={isRecording} />}\n active={isRecording}\n recording={isRecording}\n disabled={!features.screenRecording}\n title={\n features.screenRecording\n ? 'Record Screen'\n : 'Screen Recording (Pro)'\n }\n onClick={handleRecord}\n />\n </div>\n\n <ToolbarDivider />\n\n {/* Add New Feedback */}\n <ToolbarButton\n icon={<PlusIcon />}\n title=\"Add Feedback (+)\"\n onClick={handleAddFeedback}\n />\n\n {/* Feedback Button */}\n {features.feedbackDrawer && (\n <ToolbarButton\n icon={<ChatIcon />}\n active={feedbackPanelOpen}\n badge={unresolvedCount}\n title=\"View Feedback (F)\"\n onClick={handleFeedback}\n />\n )}\n\n {/* Animation Control */}\n <ToolbarButton\n icon={animationsPaused ? <PlayAnimationsIcon /> : <PauseAnimationsIcon />}\n active={animationsPaused}\n title={animationsPaused ? 'Resume Animations (P)' : 'Pause Animations (P)'}\n onClick={handleToggleAnimations}\n />\n\n <ToolbarDivider />\n\n {/* Close Button */}\n <ToolbarButton\n icon={<CloseIcon />}\n title=\"Close Session\"\n onClick={handleClose}\n />\n </div>\n </div>\n );\n}\n","// Slide-out right panel for feedback list\n\nimport React from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport { formatTimeAgo, escapeHtml } from '../utils/helpers';\nimport { ExportIcon, CheckIcon, LocateIcon, CloseIcon } from './Icons';\nimport type { FeedbackComment } from '@framed/core';\n\ninterface CommentCardProps {\n comment: FeedbackComment;\n onResolve: () => void;\n onLocate: () => void;\n}\n\nfunction CommentCard({ comment, onResolve, onLocate }: CommentCardProps) {\n return (\n <div\n className={`framed-comment-card ${comment.resolved ? 'resolved' : ''}`}\n >\n <div className=\"framed-comment-header\">\n <div className=\"framed-comment-meta\">\n <span className=\"framed-comment-author\">{comment.author}</span>\n <span className=\"framed-comment-time\">\n {formatTimeAgo(comment.createdAt)}\n </span>\n </div>\n <span\n className={`framed-comment-status ${comment.resolved ? 'resolved' : 'open'}`}\n >\n {comment.resolved ? 'Resolved' : 'Open'}\n </span>\n </div>\n\n {/* Element info if available */}\n {comment.elementType && (\n <div className=\"framed-comment-element\">\n <span className=\"framed-comment-element-tag\">\n {comment.elementType}\n </span>\n {comment.elementText && (\n <span className=\"framed-comment-element-text\">\n {comment.elementText.substring(0, 50)}\n {comment.elementText.length > 50 ? '...' : ''}\n </span>\n )}\n </div>\n )}\n\n {comment.contentHtml ? (\n <div\n className=\"framed-comment-content framed-rich-content\"\n dangerouslySetInnerHTML={{ __html: comment.contentHtml }}\n />\n ) : (\n <div className=\"framed-comment-content\">{comment.content}</div>\n )}\n\n {/* Text edit preview */}\n {comment.textEdit && (\n <div className=\"framed-comment-text-edit\">\n <div className=\"framed-text-edit-original\">\n <span className=\"framed-text-edit-label\">From:</span>\n &ldquo;{comment.textEdit.originalText.substring(0, 100)}\n {comment.textEdit.originalText.length > 100 ? '...' : ''}&rdquo;\n </div>\n <div className=\"framed-text-edit-new\">\n <span className=\"framed-text-edit-label\">To:</span>\n &ldquo;{comment.textEdit.newText.substring(0, 100)}\n {comment.textEdit.newText.length > 100 ? '...' : ''}&rdquo;\n </div>\n </div>\n )}\n\n {/* Attachments preview */}\n {comment.attachments && comment.attachments.length > 0 && (\n <div className=\"framed-comment-attachments\">\n {comment.attachments.map((att, i) => (\n <div key={i} className=\"framed-attachment-thumb\">\n {att.type.startsWith('image/') ? (\n <img src={att.url} alt={att.fileName} />\n ) : (\n <span className=\"framed-attachment-icon\">📎</span>\n )}\n </div>\n ))}\n </div>\n )}\n\n <div className=\"framed-comment-actions\">\n {comment.position && (\n <button\n className=\"framed-action-btn\"\n onClick={onLocate}\n type=\"button\"\n >\n <LocateIcon size={14} />\n <span>Locate</span>\n </button>\n )}\n <button\n className={`framed-action-btn ${!comment.resolved ? 'resolve-btn' : ''}`}\n onClick={onResolve}\n type=\"button\"\n >\n <CheckIcon size={14} />\n <span>{comment.resolved ? 'Reopen' : 'Resolve'}</span>\n </button>\n </div>\n </div>\n );\n}\n\nfunction EmptyState({ showResolved }: { showResolved: boolean }) {\n return (\n <div className=\"framed-empty-state\">\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n <p>\n {showResolved\n ? 'No resolved feedback yet'\n : 'No feedback yet. Select an element to get started!'}\n </p>\n </div>\n );\n}\n\nexport interface FeedbackDrawerProps {\n onExport?: () => void;\n onLocateComment?: (comment: FeedbackComment) => void;\n}\n\nexport function FeedbackDrawer({\n onExport,\n onLocateComment,\n}: FeedbackDrawerProps) {\n const {\n feedbackPanelOpen,\n comments,\n showResolved,\n closeFeedbackPanel,\n toggleResolved,\n setShowResolved,\n openExportModal,\n } = useWidgetStore();\n\n const openCount = comments.filter((c) => !c.resolved).length;\n const resolvedCount = comments.filter((c) => c.resolved).length;\n\n const filteredComments = comments.filter((c) =>\n showResolved ? c.resolved : !c.resolved\n );\n\n const handleResolve = (id: string) => {\n toggleResolved(id);\n };\n\n const handleLocate = (comment: FeedbackComment) => {\n if (onLocateComment) {\n onLocateComment(comment);\n return;\n }\n\n // Try to find the element by selector first\n if (comment.selector) {\n try {\n const element = document.querySelector(comment.selector);\n if (element) {\n // Scroll element into view\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'center',\n });\n\n // Briefly highlight the element\n const originalOutline = (element as HTMLElement).style.outline;\n const originalTransition = (element as HTMLElement).style.transition;\n (element as HTMLElement).style.transition = 'outline 0.2s ease-in-out';\n (element as HTMLElement).style.outline = '3px solid #3b82f6';\n\n setTimeout(() => {\n (element as HTMLElement).style.outline = originalOutline;\n setTimeout(() => {\n (element as HTMLElement).style.transition = originalTransition;\n }, 200);\n }, 1500);\n\n return;\n }\n } catch (e) {\n // Selector might be invalid, fall through to position-based scroll\n console.warn('Failed to locate element by selector:', e);\n }\n }\n\n // Fallback to position-based scroll if selector didn't work\n if (comment.position) {\n const docHeight = Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n );\n const docWidth = Math.max(\n document.body.scrollWidth,\n document.documentElement.scrollWidth\n );\n\n const scrollX = (comment.position.x / 100) * docWidth - window.innerWidth / 2;\n const scrollY =\n (comment.position.y / 100) * docHeight - window.innerHeight / 2;\n\n window.scrollTo({\n left: scrollX,\n top: scrollY,\n behavior: 'smooth',\n });\n }\n };\n\n const handleExport = () => {\n if (onExport) {\n onExport();\n } else {\n // Default: open the export modal\n openExportModal();\n }\n };\n\n return (\n <div\n className={`framed-feedback-panel ${feedbackPanelOpen ? 'open' : ''}`}\n data-framed-widget\n >\n <div className=\"framed-panel-header\">\n <h3>Feedback</h3>\n <div className=\"framed-panel-tabs\">\n <button\n className={`framed-tab ${!showResolved ? 'active' : ''}`}\n onClick={() => setShowResolved(false)}\n type=\"button\"\n >\n Open ({openCount})\n </button>\n <button\n className={`framed-tab ${showResolved ? 'active' : ''}`}\n onClick={() => setShowResolved(true)}\n type=\"button\"\n >\n Resolved ({resolvedCount})\n </button>\n </div>\n <button\n className=\"framed-panel-close\"\n onClick={closeFeedbackPanel}\n type=\"button\"\n aria-label=\"Close panel\"\n >\n <CloseIcon size={20} />\n </button>\n </div>\n\n <div className=\"framed-panel-content\">\n <div className=\"framed-comment-list\">\n {filteredComments.length > 0 ? (\n filteredComments.map((comment) => (\n <CommentCard\n key={comment.id}\n comment={comment}\n onResolve={() => handleResolve(comment.id)}\n onLocate={() => handleLocate(comment)}\n />\n ))\n ) : (\n <EmptyState showResolved={showResolved} />\n )}\n </div>\n </div>\n\n <div className=\"framed-panel-footer\">\n <button\n className=\"framed-ai-btn\"\n onClick={handleExport}\n type=\"button\"\n >\n <ExportIcon size={16} />\n <span>Export Summary</span>\n </button>\n </div>\n </div>\n );\n}\n","// Rich text editor component with basic formatting support\n\nimport React, { useRef, useEffect, useCallback, forwardRef, useImperativeHandle, useState } from 'react';\nimport { isolateKeyboardEvents } from '../utils/helpers';\nimport { CloseIcon } from './Icons';\n\nexport interface RichTextEditorRef {\n focus: () => void;\n getValue: () => string;\n getHtml: () => string;\n clear: () => void;\n}\n\nexport interface RichTextEditorProps {\n placeholder?: string;\n onKeyDown?: (e: React.KeyboardEvent<HTMLDivElement>) => void;\n className?: string;\n rows?: number;\n}\n\nexport const RichTextEditor = forwardRef<RichTextEditorRef, RichTextEditorProps>(\n ({ placeholder = 'Enter your feedback...', onKeyDown, className = '', rows = 4 }, ref) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const toolbarRef = useRef<HTMLDivElement>(null);\n const linkInputRef = useRef<HTMLInputElement>(null);\n const savedSelectionRef = useRef<Range | null>(null);\n\n const [linkModalOpen, setLinkModalOpen] = useState(false);\n const [linkUrl, setLinkUrl] = useState('https://');\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n focus: () => {\n editorRef.current?.focus();\n },\n getValue: () => {\n return editorRef.current?.innerText || '';\n },\n getHtml: () => {\n return editorRef.current?.innerHTML || '';\n },\n clear: () => {\n if (editorRef.current) {\n editorRef.current.innerHTML = '';\n }\n },\n }));\n\n // Set up keyboard isolation\n useEffect(() => {\n if (editorRef.current) {\n isolateKeyboardEvents(editorRef.current);\n }\n }, []);\n\n // Format commands\n const execCommand = useCallback((command: string, value?: string) => {\n document.execCommand(command, false, value);\n editorRef.current?.focus();\n }, []);\n\n const handleBold = useCallback(() => {\n execCommand('bold');\n }, [execCommand]);\n\n const handleItalic = useCallback(() => {\n execCommand('italic');\n }, [execCommand]);\n\n const handleUnderline = useCallback(() => {\n execCommand('underline');\n }, [execCommand]);\n\n // Save the current selection before opening modal\n const saveSelection = useCallback(() => {\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n savedSelectionRef.current = selection.getRangeAt(0).cloneRange();\n }\n }, []);\n\n // Restore the saved selection\n const restoreSelection = useCallback(() => {\n if (savedSelectionRef.current) {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(savedSelectionRef.current);\n }\n }\n }, []);\n\n const handleLink = useCallback(() => {\n const selection = window.getSelection();\n const selectedText = selection?.toString() || '';\n\n if (!selectedText) {\n return;\n }\n\n // Save selection before opening modal\n saveSelection();\n setLinkUrl('https://');\n setLinkModalOpen(true);\n }, [saveSelection]);\n\n // Focus link input when modal opens\n useEffect(() => {\n if (linkModalOpen && linkInputRef.current) {\n linkInputRef.current.focus();\n linkInputRef.current.select();\n }\n }, [linkModalOpen]);\n\n const handleLinkSubmit = useCallback(() => {\n if (linkUrl && linkUrl !== 'https://') {\n // Restore selection and apply link\n restoreSelection();\n execCommand('createLink', linkUrl);\n }\n setLinkModalOpen(false);\n setLinkUrl('https://');\n editorRef.current?.focus();\n }, [linkUrl, restoreSelection, execCommand]);\n\n const handleLinkCancel = useCallback(() => {\n setLinkModalOpen(false);\n setLinkUrl('https://');\n editorRef.current?.focus();\n }, []);\n\n const handleLinkKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleLinkSubmit();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n handleLinkCancel();\n }\n }, [handleLinkSubmit, handleLinkCancel]);\n\n const handleBulletList = useCallback(() => {\n execCommand('insertUnorderedList');\n }, [execCommand]);\n\n const handleNumberedList = useCallback(() => {\n execCommand('insertOrderedList');\n }, [execCommand]);\n\n // Handle keyboard shortcuts for formatting\n const handleEditorKeyDown = useCallback((e: React.KeyboardEvent<HTMLDivElement>) => {\n // Always pass through to parent handler first for Cmd+Enter, ESC, etc.\n // This allows submit and close shortcuts to work\n if (onKeyDown) {\n onKeyDown(e);\n // If the event was handled (preventDefault called), don't process further\n if (e.defaultPrevented) {\n return;\n }\n }\n\n // Format shortcuts (only if not already handled)\n if (e.metaKey || e.ctrlKey) {\n switch (e.key.toLowerCase()) {\n case 'b':\n e.preventDefault();\n handleBold();\n return;\n case 'i':\n e.preventDefault();\n handleItalic();\n return;\n case 'u':\n e.preventDefault();\n handleUnderline();\n return;\n case 'k':\n e.preventDefault();\n handleLink();\n return;\n }\n }\n }, [handleBold, handleItalic, handleUnderline, handleLink, onKeyDown]);\n\n // Calculate min-height based on rows\n const minHeight = rows * 24; // ~24px per line\n\n return (\n <div className={`framed-rich-text-editor ${className}`}>\n <div ref={toolbarRef} className=\"framed-rich-text-toolbar\">\n <button\n type=\"button\"\n className=\"framed-rich-text-btn\"\n onClick={handleBold}\n title=\"Bold (⌘B)\"\n aria-label=\"Bold\"\n >\n <strong>B</strong>\n </button>\n <button\n type=\"button\"\n className=\"framed-rich-text-btn\"\n onClick={handleItalic}\n title=\"Italic (⌘I)\"\n aria-label=\"Italic\"\n >\n <em>I</em>\n </button>\n <button\n type=\"button\"\n className=\"framed-rich-text-btn\"\n onClick={handleUnderline}\n title=\"Underline (⌘U)\"\n aria-label=\"Underline\"\n >\n <u>U</u>\n </button>\n <span className=\"framed-rich-text-separator\" />\n <button\n type=\"button\"\n className=\"framed-rich-text-btn\"\n onClick={handleLink}\n title=\"Insert Link (⌘K)\"\n aria-label=\"Insert Link\"\n >\n 🔗\n </button>\n <span className=\"framed-rich-text-separator\" />\n <button\n type=\"button\"\n className=\"framed-rich-text-btn\"\n onClick={handleBulletList}\n title=\"Bullet List\"\n aria-label=\"Bullet List\"\n >\n •\n </button>\n <button\n type=\"button\"\n className=\"framed-rich-text-btn\"\n onClick={handleNumberedList}\n title=\"Numbered List\"\n aria-label=\"Numbered List\"\n >\n 1.\n </button>\n </div>\n <div\n ref={editorRef}\n className=\"framed-rich-text-content\"\n contentEditable\n data-placeholder={placeholder}\n onKeyDown={handleEditorKeyDown}\n style={{ minHeight: `${minHeight}px` }}\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-placeholder={placeholder}\n />\n\n {/* Link Modal */}\n {linkModalOpen && (\n <div className=\"framed-link-modal-overlay\" data-framed-widget>\n <div className=\"framed-link-modal\">\n <div className=\"framed-link-modal-header\">\n <span>Insert Link</span>\n <button\n type=\"button\"\n className=\"framed-link-modal-close\"\n onClick={handleLinkCancel}\n aria-label=\"Close\"\n >\n <CloseIcon size={16} />\n </button>\n </div>\n <div className=\"framed-link-modal-body\">\n <label htmlFor=\"framed-link-url\">URL</label>\n <input\n ref={linkInputRef}\n id=\"framed-link-url\"\n type=\"url\"\n className=\"framed-link-input\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={handleLinkKeyDown}\n placeholder=\"https://example.com\"\n />\n </div>\n <div className=\"framed-link-modal-footer\">\n <button\n type=\"button\"\n className=\"framed-link-btn-cancel\"\n onClick={handleLinkCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"framed-link-btn-submit\"\n onClick={handleLinkSubmit}\n >\n Insert\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n }\n);\n\nRichTextEditor.displayName = 'RichTextEditor';\n","// Quick input popup for element feedback\n\nimport React, { useRef, useEffect, useCallback } from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport {\n getElementPath,\n generateId,\n getElementSelector,\n getElementPosition,\n getViewportType,\n getElementMetadata,\n getPageInfo,\n} from '../utils/helpers';\nimport {\n CloseIcon,\n ScreenshotIcon,\n SendIcon,\n} from './Icons';\nimport { RichTextEditor, type RichTextEditorRef } from './RichTextEditor';\nimport type { FeedbackComment, PendingAttachment } from '@framed/core';\n\nexport interface QuickInputProps {\n onSubmit?: (comment: FeedbackComment) => void;\n author?: string;\n}\n\nexport function QuickInput({ onSubmit, author = 'Anonymous' }: QuickInputProps) {\n const richTextRef = useRef<RichTextEditorRef>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const {\n quickInputOpen,\n selectedElement,\n annotationColor,\n pendingAttachments,\n closeQuickInput,\n addAttachment,\n removeAttachment,\n clearAttachments,\n addComment,\n showToast,\n } = useWidgetStore();\n\n // Focus editor when opening\n useEffect(() => {\n if (quickInputOpen && richTextRef.current) {\n richTextRef.current.focus();\n }\n }, [quickInputOpen]);\n\n // Build element path for header\n const elementPath = selectedElement ? getElementPath(selectedElement) : '';\n\n const handleClose = useCallback(() => {\n clearAttachments();\n closeQuickInput();\n }, [clearAttachments, closeQuickInput]);\n\n const handleAttachFile = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n if (files.length === 0) return;\n\n files.forEach((file) => {\n // Validate file size (max 10MB)\n if (file.size > 10 * 1024 * 1024) {\n showToast(`File \"${file.name}\" is too large (max 10MB)`, 'error');\n return;\n }\n\n const previewUrl = file.type.startsWith('image/')\n ? URL.createObjectURL(file)\n : null;\n\n const attachment: PendingAttachment = {\n id: generateId(),\n file,\n type: file.type,\n previewUrl,\n };\n\n addAttachment(attachment);\n });\n\n showToast(`${files.length} file(s) attached`, 'success');\n\n // Reset file input\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n const handleRemoveAttachment = (id: string) => {\n const attachment = pendingAttachments.find((a) => a.id === id);\n if (attachment?.previewUrl) {\n URL.revokeObjectURL(attachment.previewUrl);\n }\n removeAttachment(id);\n };\n\n const handleSubmit = () => {\n if (!richTextRef.current) return;\n\n const content = richTextRef.current.getValue().trim();\n const html = richTextRef.current.getHtml().trim();\n\n // Only include HTML if it's different from plain text (has formatting)\n let contentHtml: string | undefined;\n if (html && html !== content && html !== `<div>${content}</div>`) {\n contentHtml = html;\n }\n\n if (!content && pendingAttachments.length === 0) {\n showToast('Please enter feedback or add an attachment', 'error');\n return;\n }\n\n const viewportType = getViewportType();\n const pageInfo = getPageInfo();\n const elementMeta = selectedElement ? getElementMetadata(selectedElement) : null;\n\n const comment: FeedbackComment = {\n id: generateId(),\n content,\n contentHtml,\n author,\n createdAt: new Date().toISOString(),\n resolved: false,\n\n // Page info\n pageUrl: pageInfo.url,\n pageTitle: pageInfo.title,\n\n // Element info\n position: selectedElement ? getElementPosition(selectedElement) : undefined,\n selector: selectedElement ? getElementSelector(selectedElement) : undefined,\n elementText: selectedElement\n ? selectedElement.textContent?.substring(0, 100)\n : undefined,\n elementType: selectedElement\n ? selectedElement.tagName.toLowerCase()\n : undefined,\n elementId: elementMeta?.elementId,\n elementClassName: elementMeta?.elementClassName,\n parentHierarchy: elementMeta?.parentHierarchy,\n\n attachments: pendingAttachments.map((a) => ({\n url: a.previewUrl || '',\n type: a.type,\n fileName: a.file.name,\n })),\n annotation: selectedElement\n ? {\n type: 'box',\n color: annotationColor,\n }\n : undefined,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n type: viewportType,\n },\n };\n\n // Add to local state\n addComment(comment);\n\n // Call external handler\n if (onSubmit) {\n onSubmit(comment);\n }\n\n // Clear and close\n richTextRef.current.clear();\n clearAttachments();\n closeQuickInput();\n\n showToast('Feedback submitted!', 'success');\n };\n\n // Handle keyboard shortcuts\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n // Cmd/Ctrl + Enter to submit\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n return;\n }\n\n // ESC to close\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }\n };\n\n if (!quickInputOpen) return null;\n\n return (\n <div className=\"framed-quick-input-container\" data-framed-widget>\n <div className=\"framed-quick-input open\">\n <div className=\"framed-quick-input-header\">\n <div className=\"framed-quick-header-content\">\n <span className=\"framed-quick-label\">Selected Element</span>\n <span className=\"framed-quick-divider\">|</span>\n <span className=\"framed-quick-path\">{elementPath}</span>\n </div>\n <button\n className=\"framed-quick-close\"\n onClick={handleClose}\n type=\"button\"\n aria-label=\"Close\"\n >\n <CloseIcon size={20} />\n </button>\n </div>\n\n <div className=\"framed-quick-body\">\n <RichTextEditor\n ref={richTextRef}\n placeholder=\"How should we change this?\"\n rows={4}\n onKeyDown={handleKeyDown}\n />\n\n {/* Pending attachments */}\n {pendingAttachments.length > 0 && (\n <div className=\"framed-pending-attachments\">\n {pendingAttachments.map((attachment) => (\n <div key={attachment.id} className=\"framed-attachment-item\">\n {attachment.previewUrl ? (\n <img src={attachment.previewUrl} alt=\"\" />\n ) : (\n <div className=\"framed-attachment-icon\">📎</div>\n )}\n <button\n className=\"framed-attachment-remove\"\n onClick={() => handleRemoveAttachment(attachment.id)}\n type=\"button\"\n aria-label=\"Remove attachment\"\n >\n ×\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"framed-quick-actions\">\n <div className=\"framed-quick-annotation-btns\">\n <button\n className=\"framed-ann-btn\"\n onClick={handleAttachFile}\n title=\"Attach image/file\"\n type=\"button\"\n >\n <ScreenshotIcon size={22} />\n </button>\n </div>\n <button\n className=\"framed-quick-submit\"\n onClick={handleSubmit}\n type=\"button\"\n title=\"Submit (⌘+Enter)\"\n >\n <span>submit</span>\n <SendIcon size={18} />\n </button>\n </div>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*,video/*,.pdf,.doc,.docx,.xls,.xlsx,.txt\"\n multiple\n style={{ display: 'none' }}\n onChange={handleFileChange}\n />\n </div>\n </div>\n );\n}\n","// Chat modal for adding general feedback (no element selection)\n\nimport React, { useRef, useEffect } from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport { generateId, getViewportType, getPageInfo } from '../utils/helpers';\nimport { CloseIcon, ScreenshotIcon, SendIcon } from './Icons';\nimport { RichTextEditor, type RichTextEditorRef } from './RichTextEditor';\nimport type { FeedbackComment, PendingAttachment } from '@framed/core';\n\nexport interface ChatModalProps {\n onSubmit?: (comment: FeedbackComment) => void;\n author?: string;\n}\n\nexport function ChatModal({ onSubmit, author = 'Anonymous' }: ChatModalProps) {\n const richTextRef = useRef<RichTextEditorRef>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const {\n chatModalOpen,\n pendingAttachments,\n currentPageUrl,\n closeChatModal,\n addAttachment,\n removeAttachment,\n clearAttachments,\n addComment,\n showToast,\n } = useWidgetStore();\n\n // Focus editor when opening\n useEffect(() => {\n if (chatModalOpen && richTextRef.current) {\n richTextRef.current.focus();\n }\n }, [chatModalOpen]);\n\n // Handle keyboard shortcuts\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n // Cmd/Ctrl + Enter to submit\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n return;\n }\n\n // ESC to close\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }\n };\n\n // Get page name from URL\n const pageName = (() => {\n try {\n const url = new URL(currentPageUrl || window.location.href);\n return url.pathname === '/' ? 'Home' : url.pathname.split('/').pop() || 'Page';\n } catch {\n return 'Page';\n }\n })();\n\n const handleClose = () => {\n clearAttachments();\n closeChatModal();\n };\n\n const handleAttachFile = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n if (files.length === 0) return;\n\n files.forEach((file) => {\n if (file.size > 10 * 1024 * 1024) {\n showToast(`File \"${file.name}\" is too large (max 10MB)`, 'error');\n return;\n }\n\n const previewUrl = file.type.startsWith('image/')\n ? URL.createObjectURL(file)\n : null;\n\n const attachment: PendingAttachment = {\n id: generateId(),\n file,\n type: file.type,\n previewUrl,\n };\n\n addAttachment(attachment);\n });\n\n showToast(`${files.length} file(s) attached`, 'success');\n\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n const handleRemoveAttachment = (id: string) => {\n const attachment = pendingAttachments.find((a) => a.id === id);\n if (attachment?.previewUrl) {\n URL.revokeObjectURL(attachment.previewUrl);\n }\n removeAttachment(id);\n };\n\n const handleSubmit = () => {\n if (!richTextRef.current) return;\n\n const content = richTextRef.current.getValue().trim();\n const html = richTextRef.current.getHtml().trim();\n\n // Only include HTML if it's different from plain text (has formatting)\n let contentHtml: string | undefined;\n if (html && html !== content && html !== `<div>${content}</div>`) {\n contentHtml = html;\n }\n\n if (!content && pendingAttachments.length === 0) {\n showToast('Please enter feedback or add an attachment', 'error');\n return;\n }\n\n const viewportType = getViewportType();\n const pageInfo = getPageInfo();\n\n const comment: FeedbackComment = {\n id: generateId(),\n content,\n contentHtml,\n author,\n createdAt: new Date().toISOString(),\n resolved: false,\n\n // Page info\n pageUrl: pageInfo.url,\n pageTitle: pageInfo.title,\n\n attachments: pendingAttachments.map((a) => ({\n url: a.previewUrl || '',\n type: a.type,\n fileName: a.file.name,\n })),\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n type: viewportType,\n },\n };\n\n addComment(comment);\n\n if (onSubmit) {\n onSubmit(comment);\n }\n\n // Clear the input\n richTextRef.current.clear();\n clearAttachments();\n closeChatModal();\n\n showToast('Feedback submitted!', 'success');\n };\n\n if (!chatModalOpen) return null;\n\n return (\n <div className=\"framed-chat-modal open\" data-framed-widget>\n <div className=\"framed-chat-header\">\n <div className=\"framed-chat-header-content\">\n <span className=\"framed-chat-label\">New Feedback</span>\n <span className=\"framed-chat-divider\">|</span>\n <span className=\"framed-chat-page\">{pageName}</span>\n </div>\n <button\n className=\"framed-chat-close\"\n onClick={handleClose}\n type=\"button\"\n aria-label=\"Close\"\n >\n <CloseIcon size={20} />\n </button>\n </div>\n\n <div className=\"framed-chat-body\">\n <RichTextEditor\n ref={richTextRef}\n placeholder=\"Describe your feedback or suggestion...\"\n rows={5}\n onKeyDown={handleKeyDown}\n />\n\n {/* Pending attachments */}\n {pendingAttachments.length > 0 && (\n <div className=\"framed-pending-attachments\">\n {pendingAttachments.map((attachment) => (\n <div key={attachment.id} className=\"framed-attachment-item\">\n {attachment.previewUrl ? (\n <img src={attachment.previewUrl} alt=\"\" />\n ) : (\n <div className=\"framed-attachment-icon\">📎</div>\n )}\n <button\n className=\"framed-attachment-remove\"\n onClick={() => handleRemoveAttachment(attachment.id)}\n type=\"button\"\n aria-label=\"Remove attachment\"\n >\n ×\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"framed-chat-footer\">\n <div className=\"framed-chat-annotation-btns\">\n <button\n className=\"framed-ann-btn\"\n onClick={handleAttachFile}\n title=\"Attach image/file\"\n type=\"button\"\n >\n <ScreenshotIcon size={22} />\n </button>\n </div>\n <button\n className=\"framed-chat-submit\"\n onClick={handleSubmit}\n type=\"button\"\n title=\"Submit (⌘+Enter)\"\n >\n <span>submit</span>\n <SendIcon size={18} />\n </button>\n </div>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*,video/*,.pdf,.doc,.docx,.xls,.xlsx,.txt\"\n multiple\n style={{ display: 'none' }}\n onChange={handleFileChange}\n />\n </div>\n );\n}\n","// Element selection overlay with hover highlighting\n\nimport React, { useEffect, useCallback, useRef } from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport { isFramedElement } from '../utils/helpers';\n\nexport interface ElementSelectorProps {\n onSelect?: (element: HTMLElement) => void;\n}\n\nexport function ElementSelector({ onSelect }: ElementSelectorProps) {\n const highlightRef = useRef<HTMLDivElement | null>(null);\n\n const {\n isOpen,\n annotationMode,\n selectedElement,\n hoveredElement,\n annotationColor,\n quickInputOpen,\n chatModalOpen,\n setSelectedElement,\n setHoveredElement,\n setOriginalText,\n openQuickInput,\n showToast,\n } = useWidgetStore();\n\n // Selection mode is active only when in select/text-edit mode AND no modals are open\n const hasModalOpen = quickInputOpen || chatModalOpen;\n const isSelectionMode =\n (annotationMode === 'select' || annotationMode === 'text-edit') && !hasModalOpen;\n\n // Create or get highlight element\n const getHighlight = useCallback(() => {\n if (!highlightRef.current) {\n const highlight = document.createElement('div');\n highlight.id = 'framed-element-highlight';\n highlight.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 2147483646;\n border: 2px solid ${annotationColor};\n border-radius: 4px;\n background: ${annotationColor}22;\n transition: all 0.1s ease;\n display: none;\n `;\n document.body.appendChild(highlight);\n highlightRef.current = highlight;\n }\n return highlightRef.current;\n }, [annotationColor]);\n\n // Update highlight position\n const updateHighlight = useCallback(\n (element: HTMLElement | null) => {\n const highlight = getHighlight();\n\n if (!element || isFramedElement(element)) {\n highlight.style.display = 'none';\n return;\n }\n\n const rect = element.getBoundingClientRect();\n highlight.style.display = 'block';\n highlight.style.top = `${rect.top}px`;\n highlight.style.left = `${rect.left}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n highlight.style.borderColor = annotationColor;\n highlight.style.background = `${annotationColor}22`;\n },\n [annotationColor, getHighlight]\n );\n\n // Handle mouse move (hover)\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isSelectionMode) return;\n\n const target = e.target as HTMLElement;\n\n // Don't highlight framed elements\n if (isFramedElement(target)) {\n if (hoveredElement) {\n setHoveredElement(null);\n updateHighlight(selectedElement);\n }\n return;\n }\n\n // Don't re-highlight selected element differently\n if (target === selectedElement) return;\n\n setHoveredElement(target);\n updateHighlight(target);\n },\n [\n isSelectionMode,\n hoveredElement,\n selectedElement,\n setHoveredElement,\n updateHighlight,\n ]\n );\n\n // Handle click (select)\n const handleClick = useCallback(\n (e: MouseEvent) => {\n if (!isSelectionMode) return;\n\n const target = e.target as HTMLElement;\n\n // Don't intercept clicks on framed elements\n if (isFramedElement(target)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n // Clear previous selection\n if (selectedElement) {\n // Restore any edited content\n if (selectedElement.getAttribute('data-framed-editing')) {\n const original = selectedElement.getAttribute('data-framed-original');\n if (original) {\n selectedElement.textContent = original;\n }\n selectedElement.removeAttribute('data-framed-editing');\n selectedElement.removeAttribute('data-framed-original');\n }\n }\n\n setSelectedElement(target);\n setHoveredElement(null);\n\n // Update highlight to show selected state\n const highlight = getHighlight();\n highlight.style.borderWidth = '3px';\n highlight.style.background = `${annotationColor}33`;\n updateHighlight(target);\n\n // Handle text-edit mode\n if (annotationMode === 'text-edit') {\n setOriginalText(target.textContent || '');\n // Text edit overlay will be shown by parent component\n } else {\n // Open quick input for regular selection\n openQuickInput();\n }\n\n // Call external handler\n if (onSelect) {\n onSelect(target);\n }\n\n showToast('Element selected', 'success');\n },\n [\n isSelectionMode,\n selectedElement,\n annotationMode,\n annotationColor,\n setSelectedElement,\n setHoveredElement,\n setOriginalText,\n openQuickInput,\n getHighlight,\n updateHighlight,\n onSelect,\n showToast,\n ]\n );\n\n // Handle mouse leave (clear hover)\n const handleMouseOut = useCallback(\n (e: MouseEvent) => {\n if (!isSelectionMode) return;\n\n const target = e.target as HTMLElement;\n\n if (target === hoveredElement && target !== selectedElement) {\n setHoveredElement(null);\n updateHighlight(selectedElement);\n }\n },\n [isSelectionMode, hoveredElement, selectedElement, setHoveredElement, updateHighlight]\n );\n\n // Set up event listeners\n useEffect(() => {\n if (!isOpen || !isSelectionMode) {\n // Hide highlight when not in selection mode\n if (highlightRef.current) {\n highlightRef.current.style.display = 'none';\n }\n return;\n }\n\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n document.addEventListener('mouseout', handleMouseOut, true);\n\n // Set cursor to crosshair\n document.body.style.cursor = 'crosshair';\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('mouseout', handleMouseOut, true);\n document.body.style.cursor = '';\n };\n }, [isOpen, isSelectionMode, handleMouseMove, handleClick, handleMouseOut]);\n\n // Clean up highlight on unmount\n useEffect(() => {\n return () => {\n if (highlightRef.current) {\n highlightRef.current.remove();\n highlightRef.current = null;\n }\n };\n }, []);\n\n // Update highlight when selected element changes\n useEffect(() => {\n if (selectedElement) {\n updateHighlight(selectedElement);\n }\n }, [selectedElement, updateHighlight]);\n\n // This component doesn't render any visible UI\n // It only sets up event listeners and manages the highlight element\n return null;\n}\n","// Text edit overlay modal for suggesting text changes\n\nimport React, { useRef, useEffect, useCallback } from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport {\n isolateKeyboardEvents,\n generateId,\n getElementSelector,\n getElementPosition,\n} from '../utils/helpers';\nimport { CloseIcon, CheckIcon } from './Icons';\nimport type { FeedbackComment } from '@framed/core';\n\nexport interface TextEditOverlayProps {\n onSubmit?: (comment: FeedbackComment) => void;\n author?: string;\n}\n\nexport function TextEditOverlay({\n onSubmit,\n author = 'Anonymous',\n}: TextEditOverlayProps) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const {\n annotationMode,\n selectedElement,\n originalText,\n annotationColor,\n setEditedText,\n closeQuickInput,\n clearSelection,\n addComment,\n setAnnotationMode,\n showToast,\n } = useWidgetStore();\n\n const isOpen = annotationMode === 'text-edit' && selectedElement && originalText;\n\n // Focus textarea when opening\n useEffect(() => {\n if (isOpen && textareaRef.current) {\n textareaRef.current.focus();\n textareaRef.current.select();\n isolateKeyboardEvents(textareaRef.current);\n }\n }, [isOpen]);\n\n // Get element path for header\n const getElementPath = useCallback(() => {\n if (!selectedElement) return '';\n const parts: string[] = [];\n\n if (\n selectedElement.parentElement &&\n selectedElement.parentElement.tagName !== 'BODY'\n ) {\n parts.push(selectedElement.parentElement.tagName.toLowerCase());\n }\n parts.push(selectedElement.tagName.toLowerCase());\n\n return parts.join(' > ');\n }, [selectedElement]);\n\n const handleClose = useCallback(() => {\n // Restore original text if element was being edited\n if (selectedElement?.getAttribute('data-framed-editing')) {\n const original = selectedElement.getAttribute('data-framed-original') || originalText;\n if (original) {\n selectedElement.textContent = original;\n }\n selectedElement.removeAttribute('data-framed-editing');\n selectedElement.removeAttribute('data-framed-original');\n }\n\n clearSelection();\n closeQuickInput();\n }, [selectedElement, originalText, clearSelection, closeQuickInput]);\n\n const handleApply = useCallback(() => {\n const newText = textareaRef.current?.value || '';\n\n if (!selectedElement) {\n showToast('Error: No element selected', 'error');\n return;\n }\n\n if (!originalText) {\n showToast('Error: Original text not captured', 'error');\n return;\n }\n\n setEditedText(newText);\n\n // If no change, just close\n if (newText === originalText) {\n handleClose();\n return;\n }\n\n // Create the feedback comment\n const content = `Text change requested:\\n\\nFrom: \"${originalText.substring(0, 150)}${originalText.length > 150 ? '...' : ''}\"\\n\\nTo: \"${newText.substring(0, 150)}${newText.length > 150 ? '...' : ''}\"`;\n\n const comment: FeedbackComment = {\n id: generateId(),\n content,\n author,\n createdAt: new Date().toISOString(),\n resolved: false,\n position: getElementPosition(selectedElement),\n selector: getElementSelector(selectedElement),\n elementText: originalText.substring(0, 100),\n elementType: selectedElement.tagName.toLowerCase(),\n annotation: {\n type: 'strikethrough',\n color: annotationColor,\n },\n textEdit: {\n originalText,\n newText,\n },\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n type:\n window.innerWidth <= 480\n ? 'mobile'\n : window.innerWidth <= 768\n ? 'tablet'\n : 'desktop',\n },\n };\n\n // Add to local state\n addComment(comment);\n\n // Call external handler\n if (onSubmit) {\n onSubmit(comment);\n }\n\n // Clean up\n if (selectedElement.getAttribute('data-framed-editing')) {\n // Restore original text (the comment stores the change)\n selectedElement.textContent =\n selectedElement.getAttribute('data-framed-original') || originalText;\n selectedElement.removeAttribute('data-framed-editing');\n selectedElement.removeAttribute('data-framed-original');\n }\n\n clearSelection();\n setAnnotationMode(null);\n showToast('Text edit feedback saved!', 'success');\n }, [\n selectedElement,\n originalText,\n annotationColor,\n author,\n setEditedText,\n addComment,\n clearSelection,\n setAnnotationMode,\n onSubmit,\n showToast,\n handleClose,\n ]);\n\n // Truncate text for display\n const displayOriginal =\n originalText && originalText.length > 200\n ? originalText.substring(0, 200) + '...'\n : originalText || '';\n\n if (!isOpen) return null;\n\n return (\n <div className=\"framed-text-edit-overlay\" data-framed-widget>\n {/* Header */}\n <div className=\"framed-text-edit-header\">\n <span className=\"framed-text-edit-label-header\">Text Edit</span>\n <span className=\"framed-text-edit-divider\">|</span>\n <span className=\"framed-text-edit-path\">{getElementPath()}</span>\n <button\n className=\"framed-text-edit-close\"\n onClick={handleClose}\n type=\"button\"\n aria-label=\"Close\"\n >\n <CloseIcon size={16} />\n </button>\n </div>\n\n {/* Body */}\n <div className=\"framed-text-edit-body\">\n {/* Original text section */}\n <div className=\"framed-text-edit-section\">\n <div className=\"framed-text-edit-section-label original\">\n <CloseIcon size={14} />\n Original\n </div>\n <div\n className=\"framed-text-edit-original-text\"\n title={originalText.length > 200 ? originalText : undefined}\n >\n {displayOriginal}\n </div>\n </div>\n\n {/* New text section */}\n <div className=\"framed-text-edit-section\">\n <div className=\"framed-text-edit-section-label new\">\n <CheckIcon size={14} />\n New Text\n </div>\n <textarea\n ref={textareaRef}\n className=\"framed-text-edit-textarea\"\n defaultValue={originalText}\n placeholder=\"Enter the new text...\"\n />\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"framed-text-edit-footer\">\n <button\n className=\"framed-text-edit-cancel\"\n onClick={handleClose}\n type=\"button\"\n >\n Cancel\n </button>\n <button\n className=\"framed-text-edit-apply\"\n onClick={handleApply}\n type=\"button\"\n >\n <span>Apply Change</span>\n <CheckIcon size={16} />\n </button>\n </div>\n </div>\n );\n}\n","// Region select overlay for capturing a specific area of the page\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport { captureScreenshot, generateId } from '../utils';\n\ninterface SelectionBox {\n startX: number;\n startY: number;\n currentX: number;\n currentY: number;\n}\n\nexport function RegionSelectOverlay() {\n const {\n isRegionSelectMode,\n setIsRegionSelectMode,\n setIsCapturing,\n addAttachment,\n openChatModal,\n showToast,\n } = useWidgetStore();\n\n const [selection, setSelection] = useState<SelectionBox | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setIsDragging(true);\n setSelection({\n startX: e.clientX,\n startY: e.clientY,\n currentX: e.clientX,\n currentY: e.clientY,\n });\n }, []);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDragging || !selection) return;\n\n setSelection({\n ...selection,\n currentX: e.clientX,\n currentY: e.clientY,\n });\n }, [isDragging, selection]);\n\n const handleMouseUp = useCallback(async (e: React.MouseEvent) => {\n if (!isDragging || !selection) return;\n\n setIsDragging(false);\n\n // Calculate the region\n const x = Math.min(selection.startX, e.clientX);\n const y = Math.min(selection.startY, e.clientY);\n const width = Math.abs(e.clientX - selection.startX);\n const height = Math.abs(e.clientY - selection.startY);\n\n // Clear selection visual\n setSelection(null);\n\n // If selection is too small, cancel\n if (width < 20 || height < 20) {\n setIsRegionSelectMode(false);\n return;\n }\n\n // Capture the region\n setIsCapturing(true);\n setIsRegionSelectMode(false);\n showToast('Capturing region...', 'info');\n\n try {\n const widgetContainer = document.getElementById('framed-widget-container');\n\n const result = await captureScreenshot({\n hideElement: widgetContainer,\n region: { x, y, width, height },\n });\n\n addAttachment({\n id: generateId(),\n file: result.file,\n type: 'screenshot',\n previewUrl: result.previewUrl,\n });\n\n openChatModal();\n showToast('Region captured!', 'success');\n } catch (error) {\n console.error('[Framed Widget] Region capture error:', error);\n showToast('Failed to capture region', 'error');\n } finally {\n setIsCapturing(false);\n }\n }, [isDragging, selection, setIsRegionSelectMode, setIsCapturing, addAttachment, openChatModal, showToast]);\n\n // Handle escape key\n useEffect(() => {\n if (!isRegionSelectMode) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsRegionSelectMode(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isRegionSelectMode, setIsRegionSelectMode]);\n\n // Set body cursor when region select is active\n useEffect(() => {\n if (isRegionSelectMode) {\n document.body.style.cursor = 'crosshair';\n } else {\n document.body.style.cursor = '';\n }\n\n return () => {\n document.body.style.cursor = '';\n };\n }, [isRegionSelectMode]);\n\n if (!isRegionSelectMode) return null;\n\n // Calculate selection box position and size\n const getSelectionStyle = (): React.CSSProperties | undefined => {\n if (!selection) return undefined;\n\n const x = Math.min(selection.startX, selection.currentX);\n const y = Math.min(selection.startY, selection.currentY);\n const width = Math.abs(selection.currentX - selection.startX);\n const height = Math.abs(selection.currentY - selection.startY);\n\n return {\n position: 'fixed',\n left: x,\n top: y,\n width,\n height,\n border: '2px dashed #3b82f6',\n backgroundColor: 'rgba(59, 130, 246, 0.1)',\n pointerEvents: 'none',\n };\n };\n\n return (\n <div\n ref={overlayRef}\n id=\"framed-region-overlay\"\n className=\"framed-region-overlay\"\n data-framed-widget\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n >\n {selection && <div style={getSelectionStyle()} />}\n </div>\n );\n}\n","// Export Modal - Shows tasks ready for AI implementation with Copy AI Prompt\n\nimport React, { useState, useCallback } from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport { CloseIcon, CopyIcon, CheckIcon, DownloadIcon } from './Icons';\nimport type { FeedbackComment } from '@framed/core';\n\n/**\n * Extract pathname from a URL string\n */\nfunction getPagePath(url?: string): string {\n if (!url) return '/';\n try {\n const parsed = new URL(url);\n return parsed.pathname || '/';\n } catch {\n return '/';\n }\n}\n\ninterface TaskPreviewProps {\n comment: FeedbackComment;\n}\n\nfunction TaskPreview({ comment }: TaskPreviewProps) {\n const title = comment.textEdit\n ? `Change \"${comment.textEdit.originalText.substring(0, 30)}${comment.textEdit.originalText.length > 30 ? '...' : ''}\" to \"${comment.textEdit.newText.substring(0, 30)}${comment.textEdit.newText.length > 30 ? '...' : ''}\"`\n : comment.content.substring(0, 80) + (comment.content.length > 80 ? '...' : '');\n\n const page = getPagePath(comment.pageUrl);\n const hasAttachments = comment.attachments && comment.attachments.length > 0;\n\n return (\n <li className=\"framed-export-task\">\n <div className=\"framed-export-task-indicator\" />\n <div className=\"framed-export-task-content\">\n <div className=\"framed-export-task-title\">{title}</div>\n <div className=\"framed-export-task-meta\">\n <span>{page}</span>\n {comment.elementType && (\n <>\n <span className=\"framed-export-task-separator\">•</span>\n <span className=\"framed-export-task-element\">{comment.elementType}</span>\n </>\n )}\n {hasAttachments && (\n <>\n <span className=\"framed-export-task-separator\">•</span>\n <span className=\"framed-export-task-attachments\">\n {comment.attachments!.length} attachment{comment.attachments!.length !== 1 ? 's' : ''}\n </span>\n </>\n )}\n </div>\n </div>\n </li>\n );\n}\n\nexport interface ExportModalProps {\n /** Custom copy handler - if provided, will be called instead of default */\n onCopyPrompt?: () => Promise<boolean>;\n}\n\nexport function ExportModal({ onCopyPrompt }: ExportModalProps) {\n const { exportModalOpen, closeExportModal, comments, showToast } = useWidgetStore();\n const [copied, setCopied] = useState(false);\n const [copying, setCopying] = useState(false);\n\n const openComments = comments.filter((c) => !c.resolved);\n const openCount = openComments.length;\n\n const generateDefaultPrompt = useCallback(() => {\n // Group tasks by page\n const tasksByPage = new Map<string, typeof openComments>();\n openComments.forEach((comment) => {\n const pageUrl = comment.pageUrl || window.location.href;\n if (!tasksByPage.has(pageUrl)) {\n tasksByPage.set(pageUrl, []);\n }\n tasksByPage.get(pageUrl)!.push(comment);\n });\n\n let prompt = `# Feedback Tasks\\n\\nThe following feedback has been collected and needs to be implemented:\\n\\n`;\n\n let taskIndex = 1;\n tasksByPage.forEach((pageTasks, pageUrl) => {\n const pagePath = getPagePath(pageUrl);\n prompt += `## Page: ${pagePath}\\n`;\n prompt += `URL: ${pageUrl}\\n\\n`;\n\n pageTasks.forEach((comment) => {\n let taskDescription = comment.content;\n\n if (comment.textEdit) {\n taskDescription = `Change text from \"${comment.textEdit.originalText}\" to \"${comment.textEdit.newText}\"`;\n }\n\n prompt += `${taskIndex}. ${taskDescription}\\n`;\n\n if (comment.selector) {\n prompt += ` Element: ${comment.selector}\\n`;\n }\n if (comment.elementType) {\n prompt += ` Type: ${comment.elementType}\\n`;\n }\n if (comment.elementId) {\n prompt += ` ID: #${comment.elementId}\\n`;\n }\n if (comment.elementClassName) {\n prompt += ` Class: .${comment.elementClassName.split(' ').join('.')}\\n`;\n }\n\n prompt += '\\n';\n taskIndex++;\n });\n });\n\n prompt += `## Instructions\\nPlease implement each task above. The tasks are grouped by page URL for easier navigation.\\n`;\n\n return prompt;\n }, [openComments]);\n\n const handleCopy = useCallback(async () => {\n if (copying) return;\n\n setCopying(true);\n try {\n let success = false;\n\n if (onCopyPrompt) {\n success = await onCopyPrompt();\n } else {\n // Default: generate and copy basic prompt\n const prompt = generateDefaultPrompt();\n await navigator.clipboard.writeText(prompt);\n success = true;\n }\n\n if (success) {\n setCopied(true);\n showToast('AI prompt copied to clipboard!', 'success');\n setTimeout(() => setCopied(false), 2000);\n }\n } catch (error) {\n console.error('Failed to copy prompt:', error);\n showToast('Failed to copy prompt', 'error');\n } finally {\n setCopying(false);\n }\n }, [copying, onCopyPrompt, generateDefaultPrompt, showToast]);\n\n const handleDownload = useCallback(() => {\n const prompt = generateDefaultPrompt();\n const blob = new Blob([prompt], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `feedback-tasks-${new Date().toISOString().split('T')[0]}.md`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n showToast('Downloaded feedback-tasks.md', 'success');\n }, [generateDefaultPrompt, showToast]);\n\n const handleClose = () => {\n closeExportModal();\n };\n\n if (!exportModalOpen) return null;\n\n return (\n <div className=\"framed-modal-overlay\" data-framed-widget onClick={handleClose}>\n <div className=\"framed-export-modal\" onClick={(e) => e.stopPropagation()}>\n <div className=\"framed-export-header\">\n <h3 className=\"framed-export-title\">\n {openCount} task{openCount !== 1 ? 's' : ''} ready for your AI\n </h3>\n <button\n className=\"framed-modal-close\"\n onClick={handleClose}\n type=\"button\"\n aria-label=\"Close\"\n >\n <CloseIcon size={20} />\n </button>\n </div>\n\n {openCount > 0 ? (\n <>\n <ul className=\"framed-export-tasks\">\n {openComments.slice(0, 5).map((comment) => (\n <TaskPreview key={comment.id} comment={comment} />\n ))}\n </ul>\n\n {openCount > 5 && (\n <p className=\"framed-export-more\">\n +{openCount - 5} more task{openCount - 5 !== 1 ? 's' : ''}\n </p>\n )}\n\n <div className=\"framed-export-actions\">\n <button\n className=\"framed-export-copy-btn\"\n onClick={handleCopy}\n disabled={copying}\n type=\"button\"\n >\n {copied ? (\n <>\n <CheckIcon size={18} />\n <span>Copied!</span>\n </>\n ) : copying ? (\n <span>Copying...</span>\n ) : (\n <>\n <CopyIcon size={18} />\n <span>Copy AI Prompt</span>\n </>\n )}\n </button>\n\n <button\n className=\"framed-export-download-btn\"\n onClick={handleDownload}\n type=\"button\"\n title=\"Download as Markdown file\"\n >\n <DownloadIcon size={18} />\n <span>Download .md</span>\n </button>\n </div>\n\n <p className=\"framed-export-hint\">\n Paste in Lovable, Bolt, or Cursor to implement\n </p>\n </>\n ) : (\n <div className=\"framed-export-empty\">\n <p>No open tasks to export.</p>\n <p className=\"framed-export-empty-hint\">\n Add feedback using the widget toolbar to create tasks.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n","// Multi-select overlay for drag-to-select multiple elements\n\nimport React, { useEffect, useCallback, useRef, useState } from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport { isFramedElement } from '../utils/helpers';\n\nexport function MultiSelectOverlay() {\n const {\n isOpen,\n isMultiSelectMode,\n multiSelectedElements,\n selectionRect,\n annotationColor,\n setMultiSelectedElements,\n setSelectionRect,\n clearMultiSelection,\n openQuickInput,\n showToast,\n } = useWidgetStore();\n\n const [isDragging, setIsDragging] = useState(false);\n const startPointRef = useRef<{ x: number; y: number } | null>(null);\n const highlightsRef = useRef<HTMLDivElement[]>([]);\n\n // Clean up highlights\n const clearHighlights = useCallback(() => {\n highlightsRef.current.forEach((el) => el.remove());\n highlightsRef.current = [];\n }, []);\n\n // Create highlight for selected element\n const createHighlight = useCallback(\n (element: HTMLElement) => {\n const rect = element.getBoundingClientRect();\n const highlight = document.createElement('div');\n highlight.className = 'framed-multi-selected-highlight';\n highlight.style.cssText = `\n position: fixed;\n top: ${rect.top}px;\n left: ${rect.left}px;\n width: ${rect.width}px;\n height: ${rect.height}px;\n border: 2px solid ${annotationColor};\n border-radius: 4px;\n background: ${annotationColor}22;\n pointer-events: none;\n z-index: 2147483645;\n box-shadow: 0 0 0 0 ${annotationColor}40;\n animation: framed-selection-pulse 2s ease-in-out infinite;\n `;\n document.body.appendChild(highlight);\n highlightsRef.current.push(highlight);\n },\n [annotationColor]\n );\n\n // Update highlights for selected elements\n const updateHighlights = useCallback(() => {\n clearHighlights();\n multiSelectedElements.forEach(createHighlight);\n }, [multiSelectedElements, clearHighlights, createHighlight]);\n\n // Get all elements within a rectangle\n const getElementsInRect = useCallback(\n (rect: { startX: number; startY: number; endX: number; endY: number }) => {\n const left = Math.min(rect.startX, rect.endX);\n const right = Math.max(rect.startX, rect.endX);\n const top = Math.min(rect.startY, rect.endY);\n const bottom = Math.max(rect.startY, rect.endY);\n\n const elements: HTMLElement[] = [];\n\n // Get all elements on the page\n const allElements = document.body.querySelectorAll('*');\n\n allElements.forEach((el) => {\n if (isFramedElement(el as HTMLElement)) return;\n\n const elRect = el.getBoundingClientRect();\n\n // Check if element overlaps with selection rectangle\n const overlaps =\n elRect.left < right &&\n elRect.right > left &&\n elRect.top < bottom &&\n elRect.bottom > top;\n\n if (overlaps && el.children.length === 0) {\n // Only select leaf elements (no children) to avoid selecting containers\n elements.push(el as HTMLElement);\n }\n });\n\n return elements;\n },\n []\n );\n\n // Handle mouse down\n const handleMouseDown = useCallback(\n (e: MouseEvent) => {\n if (!isMultiSelectMode) return;\n if (isFramedElement(e.target as HTMLElement)) return;\n\n e.preventDefault();\n setIsDragging(true);\n startPointRef.current = { x: e.clientX, y: e.clientY };\n setSelectionRect({\n startX: e.clientX,\n startY: e.clientY,\n endX: e.clientX,\n endY: e.clientY,\n });\n },\n [isMultiSelectMode, setSelectionRect]\n );\n\n // Handle mouse move\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || !startPointRef.current) return;\n\n setSelectionRect({\n startX: startPointRef.current.x,\n startY: startPointRef.current.y,\n endX: e.clientX,\n endY: e.clientY,\n });\n },\n [isDragging, setSelectionRect]\n );\n\n // Handle mouse up\n const handleMouseUp = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || !selectionRect) {\n setIsDragging(false);\n return;\n }\n\n setIsDragging(false);\n\n // Get elements in selection\n const elements = getElementsInRect(selectionRect);\n\n if (elements.length > 0) {\n setMultiSelectedElements(elements);\n showToast(`Selected ${elements.length} element${elements.length > 1 ? 's' : ''}`, 'success');\n openQuickInput();\n } else {\n clearMultiSelection();\n }\n\n setSelectionRect(null);\n startPointRef.current = null;\n },\n [\n isDragging,\n selectionRect,\n getElementsInRect,\n setMultiSelectedElements,\n clearMultiSelection,\n setSelectionRect,\n showToast,\n openQuickInput,\n ]\n );\n\n // Set up event listeners\n useEffect(() => {\n if (!isOpen || !isMultiSelectMode) {\n clearHighlights();\n return;\n }\n\n document.addEventListener('mousedown', handleMouseDown, true);\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('mouseup', handleMouseUp, true);\n\n // Set cursor\n document.body.style.cursor = 'crosshair';\n\n return () => {\n document.removeEventListener('mousedown', handleMouseDown, true);\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('mouseup', handleMouseUp, true);\n document.body.style.cursor = '';\n };\n }, [isOpen, isMultiSelectMode, handleMouseDown, handleMouseMove, handleMouseUp, clearHighlights]);\n\n // Update highlights when selection changes\n useEffect(() => {\n updateHighlights();\n }, [multiSelectedElements, updateHighlights]);\n\n // Clean up on unmount\n useEffect(() => {\n return () => {\n clearHighlights();\n };\n }, [clearHighlights]);\n\n if (!isOpen || !isMultiSelectMode) return null;\n\n // Render selection rectangle\n if (!selectionRect) return null;\n\n const left = Math.min(selectionRect.startX, selectionRect.endX);\n const top = Math.min(selectionRect.startY, selectionRect.endY);\n const width = Math.abs(selectionRect.endX - selectionRect.startX);\n const height = Math.abs(selectionRect.endY - selectionRect.startY);\n\n return (\n <div\n className=\"framed-selection-rect\"\n style={{\n left: `${left}px`,\n top: `${top}px`,\n width: `${width}px`,\n height: `${height}px`,\n }}\n data-framed-widget\n />\n );\n}\n","// Area annotation overlay for annotating empty space\n\nimport React, { useEffect, useCallback, useRef, useState } from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport { isFramedElement, generateId } from '../utils/helpers';\n\nexport function AreaAnnotationOverlay() {\n const {\n isOpen,\n isAreaAnnotateMode,\n areaAnnotations,\n annotationColor,\n setIsAreaAnnotateMode,\n addAreaAnnotation,\n removeAreaAnnotation,\n openChatModal,\n showToast,\n } = useWidgetStore();\n\n const [isDragging, setIsDragging] = useState(false);\n const [currentRect, setCurrentRect] = useState<{\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n } | null>(null);\n const startPointRef = useRef<{ x: number; y: number } | null>(null);\n\n // Handle mouse down\n const handleMouseDown = useCallback(\n (e: MouseEvent) => {\n if (!isAreaAnnotateMode) return;\n if (isFramedElement(e.target as HTMLElement)) return;\n\n // Don't start new annotation if clicking on existing one\n const target = e.target as HTMLElement;\n if (target.closest('.framed-area-annotation')) return;\n\n e.preventDefault();\n setIsDragging(true);\n startPointRef.current = { x: e.clientX, y: e.clientY };\n setCurrentRect({\n startX: e.clientX,\n startY: e.clientY,\n endX: e.clientX,\n endY: e.clientY,\n });\n },\n [isAreaAnnotateMode]\n );\n\n // Handle mouse move\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || !startPointRef.current) return;\n\n setCurrentRect({\n startX: startPointRef.current.x,\n startY: startPointRef.current.y,\n endX: e.clientX,\n endY: e.clientY,\n });\n },\n [isDragging]\n );\n\n // Handle mouse up\n const handleMouseUp = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || !currentRect) {\n setIsDragging(false);\n return;\n }\n\n setIsDragging(false);\n\n // Calculate dimensions\n const left = Math.min(currentRect.startX, currentRect.endX);\n const top = Math.min(currentRect.startY, currentRect.endY);\n const width = Math.abs(currentRect.endX - currentRect.startX);\n const height = Math.abs(currentRect.endY - currentRect.startY);\n\n // Only create annotation if it has meaningful size\n if (width > 20 && height > 20) {\n const id = generateId();\n addAreaAnnotation({\n id,\n x: left,\n y: top,\n width,\n height,\n });\n showToast('Area marked - click to add feedback', 'success');\n }\n\n setCurrentRect(null);\n startPointRef.current = null;\n },\n [isDragging, currentRect, addAreaAnnotation, showToast]\n );\n\n // Handle clicking on an existing annotation\n const handleAnnotationClick = useCallback(\n (e: React.MouseEvent, annotationId: string) => {\n e.stopPropagation();\n // Open chat modal for this area\n openChatModal();\n showToast('Add feedback for this area', 'info');\n },\n [openChatModal, showToast]\n );\n\n // Handle removing an annotation\n const handleAnnotationRemove = useCallback(\n (e: React.MouseEvent, annotationId: string) => {\n e.stopPropagation();\n removeAreaAnnotation(annotationId);\n showToast('Area annotation removed', 'info');\n },\n [removeAreaAnnotation, showToast]\n );\n\n // Set up event listeners\n useEffect(() => {\n if (!isOpen || !isAreaAnnotateMode) {\n return;\n }\n\n document.addEventListener('mousedown', handleMouseDown, true);\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('mouseup', handleMouseUp, true);\n\n // Set cursor\n document.body.style.cursor = 'crosshair';\n\n return () => {\n document.removeEventListener('mousedown', handleMouseDown, true);\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('mouseup', handleMouseUp, true);\n document.body.style.cursor = '';\n };\n }, [isOpen, isAreaAnnotateMode, handleMouseDown, handleMouseMove, handleMouseUp]);\n\n if (!isOpen) return null;\n\n // Calculate current rect dimensions\n const currentRectStyle = currentRect\n ? {\n left: `${Math.min(currentRect.startX, currentRect.endX)}px`,\n top: `${Math.min(currentRect.startY, currentRect.endY)}px`,\n width: `${Math.abs(currentRect.endX - currentRect.startX)}px`,\n height: `${Math.abs(currentRect.endY - currentRect.startY)}px`,\n }\n : null;\n\n return (\n <>\n {/* Current dragging rectangle */}\n {isAreaAnnotateMode && currentRectStyle && (\n <div\n className=\"framed-selection-rect\"\n style={currentRectStyle}\n data-framed-widget\n />\n )}\n\n {/* Existing area annotations */}\n {areaAnnotations.map((annotation, index) => (\n <div\n key={annotation.id}\n className=\"framed-area-annotation\"\n style={{\n left: `${annotation.x}px`,\n top: `${annotation.y}px`,\n width: `${annotation.width}px`,\n height: `${annotation.height}px`,\n }}\n onClick={(e) => handleAnnotationClick(e, annotation.id)}\n data-framed-widget\n >\n <div className=\"framed-area-badge\">{index + 1}</div>\n <button\n className=\"framed-area-remove\"\n onClick={(e) => handleAnnotationRemove(e, annotation.id)}\n style={{\n position: 'absolute',\n top: '-8px',\n left: '-8px',\n width: '20px',\n height: '20px',\n background: '#ef4444',\n color: 'white',\n border: 'none',\n borderRadius: '50%',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: 'bold',\n opacity: 0,\n transition: 'opacity 0.15s ease',\n }}\n onMouseEnter={(e) => {\n (e.target as HTMLElement).style.opacity = '1';\n }}\n onMouseLeave={(e) => {\n (e.target as HTMLElement).style.opacity = '0';\n }}\n >\n ×\n </button>\n </div>\n ))}\n </>\n );\n}\n","// AUTO-GENERATED - DO NOT EDIT\n// This file is generated from widget.css during build\n// Run `pnpm build` to regenerate\n\nexport const WIDGET_CSS = `/* Framed Widget Styles - Figma-style floating toolbar */\n\n/* CSS Variables */\n:root {\n --framed-toolbar-bg: rgba(24, 24, 27, 0.95);\n --framed-toolbar-btn-bg: transparent;\n --framed-toolbar-btn-hover: rgba(255, 255, 255, 0.1);\n --framed-toolbar-btn-active: rgba(59, 130, 246, 0.3);\n --framed-toolbar-btn-active-color: #60a5fa;\n --framed-toolbar-text: #e4e4e7;\n --framed-toolbar-text-muted: #a1a1aa;\n --framed-toolbar-divider: rgba(255, 255, 255, 0.1);\n --framed-toolbar-radius: 16px;\n --framed-toolbar-btn-radius: 8px;\n --framed-panel-bg: #ffffff;\n --framed-panel-border: #e4e4e7;\n --framed-panel-text: #18181b;\n --framed-panel-text-muted: #71717a;\n --framed-primary: #3b82f6;\n --framed-primary-hover: #2563eb;\n --framed-success: #10b981;\n --framed-warning: #f59e0b;\n --framed-error: #ef4444;\n --framed-shadow-lg: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n /* Smooth spring-like easing for animations */\n --framed-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);\n --framed-ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);\n --framed-ease-out: cubic-bezier(0, 0, 0.2, 1);\n --framed-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --framed-transition: 0.2s var(--framed-ease-smooth);\n --framed-transition-fast: 0.15s var(--framed-ease-smooth);\n --framed-transition-spring: 0.3s var(--framed-ease-spring);\n}\n\n/* Animations - Smooth spring-like motion */\n@keyframes framed-slide-up {\n 0% {\n opacity: 0;\n transform: translateY(24px) scale(0.96);\n }\n 100% {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@keyframes framed-slide-in-right {\n 0% {\n opacity: 0;\n transform: translateX(100%);\n }\n 100% {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes framed-pulse {\n 0%, 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.7;\n transform: scale(0.98);\n }\n}\n\n@keyframes framed-pop {\n 0% {\n transform: scale(0.9);\n opacity: 0;\n }\n 70% {\n transform: scale(1.02);\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@keyframes framed-toast-in {\n 0% {\n opacity: 0;\n transform: translateY(-50%) translateX(20px) scale(0.95);\n }\n 100% {\n opacity: 1;\n transform: translateY(-50%) translateX(0) scale(1);\n }\n}\n\n@keyframes framed-spring-in {\n 0% {\n opacity: 0;\n transform: scale(0.85);\n }\n 50% {\n transform: scale(1.03);\n }\n 75% {\n transform: scale(0.98);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@keyframes framed-bounce-in {\n 0% {\n opacity: 0;\n transform: translateY(10px);\n }\n 60% {\n transform: translateY(-3px);\n }\n 100% {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes framed-selection-pulse {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4);\n }\n 50% {\n box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.1);\n }\n}\n\n@keyframes framed-marching-ants {\n 0% {\n stroke-dashoffset: 0;\n }\n 100% {\n stroke-dashoffset: 16;\n }\n}\n\n/* Toolbar Container */\n.framed-toolbar-container {\n position: fixed;\n bottom: 24px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 2147483647;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n animation: framed-slide-up 0.4s var(--framed-ease-spring) forwards;\n}\n\n/* Toolbar */\n.framed-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px;\n background: var(--framed-toolbar-bg);\n border-radius: var(--framed-toolbar-radius);\n box-shadow: var(--framed-shadow-lg);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n transition: transform var(--framed-transition-spring), box-shadow var(--framed-transition);\n}\n\n.framed-toolbar:hover {\n transform: translateY(-1px);\n box-shadow: 0 28px 56px -14px rgba(0, 0, 0, 0.3);\n}\n\n.framed-toolbar-group {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n\n/* Framed Logo Badge */\n.framed-logo-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: white;\n border-radius: 8px;\n margin-left: 2px;\n cursor: default;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.framed-logo-badge svg {\n flex-shrink: 0;\n}\n\n.framed-toolbar-divider {\n width: 1px;\n height: 24px;\n background: var(--framed-toolbar-divider);\n margin: 0 4px;\n}\n\n.framed-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: var(--framed-toolbar-btn-bg);\n color: var(--framed-toolbar-text);\n border-radius: var(--framed-toolbar-btn-radius);\n cursor: pointer;\n transition: all var(--framed-transition-fast), transform var(--framed-transition-spring);\n position: relative;\n transform: scale(1);\n}\n\n.framed-toolbar-btn:hover {\n background: var(--framed-toolbar-btn-hover);\n transform: scale(1.05);\n}\n\n.framed-toolbar-btn:active {\n transform: scale(0.95);\n}\n\n.framed-toolbar-btn.active {\n background: var(--framed-toolbar-btn-active);\n color: var(--framed-toolbar-btn-active-color);\n animation: framed-selection-pulse 2s ease-in-out infinite;\n}\n\n.framed-toolbar-btn.recording {\n animation: framed-pulse 1.5s ease-in-out infinite;\n}\n\n.framed-toolbar-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n transform: scale(1);\n}\n\n.framed-toolbar-btn:disabled:hover {\n transform: scale(1);\n}\n\n.framed-badge {\n position: absolute;\n top: 2px;\n right: 2px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n background: var(--framed-primary);\n color: white;\n font-size: 10px;\n font-weight: 600;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Quick Input Container */\n.framed-quick-input-container {\n position: fixed;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n z-index: 2147483647;\n pointer-events: none;\n}\n\n/* Quick Input Popup */\n.framed-quick-input,\n.framed-quick-input * {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica,\n Arial, sans-serif !important;\n box-sizing: border-box;\n}\n\n.framed-quick-input {\n position: fixed;\n bottom: 100px;\n left: 50%;\n transform: translateX(-50%);\n width: 620px;\n max-width: calc(100vw - 40px);\n background: #f8f8f8;\n border-radius: 20px;\n box-shadow: 0 25px 60px rgba(0, 0, 0, 0.2), 0 8px 24px rgba(0, 0, 0, 0.1);\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n transition: opacity 0.15s ease;\n overflow: hidden;\n z-index: 2147483647;\n}\n\n.framed-quick-input.open {\n opacity: 1;\n visibility: visible;\n pointer-events: auto;\n}\n\n.framed-quick-input-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 18px 20px;\n background: #f0f0f0;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.framed-quick-header-content {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.framed-quick-label {\n font-size: 15px;\n color: #666;\n font-weight: 400;\n white-space: nowrap;\n}\n\n.framed-quick-divider {\n color: #ccc;\n font-size: 16px;\n}\n\n.framed-quick-path {\n font-size: 15px;\n color: #333;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.framed-quick-close {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: #666;\n cursor: pointer;\n border-radius: 8px;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.framed-quick-close:hover {\n background: rgba(0, 0, 0, 0.08);\n color: #333;\n}\n\n.framed-quick-body {\n padding: 20px;\n background: white;\n}\n\n.framed-quick-textarea {\n width: 100%;\n min-height: 140px;\n padding: 16px 18px;\n border: 1px solid #e0e0e0;\n border-radius: 14px;\n font-size: 15px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica,\n Arial, sans-serif !important;\n resize: none;\n outline: none;\n box-sizing: border-box;\n background: white;\n color: #333;\n line-height: 1.5;\n}\n\n.framed-quick-textarea::placeholder {\n color: #999;\n}\n\n.framed-quick-textarea:focus {\n border-color: #ccc;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.04);\n}\n\n.framed-quick-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: white;\n border-top: 1px solid #f0f0f0;\n}\n\n.framed-quick-annotation-btns {\n display: flex;\n gap: 8px;\n}\n\n.framed-ann-btn {\n width: 42px;\n height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 10px;\n color: #666;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.framed-ann-btn:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n.framed-ann-btn.active {\n background: var(--framed-primary);\n color: white;\n}\n\n.framed-quick-submit {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 24px;\n background: #3b82f6;\n border: none;\n color: white;\n font-size: 14px;\n font-weight: 500;\n border-radius: 10px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.framed-quick-submit:hover {\n background: #2563eb;\n}\n\n.framed-quick-submit svg {\n opacity: 0.9;\n}\n\n/* Pending Attachments */\n.framed-pending-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 12px;\n}\n\n.framed-attachment-item {\n position: relative;\n width: 60px;\n height: 60px;\n border-radius: 8px;\n overflow: hidden;\n background: #f5f5f5;\n border: 1px solid #e0e0e0;\n}\n\n.framed-attachment-item img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.framed-attachment-icon {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n}\n\n.framed-attachment-remove {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 18px;\n height: 18px;\n background: rgba(0, 0, 0, 0.6);\n border: none;\n border-radius: 50%;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 12px;\n line-height: 1;\n}\n\n/* Feedback Panel (Right Side) */\n.framed-feedback-panel {\n position: fixed;\n top: 0;\n right: 0;\n width: 380px;\n height: 100vh;\n background: var(--framed-panel-bg);\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.1);\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform var(--framed-transition);\n z-index: 2147483646;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.framed-feedback-panel.open {\n transform: translateX(0);\n}\n\n.framed-panel-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--framed-panel-border);\n}\n\n.framed-panel-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--framed-panel-text);\n}\n\n.framed-panel-tabs {\n display: flex;\n gap: 4px;\n flex: 1;\n}\n\n.framed-tab {\n padding: 6px 12px;\n background: transparent;\n border: none;\n font-size: 12px;\n font-weight: 500;\n color: var(--framed-panel-text-muted);\n cursor: pointer;\n border-radius: 6px;\n transition: all var(--framed-transition);\n}\n\n.framed-tab:hover {\n background: #f4f4f5;\n}\n\n.framed-tab.active {\n background: var(--framed-primary);\n color: white;\n}\n\n.framed-panel-close {\n width: 32px;\n height: 32px;\n background: transparent;\n border: none;\n color: var(--framed-panel-text-muted);\n cursor: pointer;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.framed-panel-close:hover {\n background: #f4f4f5;\n color: var(--framed-panel-text);\n}\n\n.framed-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.framed-panel-footer {\n padding: 12px 16px;\n border-top: 1px solid var(--framed-panel-border);\n background: #f9fafb;\n}\n\n.framed-ai-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 10px 16px;\n background: #18181b;\n border: none;\n color: white;\n font-size: 13px;\n font-weight: 600;\n border-radius: 8px;\n cursor: pointer;\n transition: background var(--framed-transition);\n}\n\n.framed-ai-btn:hover {\n background: #27272a;\n}\n\n/* Comment Cards */\n.framed-comment-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.framed-comment-card {\n padding: 14px;\n background: #f9fafb;\n border-radius: 10px;\n border: 1px solid var(--framed-panel-border);\n transition: all var(--framed-transition);\n}\n\n.framed-comment-card:hover {\n border-color: var(--framed-primary);\n}\n\n.framed-comment-card.resolved {\n opacity: 0.6;\n}\n\n.framed-comment-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.framed-comment-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.framed-comment-author {\n font-size: 13px;\n font-weight: 600;\n color: var(--framed-panel-text);\n}\n\n.framed-comment-time {\n font-size: 11px;\n color: var(--framed-panel-text-muted);\n}\n\n.framed-comment-status {\n padding: 2px 8px;\n font-size: 10px;\n font-weight: 600;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.framed-comment-status.open {\n background: #dbeafe;\n color: #1d4ed8;\n}\n\n.framed-comment-status.resolved {\n background: #d1fae5;\n color: #059669;\n}\n\n.framed-comment-content {\n font-size: 14px;\n color: var(--framed-panel-text);\n line-height: 1.5;\n margin-bottom: 10px;\n white-space: pre-wrap;\n}\n\n/* Rich text content in feedback cards */\n.framed-comment-content.framed-rich-content {\n white-space: normal;\n}\n\n.framed-comment-content.framed-rich-content b,\n.framed-comment-content.framed-rich-content strong {\n font-weight: 700;\n}\n\n.framed-comment-content.framed-rich-content i,\n.framed-comment-content.framed-rich-content em {\n font-style: italic;\n}\n\n.framed-comment-content.framed-rich-content u {\n text-decoration: underline;\n}\n\n.framed-comment-content.framed-rich-content a {\n color: #3b82f6;\n text-decoration: underline;\n}\n\n.framed-comment-content.framed-rich-content ul,\n.framed-comment-content.framed-rich-content ol {\n margin: 4px 0;\n padding-left: 20px;\n}\n\n.framed-comment-content.framed-rich-content li {\n margin: 2px 0;\n}\n\n.framed-comment-element {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 8px;\n background: #e5e7eb;\n border-radius: 6px;\n margin-bottom: 10px;\n}\n\n.framed-comment-element-tag {\n padding: 2px 6px;\n background: #6b7280;\n color: white;\n font-size: 10px;\n font-weight: 600;\n border-radius: 4px;\n font-family: monospace;\n}\n\n.framed-comment-element-text {\n font-size: 11px;\n color: #4b5563;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.framed-comment-actions {\n display: flex;\n gap: 8px;\n}\n\n.framed-action-btn {\n flex: 1;\n padding: 8px 12px;\n background: white;\n border: 1px solid var(--framed-panel-border);\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n color: var(--framed-panel-text-muted);\n cursor: pointer;\n transition: all var(--framed-transition);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n}\n\n.framed-action-btn:hover {\n border-color: var(--framed-primary);\n color: var(--framed-primary);\n}\n\n.framed-action-btn.resolve-btn {\n background: #d1fae5;\n border-color: #a7f3d0;\n color: #059669;\n}\n\n.framed-action-btn.resolve-btn:hover {\n background: #a7f3d0;\n}\n\n/* Text Edit in Comment */\n.framed-comment-text-edit {\n margin-bottom: 10px;\n padding: 8px;\n background: #f3f4f6;\n border-radius: 6px;\n font-size: 12px;\n}\n\n.framed-text-edit-original {\n color: #991b1b;\n text-decoration: line-through;\n margin-bottom: 4px;\n}\n\n.framed-text-edit-new {\n color: #166534;\n}\n\n.framed-text-edit-label {\n font-weight: 600;\n margin-right: 4px;\n}\n\n/* Attachments in Comment */\n.framed-comment-attachments {\n display: flex;\n gap: 4px;\n margin-bottom: 10px;\n}\n\n.framed-attachment-thumb {\n width: 40px;\n height: 40px;\n border-radius: 4px;\n overflow: hidden;\n background: #f3f4f6;\n}\n\n.framed-attachment-thumb img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n/* Empty State */\n.framed-empty-state {\n text-align: center;\n padding: 40px 20px;\n color: var(--framed-panel-text-muted);\n}\n\n.framed-empty-state svg {\n opacity: 0.3;\n margin-bottom: 12px;\n}\n\n.framed-empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n/* Chat Modal */\n.framed-chat-modal,\n.framed-chat-modal * {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;\n box-sizing: border-box;\n}\n\n.framed-chat-modal {\n position: fixed;\n bottom: 100px;\n left: 50%;\n transform: translateX(-50%);\n width: 620px;\n max-width: calc(100vw - 40px);\n background: #f8f8f8;\n border-radius: 20px;\n box-shadow: 0 25px 60px rgba(0, 0, 0, 0.2), 0 8px 24px rgba(0, 0, 0, 0.1);\n z-index: 2147483647;\n overflow: hidden;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.15s ease;\n}\n\n.framed-chat-modal.open {\n opacity: 1;\n visibility: visible;\n}\n\n.framed-chat-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 18px 20px;\n background: #f0f0f0;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.framed-chat-header-content {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.framed-chat-label {\n font-size: 15px;\n color: #666;\n font-weight: 400;\n white-space: nowrap;\n}\n\n.framed-chat-divider {\n color: #ccc;\n font-size: 16px;\n}\n\n.framed-chat-page {\n font-size: 15px;\n color: #333;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.framed-chat-close {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: #666;\n cursor: pointer;\n border-radius: 8px;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.framed-chat-close:hover {\n background: rgba(0, 0, 0, 0.08);\n color: #333;\n}\n\n.framed-chat-body {\n padding: 20px;\n background: white;\n}\n\n.framed-chat-textarea {\n width: 100%;\n min-height: 140px;\n padding: 16px 18px;\n border: 1px solid #e0e0e0;\n border-radius: 14px;\n font-size: 15px !important;\n resize: none;\n outline: none;\n box-sizing: border-box;\n background: white;\n color: #333;\n line-height: 1.5;\n}\n\n.framed-chat-textarea:focus {\n border-color: #ccc;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.04);\n}\n\n.framed-chat-textarea::placeholder {\n color: #999;\n}\n\n.framed-chat-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: white;\n border-top: 1px solid #f0f0f0;\n}\n\n.framed-chat-annotation-btns {\n display: flex;\n gap: 8px;\n}\n\n.framed-chat-submit {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 24px;\n background: #3b82f6;\n border: none;\n color: white;\n font-size: 14px;\n font-weight: 500;\n border-radius: 10px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.framed-chat-submit:hover {\n background: #2563eb;\n}\n\n.framed-chat-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Text Edit Overlay */\n.framed-text-edit-overlay {\n position: fixed;\n bottom: 100px;\n left: 50%;\n transform: translateX(-50%);\n width: 580px;\n max-width: calc(100vw - 40px);\n background: #f8f8f8;\n border-radius: 16px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n overflow: hidden;\n z-index: 2147483647;\n}\n\n.framed-text-edit-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 16px;\n background: #f0f0f0;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.framed-text-edit-label-header {\n font-size: 14px;\n color: #666;\n font-weight: 400;\n}\n\n.framed-text-edit-divider {\n color: #ccc;\n font-size: 14px;\n}\n\n.framed-text-edit-path {\n flex: 1;\n font-size: 14px;\n color: #333;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.framed-text-edit-close {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: #999;\n cursor: pointer;\n border-radius: 6px;\n}\n\n.framed-text-edit-close:hover {\n background: rgba(0, 0, 0, 0.08);\n color: #333;\n}\n\n.framed-text-edit-body {\n padding: 16px;\n background: white;\n}\n\n.framed-text-edit-section {\n margin-bottom: 16px;\n}\n\n.framed-text-edit-section:last-child {\n margin-bottom: 0;\n}\n\n.framed-text-edit-section-label {\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n margin-bottom: 6px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.framed-text-edit-section-label.original {\n color: #991b1b;\n}\n\n.framed-text-edit-section-label.new {\n color: #166534;\n}\n\n.framed-text-edit-original-text {\n padding: 12px 14px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 10px;\n font-size: 14px;\n color: #991b1b;\n text-decoration: line-through;\n white-space: pre-wrap;\n max-height: 80px;\n overflow-y: auto;\n line-height: 1.5;\n}\n\n.framed-text-edit-textarea {\n width: 100%;\n padding: 12px 14px;\n background: #f0fdf4;\n border: 1px solid #bbf7d0;\n border-radius: 10px;\n font-size: 14px;\n color: #166534;\n resize: none;\n min-height: 80px;\n font-family: inherit;\n box-sizing: border-box;\n line-height: 1.5;\n outline: none;\n}\n\n.framed-text-edit-textarea:focus {\n border-color: #86efac;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n}\n\n.framed-text-edit-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n padding: 12px 16px;\n background: white;\n border-top: 1px solid #f0f0f0;\n}\n\n.framed-text-edit-cancel {\n padding: 10px 20px;\n background: transparent;\n border: none;\n color: #666;\n font-size: 14px;\n font-weight: 500;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.framed-text-edit-cancel:hover {\n background: #f5f5f5;\n}\n\n.framed-text-edit-apply {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: #3b82f6;\n border: none;\n color: white;\n font-size: 14px;\n font-weight: 500;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.framed-text-edit-apply:hover {\n background: #2563eb;\n}\n\n/* Toast Notification - positioned to the right of the toolbar */\n.framed-toast {\n position: absolute;\n top: 50%;\n left: 100%;\n transform: translateY(-50%);\n margin-left: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 6px 6px 14px;\n background: rgba(24, 24, 27, 0.95);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n border-radius: 16px;\n color: white;\n font-size: 13px;\n white-space: nowrap;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\n z-index: 2147483647;\n animation: framed-toast-in 0.2s ease;\n}\n\n.framed-toast-icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.framed-toast-message {\n flex: 1;\n}\n\n.framed-toast-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n background: transparent;\n border: none;\n color: rgba(255, 255, 255, 0.5);\n cursor: pointer;\n border-radius: 6px;\n}\n\n.framed-toast-close:hover {\n background: rgba(255, 255, 255, 0.1);\n color: white;\n}\n\n/* Responsive styles */\n@media (max-width: 500px) {\n .framed-logo-badge {\n display: none;\n }\n\n .framed-toolbar-divider:first-of-type {\n display: none;\n }\n\n .framed-toolbar {\n gap: 2px;\n padding: 4px;\n }\n\n .framed-toolbar-btn {\n width: 32px;\n height: 32px;\n }\n\n .framed-toolbar-btn svg {\n width: 16px;\n height: 16px;\n }\n\n .framed-quick-input {\n width: calc(100vw - 20px);\n bottom: 80px;\n }\n\n .framed-chat-modal {\n width: calc(100vw - 20px);\n bottom: 80px;\n }\n\n .framed-feedback-panel {\n width: 100%;\n }\n\n .framed-text-edit-overlay {\n width: calc(100vw - 20px);\n bottom: 80px;\n }\n}\n\n@media (max-width: 380px) {\n .framed-toolbar-group {\n gap: 1px;\n }\n\n .framed-toolbar-btn {\n width: 28px;\n height: 28px;\n }\n\n .framed-toolbar-btn svg {\n width: 14px;\n height: 14px;\n }\n}\n\n/* ==========================================\n REGION SELECT OVERLAY\n ========================================== */\n\n.framed-region-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 2147483646;\n cursor: crosshair;\n background: transparent;\n}\n\n/* ==========================================\n TASKS READY PANEL\n ========================================== */\n\n.framed-tasks-ready {\n background: linear-gradient(135deg, #1e1e2e 0%, #2d2d3f 100%);\n border-radius: 16px;\n padding: 20px 24px;\n margin: 16px 0;\n color: #ffffff;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2),\n 0 0 0 1px rgba(255, 255, 255, 0.1) inset;\n}\n\n.framed-tasks-ready.framed-tasks-loading {\n opacity: 0.7;\n text-align: center;\n}\n\n.framed-tasks-header {\n margin: 0 0 16px 0;\n font-size: 18px;\n font-weight: 600;\n color: #ffffff;\n letter-spacing: -0.02em;\n}\n\n.framed-tasks-list {\n list-style: none;\n padding: 0;\n margin: 0 0 16px 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.framed-task-preview-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 10px;\n transition: background 0.2s ease;\n}\n\n.framed-task-preview-item:hover {\n background: rgba(255, 255, 255, 0.08);\n}\n\n.framed-task-priority {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n min-width: 32px;\n}\n\n.framed-task-priority-icon {\n font-size: 12px;\n line-height: 1;\n}\n\n.framed-task-priority-label {\n font-size: 9px;\n font-weight: 700;\n color: rgba(255, 255, 255, 0.5);\n letter-spacing: 0.05em;\n}\n\n.framed-task-content {\n flex: 1;\n min-width: 0;\n}\n\n.framed-task-title {\n font-size: 14px;\n font-weight: 500;\n color: #ffffff;\n line-height: 1.4;\n margin-bottom: 4px;\n word-wrap: break-word;\n}\n\n.framed-task-meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: rgba(255, 255, 255, 0.5);\n}\n\n.framed-task-page {\n max-width: 150px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.framed-task-separator {\n opacity: 0.5;\n}\n\n.framed-task-element {\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 10px;\n background: rgba(255, 255, 255, 0.1);\n padding: 1px 5px;\n border-radius: 4px;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.framed-task-attachments {\n color: var(--framed-primary);\n}\n\n.framed-tasks-more {\n margin: 0 0 16px 0;\n font-size: 12px;\n color: rgba(255, 255, 255, 0.5);\n text-align: center;\n}\n\n.framed-copy-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: 14px 20px;\n font-size: 15px;\n font-weight: 600;\n color: #ffffff;\n background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);\n border: none;\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);\n}\n\n.framed-copy-btn:hover:not(:disabled) {\n background: linear-gradient(135deg, #60a5fa 0%, #3b82f6 100%);\n transform: translateY(-1px);\n box-shadow: 0 6px 16px rgba(59, 130, 246, 0.4);\n}\n\n.framed-copy-btn:active:not(:disabled) {\n transform: translateY(0);\n}\n\n.framed-copy-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.framed-tasks-hint {\n margin: 12px 0 0 0;\n font-size: 12px;\n color: rgba(255, 255, 255, 0.5);\n text-align: center;\n}\n\n/* ==========================================\n EXPORT MODAL\n ========================================== */\n\n.framed-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n z-index: 2147483647;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n animation: framed-fade-in 0.2s ease;\n}\n\n@keyframes framed-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n.framed-export-modal {\n background: white;\n border-radius: 16px;\n width: 100%;\n max-width: 400px;\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.15);\n animation: framed-pop 0.2s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica,\n Arial, sans-serif;\n}\n\n.framed-export-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid #e8e8e8;\n background: #f8f8f8;\n}\n\n.framed-export-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: #333;\n}\n\n.framed-modal-close {\n background: transparent;\n border: none;\n color: #666;\n cursor: pointer;\n padding: 4px;\n border-radius: 6px;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.framed-modal-close:hover {\n background: #e8e8e8;\n color: #333;\n}\n\n.framed-export-tasks {\n list-style: none;\n padding: 12px 16px;\n margin: 0;\n overflow-y: auto;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.framed-export-task {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px;\n background: #f5f5f5;\n border: 1px solid #e8e8e8;\n border-radius: 10px;\n transition: background 0.15s ease;\n}\n\n.framed-export-task:hover {\n background: #f0f0f0;\n}\n\n.framed-export-task-indicator {\n width: 8px;\n height: 8px;\n min-width: 8px;\n border-radius: 50%;\n background: #3b82f6;\n margin-top: 5px;\n}\n\n.framed-export-task-content {\n flex: 1;\n min-width: 0;\n}\n\n.framed-export-task-title {\n font-size: 13px;\n font-weight: 500;\n color: #333;\n line-height: 1.4;\n margin-bottom: 4px;\n word-wrap: break-word;\n}\n\n.framed-export-task-meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: #888;\n}\n\n.framed-export-task-separator {\n color: #ccc;\n}\n\n.framed-export-task-element {\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 10px;\n background: #e5e5e5;\n color: #666;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n.framed-export-task-attachments {\n color: #3b82f6;\n}\n\n.framed-export-more {\n margin: 0;\n padding: 0 16px 12px;\n font-size: 12px;\n color: #888;\n text-align: center;\n}\n\n.framed-export-actions {\n display: flex;\n gap: 8px;\n padding: 0 16px 12px;\n}\n\n.framed-export-copy-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n background: #3b82f6;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.framed-export-copy-btn:hover:not(:disabled) {\n background: #2563eb;\n}\n\n.framed-export-copy-btn:active:not(:disabled) {\n background: #1d4ed8;\n}\n\n.framed-export-copy-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.framed-export-download-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 12px 14px;\n font-size: 13px;\n font-weight: 500;\n color: #555;\n background: #f5f5f5;\n border: 1px solid #ddd;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.framed-export-download-btn:hover {\n background: #eee;\n border-color: #ccc;\n}\n\n.framed-export-download-btn:active {\n background: #e5e5e5;\n}\n\n.framed-export-hint {\n margin: 0;\n padding: 0 16px 16px;\n font-size: 12px;\n color: #888;\n text-align: center;\n}\n\n.framed-export-empty {\n padding: 32px 20px;\n text-align: center;\n color: #666;\n}\n\n.framed-export-empty p {\n margin: 0 0 8px 0;\n font-size: 14px;\n}\n\n.framed-export-empty-hint {\n font-size: 13px;\n color: #888;\n}\n\n/* ==========================================\n RICH TEXT EDITOR\n ========================================== */\n\n.framed-rich-text-editor {\n display: flex;\n flex-direction: column;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 14px;\n overflow: hidden;\n}\n\n.framed-rich-text-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n background: #f8f8f8;\n border-bottom: 1px solid #e8e8e8;\n}\n\n.framed-rich-text-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n background: transparent;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n color: #666;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.framed-rich-text-btn:hover {\n background: #fff;\n border-color: #ccc;\n color: #333;\n}\n\n.framed-rich-text-btn:active {\n background: #f0f0f0;\n}\n\n.framed-rich-text-btn strong {\n font-weight: 700;\n}\n\n.framed-rich-text-btn em {\n font-style: italic;\n}\n\n.framed-rich-text-btn u {\n text-decoration: underline;\n}\n\n.framed-rich-text-separator {\n width: 1px;\n height: 18px;\n margin: 0 4px;\n background: #e0e0e0;\n}\n\n.framed-rich-text-content {\n flex: 1;\n padding: 16px 18px;\n background: white;\n color: #333;\n font-size: 15px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica,\n Arial, sans-serif !important;\n line-height: 1.5;\n min-height: 100px;\n outline: none;\n overflow-y: auto;\n}\n\n.framed-rich-text-content:empty::before {\n content: attr(data-placeholder);\n color: #999;\n pointer-events: none;\n}\n\n.framed-rich-text-content:focus {\n background: white;\n}\n\n/* Rich text content styling */\n.framed-rich-text-content b,\n.framed-rich-text-content strong {\n font-weight: 700;\n}\n\n.framed-rich-text-content i,\n.framed-rich-text-content em {\n font-style: italic;\n}\n\n.framed-rich-text-content u {\n text-decoration: underline;\n}\n\n.framed-rich-text-content a {\n color: #3b82f6;\n text-decoration: underline;\n}\n\n.framed-rich-text-content a:hover {\n color: #2563eb;\n}\n\n.framed-rich-text-content ul,\n.framed-rich-text-content ol {\n margin: 8px 0;\n padding-left: 24px;\n}\n\n.framed-rich-text-content li {\n margin: 4px 0;\n}\n\n/* Quick input rich editor adjustment */\n.framed-quick-rich-editor {\n width: 100%;\n}\n\n/* Chat modal rich editor adjustment */\n.framed-chat-rich-editor {\n width: 100%;\n}\n\n/* Link Modal */\n.framed-link-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2147483647;\n}\n\n.framed-link-modal {\n background: white;\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);\n width: 320px;\n max-width: 90vw;\n overflow: hidden;\n}\n\n.framed-link-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid #e8e8e8;\n background: #f8f8f8;\n}\n\n.framed-link-modal-header span {\n font-size: 14px;\n font-weight: 600;\n color: #333;\n}\n\n.framed-link-modal-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: #666;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.framed-link-modal-close:hover {\n background: #e8e8e8;\n color: #333;\n}\n\n.framed-link-modal-body {\n padding: 16px;\n}\n\n.framed-link-modal-body label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: #666;\n margin-bottom: 6px;\n}\n\n.framed-link-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n font-size: 14px;\n color: #333;\n background: white;\n outline: none;\n transition: border-color 0.15s ease;\n box-sizing: border-box;\n}\n\n.framed-link-input:focus {\n border-color: #3b82f6;\n}\n\n.framed-link-input::placeholder {\n color: #999;\n}\n\n.framed-link-modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid #e8e8e8;\n background: #fafafa;\n}\n\n.framed-link-btn-cancel {\n padding: 8px 16px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #666;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.framed-link-btn-cancel:hover {\n background: #f5f5f5;\n border-color: #ccc;\n}\n\n.framed-link-btn-submit {\n padding: 8px 16px;\n background: #3b82f6;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: white;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.framed-link-btn-submit:hover {\n background: #2563eb;\n}\n\n/* ==========================================\n MULTI-SELECT & AREA ANNOTATION\n ========================================== */\n\n/* Selection rectangle for multi-select drag */\n.framed-selection-rect {\n position: fixed;\n border: 2px dashed var(--framed-primary);\n background: rgba(59, 130, 246, 0.1);\n pointer-events: none;\n z-index: 2147483645;\n border-radius: 4px;\n animation: framed-selection-pulse 1s ease-in-out infinite;\n}\n\n/* Multi-selected element highlight */\n.framed-multi-selected {\n outline: 2px solid var(--framed-primary) !important;\n outline-offset: 2px;\n animation: framed-selection-pulse 2s ease-in-out infinite;\n}\n\n/* Area annotation overlay */\n.framed-area-annotation-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 2147483644;\n cursor: crosshair;\n background: transparent;\n}\n\n/* Area annotation marker */\n.framed-area-annotation {\n position: fixed;\n border: 2px dashed var(--framed-primary);\n background: rgba(59, 130, 246, 0.08);\n border-radius: 8px;\n pointer-events: auto;\n cursor: pointer;\n z-index: 2147483643;\n transition: all var(--framed-transition-fast);\n}\n\n.framed-area-annotation:hover {\n background: rgba(59, 130, 246, 0.15);\n border-color: var(--framed-primary-hover);\n}\n\n.framed-area-annotation::before {\n content: '+';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n font-weight: 300;\n color: var(--framed-primary);\n opacity: 0.6;\n}\n\n.framed-area-annotation:hover::before {\n opacity: 1;\n}\n\n/* Area annotation badge */\n.framed-area-badge {\n position: absolute;\n top: -8px;\n right: -8px;\n width: 24px;\n height: 24px;\n background: var(--framed-primary);\n color: white;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.4);\n animation: framed-spring-in 0.3s var(--framed-ease-spring) forwards;\n}\n\n/* Animation pause indicator */\n.framed-animations-paused-indicator {\n position: fixed;\n top: 16px;\n right: 16px;\n padding: 8px 14px;\n background: rgba(24, 24, 27, 0.9);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border-radius: 20px;\n color: white;\n font-size: 12px;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 6px;\n z-index: 2147483647;\n animation: framed-bounce-in 0.3s var(--framed-ease-spring) forwards;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);\n}\n\n.framed-animations-paused-indicator svg {\n width: 14px;\n height: 14px;\n}\n\n/* Smooth transitions for modals and panels */\n.framed-quick-input,\n.framed-chat-modal {\n animation: framed-spring-in 0.3s var(--framed-ease-spring) forwards;\n}\n\n.framed-quick-input.open,\n.framed-chat-modal.open {\n opacity: 1;\n visibility: visible;\n}\n\n.framed-feedback-panel {\n transition: transform 0.35s var(--framed-ease-spring);\n}\n\n.framed-feedback-panel.open {\n transform: translateX(0);\n}\n\n/* Toast animations improved */\n.framed-toast {\n animation: framed-toast-in 0.3s var(--framed-ease-spring) forwards;\n}\n\n/* Comment card hover animation */\n.framed-comment-card {\n transition: all var(--framed-transition-fast), transform var(--framed-transition-spring);\n}\n\n.framed-comment-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n}\n\n/* Smooth button interactions */\n.framed-quick-submit,\n.framed-chat-submit,\n.framed-copy-btn,\n.framed-action-btn {\n transition: all var(--framed-transition-fast), transform var(--framed-transition-spring);\n}\n\n.framed-quick-submit:hover,\n.framed-chat-submit:hover,\n.framed-copy-btn:hover:not(:disabled) {\n transform: translateY(-1px);\n}\n\n.framed-quick-submit:active,\n.framed-chat-submit:active,\n.framed-copy-btn:active:not(:disabled) {\n transform: translateY(0) scale(0.98);\n}\n\n/* Export modal animation */\n.framed-export-modal {\n animation: framed-spring-in 0.35s var(--framed-ease-spring) forwards;\n}\n\n/* Tasks ready panel animation */\n.framed-tasks-ready {\n animation: framed-bounce-in 0.4s var(--framed-ease-spring) forwards;\n}\n\n.framed-task-preview-item {\n transition: all var(--framed-transition-fast);\n}\n\n.framed-task-preview-item:hover {\n transform: translateX(4px);\n}\n`;\n\nexport const WIDGET_STYLE_ID = 'framed-widget-styles';\n","// Main Widget component that composes all sub-components\n\nimport React, { useEffect } from 'react';\nimport { useWidgetStore } from '../store/widgetStore';\nimport { Toolbar } from './Toolbar';\nimport { FeedbackDrawer } from './FeedbackDrawer';\nimport { QuickInput } from './QuickInput';\nimport { ChatModal } from './ChatModal';\nimport { ElementSelector } from './ElementSelector';\nimport { TextEditOverlay } from './TextEditOverlay';\nimport { RegionSelectOverlay } from './RegionSelectOverlay';\nimport { ExportModal } from './ExportModal';\nimport { MultiSelectOverlay } from './MultiSelectOverlay';\nimport { AreaAnnotationOverlay } from './AreaAnnotationOverlay';\nimport { PauseAnimationsIcon } from './Icons';\nimport { WIDGET_CSS, WIDGET_STYLE_ID } from '../styles/widgetStyles';\n// Toast is now rendered inside Toolbar for correct positioning\nimport type { FeedbackComment, WidgetFeatures } from '@framed/core';\n\nexport interface WidgetProps {\n /** User's display name for feedback attribution */\n author?: string;\n\n /** Features to enable based on tier */\n features?: Partial<WidgetFeatures>;\n\n /** Initial comments to load */\n initialComments?: FeedbackComment[];\n\n /** Called when a new comment is submitted */\n onSubmit?: (comment: FeedbackComment) => void;\n\n /** Called when user takes a screenshot */\n onScreenshot?: () => void;\n\n /** Called when user locates a comment */\n onLocateComment?: (comment: FeedbackComment) => void;\n\n /** Called when user exports summary */\n onExport?: () => void;\n\n /** Called when widget is closed */\n onClose?: () => void;\n}\n\nexport function Widget({\n author = 'Anonymous',\n features,\n initialComments,\n onSubmit,\n onScreenshot,\n onLocateComment,\n onExport,\n onClose,\n}: WidgetProps) {\n const {\n isOpen,\n setFeatures,\n setComments,\n setCurrentPageUrl,\n } = useWidgetStore();\n\n // Inject CSS styles on mount\n useEffect(() => {\n // Check if styles are already injected\n if (document.getElementById(WIDGET_STYLE_ID)) {\n return;\n }\n\n // Create and inject style element\n const styleElement = document.createElement('style');\n styleElement.id = WIDGET_STYLE_ID;\n styleElement.textContent = WIDGET_CSS;\n document.head.appendChild(styleElement);\n\n // Cleanup on unmount\n return () => {\n const existingStyle = document.getElementById(WIDGET_STYLE_ID);\n if (existingStyle) {\n existingStyle.remove();\n }\n };\n }, []);\n\n // Set features on mount\n useEffect(() => {\n if (features) {\n const currentFeatures = useWidgetStore.getState().features;\n setFeatures({ ...currentFeatures, ...features });\n }\n }, [features, setFeatures]);\n\n // Sync comments from external source (e.g., localStorage via SDK)\n useEffect(() => {\n if (initialComments) {\n setComments(initialComments);\n }\n }, [initialComments, setComments]);\n\n // Track page URL changes (for SPA)\n useEffect(() => {\n const handleUrlChange = () => {\n setCurrentPageUrl(window.location.href);\n };\n\n // Listen for popstate (back/forward)\n window.addEventListener('popstate', handleUrlChange);\n\n // Also check periodically for pushState changes\n const interval = setInterval(handleUrlChange, 1000);\n\n return () => {\n window.removeEventListener('popstate', handleUrlChange);\n clearInterval(interval);\n };\n }, [setCurrentPageUrl]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Ignore if typing in an input\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement ||\n (e.target as HTMLElement).contentEditable === 'true'\n ) {\n return;\n }\n\n const {\n setAnnotationMode,\n annotationMode,\n toggleFeedbackPanel,\n toggleAnimationsPaused,\n setIsMultiSelectMode,\n setIsAreaAnnotateMode,\n isMultiSelectMode,\n isAreaAnnotateMode,\n } = useWidgetStore.getState();\n\n switch (e.key.toLowerCase()) {\n case 'v':\n setAnnotationMode(annotationMode === 'select' ? null : 'select');\n break;\n case 't':\n setAnnotationMode(annotationMode === 'text-edit' ? null : 'text-edit');\n break;\n case 'f':\n toggleFeedbackPanel();\n break;\n case 'p':\n toggleAnimationsPaused();\n break;\n case 'm':\n setIsMultiSelectMode(!isMultiSelectMode);\n if (annotationMode) {\n setAnnotationMode(null);\n }\n break;\n case 'a':\n setIsAreaAnnotateMode(!isAreaAnnotateMode);\n if (annotationMode) {\n setAnnotationMode(null);\n }\n break;\n case 'escape':\n const {\n quickInputOpen,\n chatModalOpen,\n feedbackPanelOpen,\n exportModalOpen,\n closeQuickInput,\n closeChatModal,\n closeFeedbackPanel,\n closeExportModal,\n setAnnotationMode: setMode,\n setIsMultiSelectMode: setMulti,\n setIsAreaAnnotateMode: setArea,\n clearMultiSelection,\n clearAreaAnnotations,\n } = useWidgetStore.getState();\n\n if (exportModalOpen) {\n closeExportModal();\n } else if (quickInputOpen) {\n closeQuickInput();\n } else if (chatModalOpen) {\n closeChatModal();\n } else if (feedbackPanelOpen) {\n closeFeedbackPanel();\n } else {\n setMode(null);\n setMulti(false);\n setArea(false);\n clearMultiSelection();\n }\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, []);\n\n const { animationsPaused } = useWidgetStore();\n\n if (!isOpen) return null;\n\n return (\n <div id=\"framed-widget-container\" data-framed-widget>\n {/* Element selection listener */}\n <ElementSelector />\n\n {/* Multi-select overlay */}\n <MultiSelectOverlay />\n\n {/* Area annotation overlay */}\n <AreaAnnotationOverlay />\n\n {/* Main toolbar */}\n <Toolbar onScreenshot={onScreenshot} onClose={onClose} />\n\n {/* Feedback drawer panel */}\n <FeedbackDrawer onExport={onExport} onLocateComment={onLocateComment} />\n\n {/* Quick input for element selection */}\n <QuickInput author={author} onSubmit={onSubmit} />\n\n {/* Chat modal for general feedback */}\n <ChatModal author={author} onSubmit={onSubmit} />\n\n {/* Text edit overlay */}\n <TextEditOverlay author={author} onSubmit={onSubmit} />\n\n {/* Region select overlay */}\n <RegionSelectOverlay />\n\n {/* Export modal */}\n <ExportModal />\n\n {/* Animation pause indicator */}\n {animationsPaused && (\n <div className=\"framed-animations-paused-indicator\" data-framed-widget>\n <PauseAnimationsIcon size={14} />\n <span>Animations Paused</span>\n </div>\n )}\n </div>\n );\n}\n","// Prompt Generator - Creates AI prompts for implementing tasks\nimport type { Task } from '@framed/core';\nimport type { SiteContext } from './siteScanner';\n\nconst API_BASE_URL = 'https://api.framed.dev';\n\nexport interface PromptOptions {\n apiKey: string;\n includeContext?: boolean;\n format?: 'full' | 'compact';\n}\n\nfunction getPriorityIcon(priority?: string): string {\n switch (priority) {\n case 'high':\n return '🔴 HIGH';\n case 'medium':\n return '🟡 MED';\n case 'low':\n return '🟢 LOW';\n default:\n return '⚪ -';\n }\n}\n\nfunction formatTaskRow(task: Task): string {\n const priority = getPriorityIcon((task.task as { priority?: string }).priority);\n const action = task.task.title || task.task.description || 'Unnamed task';\n const page = task.page?.path || task.page?.url || '/';\n return `| ${priority} | ${action} | ${page} |`;\n}\n\nfunction formatSiteContext(context: SiteContext): string {\n const lines: string[] = [\n '## Site Context',\n '',\n `**Framework:** ${context.framework.detected} (${Math.round(context.framework.confidence * 100)}% confidence)`,\n '',\n '### Pages',\n '',\n ];\n\n context.pages.forEach((page) => {\n lines.push(`- ${page.url}: ${page.title}`);\n if (page.sections.length > 0) {\n lines.push(` - Sections: ${page.sections.join(', ')}`);\n }\n });\n\n lines.push('', '### Navigation', '');\n\n const headerNav = context.navigation.filter((n) => n.location === 'header');\n if (headerNav.length > 0) {\n lines.push('**Header:**');\n headerNav.forEach((item) => {\n lines.push(`- [${item.label}](${item.href})`);\n });\n lines.push('');\n }\n\n lines.push('### Patterns Detected', '');\n const patterns = context.patterns;\n const detectedPatterns: string[] = [];\n\n if (patterns.hasBlog) detectedPatterns.push('Blog');\n if (patterns.hasTeamSection) detectedPatterns.push('Team Section');\n if (patterns.hasContactForm) detectedPatterns.push('Contact Form');\n if (patterns.hasPricing) detectedPatterns.push('Pricing');\n if (patterns.hasTestimonials) detectedPatterns.push('Testimonials');\n if (patterns.hasFAQ) detectedPatterns.push('FAQ');\n if (patterns.hasProducts) detectedPatterns.push('Products');\n if (patterns.hasCart) detectedPatterns.push('Shopping Cart');\n\n if (detectedPatterns.length > 0) {\n lines.push(detectedPatterns.join(', '));\n } else {\n lines.push('No specific patterns detected');\n }\n\n return lines.join('\\n');\n}\n\nexport function generateAIPrompt(\n tasks: Task[],\n options: PromptOptions,\n siteContext?: SiteContext\n): string {\n const { apiKey, includeContext = true, format = 'full' } = options;\n\n if (tasks.length === 0) {\n return 'No tasks available to implement.';\n }\n\n const taskRows = tasks.map(formatTaskRow).join('\\n');\n\n if (format === 'compact') {\n return `# Framed Tasks\n\nGET ${API_BASE_URL}/v1/tasks?key=${apiKey}&status=open\n\n| Priority | Action | Page |\n|----------|--------|------|\n${taskRows}\n\nAfter implementing: POST ${API_BASE_URL}/v1/tasks/{taskId}/done`;\n }\n\n let prompt = `# Framed: Implement Feedback Tasks\n\nThere are ${tasks.length} feedback task${tasks.length === 1 ? '' : 's'} ready to implement.\n\n## Step 1: Fetch Full Task Details\n\n\\`\\`\\`\nGET ${API_BASE_URL}/v1/tasks?key=${apiKey}&status=open\n\\`\\`\\`\n\nThis returns complete task information including:\n- Element selectors and surrounding HTML\n- Screenshots showing what to change\n- Attached files (images, documents)\n- Detailed implementation instructions\n\n## Step 2: Implement Each Task\n\nFor each task in the response:\n1. Read \\`task.action\\` and \\`task.details\\`\n2. Find the element using \\`element.selector\\`\n3. Download any \\`attachments\\` if present\n4. Make the requested change\n5. Test that it works\n\n## Step 3: Mark Complete\n\nAfter implementing each task:\n\n\\`\\`\\`\nPOST ${API_BASE_URL}/v1/tasks/{taskId}/done\n\\`\\`\\`\n\n## Current Tasks Preview\n\n| Priority | Action | Page |\n|----------|--------|------|\n${taskRows}\n\n`;\n\n if (includeContext && siteContext) {\n prompt += `\\n${formatSiteContext(siteContext)}\\n`;\n }\n\n prompt += `\\nStart by fetching the full task details, then implement each change.`;\n\n return prompt;\n}\n\nexport async function copyPromptToClipboard(prompt: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(prompt);\n return true;\n } catch {\n // Fallback for browsers without clipboard API\n const textarea = document.createElement('textarea');\n textarea.value = prompt;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n document.body.appendChild(textarea);\n textarea.select();\n\n try {\n document.execCommand('copy');\n return true;\n } catch {\n return false;\n } finally {\n document.body.removeChild(textarea);\n }\n }\n}\n","// Site Context Scanner - Detects site structure for AI context\n\nexport interface SiteContext {\n capturedAt: string;\n capturedBy: 'widget' | 'cli';\n pages: SitePageInfo[];\n navigation: NavigationItem[];\n patterns: SitePatterns;\n framework: FrameworkInfo;\n contentMap: ContentMap[];\n}\n\nexport interface SitePageInfo {\n url: string;\n title: string;\n description?: string;\n hasContent: boolean;\n sections: string[];\n lastModified?: string;\n}\n\nexport interface NavigationItem {\n label: string;\n href: string;\n isActive: boolean;\n children?: NavigationItem[];\n location: 'header' | 'footer' | 'sidebar';\n}\n\nexport interface SitePatterns {\n hasBlog: boolean;\n hasBlogPosts: boolean;\n hasTeamSection: boolean;\n hasContactForm: boolean;\n hasNewsletter: boolean;\n hasPricing: boolean;\n hasTestimonials: boolean;\n hasFAQ: boolean;\n hasProducts: boolean;\n hasCart: boolean;\n hasCheckout: boolean;\n hasHero: boolean;\n hasFooter: boolean;\n hasSidebar: boolean;\n}\n\nexport interface FrameworkInfo {\n detected:\n | 'nextjs-app'\n | 'nextjs-pages'\n | 'remix'\n | 'react-router'\n | 'astro'\n | 'unknown';\n confidence: number;\n hints: string[];\n}\n\nexport interface ContentMap {\n page: string;\n sections: {\n id: string;\n selector: string;\n type: 'hero' | 'content' | 'list' | 'form' | 'cta' | 'unknown';\n hasImages: boolean;\n hasText: boolean;\n approximateWords: number;\n }[];\n}\n\nexport async function scanSiteContext(): Promise<SiteContext> {\n return {\n capturedAt: new Date().toISOString(),\n capturedBy: 'widget',\n pages: await discoverPages(),\n navigation: extractNavigation(),\n patterns: detectPatterns(),\n framework: detectFramework(),\n contentMap: mapContentSections(),\n };\n}\n\nasync function discoverPages(): Promise<SitePageInfo[]> {\n const pages: SitePageInfo[] = [];\n const visited = new Set<string>();\n\n // Current page\n pages.push({\n url: window.location.pathname,\n title: document.title,\n hasContent: true,\n sections: identifySections(),\n });\n visited.add(window.location.pathname);\n\n // Extract from navigation\n const navLinks = document.querySelectorAll('nav a, header a, footer a');\n navLinks.forEach((link) => {\n const href = link.getAttribute('href');\n if (href && href.startsWith('/') && !visited.has(href)) {\n visited.add(href);\n pages.push({\n url: href,\n title: link.textContent?.trim() || href,\n hasContent: false,\n sections: [],\n });\n }\n });\n\n return pages;\n}\n\nfunction identifySections(): string[] {\n const sections: string[] = [];\n\n // Check for common section patterns\n if (document.querySelector('[class*=\"hero\"], section:first-of-type h1')) {\n sections.push('hero');\n }\n if (document.querySelector('[class*=\"feature\"], [id*=\"feature\"]')) {\n sections.push('features');\n }\n if (document.querySelector('[class*=\"pricing\"], [id*=\"pricing\"]')) {\n sections.push('pricing');\n }\n if (document.querySelector('[class*=\"testimonial\"], [class*=\"review\"]')) {\n sections.push('testimonials');\n }\n if (document.querySelector('[class*=\"faq\"], [id*=\"faq\"], details')) {\n sections.push('faq');\n }\n if (document.querySelector('[class*=\"cta\"], [id*=\"cta\"]')) {\n sections.push('cta');\n }\n if (document.querySelector('[class*=\"team\"], [id*=\"team\"]')) {\n sections.push('team');\n }\n if (document.querySelector('footer')) {\n sections.push('footer');\n }\n\n return sections;\n}\n\nfunction extractNavigation(): NavigationItem[] {\n const items: NavigationItem[] = [];\n\n // Header nav\n const headerNav = document.querySelector(\n 'header nav, nav[role=\"navigation\"]'\n );\n if (headerNav) {\n items.push(...parseNavElement(headerNav, 'header'));\n }\n\n // Footer nav\n const footerNav = document.querySelector('footer nav, footer ul');\n if (footerNav) {\n items.push(...parseNavElement(footerNav, 'footer'));\n }\n\n // Sidebar nav\n const sidebarNav = document.querySelector('aside nav, [class*=\"sidebar\"] nav');\n if (sidebarNav) {\n items.push(...parseNavElement(sidebarNav, 'sidebar'));\n }\n\n return items;\n}\n\nfunction parseNavElement(\n nav: Element,\n location: 'header' | 'footer' | 'sidebar'\n): NavigationItem[] {\n const items: NavigationItem[] = [];\n\n nav.querySelectorAll(':scope > ul > li, :scope > a').forEach((item) => {\n const link = item.tagName === 'A' ? item : item.querySelector('a');\n if (!link) return;\n\n const navItem: NavigationItem = {\n label: link.textContent?.trim() || '',\n href: link.getAttribute('href') || '',\n isActive:\n link.classList.contains('active') ||\n link.getAttribute('aria-current') === 'page',\n location,\n };\n\n // Check for dropdown/children\n const submenu = item.querySelector('ul');\n if (submenu) {\n navItem.children = parseNavElement(submenu, location);\n }\n\n items.push(navItem);\n });\n\n return items;\n}\n\nfunction detectPatterns(): SitePatterns {\n const html = document.documentElement.innerHTML.toLowerCase();\n\n return {\n hasBlog:\n !!document.querySelector('[class*=\"blog\"], [id*=\"blog\"]') ||\n html.includes('/blog') ||\n !!document.querySelector('article'),\n hasBlogPosts: document.querySelectorAll('article, [class*=\"post\"]').length > 1,\n hasTeamSection: !!document.querySelector('[class*=\"team\"], [id*=\"team\"]'),\n hasContactForm: !!document.querySelector(\n 'form[action*=\"contact\"], form[class*=\"contact\"], #contact form'\n ),\n hasNewsletter: !!document.querySelector(\n 'form[class*=\"newsletter\"], input[name*=\"email\"][type=\"email\"]'\n ),\n hasPricing: !!document.querySelector('[class*=\"pricing\"], [id*=\"pricing\"]'),\n hasTestimonials: !!document.querySelector(\n '[class*=\"testimonial\"], [class*=\"review\"]'\n ),\n hasFAQ: !!document.querySelector('[class*=\"faq\"], [id*=\"faq\"], details'),\n hasProducts: !!document.querySelector('[class*=\"product\"], [id*=\"products\"]'),\n hasCart: !!document.querySelector('[class*=\"cart\"], [id*=\"cart\"]'),\n hasCheckout: !!document.querySelector('[class*=\"checkout\"]'),\n hasHero: !!document.querySelector(\n '[class*=\"hero\"], section:first-of-type h1'\n ),\n hasFooter: !!document.querySelector('footer'),\n hasSidebar: !!document.querySelector('aside, [class*=\"sidebar\"]'),\n };\n}\n\nfunction detectFramework(): FrameworkInfo {\n const hints: string[] = [];\n let detected: FrameworkInfo['detected'] = 'unknown';\n let confidence = 0;\n\n // Next.js detection\n if (document.getElementById('__next')) {\n hints.push('Found #__next element');\n detected = 'nextjs-pages';\n confidence = 0.9;\n }\n if (document.querySelector('script[src*=\"/_next/\"]')) {\n hints.push('Found /_next/ scripts');\n if (!document.getElementById('__next')) {\n detected = 'nextjs-app';\n }\n confidence = 0.9;\n }\n\n // Remix\n if (\n document.querySelector('script[src*=\"/build/\"]') &&\n !document.querySelector('script[src*=\"/_next/\"]')\n ) {\n hints.push('Found /build/ scripts (Remix pattern)');\n detected = 'remix';\n confidence = 0.7;\n }\n\n // Astro\n if (document.querySelector('astro-island')) {\n hints.push('Found astro-island element');\n detected = 'astro';\n confidence = 0.95;\n }\n\n // React Router (generic React SPA)\n if (\n document.getElementById('root') &&\n !document.getElementById('__next') &&\n document.querySelector('script[src*=\"bundle\"]')\n ) {\n hints.push('Found #root with bundle script');\n detected = 'react-router';\n confidence = 0.5;\n }\n\n return { detected, confidence, hints };\n}\n\nfunction mapContentSections(): ContentMap[] {\n const sections: ContentMap['sections'] = [];\n\n document\n .querySelectorAll('section, main > div, article')\n .forEach((el, index) => {\n const id =\n el.id ||\n (el.className && typeof el.className === 'string'\n ? el.className.split(' ')[0]\n : '') ||\n `section-${index}`;\n const text = el.textContent || '';\n\n sections.push({\n id,\n selector: el.id ? `#${el.id}` : `section:nth-of-type(${index + 1})`,\n type: detectSectionType(el),\n hasImages: el.querySelectorAll('img').length > 0,\n hasText: text.trim().length > 50,\n approximateWords: text.trim().split(/\\s+/).length,\n });\n });\n\n return [\n {\n page: window.location.pathname,\n sections,\n },\n ];\n}\n\nfunction detectSectionType(\n el: Element\n): ContentMap['sections'][0]['type'] {\n const classes =\n typeof el.className === 'string' ? el.className.toLowerCase() : '';\n const id = el.id?.toLowerCase() || '';\n\n if (classes.includes('hero') || id.includes('hero')) return 'hero';\n if (classes.includes('cta') || id.includes('cta')) return 'cta';\n if (el.querySelector('form')) return 'form';\n if (el.querySelectorAll('li, article').length > 3) return 'list';\n return 'content';\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport type { Task, TaskStatus } from '@framed/core';\nimport { useFramed } from '../providers/FramedProvider';\nimport { generateAIPrompt, copyPromptToClipboard, type PromptOptions } from '../utils/promptGenerator';\nimport { scanSiteContext, type SiteContext } from '../utils/siteScanner';\n\nexport interface UseFramedTasksResult {\n // All tasks\n tasks: Task[];\n\n // Filtered tasks\n openTasks: Task[];\n inProgressTasks: Task[];\n doneTasks: Task[];\n\n // Loading state\n isLoading: boolean;\n\n // Task counts\n openCount: number;\n totalCount: number;\n\n // Actions\n refresh: () => Promise<void>;\n markDone: (taskId: string) => Promise<void>;\n updateStatus: (taskId: string, status: TaskStatus) => Promise<void>;\n\n // AI Prompt\n generatePrompt: (options?: Partial<PromptOptions>) => Promise<string>;\n copyPrompt: (options?: Partial<PromptOptions>) => Promise<boolean>;\n}\n\nexport function useFramedTasks(): UseFramedTasksResult {\n const { tasks, openTasks, isTasksLoading, refreshTasks, updateTask, config } = useFramed();\n const [siteContext, setSiteContext] = useState<SiteContext | null>(null);\n\n const inProgressTasks = useMemo(\n () => tasks.filter((t) => t.status === 'in_progress'),\n [tasks]\n );\n\n const doneTasks = useMemo(\n () => tasks.filter((t) => t.status === 'done'),\n [tasks]\n );\n\n const markDone = useCallback(\n async (taskId: string) => {\n await updateTask(taskId, { status: 'done' });\n },\n [updateTask]\n );\n\n const updateStatus = useCallback(\n async (taskId: string, status: TaskStatus) => {\n await updateTask(taskId, { status });\n },\n [updateTask]\n );\n\n const generatePrompt = useCallback(\n async (options?: Partial<PromptOptions>): Promise<string> => {\n // Scan site context on first prompt generation\n let context = siteContext;\n if (!context) {\n context = await scanSiteContext();\n setSiteContext(context);\n }\n\n const apiKey = config.sync?.apiKey || '';\n return generateAIPrompt(openTasks, { apiKey, ...options }, context);\n },\n [openTasks, config.sync?.apiKey, siteContext]\n );\n\n const copyPrompt = useCallback(\n async (options?: Partial<PromptOptions>): Promise<boolean> => {\n const prompt = await generatePrompt(options);\n return copyPromptToClipboard(prompt);\n },\n [generatePrompt]\n );\n\n return {\n tasks,\n openTasks,\n inProgressTasks,\n doneTasks,\n isLoading: isTasksLoading,\n openCount: openTasks.length,\n totalCount: tasks.length,\n refresh: refreshTasks,\n markDone,\n updateStatus,\n generatePrompt,\n copyPrompt,\n };\n}\n","import React, { useCallback, useEffect, useMemo } from 'react';\nimport { Widget, useWidgetStore } from '@framed/widget-core';\nimport type { FeedbackComment, Task } from '@framed/core';\nimport { useFramed } from '../providers/FramedProvider';\nimport { useFramedTasks } from '../hooks/useFramedTasks';\n\n/**\n * Convert a Task back to a FeedbackComment for display in the widget\n */\nfunction convertTaskToComment(task: Task): FeedbackComment {\n return {\n id: task.id,\n content: task.feedback?.text || task.task?.description || '',\n author: task.meta?.createdBy || 'Anonymous',\n createdAt: task.meta?.createdAt || new Date().toISOString(),\n resolved: task.status === 'done' || task.status === 'rejected',\n\n // Page info\n pageUrl: task.page?.url,\n pageTitle: task.page?.title,\n\n // Element info\n selector: task.element?.selector,\n elementText: task.element?.textContent,\n elementType: task.element?.tagName,\n\n // Attachments\n attachments: task.attachments?.map((att) => ({\n url: att.url,\n type: att.mimeType || att.type,\n fileName: att.id,\n })),\n\n // Text edit\n textEdit:\n task.type === 'text_change' && task.feedback?.originalText\n ? {\n originalText: task.feedback.originalText,\n newText: task.task?.suggestedChanges?.replace(/^Change \".*\" to \"/, '').replace(/\"$/, '') || '',\n }\n : undefined,\n };\n}\n\nexport interface FeedbackWidgetProps {\n /** User's display name for feedback attribution */\n author?: string;\n\n /** Called when a new comment is submitted */\n onSubmit?: (comment: FeedbackComment) => void;\n\n /** Called when a task is created from feedback */\n onTaskCreated?: (task: Task) => void;\n\n /** Called when user takes a screenshot */\n onScreenshot?: () => void;\n\n /** Called when user locates a comment */\n onLocateComment?: (comment: FeedbackComment) => void;\n\n /** Called when user exports summary */\n onExport?: () => void;\n\n /** Called when widget is closed */\n onClose?: () => void;\n}\n\nfunction convertCommentToTask(\n comment: FeedbackComment,\n projectId: string\n): Task {\n return {\n id: comment.id,\n type: comment.textEdit ? 'text_change' : 'general_feedback',\n status: 'open',\n element: comment.selector\n ? {\n selector: comment.selector,\n xpath: '',\n tagName: comment.elementType || 'div',\n textContent: comment.elementText,\n rect: {} as DOMRect,\n }\n : undefined,\n page: {\n url: window.location.href,\n path: window.location.pathname,\n title: document.title,\n },\n feedback: {\n text: comment.content,\n originalText: comment.textEdit?.originalText,\n },\n task: {\n title: comment.content.slice(0, 100),\n description: comment.content,\n suggestedChanges: comment.textEdit\n ? `Change \"${comment.textEdit.originalText}\" to \"${comment.textEdit.newText}\"`\n : undefined,\n },\n attachments: comment.attachments?.map((att, index) => ({\n id: `${comment.id}_${index}`,\n type: att.type as 'screenshot' | 'recording' | 'annotation',\n url: att.url,\n mimeType: att.type === 'screenshot' ? 'image/png' : 'video/webm',\n size: 0,\n })),\n meta: {\n createdAt: comment.createdAt,\n updatedAt: comment.createdAt,\n createdBy: comment.author,\n projectId,\n },\n };\n}\n\nexport function FeedbackWidget({\n author,\n onSubmit,\n onTaskCreated,\n onScreenshot,\n onLocateComment,\n onExport,\n onClose,\n}: FeedbackWidgetProps) {\n const {\n isAuthenticated,\n isAuthLoading,\n session,\n features,\n isWidgetReady,\n projectId,\n saveTask,\n tasks,\n } = useFramed();\n const { refresh } = useFramedTasks();\n\n // Convert loaded tasks to FeedbackComments for the widget\n const initialComments = useMemo(() => {\n return tasks.map(convertTaskToComment);\n }, [tasks]);\n\n // Open widget when ready and authenticated\n useEffect(() => {\n if (isWidgetReady && isAuthenticated && !isAuthLoading) {\n const { open } = useWidgetStore.getState();\n open();\n }\n }, [isWidgetReady, isAuthenticated, isAuthLoading]);\n\n // Handle feedback submission - convert to task and save\n const handleSubmit = useCallback(\n async (comment: FeedbackComment) => {\n // Call user's onSubmit handler\n onSubmit?.(comment);\n\n // Convert to task and save\n const task = convertCommentToTask(comment, projectId);\n try {\n await saveTask(task);\n onTaskCreated?.(task);\n await refresh();\n } catch (error) {\n console.error('Failed to save task:', error);\n }\n },\n [onSubmit, projectId, saveTask, onTaskCreated, refresh]\n );\n\n // Don't render until widget is ready\n if (!isWidgetReady) {\n return null;\n }\n\n // Don't render if not authenticated\n if (!isAuthenticated || isAuthLoading) {\n return null;\n }\n\n const displayAuthor = author || session?.user.name || 'Anonymous';\n\n return (\n <Widget\n author={displayAuthor}\n features={features}\n initialComments={initialComments}\n onSubmit={handleSubmit}\n onScreenshot={onScreenshot}\n onLocateComment={onLocateComment}\n onExport={onExport}\n onClose={onClose}\n />\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport type { Task } from '@framed/core';\nimport { useFramedTasks } from '../hooks/useFramedTasks';\n\ninterface TaskPreviewItemProps {\n task: Task;\n}\n\nfunction getPriorityIcon(priority?: string): string {\n switch (priority) {\n case 'high':\n return '🔴';\n case 'medium':\n return '🟡';\n case 'low':\n return '🟢';\n default:\n return '⚪';\n }\n}\n\nfunction getPriorityLabel(priority?: string): string {\n switch (priority) {\n case 'high':\n return 'HIGH';\n case 'medium':\n return 'MED';\n case 'low':\n return 'LOW';\n default:\n return '-';\n }\n}\n\nfunction TaskPreviewItem({ task }: TaskPreviewItemProps) {\n const priority = (task.task as { priority?: string }).priority;\n const icon = getPriorityIcon(priority);\n const label = getPriorityLabel(priority);\n const title = task.task.title || task.task.description || 'Unnamed task';\n const page = task.page?.path || task.page?.url || '/';\n const element = task.element?.selector;\n const hasAttachments = task.attachments && task.attachments.length > 0;\n\n return (\n <li className=\"framed-task-preview-item\">\n <div className=\"framed-task-priority\">\n <span className=\"framed-task-priority-icon\">{icon}</span>\n <span className=\"framed-task-priority-label\">{label}</span>\n </div>\n <div className=\"framed-task-content\">\n <div className=\"framed-task-title\">{title}</div>\n <div className=\"framed-task-meta\">\n <span className=\"framed-task-page\">{page}</span>\n {element && (\n <>\n <span className=\"framed-task-separator\">•</span>\n <span className=\"framed-task-element\">{element}</span>\n </>\n )}\n {hasAttachments && (\n <>\n <span className=\"framed-task-separator\">•</span>\n <span className=\"framed-task-attachments\">\n {task.attachments!.length} attachment\n {task.attachments!.length !== 1 ? 's' : ''}\n </span>\n </>\n )}\n </div>\n </div>\n </li>\n );\n}\n\nexport interface TasksReadyPanelProps {\n /** Maximum number of tasks to show in preview */\n maxPreview?: number;\n\n /** Called when prompt is copied */\n onPromptCopied?: () => void;\n\n /** Custom class name */\n className?: string;\n}\n\nexport function TasksReadyPanel({\n maxPreview = 5,\n onPromptCopied,\n className = '',\n}: TasksReadyPanelProps) {\n const { openTasks, openCount, copyPrompt, isLoading } = useFramedTasks();\n const [copied, setCopied] = useState(false);\n const [copying, setCopying] = useState(false);\n\n const handleCopy = useCallback(async () => {\n if (copying) return;\n\n setCopying(true);\n try {\n const success = await copyPrompt();\n if (success) {\n setCopied(true);\n onPromptCopied?.();\n setTimeout(() => setCopied(false), 2000);\n }\n } catch (error) {\n console.error('Failed to copy prompt:', error);\n } finally {\n setCopying(false);\n }\n }, [copyPrompt, copying, onPromptCopied]);\n\n if (isLoading) {\n return (\n <div className={`framed-tasks-ready framed-tasks-loading ${className}`}>\n <p>Loading tasks...</p>\n </div>\n );\n }\n\n if (openCount === 0) {\n return null;\n }\n\n const displayTasks = openTasks.slice(0, maxPreview);\n const remainingCount = openCount - displayTasks.length;\n\n return (\n <div className={`framed-tasks-ready ${className}`}>\n <h4 className=\"framed-tasks-header\">\n ✨ {openCount} task{openCount !== 1 ? 's' : ''} ready for your AI\n </h4>\n\n <ul className=\"framed-tasks-list\">\n {displayTasks.map((task) => (\n <TaskPreviewItem key={task.id} task={task} />\n ))}\n </ul>\n\n {remainingCount > 0 && (\n <p className=\"framed-tasks-more\">\n +{remainingCount} more task{remainingCount !== 1 ? 's' : ''}\n </p>\n )}\n\n <button\n className=\"framed-copy-btn\"\n onClick={handleCopy}\n disabled={copying}\n >\n {copied ? '✅ Copied!' : copying ? '⏳ Copying...' : '📋 Copy AI Prompt'}\n </button>\n\n <p className=\"framed-tasks-hint\">\n 💡 Paste in Lovable, Bolt, or Cursor to implement\n </p>\n </div>\n );\n}\n"]}