Phase 1: NoteEditor Split (64KB → 9 focused components) - components/note-editor/: types.ts, context, toolbar, title-block, content-area, metadata-section, full-page, dialog compositions - Maintains backwards compatibility via re-export from note-editor.tsx Phase 2: Context Consolidation (5 → 3 contexts) - NotebooksContext absorbs LabelContext (labels CRUD) - EditorUIContext merges HomeViewContext + NotebookDragContext - Removed: LabelContext, home-view-context, notebook-drag-context Phase 3: React Query Infrastructure - Added QueryProvider with @tanstack/react-query - lib/query-keys.ts: centralized query key definitions - lib/query-hooks.ts: useNotes, useNotebooksQuery, useLabelsQuery - lib/use-refresh.ts: hybrid invalidateQueries + triggerRefresh helper - NotebooksContext: invalidateQueries on mutations (with triggerRefresh fallback) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
59 lines
1.4 KiB
TypeScript
59 lines
1.4 KiB
TypeScript
'use client'
|
|
|
|
import { Badge } from '@/components/ui/badge'
|
|
import { X } from 'lucide-react'
|
|
import { cn } from '@/lib/utils'
|
|
import { LABEL_COLORS } from '@/lib/types'
|
|
import { useNotebooks } from '@/context/notebooks-context'
|
|
|
|
interface LabelBadgeProps {
|
|
label: string
|
|
onRemove?: () => void
|
|
variant?: 'default' | 'filter' | 'clickable'
|
|
onClick?: () => void
|
|
isSelected?: boolean
|
|
isDisabled?: boolean
|
|
}
|
|
|
|
export function LabelBadge({
|
|
label,
|
|
onRemove,
|
|
variant = 'default',
|
|
onClick,
|
|
isSelected = false,
|
|
isDisabled = false,
|
|
}: LabelBadgeProps) {
|
|
const { getLabelColor } = useNotebooks()
|
|
const colorName = getLabelColor(label)
|
|
const colorClasses = LABEL_COLORS[colorName] || LABEL_COLORS.gray
|
|
|
|
return (
|
|
<Badge
|
|
className={cn(
|
|
'text-xs border gap-1',
|
|
colorClasses.bg,
|
|
colorClasses.text,
|
|
colorClasses.border,
|
|
variant === 'filter' && 'cursor-pointer hover:opacity-80',
|
|
variant === 'clickable' && 'cursor-pointer',
|
|
isDisabled && 'opacity-50',
|
|
isSelected && 'ring-2 ring-primary'
|
|
)}
|
|
onClick={onClick}
|
|
>
|
|
{label}
|
|
{onRemove && (
|
|
<button
|
|
onClick={(e) => {
|
|
e.stopPropagation()
|
|
onRemove()
|
|
}}
|
|
className="hover:text-red-600"
|
|
>
|
|
<X className="h-3 w-3" />
|
|
</button>
|
|
)}
|
|
</Badge>
|
|
)
|
|
}
|