-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patheslint-report.json
More file actions
1 lines (1 loc) · 102 KB
/
eslint-report.json
File metadata and controls
1 lines (1 loc) · 102 KB
1
[{"filePath":"C:\\Users\\ASUS\\keynotes\\drizzle.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\eslint.config.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\next.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\postcss.config.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\actions\\authActions.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\actions\\collaborationActions.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\actions\\noteActions.ts","messages":[],"suppressedMessages":[{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":73,"column":93,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":73,"endColumn":96,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[2808,2811],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[2808,2811],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":210,"column":59,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":210,"endColumn":62,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[7082,7085],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[7082,7085],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":271,"column":62,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":271,"endColumn":65,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[9149,9152],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[9149,9152],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":319,"column":66,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":319,"endColumn":69,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[10623,10626],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[10623,10626],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\actions\\subscribeAction.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\api\\auth\\[...nextauth]\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\api\\notes\\counts\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\api\\notes\\list\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\api\\notes\\updates\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\api\\realtime\\health\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\api\\realtime\\notes\\route.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\dashboard\\layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\dashboard\\page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\notes\\[noteId]\\page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\notes\\page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\app\\page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\AnimatedHeroText.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\AuthButton.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\AuthProvider.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ClientProviders.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ConditionalFooter.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ConditionalHeader.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\CreateNoteButton.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\DashboardHeader.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\DashboardUserNav.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\DatabaseError.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\GetStartedButton.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\Header.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\HelpFAB.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\LocalSplashCursor.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\Spinner.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\SplashCursor.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\SplineBackground.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ThemeProvider.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ThemeToggleButton.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\UserNav.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\auth\\AuthDialog.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\auth\\LoginForm.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\auth\\RegisterForm.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\collaboration\\ShareDialog.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\dashboard\\RecentNotes.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\landing\\EmailSignupForm.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\landing\\FeatureShowcase.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\landing\\Features.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\landing\\Footer.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\landing\\SocialProof.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\navigation\\Navigation.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\notes\\BlockNoteClient.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\notes\\CreateNoteForm.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\notes\\NoteCard.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\notes\\NoteEditor.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\notes\\NoteEditorModal.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\notes\\NoteUpdatesListener.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\notes\\NotesClientPage.tsx","messages":[{"ruleId":"react-hooks/exhaustive-deps","severity":1,"message":"React Hook useEffect has missing dependencies: 'notes' and 'sharedNotes'. Either include them or remove the dependency array.","line":52,"column":6,"nodeType":"ArrayExpression","endLine":52,"endColumn":35,"suggestions":[{"desc":"Update the dependencies array to be: [initialNotes, initialShared, notes, sharedNotes]","fix":{"range":[2480,2509],"text":"[initialNotes, initialShared, notes, sharedNotes]"}}]}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":" 'use client'\r\n\r\nimport { useState, useEffect, useRef, useMemo } from 'react'\r\nimport { useSearchParams } from 'next/navigation'\r\nimport { DndContext, DragEndEvent } from '@dnd-kit/core'\r\nimport { SortableContext, arrayMove, rectSortingStrategy } from '@dnd-kit/sortable'\r\nimport { useRouter } from 'next/navigation'\r\nimport { matchSorter } from 'match-sorter'\r\nimport Navigation from '@/components/navigation/Navigation'\r\nimport NoteCard from '@/components/notes/NoteCard'\r\nimport CreateNoteForm from '@/components/notes/CreateNoteForm'\r\nimport { ThemeToggleButton } from '@/components/ThemeToggleButton'\r\nimport { updateNoteOrder } from '@/app/actions/noteActions'\r\n// Note: drag-and-drop ordering has been removed from this component so sorting/searching can be handled client-side\r\n\r\nimport { NoteSummary } from '@/types/note'\r\nimport { unwrapEventPayload } from '@/lib/hooks/eventPayload'\r\n\r\ninterface NotesClientPageProps {\r\n initialNotes: NoteSummary[]\r\n sharedNotes?: NoteSummary[]\r\n}\r\n \r\n\r\n// Local note types used across the component\r\ntype Note = NotesClientPageProps['initialNotes'][number]\r\n// GroupedNotes type intentionally removed; we infer structure from returned object in useMemo\r\n\r\nexport default function NotesClientPage({ initialNotes, sharedNotes: initialShared }: NotesClientPageProps) {\r\n // Don't sort initially - maintain original order and handle pinned/unpinned separately\r\n const [notes, setNotes] = useState<Note[]>(initialNotes)\r\n const [sharedNotes, setSharedNotes] = useState<Note[]>(initialShared || [])\r\n const [searchQuery, setSearchQuery] = useState('')\r\n // mounted state not used; removed to satisfy lint\r\n const [editingNoteId, setEditingNoteId] = useState<string | null>(null)\r\n const [autoFocusNoteId, setAutoFocusNoteId] = useState<string | null>(null)\r\n const notesContainerRef = useRef<HTMLDivElement>(null)\r\n const [isMounted, setIsMounted] = useState(false)\r\n\r\n // (no-op) keep mount logic earlier; skip debug warnings in production\r\n\r\n // Ensure client state is populated from server props on mount in case of hydration mismatch\r\n // We intentionally only want to run this on mount to sync server-provided lists once.\r\n \r\n useEffect(() => {\r\n if ((!notes || notes.length === 0) && initialNotes && initialNotes.length > 0) {\r\n setNotes(initialNotes)\r\n }\r\n if ((!sharedNotes || sharedNotes.length === 0) && initialShared && initialShared.length > 0) {\r\n setSharedNotes(initialShared)\r\n }\r\n }, [initialNotes, initialShared])\r\n\r\n // Centralized click outside logic\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Element\r\n \r\n // Don't close if clicking inside the reminder modal\r\n if (target.closest('[data-reminder-modal=\"true\"]')) {\r\n return\r\n }\r\n \r\n // Don't close if clicking inside the note editor modal\r\n if (target.closest('[data-note-editor-modal=\"true\"]')) {\r\n return\r\n }\r\n \r\n // Check if click is outside the notes container and a note is being edited\r\n if (\r\n editingNoteId && \r\n notesContainerRef.current && \r\n !notesContainerRef.current.contains(event.target as Node)\r\n ) {\r\n setEditingNoteId(null)\r\n }\r\n }\r\n\r\n // Add event listener\r\n document.addEventListener('mousedown', handleClickOutside)\r\n\r\n // Cleanup function to remove event listener\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside)\r\n }\r\n }, [editingNoteId]) // Dependency on editingNoteId to re-run when it changes\r\n\r\n // Function to handle note creation\r\n const handleNoteCreated = (newNote: Note) => {\r\n // Clear any active search so the new note appears in the default list\r\n setSearchQuery('')\r\n\r\n // Remove q param from URL (keep other params)\r\n try {\r\n const params = new URLSearchParams(searchParams?.toString() || '')\r\n params.delete('q')\r\n const url = `${typeof window !== 'undefined' ? window.location.pathname : '/notes'}?${params.toString()}`\r\n router.replace(url)\r\n } catch {}\r\n\r\n // Prepend the new note to the client list\r\n setNotes((prevNotes: Note[]) => [newNote, ...prevNotes])\r\n\r\n // Open the note editor for the newly created note and request autofocus\r\n setEditingNoteId(newNote.id)\r\n setAutoFocusNoteId(newNote.id)\r\n // Clear the auto focus marker after a short delay so it won't re-trigger later\r\n setTimeout(() => setAutoFocusNoteId(null), 1500)\r\n\r\n // Scroll the notes container to the top so the created note is visible\r\n setTimeout(() => {\r\n try {\r\n if (notesContainerRef.current) {\r\n notesContainerRef.current.scrollTop = 0\r\n // If first child exists, ensure it's visible\r\n const first = notesContainerRef.current.querySelector('[data-note-id]') as HTMLElement | null\r\n if (first) first.scrollIntoView({ behavior: 'smooth', block: 'start' })\r\n }\r\n } catch {}\r\n }, 50)\r\n }\r\n\r\n // Subscribe to server-sent events for real-time updates (richer payloads)\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return\r\n let es: EventSource | null = null\r\n try {\r\n // Use the canonical Redis-backed SSE endpoint\r\n es = new EventSource('/api/notes/updates')\r\n es.addEventListener('message', async (ev: MessageEvent) => {\r\n try {\r\n const payload: unknown = (() => {\r\n try { return JSON.parse(typeof ev.data === 'string' ? ev.data : JSON.stringify(ev.data)) as unknown } catch { return ev.data as unknown }\r\n })()\r\n\r\n const maybe = unwrapEventPayload(payload)\r\n const b = maybe\r\n if (!b) {\r\n // Unknown payload ΓÇö fallback to refreshing lists\r\n try {\r\n const res = await fetch('/api/notes/list')\r\n if (!res.ok) return\r\n const data = await res.json()\r\n if (data.ownedNotes) setNotes(data.ownedNotes)\r\n if (data.sharedNotes) setSharedNotes(data.sharedNotes)\r\n } catch {}\r\n return\r\n }\r\n const isNoteSummary = (v: unknown): v is NoteSummary => {\r\n return !!v && typeof v === 'object' && typeof ((v as Record<string, unknown>).id) === 'string'\r\n }\r\n\r\n switch (b.type) {\r\n case 'noteCreated': {\r\n const note = b.note\r\n if (isNoteSummary(note)) {\r\n const ns = note\r\n setNotes((prev) => {\r\n // If note already exists, merge fields; otherwise prepend\r\n if (prev.some(n => n.id === ns.id)) {\r\n return prev.map(n => n.id === ns.id ? { ...n, ...ns } : n)\r\n }\r\n return [ns, ...prev]\r\n })\r\n }\r\n break\r\n }\r\n case 'noteUpdated': {\r\n const note = b.note\r\n if (note) {\r\n setNotes((prev) => prev.map(n => n.id === note.id ? { ...n, ...note } : n))\r\n setSharedNotes((prev) => prev.map(n => n.id === note.id ? { ...n, ...note } : n))\r\n }\r\n break\r\n }\r\n case 'noteDeleted': {\r\n const id = b.noteId\r\n if (id) {\r\n setNotes((prev) => prev.filter(n => n.id !== id))\r\n setSharedNotes((prev) => prev.filter(n => n.id !== id))\r\n }\r\n break\r\n }\r\n case 'notesReordered': {\r\n // If the current user is the author, and we received noteIds, we can reorder locally by fetching minimal metadata\r\n try {\r\n const res = await fetch('/api/notes/list')\r\n if (!res.ok) break\r\n const data = await res.json()\r\n if (data.ownedNotes) setNotes(data.ownedNotes)\r\n } catch {}\r\n break\r\n }\r\n default: {\r\n // Unknown payload: conservative approach ΓÇö refresh lists\r\n try {\r\n const res = await fetch('/api/notes/list')\r\n if (!res.ok) return\r\n const data = await res.json()\r\n if (data.ownedNotes) setNotes(data.ownedNotes)\r\n if (data.sharedNotes) setSharedNotes(data.sharedNotes)\r\n } catch {}\r\n }\r\n }\r\n } catch {\r\n // On parse error, fallback to full fetch\r\n try {\r\n const res = await fetch('/api/notes/list')\r\n if (!res.ok) return\r\n const data = await res.json()\r\n if (data.ownedNotes) setNotes(data.ownedNotes)\r\n if (data.sharedNotes) setSharedNotes(data.sharedNotes)\r\n } catch {}\r\n }\r\n })\r\n } catch {\r\n // If EventSource is unavailable, gracefully degrade to polling (kept from previous behavior)\r\n let mounted = true\r\n const fetchList = async () => {\r\n try {\r\n const res = await fetch('/api/notes/list')\r\n if (!res.ok) return\r\n const data = await res.json()\r\n if (!mounted) return\r\n if (data.ownedNotes) setNotes(data.ownedNotes)\r\n if (data.sharedNotes) setSharedNotes(data.sharedNotes)\r\n } catch {}\r\n }\r\n fetchList()\r\n const id = setInterval(fetchList, 5000)\r\n return () => { mounted = false; clearInterval(id) }\r\n }\r\n\r\n return () => {\r\n try { es?.close() } catch {}\r\n }\r\n }, [])\r\n\r\n // Function to handle note deletion from client state\r\n const handleNoteDeleted = (deletedNoteId: string) => {\r\n setNotes((prevNotes: Note[]) => prevNotes.filter((note: Note) => note.id !== deletedNoteId))\r\n }\r\n\r\n // Function to handle note updates (like pin status changes)\r\n const handleNoteUpdated = (updatedNoteId: string, updates: Partial<Note>) => {\r\n setNotes((prevNotes: Note[]) => {\r\n // If the update marks the note as archived, remove it from the current list\r\n if (updates.is_archived) {\r\n return prevNotes.filter((note: Note) => note.id !== updatedNoteId)\r\n }\r\n return prevNotes.map((note: Note) => \r\n note.id === updatedNoteId ? { ...note, ...updates } : note\r\n )\r\n })\r\n }\r\n\r\n // Drag-and-drop handlers removed in favor of client-side sorting and searching\r\n // We keep local search state (controlled SearchBar) so searching doesn't require modifying the URL\r\n // still expose useSearchParams for other uses if needed\r\n const searchParams = useSearchParams()\r\n const initialQ = searchParams?.get('q') ?? ''\r\n\r\n useEffect(() => {\r\n // initialize local query from URL on mount and keep it in sync when the URL changes\r\n // (set even when empty so clearing the search in the sidebar updates the page)\r\n setSearchQuery(initialQ)\r\n setIsMounted(true)\r\n }, [initialQ])\r\n\r\n const router = useRouter()\r\n\r\n // Sync searchQuery to URL q param whenever it changes (replace so history isn't cluttered)\r\n useEffect(() => {\r\n const params = new URLSearchParams(searchParams?.toString() || '')\r\n if (searchQuery) params.set('q', searchQuery)\r\n else params.delete('q')\r\n const url = `${typeof window !== 'undefined' ? window.location.pathname : '/notes'}?${params.toString()}`\r\n router.replace(url)\r\n }, [searchQuery, router, searchParams])\r\n\r\n const grouped = useMemo(() => {\r\n const query = searchQuery.trim().toLowerCase()\r\n\r\n // Local note type\r\n type Note = NotesClientPageProps['initialNotes'][number]\r\n type NoteWithMatch = Note & { matchCount?: number }\r\n\r\n // Helper to extract searchable text from content\r\n const extractText = (content: unknown) => {\r\n try {\r\n if (!content) return ''\r\n if (typeof content === 'string') {\r\n try {\r\n const parsed = JSON.parse(content)\r\n if (Array.isArray(parsed)) {\r\n return parsed\r\n .map((block: unknown) => {\r\n const b = block as { content?: unknown }\r\n if (!b.content) return ''\r\n if (typeof b.content === 'string') return b.content\r\n if (Array.isArray(b.content)) return (b.content as Array<{ text?: string }>).map((c) => (c && typeof c.text === 'string' ? c.text : '')).join('')\r\n return ''\r\n })\r\n .join(' ')\r\n }\r\n } catch {\r\n return content\r\n }\r\n }\r\n if (Array.isArray(content)) {\r\n return content\r\n .map((block: unknown) => {\r\n const b = block as { content?: unknown }\r\n if (!b.content) return ''\r\n if (typeof b.content === 'string') return b.content\r\n if (Array.isArray(b.content)) return (b.content as Array<{ text?: string }>).map((c) => (c && typeof c.text === 'string' ? c.text : '')).join('')\r\n return ''\r\n })\r\n .join(' ')\r\n }\r\n return ''\r\n } catch {\r\n return ''\r\n }\r\n }\r\n\r\n // Partition notes into pinned, matches, and rest maintaining relative order within groups\r\n const pinned: NoteWithMatch[] = []\r\n const matches: NoteWithMatch[] = []\r\n const rest: NoteWithMatch[] = []\r\n\r\n // Separate pinned and unpinned first\r\n const unpinned = notes.filter(n => !n.is_pinned)\r\n for (const note of notes) {\r\n if (note.is_pinned) pinned.push(note)\r\n }\r\n\r\n if (!query) {\r\n // No search: keep original relative order\r\n rest.push(...unpinned)\r\n return { pinned, matches, rest, all: [...pinned, ...rest] }\r\n }\r\n\r\n // Use matchSorter to rank all notes fuzzily\r\n const rankedAll = matchSorter<Note>(notes as Note[], query, {\r\n keys: ['title', (item: Note) => extractText(item.content)],\r\n }) as Note[]\r\n\r\n // Build rank index map so earlier items have higher contribution\r\n const rankIndex = new Map<string, number>()\r\n rankedAll.forEach((n, i) => rankIndex.set(n.id, i))\r\n\r\n // compute match counts and base fuzzy score\r\n const terms = query.split(/\\s+/).filter(Boolean)\r\n const matchCountMap = new Map<string, number>()\r\n const fuzzyScoreMap = new Map<string, number>()\r\n for (const n of notes) {\r\n const hay = (n.title || '') + ' ' + extractText(n.content)\r\n const lower = hay.toLowerCase()\r\n let count = 0\r\n for (const t of terms) {\r\n const tn = t.toLowerCase()\r\n let idx = lower.indexOf(tn)\r\n while (idx !== -1) {\r\n count++\r\n idx = lower.indexOf(tn, idx + tn.length)\r\n }\r\n }\r\n matchCountMap.set(n.id, count)\r\n const idx = rankIndex.has(n.id) ? rankIndex.get(n.id)! : rankedAll.length\r\n // higher fuzzy score for earlier rank (invert index)\r\n fuzzyScoreMap.set(n.id, Math.max(0, rankedAll.length - idx))\r\n }\r\n\r\n // Weighted ranking: pinned weight + fuzzy score + title bonus + match count\r\n const PIN_WEIGHT = 200\r\n const TITLE_BONUS = 50\r\n\r\n // Build combined ranking using notes with matchCount attached\r\n const combined = notes.map(n => {\r\n const fuzzy = fuzzyScoreMap.get(n.id) ?? 0\r\n const count = matchCountMap.get(n.id) ?? 0\r\n const noteWithMatch: NoteWithMatch = { ...(n as Note), matchCount: count }\r\n const title = (n.title || '').toLowerCase()\r\n const isTitleMatch = terms.some(t => title.includes(t)) ? TITLE_BONUS : 0\r\n const pin = n.is_pinned ? PIN_WEIGHT : 0\r\n const score = pin + fuzzy + isTitleMatch + count\r\n return { note: noteWithMatch, score }\r\n }).sort((a, b) => b.score - a.score)\r\n\r\n // Build ordered arrays\r\n const combinedNotes = combined.map(c => c.note)\r\n // split combinedNotes into matches (count>0) and rest\r\n for (const n of combinedNotes) {\r\n const note = n as NoteWithMatch\r\n if ((note.matchCount ?? 0) > 0) matches.push(note)\r\n else rest.push(note)\r\n }\r\n\r\n return { pinned, matches, rest, combined: combinedNotes, all: combinedNotes }\r\n }, [notes, searchQuery])\r\n\r\n // Drag end - only allow reordering within the same group (pinned vs unpinned)\r\n const handleDragEnd = async (event: DragEndEvent) => {\r\n const { active, over } = event\r\n if (!over || active.id === over.id) return\r\n\r\n const activeIndex = notes.findIndex(n => n.id === active.id)\r\n const overIndex = notes.findIndex(n => n.id === over.id)\r\n if (activeIndex === -1 || overIndex === -1) return\r\n\r\n const activeNote = notes[activeIndex]\r\n const overNote = notes[overIndex]\r\n\r\n const activeGroup = Boolean(activeNote.is_pinned)\r\n const overGroup = Boolean(overNote.is_pinned)\r\n\r\n // Only allow reordering within the same group\r\n if (activeGroup !== overGroup) return\r\n\r\n // Compute new notes array with the moved item\r\n const newNotes = arrayMove(notes, activeIndex, overIndex)\r\n setNotes(newNotes)\r\n\r\n // Persist new positions (using overall index as position)\r\n const notesWithNewPositions = newNotes.map((note, idx) => ({ id: note.id, position: idx }))\r\n\r\n try {\r\n await updateNoteOrder(notesWithNewPositions)\r\n } catch {\r\n // Revert on error\r\n setNotes(notes)\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"fixed inset-0 bg-background\">\r\n {/* debug UI removed */}\r\n\r\n {/* Top Right Theme Toggle */}\r\n <div className=\"fixed top-4 right-4 z-50\">\r\n <ThemeToggleButton />\r\n </div>\r\n\r\n <Navigation>\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <h1 className=\"text-3xl font-bold\">My Notes</h1>\r\n </div>\r\n\r\n {/* Create Note Form */}\r\n <CreateNoteForm onNoteCreated={handleNoteCreated} />\r\n\r\n {/* Notes grid (pinned, search results, other notes) */}\r\n <div ref={notesContainerRef} className=\"space-y-6\" suppressHydrationWarning>\r\n {/* Shared notes section (notes shared with the current user) */}\r\n {sharedNotes && sharedNotes.length > 0 && (\r\n <div>\r\n <h3 className=\"px-2 text-xs text-muted-foreground\">Shared with you</h3>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\r\n {sharedNotes.filter((s) => s && s.id).map((n: NoteSummary, idx: number) => (\r\n <div key={n.id ?? `shared-${idx}`} data-note-id={n.id}>\r\n <NoteCard\r\n note={n}\r\n isEditing={editingNoteId === n.id}\r\n onToggleEdit={setEditingNoteId}\r\n onNoteDeleted={handleNoteDeleted}\r\n onNoteUpdated={handleNoteUpdated}\r\n highlight={searchQuery}\r\n matchCount={0}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n {notes.length === 0 ? (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-muted-foreground text-lg\">You have no notes yet. Create one!</p>\r\n </div>\r\n ) : (\r\n isMounted ? (\r\n <DndContext onDragEnd={handleDragEnd}>\r\n <section className=\"space-y-3\">\r\n {searchQuery ? (\r\n // Searching: show only notes that actually match the query\r\n <div>\r\n <h3 className=\"px-2 text-xs text-muted-foreground\">Results</h3>\r\n {(!grouped.matches || grouped.matches.length === 0) ? (\r\n <div className=\"px-2 py-6 text-sm text-muted-foreground\">No results</div>\r\n ) : (\r\n <SortableContext items={(grouped.matches || []).map(n => n.id)} strategy={rectSortingStrategy}>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\r\n {(grouped.matches || []).map(n => (\r\n <div key={n.id} data-note-id={n.id}>\r\n <NoteCard\r\n note={n}\r\n isEditing={editingNoteId === n.id}\r\n onToggleEdit={setEditingNoteId}\r\n onNoteDeleted={handleNoteDeleted}\r\n onNoteUpdated={handleNoteUpdated}\r\n highlight={searchQuery}\r\n matchCount={n.matchCount}\r\n autoFocus={autoFocusNoteId === n.id}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n </SortableContext>\r\n )}\r\n </div>\r\n ) : (\r\n // Not searching: show pinned then other notes\r\n <div>\r\n {grouped.pinned.length > 0 && (\r\n <section className=\"mb-6\">\r\n <h3 className=\"px-2 text-xs text-muted-foreground\">Pinned</h3>\r\n <SortableContext items={grouped.pinned.map(n => n.id)} strategy={rectSortingStrategy}>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\r\n {grouped.pinned.map(n => (\r\n <div key={n.id} data-note-id={n.id}>\r\n <NoteCard\r\n note={n}\r\n isEditing={editingNoteId === n.id}\r\n onToggleEdit={setEditingNoteId}\r\n onNoteDeleted={handleNoteDeleted}\r\n onNoteUpdated={handleNoteUpdated}\r\n highlight={searchQuery}\r\n matchCount={n.matchCount}\r\n autoFocus={autoFocusNoteId === n.id}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n </SortableContext>\r\n </section>\r\n )}\r\n\r\n {grouped.rest.length > 0 && (\r\n <section>\r\n <h3 className=\"px-2 text-sm font-medium text-muted-foreground\">All notes</h3>\r\n <SortableContext items={grouped.rest.map(n => n.id)} strategy={rectSortingStrategy}>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\r\n {grouped.rest.map(n => (\r\n <div key={n.id} data-note-id={n.id}>\r\n <NoteCard\r\n note={n}\r\n isEditing={editingNoteId === n.id}\r\n onToggleEdit={setEditingNoteId}\r\n onNoteDeleted={handleNoteDeleted}\r\n onNoteUpdated={handleNoteUpdated}\r\n autoFocus={autoFocusNoteId === n.id}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n </SortableContext>\r\n </section>\r\n )}\r\n </div>\r\n )}\r\n </section>\r\n </DndContext>\r\n ) : (\r\n // Non-interactive fallback during SSR / before client mount\r\n <section className=\"space-y-3\">\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\r\n {notes.map(n => (\r\n <div key={n.id} className=\"p-3 border rounded bg-card\">\r\n <div className=\"font-semibold\">{n.title || 'Untitled'}</div>\r\n <div className=\"text-sm text-muted-foreground\">{(n.content && typeof n.content === 'string') ? (n.content.slice(0, 100)) : ''}</div>\r\n </div>\r\n ))}\r\n </div>\r\n </section>\r\n )\r\n )}\r\n </div>\r\n </div>\r\n </Navigation>\r\n </div>\r\n )\r\n}","usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\notes\\ReminderPicker.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\search\\SearchBar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\avatar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\button.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\carousel.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\dialog.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\dropdown-menu.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\form.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\input.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\label.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\popover.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\skeleton.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\textarea.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\toast.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\toaster.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\components\\ui\\visually-hidden.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\hooks\\use-toast.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\auth.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\db\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\db\\schema\\collaborators.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\db\\schema\\documents.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\db\\schema\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\db\\schema\\subscribers.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\db\\schema\\users.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\db\\schema\\workspace_members.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\db\\schema\\workspaces.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\hooks\\eventPayload.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\hooks\\useNoteUpdates.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\hooks\\useOnClickOutside.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\notesSync.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\realtime.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\redis.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\lib\\utils.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\types\\match-sorter.d.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\types\\next-auth.d.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\src\\types\\note.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\tailwind.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"C:\\Users\\ASUS\\keynotes\\vitest.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]}]