kanbase 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kanbase.umd.js","sources":["../src/lib/utils/utils.ts","../src/lib/store/use-kanban-store.ts","../src/lib/hooks/use-kanban.ts","../src/lib/hooks/use-kanban-dnd.ts","../src/lib/utils/filter-evaluator.ts","../src/lib/utils/cn.ts","../src/lib/components/default/default-card.tsx","../src/lib/components/default/default-column-empty.tsx","../src/lib/components/default/default-column-header.tsx","../src/components/ui/dialog.tsx","../src/components/ui/button.tsx","../src/lib/components/default/default-edit-form.tsx","../src/lib/components/default/default-card-view.tsx","../src/lib/components/filter-chips.tsx","../src/lib/hooks/use-kanban-column.ts","../src/lib/components/add-card-button.tsx","../src/lib/components/kanban-card.tsx","../src/lib/components/kanban-column.tsx","../src/components/ui/sheet.tsx","../src/lib/components/filter-group.tsx","../src/lib/utils/data-discovery.ts","../src/lib/components/kanban-filter-drawer.tsx","../src/lib/components/default/default-add-card-form.tsx","../src/lib/components/default/default-edit-column-form.tsx","../src/lib/components/kanboom-board.tsx","../src/lib/store/selectors.ts","../src/lib/benchmark/fps-monitor.tsx"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\nimport type {\n KanboomCard,\n KanboomColumn,\n KanboomData,\n KanboomConfig,\n KanbanFilters,\n FilterGroup\n} from '../types/kanban';\n\nexport interface KanbanStore extends KanboomData {\n config: KanboomConfig;\n activeId: string | null;\n viewingCardId: string | null;\n editingCardId: string | null;\n addingCardInColumnId: string | null; // For \"Add Card\" modal\n editingColumnId: string | null; // For \"Edit Column\" modal\n\n // === CARDS ===\n addCard: (columnId: string, card: Omit<KanboomCard, 'id'>) => string;\n updateCard: (cardId: string, updates: Partial<KanboomCard>) => void;\n deleteCard: (cardId: string) => void;\n duplicateCard: (cardId: string) => string;\n\n // === COLUMNS ===\n addColumn: (column: Omit<KanboomColumn, 'id' | 'cardIds'>, position?: number) => string;\n updateColumn: (columnId: string, updates: Partial<KanboomColumn>) => void;\n deleteColumn: (columnId: string, moveCardsTo?: string) => void;\n\n // === MOVEMENT ===\n moveCard: (\n cardId: string,\n sourceColId: string,\n targetColId: string,\n newIndex: number\n ) => void;\n moveColumn: (columnId: string, newIndex: number) => void;\n addColumnWithCard: (cardId: string, sourceColId: string, columnData: Omit<KanboomColumn, 'id' | 'cardIds'>) => void;\n\n // === FILTERS ===\n filters: KanbanFilters;\n setSearchQuery: (query: string) => void;\n addFilterGroup: (group: FilterGroup) => void;\n updateFilterGroup: (groupId: string, updates: Partial<FilterGroup>) => void;\n removeFilterGroup: (groupId: string) => void;\n removeFilterRule: (groupId: string, ruleId: string) => void;\n setFilters: (filters: KanbanFilters) => void;\n clearFilters: () => void;\n\n // === UTILITY ===\n setBoardData: (data: KanboomData) => void;\n setConfig: (config: Partial<KanboomConfig>) => void;\n setActiveId: (id: string | null) => void;\n setViewingCardId: (id: string | null) => void;\n clearViewingCardId: () => void;\n setEditingCardId: (id: string | null) => void;\n clearEditingCardId: () => void;\n setAddingCardInColumnId: (id: string | null) => void;\n clearAddingCardInColumnId: () => void;\n setEditingColumnId: (id: string | null) => void;\n clearEditingColumnId: () => void;\n clearBoard: () => void;\n}\n\nconst generateId = () => `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\nexport const useKanbanStore = create<KanbanStore>()(\n devtools((set) => ({\n cards: {},\n columns: {},\n columnOrder: [],\n config: {},\n activeId: null,\n viewingCardId: null,\n editingCardId: null,\n addingCardInColumnId: null,\n editingColumnId: null,\n\n // Initial Filter State\n filters: {\n searchQuery: '',\n groups: [],\n quickFilters: []\n },\n\n // === CARDS ===\n addCard: (columnId, cardData) => {\n const cardId = generateId();\n const newCard: KanboomCard = {\n id: cardId,\n ...cardData,\n };\n\n set((state) => {\n const column = state.columns[columnId];\n if (!column) return state;\n\n return {\n cards: { ...state.cards, [cardId]: newCard },\n columns: {\n ...state.columns,\n [columnId]: {\n ...column,\n cardIds: [...column.cardIds, cardId],\n },\n },\n };\n });\n\n return cardId;\n },\n\n updateCard: (cardId, updates) =>\n set((state) => {\n const card = state.cards[cardId];\n if (!card) return state;\n\n return {\n cards: {\n ...state.cards,\n [cardId]: { ...card, ...updates },\n },\n };\n }),\n\n deleteCard: (cardId) =>\n set((state) => {\n const { [cardId]: deletedCard, ...remainingCards } = state.cards;\n\n const updatedColumns = { ...state.columns };\n Object.keys(updatedColumns).forEach((colId) => {\n updatedColumns[colId] = {\n ...updatedColumns[colId],\n cardIds: updatedColumns[colId].cardIds.filter((id) => id !== cardId),\n };\n });\n\n return {\n cards: remainingCards,\n columns: updatedColumns,\n };\n }),\n\n duplicateCard: (cardId) => {\n let newCardId = '';\n\n set((state) => {\n const card = state.cards[cardId];\n if (!card) return state;\n\n const columnId = Object.keys(state.columns).find((colId) =>\n state.columns[colId].cardIds.includes(cardId)\n );\n\n if (!columnId) return state;\n\n newCardId = generateId();\n const duplicatedCard: KanboomCard = {\n ...card,\n id: newCardId,\n title: `${card.title} (copy)`,\n };\n\n const column = state.columns[columnId];\n const cardIndex = column.cardIds.indexOf(cardId);\n\n const newCardIds = [...column.cardIds];\n newCardIds.splice(cardIndex + 1, 0, newCardId);\n\n return {\n cards: { ...state.cards, [newCardId]: duplicatedCard },\n columns: {\n ...state.columns,\n [columnId]: {\n ...column,\n cardIds: newCardIds,\n },\n },\n };\n });\n\n return newCardId;\n },\n\n // === COLUMNS ===\n addColumn: (columnData, position) => {\n const columnId = generateId();\n const newColumn: KanboomColumn = {\n id: columnId,\n ...columnData,\n cardIds: [],\n };\n\n set((state) => {\n const newColumnOrder = [...state.columnOrder];\n const insertPosition = position ?? newColumnOrder.length;\n newColumnOrder.splice(insertPosition, 0, columnId);\n\n return {\n columns: { ...state.columns, [columnId]: newColumn },\n columnOrder: newColumnOrder,\n };\n });\n\n return columnId;\n },\n\n updateColumn: (columnId, updates) =>\n set((state) => {\n const column = state.columns[columnId];\n if (!column) return state;\n\n return {\n columns: {\n ...state.columns,\n [columnId]: { ...column, ...updates },\n },\n };\n }),\n\n deleteColumn: (columnId, moveCardsTo) =>\n set((state) => {\n const column = state.columns[columnId];\n if (!column) return state;\n\n const { [columnId]: deletedColumn, ...remainingColumns } = state.columns;\n const newColumnOrder = state.columnOrder.filter((id) => id !== columnId);\n\n let updatedCards = { ...state.cards };\n let updatedColumns = { ...remainingColumns };\n\n if (moveCardsTo && updatedColumns[moveCardsTo]) {\n // Explicit move requested\n const targetCol = updatedColumns[moveCardsTo];\n updatedColumns[moveCardsTo] = {\n ...targetCol,\n cardIds: [...targetCol.cardIds, ...column.cardIds],\n };\n // Update local card previousColumnId just in case\n column.cardIds.forEach(cardId => {\n if (updatedCards[cardId]) {\n updatedCards[cardId] = { ...updatedCards[cardId], previousColumnId: columnId };\n }\n });\n } else {\n // SAFE DELETE: Return cards to previous column or first available\n const firstColumnId = newColumnOrder.length > 0 ? newColumnOrder[0] : null;\n\n column.cardIds.forEach((cardId) => {\n const card = updatedCards[cardId];\n if (!card) return;\n\n const targetColId = (card.previousColumnId && updatedColumns[card.previousColumnId])\n ? card.previousColumnId\n : firstColumnId;\n\n if (targetColId && updatedColumns[targetColId]) {\n const targetCol = updatedColumns[targetColId];\n updatedColumns[targetColId] = {\n ...targetCol,\n cardIds: [...targetCol.cardIds, cardId]\n };\n // Keep the existing provenance? Or update?\n // Attempts to point to the deleted column are useless since it's gone.\n // Better to leave it pointing to the *original* source if possible, \n // or just don't update it, effectively behaving like it was always in the target.\n updatedCards[cardId] = { ...card };\n } else {\n // No place to go, sadly delete (or safeguard in 'Unsorted' if requested, but logic implies delete if no cols)\n delete updatedCards[cardId];\n }\n });\n }\n\n return {\n cards: updatedCards,\n columns: updatedColumns,\n columnOrder: newColumnOrder,\n };\n }),\n\n // === MOVEMENT ===\n moveCard: (cardId, sourceColId, targetColId, newIndex) => set((state) => {\n const sourceCol = state.columns[sourceColId];\n const targetCol = state.columns[targetColId];\n\n if (!sourceCol || !targetCol) return state;\n\n const newSourceCardIds = sourceCol.cardIds.filter(id => id !== cardId);\n\n if (sourceColId === targetColId) {\n newSourceCardIds.splice(newIndex, 0, cardId);\n return {\n ...state,\n columns: {\n ...state.columns,\n [sourceColId]: { ...sourceCol, cardIds: newSourceCardIds }\n }\n };\n }\n\n const newTargetCardIds = [...targetCol.cardIds];\n newTargetCardIds.splice(newIndex, 0, cardId);\n\n // Track previous column for recovery\n const updatedCard = { ...state.cards[cardId], previousColumnId: sourceColId };\n\n return {\n ...state,\n cards: { ...state.cards, [cardId]: updatedCard },\n columns: {\n ...state.columns,\n [sourceColId]: { ...sourceCol, cardIds: newSourceCardIds },\n [targetColId]: { ...targetCol, cardIds: newTargetCardIds }\n }\n };\n }),\n\n moveColumn: (columnId, newIndex) => set((state) => {\n const newOrder = state.columnOrder.filter(id => id !== columnId);\n newOrder.splice(newIndex, 0, columnId);\n return { ...state, columnOrder: newOrder };\n }),\n\n addColumnWithCard: (cardId, sourceColId, columnData) => set((state) => {\n const sourceCol = state.columns[sourceColId];\n const card = state.cards[cardId];\n if (!sourceCol || !card) return state;\n\n const columnId = generateId();\n const newColumn: KanboomColumn = {\n id: columnId,\n ...columnData,\n cardIds: [cardId],\n };\n\n const newSourceCardIds = sourceCol.cardIds.filter(id => id !== cardId);\n\n // Strict append to ensuring it goes to the end\n const newColumnOrder = Array.from(state.columnOrder);\n newColumnOrder.push(columnId);\n\n const updatedCard = { ...card, previousColumnId: sourceColId };\n\n return {\n ...state,\n cards: { ...state.cards, [cardId]: updatedCard },\n columns: {\n ...state.columns,\n [sourceColId]: { ...sourceCol, cardIds: newSourceCardIds },\n [columnId]: newColumn\n },\n columnOrder: newColumnOrder\n };\n }),\n\n // === FILTERS ===\n setSearchQuery: (query) => set((state) => ({\n filters: { ...state.filters, searchQuery: query }\n })),\n\n addFilterGroup: (group) => set((state) => ({\n filters: { ...state.filters, groups: [...state.filters.groups, group] }\n })),\n\n updateFilterGroup: (groupId, updates) => set((state) => ({\n filters: {\n ...state.filters,\n groups: state.filters.groups.map(g => g.id === groupId ? { ...g, ...updates } : g)\n }\n })),\n\n removeFilterGroup: (groupId: string) => set((state) => ({\n filters: { ...state.filters, groups: state.filters.groups.filter(g => g.id !== groupId) }\n })),\n\n removeFilterRule: (groupId, ruleId) => set((state) => ({\n filters: {\n ...state.filters,\n groups: state.filters.groups.map(g => {\n if (g.id !== groupId) return g;\n return {\n ...g,\n rules: g.rules.filter(r => !('id' in r) || r.id !== ruleId)\n };\n })\n }\n })),\n\n setFilters: (filters) => set({ filters }),\n\n clearFilters: () => set((state) => ({\n filters: { ...state.filters, groups: [], searchQuery: '' }\n })),\n\n // === UTILITY ===\n setBoardData: (data) => set({ ...data }),\n setConfig: (config) => set((state) => ({ config: { ...state.config, ...config } })),\n setActiveId: (activeId) => set({ activeId }),\n setViewingCardId: (viewingCardId) => set({ viewingCardId }),\n clearViewingCardId: () => set({ viewingCardId: null }),\n setEditingCardId: (editingCardId) => set({ editingCardId }),\n clearEditingCardId: () => set({ editingCardId: null }),\n setAddingCardInColumnId: (addingCardInColumnId) => set({ addingCardInColumnId }),\n clearAddingCardInColumnId: () => set({ addingCardInColumnId: null }),\n setEditingColumnId: (editingColumnId) => set({ editingColumnId }),\n clearEditingColumnId: () => set({ editingColumnId: null }),\n\n clearBoard: () => set({\n cards: {},\n columns: {},\n columnOrder: [],\n filters: { searchQuery: '', groups: [], quickFilters: [] }\n }),\n }))\n);","import { useState, useCallback } from 'react';\nimport { useKanbanStore } from '../store/use-kanban-store';\nimport type { KanboomConfig } from '../types/kanban';\n\nexport function useKanban<TCard = any, TColumn = any>(config?: KanboomConfig<TCard, TColumn>) {\n const store = useKanbanStore();\n const [activeId, setActiveId] = useState<string | null>(null);\n const [overId, setOverId] = useState<string | null>(null);\n const [overSide, setOverSide] = useState<'top' | 'bottom' | 'left' | 'right' | null>(null);\n\n const handleDragStart = useCallback((cardId: string) => {\n setActiveId(cardId);\n }, []);\n\n const handleDragOver = useCallback((id: string | null, side?: 'top' | 'bottom' | 'left' | 'right' | null) => {\n setOverId(id);\n setOverSide(side ?? null);\n }, []);\n\n const handleDragEnd = useCallback(() => {\n setActiveId(null);\n setOverId(null);\n setOverSide(null);\n }, []);\n\n\n const moveCard = useCallback((\n cardId: string,\n sourceColumnId: string,\n targetColumnId: string,\n index: number\n ) => {\n store.moveCard(cardId, sourceColumnId, targetColumnId, index);\n config?.onCardMove?.(cardId, sourceColumnId, targetColumnId, index);\n }, [store, config]);\n\n return {\n // Estado\n ...store,\n activeId,\n overId,\n overSide,\n viewingCardId: store.viewingCardId,\n editingCardId: store.editingCardId,\n addingCardInColumnId: store.addingCardInColumnId,\n editingColumnId: store.editingColumnId, // Use store version\n setViewingCardId: store.setViewingCardId,\n clearViewingCardId: store.clearViewingCardId,\n\n // Ações de Cards\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n moveCard,\n addCard: store.addCard,\n updateCard: store.updateCard,\n deleteCard: store.deleteCard,\n duplicateCard: store.duplicateCard,\n setEditingCardId: store.setEditingCardId,\n clearEditingCardId: store.clearEditingCardId,\n setAddingCardInColumnId: store.setAddingCardInColumnId,\n clearAddingCardInColumnId: store.clearAddingCardInColumnId,\n\n // Ações de Colunas\n addColumn: store.addColumn,\n addColumnWithCard: store.addColumnWithCard,\n updateColumn: store.updateColumn,\n deleteColumn: store.deleteColumn,\n moveColumn: store.moveColumn,\n setEditingColumnId: store.setEditingColumnId,\n clearEditingColumnId: store.clearEditingColumnId,\n\n // Utilitários\n clearBoard: store.clearBoard,\n\n // Configurações\n config: {\n dragActivationDistance: config?.dragActivationDistance ?? 10,\n touchActivationDelay: config?.touchActivationDelay ?? 250,\n virtualOverscan: config?.virtualOverscan ?? 5,\n estimatedCardHeight: config?.estimatedCardHeight ?? 90,\n columnWidth: config?.columnWidth ?? 320,\n columnMinHeight: config?.columnMinHeight ?? 500,\n gap: config?.gap ?? 16,\n allowAdd: config?.allowAdd ?? false,\n allowEdit: config?.allowEdit ?? false,\n allowColumnAdd: config?.allowColumnAdd ?? false,\n allowColumnEdit: config?.allowColumnEdit ?? false,\n allowColumnDelete: config?.allowColumnDelete ?? false,\n allowColumnReorder: config?.allowColumnReorder ?? false,\n allowFilters: config?.allowFilters ?? true,\n showURLSync: config?.showURLSync ?? false,\n }\n };\n}","import type { DragOverEvent, DragStartEvent } from '@dnd-kit/core';\nimport type { MutableRefObject } from 'react';\nimport { KeyboardSensor, MouseSensor, TouchSensor, useSensor, useSensors } from '@dnd-kit/core';\nimport { useEffect, useRef } from 'react';\n\ninterface UseKanbanDndProps {\n dragActivationDistance: number;\n touchActivationDelay: number;\n onDragStart: (id: string, type: 'Card' | 'Column') => void;\n onDragOver: (overId: string | null, side?: 'top' | 'bottom' | 'left' | 'right' | null) => void;\n onDragEnd: () => void;\n onCardMove: (cardId: string, sourceColumnId: string, targetColumnId: string, index: number) => void;\n onColumnMove: (columnId: string, index: number) => void;\n onCreateColumnWithCard?: (cardId: string, sourceColumnId: string) => void;\n columns: Record<string, any>;\n columnOrder: string[];\n recentlyMovedToNewContainer?: MutableRefObject<boolean>;\n}\n\ninterface DragPosition {\n type: 'Card' | 'Column' | 'NewColumn';\n activeId: string;\n sourceColumnId?: string;\n targetColumnId?: string;\n targetIndex: number;\n side?: 'top' | 'bottom' | 'left' | 'right';\n}\n\nexport function useKanbanDnd({\n dragActivationDistance,\n touchActivationDelay,\n onDragStart,\n onDragOver,\n onDragEnd,\n onCardMove,\n onColumnMove,\n onCreateColumnWithCard,\n columns,\n columnOrder,\n recentlyMovedToNewContainer\n}: UseKanbanDndProps) {\n // Use refs to avoid stale closures in dnd-kit handlers\n const columnsRef = useRef(columns);\n const columnOrderRef = useRef(columnOrder);\n\n useEffect(() => {\n columnsRef.current = columns;\n columnOrderRef.current = columnOrder;\n }, [columns, columnOrder]);\n\n const dragPositionRef = useRef<DragPosition | null>(null);\n\n const sensors = useSensors(\n useSensor(MouseSensor, {\n activationConstraint: { distance: dragActivationDistance },\n }),\n useSensor(TouchSensor, {\n activationConstraint: { delay: touchActivationDelay, tolerance: 5 },\n }),\n useSensor(KeyboardSensor)\n );\n\n const handleDragStart = (event: DragStartEvent) => {\n const data = event.active.data.current;\n const type = data?.type || 'Card';\n dragPositionRef.current = null;\n onDragStart(event.active.id as string, type);\n };\n\n const handleDragOver = (event: DragOverEvent) => {\n const { active, over } = event;\n const activeData = active.data.current;\n const type = activeData?.type || 'Card';\n const currentColumns = columnsRef.current;\n const currentOrder = columnOrderRef.current;\n\n if (!over) {\n onDragOver(null);\n dragPositionRef.current = null;\n return;\n }\n\n const activeId = active.id as string;\n const overId = over.id as string;\n\n // Detecção de lado (Top/Bottom ou Left/Right)\n const overRect = over.rect;\n\n // Obter coordenadas do mouse/toque dinâmicamente do dnd-kit se possível,\n // mas o simpler é usar o active rect vs over rect.\n const activeRect = active.rect.current.translated;\n\n let side: 'top' | 'bottom' | 'left' | 'right' | null = null;\n\n if (activeRect && overRect) {\n if (type === 'Column') {\n const overCenterX = overRect.left + overRect.width / 2;\n side = activeRect.left + activeRect.width / 2 < overCenterX ? 'left' : 'right';\n } else {\n const overCenterY = overRect.top + overRect.height / 2;\n side = activeRect.top + activeRect.height / 2 < overCenterY ? 'top' : 'bottom';\n }\n }\n\n onDragOver(overId, side);\n\n // --- COLUMN REORDERING ---\n if (type === 'Column') {\n let targetColumnId = overId;\n if (!currentColumns[overId]) {\n const overCol = Object.values(currentColumns).find(col =>\n col.cardIds.includes(overId)\n );\n if (overCol) {\n targetColumnId = overCol.id;\n }\n }\n\n const overIndex = currentOrder.indexOf(targetColumnId);\n const currentIndex = currentOrder.indexOf(activeId);\n\n if (overIndex !== -1 && currentIndex !== -1 && currentIndex !== overIndex) {\n // Live reorder: simple index swap is more stable for horizontal sorting\n onColumnMove(activeId, overIndex);\n\n if (dragPositionRef.current) {\n dragPositionRef.current.targetIndex = overIndex;\n }\n }\n return;\n }\n\n // --- CARD MOVEMENT ---\n // Check if dropping on the \"New Column\" target\n if (overId === 'new-column-drop-target') {\n const activeColumn = Object.values(currentColumns).find(col =>\n col.cardIds.includes(activeId)\n );\n if (activeColumn) {\n dragPositionRef.current = {\n type: 'NewColumn',\n activeId,\n sourceColumnId: activeColumn.id,\n targetIndex: 0\n };\n }\n return;\n }\n\n const activeColumn = Object.values(currentColumns).find(col =>\n col.cardIds.includes(activeId)\n );\n\n if (!activeColumn) return;\n\n if (currentColumns[overId]) {\n if (activeColumn.id !== overId) {\n // Signal that we're moving to a new container\n if (recentlyMovedToNewContainer) {\n recentlyMovedToNewContainer.current = true;\n }\n dragPositionRef.current = {\n type: 'Card',\n activeId,\n sourceColumnId: activeColumn.id,\n targetColumnId: overId,\n targetIndex: currentColumns[overId].cardIds.length,\n side: 'bottom' // Default para coluna vazia/header\n };\n } else {\n dragPositionRef.current = null;\n }\n return;\n }\n\n const overColumn = Object.values(currentColumns).find(col =>\n col.cardIds.includes(overId)\n );\n\n if (!overColumn) return;\n\n const overIndex = overColumn.cardIds.indexOf(overId);\n\n // Cálculo do index final baseado no lado\n const finalIndex = side === 'bottom' ? overIndex + 1 : overIndex;\n\n if (activeColumn.id !== overColumn.id) {\n // Signal that we're moving to a new container\n if (recentlyMovedToNewContainer) {\n recentlyMovedToNewContainer.current = true;\n }\n dragPositionRef.current = {\n type: 'Card',\n activeId,\n sourceColumnId: activeColumn.id,\n targetColumnId: overColumn.id,\n targetIndex: finalIndex,\n side: side as any\n };\n } else {\n const oldIndex = activeColumn.cardIds.indexOf(activeId);\n // Na mesma coluna, dnd-kit lida bem com sorting, mas para nossa store:\n if (oldIndex !== overIndex) {\n dragPositionRef.current = {\n type: 'Card',\n activeId,\n sourceColumnId: activeColumn.id,\n targetColumnId: activeColumn.id,\n targetIndex: overIndex, // Para mesma coluna, dnd-kit prefere swap direto ou splice\n side: side as any\n };\n }\n }\n };\n\n const handleDragEnd = () => {\n if (dragPositionRef.current) {\n const pos = dragPositionRef.current;\n if (pos.type === 'NewColumn' && pos.sourceColumnId && onCreateColumnWithCard) {\n onCreateColumnWithCard(pos.activeId, pos.sourceColumnId);\n } else if (pos.type === 'Card' && pos.sourceColumnId && pos.targetColumnId) {\n onCardMove(pos.activeId, pos.sourceColumnId, pos.targetColumnId, pos.targetIndex);\n } else if (pos.type === 'Column') {\n onColumnMove(pos.activeId, pos.targetIndex);\n }\n }\n\n dragPositionRef.current = null;\n onDragEnd();\n };\n\n return {\n sensors,\n handleDragStart,\n handleDragOver,\n handleDragEnd\n };\n}","import type { KanboomCard, FilterGroup, FilterRule } from '@/lib/types/kanban';\n\nexport function evaluateFilter(card: KanboomCard, filters: { searchQuery: string; groups: FilterGroup[] }): boolean {\n // 1. Global Search\n if (filters.searchQuery) {\n const query = filters.searchQuery.toLowerCase();\n const titleMatch = card.title?.toLowerCase().includes(query);\n const descMatch = card.description?.toLowerCase().includes(query);\n\n // Also search in metadata values\n const metadataMatch = card.metadata && Object.values(card.metadata).some(val =>\n String(val).toLowerCase().includes(query)\n );\n\n if (!titleMatch && !descMatch && !metadataMatch) return false;\n }\n\n // 2. Advanced Filters (Groups)\n if (filters.groups.length === 0) return true;\n\n // Each group is combined with AND (top level)\n return filters.groups.every(group => {\n if (!group.enabled) return true;\n return evaluateGroup(card, group);\n });\n}\n\nfunction evaluateGroup(card: any, group: FilterGroup): boolean {\n const { conjunction, rules } = group;\n\n if (rules.length === 0) return true;\n\n if (conjunction === 'and') {\n return rules.every(rule => {\n if ('conjunction' in rule) return evaluateGroup(card, rule as FilterGroup);\n return evaluateRule(card, rule as FilterRule);\n });\n } else {\n return rules.some(rule => {\n if ('conjunction' in rule) return evaluateGroup(card, rule as FilterGroup);\n return evaluateRule(card, rule as FilterRule);\n });\n }\n}\n\nfunction evaluateRule(card: any, rule: FilterRule): boolean {\n if (!rule.field || !rule.enabled) return true;\n\n const value = getNestedValue(card, rule.field);\n const target = rule.value;\n\n switch (rule.operator) {\n case 'eq': return value === target;\n case 'neq': return value !== target;\n case 'contains':\n return String(value || '').toLowerCase().includes(String(target || '').toLowerCase());\n case 'notContains':\n return !String(value || '').toLowerCase().includes(String(target || '').toLowerCase());\n case 'gt': return Number(value) > Number(target);\n case 'gte': return Number(value) >= Number(target);\n case 'lt': return Number(value) < Number(target);\n case 'lte': return Number(value) <= Number(target);\n case 'isEmpty': return !value || (Array.isArray(value) && value.length === 0);\n case 'isNotEmpty': return !!value && (!Array.isArray(value) || value.length > 0);\n default: return true;\n }\n}\n\nfunction getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((acc, part) => acc && acc[part], obj);\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}","import type { CardRenderProps } from '@/lib/types/kanban';\nimport { cn } from '@/lib/utils/cn';\nimport { memo } from 'react';\nimport { MoreHorizontal, Paperclip, MessageSquare, Calendar } from 'lucide-react';\n\nexport const DefaultCard = memo(<TCard extends { id: string; title: string; description?: string; metadata?: any }>(\n { card, isDragging }: CardRenderProps<TCard>\n) => {\n const { tags, members, commentsCount, attachmentsCount, dueDate, priority } = card.metadata || {};\n\n // Priority Color Map\n const priorityColors: Record<string, string> = {\n high: 'bg-red-500',\n medium: 'bg-amber-500',\n low: 'bg-emerald-500',\n };\n\n return (\n <div\n className={cn(\n \"group relative bg-card-bg rounded-card border border-card-border p-3\",\n \"shadow-card transition-all duration-200 cursor-pointer select-none\",\n \"hover:shadow-card-hover hover:-translate-y-0.5 hover:border-slate-300\",\n isDragging && \"opacity-50 grayscale-[0.5] scale-[1.02] shadow-xl border-blue-400 ring-1 ring-blue-400 rotate-2 z-50\",\n // Priority Indicator on Left\n priority && \"pl-4\"\n )}\n >\n {/* Priority Stripe */}\n {priority && (\n <div className={cn(\n \"absolute left-0 top-3 bottom-3 w-1 rounded-r-full\",\n priorityColors[priority as string] || \"bg-slate-300\"\n )} />\n )}\n\n <div className=\"flex flex-col gap-2.5\">\n {/* Tags Row */}\n {tags && tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mb-0.5\">\n {tags.map((tag: any, i: number) => (\n <span\n key={i}\n className={cn(\n \"px-2 py-0.5 rounded-full text-[10px] font-semibold tracking-tight\",\n tag.color || \"bg-slate-100 text-slate-600\"\n )}\n >\n {tag.name}\n </span>\n ))}\n </div>\n )}\n\n <div className=\"flex items-start justify-between gap-2\">\n <h4 className=\"text-sm font-semibold text-slate-800 leading-snug group-hover:text-slate-900 transition-colors\">\n {card.title}\n </h4>\n <button className=\"opacity-0 group-hover:opacity-100 transition-opacity p-1 hover:bg-slate-100 rounded text-slate-400 hover:text-slate-600 -mr-1 -mt-1\">\n <MoreHorizontal size={14} />\n </button>\n </div>\n\n {card.description && (\n <p className=\"text-xs text-slate-500 line-clamp-2 leading-relaxed font-medium\">\n {card.description}\n </p>\n )}\n\n {/* Footer: Avatar + Specs */}\n {(members || commentsCount || attachmentsCount || dueDate) && (\n <div className=\"flex items-center justify-between mt-1 pt-2.5 border-t border-slate-100/80\">\n {/* Members Stack */}\n <div className=\"flex items-center\">\n {members && members.length > 0 ? (\n <div className=\"flex -space-x-2 overflow-hidden py-0.5 pl-0.5\">\n {members.map((m: any, i: number) => (\n <div\n key={i}\n className=\"h-6 w-6 rounded-full border-2 border-white bg-slate-200 flex items-center justify-center text-[9px] font-bold text-slate-600 ring-1 ring-slate-100\"\n title={m.name}\n >\n {m.avatar ? <img src={m.avatar} alt={m.name} className=\"w-full h-full rounded-full object-cover\" /> : m.initials}\n </div>\n ))}\n {members.length > 3 && (\n <div className=\"h-6 w-6 rounded-full border-2 border-white bg-slate-50 flex items-center justify-center text-[9px] font-bold text-slate-400\">\n +{members.length - 3}\n </div>\n )}\n </div>\n ) : <div />}\n </div>\n\n {/* Icons */}\n <div className=\"flex items-center gap-3 text-slate-400\">\n {dueDate && (\n <div className={cn(\"flex items-center gap-1 text-[10px] font-medium\", new Date(dueDate) < new Date() ? \"text-red-500\" : \"text-slate-400\")}>\n <Calendar size={12} />\n <span>{new Date(dueDate).toLocaleDateString(undefined, { month: 'short', day: 'numeric' })}</span>\n </div>\n )}\n {commentsCount > 0 && (\n <div className=\"flex items-center gap-1 text-[10px] font-medium hover:text-slate-600 transition-colors\">\n <MessageSquare size={12} />\n <span>{commentsCount}</span>\n </div>\n )}\n {attachmentsCount > 0 && (\n <div className=\"flex items-center gap-1 text-[10px] font-medium hover:text-slate-600 transition-colors\">\n <Paperclip size={12} />\n <span>{attachmentsCount}</span>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}, (prevProps, nextProps) => {\n // Deep comparison for metadata is risky but we'll check key props\n return (\n prevProps.card.id === nextProps.card.id &&\n prevProps.card.title === nextProps.card.title &&\n prevProps.card.description === nextProps.card.description &&\n prevProps.isDragging === nextProps.isDragging &&\n JSON.stringify(prevProps.card.metadata) === JSON.stringify(nextProps.card.metadata)\n );\n});\n\nDefaultCard.displayName = 'DefaultCard';","import { memo } from 'react';\n\nexport const DefaultColumnEmpty = memo(() => {\n return (\n <div className=\"flex items-center justify-center h-32 text-slate-400 text-sm\">\n Arraste cards aqui\n </div>\n );\n});\n\nDefaultColumnEmpty.displayName = 'DefaultColumnEmpty';","import type { ColumnHeaderRenderProps } from '@/lib/types/kanban';\nimport { cn } from '@/lib/utils/cn';\nimport { GripVertical, MoreHorizontal, Plus } from 'lucide-react';\nimport { memo } from 'react';\n\nexport const DefaultColumnHeader = memo(<TColumn extends { id: string; title: string }>(\n { column, cardCount, isOver, dragHandleProps, onAddCard, onEditColumn }: ColumnHeaderRenderProps<TColumn>\n) => {\n return (\n <div className={cn(\n \"px-3 py-3 flex items-center justify-between transition-colors mb-2 rounded-t-xl select-none group/header\",\n isOver ? \"bg-blue-50/80\" : \"bg-transparent\"\n )}>\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n {dragHandleProps && (\n <div\n {...dragHandleProps.attributes}\n {...dragHandleProps.listeners}\n onClick={(e) => e.stopPropagation()}\n className=\"cursor-grab active:cursor-grabbing text-slate-400 hover:text-slate-600 p-0.5 rounded hover:bg-slate-200/50 transition-colors\"\n >\n <GripVertical size={14} />\n </div>\n )}\n <h3 className=\"font-semibold text-sm text-slate-700 truncate tracking-tight flex-1\">\n {column.title}\n </h3>\n <span className=\"text-[10px] bg-slate-200/50 border border-slate-200 px-2 py-0.5 rounded-full text-slate-500 font-bold tabular-nums\">\n {cardCount}\n </span>\n </div>\n\n <div className=\"flex items-center gap-1 opacity-0 group-hover/header:opacity-100 transition-opacity\">\n {onAddCard && (\n <button\n onClick={onAddCard}\n className=\"p-1 hover:bg-slate-200/50 rounded text-slate-400 hover:text-slate-600 transition-colors\"\n title=\"Adicionar Card\"\n >\n <Plus size={14} />\n </button>\n )}\n {onEditColumn && (\n <button\n onClick={onEditColumn}\n className=\"p-1 hover:bg-slate-200/50 rounded text-slate-400 hover:text-slate-600 transition-colors\"\n title=\"Editar Coluna\"\n >\n <MoreHorizontal size={14} />\n </button>\n )}\n </div>\n </div>\n );\n});\n\nDefaultColumnHeader.displayName = 'DefaultColumnHeader';","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport { cn } from \"@/lib/utils/utils\"\n\nconst Dialog = DialogPrimitive.Root\nconst DialogTrigger = DialogPrimitive.Trigger\nconst DialogPortal = DialogPrimitive.Portal\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border bg-background p-6 shadow-lg duration-200 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-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-48% data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-48% sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"@/lib/utils/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { useState } from 'react';\nimport { Save, Trash2 } from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Button } from \"@/components/ui/button\";\n\ninterface DefaultEditFormProps {\n card: any;\n onSave: (updates: any) => void;\n onCancel: () => void;\n onDelete?: () => void;\n}\n\nexport function DefaultEditForm({ card, onSave, onCancel, onDelete }: DefaultEditFormProps) {\n const [title, setTitle] = useState(card.title || '');\n const [description, setDescription] = useState(card.description || '');\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n onSave({ title, description });\n };\n\n return (\n <Dialog open={true} onOpenChange={(open) => !open && onCancel()}>\n <DialogContent className=\"sm:max-w-[425px]\">\n <DialogHeader>\n <DialogTitle>Editar Card</DialogTitle>\n <DialogDescription>\n Faça alterações no card aqui. Clique em salvar quando terminar.\n </DialogDescription>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"grid gap-4 py-4\">\n <div className=\"grid gap-2\">\n <label htmlFor=\"title\" className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n Título\n </label>\n <input\n id=\"title\"\n autoFocus\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n placeholder=\"Digite o título...\"\n />\n </div>\n <div className=\"grid gap-2\">\n <label htmlFor=\"desc\" className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n Descrição\n </label>\n <textarea\n id=\"desc\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={4}\n className=\"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 resize-none\"\n placeholder=\"Adicione uma descrição...\"\n />\n </div>\n <DialogFooter className=\"flex items-center justify-between w-full sm:justify-between\">\n {onDelete && (\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={onDelete}\n className=\"gap-2\"\n >\n <Trash2 size={14} />\n Excluir\n </Button>\n )}\n <div className=\"flex gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={onCancel}>\n Cancelar\n </Button>\n <Button type=\"submit\" className=\"gap-2\">\n <Save size={14} />\n Salvar\n </Button>\n </div>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\nimport { Calendar, User, Tag, AlignLeft, Info } from 'lucide-react';\nimport type { ViewCardRenderProps, KanboomCard } from '@/lib/types/kanban';\nimport { memo } from 'react';\nimport { cn } from '@/lib/utils/cn';\n\nexport const DefaultCardView = memo(<TCard extends KanboomCard>(\n { card, onClose }: ViewCardRenderProps<TCard>\n) => {\n const { priority, tags, members, dueDate, ...otherMetadata } = card.metadata || {};\n\n const priorityConfig: Record<string, { label: string, color: string, bg: string }> = {\n high: { label: 'Alta', color: 'text-red-700', bg: 'bg-red-50 border-red-200' },\n medium: { label: 'Média', color: 'text-amber-700', bg: 'bg-amber-50 border-amber-200' },\n low: { label: 'Baixa', color: 'text-emerald-700', bg: 'bg-emerald-50 border-emerald-200' },\n };\n\n const pConfig = priority && priorityConfig[priority];\n\n return (\n <Dialog open={true} onOpenChange={(open: boolean) => !open && onClose()}>\n <DialogContent className=\"sm:max-w-2xl p-0 gap-0 overflow-hidden bg-white\">\n {/* Header Color Strip (if priority exists) */}\n {pConfig && (\n <div className={cn(\"h-1.5 w-full\", pConfig.bg.split(' ')[0], pConfig.bg.replace('bg-', 'bg-opacity-100'))} />\n )}\n\n <div className=\"flex flex-col h-full max-h-[85vh]\">\n <DialogHeader className=\"p-6 pb-4\">\n <div className=\"flex items-start gap-4\">\n <div className=\"mt-1 p-2 bg-slate-100 rounded-lg text-slate-500\">\n <AlignLeft size={20} />\n </div>\n <div className=\"space-y-1 flex-1\">\n <DialogTitle className=\"text-xl font-bold text-slate-900 leading-tight\">\n {card.title}\n </DialogTitle>\n <p className=\"text-xs text-slate-400 font-medium uppercase tracking-wider\">\n {card.id}\n </p>\n </div>\n {pConfig && (\n <div className={cn(\"px-3 py-1 rounded-full text-xs font-bold border uppercase tracking-wide\", pConfig.color, pConfig.bg)}>\n {pConfig.label}\n </div>\n )}\n </div>\n </DialogHeader>\n\n <div className=\"flex-1 overflow-y-auto p-6 pt-0 grid md:grid-cols-[1fr,240px] gap-8\">\n {/* Main Content Column */}\n <div className=\"space-y-6\">\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-semibold text-slate-900 flex items-center gap-2\">\n Descrição\n </h4>\n <div className={cn(\n \"text-sm text-slate-600 leading-relaxed p-4 rounded-lg border border-slate-100 bg-slate-50/50 min-h-[100px]\",\n !card.description && \"italic text-slate-400 flex items-center justify-center\"\n )}>\n {card.description || \"Nenhuma descrição fornecida.\"}\n </div>\n </div>\n\n {card.content && (\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-semibold text-slate-900\">Conteúdo Detalhado</h4>\n <pre className=\"text-xs font-mono bg-slate-900 text-slate-50 p-4 rounded-lg overflow-x-auto shadow-inner\">\n {typeof card.content === 'object' ? JSON.stringify(card.content, null, 2) : card.content}\n </pre>\n </div>\n )}\n </div>\n\n {/* Sidebar Metadata Column */}\n <div className=\"space-y-6\">\n {/* Status/Due Date */}\n {dueDate && (\n <div className=\"space-y-1.5\">\n <span className=\"text-xs font-semibold text-slate-500 uppercase tracking-wider flex items-center gap-1.5\">\n <Calendar size={12} /> Data de Entrega\n </span>\n <div className=\"text-sm font-medium text-slate-900 bg-slate-50 px-3 py-2 rounded-md border border-slate-200\">\n {new Date(dueDate).toLocaleDateString()}\n </div>\n </div>\n )}\n\n {/* Members */}\n {members && Array.isArray(members) && members.length > 0 && (\n <div className=\"space-y-2\">\n <span className=\"text-xs font-semibold text-slate-500 uppercase tracking-wider flex items-center gap-1.5\">\n <User size={12} /> Membros\n </span>\n <div className=\"flex flex-col gap-2\">\n {members.map((m: any, i: number) => (\n <div key={i} className=\"flex items-center gap-2 text-sm text-slate-700 bg-white p-1.5 rounded-md border border-slate-100 shadow-sm\">\n <div className=\"h-6 w-6 rounded-full bg-slate-200 flex items-center justify-center text-[10px] font-bold overflow-hidden shrink-0\">\n {m.avatar ? <img src={m.avatar} alt={m.name} className=\"w-full h-full object-cover\" /> : m.initials}\n </div>\n <span className=\"truncate\">{m.name}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Tags */}\n {tags && Array.isArray(tags) && tags.length > 0 && (\n <div className=\"space-y-2\">\n <span className=\"text-xs font-semibold text-slate-500 uppercase tracking-wider flex items-center gap-1.5\">\n <Tag size={12} /> Tags\n </span>\n <div className=\"flex flex-wrap gap-1.5\">\n {tags.map((tag: any, i: number) => (\n <span key={i} className={cn(\n \"px-2.5 py-1 rounded-md text-xs font-semibold border shadow-sm\",\n tag.color ? `bg-${tag.color}-50 text-${tag.color}-700 border-${tag.color}-200` : \"bg-slate-100 text-slate-700 border-slate-200\"\n )}>\n {tag.name}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Dynamic Other Metadata */}\n {Object.keys(otherMetadata).length > 0 && (\n <div className=\"space-y-3 pt-4 border-t border-slate-100\">\n <span className=\"text-xs font-semibold text-slate-500 uppercase tracking-wider flex items-center gap-1.5\">\n <Info size={12} /> Outros Detalhes\n </span>\n <div className=\"grid gap-3\">\n {Object.entries(otherMetadata).map(([key, value]) => (\n <div key={key} className=\"group\">\n <dt className=\"text-[10px] font-bold text-slate-400 uppercase mb-0.5 group-hover:text-slate-600 transition-colors\">\n {key.replace(/([A-Z])/g, ' $1')}\n </dt>\n <dd className=\"text-sm font-medium text-slate-800 break-words\">\n {typeof value === 'boolean' ? (\n value ? <span className=\"inline-flex items-center gap-1 text-emerald-600 bg-emerald-50 px-2 py-0.5 rounded text-xs\">Sim</span> : <span className=\"text-slate-400\">Não</span>\n ) : String(value)}\n </dd>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"p-4 border-t border-slate-100 bg-slate-50/50 flex justify-end\">\n <Button variant=\"outline\" onClick={onClose} className=\"hover:bg-white hover:text-slate-900 transition-colors\">\n Fechar Visualização\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n});\n","import { useKanbanStore } from '@/lib/store/use-kanban-store';\nimport { Button } from '@/components/ui/button';\nimport { X, RotateCcw } from 'lucide-react';\nimport type { FilterRule } from '@/lib/types/kanban';\n\nexport function FilterChips() {\n const { filters, removeFilterRule, clearFilters } = useKanbanStore();\n\n const activeRules = filters.groups.flatMap(group =>\n group.rules\n .filter(rule => !('conjunction' in rule) && rule.enabled)\n .map(rule => ({ groupId: group.id, rule: rule as FilterRule }))\n );\n\n if (activeRules.length === 0 && !filters.searchQuery) return null;\n\n return (\n <div className=\"flex flex-wrap items-center gap-2 px-4 py-2 bg-slate-50/50 border-b min-h-[48px] animate-in fade-in slide-in-from-top-1 duration-300\">\n <div className=\"flex items-center gap-1.5 mr-2\">\n <div className=\"h-2 w-2 rounded-full bg-primary animate-pulse\" />\n <span className=\"text-[11px] font-bold text-slate-500 uppercase tracking-tight\">Filtros Ativos:</span>\n </div>\n\n {filters.searchQuery && (\n <div className=\"flex items-center gap-1 bg-white border border-primary/20 rounded-full px-3 py-1 text-[11px] shadow-sm\">\n <span className=\"text-slate-500\">Busca:</span>\n <span className=\"font-semibold text-primary\">{filters.searchQuery}</span>\n <button\n onClick={() => useKanbanStore.getState().setSearchQuery('')}\n className=\"ml-1 hover:text-destructive transition-colors\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n )}\n\n {activeRules.map(({ groupId, rule }) => (\n <div\n key={rule.id}\n className=\"flex items-center gap-1 bg-white border border-slate-200 rounded-full px-3 py-1 text-[11px] shadow-sm hover:border-primary/30 transition-colors group\"\n >\n <span className=\"text-slate-400 capitalize\">{rule.field.split('.').pop()}:</span>\n <span className=\"font-semibold text-slate-700\">{rule.value || '(vazio)'}</span>\n <button\n onClick={() => removeFilterRule(groupId, rule.id)}\n className=\"ml-1 text-slate-300 group-hover:text-destructive transition-colors\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-[10px] font-bold text-slate-400 hover:text-destructive gap-1 px-2 border-l ml-auto rounded-none\"\n onClick={clearFilters}\n >\n <RotateCcw className=\"h-3 w-3\" />\n LIMPAR TUDO\n </Button>\n </div>\n );\n}\n","import { useRef, useEffect, useState, useMemo } from 'react';\nimport { useVirtualizer } from '@tanstack/react-virtual';\n\ninterface UseKanbanColumnProps {\n cardIds: string[];\n estimatedCardHeight: number;\n overscan: number;\n}\n\n// Cache de medições de altura por card ID\nconst heightCache = new Map<string, number>();\n\nexport function useKanbanColumn({\n cardIds,\n estimatedCardHeight,\n overscan: baseOverscan\n}: UseKanbanColumnProps) {\n const parentRef = useRef<HTMLDivElement>(null);\n const [scrollVelocity, setScrollVelocity] = useState(0);\n\n // NOTE: We removed useDroppable here because the column is already \n // registered as a droppable via useSortable in SortableVirtualColumn.\n // Having two registrations with the same ID causes conflicts.\n\n useEffect(() => {\n const element = parentRef.current;\n if (!element) return;\n\n let lastScrollTop = 0;\n let lastTime = Date.now();\n let rafId: number;\n\n const handleScroll = () => {\n const now = Date.now();\n const scrollTop = element.scrollTop;\n const deltaTime = now - lastTime;\n const deltaScroll = Math.abs(scrollTop - lastScrollTop);\n\n if (deltaTime > 0) {\n const velocity = deltaScroll / deltaTime;\n setScrollVelocity(velocity);\n }\n\n lastScrollTop = scrollTop;\n lastTime = now;\n };\n\n const throttledScroll = () => {\n if (rafId) cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(handleScroll);\n };\n\n element.addEventListener('scroll', throttledScroll, { passive: true });\n\n return () => {\n element.removeEventListener('scroll', throttledScroll);\n if (rafId) cancelAnimationFrame(rafId);\n };\n }, []);\n\n // Overscan dinâmico baseado em velocidade\n const dynamicOverscan = useMemo(() => {\n if (scrollVelocity > 2000) return baseOverscan * 3;\n if (scrollVelocity > 1000) return baseOverscan * 2;\n if (scrollVelocity > 500) return Math.ceil(baseOverscan * 1.5);\n return baseOverscan;\n }, [scrollVelocity, baseOverscan]);\n\n const rowVirtualizer = useVirtualizer({\n count: cardIds.length,\n getScrollElement: () => parentRef.current,\n estimateSize: (index) => {\n const cardId = cardIds[index];\n const cached = heightCache.get(cardId);\n if (cached) return cached;\n return estimatedCardHeight;\n },\n measureElement: (element) => {\n const height = element.getBoundingClientRect().height;\n const cardId = element.getAttribute('data-card-id');\n\n if (cardId) {\n heightCache.set(cardId, height);\n }\n\n return height;\n },\n overscan: dynamicOverscan,\n });\n\n return {\n parentRef,\n rowVirtualizer\n };\n}","import { Plus } from 'lucide-react';\n\ninterface AddCardButtonProps {\n onClick: () => void;\n}\n\nexport function AddCardButton({ onClick }: AddCardButtonProps) {\n return (\n <button\n onClick={onClick}\n className=\"w-full flex items-center gap-2 px-3 py-2 text-sm font-medium text-slate-500 hover:text-blue-600 hover:bg-blue-50/50 rounded-lg transition-all duration-200 group\"\n >\n <div className=\"bg-slate-200 group-hover:bg-blue-600 group-hover:text-white p-0.5 rounded transition-colors\">\n <Plus size={14} />\n </div>\n <span>Adicionar card</span>\n </button>\n );\n}\n","import { memo, useMemo } from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport type { CardRenderProps } from '../types/kanban';\n\ninterface KanbanCardProps<TCard> {\n card: TCard;\n isDragging: boolean;\n renderCard: (props: CardRenderProps<TCard>) => React.ReactNode;\n onClick?: (card: TCard) => void;\n onEdit?: (card: TCard) => void;\n allowEdit?: boolean;\n index: number;\n columnId: string;\n overId: string | null;\n overSide: 'top' | 'bottom' | 'left' | 'right' | null;\n}\n\n// Lightweight sortable wrapper - only this re-renders during drag\nfunction KanbanCardInner<TCard extends { id: string }>({\n card,\n renderCard,\n onClick,\n onEdit,\n allowEdit,\n index,\n columnId,\n overId,\n overSide\n}: KanbanCardProps<TCard>) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging: isSortableDragging\n } = useSortable({\n id: card.id,\n data: {\n type: 'Card',\n card,\n index,\n columnId\n }\n });\n\n const style = useMemo(() => ({\n transform: CSS.Translate.toString(transform),\n transition,\n opacity: isSortableDragging ? 0.4 : 1,\n }), [transform, transition, isSortableDragging]);\n\n const handleClick = useMemo(() => {\n return (e: React.MouseEvent) => {\n e.stopPropagation();\n if (onClick) {\n onClick(card);\n } else if (allowEdit) {\n onEdit?.(card);\n }\n };\n }, [onClick, onEdit, allowEdit, card]);\n\n // Render card content - memoized by DefaultCard component\n const cardContent = useMemo(\n () => renderCard({ card, isDragging: isSortableDragging }),\n [card, renderCard, isSortableDragging]\n );\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n {...attributes}\n {...listeners}\n onClick={handleClick}\n className=\"relative cursor-grab active:cursor-grabbing touch-none group\"\n >\n {overId === card.id && overSide === 'top' && (\n <div className=\"absolute -top-[2px] left-0 right-0 h-[4px] bg-blue-500 rounded-full z-10 pointer-events-none shadow-sm\" />\n )}\n\n {cardContent}\n\n {overId === card.id && overSide === 'bottom' && (\n <div className=\"absolute -bottom-[2px] left-0 right-0 h-[4px] bg-blue-500 rounded-full z-10 pointer-events-none shadow-sm\" />\n )}\n </div>\n );\n}\n\nexport const KanbanCard = memo(KanbanCardInner, (prevProps, nextProps) => {\n return (\n prevProps.card === nextProps.card &&\n prevProps.index === nextProps.index &&\n prevProps.columnId === nextProps.columnId &&\n prevProps.overId === nextProps.overId &&\n prevProps.overSide === nextProps.overSide\n );\n}) as <TCard extends { id: string }>(props: KanbanCardProps<TCard>) => React.ReactElement;","import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { memo } from 'react';\nimport { useKanbanColumn } from '../hooks/use-kanban-column';\nimport { useKanbanStore } from '../store/use-kanban-store';\nimport type { KanboomCard, KanboomColumn, KanboomConfig } from '../types/kanban';\nimport { cn } from '../utils/cn';\nimport { AddCardButton } from './add-card-button';\nimport { KanbanCard } from './kanban-card';\n\ninterface KanbanColumnProps<TCard = KanboomCard, TColumn = KanboomColumn> {\n column: TColumn;\n allCards: Record<string, TCard>;\n activeId: string | null;\n overId: string | null;\n overSide: 'top' | 'bottom' | 'left' | 'right' | null;\n config: Required<Pick<KanboomConfig<TCard, TColumn>,\n 'renderCard' | 'renderColumnHeader' | 'renderColumnEmpty' |\n 'estimatedCardHeight' | 'virtualOverscan' | 'columnWidth' | 'columnMinHeight'\n >> & Pick<KanboomConfig<TCard, TColumn>,\n 'onCardClick' | 'onEditCard' | 'onColumnClick' | 'onEditColumn' | 'renderAddButton' | 'renderAddForm' | 'renderEditForm' | 'allowAdd' | 'allowEdit' | 'allowColumnEdit'\n >;\n dragHandleProps?: {\n attributes: any;\n listeners: any;\n };\n isActiveColumnDragging?: boolean;\n isDragging?: boolean;\n isOverlay?: boolean;\n}\n\nfunction KanbanColumnInner<TCard extends { id: string }, TColumn extends { id: string; title: string }>({\n column,\n allCards,\n activeId,\n overId,\n overSide,\n config,\n dragHandleProps,\n isActiveColumnDragging,\n isDragging,\n isOverlay\n}: KanbanColumnProps<TCard, TColumn>) {\n const columnData = column as any;\n const { setAddingCardInColumnId, setEditingColumnId } = useKanbanStore();\n\n const {\n parentRef,\n rowVirtualizer\n } = useKanbanColumn({\n cardIds: columnData.cardIds,\n estimatedCardHeight: config.estimatedCardHeight,\n overscan: config.virtualOverscan\n });\n\n // isOver is now managed by the parent SortableVirtualColumn\n const isColumnOver = overId === columnData.id;\n\n const handleColumnClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (config.onColumnClick) {\n config.onColumnClick(column);\n } else if (config.allowColumnEdit) {\n config.onEditColumn?.(column); // Custom handler\n // or open default modal if no custom handler? \n // Current design prefers Store control for default modals.\n // We'll also set Store ID for default behavior compatibility if no custom handler prevents it.\n setEditingColumnId(columnData.id);\n }\n };\n\n return (\n <div\n onClick={handleColumnClick}\n style={{\n width: config.columnWidth,\n maxHeight: '100%',\n boxSizing: 'border-box'\n }}\n className={cn(\n \"flex flex-col group/column bg-column-bg rounded-column transition-all relative select-none h-fit max-h-full\",\n \"duration-250 ease-[cubic-bezier(0.18,0.67,0.6,1.22)]\", // Spring-like transition\n isColumnOver && \"bg-blue-50/50 ring-1 ring-blue-300 shadow-sm\",\n isActiveColumnDragging && !isDragging && !isOverlay && \"scale-[0.98] border border-slate-200 border-dashed opacity-50\", // Other columns\n isDragging && !isOverlay && \"opacity-20\", // Placeholder\n isOverlay && \"bg-slate-100/80 shadow-[0_20px_50px_rgba(0,0,0,0.15)] scale-[1.02] z-50 cursor-grabbing ring-1 ring-slate-300\" // Overlay\n )}\n >\n {/* Column Reorder Indicators */}\n {overId === columnData.id && overSide === 'left' && (\n <div className=\"absolute top-0 bottom-0 -left-[4px] w-[4px] bg-blue-500 rounded-full z-20 pointer-events-none shadow-sm\" />\n )}\n {overId === columnData.id && overSide === 'right' && (\n <div className=\"absolute top-0 bottom-0 -right-[4px] w-[4px] bg-blue-500 rounded-full z-20 pointer-events-none shadow-sm\" />\n )}\n <div onClick={(e) => e.stopPropagation()}>\n {config.renderColumnHeader({\n column,\n cardCount: columnData.cardIds.length,\n isOver: isColumnOver,\n dragHandleProps,\n onAddCard: config.allowAdd ? () => setAddingCardInColumnId(columnData.id) : undefined,\n onEditColumn: config.allowColumnEdit ? () => setEditingColumnId(columnData.id) : undefined\n })}\n </div>\n\n <div\n className={cn(\n \"flex-1 flex flex-col min-h-0 transition-colors duration-200\",\n isColumnOver && \"bg-blue-50/30\"\n )}\n style={{ minHeight: config.columnMinHeight }}\n >\n {columnData.cardIds.length === 0 ? (\n // Empty column - simple area with parentRef for eventual virtualizer stability\n <div\n ref={parentRef}\n className={cn(\n \"flex-1 px-3 pb-2 flex items-center justify-center border-2 border-dashed border-transparent rounded-b-lg transition-colors\",\n isColumnOver && \"border-blue-300\"\n )}\n >\n <div className=\"pointer-events-none select-none opacity-50\">\n {config.renderColumnEmpty({})}\n </div>\n </div>\n ) : (\n // Column with cards - use SortableContext for reordering\n <SortableContext items={columnData.cardIds} strategy={verticalListSortingStrategy}>\n <div\n ref={parentRef}\n className=\"flex-1 overflow-y-auto px-3 pb-2 scrollbar-thin scrollbar-thumb-slate-300 scrollbar-track-transparent\"\n style={{ minHeight: config.columnMinHeight }}\n >\n <div\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n width: '100%',\n position: 'relative',\n }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualRow) => {\n const cardId = columnData.cardIds[virtualRow.index];\n const card = allCards[cardId];\n\n if (!card) return null;\n\n const isActive = cardId === activeId;\n\n return (\n <div\n key={cardId}\n data-index={virtualRow.index}\n data-card-id={cardId}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n <KanbanCard<TCard>\n card={card}\n isDragging={isActive}\n renderCard={config.renderCard}\n onClick={config.onCardClick}\n onEdit={config.onEditCard}\n allowEdit={config.allowEdit}\n index={virtualRow.index}\n columnId={columnData.id}\n overId={overId}\n overSide={overSide}\n />\n </div>\n );\n })}\n </div>\n </div>\n </SortableContext>\n )}\n </div>\n {/* Add Card Section (Button Only - Form is global modal now) */}\n {config.allowAdd && (\n <div\n className=\"p-3 border-t border-slate-200 shrink-0 relative z-20\"\n onClick={(e) => e.stopPropagation()}\n >\n {config.renderAddButton ? (\n config.renderAddButton({\n columnId: columnData.id,\n onClick: () => setAddingCardInColumnId(columnData.id)\n })\n ) : (\n <AddCardButton onClick={() => setAddingCardInColumnId(columnData.id)} />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const KanbanColumn = memo(KanbanColumnInner) as <TCard extends { id: string }, TColumn extends { id: string; title: string }>(props: KanbanColumnProps<TCard, TColumn>) => React.ReactElement;","import * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils/utils\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/40 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> { }\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => (\n <SheetPortal>\n {/* Overlay removed for filter drawer - board remains fully visible */}\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), \"bg-white shadow-2xl\", className)}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import type {\n FilterGroup as FilterGroupType,\n FilterRule as FilterRuleType,\n FilterOperator\n} from '@/lib/types/kanban';\nimport type { DiscoveredField } from '@/lib/utils/data-discovery';\nimport { Trash2, Plus, X } from 'lucide-react';\nimport { useKanbanStore } from '@/lib/store/use-kanban-store';\nimport { Button } from '@/components/ui/button';\n\ninterface FilterGroupProps {\n group: FilterGroupType;\n availableFields: DiscoveredField[];\n}\n\nexport function FilterGroup({ group, availableFields }: FilterGroupProps) {\n const { updateFilterGroup, removeFilterGroup } = useKanbanStore();\n\n const handleAddRule = () => {\n const newRule: FilterRuleType = {\n id: crypto.randomUUID(),\n field: '',\n operator: 'contains',\n value: '',\n enabled: true\n };\n updateFilterGroup(group.id, {\n rules: [...group.rules, newRule]\n });\n };\n\n const handleRemoveRule = (ruleId: string) => {\n updateFilterGroup(group.id, {\n rules: group.rules.filter(r => 'id' in r && r.id !== ruleId)\n });\n };\n\n const handleUpdateRule = (ruleId: string, updates: Partial<FilterRuleType>) => {\n updateFilterGroup(group.id, {\n rules: group.rules.map(r => ('id' in r && r.id === ruleId) ? { ...r, ...updates } : r)\n });\n };\n\n const toggleConjunction = () => {\n updateFilterGroup(group.id, {\n conjunction: group.conjunction === 'and' ? 'or' : 'and'\n });\n };\n\n return (\n <div className=\"p-4 border rounded-lg bg-slate-50/50 space-y-4 relative group\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-[10px] uppercase font-bold tracking-wider hover:bg-white\"\n onClick={toggleConjunction}\n >\n {group.conjunction}\n </Button>\n <span className=\"text-xs text-muted-foreground italic\">dos seguintes critérios:</span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={() => removeFilterGroup(group.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div className=\"space-y-3\">\n {group.rules.map((rule) => {\n if ('field' in rule) {\n return (\n <FilterRuleRow\n key={rule.id}\n rule={rule}\n availableFields={availableFields}\n onDelete={() => handleRemoveRule(rule.id)}\n onUpdate={(updates) => handleUpdateRule(rule.id, updates)}\n />\n );\n }\n return null; // Nested groups not supported in basic UI yet\n })}\n\n {group.rules.length === 0 && (\n <div className=\"text-center py-4 border-2 border-dashed rounded-md bg-white/50 cursor-pointer hover:bg-white transition-colors\" onClick={handleAddRule}>\n <p className=\"text-xs text-muted-foreground\">Nenhuma regra definida. Clique para adicionar.</p>\n </div>\n )}\n </div>\n\n <Button variant=\"ghost\" size=\"sm\" className=\"w-full h-8 text-xs border-dashed border hover:border-solid mt-2 bg-white\" onClick={handleAddRule}>\n <Plus className=\"mr-2 h-3 w-3\" />\n Adicionar Regra\n </Button>\n </div>\n );\n}\n\ninterface FilterRuleRowProps {\n rule: FilterRuleType;\n availableFields: DiscoveredField[];\n onDelete: () => void;\n onUpdate: (updates: Partial<FilterRuleType>) => void;\n}\n\nfunction FilterRuleRow({ rule, availableFields, onDelete, onUpdate }: FilterRuleRowProps) {\n\n const operators: { label: string; value: FilterOperator }[] = [\n { label: 'contém', value: 'contains' },\n { label: 'não contém', value: 'notContains' },\n { label: 'igual a', value: 'eq' },\n { label: 'diferente de', value: 'neq' },\n { label: 'maior que', value: 'gt' },\n { label: 'menor que', value: 'lt' },\n { label: 'está vazio', value: 'isEmpty' },\n { label: 'não está vazio', value: 'isNotEmpty' },\n ];\n\n return (\n <div className={`flex items-center gap-2 bg-white p-2 rounded-md border shadow-sm transition-all duration-200 group/row ${!rule.enabled ? 'opacity-50 grayscale bg-slate-50' : 'hover:border-primary/30'}`}>\n <input\n type=\"checkbox\"\n checked={rule.enabled}\n onChange={(e) => onUpdate({ enabled: e.target.checked })}\n className=\"h-3 w-3 rounded border-slate-300 text-primary focus:ring-primary cursor-pointer\"\n title={rule.enabled ? 'Desabilitar regra' : 'Habilitar regra'}\n />\n\n <select\n value={rule.field}\n onChange={(e) => onUpdate({ field: e.target.value })}\n className=\"flex-[1.5] min-w-[100px] bg-transparent text-[11px] font-semibold focus:outline-none truncate\"\n disabled={!rule.enabled}\n >\n <option value=\"\" disabled>Campo...</option>\n {availableFields.map(f => (\n <option key={f.value} value={f.value}>{f.label}</option>\n ))}\n </select>\n\n <select\n value={rule.operator}\n onChange={(e) => onUpdate({ operator: e.target.value as FilterOperator })}\n className=\"flex-1 min-w-[90px] bg-transparent text-[11px] text-muted-foreground focus:outline-none border-x px-2\"\n disabled={!rule.enabled}\n >\n {operators.map(o => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n\n <input\n type={(availableFields.find(f => f.value === rule.field)?.type ?? 'text') === 'number' ? 'number' : 'text'}\n value={rule.value as string || ''}\n onChange={(e) => onUpdate({ value: e.target.value })}\n placeholder=\"Valor...\"\n disabled={!rule.enabled || rule.operator === 'isEmpty' || rule.operator === 'isNotEmpty'}\n className=\"flex-[2] min-w-[100px] bg-transparent text-[11px] focus:outline-none placeholder:italic disabled:opacity-30 font-medium\"\n />\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 shrink-0 hover:bg-destructive/10 hover:text-destructive opacity-0 group-row-hover/row:opacity-100 transition-opacity\"\n onClick={onDelete}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n );\n}\n","import type { KanboomCard } from '../types/kanban';\n\nexport interface DiscoveredField {\n label: string;\n value: string;\n type: 'text' | 'number' | 'boolean' | 'other';\n}\n\nexport function discoverFields(cards: Record<string, KanboomCard>): DiscoveredField[] {\n const fields: Record<string, DiscoveredField> = {\n title: { label: 'Título', value: 'title', type: 'text' },\n description: { label: 'Descrição', value: 'description', type: 'text' },\n };\n\n\n Object.values(cards).forEach((card) => {\n if (card.metadata && typeof card.metadata === 'object') {\n Object.entries(card.metadata).forEach(([key, value]) => {\n const path = `metadata.${key}`;\n if (!fields[path]) {\n let type: DiscoveredField['type'] = 'other';\n if (typeof value === 'string') type = 'text';\n else if (typeof value === 'number') type = 'number';\n else if (typeof value === 'boolean') type = 'boolean';\n\n fields[path] = {\n label: `${key.charAt(0).toUpperCase() + key.slice(1)} (Meta)`,\n value: path,\n type,\n };\n }\n });\n }\n });\n\n return Object.values(fields);\n}\n","import { Button } from '@/components/ui/button';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from '@/components/ui/sheet';\nimport { useKanbanStore } from '@/lib/store/use-kanban-store';\nimport type { FilterGroup as FilterGroupType } from '@/lib/types/kanban';\nimport { Filter, Plus } from 'lucide-react';\nimport { FilterGroup } from './filter-group';\nimport { discoverFields } from '../utils/data-discovery';\nimport { useMemo } from 'react';\n\nexport function KanbanFilterDrawer() {\n const { filters, addFilterGroup, cards } = useKanbanStore();\n\n const availableFields = useMemo(() => discoverFields(cards), [cards]);\n\n const handleAddGroup = () => {\n const newGroup: FilterGroupType = {\n id: crypto.randomUUID(),\n conjunction: 'and',\n rules: [],\n enabled: true\n };\n addFilterGroup(newGroup);\n };\n\n return (\n <Sheet>\n <SheetTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2 text-slate-600 bg-white hover:bg-slate-50 border-slate-200 shadow-sm\">\n <Filter className=\"h-4 w-4\" />\n Filtros\n {filters.groups.length > 0 && (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-primary text-[10px] text-primary-foreground font-bold shadow-sm\">\n {filters.groups.length}\n </span>\n )}\n </Button>\n </SheetTrigger>\n <SheetContent className=\"w-full sm:w-[600px] sm:max-w-none overflow-y-auto bg-white/95 backdrop-blur-sm border-l shadow-2xl\">\n <SheetHeader className=\"pb-6 border-b\">\n <div className=\"flex items-center justify-between\">\n <div>\n <SheetTitle className=\"text-xl font-bold text-slate-800\">Filtros Avançados</SheetTitle>\n <SheetDescription className=\"text-sm text-slate-500\">\n Crie combinações de filtros para refinar sua visualização do board.\n </SheetDescription>\n </div>\n {filters.groups.length > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={useKanbanStore.getState().clearFilters}\n className=\"text-xs font-bold text-slate-400 hover:text-destructive h-8\"\n >\n Limpar Tudo\n </Button>\n )}\n </div>\n </SheetHeader>\n\n <div className=\"mt-8 space-y-6\">\n {filters.groups.length === 0 ? (\n <div className=\"text-center py-12 px-6 bg-slate-50/50 border-2 border-dashed border-slate-200 rounded-xl space-y-2\">\n <Filter className=\"mx-auto h-8 w-8 text-slate-300\" />\n <p className=\"text-slate-600 font-medium\">Nenhum filtro ativo.</p>\n <p className=\"text-xs text-slate-400\">Adicione um grupo para começar a filtrar seus itens.</p>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {filters.groups.map(group => (\n <FilterGroup\n key={group.id}\n group={group}\n availableFields={availableFields}\n />\n ))}\n </div>\n )}\n\n <Button onClick={handleAddGroup} className=\"w-full\" variant=\"outline\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Adicionar Grupo de Filtros\n </Button>\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { cn } from '@/lib/utils/cn';\nimport { Plus } from 'lucide-react';\nimport { useState } from 'react';\n\ninterface DefaultAddCardFormProps {\n columnId: string;\n onAdd: (data: any) => void;\n onCancel: () => void;\n}\n\nexport function DefaultAddCardForm({ columnId: _columnId, onAdd, onCancel }: DefaultAddCardFormProps) {\n const [title, setTitle] = useState('');\n const [description, setDescription] = useState('');\n const [priority, setPriority] = useState('medium');\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n onAdd({\n title,\n description,\n metadata: { priority }\n });\n };\n\n return (\n <Dialog open={true} onOpenChange={(open) => !open && onCancel()}>\n <DialogContent className=\"sm:max-w-[425px]\">\n <DialogHeader>\n <DialogTitle>Adicionar Novo Card</DialogTitle>\n <DialogDescription>\n Novo item para a coluna.\n </DialogDescription>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"grid gap-4 py-4\">\n <div className=\"grid gap-2\">\n <label htmlFor=\"title\" className=\"text-sm font-medium leading-none\">\n Título\n </label>\n <input\n id=\"title\"\n autoFocus\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n placeholder=\"O que precisa ser feito?\"\n />\n </div>\n\n <div className=\"grid gap-2\">\n <label className=\"text-sm font-medium leading-none\">Prioridade</label>\n <div className=\"flex gap-2\">\n {['low', 'medium', 'high'].map((p) => (\n <button\n key={p}\n type=\"button\"\n onClick={() => setPriority(p)}\n className={cn(\n \"flex-1 px-3 py-2 text-xs font-bold uppercase tracking-wider rounded-md border transition-all\",\n priority === p\n ? p === 'high' ? \"bg-red-100 border-red-500 text-red-700\" :\n p === 'medium' ? \"bg-amber-100 border-amber-500 text-amber-900\" :\n \"bg-emerald-100 border-emerald-500 text-emerald-800\"\n : \"bg-transparent border-slate-200 text-slate-500 hover:bg-slate-50\"\n )}\n >\n {p === 'low' ? 'Baixa' : p === 'medium' ? 'Média' : 'Alta'}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"grid gap-2\">\n <label htmlFor=\"desc\" className=\"text-sm font-medium leading-none\">\n Descrição\n </label>\n <textarea\n id=\"desc\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={3}\n className=\"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm resize-none focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n placeholder=\"Detalhes adicionais...\"\n />\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onCancel}>\n Cancelar\n </Button>\n <Button type=\"submit\" className=\"gap-2 bg-blue-600 hover:bg-blue-700 text-white\">\n <Plus size={16} />\n Criar Card\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState } from 'react';\nimport { Save, Trash2 } from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Button } from \"@/components/ui/button\";\n\ninterface DefaultEditColumnFormProps {\n column: any;\n onSave: (updates: any) => void;\n onCancel: () => void;\n onDelete?: () => void;\n}\n\nexport function DefaultEditColumnForm({ column, onSave, onCancel, onDelete }: DefaultEditColumnFormProps) {\n const [title, setTitle] = useState(column.title || '');\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n onSave({ title });\n };\n\n return (\n <Dialog open={true} onOpenChange={(open) => !open && onCancel()}>\n <DialogContent className=\"sm:max-w-[400px]\">\n <DialogHeader>\n <DialogTitle>Editar Coluna</DialogTitle>\n <DialogDescription>\n Gerencie as configurações desta coluna.\n </DialogDescription>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"grid gap-4 py-4\">\n <div className=\"grid gap-2\">\n <label htmlFor=\"col-title\" className=\"text-sm font-medium leading-none\">\n Nome da Coluna\n </label>\n <input\n id=\"col-title\"\n autoFocus\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n placeholder=\"Ex: A Fazer\"\n />\n </div>\n\n <DialogFooter className=\"flex items-center justify-between w-full sm:justify-between\">\n {onDelete ? (\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n if (window.confirm(\"Tem certeza que deseja excluir esta coluna e mover seus cards para a anterior?\")) {\n onDelete();\n }\n }}\n className=\"gap-2\"\n >\n <Trash2 size={14} />\n Excluir\n </Button>\n ) : <div />}\n\n <div className=\"flex gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={onCancel}>\n Cancelar\n </Button>\n <Button type=\"submit\" className=\"gap-2\">\n <Save size={14} />\n Salvar\n </Button>\n </div>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import {\n DndContext,\n DragOverlay,\n MeasuringStrategy,\n closestCenter,\n getFirstCollision,\n pointerWithin,\n rectIntersection,\n useDroppable\n} from '@dnd-kit/core';\nimport { SortableContext, horizontalListSortingStrategy, useSortable } from '@dnd-kit/sortable';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { Plus } from 'lucide-react';\nimport { cloneElement, isValidElement, memo, useEffect, useMemo, useRef } from 'react';\nimport { cn } from '@/lib/utils/utils';\nimport { useKanban } from '../hooks/use-kanban';\nimport { CSS } from '@dnd-kit/utilities';\nimport { useKanbanDnd } from '../hooks/use-kanban-dnd';\nimport type { KanboomCard, KanboomColumn, KanboomConfig } from '../types/kanban';\nimport { evaluateFilter } from '../utils/filter-evaluator';\nimport { DefaultCard } from './default/default-card';\nimport { DefaultColumnEmpty } from './default/default-column-empty';\nimport { DefaultColumnHeader } from './default/default-column-header';\nimport { DefaultEditForm } from './default/default-edit-form';\nimport { DefaultCardView } from './default/default-card-view';\nimport { FilterChips } from './filter-chips';\nimport { KanbanColumn } from './kanban-column';\nimport { KanbanFilterDrawer } from './kanban-filter-drawer';\nimport { DefaultAddCardForm } from './default/default-add-card-form';\nimport { DefaultEditColumnForm } from './default/default-edit-column-form';\n\n// Droppable Wrapper for New Column Button\nconst DroppableNewColumnButton = memo(({\n children\n}: {\n children: (isOver: boolean, setNodeRef: (element: HTMLElement | null) => void) => React.ReactNode;\n}) => {\n const { setNodeRef, isOver } = useDroppable({\n id: 'new-column-drop-target',\n data: { type: 'NewColumn' }\n });\n\n return (\n <>\n {children(isOver, setNodeRef)}\n </>\n );\n});\n\n// Sortable Wrapper for Virtual Column\nconst SortableVirtualColumn = memo(({\n id,\n start,\n width,\n children,\n allowReorder,\n cardIds\n}: {\n id: string,\n start: number,\n width: number,\n children: React.ReactNode,\n allowReorder: boolean,\n cardIds: string[]\n}) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging: isSortableDragging\n } = useSortable({\n id,\n disabled: !allowReorder,\n data: {\n type: 'Column',\n children: cardIds // CRITICAL: Pass card IDs for collision detection\n }\n });\n\n const style = {\n position: 'absolute' as const,\n top: 0,\n left: `${start}px`, // Virtual positioning via left, NOT transform\n width: `${width}px`,\n transition: transition || 'transform 250ms cubic-bezier(0.18, 0.67, 0.6, 1.22)',\n // Transform is now ONLY for dnd-kit's sorting logic\n transform: transform && !isSortableDragging\n ? CSS.Transform.toString(transform)\n : undefined,\n zIndex: isSortableDragging ? 50 : undefined,\n pointerEvents: (isSortableDragging ? 'none' : undefined) as React.CSSProperties['pointerEvents'],\n animation: isSortableDragging ? 'tilt 0.2s ease-in-out forwards' : undefined,\n };\n\n return (\n <div ref={setNodeRef} style={style}>\n {isValidElement(children) ? (\n cloneElement(children as any, {\n dragHandleProps: allowReorder ? { attributes, listeners } : undefined,\n isDragging: isSortableDragging\n })\n ) : children}\n </div>\n );\n});\n\ninterface KanboomBoardProps<TCard extends { id: string } = KanboomCard, TColumn extends { id: string; title: string } = KanboomColumn> {\n config?: KanboomConfig<TCard, TColumn>;\n}\n\nexport function KanboomBoard<TCard extends { id: string } = KanboomCard, TColumn extends { id: string; title: string } = KanboomColumn>({\n config\n}: KanboomBoardProps<TCard, TColumn>) {\n const kanban = useKanban<TCard, TColumn>(config);\n const parentRef = useRef<HTMLDivElement>(null);\n\n const columnVirtualizer = useVirtualizer({\n horizontal: true,\n count: kanban.columnOrder.length,\n getScrollElement: () => parentRef.current,\n estimateSize: () => kanban.config.columnWidth + kanban.config.gap,\n overscan: 5,\n });\n\n // Filter cards and columns\n const filteredData = useMemo(() => {\n const filteredCards: Record<string, KanboomCard> = {};\n\n // 1. Filter cards\n Object.values(kanban.cards).forEach(card => {\n if (evaluateFilter(card, kanban.filters)) {\n filteredCards[card.id] = card;\n }\n });\n\n // 2. Filter card IDs inside columns\n const filteredColumns: Record<string, KanboomColumn> = {};\n Object.values(kanban.columns).forEach(column => {\n filteredColumns[column.id] = {\n ...column,\n cardIds: column.cardIds.filter(id => filteredCards[id])\n };\n });\n\n return {\n cards: filteredCards,\n columns: filteredColumns,\n };\n }, [kanban.cards, kanban.columns, kanban.filters]);\n\n\n // Refs for collision detection fallback (from official dnd-kit pattern)\n const lastOverId = useRef<string | null>(null);\n const recentlyMovedToNewContainer = useRef(false);\n\n // Reset recentlyMovedToNewContainer after layout settles\n useEffect(() => {\n requestAnimationFrame(() => {\n recentlyMovedToNewContainer.current = false;\n });\n }, [kanban.columnOrder, kanban.columns]);\n\n const dnd = useKanbanDnd({\n dragActivationDistance: kanban.config.dragActivationDistance,\n touchActivationDelay: kanban.config.touchActivationDelay,\n onDragStart: (id: string, _type: 'Card' | 'Column') => {\n kanban.handleDragStart(id);\n },\n onDragOver: kanban.handleDragOver,\n onDragEnd: kanban.handleDragEnd,\n onCardMove: kanban.moveCard,\n onColumnMove: kanban.moveColumn,\n onCreateColumnWithCard: (cardId: string, sourceColumnId: string) => {\n kanban.addColumnWithCard(cardId, sourceColumnId, { title: 'Nova Coluna' });\n },\n columns: kanban.columns,\n columnOrder: kanban.columnOrder,\n recentlyMovedToNewContainer\n });\n\n const activeCard = kanban.activeId && kanban.cards[kanban.activeId] ? kanban.cards[kanban.activeId] : null;\n const activeColumn = kanban.activeId && kanban.columnOrder.includes(kanban.activeId) ? kanban.columns[kanban.activeId] : null;\n const viewingCard = kanban.viewingCardId ? kanban.cards[kanban.viewingCardId] : null;\n const editingColumn = kanban.editingColumnId ? kanban.columns[kanban.editingColumnId] : null;\n\n const finalConfig = {\n renderCard: config?.renderCard ?? ((props: any) => <DefaultCard {...props} />),\n renderColumnHeader: config?.renderColumnHeader ?? ((props: any) => <DefaultColumnHeader {...props} />),\n renderColumnEmpty: config?.renderColumnEmpty ?? (() => <DefaultColumnEmpty />),\n renderAddButton: config?.renderAddButton,\n renderAddForm: config?.renderAddForm,\n renderEditForm: config?.renderEditForm,\n renderAddColumnButton: config?.renderAddColumnButton,\n renderAddColumnForm: config?.renderAddColumnForm,\n renderEditColumnForm: config?.renderEditColumnForm,\n estimatedCardHeight: kanban.config.estimatedCardHeight,\n virtualOverscan: kanban.config.virtualOverscan,\n columnWidth: kanban.config.columnWidth,\n columnMinHeight: kanban.config.columnMinHeight,\n onCardClick: config?.onCardClick ?? ((card: TCard) => kanban.setViewingCardId(card.id)),\n onColumnClick: config?.onColumnClick,\n onEdit: kanban.config.allowEdit ? kanban.setEditingCardId : undefined,\n onEditColumn: (column: TColumn) => kanban.setEditingColumnId((column as any).id),\n renderCardView: config?.renderCardView,\n allowAdd: kanban.config.allowAdd,\n allowColumnAdd: kanban.config.allowColumnAdd,\n allowColumnEdit: kanban.config.allowColumnEdit,\n allowColumnDelete: kanban.config.allowColumnDelete,\n allowColumnReorder: kanban.config.allowColumnReorder,\n allowFilters: (kanban.config as any).allowFilters,\n };\n\n /**\n * Custom collision detection strategy optimized for multiple containers\n * Based on official dnd-kit MultipleContainers example\n */\n const customCollisionDetection = (args: any) => {\n const activeId = args.active.id;\n const isDraggingCard = activeId && !kanban.columnOrder.includes(activeId as string);\n\n // If dragging a column, use closestCenter (snappier for horizontal reordering)\n if (!isDraggingCard) {\n return closestCenter(args);\n }\n\n // 1. Explicit check for New Column target - HIGH PRIORITY\n const pointerCollisions = pointerWithin(args);\n if (activeId && pointerCollisions.length > 0) {\n const newColumnCollision = pointerCollisions.find(c => c.id === 'new-column-drop-target');\n if (newColumnCollision) {\n return [newColumnCollision];\n }\n }\n\n // 2. Dragging a card - use multi-container strategy\n // Find intersecting containers with the active draggable rect\n const intersections = pointerCollisions.length > 0\n ? pointerCollisions\n : rectIntersection(args);\n\n let overId = getFirstCollision(intersections, 'id');\n\n if (overId != null) {\n // If we found a container (column), get the closest item within it\n if (kanban.columnOrder.includes(overId as string)) {\n const column = kanban.columns[overId as string];\n if (column && column.cardIds.length > 0) {\n // Return the closest droppable within that container\n const containerItems = args.droppableContainers.filter(\n (container: any) =>\n container.id !== overId && column.cardIds.includes(container.id)\n );\n if (containerItems.length > 0) {\n const closest = closestCenter({\n ...args,\n droppableContainers: containerItems,\n });\n overId = closest[0]?.id ?? overId;\n }\n }\n }\n\n lastOverId.current = overId as string;\n return [{ id: overId }];\n }\n\n\n // 4. Fallback to normal collision detection\n const collisions = closestCenter({\n ...args,\n droppableContainers: args.droppableContainers.filter(\n (container: any) => container.id !== activeId\n )\n });\n\n if (collisions.length > 0) {\n lastOverId.current = collisions[0].id as string;\n return collisions;\n }\n\n if (recentlyMovedToNewContainer.current) {\n lastOverId.current = activeId as string;\n }\n\n // If no droppable is matched, return the last match\n return lastOverId.current ? [{ id: lastOverId.current }] : [];\n };\n\n return (\n <DndContext\n sensors={dnd.sensors}\n collisionDetection={customCollisionDetection}\n measuring={{\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n }}\n onDragStart={dnd.handleDragStart}\n onDragOver={dnd.handleDragOver}\n onDragEnd={dnd.handleDragEnd}\n >\n <div className=\"flex flex-col h-full bg-slate-50 relative group/board overflow-hidden\">\n {/* Floating Controls */}\n {kanban.config.allowFilters && (\n <div className=\"absolute top-4 right-6 z-30 pointer-events-none\">\n <div className=\"pointer-events-auto transition-all duration-300 translate-y-[-10px] opacity-0 group-hover/board:translate-y-0 group-hover/board:opacity-100\">\n <KanbanFilterDrawer />\n </div>\n </div>\n )}\n\n {kanban.config.allowFilters && <FilterChips />}\n\n <div\n ref={parentRef}\n className=\"flex-1 overflow-x-auto overflow-y-hidden\"\n >\n\n <div\n style={{\n width: `${columnVirtualizer.getTotalSize() + (kanban.config.allowColumnAdd ? 200 : 0)}px`,\n height: '100%',\n position: 'relative',\n }}\n >\n <SortableContext items={kanban.columnOrder} strategy={horizontalListSortingStrategy}>\n {columnVirtualizer.getVirtualItems().map((virtualColumn) => {\n const columnId = kanban.columnOrder[virtualColumn.index];\n return (\n <SortableVirtualColumn\n key={columnId}\n id={columnId}\n start={virtualColumn.start}\n width={kanban.config.columnWidth}\n allowReorder={kanban.config.allowColumnReorder}\n cardIds={filteredData.columns[columnId]?.cardIds ?? []}\n >\n <KanbanColumn<TCard, TColumn>\n column={filteredData.columns[columnId] as unknown as TColumn}\n allCards={filteredData.cards as unknown as Record<string, TCard>}\n activeId={kanban.activeId}\n overId={kanban.overId}\n overSide={kanban.overSide}\n config={finalConfig as any}\n isActiveColumnDragging={kanban.activeId ? kanban.columnOrder.includes(kanban.activeId) : false}\n />\n </SortableVirtualColumn>\n );\n })}\n </SortableContext>\n\n {/* Add Column Section at the end */}\n {kanban.config.allowColumnAdd && (\n <DroppableNewColumnButton>\n {(isOver, setNodeRef) => (\n <div\n ref={setNodeRef}\n className=\"h-full z-10\"\n style={{\n position: 'absolute',\n top: 0,\n left: `${columnVirtualizer.getTotalSize()}px`,\n width: kanban.config.columnWidth,\n height: '100%',\n boxSizing: 'border-box',\n paddingRight: kanban.config.gap\n }}\n >\n {config?.renderAddColumnButton ? (\n config.renderAddColumnButton({ onClick: () => kanban.addColumn({ title: 'Nova Coluna' }) })\n ) : (\n <button\n onClick={() => kanban.addColumn({ title: 'Nova Coluna' })}\n className={cn(\n \"flex items-center gap-2 w-full p-4 bg-slate-100/50 hover:bg-slate-200 text-slate-600 rounded-lg border-2 border-dashed transition-all font-semibold h-[200px] justify-center\",\n isOver ? \"bg-blue-100 border-blue-400 text-blue-600 scale-[1.02] shadow-lg ring-4 ring-blue-500/20\" : \"border-slate-300\"\n )}\n >\n <Plus size={20} />\n {isOver ? 'Soltar para criar' : 'Nova Coluna'}\n </button>\n )}\n </div>\n )}\n </DroppableNewColumnButton>\n )}\n </div>\n </div>\n\n {/* Editing Card Form */}\n {kanban.editingCardId && kanban.config.allowEdit && (\n (() => {\n const editingCard = kanban.cards[kanban.editingCardId!];\n if (!editingCard) return null;\n\n return config?.renderEditForm ? (\n config.renderEditForm({\n card: editingCard as unknown as TCard,\n onSave: (updates) => {\n kanban.updateCard(kanban.editingCardId!, updates);\n kanban.clearEditingCardId();\n },\n onCancel: kanban.clearEditingCardId,\n onDelete: () => {\n kanban.deleteCard(kanban.editingCardId!);\n kanban.clearEditingCardId();\n }\n })\n ) : (\n <DefaultEditForm\n card={editingCard}\n onSave={(updates) => {\n kanban.updateCard(kanban.editingCardId!, updates);\n kanban.clearEditingCardId();\n }}\n onCancel={kanban.clearEditingCardId}\n onDelete={() => {\n kanban.deleteCard(kanban.editingCardId!);\n kanban.clearEditingCardId();\n }}\n />\n );\n })()\n )}\n\n {/* Add Card Modal */}\n {kanban.addingCardInColumnId && kanban.config.allowAdd && (\n config?.renderAddForm ? (\n config.renderAddForm({\n columnId: kanban.addingCardInColumnId,\n onAdd: (data) => {\n kanban.addCard(kanban.addingCardInColumnId!, data as any);\n kanban.clearAddingCardInColumnId();\n },\n onCancel: kanban.clearAddingCardInColumnId\n })\n ) : (\n <DefaultAddCardForm\n columnId={kanban.addingCardInColumnId}\n onAdd={(data) => {\n kanban.addCard(kanban.addingCardInColumnId!, data);\n kanban.clearAddingCardInColumnId();\n }}\n onCancel={kanban.clearAddingCardInColumnId}\n />\n )\n )}\n\n {/* Editing Column Form */}\n {editingColumn && kanban.config.allowColumnEdit && (\n config?.renderEditColumnForm ? (\n config.renderEditColumnForm({\n column: editingColumn as unknown as TColumn,\n onSave: (updates) => {\n kanban.updateColumn((editingColumn as any).id, updates);\n kanban.clearEditingColumnId();\n },\n onCancel: kanban.clearEditingColumnId,\n onDelete: kanban.config.allowColumnDelete ? () => {\n kanban.deleteColumn((editingColumn as any).id);\n kanban.clearEditingColumnId();\n } : undefined\n })\n ) : (\n <DefaultEditColumnForm\n column={editingColumn}\n onSave={(updates) => {\n kanban.updateColumn((editingColumn as any).id, updates);\n kanban.clearEditingColumnId();\n }}\n onCancel={kanban.clearEditingColumnId}\n onDelete={kanban.config.allowColumnDelete ? () => {\n kanban.deleteColumn((editingColumn as any).id);\n kanban.clearEditingColumnId();\n } : undefined}\n />\n )\n )}\n {/* Card View Modal */}\n {viewingCard && (\n finalConfig.renderCardView ? (\n finalConfig.renderCardView({\n card: viewingCard as unknown as TCard,\n onClose: kanban.clearViewingCardId\n })\n ) : (\n <DefaultCardView\n card={viewingCard as unknown as KanboomCard}\n onClose={kanban.clearViewingCardId}\n />\n )\n )}\n\n <DragOverlay dropAnimation={null}>\n {activeCard && (\n <div className=\"z-50 cursor-grabbing animate-tilt shadow-2xl rounded-card overflow-hidden\">\n {finalConfig.renderCard({\n card: activeCard as unknown as TCard,\n isDragging: true\n })}\n </div>\n )}\n {activeColumn ? (\n <KanbanColumn<TCard, TColumn>\n column={activeColumn as unknown as TColumn}\n allCards={kanban.cards as unknown as Record<string, TCard>}\n activeId={null}\n overId={null}\n overSide={null}\n config={finalConfig as any}\n isDragging={false}\n isOverlay={true}\n dragHandleProps={{\n attributes: {},\n listeners: {}\n }}\n />\n ) : null}\n </DragOverlay>\n </div>\n </DndContext>\n );\n}","import type { KanbanStore } from './use-kanban-store';\nimport type { KanboomCard, KanboomColumn } from '../types/kanban';\n\n/**\n * Zustand selectors for optimized component subscriptions\n * Components should use these instead of subscribing to the entire store\n */\n\n// === CARD SELECTORS ===\n\nexport const selectCard = (cardId: string) => (state: KanbanStore): KanboomCard | undefined =>\n state.cards[cardId];\n\nexport const selectAllCards = (state: KanbanStore): Record<string, KanboomCard> =>\n state.cards;\n\nexport const selectCardsByIds = (cardIds: string[]) => (state: KanbanStore): KanboomCard[] =>\n cardIds.map(id => state.cards[id]).filter(Boolean);\n\n// === COLUMN SELECTORS ===\n\nexport const selectColumn = (columnId: string) => (state: KanbanStore): KanboomColumn | undefined =>\n state.columns[columnId];\n\nexport const selectAllColumns = (state: KanbanStore): Record<string, KanboomColumn> =>\n state.columns;\n\nexport const selectColumnOrder = (state: KanbanStore): string[] =>\n state.columnOrder;\n\nexport const selectColumnCards = (columnId: string) => (state: KanbanStore): KanboomCard[] => {\n const column = state.columns[columnId];\n if (!column) return [];\n return column.cardIds.map(id => state.cards[id]).filter(Boolean);\n};\n\nexport const selectColumnCardIds = (columnId: string) => (state: KanbanStore): string[] => {\n const column = state.columns[columnId];\n return column?.cardIds || [];\n};\n\n// === ACTIONS SELECTORS ===\n// Note: CRUD actions will be added in future implementation\n\nexport const selectMoveCard = (state: KanbanStore) => state.moveCard;\nexport const selectMoveColumn = (state: KanbanStore) => state.moveColumn;\nexport const selectSetBoardData = (state: KanbanStore) => state.setBoardData;\n\n// === UTILITY SELECTORS ===\n\nexport const selectBoardData = (state: KanbanStore) => ({\n cards: state.cards,\n columns: state.columns,\n columnOrder: state.columnOrder,\n});\n\nexport const selectCardCount = (state: KanbanStore): number =>\n Object.keys(state.cards).length;\n\nexport const selectColumnCount = (state: KanbanStore): number =>\n state.columnOrder.length;\n","import { useEffect, useState, useRef } from 'react';\n\nexport const useFPS = () => {\n const [fps, setFps] = useState(0);\n const frameCount = useRef(0);\n const lastTime = useRef(performance.now());\n\n useEffect(() => {\n let animationFrameId: number;\n\n const measure = (time: number) => {\n frameCount.current++;\n const delta = time - lastTime.current;\n\n if (delta >= 1000) {\n setFps(Math.round((frameCount.current * 1000) / delta));\n frameCount.current = 0;\n lastTime.current = time;\n }\n\n animationFrameId = requestAnimationFrame(measure);\n };\n\n animationFrameId = requestAnimationFrame(measure);\n\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, []);\n\n return fps;\n};\n\ninterface BenchmarkStatsProps {\n cardCount: number;\n columnCount: number;\n}\n\nexport const BenchmarkStats = ({ cardCount, columnCount }: BenchmarkStatsProps) => {\n const fps = useFPS();\n const [minFps, setMinFps] = useState(60);\n const [maxFps, setMaxFps] = useState(0);\n\n const [isStressTesting, setIsStressTesting] = useState(false);\n\n useEffect(() => {\n if (fps > 0) {\n if (fps < minFps) setMinFps(fps);\n if (fps > maxFps) setMaxFps(fps);\n }\n }, [fps]);\n\n useEffect(() => {\n if (!isStressTesting) return;\n\n const columns = document.querySelectorAll('.overflow-y-auto');\n let direction = 1;\n let speed = 2;\n let animationId: number;\n\n const autoScroll = () => {\n columns.forEach(col => {\n col.scrollTop += speed * direction;\n if (col.scrollTop >= col.scrollHeight - col.clientHeight) direction = -1;\n if (col.scrollTop <= 0) direction = 1;\n });\n animationId = requestAnimationFrame(autoScroll);\n };\n\n animationId = requestAnimationFrame(autoScroll);\n\n return () => cancelAnimationFrame(animationId);\n }, [isStressTesting]);\n\n return (\n <div className=\"fixed bottom-4 right-4 bg-slate-900/90 text-white p-4 rounded-lg shadow-lg backdrop-blur-sm z-50 font-mono text-sm\">\n <div className=\"flex items-center justify-between mb-2 gap-2\">\n <h3 className=\"font-bold text-blue-400\">⚡ Performance Stats</h3>\n <button\n onClick={() => setIsStressTesting(!isStressTesting)}\n className={`text-xs px-2 py-1 rounded ${isStressTesting ? 'bg-red-500 hover:bg-red-600' : 'bg-blue-600 hover:bg-blue-700'\n }`}\n >\n {isStressTesting ? 'Stop Stress Test' : 'Start Stress Test'}\n </button>\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-1\">\n <span className=\"text-slate-400\">FPS:</span>\n <span className={`font-bold ${fps < 30 ? 'text-red-400' : fps < 50 ? 'text-yellow-400' : 'text-green-400'}`}>\n {fps}\n </span>\n\n <span className=\"text-slate-400\">Min FPS:</span>\n <span className=\"text-slate-200\">{minFps}</span>\n\n <span className=\"text-slate-400\">Cards:</span>\n <span className=\"text-slate-200\">{cardCount}</span>\n\n <span className=\"text-slate-400\">Columns:</span>\n <span className=\"text-slate-200\">{columnCount}</span>\n </div>\n </div>\n );\n};\n"],"names":["cn","inputs","twMerge","clsx","generateId","useKanbanStore","create","devtools","set","columnId","cardData","cardId","newCard","state","column","updates","card","deletedCard","remainingCards","updatedColumns","colId","id","newCardId","duplicatedCard","cardIndex","newCardIds","columnData","position","newColumn","newColumnOrder","insertPosition","moveCardsTo","deletedColumn","remainingColumns","updatedCards","targetCol","firstColumnId","targetColId","sourceColId","newIndex","sourceCol","newSourceCardIds","newTargetCardIds","updatedCard","newOrder","query","group","groupId","g","ruleId","r","filters","data","config","activeId","viewingCardId","editingCardId","addingCardInColumnId","editingColumnId","useKanban","store","setActiveId","useState","overId","setOverId","overSide","setOverSide","handleDragStart","useCallback","handleDragOver","side","handleDragEnd","moveCard","sourceColumnId","targetColumnId","index","useKanbanDnd","dragActivationDistance","touchActivationDelay","onDragStart","onDragOver","onDragEnd","onCardMove","onColumnMove","onCreateColumnWithCard","columns","columnOrder","recentlyMovedToNewContainer","columnsRef","useRef","columnOrderRef","useEffect","dragPositionRef","useSensors","useSensor","MouseSensor","TouchSensor","KeyboardSensor","event","type","active","over","currentColumns","currentOrder","overRect","activeRect","overCenterX","overCenterY","overCol","col","overIndex","currentIndex","activeColumn","overColumn","finalIndex","pos","evaluateFilter","titleMatch","descMatch","metadataMatch","val","evaluateGroup","conjunction","rules","rule","evaluateRule","value","getNestedValue","target","obj","path","acc","part","DefaultCard","memo","isDragging","tags","members","commentsCount","attachmentsCount","dueDate","priority","priorityColors","jsxs","jsx","tag","i","MoreHorizontal","m","Calendar","MessageSquare","Paperclip","prevProps","nextProps","DefaultColumnEmpty","DefaultColumnHeader","cardCount","isOver","dragHandleProps","onAddCard","onEditColumn","e","GripVertical","Plus","Dialog","DialogPrimitive","DialogPortal","DialogOverlay","React","className","props","ref","DialogContent","children","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","buttonVariants","cva","Button","variant","size","asChild","Comp","Slot","DefaultEditForm","onSave","onCancel","onDelete","title","setTitle","description","setDescription","handleSubmit","open","Trash2","Save","DefaultCardView","onClose","otherMetadata","pConfig","AlignLeft","User","Tag","Info","key","FilterChips","removeFilterRule","clearFilters","activeRules","RotateCcw","heightCache","useKanbanColumn","cardIds","estimatedCardHeight","baseOverscan","parentRef","scrollVelocity","setScrollVelocity","element","lastScrollTop","lastTime","rafId","handleScroll","now","scrollTop","deltaTime","deltaScroll","velocity","throttledScroll","dynamicOverscan","useMemo","rowVirtualizer","useVirtualizer","cached","height","AddCardButton","onClick","KanbanCardInner","renderCard","onEdit","allowEdit","attributes","listeners","setNodeRef","transform","transition","isSortableDragging","useSortable","style","CSS","handleClick","cardContent","KanbanCard","KanbanColumnInner","allCards","isActiveColumnDragging","isOverlay","setAddingCardInColumnId","setEditingColumnId","isColumnOver","handleColumnClick","SortableContext","verticalListSortingStrategy","virtualRow","isActive","KanbanColumn","Sheet","SheetPrimitive","SheetTrigger","SheetPortal","SheetOverlay","sheetVariants","SheetContent","SheetHeader","SheetTitle","SheetDescription","FilterGroup","availableFields","updateFilterGroup","removeFilterGroup","handleAddRule","newRule","handleRemoveRule","handleUpdateRule","toggleConjunction","FilterRuleRow","onUpdate","operators","f","o","discoverFields","cards","fields","KanbanFilterDrawer","addFilterGroup","handleAddGroup","newGroup","Filter","DefaultAddCardForm","_columnId","onAdd","setPriority","p","DefaultEditColumnForm","DroppableNewColumnButton","useDroppable","Fragment","SortableVirtualColumn","start","width","allowReorder","isValidElement","cloneElement","KanboomBoard","kanban","columnVirtualizer","filteredData","filteredCards","filteredColumns","lastOverId","dnd","_type","activeCard","viewingCard","editingColumn","finalConfig","customCollisionDetection","args","closestCenter","pointerCollisions","pointerWithin","newColumnCollision","c","intersections","rectIntersection","getFirstCollision","containerItems","container","collisions","DndContext","MeasuringStrategy","horizontalListSortingStrategy","virtualColumn","editingCard","DragOverlay","selectCard","selectAllCards","selectCardsByIds","selectColumn","selectAllColumns","selectColumnOrder","selectColumnCards","selectColumnCardIds","selectMoveCard","selectMoveColumn","selectSetBoardData","selectBoardData","selectCardCount","selectColumnCount","useFPS","fps","setFps","frameCount","animationFrameId","measure","time","delta","BenchmarkStats","columnCount","minFps","setMinFps","maxFps","setMaxFps","isStressTesting","setIsStressTesting","direction","speed","animationId","autoScroll"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,104 @@
1
+ {
2
+ "name": "kanbase",
3
+ "version": "0.0.1",
4
+ "description": "High-performance, enterprise-grade Kanban component for React with virtualization, advanced filtering, and fluid precision interactions",
5
+ "type": "module",
6
+ "main": "./dist/kanbase.umd.js",
7
+ "module": "./dist/kanbase.es.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/kanbase.es.js",
17
+ "require": "./dist/kanbase.umd.js"
18
+ },
19
+ "./package.json": "./package.json"
20
+ },
21
+ "sideEffects": [
22
+ "./dist/kanbase.es.js",
23
+ "./dist/kanbase.umd.js"
24
+ ],
25
+ "scripts": {
26
+ "dev": "vite",
27
+ "build": "tsc -b && vite build",
28
+ "build:lib": "tsc -b && vite build",
29
+ "lint": "eslint .",
30
+ "preview": "vite preview",
31
+ "prepublishOnly": "npm run build"
32
+ },
33
+ "keywords": [
34
+ "kanban",
35
+ "kanban-board",
36
+ "react",
37
+ "react-component",
38
+ "drag-and-drop",
39
+ "virtualization",
40
+ "typescript",
41
+ "zustand",
42
+ "dnd-kit",
43
+ "task-management",
44
+ "project-management",
45
+ "workflow"
46
+ ],
47
+ "author": "wesleyxmns",
48
+ "license": "MIT",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/wesleyxmns/kanbase.git"
52
+ },
53
+ "bugs": {
54
+ "url": "https://github.com/wesleyxmns/kanbase/issues"
55
+ },
56
+ "homepage": "https://github.com/wesleyxmns/kanbase#readme",
57
+ "peerDependencies": {
58
+ "react": ">=18.0.0",
59
+ "react-dom": ">=18.0.0",
60
+ "tailwindcss": ">=3.0.0"
61
+ },
62
+ "peerDependenciesMeta": {
63
+ "tailwindcss": {
64
+ "optional": false
65
+ }
66
+ },
67
+ "dependencies": {
68
+ "@dnd-kit/core": "^6.3.1",
69
+ "@dnd-kit/sortable": "^10.0.0",
70
+ "@dnd-kit/utilities": "^3.2.2",
71
+ "@radix-ui/react-dialog": "^1.1.15",
72
+ "@radix-ui/react-slot": "^1.2.4",
73
+ "@tanstack/react-virtual": "^3.13.17",
74
+ "class-variance-authority": "^0.7.1",
75
+ "clsx": "^2.1.1",
76
+ "lodash.get": "^4.4.2",
77
+ "lucide-react": "^0.562.0",
78
+ "tailwind-merge": "^3.4.0",
79
+ "zustand": "^5.0.9"
80
+ },
81
+ "devDependencies": {
82
+ "@eslint/js": "^9.39.1",
83
+ "@tailwindcss/vite": "^4.1.18",
84
+ "@types/node": "^24.10.1",
85
+ "@types/react": "^19.2.5",
86
+ "@types/react-dom": "^19.2.3",
87
+ "@vitejs/plugin-react-swc": "^4.2.2",
88
+ "eslint": "^9.39.1",
89
+ "eslint-plugin-react-hooks": "^7.0.1",
90
+ "eslint-plugin-react-refresh": "^0.4.24",
91
+ "globals": "^16.5.0",
92
+ "react": "^19.2.0",
93
+ "react-dom": "^19.2.0",
94
+ "tailwindcss": "^4.1.18",
95
+ "typescript": "~5.9.3",
96
+ "typescript-eslint": "^8.46.4",
97
+ "vite": "^7.2.4",
98
+ "vite-plugin-dts": "^4.5.4"
99
+ },
100
+ "engines": {
101
+ "node": ">=18.0.0",
102
+ "npm": ">=9.0.0"
103
+ }
104
+ }