@framed-dev/react 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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","../src/management/hooks/use-mobile.ts","../src/management/utils/cn.ts","../src/management/ui/scroll-area.tsx","../src/management/utils/permissions.ts","../src/management/utils/featureFlags.ts","../src/management/constants.ts","../src/management/views/InboxView.tsx","../src/management/views/BoardView.tsx","../src/management/views/TimelineView.tsx","../src/management/ui/select.tsx","../src/management/utils/maintenanceItemInstruction.ts","../src/management/components/DiffViewer.tsx","../src/management/components/ItemDetailDrawer.tsx","../src/management/components/NewItemModal.tsx","../src/management/components/CommandPalette.tsx","../src/management/components/QuickStats.tsx","../src/management/hooks/useTimeTracking.ts","../src/management/hooks/useDomainMonitoring.ts","../src/management/hooks/useUptimeMonitoring.ts","../src/management/views/SettingsView.tsx","../src/management/views/DomainMonitorDashboard.tsx","../src/management/views/MonthlyReportView.tsx","../src/management/hooks/useChangelog.ts","../src/management/views/ChangelogView.tsx","../src/management/hooks/useImprovementSuggestions.ts","../src/management/views/SuggestionsBoard.tsx","../src/management/hooks/useMaintenanceItems.ts","../src/management/views/MonitoringView.tsx","../src/management/hooks/useMeetingNotes.ts","../src/management/views/MeetingNotesView.tsx","../src/management/components/MaintenanceExportModal.tsx","../src/management/views/Phase5MobileView.tsx","../src/management/Phase5CommandCenter.tsx","../src/management/views/ListView.tsx","../src/management/components/LogTimeModal.tsx","../src/management/utils/commentUtils.ts","../src/management/components/MaintenanceCommentThread.tsx","../src/management/components/HourPackageCard.tsx","../src/management/hooks/useInternalNotes.ts"],"names":["STORAGE_KEYS","newUsage","createContext","useState","useEffect","jsx","useContext","generateId","jsxs","useCallback","useRef","getElementPath","left","top","Fragment","format","useMemo","getPriorityIcon","React5","React6","Sparkles","motion","MoreHorizontal","AnimatePresence","Euro","Clock","MessageSquare","Calendar","formatDistanceToNow","enUS","ChevronRight","Check","Icon","Edit3","FileText","CheckCircle2","Plus","Bug","X","Send","Search","AlertTriangle","Shield","ExternalLink","Code","Copy","Trash2","Eye","Gauge","Globe","Loader2","XCircle","Bell","RefreshCw","ChevronDown","CheckCircle","Download","History","AlertCircle","Lock","Lightbulb","TrendingUp","ArrowRight","BarChart3","editor","Pin","User","Edit2","Activity","FileBarChart","Link2","Layers","ChevronUp","Users","Paperclip"],"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, MaintenanceItem, TimeEntry } 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 // =============================================\n // Maintenance Items\n // =============================================\n\n /**\n * Get maintenance items for a project\n */\n async getMaintenanceItems(projectId: string): Promise<MaintenanceItem[]> {\n const response = await this.request<{ items: MaintenanceItem[] }>(\n `sdk-maintenance-items?projectId=${encodeURIComponent(projectId)}`\n );\n return response.items;\n }\n\n /**\n * Create a new maintenance item\n */\n async createMaintenanceItem(\n item: Omit<MaintenanceItem, 'id' | 'created_at' | 'updated_at'>\n ): Promise<MaintenanceItem> {\n return this.request<MaintenanceItem>('sdk-maintenance-items', {\n method: 'POST',\n body: JSON.stringify(item),\n });\n }\n\n /**\n * Update an existing maintenance item\n */\n async updateMaintenanceItem(\n id: string,\n updates: Partial<MaintenanceItem>\n ): Promise<MaintenanceItem> {\n return this.request<MaintenanceItem>(`sdk-maintenance-items/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n /**\n * Delete a maintenance item\n */\n async deleteMaintenanceItem(id: string): Promise<void> {\n await this.request<void>(`sdk-maintenance-items/${id}`, {\n method: 'DELETE',\n });\n }\n\n // =============================================\n // Time Entries\n // =============================================\n\n /**\n * Get time entries for a project\n */\n async getTimeEntries(projectId: string, options?: {\n startDate?: string;\n endDate?: string;\n maintenanceItemId?: string;\n }): Promise<TimeEntry[]> {\n const params = new URLSearchParams();\n params.set('projectId', projectId);\n if (options?.startDate) params.set('startDate', options.startDate);\n if (options?.endDate) params.set('endDate', options.endDate);\n if (options?.maintenanceItemId) params.set('maintenanceItemId', options.maintenanceItemId);\n\n const response = await this.request<{ entries: TimeEntry[] }>(\n `sdk-time-entries?${params.toString()}`\n );\n return response.entries;\n }\n\n /**\n * Create a new time entry\n */\n async createTimeEntry(\n entry: Omit<TimeEntry, 'id' | 'created_at'>\n ): Promise<TimeEntry> {\n return this.request<TimeEntry>('sdk-time-entries', {\n method: 'POST',\n body: JSON.stringify(entry),\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 MaintenanceItem,\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 // =============================================\n // Maintenance Items\n // =============================================\n\n /**\n * Load maintenance items for a project\n */\n async loadMaintenanceItems(projectId: string): Promise<MaintenanceItem[]> {\n try {\n return await this.client.getMaintenanceItems(projectId);\n } catch (error) {\n console.error('Failed to load maintenance items:', error);\n return [];\n }\n }\n\n /**\n * Save a new maintenance item\n */\n async saveMaintenanceItem(item: Omit<MaintenanceItem, 'id' | 'created_at' | 'updated_at'>): Promise<MaintenanceItem> {\n return this.client.createMaintenanceItem(item);\n }\n\n /**\n * Update an existing maintenance item\n */\n async updateMaintenanceItem(id: string, updates: Partial<MaintenanceItem>): Promise<MaintenanceItem> {\n return this.client.updateMaintenanceItem(id, updates);\n }\n\n /**\n * Delete a maintenance item\n */\n async deleteMaintenanceItem(id: string): Promise<void> {\n await this.client.deleteMaintenanceItem(id);\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 WidgetConfig,\n} from '@framed/core';\n\nexport type WidgetPosition = WidgetConfig['position'];\n\nexport interface WidgetState {\n // Widget visibility\n isOpen: boolean;\n\n // Widget position\n position: WidgetPosition;\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 // Position\n setPosition: (position: WidgetPosition) => 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 position: 'bottom-center' as WidgetPosition,\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 // Position\n setPosition: (position) => set({ position }),\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);\nexport const usePosition = () => useWidgetStore((state) => state.position);\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\n// Move element icon (four-way arrows)\nexport function MoveIcon({ 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=\"5 9 2 12 5 15\" />\n <polyline points=\"9 5 12 2 15 5\" />\n <polyline points=\"15 19 12 22 9 19\" />\n <polyline points=\"19 9 22 12 19 15\" />\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\" />\n </svg>\n );\n}\n\n// Resize element icon (expand/maximize)\nexport function ResizeIcon({ 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=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\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 // Allow Cmd/Ctrl+Enter to propagate for submit functionality\n // and Escape to propagate for close functionality\n if (e instanceof KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n return; // Don't stop propagation for submit shortcut\n }\n if (e.key === 'Escape') {\n return; // Don't stop propagation for close shortcut\n }\n }\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 MoveIcon,\n ResizeIcon,\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 demoMode?: boolean;\n}\n\nexport function Toolbar({ onScreenshot, onClose, demoMode = false }: ToolbarProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const {\n isOpen,\n position,\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 // Generate position class\n const positionClass = position ? `framed-toolbar-container--${position}` : '';\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 const handleMoveElement = () => {\n if (demoMode) {\n showToast('Move elements → available on your website', 'info');\n return;\n }\n // TODO: Implement move mode\n showToast('Move mode coming soon', 'info');\n };\n\n const handleResizeElement = () => {\n if (demoMode) {\n showToast('Resize elements → available on your website', 'info');\n return;\n }\n // TODO: Implement resize mode\n showToast('Resize mode coming soon', 'info');\n };\n\n return (\n <div className={`framed-toolbar-container ${positionClass}`} 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 <ToolbarButton\n icon={<MoveIcon />}\n title={demoMode ? \"Move Elements (works on your website)\" : \"Move Element\"}\n onClick={handleMoveElement}\n />\n <ToolbarButton\n icon={<ResizeIcon />}\n title={demoMode ? \"Resize Elements (works on your website)\" : \"Resize Element\"}\n onClick={handleResizeElement}\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 {features.screenRecording && (\n <ToolbarButton\n icon={<RecordIcon recording={isRecording} />}\n active={isRecording}\n recording={isRecording}\n title=\"Record Screen\"\n onClick={handleRecord}\n />\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\n .filter((c) => (showResolved ? c.resolved : !c.resolved))\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\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 /** Demo mode - adds special class for forced centering */\n demoMode?: boolean;\n /** Callback when a comment is added to the store (for demo mode drawer opening) */\n onCommentAdded?: () => void;\n}\n\nexport function QuickInput({ onSubmit, author = 'Anonymous', demoMode = false, onCommentAdded }: QuickInputProps) {\n const richTextRef = useRef<RichTextEditorRef>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const {\n quickInputOpen,\n position,\n selectedElement,\n annotationColor,\n pendingAttachments,\n closeQuickInput,\n addAttachment,\n removeAttachment,\n clearAttachments,\n addComment,\n showToast,\n } = useWidgetStore();\n\n // Generate position class\n const positionClass = position ? `framed-quick-input--${position}` : '';\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 // In demo mode, open the feedback drawer after submission\n if (onCommentAdded) {\n // Small delay to let the modal close animation complete\n setTimeout(() => {\n onCommentAdded();\n }, 100);\n }\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 ${demoMode ? 'framed-demo-mode' : ''}`} data-framed-widget>\n <div className={`framed-quick-input open ${positionClass} ${demoMode ? 'framed-demo-mode' : ''}`}>\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 position,\n pendingAttachments,\n currentPageUrl,\n closeChatModal,\n addAttachment,\n removeAttachment,\n clearAttachments,\n addComment,\n showToast,\n } = useWidgetStore();\n\n // Generate position class\n const positionClass = position ? `framed-chat-modal--${position}` : '';\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 ${positionClass}`} 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 const rafRef = useRef<number | 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 // Handle scroll - update highlight position to follow the element\n const handleScroll = useCallback(() => {\n const elementToTrack = selectedElement || hoveredElement;\n if (elementToTrack) {\n updateHighlight(elementToTrack);\n }\n }, [selectedElement, hoveredElement, updateHighlight]);\n\n // Set up event listeners\n useEffect(() => {\n if (!isOpen || !isSelectionMode) {\n // Hide highlight when not in selection mode, BUT keep it visible if there's a selected element\n if (highlightRef.current && !selectedElement) {\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 window.addEventListener('scroll', handleScroll, true);\n window.addEventListener('resize', handleScroll, 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 window.removeEventListener('scroll', handleScroll, true);\n window.removeEventListener('resize', handleScroll, true);\n document.body.style.cursor = '';\n };\n }, [isOpen, isSelectionMode, selectedElement, handleMouseMove, handleClick, handleMouseOut, handleScroll]);\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 // Keep highlight attached to selected element on scroll/resize - always active when element is selected\n useEffect(() => {\n if (!selectedElement || !isOpen) {\n return;\n }\n\n const trackElement = () => {\n // Cancel any pending frame\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n // Schedule update on next frame for smooth tracking\n rafRef.current = requestAnimationFrame(() => {\n if (selectedElement && highlightRef.current) {\n const rect = selectedElement.getBoundingClientRect();\n highlightRef.current.style.top = `${rect.top}px`;\n highlightRef.current.style.left = `${rect.left}px`;\n highlightRef.current.style.width = `${rect.width}px`;\n highlightRef.current.style.height = `${rect.height}px`;\n }\n });\n };\n\n // Track on scroll and resize\n window.addEventListener('scroll', trackElement, true);\n window.addEventListener('resize', trackElement, true);\n\n // Initial position update\n trackElement();\n\n return () => {\n window.removeEventListener('scroll', trackElement, true);\n window.removeEventListener('resize', trackElement, true);\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [selectedElement, isOpen]);\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) => {\n try {\n if (el && el.parentNode) {\n el.parentNode.removeChild(el);\n }\n } catch (e) {\n // Element already removed, ignore\n }\n });\n highlightsRef.current = [];\n }, []);\n\n // Create highlight for selected element\n const createHighlight = useCallback(\n (element: HTMLElement) => {\n // Safety check: make sure element is still in the document\n if (!element || !document.body.contains(element)) {\n return;\n }\n\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 // Always render a container to avoid React reconciliation issues\n // Only show the selection rectangle when actively dragging\n const showRect = isOpen && isMultiSelectMode && selectionRect;\n\n // Always return a stable element to prevent React reconciliation errors\n // The \"insertBefore\" error occurs when React can't find the expected DOM node\n if (!showRect) {\n return <div data-framed-widget style={{ display: 'none' }} />;\n }\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 // Return hidden element instead of null to prevent React reconciliation errors\n if (!isOpen) {\n return <div data-framed-widget style={{ display: 'none' }} />;\n }\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/* Animation for center-positioned toolbar (preserves translateX centering) */\n@keyframes framed-slide-up-center {\n 0% {\n opacity: 0;\n transform: translateX(-50%) translateY(24px) scale(0.96);\n }\n 100% {\n opacity: 1;\n transform: translateX(-50%) 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/* Centered modal animation - includes translate for centering */\n@keyframes framed-spring-in-centered {\n 0% {\n opacity: 0;\n transform: translate(-50%, -50%) scale(0.85);\n }\n 50% {\n transform: translate(-50%, -50%) scale(1.03);\n }\n 75% {\n transform: translate(-50%, -50%) scale(0.98);\n }\n 100% {\n opacity: 1;\n transform: translate(-50%, -50%) 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 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/* Position Variants - Default to bottom-center */\n.framed-toolbar-container {\n bottom: 24px;\n left: 50%;\n transform: translateX(-50%);\n animation: framed-slide-up-center 0.4s var(--framed-ease-spring) forwards;\n}\n\n.framed-toolbar-container--bottom-right {\n bottom: 24px;\n right: 24px;\n left: auto;\n transform: none;\n animation: framed-slide-up 0.4s var(--framed-ease-spring) forwards;\n}\n\n.framed-toolbar-container--bottom-left {\n bottom: 24px;\n left: 24px;\n transform: none;\n animation: framed-slide-up 0.4s var(--framed-ease-spring) forwards;\n}\n\n.framed-toolbar-container--bottom-center {\n bottom: 24px;\n left: 50%;\n transform: translateX(-50%);\n animation: framed-slide-up-center 0.4s var(--framed-ease-spring) forwards;\n}\n\n.framed-toolbar-container--top-right {\n top: 24px;\n bottom: auto;\n right: 24px;\n left: auto;\n transform: none;\n animation: framed-slide-up 0.4s var(--framed-ease-spring) forwards;\n}\n\n.framed-toolbar-container--top-left {\n top: 24px;\n bottom: auto;\n left: 24px;\n transform: none;\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 top: 50%;\n left: 50%;\n transform: translate(-50%, -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/* Quick input position variants - all centered now */\n.framed-quick-input--bottom-right,\n.framed-quick-input--bottom-left,\n.framed-quick-input--top-right,\n.framed-quick-input--top-left,\n.framed-quick-input--bottom-center {\n /* Keep centered regardless of toolbar position */\n top: 50%;\n left: 50%;\n right: auto;\n bottom: auto;\n transform: translate(-50%, -50%);\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/* Chat modal position variants */\n.framed-chat-modal--bottom-right {\n left: auto;\n right: 24px;\n transform: none;\n}\n\n.framed-chat-modal--bottom-left {\n left: 24px;\n transform: none;\n}\n\n.framed-chat-modal--top-right {\n bottom: auto;\n top: 100px;\n left: auto;\n right: 24px;\n transform: none;\n}\n\n.framed-chat-modal--top-left {\n bottom: auto;\n top: 100px;\n left: 24px;\n transform: none;\n}\n\n.framed-chat-modal--bottom-center {\n bottom: 100px;\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n animation: framed-slide-up-center 0.4s var(--framed-ease-spring) forwards;\n}\n\n.framed-chat-modal--top-center {\n top: 100px;\n bottom: auto;\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n animation: framed-slide-up-center 0.4s var(--framed-ease-spring) forwards;\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/* Text edit overlay position variants */\n.framed-text-edit-overlay--bottom-right {\n left: auto;\n right: 24px;\n transform: none;\n}\n\n.framed-text-edit-overlay--bottom-left {\n left: 24px;\n transform: none;\n}\n\n.framed-text-edit-overlay--top-right {\n bottom: auto;\n top: 100px;\n left: auto;\n right: 24px;\n transform: none;\n}\n\n.framed-text-edit-overlay--top-left {\n bottom: auto;\n top: 100px;\n left: 24px;\n transform: none;\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 /* Keep centered on mobile too */\n top: 50%;\n left: 50%;\n bottom: auto;\n right: auto;\n transform: translate(-50%, -50%);\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 animation: framed-spring-in-centered 0.3s var(--framed-ease-spring) forwards;\n}\n\n.framed-chat-modal {\n animation: framed-spring-in 0.3s var(--framed-ease-spring) forwards;\n}\n\n/* Override for centered modals - must come after base rule */\n.framed-chat-modal.framed-chat-modal--bottom-center,\n.framed-chat-modal.framed-chat-modal--top-center {\n animation: framed-slide-up-center 0.4s 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/* Demo mode - uses flexbox centering to avoid transform conflicts */\n.framed-quick-input-container.framed-demo-mode {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n.framed-quick-input.framed-demo-mode {\n /* Reset transform-based positioning */\n position: relative !important;\n top: auto !important;\n left: auto !important;\n transform: none !important;\n /* Use a simple scale animation without translate */\n animation: framed-demo-scale-in 0.3s var(--framed-ease-spring) forwards !important;\n pointer-events: auto;\n}\n\n@keyframes framed-demo-scale-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\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, WidgetConfig } from '@framed/core';\n\nexport type WidgetPosition = WidgetConfig['position'];\n\nexport interface WidgetProps {\n /** User's display name for feedback attribution */\n author?: string;\n\n /** Widget position */\n position?: WidgetPosition;\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 /**\n * Demo mode - enables special behaviors for showcasing the widget:\n * - Auto-opens feedback drawer after new feedback is submitted\n * - Forces modal centering with flexbox (no animation transform conflicts)\n */\n demoMode?: boolean;\n}\n\nexport function Widget({\n author = 'Anonymous',\n position = 'bottom-center',\n features,\n initialComments,\n onSubmit,\n onScreenshot,\n onLocateComment,\n onExport,\n onClose,\n demoMode = false,\n}: WidgetProps) {\n const {\n isOpen,\n setFeatures,\n setPosition,\n setComments,\n setCurrentPageUrl,\n openFeedbackPanel,\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 // Set position on mount/change\n useEffect(() => {\n if (position) {\n setPosition(position);\n }\n }, [position, setPosition]);\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} demoMode={demoMode} />\n\n {/* Feedback drawer panel */}\n <FeedbackDrawer onExport={onExport} onLocateComment={onLocateComment} />\n\n {/* Quick input for element selection */}\n <QuickInput author={author} onSubmit={onSubmit} demoMode={demoMode} onCommentAdded={demoMode ? openFeedbackPanel : undefined} />\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 /**\n * Demo mode - enables special behaviors for showcasing the widget:\n * - Auto-opens feedback drawer after new feedback is submitted\n * - Forces modal centering with flexbox (no animation transform conflicts)\n */\n demoMode?: boolean;\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 demoMode = false,\n}: FeedbackWidgetProps) {\n const {\n isAuthenticated,\n isAuthLoading,\n session,\n features,\n isWidgetReady,\n projectId,\n config,\n saveTask,\n tasks,\n } = useFramed();\n\n // Get position from config\n const position = config.widget?.position || 'bottom-center';\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 position={position}\n features={features}\n initialComments={initialComments}\n onSubmit={handleSubmit}\n onScreenshot={onScreenshot}\n onLocateComment={onLocateComment}\n onExport={onExport}\n onClose={onClose}\n demoMode={demoMode}\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","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\n\nimport { cn } from \"../utils/cn\"\n\nconst ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nconst ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nexport { ScrollArea, ScrollBar }\n","/**\n * Permission utility functions\n * COPIED from framed-app/src/utils/permissions.ts\n * Only includes the functions needed for management components\n */\n\n// Use local type to avoid import issues during build\n// This matches the UserRole type from @framed/core\ntype UserRole = 'super_admin' | 'admin' | 'manager' | 'client'\n\ninterface User {\n id?: string\n role?: UserRole\n}\n\n/**\n * Check if user has admin-level privileges (admin or super_admin)\n * Use this for features that should be available to both admins and super admins\n * Examples: export functionality, viewing admin-only UI elements\n */\nexport const hasAdminPrivileges = (user: User | null): boolean => {\n if (!user) return false\n return user.role === 'admin' || user.role === 'super_admin'\n}\n","/**\n * Feature flag utilities for the SDK\n *\n * These are stub implementations. Consuming applications should\n * provide their own feature flag logic based on their backend.\n */\n\nimport { Project, User } from '@framed/core'\n\n/**\n * Check if a user/project has access to a specific feature\n */\nexport const hasFeature = (\n user: User | null,\n project: Project | null,\n featureName: string\n): boolean => {\n if (!user || !project) return false\n\n // Super admins can always access all features\n if (user.role === 'super_admin') return true\n\n // Check project-specific override (manually enabled by super admin)\n if (project.enabled_features?.includes(featureName)) return true\n\n // Check agency plan features\n if (project.agency?.features?.[featureName]) return true\n\n return false\n}\n\n/**\n * Check if agency has a monitoring feature available\n * This is the \"capability\" check - can the agency use this feature at all?\n */\nexport const agencyHasMonitoringFeature = (\n project: Project | null,\n feature: 'seo' | 'performance' | 'uptime' | 'analytics'\n): boolean => {\n if (!project?.agency) return false\n\n // Gold plan agencies get all monitoring features\n if (project.agency.plan_type === 'gold') return true\n\n // Check explicit feature flags\n switch (feature) {\n case 'seo':\n return project.agency.features?.seo_audit === true\n case 'performance':\n return project.agency.features?.performance_analysis === true\n case 'uptime':\n return project.agency.features?.uptime_monitoring === true\n case 'analytics':\n return project.agency.features?.site_analytics === true\n default:\n return false\n }\n}\n\n/**\n * Check if a project has a monitoring feature enabled\n * This checks both agency availability AND project-level enablement\n */\nexport const projectHasMonitoringFeature = (\n user: User | null,\n project: Project | null,\n feature: 'seo' | 'performance' | 'uptime' | 'analytics'\n): boolean => {\n // First check if agency has the feature\n if (!agencyHasMonitoringFeature(project, feature)) return false\n\n // Super admins bypass project-level checks\n if (user?.role === 'super_admin') return true\n\n // Check project-level enablement\n const monitoringFeatures = project?.monitoring_features\n if (!monitoringFeatures) return true // Default to enabled if no explicit settings\n\n switch (feature) {\n case 'seo':\n return monitoringFeatures.seo_enabled !== false\n case 'performance':\n return monitoringFeatures.performance_enabled !== false\n case 'uptime':\n return monitoringFeatures.uptime_enabled !== false\n case 'analytics':\n return monitoringFeatures.analytics_enabled !== false\n default:\n return false\n }\n}\n","/**\n * Phase 5 Redesign - Constants & Configuration\n *\n * \"Command Center\" aesthetic - dark, sophisticated, information-dense\n */\n\nimport {\n Bug,\n Gauge,\n Shield,\n FileText,\n Palette,\n Sparkles,\n LayoutGrid,\n FilePlus,\n Megaphone,\n Search,\n Accessibility,\n Code,\n MoreHorizontal,\n type LucideIcon\n} from 'lucide-react'\n\n// ============================================\n// CATEGORIES\n// ============================================\n\nexport interface CategoryConfig {\n label: string\n labelNl: string\n icon: LucideIcon\n color: string // Tailwind color class (e.g., 'rose')\n accent: string // Hex color for accents\n description: string\n descriptionNl: string\n}\n\nexport const CATEGORIES: Record<string, CategoryConfig> = {\n bug_fix: {\n label: 'Bug Fix',\n labelNl: 'Bug Fix',\n icon: Bug,\n color: 'rose',\n accent: '#f43f5e',\n description: 'Something is broken or not working as expected',\n descriptionNl: 'Iets is kapot of werkt niet zoals verwacht'\n },\n performance: {\n label: 'Performance',\n labelNl: 'Performance',\n icon: Gauge,\n color: 'amber',\n accent: '#f59e0b',\n description: 'Speed, loading times, optimization',\n descriptionNl: 'Snelheid, laadtijden, optimalisatie'\n },\n security: {\n label: 'Security',\n labelNl: 'Beveiliging',\n icon: Shield,\n color: 'violet',\n accent: '#8b5cf6',\n description: 'Security patches, vulnerability fixes',\n descriptionNl: 'Beveiligingspatches, kwetsbaarheden'\n },\n content_update: {\n label: 'Content',\n labelNl: 'Content',\n icon: FileText,\n color: 'sky',\n accent: '#0ea5e9',\n description: 'Text, images, or media updates',\n descriptionNl: 'Tekst, afbeeldingen of media updates'\n },\n design_tweak: {\n label: 'Design',\n labelNl: 'Design',\n icon: Palette,\n color: 'pink',\n accent: '#ec4899',\n description: 'Visual adjustments, styling changes',\n descriptionNl: 'Visuele aanpassingen, stijlwijzigingen'\n },\n new_feature: {\n label: 'Feature',\n labelNl: 'Functie',\n icon: Sparkles,\n color: 'emerald',\n accent: '#10b981',\n description: 'New functionality or capability',\n descriptionNl: 'Nieuwe functionaliteit of mogelijkheid'\n },\n new_section: {\n label: 'Section',\n labelNl: 'Sectie',\n icon: LayoutGrid,\n color: 'teal',\n accent: '#14b8a6',\n description: 'New content section on existing page',\n descriptionNl: 'Nieuwe content sectie op bestaande pagina'\n },\n new_page: {\n label: 'Page',\n labelNl: 'Pagina',\n icon: FilePlus,\n color: 'indigo',\n accent: '#6366f1',\n description: 'Entirely new page',\n descriptionNl: 'Geheel nieuwe pagina'\n },\n campaign: {\n label: 'Campaign',\n labelNl: 'Campagne',\n icon: Megaphone,\n color: 'fuchsia',\n accent: '#d946ef',\n description: 'Marketing, seasonal, promotional',\n descriptionNl: 'Marketing, seizoens, promotioneel'\n },\n seo: {\n label: 'SEO',\n labelNl: 'SEO',\n icon: Search,\n color: 'lime',\n accent: '#84cc16',\n description: 'Search engine optimization',\n descriptionNl: 'Zoekmachine optimalisatie'\n },\n accessibility: {\n label: 'A11y',\n labelNl: 'Toegankelijkheid',\n icon: Accessibility,\n color: 'cyan',\n accent: '#06b6d4',\n description: 'Accessibility improvements',\n descriptionNl: 'Toegankelijkheidsverbeteringen'\n },\n technical_debt: {\n label: 'Tech Debt',\n labelNl: 'Tech Debt',\n icon: Code,\n color: 'slate',\n accent: '#64748b',\n description: 'Code cleanup, refactoring',\n descriptionNl: 'Code opschonen, refactoring'\n },\n other: {\n label: 'Other',\n labelNl: 'Anders',\n icon: MoreHorizontal,\n color: 'zinc',\n accent: '#71717a',\n description: 'Miscellaneous requests',\n descriptionNl: 'Overige verzoeken'\n }\n}\n\n// Grouped categories for the category picker\nexport const CATEGORY_GROUPS = {\n issues: ['bug_fix', 'performance', 'security', 'accessibility'],\n content: ['content_update', 'design_tweak', 'seo'],\n new: ['new_feature', 'new_section', 'new_page', 'campaign'],\n technical: ['technical_debt', 'other']\n}\n\n// ============================================\n// PRIORITIES\n// ============================================\n\nexport interface PriorityConfig {\n label: string\n labelNl: string\n color: string\n accent: string\n bgClass: string\n textClass: string\n slaHours: number\n description: string\n descriptionNl: string\n}\n\nexport const PRIORITIES: Record<string, PriorityConfig> = {\n critical: {\n label: 'Critical',\n labelNl: 'Kritiek',\n color: 'rose',\n accent: '#f43f5e',\n bgClass: 'bg-rose-500/20',\n textClass: 'text-rose-400',\n slaHours: 4,\n description: 'Site down, major functionality broken',\n descriptionNl: 'Site down, grote functionaliteit kapot'\n },\n high: {\n label: 'High',\n labelNl: 'Hoog',\n color: 'orange',\n accent: '#f97316',\n bgClass: 'bg-orange-500/20',\n textClass: 'text-orange-400',\n slaHours: 24,\n description: 'Significant impact, needs attention soon',\n descriptionNl: 'Significante impact, vereist spoedig aandacht'\n },\n medium: {\n label: 'Medium',\n labelNl: 'Gemiddeld',\n color: 'yellow',\n accent: '#eab308',\n bgClass: 'bg-yellow-500/20',\n textClass: 'text-yellow-400',\n slaHours: 72,\n description: 'Important but not urgent',\n descriptionNl: 'Belangrijk maar niet urgent'\n },\n low: {\n label: 'Low',\n labelNl: 'Laag',\n color: 'emerald',\n accent: '#10b981',\n bgClass: 'bg-emerald-500/20',\n textClass: 'text-emerald-400',\n slaHours: 168,\n description: 'Nice to have, can wait',\n descriptionNl: 'Nice to have, kan wachten'\n }\n}\n\nexport const PRIORITY_ORDER = ['critical', 'high', 'medium', 'low'] as const\n\n// ============================================\n// STATUSES\n// ============================================\n\nexport interface StatusConfig {\n label: string\n labelNl: string\n color: string\n accent: string\n bgClass: string\n textClass: string\n description: string\n}\n\nexport const STATUSES: Record<string, StatusConfig> = {\n backlog: {\n label: 'Backlog',\n labelNl: 'Backlog',\n color: 'zinc',\n accent: '#71717a',\n bgClass: 'bg-zinc-500/20',\n textClass: 'text-zinc-400',\n description: 'Not yet scheduled'\n },\n scheduled: {\n label: 'Scheduled',\n labelNl: 'Ingepland',\n color: 'blue',\n accent: '#3b82f6',\n bgClass: 'bg-blue-500/20',\n textClass: 'text-blue-400',\n description: 'Planned for upcoming work'\n },\n in_progress: {\n label: 'In Progress',\n labelNl: 'In Uitvoering',\n color: 'violet',\n accent: '#8b5cf6',\n bgClass: 'bg-violet-500/20',\n textClass: 'text-violet-400',\n description: 'Currently being worked on'\n },\n review: {\n label: 'Review',\n labelNl: 'Review',\n color: 'amber',\n accent: '#f59e0b',\n bgClass: 'bg-amber-500/20',\n textClass: 'text-amber-400',\n description: 'Ready for review/testing'\n },\n completed: {\n label: 'Completed',\n labelNl: 'Afgerond',\n color: 'emerald',\n accent: '#10b981',\n bgClass: 'bg-emerald-500/20',\n textClass: 'text-emerald-400',\n description: 'Done and deployed'\n },\n wont_fix: {\n label: \"Won't Fix\",\n labelNl: 'Afgewezen',\n color: 'slate',\n accent: '#475569',\n bgClass: 'bg-slate-500/20',\n textClass: 'text-slate-500',\n description: 'Decided not to implement'\n }\n}\n\nexport const STATUS_ORDER = ['backlog', 'scheduled', 'in_progress', 'review', 'completed'] as const\nexport const ALL_STATUS_ORDER = [...STATUS_ORDER, 'wont_fix'] as const\n\n// ============================================\n// QUOTE STATUSES\n// ============================================\n\nexport interface QuoteStatusConfig {\n label: string\n labelNl: string\n color: string\n accent: string\n description: string\n descriptionNl: string\n}\n\nexport const QUOTE_STATUSES: Record<string, QuoteStatusConfig> = {\n draft: {\n label: 'Draft',\n labelNl: 'Concept',\n color: 'zinc',\n accent: '#71717a',\n description: 'Request is being prepared',\n descriptionNl: 'Verzoek wordt voorbereid'\n },\n pending_review: {\n label: 'Awaiting Quote',\n labelNl: 'Wacht op Offerte',\n color: 'blue',\n accent: '#3b82f6',\n description: 'Waiting for agency to provide quote',\n descriptionNl: 'Wacht op offerte van bureau'\n },\n quoted: {\n label: 'Quote Ready',\n labelNl: 'Offerte Klaar',\n color: 'amber',\n accent: '#f59e0b',\n description: 'Quote provided, awaiting client decision',\n descriptionNl: 'Offerte ontvangen, wacht op beslissing'\n },\n approved: {\n label: 'Approved',\n labelNl: 'Goedgekeurd',\n color: 'emerald',\n accent: '#10b981',\n description: 'Client approved, ready to start',\n descriptionNl: 'Klant akkoord, klaar om te starten'\n },\n rejected: {\n label: 'Rejected',\n labelNl: 'Afgewezen',\n color: 'rose',\n accent: '#f43f5e',\n description: 'Client rejected the quote',\n descriptionNl: 'Klant heeft offerte afgewezen'\n },\n in_progress: {\n label: 'In Progress',\n labelNl: 'In Uitvoering',\n color: 'violet',\n accent: '#8b5cf6',\n description: 'Work has started',\n descriptionNl: 'Werk is gestart'\n },\n completed: {\n label: 'Completed',\n labelNl: 'Afgerond',\n color: 'emerald',\n accent: '#10b981',\n description: 'Work completed',\n descriptionNl: 'Werk afgerond'\n }\n}\n\n// ============================================\n// VIEW MODES\n// ============================================\n\nexport type ViewMode = 'inbox' | 'board' | 'timeline'\n\nexport const VIEW_MODES: { id: ViewMode; label: string; labelNl: string }[] = [\n { id: 'inbox', label: 'Inbox', labelNl: 'Inbox' },\n { id: 'board', label: 'Board', labelNl: 'Bord' },\n { id: 'timeline', label: 'Timeline', labelNl: 'Tijdlijn' }\n]\n","/**\n * InboxView - Smart prioritized inbox for maintenance items\n *\n * Groups items by importance:\n * 1. Needs Your Attention (quote decisions, critical bugs)\n * 2. In Progress\n * 3. Recently Added\n * 4. Everything Else\n */\n\nimport { useMemo } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n AlertTriangle,\n Clock,\n Zap,\n FileQuestion,\n Euro,\n ChevronRight,\n MessageSquare,\n Calendar,\n Sparkles,\n Edit3\n} from 'lucide-react'\nimport { formatDistanceToNow } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn } from '../utils/cn'\nimport { MaintenanceItem, MaintenanceItemStatus, MaintenanceQuote, MaintenanceComment, StatusTransition } from '@framed/core'\nimport { CATEGORIES, PRIORITIES, STATUSES } from '../constants'\n\ninterface InboxViewProps {\n items: MaintenanceItem[]\n selectedItemId: string | null\n onSelectItem: (id: string | null) => void\n onStatusChange: (itemId: string, newStatus: MaintenanceItemStatus) => Promise<void>\n isAgency: boolean\n canEdit: boolean\n}\n\ntype ItemWithQuote = MaintenanceItem & { quote?: MaintenanceQuote }\n\ninterface InboxSection {\n id: string\n title: string\n icon: React.ComponentType<{ className?: string }>\n color: string\n items: ItemWithQuote[]\n emptyMessage: string\n}\n\nexport const InboxView = ({\n items,\n selectedItemId,\n onSelectItem,\n onStatusChange,\n isAgency,\n canEdit\n}: InboxViewProps) => {\n // Group items into smart sections\n const sections = useMemo<InboxSection[]>(() => {\n const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000)\n const twoDaysAgo = new Date(Date.now() - 48 * 60 * 60 * 1000)\n\n // Helper to check if item has recent comments that need attention\n // Returns true if there are comments in last 48h AND no status change after the latest comment\n const hasRecentCommentsNeedingAttention = (item: MaintenanceItem): boolean => {\n if (!item.comments || item.comments.length === 0) return false\n\n // Find the most recent comment within 48 hours\n const recentComments = item.comments.filter((comment: MaintenanceComment) => {\n const commentDate = new Date(comment.created_at)\n return commentDate > twoDaysAgo\n })\n\n if (recentComments.length === 0) return false\n\n // Get the most recent comment timestamp\n const latestCommentTime = Math.max(\n ...recentComments.map((c: MaintenanceComment) => new Date(c.created_at).getTime())\n )\n\n // Check if there's been a status change after the latest comment\n if (item.status_history && item.status_history.length > 0) {\n const latestStatusChange = Math.max(\n ...item.status_history.map((s: StatusTransition) => new Date(s.changed_at).getTime())\n )\n // If status was changed after the latest comment, item has been addressed\n if (latestStatusChange > latestCommentTime) return false\n }\n\n return true\n }\n\n // Attention needed: critical items, items needing quote decision, items with recent comments\n const needsAttention = items.filter(item => {\n // Skip completed/closed items\n if (item.status === 'completed' || item.status === 'wont_fix') return false\n\n const quote = (item as ItemWithQuote).quote\n if (item.priority === 'critical') return true\n if (isAgency && quote?.status === 'pending_review') return true\n if (!isAgency && quote?.status === 'quoted') return true\n // Items with recent comments need attention (unless status changed after)\n if (hasRecentCommentsNeedingAttention(item)) return true\n return false\n })\n\n // In progress\n const inProgress = items.filter(\n item => item.status === 'in_progress' && !needsAttention.includes(item)\n )\n\n // Review items\n const inReview = items.filter(\n item => item.status === 'review' && !needsAttention.includes(item)\n )\n\n // Recently added (last 24 hours, not in other sections)\n const recentlyAdded = items.filter(\n item => {\n const created = new Date(item.created_at)\n return created > oneDayAgo &&\n !needsAttention.includes(item) &&\n !inProgress.includes(item) &&\n !inReview.includes(item) &&\n item.status === 'backlog'\n }\n )\n\n // Scheduled\n const scheduled = items.filter(\n item => item.status === 'scheduled' &&\n !needsAttention.includes(item) &&\n !inProgress.includes(item)\n )\n\n // Backlog (everything else)\n const backlog = items.filter(\n item => item.status === 'backlog' &&\n !needsAttention.includes(item) &&\n !recentlyAdded.includes(item)\n )\n\n return [\n {\n id: 'attention',\n title: 'Needs Attention',\n icon: Zap,\n color: 'rose',\n items: needsAttention,\n emptyMessage: 'All caught up!'\n },\n {\n id: 'progress',\n title: 'In Progress',\n icon: Clock,\n color: 'blue',\n items: inProgress,\n emptyMessage: 'No items in progress'\n },\n {\n id: 'review',\n title: 'Ready for Review',\n icon: FileQuestion,\n color: 'amber',\n items: inReview,\n emptyMessage: 'No items for review'\n },\n {\n id: 'recent',\n title: 'Recently Added',\n icon: Sparkles,\n color: 'emerald',\n items: recentlyAdded,\n emptyMessage: 'No new items'\n },\n {\n id: 'scheduled',\n title: 'Scheduled',\n icon: Calendar,\n color: 'violet',\n items: scheduled,\n emptyMessage: 'No scheduled items'\n },\n {\n id: 'backlog',\n title: 'Backlog',\n icon: AlertTriangle,\n color: 'slate',\n items: backlog,\n emptyMessage: 'Backlog is empty'\n }\n ]\n }, [items, isAgency])\n\n // Color mappings for Tailwind\n const colorMap: Record<string, { bg: string; text: string; border: string }> = {\n rose: { bg: 'bg-rose-50', text: 'text-rose-600', border: 'border-rose-200' },\n blue: { bg: 'bg-blue-50', text: 'text-blue-600', border: 'border-blue-200' },\n amber: { bg: 'bg-amber-50', text: 'text-amber-600', border: 'border-amber-200' },\n emerald: { bg: 'bg-emerald-50', text: 'text-emerald-600', border: 'border-emerald-200' },\n violet: { bg: 'bg-violet-50', text: 'text-violet-600', border: 'border-violet-200' },\n slate: { bg: 'bg-slate-100', text: 'text-slate-600', border: 'border-slate-200' }\n }\n\n // Only show sections that have items or are important\n const visibleSections = sections.filter(\n s => s.items.length > 0 || s.id === 'attention'\n )\n\n return (\n <div className=\"h-full overflow-y-auto bg-gray-50\">\n <div className=\"max-w-4xl mx-auto py-6 px-4 lg:px-6 space-y-8\">\n {visibleSections.map((section, sectionIndex) => {\n const colors = colorMap[section.color] ?? { bg: 'bg-slate-100', text: 'text-slate-600', border: 'border-slate-200' }\n\n return (\n <motion.section\n key={section.id}\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: sectionIndex * 0.05 }}\n >\n {/* Section Header */}\n <div className=\"flex items-center gap-3 mb-4\">\n <div className={cn('w-8 h-8 rounded-lg flex items-center justify-center', colors.bg)}>\n <section.icon className={cn('w-4 h-4', colors.text)} />\n </div>\n <h2 className=\"text-lg font-semibold text-slate-900\">{section.title}</h2>\n {section.items.length > 0 && (\n <span className=\"px-2 py-0.5 rounded-full text-xs font-medium bg-slate-100 text-slate-600\">\n {section.items.length}\n </span>\n )}\n </div>\n\n {/* Section Content */}\n {section.items.length > 0 ? (\n <div className=\"space-y-2\">\n <AnimatePresence>\n {section.items.map((item, itemIndex) => (\n <InboxItem\n key={item.id}\n item={item}\n isSelected={item.id === selectedItemId}\n onClick={() => onSelectItem(item.id)}\n onStatusChange={onStatusChange}\n index={itemIndex}\n isAgency={isAgency}\n canEdit={canEdit}\n />\n ))}\n </AnimatePresence>\n </div>\n ) : (\n <div className=\"py-8 px-4 rounded-xl border border-dashed border-slate-200 bg-white text-center\">\n <p className=\"text-sm text-slate-400\">{section.emptyMessage}</p>\n </div>\n )}\n </motion.section>\n )\n })}\n\n {/* Empty state when no items at all */}\n {items.length === 0 && (\n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n className=\"text-center py-16\"\n >\n <div className=\"w-16 h-16 mx-auto mb-4 rounded-2xl bg-slate-100 flex items-center justify-center\">\n <Sparkles className=\"w-8 h-8 text-slate-300\" />\n </div>\n <h3 className=\"text-lg font-semibold text-slate-900 mb-2\">All Done!</h3>\n <p className=\"text-slate-500 max-w-sm mx-auto\">\n No maintenance items yet. When issues or ideas come in, they will appear here.\n </p>\n </motion.div>\n )}\n </div>\n </div>\n )\n}\n\n// ============================================\n// Inbox Item\n// ============================================\n\ninterface InboxItemProps {\n item: ItemWithQuote\n isSelected: boolean\n onClick: () => void\n onStatusChange: (itemId: string, newStatus: MaintenanceItemStatus) => Promise<void>\n index: number\n isAgency: boolean\n canEdit: boolean\n}\n\nconst InboxItem = ({\n item,\n isSelected,\n onClick,\n onStatusChange,\n index,\n isAgency,\n canEdit\n}: InboxItemProps) => {\n const category = CATEGORIES[item.category]\n const priority = PRIORITIES[item.priority]\n const status = STATUSES[item.status]\n const CategoryIcon = category?.icon\n\n // Check if this is a text-edit item\n const isTextEdit = item.metadata?.type === 'text-edit' && item.metadata.originalContent && item.metadata.newContent\n\n // Fallback: Check if description contains text edit format from edge function\n const descriptionHasTextEdit = item.description?.startsWith('Original:') && item.description?.includes('Change to:')\n const parsedTextEdit = descriptionHasTextEdit && item.description ? (() => {\n const parts = item.description.split('\\n\\nChange to:')\n if (parts.length === 2 && parts[0] && parts[1]) {\n return {\n original: parts[0].replace('Original:', '').trim(),\n new: parts[1].trim()\n }\n }\n return null\n })() : null\n\n // Check if item has pending quote\n const quote = item.quote\n const hasPendingQuote = quote && ['pending_review', 'quoted'].includes(quote.status)\n\n return (\n <motion.div\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 20 }}\n transition={{ delay: index * 0.02 }}\n onClick={onClick}\n className={cn(\n 'group relative p-4 rounded-xl border cursor-pointer transition-all duration-200 bg-white',\n isSelected\n ? 'border-powder-blue-400 shadow-md ring-2 ring-powder-blue-100'\n : 'border-slate-200 hover:border-slate-300 hover:shadow-sm'\n )}\n >\n {/* Priority indicator bar */}\n <div\n className=\"absolute left-0 top-4 bottom-4 w-1 rounded-full\"\n style={{ backgroundColor: priority?.accent || '#71717a' }}\n />\n\n <div className=\"flex items-start gap-4 pl-3\">\n {/* Category Icon */}\n <div\n className=\"w-10 h-10 rounded-lg flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: `${category?.accent}15` || 'rgba(100, 100, 100, 0.1)' }}\n >\n {CategoryIcon && (\n <CategoryIcon\n className=\"w-5 h-5\"\n style={{ color: category?.accent || '#71717a' }}\n />\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-medium text-slate-900 group-hover:text-slate-900 truncate\">\n {item.title}\n </h3>\n {(isTextEdit || parsedTextEdit || item.metadata?.type === 'text-edit') && (\n <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 bg-violet-100 text-violet-700 rounded text-xs font-medium flex-shrink-0\">\n <Edit3 className=\"w-3 h-3\" />\n Text\n </span>\n )}\n </div>\n {isTextEdit ? (\n <div className=\"mt-1.5 flex items-center gap-2 text-sm\">\n <span className=\"text-red-600 line-through truncate max-w-[150px]\">\n {item.metadata?.originalContent?.substring(0, 40)}...\n </span>\n <span className=\"text-slate-400\">→</span>\n <span className=\"text-green-600 truncate max-w-[150px]\">\n {item.metadata?.newContent?.substring(0, 40)}...\n </span>\n </div>\n ) : parsedTextEdit ? (\n <div className=\"mt-1.5 flex items-center gap-2 text-sm\">\n <span className=\"text-red-600 line-through truncate max-w-[150px]\">\n {parsedTextEdit.original.substring(0, 40)}...\n </span>\n <span className=\"text-slate-400\">→</span>\n <span className=\"text-green-600 truncate max-w-[150px]\">\n {parsedTextEdit.new.substring(0, 40)}...\n </span>\n </div>\n ) : item.description && (\n <p className=\"mt-1 text-sm text-slate-500 line-clamp-2\">\n {item.description}\n </p>\n )}\n </div>\n\n {/* Meta badges */}\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {/* Quote badge */}\n {hasPendingQuote && (\n <span className={cn(\n 'px-2 py-1 rounded-md text-xs font-medium flex items-center gap-1',\n quote?.status === 'quoted'\n ? 'bg-amber-100 text-amber-700'\n : 'bg-blue-100 text-blue-700'\n )}>\n <Euro className=\"w-3 h-3\" />\n {quote?.status === 'quoted' ? (\n <>€{quote.fixed_price || (quote.estimated_hours && quote.hourly_rate ? quote.estimated_hours * quote.hourly_rate : 0)}</>\n ) : (\n 'Wacht op offerte'\n )}\n </span>\n )}\n\n {/* Priority badge */}\n <span\n className=\"px-2 py-1 rounded-md text-xs font-medium\"\n style={{\n backgroundColor: `${priority?.accent}15`,\n color: priority?.accent\n }}\n >\n {priority?.label || item.priority}\n </span>\n\n {/* Arrow */}\n <ChevronRight className=\"w-4 h-4 text-slate-300 group-hover:text-slate-500 transition-colors\" />\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"mt-3 flex items-center gap-4 text-xs text-slate-400\">\n {/* Status */}\n <span\n className=\"flex items-center gap-1\"\n style={{ color: status?.accent }}\n >\n <div\n className=\"w-1.5 h-1.5 rounded-full\"\n style={{ backgroundColor: status?.accent }}\n />\n {status?.label || item.status}\n </span>\n\n {/* Page name */}\n {item.page_name && (\n <span className=\"flex items-center gap-1\">\n <span className=\"opacity-50\">on</span>\n {item.page_name}\n </span>\n )}\n\n {/* Comments */}\n {item.comments && item.comments.length > 0 && (\n <span className=\"flex items-center gap-1\">\n <MessageSquare className=\"w-3 h-3\" />\n {item.comments.length}\n </span>\n )}\n\n {/* Time */}\n <span className=\"ml-auto\">\n {formatDistanceToNow(new Date(item.created_at), {\n addSuffix: true,\n locale: enUS\n })}\n </span>\n </div>\n </div>\n </div>\n </motion.div>\n )\n}\n","/**\n * BoardView - Modern Kanban board with @dnd-kit drag-and-drop\n *\n * Clean columns with smooth animations and visual feedback\n */\n\nimport { useState, useMemo } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n DndContext,\n DragEndEvent,\n DragOverEvent,\n DragOverlay,\n DragStartEvent,\n PointerSensor,\n useSensor,\n useSensors,\n closestCenter,\n rectIntersection,\n useDroppable,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport {\n MoreHorizontal,\n GripVertical,\n MessageSquare,\n Calendar,\n Euro,\n Clock\n} from 'lucide-react'\nimport { formatDistanceToNow } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn } from '../utils/cn'\nimport { MaintenanceItem, MaintenanceItemStatus, MaintenanceQuote } from '@framed/core'\nimport { CATEGORIES, PRIORITIES, STATUSES, STATUS_ORDER } from '../constants'\n\ninterface BoardViewProps {\n items: MaintenanceItem[]\n selectedItemId: string | null\n onSelectItem: (id: string | null) => void\n onStatusChange: (itemId: string, newStatus: MaintenanceItemStatus) => Promise<void>\n canEdit: boolean\n}\n\ntype ItemWithQuote = MaintenanceItem & { quote?: MaintenanceQuote }\n\nexport const BoardView = ({\n items,\n selectedItemId,\n onSelectItem,\n onStatusChange,\n canEdit\n}: BoardViewProps) => {\n const [activeId, setActiveId] = useState<string | null>(null)\n const [overId, setOverId] = useState<MaintenanceItemStatus | null>(null)\n\n // Configure pointer sensor with activation constraints\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 8, // 8px movement required before drag starts\n },\n })\n )\n\n // Group items by status\n const columns = useMemo(() => {\n return STATUS_ORDER.map(status => ({\n status,\n config: STATUSES[status]!,\n items: items.filter(item => item.status === status)\n }))\n }, [items])\n\n // Get the active item being dragged\n const activeItem = activeId ? items.find(i => i.id === activeId) : null\n\n // Handle drag start\n const handleDragStart = (event: DragStartEvent) => {\n if (!canEdit) return\n setActiveId(event.active.id as string)\n }\n\n // Handle drag over (for visual feedback)\n const handleDragOver = (event: DragOverEvent) => {\n const { over } = event\n if (over) {\n // Check if over a column\n const columnStatus = over.id as MaintenanceItemStatus\n if ((STATUS_ORDER as readonly string[]).includes(columnStatus) || columnStatus === 'wont_fix') {\n setOverId(columnStatus)\n } else {\n // Over an item - find its column\n const overItem = items.find(i => i.id === over.id)\n if (overItem) {\n setOverId(overItem.status)\n }\n }\n } else {\n setOverId(null)\n }\n }\n\n // Handle drag end\n const handleDragEnd = async (event: DragEndEvent) => {\n const { active, over } = event\n\n setActiveId(null)\n setOverId(null)\n\n if (!over || !canEdit) return\n\n const draggedItemId = active.id as string\n const draggedItem = items.find(i => i.id === draggedItemId)\n if (!draggedItem) return\n\n // Determine the target status\n let targetStatus: MaintenanceItemStatus | null = null\n\n // Check if dropped on a column\n if ((STATUS_ORDER as readonly string[]).includes(over.id as string) || over.id === 'wont_fix') {\n targetStatus = over.id as MaintenanceItemStatus\n } else {\n // Dropped on an item - use that item's status\n const targetItem = items.find(i => i.id === over.id)\n if (targetItem) {\n targetStatus = targetItem.status\n }\n }\n\n // Update status if changed\n if (targetStatus && targetStatus !== draggedItem.status) {\n await onStatusChange(draggedItemId, targetStatus)\n }\n }\n\n // Custom collision detection that prefers columns over items\n const collisionDetection = (args: Parameters<typeof rectIntersection>[0]) => {\n // First check for column intersections\n const columnCollisions = rectIntersection(args)\n if (columnCollisions.length > 0) {\n return columnCollisions\n }\n // Fall back to closest center for items\n return closestCenter(args)\n }\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={collisionDetection}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n >\n <div className=\"h-full overflow-x-auto overflow-y-hidden bg-gray-50\">\n <div className=\"h-full p-4 lg:p-6\">\n <div className=\"flex gap-4 h-full min-w-max\">\n {columns.map((column, columnIndex) => (\n <KanbanColumn\n key={column.status}\n status={column.status}\n config={column.config}\n items={column.items as ItemWithQuote[]}\n selectedItemId={selectedItemId}\n onSelectItem={onSelectItem}\n isDropTarget={overId === column.status}\n isDragging={!!activeId}\n canEdit={canEdit}\n columnIndex={columnIndex}\n />\n ))}\n\n {/* Won't Fix Column (Collapsed style) */}\n <KanbanColumn\n status=\"wont_fix\"\n config={STATUSES.wont_fix!}\n items={items.filter(i => i.status === 'wont_fix') as ItemWithQuote[]}\n selectedItemId={selectedItemId}\n onSelectItem={onSelectItem}\n isDropTarget={overId === 'wont_fix'}\n isDragging={!!activeId}\n canEdit={canEdit}\n columnIndex={STATUS_ORDER.length}\n muted\n />\n </div>\n </div>\n </div>\n\n {/* Drag Overlay */}\n <DragOverlay dropAnimation={{\n duration: 200,\n easing: 'cubic-bezier(0.18, 0.67, 0.6, 1.22)',\n }}>\n {activeItem ? (\n <BoardCard\n item={activeItem as ItemWithQuote}\n isSelected={false}\n isDragging\n onClick={() => {}}\n canEdit={canEdit}\n isOverlay\n />\n ) : null}\n </DragOverlay>\n </DndContext>\n )\n}\n\n// ============================================\n// Kanban Column\n// ============================================\n\ninterface KanbanColumnProps {\n status: MaintenanceItemStatus\n config: {\n label: string\n labelNl: string\n color: string\n accent: string\n bgClass: string\n textClass: string\n description: string\n }\n items: ItemWithQuote[]\n selectedItemId: string | null\n onSelectItem: (id: string | null) => void\n isDropTarget: boolean\n isDragging: boolean\n canEdit: boolean\n columnIndex: number\n muted?: boolean\n}\n\nconst KanbanColumn = ({\n status,\n config,\n items,\n selectedItemId,\n onSelectItem,\n isDropTarget,\n isDragging,\n canEdit,\n columnIndex,\n muted\n}: KanbanColumnProps) => {\n const itemIds = items.map(i => i.id)\n\n // Make the column a droppable target\n const { setNodeRef, isOver } = useDroppable({\n id: status,\n })\n\n // Combine isDropTarget from parent and isOver from useDroppable\n const showDropHighlight = isDropTarget || isOver\n\n return (\n <motion.div\n ref={setNodeRef}\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: columnIndex * 0.05 }}\n className={cn(\n 'w-80 flex-shrink-0 flex flex-col rounded-xl overflow-hidden transition-all duration-200 border',\n showDropHighlight\n ? 'ring-2 ring-powder-blue-400 bg-powder-blue-50 border-powder-blue-200 scale-[1.02]'\n : muted\n ? 'bg-slate-50 border-slate-200 opacity-60 hover:opacity-100'\n : 'bg-white border-slate-200'\n )}\n >\n {/* Column Header */}\n <div className={cn(\n 'p-4 border-b',\n muted ? 'border-slate-200 bg-slate-100/50' : 'border-slate-100 bg-slate-50/50'\n )}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <div\n className=\"w-3 h-3 rounded-full\"\n style={{ backgroundColor: config.accent }}\n />\n <h3 className={cn(\n 'font-semibold text-sm',\n muted ? 'text-slate-500' : 'text-slate-700'\n )}>\n {config.label}\n </h3>\n <span className={cn(\n 'px-2 py-0.5 rounded-full text-xs font-medium',\n muted ? 'bg-slate-200 text-slate-500' : 'bg-slate-100 text-slate-500'\n )}>\n {items.length}\n </span>\n </div>\n <button className=\"p-1 rounded-md text-slate-400 hover:text-slate-600 hover:bg-slate-100 transition-colors\">\n <MoreHorizontal className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Column Items */}\n <div className=\"flex-1 overflow-y-auto p-2 space-y-2\">\n <SortableContext items={itemIds} strategy={verticalListSortingStrategy}>\n <AnimatePresence>\n {items.map((item, itemIndex) => (\n <SortableBoardCard\n key={item.id}\n item={item}\n isSelected={item.id === selectedItemId}\n onClick={() => onSelectItem(item.id)}\n index={itemIndex}\n canEdit={canEdit}\n muted={muted}\n />\n ))}\n </AnimatePresence>\n </SortableContext>\n\n {/* Empty State */}\n {items.length === 0 && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n className={cn(\n 'h-24 border-2 border-dashed rounded-lg flex items-center justify-center transition-all duration-200',\n showDropHighlight\n ? 'border-powder-blue-300 bg-powder-blue-50 scale-105'\n : 'border-slate-200'\n )}\n >\n <p className=\"text-xs text-slate-400\">\n {isDragging\n ? 'Drop here'\n : muted\n ? 'Drag to archive'\n : 'No items'}\n </p>\n </motion.div>\n )}\n </div>\n </motion.div>\n )\n}\n\n// ============================================\n// Sortable Board Card (with dnd-kit)\n// ============================================\n\ninterface SortableBoardCardProps {\n item: ItemWithQuote\n isSelected: boolean\n onClick: () => void\n index: number\n canEdit: boolean\n muted?: boolean\n}\n\nconst SortableBoardCard = ({\n item,\n isSelected,\n onClick,\n index,\n canEdit,\n muted\n}: SortableBoardCardProps) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({\n id: item.id,\n disabled: !canEdit,\n })\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n return (\n <div ref={setNodeRef} style={style}>\n <BoardCard\n item={item}\n isSelected={isSelected}\n isDragging={isDragging}\n onClick={onClick}\n canEdit={canEdit}\n muted={muted}\n dragHandleProps={{ ...attributes, ...listeners }}\n />\n </div>\n )\n}\n\n// ============================================\n// Board Card\n// ============================================\n\ninterface BoardCardProps {\n item: ItemWithQuote\n isSelected: boolean\n isDragging?: boolean\n onClick: () => void\n canEdit: boolean\n muted?: boolean\n isOverlay?: boolean\n dragHandleProps?: Record<string, unknown>\n}\n\nconst BoardCard = ({\n item,\n isSelected,\n isDragging,\n onClick,\n canEdit,\n muted,\n isOverlay,\n dragHandleProps\n}: BoardCardProps) => {\n const category = CATEGORIES[item.category]\n const priority = PRIORITIES[item.priority]\n const CategoryIcon = category?.icon\n\n const quote = item.quote\n const hasPendingQuote = quote && ['pending_review', 'quoted'].includes(quote.status)\n\n return (\n <motion.div\n initial={!isOverlay ? { opacity: 0, scale: 0.95 } : false}\n animate={!isOverlay ? { opacity: 1, scale: 1 } : false}\n exit={{ opacity: 0, scale: 0.95 }}\n onClick={onClick}\n className={cn(\n 'group relative p-3 rounded-lg border cursor-pointer transition-all duration-150',\n isDragging && !isOverlay && 'opacity-30',\n isOverlay && 'shadow-xl scale-105 rotate-2 opacity-95',\n isSelected\n ? 'bg-powder-blue-50 border-powder-blue-300 shadow-md'\n : muted\n ? 'bg-slate-50 border-slate-200 hover:bg-slate-100'\n : 'bg-white border-slate-200 hover:border-slate-300 hover:shadow-sm'\n )}\n >\n {/* Drag handle */}\n {canEdit && (\n <div\n {...dragHandleProps}\n className={cn(\n 'absolute left-1 top-1/2 -translate-y-1/2 transition-opacity cursor-grab active:cursor-grabbing',\n isOverlay ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'\n )}\n >\n <GripVertical className=\"w-3 h-3 text-slate-300\" />\n </div>\n )}\n\n {/* Priority indicator */}\n <div\n className=\"absolute right-2 top-2 w-2 h-2 rounded-full\"\n style={{ backgroundColor: priority?.accent || '#71717a' }}\n />\n\n {/* Content */}\n <div className={cn(canEdit && 'pl-2')}>\n {/* Category + Title */}\n <div className=\"flex items-start gap-2 pr-4\">\n {CategoryIcon && (\n <div\n className=\"w-6 h-6 rounded flex items-center justify-center flex-shrink-0 mt-0.5\"\n style={{ backgroundColor: `${category?.accent}15` }}\n >\n <CategoryIcon\n className=\"w-3.5 h-3.5\"\n style={{ color: category?.accent }}\n />\n </div>\n )}\n <h4 className={cn(\n 'text-sm font-medium line-clamp-2',\n muted ? 'text-slate-400 line-through' : 'text-slate-800'\n )}>\n {item.title}\n </h4>\n </div>\n\n {/* Footer */}\n <div className=\"mt-3 flex items-center justify-between text-xs text-slate-400\">\n <div className=\"flex items-center gap-2\">\n {/* Quote badge */}\n {hasPendingQuote && (\n <span className={cn(\n 'px-1.5 py-0.5 rounded text-[10px] font-medium flex items-center gap-0.5',\n quote?.status === 'quoted'\n ? 'bg-amber-100 text-amber-700'\n : 'bg-blue-100 text-blue-700'\n )}>\n <Euro className=\"w-2.5 h-2.5\" />\n {quote?.status === 'quoted' ? (\n <>€{quote.fixed_price || (quote.estimated_hours && quote.hourly_rate ? quote.estimated_hours * quote.hourly_rate : '...')}</>\n ) : (\n '...'\n )}\n </span>\n )}\n\n {/* Time logged */}\n {item.total_time_minutes && item.total_time_minutes > 0 && (\n <span className=\"flex items-center gap-0.5 text-slate-400\">\n <Clock className=\"w-3 h-3\" />\n {Math.round(item.total_time_minutes / 60 * 10) / 10}h\n </span>\n )}\n\n {/* Comments */}\n {item.comments && item.comments.length > 0 && (\n <span className=\"flex items-center gap-0.5\">\n <MessageSquare className=\"w-3 h-3\" />\n {item.comments.length}\n </span>\n )}\n\n {/* Due date */}\n {item.due_date && (\n <span className=\"flex items-center gap-0.5\">\n <Calendar className=\"w-3 h-3\" />\n {formatDistanceToNow(new Date(item.due_date), { addSuffix: true, locale: enUS })}\n </span>\n )}\n </div>\n\n {/* Category label */}\n <span className=\"text-[10px] uppercase tracking-wider opacity-60\">\n {category?.label || item.category}\n </span>\n </div>\n </div>\n </motion.div>\n )\n}\n","/**\n * TimelineView - GitHub-style activity timeline\n *\n * Shows a chronological feed of all project activity grouped by item:\n * - Items created -> in progress -> completed\n * - Clear visual progression of each ticket's lifecycle\n * - Comments and quote events\n */\n\nimport { useMemo } from 'react'\nimport { motion } from 'framer-motion'\nimport {\n Plus,\n CheckCircle2,\n XCircle,\n Calendar,\n MessageSquare,\n Play,\n Eye,\n Clock,\n Euro,\n GitCommit,\n Sparkles,\n CircleDot,\n Circle,\n ChevronRight\n} from 'lucide-react'\nimport { format, isToday, isYesterday, isThisWeek, startOfDay } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn } from '../utils/cn'\nimport type { MaintenanceItem, MaintenanceQuote } from '@framed/core'\nimport { CATEGORIES, STATUSES } from '../constants'\nimport { ScrollArea } from '../ui/scroll-area'\n\ninterface TimelineViewProps {\n items: MaintenanceItem[]\n selectedItemId: string | null\n onSelectItem: (id: string | null) => void\n}\n\ntype ItemWithQuote = MaintenanceItem & { quote?: MaintenanceQuote }\n\n// Event types for the timeline\ntype TimelineEventType =\n | 'created'\n | 'status_changed'\n | 'completed'\n | 'wont_fix'\n | 'comment_added'\n | 'quote_submitted'\n | 'quote_approved'\n | 'quote_rejected'\n\ninterface TimelineEvent {\n id: string\n type: TimelineEventType\n itemId: string\n itemTitle: string\n itemCategory: string\n timestamp: string\n actor?: string\n details?: {\n fromStatus?: string\n toStatus?: string\n commentCount?: number\n quoteAmount?: number\n }\n}\n\n// Group events by item for GitHub-style display\ninterface ItemTimeline {\n itemId: string\n itemTitle: string\n itemCategory: string\n currentStatus: string\n events: TimelineEvent[]\n latestTimestamp: string\n}\n\nexport const TimelineView = ({\n items,\n selectedItemId,\n onSelectItem\n}: TimelineViewProps) => {\n // Generate timeline events from items\n const events = useMemo<TimelineEvent[]>(() => {\n const allEvents: TimelineEvent[] = []\n\n items.forEach(item => {\n const typedItem = item as ItemWithQuote\n\n // Created event\n allEvents.push({\n id: `${item.id}-created`,\n type: 'created',\n itemId: item.id,\n itemTitle: item.title,\n itemCategory: item.category,\n timestamp: item.created_at,\n actor: item.created_by_name\n })\n\n // Completed event\n if (item.status === 'completed' && item.resolved_at) {\n allEvents.push({\n id: `${item.id}-completed`,\n type: 'completed',\n itemId: item.id,\n itemTitle: item.title,\n itemCategory: item.category,\n timestamp: item.resolved_at,\n actor: item.resolved_by_name\n })\n }\n\n // Won't fix event\n if (item.status === 'wont_fix' && item.resolved_at) {\n allEvents.push({\n id: `${item.id}-wont_fix`,\n type: 'wont_fix',\n itemId: item.id,\n itemTitle: item.title,\n itemCategory: item.category,\n timestamp: item.resolved_at,\n actor: item.resolved_by_name\n })\n }\n\n // Status change events (if we have updated_at and it's different from created_at)\n if (item.updated_at && item.updated_at !== item.created_at &&\n item.status !== 'completed' && item.status !== 'wont_fix' && item.status !== 'backlog') {\n allEvents.push({\n id: `${item.id}-status-${item.status}`,\n type: 'status_changed',\n itemId: item.id,\n itemTitle: item.title,\n itemCategory: item.category,\n timestamp: item.updated_at,\n details: {\n toStatus: item.status\n }\n })\n }\n\n // Quote events\n if (typedItem.quote) {\n if (typedItem.quote.quoted_at) {\n allEvents.push({\n id: `${item.id}-quote-submitted`,\n type: 'quote_submitted',\n itemId: item.id,\n itemTitle: item.title,\n itemCategory: item.category,\n timestamp: typedItem.quote.quoted_at,\n actor: typedItem.quote.quoted_by_name,\n details: {\n quoteAmount: typedItem.quote.fixed_price ||\n (typedItem.quote.estimated_hours && typedItem.quote.hourly_rate\n ? typedItem.quote.estimated_hours * typedItem.quote.hourly_rate\n : undefined)\n }\n })\n }\n\n if (typedItem.quote.status === 'approved' && typedItem.quote.responded_at) {\n allEvents.push({\n id: `${item.id}-quote-approved`,\n type: 'quote_approved',\n itemId: item.id,\n itemTitle: item.title,\n itemCategory: item.category,\n timestamp: typedItem.quote.responded_at,\n actor: typedItem.quote.responded_by_name\n })\n }\n\n if (typedItem.quote.status === 'rejected' && typedItem.quote.responded_at) {\n allEvents.push({\n id: `${item.id}-quote-rejected`,\n type: 'quote_rejected',\n itemId: item.id,\n itemTitle: item.title,\n itemCategory: item.category,\n timestamp: typedItem.quote.responded_at,\n actor: typedItem.quote.responded_by_name\n })\n }\n }\n\n // Comment events (aggregate)\n if (item.comments && item.comments.length > 0) {\n // Get the latest comment time\n const latestComment = item.comments.reduce((latest, comment) =>\n new Date(comment.created_at) > new Date(latest.created_at) ? comment : latest\n )\n\n allEvents.push({\n id: `${item.id}-comments`,\n type: 'comment_added',\n itemId: item.id,\n itemTitle: item.title,\n itemCategory: item.category,\n timestamp: latestComment.created_at,\n actor: latestComment.user_name,\n details: {\n commentCount: item.comments.length\n }\n })\n }\n })\n\n // Sort by timestamp descending\n return allEvents.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n )\n }, [items])\n\n // Group events by item to show ticket progression\n const itemTimelines = useMemo<ItemTimeline[]>(() => {\n const itemMap = new Map<string, ItemTimeline>()\n\n // Get item status map for current status\n const itemStatusMap = new Map(items.map(item => [item.id, item.status]))\n\n events.forEach(event => {\n if (!itemMap.has(event.itemId)) {\n itemMap.set(event.itemId, {\n itemId: event.itemId,\n itemTitle: event.itemTitle,\n itemCategory: event.itemCategory,\n currentStatus: itemStatusMap.get(event.itemId) || 'backlog',\n events: [],\n latestTimestamp: event.timestamp\n })\n }\n itemMap.get(event.itemId)!.events.push(event)\n })\n\n // Sort events within each item by timestamp ascending (oldest first for progression)\n itemMap.forEach(timeline => {\n timeline.events.sort((a, b) =>\n new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n )\n })\n\n // Sort items by latest activity descending\n return Array.from(itemMap.values()).sort((a, b) =>\n new Date(b.latestTimestamp).getTime() - new Date(a.latestTimestamp).getTime()\n )\n }, [events, items])\n\n // Group timelines by date for display\n const groups = useMemo<{ date: string; label: string; timelines: ItemTimeline[] }[]>(() => {\n const groupMap = new Map<string, ItemTimeline[]>()\n\n itemTimelines.forEach(timeline => {\n const date = startOfDay(new Date(timeline.latestTimestamp)).toISOString()\n if (!groupMap.has(date)) {\n groupMap.set(date, [])\n }\n groupMap.get(date)!.push(timeline)\n })\n\n return Array.from(groupMap.entries()).map(([date, timelines]) => {\n const d = new Date(date)\n let label: string\n\n if (isToday(d)) {\n label = 'Today'\n } else if (isYesterday(d)) {\n label = 'Yesterday'\n } else if (isThisWeek(d, { weekStartsOn: 1 })) {\n label = format(d, 'EEEE', { locale: enUS })\n } else {\n label = format(d, 'MMMM d, yyyy', { locale: enUS })\n }\n\n return { date, label, timelines }\n })\n }, [itemTimelines])\n\n return (\n <ScrollArea className=\"h-full\">\n <div className=\"max-w-3xl mx-auto py-6 px-4 lg:px-6\">\n {/* Timeline grouped by date, then by item */}\n <div className=\"space-y-8\">\n {groups.map((group, groupIndex) => (\n <motion.div\n key={group.date}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: groupIndex * 0.05 }}\n >\n {/* Date header */}\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"w-8 h-8 rounded-lg bg-white border border-slate-200 shadow-sm flex items-center justify-center\">\n <Calendar className=\"w-4 h-4 text-slate-400\" />\n </div>\n <h2 className=\"text-sm font-semibold text-slate-700\">{group.label}</h2>\n <span className=\"text-xs text-slate-400\">\n {group.timelines.length} {group.timelines.length === 1 ? 'ticket' : 'tickets'}\n </span>\n </div>\n\n {/* Item timelines */}\n <div className=\"space-y-3 pl-4\">\n {group.timelines.map((timeline, timelineIndex) => (\n <ItemTimelineCard\n key={timeline.itemId}\n timeline={timeline}\n isSelected={timeline.itemId === selectedItemId}\n onClick={() => onSelectItem(timeline.itemId)}\n index={timelineIndex}\n />\n ))}\n </div>\n </motion.div>\n ))}\n\n {/* Empty state */}\n {itemTimelines.length === 0 && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n className=\"text-center py-16\"\n >\n <div className=\"w-16 h-16 mx-auto mb-4 rounded-2xl bg-white border border-slate-200 flex items-center justify-center\">\n <Sparkles className=\"w-8 h-8 text-slate-300\" />\n </div>\n <h3 className=\"text-lg font-semibold text-slate-900 mb-2\">No Activity Yet</h3>\n <p className=\"text-slate-500 max-w-sm mx-auto\">\n Your project timeline will appear here as items are created and updated.\n </p>\n </motion.div>\n )}\n </div>\n </div>\n </ScrollArea>\n )\n}\n\n// ============================================\n// Item Timeline Card - GitHub-style ticket progression\n// ============================================\n\ninterface ItemTimelineCardProps {\n timeline: ItemTimeline\n isSelected: boolean\n onClick: () => void\n index: number\n}\n\nconst ItemTimelineCard = ({ timeline, isSelected, onClick, index }: ItemTimelineCardProps) => {\n const category = CATEGORIES[timeline.itemCategory]\n const status = STATUSES[timeline.currentStatus]\n const isCompleted = timeline.currentStatus === 'completed'\n const isWontFix = timeline.currentStatus === 'wont_fix'\n const isClosed = isCompleted || isWontFix\n\n // Determine the status color for the timeline line\n const getStatusColor = () => {\n if (isCompleted) return '#10b981' // green\n if (isWontFix) return '#64748b' // slate\n if (timeline.currentStatus === 'in_progress') return '#8b5cf6' // violet\n if (timeline.currentStatus === 'review') return '#f59e0b' // amber\n return '#94a3b8' // slate-400\n }\n\n const statusColor = getStatusColor()\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 5 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: index * 0.03 }}\n onClick={onClick}\n className={cn(\n 'group relative rounded-xl border cursor-pointer transition-all',\n isSelected\n ? 'bg-white border-blue-300 shadow-md ring-1 ring-blue-200'\n : 'bg-white border-slate-200 hover:border-slate-300 hover:shadow-sm'\n )}\n >\n {/* Card header */}\n <div className=\"p-4\">\n <div className=\"flex items-start gap-3\">\n {/* Status indicator - GitHub style */}\n <div className=\"flex-shrink-0 mt-0.5\">\n {isCompleted ? (\n <div className=\"w-6 h-6 rounded-full bg-emerald-500 flex items-center justify-center\">\n <CheckCircle2 className=\"w-4 h-4 text-white\" />\n </div>\n ) : isWontFix ? (\n <div className=\"w-6 h-6 rounded-full bg-slate-400 flex items-center justify-center\">\n <XCircle className=\"w-4 h-4 text-white\" />\n </div>\n ) : timeline.currentStatus === 'in_progress' ? (\n <div className=\"w-6 h-6 rounded-full bg-violet-500 flex items-center justify-center\">\n <CircleDot className=\"w-4 h-4 text-white\" />\n </div>\n ) : (\n <div className=\"w-6 h-6 rounded-full border-2 border-slate-300 bg-white flex items-center justify-center\">\n <Circle className=\"w-3 h-3 text-slate-400\" />\n </div>\n )}\n </div>\n\n {/* Title and category */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h3 className={cn(\n 'font-semibold text-slate-900',\n isWontFix && 'line-through text-slate-400'\n )}>\n {timeline.itemTitle}\n </h3>\n {category && (\n <span\n className=\"text-xs font-medium px-2 py-0.5 rounded-full\"\n style={{\n backgroundColor: `${category.accent}15`,\n color: category.accent\n }}\n >\n {category.label}\n </span>\n )}\n </div>\n\n {/* Current status badge */}\n <div className=\"flex items-center gap-2 mt-1\">\n <span\n className={cn(\n 'text-xs font-medium px-2 py-0.5 rounded',\n isClosed\n ? isCompleted\n ? 'bg-emerald-100 text-emerald-700'\n : 'bg-slate-100 text-slate-600'\n : 'bg-slate-100 text-slate-600'\n )}\n style={!isClosed && status?.accent ? {\n backgroundColor: `${status.accent}15`,\n color: status.accent\n } : undefined}\n >\n {status?.label || timeline.currentStatus}\n </span>\n </div>\n </div>\n\n {/* Click indicator */}\n <ChevronRight className={cn(\n 'w-5 h-5 text-slate-300 transition-all flex-shrink-0',\n 'group-hover:text-slate-400 group-hover:translate-x-0.5'\n )} />\n </div>\n </div>\n\n {/* Timeline events - GitHub commit-style */}\n {timeline.events.length > 0 && (\n <div className=\"border-t border-slate-100 px-4 py-3 bg-slate-50/50 rounded-b-xl\">\n <div className=\"relative pl-6\">\n {/* Vertical timeline line */}\n <div\n className=\"absolute left-[7px] top-1 bottom-1 w-0.5 rounded-full\"\n style={{ backgroundColor: `${statusColor}30` }}\n />\n\n {/* Events */}\n <div className=\"space-y-2\">\n {timeline.events.map((event, eventIndex) => {\n const eventConfig = getEventConfig(event)\n const isLast = eventIndex === timeline.events.length - 1\n\n return (\n <div key={event.id} className=\"relative flex items-start gap-2\">\n {/* Timeline dot */}\n <div\n className={cn(\n 'absolute -left-6 w-4 h-4 rounded-full flex items-center justify-center',\n isLast ? 'bg-white border-2' : 'bg-white'\n )}\n style={{\n borderColor: isLast ? statusColor : undefined\n }}\n >\n <div\n className=\"w-2 h-2 rounded-full\"\n style={{ backgroundColor: eventConfig.color }}\n />\n </div>\n\n {/* Event content */}\n <div className=\"flex-1 min-w-0 pb-0.5\">\n <p className=\"text-xs text-slate-600\">\n <span className=\"font-medium text-slate-700\">{event.actor || 'Someone'}</span>\n {' '}\n <span className=\"text-slate-500\">{eventConfig.action}</span>\n {eventConfig.suffix && (\n <span className=\"text-slate-500\">{' '}{eventConfig.suffix}</span>\n )}\n {event.details?.quoteAmount && (\n <span className=\"text-slate-500\">\n {' '}({event.details.quoteAmount.toLocaleString()})\n </span>\n )}\n </p>\n <p className=\"text-[11px] text-slate-400\">\n {format(new Date(event.timestamp), 'MMM d, h:mm a', { locale: enUS })}\n </p>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n )}\n </motion.div>\n )\n}\n\n// ============================================\n// Event Configuration Helper\n// ============================================\n\ninterface EventConfig {\n icon: typeof Plus\n color: string\n action: string\n suffix?: string\n}\n\nfunction getEventConfig(event: TimelineEvent): EventConfig {\n switch (event.type) {\n case 'created':\n return {\n icon: Plus,\n color: '#3b82f6', // blue\n action: 'opened this ticket'\n }\n\n case 'completed':\n return {\n icon: CheckCircle2,\n color: '#10b981', // green\n action: 'closed this as completed'\n }\n\n case 'wont_fix':\n return {\n icon: XCircle,\n color: '#64748b', // slate\n action: 'closed this',\n suffix: \"as won't fix\"\n }\n\n case 'status_changed':\n const toStatus = event.details?.toStatus\n const statusConfig = toStatus ? STATUSES[toStatus] : null\n\n if (toStatus === 'in_progress') {\n return {\n icon: Play,\n color: '#8b5cf6', // violet\n action: 'started working on this'\n }\n }\n if (toStatus === 'review') {\n return {\n icon: Eye,\n color: '#f59e0b', // amber\n action: 'marked this for review'\n }\n }\n if (toStatus === 'scheduled') {\n return {\n icon: Clock,\n color: '#3b82f6', // blue\n action: 'scheduled this'\n }\n }\n return {\n icon: GitCommit,\n color: statusConfig?.accent || '#64748b',\n action: `moved this to ${statusConfig?.label || toStatus}`\n }\n\n case 'comment_added':\n return {\n icon: MessageSquare,\n color: '#06b6d4', // cyan\n action: 'commented'\n }\n\n case 'quote_submitted':\n return {\n icon: Euro,\n color: '#f59e0b', // amber\n action: 'submitted a quote'\n }\n\n case 'quote_approved':\n return {\n icon: CheckCircle2,\n color: '#10b981', // green\n action: 'approved the quote'\n }\n\n case 'quote_rejected':\n return {\n icon: XCircle,\n color: '#ef4444', // red\n action: 'rejected the quote'\n }\n\n default:\n return {\n icon: GitCommit,\n color: '#64748b',\n action: 'updated'\n }\n }\n}\n\nexport default TimelineView\n","import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"../utils/cn\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","/**\n * Generate instruction text for a maintenance item or page comment\n *\n * Creates a concise, AI-friendly instruction that can be copied to clipboard\n * for manual management with tools like Claude, Cursor, etc.\n */\n\nimport { MaintenanceItem, MaintenanceQuote, CommentAttachment } from '@framed/core'\n\n// Minimal PageComment interface for instruction generation\n// Full PageComment type is in @framed/core phases/phase4\ninterface PageComment {\n comment: string\n resolved?: boolean\n screenshot_type?: 'desktop' | 'mobile'\n element_type?: string\n element_text?: string\n user_name: string\n attachments?: CommentAttachment[]\n metadata?: {\n source?: string\n pageUrl?: string\n pagePath?: string\n cssSelector?: string\n originalContent?: string\n newContent?: string\n }\n}\nimport { CATEGORIES, PRIORITIES, STATUSES } from '../constants'\n\n// ============================================\n// Phase 5 - Maintenance Item Instructions\n// ============================================\n\ninterface GenerateInstructionOptions {\n item: MaintenanceItem & { quote?: MaintenanceQuote }\n projectName?: string\n liveUrl?: string\n}\n\n/**\n * Generate a short, copyable instruction for a maintenance item (Phase 5)\n */\nexport function generateItemInstruction({\n item,\n projectName,\n liveUrl\n}: GenerateInstructionOptions): string {\n const category = CATEGORIES[item.category]\n const priority = PRIORITIES[item.priority]\n const status = STATUSES[item.status]\n\n const lines: string[] = []\n\n // Header with title and category\n lines.push(`# ${item.title}`)\n lines.push('')\n\n // Quick metadata line\n const metaParts: string[] = []\n metaParts.push(`**Category:** ${category?.label || item.category}`)\n metaParts.push(`**Priority:** ${priority?.label || item.priority}`)\n metaParts.push(`**Status:** ${status?.label || item.status}`)\n lines.push(metaParts.join(' | '))\n lines.push('')\n\n // Description\n if (item.description) {\n lines.push('## Description')\n lines.push('')\n lines.push(item.description)\n lines.push('')\n }\n\n // Location context\n if (item.page_name || item.page_url) {\n lines.push('## Location')\n lines.push('')\n if (item.page_name) {\n lines.push(`**Page:** ${item.page_name}`)\n }\n if (item.page_url) {\n lines.push(`**URL:** ${item.page_url}`)\n }\n if (item.element_selector) {\n lines.push(`**Element:** \\`${item.element_selector}\\``)\n }\n lines.push('')\n }\n\n // Project context if available\n if (projectName || liveUrl) {\n lines.push('## Project')\n lines.push('')\n if (projectName) {\n lines.push(`**Project:** ${projectName}`)\n }\n if (liveUrl) {\n lines.push(`**Live URL:** ${liveUrl}`)\n }\n lines.push('')\n }\n\n // Quote info if available\n if (item.quote && item.quote.estimated_hours) {\n lines.push('## Estimate')\n lines.push('')\n lines.push(`**Estimated hours:** ${item.quote.estimated_hours}h`)\n if (item.quote.quote_notes) {\n lines.push(`**Notes:** ${item.quote.quote_notes}`)\n }\n lines.push('')\n } else if (item.estimated_hours) {\n lines.push('## Estimate')\n lines.push('')\n lines.push(`**Estimated hours:** ${item.estimated_hours}h`)\n lines.push('')\n }\n\n // Attachments mention\n if (item.attachments && item.attachments.length > 0) {\n lines.push('## Attachments')\n lines.push('')\n lines.push(`${item.attachments.length} attachment(s) available - see original ticket for screenshots/files.`)\n lines.push('')\n } else if (item.screenshot_url) {\n lines.push('## Screenshot')\n lines.push('')\n lines.push(`Screenshot available: ${item.screenshot_url}`)\n lines.push('')\n }\n\n // Source info\n lines.push('---')\n lines.push(`*Source: ${item.source === 'widget' ? 'Widget feedback' : 'Manual entry'} by ${item.created_by_name || 'Unknown'}*`)\n\n return lines.join('\\n')\n}\n\n// ============================================\n// Phase 4 - Page Comment Instructions\n// ============================================\n\n// Category detection for Phase 4 comments (mirrors CommentsSidebarNew logic)\ntype CommentCategory = 'text_suggestion' | 'design' | 'content' | 'typo' | 'bug' | 'other'\n\nconst COMMENT_CATEGORY_LABELS: Record<CommentCategory, string> = {\n text_suggestion: 'Text Suggestion',\n design: 'Design',\n content: 'Content',\n typo: 'Typo',\n bug: 'Bug',\n other: 'Other'\n}\n\nfunction categorizeComment(comment: PageComment): CommentCategory {\n // First check if this is a text suggestion from the content editor\n if (comment.metadata?.source === 'content_editor') {\n return 'text_suggestion'\n }\n\n const text = comment.comment.toLowerCase()\n\n if (text.includes('typo') || text.includes('spelling') || text.includes('grammar') || text.includes('spelfout')) {\n return 'typo'\n }\n if (text.includes('design') || text.includes('color') || text.includes('font') || text.includes('layout') || text.includes('spacing')) {\n return 'design'\n }\n if (text.includes('bug') || text.includes('broken') || text.includes('error') || text.includes('not working')) {\n return 'bug'\n }\n if (text.includes('content') || text.includes('text') || text.includes('copy') || text.includes('wording')) {\n return 'content'\n }\n return 'other'\n}\n\ninterface GenerateCommentInstructionOptions {\n comment: PageComment\n pageName?: string\n projectName?: string\n demoUrl?: string\n}\n\n/**\n * Generate a short, copyable instruction for a page comment (Phase 4)\n */\nexport function generateCommentInstruction({\n comment,\n pageName,\n projectName,\n demoUrl\n}: GenerateCommentInstructionOptions): string {\n const category = categorizeComment(comment)\n const categoryLabel = COMMENT_CATEGORY_LABELS[category]\n\n const lines: string[] = []\n\n // Header - use element text or first part of comment as title\n const title = comment.element_text\n ? `\"${comment.element_text.substring(0, 50)}${comment.element_text.length > 50 ? '...' : ''}\"`\n : comment.comment.substring(0, 60) + (comment.comment.length > 60 ? '...' : '')\n lines.push(`# Feedback: ${title}`)\n lines.push('')\n\n // Quick metadata line\n const metaParts: string[] = []\n metaParts.push(`**Category:** ${categoryLabel}`)\n metaParts.push(`**Status:** ${comment.resolved ? 'Resolved' : 'Open'}`)\n metaParts.push(`**Viewport:** ${comment.screenshot_type === 'mobile' ? 'Mobile' : 'Desktop'}`)\n lines.push(metaParts.join(' | '))\n lines.push('')\n\n // Text suggestion with diff\n if (comment.metadata?.originalContent && comment.metadata?.newContent) {\n lines.push('## Text Change')\n lines.push('')\n lines.push('**Original:**')\n lines.push(`> ${comment.metadata.originalContent}`)\n lines.push('')\n lines.push('**Suggested:**')\n lines.push(`> ${comment.metadata.newContent}`)\n lines.push('')\n }\n\n // Comment text\n if (comment.comment && !comment.comment.startsWith('Text ')) {\n lines.push('## Feedback')\n lines.push('')\n lines.push(comment.comment)\n lines.push('')\n }\n\n // Element context\n if (comment.element_type || comment.element_text) {\n lines.push('## Element')\n lines.push('')\n if (comment.element_type) {\n lines.push(`**Type:** \\`<${comment.element_type}>\\``)\n }\n if (comment.element_text) {\n lines.push(`**Text:** \"${comment.element_text}\"`)\n }\n if (comment.metadata?.cssSelector) {\n lines.push(`**Selector:** \\`${comment.metadata.cssSelector}\\``)\n }\n lines.push('')\n }\n\n // Location context\n if (pageName || comment.metadata?.pageUrl) {\n lines.push('## Location')\n lines.push('')\n if (pageName) {\n lines.push(`**Page:** ${pageName}`)\n }\n if (comment.metadata?.pageUrl) {\n lines.push(`**URL:** ${comment.metadata.pageUrl}`)\n } else if (comment.metadata?.pagePath) {\n lines.push(`**Path:** ${comment.metadata.pagePath}`)\n }\n lines.push('')\n }\n\n // Project context if available\n if (projectName || demoUrl) {\n lines.push('## Project')\n lines.push('')\n if (projectName) {\n lines.push(`**Project:** ${projectName}`)\n }\n if (demoUrl) {\n lines.push(`**Demo URL:** ${demoUrl}`)\n }\n lines.push('')\n }\n\n // Attachments mention\n if (comment.attachments && comment.attachments.length > 0) {\n lines.push('## Attachments')\n lines.push('')\n lines.push(`${comment.attachments.length} attachment(s) available - see original feedback for screenshots/files.`)\n lines.push('')\n }\n\n // Source info\n lines.push('---')\n const source = comment.metadata?.source === 'widget' ? 'Widget' :\n comment.metadata?.source === 'content_editor' ? 'Content Editor' :\n comment.metadata?.source === 'screenshot' ? 'Screenshot Review' : 'App'\n lines.push(`*Source: ${source} by ${comment.user_name}*`)\n\n return lines.join('\\n')\n}\n","/**\n * DiffViewer - Visual diff display for text changes\n * Shows word-level differences between original and current text\n */\n\nimport React from 'react'\nimport { diffWords, Change } from 'diff'\nimport { cn } from '../utils/cn'\n\nexport interface DiffPart {\n value: string\n added?: boolean\n removed?: boolean\n}\n\n/**\n * Compute word-level diff between two strings\n */\nexport function computeTextDiff(original: string, current: string): DiffPart[] {\n return diffWords(original, current) as DiffPart[]\n}\n\nexport interface DiffViewerProps {\n original: string\n current: string\n mode?: 'inline' | 'side-by-side'\n className?: string\n showLegend?: boolean\n}\n\nexport function DiffViewer({\n original,\n current,\n mode = 'inline',\n className,\n showLegend = false\n}: DiffViewerProps) {\n const diff = computeTextDiff(original, current)\n\n if (mode === 'side-by-side') {\n return (\n <div className={cn('grid grid-cols-2 gap-4', className)}>\n <div className=\"space-y-2\">\n <div className=\"text-xs font-medium text-slate-500 uppercase tracking-wide\">\n Origineel\n </div>\n <div className=\"p-3 bg-red-50 border border-red-200 rounded-lg text-sm\">\n {renderOriginalText(diff)}\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-xs font-medium text-slate-500 uppercase tracking-wide\">\n Aangepast\n </div>\n <div className=\"p-3 bg-green-50 border border-green-200 rounded-lg text-sm\">\n {renderCurrentText(diff)}\n </div>\n </div>\n </div>\n )\n }\n\n // Inline mode (default)\n return (\n <div className={cn('space-y-2', className)}>\n <div className=\"text-sm leading-relaxed whitespace-pre-wrap\">\n {diff.map((part, index) => (\n <DiffSpan key={index} part={part} />\n ))}\n </div>\n {showLegend && <DiffLegend />}\n </div>\n )\n}\n\n/**\n * Single diff span with appropriate styling\n */\nfunction DiffSpan({ part }: { part: DiffPart }) {\n if (part.added) {\n return (\n <span className=\"bg-green-100 text-green-800 px-0.5 rounded decoration-2\">\n {part.value}\n </span>\n )\n }\n\n if (part.removed) {\n return (\n <span className=\"bg-red-100 text-red-800 line-through px-0.5 rounded decoration-2\">\n {part.value}\n </span>\n )\n }\n\n return <span className=\"text-slate-700\">{part.value}</span>\n}\n\n/**\n * Render only original text (for side-by-side removed parts)\n */\nfunction renderOriginalText(diff: DiffPart[]) {\n return diff.map((part, index) => {\n if (part.added) return null\n if (part.removed) {\n return (\n <span key={index} className=\"bg-red-200 text-red-900 px-0.5 rounded\">\n {part.value}\n </span>\n )\n }\n return <span key={index} className=\"text-slate-700\">{part.value}</span>\n })\n}\n\n/**\n * Render only current text (for side-by-side added parts)\n */\nfunction renderCurrentText(diff: DiffPart[]) {\n return diff.map((part, index) => {\n if (part.removed) return null\n if (part.added) {\n return (\n <span key={index} className=\"bg-green-200 text-green-900 px-0.5 rounded\">\n {part.value}\n </span>\n )\n }\n return <span key={index} className=\"text-slate-700\">{part.value}</span>\n })\n}\n\n/**\n * Legend explaining diff colors\n */\nfunction DiffLegend() {\n return (\n <div className=\"flex items-center gap-4 text-xs text-slate-500 pt-2 border-t\">\n <div className=\"flex items-center gap-1\">\n <span className=\"w-3 h-3 bg-red-100 border border-red-200 rounded\" />\n <span>Removed</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"w-3 h-3 bg-green-100 border border-green-200 rounded\" />\n <span>Added</span>\n </div>\n </div>\n )\n}\n\n/**\n * Compact inline diff for use in lists/tables\n */\nexport function CompactDiff({\n original,\n current,\n maxLength = 100\n}: {\n original: string\n current: string\n maxLength?: number\n}) {\n const diff = computeTextDiff(original, current)\n let charCount = 0\n const truncated: DiffPart[] = []\n\n for (const part of diff) {\n if (charCount >= maxLength) break\n const remaining = maxLength - charCount\n if (part.value.length <= remaining) {\n truncated.push(part)\n charCount += part.value.length\n } else {\n truncated.push({ ...part, value: part.value.slice(0, remaining) + '...' })\n charCount = maxLength\n }\n }\n\n return (\n <span className=\"text-sm\">\n {truncated.map((part, index) => (\n <DiffSpan key={index} part={part} />\n ))}\n </span>\n )\n}\n\nexport default DiffViewer\n","/**\n * ItemDetailDrawer - Slide-out panel for viewing and editing items\n *\n * Features:\n * - Full item details\n * - Quote workflow (request, submit, approve/reject)\n * - Status management\n * - Comments\n * - Activity timeline\n * - Time logging\n * - Internal notes (agency only)\n */\n\nimport { useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { motion } from 'framer-motion'\nimport {\n X,\n ChevronRight,\n MessageSquare,\n Calendar,\n Clock,\n User,\n AlertTriangle,\n CheckCircle2,\n Euro,\n Send,\n ThumbsUp,\n ThumbsDown,\n Edit3,\n Trash2,\n ExternalLink,\n FileText,\n History,\n Tag,\n Plus,\n StickyNote,\n Lock,\n Pin,\n Image,\n Paperclip,\n Video,\n Download,\n Copy,\n Check\n} from 'lucide-react'\nimport { formatDistanceToNow, format } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn } from '../utils/cn'\nimport {\n MaintenanceItem,\n MaintenanceItemStatus,\n MaintenanceQuote,\n MaintenanceComment,\n TimeEntry,\n InternalNote,\n CommentAttachment\n} from '@framed/core'\nimport { CATEGORIES, PRIORITIES, STATUSES, STATUS_ORDER, QUOTE_STATUSES, PRIORITY_ORDER } from '../constants'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport { generateItemInstruction } from '../utils/maintenanceItemInstruction'\nimport { CompactDiff } from './DiffViewer'\n\n// Note: These hooks and components will be available after US-011, US-012, and US-017\n// For now, they are stubbed to allow the component to compile\n// import { useTimeTracking } from '../hooks/useTimeTracking'\n// import { useInternalNotes } from '../hooks/useInternalNotes'\n// import { LogTimeModal } from './LogTimeModal'\n// import { MaintenanceCommentThread } from './MaintenanceCommentThread'\n\ninterface ItemDetailDrawerProps {\n item: MaintenanceItem & { quote?: MaintenanceQuote }\n projectId?: string\n projectName?: string\n liveUrl?: string\n agencyId?: string\n onClose: () => void\n onUpdate: (updates: Partial<MaintenanceItem>) => Promise<void>\n onDelete: () => Promise<void>\n onStatusChange: (status: MaintenanceItemStatus) => Promise<void>\n onSubmitQuote?: (quote: Partial<MaintenanceQuote>) => Promise<void>\n onRespondToQuote?: (approved: boolean, notes?: string) => Promise<void>\n // Comment handlers\n onAddComment?: (comment: string, isInternal: boolean, parentId?: string, mentions?: string[]) => Promise<void>\n onEditComment?: (commentId: string, newText: string) => Promise<void>\n onDeleteComment?: (commentId: string) => Promise<void>\n availableUsers?: Array<{ id: string; name: string }>\n isAgency: boolean\n canEdit: boolean\n // Time tracking hooks (injected from parent until US-017 is complete)\n timeTrackingHooks?: {\n timeEntries: TimeEntry[]\n createTimeEntry: (entry: {\n maintenance_item_id?: string\n logged_date: string\n duration_minutes: number\n description?: string\n billable?: boolean\n }) => Promise<TimeEntry | null>\n deleteTimeEntry: (id: string) => Promise<boolean>\n loading: boolean\n }\n // Internal notes hooks (injected from parent until US-017 is complete)\n internalNotesHooks?: {\n notes: InternalNote[]\n addNote: (body: string) => Promise<InternalNote | null>\n updateNote: (id: string, body: string) => Promise<boolean>\n deleteNote: (id: string) => Promise<boolean>\n togglePin: (id: string) => Promise<boolean>\n loading: boolean\n }\n}\n\ntype Tab = 'details' | 'quote' | 'time' | 'notes'\n\nexport const ItemDetailDrawer = ({\n item,\n projectId,\n projectName,\n liveUrl,\n agencyId,\n onClose,\n onUpdate,\n onDelete,\n onStatusChange,\n onSubmitQuote,\n onRespondToQuote,\n onAddComment,\n onEditComment,\n onDeleteComment,\n availableUsers = [],\n isAgency,\n canEdit,\n timeTrackingHooks,\n internalNotesHooks\n}: ItemDetailDrawerProps) => {\n const [activeTab, setActiveTab] = useState<Tab>('details')\n const [isDeleting, setIsDeleting] = useState(false)\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false)\n const [showLogTimeModal, setShowLogTimeModal] = useState(false)\n const [copied, setCopied] = useState(false)\n\n // Time tracking for this item (use injected hooks or defaults)\n const timeEntries = timeTrackingHooks?.timeEntries.filter(e => e.maintenance_item_id === item.id) || []\n const totalTimeForItem = timeEntries.reduce((sum, e) => sum + e.duration_minutes, 0)\n const loadingTime = timeTrackingHooks?.loading || false\n\n // Internal notes for this item (use injected hooks or defaults)\n const internalNotes = internalNotesHooks?.notes || []\n const loadingNotes = internalNotesHooks?.loading || false\n\n const category = CATEGORIES[item.category]\n const priority = PRIORITIES[item.priority]\n const status = STATUSES[item.status]\n const CategoryIcon = category?.icon\n\n const quote = item.quote\n const hasQuote = !!quote\n const isCompleted = item.status === 'completed'\n const isWontFix = item.status === 'wont_fix'\n\n // Handle delete\n const handleDelete = async () => {\n setIsDeleting(true)\n try {\n await onDelete()\n onClose()\n } finally {\n setIsDeleting(false)\n setShowDeleteConfirm(false)\n }\n }\n\n // Handle copy instruction\n const handleCopyInstruction = async () => {\n const instruction = generateItemInstruction({\n item,\n projectName,\n liveUrl\n })\n\n try {\n await navigator.clipboard.writeText(instruction)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error('Failed to copy instruction:', err)\n }\n }\n\n // Tabs - time and notes only for agency\n // Comments are now integrated into Details tab, so we remove the separate activity tab\n const tabs: { id: Tab; label: string; count?: number; agencyOnly?: boolean }[] = [\n { id: 'details', label: 'Details', count: item.comments?.length || undefined },\n { id: 'quote', label: 'Quote', count: hasQuote ? 1 : undefined },\n { id: 'time', label: 'Time', count: timeEntries.length || undefined, agencyOnly: true },\n { id: 'notes', label: 'Notes', count: internalNotes.length || undefined, agencyOnly: true }\n ]\n\n const filteredTabs = tabs.filter(tab => !tab.agencyOnly || isAgency)\n\n return createPortal(\n <>\n {/* Backdrop */}\n <div\n onClick={onClose}\n className=\"fixed inset-0 bg-black/30 backdrop-blur-sm z-40\"\n />\n\n {/* Drawer */}\n <div className=\"fixed right-0 top-0 bottom-0 w-full max-w-lg z-50 bg-white border-l border-slate-200 flex flex-col shadow-xl\">\n {/* Header */}\n <div className=\"flex-shrink-0 p-4 border-b border-slate-100\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex items-start gap-3\">\n {/* Category Icon */}\n <div\n className=\"w-12 h-12 rounded-xl flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: `${category?.accent}15` }}\n >\n {CategoryIcon && (\n <CategoryIcon\n className=\"w-6 h-6\"\n style={{ color: category?.accent }}\n />\n )}\n </div>\n\n <div>\n <h2 className={cn(\n 'text-lg font-semibold',\n isWontFix ? 'text-slate-400 line-through' : 'text-slate-900'\n )}>\n {item.title}\n </h2>\n <div className=\"flex items-center gap-2 mt-1\">\n <span className=\"text-xs text-slate-500\">\n {category?.label}\n </span>\n <span className=\"text-slate-300\">•</span>\n <span\n className=\"text-xs font-medium\"\n style={{ color: priority?.accent }}\n >\n {priority?.label}\n </span>\n </div>\n </div>\n </div>\n\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg text-slate-400 hover:text-slate-600 hover:bg-slate-100 transition-colors\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Status workflow */}\n <div className=\"mt-4\">\n <StatusWorkflow\n currentStatus={item.status}\n onStatusChange={onStatusChange}\n canEdit={canEdit}\n />\n </div>\n\n {/* Tabs */}\n <div className=\"flex items-center gap-1 mt-4 -mb-4 pb-px overflow-x-auto\">\n {filteredTabs.map(tab => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'px-3 py-2 rounded-t-lg text-sm font-medium transition-all relative',\n activeTab === tab.id\n ? 'text-slate-900 bg-slate-50'\n : 'text-slate-500 hover:text-slate-700'\n )}\n >\n {tab.label}\n {tab.count !== undefined && (\n <span className={cn(\n 'ml-1.5 px-1.5 py-0.5 rounded text-[10px] font-bold',\n activeTab === tab.id\n ? 'bg-powder-blue-100 text-powder-blue-700'\n : 'bg-slate-100 text-slate-500'\n )}>\n {tab.count}\n </span>\n )}\n {activeTab === tab.id && (\n <motion.div\n layoutId=\"activeTab\"\n className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-powder-blue-500\"\n />\n )}\n </button>\n ))}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto\">\n {activeTab === 'details' && (\n <DetailsTab\n item={item}\n onUpdate={onUpdate}\n canEdit={canEdit}\n comments={item.comments || []}\n onAddComment={onAddComment}\n onEditComment={onEditComment}\n onDeleteComment={onDeleteComment}\n availableUsers={availableUsers}\n />\n )}\n\n {activeTab === 'quote' && (\n <QuoteTab\n item={item}\n quote={quote}\n onSubmitQuote={onSubmitQuote}\n onRespondToQuote={onRespondToQuote}\n isAgency={isAgency}\n canEdit={canEdit}\n />\n )}\n\n {activeTab === 'time' && isAgency && (\n <TimeTab\n timeEntries={timeEntries}\n totalMinutes={totalTimeForItem}\n onLogTime={() => setShowLogTimeModal(true)}\n onDeleteEntry={timeTrackingHooks?.deleteTimeEntry || (async () => false)}\n isLoading={loadingTime}\n canEdit={canEdit}\n />\n )}\n\n {activeTab === 'notes' && isAgency && (\n <NotesTab\n notes={internalNotes}\n onAddNote={internalNotesHooks?.addNote || (async () => null)}\n onUpdateNote={internalNotesHooks?.updateNote || (async () => false)}\n onDeleteNote={internalNotesHooks?.deleteNote || (async () => false)}\n onTogglePin={internalNotesHooks?.togglePin || (async () => false)}\n isLoading={loadingNotes}\n canEdit={canEdit}\n />\n )}\n </div>\n\n {/* Log Time Modal - placeholder until US-011 */}\n {/* {showLogTimeModal && (\n <LogTimeModal\n itemId={item.id}\n itemTitle={item.title}\n onClose={() => setShowLogTimeModal(false)}\n onSubmit={async (entry) => {\n if (timeTrackingHooks?.createTimeEntry) {\n const result = await timeTrackingHooks.createTimeEntry({\n maintenance_item_id: item.id,\n logged_date: entry.logged_date || new Date().toISOString().split('T')[0],\n duration_minutes: entry.duration_minutes,\n description: entry.description,\n billable: entry.billable\n })\n if (!result) {\n throw new Error('Failed to log time. Please try again.')\n }\n }\n }}\n />\n )} */}\n\n {/* Footer */}\n <div className=\"flex-shrink-0 p-4 border-t border-slate-100 bg-slate-50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-xs text-slate-500\">\n Created {formatDistanceToNow(new Date(item.created_at), { addSuffix: true, locale: enUS })}\n {item.created_by_name && ` by ${item.created_by_name}`}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Copy Instruction Button */}\n <button\n onClick={handleCopyInstruction}\n className={cn(\n 'p-2 rounded-lg transition-colors',\n copied\n ? 'text-emerald-600 bg-emerald-50'\n : 'text-slate-400 hover:text-slate-600 hover:bg-slate-100'\n )}\n title={copied ? 'Copied!' : 'Copy instruction'}\n >\n {copied ? <Check className=\"w-4 h-4\" /> : <Copy className=\"w-4 h-4\" />}\n </button>\n\n {canEdit && (\n <>\n {!showDeleteConfirm ? (\n <button\n onClick={() => setShowDeleteConfirm(true)}\n className=\"p-2 rounded-lg text-slate-400 hover:text-rose-600 hover:bg-rose-50 transition-colors\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n ) : (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setShowDeleteConfirm(false)}\n className=\"px-3 py-1.5 rounded-lg text-sm text-slate-600 hover:text-slate-900 hover:bg-slate-100\"\n >\n Cancel\n </button>\n <button\n onClick={handleDelete}\n disabled={isDeleting}\n className=\"px-3 py-1.5 rounded-lg text-sm font-medium bg-rose-600 hover:bg-rose-500 text-white disabled:opacity-50\"\n >\n {isDeleting ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n </>,\n document.body\n )\n}\n\n// ============================================\n// Status Workflow\n// ============================================\n\ninterface StatusWorkflowProps {\n currentStatus: MaintenanceItemStatus\n onStatusChange: (status: MaintenanceItemStatus) => Promise<void>\n canEdit: boolean\n}\n\nconst StatusWorkflow = ({\n currentStatus,\n onStatusChange,\n canEdit\n}: StatusWorkflowProps) => {\n const [isChanging, setIsChanging] = useState(false)\n\n const handleStatusChange = async (status: MaintenanceItemStatus) => {\n if (!canEdit || isChanging) return\n setIsChanging(true)\n try {\n await onStatusChange(status)\n } finally {\n setIsChanging(false)\n }\n }\n\n const currentIndex = STATUS_ORDER.indexOf(currentStatus as typeof STATUS_ORDER[number])\n\n return (\n <div className=\"flex items-center gap-1\">\n {STATUS_ORDER.map((status, index) => {\n const config = STATUSES[status]!\n const isActive = status === currentStatus\n const isPast = index < currentIndex\n const isNext = index === currentIndex + 1\n\n return (\n <button\n key={status}\n onClick={() => handleStatusChange(status)}\n disabled={!canEdit || isChanging}\n className={cn(\n 'flex-1 h-8 rounded-lg text-xs font-medium transition-all relative overflow-hidden border',\n isActive\n ? 'text-white border-transparent'\n : isPast\n ? 'text-slate-600 border-slate-200'\n : 'text-slate-400 border-slate-100 hover:border-slate-200 hover:text-slate-500',\n canEdit && !isChanging && 'hover:scale-[1.02]',\n 'disabled:cursor-default'\n )}\n style={isActive ? {\n backgroundColor: config.accent,\n color: 'white'\n } : isPast ? {\n backgroundColor: `${config.accent}10`\n } : undefined}\n >\n <span className=\"relative z-10\">{config.label}</span>\n </button>\n )\n })}\n\n {/* Won't Fix */}\n {currentStatus === 'wont_fix' && STATUSES.wont_fix && (\n <div\n className=\"flex-1 h-8 rounded-lg text-xs font-medium flex items-center justify-center text-white\"\n style={{ backgroundColor: STATUSES.wont_fix.accent }}\n >\n {STATUSES.wont_fix.label}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Details Tab\n// ============================================\n\ninterface DetailsTabProps {\n item: MaintenanceItem\n onUpdate: (updates: Partial<MaintenanceItem>) => Promise<void>\n canEdit: boolean\n // Comment handlers for integrated comments\n comments?: MaintenanceComment[]\n onAddComment?: (comment: string, isInternal: boolean, parentId?: string, mentions?: string[]) => Promise<void>\n onEditComment?: (commentId: string, newText: string) => Promise<void>\n onDeleteComment?: (commentId: string) => Promise<void>\n availableUsers?: Array<{ id: string; name: string }>\n}\n\nconst DetailsTab = ({\n item,\n onUpdate,\n canEdit,\n comments = [],\n onAddComment,\n onEditComment,\n onDeleteComment,\n availableUsers = []\n}: DetailsTabProps) => {\n const [isUpdating, setIsUpdating] = useState(false)\n\n const handlePriorityChange = async (newPriority: string) => {\n if (!canEdit || isUpdating) return\n setIsUpdating(true)\n try {\n await onUpdate({ priority: newPriority as MaintenanceItem['priority'] })\n } finally {\n setIsUpdating(false)\n }\n }\n\n const handleCategoryChange = async (newCategory: string) => {\n if (!canEdit || isUpdating) return\n setIsUpdating(true)\n try {\n await onUpdate({ category: newCategory as MaintenanceItem['category'] })\n } finally {\n setIsUpdating(false)\n }\n }\n\n return (\n <div className=\"p-4 space-y-6\">\n {/* Priority & Category Editors */}\n <div className=\"grid grid-cols-2 gap-4\">\n {/* Priority */}\n <div>\n <h3 className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2\">\n Priority\n </h3>\n {canEdit ? (\n <Select\n value={item.priority}\n onValueChange={handlePriorityChange}\n disabled={isUpdating}\n >\n <SelectTrigger className=\"w-full h-9 bg-white\">\n <SelectValue>\n <span\n className=\"font-medium\"\n style={{ color: PRIORITIES[item.priority]?.accent }}\n >\n {PRIORITIES[item.priority]?.label}\n </span>\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {PRIORITY_ORDER.map((priorityKey) => {\n const priorityConfig = PRIORITIES[priorityKey]!\n return (\n <SelectItem key={priorityKey} value={priorityKey}>\n <span\n className=\"font-medium\"\n style={{ color: priorityConfig.accent }}\n >\n {priorityConfig.label}\n </span>\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n ) : (\n <div className=\"flex items-center gap-2 text-slate-700\">\n <span\n className=\"text-sm font-medium\"\n style={{ color: PRIORITIES[item.priority]?.accent }}\n >\n {PRIORITIES[item.priority]?.label}\n </span>\n </div>\n )}\n </div>\n\n {/* Category */}\n <div>\n <h3 className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2\">\n Category\n </h3>\n {canEdit ? (\n <Select\n value={item.category}\n onValueChange={handleCategoryChange}\n disabled={isUpdating}\n >\n <SelectTrigger className=\"w-full h-9 bg-white\">\n <SelectValue>\n <div className=\"flex items-center gap-2\">\n {CATEGORIES[item.category]?.icon && (\n <span style={{ color: CATEGORIES[item.category]?.accent }}>\n {(() => {\n const Icon = CATEGORIES[item.category]!.icon\n return <Icon className=\"w-4 h-4\" />\n })()}\n </span>\n )}\n <span>{CATEGORIES[item.category]?.label}</span>\n </div>\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {Object.entries(CATEGORIES).map(([categoryKey, categoryConfig]) => {\n const Icon = categoryConfig.icon\n return (\n <SelectItem key={categoryKey} value={categoryKey}>\n <div className=\"flex items-center gap-2\">\n <span style={{ color: categoryConfig.accent }}>\n <Icon className=\"w-4 h-4\" />\n </span>\n <span>{categoryConfig.label}</span>\n </div>\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n ) : (\n <div className=\"flex items-center gap-2 text-slate-700\">\n {CATEGORIES[item.category]?.icon && (\n <span style={{ color: CATEGORIES[item.category]?.accent }}>\n {(() => {\n const Icon = CATEGORIES[item.category]!.icon\n return <Icon className=\"w-4 h-4\" />\n })()}\n </span>\n )}\n <span className=\"text-sm\">{CATEGORIES[item.category]?.label}</span>\n </div>\n )}\n </div>\n </div>\n\n {/* Description */}\n <div>\n <h3 className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2\">\n Description\n </h3>\n\n {/* Check if this is a text-edit item with metadata */}\n {item.metadata?.type === 'text-edit' && item.metadata.originalContent && item.metadata.newContent ? (\n <div className=\"space-y-3\">\n {/* Text Edit Badge */}\n <div className=\"inline-flex items-center gap-1.5 px-2.5 py-1 bg-violet-100 text-violet-700 rounded-md text-xs font-medium\">\n <Edit3 className=\"w-3 h-3\" />\n Text Change\n </div>\n\n {/* Diff Display */}\n <div className=\"p-4 bg-slate-50 rounded-xl border border-slate-200\">\n <div className=\"space-y-3\">\n {/* Original */}\n <div>\n <span className=\"text-xs font-medium text-slate-500 uppercase tracking-wide block mb-1\">\n Before\n </span>\n <div className=\"p-3 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-sm text-red-800 line-through\">\n {item.metadata.originalContent}\n </p>\n </div>\n </div>\n\n {/* New */}\n <div>\n <span className=\"text-xs font-medium text-slate-500 uppercase tracking-wide block mb-1\">\n After\n </span>\n <div className=\"p-3 bg-green-50 border border-green-200 rounded-lg\">\n <p className=\"text-sm text-green-800\">\n {item.metadata.newContent}\n </p>\n </div>\n </div>\n\n {/* Inline Diff */}\n <div className=\"pt-3 border-t border-slate-200\">\n <span className=\"text-xs font-medium text-slate-500 uppercase tracking-wide block mb-2\">\n Changes\n </span>\n <div className=\"p-3 bg-white rounded-lg border border-slate-200\">\n <CompactDiff\n original={item.metadata.originalContent}\n current={item.metadata.newContent}\n maxLength={500}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n ) : (\n <p className=\"text-slate-700 text-sm leading-relaxed\">\n {item.description || 'No description provided.'}\n </p>\n )}\n </div>\n\n {/* Attachments - Screenshots, Videos, Files */}\n {item.attachments && item.attachments.length > 0 && (\n <div>\n <h3 className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2\">\n Attachments\n </h3>\n <div className=\"space-y-3\">\n {item.attachments.map((attachment: CommentAttachment, index: number) => {\n const isImage = attachment.file_type?.startsWith('image/')\n const isVideo = attachment.file_type?.startsWith('video/')\n\n return (\n <div key={attachment.id || index} className=\"rounded-lg border border-slate-200 overflow-hidden bg-slate-50\">\n {/* Image preview */}\n {isImage && attachment.file_url && (\n <a\n href={attachment.file_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block\"\n >\n <img\n src={attachment.file_url}\n alt={attachment.file_name || 'Screenshot'}\n className=\"w-full h-48 object-cover hover:opacity-90 transition-opacity\"\n />\n </a>\n )}\n\n {/* Video preview */}\n {isVideo && attachment.file_url && (\n <video\n src={attachment.file_url}\n controls\n className=\"w-full h-48 bg-black\"\n />\n )}\n\n {/* File info bar */}\n <div className=\"px-3 py-2 flex items-center justify-between border-t border-slate-200 bg-white\">\n <div className=\"flex items-center gap-2 text-sm text-slate-600 truncate\">\n {isImage ? (\n <Image className=\"w-4 h-4 text-slate-400 flex-shrink-0\" />\n ) : isVideo ? (\n <Video className=\"w-4 h-4 text-slate-400 flex-shrink-0\" />\n ) : (\n <Paperclip className=\"w-4 h-4 text-slate-400 flex-shrink-0\" />\n )}\n <span className=\"truncate\">{attachment.file_name || 'Attachment'}</span>\n {attachment.file_size && (\n <span className=\"text-slate-400 text-xs flex-shrink-0\">\n ({(attachment.file_size / 1024).toFixed(0)} KB)\n </span>\n )}\n </div>\n {attachment.file_url && (\n <a\n href={attachment.file_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-slate-400 hover:text-slate-600 flex-shrink-0\"\n title=\"Download\"\n >\n <Download className=\"w-4 h-4\" />\n </a>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Screenshot (legacy field) */}\n {item.screenshot_url && !item.attachments?.length && (\n <div>\n <h3 className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2\">\n Screenshot\n </h3>\n <a\n href={item.screenshot_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block rounded-lg border border-slate-200 overflow-hidden\"\n >\n <img\n src={item.screenshot_url}\n alt=\"Screenshot\"\n className=\"w-full h-48 object-cover hover:opacity-90 transition-opacity\"\n />\n </a>\n </div>\n )}\n\n {/* Comments Section - placeholder until US-012 */}\n <div>\n <h3 className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-3\">\n Comments {comments.length > 0 && <span className=\"text-slate-400\">({comments.length})</span>}\n </h3>\n {/* MaintenanceCommentThread will be available after US-012 */}\n <div className=\"text-sm text-slate-500 italic p-4 bg-slate-50 rounded-lg\">\n Comment thread component will be available after US-012\n </div>\n {/* <MaintenanceCommentThread\n comments={comments}\n onAddComment={onAddComment || (async () => {})}\n onEditComment={onEditComment || (async () => {})}\n onDeleteComment={onDeleteComment || (async () => {})}\n canEdit={canEdit && !!onAddComment}\n availableUsers={availableUsers}\n /> */}\n </div>\n\n {/* Metadata Section - now at the bottom */}\n <div className=\"pt-4 border-t border-slate-100 space-y-4\">\n {/* Page Info */}\n {(item.page_name || item.page_url) && (\n <div>\n <span className=\"text-xs text-slate-500 block mb-1\">Location</span>\n <div className=\"flex items-center gap-2\">\n {item.page_name && (\n <span className=\"text-slate-700 text-sm\">{item.page_name}</span>\n )}\n {item.page_url && (\n <a\n href={item.page_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-powder-blue-600 hover:text-powder-blue-700 text-sm flex items-center gap-1\"\n >\n <ExternalLink className=\"w-3 h-3\" />\n Open\n </a>\n )}\n </div>\n </div>\n )}\n\n {/* Source & Created By */}\n <div className=\"grid grid-cols-2 gap-4\">\n {/* Source */}\n <div>\n <span className=\"text-xs text-slate-500 block mb-1\">Source</span>\n <div className=\"flex items-center gap-2\">\n {item.source === 'widget' ? (\n <span className=\"inline-flex items-center gap-1.5 px-2 py-1 rounded-md bg-amber-50 text-amber-700 text-xs font-medium\">\n <MessageSquare className=\"w-3 h-3\" />\n Widget Feedback\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-1.5 px-2 py-1 rounded-md bg-slate-100 text-slate-600 text-xs font-medium\">\n <FileText className=\"w-3 h-3\" />\n Manual Entry\n </span>\n )}\n </div>\n </div>\n\n {/* Created By */}\n <div>\n <span className=\"text-xs text-slate-500 block mb-1\">Created By</span>\n <div className=\"flex items-center gap-2 text-slate-700\">\n <User className=\"w-4 h-4 text-slate-400\" />\n <span className=\"text-sm\">{item.created_by_name || 'Unknown'}</span>\n </div>\n </div>\n </div>\n\n {/* Due Date & Estimate */}\n <div className=\"grid grid-cols-2 gap-4\">\n {/* Due Date */}\n <div>\n <span className=\"text-xs text-slate-500 block mb-1\">Due Date</span>\n <div className=\"flex items-center gap-2 text-slate-700\">\n <Calendar className=\"w-4 h-4 text-slate-400\" />\n <span className=\"text-sm\">\n {item.due_date\n ? format(new Date(item.due_date), 'MMMM d, yyyy', { locale: enUS })\n : 'Not set'}\n </span>\n </div>\n </div>\n\n {/* Estimated Hours */}\n <div>\n <span className=\"text-xs text-slate-500 block mb-1\">Estimate</span>\n <div className=\"flex items-center gap-2 text-slate-700\">\n <Clock className=\"w-4 h-4 text-slate-400\" />\n <span className=\"text-sm\">\n {item.estimated_hours\n ? `${item.estimated_hours} hours`\n : 'Not estimated'}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Resolution */}\n {item.status === 'completed' && item.resolved_at && (\n <div className=\"p-4 rounded-xl bg-emerald-50 border border-emerald-200\">\n <div className=\"flex items-center gap-2 mb-2\">\n <CheckCircle2 className=\"w-4 h-4 text-emerald-600\" />\n <h3 className=\"text-sm font-medium text-emerald-700\">Completed</h3>\n </div>\n <p className=\"text-sm text-emerald-600\">\n {item.resolved_by_name && `by ${item.resolved_by_name} `}\n {formatDistanceToNow(new Date(item.resolved_at), { addSuffix: true, locale: enUS })}\n </p>\n {item.resolution_notes && (\n <p className=\"mt-2 text-sm text-emerald-700\">\n {item.resolution_notes}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Quote Tab\n// ============================================\n\ninterface QuoteTabProps {\n item: MaintenanceItem\n quote?: MaintenanceQuote\n onSubmitQuote?: (quote: Partial<MaintenanceQuote>) => Promise<void>\n onRespondToQuote?: (approved: boolean, notes?: string) => Promise<void>\n isAgency: boolean\n canEdit: boolean\n}\n\nconst QuoteTab = ({\n item,\n quote,\n onSubmitQuote,\n onRespondToQuote,\n isAgency,\n canEdit\n}: QuoteTabProps) => {\n const [estimatedHours, setEstimatedHours] = useState(quote?.estimated_hours || 0)\n const [hourlyRate, setHourlyRate] = useState(quote?.hourly_rate || 85)\n const [quoteNotes, setQuoteNotes] = useState(quote?.quote_notes || '')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [responseNotes, setResponseNotes] = useState('')\n\n const totalPrice = estimatedHours * hourlyRate\n\n // Handle submit quote (agency)\n const handleSubmitQuote = async () => {\n if (!onSubmitQuote || isSubmitting) return\n setIsSubmitting(true)\n try {\n await onSubmitQuote({\n status: 'quoted',\n estimated_hours: estimatedHours,\n hourly_rate: hourlyRate,\n fixed_price: totalPrice,\n currency: 'EUR',\n quote_notes: quoteNotes,\n revision_number: (quote?.revision_number || 0) + 1\n })\n } finally {\n setIsSubmitting(false)\n }\n }\n\n // Handle respond to quote (client)\n const handleRespond = async (approved: boolean) => {\n if (!onRespondToQuote || isSubmitting) return\n setIsSubmitting(true)\n try {\n await onRespondToQuote(approved, responseNotes)\n } finally {\n setIsSubmitting(false)\n }\n }\n\n // No quote yet\n if (!quote && !isAgency) {\n return (\n <div className=\"p-4\">\n <div className=\"text-center py-8\">\n <div className=\"w-12 h-12 mx-auto mb-4 rounded-xl bg-slate-100 flex items-center justify-center\">\n <Euro className=\"w-6 h-6 text-slate-300\" />\n </div>\n <h3 className=\"text-slate-900 font-medium mb-2\">Request Quote</h3>\n <p className=\"text-slate-500 text-sm max-w-xs mx-auto\">\n This item requires a cost estimate. The agency will prepare a quote.\n </p>\n {canEdit && onSubmitQuote && (\n <button\n onClick={() => onSubmitQuote({ status: 'pending_review', revision_number: 1 })}\n className=\"mt-4 px-4 py-2 rounded-lg bg-powder-blue-600 hover:bg-powder-blue-700 text-white text-sm font-medium transition-colors\"\n >\n Request Quote\n </button>\n )}\n </div>\n </div>\n )\n }\n\n // Agency: Create/edit quote\n if (isAgency && (!quote || quote.status === 'pending_review' || quote.status === 'rejected')) {\n return (\n <div className=\"p-4 space-y-6\">\n <div>\n <h3 className=\"text-sm font-medium text-slate-900 mb-4\">Create Quote</h3>\n\n {/* Hours Input */}\n <div className=\"mb-4\">\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n Estimated Hours\n </label>\n <input\n type=\"number\"\n min=\"0\"\n step=\"0.5\"\n value={estimatedHours}\n onChange={(e) => setEstimatedHours(parseFloat(e.target.value) || 0)}\n className=\"w-full px-4 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500\"\n />\n </div>\n\n {/* Rate Input */}\n <div className=\"mb-4\">\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n Hourly Rate (€)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n value={hourlyRate}\n onChange={(e) => setHourlyRate(parseFloat(e.target.value) || 0)}\n className=\"w-full px-4 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500\"\n />\n </div>\n\n {/* Total */}\n <div className=\"p-4 rounded-xl bg-powder-blue-50 border border-powder-blue-200 mb-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-slate-600\">Total</span>\n <span className=\"text-2xl font-bold text-slate-900\">\n €{totalPrice.toLocaleString('en-US')}\n </span>\n </div>\n </div>\n\n {/* Notes */}\n <div className=\"mb-4\">\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n Notes for Client\n </label>\n <textarea\n value={quoteNotes}\n onChange={(e) => setQuoteNotes(e.target.value)}\n rows={3}\n placeholder=\"Explain what's included...\"\n className=\"w-full px-4 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 placeholder-slate-400 resize-none focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500\"\n />\n </div>\n\n {/* Submit */}\n <button\n onClick={handleSubmitQuote}\n disabled={isSubmitting || !estimatedHours}\n className=\"w-full px-4 py-3 rounded-lg bg-powder-blue-600 hover:bg-powder-blue-700 text-white font-medium disabled:opacity-50 transition-all flex items-center justify-center gap-2\"\n >\n <Send className=\"w-4 h-4\" />\n {isSubmitting ? 'Sending...' : 'Send Quote'}\n </button>\n </div>\n </div>\n )\n }\n\n // Quote submitted - waiting for response or showing final state\n return (\n <div className=\"p-4 space-y-6\">\n {/* Quote Card */}\n <div className={cn(\n 'p-4 rounded-xl border',\n quote?.status === 'approved'\n ? 'bg-emerald-50 border-emerald-200'\n : quote?.status === 'rejected'\n ? 'bg-rose-50 border-rose-200'\n : 'bg-amber-50 border-amber-200'\n )}>\n <div className=\"flex items-center justify-between mb-4\">\n <span className={cn(\n 'px-2 py-1 rounded text-xs font-medium',\n quote?.status === 'approved'\n ? 'bg-emerald-100 text-emerald-700'\n : quote?.status === 'rejected'\n ? 'bg-rose-100 text-rose-700'\n : 'bg-amber-100 text-amber-700'\n )}>\n {QUOTE_STATUSES[quote?.status || 'quoted']?.label || 'Quoted'}\n </span>\n <span className=\"text-xs text-slate-500\">\n Revision #{quote?.revision_number || 1}\n </span>\n </div>\n\n <div className=\"text-3xl font-bold text-slate-900 mb-2\">\n €{quote?.fixed_price?.toLocaleString('en-US') || '0'}\n </div>\n\n <div className=\"text-sm text-slate-600 mb-4\">\n {quote?.estimated_hours} hours × €{quote?.hourly_rate}/hour\n </div>\n\n {quote?.quote_notes && (\n <p className=\"text-sm text-slate-700 p-3 rounded-lg bg-white/50\">\n {quote.quote_notes}\n </p>\n )}\n </div>\n\n {/* Client Response (if awaiting) */}\n {!isAgency && quote?.status === 'quoted' && canEdit && onRespondToQuote && (\n <div className=\"space-y-4\">\n <div>\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n Your Response (optional)\n </label>\n <textarea\n value={responseNotes}\n onChange={(e) => setResponseNotes(e.target.value)}\n rows={2}\n placeholder=\"Questions or comments...\"\n className=\"w-full px-4 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 placeholder-slate-400 resize-none focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500\"\n />\n </div>\n\n <div className=\"flex items-center gap-3\">\n <button\n onClick={() => handleRespond(false)}\n disabled={isSubmitting}\n className=\"flex-1 px-4 py-3 rounded-lg bg-white border border-slate-200 hover:bg-slate-50 text-slate-700 font-medium disabled:opacity-50 transition-all flex items-center justify-center gap-2\"\n >\n <ThumbsDown className=\"w-4 h-4\" />\n Reject\n </button>\n <button\n onClick={() => handleRespond(true)}\n disabled={isSubmitting}\n className=\"flex-1 px-4 py-3 rounded-lg bg-emerald-600 hover:bg-emerald-700 text-white font-medium disabled:opacity-50 transition-all flex items-center justify-center gap-2\"\n >\n <ThumbsUp className=\"w-4 h-4\" />\n Approve\n </button>\n </div>\n </div>\n )}\n\n {/* Response Notes */}\n {quote?.client_response_notes && (\n <div>\n <h3 className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2\">\n Client Response\n </h3>\n <p className=\"text-sm text-slate-700 p-3 rounded-lg bg-slate-50\">\n {quote.client_response_notes}\n </p>\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Time Tab\n// ============================================\n\ninterface TimeTabProps {\n timeEntries: TimeEntry[]\n totalMinutes: number\n onLogTime: () => void\n onDeleteEntry: (id: string) => Promise<boolean>\n isLoading: boolean\n canEdit: boolean\n}\n\nconst TimeTab = ({\n timeEntries,\n totalMinutes,\n onLogTime,\n onDeleteEntry,\n isLoading,\n canEdit\n}: TimeTabProps) => {\n const formatDuration = (minutes: number) => {\n const hours = Math.floor(minutes / 60)\n const mins = minutes % 60\n if (hours === 0) return `${mins}m`\n if (mins === 0) return `${hours}h`\n return `${hours}h ${mins}m`\n }\n\n return (\n <div className=\"p-4 space-y-4\">\n {/* Summary */}\n <div className=\"flex items-center justify-between p-4 rounded-xl bg-powder-blue-50 border border-powder-blue-200\">\n <div>\n <p className=\"text-xs text-slate-500 uppercase tracking-wider mb-1\">Total Time Logged</p>\n <p className=\"text-2xl font-bold text-slate-900\">{formatDuration(totalMinutes)}</p>\n </div>\n {canEdit && (\n <button\n onClick={onLogTime}\n className=\"flex items-center gap-2 px-4 py-2 rounded-lg bg-powder-blue-600 hover:bg-powder-blue-700 text-white text-sm font-medium transition-colors\"\n >\n <Plus className=\"w-4 h-4\" />\n Log Time\n </button>\n )}\n </div>\n\n {/* Time Entries List */}\n {isLoading ? (\n <div className=\"text-center py-8 text-slate-500\">\n <div className=\"animate-spin w-6 h-6 border-2 border-slate-300 border-t-powder-blue-500 rounded-full mx-auto mb-2\" />\n Loading time entries...\n </div>\n ) : timeEntries.length > 0 ? (\n <div className=\"space-y-2\">\n {timeEntries.map((entry) => (\n <div\n key={entry.id}\n className=\"flex items-start justify-between p-3 rounded-lg bg-slate-50 border border-slate-100\"\n >\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"font-medium text-slate-900\">{formatDuration(entry.duration_minutes)}</span>\n {!entry.billable && (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-medium bg-slate-200 text-slate-600\">\n Non-billable\n </span>\n )}\n </div>\n {entry.description && (\n <p className=\"text-sm text-slate-600\">{entry.description}</p>\n )}\n <p className=\"text-xs text-slate-400 mt-1\">\n {format(new Date(entry.logged_date), 'MMM d, yyyy', { locale: enUS })}\n {entry.user_name && ` • ${entry.user_name}`}\n </p>\n </div>\n {canEdit && (\n <button\n onClick={() => onDeleteEntry(entry.id)}\n className=\"p-1 rounded text-slate-400 hover:text-rose-500 transition-colors\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-8\">\n <Clock className=\"w-8 h-8 mx-auto mb-2 text-slate-300\" />\n <p className=\"text-slate-500 text-sm\">No time logged yet</p>\n {canEdit && (\n <button\n onClick={onLogTime}\n className=\"mt-3 text-sm text-powder-blue-600 hover:text-powder-blue-700\"\n >\n Log your first entry\n </button>\n )}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Notes Tab (Internal Notes)\n// ============================================\n\ninterface NotesTabProps {\n notes: InternalNote[]\n onAddNote: (body: string) => Promise<InternalNote | null>\n onUpdateNote: (id: string, body: string) => Promise<boolean>\n onDeleteNote: (id: string) => Promise<boolean>\n onTogglePin: (id: string) => Promise<boolean>\n isLoading: boolean\n canEdit: boolean\n}\n\nconst NotesTab = ({\n notes,\n onAddNote,\n onUpdateNote,\n onDeleteNote,\n onTogglePin,\n isLoading,\n canEdit\n}: NotesTabProps) => {\n const [newNote, setNewNote] = useState('')\n const [isAdding, setIsAdding] = useState(false)\n const [editingId, setEditingId] = useState<string | null>(null)\n const [editingText, setEditingText] = useState('')\n\n const handleAddNote = async () => {\n if (!newNote.trim() || isAdding) return\n setIsAdding(true)\n try {\n await onAddNote(newNote.trim())\n setNewNote('')\n } finally {\n setIsAdding(false)\n }\n }\n\n const handleUpdateNote = async (id: string) => {\n if (!editingText.trim()) return\n await onUpdateNote(id, editingText.trim())\n setEditingId(null)\n setEditingText('')\n }\n\n const startEditing = (note: InternalNote) => {\n setEditingId(note.id)\n setEditingText(note.body)\n }\n\n // Sort notes: pinned first, then by date\n const sortedNotes = [...notes].sort((a, b) => {\n if (a.is_pinned && !b.is_pinned) return -1\n if (!a.is_pinned && b.is_pinned) return 1\n return new Date(b.created_at).getTime() - new Date(a.created_at).getTime()\n })\n\n return (\n <div className=\"p-4 space-y-4\">\n {/* Header with lock indicator */}\n <div className=\"flex items-center gap-2 text-amber-600 bg-amber-50 px-3 py-2 rounded-lg\">\n <Lock className=\"w-4 h-4\" />\n <span className=\"text-sm\">Internal notes - only visible to your team</span>\n </div>\n\n {/* Add Note */}\n {canEdit && (\n <div className=\"space-y-2\">\n <textarea\n value={newNote}\n onChange={(e) => setNewNote(e.target.value)}\n placeholder=\"Add an internal note...\"\n rows={3}\n className=\"w-full px-4 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 placeholder-slate-400 resize-none focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500\"\n />\n <button\n onClick={handleAddNote}\n disabled={!newNote.trim() || isAdding}\n className=\"px-4 py-2 rounded-lg bg-powder-blue-600 hover:bg-powder-blue-700 text-white text-sm font-medium disabled:opacity-50 transition-colors\"\n >\n {isAdding ? 'Adding...' : 'Add Note'}\n </button>\n </div>\n )}\n\n {/* Notes List */}\n {isLoading ? (\n <div className=\"text-center py-8 text-slate-500\">\n <div className=\"animate-spin w-6 h-6 border-2 border-slate-300 border-t-powder-blue-500 rounded-full mx-auto mb-2\" />\n Loading notes...\n </div>\n ) : sortedNotes.length > 0 ? (\n <div className=\"space-y-3\">\n {sortedNotes.map((note) => (\n <div\n key={note.id}\n className={cn(\n 'p-3 rounded-lg border',\n note.is_pinned\n ? 'bg-amber-50 border-amber-200'\n : 'bg-slate-50 border-slate-100'\n )}\n >\n {editingId === note.id ? (\n <div className=\"space-y-2\">\n <textarea\n value={editingText}\n onChange={(e) => setEditingText(e.target.value)}\n rows={3}\n className=\"w-full px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 resize-none focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50\"\n />\n <div className=\"flex gap-2\">\n <button\n onClick={() => handleUpdateNote(note.id)}\n className=\"px-3 py-1 rounded-lg bg-powder-blue-600 text-white text-sm\"\n >\n Save\n </button>\n <button\n onClick={() => { setEditingId(null); setEditingText('') }}\n className=\"px-3 py-1 rounded-lg text-slate-600 hover:bg-slate-100 text-sm\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <>\n <div className=\"flex items-start justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n {note.is_pinned && <Pin className=\"w-3 h-3 text-amber-600\" />}\n <span className=\"text-sm font-medium text-slate-900\">\n {note.user_name}\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n {canEdit && (\n <>\n <button\n onClick={() => onTogglePin(note.id)}\n className={cn(\n 'p-1 rounded transition-colors',\n note.is_pinned\n ? 'text-amber-500 hover:text-amber-600'\n : 'text-slate-400 hover:text-slate-600'\n )}\n title={note.is_pinned ? 'Unpin' : 'Pin'}\n >\n <Pin className=\"w-3 h-3\" />\n </button>\n <button\n onClick={() => startEditing(note)}\n className=\"p-1 rounded text-slate-400 hover:text-slate-600 transition-colors\"\n >\n <Edit3 className=\"w-3 h-3\" />\n </button>\n <button\n onClick={() => onDeleteNote(note.id)}\n className=\"p-1 rounded text-slate-400 hover:text-rose-500 transition-colors\"\n >\n <Trash2 className=\"w-3 h-3\" />\n </button>\n </>\n )}\n </div>\n </div>\n <p className=\"text-sm text-slate-700 whitespace-pre-wrap\">{note.body}</p>\n <p className=\"text-xs text-slate-400 mt-2\">\n {formatDistanceToNow(new Date(note.created_at), { addSuffix: true, locale: enUS })}\n {note.updated_at && note.updated_at !== note.created_at && ' (edited)'}\n </p>\n </>\n )}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-8\">\n <StickyNote className=\"w-8 h-8 mx-auto mb-2 text-slate-300\" />\n <p className=\"text-slate-500 text-sm\">No internal notes yet</p>\n </div>\n )}\n </div>\n )\n}\n","/**\n * NewItemModal - Beautiful modal for creating new maintenance items\n *\n * Different flows for agency vs client:\n * - Agency: Full control over all fields\n * - Client: Simplified \"report issue\" flow with optional quote request\n */\n\nimport { useState, useRef, DragEvent, ChangeEvent } from 'react'\nimport { motion } from 'framer-motion'\nimport {\n X,\n Sparkles,\n Bug,\n Lightbulb,\n FileText,\n Euro,\n Send,\n ChevronRight,\n Upload,\n FileIcon\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { MaintenanceItem, MaintenanceCategory, MaintenancePriority } from '@framed/core'\nimport { CATEGORIES, PRIORITIES } from '../constants'\n\ninterface StagedFile {\n id: string\n file: File\n preview?: string\n}\n\ninterface NewItemModalProps {\n onClose: () => void\n onSubmit: (item: Omit<MaintenanceItem, 'id' | 'created_at' | 'created_by' | 'created_by_name'>, stagedFiles?: File[]) => Promise<void>\n isAgency: boolean\n}\n\ntype ItemType = 'bug' | 'idea' | 'content' | 'other'\n\nconst MAX_FILES = 5\nconst MAX_FILE_SIZE = 10 * 1024 * 1024 // 10MB\nconst ALLOWED_TYPES = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/webp', 'application/pdf']\n\nexport const NewItemModal = ({ onClose, onSubmit, isAgency }: NewItemModalProps) => {\n // Step state for client flow\n const [step, setStep] = useState<'type' | 'details' | 'priority'>('type')\n const [itemType, setItemType] = useState<ItemType | null>(null)\n\n // Form state\n const [title, setTitle] = useState('')\n const [description, setDescription] = useState('')\n const [category, setCategory] = useState<MaintenanceCategory>('bug_fix')\n const [priority, setPriority] = useState<MaintenancePriority>('medium')\n const [pageName, setPageName] = useState('')\n const [pageUrl, setPageUrl] = useState('')\n const [requestQuote, setRequestQuote] = useState(false)\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n // File upload state\n const [stagedFiles, setStagedFiles] = useState<StagedFile[]>([])\n const [dragActive, setDragActive] = useState(false)\n const [fileError, setFileError] = useState<string | null>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n // Map item type to category\n const typeToCategory: Record<ItemType, MaintenanceCategory> = {\n bug: 'bug_fix',\n idea: 'new_feature',\n content: 'content_update',\n other: 'other'\n }\n\n // File handling functions\n const validateFile = (file: File): string | null => {\n if (file.size > MAX_FILE_SIZE) {\n return `${file.name} exceeds 10MB limit`\n }\n if (!ALLOWED_TYPES.includes(file.type)) {\n return `${file.name} is not a supported file type`\n }\n return null\n }\n\n const handleFiles = (files: FileList | null) => {\n if (!files || files.length === 0) return\n setFileError(null)\n\n const remainingSlots = MAX_FILES - stagedFiles.length\n if (files.length > remainingSlots) {\n setFileError(`Maximum ${MAX_FILES} files allowed`)\n return\n }\n\n const newStagedFiles: StagedFile[] = []\n for (let i = 0; i < files.length; i++) {\n const file = files[i]\n if (!file) continue\n const error = validateFile(file)\n if (error) {\n setFileError(error)\n return\n }\n\n const staged: StagedFile = {\n id: crypto.randomUUID(),\n file,\n preview: file.type.startsWith('image/') ? URL.createObjectURL(file) : undefined\n }\n newStagedFiles.push(staged)\n }\n\n setStagedFiles(prev => [...prev, ...newStagedFiles])\n }\n\n const handleDrag = (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n if (e.type === 'dragenter' || e.type === 'dragover') {\n setDragActive(true)\n } else if (e.type === 'dragleave') {\n setDragActive(false)\n }\n }\n\n const handleDrop = (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n setDragActive(false)\n handleFiles(e.dataTransfer.files)\n }\n\n const handleFileInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n handleFiles(e.target.files)\n // Reset input so same file can be selected again\n if (fileInputRef.current) {\n fileInputRef.current.value = ''\n }\n }\n\n const removeFile = (id: string) => {\n setStagedFiles(prev => {\n const file = prev.find(f => f.id === id)\n if (file?.preview) {\n URL.revokeObjectURL(file.preview)\n }\n return prev.filter(f => f.id !== id)\n })\n }\n\n const formatFileSize = (bytes: number) => {\n if (bytes < 1024) return bytes + ' B'\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB'\n }\n\n // Handle submit\n const handleSubmit = async () => {\n if (isSubmitting || !title.trim()) return\n\n setIsSubmitting(true)\n\n try {\n // Extract File objects from staged files\n const filesToUpload = stagedFiles.map(sf => sf.file)\n\n await onSubmit({\n title: title.trim(),\n description: description.trim(),\n category: isAgency ? category : typeToCategory[itemType || 'other'],\n priority,\n status: 'backlog',\n page_name: pageName || undefined,\n page_url: pageUrl || undefined\n }, filesToUpload.length > 0 ? filesToUpload : undefined)\n\n // Clean up object URLs\n stagedFiles.forEach(sf => {\n if (sf.preview) URL.revokeObjectURL(sf.preview)\n })\n\n // Success - close modal\n setIsSubmitting(false)\n onClose()\n } catch (error) {\n console.error('Failed to create item:', error)\n setIsSubmitting(false)\n // Don't close on error - let user retry\n }\n }\n\n // Client flow: Type selection\n const itemTypes: { id: ItemType; label: string; description: string; icon: React.ElementType; color: string }[] = [\n {\n id: 'bug',\n label: 'Report Bug',\n description: 'Something is not working as expected',\n icon: Bug,\n color: '#f43f5e'\n },\n {\n id: 'idea',\n label: 'Suggest Idea',\n description: 'A new feature or improvement',\n icon: Lightbulb,\n color: '#10b981'\n },\n {\n id: 'content',\n label: 'Content Change',\n description: 'Update text, images, or information',\n icon: FileText,\n color: '#0ea5e9'\n },\n {\n id: 'other',\n label: 'Something Else',\n description: 'Other requests or questions',\n icon: Sparkles,\n color: '#8b5cf6'\n }\n ]\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4\"\n >\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={onClose}\n className=\"absolute inset-0 bg-black/30 backdrop-blur-sm\"\n />\n\n {/* Modal */}\n <motion.div\n initial={{ opacity: 0, scale: 0.95, y: 20 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: 20 }}\n className=\"relative w-full max-w-lg bg-white border border-slate-200 rounded-2xl shadow-2xl overflow-hidden\"\n >\n {/* Header */}\n <div className=\"p-4 border-b border-slate-100 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-slate-900\">\n {isAgency ? 'New Item' : step === 'type' ? 'What do you need?' : 'Tell us more'}\n </h2>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg text-slate-400 hover:text-slate-600 hover:bg-slate-100 transition-colors\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4\">\n {/* Client Flow: Type Selection */}\n {!isAgency && step === 'type' && (\n <div className=\"space-y-3\">\n {itemTypes.map((type) => (\n <button\n key={type.id}\n onClick={() => {\n setItemType(type.id)\n setStep('details')\n }}\n className=\"w-full p-4 rounded-xl bg-slate-50 border border-slate-200 hover:bg-slate-100 hover:border-slate-300 transition-all text-left group\"\n >\n <div className=\"flex items-center gap-4\">\n <div\n className=\"w-12 h-12 rounded-xl flex items-center justify-center\"\n style={{ backgroundColor: `${type.color}15` }}\n >\n <type.icon className=\"w-6 h-6\" style={{ color: type.color }} />\n </div>\n <div className=\"flex-1\">\n <h3 className=\"font-medium text-slate-900\">\n {type.label}\n </h3>\n <p className=\"text-sm text-slate-500\">{type.description}</p>\n </div>\n <ChevronRight className=\"w-5 h-5 text-slate-300 group-hover:text-slate-500 transition-colors\" />\n </div>\n </button>\n ))}\n </div>\n )}\n\n {/* Details Form (both flows merge here) */}\n {(isAgency || step === 'details' || step === 'priority') && (\n <div className=\"space-y-4\">\n {/* Title */}\n <div>\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n {isAgency ? 'Title' : 'What is the issue?'}\n </label>\n <input\n type=\"text\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={isAgency ? 'Enter title...' : 'Briefly describe what you need...'}\n autoFocus\n className=\"w-full px-4 py-3 rounded-lg bg-slate-50 border border-slate-200 text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-powder-blue-400 focus:border-powder-blue-400 text-lg\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n {isAgency ? 'Description' : 'Additional details?'}\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Add more context...\"\n rows={3}\n className=\"w-full px-4 py-3 rounded-lg bg-slate-50 border border-slate-200 text-slate-900 placeholder-slate-400 resize-none focus:outline-none focus:ring-2 focus:ring-powder-blue-400 focus:border-powder-blue-400\"\n />\n </div>\n\n {/* File Upload */}\n <div>\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n Attachments (optional)\n </label>\n\n {/* Drop zone */}\n <div\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n className={cn(\n 'border-2 border-dashed rounded-lg p-4 text-center cursor-pointer transition-all',\n dragActive\n ? 'border-powder-blue-400 bg-powder-blue-50'\n : 'border-slate-200 hover:border-slate-300 bg-slate-50',\n stagedFiles.length >= MAX_FILES && 'opacity-50 cursor-not-allowed'\n )}\n >\n <Upload className=\"w-6 h-6 mx-auto mb-2 text-slate-400\" />\n <p className=\"text-sm text-slate-600\">\n {dragActive ? 'Drop files here' : 'Drag & drop or click to upload'}\n </p>\n <p className=\"text-xs text-slate-400 mt-1\">\n Images or PDFs, max 10MB ({stagedFiles.length}/{MAX_FILES})\n </p>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept=\"image/*,application/pdf\"\n onChange={handleFileInputChange}\n className=\"hidden\"\n disabled={stagedFiles.length >= MAX_FILES}\n />\n </div>\n\n {/* Error message */}\n {fileError && (\n <p className=\"mt-2 text-xs text-red-600\">{fileError}</p>\n )}\n\n {/* Staged files list */}\n {stagedFiles.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {stagedFiles.map((sf) => (\n <div\n key={sf.id}\n className=\"flex items-center gap-3 p-2 bg-slate-50 rounded-lg border border-slate-200\"\n >\n {/* Thumbnail or icon */}\n {sf.preview ? (\n <img\n src={sf.preview}\n alt={sf.file.name}\n className=\"w-10 h-10 object-cover rounded\"\n />\n ) : (\n <div className=\"w-10 h-10 flex items-center justify-center bg-slate-200 rounded\">\n {sf.file.type === 'application/pdf' ? (\n <FileText className=\"w-5 h-5 text-slate-500\" />\n ) : (\n <FileIcon className=\"w-5 h-5 text-slate-500\" />\n )}\n </div>\n )}\n\n {/* File info */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-slate-900 truncate\">{sf.file.name}</p>\n <p className=\"text-xs text-slate-500\">{formatFileSize(sf.file.size)}</p>\n </div>\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n removeFile(sf.id)\n }}\n className=\"p-1.5 rounded-lg text-slate-400 hover:text-red-500 hover:bg-red-50 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Page Location (optional) */}\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n Page (optional)\n </label>\n <input\n type=\"text\"\n value={pageName}\n onChange={(e) => setPageName(e.target.value)}\n placeholder=\"e.g. Homepage\"\n className=\"w-full px-4 py-2 rounded-lg bg-slate-50 border border-slate-200 text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-powder-blue-400 focus:border-powder-blue-400\"\n />\n </div>\n <div>\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n URL (optional)\n </label>\n <input\n type=\"url\"\n value={pageUrl}\n onChange={(e) => setPageUrl(e.target.value)}\n placeholder=\"https://...\"\n className=\"w-full px-4 py-2 rounded-lg bg-slate-50 border border-slate-200 text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-powder-blue-400 focus:border-powder-blue-400\"\n />\n </div>\n </div>\n\n {/* Agency: Category & Priority */}\n {isAgency && (\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n Category\n </label>\n <select\n value={category}\n onChange={(e) => setCategory(e.target.value as MaintenanceCategory)}\n className=\"w-full px-4 py-2 rounded-lg bg-slate-50 border border-slate-200 text-slate-900 focus:outline-none focus:ring-2 focus:ring-powder-blue-400 focus:border-powder-blue-400\"\n >\n {Object.entries(CATEGORIES).map(([key, config]) => (\n <option key={key} value={key}>\n {config.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n Priority\n </label>\n <select\n value={priority}\n onChange={(e) => setPriority(e.target.value as MaintenancePriority)}\n className=\"w-full px-4 py-2 rounded-lg bg-slate-50 border border-slate-200 text-slate-900 focus:outline-none focus:ring-2 focus:ring-powder-blue-400 focus:border-powder-blue-400\"\n >\n {Object.entries(PRIORITIES).map(([key, config]) => (\n <option key={key} value={key}>\n {config.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n )}\n\n {/* Client: Priority Selection */}\n {!isAgency && step === 'details' && (\n <div>\n <label className=\"text-xs font-medium text-slate-500 uppercase tracking-wider mb-2 block\">\n How urgent is this?\n </label>\n <div className=\"grid grid-cols-4 gap-2\">\n {(['critical', 'high', 'medium', 'low'] as const).map((p) => {\n const config = PRIORITIES[p]\n if (!config) return null\n return (\n <button\n key={p}\n onClick={() => setPriority(p)}\n className={cn(\n 'p-3 rounded-lg border text-center transition-all',\n priority === p\n ? 'border-2'\n : 'border-slate-200 hover:border-slate-300 bg-slate-50'\n )}\n style={priority === p ? {\n borderColor: config.accent,\n backgroundColor: `${config.accent}15`\n } : undefined}\n >\n <div\n className=\"w-3 h-3 rounded-full mx-auto mb-1\"\n style={{ backgroundColor: config.accent }}\n />\n <span className=\"text-xs text-slate-600\">{config.label}</span>\n </button>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Request Quote Toggle (client only, for ideas/features) */}\n {!isAgency && (itemType === 'idea' || itemType === 'other') && (\n <label className=\"flex items-center gap-3 p-4 rounded-lg bg-amber-50 border border-amber-200 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={requestQuote}\n onChange={(e) => setRequestQuote(e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-10 h-5 rounded-full bg-slate-200 peer-checked:bg-amber-400 transition-colors relative\">\n <div className={cn(\n 'absolute top-0.5 w-4 h-4 rounded-full bg-white shadow transition-transform',\n requestQuote ? 'translate-x-5' : 'translate-x-0.5'\n )} />\n </div>\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Euro className=\"w-4 h-4 text-amber-600\" />\n <span className=\"text-sm font-medium text-slate-900\">Request a quote first</span>\n </div>\n <p className=\"text-xs text-slate-500 mt-0.5\">\n Get a price estimate before we start\n </p>\n </div>\n </label>\n )}\n </div>\n )}\n </div>\n\n {/* Footer */}\n {(isAgency || step !== 'type') && (\n <div className=\"p-4 border-t border-slate-100 flex items-center justify-between\">\n {!isAgency && step !== 'type' && (\n <button\n onClick={() => setStep('type')}\n className=\"px-4 py-2 text-slate-500 hover:text-slate-700 transition-colors\"\n >\n Back\n </button>\n )}\n <div className=\"flex-1\" />\n <button\n onClick={handleSubmit}\n disabled={isSubmitting || !title.trim()}\n className=\"px-6 py-2.5 rounded-lg bg-powder-blue-500 hover:bg-powder-blue-600 text-white font-medium disabled:opacity-50 transition-all flex items-center gap-2\"\n >\n <Send className=\"w-4 h-4\" />\n {isSubmitting ? 'Submitting...' : isAgency ? 'Create Item' : 'Submit'}\n </button>\n </div>\n )}\n </motion.div>\n </motion.div>\n )\n}\n","/**\n * CommandPalette - Quick search and navigation\n *\n * Spotlight-style command palette for power users\n */\n\nimport { useState, useMemo, useEffect, useRef } from 'react'\nimport { motion } from 'framer-motion'\nimport {\n Search,\n Plus,\n ArrowRight,\n Hash,\n Clock,\n AlertTriangle\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { MaintenanceItem } from '@framed/core'\nimport { CATEGORIES, PRIORITIES, STATUSES } from '../constants'\n\ninterface CommandPaletteProps {\n items: MaintenanceItem[]\n onClose: () => void\n onSelectItem: (id: string) => void\n onNewItem: () => void\n}\n\nexport const CommandPalette = ({\n items,\n onClose,\n onSelectItem,\n onNewItem\n}: CommandPaletteProps) => {\n const [query, setQuery] = useState('')\n const [selectedIndex, setSelectedIndex] = useState(0)\n const inputRef = useRef<HTMLInputElement>(null)\n\n // Focus input on mount\n useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n // Filter items\n const filteredItems = useMemo(() => {\n if (!query.trim()) {\n // Show recent items when no query\n return items\n .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())\n .slice(0, 8)\n }\n\n const q = query.toLowerCase()\n return items.filter(item =>\n item.title.toLowerCase().includes(q) ||\n item.description.toLowerCase().includes(q) ||\n (item.page_name && item.page_name.toLowerCase().includes(q))\n ).slice(0, 10)\n }, [items, query])\n\n // Commands\n const commands = [\n { id: 'new', label: 'New Item', shortcut: 'N', icon: Plus, action: onNewItem }\n ]\n\n // Handle keyboard navigation\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setSelectedIndex(i => Math.min(i + 1, filteredItems.length + commands.length - 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setSelectedIndex(i => Math.max(i - 1, 0))\n } else if (e.key === 'Enter') {\n e.preventDefault()\n if (selectedIndex < commands.length) {\n commands[selectedIndex]?.action()\n } else {\n const item = filteredItems[selectedIndex - commands.length]\n if (item) onSelectItem(item.id)\n }\n } else if (e.key === 'Escape') {\n onClose()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [selectedIndex, filteredItems, commands, onSelectItem, onClose])\n\n // Reset selection when query changes\n useEffect(() => {\n setSelectedIndex(0)\n }, [query])\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-50 flex items-start justify-center pt-[20vh]\"\n >\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={onClose}\n className=\"absolute inset-0 bg-black/70 backdrop-blur-sm\"\n />\n\n {/* Palette */}\n <motion.div\n initial={{ opacity: 0, scale: 0.95, y: -20 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: -20 }}\n className=\"relative w-full max-w-xl bg-[#0c0c12] border border-white/10 rounded-2xl shadow-2xl overflow-hidden\"\n >\n {/* Search Input */}\n <div className=\"p-4 border-b border-white/5\">\n <div className=\"relative\">\n <Search className=\"absolute left-4 top-1/2 -translate-y-1/2 w-5 h-5 text-white/30\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search items or type a command...\"\n className=\"w-full pl-12 pr-4 py-3 bg-white/5 border border-white/10 rounded-xl text-white placeholder-white/30 focus:outline-none focus:ring-2 focus:ring-violet-500/50 text-lg\"\n />\n </div>\n </div>\n\n {/* Results */}\n <div className=\"max-h-[50vh] overflow-y-auto\">\n {/* Commands */}\n <div className=\"p-2 border-b border-white/5\">\n <div className=\"px-2 py-1 text-xs font-medium text-white/40 uppercase tracking-wider\">\n Commands\n </div>\n {commands.map((cmd, index) => (\n <button\n key={cmd.id}\n onClick={cmd.action}\n className={cn(\n 'w-full p-3 rounded-lg flex items-center gap-3 transition-colors',\n selectedIndex === index\n ? 'bg-violet-500/20 text-white'\n : 'text-white/70 hover:bg-white/5'\n )}\n >\n <cmd.icon className=\"w-5 h-5 text-violet-400\" />\n <span className=\"flex-1 text-left\">{cmd.label}</span>\n <kbd className=\"px-2 py-0.5 rounded bg-white/10 text-xs text-white/40\">\n {cmd.shortcut}\n </kbd>\n </button>\n ))}\n </div>\n\n {/* Items */}\n {filteredItems.length > 0 && (\n <div className=\"p-2\">\n <div className=\"px-2 py-1 text-xs font-medium text-white/40 uppercase tracking-wider\">\n {query ? 'Results' : 'Recent Items'}\n </div>\n {filteredItems.map((item, index) => {\n const category = CATEGORIES[item.category]\n const priority = PRIORITIES[item.priority]\n const CategoryIcon = category?.icon\n const actualIndex = index + commands.length\n\n return (\n <button\n key={item.id}\n onClick={() => onSelectItem(item.id)}\n className={cn(\n 'w-full p-3 rounded-lg flex items-center gap-3 transition-colors',\n selectedIndex === actualIndex\n ? 'bg-violet-500/20 text-white'\n : 'text-white/70 hover:bg-white/5'\n )}\n >\n {/* Category Icon */}\n <div\n className=\"w-8 h-8 rounded-lg flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: `${category?.accent}15` }}\n >\n {CategoryIcon && (\n <CategoryIcon\n className=\"w-4 h-4\"\n style={{ color: category?.accent }}\n />\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0 text-left\">\n <div className=\"font-medium truncate\">{item.title}</div>\n <div className=\"text-xs text-white/40 flex items-center gap-2\">\n <span>{category?.label}</span>\n {item.page_name && (\n <>\n <span>•</span>\n <span>{item.page_name}</span>\n </>\n )}\n </div>\n </div>\n\n {/* Priority */}\n <div\n className=\"w-2 h-2 rounded-full flex-shrink-0\"\n style={{ backgroundColor: priority?.accent }}\n />\n\n {/* Arrow */}\n <ArrowRight className=\"w-4 h-4 text-white/30\" />\n </button>\n )\n })}\n </div>\n )}\n\n {/* Empty State */}\n {query && filteredItems.length === 0 && (\n <div className=\"p-8 text-center\">\n <Search className=\"w-8 h-8 mx-auto mb-2 text-white/20\" />\n <p className=\"text-white/40\">No items found for \"{query}\"</p>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"p-3 border-t border-white/5 flex items-center justify-between text-xs text-white/40\">\n <div className=\"flex items-center gap-4\">\n <span className=\"flex items-center gap-1\">\n <kbd className=\"px-1.5 py-0.5 rounded bg-white/10\">↑</kbd>\n <kbd className=\"px-1.5 py-0.5 rounded bg-white/10\">↓</kbd>\n Navigate\n </span>\n <span className=\"flex items-center gap-1\">\n <kbd className=\"px-1.5 py-0.5 rounded bg-white/10\">↵</kbd>\n Select\n </span>\n </div>\n <span className=\"flex items-center gap-1\">\n <kbd className=\"px-1.5 py-0.5 rounded bg-white/10\">Esc</kbd>\n Close\n </span>\n </div>\n </motion.div>\n </motion.div>\n )\n}\n","/**\n * QuickStats - Compact stats display for the header\n */\n\nimport { motion } from 'framer-motion'\nimport { AlertTriangle, Clock, CheckCircle2, Euro } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\ninterface QuickStatsProps {\n stats: {\n total: number\n open: number\n completed: number\n critical: number\n high: number\n awaitingQuote: number\n quotedPending: number\n }\n compact?: boolean\n}\n\nexport const QuickStats = ({ stats, compact = false }: QuickStatsProps) => {\n const items = [\n {\n label: 'Open',\n value: stats.open,\n icon: Clock,\n color: 'text-blue-600',\n bgColor: 'bg-blue-50'\n },\n {\n label: 'Critical',\n value: stats.critical,\n icon: AlertTriangle,\n color: 'text-rose-600',\n bgColor: 'bg-rose-50',\n pulse: stats.critical > 0\n },\n {\n label: 'Done',\n value: stats.completed,\n icon: CheckCircle2,\n color: 'text-emerald-600',\n bgColor: 'bg-emerald-50'\n }\n ]\n\n // Add quote stats if there are any pending\n if (stats.awaitingQuote > 0 || stats.quotedPending > 0) {\n items.push({\n label: 'Quotes',\n value: stats.awaitingQuote + stats.quotedPending,\n icon: Euro,\n color: 'text-amber-600',\n bgColor: 'bg-amber-50',\n pulse: stats.quotedPending > 0\n })\n }\n\n // Compact mode for sidebar\n if (compact) {\n return (\n <div className=\"grid grid-cols-3 gap-2\">\n {items.slice(0, 3).map((item) => (\n <div\n key={item.label}\n className={cn(\n 'flex flex-col items-center p-2 rounded-lg',\n item.bgColor\n )}\n >\n <span className={cn('text-lg font-bold tabular-nums', item.color)}>\n {item.value}\n </span>\n <span className=\"text-[10px] text-slate-500 uppercase tracking-wider\">{item.label}</span>\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n {items.map((item, i) => (\n <motion.div\n key={item.label}\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: i * 0.05 }}\n className={cn(\n 'flex items-center gap-2 px-3 py-1.5 rounded-lg border',\n item.bgColor,\n 'border-transparent'\n )}\n >\n <item.icon className={cn('w-4 h-4', item.color, item.pulse && 'animate-pulse')} />\n <span className={cn('text-sm font-semibold tabular-nums', item.color)}>\n {item.value}\n </span>\n <span className=\"text-xs text-slate-500 hidden lg:inline\">{item.label}</span>\n </motion.div>\n ))}\n </div>\n )\n}\n","/**\n * useTimeTracking - Hook for managing time tracking and hour packages\n *\n * This hook manages local state for time entries and hour packages while\n * delegating actual data operations to callbacks provided by the consuming application.\n *\n * Usage:\n * ```tsx\n * const { timeEntries, hourPackages, createTimeEntry } = useTimeTracking({\n * projectId: 'my-project',\n * agencyId: 'my-agency',\n * onFetchTimeEntries: async () => await myApi.getTimeEntries(),\n * onFetchHourPackages: async () => await myApi.getHourPackages(),\n * onCreateTimeEntry: async (input) => await myApi.createTimeEntry(input),\n * });\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport type { TimeEntry, HourPackage } from '@framed/core'\n\ninterface CreateTimeEntryInput {\n maintenance_item_id?: string\n logged_date: string\n duration_minutes: number\n description?: string\n billable?: boolean\n}\n\ninterface CreateHourPackageInput {\n name: string\n total_minutes: number\n expires_at?: string\n price_cents?: number\n currency?: 'EUR' | 'USD' | 'GBP'\n notes?: string\n}\n\n/**\n * Callback options for time tracking data operations\n */\ninterface UseTimeTrackingCallbacks {\n /** Fetch all time entries */\n onFetchTimeEntries?: () => Promise<TimeEntry[]>\n /** Fetch all hour packages */\n onFetchHourPackages?: () => Promise<HourPackage[]>\n /** Create a new time entry */\n onCreateTimeEntry?: (input: CreateTimeEntryInput) => Promise<TimeEntry>\n /** Update a time entry */\n onUpdateTimeEntry?: (entryId: string, updates: Partial<TimeEntry>) => Promise<TimeEntry | void>\n /** Delete a time entry */\n onDeleteTimeEntry?: (entryId: string) => Promise<void>\n /** Create a new hour package */\n onCreateHourPackage?: (input: CreateHourPackageInput) => Promise<HourPackage>\n /** Update an hour package */\n onUpdateHourPackage?: (packageId: string, updates: Partial<HourPackage>) => Promise<HourPackage | void>\n /** Delete an hour package */\n onDeleteHourPackage?: (packageId: string) => Promise<void>\n}\n\ninterface UseTimeTrackingOptions extends UseTimeTrackingCallbacks {\n projectId: string\n agencyId: string\n /** Initial time entries (useful for SSR or cached data) */\n initialTimeEntries?: TimeEntry[]\n /** Initial hour packages (useful for SSR or cached data) */\n initialHourPackages?: HourPackage[]\n /** Auto-fetch on mount (default: true if fetch callbacks are provided) */\n autoFetch?: boolean\n}\n\ninterface TimeTrackingState {\n timeEntries: TimeEntry[]\n hourPackages: HourPackage[]\n loading: boolean\n error: string | null\n}\n\ninterface UseTimeTrackingReturn extends TimeTrackingState {\n createTimeEntry: (input: CreateTimeEntryInput) => Promise<TimeEntry | null>\n updateTimeEntry: (entryId: string, updates: Partial<TimeEntry>) => Promise<boolean>\n deleteTimeEntry: (entryId: string) => Promise<boolean>\n createHourPackage: (input: CreateHourPackageInput) => Promise<HourPackage | null>\n updateHourPackage: (packageId: string, updates: Partial<HourPackage>) => Promise<boolean>\n deleteHourPackage: (packageId: string) => Promise<boolean>\n refresh: () => Promise<void>\n setTimeEntries: (entries: TimeEntry[]) => void\n setHourPackages: (packages: HourPackage[]) => void\n}\n\n/**\n * Hook for managing time tracking with callback-based data operations\n */\nexport const useTimeTracking = ({\n projectId,\n agencyId,\n initialTimeEntries = [],\n initialHourPackages = [],\n autoFetch = true,\n onFetchTimeEntries,\n onFetchHourPackages,\n onCreateTimeEntry,\n onUpdateTimeEntry,\n onDeleteTimeEntry,\n onCreateHourPackage,\n onUpdateHourPackage,\n onDeleteHourPackage,\n}: UseTimeTrackingOptions): UseTimeTrackingReturn => {\n const [timeEntries, setTimeEntries] = useState<TimeEntry[]>(initialTimeEntries)\n const [hourPackages, setHourPackages] = useState<HourPackage[]>(initialHourPackages)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const refresh = useCallback(async () => {\n setLoading(true)\n setError(null)\n\n try {\n const [entries, packages] = await Promise.all([\n onFetchTimeEntries ? onFetchTimeEntries() : Promise.resolve(timeEntries),\n onFetchHourPackages ? onFetchHourPackages() : Promise.resolve(hourPackages),\n ])\n\n if (onFetchTimeEntries) setTimeEntries(entries)\n if (onFetchHourPackages) setHourPackages(packages)\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch time tracking data'\n setError(message)\n console.error('useTimeTracking: fetch error', err)\n } finally {\n setLoading(false)\n }\n }, [onFetchTimeEntries, onFetchHourPackages, timeEntries, hourPackages])\n\n // Fetch on mount if autoFetch is enabled\n useEffect(() => {\n if (autoFetch && (onFetchTimeEntries || onFetchHourPackages) && projectId) {\n refresh()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [projectId, autoFetch])\n\n const createTimeEntry = useCallback(async (input: CreateTimeEntryInput): Promise<TimeEntry | null> => {\n if (!onCreateTimeEntry) {\n console.warn('useTimeTracking: onCreateTimeEntry callback not provided')\n return null\n }\n\n setError(null)\n\n try {\n const newEntry = await onCreateTimeEntry(input)\n setTimeEntries(prev => [newEntry, ...prev])\n return newEntry\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create time entry'\n setError(message)\n console.error('useTimeTracking: create entry error', err)\n return null\n }\n }, [onCreateTimeEntry])\n\n const updateTimeEntry = useCallback(async (entryId: string, updates: Partial<TimeEntry>): Promise<boolean> => {\n if (!onUpdateTimeEntry) {\n console.warn('useTimeTracking: onUpdateTimeEntry callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n const result = await onUpdateTimeEntry(entryId, updates)\n setTimeEntries(prev => prev.map(entry => {\n if (entry.id === entryId) {\n return result ? result : { ...entry, ...updates }\n }\n return entry\n }))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update time entry'\n setError(message)\n console.error('useTimeTracking: update entry error', err)\n return false\n }\n }, [onUpdateTimeEntry])\n\n const deleteTimeEntry = useCallback(async (entryId: string): Promise<boolean> => {\n if (!onDeleteTimeEntry) {\n console.warn('useTimeTracking: onDeleteTimeEntry callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n await onDeleteTimeEntry(entryId)\n setTimeEntries(prev => prev.filter(entry => entry.id !== entryId))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete time entry'\n setError(message)\n console.error('useTimeTracking: delete entry error', err)\n return false\n }\n }, [onDeleteTimeEntry])\n\n const createHourPackage = useCallback(async (input: CreateHourPackageInput): Promise<HourPackage | null> => {\n if (!onCreateHourPackage) {\n console.warn('useTimeTracking: onCreateHourPackage callback not provided')\n return null\n }\n\n setError(null)\n\n try {\n const newPackage = await onCreateHourPackage(input)\n setHourPackages(prev => [newPackage, ...prev])\n return newPackage\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create hour package'\n setError(message)\n console.error('useTimeTracking: create package error', err)\n return null\n }\n }, [onCreateHourPackage])\n\n const updateHourPackage = useCallback(async (packageId: string, updates: Partial<HourPackage>): Promise<boolean> => {\n if (!onUpdateHourPackage) {\n console.warn('useTimeTracking: onUpdateHourPackage callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n const result = await onUpdateHourPackage(packageId, updates)\n setHourPackages(prev => prev.map(pkg => {\n if (pkg.id === packageId) {\n return result ? result : { ...pkg, ...updates }\n }\n return pkg\n }))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update hour package'\n setError(message)\n console.error('useTimeTracking: update package error', err)\n return false\n }\n }, [onUpdateHourPackage])\n\n const deleteHourPackage = useCallback(async (packageId: string): Promise<boolean> => {\n if (!onDeleteHourPackage) {\n console.warn('useTimeTracking: onDeleteHourPackage callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n await onDeleteHourPackage(packageId)\n setHourPackages(prev => prev.filter(pkg => pkg.id !== packageId))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete hour package'\n setError(message)\n console.error('useTimeTracking: delete package error', err)\n return false\n }\n }, [onDeleteHourPackage])\n\n return {\n timeEntries,\n hourPackages,\n loading,\n error,\n createTimeEntry,\n updateTimeEntry,\n deleteTimeEntry,\n createHourPackage,\n updateHourPackage,\n deleteHourPackage,\n refresh,\n setTimeEntries,\n setHourPackages,\n }\n}\n\nexport type {\n UseTimeTrackingOptions,\n TimeTrackingState,\n CreateTimeEntryInput,\n CreateHourPackageInput,\n UseTimeTrackingCallbacks,\n UseTimeTrackingReturn,\n}\n","/**\n * useDomainMonitoring - Hook for managing domain and SSL monitoring\n *\n * This hook manages local state for domain monitors while delegating\n * actual data operations to callbacks provided by the consuming application.\n *\n * Usage:\n * ```tsx\n * const { monitors, addMonitor } = useDomainMonitoring({\n * projectId: 'my-project',\n * onFetch: async () => await myApi.getDomainMonitors(),\n * onAdd: async (domain, alertDays) => await myApi.createMonitor(domain, alertDays),\n * });\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport type { DomainMonitor, DomainCheckStatus } from '@framed/core'\n\n/**\n * Callback options for domain monitoring data operations\n */\ninterface UseDomainMonitoringCallbacks {\n /** Fetch all domain monitors */\n onFetch?: () => Promise<DomainMonitor[]>\n /** Add a new domain monitor */\n onAdd?: (domain: string, alertDays?: number[]) => Promise<DomainMonitor>\n /** Update a domain monitor */\n onUpdate?: (monitorId: string, updates: Partial<DomainMonitor>) => Promise<DomainMonitor | void>\n /** Delete a domain monitor */\n onDelete?: (monitorId: string) => Promise<void>\n /** Trigger a domain check */\n onCheck?: (monitorId: string) => Promise<DomainMonitor>\n}\n\ninterface UseDomainMonitoringOptions extends UseDomainMonitoringCallbacks {\n projectId: string\n agencyId?: string\n /** Initial monitors (useful for SSR or cached data) */\n initialMonitors?: DomainMonitor[]\n /** Auto-fetch on mount (default: true if onFetch is provided) */\n autoFetch?: boolean\n}\n\ninterface UseDomainMonitoringReturn {\n monitors: DomainMonitor[]\n loading: boolean\n error: string | null\n addMonitor: (domain: string, alertDays?: number[]) => Promise<DomainMonitor | null>\n updateMonitor: (monitorId: string, updates: Partial<DomainMonitor>) => Promise<boolean>\n deleteMonitor: (monitorId: string) => Promise<boolean>\n checkDomain: (monitorId: string) => Promise<boolean>\n refresh: () => Promise<void>\n setMonitors: (monitors: DomainMonitor[]) => void\n}\n\n/**\n * Hook for managing domain monitoring with callback-based data operations\n */\nexport const useDomainMonitoring = ({\n projectId,\n agencyId,\n initialMonitors = [],\n autoFetch = true,\n onFetch,\n onAdd,\n onUpdate,\n onDelete,\n onCheck,\n}: UseDomainMonitoringOptions): UseDomainMonitoringReturn => {\n const [monitors, setMonitors] = useState<DomainMonitor[]>(initialMonitors)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const refresh = useCallback(async () => {\n if (!onFetch) {\n console.warn('useDomainMonitoring: onFetch callback not provided')\n return\n }\n\n setLoading(true)\n setError(null)\n\n try {\n const fetchedMonitors = await onFetch()\n setMonitors(fetchedMonitors)\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch domain monitors'\n setError(message)\n console.error('useDomainMonitoring: fetch error', err)\n } finally {\n setLoading(false)\n }\n }, [onFetch])\n\n // Fetch on mount if autoFetch is enabled\n useEffect(() => {\n if (autoFetch && onFetch && projectId) {\n refresh()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [projectId, autoFetch])\n\n const addMonitor = useCallback(async (\n domain: string,\n alertDays: number[] = [30, 14, 7]\n ): Promise<DomainMonitor | null> => {\n if (!onAdd) {\n console.warn('useDomainMonitoring: onAdd callback not provided')\n return null\n }\n\n setError(null)\n\n try {\n const newMonitor = await onAdd(domain, alertDays)\n setMonitors(prev => [newMonitor, ...prev])\n return newMonitor\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to add domain monitor'\n setError(message)\n console.error('useDomainMonitoring: add error', err)\n return null\n }\n }, [onAdd])\n\n const updateMonitor = useCallback(async (\n monitorId: string,\n updates: Partial<DomainMonitor>\n ): Promise<boolean> => {\n if (!onUpdate) {\n console.warn('useDomainMonitoring: onUpdate callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n const result = await onUpdate(monitorId, updates)\n setMonitors(prev => prev.map(monitor => {\n if (monitor.id === monitorId) {\n return result ? result : { ...monitor, ...updates }\n }\n return monitor\n }))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update domain monitor'\n setError(message)\n console.error('useDomainMonitoring: update error', err)\n return false\n }\n }, [onUpdate])\n\n const deleteMonitor = useCallback(async (monitorId: string): Promise<boolean> => {\n if (!onDelete) {\n console.warn('useDomainMonitoring: onDelete callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n await onDelete(monitorId)\n setMonitors(prev => prev.filter(monitor => monitor.id !== monitorId))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete domain monitor'\n setError(message)\n console.error('useDomainMonitoring: delete error', err)\n return false\n }\n }, [onDelete])\n\n const checkDomain = useCallback(async (monitorId: string): Promise<boolean> => {\n if (!onCheck) {\n console.warn('useDomainMonitoring: onCheck callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n const updatedMonitor = await onCheck(monitorId)\n setMonitors(prev => prev.map(monitor =>\n monitor.id === monitorId ? updatedMonitor : monitor\n ))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to check domain'\n setError(message)\n console.error('useDomainMonitoring: check error', err)\n return false\n }\n }, [onCheck])\n\n return {\n monitors,\n loading,\n error,\n addMonitor,\n updateMonitor,\n deleteMonitor,\n checkDomain,\n refresh,\n setMonitors,\n }\n}\n\nexport type { UseDomainMonitoringOptions, UseDomainMonitoringReturn, UseDomainMonitoringCallbacks }\n\n// ============================================\n// Helper functions\n// ============================================\n\n/**\n * Calculate days until expiry\n */\nexport const getDaysUntilExpiry = (expiryDate: string | null | undefined): number | null => {\n if (!expiryDate) return null\n const expiry = new Date(expiryDate)\n const now = new Date()\n const diff = expiry.getTime() - now.getTime()\n return Math.ceil(diff / (1000 * 60 * 60 * 24))\n}\n\n/**\n * Get status color based on days until expiry\n */\nexport const getExpiryStatusColor = (daysUntil: number | null): string => {\n if (daysUntil === null) return 'text-slate-400'\n if (daysUntil <= 0) return 'text-red-600'\n if (daysUntil <= 7) return 'text-red-500'\n if (daysUntil <= 14) return 'text-amber-600'\n if (daysUntil <= 30) return 'text-amber-500'\n return 'text-emerald-600'\n}\n\n/**\n * Get status badge based on check status\n */\nexport const getCheckStatusBadge = (status: DomainCheckStatus): {\n label: string\n color: string\n} => {\n switch (status) {\n case 'ok':\n return { label: 'OK', color: 'bg-emerald-100 text-emerald-700' }\n case 'warning':\n return { label: 'Warning', color: 'bg-amber-100 text-amber-700' }\n case 'error':\n return { label: 'Error', color: 'bg-red-100 text-red-700' }\n case 'pending':\n default:\n return { label: 'Pending', color: 'bg-slate-100 text-slate-600' }\n }\n}\n","/**\n * useUptimeMonitoring - Hook for managing uptime monitors\n *\n * This hook manages local state for uptime monitors while delegating\n * actual data operations to callbacks provided by the consuming application.\n *\n * Usage:\n * ```tsx\n * const { monitors, addMonitor, deleteMonitor } = useUptimeMonitoring({\n * projectId: 'my-project',\n * onFetch: async () => await myApi.getUptimeMonitors(),\n * onAdd: async (url, name) => await myApi.createMonitor(url, name),\n * });\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport type { UptimeMonitor, UptimeCheck, UptimeIncident } from '@framed/core'\n\n/**\n * Callback options for uptime monitoring data operations\n */\ninterface UseUptimeMonitoringCallbacks {\n /** Fetch all uptime monitors */\n onFetch?: () => Promise<UptimeMonitor[]>\n /** Add a new uptime monitor */\n onAdd?: (url: string, name?: string) => Promise<UptimeMonitor>\n /** Update an uptime monitor */\n onUpdate?: (monitorId: string, updates: Partial<UptimeMonitor>) => Promise<UptimeMonitor | void>\n /** Delete an uptime monitor */\n onDelete?: (monitorId: string) => Promise<void>\n /** Trigger a manual check */\n onCheckNow?: (monitorId: string) => Promise<UptimeMonitor>\n /** Get recent checks for a monitor */\n onGetChecks?: (monitorId: string, hours?: number) => Promise<UptimeCheck[]>\n /** Get incidents for a monitor */\n onGetIncidents?: (monitorId: string, limit?: number) => Promise<UptimeIncident[]>\n}\n\ninterface UseUptimeMonitoringOptions extends UseUptimeMonitoringCallbacks {\n projectId: string\n agencyId?: string\n liveUrl?: string\n /** Initial monitors (useful for SSR or cached data) */\n initialMonitors?: UptimeMonitor[]\n /** Auto-fetch on mount (default: true if onFetch is provided) */\n autoFetch?: boolean\n}\n\ninterface UseUptimeMonitoringReturn {\n monitors: UptimeMonitor[]\n loading: boolean\n error: string | null\n addMonitor: (url: string, name?: string) => Promise<UptimeMonitor | null>\n updateMonitor: (monitorId: string, updates: Partial<UptimeMonitor>) => Promise<boolean>\n deleteMonitor: (monitorId: string) => Promise<boolean>\n checkNow: (monitorId: string) => Promise<boolean>\n getChecks: (monitorId: string, hours?: number) => Promise<UptimeCheck[]>\n getIncidents: (monitorId: string, limit?: number) => Promise<UptimeIncident[]>\n refresh: () => Promise<void>\n setMonitors: (monitors: UptimeMonitor[]) => void\n}\n\n/**\n * Hook for managing uptime monitoring with callback-based data operations\n */\nexport const useUptimeMonitoring = ({\n projectId,\n agencyId,\n liveUrl,\n initialMonitors = [],\n autoFetch = true,\n onFetch,\n onAdd,\n onUpdate,\n onDelete,\n onCheckNow,\n onGetChecks,\n onGetIncidents,\n}: UseUptimeMonitoringOptions): UseUptimeMonitoringReturn => {\n const [monitors, setMonitors] = useState<UptimeMonitor[]>(initialMonitors)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const refresh = useCallback(async () => {\n if (!onFetch) {\n console.warn('useUptimeMonitoring: onFetch callback not provided')\n return\n }\n\n setLoading(true)\n setError(null)\n\n try {\n const fetchedMonitors = await onFetch()\n setMonitors(fetchedMonitors)\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch uptime monitors'\n setError(message)\n console.error('useUptimeMonitoring: fetch error', err)\n } finally {\n setLoading(false)\n }\n }, [onFetch])\n\n // Fetch on mount if autoFetch is enabled\n useEffect(() => {\n if (autoFetch && onFetch && projectId) {\n refresh()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [projectId, autoFetch])\n\n // Parse live URL to get allowed hostname\n const getLiveUrlHostname = useCallback((): string | null => {\n if (!liveUrl) return null\n try {\n const url = new URL(liveUrl.startsWith('http') ? liveUrl : `https://${liveUrl}`)\n return url.hostname\n } catch {\n return null\n }\n }, [liveUrl])\n\n const addMonitor = useCallback(async (\n url: string,\n name?: string\n ): Promise<UptimeMonitor | null> => {\n if (!onAdd) {\n console.warn('useUptimeMonitoring: onAdd callback not provided')\n return null\n }\n\n // Normalize URL (ensure protocol)\n let normalizedUrl = url.trim()\n if (!normalizedUrl.startsWith('http://') && !normalizedUrl.startsWith('https://')) {\n normalizedUrl = `https://${normalizedUrl}`\n }\n\n // Validate URL is under the live domain\n const allowedHostname = getLiveUrlHostname()\n if (allowedHostname) {\n try {\n const urlToAdd = new URL(normalizedUrl)\n if (urlToAdd.hostname !== allowedHostname) {\n setError(`Only URLs under ${allowedHostname} are allowed`)\n return null\n }\n } catch {\n setError('Invalid URL format')\n return null\n }\n }\n\n setError(null)\n\n try {\n const newMonitor = await onAdd(normalizedUrl, name?.trim())\n setMonitors(prev => [...prev, newMonitor])\n return newMonitor\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to add uptime monitor'\n setError(message)\n console.error('useUptimeMonitoring: add error', err)\n return null\n }\n }, [onAdd, getLiveUrlHostname])\n\n const updateMonitor = useCallback(async (\n monitorId: string,\n updates: Partial<UptimeMonitor>\n ): Promise<boolean> => {\n if (!onUpdate) {\n console.warn('useUptimeMonitoring: onUpdate callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n const result = await onUpdate(monitorId, updates)\n setMonitors(prev => prev.map(monitor => {\n if (monitor.id === monitorId) {\n return result ? result : { ...monitor, ...updates }\n }\n return monitor\n }))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update uptime monitor'\n setError(message)\n console.error('useUptimeMonitoring: update error', err)\n return false\n }\n }, [onUpdate])\n\n const deleteMonitor = useCallback(async (monitorId: string): Promise<boolean> => {\n if (!onDelete) {\n console.warn('useUptimeMonitoring: onDelete callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n await onDelete(monitorId)\n setMonitors(prev => prev.filter(monitor => monitor.id !== monitorId))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete uptime monitor'\n setError(message)\n console.error('useUptimeMonitoring: delete error', err)\n return false\n }\n }, [onDelete])\n\n const checkNow = useCallback(async (monitorId: string): Promise<boolean> => {\n if (!onCheckNow) {\n console.warn('useUptimeMonitoring: onCheckNow callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n const updatedMonitor = await onCheckNow(monitorId)\n setMonitors(prev => prev.map(monitor =>\n monitor.id === monitorId ? updatedMonitor : monitor\n ))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to check site'\n setError(message)\n console.error('useUptimeMonitoring: check error', err)\n return false\n }\n }, [onCheckNow])\n\n const getChecks = useCallback(async (\n monitorId: string,\n hours: number = 24\n ): Promise<UptimeCheck[]> => {\n if (!onGetChecks) {\n console.warn('useUptimeMonitoring: onGetChecks callback not provided')\n return []\n }\n\n try {\n return await onGetChecks(monitorId, hours)\n } catch (err) {\n console.error('useUptimeMonitoring: getChecks error', err)\n return []\n }\n }, [onGetChecks])\n\n const getIncidents = useCallback(async (\n monitorId: string,\n limit: number = 10\n ): Promise<UptimeIncident[]> => {\n if (!onGetIncidents) {\n console.warn('useUptimeMonitoring: onGetIncidents callback not provided')\n return []\n }\n\n try {\n return await onGetIncidents(monitorId, limit)\n } catch (err) {\n console.error('useUptimeMonitoring: getIncidents error', err)\n return []\n }\n }, [onGetIncidents])\n\n return {\n monitors,\n loading,\n error,\n addMonitor,\n updateMonitor,\n deleteMonitor,\n checkNow,\n getChecks,\n getIncidents,\n refresh,\n setMonitors,\n }\n}\n\n// ============================================\n// Helper functions\n// ============================================\n\n/**\n * Format uptime percentage for display\n */\nexport const formatUptimePercentage = (percentage: number | undefined): string => {\n if (percentage === undefined || percentage === null) return '—'\n return `${percentage.toFixed(2)}%`\n}\n\n/**\n * Format response time for display\n */\nexport const formatResponseTime = (ms: number | undefined): string => {\n if (ms === undefined || ms === null) return '—'\n if (ms < 1000) return `${ms}ms`\n return `${(ms / 1000).toFixed(2)}s`\n}\n\n/**\n * Get status color based on uptime status\n */\nexport const getUptimeStatusColor = (isUp: boolean, consecutiveFailures: number): string => {\n if (isUp) return 'text-emerald-600'\n if (consecutiveFailures >= 3) return 'text-red-600'\n return 'text-amber-600'\n}\n\n/**\n * Get background color for uptime bar\n */\nexport const getUptimeBarColor = (uptimePercentage: number): string => {\n if (uptimePercentage >= 99.9) return 'bg-emerald-400'\n if (uptimePercentage >= 99) return 'bg-emerald-300'\n if (uptimePercentage >= 95) return 'bg-amber-400'\n if (uptimePercentage >= 90) return 'bg-amber-500'\n return 'bg-red-500'\n}\n\n/**\n * Calculate time since last check\n */\nexport const getTimeSinceCheck = (lastCheckedAt: string | undefined): string => {\n if (!lastCheckedAt) return 'Never'\n\n const diff = Date.now() - new Date(lastCheckedAt).getTime()\n const minutes = Math.floor(diff / 60000)\n\n if (minutes < 1) return 'Just now'\n if (minutes < 60) return `${minutes}m ago`\n\n const hours = Math.floor(minutes / 60)\n if (hours < 24) return `${hours}h ago`\n\n const days = Math.floor(hours / 24)\n return `${days}d ago`\n}\n\nexport type { UseUptimeMonitoringOptions, UseUptimeMonitoringReturn, UseUptimeMonitoringCallbacks }\n","/**\n * SettingsView - Phase 5 settings as a full view (not modal)\n *\n * Features:\n * - URLs management (pages to monitor)\n * - Feedback widget embed code\n * - Credentials (agency only)\n * - Hour packages (agency only)\n * - Domain monitoring (agency only)\n * - Monitoring configuration (project-level feature toggles)\n * - Notifications\n *\n * Note: SEO and Performance monitoring views have moved to MonitoringView.\n * This settings page now only contains configuration for which pages/features to monitor.\n */\n\nimport { useState, useEffect } from 'react'\nimport {\n Globe,\n Key,\n Bell,\n ExternalLink,\n Plus,\n Trash2,\n Eye,\n EyeOff,\n Copy,\n Check,\n Clock,\n Shield,\n AlertTriangle,\n Link2,\n Code,\n BarChart3,\n Settings2,\n Loader2,\n Search,\n Gauge\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport type {\n Phase5Data,\n StoredCredential,\n CredentialType,\n Project,\n ProjectMonitoringFeatures\n} from '@framed/core'\nimport { useTimeTracking } from '../hooks/useTimeTracking'\nimport { useDomainMonitoring } from '../hooks/useDomainMonitoring'\nimport { useUptimeMonitoring } from '../hooks/useUptimeMonitoring'\nimport type { UseTimeTrackingCallbacks } from '../hooks/useTimeTracking'\nimport type { UseDomainMonitoringCallbacks } from '../hooks/useDomainMonitoring'\nimport type { UseUptimeMonitoringCallbacks } from '../hooks/useUptimeMonitoring'\n\ninterface SettingsViewProps {\n projectId: string\n agencyId?: string\n project: Project | null\n phase5Data: Phase5Data\n onUpdateUrls: (liveUrl?: string, stagingUrl?: string) => Promise<void>\n onAddCredential: (credential: Omit<StoredCredential, 'id' | 'created_at' | 'created_by' | 'created_by_name'>) => Promise<void>\n onUpdateCredential: (id: string, updates: Partial<StoredCredential>) => Promise<void>\n onDeleteCredential: (id: string) => Promise<void>\n onProjectUpdate?: () => void\n /** Callback to update monitoring features on the project */\n onUpdateMonitoringFeatures?: (features: ProjectMonitoringFeatures) => Promise<void>\n /** Toast notification callback */\n onToast?: (message: { title: string; description?: string; variant?: 'default' | 'destructive' }) => void\n canEdit: boolean\n isAgency: boolean\n hasGoldPlan?: boolean // Gold plan enables SEO and Performance monitoring\n // Time tracking callbacks\n timeTrackingCallbacks?: UseTimeTrackingCallbacks\n // Domain monitoring callbacks\n domainMonitoringCallbacks?: UseDomainMonitoringCallbacks\n // Uptime monitoring callbacks\n uptimeMonitoringCallbacks?: UseUptimeMonitoringCallbacks\n}\n\ntype SettingsTab = 'general' | 'widget' | 'analytics' | 'credentials' | 'hours' | 'domains' | 'monitoring-config' | 'notifications'\n\nexport const SettingsView = ({\n projectId,\n agencyId,\n project,\n phase5Data,\n onUpdateUrls,\n onAddCredential,\n onUpdateCredential,\n onDeleteCredential,\n onProjectUpdate,\n onUpdateMonitoringFeatures,\n onToast,\n canEdit,\n isAgency,\n hasGoldPlan = false,\n timeTrackingCallbacks,\n domainMonitoringCallbacks,\n uptimeMonitoringCallbacks,\n}: SettingsViewProps) => {\n const toast = onToast || (() => {})\n const [activeTab, setActiveTab] = useState<SettingsTab>('general')\n\n // Hour packages and domain monitoring hooks\n const {\n hourPackages,\n createHourPackage,\n deleteHourPackage,\n loading: loadingHours\n } = useTimeTracking({\n projectId,\n agencyId: agencyId || '',\n ...timeTrackingCallbacks,\n })\n\n const {\n monitors: domainMonitors,\n addMonitor: addDomainMonitor,\n deleteMonitor: deleteDomainMonitor,\n checkDomain,\n loading: loadingDomains\n } = useDomainMonitoring({\n projectId,\n agencyId,\n ...domainMonitoringCallbacks,\n })\n\n const {\n monitors: uptimeMonitors,\n addMonitor: addUptimeMonitor,\n deleteMonitor: deleteUptimeMonitor,\n loading: loadingUptime\n } = useUptimeMonitoring({\n projectId,\n agencyId,\n liveUrl: phase5Data.live_url,\n ...uptimeMonitoringCallbacks,\n })\n\n // Helper to extract domain from URL\n const extractDomain = (url: string): string | null => {\n if (!url) return null\n try {\n const u = new URL(url.startsWith('http') ? url : `https://${url}`)\n return u.hostname\n } catch {\n return null\n }\n }\n\n // Check if a domain monitor exists for a given domain\n const hasDomainMonitor = (domain: string | null): boolean => {\n if (!domain) return false\n return domainMonitors.some(m => m.domain === domain)\n }\n\n // Check if an uptime monitor exists for a given URL\n const hasUptimeMonitor = (url: string): boolean => {\n if (!url) return false\n const normalizedUrl = url.startsWith('http') ? url : `https://${url}`\n return uptimeMonitors.some(m => m.url === normalizedUrl || m.url === url)\n }\n\n // Get domain monitor for a domain\n const getDomainMonitor = (domain: string | null) => {\n if (!domain) return null\n return domainMonitors.find(m => m.domain === domain)\n }\n\n // Get uptime monitor for a URL\n const getUptimeMonitor = (url: string) => {\n if (!url) return null\n const normalizedUrl = url.startsWith('http') ? url : `https://${url}`\n return uptimeMonitors.find(m => m.url === normalizedUrl || m.url === url)\n }\n\n // URL state\n const [liveUrl, setLiveUrl] = useState(phase5Data.live_url || '')\n const [stagingUrl, setStagingUrl] = useState(phase5Data.staging_url || '')\n const [savingUrls, setSavingUrls] = useState(false)\n\n // Monitoring toggle state - initialized based on existing monitors\n const liveDomain = extractDomain(liveUrl)\n const stagingDomain = extractDomain(stagingUrl)\n const [enableLiveDomainMonitoring, setEnableLiveDomainMonitoring] = useState(false)\n const [enableLiveUptimeMonitoring, setEnableLiveUptimeMonitoring] = useState(false)\n const [enableStagingDomainMonitoring, setEnableStagingDomainMonitoring] = useState(false)\n\n // Sync toggle state with existing monitors when data loads\n const liveDomainMonitorExists = hasDomainMonitor(liveDomain)\n const liveUptimeMonitorExists = hasUptimeMonitor(liveUrl)\n const stagingDomainMonitorExists = hasDomainMonitor(stagingDomain)\n\n // Initialize toggles based on existing monitors (only when monitors finish loading)\n useEffect(() => {\n if (!loadingDomains && !loadingUptime) {\n setEnableLiveDomainMonitoring(liveDomainMonitorExists)\n setEnableLiveUptimeMonitoring(liveUptimeMonitorExists)\n setEnableStagingDomainMonitoring(stagingDomainMonitorExists)\n }\n }, [loadingDomains, loadingUptime, liveDomainMonitorExists, liveUptimeMonitorExists, stagingDomainMonitorExists])\n\n // Widget embed code state\n const [copiedScript, setCopiedScript] = useState(false)\n\n // Credential state\n const [showAddCredential, setShowAddCredential] = useState(false)\n const [newCredName, setNewCredName] = useState('')\n const [newCredType, setNewCredType] = useState<CredentialType>('hosting')\n const [newCredUrl, setNewCredUrl] = useState('')\n const [newCredUsername, setNewCredUsername] = useState('')\n const [newCredPassword, setNewCredPassword] = useState('')\n const [newCredNotes, setNewCredNotes] = useState('')\n const [visiblePasswords, setVisiblePasswords] = useState<Set<string>>(new Set())\n const [copiedField, setCopiedField] = useState<string | null>(null)\n\n // Hour package state\n const [showAddPackage, setShowAddPackage] = useState(false)\n const [newPackageName, setNewPackageName] = useState('')\n const [newPackageHours, setNewPackageHours] = useState('')\n const [newPackageExpiry, setNewPackageExpiry] = useState('')\n const [savingPackage, setSavingPackage] = useState(false)\n\n // Domain monitor state\n const [showAddDomain, setShowAddDomain] = useState(false)\n const [newDomain, setNewDomain] = useState('')\n const [savingDomain, setSavingDomain] = useState(false)\n\n // Analytics script state\n const [copiedAnalytics, setCopiedAnalytics] = useState(false)\n\n // Monitoring feature state - read from project\n const monitoringFeatures = project?.monitoring_features ?? {\n seo_enabled: false,\n performance_enabled: false,\n uptime_enabled: false,\n analytics_enabled: false,\n }\n const [savingMonitoringFeature, setSavingMonitoringFeature] = useState<string | null>(null)\n\n // Handler for toggling monitoring features\n const handleMonitoringFeatureToggle = async (featureKey: keyof ProjectMonitoringFeatures) => {\n if (!project || !onUpdateMonitoringFeatures) return\n\n setSavingMonitoringFeature(featureKey)\n\n try {\n const currentValue = monitoringFeatures[featureKey] ?? false\n const updatedFeatures = {\n ...monitoringFeatures,\n [featureKey]: !currentValue,\n }\n\n await onUpdateMonitoringFeatures(updatedFeatures)\n\n toast({\n title: !currentValue ? 'Feature enabled' : 'Feature disabled',\n description: `Monitoring feature has been ${!currentValue ? 'enabled' : 'disabled'} for this project.`,\n })\n\n // Notify parent to refresh project data\n onProjectUpdate?.()\n } catch (err) {\n console.error('Error updating monitoring feature:', err)\n toast({\n title: 'Error',\n description: 'Failed to update monitoring settings.',\n variant: 'destructive',\n })\n } finally {\n setSavingMonitoringFeature(null)\n }\n }\n\n const tabs: { id: SettingsTab; label: string; icon: React.ElementType; agencyOnly?: boolean }[] = [\n { id: 'general', label: 'General', icon: Globe },\n { id: 'widget', label: 'Feedback Widget', icon: Link2 },\n { id: 'analytics', label: 'Analytics', icon: BarChart3, agencyOnly: true },\n { id: 'credentials', label: 'Credentials', icon: Key }, // Clients can view credentials\n { id: 'hours', label: 'Hour Packages', icon: Clock, agencyOnly: true },\n { id: 'domains', label: 'Domains', icon: Shield, agencyOnly: true },\n { id: 'monitoring-config', label: 'Monitoring Config', icon: Settings2, agencyOnly: true },\n { id: 'notifications', label: 'Notifications', icon: Bell }\n ]\n\n const filteredTabs = tabs.filter(tab => !tab.agencyOnly || isAgency)\n\n // Handle URL save with monitoring setup\n const handleSaveUrls = async () => {\n setSavingUrls(true)\n try {\n // Save the URLs first\n await onUpdateUrls(liveUrl || undefined, stagingUrl || undefined)\n\n // Handle live URL domain monitoring\n const newLiveDomain = extractDomain(liveUrl)\n if (enableLiveDomainMonitoring && newLiveDomain && !hasDomainMonitor(newLiveDomain)) {\n await addDomainMonitor(newLiveDomain)\n } else if (!enableLiveDomainMonitoring && newLiveDomain) {\n const existingMonitor = getDomainMonitor(newLiveDomain)\n if (existingMonitor) {\n await deleteDomainMonitor(existingMonitor.id)\n }\n }\n\n // Handle live URL uptime monitoring\n if (enableLiveUptimeMonitoring && liveUrl && !hasUptimeMonitor(liveUrl)) {\n await addUptimeMonitor(liveUrl, 'Live Site')\n } else if (!enableLiveUptimeMonitoring && liveUrl) {\n const existingMonitor = getUptimeMonitor(liveUrl)\n if (existingMonitor) {\n await deleteUptimeMonitor(existingMonitor.id)\n }\n }\n\n // Handle staging URL domain monitoring\n const newStagingDomain = extractDomain(stagingUrl)\n if (enableStagingDomainMonitoring && newStagingDomain && !hasDomainMonitor(newStagingDomain)) {\n await addDomainMonitor(newStagingDomain)\n } else if (!enableStagingDomainMonitoring && newStagingDomain) {\n const existingMonitor = getDomainMonitor(newStagingDomain)\n if (existingMonitor) {\n await deleteDomainMonitor(existingMonitor.id)\n }\n }\n\n toast({\n title: 'Settings saved',\n description: 'URLs and monitoring settings have been updated.',\n })\n } catch (err) {\n console.error('Error saving URLs:', err)\n toast({\n title: 'Error',\n description: 'Failed to save some settings. Please try again.',\n variant: 'destructive',\n })\n } finally {\n setSavingUrls(false)\n }\n }\n\n // Get embed script\n const getEmbedScript = () => {\n const origin = typeof window !== 'undefined'\n ? window.location.origin.replace('http://', 'https://')\n : 'https://app.framed.dev'\n return `<script src=\"${origin}/framed-widget-loader.js\" data-framed-project=\"${projectId}\" async></script>`\n }\n\n // Get analytics script\n const getAnalyticsScript = () => {\n const origin = typeof window !== 'undefined'\n ? window.location.origin.replace('http://', 'https://')\n : 'https://app.framed.dev'\n return `<script src=\"${origin}/framed-analytics.js\" data-framed-project=\"${projectId}\" async></script>`\n }\n\n // Copy embed script\n const copyEmbedScript = async () => {\n try {\n await navigator.clipboard.writeText(getEmbedScript())\n setCopiedScript(true)\n setTimeout(() => setCopiedScript(false), 2000)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n // Copy analytics script\n const copyAnalyticsScript = async () => {\n try {\n await navigator.clipboard.writeText(getAnalyticsScript())\n setCopiedAnalytics(true)\n setTimeout(() => setCopiedAnalytics(false), 2000)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n // Credential types\n const credentialTypes = [\n { value: 'hosting', label: 'Hosting' },\n { value: 'cms', label: 'CMS / Admin' },\n { value: 'ftp', label: 'FTP / SFTP' },\n { value: 'database', label: 'Database' },\n { value: 'email', label: 'Email' },\n { value: 'api', label: 'API' },\n { value: 'other', label: 'Other' }\n ]\n\n // Handle add credential\n const handleAddCredential = async () => {\n if (!newCredName.trim()) return\n\n await onAddCredential({\n name: newCredName.trim(),\n type: newCredType,\n url: newCredUrl || undefined,\n username: newCredUsername || undefined,\n password: newCredPassword || undefined,\n notes: newCredNotes || undefined\n })\n\n // Reset form\n setNewCredName('')\n setNewCredType('hosting')\n setNewCredUrl('')\n setNewCredUsername('')\n setNewCredPassword('')\n setNewCredNotes('')\n setShowAddCredential(false)\n }\n\n // Handle add hour package\n const handleAddPackage = async () => {\n if (!newPackageName.trim() || !newPackageHours) return\n\n setSavingPackage(true)\n try {\n await createHourPackage({\n name: newPackageName.trim(),\n total_minutes: parseInt(newPackageHours) * 60,\n expires_at: newPackageExpiry || undefined\n })\n setNewPackageName('')\n setNewPackageHours('')\n setNewPackageExpiry('')\n setShowAddPackage(false)\n } finally {\n setSavingPackage(false)\n }\n }\n\n // Handle add domain\n const handleAddDomain = async () => {\n if (!newDomain.trim()) return\n\n setSavingDomain(true)\n try {\n let domain = newDomain.trim().toLowerCase()\n domain = domain.replace(/^https?:\\/\\//, '').replace(/\\/.*$/, '')\n\n await addDomainMonitor(domain)\n setNewDomain('')\n setShowAddDomain(false)\n } finally {\n setSavingDomain(false)\n }\n }\n\n // Format date for display\n const formatDate = (dateStr: string | null) => {\n if (!dateStr) return 'Unknown'\n try {\n return new Date(dateStr).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n } catch {\n return 'Unknown'\n }\n }\n\n // Get days until expiry\n const getDaysUntil = (dateStr: string | null) => {\n if (!dateStr) return null\n try {\n const date = new Date(dateStr)\n const now = new Date()\n const diff = date.getTime() - now.getTime()\n return Math.ceil(diff / (1000 * 60 * 60 * 24))\n } catch {\n return null\n }\n }\n\n // Toggle password visibility\n const togglePasswordVisibility = (credId: string) => {\n setVisiblePasswords(prev => {\n const next = new Set(prev)\n if (next.has(credId)) {\n next.delete(credId)\n } else {\n next.add(credId)\n }\n return next\n })\n }\n\n // Copy to clipboard\n const copyToClipboard = async (text: string, fieldId: string) => {\n try {\n await navigator.clipboard.writeText(text)\n setCopiedField(fieldId)\n setTimeout(() => setCopiedField(null), 2000)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex-shrink-0 px-6 py-4 border-b border-slate-200 bg-white\">\n <h1 className=\"text-xl font-semibold text-slate-900\">Project Settings</h1>\n <p className=\"text-sm text-slate-500 mt-1\">Configure project URLs, credentials, and notifications</p>\n </div>\n\n <div className=\"flex-1 flex overflow-hidden\">\n {/* Tabs Sidebar */}\n <div className=\"w-52 flex-shrink-0 border-r border-slate-200 bg-slate-50 p-3\">\n <div className=\"space-y-1\">\n {filteredTabs.map(tab => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors text-left',\n activeTab === tab.id\n ? 'bg-white text-slate-900 font-medium shadow-sm'\n : 'text-slate-600 hover:bg-white/50'\n )}\n >\n <tab.icon className=\"w-4 h-4\" />\n <span className=\"flex-1\">{tab.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto p-6\">\n <div className=\"max-w-2xl\">\n {/* General Tab */}\n {activeTab === 'general' && (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-lg font-medium text-slate-900 mb-4\">Project URLs</h2>\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-slate-700 mb-1\">\n Live Site URL\n </label>\n <div className=\"flex gap-2\">\n <input\n type=\"url\"\n value={liveUrl}\n onChange={(e) => setLiveUrl(e.target.value)}\n placeholder=\"https://example.com\"\n disabled={!canEdit}\n className=\"flex-1 px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 disabled:bg-slate-50 disabled:text-slate-500\"\n />\n {liveUrl && (\n <a\n href={liveUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"p-2 rounded-lg border border-slate-200 text-slate-500 hover:text-slate-700 hover:bg-slate-50 transition-colors\"\n >\n <ExternalLink className=\"w-4 h-4\" />\n </a>\n )}\n </div>\n <p className=\"mt-1 text-xs text-slate-400\">\n The live production URL where the website is hosted\n </p>\n\n {/* Monitoring toggles for Live URL - agency only */}\n {isAgency && liveUrl && (\n <div className=\"mt-3 pl-1 space-y-2\">\n <label className=\"flex items-center gap-2 cursor-pointer group\">\n <input\n type=\"checkbox\"\n checked={enableLiveDomainMonitoring}\n onChange={(e) => setEnableLiveDomainMonitoring(e.target.checked)}\n disabled={!canEdit || loadingDomains}\n className=\"w-4 h-4 rounded border-slate-300 text-blue-600 focus:ring-blue-500 disabled:opacity-50\"\n />\n <span className=\"text-sm text-slate-600 group-hover:text-slate-800\">\n Enable domain monitoring\n </span>\n <span className=\"text-xs text-slate-400\">(SSL & domain expiry alerts)</span>\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer group\">\n <input\n type=\"checkbox\"\n checked={enableLiveUptimeMonitoring}\n onChange={(e) => setEnableLiveUptimeMonitoring(e.target.checked)}\n disabled={!canEdit || loadingUptime}\n className=\"w-4 h-4 rounded border-slate-300 text-blue-600 focus:ring-blue-500 disabled:opacity-50\"\n />\n <span className=\"text-sm text-slate-600 group-hover:text-slate-800\">\n Enable uptime monitoring\n </span>\n <span className=\"text-xs text-slate-400\">(availability checks)</span>\n </label>\n </div>\n )}\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-slate-700 mb-1\">\n Staging URL\n </label>\n <div className=\"flex gap-2\">\n <input\n type=\"url\"\n value={stagingUrl}\n onChange={(e) => setStagingUrl(e.target.value)}\n placeholder=\"https://staging.example.com\"\n disabled={!canEdit}\n className=\"flex-1 px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 disabled:bg-slate-50 disabled:text-slate-500\"\n />\n {stagingUrl && (\n <a\n href={stagingUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"p-2 rounded-lg border border-slate-200 text-slate-500 hover:text-slate-700 hover:bg-slate-50 transition-colors\"\n >\n <ExternalLink className=\"w-4 h-4\" />\n </a>\n )}\n </div>\n <p className=\"mt-1 text-xs text-slate-400\">\n Optional staging/development URL for testing\n </p>\n\n {/* Monitoring toggle for Staging URL - agency only, domain only (no uptime) */}\n {isAgency && stagingUrl && (\n <div className=\"mt-3 pl-1\">\n <label className=\"flex items-center gap-2 cursor-pointer group\">\n <input\n type=\"checkbox\"\n checked={enableStagingDomainMonitoring}\n onChange={(e) => setEnableStagingDomainMonitoring(e.target.checked)}\n disabled={!canEdit || loadingDomains}\n className=\"w-4 h-4 rounded border-slate-300 text-blue-600 focus:ring-blue-500 disabled:opacity-50\"\n />\n <span className=\"text-sm text-slate-600 group-hover:text-slate-800\">\n Enable domain monitoring\n </span>\n <span className=\"text-xs text-slate-400\">(SSL & domain expiry alerts)</span>\n </label>\n </div>\n )}\n </div>\n\n {canEdit && (\n <button\n onClick={handleSaveUrls}\n disabled={savingUrls}\n className=\"px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white text-sm font-medium disabled:opacity-50 transition-colors\"\n >\n {savingUrls ? 'Saving...' : 'Save URLs'}\n </button>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Widget Tab */}\n {activeTab === 'widget' && (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-lg font-medium text-slate-900 mb-2\">Feedback Widget</h2>\n <p className=\"text-sm text-slate-500 mb-6\">\n Install the Framed feedback widget on your website to allow clients to submit visual feedback and screen recordings directly from their browser.\n </p>\n\n {/* Embed Code */}\n <div className=\"p-4 rounded-xl bg-slate-900 border border-slate-700\">\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n <Code className=\"w-4 h-4 text-slate-400\" />\n <span className=\"text-sm font-medium text-slate-300\">Embed Code</span>\n </div>\n <button\n onClick={copyEmbedScript}\n className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-md bg-slate-800 hover:bg-slate-700 text-slate-300 text-xs font-medium transition-colors\"\n >\n {copiedScript ? (\n <>\n <Check className=\"w-3.5 h-3.5 text-green-400\" />\n Copied!\n </>\n ) : (\n <>\n <Copy className=\"w-3.5 h-3.5\" />\n Copy\n </>\n )}\n </button>\n </div>\n <pre className=\"text-xs text-emerald-400 font-mono overflow-x-auto p-3 bg-slate-950 rounded-lg\">\n {getEmbedScript()}\n </pre>\n </div>\n\n <div className=\"mt-6 p-4 rounded-xl bg-amber-50 border border-amber-200\">\n <div className=\"flex items-start gap-3\">\n <AlertTriangle className=\"w-5 h-5 text-amber-600 flex-shrink-0 mt-0.5\" />\n <div>\n <h4 className=\"text-sm font-medium text-amber-900\">Installation Required</h4>\n <p className=\"text-sm text-amber-700 mt-1\">\n Add this script to the <code className=\"px-1 py-0.5 bg-amber-100 rounded text-xs\">&lt;head&gt;</code> section of your website.\n The widget will automatically appear for authenticated users and clients with a valid feedback link.\n </p>\n </div>\n </div>\n </div>\n\n {/* How it works */}\n <div className=\"mt-6\">\n <h3 className=\"text-sm font-medium text-slate-900 mb-3\">How it works</h3>\n <ol className=\"space-y-3 text-sm text-slate-600\">\n <li className=\"flex items-start gap-3\">\n <span className=\"flex-shrink-0 w-6 h-6 rounded-full bg-blue-100 text-blue-700 text-xs font-bold flex items-center justify-center\">1</span>\n <span>Add the embed code to your website's HTML</span>\n </li>\n <li className=\"flex items-start gap-3\">\n <span className=\"flex-shrink-0 w-6 h-6 rounded-full bg-blue-100 text-blue-700 text-xs font-bold flex items-center justify-center\">2</span>\n <span>Click \"Give Feedback\" in the sidebar to create a feedback session</span>\n </li>\n <li className=\"flex items-start gap-3\">\n <span className=\"flex-shrink-0 w-6 h-6 rounded-full bg-blue-100 text-blue-700 text-xs font-bold flex items-center justify-center\">3</span>\n <span>The widget will appear on the live site, allowing visual feedback and recordings</span>\n </li>\n <li className=\"flex items-start gap-3\">\n <span className=\"flex-shrink-0 w-6 h-6 rounded-full bg-blue-100 text-blue-700 text-xs font-bold flex items-center justify-center\">4</span>\n <span>Feedback is automatically converted to maintenance tickets</span>\n </li>\n </ol>\n </div>\n </div>\n </div>\n )}\n\n {/* Analytics Tab */}\n {activeTab === 'analytics' && isAgency && (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-lg font-medium text-slate-900 mb-2\">Analytics Tracking</h2>\n <p className=\"text-sm text-slate-500 mb-6\">\n Install the Framed analytics script on your website to track page views and user behavior.\n </p>\n\n {/* Embed Code */}\n <div className=\"p-4 rounded-xl bg-slate-900 border border-slate-700\">\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n <Code className=\"w-4 h-4 text-slate-400\" />\n <span className=\"text-sm font-medium text-slate-300\">Embed Code</span>\n </div>\n <button\n onClick={copyAnalyticsScript}\n className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-md bg-slate-800 hover:bg-slate-700 text-slate-300 text-xs font-medium transition-colors\"\n >\n {copiedAnalytics ? (\n <>\n <Check className=\"w-3.5 h-3.5 text-green-400\" />\n Copied!\n </>\n ) : (\n <>\n <Copy className=\"w-3.5 h-3.5\" />\n Copy\n </>\n )}\n </button>\n </div>\n <pre className=\"text-xs text-emerald-400 font-mono overflow-x-auto p-3 bg-slate-950 rounded-lg\">\n {getAnalyticsScript()}\n </pre>\n </div>\n\n <div className=\"mt-6 p-4 rounded-xl bg-amber-50 border border-amber-200\">\n <div className=\"flex items-start gap-3\">\n <AlertTriangle className=\"w-5 h-5 text-amber-600 flex-shrink-0 mt-0.5\" />\n <div>\n <h4 className=\"text-sm font-medium text-amber-900\">Installation Required</h4>\n <p className=\"text-sm text-amber-700 mt-1\">\n Add this script to the <code className=\"px-1 py-0.5 bg-amber-100 rounded text-xs\">&lt;head&gt;</code> section of your website to enable analytics tracking.\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Credentials Tab - Clients can view, only agency can add/delete */}\n {activeTab === 'credentials' && (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-lg font-medium text-slate-900 mb-2\">Credentials</h2>\n <p className=\"text-sm text-slate-500 mb-6\">\n Store login credentials for hosting, CMS, and other services securely.\n </p>\n\n {/* Existing credentials */}\n {phase5Data.credentials && phase5Data.credentials.length > 0 ? (\n <div className=\"space-y-3 mb-6\">\n {phase5Data.credentials.map(cred => (\n <div\n key={cred.id}\n className=\"p-4 rounded-xl bg-white border border-slate-200\"\n >\n <div className=\"flex items-start justify-between mb-3\">\n <div>\n <h4 className=\"font-medium text-slate-900\">{cred.name}</h4>\n <span className=\"text-xs px-2 py-0.5 rounded-full bg-slate-100 text-slate-600 mt-1 inline-block\">\n {cred.type}\n </span>\n </div>\n {canEdit && isAgency && (\n <button\n onClick={() => onDeleteCredential(cred.id)}\n className=\"p-1 rounded text-slate-400 hover:text-rose-500 transition-colors\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n\n <div className=\"space-y-2 text-sm\">\n {cred.url && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-slate-500 w-20\">URL:</span>\n <a href={cred.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-600 hover:underline truncate\">\n {cred.url}\n </a>\n </div>\n )}\n {cred.username && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-slate-500 w-20\">Username:</span>\n <span className=\"text-slate-900 font-mono\">{cred.username}</span>\n <button\n onClick={() => copyToClipboard(cred.username!, `username-${cred.id}`)}\n className=\"p-1 rounded text-slate-400 hover:text-slate-600\"\n >\n {copiedField === `username-${cred.id}` ? (\n <Check className=\"w-3 h-3 text-green-500\" />\n ) : (\n <Copy className=\"w-3 h-3\" />\n )}\n </button>\n </div>\n )}\n {cred.password && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-slate-500 w-20\">Password:</span>\n <span className=\"text-slate-900 font-mono\">\n {visiblePasswords.has(cred.id) ? cred.password : '••••••••'}\n </span>\n <button\n onClick={() => togglePasswordVisibility(cred.id)}\n className=\"p-1 rounded text-slate-400 hover:text-slate-600\"\n >\n {visiblePasswords.has(cred.id) ? (\n <EyeOff className=\"w-3 h-3\" />\n ) : (\n <Eye className=\"w-3 h-3\" />\n )}\n </button>\n <button\n onClick={() => copyToClipboard(cred.password!, `password-${cred.id}`)}\n className=\"p-1 rounded text-slate-400 hover:text-slate-600\"\n >\n {copiedField === `password-${cred.id}` ? (\n <Check className=\"w-3 h-3 text-green-500\" />\n ) : (\n <Copy className=\"w-3 h-3\" />\n )}\n </button>\n </div>\n )}\n {cred.notes && (\n <div className=\"mt-2 pt-2 border-t border-slate-100\">\n <span className=\"text-slate-500 text-xs\">Notes:</span>\n <p className=\"text-slate-700 mt-1\">{cred.notes}</p>\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-8 bg-slate-50 rounded-xl border border-dashed border-slate-200 mb-6\">\n <Key className=\"w-8 h-8 mx-auto mb-2 text-slate-300\" />\n <p className=\"text-slate-500\">No credentials stored</p>\n </div>\n )}\n\n {/* Add credential form */}\n {showAddCredential ? (\n <div className=\"p-4 rounded-xl bg-blue-50 border border-blue-200 space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-xs font-medium text-slate-500 mb-1 block\">Name *</label>\n <input\n type=\"text\"\n value={newCredName}\n onChange={(e) => setNewCredName(e.target.value)}\n placeholder=\"e.g. Hosting Login\"\n className=\"w-full px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400\"\n />\n </div>\n <div>\n <label className=\"text-xs font-medium text-slate-500 mb-1 block\">Type</label>\n <select\n value={newCredType}\n onChange={(e) => setNewCredType(e.target.value as CredentialType)}\n className=\"w-full px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400\"\n >\n {credentialTypes.map(type => (\n <option key={type.value} value={type.value}>{type.label}</option>\n ))}\n </select>\n </div>\n </div>\n <div>\n <label className=\"text-xs font-medium text-slate-500 mb-1 block\">URL</label>\n <input\n type=\"url\"\n value={newCredUrl}\n onChange={(e) => setNewCredUrl(e.target.value)}\n placeholder=\"https://...\"\n className=\"w-full px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-xs font-medium text-slate-500 mb-1 block\">Username</label>\n <input\n type=\"text\"\n value={newCredUsername}\n onChange={(e) => setNewCredUsername(e.target.value)}\n className=\"w-full px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400\"\n />\n </div>\n <div>\n <label className=\"text-xs font-medium text-slate-500 mb-1 block\">Password</label>\n <input\n type=\"password\"\n value={newCredPassword}\n onChange={(e) => setNewCredPassword(e.target.value)}\n className=\"w-full px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-xs font-medium text-slate-500 mb-1 block\">Notes</label>\n <textarea\n value={newCredNotes}\n onChange={(e) => setNewCredNotes(e.target.value)}\n rows={2}\n className=\"w-full px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm resize-none focus:outline-none focus:ring-2 focus:ring-blue-400\"\n />\n </div>\n <div className=\"flex gap-2\">\n <button\n onClick={handleAddCredential}\n disabled={!newCredName.trim()}\n className=\"px-4 py-2 rounded-lg bg-blue-500 hover:bg-blue-600 text-white text-sm font-medium disabled:opacity-50\"\n >\n Save\n </button>\n <button\n onClick={() => setShowAddCredential(false)}\n className=\"px-4 py-2 rounded-lg text-slate-600 hover:bg-slate-100 text-sm\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : canEdit && isAgency && (\n <button\n onClick={() => setShowAddCredential(true)}\n className=\"flex items-center gap-2 px-4 py-2 rounded-lg border-2 border-dashed border-slate-300 text-slate-500 hover:border-slate-400 hover:text-slate-700 transition-colors w-full justify-center\"\n >\n <Plus className=\"w-4 h-4\" />\n Add Credentials\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Hours Tab */}\n {activeTab === 'hours' && isAgency && (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-lg font-medium text-slate-900 mb-2\">Hour Packages</h2>\n <p className=\"text-sm text-slate-500 mb-6\">\n Manage hour packages (strippenkaarten) for this project. Time logged against maintenance items will be deducted from active packages.\n </p>\n\n {/* Existing packages */}\n {loadingHours ? (\n <div className=\"text-center py-8 text-slate-500\">\n <div className=\"animate-spin w-6 h-6 border-2 border-slate-300 border-t-blue-500 rounded-full mx-auto mb-2\" />\n Loading packages...\n </div>\n ) : hourPackages.length > 0 ? (\n <div className=\"space-y-3 mb-6\">\n {hourPackages.map(pkg => (\n <div\n key={pkg.id}\n className=\"p-4 rounded-xl bg-white border border-slate-200\"\n >\n <div className=\"flex items-start justify-between mb-3\">\n <div>\n <h4 className=\"font-medium text-slate-900\">{pkg.name}</h4>\n <span className={cn(\n 'text-xs px-2 py-0.5 rounded-full',\n pkg.status === 'active' ? 'bg-green-100 text-green-700' :\n pkg.status === 'expired' ? 'bg-red-100 text-red-700' :\n 'bg-slate-100 text-slate-600'\n )}>\n {pkg.status}\n </span>\n </div>\n {canEdit && (\n <button\n onClick={() => deleteHourPackage(pkg.id)}\n className=\"p-1 rounded text-slate-400 hover:text-rose-500 transition-colors\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n\n <div className=\"mb-2\">\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"text-slate-500\">Hours used</span>\n <span className=\"font-medium text-slate-700\">\n {Math.round(pkg.used_minutes / 60)}h / {Math.round(pkg.total_minutes / 60)}h\n </span>\n </div>\n <div className=\"h-2 bg-slate-200 rounded-full overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full transition-all',\n (pkg.used_minutes / pkg.total_minutes) > 0.8 ? 'bg-red-500' :\n (pkg.used_minutes / pkg.total_minutes) > 0.5 ? 'bg-amber-500' : 'bg-green-500'\n )}\n style={{ width: `${Math.min(100, (pkg.used_minutes / pkg.total_minutes) * 100)}%` }}\n />\n </div>\n </div>\n\n <div className=\"flex items-center justify-between text-xs text-slate-400\">\n <span>{Math.round(pkg.remaining_minutes / 60)} hours remaining</span>\n {pkg.expires_at && (\n <span>Expires: {formatDate(pkg.expires_at)}</span>\n )}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-8 bg-slate-50 rounded-xl border border-dashed border-slate-200 mb-6\">\n <Clock className=\"w-8 h-8 mx-auto mb-2 text-slate-300\" />\n <p className=\"text-slate-500\">No hour packages yet</p>\n </div>\n )}\n\n {/* Add package form */}\n {showAddPackage ? (\n <div className=\"p-4 rounded-xl bg-blue-50 border border-blue-200 space-y-3\">\n <div>\n <label className=\"text-xs font-medium text-slate-500 mb-1 block\">Package Name *</label>\n <input\n type=\"text\"\n value={newPackageName}\n onChange={(e) => setNewPackageName(e.target.value)}\n placeholder=\"e.g. Maintenance Q1 2026\"\n className=\"w-full px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"text-xs font-medium text-slate-500 mb-1 block\">Hours *</label>\n <input\n type=\"number\"\n value={newPackageHours}\n onChange={(e) => setNewPackageHours(e.target.value)}\n placeholder=\"e.g. 10\"\n min=\"1\"\n className=\"w-full px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400\"\n />\n </div>\n <div>\n <label className=\"text-xs font-medium text-slate-500 mb-1 block\">Expires (optional)</label>\n <input\n type=\"date\"\n value={newPackageExpiry}\n onChange={(e) => setNewPackageExpiry(e.target.value)}\n className=\"w-full px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400\"\n />\n </div>\n </div>\n <div className=\"flex gap-2\">\n <button\n onClick={handleAddPackage}\n disabled={!newPackageName.trim() || !newPackageHours || savingPackage}\n className=\"px-4 py-2 rounded-lg bg-blue-500 hover:bg-blue-600 text-white text-sm font-medium disabled:opacity-50\"\n >\n {savingPackage ? 'Saving...' : 'Save'}\n </button>\n <button\n onClick={() => setShowAddPackage(false)}\n className=\"px-4 py-2 rounded-lg text-slate-600 hover:bg-slate-100 text-sm\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : canEdit && (\n <button\n onClick={() => setShowAddPackage(true)}\n className=\"flex items-center gap-2 px-4 py-2 rounded-lg border-2 border-dashed border-slate-300 text-slate-500 hover:border-slate-400 hover:text-slate-700 transition-colors w-full justify-center\"\n >\n <Plus className=\"w-4 h-4\" />\n Add Hour Package\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Domains Tab */}\n {activeTab === 'domains' && isAgency && (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-lg font-medium text-slate-900 mb-2\">Domain Monitoring</h2>\n <p className=\"text-sm text-slate-500 mb-6\">\n Monitor domain and SSL certificate expiration dates. You'll receive alerts when expiry dates approach.\n </p>\n\n {/* Existing domains */}\n {loadingDomains ? (\n <div className=\"text-center py-8 text-slate-500\">\n <div className=\"animate-spin w-6 h-6 border-2 border-slate-300 border-t-blue-500 rounded-full mx-auto mb-2\" />\n Loading domains...\n </div>\n ) : domainMonitors.length > 0 ? (\n <div className=\"space-y-3 mb-6\">\n {domainMonitors.map(monitor => {\n const sslDays = getDaysUntil(monitor.ssl_expiry ?? null)\n const domainDays = getDaysUntil(monitor.domain_expiry ?? null)\n const isWarning = (sslDays !== null && sslDays <= 30) || (domainDays !== null && domainDays <= 30)\n const isError = (sslDays !== null && sslDays <= 7) || (domainDays !== null && domainDays <= 7)\n\n return (\n <div\n key={monitor.id}\n className={cn(\n 'p-4 rounded-xl border',\n isError ? 'bg-red-50 border-red-200' :\n isWarning ? 'bg-amber-50 border-amber-200' :\n 'bg-white border-slate-200'\n )}\n >\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n <Globe className=\"w-4 h-4 text-slate-500\" />\n <h4 className=\"font-medium text-slate-900\">{monitor.domain}</h4>\n {isError && <AlertTriangle className=\"w-4 h-4 text-red-500\" />}\n {isWarning && !isError && <AlertTriangle className=\"w-4 h-4 text-amber-500\" />}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => checkDomain(monitor.id)}\n className=\"p-1 rounded text-slate-400 hover:text-blue-500 transition-colors\"\n title=\"Check now\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </button>\n {canEdit && (\n <button\n onClick={() => deleteDomainMonitor(monitor.id)}\n className=\"p-1 rounded text-slate-400 hover:text-rose-500 transition-colors\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-slate-500 block mb-1\">SSL Certificate</span>\n {monitor.ssl_expiry ? (\n <span className={cn(\n 'font-medium',\n sslDays !== null && sslDays <= 7 ? 'text-red-600' :\n sslDays !== null && sslDays <= 30 ? 'text-amber-600' : 'text-slate-900'\n )}>\n {formatDate(monitor.ssl_expiry)}\n {sslDays !== null && (\n <span className=\"text-xs ml-1\">({sslDays}d)</span>\n )}\n </span>\n ) : (\n <span className=\"text-slate-400\">Not checked</span>\n )}\n </div>\n <div>\n <span className=\"text-slate-500 block mb-1\">Domain Registration</span>\n {monitor.domain_expiry ? (\n <span className={cn(\n 'font-medium',\n domainDays !== null && domainDays <= 7 ? 'text-red-600' :\n domainDays !== null && domainDays <= 30 ? 'text-amber-600' : 'text-slate-900'\n )}>\n {formatDate(monitor.domain_expiry)}\n {domainDays !== null && (\n <span className=\"text-xs ml-1\">({domainDays}d)</span>\n )}\n </span>\n ) : (\n <span className=\"text-slate-400\">Not checked</span>\n )}\n </div>\n </div>\n\n {monitor.check_error && (\n <p className=\"mt-2 text-xs text-red-600\">{monitor.check_error}</p>\n )}\n\n {monitor.last_checked && (\n <p className=\"mt-2 text-xs text-slate-400\">\n Last checked: {formatDate(monitor.last_checked)}\n </p>\n )}\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"text-center py-8 bg-slate-50 rounded-xl border border-dashed border-slate-200 mb-6\">\n <Shield className=\"w-8 h-8 mx-auto mb-2 text-slate-300\" />\n <p className=\"text-slate-500\">No domains being monitored</p>\n </div>\n )}\n\n {/* Add domain form */}\n {showAddDomain ? (\n <div className=\"p-4 rounded-xl bg-blue-50 border border-blue-200 space-y-3\">\n <div>\n <label className=\"text-xs font-medium text-slate-500 mb-1 block\">Domain *</label>\n <input\n type=\"text\"\n value={newDomain}\n onChange={(e) => setNewDomain(e.target.value)}\n placeholder=\"e.g. example.com\"\n className=\"w-full px-3 py-2 rounded-lg bg-white border border-slate-200 text-slate-900 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400\"\n />\n <p className=\"text-xs text-slate-400 mt-1\">Enter the domain without https:// prefix</p>\n </div>\n <div className=\"flex gap-2\">\n <button\n onClick={handleAddDomain}\n disabled={!newDomain.trim() || savingDomain}\n className=\"px-4 py-2 rounded-lg bg-blue-500 hover:bg-blue-600 text-white text-sm font-medium disabled:opacity-50\"\n >\n {savingDomain ? 'Adding...' : 'Add Domain'}\n </button>\n <button\n onClick={() => setShowAddDomain(false)}\n className=\"px-4 py-2 rounded-lg text-slate-600 hover:bg-slate-100 text-sm\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : canEdit && (\n <button\n onClick={() => setShowAddDomain(true)}\n className=\"flex items-center gap-2 px-4 py-2 rounded-lg border-2 border-dashed border-slate-300 text-slate-500 hover:border-slate-400 hover:text-slate-700 transition-colors w-full justify-center\"\n >\n <Plus className=\"w-4 h-4\" />\n Add Domain\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Monitoring Configuration Tab */}\n {activeTab === 'monitoring-config' && isAgency && (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-lg font-medium text-slate-900 flex items-center gap-2 mb-2\">\n <Settings2 className=\"w-5 h-5 text-slate-500\" />\n Monitoring Configuration\n </h2>\n <p className=\"text-sm text-slate-500 mb-6\">\n Enable or disable monitoring features for this project.\n Features are only available if they're enabled for your agency.\n </p>\n\n <div className=\"bg-white rounded-xl border border-slate-200 p-6 space-y-6\">\n {/* SEO Monitoring Toggle */}\n <div className=\"flex items-center justify-between py-3 border-b border-slate-100\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-emerald-100 flex items-center justify-center\">\n <Search className=\"w-5 h-5 text-emerald-600\" />\n </div>\n <div>\n <h4 className=\"font-medium text-slate-900\">SEO Monitoring</h4>\n <p className=\"text-sm text-slate-500\">Track SEO issues and get recommendations</p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => handleMonitoringFeatureToggle('seo_enabled')}\n disabled={savingMonitoringFeature === 'seo_enabled' || !onUpdateMonitoringFeatures}\n className={cn(\n 'relative w-12 h-7 rounded-full transition-colors',\n monitoringFeatures.seo_enabled ? 'bg-emerald-500' : 'bg-slate-300',\n (savingMonitoringFeature === 'seo_enabled' || !onUpdateMonitoringFeatures) && 'opacity-50 cursor-not-allowed'\n )}\n >\n {savingMonitoringFeature === 'seo_enabled' ? (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Loader2 className=\"w-4 h-4 text-white animate-spin\" />\n </div>\n ) : (\n <div\n className={cn(\n 'absolute top-1 w-5 h-5 bg-white rounded-full shadow transition-transform flex items-center justify-center',\n monitoringFeatures.seo_enabled ? 'left-6' : 'left-1'\n )}\n >\n {monitoringFeatures.seo_enabled && (\n <Check className=\"w-3 h-3 text-emerald-500\" />\n )}\n </div>\n )}\n </button>\n </div>\n\n {/* Performance Monitoring Toggle */}\n <div className=\"flex items-center justify-between py-3 border-b border-slate-100\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-orange-100 flex items-center justify-center\">\n <Gauge className=\"w-5 h-5 text-orange-600\" />\n </div>\n <div>\n <h4 className=\"font-medium text-slate-900\">Performance Monitoring</h4>\n <p className=\"text-sm text-slate-500\">Track Core Web Vitals and Lighthouse scores</p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => handleMonitoringFeatureToggle('performance_enabled')}\n disabled={savingMonitoringFeature === 'performance_enabled' || !onUpdateMonitoringFeatures}\n className={cn(\n 'relative w-12 h-7 rounded-full transition-colors',\n monitoringFeatures.performance_enabled ? 'bg-emerald-500' : 'bg-slate-300',\n (savingMonitoringFeature === 'performance_enabled' || !onUpdateMonitoringFeatures) && 'opacity-50 cursor-not-allowed'\n )}\n >\n {savingMonitoringFeature === 'performance_enabled' ? (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Loader2 className=\"w-4 h-4 text-white animate-spin\" />\n </div>\n ) : (\n <div\n className={cn(\n 'absolute top-1 w-5 h-5 bg-white rounded-full shadow transition-transform flex items-center justify-center',\n monitoringFeatures.performance_enabled ? 'left-6' : 'left-1'\n )}\n >\n {monitoringFeatures.performance_enabled && (\n <Check className=\"w-3 h-3 text-emerald-500\" />\n )}\n </div>\n )}\n </button>\n </div>\n\n {/* Uptime Monitoring Toggle */}\n <div className=\"flex items-center justify-between py-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-blue-100 flex items-center justify-center\">\n <Globe className=\"w-5 h-5 text-blue-600\" />\n </div>\n <div>\n <h4 className=\"font-medium text-slate-900\">Uptime Monitoring</h4>\n <p className=\"text-sm text-slate-500\">Monitor website availability and get alerts</p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => handleMonitoringFeatureToggle('uptime_enabled')}\n disabled={savingMonitoringFeature === 'uptime_enabled' || !onUpdateMonitoringFeatures}\n className={cn(\n 'relative w-12 h-7 rounded-full transition-colors',\n monitoringFeatures.uptime_enabled ? 'bg-emerald-500' : 'bg-slate-300',\n (savingMonitoringFeature === 'uptime_enabled' || !onUpdateMonitoringFeatures) && 'opacity-50 cursor-not-allowed'\n )}\n >\n {savingMonitoringFeature === 'uptime_enabled' ? (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Loader2 className=\"w-4 h-4 text-white animate-spin\" />\n </div>\n ) : (\n <div\n className={cn(\n 'absolute top-1 w-5 h-5 bg-white rounded-full shadow transition-transform flex items-center justify-center',\n monitoringFeatures.uptime_enabled ? 'left-6' : 'left-1'\n )}\n >\n {monitoringFeatures.uptime_enabled && (\n <Check className=\"w-3 h-3 text-emerald-500\" />\n )}\n </div>\n )}\n </button>\n </div>\n </div>\n\n <p className=\"text-xs text-slate-400 mt-4\">\n Note: Disabling a feature here will hide it from clients but preserve existing data.\n Contact support to permanently delete monitoring data.\n </p>\n </div>\n </div>\n )}\n\n {/* Notifications Tab */}\n {activeTab === 'notifications' && (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-lg font-medium text-slate-900 mb-2\">Notification Preferences</h2>\n <p className=\"text-sm text-slate-500 mb-6\">\n Configure how and when you receive notifications for this project.\n </p>\n\n <div className=\"p-4 rounded-xl bg-white border border-slate-200\">\n <h3 className=\"font-medium text-slate-900 mb-4\">Email Notifications</h3>\n <div className=\"space-y-3\">\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input type=\"checkbox\" defaultChecked className=\"w-4 h-4 rounded border-slate-300 text-blue-500 focus:ring-blue-500\" />\n <span className=\"text-sm text-slate-700\">New tickets created</span>\n </label>\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input type=\"checkbox\" defaultChecked className=\"w-4 h-4 rounded border-slate-300 text-blue-500 focus:ring-blue-500\" />\n <span className=\"text-sm text-slate-700\">Status changes</span>\n </label>\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input type=\"checkbox\" defaultChecked className=\"w-4 h-4 rounded border-slate-300 text-blue-500 focus:ring-blue-500\" />\n <span className=\"text-sm text-slate-700\">New comments</span>\n </label>\n {isAgency && (\n <>\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input type=\"checkbox\" defaultChecked className=\"w-4 h-4 rounded border-slate-300 text-blue-500 focus:ring-blue-500\" />\n <span className=\"text-sm text-slate-700\">Quote responses from clients</span>\n </label>\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input type=\"checkbox\" defaultChecked className=\"w-4 h-4 rounded border-slate-300 text-blue-500 focus:ring-blue-500\" />\n <span className=\"text-sm text-slate-700\">Domain/SSL expiry warnings</span>\n </label>\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input type=\"checkbox\" defaultChecked className=\"w-4 h-4 rounded border-slate-300 text-blue-500 focus:ring-blue-500\" />\n <span className=\"text-sm text-slate-700\">Hour package low balance alerts</span>\n </label>\n </>\n )}\n {!isAgency && (\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input type=\"checkbox\" defaultChecked className=\"w-4 h-4 rounded border-slate-300 text-blue-500 focus:ring-blue-500\" />\n <span className=\"text-sm text-slate-700\">New quotes received</span>\n </label>\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SettingsView\n","/**\n * DomainMonitorDashboard - Dashboard for monitoring domain and SSL expiry\n *\n * Features:\n * - Add/remove domains to monitor\n * - View SSL and domain expiry dates\n * - Manual check trigger\n * - Alert configuration\n *\n * SDK Version: Uses callback-based useDomainMonitoring hook\n */\n\nimport { useState } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n Globe,\n Shield,\n Plus,\n Trash2,\n RefreshCw,\n AlertTriangle,\n CheckCircle,\n XCircle,\n ExternalLink,\n Bell,\n BellOff,\n Loader2\n} from 'lucide-react'\nimport { format, formatDistanceToNow } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn } from '../utils/cn'\nimport type { DomainMonitor } from '@framed/core'\nimport {\n useDomainMonitoring,\n getDaysUntilExpiry,\n getExpiryStatusColor,\n getCheckStatusBadge,\n type UseDomainMonitoringCallbacks\n} from '../hooks/useDomainMonitoring'\n\nexport interface DomainMonitorDashboardProps extends UseDomainMonitoringCallbacks {\n projectId: string\n agencyId?: string\n className?: string\n /** If true, show add/delete/toggle actions; if false, read-only mode for clients */\n isAgency?: boolean\n /** Initial monitors (useful for SSR or cached data) */\n initialMonitors?: DomainMonitor[]\n}\n\nexport const DomainMonitorDashboard = ({\n projectId,\n agencyId,\n className,\n isAgency = true, // Default to true for backwards compatibility\n initialMonitors = [],\n onFetch,\n onAdd,\n onUpdate,\n onDelete,\n onCheck,\n}: DomainMonitorDashboardProps) => {\n const {\n monitors,\n loading,\n error,\n addMonitor,\n updateMonitor,\n deleteMonitor,\n checkDomain,\n refresh\n } = useDomainMonitoring({\n projectId,\n agencyId,\n initialMonitors,\n onFetch,\n onAdd,\n onUpdate,\n onDelete,\n onCheck,\n })\n\n const [showAddForm, setShowAddForm] = useState(false)\n const [newDomain, setNewDomain] = useState('')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [checkingId, setCheckingId] = useState<string | null>(null)\n\n const handleAddDomain = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!newDomain.trim() || isSubmitting) return\n\n setIsSubmitting(true)\n try {\n const result = await addMonitor(newDomain)\n if (result) {\n setNewDomain('')\n setShowAddForm(false)\n // Trigger initial check\n await checkDomain(result.id)\n }\n } finally {\n setIsSubmitting(false)\n }\n }\n\n const handleCheckDomain = async (monitorId: string) => {\n setCheckingId(monitorId)\n try {\n await checkDomain(monitorId)\n } finally {\n setCheckingId(null)\n }\n }\n\n const handleDelete = async (monitorId: string) => {\n if (!confirm('Are you sure you want to remove this domain from monitoring?')) return\n await deleteMonitor(monitorId)\n }\n\n const handleToggleAlerts = async (monitor: DomainMonitor) => {\n await updateMonitor(monitor.id, { alerts_enabled: !monitor.alerts_enabled })\n }\n\n return (\n <div className={cn('bg-white rounded-xl border border-slate-200 overflow-hidden', className)}>\n {/* Header */}\n <div className=\"p-4 border-b border-slate-100 bg-slate-50/50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-blue-100 flex items-center justify-center\">\n <Globe className=\"w-5 h-5 text-blue-600\" />\n </div>\n <div>\n <h3 className=\"font-semibold text-slate-900\">Domain Monitoring</h3>\n <p className=\"text-xs text-slate-500\">\n Track domain and SSL certificate expiry\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => refresh()}\n className=\"p-2 rounded-lg text-slate-400 hover:text-slate-600 hover:bg-slate-100 transition-colors\"\n title=\"Refresh\"\n >\n <RefreshCw className=\"w-4 h-4\" />\n </button>\n {isAgency && (\n <button\n onClick={() => setShowAddForm(!showAddForm)}\n className={cn(\n 'flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm font-medium transition-colors',\n showAddForm\n ? 'bg-slate-200 text-slate-700'\n : 'bg-blue-600 text-white hover:bg-blue-700'\n )}\n >\n <Plus className=\"w-4 h-4\" />\n Add Domain\n </button>\n )}\n </div>\n </div>\n\n {/* Add domain form - Agency only */}\n <AnimatePresence>\n {showAddForm && isAgency && (\n <motion.form\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n onSubmit={handleAddDomain}\n className=\"mt-4 flex gap-2\"\n >\n <input\n type=\"text\"\n value={newDomain}\n onChange={(e) => setNewDomain(e.target.value)}\n placeholder=\"example.com\"\n className=\"flex-1 px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500\"\n autoFocus\n />\n <button\n type=\"submit\"\n disabled={!newDomain.trim() || isSubmitting}\n className=\"px-4 py-2 rounded-lg bg-blue-600 text-white text-sm font-medium hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isSubmitting ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n 'Add'\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(false)\n setNewDomain('')\n }}\n className=\"px-4 py-2 rounded-lg text-slate-600 text-sm font-medium hover:bg-slate-100 transition-colors\"\n >\n Cancel\n </button>\n </motion.form>\n )}\n </AnimatePresence>\n </div>\n\n {/* Error state */}\n {error && (\n <div className=\"p-4 bg-red-50 border-b border-red-100\">\n <div className=\"flex items-center gap-2 text-sm text-red-700\">\n <AlertTriangle className=\"w-4 h-4\" />\n {error}\n </div>\n </div>\n )}\n\n {/* Monitors list */}\n <div className=\"divide-y divide-slate-100\">\n {loading ? (\n <div className=\"p-8 text-center\">\n <Loader2 className=\"w-6 h-6 animate-spin text-slate-400 mx-auto mb-2\" />\n <p className=\"text-sm text-slate-500\">Loading monitors...</p>\n </div>\n ) : monitors.length === 0 ? (\n <div className=\"p-8 text-center\">\n <Globe className=\"w-10 h-10 mx-auto text-slate-300 mb-3\" />\n <p className=\"text-sm text-slate-600 font-medium mb-1\">No domains monitored</p>\n <p className=\"text-xs text-slate-400\">\n Add a domain to track its SSL and registration expiry\n </p>\n </div>\n ) : (\n monitors.map(monitor => (\n <DomainMonitorCard\n key={monitor.id}\n monitor={monitor}\n isChecking={checkingId === monitor.id}\n onCheck={() => handleCheckDomain(monitor.id)}\n onDelete={() => handleDelete(monitor.id)}\n onToggleAlerts={() => handleToggleAlerts(monitor)}\n isAgency={isAgency}\n />\n ))\n )}\n </div>\n </div>\n )\n}\n\n// ============================================\n// Domain Monitor Card\n// ============================================\n\ninterface DomainMonitorCardProps {\n monitor: DomainMonitor\n isChecking: boolean\n onCheck: () => void\n onDelete: () => void\n onToggleAlerts: () => void\n isAgency?: boolean\n}\n\nconst DomainMonitorCard = ({\n monitor,\n isChecking,\n onCheck,\n onDelete,\n onToggleAlerts,\n isAgency = true\n}: DomainMonitorCardProps) => {\n const sslDaysUntil = getDaysUntilExpiry(monitor.ssl_expiry)\n const domainDaysUntil = getDaysUntilExpiry(monitor.domain_expiry)\n const statusBadge = getCheckStatusBadge(monitor.check_status)\n\n // Determine overall status\n const hasWarning = (sslDaysUntil !== null && sslDaysUntil <= 30) ||\n (domainDaysUntil !== null && domainDaysUntil <= 30)\n const hasError = monitor.check_status === 'error' ||\n (sslDaysUntil !== null && sslDaysUntil <= 0) ||\n (domainDaysUntil !== null && domainDaysUntil <= 0)\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n className={cn(\n 'p-4 transition-colors hover:bg-slate-50',\n hasError && 'bg-red-50/50',\n hasWarning && !hasError && 'bg-amber-50/50'\n )}\n >\n <div className=\"flex items-start justify-between gap-4\">\n {/* Domain info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-2\">\n <a\n href={`https://${monitor.domain}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"font-medium text-slate-900 hover:text-blue-600 flex items-center gap-1 transition-colors\"\n >\n {monitor.domain}\n <ExternalLink className=\"w-3 h-3\" />\n </a>\n <span className={cn('px-2 py-0.5 rounded-full text-[10px] font-medium', statusBadge.color)}>\n {statusBadge.label}\n </span>\n {!monitor.alerts_enabled && (\n <span className=\"px-2 py-0.5 rounded-full text-[10px] font-medium bg-slate-100 text-slate-500\">\n Alerts off\n </span>\n )}\n </div>\n\n {/* Expiry info */}\n <div className=\"flex flex-wrap items-center gap-4 text-sm\">\n {/* SSL Expiry */}\n <div className=\"flex items-center gap-2\">\n <Shield className={cn('w-4 h-4', getExpiryStatusColor(sslDaysUntil))} />\n <span className=\"text-slate-500\">SSL:</span>\n {monitor.ssl_expiry ? (\n <span className={cn('font-medium', getExpiryStatusColor(sslDaysUntil))}>\n {sslDaysUntil !== null && sslDaysUntil <= 0 ? (\n 'Expired'\n ) : (\n `${sslDaysUntil} days`\n )}\n <span className=\"text-slate-400 font-normal ml-1\">\n ({format(new Date(monitor.ssl_expiry), 'MMM d, yyyy')})\n </span>\n </span>\n ) : (\n <span className=\"text-slate-400\">Unknown</span>\n )}\n </div>\n\n {/* Domain Expiry */}\n <div className=\"flex items-center gap-2\">\n <Globe className={cn('w-4 h-4', getExpiryStatusColor(domainDaysUntil))} />\n <span className=\"text-slate-500\">Domain:</span>\n {monitor.domain_expiry ? (\n <span className={cn('font-medium', getExpiryStatusColor(domainDaysUntil))}>\n {domainDaysUntil !== null && domainDaysUntil <= 0 ? (\n 'Expired'\n ) : (\n `${domainDaysUntil} days`\n )}\n <span className=\"text-slate-400 font-normal ml-1\">\n ({format(new Date(monitor.domain_expiry), 'MMM d, yyyy')})\n </span>\n </span>\n ) : (\n <span className=\"text-slate-400\">Unknown</span>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {monitor.check_error && (\n <p className=\"mt-2 text-xs text-red-600 flex items-center gap-1\">\n <XCircle className=\"w-3 h-3\" />\n {monitor.check_error}\n </p>\n )}\n\n {/* Last checked */}\n {monitor.last_checked && (\n <p className=\"mt-2 text-xs text-slate-400\">\n Last checked {formatDistanceToNow(new Date(monitor.last_checked), { addSuffix: true, locale: enUS })}\n </p>\n )}\n </div>\n\n {/* Actions - Agency only for check/toggle/delete, clients see read-only */}\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {isAgency && (\n <>\n <button\n onClick={onCheck}\n disabled={isChecking}\n className=\"p-2 rounded-lg text-slate-400 hover:text-blue-600 hover:bg-blue-50 transition-colors disabled:opacity-50\"\n title=\"Check now\"\n >\n {isChecking ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <RefreshCw className=\"w-4 h-4\" />\n )}\n </button>\n <button\n onClick={onToggleAlerts}\n className={cn(\n 'p-2 rounded-lg transition-colors',\n monitor.alerts_enabled\n ? 'text-amber-600 hover:bg-amber-50'\n : 'text-slate-400 hover:text-slate-600 hover:bg-slate-100'\n )}\n title={monitor.alerts_enabled ? 'Disable alerts' : 'Enable alerts'}\n >\n {monitor.alerts_enabled ? (\n <Bell className=\"w-4 h-4\" />\n ) : (\n <BellOff className=\"w-4 h-4\" />\n )}\n </button>\n <button\n onClick={onDelete}\n className=\"p-2 rounded-lg text-slate-400 hover:text-red-600 hover:bg-red-50 transition-colors\"\n title=\"Remove\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </>\n )}\n </div>\n </div>\n </motion.div>\n )\n}\n\n// ============================================\n// Compact Summary Badge\n// ============================================\n\nexport interface DomainStatusBadgeProps {\n monitors: DomainMonitor[]\n onClick?: () => void\n}\n\nexport const DomainStatusBadge = ({ monitors, onClick }: DomainStatusBadgeProps) => {\n // Calculate overall status\n const hasErrors = monitors.some(m => m.check_status === 'error')\n const hasWarnings = monitors.some(m => {\n const sslDays = getDaysUntilExpiry(m.ssl_expiry)\n const domainDays = getDaysUntilExpiry(m.domain_expiry)\n return (sslDays !== null && sslDays <= 30) || (domainDays !== null && domainDays <= 30)\n })\n\n if (monitors.length === 0) return null\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm font-medium transition-all',\n hasErrors\n ? 'bg-red-50 text-red-700 border border-red-200'\n : hasWarnings\n ? 'bg-amber-50 text-amber-700 border border-amber-200'\n : 'bg-emerald-50 text-emerald-700 border border-emerald-200'\n )}\n >\n {hasErrors ? (\n <XCircle className=\"w-4 h-4\" />\n ) : hasWarnings ? (\n <AlertTriangle className=\"w-4 h-4\" />\n ) : (\n <CheckCircle className=\"w-4 h-4\" />\n )}\n <span>{monitors.length} {monitors.length === 1 ? 'domain' : 'domains'}</span>\n </button>\n )\n}\n\nexport default DomainMonitorDashboard\n","/**\n * MonthlyReportView - View and generate monthly maintenance reports\n *\n * Ported from framed-app/src/components/phase5-redesign/MonthlyReportView.tsx\n * Uses callback-based props instead of direct Supabase calls.\n *\n * Features:\n * - Generate reports for any month\n * - View aggregated statistics\n * - Send report to client via email\n * - Download as professional PDF with analytics, performance & uptime data\n */\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n FileBarChart,\n Calendar,\n Download,\n Send,\n RefreshCw,\n CheckCircle,\n Clock,\n Ticket,\n TrendingUp,\n AlertCircle,\n Loader2,\n ChevronDown,\n ChevronRight,\n Mail\n} from 'lucide-react'\nimport { format, startOfMonth, endOfMonth, subMonths } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn } from '../utils/cn'\nimport type { MonthlyReport, MonthlyReportData, MaintenancePriority, UptimeMonitor } from '@framed/core'\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Get the last N months as Date objects (first of month)\n */\nexport const getLastMonths = (count: number): Date[] => {\n const months: Date[] = []\n const now = new Date()\n for (let i = 0; i < count; i++) {\n months.push(startOfMonth(subMonths(now, i)))\n }\n return months\n}\n\n/**\n * Format a report month string (YYYY-MM-DD) as human readable\n */\nexport const formatReportMonth = (reportMonth: string): string => {\n const date = new Date(reportMonth)\n return format(date, 'MMMM yyyy', { locale: enUS })\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport interface HourPackageData {\n totalHours: number\n usedHours: number\n remainingHours: number\n}\n\nexport interface PerformanceData {\n performanceScore: number\n accessibilityScore: number\n seoScore: number\n bestPracticesScore: number\n}\n\nexport interface AnalyticsData {\n visitors: number\n pageviews: number\n bounceRate: number\n avgSessionDuration: number\n topPages?: Array<{ path: string; views: number }>\n sources?: Array<{ source: string; count: number }>\n devices?: Array<{ device: string; percentage: number }>\n}\n\nexport interface PdfGenerationParams {\n reportMonth: string\n projectName: string\n agencyName?: string\n agencyLogoUrl?: string\n projectUrl?: string\n data: MonthlyReportData\n analytics?: AnalyticsData\n uptime?: {\n percentage: number\n avgResponseTime: number\n incidents: number\n }\n performance?: PerformanceData\n hourPackage?: HourPackageData\n}\n\nexport interface MonthlyReportViewProps {\n projectId: string\n agencyId?: string\n isAgency?: boolean\n className?: string\n\n // Data props (passed in instead of hooks)\n reports?: MonthlyReport[]\n loading?: boolean\n error?: string | null\n\n // Project/Agency info for PDF generation\n projectName?: string\n projectUrl?: string\n agencyName?: string\n agencyLogoUrl?: string\n\n // Uptime monitors (optional, for PDF generation)\n uptimeMonitors?: UptimeMonitor[]\n\n // Hour package data (optional, for PDF generation)\n hourPackageData?: HourPackageData\n\n // Performance data (optional, for PDF generation)\n performanceData?: PerformanceData\n\n // Analytics data (optional, for PDF generation)\n analyticsData?: AnalyticsData\n\n // Callbacks\n onGenerateReport?: (month: Date) => Promise<MonthlyReport | null>\n onSendToClient?: (reportId: string) => Promise<boolean>\n onRefresh?: () => Promise<void>\n onDownloadPdf?: (params: PdfGenerationParams) => Promise<void>\n onLoadHourPackage?: (projectId: string) => Promise<HourPackageData | null>\n onLoadPerformanceData?: (projectId: string) => Promise<PerformanceData | null>\n}\n\nexport const MonthlyReportView = ({\n projectId,\n agencyId,\n isAgency = true,\n className,\n reports = [],\n loading = false,\n error = null,\n projectName = 'Project',\n projectUrl,\n agencyName,\n agencyLogoUrl,\n uptimeMonitors = [],\n hourPackageData: propHourPackageData,\n performanceData: propPerformanceData,\n analyticsData,\n onGenerateReport,\n onSendToClient,\n onRefresh,\n onDownloadPdf,\n onLoadHourPackage,\n onLoadPerformanceData\n}: MonthlyReportViewProps) => {\n const [selectedMonth, setSelectedMonth] = useState<Date>(new Date())\n const [isGenerating, setIsGenerating] = useState(false)\n const [isSending, setIsSending] = useState<string | null>(null)\n const [isDownloading, setIsDownloading] = useState<string | null>(null)\n const [expandedReportId, setExpandedReportId] = useState<string | null>(null)\n\n // Local state for data that might be loaded dynamically\n const [hourPackageData, setHourPackageData] = useState<HourPackageData | null>(propHourPackageData || null)\n const [performanceData, setPerformanceData] = useState<PerformanceData | null>(propPerformanceData || null)\n\n // Fetch hour package data if callback provided and no prop data\n useEffect(() => {\n if (propHourPackageData) {\n setHourPackageData(propHourPackageData)\n return\n }\n\n if (onLoadHourPackage && projectId) {\n onLoadHourPackage(projectId).then(data => {\n if (data) setHourPackageData(data)\n })\n }\n }, [projectId, propHourPackageData, onLoadHourPackage])\n\n // Fetch performance data if callback provided and no prop data\n useEffect(() => {\n if (propPerformanceData) {\n setPerformanceData(propPerformanceData)\n return\n }\n\n if (onLoadPerformanceData && projectId) {\n onLoadPerformanceData(projectId).then(data => {\n if (data) setPerformanceData(data)\n })\n }\n }, [projectId, propPerformanceData, onLoadPerformanceData])\n\n const lastMonths = getLastMonths(12)\n\n const handleGenerateReport = async () => {\n if (!onGenerateReport) return\n\n setIsGenerating(true)\n try {\n const result = await onGenerateReport(selectedMonth)\n if (result) {\n setExpandedReportId(result.id)\n }\n } finally {\n setIsGenerating(false)\n }\n }\n\n const handleSendToClient = async (reportId: string) => {\n if (!onSendToClient) return\n\n setIsSending(reportId)\n try {\n await onSendToClient(reportId)\n } finally {\n setIsSending(null)\n }\n }\n\n const handleDownloadPdf = async (report: MonthlyReport) => {\n // If there's a pre-generated PDF URL, use it\n if (report.pdf_url) {\n window.open(report.pdf_url, '_blank')\n return\n }\n\n // If no onDownloadPdf callback, can't generate\n if (!onDownloadPdf) {\n console.warn('No onDownloadPdf callback provided')\n return\n }\n\n // Generate PDF on the fly with all available data\n setIsDownloading(report.id)\n try {\n // Build uptime data from monitors\n let uptimeData: { percentage: number; avgResponseTime: number; incidents: number } | undefined = undefined\n if (uptimeMonitors.length > 0) {\n const primaryMonitor = uptimeMonitors[0]\n if (primaryMonitor) {\n const avgResponseTime = uptimeMonitors.reduce((sum, m) => sum + (m.last_response_time_ms || 0), 0) / uptimeMonitors.length\n const incidents = uptimeMonitors.filter(m => !m.is_up).length\n\n uptimeData = {\n percentage: primaryMonitor.uptime_percentage || 99.9,\n avgResponseTime: Math.round(avgResponseTime),\n incidents\n }\n }\n }\n\n await onDownloadPdf({\n reportMonth: report.report_month,\n projectName,\n agencyName,\n agencyLogoUrl,\n projectUrl,\n data: report.data as MonthlyReportData,\n analytics: analyticsData,\n uptime: uptimeData,\n performance: performanceData || undefined,\n hourPackage: hourPackageData || undefined\n })\n } catch (err) {\n console.error('Error generating PDF:', err)\n alert('Failed to generate PDF. Please try again.')\n } finally {\n setIsDownloading(null)\n }\n }\n\n return (\n <div className={cn('bg-white rounded-xl border border-slate-200 overflow-hidden', className)}>\n {/* Header */}\n <div className=\"p-4 border-b border-slate-100 bg-slate-50/50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-purple-100 flex items-center justify-center\">\n <FileBarChart className=\"w-5 h-5 text-purple-600\" />\n </div>\n <div>\n <h3 className=\"font-semibold text-slate-900\">Monthly Reports</h3>\n <p className=\"text-xs text-slate-500\">\n Generate and send activity summaries\n </p>\n </div>\n </div>\n {onRefresh && (\n <button\n onClick={onRefresh}\n className=\"p-2 rounded-lg text-slate-400 hover:text-slate-600 hover:bg-slate-100 transition-colors\"\n title=\"Refresh\"\n >\n <RefreshCw className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n\n {/* Generate report section - agency only */}\n {isAgency && onGenerateReport && (\n <div className=\"mt-4 flex items-center gap-3\">\n <div className=\"relative flex-1\">\n <select\n value={format(selectedMonth, 'yyyy-MM')}\n onChange={(e) => {\n const parts = e.target.value.split('-')\n const year = parts[0] ?? '2024'\n const month = parts[1] ?? '01'\n setSelectedMonth(new Date(parseInt(year), parseInt(month) - 1, 1))\n }}\n className=\"w-full px-3 py-2 pr-8 rounded-lg border border-slate-200 text-sm text-slate-900 bg-white focus:outline-none focus:ring-2 focus:ring-purple-500/50 focus:border-purple-500 appearance-none\"\n >\n {lastMonths.map(month => (\n <option key={format(month, 'yyyy-MM')} value={format(month, 'yyyy-MM')}>\n {format(month, 'MMMM yyyy', { locale: enUS })}\n </option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400 pointer-events-none\" />\n </div>\n <button\n onClick={handleGenerateReport}\n disabled={isGenerating}\n className=\"flex items-center gap-2 px-4 py-2 rounded-lg bg-purple-600 text-white text-sm font-medium hover:bg-purple-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isGenerating ? (\n <>\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n Generating...\n </>\n ) : (\n <>\n <FileBarChart className=\"w-4 h-4\" />\n Generate Report\n </>\n )}\n </button>\n </div>\n )}\n </div>\n\n {/* Error state */}\n {error && (\n <div className=\"p-4 bg-red-50 border-b border-red-100\">\n <div className=\"flex items-center gap-2 text-sm text-red-700\">\n <AlertCircle className=\"w-4 h-4\" />\n {error}\n </div>\n </div>\n )}\n\n {/* Reports list */}\n <div className=\"divide-y divide-slate-100\">\n {loading ? (\n <div className=\"p-8 text-center\">\n <Loader2 className=\"w-6 h-6 animate-spin text-slate-400 mx-auto mb-2\" />\n <p className=\"text-sm text-slate-500\">Loading reports...</p>\n </div>\n ) : reports.length === 0 ? (\n <div className=\"p-8 text-center\">\n <FileBarChart className=\"w-10 h-10 mx-auto text-slate-300 mb-3\" />\n <p className=\"text-sm text-slate-600 font-medium mb-1\">No reports yet</p>\n <p className=\"text-xs text-slate-400\">\n Generate your first monthly report above\n </p>\n </div>\n ) : (\n reports.map(report => (\n <ReportCard\n key={report.id}\n report={report}\n isExpanded={expandedReportId === report.id}\n onToggleExpand={() => setExpandedReportId(\n expandedReportId === report.id ? null : report.id\n )}\n onSendToClient={() => handleSendToClient(report.id)}\n onDownloadPdf={() => handleDownloadPdf(report)}\n isSending={isSending === report.id}\n isDownloading={isDownloading === report.id}\n canSendToClient={!!onSendToClient}\n canDownloadPdf={!!report.pdf_url || !!onDownloadPdf}\n />\n ))\n )}\n </div>\n </div>\n )\n}\n\n// ============================================\n// Report Card\n// ============================================\n\ninterface ReportCardProps {\n report: MonthlyReport\n isExpanded: boolean\n onToggleExpand: () => void\n onSendToClient: () => void\n onDownloadPdf: () => void\n isSending: boolean\n isDownloading: boolean\n canSendToClient: boolean\n canDownloadPdf: boolean\n}\n\nconst ReportCard = ({\n report,\n isExpanded,\n onToggleExpand,\n onSendToClient,\n onDownloadPdf,\n isSending,\n isDownloading,\n canSendToClient,\n canDownloadPdf\n}: ReportCardProps) => {\n const data = report.data as MonthlyReportData\n\n return (\n <div className=\"transition-colors hover:bg-slate-50/50\">\n {/* Header row */}\n <div\n onClick={onToggleExpand}\n className=\"p-4 flex items-center justify-between cursor-pointer\"\n >\n <div className=\"flex items-center gap-3\">\n <button className=\"p-1\">\n {isExpanded ? (\n <ChevronDown className=\"w-4 h-4 text-slate-400\" />\n ) : (\n <ChevronRight className=\"w-4 h-4 text-slate-400\" />\n )}\n </button>\n <div>\n <h4 className=\"font-medium text-slate-900\">\n {formatReportMonth(report.report_month)}\n </h4>\n <p className=\"text-xs text-slate-500\">\n Generated {format(new Date(report.created_at), 'MMM d, yyyy', { locale: enUS })}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n {/* Quick stats */}\n <div className=\"flex items-center gap-4 text-sm\">\n <span className=\"flex items-center gap-1 text-emerald-600\">\n <CheckCircle className=\"w-4 h-4\" />\n {data.summary.tickets_completed}\n </span>\n <span className=\"flex items-center gap-1 text-slate-600\">\n <Clock className=\"w-4 h-4\" />\n {data.summary.hours_logged}h\n </span>\n </div>\n\n {/* Status badge */}\n {report.sent_to_client ? (\n <span className=\"px-2 py-1 rounded-full text-xs font-medium bg-emerald-100 text-emerald-700\">\n Sent\n </span>\n ) : (\n <span className=\"px-2 py-1 rounded-full text-xs font-medium bg-slate-100 text-slate-600\">\n Draft\n </span>\n )}\n\n {/* Actions */}\n <div className=\"flex items-center gap-1\" onClick={e => e.stopPropagation()}>\n {canSendToClient && (\n <button\n onClick={onSendToClient}\n disabled={isSending || report.sent_to_client}\n className={cn(\n 'p-2 rounded-lg transition-colors',\n report.sent_to_client\n ? 'text-slate-300 cursor-not-allowed'\n : 'text-slate-400 hover:text-purple-600 hover:bg-purple-50'\n )}\n title={report.sent_to_client ? 'Already sent' : 'Send to client'}\n >\n {isSending ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Mail className=\"w-4 h-4\" />\n )}\n </button>\n )}\n {canDownloadPdf && (\n <button\n onClick={onDownloadPdf}\n disabled={isDownloading}\n className={cn(\n 'p-2 rounded-lg transition-colors',\n isDownloading\n ? 'text-slate-300 cursor-wait'\n : 'text-slate-400 hover:text-slate-600 hover:bg-slate-100'\n )}\n title=\"Download PDF\"\n >\n {isDownloading ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Download className=\"w-4 h-4\" />\n )}\n </button>\n )}\n </div>\n </div>\n </div>\n\n {/* Expanded content */}\n <AnimatePresence>\n {isExpanded && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n className=\"border-t border-slate-100\"\n >\n <div className=\"p-4 bg-slate-50/50\">\n {/* Summary stats */}\n <div className=\"grid grid-cols-2 gap-3 mb-6\">\n <StatCard\n icon={<CheckCircle className=\"w-5 h-5 text-emerald-600\" />}\n label=\"Completed\"\n value={data.summary.tickets_completed}\n bgColor=\"bg-emerald-50\"\n />\n <StatCard\n icon={<Ticket className=\"w-5 h-5 text-blue-600\" />}\n label=\"Created\"\n value={data.summary.tickets_created}\n bgColor=\"bg-blue-50\"\n />\n <StatCard\n icon={<Clock className=\"w-5 h-5 text-purple-600\" />}\n label=\"Hours Logged\"\n value={`${data.summary.hours_logged}h`}\n bgColor=\"bg-purple-50\"\n />\n <StatCard\n icon={<TrendingUp className=\"w-5 h-5 text-amber-600\" />}\n label=\"Hours Remaining\"\n value={`${data.summary.hours_remaining}h`}\n bgColor=\"bg-amber-50\"\n />\n </div>\n\n {/* Category breakdown */}\n {Object.keys(data.tickets_by_category || {}).length > 0 && (\n <div className=\"mb-4\">\n <h5 className=\"text-sm font-medium text-slate-700 mb-2\">By Category</h5>\n <div className=\"flex flex-wrap gap-2\">\n {Object.entries(data.tickets_by_category).map(([category, count]) => (\n <span\n key={category}\n className=\"px-2 py-1 rounded-lg bg-white border border-slate-200 text-sm\"\n >\n <span className=\"text-slate-500 capitalize\">{category}:</span>{' '}\n <span className=\"font-medium text-slate-900\">{count}</span>\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Open items */}\n {data.open_items && data.open_items.length > 0 && (\n <div>\n <h5 className=\"text-sm font-medium text-slate-700 mb-2\">\n Open Items ({data.open_items.length})\n </h5>\n <ul className=\"space-y-1\">\n {data.open_items.slice(0, 5).map((item, idx) => (\n <li\n key={idx}\n className=\"text-sm text-slate-600 flex items-center gap-2\"\n >\n <span className={cn(\n 'w-2 h-2 rounded-full',\n item.priority === 'critical' && 'bg-red-500',\n item.priority === 'high' && 'bg-amber-500',\n item.priority === 'medium' && 'bg-blue-500',\n item.priority === 'low' && 'bg-slate-400'\n )} />\n {item.title}\n </li>\n ))}\n {data.open_items.length > 5 && (\n <li className=\"text-xs text-slate-400\">\n +{data.open_items.length - 5} more\n </li>\n )}\n </ul>\n </div>\n )}\n\n {/* Sent info */}\n {report.sent_to_client && report.sent_at && (\n <div className=\"mt-4 pt-4 border-t border-slate-200\">\n <p className=\"text-xs text-slate-500 flex items-center gap-1\">\n <Mail className=\"w-3 h-3\" />\n Sent to client on {format(new Date(report.sent_at), 'MMM d, yyyy at h:mm a', { locale: enUS })}\n </p>\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )\n}\n\n// ============================================\n// Stat Card\n// ============================================\n\ninterface StatCardProps {\n icon: React.ReactNode\n label: string\n value: string | number\n bgColor: string\n}\n\nconst StatCard = ({ icon, label, value, bgColor }: StatCardProps) => (\n <div className={cn('p-3 rounded-lg', bgColor)}>\n <div className=\"flex items-center gap-2 mb-1\">\n {icon}\n <span className=\"text-xs text-slate-600\">{label}</span>\n </div>\n <p className=\"text-xl font-semibold text-slate-900\">{value}</p>\n </div>\n)\n\nexport default MonthlyReportView\n","/**\n * useChangelog - Hook for managing project changelog entries\n *\n * This hook manages local state for changelog entries while delegating\n * actual data operations to callbacks provided by the consuming application.\n *\n * Changelog entries can be public (visible on public route) or internal only.\n * Can be auto-generated from completed maintenance items.\n *\n * Usage:\n * ```tsx\n * const { entries, addEntry } = useChangelog({\n * projectId: 'my-project',\n * onFetch: async () => await myApi.getChangelogEntries(),\n * onAdd: async (entry) => await myApi.createEntry(entry),\n * onUpdate: async (id, updates) => await myApi.updateEntry(id, updates),\n * });\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport type { ChangelogEntry, ChangelogCategory } from '@framed/core'\n\ntype NewChangelogEntry = Omit<ChangelogEntry, 'id' | 'created_at' | 'created_by' | 'created_by_name' | 'project_id'>\n\n/**\n * Callback options for changelog data operations\n */\ninterface UseChangelogCallbacks {\n /** Fetch all changelog entries */\n onFetch?: () => Promise<ChangelogEntry[]>\n /** Add a new changelog entry */\n onAdd?: (entry: NewChangelogEntry) => Promise<ChangelogEntry>\n /** Update a changelog entry */\n onUpdate?: (entryId: string, updates: Partial<ChangelogEntry>) => Promise<ChangelogEntry | void>\n /** Delete a changelog entry */\n onDelete?: (entryId: string) => Promise<void>\n /** Publish a changelog entry (make it public) */\n onPublish?: (entryId: string) => Promise<ChangelogEntry | void>\n /** Unpublish a changelog entry */\n onUnpublish?: (entryId: string) => Promise<ChangelogEntry | void>\n /** Create an entry from a maintenance item */\n onCreateFromMaintenanceItem?: (itemId: string, itemTitle: string, category: ChangelogCategory) => Promise<ChangelogEntry>\n}\n\ninterface UseChangelogOptions extends UseChangelogCallbacks {\n projectId: string\n publicOnly?: boolean // For public changelog page\n /** Initial entries (useful for SSR or cached data) */\n initialEntries?: ChangelogEntry[]\n /** Auto-fetch on mount (default: true if onFetch is provided) */\n autoFetch?: boolean\n}\n\ninterface UseChangelogReturn {\n entries: ChangelogEntry[]\n loading: boolean\n error: string | null\n addEntry: (entry: NewChangelogEntry) => Promise<ChangelogEntry | null>\n updateEntry: (entryId: string, updates: Partial<ChangelogEntry>) => Promise<boolean>\n deleteEntry: (entryId: string) => Promise<boolean>\n publishEntry: (entryId: string) => Promise<boolean>\n unpublishEntry: (entryId: string) => Promise<boolean>\n createFromMaintenanceItem: (itemId: string, itemTitle: string, category: ChangelogCategory) => Promise<ChangelogEntry | null>\n refresh: () => Promise<void>\n setEntries: (entries: ChangelogEntry[]) => void\n}\n\n/**\n * Hook for managing changelog with callback-based data operations\n */\nexport const useChangelog = ({\n projectId,\n publicOnly = false,\n initialEntries = [],\n autoFetch = true,\n onFetch,\n onAdd,\n onUpdate,\n onDelete,\n onPublish,\n onUnpublish,\n onCreateFromMaintenanceItem,\n}: UseChangelogOptions): UseChangelogReturn => {\n const [entries, setEntries] = useState<ChangelogEntry[]>(initialEntries)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const refresh = useCallback(async () => {\n if (!onFetch) {\n console.warn('useChangelog: onFetch callback not provided')\n return\n }\n\n setLoading(true)\n setError(null)\n\n try {\n let fetchedEntries = await onFetch()\n\n // Filter to public entries if publicOnly is true\n if (publicOnly) {\n fetchedEntries = fetchedEntries.filter(entry => entry.is_public)\n }\n\n setEntries(fetchedEntries)\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch changelog entries'\n setError(message)\n console.error('useChangelog: fetch error', err)\n } finally {\n setLoading(false)\n }\n }, [onFetch, publicOnly])\n\n // Fetch on mount if autoFetch is enabled\n useEffect(() => {\n if (autoFetch && onFetch && projectId) {\n refresh()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [projectId, autoFetch])\n\n const addEntry = useCallback(async (\n entry: NewChangelogEntry\n ): Promise<ChangelogEntry | null> => {\n if (!onAdd) {\n console.warn('useChangelog: onAdd callback not provided')\n return null\n }\n\n setError(null)\n\n try {\n const newEntry = await onAdd(entry)\n setEntries(prev => [newEntry, ...prev])\n return newEntry\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to add changelog entry'\n setError(message)\n console.error('useChangelog: add error', err)\n return null\n }\n }, [onAdd])\n\n const updateEntry = useCallback(async (\n entryId: string,\n updates: Partial<ChangelogEntry>\n ): Promise<boolean> => {\n if (!onUpdate) {\n console.warn('useChangelog: onUpdate callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n const result = await onUpdate(entryId, updates)\n setEntries(prev => prev.map(entry => {\n if (entry.id === entryId) {\n return result ? result : { ...entry, ...updates }\n }\n return entry\n }))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update changelog entry'\n setError(message)\n console.error('useChangelog: update error', err)\n return false\n }\n }, [onUpdate])\n\n const deleteEntry = useCallback(async (entryId: string): Promise<boolean> => {\n if (!onDelete) {\n console.warn('useChangelog: onDelete callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n await onDelete(entryId)\n setEntries(prev => prev.filter(entry => entry.id !== entryId))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete changelog entry'\n setError(message)\n console.error('useChangelog: delete error', err)\n return false\n }\n }, [onDelete])\n\n const publishEntry = useCallback(async (entryId: string): Promise<boolean> => {\n // Use dedicated publish callback if provided, otherwise use update\n if (onPublish) {\n setError(null)\n try {\n const result = await onPublish(entryId)\n setEntries(prev => prev.map(entry => {\n if (entry.id === entryId) {\n return result ? result : { ...entry, is_public: true, published_at: new Date().toISOString() }\n }\n return entry\n }))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to publish entry'\n setError(message)\n console.error('useChangelog: publish error', err)\n return false\n }\n }\n\n // Fallback to update\n return updateEntry(entryId, { is_public: true, published_at: new Date().toISOString() })\n }, [onPublish, updateEntry])\n\n const unpublishEntry = useCallback(async (entryId: string): Promise<boolean> => {\n // Use dedicated unpublish callback if provided, otherwise use update\n if (onUnpublish) {\n setError(null)\n try {\n const result = await onUnpublish(entryId)\n setEntries(prev => prev.map(entry => {\n if (entry.id === entryId) {\n return result ? result : { ...entry, is_public: false, published_at: undefined }\n }\n return entry\n }))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to unpublish entry'\n setError(message)\n console.error('useChangelog: unpublish error', err)\n return false\n }\n }\n\n // Fallback to update\n return updateEntry(entryId, { is_public: false, published_at: undefined })\n }, [onUnpublish, updateEntry])\n\n const createFromMaintenanceItem = useCallback(async (\n itemId: string,\n itemTitle: string,\n category: ChangelogCategory\n ): Promise<ChangelogEntry | null> => {\n if (!onCreateFromMaintenanceItem) {\n console.warn('useChangelog: onCreateFromMaintenanceItem callback not provided')\n return null\n }\n\n setError(null)\n\n try {\n const newEntry = await onCreateFromMaintenanceItem(itemId, itemTitle, category)\n setEntries(prev => [newEntry, ...prev])\n return newEntry\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create entry from maintenance item'\n setError(message)\n console.error('useChangelog: createFromMaintenanceItem error', err)\n return null\n }\n }, [onCreateFromMaintenanceItem])\n\n return {\n entries,\n loading,\n error,\n addEntry,\n updateEntry,\n deleteEntry,\n publishEntry,\n unpublishEntry,\n createFromMaintenanceItem,\n refresh,\n setEntries,\n }\n}\n\n// ============================================\n// Helper functions (copied from framed-app)\n// ============================================\n\n/**\n * Get category display info\n */\nexport const getCategoryInfo = (category: ChangelogCategory): {\n label: string\n color: string\n bgColor: string\n} => {\n switch (category) {\n case 'bugfix':\n return { label: 'Bug Fix', color: 'text-red-700', bgColor: 'bg-red-100' }\n case 'improvement':\n return { label: 'Improvement', color: 'text-blue-700', bgColor: 'bg-blue-100' }\n case 'feature':\n return { label: 'New Feature', color: 'text-emerald-700', bgColor: 'bg-emerald-100' }\n case 'content':\n return { label: 'Content', color: 'text-purple-700', bgColor: 'bg-purple-100' }\n case 'security':\n return { label: 'Security', color: 'text-amber-700', bgColor: 'bg-amber-100' }\n default:\n return { label: category, color: 'text-slate-700', bgColor: 'bg-slate-100' }\n }\n}\n\n/**\n * All changelog categories\n */\nexport const CHANGELOG_CATEGORIES: ChangelogCategory[] = [\n 'bugfix',\n 'improvement',\n 'feature',\n 'content',\n 'security'\n]\n\nexport type { UseChangelogOptions, UseChangelogReturn }\n","/**\n * ChangelogView - Internal changelog management\n *\n * Features:\n * - Add/edit/delete changelog entries\n * - Publish entries to make them public\n * - Link to public changelog page\n * - Create entries from completed maintenance items\n */\n\nimport { useState } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n History,\n Plus,\n Edit2,\n Trash2,\n Globe,\n Lock,\n ExternalLink,\n Loader2,\n AlertCircle,\n ChevronDown\n} from 'lucide-react'\nimport { format } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn } from '../utils/cn'\nimport type { ChangelogEntry, ChangelogCategory } from '@framed/core'\nimport { getCategoryInfo, CHANGELOG_CATEGORIES } from '../hooks/useChangelog'\n\ntype ChangelogTab = 'all' | 'published' | 'drafts'\n\ninterface ChangelogViewProps {\n projectId: string\n entries?: ChangelogEntry[]\n loading?: boolean\n error?: string | null\n publicChangelogUrl?: string\n className?: string\n onAddEntry?: (entry: Omit<ChangelogEntry, 'id' | 'created_at' | 'created_by' | 'created_by_name' | 'project_id'>) => Promise<ChangelogEntry | null>\n onUpdateEntry?: (entryId: string, updates: Partial<ChangelogEntry>) => Promise<boolean>\n onDeleteEntry?: (entryId: string) => Promise<boolean>\n onPublishEntry?: (entryId: string) => Promise<boolean>\n onUnpublishEntry?: (entryId: string) => Promise<boolean>\n}\n\nexport const ChangelogView = ({\n projectId,\n entries = [],\n loading = false,\n error = null,\n publicChangelogUrl,\n className,\n onAddEntry,\n onUpdateEntry,\n onDeleteEntry,\n onPublishEntry,\n onUnpublishEntry,\n}: ChangelogViewProps) => {\n const [showAddForm, setShowAddForm] = useState(false)\n const [editingId, setEditingId] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [activeTab, setActiveTab] = useState<ChangelogTab>('all')\n\n // Form state\n const [formTitle, setFormTitle] = useState('')\n const [formDescription, setFormDescription] = useState('')\n const [formCategory, setFormCategory] = useState<ChangelogCategory>('improvement')\n\n // Filter entries based on active tab\n const filteredEntries = entries.filter(entry => {\n if (activeTab === 'all') return true\n if (activeTab === 'published') return entry.is_public\n if (activeTab === 'drafts') return !entry.is_public\n return true\n })\n\n const resetForm = () => {\n setFormTitle('')\n setFormDescription('')\n setFormCategory('improvement')\n }\n\n const handleAddEntry = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!formTitle.trim() || isSubmitting || !onAddEntry) return\n\n setIsSubmitting(true)\n try {\n const result = await onAddEntry({\n title: formTitle.trim(),\n description: formDescription.trim() || undefined,\n category: formCategory,\n is_public: false\n })\n if (result) {\n resetForm()\n setShowAddForm(false)\n }\n } finally {\n setIsSubmitting(false)\n }\n }\n\n const handleStartEdit = (entry: ChangelogEntry) => {\n setEditingId(entry.id)\n setFormTitle(entry.title)\n setFormDescription(entry.description || '')\n setFormCategory(entry.category)\n }\n\n const handleSaveEdit = async () => {\n if (!editingId || !formTitle.trim() || isSubmitting || !onUpdateEntry) return\n\n setIsSubmitting(true)\n try {\n const success = await onUpdateEntry(editingId, {\n title: formTitle.trim(),\n description: formDescription.trim() || undefined,\n category: formCategory\n })\n if (success) {\n setEditingId(null)\n resetForm()\n }\n } finally {\n setIsSubmitting(false)\n }\n }\n\n const handleCancelEdit = () => {\n setEditingId(null)\n resetForm()\n }\n\n const handleDelete = async (entryId: string) => {\n if (!onDeleteEntry) return\n if (!confirm('Are you sure you want to delete this changelog entry?')) return\n await onDeleteEntry(entryId)\n }\n\n const handleTogglePublish = async (entry: ChangelogEntry) => {\n if (entry.is_public) {\n if (onUnpublishEntry) await onUnpublishEntry(entry.id)\n } else {\n if (onPublishEntry) await onPublishEntry(entry.id)\n }\n }\n\n const defaultPublicUrl = `/changelog/${projectId}`\n const actualPublicUrl = publicChangelogUrl || defaultPublicUrl\n\n // Count for tabs\n const publishedCount = entries.filter(e => e.is_public).length\n const draftsCount = entries.filter(e => !e.is_public).length\n\n return (\n <div className={cn('bg-white rounded-xl border border-slate-200 overflow-hidden', className)}>\n {/* Header */}\n <div className=\"p-4 border-b border-slate-100 bg-slate-50/50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-slate-100 flex items-center justify-center\">\n <History className=\"w-5 h-5 text-slate-600\" />\n </div>\n <div>\n <h3 className=\"font-semibold text-slate-900\">Changelog</h3>\n <p className=\"text-xs text-slate-500\">\n Track and publish updates\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {publicChangelogUrl && (\n <a\n href={actualPublicUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm text-slate-600 hover:text-slate-900 hover:bg-slate-100 transition-colors\"\n >\n <Globe className=\"w-4 h-4\" />\n View Public\n <ExternalLink className=\"w-3 h-3\" />\n </a>\n )}\n {onAddEntry && (\n <button\n onClick={() => setShowAddForm(!showAddForm)}\n className={cn(\n 'flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm font-medium transition-colors',\n showAddForm\n ? 'bg-slate-200 text-slate-700'\n : 'bg-slate-900 text-white hover:bg-slate-800'\n )}\n >\n <Plus className=\"w-4 h-4\" />\n Add Entry\n </button>\n )}\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"flex items-center gap-1 mt-4 p-1 bg-slate-100 rounded-lg w-fit\">\n <button\n onClick={() => setActiveTab('all')}\n className={cn(\n 'px-3 py-1.5 rounded-md text-sm font-medium transition-all',\n activeTab === 'all'\n ? 'bg-white text-slate-900 shadow-sm'\n : 'text-slate-600 hover:text-slate-900'\n )}\n >\n All ({entries.length})\n </button>\n <button\n onClick={() => setActiveTab('published')}\n className={cn(\n 'px-3 py-1.5 rounded-md text-sm font-medium transition-all',\n activeTab === 'published'\n ? 'bg-white text-slate-900 shadow-sm'\n : 'text-slate-600 hover:text-slate-900'\n )}\n >\n Published ({publishedCount})\n </button>\n <button\n onClick={() => setActiveTab('drafts')}\n className={cn(\n 'px-3 py-1.5 rounded-md text-sm font-medium transition-all',\n activeTab === 'drafts'\n ? 'bg-white text-slate-900 shadow-sm'\n : 'text-slate-600 hover:text-slate-900'\n )}\n >\n Drafts ({draftsCount})\n </button>\n </div>\n\n {/* Add entry form */}\n <AnimatePresence>\n {showAddForm && (\n <motion.form\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n onSubmit={handleAddEntry}\n className=\"mt-4 space-y-3\"\n >\n <input\n type=\"text\"\n value={formTitle}\n onChange={(e) => setFormTitle(e.target.value)}\n placeholder=\"Entry title\"\n className=\"w-full px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-slate-500/50 focus:border-slate-500\"\n autoFocus\n />\n <textarea\n value={formDescription}\n onChange={(e) => setFormDescription(e.target.value)}\n placeholder=\"Description (optional)\"\n rows={2}\n className=\"w-full px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-slate-500/50 focus:border-slate-500 resize-none\"\n />\n <div className=\"flex items-center gap-3\">\n <div className=\"relative\">\n <select\n value={formCategory}\n onChange={(e) => setFormCategory(e.target.value as ChangelogCategory)}\n className=\"px-3 py-2 pr-8 rounded-lg border border-slate-200 text-sm text-slate-900 bg-white focus:outline-none focus:ring-2 focus:ring-slate-500/50 focus:border-slate-500 appearance-none\"\n >\n {CHANGELOG_CATEGORIES.map(cat => (\n <option key={cat} value={cat}>\n {getCategoryInfo(cat).label}\n </option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400 pointer-events-none\" />\n </div>\n <button\n type=\"submit\"\n disabled={!formTitle.trim() || isSubmitting}\n className=\"px-4 py-2 rounded-lg bg-slate-900 text-white text-sm font-medium hover:bg-slate-800 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isSubmitting ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : 'Add'}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(false)\n resetForm()\n }}\n className=\"px-4 py-2 rounded-lg text-slate-600 text-sm font-medium hover:bg-slate-100 transition-colors\"\n >\n Cancel\n </button>\n </div>\n </motion.form>\n )}\n </AnimatePresence>\n </div>\n\n {/* Error state */}\n {error && (\n <div className=\"p-4 bg-red-50 border-b border-red-100\">\n <div className=\"flex items-center gap-2 text-sm text-red-700\">\n <AlertCircle className=\"w-4 h-4\" />\n {error}\n </div>\n </div>\n )}\n\n {/* Entries list */}\n <div className=\"divide-y divide-slate-100\">\n {loading ? (\n <div className=\"p-8 text-center\">\n <Loader2 className=\"w-6 h-6 animate-spin text-slate-400 mx-auto mb-2\" />\n <p className=\"text-sm text-slate-500\">Loading changelog...</p>\n </div>\n ) : filteredEntries.length === 0 ? (\n <div className=\"p-8 text-center\">\n <History className=\"w-10 h-10 mx-auto text-slate-300 mb-3\" />\n <p className=\"text-sm text-slate-600 font-medium mb-1\">\n {activeTab === 'all' ? 'No changelog entries' :\n activeTab === 'published' ? 'No published entries' :\n 'No draft entries'}\n </p>\n <p className=\"text-xs text-slate-400\">\n {activeTab === 'all' ? 'Add entries to track updates to this project' :\n activeTab === 'published' ? 'Published entries will appear here' :\n 'Draft entries will appear here'}\n </p>\n </div>\n ) : (\n filteredEntries.map(entry => (\n <ChangelogEntryCard\n key={entry.id}\n entry={entry}\n isEditing={editingId === entry.id}\n formTitle={formTitle}\n setFormTitle={setFormTitle}\n formDescription={formDescription}\n setFormDescription={setFormDescription}\n formCategory={formCategory}\n setFormCategory={setFormCategory}\n onStartEdit={() => handleStartEdit(entry)}\n onSaveEdit={handleSaveEdit}\n onCancelEdit={handleCancelEdit}\n onDelete={() => handleDelete(entry.id)}\n onTogglePublish={() => handleTogglePublish(entry)}\n isSubmitting={isSubmitting}\n canEdit={!!onUpdateEntry}\n canDelete={!!onDeleteEntry}\n canPublish={!!onPublishEntry || !!onUnpublishEntry}\n />\n ))\n )}\n </div>\n </div>\n )\n}\n\n// ============================================\n// Changelog Entry Card\n// ============================================\n\ninterface ChangelogEntryCardProps {\n entry: ChangelogEntry\n isEditing: boolean\n formTitle: string\n setFormTitle: (v: string) => void\n formDescription: string\n setFormDescription: (v: string) => void\n formCategory: ChangelogCategory\n setFormCategory: (v: ChangelogCategory) => void\n onStartEdit: () => void\n onSaveEdit: () => void\n onCancelEdit: () => void\n onDelete: () => void\n onTogglePublish: () => void\n isSubmitting: boolean\n canEdit: boolean\n canDelete: boolean\n canPublish: boolean\n}\n\nconst ChangelogEntryCard = ({\n entry,\n isEditing,\n formTitle,\n setFormTitle,\n formDescription,\n setFormDescription,\n formCategory,\n setFormCategory,\n onStartEdit,\n onSaveEdit,\n onCancelEdit,\n onDelete,\n onTogglePublish,\n isSubmitting,\n canEdit,\n canDelete,\n canPublish\n}: ChangelogEntryCardProps) => {\n const [showActions, setShowActions] = useState(false)\n const categoryInfo = getCategoryInfo(entry.category)\n\n if (isEditing) {\n return (\n <div className=\"p-4 bg-slate-50\">\n <div className=\"space-y-3\">\n <input\n type=\"text\"\n value={formTitle}\n onChange={(e) => setFormTitle(e.target.value)}\n className=\"w-full px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 focus:outline-none focus:ring-2 focus:ring-slate-500/50 focus:border-slate-500\"\n autoFocus\n />\n <textarea\n value={formDescription}\n onChange={(e) => setFormDescription(e.target.value)}\n rows={2}\n className=\"w-full px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-slate-500/50 focus:border-slate-500 resize-none\"\n placeholder=\"Description (optional)\"\n />\n <div className=\"flex items-center gap-3\">\n <div className=\"relative\">\n <select\n value={formCategory}\n onChange={(e) => setFormCategory(e.target.value as ChangelogCategory)}\n className=\"px-3 py-2 pr-8 rounded-lg border border-slate-200 text-sm text-slate-900 bg-white focus:outline-none focus:ring-2 focus:ring-slate-500/50 focus:border-slate-500 appearance-none\"\n >\n {CHANGELOG_CATEGORIES.map(cat => (\n <option key={cat} value={cat}>\n {getCategoryInfo(cat).label}\n </option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400 pointer-events-none\" />\n </div>\n <button\n onClick={onSaveEdit}\n disabled={!formTitle.trim() || isSubmitting}\n className=\"px-3 py-1.5 rounded-lg bg-slate-900 text-white text-sm font-medium hover:bg-slate-800 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n Save\n </button>\n <button\n onClick={onCancelEdit}\n className=\"px-3 py-1.5 rounded-lg text-slate-600 text-sm font-medium hover:bg-slate-200 transition-colors\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n onMouseEnter={() => setShowActions(true)}\n onMouseLeave={() => setShowActions(false)}\n className=\"p-4 hover:bg-slate-50 transition-colors\"\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className={cn('px-2 py-0.5 rounded text-xs font-medium', categoryInfo.bgColor, categoryInfo.color)}>\n {categoryInfo.label}\n </span>\n {entry.is_public ? (\n <span className=\"flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium bg-emerald-100 text-emerald-700\">\n <Globe className=\"w-3 h-3\" />\n Public\n </span>\n ) : (\n <span className=\"flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium bg-slate-100 text-slate-600\">\n <Lock className=\"w-3 h-3\" />\n Draft\n </span>\n )}\n </div>\n <h4 className=\"font-medium text-slate-900 mb-1\">{entry.title}</h4>\n {entry.description && (\n <p className=\"text-sm text-slate-600 mb-2\">{entry.description}</p>\n )}\n <p className=\"text-xs text-slate-400\">\n {entry.published_at ? (\n <>Published {format(new Date(entry.published_at), 'MMM d, yyyy', { locale: enUS })}</>\n ) : (\n <>Created {format(new Date(entry.created_at), 'MMM d, yyyy', { locale: enUS })}</>\n )}\n {' · '}by {entry.created_by_name}\n </p>\n </div>\n\n {/* Actions */}\n <AnimatePresence>\n {showActions && (canEdit || canDelete || canPublish) && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex items-center gap-1 flex-shrink-0\"\n >\n {canPublish && (\n <button\n onClick={onTogglePublish}\n className={cn(\n 'p-2 rounded-lg transition-colors',\n entry.is_public\n ? 'text-emerald-600 hover:bg-emerald-50'\n : 'text-slate-400 hover:text-slate-600 hover:bg-slate-100'\n )}\n title={entry.is_public ? 'Unpublish' : 'Publish'}\n >\n {entry.is_public ? <Lock className=\"w-4 h-4\" /> : <Globe className=\"w-4 h-4\" />}\n </button>\n )}\n {canEdit && (\n <button\n onClick={onStartEdit}\n className=\"p-2 rounded-lg text-slate-400 hover:text-slate-600 hover:bg-slate-100 transition-colors\"\n title=\"Edit\"\n >\n <Edit2 className=\"w-4 h-4\" />\n </button>\n )}\n {canDelete && (\n <button\n onClick={onDelete}\n className=\"p-2 rounded-lg text-slate-400 hover:text-red-600 hover:bg-red-50 transition-colors\"\n title=\"Delete\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </motion.div>\n )\n}\n\nexport default ChangelogView\n","/**\n * useImprovementSuggestions - Hook for managing proactive improvement suggestions\n *\n * This hook manages local state for improvement suggestions while delegating\n * actual data operations to callbacks provided by the consuming application.\n *\n * Agency creates suggestions, proposes to client, client accepts/rejects.\n * Accepted suggestions can be converted to maintenance items.\n *\n * Usage:\n * ```tsx\n * const { suggestions, addSuggestion } = useImprovementSuggestions({\n * projectId: 'my-project',\n * onFetch: async () => await myApi.getSuggestions(),\n * onCreate: async (input) => await myApi.createSuggestion(input),\n * onUpdate: async (id, updates) => await myApi.updateSuggestion(id, updates),\n * });\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport type {\n ImprovementSuggestion,\n SuggestionCategory,\n SuggestionImpact,\n} from '@framed/core'\n\n/**\n * Input for creating a new suggestion\n */\nexport interface CreateSuggestionInput {\n title: string\n description: string\n category: SuggestionCategory\n impact: SuggestionImpact\n effort_hours?: number\n estimated_cost_cents?: number\n}\n\n/**\n * Callback options for suggestion data operations\n */\nexport interface UseImprovementSuggestionsCallbacks {\n /** Fetch all suggestions */\n onFetch?: () => Promise<ImprovementSuggestion[]>\n /** Create a new suggestion */\n onCreate?: (input: CreateSuggestionInput) => Promise<ImprovementSuggestion>\n /** Update a suggestion */\n onUpdate?: (suggestionId: string, updates: Partial<ImprovementSuggestion>) => Promise<ImprovementSuggestion | void>\n /** Delete a suggestion */\n onDelete?: (suggestionId: string) => Promise<void>\n /** Convert accepted suggestion to maintenance item */\n onConvertToMaintenanceItem?: (suggestionId: string) => Promise<string | null>\n}\n\nexport interface UseImprovementSuggestionsOptions extends UseImprovementSuggestionsCallbacks {\n projectId: string\n /** Initial suggestions (useful for SSR or cached data) */\n initialSuggestions?: ImprovementSuggestion[]\n /** Auto-fetch on mount (default: true if onFetch is provided) */\n autoFetch?: boolean\n}\n\nexport interface UseImprovementSuggestionsReturn {\n suggestions: ImprovementSuggestion[]\n loading: boolean\n error: string | null\n addSuggestion: (input: CreateSuggestionInput) => Promise<ImprovementSuggestion | null>\n updateSuggestion: (suggestionId: string, updates: Partial<ImprovementSuggestion>) => Promise<boolean>\n deleteSuggestion: (suggestionId: string) => Promise<boolean>\n proposeSuggestion: (suggestionId: string) => Promise<boolean>\n acceptSuggestion: (suggestionId: string, notes?: string) => Promise<boolean>\n rejectSuggestion: (suggestionId: string, notes?: string) => Promise<boolean>\n convertToMaintenanceItem: (suggestionId: string) => Promise<string | null>\n refresh: () => Promise<void>\n setSuggestions: (suggestions: ImprovementSuggestion[]) => void\n}\n\n/**\n * Hook for managing improvement suggestions with callback-based data operations\n */\nexport const useImprovementSuggestions = ({\n projectId,\n initialSuggestions = [],\n autoFetch = true,\n onFetch,\n onCreate,\n onUpdate,\n onDelete,\n onConvertToMaintenanceItem,\n}: UseImprovementSuggestionsOptions): UseImprovementSuggestionsReturn => {\n const [suggestions, setSuggestions] = useState<ImprovementSuggestion[]>(initialSuggestions)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const refresh = useCallback(async () => {\n if (!onFetch) {\n console.warn('useImprovementSuggestions: onFetch callback not provided')\n return\n }\n\n setLoading(true)\n setError(null)\n\n try {\n const fetchedSuggestions = await onFetch()\n setSuggestions(fetchedSuggestions)\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch suggestions'\n setError(message)\n console.error('useImprovementSuggestions: fetch error', err)\n } finally {\n setLoading(false)\n }\n }, [onFetch])\n\n // Fetch on mount if autoFetch is enabled\n useEffect(() => {\n if (autoFetch && onFetch && projectId) {\n refresh()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [projectId, autoFetch])\n\n const addSuggestion = useCallback(async (\n input: CreateSuggestionInput\n ): Promise<ImprovementSuggestion | null> => {\n if (!onCreate) {\n console.warn('useImprovementSuggestions: onCreate callback not provided')\n return null\n }\n\n setError(null)\n\n try {\n const newSuggestion = await onCreate(input)\n setSuggestions(prev => [newSuggestion, ...prev])\n return newSuggestion\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to add suggestion'\n setError(message)\n console.error('useImprovementSuggestions: add error', err)\n return null\n }\n }, [onCreate])\n\n const updateSuggestion = useCallback(async (\n suggestionId: string,\n updates: Partial<ImprovementSuggestion>\n ): Promise<boolean> => {\n if (!onUpdate) {\n console.warn('useImprovementSuggestions: onUpdate callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n const result = await onUpdate(suggestionId, updates)\n setSuggestions(prev => prev.map((suggestion: ImprovementSuggestion) => {\n if (suggestion.id === suggestionId) {\n return result ? result : { ...suggestion, ...updates }\n }\n return suggestion\n }))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update suggestion'\n setError(message)\n console.error('useImprovementSuggestions: update error', err)\n return false\n }\n }, [onUpdate])\n\n const deleteSuggestion = useCallback(async (suggestionId: string): Promise<boolean> => {\n if (!onDelete) {\n console.warn('useImprovementSuggestions: onDelete callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n await onDelete(suggestionId)\n setSuggestions(prev => prev.filter((suggestion: ImprovementSuggestion) => suggestion.id !== suggestionId))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete suggestion'\n setError(message)\n console.error('useImprovementSuggestions: delete error', err)\n return false\n }\n }, [onDelete])\n\n const proposeSuggestion = useCallback(async (suggestionId: string): Promise<boolean> => {\n return updateSuggestion(suggestionId, {\n status: 'proposed',\n proposed_at: new Date().toISOString()\n })\n }, [updateSuggestion])\n\n const acceptSuggestion = useCallback(async (\n suggestionId: string,\n notes?: string\n ): Promise<boolean> => {\n return updateSuggestion(suggestionId, {\n status: 'accepted',\n client_response_at: new Date().toISOString(),\n client_response_notes: notes || undefined\n })\n }, [updateSuggestion])\n\n const rejectSuggestion = useCallback(async (\n suggestionId: string,\n notes?: string\n ): Promise<boolean> => {\n return updateSuggestion(suggestionId, {\n status: 'rejected',\n client_response_at: new Date().toISOString(),\n client_response_notes: notes || undefined\n })\n }, [updateSuggestion])\n\n const convertToMaintenanceItem = useCallback(async (\n suggestionId: string\n ): Promise<string | null> => {\n const suggestion = suggestions.find((s: ImprovementSuggestion) => s.id === suggestionId)\n if (!suggestion || suggestion.status !== 'accepted') {\n setError('Suggestion must be accepted before converting')\n return null\n }\n\n if (!onConvertToMaintenanceItem) {\n console.warn('useImprovementSuggestions: onConvertToMaintenanceItem callback not provided')\n return null\n }\n\n setError(null)\n\n try {\n const itemId = await onConvertToMaintenanceItem(suggestionId)\n if (itemId) {\n // Update suggestion to converted status\n setSuggestions(prev => prev.map((s: ImprovementSuggestion) => {\n if (s.id === suggestionId) {\n return { ...s, status: 'converted' as const, converted_item_id: itemId }\n }\n return s\n }))\n }\n return itemId\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to convert suggestion'\n setError(message)\n console.error('useImprovementSuggestions: convert error', err)\n return null\n }\n }, [suggestions, onConvertToMaintenanceItem])\n\n return {\n suggestions,\n loading,\n error,\n addSuggestion,\n updateSuggestion,\n deleteSuggestion,\n proposeSuggestion,\n acceptSuggestion,\n rejectSuggestion,\n convertToMaintenanceItem,\n refresh,\n setSuggestions,\n }\n}\n\n// ============================================\n// Helper functions (copied from framed-app)\n// ============================================\n\n/**\n * Get category display info\n */\nexport const getSuggestionCategoryInfo = (category: SuggestionCategory): {\n label: string\n color: string\n bgColor: string\n} => {\n switch (category) {\n case 'performance':\n return { label: 'Performance', color: 'text-purple-700', bgColor: 'bg-purple-100' }\n case 'ux':\n return { label: 'User Experience', color: 'text-blue-700', bgColor: 'bg-blue-100' }\n case 'seo':\n return { label: 'SEO', color: 'text-emerald-700', bgColor: 'bg-emerald-100' }\n case 'design':\n return { label: 'Design', color: 'text-pink-700', bgColor: 'bg-pink-100' }\n case 'functionality':\n return { label: 'Functionality', color: 'text-amber-700', bgColor: 'bg-amber-100' }\n case 'security':\n return { label: 'Security', color: 'text-red-700', bgColor: 'bg-red-100' }\n case 'accessibility':\n return { label: 'Accessibility', color: 'text-cyan-700', bgColor: 'bg-cyan-100' }\n default:\n return { label: category, color: 'text-slate-700', bgColor: 'bg-slate-100' }\n }\n}\n\n/**\n * Get impact display info\n */\nexport const getImpactInfo = (impact: SuggestionImpact): {\n label: string\n color: string\n} => {\n switch (impact) {\n case 'high':\n return { label: 'High Impact', color: 'text-emerald-600' }\n case 'medium':\n return { label: 'Medium Impact', color: 'text-amber-600' }\n case 'low':\n return { label: 'Low Impact', color: 'text-slate-500' }\n default:\n return { label: impact, color: 'text-slate-500' }\n }\n}\n\n/**\n * Get status display info\n */\nexport const getStatusInfo = (status: ImprovementSuggestion['status']): {\n label: string\n color: string\n bgColor: string\n} => {\n switch (status) {\n case 'draft':\n return { label: 'Draft', color: 'text-slate-600', bgColor: 'bg-slate-100' }\n case 'proposed':\n return { label: 'Proposed', color: 'text-blue-700', bgColor: 'bg-blue-100' }\n case 'accepted':\n return { label: 'Accepted', color: 'text-emerald-700', bgColor: 'bg-emerald-100' }\n case 'rejected':\n return { label: 'Rejected', color: 'text-red-700', bgColor: 'bg-red-100' }\n case 'converted':\n return { label: 'Converted', color: 'text-purple-700', bgColor: 'bg-purple-100' }\n default:\n return { label: status, color: 'text-slate-600', bgColor: 'bg-slate-100' }\n }\n}\n\n/**\n * All suggestion categories\n */\nexport const SUGGESTION_CATEGORIES: SuggestionCategory[] = [\n 'performance',\n 'ux',\n 'seo',\n 'design',\n 'functionality',\n 'security',\n 'accessibility'\n]\n\n/**\n * All impact levels\n */\nexport const IMPACT_LEVELS: SuggestionImpact[] = ['high', 'medium', 'low']\n","/**\n * SuggestionsBoard - Manage improvement suggestions workflow\n *\n * Features:\n * - Create suggestions (agency)\n * - Propose to client\n * - Accept/reject (client)\n * - Convert to maintenance item\n *\n * SDK version with callback-based props for data operations.\n */\n\nimport { useState } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n Lightbulb,\n Plus,\n Trash2,\n Send,\n Check,\n X,\n ArrowRight,\n Euro,\n Clock,\n TrendingUp,\n Loader2,\n AlertCircle,\n ChevronDown,\n MessageSquare\n} from 'lucide-react'\nimport { format } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn } from '../utils/cn'\nimport type { ImprovementSuggestion, SuggestionCategory, SuggestionImpact } from '@framed/core'\nimport {\n useImprovementSuggestions,\n getSuggestionCategoryInfo,\n getImpactInfo,\n getStatusInfo,\n SUGGESTION_CATEGORIES,\n IMPACT_LEVELS,\n type CreateSuggestionInput,\n type UseImprovementSuggestionsCallbacks,\n} from '../hooks/useImprovementSuggestions'\n\nexport interface SuggestionsBoardProps extends UseImprovementSuggestionsCallbacks {\n projectId: string\n className?: string\n /** Whether the current user is an agency user (can create/propose suggestions) */\n isAgency?: boolean\n /** Initial suggestions data */\n initialSuggestions?: ImprovementSuggestion[]\n /** Auto-fetch on mount (default: true) */\n autoFetch?: boolean\n}\n\nexport const SuggestionsBoard = ({\n projectId,\n className,\n isAgency = false,\n initialSuggestions = [],\n autoFetch = true,\n onFetch,\n onCreate,\n onUpdate,\n onDelete,\n onConvertToMaintenanceItem,\n}: SuggestionsBoardProps) => {\n const {\n suggestions,\n loading,\n error,\n addSuggestion,\n updateSuggestion,\n deleteSuggestion,\n proposeSuggestion,\n acceptSuggestion,\n rejectSuggestion,\n convertToMaintenanceItem,\n } = useImprovementSuggestions({\n projectId,\n initialSuggestions,\n autoFetch,\n onFetch,\n onCreate,\n onUpdate,\n onDelete,\n onConvertToMaintenanceItem,\n })\n\n const [showAddForm, setShowAddForm] = useState(false)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [responseNotes, setResponseNotes] = useState('')\n const [respondingToId, setRespondingToId] = useState<string | null>(null)\n\n // Form state\n const [formTitle, setFormTitle] = useState('')\n const [formDescription, setFormDescription] = useState('')\n const [formCategory, setFormCategory] = useState<SuggestionCategory>('functionality')\n const [formImpact, setFormImpact] = useState<SuggestionImpact>('medium')\n const [formEffortHours, setFormEffortHours] = useState('')\n const [formCost, setFormCost] = useState('')\n\n const resetForm = () => {\n setFormTitle('')\n setFormDescription('')\n setFormCategory('functionality')\n setFormImpact('medium')\n setFormEffortHours('')\n setFormCost('')\n }\n\n const handleAddSuggestion = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!formTitle.trim() || !formDescription.trim() || isSubmitting) return\n\n setIsSubmitting(true)\n try {\n const input: CreateSuggestionInput = {\n title: formTitle.trim(),\n description: formDescription.trim(),\n category: formCategory,\n impact: formImpact,\n effort_hours: formEffortHours ? parseFloat(formEffortHours) : undefined,\n estimated_cost_cents: formCost ? Math.round(parseFloat(formCost) * 100) : undefined\n }\n const result = await addSuggestion(input)\n if (result) {\n resetForm()\n setShowAddForm(false)\n }\n } finally {\n setIsSubmitting(false)\n }\n }\n\n const handlePropose = async (suggestionId: string) => {\n setIsSubmitting(true)\n try {\n await proposeSuggestion(suggestionId)\n } finally {\n setIsSubmitting(false)\n }\n }\n\n const handleAccept = async (suggestionId: string) => {\n setIsSubmitting(true)\n try {\n await acceptSuggestion(suggestionId, responseNotes || undefined)\n setRespondingToId(null)\n setResponseNotes('')\n } finally {\n setIsSubmitting(false)\n }\n }\n\n const handleReject = async (suggestionId: string) => {\n setIsSubmitting(true)\n try {\n await rejectSuggestion(suggestionId, responseNotes || undefined)\n setRespondingToId(null)\n setResponseNotes('')\n } finally {\n setIsSubmitting(false)\n }\n }\n\n const handleConvert = async (suggestionId: string) => {\n setIsSubmitting(true)\n try {\n await convertToMaintenanceItem(suggestionId)\n } finally {\n setIsSubmitting(false)\n }\n }\n\n const handleDelete = async (suggestionId: string) => {\n if (!confirm('Are you sure you want to delete this suggestion?')) return\n await deleteSuggestion(suggestionId)\n }\n\n // For clients, show proposed, accepted, and rejected suggestions\n const visibleSuggestions = isAgency\n ? suggestions\n : suggestions.filter((s: ImprovementSuggestion) =>\n s.status === 'proposed' ||\n s.status === 'accepted' ||\n s.status === 'rejected'\n )\n\n // Group suggestions for client view\n const clientGroupedSuggestions = {\n pending: visibleSuggestions.filter((s: ImprovementSuggestion) => s.status === 'proposed'),\n accepted: visibleSuggestions.filter((s: ImprovementSuggestion) => s.status === 'accepted'),\n rejected: visibleSuggestions.filter((s: ImprovementSuggestion) => s.status === 'rejected'),\n }\n\n return (\n <div className={cn('bg-white rounded-xl border border-slate-200 overflow-hidden', className)}>\n {/* Header */}\n <div className=\"p-4 border-b border-slate-100 bg-slate-50/50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-amber-100 flex items-center justify-center\">\n <Lightbulb className=\"w-5 h-5 text-amber-600\" />\n </div>\n <div>\n <h3 className=\"font-semibold text-slate-900\">Improvement Suggestions</h3>\n <p className=\"text-xs text-slate-500\">\n {isAgency ? 'Propose improvements to your client' : 'Review suggested improvements'}\n </p>\n </div>\n </div>\n {isAgency && (\n <button\n onClick={() => setShowAddForm(!showAddForm)}\n className={cn(\n 'flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm font-medium transition-colors',\n showAddForm\n ? 'bg-slate-200 text-slate-700'\n : 'bg-amber-600 text-white hover:bg-amber-700'\n )}\n >\n <Plus className=\"w-4 h-4\" />\n New Suggestion\n </button>\n )}\n </div>\n\n {/* Add suggestion form (agency only) */}\n <AnimatePresence>\n {showAddForm && isAgency && (\n <motion.form\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n onSubmit={handleAddSuggestion}\n className=\"mt-4 space-y-3\"\n >\n <input\n type=\"text\"\n value={formTitle}\n onChange={(e) => setFormTitle(e.target.value)}\n placeholder=\"Suggestion title\"\n className=\"w-full px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-amber-500/50 focus:border-amber-500\"\n autoFocus\n />\n <textarea\n value={formDescription}\n onChange={(e) => setFormDescription(e.target.value)}\n placeholder=\"Describe the improvement and its benefits...\"\n rows={3}\n className=\"w-full px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-amber-500/50 focus:border-amber-500 resize-none\"\n />\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"relative\">\n <select\n value={formCategory}\n onChange={(e) => setFormCategory(e.target.value as SuggestionCategory)}\n className=\"w-full px-3 py-2 pr-8 rounded-lg border border-slate-200 text-sm text-slate-900 bg-white focus:outline-none focus:ring-2 focus:ring-amber-500/50 focus:border-amber-500 appearance-none\"\n >\n {SUGGESTION_CATEGORIES.map(cat => (\n <option key={cat} value={cat}>\n {getSuggestionCategoryInfo(cat).label}\n </option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400 pointer-events-none\" />\n </div>\n <div className=\"relative\">\n <select\n value={formImpact}\n onChange={(e) => setFormImpact(e.target.value as SuggestionImpact)}\n className=\"w-full px-3 py-2 pr-8 rounded-lg border border-slate-200 text-sm text-slate-900 bg-white focus:outline-none focus:ring-2 focus:ring-amber-500/50 focus:border-amber-500 appearance-none\"\n >\n {IMPACT_LEVELS.map(impact => (\n <option key={impact} value={impact}>\n {getImpactInfo(impact).label}\n </option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400 pointer-events-none\" />\n </div>\n <div className=\"relative\">\n <Clock className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400\" />\n <input\n type=\"number\"\n value={formEffortHours}\n onChange={(e) => setFormEffortHours(e.target.value)}\n placeholder=\"Hours\"\n step=\"0.5\"\n min=\"0\"\n className=\"w-full pl-9 pr-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-amber-500/50 focus:border-amber-500\"\n />\n </div>\n <div className=\"relative\">\n <Euro className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400\" />\n <input\n type=\"number\"\n value={formCost}\n onChange={(e) => setFormCost(e.target.value)}\n placeholder=\"Cost\"\n step=\"1\"\n min=\"0\"\n className=\"w-full pl-9 pr-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-amber-500/50 focus:border-amber-500\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"submit\"\n disabled={!formTitle.trim() || !formDescription.trim() || isSubmitting}\n className=\"px-4 py-2 rounded-lg bg-amber-600 text-white text-sm font-medium hover:bg-amber-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isSubmitting ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : 'Create Suggestion'}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(false)\n resetForm()\n }}\n className=\"px-4 py-2 rounded-lg text-slate-600 text-sm font-medium hover:bg-slate-100 transition-colors\"\n >\n Cancel\n </button>\n </div>\n </motion.form>\n )}\n </AnimatePresence>\n </div>\n\n {/* Error state */}\n {error && (\n <div className=\"p-4 bg-red-50 border-b border-red-100\">\n <div className=\"flex items-center gap-2 text-sm text-red-700\">\n <AlertCircle className=\"w-4 h-4\" />\n {error}\n </div>\n </div>\n )}\n\n {/* Suggestions list */}\n <div className=\"divide-y divide-slate-100\">\n {loading ? (\n <div className=\"p-8 text-center\">\n <Loader2 className=\"w-6 h-6 animate-spin text-slate-400 mx-auto mb-2\" />\n <p className=\"text-sm text-slate-500\">Loading suggestions...</p>\n </div>\n ) : visibleSuggestions.length === 0 ? (\n <div className=\"p-8 text-center\">\n <Lightbulb className=\"w-10 h-10 mx-auto text-slate-300 mb-3\" />\n <p className=\"text-sm text-slate-600 font-medium mb-1\">\n {isAgency ? 'No suggestions yet' : 'No improvement suggestions'}\n </p>\n <p className=\"text-xs text-slate-400\">\n {isAgency\n ? 'Create suggestions to propose improvements to your client'\n : 'Your agency will propose improvements here'\n }\n </p>\n </div>\n ) : isAgency ? (\n // Agency view - show all suggestions in a flat list\n visibleSuggestions.map((suggestion: ImprovementSuggestion) => (\n <SuggestionCard\n key={suggestion.id}\n suggestion={suggestion}\n isAgency={isAgency}\n isSubmitting={isSubmitting}\n respondingToId={respondingToId}\n responseNotes={responseNotes}\n setRespondingToId={setRespondingToId}\n setResponseNotes={setResponseNotes}\n onPropose={() => handlePropose(suggestion.id)}\n onAccept={() => handleAccept(suggestion.id)}\n onReject={() => handleReject(suggestion.id)}\n onConvert={() => handleConvert(suggestion.id)}\n onDelete={() => handleDelete(suggestion.id)}\n />\n ))\n ) : (\n // Client view - grouped by status\n <>\n {/* Pending Your Response */}\n {clientGroupedSuggestions.pending.length > 0 && (\n <div>\n <div className=\"px-4 py-2 bg-amber-50 border-b border-amber-100\">\n <h4 className=\"text-sm font-medium text-amber-800\">\n Pending Your Response ({clientGroupedSuggestions.pending.length})\n </h4>\n </div>\n {clientGroupedSuggestions.pending.map((suggestion: ImprovementSuggestion) => (\n <SuggestionCard\n key={suggestion.id}\n suggestion={suggestion}\n isAgency={isAgency}\n isSubmitting={isSubmitting}\n respondingToId={respondingToId}\n responseNotes={responseNotes}\n setRespondingToId={setRespondingToId}\n setResponseNotes={setResponseNotes}\n onPropose={() => handlePropose(suggestion.id)}\n onAccept={() => handleAccept(suggestion.id)}\n onReject={() => handleReject(suggestion.id)}\n onConvert={() => handleConvert(suggestion.id)}\n onDelete={() => handleDelete(suggestion.id)}\n />\n ))}\n </div>\n )}\n\n {/* Accepted Suggestions */}\n {clientGroupedSuggestions.accepted.length > 0 && (\n <div>\n <div className=\"px-4 py-2 bg-emerald-50 border-b border-emerald-100\">\n <h4 className=\"text-sm font-medium text-emerald-800\">\n Accepted Suggestions ({clientGroupedSuggestions.accepted.length})\n </h4>\n </div>\n {clientGroupedSuggestions.accepted.map((suggestion: ImprovementSuggestion) => (\n <SuggestionCard\n key={suggestion.id}\n suggestion={suggestion}\n isAgency={isAgency}\n isSubmitting={isSubmitting}\n respondingToId={respondingToId}\n responseNotes={responseNotes}\n setRespondingToId={setRespondingToId}\n setResponseNotes={setResponseNotes}\n onPropose={() => handlePropose(suggestion.id)}\n onAccept={() => handleAccept(suggestion.id)}\n onReject={() => handleReject(suggestion.id)}\n onConvert={() => handleConvert(suggestion.id)}\n onDelete={() => handleDelete(suggestion.id)}\n isReadOnly\n />\n ))}\n </div>\n )}\n\n {/* Declined Suggestions */}\n {clientGroupedSuggestions.rejected.length > 0 && (\n <div>\n <div className=\"px-4 py-2 bg-slate-50 border-b border-slate-100\">\n <h4 className=\"text-sm font-medium text-slate-600\">\n Declined Suggestions ({clientGroupedSuggestions.rejected.length})\n </h4>\n </div>\n {clientGroupedSuggestions.rejected.map((suggestion: ImprovementSuggestion) => (\n <SuggestionCard\n key={suggestion.id}\n suggestion={suggestion}\n isAgency={isAgency}\n isSubmitting={isSubmitting}\n respondingToId={respondingToId}\n responseNotes={responseNotes}\n setRespondingToId={setRespondingToId}\n setResponseNotes={setResponseNotes}\n onPropose={() => handlePropose(suggestion.id)}\n onAccept={() => handleAccept(suggestion.id)}\n onReject={() => handleReject(suggestion.id)}\n onConvert={() => handleConvert(suggestion.id)}\n onDelete={() => handleDelete(suggestion.id)}\n isReadOnly\n />\n ))}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n )\n}\n\n// ============================================\n// Suggestion Card\n// ============================================\n\ninterface SuggestionCardProps {\n suggestion: ImprovementSuggestion\n isAgency: boolean\n isSubmitting: boolean\n respondingToId: string | null\n responseNotes: string\n setRespondingToId: (id: string | null) => void\n setResponseNotes: (notes: string) => void\n onPropose: () => void\n onAccept: () => void\n onReject: () => void\n onConvert: () => void\n onDelete: () => void\n isReadOnly?: boolean\n}\n\nconst SuggestionCard = ({\n suggestion,\n isAgency,\n isSubmitting,\n respondingToId,\n responseNotes,\n setRespondingToId,\n setResponseNotes,\n onPropose,\n onAccept,\n onReject,\n onConvert,\n onDelete,\n isReadOnly = false\n}: SuggestionCardProps) => {\n const categoryInfo = getSuggestionCategoryInfo(suggestion.category)\n const impactInfo = getImpactInfo(suggestion.impact)\n const statusInfo = getStatusInfo(suggestion.status)\n const isResponding = respondingToId === suggestion.id\n\n // Determine visual styling based on status for read-only client views\n const getStatusStyling = () => {\n if (!isReadOnly) return 'hover:bg-slate-50/50'\n if (suggestion.status === 'accepted') return 'bg-emerald-50/30 border-l-2 border-emerald-500'\n if (suggestion.status === 'rejected') return 'opacity-60 bg-slate-50/50'\n return 'hover:bg-slate-50/50'\n }\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n className={cn('p-4 transition-colors', getStatusStyling())}\n >\n {/* Header */}\n <div className=\"flex items-start justify-between gap-4 mb-3\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className={cn('px-2 py-0.5 rounded text-xs font-medium', categoryInfo.bgColor, categoryInfo.color)}>\n {categoryInfo.label}\n </span>\n <span className={cn('px-2 py-0.5 rounded text-xs font-medium', statusInfo.bgColor, statusInfo.color)}>\n {statusInfo.label}\n </span>\n <span className={cn('text-xs font-medium', impactInfo.color)}>\n <TrendingUp className=\"w-3 h-3 inline mr-0.5\" />\n {impactInfo.label}\n </span>\n </div>\n {isAgency && suggestion.status === 'draft' && (\n <button\n onClick={onDelete}\n className=\"p-1.5 rounded-lg text-slate-400 hover:text-red-600 hover:bg-red-50 transition-colors\"\n title=\"Delete\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n\n {/* Content */}\n <h4 className=\"font-medium text-slate-900 mb-2\">{suggestion.title}</h4>\n <p className=\"text-sm text-slate-600 mb-3\">{suggestion.description}</p>\n\n {/* Estimates - only visible to agency */}\n {isAgency && (suggestion.effort_hours || suggestion.estimated_cost_cents) && (\n <div className=\"flex items-center gap-4 text-sm text-slate-500 mb-3\">\n {suggestion.effort_hours && (\n <span className=\"flex items-center gap-1\">\n <Clock className=\"w-4 h-4\" />\n {suggestion.effort_hours}h\n </span>\n )}\n {suggestion.estimated_cost_cents && (\n <span className=\"flex items-center gap-1\">\n <Euro className=\"w-4 h-4\" />\n {(suggestion.estimated_cost_cents / 100).toFixed(2)}\n </span>\n )}\n </div>\n )}\n\n {/* Client response notes */}\n {suggestion.client_response_notes && (\n <div className=\"mb-3 p-3 rounded-lg bg-slate-100\">\n <div className=\"flex items-center gap-1.5 text-xs text-slate-500 mb-1\">\n <MessageSquare className=\"w-3 h-3\" />\n Client response\n </div>\n <p className=\"text-sm text-slate-700\">{suggestion.client_response_notes}</p>\n </div>\n )}\n\n {/* Response form (client only, for proposed suggestions, not read-only) */}\n {!isAgency && suggestion.status === 'proposed' && !isReadOnly && (\n <div className=\"mt-4\">\n {isResponding ? (\n <div className=\"space-y-3\">\n <textarea\n value={responseNotes}\n onChange={(e) => setResponseNotes(e.target.value)}\n placeholder=\"Add a note (optional)...\"\n rows={2}\n className=\"w-full px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-amber-500/50 focus:border-amber-500 resize-none\"\n />\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onAccept}\n disabled={isSubmitting}\n className=\"flex items-center gap-1.5 px-4 py-2 rounded-lg bg-emerald-600 text-white text-sm font-medium hover:bg-emerald-700 disabled:opacity-50 transition-colors\"\n >\n <Check className=\"w-4 h-4\" />\n Accept\n </button>\n <button\n onClick={onReject}\n disabled={isSubmitting}\n className=\"flex items-center gap-1.5 px-4 py-2 rounded-lg bg-red-600 text-white text-sm font-medium hover:bg-red-700 disabled:opacity-50 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n Decline\n </button>\n <button\n onClick={() => {\n setRespondingToId(null)\n setResponseNotes('')\n }}\n className=\"px-4 py-2 rounded-lg text-slate-600 text-sm font-medium hover:bg-slate-100 transition-colors\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <button\n onClick={() => setRespondingToId(suggestion.id)}\n className=\"flex items-center gap-1.5 px-4 py-2 rounded-lg bg-amber-100 text-amber-700 text-sm font-medium hover:bg-amber-200 transition-colors\"\n >\n <MessageSquare className=\"w-4 h-4\" />\n Respond to this suggestion\n </button>\n )}\n </div>\n )}\n\n {/* Response date indicator for accepted/rejected (client read-only view) */}\n {isReadOnly && (suggestion.status === 'accepted' || suggestion.status === 'rejected') && (\n <div className={cn(\n 'mt-3 flex items-center gap-2 text-xs',\n suggestion.status === 'accepted' ? 'text-emerald-600' : 'text-slate-500'\n )}>\n {suggestion.status === 'accepted' ? (\n <Check className=\"w-3.5 h-3.5\" />\n ) : (\n <X className=\"w-3.5 h-3.5\" />\n )}\n <span>\n {suggestion.status === 'accepted' ? 'Accepted' : 'Declined'}\n {suggestion.client_response_at && (\n <> on {format(new Date(suggestion.client_response_at), 'MMM d, yyyy', { locale: enUS })}</>\n )}\n </span>\n </div>\n )}\n\n {/* Agency actions */}\n {isAgency && (\n <div className=\"flex items-center gap-2 mt-4\">\n {suggestion.status === 'draft' && (\n <button\n onClick={onPropose}\n disabled={isSubmitting}\n className=\"flex items-center gap-1.5 px-4 py-2 rounded-lg bg-blue-600 text-white text-sm font-medium hover:bg-blue-700 disabled:opacity-50 transition-colors\"\n >\n <Send className=\"w-4 h-4\" />\n Propose to Client\n </button>\n )}\n {suggestion.status === 'accepted' && (\n <button\n onClick={onConvert}\n disabled={isSubmitting}\n className=\"flex items-center gap-1.5 px-4 py-2 rounded-lg bg-purple-600 text-white text-sm font-medium hover:bg-purple-700 disabled:opacity-50 transition-colors\"\n >\n <ArrowRight className=\"w-4 h-4\" />\n Convert to Task\n </button>\n )}\n {suggestion.status === 'converted' && suggestion.converted_item_id && (\n <span className=\"text-xs text-slate-500\">\n Converted to maintenance item\n </span>\n )}\n </div>\n )}\n\n {/* Meta */}\n <p className=\"text-xs text-slate-400 mt-3\">\n Created by {suggestion.created_by_name} on {format(new Date(suggestion.created_at), 'MMM d, yyyy', { locale: enUS })}\n {suggestion.proposed_at && (\n <> &middot; Proposed {format(new Date(suggestion.proposed_at), 'MMM d, yyyy', { locale: enUS })}</>\n )}\n </p>\n </motion.div>\n )\n}\n\nexport default SuggestionsBoard\n","/**\n * useMaintenanceItems - Hook for managing maintenance items\n *\n * This hook manages local state for maintenance items while delegating\n * actual data operations to callbacks provided by the consuming application.\n *\n * Usage:\n * ```tsx\n * const { items, loading, createItem } = useMaintenanceItems({\n * projectId: 'my-project',\n * onFetch: async () => await myApi.getItems(),\n * onCreate: async (item) => await myApi.createItem(item),\n * onUpdate: async (id, updates) => await myApi.updateItem(id, updates),\n * onDelete: async (id) => await myApi.deleteItem(id),\n * });\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport type { MaintenanceItem, MaintenanceItemStatus } from '@framed/core'\n\n/**\n * Callback options for data operations\n */\ninterface UseMaintenanceItemsCallbacks {\n /** Fetch all maintenance items */\n onFetch?: () => Promise<MaintenanceItem[]>\n /** Create a new maintenance item */\n onCreate?: (item: Omit<MaintenanceItem, 'id' | 'created_at' | 'updated_at'>) => Promise<MaintenanceItem>\n /** Update an existing maintenance item */\n onUpdate?: (id: string, updates: Partial<MaintenanceItem>) => Promise<MaintenanceItem | void>\n /** Delete a maintenance item */\n onDelete?: (id: string) => Promise<void>\n}\n\ninterface UseMaintenanceItemsOptions extends UseMaintenanceItemsCallbacks {\n projectId: string | undefined\n agencyId?: string\n /** Initial items to populate the hook (useful for SSR or cached data) */\n initialItems?: MaintenanceItem[]\n /** Auto-fetch on mount (default: true if onFetch is provided) */\n autoFetch?: boolean\n}\n\ninterface UseMaintenanceItemsReturn {\n items: MaintenanceItem[]\n loading: boolean\n error: string | null\n createItem: (item: Omit<MaintenanceItem, 'id' | 'created_at' | 'updated_at'>) => Promise<MaintenanceItem | null>\n updateItem: (id: string, updates: Partial<MaintenanceItem>) => Promise<boolean>\n deleteItem: (id: string) => Promise<boolean>\n updateStatus: (id: string, status: MaintenanceItemStatus, resolvedBy?: string, resolvedByName?: string) => Promise<boolean>\n reload: () => Promise<void>\n /** Set items directly (useful for external state management) */\n setItems: (items: MaintenanceItem[]) => void\n}\n\n/**\n * Hook for managing maintenance items with callback-based data operations\n */\nexport const useMaintenanceItems = ({\n projectId,\n agencyId,\n initialItems = [],\n autoFetch = true,\n onFetch,\n onCreate,\n onUpdate,\n onDelete,\n}: UseMaintenanceItemsOptions): UseMaintenanceItemsReturn => {\n const [items, setItems] = useState<MaintenanceItem[]>(initialItems)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Fetch items on mount if autoFetch is enabled and onFetch is provided\n useEffect(() => {\n if (autoFetch && onFetch && projectId) {\n reload()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [projectId, autoFetch])\n\n const reload = useCallback(async () => {\n if (!onFetch) {\n console.warn('useMaintenanceItems: onFetch callback not provided')\n return\n }\n\n setLoading(true)\n setError(null)\n\n try {\n const fetchedItems = await onFetch()\n setItems(fetchedItems)\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch items'\n setError(message)\n console.error('useMaintenanceItems: fetch error', err)\n } finally {\n setLoading(false)\n }\n }, [onFetch])\n\n const createItem = useCallback(async (\n item: Omit<MaintenanceItem, 'id' | 'created_at' | 'updated_at'>\n ): Promise<MaintenanceItem | null> => {\n if (!onCreate) {\n console.warn('useMaintenanceItems: onCreate callback not provided')\n return null\n }\n\n setLoading(true)\n setError(null)\n\n try {\n const newItem = await onCreate(item)\n setItems(prev => [newItem, ...prev])\n return newItem\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create item'\n setError(message)\n console.error('useMaintenanceItems: create error', err)\n return null\n } finally {\n setLoading(false)\n }\n }, [onCreate])\n\n const updateItem = useCallback(async (\n id: string,\n updates: Partial<MaintenanceItem>\n ): Promise<boolean> => {\n if (!onUpdate) {\n console.warn('useMaintenanceItems: onUpdate callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n const result = await onUpdate(id, updates)\n\n // Update local state\n setItems(prev => prev.map(item => {\n if (item.id === id) {\n // If onUpdate returned the updated item, use it; otherwise merge updates\n return result ? result : { ...item, ...updates, updated_at: new Date().toISOString() }\n }\n return item\n }))\n\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update item'\n setError(message)\n console.error('useMaintenanceItems: update error', err)\n return false\n }\n }, [onUpdate])\n\n const deleteItem = useCallback(async (id: string): Promise<boolean> => {\n if (!onDelete) {\n console.warn('useMaintenanceItems: onDelete callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n await onDelete(id)\n setItems(prev => prev.filter(item => item.id !== id))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete item'\n setError(message)\n console.error('useMaintenanceItems: delete error', err)\n return false\n }\n }, [onDelete])\n\n const updateStatus = useCallback(async (\n id: string,\n status: MaintenanceItemStatus,\n resolvedBy?: string,\n resolvedByName?: string\n ): Promise<boolean> => {\n const updates: Partial<MaintenanceItem> = { status }\n\n // Add resolution info for completed/wont_fix statuses\n if (status === 'completed' || status === 'wont_fix') {\n updates.resolved_at = new Date().toISOString()\n if (resolvedBy) updates.resolved_by = resolvedBy\n if (resolvedByName) updates.resolved_by_name = resolvedByName\n } else {\n // Clear resolution info for other statuses\n updates.resolved_at = undefined\n updates.resolved_by = undefined\n updates.resolved_by_name = undefined\n }\n\n return updateItem(id, updates)\n }, [updateItem])\n\n return {\n items,\n loading,\n error,\n createItem,\n updateItem,\n deleteItem,\n updateStatus,\n reload,\n setItems,\n }\n}\n\nexport type { UseMaintenanceItemsOptions, UseMaintenanceItemsReturn, UseMaintenanceItemsCallbacks }\n","/**\n * MonitoringView - Phase 5 Monitoring Dashboard\n *\n * Shows SEO, Performance, Uptime, and Analytics monitoring in a Phase 4-style view.\n * Checks agency-level and project-level feature flags to determine availability.\n *\n * SDK version: Uses callback props instead of direct Supabase/service calls.\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n Search,\n BarChart3,\n Activity,\n Crown,\n Globe,\n AlertCircle,\n AlertTriangle,\n Info,\n CheckCircle2,\n ChevronDown,\n ChevronRight,\n Loader2,\n Lock,\n TrendingUp,\n Users\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport type { Phase5Data, Project, User, SeoReport, PerformanceReport } from '@framed/core'\nimport { agencyHasMonitoringFeature, projectHasMonitoringFeature } from '../utils/featureFlags'\nimport { useMaintenanceItems } from '../hooks/useMaintenanceItems'\nimport type { UseMaintenanceItemsCallbacks } from '../hooks/useMaintenanceItems'\n\ntype MonitoringTab = 'seo' | 'performance' | 'uptime' | 'analytics'\n\ninterface MonitoredPage {\n name: string\n url: string\n}\n\n/**\n * Callbacks for loading monitoring data from external services\n */\nexport interface MonitoringDataCallbacks {\n /** Load SEO reports for the project */\n onLoadSeoReports?: (projectId: string) => Promise<SeoReport[]>\n /** Load performance reports for the project */\n onLoadPerformanceReports?: (projectId: string) => Promise<PerformanceReport[]>\n /** Enable analytics for this project */\n onEnableAnalytics?: (projectId: string) => Promise<void>\n}\n\nexport interface MonitoringViewProps {\n projectId: string\n agencyId?: string\n project: Project | null\n user: User | null\n phase5Data: Phase5Data\n canEdit: boolean\n isAgency: boolean\n /** Callbacks for maintenance item creation from performance issues */\n maintenanceItemsCallbacks?: UseMaintenanceItemsCallbacks\n /** Callbacks for loading monitoring data */\n dataCallbacks?: MonitoringDataCallbacks\n /** Toast notification callback */\n onToast?: (message: { title: string; description?: string; variant?: 'default' | 'destructive' }) => void\n /** Custom SEO detail view component */\n SeoDetailView?: React.ComponentType<{\n projectId: string\n pageName: string\n pageUrl: string\n canEdit: boolean\n }>\n /** Custom Performance detail view component */\n PerformanceDetailView?: React.ComponentType<{\n projectId: string\n pageName: string\n pageUrl: string\n canEdit: boolean\n isAgency: boolean\n userRole?: string\n onCreateTicket?: (item: {\n title: string\n description: string\n category: string\n priority: string\n page_name?: string\n page_url?: string\n }) => Promise<void>\n }>\n /** Custom Uptime dashboard component */\n UptimeDashboard?: React.ComponentType<{\n projectId: string\n agencyId: string\n liveUrl?: string\n }>\n /** Custom Analytics dashboard component */\n AnalyticsDashboard?: React.ComponentType<{\n projectId: string\n analyticsEnabled: boolean\n onEnableAnalytics?: () => void\n }>\n}\n\nexport const MonitoringView = ({\n projectId,\n agencyId,\n project,\n user,\n phase5Data,\n canEdit,\n isAgency,\n maintenanceItemsCallbacks,\n dataCallbacks,\n onToast,\n SeoDetailView,\n PerformanceDetailView,\n UptimeDashboard,\n AnalyticsDashboard\n}: MonitoringViewProps) => {\n const [activeTab, setActiveTab] = useState<MonitoringTab>('seo')\n const [expandedPage, setExpandedPage] = useState<string | null>(null)\n\n // Hook for creating maintenance items from performance issues\n const { createItem } = useMaintenanceItems({\n projectId,\n agencyId,\n ...maintenanceItemsCallbacks\n })\n\n // SEO state\n const [seoReports, setSeoReports] = useState<SeoReport[]>([])\n const [loadingSeo, setLoadingSeo] = useState(false)\n\n // Performance state\n const [performanceReports, setPerformanceReports] = useState<PerformanceReport[]>([])\n const [loadingPerformance, setLoadingPerformance] = useState(false)\n\n // Get monitored pages from live/staging URLs\n const monitoredPages: MonitoredPage[] = []\n if (phase5Data.live_url) {\n monitoredPages.push({ name: 'Live Site', url: phase5Data.live_url })\n }\n if (phase5Data.staging_url) {\n monitoredPages.push({ name: 'Staging Site', url: phase5Data.staging_url })\n }\n\n // Check feature availability\n const agencyHasSeo = agencyHasMonitoringFeature(project, 'seo')\n const agencyHasPerformance = agencyHasMonitoringFeature(project, 'performance')\n const agencyHasUptime = agencyHasMonitoringFeature(project, 'uptime')\n const agencyHasAnalytics = agencyHasMonitoringFeature(project, 'analytics')\n\n const projectHasSeo = projectHasMonitoringFeature(user, project, 'seo')\n const projectHasPerformance = projectHasMonitoringFeature(user, project, 'performance')\n const projectHasUptime = projectHasMonitoringFeature(user, project, 'uptime')\n const projectHasAnalytics = projectHasMonitoringFeature(user, project, 'analytics')\n\n // Check if analytics is enabled (top-level project flag)\n const analyticsEnabled = project?.analytics_enabled ?? false\n\n // Load SEO reports\n const loadSeoReports = useCallback(async () => {\n if (!projectHasSeo || monitoredPages.length === 0 || !dataCallbacks?.onLoadSeoReports) return\n setLoadingSeo(true)\n try {\n const reports = await dataCallbacks.onLoadSeoReports(projectId)\n setSeoReports(reports)\n } catch (err) {\n console.error('Failed to load SEO reports:', err)\n } finally {\n setLoadingSeo(false)\n }\n }, [projectId, projectHasSeo, monitoredPages.length, dataCallbacks])\n\n // Load Performance reports\n const loadPerformanceReports = useCallback(async () => {\n if (!projectHasPerformance || monitoredPages.length === 0 || !dataCallbacks?.onLoadPerformanceReports) return\n setLoadingPerformance(true)\n try {\n const reports = await dataCallbacks.onLoadPerformanceReports(projectId)\n setPerformanceReports(reports)\n } catch (err) {\n console.error('Failed to load performance reports:', err)\n } finally {\n setLoadingPerformance(false)\n }\n }, [projectId, projectHasPerformance, monitoredPages.length, dataCallbacks])\n\n // Load data when tab changes\n useEffect(() => {\n if (activeTab === 'seo' && projectHasSeo) {\n loadSeoReports()\n }\n }, [activeTab, loadSeoReports, projectHasSeo])\n\n useEffect(() => {\n if (activeTab === 'performance' && projectHasPerformance) {\n loadPerformanceReports()\n }\n }, [activeTab, loadPerformanceReports, projectHasPerformance])\n\n // Tab configuration\n const tabs: { id: MonitoringTab; label: string; icon: React.ElementType; available: boolean; projectEnabled: boolean }[] = [\n { id: 'seo', label: 'SEO', icon: Search, available: agencyHasSeo, projectEnabled: projectHasSeo },\n { id: 'performance', label: 'Performance', icon: BarChart3, available: agencyHasPerformance, projectEnabled: projectHasPerformance },\n { id: 'uptime', label: 'Uptime', icon: Activity, available: agencyHasUptime, projectEnabled: projectHasUptime },\n { id: 'analytics', label: 'Analytics', icon: TrendingUp, available: agencyHasAnalytics, projectEnabled: projectHasAnalytics }\n ]\n\n // Enable analytics for this project\n const handleEnableAnalytics = useCallback(async () => {\n if (!projectId || !dataCallbacks?.onEnableAnalytics) return\n try {\n await dataCallbacks.onEnableAnalytics(projectId)\n // The parent component should refresh the project data\n onToast?.({ title: 'Analytics enabled', description: 'Site analytics tracking is now active.' })\n } catch (err) {\n console.error('Failed to enable analytics:', err)\n onToast?.({ title: 'Error', description: 'Failed to enable analytics. Please try again.', variant: 'destructive' })\n }\n }, [projectId, dataCallbacks, onToast])\n\n // Create ticket from performance opportunity\n const handleCreateTicketFromPerformance = useCallback(async (item: {\n title: string\n description: string\n category: string\n priority: string\n page_name?: string\n page_url?: string\n }) => {\n const result = await createItem({\n title: item.title,\n description: item.description,\n category: 'performance',\n priority: item.priority as 'low' | 'medium' | 'high' | 'critical',\n status: 'backlog',\n page_url: item.page_url,\n created_by: user?.id || '',\n created_by_name: user?.name || user?.email || 'Unknown',\n comments: [],\n attachments: [],\n })\n\n if (!result) {\n throw new Error('Failed to create maintenance item')\n }\n }, [createItem, user])\n\n // Render upgrade prompt for features not available at agency level\n const renderUpgradePrompt = (feature: MonitoringTab) => {\n const config = {\n seo: {\n title: 'SEO Monitoring',\n description: 'Track SEO issues across your project pages with automated audits.',\n features: [\n { icon: Search, label: 'Meta Tag Analysis' },\n { icon: AlertCircle, label: 'Issue Detection' },\n { icon: CheckCircle2, label: 'Best Practices' }\n ]\n },\n performance: {\n title: 'Performance Monitoring',\n description: 'Track Core Web Vitals and Lighthouse scores across your project pages.',\n features: [\n { icon: BarChart3, label: 'Lighthouse Scores' },\n { icon: Activity, label: 'Core Web Vitals' },\n { icon: CheckCircle2, label: 'Optimization Tips' }\n ]\n },\n uptime: {\n title: 'Uptime Monitoring',\n description: 'Monitor website availability and get notified when your site goes down.',\n features: [\n { icon: Activity, label: '1-Minute Checks' },\n { icon: AlertTriangle, label: 'Instant Alerts' },\n { icon: CheckCircle2, label: 'Status Pages' }\n ]\n },\n analytics: {\n title: 'Site Analytics',\n description: 'Track website visitors, traffic sources, and page views with privacy-friendly analytics.',\n features: [\n { icon: Users, label: 'Visitor Tracking' },\n { icon: Globe, label: 'Traffic Sources' },\n { icon: TrendingUp, label: 'Page Views' }\n ]\n }\n }[feature]\n\n return (\n <div className=\"text-center py-12\">\n <div className=\"w-16 h-16 mx-auto mb-4 rounded-2xl bg-gradient-to-br from-amber-100 to-amber-50 flex items-center justify-center\">\n <Crown className=\"w-8 h-8 text-amber-500\" />\n </div>\n <h2 className=\"text-xl font-semibold text-slate-900 mb-2\">{config.title}</h2>\n <p className=\"text-slate-500 mb-6 max-w-md mx-auto\">\n {config.description}\n <br />\n <span className=\"text-sm\">Available with the Gold plan or as a paid add-on.</span>\n </p>\n <div className=\"flex items-center justify-center gap-3\">\n <button className=\"px-6 py-3 rounded-lg bg-gradient-to-r from-amber-500 to-amber-600 hover:from-amber-600 hover:to-amber-700 text-white font-medium transition-all shadow-lg shadow-amber-500/25\">\n <span className=\"flex items-center gap-2\">\n <Crown className=\"w-4 h-4\" />\n Upgrade to Gold\n </span>\n </button>\n <button className=\"px-6 py-3 rounded-lg border border-slate-200 text-slate-700 hover:bg-slate-50 font-medium transition-colors\">\n Learn More\n </button>\n </div>\n <div className=\"mt-8 grid grid-cols-3 gap-4 max-w-lg mx-auto text-sm\">\n {config.features.map((f, idx) => (\n <div key={idx} className=\"p-4 rounded-xl bg-slate-50 border border-slate-200\">\n <f.icon className=\"w-5 h-5 text-emerald-500 mx-auto mb-2\" />\n <p className=\"text-slate-600\">{f.label}</p>\n </div>\n ))}\n </div>\n </div>\n )\n }\n\n // Render disabled at project level message\n const renderProjectDisabled = (feature: MonitoringTab) => {\n const featureNames = {\n seo: 'SEO Monitoring',\n performance: 'Performance Monitoring',\n uptime: 'Uptime Monitoring',\n analytics: 'Site Analytics'\n }\n\n return (\n <div className=\"text-center py-12\">\n <div className=\"w-16 h-16 mx-auto mb-4 rounded-2xl bg-slate-100 flex items-center justify-center\">\n <Lock className=\"w-8 h-8 text-slate-400\" />\n </div>\n <h2 className=\"text-xl font-semibold text-slate-900 mb-2\">{featureNames[feature]} Disabled</h2>\n <p className=\"text-slate-500 mb-6 max-w-md mx-auto\">\n This feature is available for your agency but has been disabled for this project.\n <br />\n Contact your administrator to enable it.\n </p>\n {isAgency && (\n <p className=\"text-sm text-slate-400\">\n You can enable this feature in <span className=\"font-medium\">Settings → Monitoring Configuration</span>\n </p>\n )}\n </div>\n )\n }\n\n // Render no URLs configured message\n const renderNoUrls = () => (\n <div className=\"text-center py-12\">\n <div className=\"w-16 h-16 mx-auto mb-4 rounded-2xl bg-slate-100 flex items-center justify-center\">\n <Globe className=\"w-8 h-8 text-slate-400\" />\n </div>\n <h2 className=\"text-xl font-semibold text-slate-900 mb-2\">No URLs Configured</h2>\n <p className=\"text-slate-500 mb-6 max-w-md mx-auto\">\n Add a live or staging URL in project settings to start monitoring.\n </p>\n </div>\n )\n\n // Render SEO monitoring content\n const renderSeoContent = () => {\n if (!agencyHasSeo) return renderUpgradePrompt('seo')\n if (!projectHasSeo) return renderProjectDisabled('seo')\n if (monitoredPages.length === 0) return renderNoUrls()\n\n return (\n <div className=\"space-y-4\">\n {loadingSeo ? (\n <div className=\"text-center py-12\">\n <Loader2 className=\"w-8 h-8 text-slate-400 animate-spin mx-auto mb-3\" />\n <p className=\"text-sm text-slate-500\">Loading SEO data...</p>\n </div>\n ) : (\n monitoredPages.map((page) => {\n const isExpanded = expandedPage === `seo-${page.name}`\n const report = seoReports.find((r: SeoReport) => r.pageName === page.name)\n const issues = report?.results?.[0]?.issues || []\n const errors = issues.filter((i: { type: string }) => i.type === 'error').length\n const warnings = issues.filter((i: { type: string }) => i.type === 'warning').length\n const infos = issues.filter((i: { type: string }) => i.type === 'info').length\n\n return (\n <div key={page.name} className=\"bg-white rounded-xl border border-slate-200 overflow-hidden\">\n <button\n onClick={() => setExpandedPage(isExpanded ? null : `seo-${page.name}`)}\n className=\"w-full flex items-center justify-between p-4 hover:bg-slate-50 transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <div className={cn(\n 'w-10 h-10 rounded-lg flex items-center justify-center',\n isExpanded ? 'bg-emerald-100' : 'bg-slate-100'\n )}>\n {isExpanded ? (\n <ChevronDown className=\"w-5 h-5 text-emerald-600\" />\n ) : (\n <ChevronRight className=\"w-5 h-5 text-slate-400\" />\n )}\n </div>\n <div className=\"text-left\">\n <h4 className=\"font-medium text-slate-900\">{page.name}</h4>\n <p className=\"text-xs text-slate-500 truncate max-w-xs\">{page.url}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n {report ? (\n <>\n <div className={cn(\n 'flex items-center gap-1.5 px-2 py-1 rounded text-xs font-medium',\n errors > 0 ? 'bg-red-100 text-red-700' : 'bg-slate-100 text-slate-400'\n )}>\n <AlertCircle className=\"w-3 h-3\" />\n {errors}\n </div>\n <div className={cn(\n 'flex items-center gap-1.5 px-2 py-1 rounded text-xs font-medium',\n warnings > 0 ? 'bg-amber-100 text-amber-700' : 'bg-slate-100 text-slate-400'\n )}>\n <AlertTriangle className=\"w-3 h-3\" />\n {warnings}\n </div>\n <div className={cn(\n 'flex items-center gap-1.5 px-2 py-1 rounded text-xs font-medium',\n infos > 0 ? 'bg-blue-100 text-blue-700' : 'bg-slate-100 text-slate-400'\n )}>\n <Info className=\"w-3 h-3\" />\n {infos}\n </div>\n </>\n ) : (\n <span className=\"text-xs text-slate-400\">Not audited</span>\n )}\n </div>\n </button>\n\n <AnimatePresence>\n {isExpanded && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n className=\"overflow-hidden border-t border-slate-100\"\n >\n <div className=\"p-4 bg-slate-50\">\n {SeoDetailView ? (\n <SeoDetailView\n projectId={projectId}\n pageName={page.name}\n pageUrl={page.url}\n canEdit={canEdit}\n />\n ) : (\n <div className=\"text-center py-8 text-slate-500\">\n <Search className=\"w-8 h-8 mx-auto mb-2 text-slate-300\" />\n <p className=\"text-sm\">SEO detail view not configured</p>\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )\n })\n )}\n\n {/* Legend */}\n <div className=\"flex items-center justify-center gap-6 mt-6 text-xs text-slate-500\">\n <div className=\"flex items-center gap-1.5\">\n <AlertCircle className=\"w-3.5 h-3.5 text-red-500\" />\n <span>Errors</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <AlertTriangle className=\"w-3.5 h-3.5 text-amber-500\" />\n <span>Warnings</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Info className=\"w-3.5 h-3.5 text-blue-500\" />\n <span>Info</span>\n </div>\n </div>\n </div>\n )\n }\n\n // Render Performance monitoring content\n const renderPerformanceContent = () => {\n if (!agencyHasPerformance) return renderUpgradePrompt('performance')\n if (!projectHasPerformance) return renderProjectDisabled('performance')\n if (monitoredPages.length === 0) return renderNoUrls()\n\n const getScoreIndicator = (score: number | undefined) => {\n if (score === undefined) return { bg: 'bg-slate-100', text: 'text-slate-400', label: '—' }\n if (score >= 90) return { bg: 'bg-emerald-100', text: 'text-emerald-700', label: score }\n if (score >= 50) return { bg: 'bg-amber-100', text: 'text-amber-700', label: score }\n return { bg: 'bg-red-100', text: 'text-red-700', label: score }\n }\n\n return (\n <div className=\"space-y-4\">\n {loadingPerformance ? (\n <div className=\"text-center py-12\">\n <Loader2 className=\"w-8 h-8 text-slate-400 animate-spin mx-auto mb-3\" />\n <p className=\"text-sm text-slate-500\">Loading performance data...</p>\n </div>\n ) : (\n monitoredPages.map((page) => {\n const isExpanded = expandedPage === `perf-${page.name}`\n const mobileReport = performanceReports.find(\n (r: PerformanceReport) => r.pageName === page.name && r.strategy === 'mobile'\n )\n const desktopReport = performanceReports.find(\n (r: PerformanceReport) => r.pageName === page.name && r.strategy === 'desktop'\n )\n const report = mobileReport || desktopReport\n\n const perfScore = getScoreIndicator(report?.metrics.performance)\n const a11yScore = getScoreIndicator(report?.metrics.accessibility)\n const seoScore = getScoreIndicator(report?.metrics.seo)\n\n return (\n <div key={page.name} className=\"bg-white rounded-xl border border-slate-200 overflow-hidden\">\n <button\n onClick={() => setExpandedPage(isExpanded ? null : `perf-${page.name}`)}\n className=\"w-full flex items-center justify-between p-4 hover:bg-slate-50 transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <div className={cn(\n 'w-10 h-10 rounded-lg flex items-center justify-center',\n isExpanded ? 'bg-orange-100' : 'bg-slate-100'\n )}>\n {isExpanded ? (\n <ChevronDown className=\"w-5 h-5 text-orange-600\" />\n ) : (\n <ChevronRight className=\"w-5 h-5 text-slate-400\" />\n )}\n </div>\n <div className=\"text-left\">\n <h4 className=\"font-medium text-slate-900\">{page.name}</h4>\n <p className=\"text-xs text-slate-500 truncate max-w-xs\">{page.url}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {report ? (\n <>\n <div className={cn(\n 'w-10 h-10 rounded-lg flex flex-col items-center justify-center',\n perfScore.bg\n )}>\n <span className={cn('text-xs font-bold', perfScore.text)}>{perfScore.label}</span>\n <span className=\"text-[8px] text-slate-400\">Perf</span>\n </div>\n <div className={cn(\n 'w-10 h-10 rounded-lg flex flex-col items-center justify-center',\n a11yScore.bg\n )}>\n <span className={cn('text-xs font-bold', a11yScore.text)}>{a11yScore.label}</span>\n <span className=\"text-[8px] text-slate-400\">A11y</span>\n </div>\n <div className={cn(\n 'w-10 h-10 rounded-lg flex flex-col items-center justify-center',\n seoScore.bg\n )}>\n <span className={cn('text-xs font-bold', seoScore.text)}>{seoScore.label}</span>\n <span className=\"text-[8px] text-slate-400\">SEO</span>\n </div>\n </>\n ) : (\n <span className=\"text-xs text-slate-400\">Not analyzed</span>\n )}\n </div>\n </button>\n\n <AnimatePresence>\n {isExpanded && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n className=\"overflow-hidden border-t border-slate-100\"\n >\n <div className=\"p-4 bg-slate-50\">\n {PerformanceDetailView ? (\n <PerformanceDetailView\n projectId={projectId}\n pageName={page.name}\n pageUrl={page.url}\n canEdit={canEdit}\n isAgency={isAgency}\n userRole={user?.role}\n onCreateTicket={isAgency ? handleCreateTicketFromPerformance : undefined}\n />\n ) : (\n <div className=\"text-center py-8 text-slate-500\">\n <BarChart3 className=\"w-8 h-8 mx-auto mb-2 text-slate-300\" />\n <p className=\"text-sm\">Performance detail view not configured</p>\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )\n })\n )}\n\n {/* Legend */}\n <div className=\"flex items-center justify-center gap-6 mt-6 text-xs text-slate-500\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-3 h-3 rounded-full bg-emerald-500\" />\n <span>Good (90+)</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-3 h-3 rounded-full bg-amber-500\" />\n <span>Needs Work (50-89)</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-3 h-3 rounded-full bg-red-500\" />\n <span>Poor (&lt;50)</span>\n </div>\n </div>\n </div>\n )\n }\n\n // Render Uptime monitoring content\n const renderUptimeContent = () => {\n if (!agencyHasUptime) return renderUpgradePrompt('uptime')\n if (!projectHasUptime) return renderProjectDisabled('uptime')\n\n if (UptimeDashboard) {\n return (\n <UptimeDashboard\n projectId={projectId}\n agencyId={agencyId || ''}\n liveUrl={phase5Data.live_url}\n />\n )\n }\n\n return (\n <div className=\"text-center py-12\">\n <Activity className=\"w-12 h-12 text-slate-300 mx-auto mb-3\" />\n <p className=\"text-slate-500\">Uptime dashboard not configured</p>\n </div>\n )\n }\n\n // Render Analytics content\n const renderAnalyticsContent = () => {\n if (!agencyHasAnalytics) return renderUpgradePrompt('analytics')\n if (!projectHasAnalytics) return renderProjectDisabled('analytics')\n\n if (AnalyticsDashboard) {\n return (\n <AnalyticsDashboard\n projectId={projectId}\n analyticsEnabled={analyticsEnabled}\n onEnableAnalytics={canEdit ? handleEnableAnalytics : undefined}\n />\n )\n }\n\n return (\n <div className=\"text-center py-12\">\n <TrendingUp className=\"w-12 h-12 text-slate-300 mx-auto mb-3\" />\n <p className=\"text-slate-500\">Analytics dashboard not configured</p>\n </div>\n )\n }\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex-shrink-0 px-6 py-4 border-b border-slate-200 bg-white\">\n <h1 className=\"text-xl font-semibold text-slate-900\">Monitoring</h1>\n <p className=\"text-sm text-slate-500 mt-1\">Track SEO, performance, and uptime across your project</p>\n </div>\n\n {/* Tab Navigation */}\n <div className=\"flex-shrink-0 px-6 py-3 border-b border-slate-200 bg-white\">\n <div className=\"flex items-center gap-2\">\n {tabs.map(tab => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium transition-all',\n activeTab === tab.id\n ? 'bg-slate-900 text-white'\n : 'text-slate-600 hover:bg-slate-100'\n )}\n >\n <tab.icon className=\"w-4 h-4\" />\n {tab.label}\n {!tab.available && (\n <Crown className=\"w-3.5 h-3.5 text-amber-500\" />\n )}\n {tab.available && !tab.projectEnabled && (\n <Lock className=\"w-3.5 h-3.5 text-slate-400\" />\n )}\n </button>\n ))}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto p-6\">\n <div className=\"max-w-4xl mx-auto\">\n <AnimatePresence mode=\"wait\">\n {activeTab === 'seo' && (\n <motion.div\n key=\"seo\"\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n >\n {renderSeoContent()}\n </motion.div>\n )}\n {activeTab === 'performance' && (\n <motion.div\n key=\"performance\"\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n >\n {renderPerformanceContent()}\n </motion.div>\n )}\n {activeTab === 'uptime' && (\n <motion.div\n key=\"uptime\"\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n >\n {renderUptimeContent()}\n </motion.div>\n )}\n {activeTab === 'analytics' && (\n <motion.div\n key=\"analytics\"\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n >\n {renderAnalyticsContent()}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </div>\n </div>\n )\n}\n\nexport default MonitoringView\n","/**\n * useMeetingNotes - Hook for managing meeting notes\n *\n * Meeting notes are stored in internal_notes with notable_type='meeting'.\n * They have additional fields: title, meeting_date, content_html\n *\n * SDK version with callback-based API for data operations.\n *\n * Usage:\n * ```tsx\n * const { notes, addNote } = useMeetingNotes({\n * projectId: 'my-project',\n * onFetch: async () => await api.getMeetingNotes(projectId),\n * onCreate: async (data) => await api.createMeetingNote(data),\n * });\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport type { InternalNote } from '@framed/core'\n\n/**\n * Meeting note type (InternalNote with notable_type='meeting')\n */\nexport interface MeetingNote {\n id: string\n project_id: string\n user_id: string\n user_name: string\n title: string\n meeting_date: string\n body: string\n content_html?: string\n is_pinned: boolean\n created_at: string\n updated_at: string\n}\n\n/**\n * Input data for creating a new meeting note\n */\nexport interface CreateMeetingNoteInput {\n title: string\n meeting_date: string\n body: string\n content_html?: string\n}\n\n/**\n * Input data for updating a meeting note\n */\nexport interface UpdateMeetingNoteInput {\n title?: string\n meeting_date?: string\n body?: string\n content_html?: string\n}\n\n/**\n * Callback options for meeting notes data operations\n */\nexport interface UseMeetingNotesCallbacks {\n /** Fetch all meeting notes */\n onFetch?: () => Promise<MeetingNote[]>\n /** Create a new meeting note */\n onCreate?: (data: CreateMeetingNoteInput) => Promise<MeetingNote>\n /** Update a meeting note */\n onUpdate?: (noteId: string, data: UpdateMeetingNoteInput) => Promise<MeetingNote | void>\n /** Delete a meeting note */\n onDelete?: (noteId: string) => Promise<void>\n /** Toggle pin status of a note */\n onTogglePin?: (noteId: string, isPinned: boolean) => Promise<MeetingNote | void>\n}\n\nexport interface UseMeetingNotesOptions extends UseMeetingNotesCallbacks {\n projectId: string\n /** Initial notes (useful for SSR or cached data) */\n initialNotes?: MeetingNote[]\n /** Auto-fetch on mount (default: true if onFetch is provided) */\n autoFetch?: boolean\n}\n\nexport interface UseMeetingNotesReturn {\n notes: MeetingNote[]\n loading: boolean\n error: string | null\n addNote: (data: CreateMeetingNoteInput) => Promise<MeetingNote | null>\n updateNote: (noteId: string, data: UpdateMeetingNoteInput) => Promise<boolean>\n deleteNote: (noteId: string) => Promise<boolean>\n togglePin: (noteId: string) => Promise<boolean>\n refresh: () => Promise<void>\n setNotes: (notes: MeetingNote[]) => void\n}\n\n/**\n * Sort meeting notes by pinned status first, then by meeting date descending\n */\nconst sortMeetingNotes = (notes: MeetingNote[]): MeetingNote[] => {\n return [...notes].sort((a, b) => {\n if (a.is_pinned !== b.is_pinned) return a.is_pinned ? -1 : 1\n return new Date(b.meeting_date).getTime() - new Date(a.meeting_date).getTime()\n })\n}\n\n/**\n * Convert InternalNote to MeetingNote\n */\n/**\n * Get meeting date from note, with fallback to created_at date part\n */\nfunction getMeetingDate(note: InternalNote): string {\n if (typeof note.meeting_date === 'string' && note.meeting_date.length > 0) {\n return note.meeting_date\n }\n // Extract date part from ISO timestamp (e.g., \"2024-01-15T10:30:00Z\" -> \"2024-01-15\")\n // Use substring instead of split for type safety with noUncheckedIndexedAccess\n const tIndex = note.created_at.indexOf('T')\n if (tIndex > 0) {\n return note.created_at.substring(0, tIndex)\n }\n return note.created_at\n}\n\nexport const internalNoteToMeetingNote = (note: InternalNote): MeetingNote => {\n return {\n id: note.id,\n project_id: note.project_id,\n user_id: note.user_id,\n user_name: note.user_name,\n title: note.title || 'Untitled',\n meeting_date: getMeetingDate(note),\n body: note.body,\n content_html: note.content_html,\n is_pinned: note.is_pinned,\n created_at: note.created_at,\n updated_at: note.updated_at,\n }\n}\n\n/**\n * Hook for managing meeting notes with callback-based data operations\n */\nexport const useMeetingNotes = ({\n projectId,\n initialNotes = [],\n autoFetch = true,\n onFetch,\n onCreate,\n onUpdate,\n onDelete,\n onTogglePin,\n}: UseMeetingNotesOptions): UseMeetingNotesReturn => {\n const [notes, setNotes] = useState<MeetingNote[]>(sortMeetingNotes(initialNotes))\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const refresh = useCallback(async () => {\n if (!onFetch) {\n console.warn('useMeetingNotes: onFetch callback not provided')\n return\n }\n\n setLoading(true)\n setError(null)\n\n try {\n const fetchedNotes = await onFetch()\n setNotes(sortMeetingNotes(fetchedNotes))\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch meeting notes'\n setError(message)\n console.error('useMeetingNotes: fetch error', err)\n } finally {\n setLoading(false)\n }\n }, [onFetch])\n\n // Fetch on mount if autoFetch is enabled\n useEffect(() => {\n if (autoFetch && onFetch && projectId) {\n refresh()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [projectId, autoFetch])\n\n const addNote = useCallback(async (data: CreateMeetingNoteInput): Promise<MeetingNote | null> => {\n if (!onCreate) {\n console.warn('useMeetingNotes: onCreate callback not provided')\n return null\n }\n\n if (!data.title.trim()) {\n setError('Title is required')\n return null\n }\n\n setError(null)\n\n try {\n const newNote = await onCreate(data)\n setNotes(prev => {\n // Check if note already exists (e.g., from realtime update)\n if (prev.some(n => n.id === newNote.id)) return prev\n return sortMeetingNotes([newNote, ...prev])\n })\n return newNote\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to add meeting note'\n setError(message)\n console.error('useMeetingNotes: add error', err)\n return null\n }\n }, [onCreate])\n\n const updateNote = useCallback(async (\n noteId: string,\n data: UpdateMeetingNoteInput\n ): Promise<boolean> => {\n if (!onUpdate) {\n console.warn('useMeetingNotes: onUpdate callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n const result = await onUpdate(noteId, data)\n setNotes(prev => {\n const updated = prev.map((note: MeetingNote) => {\n if (note.id === noteId) {\n if (result) return result\n return {\n ...note,\n ...(data.title !== undefined && { title: data.title.trim() }),\n ...(data.meeting_date !== undefined && { meeting_date: data.meeting_date }),\n ...(data.body !== undefined && { body: data.body.trim() }),\n ...(data.content_html !== undefined && { content_html: data.content_html }),\n updated_at: new Date().toISOString(),\n }\n }\n return note\n })\n return sortMeetingNotes(updated)\n })\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update meeting note'\n setError(message)\n console.error('useMeetingNotes: update error', err)\n return false\n }\n }, [onUpdate])\n\n const deleteNote = useCallback(async (noteId: string): Promise<boolean> => {\n if (!onDelete) {\n console.warn('useMeetingNotes: onDelete callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n await onDelete(noteId)\n setNotes(prev => prev.filter((note: MeetingNote) => note.id !== noteId))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete meeting note'\n setError(message)\n console.error('useMeetingNotes: delete error', err)\n return false\n }\n }, [onDelete])\n\n const togglePin = useCallback(async (noteId: string): Promise<boolean> => {\n const note = notes.find((n: MeetingNote) => n.id === noteId)\n if (!note) return false\n\n const newPinnedState = !note.is_pinned\n\n if (onTogglePin) {\n setError(null)\n try {\n const result = await onTogglePin(noteId, newPinnedState)\n setNotes(prev => {\n const updated = prev.map((n: MeetingNote) => {\n if (n.id === noteId) {\n if (result) return result\n return { ...n, is_pinned: newPinnedState }\n }\n return n\n })\n return sortMeetingNotes(updated)\n })\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to toggle pin'\n setError(message)\n console.error('useMeetingNotes: toggle pin error', err)\n return false\n }\n }\n\n // Fallback: try onUpdate if available\n if (onUpdate) {\n console.warn('useMeetingNotes: onTogglePin not provided, using onUpdate fallback')\n // Note: The consuming app should provide onTogglePin for proper behavior\n }\n\n return false\n }, [notes, onTogglePin, onUpdate])\n\n return {\n notes,\n loading,\n error,\n addNote,\n updateNote,\n deleteNote,\n togglePin,\n refresh,\n setNotes,\n }\n}\n","/**\n * MeetingNotesView - Internal meeting notes management with rich text\n *\n * Features:\n * - Add/edit/delete meeting notes with titles and dates\n * - Rich text editing with TipTap (bold, italic, lists, headings, etc.)\n * - Pin important notes\n * - Chronological view sorted by meeting date\n *\n * SDK version with callback-based props for data operations.\n */\n\nimport { useState, useEffect } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n FileText,\n Plus,\n Edit2,\n Trash2,\n Pin,\n PinOff,\n Loader2,\n AlertCircle,\n Calendar,\n User,\n ChevronDown,\n Bold,\n Italic,\n List,\n ListOrdered,\n Heading2,\n Heading3,\n Quote,\n Undo2,\n Redo2,\n Search,\n X\n} from 'lucide-react'\nimport { format, parseISO } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn } from '../utils/cn'\nimport { useEditor, EditorContent, Editor } from '@tiptap/react'\nimport StarterKit from '@tiptap/starter-kit'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport {\n useMeetingNotes,\n type MeetingNote,\n type UseMeetingNotesCallbacks,\n} from '../hooks/useMeetingNotes'\n\nexport interface MeetingNotesViewProps extends UseMeetingNotesCallbacks {\n projectId: string\n className?: string\n /** Initial notes data */\n initialNotes?: MeetingNote[]\n /** Auto-fetch on mount (default: true) */\n autoFetch?: boolean\n}\n\n// ============================================\n// TipTap Editor Toolbar\n// ============================================\n\ninterface EditorToolbarProps {\n editor: Editor | null\n}\n\nconst EditorToolbar = ({ editor }: EditorToolbarProps) => {\n if (!editor) return null\n\n return (\n <div className=\"flex items-center gap-0.5 px-2 py-1.5 border-b border-slate-200 bg-slate-50/50 flex-wrap\">\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n className={cn(\n 'p-1.5 rounded transition-colors',\n editor.isActive('bold')\n ? 'bg-slate-200 text-slate-900'\n : 'text-slate-500 hover:bg-slate-100 hover:text-slate-700'\n )}\n title=\"Bold (Ctrl+B)\"\n >\n <Bold className=\"w-4 h-4\" />\n </button>\n\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n className={cn(\n 'p-1.5 rounded transition-colors',\n editor.isActive('italic')\n ? 'bg-slate-200 text-slate-900'\n : 'text-slate-500 hover:bg-slate-100 hover:text-slate-700'\n )}\n title=\"Italic (Ctrl+I)\"\n >\n <Italic className=\"w-4 h-4\" />\n </button>\n\n <div className=\"w-px h-5 bg-slate-200 mx-1\" />\n\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n className={cn(\n 'p-1.5 rounded transition-colors',\n editor.isActive('heading', { level: 2 })\n ? 'bg-slate-200 text-slate-900'\n : 'text-slate-500 hover:bg-slate-100 hover:text-slate-700'\n )}\n title=\"Heading 2\"\n >\n <Heading2 className=\"w-4 h-4\" />\n </button>\n\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}\n className={cn(\n 'p-1.5 rounded transition-colors',\n editor.isActive('heading', { level: 3 })\n ? 'bg-slate-200 text-slate-900'\n : 'text-slate-500 hover:bg-slate-100 hover:text-slate-700'\n )}\n title=\"Heading 3\"\n >\n <Heading3 className=\"w-4 h-4\" />\n </button>\n\n <div className=\"w-px h-5 bg-slate-200 mx-1\" />\n\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n className={cn(\n 'p-1.5 rounded transition-colors',\n editor.isActive('bulletList')\n ? 'bg-slate-200 text-slate-900'\n : 'text-slate-500 hover:bg-slate-100 hover:text-slate-700'\n )}\n title=\"Bullet List\"\n >\n <List className=\"w-4 h-4\" />\n </button>\n\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n className={cn(\n 'p-1.5 rounded transition-colors',\n editor.isActive('orderedList')\n ? 'bg-slate-200 text-slate-900'\n : 'text-slate-500 hover:bg-slate-100 hover:text-slate-700'\n )}\n title=\"Numbered List\"\n >\n <ListOrdered className=\"w-4 h-4\" />\n </button>\n\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n className={cn(\n 'p-1.5 rounded transition-colors',\n editor.isActive('blockquote')\n ? 'bg-slate-200 text-slate-900'\n : 'text-slate-500 hover:bg-slate-100 hover:text-slate-700'\n )}\n title=\"Quote\"\n >\n <Quote className=\"w-4 h-4\" />\n </button>\n\n <div className=\"w-px h-5 bg-slate-200 mx-1\" />\n\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n className={cn(\n 'p-1.5 rounded transition-colors',\n 'text-slate-500 hover:bg-slate-100 hover:text-slate-700 disabled:opacity-40 disabled:cursor-not-allowed'\n )}\n title=\"Undo (Ctrl+Z)\"\n >\n <Undo2 className=\"w-4 h-4\" />\n </button>\n\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n className={cn(\n 'p-1.5 rounded transition-colors',\n 'text-slate-500 hover:bg-slate-100 hover:text-slate-700 disabled:opacity-40 disabled:cursor-not-allowed'\n )}\n title=\"Redo (Ctrl+Shift+Z)\"\n >\n <Redo2 className=\"w-4 h-4\" />\n </button>\n </div>\n )\n}\n\n// ============================================\n// TipTap Editor Component\n// ============================================\n\ninterface MeetingNoteEditorProps {\n content: string\n onChange: (html: string) => void\n placeholder?: string\n className?: string\n autoFocus?: boolean\n}\n\nconst MeetingNoteEditor = ({\n content,\n onChange,\n placeholder = 'Meeting notes, action items, decisions made...',\n className,\n autoFocus = false\n}: MeetingNoteEditorProps) => {\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: { levels: [2, 3] }\n }),\n Placeholder.configure({\n placeholder\n })\n ],\n content,\n autofocus: autoFocus ? 'end' : false,\n editorProps: {\n attributes: {\n class: 'tiptap-meeting-notes prose prose-sm prose-slate max-w-none focus:outline-none min-h-[120px] px-3 py-2'\n }\n },\n onUpdate: ({ editor }) => {\n onChange(editor.getHTML())\n }\n })\n\n // Update content when prop changes (for editing existing notes)\n useEffect(() => {\n if (editor && content !== editor.getHTML()) {\n editor.commands.setContent(content)\n }\n }, [content, editor])\n\n return (\n <div className={cn('border border-slate-200 rounded-lg overflow-hidden bg-white', className)}>\n <EditorToolbar editor={editor} />\n <EditorContent editor={editor} />\n </div>\n )\n}\n\n// ============================================\n// Main Component\n// ============================================\n\nexport const MeetingNotesView = ({\n projectId,\n className,\n initialNotes = [],\n autoFetch = true,\n onFetch,\n onCreate,\n onUpdate,\n onDelete,\n onTogglePin,\n}: MeetingNotesViewProps) => {\n const {\n notes,\n loading,\n error,\n addNote,\n updateNote,\n deleteNote,\n togglePin\n } = useMeetingNotes({\n projectId,\n initialNotes,\n autoFetch,\n onFetch,\n onCreate,\n onUpdate,\n onDelete,\n onTogglePin,\n })\n\n const [showAddForm, setShowAddForm] = useState(false)\n const [editingId, setEditingId] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [expandedId, setExpandedId] = useState<string | null>(null)\n const [searchQuery, setSearchQuery] = useState('')\n\n // Form state\n const [formTitle, setFormTitle] = useState('')\n const [formDate, setFormDate] = useState(format(new Date(), 'yyyy-MM-dd'))\n const [formContent, setFormContent] = useState('')\n\n // Filter notes based on search query\n const filteredNotes = notes.filter((note: MeetingNote) => {\n if (!searchQuery.trim()) return true\n const query = searchQuery.toLowerCase()\n const titleMatch = note.title.toLowerCase().includes(query)\n const bodyMatch = note.body.toLowerCase().includes(query)\n // Also search in HTML content (strip tags first)\n const htmlContent = note.content_html || ''\n const plainContent = htmlContent.replace(/<[^>]*>/g, '').toLowerCase()\n const contentMatch = plainContent.includes(query)\n return titleMatch || bodyMatch || contentMatch\n })\n\n const resetForm = () => {\n setFormTitle('')\n setFormDate(format(new Date(), 'yyyy-MM-dd'))\n setFormContent('')\n }\n\n const handleAddNote = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!formTitle.trim() || isSubmitting) return\n\n setIsSubmitting(true)\n try {\n // Extract plain text from HTML for body field\n const tempDiv = document.createElement('div')\n tempDiv.innerHTML = formContent\n const plainText = tempDiv.textContent || tempDiv.innerText || ''\n\n const result = await addNote({\n title: formTitle.trim(),\n meeting_date: formDate,\n body: plainText.trim(),\n content_html: formContent\n })\n if (result) {\n resetForm()\n setShowAddForm(false)\n }\n } finally {\n setIsSubmitting(false)\n }\n }\n\n const handleStartEdit = (note: MeetingNote) => {\n setEditingId(note.id)\n setFormTitle(note.title)\n setFormDate(note.meeting_date)\n setFormContent(note.content_html || `<p>${note.body}</p>`)\n }\n\n const handleSaveEdit = async () => {\n if (!editingId || !formTitle.trim() || isSubmitting) return\n\n setIsSubmitting(true)\n try {\n // Extract plain text from HTML for body field\n const tempDiv = document.createElement('div')\n tempDiv.innerHTML = formContent\n const plainText = tempDiv.textContent || tempDiv.innerText || ''\n\n const success = await updateNote(editingId, {\n title: formTitle.trim(),\n meeting_date: formDate,\n body: plainText.trim(),\n content_html: formContent\n })\n if (success) {\n setEditingId(null)\n resetForm()\n }\n } finally {\n setIsSubmitting(false)\n }\n }\n\n const handleCancelEdit = () => {\n setEditingId(null)\n resetForm()\n }\n\n const handleDelete = async (noteId: string) => {\n if (!confirm('Are you sure you want to delete this meeting note?')) return\n await deleteNote(noteId)\n }\n\n const handleTogglePin = async (noteId: string) => {\n await togglePin(noteId)\n }\n\n return (\n <div className={cn('bg-white rounded-xl border border-slate-200 overflow-hidden', className)}>\n {/* Header */}\n <div className=\"p-4 border-b border-slate-100 bg-slate-50/50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-slate-100 flex items-center justify-center\">\n <FileText className=\"w-5 h-5 text-slate-600\" />\n </div>\n <div>\n <h3 className=\"font-semibold text-slate-900\">Meeting Notes</h3>\n <p className=\"text-xs text-slate-500\">\n Internal notes from client meetings\n </p>\n </div>\n </div>\n <button\n onClick={() => setShowAddForm(!showAddForm)}\n className={cn(\n 'flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm font-medium transition-colors',\n showAddForm\n ? 'bg-slate-200 text-slate-700'\n : 'bg-slate-900 text-white hover:bg-slate-800'\n )}\n >\n <Plus className=\"w-4 h-4\" />\n Add Note\n </button>\n </div>\n\n {/* Search bar */}\n {notes.length > 0 && !showAddForm && (\n <div className=\"mt-3 relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400\" />\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search notes...\"\n className=\"w-full pl-9 pr-8 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-slate-500/50 focus:border-slate-500 bg-white\"\n />\n {searchQuery && (\n <button\n onClick={() => setSearchQuery('')}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1 rounded text-slate-400 hover:text-slate-600 hover:bg-slate-100 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n )}\n\n {/* Add note form */}\n <AnimatePresence>\n {showAddForm && (\n <motion.form\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n onSubmit={handleAddNote}\n className=\"mt-4 space-y-3\"\n >\n <div className=\"flex gap-3\">\n <input\n type=\"text\"\n value={formTitle}\n onChange={(e) => setFormTitle(e.target.value)}\n placeholder=\"Meeting title\"\n className=\"flex-1 px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-slate-500/50 focus:border-slate-500\"\n autoFocus\n />\n <input\n type=\"date\"\n value={formDate}\n onChange={(e) => setFormDate(e.target.value)}\n className=\"px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 focus:outline-none focus:ring-2 focus:ring-slate-500/50 focus:border-slate-500\"\n />\n </div>\n\n <MeetingNoteEditor\n content={formContent}\n onChange={setFormContent}\n placeholder=\"Meeting notes, action items, decisions made...\"\n />\n\n <div className=\"flex items-center gap-2\">\n <button\n type=\"submit\"\n disabled={!formTitle.trim() || isSubmitting}\n className=\"px-4 py-2 rounded-lg bg-slate-900 text-white text-sm font-medium hover:bg-slate-800 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isSubmitting ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : 'Save Note'}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(false)\n resetForm()\n }}\n className=\"px-4 py-2 rounded-lg text-slate-600 text-sm font-medium hover:bg-slate-100 transition-colors\"\n >\n Cancel\n </button>\n </div>\n </motion.form>\n )}\n </AnimatePresence>\n </div>\n\n {/* Error state */}\n {error && (\n <div className=\"p-4 bg-red-50 border-b border-red-100\">\n <div className=\"flex items-center gap-2 text-sm text-red-700\">\n <AlertCircle className=\"w-4 h-4\" />\n {error}\n </div>\n </div>\n )}\n\n {/* Notes list */}\n <div className=\"divide-y divide-slate-100\">\n {loading ? (\n <div className=\"p-8 text-center\">\n <Loader2 className=\"w-6 h-6 animate-spin text-slate-400 mx-auto mb-2\" />\n <p className=\"text-sm text-slate-500\">Loading meeting notes...</p>\n </div>\n ) : notes.length === 0 ? (\n <div className=\"p-8 text-center\">\n <FileText className=\"w-10 h-10 mx-auto text-slate-300 mb-3\" />\n <p className=\"text-sm text-slate-600 font-medium mb-1\">No meeting notes yet</p>\n <p className=\"text-xs text-slate-400\">\n Add notes from client meetings to keep track of discussions and decisions\n </p>\n </div>\n ) : filteredNotes.length === 0 ? (\n <div className=\"p-8 text-center\">\n <Search className=\"w-10 h-10 mx-auto text-slate-300 mb-3\" />\n <p className=\"text-sm text-slate-600 font-medium mb-1\">No notes found</p>\n <p className=\"text-xs text-slate-400\">\n No notes match \"{searchQuery}\"\n </p>\n <button\n onClick={() => setSearchQuery('')}\n className=\"mt-3 text-sm text-slate-600 hover:text-slate-900 underline\"\n >\n Clear search\n </button>\n </div>\n ) : (\n filteredNotes.map((note: MeetingNote) => (\n <MeetingNoteCard\n key={note.id}\n note={note}\n isEditing={editingId === note.id}\n isExpanded={expandedId === note.id}\n formTitle={formTitle}\n setFormTitle={setFormTitle}\n formDate={formDate}\n setFormDate={setFormDate}\n formContent={formContent}\n setFormContent={setFormContent}\n onStartEdit={() => handleStartEdit(note)}\n onSaveEdit={handleSaveEdit}\n onCancelEdit={handleCancelEdit}\n onDelete={() => handleDelete(note.id)}\n onTogglePin={() => handleTogglePin(note.id)}\n onToggleExpand={() => setExpandedId(expandedId === note.id ? null : note.id)}\n isSubmitting={isSubmitting}\n />\n ))\n )}\n </div>\n\n {/* TipTap and content view styles */}\n <style>{`\n /* Shared styles for editor and view */\n .tiptap-meeting-notes p,\n .meeting-note-content p {\n margin: 0.5em 0;\n }\n .tiptap-meeting-notes p:first-child,\n .meeting-note-content p:first-child {\n margin-top: 0;\n }\n .tiptap-meeting-notes p:last-child,\n .meeting-note-content p:last-child {\n margin-bottom: 0;\n }\n .tiptap-meeting-notes h2,\n .meeting-note-content h2 {\n font-size: 1.125rem;\n font-weight: 600;\n margin: 1em 0 0.5em;\n color: #1e293b;\n }\n .tiptap-meeting-notes h2:first-child,\n .meeting-note-content h2:first-child {\n margin-top: 0;\n }\n .tiptap-meeting-notes h3,\n .meeting-note-content h3 {\n font-size: 1rem;\n font-weight: 600;\n margin: 0.75em 0 0.5em;\n color: #334155;\n }\n .tiptap-meeting-notes h3:first-child,\n .meeting-note-content h3:first-child {\n margin-top: 0;\n }\n .tiptap-meeting-notes ul,\n .meeting-note-content ul {\n list-style-type: disc;\n padding-left: 1.5em;\n margin: 0.5em 0;\n }\n .tiptap-meeting-notes ol,\n .meeting-note-content ol {\n list-style-type: decimal;\n padding-left: 1.5em;\n margin: 0.5em 0;\n }\n .tiptap-meeting-notes li,\n .meeting-note-content li {\n margin: 0.25em 0;\n }\n .tiptap-meeting-notes li p,\n .meeting-note-content li p {\n margin: 0;\n }\n .tiptap-meeting-notes blockquote,\n .meeting-note-content blockquote {\n border-left: 3px solid #cbd5e1;\n padding-left: 1em;\n margin: 0.75em 0;\n color: #64748b;\n font-style: italic;\n }\n .tiptap-meeting-notes strong,\n .meeting-note-content strong {\n font-weight: 600;\n color: #1e293b;\n }\n .tiptap-meeting-notes em,\n .meeting-note-content em {\n font-style: italic;\n }\n .tiptap-meeting-notes code,\n .meeting-note-content code {\n background: #f1f5f9;\n padding: 0.125em 0.25em;\n border-radius: 0.25em;\n font-size: 0.875em;\n font-family: ui-monospace, monospace;\n }\n\n /* Editor-specific styles */\n .tiptap-meeting-notes .ProseMirror-focused {\n outline: none;\n }\n .tiptap-meeting-notes p.is-editor-empty:first-child::before {\n color: #94a3b8;\n content: attr(data-placeholder);\n float: left;\n height: 0;\n pointer-events: none;\n }\n `}</style>\n </div>\n )\n}\n\n// ============================================\n// Meeting Note Card\n// ============================================\n\ninterface MeetingNoteCardProps {\n note: MeetingNote\n isEditing: boolean\n isExpanded: boolean\n formTitle: string\n setFormTitle: (v: string) => void\n formDate: string\n setFormDate: (v: string) => void\n formContent: string\n setFormContent: (v: string) => void\n onStartEdit: () => void\n onSaveEdit: () => void\n onCancelEdit: () => void\n onDelete: () => void\n onTogglePin: () => void\n onToggleExpand: () => void\n isSubmitting: boolean\n}\n\nconst MeetingNoteCard = ({\n note,\n isEditing,\n isExpanded,\n formTitle,\n setFormTitle,\n formDate,\n setFormDate,\n formContent,\n setFormContent,\n onStartEdit,\n onSaveEdit,\n onCancelEdit,\n onDelete,\n onTogglePin,\n onToggleExpand,\n isSubmitting\n}: MeetingNoteCardProps) => {\n const [showActions, setShowActions] = useState(false)\n\n if (isEditing) {\n return (\n <div className=\"p-4 bg-slate-50\">\n <div className=\"space-y-3\">\n <div className=\"flex gap-3\">\n <input\n type=\"text\"\n value={formTitle}\n onChange={(e) => setFormTitle(e.target.value)}\n className=\"flex-1 px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 focus:outline-none focus:ring-2 focus:ring-slate-500/50 focus:border-slate-500\"\n autoFocus\n />\n <input\n type=\"date\"\n value={formDate}\n onChange={(e) => setFormDate(e.target.value)}\n className=\"px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 focus:outline-none focus:ring-2 focus:ring-slate-500/50 focus:border-slate-500\"\n />\n </div>\n\n <MeetingNoteEditor\n content={formContent}\n onChange={setFormContent}\n placeholder=\"Meeting notes...\"\n autoFocus\n />\n\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onSaveEdit}\n disabled={!formTitle.trim() || isSubmitting}\n className=\"px-3 py-1.5 rounded-lg bg-slate-900 text-white text-sm font-medium hover:bg-slate-800 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n Save\n </button>\n <button\n onClick={onCancelEdit}\n className=\"px-3 py-1.5 rounded-lg text-slate-600 text-sm font-medium hover:bg-slate-200 transition-colors\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n )\n }\n\n // Get display content\n const displayContent = note.content_html || `<p>${note.body}</p>`\n const hasContent = note.content_html ? note.content_html.length > 100 : note.body.length > 200\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n onMouseEnter={() => setShowActions(true)}\n onMouseLeave={() => setShowActions(false)}\n className={cn(\n 'p-4 hover:bg-slate-50 transition-colors cursor-pointer',\n note.is_pinned && 'bg-amber-50/30 border-l-2 border-amber-400'\n )}\n onClick={onToggleExpand}\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 min-w-0\">\n {/* Header */}\n <div className=\"flex items-center gap-2 mb-1\">\n {note.is_pinned && (\n <Pin className=\"w-3.5 h-3.5 text-amber-500 flex-shrink-0\" />\n )}\n <h4 className=\"font-medium text-slate-900 truncate\">{note.title}</h4>\n </div>\n\n {/* Meta info */}\n <div className=\"flex items-center gap-3 text-xs text-slate-500 mb-2\">\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"w-3.5 h-3.5\" />\n {format(parseISO(note.meeting_date), 'MMM d, yyyy', { locale: enUS })}\n </span>\n <span className=\"flex items-center gap-1\">\n <User className=\"w-3.5 h-3.5\" />\n {note.user_name}\n </span>\n </div>\n\n {/* Content preview or full content */}\n <div\n className={cn(\n 'meeting-note-content text-sm text-slate-600',\n !isExpanded && 'line-clamp-3'\n )}\n dangerouslySetInnerHTML={{ __html: displayContent }}\n />\n\n {/* Expand indicator */}\n {hasContent && (\n <button\n onClick={(e) => {\n e.stopPropagation()\n onToggleExpand()\n }}\n className=\"mt-2 text-xs text-slate-500 hover:text-slate-700 flex items-center gap-1\"\n >\n <ChevronDown className={cn(\n 'w-3.5 h-3.5 transition-transform',\n isExpanded && 'rotate-180'\n )} />\n {isExpanded ? 'Show less' : 'Show more'}\n </button>\n )}\n </div>\n\n {/* Actions */}\n <AnimatePresence>\n {showActions && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex items-center gap-1 flex-shrink-0\"\n onClick={(e) => e.stopPropagation()}\n >\n <button\n onClick={onTogglePin}\n className={cn(\n 'p-2 rounded-lg transition-colors',\n note.is_pinned\n ? 'text-amber-500 hover:bg-amber-50'\n : 'text-slate-400 hover:text-slate-600 hover:bg-slate-100'\n )}\n title={note.is_pinned ? 'Unpin' : 'Pin'}\n >\n {note.is_pinned ? <PinOff className=\"w-4 h-4\" /> : <Pin className=\"w-4 h-4\" />}\n </button>\n <button\n onClick={onStartEdit}\n className=\"p-2 rounded-lg text-slate-400 hover:text-slate-600 hover:bg-slate-100 transition-colors\"\n title=\"Edit\"\n >\n <Edit2 className=\"w-4 h-4\" />\n </button>\n <button\n onClick={onDelete}\n className=\"p-2 rounded-lg text-slate-400 hover:text-red-600 hover:bg-red-50 transition-colors\"\n title=\"Delete\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </motion.div>\n )\n}\n\nexport default MeetingNotesView\n\n// Re-export types for convenience\nexport type { MeetingNote, UseMeetingNotesCallbacks }\n","/**\n * MaintenanceExportModal - Placeholder component\n *\n * This is a placeholder for the MaintenanceExportModal (Process Tasks) component.\n * The full implementation can be copied from framed-app when needed.\n */\n\nimport { MaintenanceItem } from '@framed/core'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { X, Layers } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\ninterface ItemUpdate {\n id: string\n status: string\n resolution_notes?: string\n}\n\ninterface MaintenanceExportModalProps {\n isOpen: boolean\n onClose: () => void\n items: MaintenanceItem[]\n projectName: string\n liveUrl?: string\n onUpdateItems: (updates: ItemUpdate[]) => Promise<void>\n}\n\nexport const MaintenanceExportModal = ({\n isOpen,\n onClose,\n items,\n projectName,\n liveUrl,\n onUpdateItems\n}: MaintenanceExportModalProps) => {\n if (!isOpen) return null\n\n return (\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-50 flex items-center justify-center\"\n >\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"absolute inset-0 bg-black/50\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <motion.div\n initial={{ opacity: 0, scale: 0.95, y: 20 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: 20 }}\n className=\"relative bg-white rounded-xl shadow-2xl w-full max-w-2xl mx-4 max-h-[90vh] overflow-hidden\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-slate-200\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-powder-blue-100 flex items-center justify-center\">\n <Layers className=\"w-5 h-5 text-powder-blue-600\" />\n </div>\n <div>\n <h2 className=\"text-lg font-semibold text-slate-900\">Process Tasks</h2>\n <p className=\"text-sm text-slate-500\">{projectName}</p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 hover:bg-slate-100 rounded-lg transition-colors\"\n >\n <X className=\"w-5 h-5 text-slate-400\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-6\">\n <div className=\"text-center py-12\">\n <Layers className=\"w-12 h-12 text-slate-300 mx-auto mb-3\" />\n <p className=\"text-slate-600 font-medium\">Process Tasks Modal</p>\n <p className=\"text-slate-400 text-sm mt-1\">This feature is coming soon</p>\n <p className=\"text-xs text-slate-400 mt-2\">\n {items.filter(i => i.status !== 'completed' && i.status !== 'wont_fix').length} open tasks\n </p>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center justify-end gap-3 px-6 py-4 border-t border-slate-200 bg-slate-50\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors\"\n >\n Close\n </button>\n </div>\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n )\n}\n\nexport default MaintenanceExportModal\n","/**\n * Phase5MobileView - Placeholder component for mobile view\n *\n * This is a placeholder for the mobile-optimized view.\n * The full implementation can be copied from framed-app when needed.\n */\n\nimport { MaintenanceItem, MaintenanceItemStatus, Phase5Data } from '@framed/core'\n\ninterface Phase5MobileViewProps {\n phase5Data: Phase5Data\n onAddItem: (item: Omit<MaintenanceItem, 'id' | 'created_at' | 'created_by' | 'created_by_name'>, stagedFiles?: File[]) => Promise<void>\n onStatusChange: (itemId: string, newStatus: MaintenanceItemStatus) => Promise<void>\n canEdit: boolean\n}\n\nexport const Phase5MobileView = ({\n phase5Data,\n onAddItem,\n onStatusChange,\n canEdit\n}: Phase5MobileViewProps) => {\n return (\n <div className=\"h-full flex items-center justify-center bg-gray-50 p-4\">\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-slate-700\">Mobile View</p>\n <p className=\"text-sm text-slate-500 mt-1\">\n The mobile-optimized interface is coming soon.\n </p>\n <p className=\"text-xs text-slate-400 mt-2\">\n {phase5Data.items.length} items available\n </p>\n </div>\n </div>\n )\n}\n\nexport default Phase5MobileView\n","/**\n * Phase5CommandCenter - The reimagined Manage & Maintain interface\n *\n * A clean, modern interface with LEFT SIDEBAR navigation (matching Phase 4).\n * Designed for agencies managing client websites\n * and clients reporting issues/ideas.\n *\n * Layout (matching Phase 4):\n * ┌────────────┬──────────────────────────────────────────────┐\n * │ Nav │ Main Content Area │\n * │ Sidebar │ (Inbox / Board / Timeline) │\n * │ 240px │ │\n * └────────────┴──────────────────────────────────────────────┘\n *\n * COPIED from framed-app/src/components/phase5-redesign/Phase5CommandCenter.tsx\n * Import paths adjusted for SDK structure\n */\n\nimport { useState, useMemo, useCallback, useEffect } from 'react'\nimport { useIsMobile } from './hooks/use-mobile'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n Inbox,\n Columns3,\n Activity,\n Plus,\n Settings,\n Filter,\n Search,\n ExternalLink,\n Clock,\n Globe,\n FileBarChart,\n History,\n Lightbulb,\n Link2,\n Loader2,\n CheckCircle2,\n AlertCircle,\n X,\n Code,\n Copy,\n Check,\n AlertTriangle,\n BarChart3,\n Layers\n} from 'lucide-react'\nimport { cn } from './utils/cn'\nimport { ScrollArea } from './ui/scroll-area'\nimport {\n Phase5Data,\n MaintenanceItem,\n MaintenanceItemStatus,\n MaintenanceCycle,\n MaintenanceCategory,\n MaintenancePriority,\n StoredCredential,\n MaintenanceQuote,\n Project,\n User\n} from '@framed/core'\nimport { hasAdminPrivileges } from './utils/permissions'\nimport { agencyHasMonitoringFeature } from './utils/featureFlags'\n\nimport { ViewMode, CATEGORIES, PRIORITIES, STATUSES, STATUS_ORDER } from './constants'\nimport { InboxView } from './views/InboxView'\nimport { BoardView } from './views/BoardView'\nimport { TimelineView } from './views/TimelineView'\nimport { ItemDetailDrawer } from './components/ItemDetailDrawer'\nimport { NewItemModal } from './components/NewItemModal'\nimport { CommandPalette } from './components/CommandPalette'\nimport { QuickStats } from './components/QuickStats'\nimport { SettingsView } from './views/SettingsView'\n\n// New Phase 5 feature components\nimport { HourPackageBadge } from './components/HourPackageCard'\nimport { DomainMonitorDashboard } from './views/DomainMonitorDashboard'\nimport { MonthlyReportView } from './views/MonthlyReportView'\nimport { ChangelogView } from './views/ChangelogView'\nimport { SuggestionsBoard } from './views/SuggestionsBoard'\nimport { MonitoringView } from './views/MonitoringView'\nimport { MeetingNotesView } from './views/MeetingNotesView'\nimport { MaintenanceExportModal } from './components/MaintenanceExportModal'\nimport { useTimeTracking } from './hooks/useTimeTracking'\nimport { useDomainMonitoring } from './hooks/useDomainMonitoring'\nimport { Phase5MobileView } from './views/Phase5MobileView'\n\n// ============================================\n// Types\n// ============================================\n\ntype ActiveView = 'tickets' | 'reports' | 'changelog' | 'suggestions' | 'notes' | 'domains' | 'hours' | 'monitoring' | 'settings'\n\nexport interface Phase5CommandCenterProps {\n projectId: string\n agencyId?: string\n phase5Data: Phase5Data\n project?: Project | null // Full project for feature flag checks\n user?: User | null // Current user (SDK version passes user as prop instead of using useAuth)\n onProjectUpdate?: () => void // Called when project settings change (e.g., monitoring features)\n onAddItem: (item: Omit<MaintenanceItem, 'id' | 'created_at' | 'created_by' | 'created_by_name'>, stagedFiles?: File[]) => Promise<void>\n onUpdateItem: (itemId: string, updates: Partial<MaintenanceItem>) => Promise<void>\n onDeleteItem: (itemId: string) => Promise<void>\n onStatusChange: (itemId: string, newStatus: MaintenanceItemStatus) => Promise<void>\n onStartCycle?: (name: string, type: MaintenanceCycle['type']) => Promise<void>\n onCloseCycle?: (cycleId: string) => Promise<void>\n onUpdateUrls?: (liveUrl?: string, stagingUrl?: string) => Promise<void>\n onAddCredential?: (credential: Omit<StoredCredential, 'id' | 'created_at' | 'created_by' | 'created_by_name'>) => Promise<void>\n onUpdateCredential?: (credentialId: string, updates: Partial<StoredCredential>) => Promise<void>\n onDeleteCredential?: (credentialId: string) => Promise<void>\n onSubmitQuote?: (itemId: string, quote: Partial<MaintenanceQuote>) => Promise<void>\n onRespondToQuote?: (itemId: string, approved: boolean, notes?: string) => Promise<void>\n // Comment handlers\n onAddComment?: (itemId: string, comment: string, isInternal: boolean, parentId?: string, mentions?: string[]) => Promise<void>\n onEditComment?: (itemId: string, commentId: string, newText: string) => Promise<void>\n onDeleteComment?: (itemId: string, commentId: string) => Promise<void>\n availableUsers?: Array<{ id: string; name: string }>\n canEdit: boolean\n hasGoldPlan?: boolean // Deprecated - use project.agency feature flags instead\n // SDK-specific: optional widget launch handler (for custom implementations)\n onLaunchWidget?: () => Promise<void>\n // SDK-specific: optional embed script getter (for custom implementations)\n getEmbedScript?: () => string\n}\n\n// ============================================\n// Main Component\n// ============================================\n\nexport const Phase5CommandCenter = ({\n projectId,\n agencyId,\n phase5Data,\n project,\n user,\n onProjectUpdate,\n onAddItem,\n onUpdateItem,\n onDeleteItem,\n onStatusChange,\n onStartCycle,\n onCloseCycle,\n onUpdateUrls,\n onAddCredential,\n onUpdateCredential,\n onDeleteCredential,\n onSubmitQuote,\n onRespondToQuote,\n onAddComment,\n onEditComment,\n onDeleteComment,\n availableUsers = [],\n canEdit,\n hasGoldPlan = false,\n onLaunchWidget,\n getEmbedScript: getEmbedScriptProp\n}: Phase5CommandCenterProps) => {\n // SDK version: user is passed as prop instead of using useAuth()\n const isAgency = hasAdminPrivileges(user ?? null)\n const isMobile = useIsMobile()\n\n // Check if agency has any monitoring features\n const hasAnyMonitoringFeature =\n agencyHasMonitoringFeature(project ?? null, 'seo') ||\n agencyHasMonitoringFeature(project ?? null, 'performance') ||\n agencyHasMonitoringFeature(project ?? null, 'uptime')\n\n // Hook for time tracking data\n const { hourPackages, loading: loadingHours } = useTimeTracking({ projectId, agencyId: agencyId || '' })\n const isLowHours = hourPackages.some(pkg => pkg.status === 'active' && pkg.remaining_minutes < (pkg.total_minutes * 0.2))\n\n // Hook for domain monitoring data\n const { monitors: domainMonitors } = useDomainMonitoring({ projectId, agencyId })\n\n // Navigation state\n const [activeView, setActiveView] = useState<ActiveView>('tickets')\n const [viewMode, setViewMode] = useState<ViewMode>('inbox')\n const [selectedItemId, setSelectedItemId] = useState<string | null>(null)\n const [showNewItemModal, setShowNewItemModal] = useState(false)\n const [showCommandPalette, setShowCommandPalette] = useState(false)\n const [showFilters, setShowFilters] = useState(false)\n\n // Widget session state\n const [isCreatingSession, setIsCreatingSession] = useState(false)\n\n // Widget embed code state (for showing installation instructions)\n const [showEmbedCode, setShowEmbedCode] = useState(false)\n const [copiedScript, setCopiedScript] = useState(false)\n\n // Filter state\n const [searchQuery, setSearchQuery] = useState('')\n const [statusFilter, setStatusFilter] = useState<MaintenanceItemStatus | 'all'>('all')\n const [categoryFilter, setCategoryFilter] = useState<MaintenanceCategory | 'all'>('all')\n const [priorityFilter, setPriorityFilter] = useState<MaintenancePriority | 'all'>('all')\n const [showArchived, setShowArchived] = useState(false)\n\n // Export modal state\n const [showExportModal, setShowExportModal] = useState(false)\n\n // Calculate 6 months ago for filtering completed items\n const sixMonthsAgo = useMemo(() => {\n const date = new Date()\n date.setMonth(date.getMonth() - 6)\n return date\n }, [])\n\n // Filtered items\n const filteredItems = useMemo(() => {\n return phase5Data.items.filter((item: MaintenanceItem) => {\n // For completed/wont_fix items, show only if completed within last 6 months (or showArchived is true)\n if (item.status === 'completed' || item.status === 'wont_fix') {\n const completedAt = item.resolved_at ? new Date(item.resolved_at) : null\n const isRecent = completedAt && completedAt >= sixMonthsAgo\n\n // Show recent completed items, or all if showArchived is enabled\n if (!isRecent && !showArchived) {\n return false\n }\n }\n\n if (statusFilter !== 'all' && item.status !== statusFilter) return false\n if (categoryFilter !== 'all' && item.category !== categoryFilter) return false\n if (priorityFilter !== 'all' && item.priority !== priorityFilter) return false\n\n if (searchQuery) {\n const q = searchQuery.toLowerCase()\n return (\n item.title.toLowerCase().includes(q) ||\n item.description.toLowerCase().includes(q) ||\n (item.page_name && item.page_name.toLowerCase().includes(q))\n )\n }\n\n return true\n })\n }, [phase5Data.items, statusFilter, categoryFilter, priorityFilter, searchQuery, showArchived, sixMonthsAgo])\n\n // Selected item\n const selectedItem = selectedItemId\n ? phase5Data.items.find((i: MaintenanceItem) => i.id === selectedItemId)\n : null\n\n // Stats\n const stats = useMemo(() => {\n const items = phase5Data.items\n const openStatuses: MaintenanceItemStatus[] = ['backlog', 'scheduled', 'in_progress', 'review']\n\n return {\n total: items.length,\n open: items.filter((i: MaintenanceItem) => openStatuses.includes(i.status)).length,\n completed: items.filter((i: MaintenanceItem) => i.status === 'completed').length,\n critical: items.filter((i: MaintenanceItem) => i.priority === 'critical' && openStatuses.includes(i.status)).length,\n high: items.filter((i: MaintenanceItem) => i.priority === 'high' && openStatuses.includes(i.status)).length,\n awaitingQuote: items.filter((i: MaintenanceItem) => (i as any).quote?.status === 'pending_review').length,\n quotedPending: items.filter((i: MaintenanceItem) => (i as any).quote?.status === 'quoted').length\n }\n }, [phase5Data.items])\n\n // Keyboard shortcut for command palette\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault()\n setShowCommandPalette(true)\n }\n if (e.key === 'Escape') {\n setShowCommandPalette(false)\n setSelectedItemId(null)\n }\n }\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [])\n\n // Get embed script for widget (SDK version: can be overridden via props)\n const getEmbedScript = useCallback(() => {\n if (getEmbedScriptProp) {\n return getEmbedScriptProp()\n }\n const origin = typeof window !== 'undefined'\n ? window.location.origin.replace('http://', 'https://')\n : 'https://app.framed.dev'\n return `<script src=\"${origin}/framed-widget-loader.js\" data-framed-project=\"${projectId}\" async></script>`\n }, [projectId, getEmbedScriptProp])\n\n // Copy embed script to clipboard\n const copyEmbedScript = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(getEmbedScript())\n setCopiedScript(true)\n setTimeout(() => setCopiedScript(false), 2000)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }, [getEmbedScript])\n\n // Launch feedback widget session (SDK version: can be overridden via props)\n const handleLaunchWidget = useCallback(async () => {\n if (onLaunchWidget) {\n setIsCreatingSession(true)\n try {\n await onLaunchWidget()\n } finally {\n setIsCreatingSession(false)\n }\n return\n }\n\n // Default implementation: open live URL in new tab (without widget session)\n if (!phase5Data.live_url) return\n\n // Normalize the URL to ensure it has a protocol\n let liveUrl = phase5Data.live_url\n if (!/^https?:\\/\\//i.test(liveUrl)) {\n liveUrl = `https://${liveUrl}`\n }\n\n // Open in new tab\n window.open(liveUrl, '_blank')\n }, [phase5Data.live_url, onLaunchWidget])\n\n // View mode icons\n const viewModeConfig = [\n { id: 'inbox' as ViewMode, icon: Inbox, label: 'Inbox' },\n { id: 'board' as ViewMode, icon: Columns3, label: 'Board' },\n { id: 'timeline' as ViewMode, icon: Activity, label: 'Timeline' }\n ]\n\n // Active filters count\n const activeFiltersCount = [\n statusFilter !== 'all',\n categoryFilter !== 'all',\n priorityFilter !== 'all'\n ].filter(Boolean).length\n\n // Count badges for navigation\n const openTicketsCount = stats.open\n const criticalCount = stats.critical\n const lowHoursCount = isLowHours ? 1 : 0\n const domainWarningCount = domainMonitors.filter(d => d.check_status === 'warning' || d.check_status === 'error').length\n\n // Mobile view - simplified interface for phones\n if (isMobile) {\n return (\n <Phase5MobileView\n phase5Data={phase5Data}\n onAddItem={onAddItem}\n onStatusChange={onStatusChange}\n canEdit={canEdit}\n />\n )\n }\n\n return (\n <div className=\"h-[calc(100vh-64px)] flex bg-gray-50 overflow-hidden\">\n {/* Left Navigation Sidebar */}\n <div className=\"w-60 flex-shrink-0 bg-white border-r border-slate-200 flex flex-col\">\n {/* Quick Stats Header */}\n <div className=\"p-4 border-b border-slate-100\">\n <QuickStats stats={stats} compact />\n </div>\n\n {/* Navigation */}\n <ScrollArea className=\"flex-1\">\n <div className=\"p-3 space-y-4\">\n {/* Tickets Section */}\n <div>\n <div className=\"flex items-center gap-2 px-2 py-1.5 text-xs uppercase tracking-wider text-slate-500 font-medium mb-1\">\n <Inbox className=\"w-3.5 h-3.5\" />\n Tickets\n </div>\n <div className=\"space-y-0.5\">\n <button\n onClick={() => setActiveView('tickets')}\n className={cn(\n 'flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors text-left',\n activeView === 'tickets'\n ? 'bg-powder-blue-50 text-powder-blue-900 font-medium border border-powder-blue-200'\n : 'text-slate-700 hover:bg-slate-50'\n )}\n >\n <Inbox className=\"w-4 h-4 text-powder-blue-500\" />\n <span className=\"flex-1\">All Tickets</span>\n {openTicketsCount > 0 && (\n <span className=\"text-xs px-1.5 py-0.5 rounded-full bg-powder-blue-100 text-powder-blue-700 font-medium\">\n {openTicketsCount}\n </span>\n )}\n </button>\n </div>\n </div>\n\n {/* Management Section - Visible to all users (clients can view reports, changelog, suggestions) */}\n <div>\n <div className=\"flex items-center gap-2 px-2 py-1.5 text-xs uppercase tracking-wider text-slate-500 font-medium mb-1\">\n <FileBarChart className=\"w-3.5 h-3.5\" />\n Management\n </div>\n <div className=\"space-y-0.5\">\n <button\n onClick={() => setActiveView('reports')}\n className={cn(\n 'flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors text-left',\n activeView === 'reports'\n ? 'bg-powder-blue-50 text-powder-blue-900 font-medium border border-powder-blue-200'\n : 'text-slate-700 hover:bg-slate-50'\n )}\n >\n <FileBarChart className=\"w-4 h-4 text-slate-400\" />\n <span className=\"flex-1\">Monthly Reports</span>\n </button>\n <button\n onClick={() => setActiveView('changelog')}\n className={cn(\n 'flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors text-left',\n activeView === 'changelog'\n ? 'bg-powder-blue-50 text-powder-blue-900 font-medium border border-powder-blue-200'\n : 'text-slate-700 hover:bg-slate-50'\n )}\n >\n <History className=\"w-4 h-4 text-slate-400\" />\n <span className=\"flex-1\">Changelog</span>\n </button>\n <button\n onClick={() => setActiveView('suggestions')}\n className={cn(\n 'flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors text-left',\n activeView === 'suggestions'\n ? 'bg-powder-blue-50 text-powder-blue-900 font-medium border border-powder-blue-200'\n : 'text-slate-700 hover:bg-slate-50'\n )}\n >\n <Lightbulb className=\"w-4 h-4 text-slate-400\" />\n <span className=\"flex-1\">Suggestions</span>\n </button>\n {/* Meeting Notes - Available to all users (agency and clients) */}\n <button\n onClick={() => setActiveView('notes')}\n className={cn(\n 'flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors text-left',\n activeView === 'notes'\n ? 'bg-powder-blue-50 text-powder-blue-900 font-medium border border-powder-blue-200'\n : 'text-slate-700 hover:bg-slate-50'\n )}\n >\n <FileBarChart className=\"w-4 h-4 text-slate-400\" />\n <span className=\"flex-1\">Meeting Notes</span>\n </button>\n </div>\n </div>\n\n {/* Monitoring Section - Visible to all users (clients can view domains, SEO, performance, uptime) */}\n <div>\n <div className=\"flex items-center gap-2 px-2 py-1.5 text-xs uppercase tracking-wider text-slate-500 font-medium mb-1\">\n <Globe className=\"w-3.5 h-3.5\" />\n Monitoring\n </div>\n <div className=\"space-y-0.5\">\n <button\n onClick={() => setActiveView('domains')}\n className={cn(\n 'flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors text-left',\n activeView === 'domains'\n ? 'bg-powder-blue-50 text-powder-blue-900 font-medium border border-powder-blue-200'\n : 'text-slate-700 hover:bg-slate-50'\n )}\n >\n <Globe className=\"w-4 h-4 text-slate-400\" />\n <span className=\"flex-1\">Domains</span>\n {domainWarningCount > 0 && (\n <span className=\"text-xs px-1.5 py-0.5 rounded-full bg-amber-100 text-amber-700 font-medium\">\n {domainWarningCount}\n </span>\n )}\n </button>\n {/* Hour Packages - Agency only (internal management) */}\n {isAgency && (\n <button\n onClick={() => setActiveView('hours')}\n className={cn(\n 'flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors text-left',\n activeView === 'hours'\n ? 'bg-powder-blue-50 text-powder-blue-900 font-medium border border-powder-blue-200'\n : 'text-slate-700 hover:bg-slate-50'\n )}\n >\n <Clock className=\"w-4 h-4 text-slate-400\" />\n <span className=\"flex-1\">Hour Packages</span>\n {lowHoursCount > 0 && (\n <span className=\"text-xs px-1.5 py-0.5 rounded-full bg-red-100 text-red-700 font-medium\">\n Low\n </span>\n )}\n </button>\n )}\n <button\n onClick={() => setActiveView('monitoring')}\n className={cn(\n 'flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors text-left',\n activeView === 'monitoring'\n ? 'bg-powder-blue-50 text-powder-blue-900 font-medium border border-powder-blue-200'\n : 'text-slate-700 hover:bg-slate-50'\n )}\n >\n <BarChart3 className=\"w-4 h-4 text-slate-400\" />\n <span className=\"flex-1\">SEO & Performance</span>\n {!hasAnyMonitoringFeature && (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-bold bg-gradient-to-r from-amber-400 to-orange-500 text-white\">\n PRO\n </span>\n )}\n </button>\n </div>\n </div>\n\n {/* Settings Section */}\n <div>\n <div className=\"flex items-center gap-2 px-2 py-1.5 text-xs uppercase tracking-wider text-slate-500 font-medium mb-1\">\n <Settings className=\"w-3.5 h-3.5\" />\n Settings\n </div>\n <div className=\"space-y-0.5\">\n <button\n onClick={() => setActiveView('settings')}\n className={cn(\n 'flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors text-left',\n activeView === 'settings'\n ? 'bg-powder-blue-50 text-powder-blue-900 font-medium border border-powder-blue-200'\n : 'text-slate-700 hover:bg-slate-50'\n )}\n >\n <Settings className=\"w-4 h-4 text-slate-400\" />\n <span className=\"flex-1\">Project Settings</span>\n </button>\n </div>\n </div>\n </div>\n </ScrollArea>\n\n {/* Footer with Widget Button */}\n <div className=\"border-t border-slate-100 p-3\">\n <div className=\"text-xs text-slate-500 truncate mb-2\">\n {phase5Data.live_url || 'No live URL set'}\n </div>\n {phase5Data.live_url && (\n <>\n {/* Widget embed code (shown on demand) */}\n {showEmbedCode && (\n <div className=\"mb-3 p-3 rounded-lg bg-amber-50 border border-amber-200\">\n <div className=\"flex items-start gap-2 mb-2\">\n <AlertTriangle className=\"w-4 h-4 text-amber-600 flex-shrink-0 mt-0.5\" />\n <div className=\"text-xs text-amber-800\">\n <strong>Widget Installation</strong>\n <p className=\"mt-1\">Add this script to your site:</p>\n </div>\n </div>\n <div className=\"bg-slate-900 rounded-md p-2 mt-2\">\n <pre className=\"text-[10px] text-emerald-400 font-mono break-all whitespace-pre-wrap\">\n {getEmbedScript()}\n </pre>\n </div>\n <button\n onClick={copyEmbedScript}\n className=\"mt-2 w-full flex items-center justify-center gap-1.5 px-2 py-1.5 rounded-md bg-amber-100 hover:bg-amber-200 text-amber-800 text-xs font-medium transition-colors\"\n >\n {copiedScript ? (\n <>\n <Check className=\"w-3 h-3\" />\n Copied!\n </>\n ) : (\n <>\n <Copy className=\"w-3 h-3\" />\n Copy Code\n </>\n )}\n </button>\n <button\n onClick={() => setShowEmbedCode(false)}\n className=\"mt-1.5 w-full text-xs text-amber-600 hover:text-amber-700\"\n >\n Close\n </button>\n </div>\n )}\n\n {/* Give Feedback button */}\n <button\n onClick={handleLaunchWidget}\n disabled={isCreatingSession}\n className={cn(\n \"w-full flex items-center justify-center gap-2 px-3 py-2.5 rounded-lg text-sm font-medium transition-all\",\n \"bg-amber-500 text-white hover:bg-amber-600\",\n \"shadow-sm hover:shadow-md\",\n isCreatingSession && \"opacity-70 cursor-wait\"\n )}\n >\n {isCreatingSession ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Link2 className=\"w-4 h-4\" />\n )}\n Give Feedback\n </button>\n\n {/* Show embed code link */}\n {!showEmbedCode && (\n <button\n onClick={() => setShowEmbedCode(true)}\n className=\"mt-2 w-full text-xs text-slate-500 hover:text-slate-700\"\n >\n Widget not showing? Get embed code\n </button>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* Main Content Area */}\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Tickets View - with its own header */}\n {activeView === 'tickets' && (\n <>\n {/* Tickets Header */}\n <header className=\"h-14 flex-shrink-0 border-b border-slate-200 bg-white\">\n <div className=\"h-full px-4 flex items-center justify-between\">\n {/* View Mode Switcher */}\n <div className=\"flex items-center gap-1 p-1 rounded-lg bg-slate-100 border border-slate-200\">\n {viewModeConfig.map(mode => (\n <button\n key={mode.id}\n onClick={() => setViewMode(mode.id)}\n className={cn(\n 'flex items-center gap-2 px-3 py-1.5 rounded-md text-sm font-medium transition-all duration-200',\n viewMode === mode.id\n ? 'bg-white text-slate-900 shadow-sm'\n : 'text-slate-500 hover:text-slate-700 hover:bg-slate-50'\n )}\n >\n <mode.icon className=\"w-4 h-4\" />\n <span className=\"hidden md:inline\">{mode.label}</span>\n </button>\n ))}\n </div>\n\n {/* Right Actions */}\n <div className=\"flex items-center gap-3\">\n {/* Search - visible to all users */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400\" />\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search...\"\n className=\"w-40 md:w-56 pl-9 pr-4 py-2 bg-slate-50 border border-slate-200 rounded-lg text-sm text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500\"\n />\n {searchQuery && (\n <button\n onClick={() => setSearchQuery('')}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1 hover:bg-slate-200 rounded\"\n >\n <X className=\"w-3 h-3 text-slate-400\" />\n </button>\n )}\n </div>\n\n {/* Process Tasks - Admin only */}\n {isAgency && (\n <button\n onClick={() => setShowExportModal(true)}\n className=\"flex items-center gap-1.5 px-3 py-2 text-sm font-medium text-slate-700 bg-slate-100 hover:bg-slate-200 rounded-lg border border-slate-200 transition-colors\"\n >\n <Layers className=\"w-3.5 h-3.5\" />\n <span className=\"hidden sm:inline\">Process Tasks</span>\n </button>\n )}\n\n {/* Filters */}\n <button\n onClick={() => setShowFilters(!showFilters)}\n className={cn(\n 'flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium transition-all',\n showFilters || activeFiltersCount > 0\n ? 'bg-powder-blue-50 text-powder-blue-700 border border-powder-blue-200'\n : 'bg-white text-slate-600 border border-slate-200 hover:bg-slate-50'\n )}\n >\n <Filter className=\"w-4 h-4\" />\n <span className=\"hidden sm:inline\">Filters</span>\n {activeFiltersCount > 0 && (\n <span className=\"w-5 h-5 flex items-center justify-center rounded-full bg-powder-blue-500 text-white text-xs font-bold\">\n {activeFiltersCount}\n </span>\n )}\n </button>\n\n {/* New Item */}\n {canEdit && (\n <button\n onClick={() => setShowNewItemModal(true)}\n className=\"flex items-center gap-2 px-4 py-2 rounded-lg bg-powder-blue-600 hover:bg-powder-blue-700 text-white font-medium text-sm shadow-sm transition-all\"\n >\n <Plus className=\"w-4 h-4\" />\n <span className=\"hidden sm:inline\">\n {isAgency ? 'New Item' : 'Report Issue'}\n </span>\n </button>\n )}\n </div>\n </div>\n </header>\n\n {/* Filter Bar (Collapsible) */}\n <AnimatePresence>\n {showFilters && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n className=\"overflow-hidden border-b border-slate-200 bg-white\"\n >\n <div className=\"px-4 py-3 flex items-center gap-4 flex-wrap\">\n {/* Status Filter */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-slate-500 font-medium uppercase tracking-wider\">Status</span>\n <div className=\"flex items-center gap-1\">\n <FilterChip\n active={statusFilter === 'all'}\n onClick={() => setStatusFilter('all')}\n >\n All\n </FilterChip>\n {STATUS_ORDER.map(status => (\n <FilterChip\n key={status}\n active={statusFilter === status}\n onClick={() => setStatusFilter(status)}\n color={STATUSES[status]?.accent}\n >\n {STATUSES[status]?.label || status}\n </FilterChip>\n ))}\n </div>\n </div>\n\n {/* Priority Filter */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-slate-500 font-medium uppercase tracking-wider\">Priority</span>\n <div className=\"flex items-center gap-1\">\n <FilterChip\n active={priorityFilter === 'all'}\n onClick={() => setPriorityFilter('all')}\n >\n All\n </FilterChip>\n {(['critical', 'high', 'medium', 'low'] as const).map(priority => (\n <FilterChip\n key={priority}\n active={priorityFilter === priority}\n onClick={() => setPriorityFilter(priority)}\n color={PRIORITIES[priority]?.accent}\n >\n {PRIORITIES[priority]?.label || priority}\n </FilterChip>\n ))}\n </div>\n </div>\n\n {/* Show Archived Toggle */}\n <label className=\"flex items-center gap-2 cursor-pointer ml-auto\">\n <input\n type=\"checkbox\"\n checked={showArchived}\n onChange={(e) => setShowArchived(e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-8 h-4 rounded-full bg-slate-200 peer-checked:bg-powder-blue-500 transition-colors relative\">\n <div className=\"absolute top-0.5 left-0.5 w-3 h-3 rounded-full bg-white shadow-sm peer-checked:translate-x-4 transition-all\" />\n </div>\n <span className=\"text-sm text-slate-600\">Show archived</span>\n </label>\n\n {/* Clear Filters */}\n {activeFiltersCount > 0 && (\n <button\n onClick={() => {\n setStatusFilter('all')\n setCategoryFilter('all')\n setPriorityFilter('all')\n }}\n className=\"text-sm text-powder-blue-600 hover:text-powder-blue-700 transition-colors\"\n >\n Clear filters\n </button>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Tickets Content */}\n <main className=\"flex-1 overflow-hidden\">\n <AnimatePresence mode=\"wait\">\n {viewMode === 'inbox' && (\n <motion.div\n key=\"inbox\"\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 20 }}\n className=\"h-full\"\n >\n <InboxView\n items={filteredItems}\n selectedItemId={selectedItemId}\n onSelectItem={setSelectedItemId}\n onStatusChange={onStatusChange}\n isAgency={isAgency}\n canEdit={canEdit}\n />\n </motion.div>\n )}\n\n {viewMode === 'board' && (\n <motion.div\n key=\"board\"\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 20 }}\n className=\"h-full\"\n >\n <BoardView\n items={filteredItems}\n selectedItemId={selectedItemId}\n onSelectItem={setSelectedItemId}\n onStatusChange={onStatusChange}\n canEdit={canEdit}\n />\n </motion.div>\n )}\n\n {viewMode === 'timeline' && (\n <motion.div\n key=\"timeline\"\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 20 }}\n className=\"h-full\"\n >\n <TimelineView\n items={filteredItems}\n selectedItemId={selectedItemId}\n onSelectItem={setSelectedItemId}\n />\n </motion.div>\n )}\n\n </AnimatePresence>\n </main>\n </>\n )}\n\n {/* Reports View */}\n {activeView === 'reports' && (\n <div className=\"flex-1 overflow-auto\">\n <div className=\"max-w-4xl mx-auto py-6 px-4 lg:px-6\">\n <MonthlyReportView\n projectId={projectId}\n agencyId={agencyId}\n isAgency={isAgency}\n />\n </div>\n </div>\n )}\n\n {/* Changelog View */}\n {activeView === 'changelog' && (\n <div className=\"flex-1 overflow-auto\">\n <div className=\"max-w-4xl mx-auto py-6 px-4 lg:px-6\">\n <ChangelogView\n projectId={projectId}\n />\n </div>\n </div>\n )}\n\n {/* Suggestions View */}\n {activeView === 'suggestions' && (\n <div className=\"flex-1 overflow-auto\">\n <div className=\"max-w-4xl mx-auto py-6 px-4 lg:px-6\">\n <SuggestionsBoard\n projectId={projectId}\n />\n </div>\n </div>\n )}\n\n {/* Meeting Notes View - Available to all users (agency and clients) */}\n {activeView === 'notes' && (\n <div className=\"flex-1 overflow-auto\">\n <div className=\"max-w-4xl mx-auto py-6 px-4 lg:px-6\">\n <MeetingNotesView\n projectId={projectId}\n />\n </div>\n </div>\n )}\n\n {/* Domains View */}\n {activeView === 'domains' && (\n <div className=\"flex-1 overflow-auto\">\n <div className=\"max-w-4xl mx-auto py-6 px-4 lg:px-6\">\n <DomainMonitorDashboard\n projectId={projectId}\n agencyId={agencyId}\n isAgency={isAgency}\n />\n </div>\n </div>\n )}\n\n {/* Hours View */}\n {activeView === 'hours' && (\n <div className=\"flex-1 overflow-auto\">\n <div className=\"max-w-4xl mx-auto py-6 px-4 lg:px-6\">\n <h2 className=\"text-xl font-semibold text-slate-900 mb-4\">Hour Packages</h2>\n <p className=\"text-slate-500 text-sm mb-6\">\n Manage hour packages for this project. Track time spent and remaining hours.\n </p>\n {hourPackages.length === 0 ? (\n <div className=\"text-center py-12 bg-white rounded-xl border border-dashed border-slate-200\">\n <Clock className=\"w-12 h-12 text-slate-300 mx-auto mb-3\" />\n <p className=\"text-slate-600 font-medium\">No hour packages</p>\n <p className=\"text-slate-400 text-sm mt-1\">\n Add hour packages in project settings\n </p>\n <button\n onClick={() => setActiveView('settings')}\n className=\"mt-4 px-4 py-2 bg-powder-blue-600 text-white rounded-lg text-sm font-medium hover:bg-powder-blue-700 transition-colors\"\n >\n Open Settings\n </button>\n </div>\n ) : (\n <div className=\"space-y-4\">\n {hourPackages.map(pkg => (\n <div\n key={pkg.id}\n className=\"p-4 bg-white border border-slate-200 rounded-xl\"\n >\n <div className=\"flex items-center justify-between mb-2\">\n <h3 className=\"font-medium text-slate-900\">{pkg.name}</h3>\n <span className={cn(\n 'px-2 py-0.5 rounded-full text-xs font-medium',\n pkg.status === 'active' ? 'bg-green-100 text-green-700' :\n pkg.status === 'expired' ? 'bg-red-100 text-red-700' :\n 'bg-slate-100 text-slate-600'\n )}>\n {pkg.status}\n </span>\n </div>\n <div className=\"mb-2\">\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"text-slate-500\">Used</span>\n <span className=\"font-medium text-slate-700\">\n {Math.round(pkg.used_minutes / 60)}h / {Math.round(pkg.total_minutes / 60)}h\n </span>\n </div>\n <div className=\"h-2 bg-slate-100 rounded-full overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full transition-all',\n (pkg.used_minutes / pkg.total_minutes) > 0.8\n ? 'bg-red-500'\n : (pkg.used_minutes / pkg.total_minutes) > 0.5\n ? 'bg-amber-500'\n : 'bg-green-500'\n )}\n style={{ width: `${Math.min(100, (pkg.used_minutes / pkg.total_minutes) * 100)}%` }}\n />\n </div>\n </div>\n <p className=\"text-xs text-slate-400\">\n {pkg.remaining_minutes > 0\n ? `${Math.round(pkg.remaining_minutes / 60)} hours remaining`\n : 'Package depleted'}\n </p>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Monitoring View (SEO, Performance, Uptime) */}\n {activeView === 'monitoring' && (\n <MonitoringView\n projectId={projectId}\n agencyId={agencyId}\n project={project ?? null}\n user={user ?? null}\n phase5Data={phase5Data}\n canEdit={canEdit}\n isAgency={isAgency}\n />\n )}\n\n {/* Settings View */}\n {activeView === 'settings' && (\n <SettingsView\n projectId={projectId}\n agencyId={agencyId}\n project={project ?? null}\n phase5Data={phase5Data}\n onUpdateUrls={onUpdateUrls || (async () => {})}\n onAddCredential={onAddCredential || (async () => {})}\n onUpdateCredential={onUpdateCredential || (async () => {})}\n onDeleteCredential={onDeleteCredential || (async () => {})}\n onProjectUpdate={onProjectUpdate}\n canEdit={canEdit}\n isAgency={isAgency}\n hasGoldPlan={hasGoldPlan}\n />\n )}\n </div>\n\n {/* Item Detail Drawer */}\n {selectedItem && (\n <ItemDetailDrawer\n item={selectedItem}\n projectId={projectId}\n projectName={project?.name}\n liveUrl={phase5Data.live_url}\n agencyId={agencyId}\n onClose={() => setSelectedItemId(null)}\n onUpdate={(updates) => onUpdateItem(selectedItem.id, updates)}\n onDelete={() => onDeleteItem(selectedItem.id)}\n onStatusChange={(status) => onStatusChange(selectedItem.id, status)}\n onSubmitQuote={onSubmitQuote ? (quote) => onSubmitQuote(selectedItem.id, quote) : undefined}\n onRespondToQuote={onRespondToQuote ? (approved, notes) => onRespondToQuote(selectedItem.id, approved, notes) : undefined}\n onAddComment={onAddComment ? (comment, isInternal, parentId, mentions) => onAddComment(selectedItem.id, comment, isInternal, parentId, mentions) : undefined}\n onEditComment={onEditComment ? (commentId, newText) => onEditComment(selectedItem.id, commentId, newText) : undefined}\n onDeleteComment={onDeleteComment ? (commentId) => onDeleteComment(selectedItem.id, commentId) : undefined}\n availableUsers={availableUsers}\n isAgency={isAgency}\n canEdit={canEdit}\n />\n )}\n\n {/* New Item Modal */}\n <AnimatePresence>\n {showNewItemModal && (\n <NewItemModal\n onClose={() => setShowNewItemModal(false)}\n onSubmit={onAddItem}\n isAgency={isAgency}\n />\n )}\n </AnimatePresence>\n\n {/* Command Palette */}\n <AnimatePresence>\n {showCommandPalette && (\n <CommandPalette\n items={phase5Data.items}\n onClose={() => setShowCommandPalette(false)}\n onSelectItem={(id) => {\n setSelectedItemId(id)\n setShowCommandPalette(false)\n }}\n onNewItem={() => {\n setShowNewItemModal(true)\n setShowCommandPalette(false)\n }}\n />\n )}\n </AnimatePresence>\n\n {/* Process Tasks Modal - Admin only */}\n <MaintenanceExportModal\n isOpen={showExportModal}\n onClose={() => setShowExportModal(false)}\n items={phase5Data.items}\n projectName={project?.name || 'Project'}\n liveUrl={phase5Data.live_url}\n onUpdateItems={async (updates) => {\n // Batch update items\n for (const update of updates) {\n await onUpdateItem(update.id, {\n status: update.status as MaintenanceItemStatus,\n resolution_notes: update.resolution_notes,\n resolved_at: update.status === 'completed' || update.status === 'wont_fix'\n ? new Date().toISOString()\n : undefined\n })\n }\n }}\n />\n\n </div>\n )\n}\n\n// ============================================\n// Sub-components\n// ============================================\n\ninterface FilterChipProps {\n active: boolean\n onClick: () => void\n color?: string\n children: React.ReactNode\n}\n\nconst FilterChip = ({ active, onClick, color, children }: FilterChipProps) => (\n <button\n onClick={onClick}\n className={cn(\n 'px-2.5 py-1 rounded-md text-xs font-medium transition-all',\n active\n ? 'bg-slate-200 text-slate-900'\n : 'bg-slate-100 text-slate-500 hover:text-slate-700 hover:bg-slate-150'\n )}\n style={active && color ? { backgroundColor: `${color}20`, color } : undefined}\n >\n {children}\n </button>\n)\n\nexport default Phase5CommandCenter\n","/**\n * ListView - Table/list view with sorting and grouping\n *\n * Compact, dense view for power users who want to see everything\n */\n\nimport { useState, useMemo } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n ChevronDown,\n ChevronUp,\n ArrowUpDown,\n MessageSquare,\n Calendar,\n Euro,\n Check\n} from 'lucide-react'\nimport { formatDistanceToNow, format } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn } from '../utils/cn'\nimport { MaintenanceItem, MaintenanceItemStatus, MaintenanceQuote } from '@framed/core'\nimport { CATEGORIES, PRIORITIES, STATUSES, STATUS_ORDER } from '../constants'\n\ninterface ListViewProps {\n items: MaintenanceItem[]\n selectedItemId: string | null\n onSelectItem: (id: string | null) => void\n onStatusChange: (itemId: string, newStatus: MaintenanceItemStatus) => Promise<void>\n canEdit: boolean\n}\n\ntype ItemWithQuote = MaintenanceItem & { quote?: MaintenanceQuote }\ntype SortKey = 'title' | 'category' | 'priority' | 'status' | 'created_at' | 'due_date'\ntype SortDir = 'asc' | 'desc'\n\nexport const ListView = ({\n items,\n selectedItemId,\n onSelectItem,\n onStatusChange,\n canEdit\n}: ListViewProps) => {\n const [sortKey, setSortKey] = useState<SortKey>('created_at')\n const [sortDir, setSortDir] = useState<SortDir>('desc')\n\n // Sort items\n const sortedItems = useMemo(() => {\n return [...items].sort((a, b) => {\n let comparison = 0\n\n switch (sortKey) {\n case 'title':\n comparison = a.title.localeCompare(b.title)\n break\n case 'category':\n comparison = a.category.localeCompare(b.category)\n break\n case 'priority': {\n const priorityOrder: Record<string, number> = { critical: 0, high: 1, medium: 2, low: 3 }\n comparison = (priorityOrder[a.priority] ?? 0) - (priorityOrder[b.priority] ?? 0)\n break\n }\n case 'status': {\n const statusOrder: Record<string, number> = { backlog: 0, scheduled: 1, in_progress: 2, review: 3, completed: 4, wont_fix: 5 }\n comparison = (statusOrder[a.status] ?? 0) - (statusOrder[b.status] ?? 0)\n break\n }\n case 'created_at':\n comparison = new Date(a.created_at).getTime() - new Date(b.created_at).getTime()\n break\n case 'due_date': {\n const aDate = a.due_date ? new Date(a.due_date).getTime() : Infinity\n const bDate = b.due_date ? new Date(b.due_date).getTime() : Infinity\n comparison = aDate - bDate\n break\n }\n }\n\n return sortDir === 'asc' ? comparison : -comparison\n })\n }, [items, sortKey, sortDir])\n\n // Toggle sort\n const toggleSort = (key: SortKey) => {\n if (sortKey === key) {\n setSortDir(sortDir === 'asc' ? 'desc' : 'asc')\n } else {\n setSortKey(key)\n setSortDir('asc')\n }\n }\n\n return (\n <div className=\"h-full overflow-auto\">\n <div className=\"min-w-[900px]\">\n {/* Header */}\n <div className=\"sticky top-0 z-10 bg-[#0a0a0f]/95 backdrop-blur-xl border-b border-white/5\">\n <div className=\"flex items-center h-12 px-4 text-xs font-medium text-white/50 uppercase tracking-wider\">\n <SortHeader\n label=\"Item\"\n sortKey=\"title\"\n currentKey={sortKey}\n sortDir={sortDir}\n onClick={toggleSort}\n className=\"flex-1\"\n />\n <SortHeader\n label=\"Category\"\n sortKey=\"category\"\n currentKey={sortKey}\n sortDir={sortDir}\n onClick={toggleSort}\n className=\"w-28\"\n />\n <SortHeader\n label=\"Priority\"\n sortKey=\"priority\"\n currentKey={sortKey}\n sortDir={sortDir}\n onClick={toggleSort}\n className=\"w-24\"\n />\n <SortHeader\n label=\"Status\"\n sortKey=\"status\"\n currentKey={sortKey}\n sortDir={sortDir}\n onClick={toggleSort}\n className=\"w-32\"\n />\n <SortHeader\n label=\"Due\"\n sortKey=\"due_date\"\n currentKey={sortKey}\n sortDir={sortDir}\n onClick={toggleSort}\n className=\"w-28\"\n />\n <SortHeader\n label=\"Created\"\n sortKey=\"created_at\"\n currentKey={sortKey}\n sortDir={sortDir}\n onClick={toggleSort}\n className=\"w-32\"\n />\n <div className=\"w-20\" />\n </div>\n </div>\n\n {/* Rows */}\n <div className=\"divide-y divide-white/5\">\n <AnimatePresence>\n {sortedItems.map((item, index) => (\n <ListRow\n key={item.id}\n item={item as ItemWithQuote}\n isSelected={item.id === selectedItemId}\n onClick={() => onSelectItem(item.id)}\n onStatusChange={onStatusChange}\n index={index}\n canEdit={canEdit}\n />\n ))}\n </AnimatePresence>\n </div>\n\n {/* Empty state */}\n {items.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-white/40\">No items to display</p>\n </div>\n )}\n </div>\n </div>\n )\n}\n\n// ============================================\n// Sort Header\n// ============================================\n\ninterface SortHeaderProps {\n label: string\n sortKey: SortKey\n currentKey: SortKey\n sortDir: SortDir\n onClick: (key: SortKey) => void\n className?: string\n}\n\nconst SortHeader = ({\n label,\n sortKey,\n currentKey,\n sortDir,\n onClick,\n className\n}: SortHeaderProps) => (\n <button\n onClick={() => onClick(sortKey)}\n className={cn(\n 'flex items-center gap-1 hover:text-white transition-colors',\n currentKey === sortKey && 'text-white',\n className\n )}\n >\n {label}\n {currentKey === sortKey ? (\n sortDir === 'asc' ? (\n <ChevronUp className=\"w-3 h-3\" />\n ) : (\n <ChevronDown className=\"w-3 h-3\" />\n )\n ) : (\n <ArrowUpDown className=\"w-3 h-3 opacity-50\" />\n )}\n </button>\n)\n\n// ============================================\n// List Row\n// ============================================\n\ninterface ListRowProps {\n item: ItemWithQuote\n isSelected: boolean\n onClick: () => void\n onStatusChange: (itemId: string, newStatus: MaintenanceItemStatus) => Promise<void>\n index: number\n canEdit: boolean\n}\n\nconst ListRow = ({\n item,\n isSelected,\n onClick,\n onStatusChange,\n index,\n canEdit\n}: ListRowProps) => {\n const category = CATEGORIES[item.category]\n const priority = PRIORITIES[item.priority]\n const status = STATUSES[item.status]\n const CategoryIcon = category?.icon\n\n const quote = item.quote\n const isCompleted = item.status === 'completed'\n const isWontFix = item.status === 'wont_fix'\n\n // Quick status change\n const [isChangingStatus, setIsChangingStatus] = useState(false)\n\n const handleQuickComplete = async (e: React.MouseEvent) => {\n e.stopPropagation()\n if (!canEdit || isChangingStatus) return\n\n setIsChangingStatus(true)\n try {\n await onStatusChange(item.id, 'completed')\n } finally {\n setIsChangingStatus(false)\n }\n }\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ delay: index * 0.01 }}\n onClick={onClick}\n className={cn(\n 'flex items-center h-14 px-4 cursor-pointer transition-colors',\n isSelected\n ? 'bg-violet-500/10'\n : 'hover:bg-white/[0.02]',\n (isCompleted || isWontFix) && 'opacity-50'\n )}\n >\n {/* Title + Quote */}\n <div className=\"flex-1 flex items-center gap-3 min-w-0\">\n {/* Category Icon */}\n {CategoryIcon && (\n <div\n className=\"w-8 h-8 rounded flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: `${category?.accent}15` }}\n >\n <CategoryIcon\n className=\"w-4 h-4\"\n style={{ color: category?.accent }}\n />\n </div>\n )}\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className={cn(\n 'text-sm font-medium truncate',\n isWontFix ? 'text-white/50 line-through' : 'text-white'\n )}>\n {item.title}\n </span>\n\n {/* Quote badge */}\n {quote && (\n <span className={cn(\n 'px-1.5 py-0.5 rounded text-[10px] font-medium flex items-center gap-0.5 flex-shrink-0',\n quote.status === 'approved'\n ? 'bg-emerald-500/20 text-emerald-400'\n : quote.status === 'quoted'\n ? 'bg-amber-500/20 text-amber-400'\n : 'bg-blue-500/20 text-blue-400'\n )}>\n <Euro className=\"w-2.5 h-2.5\" />\n {quote.fixed_price ? `€${quote.fixed_price}` : '...'}\n </span>\n )}\n\n {/* Comments badge */}\n {item.comments && item.comments.length > 0 && (\n <span className=\"flex items-center gap-0.5 text-xs text-white/40 flex-shrink-0\">\n <MessageSquare className=\"w-3 h-3\" />\n {item.comments.length}\n </span>\n )}\n </div>\n </div>\n </div>\n\n {/* Category */}\n <div className=\"w-28\">\n <span className=\"text-xs text-white/60\">{category?.label || item.category}</span>\n </div>\n\n {/* Priority */}\n <div className=\"w-24\">\n <span\n className=\"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-xs font-medium\"\n style={{\n backgroundColor: `${priority?.accent}15`,\n color: priority?.accent\n }}\n >\n <div\n className=\"w-1.5 h-1.5 rounded-full\"\n style={{ backgroundColor: priority?.accent }}\n />\n {priority?.label || item.priority}\n </span>\n </div>\n\n {/* Status */}\n <div className=\"w-32\">\n <span\n className=\"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-xs font-medium\"\n style={{\n backgroundColor: `${status?.accent}15`,\n color: status?.accent\n }}\n >\n {status?.label || item.status}\n </span>\n </div>\n\n {/* Due Date */}\n <div className=\"w-28\">\n {item.due_date ? (\n <span className=\"text-xs text-white/60\">\n {format(new Date(item.due_date), 'd MMM', { locale: enUS })}\n </span>\n ) : (\n <span className=\"text-xs text-white/30\">—</span>\n )}\n </div>\n\n {/* Created */}\n <div className=\"w-32\">\n <span className=\"text-xs text-white/40\">\n {formatDistanceToNow(new Date(item.created_at), {\n addSuffix: true,\n locale: enUS\n })}\n </span>\n </div>\n\n {/* Quick Actions */}\n <div className=\"w-20 flex items-center justify-end gap-1\">\n {canEdit && !isCompleted && !isWontFix && (\n <button\n onClick={handleQuickComplete}\n disabled={isChangingStatus}\n className={cn(\n 'w-7 h-7 rounded-full flex items-center justify-center transition-all',\n 'text-white/30 hover:text-emerald-400 hover:bg-emerald-500/20',\n isChangingStatus && 'opacity-50'\n )}\n title=\"Mark as complete\"\n >\n <Check className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n </motion.div>\n )\n}\n","/**\n * LogTimeModal - Modal for logging time spent on maintenance items\n */\n\nimport { useState } from 'react'\nimport { motion } from 'framer-motion'\nimport { X, Clock, Calendar, DollarSign, FileText } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\n// Utility function for formatting time\nexport const formatMinutesAsTime = (minutes: number): string => {\n const hours = Math.floor(minutes / 60)\n const mins = minutes % 60\n return `${hours}:${mins.toString().padStart(2, '0')}`\n}\n\ninterface LogTimeModalProps {\n itemId?: string\n itemTitle?: string\n onSubmit: (data: {\n maintenance_item_id?: string\n logged_date: string\n duration_minutes: number\n description?: string\n billable: boolean\n }) => Promise<void>\n onClose: () => void\n}\n\nexport const LogTimeModal = ({\n itemId,\n itemTitle,\n onSubmit,\n onClose\n}: LogTimeModalProps) => {\n const [hours, setHours] = useState('')\n const [minutes, setMinutes] = useState('')\n const [loggedDate, setLoggedDate] = useState<string>(new Date().toISOString().split('T')[0]!)\n const [description, setDescription] = useState('')\n const [billable, setBillable] = useState(true)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Calculate total minutes\n const totalMinutes = (parseInt(hours) || 0) * 60 + (parseInt(minutes) || 0)\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setError(null)\n\n if (totalMinutes <= 0) {\n setError('Please enter a valid duration')\n return\n }\n\n setIsSubmitting(true)\n\n try {\n await onSubmit({\n maintenance_item_id: itemId,\n logged_date: loggedDate,\n duration_minutes: totalMinutes,\n description: description.trim() || undefined,\n billable\n })\n onClose()\n } catch (err) {\n setError('Failed to log time. Please try again.')\n } finally {\n setIsSubmitting(false)\n }\n }\n\n return (\n <div className=\"fixed inset-0 z-[60] flex items-center justify-center p-4\">\n {/* Backdrop */}\n <div\n onClick={onClose}\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n />\n\n {/* Modal */}\n <motion.div\n initial={{ opacity: 0, scale: 0.95, y: 20 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: 20 }}\n className=\"relative z-[1] w-full max-w-md bg-white rounded-2xl shadow-2xl overflow-hidden\"\n >\n {/* Header */}\n <div className=\"px-6 py-4 border-b border-slate-100 bg-slate-50/50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-xl bg-powder-blue-100 flex items-center justify-center\">\n <Clock className=\"w-5 h-5 text-powder-blue-600\" />\n </div>\n <div>\n <h2 className=\"text-lg font-semibold text-slate-900\">Log Time</h2>\n {itemTitle && (\n <p className=\"text-sm text-slate-500 truncate max-w-[200px]\">{itemTitle}</p>\n )}\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg text-slate-400 hover:text-slate-600 hover:bg-slate-100 transition-colors\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit} className=\"p-6 space-y-5\">\n {/* Duration */}\n <div>\n <label className=\"block text-sm font-medium text-slate-700 mb-2\">\n Duration\n </label>\n <div className=\"flex gap-3\">\n <div className=\"flex-1\">\n <div className=\"relative\">\n <input\n type=\"number\"\n min=\"0\"\n max=\"24\"\n value={hours}\n onChange={(e) => setHours(e.target.value)}\n placeholder=\"0\"\n className=\"w-full px-4 py-3 pr-12 rounded-xl border border-slate-200 text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500 text-lg font-medium\"\n />\n <span className=\"absolute right-4 top-1/2 -translate-y-1/2 text-sm text-slate-400\">\n hours\n </span>\n </div>\n </div>\n <div className=\"flex-1\">\n <div className=\"relative\">\n <input\n type=\"number\"\n min=\"0\"\n max=\"59\"\n step=\"5\"\n value={minutes}\n onChange={(e) => setMinutes(e.target.value)}\n placeholder=\"0\"\n className=\"w-full px-4 py-3 pr-12 rounded-xl border border-slate-200 text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500 text-lg font-medium\"\n />\n <span className=\"absolute right-4 top-1/2 -translate-y-1/2 text-sm text-slate-400\">\n min\n </span>\n </div>\n </div>\n </div>\n {totalMinutes > 0 && (\n <p className=\"mt-2 text-sm text-slate-500\">\n Total: {formatMinutesAsTime(totalMinutes)} ({Math.round(totalMinutes / 60 * 10) / 10} hours)\n </p>\n )}\n </div>\n\n {/* Quick Duration Buttons */}\n <div className=\"flex flex-wrap gap-2\">\n {[15, 30, 45, 60, 90, 120].map((mins) => (\n <button\n key={mins}\n type=\"button\"\n onClick={() => {\n setHours(Math.floor(mins / 60).toString())\n setMinutes((mins % 60).toString())\n }}\n className={cn(\n 'px-3 py-1.5 rounded-lg text-sm font-medium transition-all',\n totalMinutes === mins\n ? 'bg-powder-blue-100 text-powder-blue-700 border border-powder-blue-200'\n : 'bg-slate-100 text-slate-600 hover:bg-slate-200 border border-transparent'\n )}\n >\n {mins < 60 ? `${mins}m` : `${mins / 60}h`}\n </button>\n ))}\n </div>\n\n {/* Date */}\n <div>\n <label className=\"block text-sm font-medium text-slate-700 mb-2\">\n <Calendar className=\"w-4 h-4 inline-block mr-1\" />\n Date\n </label>\n <input\n type=\"date\"\n value={loggedDate}\n onChange={(e) => setLoggedDate(e.target.value)}\n max={new Date().toISOString().split('T')[0]}\n className=\"w-full px-4 py-3 rounded-xl border border-slate-200 text-slate-900 focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-slate-700 mb-2\">\n <FileText className=\"w-4 h-4 inline-block mr-1\" />\n Description (optional)\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"What did you work on?\"\n rows={3}\n className=\"w-full px-4 py-3 rounded-xl border border-slate-200 text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500 resize-none\"\n />\n </div>\n\n {/* Billable Toggle */}\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n checked={billable}\n onChange={(e) => setBillable(e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 rounded-full bg-slate-200 peer-checked:bg-powder-blue-500 transition-colors\" />\n <div className=\"absolute top-0.5 left-0.5 w-5 h-5 rounded-full bg-white shadow-sm transition-transform peer-checked:translate-x-5\" />\n </div>\n <div className=\"flex items-center gap-2\">\n <DollarSign className=\"w-4 h-4 text-slate-500\" />\n <span className=\"text-sm font-medium text-slate-700\">Billable</span>\n </div>\n </label>\n\n {/* Error */}\n {error && (\n <div className=\"p-3 rounded-lg bg-red-50 text-red-700 text-sm\">\n {error}\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"flex-1 px-4 py-3 rounded-xl border border-slate-200 text-slate-700 font-medium hover:bg-slate-50 transition-colors\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={isSubmitting || totalMinutes <= 0}\n className={cn(\n 'flex-1 px-4 py-3 rounded-xl font-medium transition-all',\n isSubmitting || totalMinutes <= 0\n ? 'bg-slate-100 text-slate-400 cursor-not-allowed'\n : 'bg-powder-blue-600 text-white hover:bg-powder-blue-700 shadow-sm'\n )}\n >\n {isSubmitting ? 'Logging...' : 'Log Time'}\n </button>\n </div>\n </form>\n </motion.div>\n </div>\n )\n}\n","/**\n * Comment utility functions\n * COPIED from framed-app/src/utils/commentUtils.ts\n * Only includes the functions needed for MaintenanceCommentThread\n */\n\n/**\n * Extract user IDs from @mentions in text\n * Format: @[userId:userName] or @userName (if we have user list)\n */\nexport function extractMentions(\n text: string,\n availableUsers?: Array<{ id: string; name: string }>\n): string[] {\n const mentionRegex = /@\\[([^\\]]+)\\]/g\n const mentions: string[] = []\n let match\n\n while ((match = mentionRegex.exec(text)) !== null) {\n const mentionData = match[1]\n if (!mentionData) continue\n // Format is \"userId:userName\"\n const userId = mentionData.split(':')[0]\n if (userId && !mentions.includes(userId)) {\n mentions.push(userId)\n }\n }\n\n return mentions\n}\n\n/**\n * Format text with @mentions highlighted\n * Converts @[userId:userName] to styled mentions\n */\nexport function formatMentions(text: string): string {\n return text.replace(/@\\[([^\\]]+)\\]/g, (match, mentionData) => {\n // mentionData format is \"userId:userName\"\n const parts = mentionData.split(':')\n const userName = parts.length > 1 ? parts[1] : parts[0]\n return `<span class=\"mention\">@${userName}</span>`\n })\n}\n","/**\n * MaintenanceCommentThread - Threaded comments with internal/external visibility\n * COPIED from framed-app/src/components/phase5-redesign/MaintenanceCommentThread.tsx\n */\n\nimport { useState, useMemo } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n MessageSquare,\n Reply,\n Edit2,\n Trash2,\n Lock,\n Users,\n Send,\n Paperclip,\n ChevronDown,\n ChevronRight\n} from 'lucide-react'\nimport { formatDistanceToNow } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn, extractMentions, formatMentions, hasAdminPrivileges } from '../utils'\n\n// Types inline to avoid @framed/core import issues during build\n// These match the types from @framed/core/management-types.ts\ntype UserRole = 'super_admin' | 'admin' | 'manager' | 'client'\n\ninterface CommentAttachment {\n id: string\n file_name: string\n file_url: string\n file_type: string\n file_size: number\n uploaded_at: string\n}\n\ninterface MaintenanceComment {\n id: string\n user_id: string\n user_name: string\n user_role?: UserRole\n comment: string\n created_at: string\n edited_at?: string\n attachments?: CommentAttachment[]\n parent_id?: string\n replies?: MaintenanceComment[]\n is_internal?: boolean\n}\n\ninterface User {\n id?: string\n role?: UserRole\n}\n\ninterface MaintenanceCommentThreadProps {\n comments: MaintenanceComment[]\n onAddComment: (comment: string, isInternal: boolean, parentId?: string, mentions?: string[]) => Promise<void>\n onEditComment: (commentId: string, newText: string) => Promise<void>\n onDeleteComment: (commentId: string) => Promise<void>\n canEdit: boolean\n availableUsers?: Array<{ id: string; name: string }>\n onUploadAttachment?: (file: File) => Promise<CommentAttachment | null>\n /** Current user - if not provided, uses hasAdminPrivileges check */\n user?: User | null\n /** Override for isAgency check - if not provided, uses hasAdminPrivileges(user) */\n isAgency?: boolean\n}\n\nexport const MaintenanceCommentThread = ({\n comments,\n onAddComment,\n onEditComment,\n onDeleteComment,\n canEdit,\n availableUsers = [],\n onUploadAttachment,\n user = null,\n isAgency: isAgencyProp\n}: MaintenanceCommentThreadProps) => {\n // Use prop if provided, otherwise derive from user role\n const isAgency = isAgencyProp ?? hasAdminPrivileges(user)\n\n const [newComment, setNewComment] = useState('')\n const [isInternal, setIsInternal] = useState(false)\n const [replyingTo, setReplyingTo] = useState<string | null>(null)\n const [editingId, setEditingId] = useState<string | null>(null)\n const [editText, setEditText] = useState('')\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n // Filter comments based on user role\n // Non-agency users cannot see internal comments\n const visibleComments = useMemo(() => {\n return comments.filter(c => {\n if (isAgency) return true // Agency can see all\n return !c.is_internal // Non-agency only see non-internal\n })\n }, [comments, isAgency])\n\n // Build threaded structure\n const threadedComments = useMemo(() => {\n const topLevel: MaintenanceComment[] = []\n const byParent: Record<string, MaintenanceComment[]> = {}\n\n visibleComments.forEach(comment => {\n if (!comment.parent_id) {\n topLevel.push(comment)\n } else {\n const parentId = comment.parent_id\n if (!byParent[parentId]) {\n byParent[parentId] = []\n }\n byParent[parentId]!.push(comment)\n }\n })\n\n // Attach replies to comments\n const attachReplies = (comment: MaintenanceComment): MaintenanceComment => ({\n ...comment,\n replies: (byParent[comment.id] || []).map(attachReplies)\n })\n\n return topLevel\n .map(attachReplies)\n .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())\n }, [visibleComments])\n\n // Handle submit\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!newComment.trim() || isSubmitting) return\n\n setIsSubmitting(true)\n const mentions = extractMentions(newComment, availableUsers)\n\n try {\n await onAddComment(newComment.trim(), isInternal, replyingTo || undefined, mentions)\n setNewComment('')\n setReplyingTo(null)\n setIsInternal(false)\n } finally {\n setIsSubmitting(false)\n }\n }\n\n // Handle edit\n const handleSaveEdit = async (commentId: string) => {\n if (!editText.trim() || isSubmitting) return\n\n setIsSubmitting(true)\n try {\n await onEditComment(commentId, editText.trim())\n setEditingId(null)\n setEditText('')\n } finally {\n setIsSubmitting(false)\n }\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Comment Input */}\n {canEdit && (\n <form onSubmit={handleSubmit} className=\"space-y-3\">\n {/* Reply indicator */}\n {replyingTo && (\n <div className=\"flex items-center gap-2 text-sm text-slate-500\">\n <Reply className=\"w-4 h-4\" />\n <span>Replying to comment</span>\n <button\n type=\"button\"\n onClick={() => setReplyingTo(null)}\n className=\"text-powder-blue-600 hover:underline\"\n >\n Cancel\n </button>\n </div>\n )}\n\n <div className=\"relative\">\n <textarea\n value={newComment}\n onChange={(e) => setNewComment(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n if (newComment.trim() && !isSubmitting) {\n handleSubmit(e as unknown as React.FormEvent)\n }\n }\n }}\n placeholder={replyingTo ? 'Write a reply...' : 'Add a comment...'}\n rows={3}\n className=\"w-full px-4 py-3 pr-24 rounded-xl border border-slate-200 text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500 resize-none\"\n />\n\n {/* Actions */}\n <div className=\"absolute right-2 bottom-2 flex items-center gap-1\">\n {/* Internal toggle - only for agency */}\n {isAgency && (\n <button\n type=\"button\"\n onClick={() => setIsInternal(!isInternal)}\n className={cn(\n 'p-2 rounded-lg transition-colors',\n isInternal\n ? 'bg-amber-100 text-amber-700'\n : 'text-slate-400 hover:text-slate-600 hover:bg-slate-100'\n )}\n title={isInternal ? 'Internal (agency only)' : 'Visible to client'}\n >\n {isInternal ? <Lock className=\"w-4 h-4\" /> : <Users className=\"w-4 h-4\" />}\n </button>\n )}\n\n {/* Attachment */}\n {onUploadAttachment && (\n <button\n type=\"button\"\n className=\"p-2 rounded-lg text-slate-400 hover:text-slate-600 hover:bg-slate-100 transition-colors\"\n title=\"Attach file\"\n >\n <Paperclip className=\"w-4 h-4\" />\n </button>\n )}\n\n {/* Submit */}\n <button\n type=\"submit\"\n disabled={!newComment.trim() || isSubmitting}\n className={cn(\n 'p-2 rounded-lg transition-colors',\n !newComment.trim() || isSubmitting\n ? 'text-slate-300 cursor-not-allowed'\n : 'text-powder-blue-600 hover:bg-powder-blue-50'\n )}\n >\n <Send className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Internal indicator */}\n {isInternal && (\n <p className=\"text-xs text-amber-600 flex items-center gap-1\">\n <Lock className=\"w-3 h-3\" />\n This comment will only be visible to your team\n </p>\n )}\n </form>\n )}\n\n {/* Comments List */}\n <div className=\"space-y-3\">\n {threadedComments.length === 0 ? (\n <div className=\"text-center py-8\">\n <MessageSquare className=\"w-8 h-8 mx-auto text-slate-300 mb-2\" />\n <p className=\"text-sm text-slate-500\">No comments yet</p>\n </div>\n ) : (\n threadedComments.map(comment => (\n <CommentItem\n key={comment.id}\n comment={comment}\n currentUserId={user?.id}\n isAgency={isAgency}\n onReply={(id) => {\n setReplyingTo(id)\n setNewComment('') // Clear input when starting a reply\n }}\n onEdit={(id, text) => {\n setEditingId(id)\n setEditText(text)\n }}\n onDelete={onDeleteComment}\n editingId={editingId}\n editText={editText}\n setEditText={setEditText}\n onSaveEdit={handleSaveEdit}\n onCancelEdit={() => {\n setEditingId(null)\n setEditText('')\n }}\n isSubmitting={isSubmitting}\n canEdit={canEdit}\n />\n ))\n )}\n </div>\n </div>\n )\n}\n\n// ============================================\n// Comment Item\n// ============================================\n\ninterface CommentItemProps {\n comment: MaintenanceComment\n currentUserId?: string\n isAgency: boolean\n onReply: (id: string) => void\n onEdit: (id: string, text: string) => void\n onDelete: (id: string) => void\n editingId: string | null\n editText: string\n setEditText: (text: string) => void\n onSaveEdit: (id: string) => void\n onCancelEdit: () => void\n isSubmitting: boolean\n canEdit: boolean\n depth?: number\n}\n\nconst CommentItem = ({\n comment,\n currentUserId,\n isAgency,\n onReply,\n onEdit,\n onDelete,\n editingId,\n editText,\n setEditText,\n onSaveEdit,\n onCancelEdit,\n isSubmitting,\n canEdit,\n depth = 0\n}: CommentItemProps) => {\n const [showReplies, setShowReplies] = useState(true)\n const [showActions, setShowActions] = useState(false)\n\n const isEditing = editingId === comment.id\n const isOwn = comment.user_id === currentUserId\n const canModify = isOwn || isAgency\n const hasReplies = comment.replies && comment.replies.length > 0\n\n // Format comment with mentions\n const formattedComment = formatMentions(comment.comment)\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className={cn(\n depth > 0 && 'ml-6 pl-4 border-l-2 border-slate-100'\n )}\n >\n <div\n className={cn(\n 'p-3 rounded-lg transition-colors',\n comment.is_internal\n ? 'bg-amber-50 border border-amber-100'\n : 'bg-slate-50 hover:bg-slate-100'\n )}\n onMouseEnter={() => setShowActions(true)}\n onMouseLeave={() => setShowActions(false)}\n >\n {/* Header */}\n <div className=\"flex items-start justify-between gap-2 mb-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-slate-900\">{comment.user_name}</span>\n {comment.user_role && ['admin', 'manager', 'super_admin'].includes(comment.user_role) && (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-medium bg-slate-200 text-slate-600\">\n Agency\n </span>\n )}\n {comment.is_internal && (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-medium bg-amber-100 text-amber-700 flex items-center gap-0.5\">\n <Lock className=\"w-2.5 h-2.5\" />\n Internal\n </span>\n )}\n <span className=\"text-xs text-slate-400\">\n {formatDistanceToNow(new Date(comment.created_at), { addSuffix: true, locale: enUS })}\n </span>\n {comment.edited_at && (\n <span className=\"text-xs text-slate-400\">(edited)</span>\n )}\n </div>\n\n {/* Actions */}\n <AnimatePresence>\n {showActions && !isEditing && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex items-center gap-1\"\n >\n {/* Reply - available to anyone who can comment */}\n {canEdit && (\n <button\n onClick={() => onReply(comment.id)}\n className=\"p-1 rounded text-slate-400 hover:text-slate-600 hover:bg-slate-200 transition-colors\"\n title=\"Reply\"\n >\n <Reply className=\"w-3.5 h-3.5\" />\n </button>\n )}\n {/* Edit/Delete - only for comment owner or agency */}\n {canModify && canEdit && (\n <>\n <button\n onClick={() => onEdit(comment.id, comment.comment)}\n className=\"p-1 rounded text-slate-400 hover:text-slate-600 hover:bg-slate-200 transition-colors\"\n title=\"Edit\"\n >\n <Edit2 className=\"w-3.5 h-3.5\" />\n </button>\n <button\n onClick={() => onDelete(comment.id)}\n className=\"p-1 rounded text-slate-400 hover:text-red-600 hover:bg-red-50 transition-colors\"\n title=\"Delete\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n\n {/* Content */}\n {isEditing ? (\n <div className=\"space-y-2\">\n <textarea\n value={editText}\n onChange={(e) => setEditText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n onSaveEdit(comment.id)\n } else if (e.key === 'Escape') {\n onCancelEdit()\n }\n }}\n className=\"w-full px-3 py-2 rounded-lg border border-slate-200 text-sm text-slate-900 focus:outline-none focus:ring-2 focus:ring-powder-blue-500/50 focus:border-powder-blue-500 resize-none\"\n rows={2}\n autoFocus\n />\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => onSaveEdit(comment.id)}\n disabled={isSubmitting || !editText.trim()}\n className=\"px-3 py-1 rounded-lg text-xs font-medium bg-powder-blue-600 text-white hover:bg-powder-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n Save\n </button>\n <button\n onClick={onCancelEdit}\n className=\"px-3 py-1 rounded-lg text-xs font-medium text-slate-600 hover:bg-slate-100 transition-colors\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <p\n className=\"text-sm text-slate-700 whitespace-pre-wrap\"\n dangerouslySetInnerHTML={{ __html: formattedComment }}\n />\n )}\n\n {/* Attachments */}\n {comment.attachments && comment.attachments.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {comment.attachments.map((attachment: CommentAttachment, idx: number) => (\n <a\n key={idx}\n href={attachment.file_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1.5 px-2 py-1 rounded-lg bg-white border border-slate-200 text-xs text-slate-600 hover:border-slate-300 transition-colors\"\n >\n <Paperclip className=\"w-3 h-3\" />\n {attachment.file_name}\n </a>\n ))}\n </div>\n )}\n </div>\n\n {/* Replies */}\n {hasReplies && (\n <div className=\"mt-2\">\n <button\n onClick={() => setShowReplies(!showReplies)}\n className=\"flex items-center gap-1 text-xs text-slate-500 hover:text-slate-700 transition-colors\"\n >\n {showReplies ? (\n <ChevronDown className=\"w-3.5 h-3.5\" />\n ) : (\n <ChevronRight className=\"w-3.5 h-3.5\" />\n )}\n {comment.replies!.length} {comment.replies!.length === 1 ? 'reply' : 'replies'}\n </button>\n\n <AnimatePresence>\n {showReplies && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n className=\"mt-2 space-y-2\"\n >\n {comment.replies!.map((reply: MaintenanceComment) => (\n <CommentItem\n key={reply.id}\n comment={reply}\n currentUserId={currentUserId}\n isAgency={isAgency}\n onReply={onReply}\n onEdit={onEdit}\n onDelete={onDelete}\n editingId={editingId}\n editText={editText}\n setEditText={setEditText}\n onSaveEdit={onSaveEdit}\n onCancelEdit={onCancelEdit}\n isSubmitting={isSubmitting}\n canEdit={canEdit}\n depth={depth + 1}\n />\n ))}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )}\n </motion.div>\n )\n}\n","/**\n * HourPackageCard - Display remaining hours with progress bar\n */\n\nimport { motion } from 'framer-motion'\nimport { Clock, AlertTriangle } from 'lucide-react'\nimport { format } from 'date-fns'\nimport { enUS } from 'date-fns/locale'\nimport { cn } from '../utils/cn'\nimport type { HourPackage } from '@framed/core'\n\n// Utility function (originally from useTimeTracking)\nconst formatMinutesAsHours = (minutes: number): string => {\n const hours = Math.floor(minutes / 60)\n const remainingMinutes = minutes % 60\n if (hours === 0) return `${remainingMinutes}m`\n if (remainingMinutes === 0) return `${hours}h`\n return `${hours}h ${remainingMinutes}m`\n}\n\ninterface HourPackageCardProps {\n package: HourPackage\n showDetails?: boolean\n onClick?: () => void\n className?: string\n}\n\nexport const HourPackageCard = ({\n package: pkg,\n showDetails = false,\n onClick,\n className\n}: HourPackageCardProps) => {\n // Calculate percentage used\n const percentUsed = Math.min((pkg.used_minutes / pkg.total_minutes) * 100, 100)\n const percentRemaining = 100 - percentUsed\n\n // Status indicators\n const isLow = percentRemaining < 20\n const isDepleted = pkg.status === 'depleted' || percentRemaining <= 0\n const isExpired = pkg.status === 'expired'\n const isExpiringSoon = pkg.expires_at && new Date(pkg.expires_at) <= new Date(Date.now() + 30 * 24 * 60 * 60 * 1000)\n\n // Color based on status\n const getProgressColor = () => {\n if (isDepleted || isExpired) return 'bg-slate-400'\n if (isLow) return 'bg-amber-500'\n return 'bg-emerald-500'\n }\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n onClick={onClick}\n className={cn(\n 'p-4 rounded-xl border bg-white transition-all',\n onClick && 'cursor-pointer hover:border-powder-blue-300 hover:shadow-md',\n isDepleted || isExpired\n ? 'border-slate-200 opacity-60'\n : isLow\n ? 'border-amber-200'\n : 'border-slate-200',\n className\n )}\n >\n {/* Header */}\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n <div className={cn(\n 'w-8 h-8 rounded-lg flex items-center justify-center',\n isDepleted || isExpired\n ? 'bg-slate-100'\n : isLow\n ? 'bg-amber-100'\n : 'bg-emerald-100'\n )}>\n {isDepleted ? (\n <AlertTriangle className=\"w-4 h-4 text-slate-500\" />\n ) : isLow ? (\n <AlertTriangle className=\"w-4 h-4 text-amber-600\" />\n ) : (\n <Clock className=\"w-4 h-4 text-emerald-600\" />\n )}\n </div>\n <div>\n <h4 className=\"font-medium text-slate-900 text-sm\">{pkg.name}</h4>\n {showDetails && pkg.notes && (\n <p className=\"text-xs text-slate-500 truncate max-w-[200px]\">{pkg.notes}</p>\n )}\n </div>\n </div>\n\n {/* Status Badge */}\n {(isDepleted || isExpired || isLow) && (\n <span className={cn(\n 'px-2 py-0.5 rounded-full text-[10px] font-medium uppercase tracking-wider',\n isDepleted\n ? 'bg-slate-100 text-slate-600'\n : isExpired\n ? 'bg-red-100 text-red-600'\n : 'bg-amber-100 text-amber-700'\n )}>\n {isDepleted ? 'Depleted' : isExpired ? 'Expired' : 'Low'}\n </span>\n )}\n </div>\n\n {/* Progress Bar */}\n <div className=\"relative h-2 bg-slate-100 rounded-full overflow-hidden mb-3\">\n <motion.div\n initial={{ width: 0 }}\n animate={{ width: `${percentUsed}%` }}\n transition={{ duration: 0.5, ease: 'easeOut' }}\n className={cn('h-full rounded-full', getProgressColor())}\n />\n </div>\n\n {/* Stats */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <div>\n <p className=\"text-xs text-slate-500\">Remaining</p>\n <p className={cn(\n 'text-lg font-semibold',\n isDepleted || isExpired\n ? 'text-slate-400'\n : isLow\n ? 'text-amber-600'\n : 'text-emerald-600'\n )}>\n {formatMinutesAsHours(pkg.remaining_minutes)}\n </p>\n </div>\n <div className=\"h-8 w-px bg-slate-200\" />\n <div>\n <p className=\"text-xs text-slate-500\">Total</p>\n <p className=\"text-sm font-medium text-slate-700\">\n {formatMinutesAsHours(pkg.total_minutes)}\n </p>\n </div>\n </div>\n\n {/* Expiry */}\n {pkg.expires_at && showDetails && (\n <div className=\"text-right\">\n <p className=\"text-xs text-slate-500\">Expires</p>\n <p className={cn(\n 'text-sm font-medium',\n isExpiringSoon ? 'text-amber-600' : 'text-slate-600'\n )}>\n {format(new Date(pkg.expires_at), 'MMM d, yyyy', { locale: enUS })}\n </p>\n </div>\n )}\n </div>\n\n {/* Detailed stats if showDetails */}\n {showDetails && (\n <div className=\"mt-4 pt-4 border-t border-slate-100 grid grid-cols-3 gap-4\">\n <div>\n <p className=\"text-xs text-slate-500\">Used</p>\n <p className=\"text-sm font-medium text-slate-700\">\n {formatMinutesAsHours(pkg.used_minutes)}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-slate-500\">Progress</p>\n <p className=\"text-sm font-medium text-slate-700\">\n {Math.round(percentUsed)}%\n </p>\n </div>\n {pkg.price_cents && (\n <div>\n <p className=\"text-xs text-slate-500\">Value</p>\n <p className=\"text-sm font-medium text-slate-700\">\n €{(pkg.price_cents / 100).toFixed(2)}\n </p>\n </div>\n )}\n </div>\n )}\n </motion.div>\n )\n}\n\n/**\n * Compact version for header display\n */\ninterface HourPackageBadgeProps {\n packages: HourPackage[]\n onClick?: () => void\n}\n\nexport const HourPackageBadge = ({ packages, onClick }: HourPackageBadgeProps) => {\n // Calculate totals from active packages\n const activePackages = packages.filter(p => p.status === 'active')\n const totalRemaining = activePackages.reduce((sum, p) => sum + p.remaining_minutes, 0)\n const totalMinutes = activePackages.reduce((sum, p) => sum + p.total_minutes, 0)\n\n const percentRemaining = totalMinutes > 0 ? (totalRemaining / totalMinutes) * 100 : 0\n const isLow = percentRemaining < 20 && totalMinutes > 0\n const isEmpty = totalRemaining <= 0\n\n if (activePackages.length === 0) return null\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'flex items-center gap-2 px-3 py-1.5 rounded-lg text-sm font-medium transition-all',\n isEmpty\n ? 'bg-slate-100 text-slate-500'\n : isLow\n ? 'bg-amber-50 text-amber-700 border border-amber-200'\n : 'bg-emerald-50 text-emerald-700 border border-emerald-200'\n )}\n >\n <Clock className=\"w-4 h-4\" />\n <span>{formatMinutesAsHours(totalRemaining)}</span>\n {isLow && !isEmpty && (\n <AlertTriangle className=\"w-3.5 h-3.5\" />\n )}\n </button>\n )\n}\n","/**\n * useInternalNotes - Hook for managing internal agency notes\n *\n * This hook manages local state for internal notes while delegating\n * actual data operations to callbacks provided by the consuming application.\n *\n * Notes can be attached to projects or individual maintenance items.\n * Only agency users (admin, manager, super_admin) can see internal notes.\n *\n * Usage:\n * ```tsx\n * const { notes, addNote } = useInternalNotes({\n * projectId: 'my-project',\n * notableType: 'maintenance_item',\n * notableId: 'item-123',\n * onFetch: async () => await myApi.getNotes(notableType, notableId),\n * onAdd: async (body) => await myApi.createNote(body),\n * });\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport type { InternalNote } from '@framed/core'\n\n/**\n * Callback options for internal notes data operations\n */\ninterface UseInternalNotesCallbacks {\n /** Fetch all notes */\n onFetch?: () => Promise<InternalNote[]>\n /** Add a new note */\n onAdd?: (body: string) => Promise<InternalNote>\n /** Update a note */\n onUpdate?: (noteId: string, body: string) => Promise<InternalNote | void>\n /** Delete a note */\n onDelete?: (noteId: string) => Promise<void>\n /** Toggle pin status of a note */\n onTogglePin?: (noteId: string, isPinned: boolean) => Promise<InternalNote | void>\n}\n\ninterface UseInternalNotesOptions extends UseInternalNotesCallbacks {\n projectId: string\n notableType: 'project' | 'maintenance_item'\n notableId: string // project_id for project notes, item_id for item notes\n /** Initial notes (useful for SSR or cached data) */\n initialNotes?: InternalNote[]\n /** Auto-fetch on mount (default: true if onFetch is provided) */\n autoFetch?: boolean\n}\n\ninterface UseInternalNotesReturn {\n notes: InternalNote[]\n loading: boolean\n error: string | null\n addNote: (body: string) => Promise<InternalNote | null>\n updateNote: (noteId: string, body: string) => Promise<boolean>\n deleteNote: (noteId: string) => Promise<boolean>\n togglePin: (noteId: string) => Promise<boolean>\n refresh: () => Promise<void>\n setNotes: (notes: InternalNote[]) => void\n}\n\n/**\n * Hook for managing internal notes with callback-based data operations\n */\nexport const useInternalNotes = ({\n projectId,\n notableType,\n notableId,\n initialNotes = [],\n autoFetch = true,\n onFetch,\n onAdd,\n onUpdate,\n onDelete,\n onTogglePin,\n}: UseInternalNotesOptions): UseInternalNotesReturn => {\n const [notes, setNotes] = useState<InternalNote[]>(initialNotes)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const refresh = useCallback(async () => {\n if (!onFetch) {\n console.warn('useInternalNotes: onFetch callback not provided')\n return\n }\n\n setLoading(true)\n setError(null)\n\n try {\n const fetchedNotes = await onFetch()\n // Sort by pinned first, then by created_at descending\n const sortedNotes = [...fetchedNotes].sort((a, b) => {\n if (a.is_pinned && !b.is_pinned) return -1\n if (!a.is_pinned && b.is_pinned) return 1\n return new Date(b.created_at).getTime() - new Date(a.created_at).getTime()\n })\n setNotes(sortedNotes)\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch notes'\n setError(message)\n console.error('useInternalNotes: fetch error', err)\n } finally {\n setLoading(false)\n }\n }, [onFetch])\n\n // Fetch on mount if autoFetch is enabled\n useEffect(() => {\n if (autoFetch && onFetch && notableId) {\n refresh()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [notableId, autoFetch])\n\n const addNote = useCallback(async (body: string): Promise<InternalNote | null> => {\n if (!onAdd) {\n console.warn('useInternalNotes: onAdd callback not provided')\n return null\n }\n\n setError(null)\n\n try {\n const newNote = await onAdd(body)\n setNotes(prev => [newNote, ...prev])\n return newNote\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to add note'\n setError(message)\n console.error('useInternalNotes: add error', err)\n return null\n }\n }, [onAdd])\n\n const updateNote = useCallback(async (noteId: string, body: string): Promise<boolean> => {\n if (!onUpdate) {\n console.warn('useInternalNotes: onUpdate callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n const result = await onUpdate(noteId, body)\n setNotes(prev => prev.map(note => {\n if (note.id === noteId) {\n return result ? result : { ...note, body, updated_at: new Date().toISOString() }\n }\n return note\n }))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update note'\n setError(message)\n console.error('useInternalNotes: update error', err)\n return false\n }\n }, [onUpdate])\n\n const deleteNote = useCallback(async (noteId: string): Promise<boolean> => {\n if (!onDelete) {\n console.warn('useInternalNotes: onDelete callback not provided')\n return false\n }\n\n setError(null)\n\n try {\n await onDelete(noteId)\n setNotes(prev => prev.filter(note => note.id !== noteId))\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete note'\n setError(message)\n console.error('useInternalNotes: delete error', err)\n return false\n }\n }, [onDelete])\n\n const togglePin = useCallback(async (noteId: string): Promise<boolean> => {\n const note = notes.find(n => n.id === noteId)\n if (!note) return false\n\n const newPinnedState = !note.is_pinned\n\n // Use dedicated toggle callback if provided\n if (onTogglePin) {\n setError(null)\n try {\n const result = await onTogglePin(noteId, newPinnedState)\n setNotes(prev => {\n const updated = prev.map(n => {\n if (n.id === noteId) {\n return result ? result : { ...n, is_pinned: newPinnedState }\n }\n return n\n })\n // Re-sort after pin change\n return updated.sort((a, b) => {\n if (a.is_pinned && !b.is_pinned) return -1\n if (!a.is_pinned && b.is_pinned) return 1\n return new Date(b.created_at).getTime() - new Date(a.created_at).getTime()\n })\n })\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to toggle pin'\n setError(message)\n console.error('useInternalNotes: toggle pin error', err)\n return false\n }\n }\n\n // Fallback: update note via onUpdate if available\n if (onUpdate) {\n // Note: This is a bit awkward since onUpdate expects body, not is_pinned\n // In practice, the consuming app should provide onTogglePin for proper behavior\n console.warn('useInternalNotes: onTogglePin not provided, pin toggle may not work correctly')\n }\n\n return false\n }, [notes, onTogglePin, onUpdate])\n\n return {\n notes,\n loading,\n error,\n addNote,\n updateNote,\n deleteNote,\n togglePin,\n refresh,\n setNotes,\n }\n}\n\nexport type { UseInternalNotesOptions, UseInternalNotesReturn, UseInternalNotesCallbacks }\n"]}