{"version":3,"sources":["../src/views/KanbanViewAdapter.tsx","../../../node_modules/@dnd-kit/utilities/src/execution-context/canUseDOM.ts","../../../node_modules/@dnd-kit/utilities/src/css.ts","../src/utils/cn.ts","../src/utils/positioning.ts","../src/utils/performance.ts","../src/utils/retry.ts","../src/utils/logger.ts","../src/utils/export.ts","../src/utils/import.ts","../src/components/Gantt/GanttThemeContext.tsx","../src/components/Board/KanbanThemeContext.tsx","../src/components/Portal/Portal.tsx","../src/components/Card/PrioritySelector.tsx","../src/components/Card/DateRangePicker.tsx","../src/components/Card/UserAssignmentSelector.tsx","../src/components/Card/DependenciesSelector.tsx","../src/components/Card/Card.tsx","../src/components/Card/StatusSelector.tsx","../src/components/Column/ColumnMenu.tsx","../src/components/Column/Column.tsx","../src/components/Column/EditableColumnTitle.tsx","../src/components/TaskDetailModal/MentionInput.tsx","../src/components/Gantt/TagPicker.tsx","../src/components/Gantt/ColorPicker.tsx","../src/components/TimeTracking/TimePill.tsx","../src/utils/formulaEval.ts","../src/components/TimeTracking/TimePopover.tsx","../src/components/TimeTracking/TimeInputPopover.tsx","../src/components/TimeTracking/HealthBar.tsx","../src/components/TimeTracking/ProfitabilityReport.tsx","../src/components/TaskDetailModal/TaskDetailModal.tsx","../src/hooks/useDragState.ts","../src/components/Board/Board.tsx","../src/components/Board/KanbanToolbar.tsx","../src/components/Board/AddColumnButton.tsx","../src/components/Board/QuickTaskCreate.tsx","../src/components/Board/AddCardButton.tsx","../src/components/ErrorBoundary/ErrorBoundary.tsx","../src/components/CommandPalette/CommandPalette.tsx","../src/components/Attachments/AttachmentUploader.tsx","../src/components/Charts/VelocityChart.tsx","../src/components/Charts/BurnDownChart.tsx","../src/components/Charts/DistributionCharts.tsx","../src/components/BulkOperations/BulkOperationsToolbar.tsx","../src/components/Swimlanes/SwimlaneBoardView.tsx","../src/components/Swimlanes/GroupBySelector.tsx","../src/hooks/keyboard/useKeyboardShortcuts.ts","../src/components/KeyboardShortcuts/KeyboardShortcutsHelp.tsx","../src/components/Templates/CardTemplateSelector.tsx","../src/components/ExportImport/ExportImportModal.tsx","../src/components/FilterBar/FilterBar.tsx","../src/components/ConfigMenu/ConfigMenu.tsx","../src/theme/themes.ts","../src/theme/ThemeProvider.tsx","../src/components/ThemeModal/ThemeModal.tsx","../src/components/Gantt/themes.ts","../src/components/Gantt/deriveThemeFromCSS.ts","../src/components/Gantt/i18n.ts","../src/components/Gantt/GanttI18nContext.tsx","../src/components/Gantt/GanttToolbar.tsx","../src/components/Gantt/ColumnManager.tsx","../src/components/Gantt/ContextMenu.tsx","../src/components/Gantt/useGanttKeyboard.ts","../src/components/Gantt/useGanttSelection.ts","../src/components/Gantt/hierarchyUtils.ts","../src/components/Gantt/TaskGrid.tsx","../src/components/Gantt/hooks/useDragState.ts","../src/components/Gantt/TaskBar.tsx","../src/components/Gantt/TaskTooltip.tsx","../src/components/Gantt/DependencyLine.tsx","../src/components/Gantt/Milestone.tsx","../src/components/Gantt/ganttUtils.ts","../src/components/Gantt/Timeline.tsx","../src/components/Gantt/GanttAIAssistant.tsx","../src/components/Gantt/useUndoRedo.ts","../src/components/Gantt/useGanttUndoRedoKeys.ts","../src/components/Gantt/defaultTemplates.ts","../src/components/Gantt/GanttBoard.tsx","../src/components/Gantt/TaskFormModal.tsx","../src/components/Gantt/aiCommandParser.ts","../src/components/Gantt/adapters.ts","../src/components/ListView/i18n.ts","../src/components/ListView/cells/StatusCell.tsx","../src/hooks/useLadoDelMenu.ts","../src/components/ListView/cells/PriorityCell.tsx","../src/components/ListView/cells/AssigneesCell.tsx","../src/components/ListView/cells/DateRangePicker.tsx","../src/components/ListView/cells/DateCell.tsx","../src/hooks/useMicroInteractions.ts","../src/components/ListView/cells/ProgressCell.tsx","../src/components/ListView/cells/TextCell.tsx","../src/components/ListView/cells/NumberCell.tsx","../src/components/ListView/cells/DropdownCell.tsx","../src/components/ListView/cells/CheckboxCell.tsx","../src/components/ListView/cells/MultiSelectCell.tsx","../src/components/ListView/cells/FileCell.tsx","../src/components/ListView/cells/TagsCell.tsx","../src/components/ListView/cells/TimeCell.tsx","../src/components/ListView/cells/ScheduleVarianceCell.tsx","../src/components/ListView/cells/HoursBarCell.tsx","../src/components/ListView/cells/TeamLoadCell.tsx","../src/components/ListView/cells/BlockersCell.tsx","../src/components/ListView/TableContextMenu.tsx","../src/components/ListView/ColumnSelector.tsx","../src/components/ListView/CreateFieldModal.tsx","../src/components/ListView/StatusFilter.tsx","../src/components/ListView/ProjectHealthSidebar.tsx","../src/components/ListView/ListView.tsx","../src/components/ListView/types.ts","../src/components/ListView/themes.ts","../src/components/CalendarV2/calendarLayout.ts","../src/components/CalendarV2/calendarData.ts","../src/components/CalendarV2/CalendarParts.tsx","../src/components/CalendarV2/CalendarChrome.tsx","../src/components/CalendarV2/CalendarPopovers.tsx","../src/components/CalendarV2/CalendarCapacity.tsx","../src/components/CalendarV2/CalendarWeekViews.tsx","../src/components/CalendarV2/CalendarBacklog.tsx","../src/components/CalendarV2/CalendarReschedulePopover.tsx","../src/components/CalendarV2/CalendarAgenda.tsx","../src/components/CalendarV2/calendarReschedule.ts","../src/components/CalendarV2/CalendarView.tsx","../src/components/CardStack/CardStack.tsx","../src/types/card-history.ts","../src/components/CardHistory/CardHistoryTimeline.tsx","../src/components/CardHistory/CardHistoryReplay.tsx","../src/types/card-relationships.ts","../src/components/CardRelationships/CardRelationshipsGraph.tsx","../src/components/AI/GeneratePlanModal.tsx","../src/lib/ai/config.ts","../src/lib/ai/costs.ts","../src/components/AI/AIUsageDashboard.tsx","../src/components/AI/GenerateGanttTasksDialog.tsx","../src/hooks/useKanbanState.ts","../src/hooks/useBoard.ts","../src/hooks/useFilters.ts","../src/hooks/useAI.ts","../src/hooks/useSelectionState.ts","../src/hooks/useMultiSelect.ts","../src/types/card-stack.ts","../src/hooks/useCardStacking.ts","../src/adapters/react/BoardProvider.tsx","../src/adapters/react/useBoard.ts","../src/adapters/react/useFilteredCards.ts","../src/plugins/PluginManager.ts","../src/components/VirtualList/VirtualList.tsx","../src/components/VirtualGrid/VirtualGrid.tsx","../src/tokens/design-tokens.ts","../src/tokens/css-generator.ts","../src/theme/ThemeSwitcher.tsx"],"names":["CSS","Object","freeze","Translate","toString","transform","x","y","Math","round","Scale","scaleX","scaleY","Transform","join","Transition","_ref","property","duration","easing","cn","inputs","twMerge","clsx","calculatePosition","before","after","generateInitialPositions","count","_","i","calculateDropPosition","columnCards","dropIndex","shouldVirtualize","itemCount","threshold","defaultShouldRetry","error","status","calculateDelay","attempt","initialDelay","backoffMultiplier","maxDelay","delay","jitter","retryWithBackoff","fn","options","maxAttempts","shouldRetry","onRetry","lastError","attempts","callbackError","resolve","retrySyncOperation","createRetryWrapper","args","CircuitBreaker","resetTimeout","result","LogLevel","_Logger","entry","timestamp","level","message","component","rest","prefix","hasContext","isDev","componentName","context","action","Timer","Logger","onEnd","enabled","logger","exportToJSON","board","_options","data","exportToCSV","headers","rows","card","column","col","escapeCSV","row","exportToPDF","boardElement","element","boardEl","canvas","html2canvas","imgData","pdfWidth","pdfHeight","imgAspect","imgWidth","imgHeight","doc","jsPDF","xOffset","yPosition","lines","metadata","dates","value","exportBoard","format","downloadExport","content","filename","defaultFilename","finalFilename","mimeTypes","blob","url","link","importFromJSON","jsonString","importFromCSV","csvString","parseCSVLine","cards","columnsMap","errors","values","cardData","header","index","columnTitle","line","current","inQuotes","char","nextChar","importBoard","readFile","file","reject","reader","event","GanttThemeContext","createContext","useGanttTheme","useContext","KanbanThemeContext","KanbanThemeProvider","children","themeName","jsx","useKanbanTheme","Portal","container","mounted","setMounted","useState","ganttTheme","kanbanTheme","useEffect","target","theme","themeStyles","createPortal","PRIORITY_CONFIG","CLEAR_COLOR","PriorityIcon","color","jsxs","PrioritySelector","priority","onChange","className","isOpen","setIsOpen","menuPosition","setMenuPosition","menuRef","useRef","buttonRef","openMenu","rect","viewportHeight","viewportWidth","menuWidth","menuHeight","GAP","leftPos","spaceBelow","spaceAbove","topPos","handleClickOutside","handleEscape","e","handleSelect","newPriority","currentConfig","flagColor","key","config","QUICK_OPTIONS","DateRangePicker","startDate","endDate","isDark","handleQuickSelect","days","now","formatLocalDate","date","year","month","day","todayStr","endStr","formatDateRange","parseLocalDate","dateStr","parts","p","start","end","monthNames","hasDateSet","overdue","today","option","UserAssignmentSelector","assignedUsers","availableUsers","maxVisibleAvatars","searchQuery","setSearchQuery","handleToggleUser","user","isAssigned","u","filteredUsers","visibleUsers","overflowCount","wouldCreateCircularDependency","allCards","fromCardId","toCardId","dependencyMap","deps","d","depObj","existingDeps","visited","recStack","hasCycle","cardId","depId","DependenciesSelector","currentCardId","dependencies","availableTasks","validateCircular","onCircularDependencyError","hasDependencies","setHasDependencies","circularError","setCircularError","handleToggleDependency","taskId","isDependency","targetTask","t","newDeps","id","errorMsg","handleToggleHasDependencies","newValue","filteredTasks","task","linkColor","Fragment","Card","memo","render","onClick","isSelected","disableDrag","onUpdate","attributes","listeners","setNodeRef","transition","isDragging","useSortable","style","isCompleted","imageAttachments","att","cardStyle","users","label","prevProps","nextProps","STATUS_CONFIG","StatusIcon","icon","StatusSelector","customStatuses","allStatuses","cs","getCurrentConfig","defaultConfig","customConfig","newStatus","statusColor","statusOption","i18n","ColumnMenu","onRename","onDelete","isDeletable","locale","isRenaming","setIsRenaming","newTitle","setNewTitle","inputRef","handleRenameClick","handleRenameSubmit","trimmedTitle","handleRenameKeyDown","Column","renderColumn","renderCard","renderHeader","renderEmptyState","onCardClick","onCardUpdate","enableVirtualization","cardHeight","isCollapsed","onToggleCollapse","onColumnRename","onColumnDelete","renderMetrics","isOver","useDroppable","parentRef","useVirtualization","virtualizer","useVirtualizer","tarjetasQueCuentan","c","wipStatus","percentage","isOverWipLimit","getWipBadgeClasses","SortableContext","verticalListSortingStrategy","virtualItem","EditableColumnTitle","title","onSave","isEditing","setIsEditing","editValue","setEditValue","handleSave","trimmed","handleKeyDown","findMentionMatch","text","cursorPosition","beforeCursor","atIndex","charBefore","afterAt","extractMentionedUserIds","mentionedIds","mentionRegex","match","mentionName","fullNameLower","fullNameNoSpaces","nameParts","part","getInitials","name","n","formatFileSize","bytes","COMMON_EMOJIS","MentionInput","onSubmit","placeholder","disabled","isSubmitting","currentUser","enableEmoji","enableAttachments","pendingFiles","onFilesSelect","onRemoveFile","maxFileSizeMB","showDropdown","setShowDropdown","setFilteredUsers","selectedIndex","setSelectedIndex","mentionMatch","setMentionMatch","showEmojiPicker","setShowEmojiPicker","dropdownRef","fileInputRef","emojiPickerRef","updateMentionState","useCallback","cursorPos","filtered","handleChange","scrollHeight","maxHeight","newHeight","insertMention","beforeMention","afterMention","mentionText","newCursorPos","prev","selectedUser","tabSelectedUser","insertEmoji","emoji","handleFileSelect","files","maxBytes","validFiles","getFileIcon","Image","FileText","File","selectedElement","pf","FileIcon","isImage","X","Smile","AnimatePresence","motion","Paperclip","Send","CommentContent","lastIndex","TAG_COLORS","TagPicker","selectedTags","availableTags","onCreateTag","_compact","isCreating","setIsCreating","newTagColor","setNewTagColor","dropdownPosition","setDropdownPosition","containerRef","filteredTags","tag","exactMatch","isInsideContainer","isInsideDropdown","handleToggleTag","handleCreateTag","newTag","handleRemoveTag","tagId","pillStyle","Tag","ChevronDown","Check","Plus","TagBadge","onRemove","size","TagList","tags","maxVisible","visibleTags","hiddenCount","TASK_COLORS","formatDuration","minutes","hours","remainingMinutes","getHealthColors","health","ClockIcon","TimePill","summary","showEstimate","colors","sizeClasses","iconSizes","loggedText","estimateText","displayText","evaluateFormula","raw","expr","preprocessFormulaInput","parseDuration","input","hourMatch","minuteMatch","plainNumber","formatTimerDisplay","seconds","h","m","s","PlayIcon","StopIcon","XIcon","TimePopover","_taskId","entries","isTimerRunning","timerElapsedSeconds","onLogTime","onUpdateEstimate","onStartTimer","onStopTimer","onDiscardTimer","onClose","durationInput","setDurationInput","estimateInput","setEstimateInput","noteInput","setNoteInput","isLogging","setIsLogging","showEstimateEdit","setShowEstimateEdit","handleLogTime","handleUpdateEstimate","parseDurationToMinutes","formatMinutesToDuration","TimeInputPopover","mode","currentValue","note","setNote","isSaving","setIsSaving","totalMinutes","handleClear","titles","isEs","Clock","getHealthColor","getHealthTextColor","HealthBar","showLabel","barColor","textColor","progress","visualProgress","isOverBudget","roundedMinutes","getStatusColor","getStatusBgColor","getStatusLabel","SummaryCard","isProfit","varianceColor","cardBg","borderColor","textMuted","textPrimary","TaskRow","varianceSign","ProfitabilityReport","report","isLoading","onTaskClick","bgColor","tableHeaderBg","sortedTasks","useMemo","a","b","formatMinutesToDisplay","formatSecondsToDisplay","secs","normalizeToTask","item","assignees","taskToCard","originalCard","TaskDetailModal","onTaskUpdate","attachments","onUploadAttachments","onDeleteAttachment","comments","onAddComment","mentionableUsers","onUploadCommentAttachments","enableTimeTracking","timeTrackingSummary","_timeEntries","onTimeLog","onEstimateUpdate","onSoldEffortUpdate","onTimerStart","onTimerStop","_onTimerDiscard","blurFinancials","tagPickerTheme","isCard","originalItem","selectedTask","setSelectedTask","showStatusDropdown","setShowStatusDropdown","showPriorityDropdown","setShowPriorityDropdown","showAssigneesDropdown","setShowAssigneesDropdown","showDatePicker","setShowDatePicker","datePickerMonth","setDatePickerMonth","editingProgress","setEditingProgress","showDependenciesDropdown","setShowDependenciesDropdown","dependencySearch","setDependencySearch","showColorPicker","setShowColorPicker","showTimePopover","setShowTimePopover","isDraggingFile","setIsDraggingFile","isUploadingFiles","setIsUploadingFiles","localDescription","setLocalDescription","descriptionDebounceRef","descriptionTextareaRef","localTaskName","setLocalTaskName","taskNameDebounceRef","commentText","setCommentText","isSubmittingComment","setIsSubmittingComment","pendingCommentFiles","setPendingCommentFiles","newSubtaskName","setNewSubtaskName","isAddingSubtask","setIsAddingSubtask","commentsContainerRef","normalizedTask","timer","textarea","handleUpdate","updatedTask","closeAllDropdowns","updateTaskField","field","autoResizeDescription","handleDescriptionChange","handleTaskNameChange","handleCommentFilesSelect","newPendingFiles","pendingFile","handleRemoveCommentFile","fileId","fileToRemove","f","handleSubmitComment","mentionedUserIds","uploadedAttachments","handleAddSubtask","existingSubtasks","newSubtask","updatedSubtasks","handleToggleSubtask","subtaskId","subtask","handleDeleteSubtask","formatCommentDate","diffMs","diffMins","diffHours","diffDays","updateTaskStatus","statusId","updateTaskDates","getDatePickerDays","firstDay","daysInMonth","startDayOfWeek","prevMonthLastDay","remainingDays","handleFileDrop","handleFileInputChange","handleDragOver","handleDragLeave","mimeType","FileTextIcon","Circle","newProgress","CheckCircle2","User","assignee","currentAssignees","newAssignees","CalendarDays","tomorrow","nextSaturday","nextMonday","nextWeekend","twoWeeks","fourWeeks","newEndDate","newStartDate","isToday","isStartDate","isEndDate","isInRange","clickedDate","Flag","Hourglass","Play","Square","newTags","Link2","depTask","currentDeps","Palette","Diamond","Trash2","attachment","Upload","dateA","dateB","comment","MessageSquare","useDragState","state","setState","dragStore","newState","setDragState","KanbanBoard","callbacks","renderProps","attachmentsByCard","onTaskOpen","timeEntries","timerState","onUpdateSoldEffort","sidePanel","renderColumnMetrics","suppressDetailModal","dragState","selectedCard","setSelectedCard","isPanning","setIsPanning","boardRef","panStartRef","themeClass","handleCardUpdate","updates","handleColumnRename","columnId","handleColumnDelete","DEFAULT_COLUMN_IDS","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","cardsByColumn","map","handleMouseDown","isMiddleButton","isEmptySpace","handleMouseMove","deltaX","deltaY","handleMouseUp","handleMouseLeave","availableTasksForDependencies","handleDragStart","active","over","targetColumnId","handleDragEnd","activeCard","targetPosition","targetColumnCards","overCard","overIndex","targetColumn","handleCardClick","handleModalCardUpdate","updatedCard","LoadingSkeleton","DndContext","closestCorners","columnFooter","crds","DragOverlay","columnCount","darkTheme","lightTheme","defaultI18n","englishI18n","ColumnSelector","columns","onSelect","createTaskLabel","ExportDropdown","onExportCSV","onExportJSON","onExportExcel","isExporting","setIsExporting","exportOptions","FileJson","FileSpreadsheet","opt","handleExport","handler","Download","SimpleCreateButton","KanbanToolbar","onCreateTask","useColumnSelector","translations","toolbarRightContent","toolbarEndContent","hasExport","AddColumnButton","onAddColumn","buttonLabel","setTitle","handleSubmit","handleBlur","QuickTaskCreate","onCancel","defaultDate","dropdownDirection","setName","setPriority","assigneeId","setAssigneeId","selectedDate","setSelectedDate","showAssigneeDropdown","setShowAssigneeDropdown","ddPos","resetAndClose","fechaDeLaTarea","taskDate","displayDate","nextSat","nextMon","loc","o","ChevronLeft","ChevronRight","yr","mo","prevDays","calDays","rem","isSel","AddCardButton","onAddCard","isExpanded","setIsExpanded","formRef","popoverStyle","setPopoverStyle","opensUp","setOpensUp","POPOVER_HEIGHT","updatePosition","goUp","KanbanViewAdapter","BaseViewAdapter","createRoot","cell","createKanbanView","ErrorBoundary","Component","props","errorInfo","onError","handlerError","hasError","fallback","withErrorBoundary","errorBoundaryProps","WrappedComponent","CommandPalette","onCreateCard","onNavigateToCard","onSearch","onChangePriority","onAssignUser","onGeneratePlan","onPredictRisks","onOpenAIUsage","shortcut","search","setSearch","page","setPage","selectedColumn","setSelectedColumn","open","handleClose","handleSelectCommand","param","handleCreateCard","Command","openNativeLightbox","imageUrl","imageName","allImages","currentIndex","onNavigate","existing","lightbox","img","hint","closeLightbox","newIdx","dots","idx","dot","prevBtn","nextBtn","k","sizes","type","AttachmentUploader","onUpload","maxSizeMB","allowedTypes","maxFiles","setIsDragging","isUploading","setIsUploading","setError","attachmentsRef","handleImageClick","handleNavigate","newIndex","imgs","newImg","validateFiles","valid","handleUpload","err","handleDragEnter","handleDrop","handleClick","handleDelete","attachmentId","CustomTooltip","payload","VelocityChart","height","showAverage","showPlanned","dataWithAverage","point","sum","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","Line","BurnDownChart","totalTasks","useArea","total","currentRemaining","idealRemaining","isOnTrack","AreaChart","Area","PRIORITY_COLORS","DEFAULT_COLORS","renderPieLabel","cx","cy","midAngle","innerRadius","outerRadius","percent","radius","DistributionCharts","showPercentages","dataWithTotal","PieChart","Pie","Cell","legendEntry","BarChart","Bar","max","BulkOperationsToolbar","selectedCards","onClearSelection","availableLabels","showPriorityMenu","setShowPriorityMenu","showMoveMenu","setShowMoveMenu","showUserMenu","setShowUserMenu","showLabelMenu","setShowLabelMenu","cardIds","handleUpdatePriority","handleMove","handleAssignUsers","userIds","handleAddLabels","labels","existingLabels","allLabels","generateSwimlanes","groupBy","laneMap","groupValue","laneId","laneTitle","laneColor","laneIcon","assignedUserIds","userId","SwimlaneBoardView","swimlaneConfig","providedSwimlanes","renderSwimlaneHeader","collapsedLanes","setCollapsedLanes","init","l","swimlanes","innerBoardProps","toggleLaneCollapse","next","lane","laneCards","laneBoard","GROUP_BY_OPTIONS","GroupBySelector","currentOption","DEFAULT_SHORTCUTS","matchesShortcut","modifiers","ctrlMatch","shiftMatch","altMatch","metaMatch","useKeyboardShortcuts","shortcuts","preventDefault","shortcutsRef","enabledRef","registerShortcut","unregisterShortcut","customEvent","formatKey","formatModifiers","isMac","getShortcutDisplay","keys","groupShortcuts","groups","KeyboardShortcutsHelp","isMounted","setIsMounted","category","categoryShortcuts","DEFAULT_TEMPLATES","CardTemplateSelector","templates","onSelectTemplate","template","groupedTemplates","acc","categoryTemplates","ExportImportModal","onImport","boardElementRef","activeTab","setActiveTab","selectedFormat","setSelectedFormat","importResult","setImportResult","PRIORITY_OPTIONS","SORT_OPTIONS","GROUPBY_OPTIONS","FilterBar","filters","sort","onFiltersChange","onSortChange","onReset","onFilterMyTasks","onFilterOverdue","onFilterHighPriority","_availableColumns","showQuickFilters","compact","onGroupByChange","setIsCollapsed","handleSearchChange","handleDateFilterChange","handleSortChange","handleSortOrderToggle","hasActiveFilters","ConfigMenu","onOpenExport","onOpenThemes","onOpenShortcuts","viewMode","onExportGanttPDF","onExportGanttExcel","onExportGanttPNG","onExportGanttCSV","handleItemClick","neutralTheme","themes","defaultTheme","ThemeContext","STORAGE_KEY","ThemeProvider","initialTheme","storageKey","setThemeState","stored","setTheme","newTheme","root","currentTheme","camelToKebab","themeKey","cssVar","useTheme","str","ThemeModal","themeData","deriveThemeFromCSS","styles","getVar","varName","en","es","getTranslations","mergeTranslations","customTranslations","base","GanttI18nContext","useGanttI18n","useDropdownPortal","triggerRef","align","dropdownWidth","pos","setPos","top","left","PADDING","onExportPNG","onExportPDF","onExportMSProject","portalPos","FileImage","FolderKanban","ShareExportDropdown","onCopySnapshotLink","copied","setCopied","handleCopyLink","Share2","SegmentedControl","layoutId","isActive","MinimalTabs","WbsLevelDropdown","maxDepth","currentLabel","Layers","FilterDropdown","hideCompleted","onHideCompletedChange","timeoutId","filterOptions","PlayCircle","hasActiveFilter","filtrosActivos","Filter","getIcon","EyeOff","TimeCapsule","scales","ForecastHUD","forecast","finishLabel","hasDelay","delayLabel","delayColor","conf","confColor","cost","currency","costLabel","variance","hasVariance","varianceLabel","ViewOptionsDropdown","showCriticalPath","onShowCriticalPathChange","showBaseline","onShowBaselineChange","highlightWeekends","onHighlightWeekendsChange","showDependencies","onShowDependenciesChange","rowDensity","onRowDensityChange","isSpanish","toggleOptions","Zap","GitBranch","densityOptions","Eye","Icon","isDisabled","tooltipText","MasHerramientas","etiqueta","abierto","setAbierto","ref","fuera","esc","v","GanttToolbar","enCabecera","timeScale","onTimeScaleChange","zoom","onZoomChange","onThemeChange","showThemeSelector","showCreateTaskButton","taskFilter","onTaskFilterChange","wbsLevel","onWbsLevelChange","maxWbsDepth","onViewModeChange","projectForecast","hideForecastHud","isChronos","timeScaleOptions","themeOptions","Moon","Sun","dividerColor","val","ZoomOut","ZoomIn","ColumnManager","onToggleColumn","tr","availableColumns","Columns3","ContextMenu","items","adjustedPosition","setAdjustedPosition","padding","adjustedX","adjustedY","getSolidBackground","MenuIcons","Edit3","Pencil","Minus","BarChart3","ArrowUpDown","ArrowUp","ArrowDown","Settings","Scissors","Copy","useGanttKeyboard","tasks","selectedTaskIds","onTaskSelect","onTaskCreate","onTaskDelete","onTaskDuplicate","onTaskMove","onTaskIndent","onTaskOutdent","onTaskRename","onTaskToggleExpand","onOpenTaskModal","enableKeyboard","isEditingRef","editing","flattenTasks","traverse","getFirstSelectedTask","flatTasks","handleNavigation","direction","multiSelect","nextIndex","nextTask","ctrlOrCmd","selectedIds","useGanttSelection","selectedTaskId","setSelectedTaskIds","lastSelectedId","setLastSelectedId","selectTask","toggleTaskSelection","selectTaskRange","flatTaskIds","rangeIds","handleTaskClick","shift","handleKeyboardSelection","clearSelection","isTaskSelected","reindexPositions","parentId","findTask","found","findParentTask","childId","indentTasks","taskIds","firstTaskId","taskIndex","targetParent","removeTasks","ids","removed","addAsChildren","idsSet","indented","outdentTasks","parent","grandparent","removeFromParent","insertAfterTask","afterId","moveTasks","moveInArray","deleteTasks","filterTasks","duplicateTasks","duplicatedTasks","duplicateSubtasks","subtasks","duplicateTask","original","newId","copy","duplicated","createTask","afterTaskId","weekFromNow","newTask","insertTask","insertIndex","renameTask","newName","toggleTaskExpansion","createSubtask","parentTaskId","findParent","parentTask","getSubtaskCount","subtaskCount","addSubtask","reparentTask","newParentId","position","taskToMove","isDescendant","removeTask","taskList","hadRemoval","updated","insertPos","addToParent","newSubtasks","reindexed","rollUpParentDates","childDates","child","rolledStart","rolledEnd","rolledProgress","TaskGrid","ROW_HEIGHT","_templates","onTaskSelectionChange","onTaskDblClick","onTaskContextMenu","onTaskToggle","_scrollTop","onColumnResize","onBulkFill","onMultiTaskDelete","addTaskRow","onCreateSubtask","onDeleteRequest","onTaskReparent","allTasks","scrollContainerRef","hoveredTaskId","setHoveredTaskId","editingTaskId","setEditingTaskId","editingTaskName","setEditingTaskName","editInputRef","resizingColumn","setResizingColumn","resizeStartX","setResizeStartX","resizeStartWidth","setResizeStartWidth","contextMenu","setContextMenu","draggedTaskId","setDraggedTaskId","dropTargetTaskId","setDropTargetTaskId","dropPosition","setDropPosition","dragStartY","dragThreshold","isDraggingRef","ghostPosition","setGhostPosition","isDraggingState","setIsDraggingState","autoScrollRAF","fillDrag","setFillDrag","datePickerState","setDatePickerState","showKeyboardHelp","setShowKeyboardHelp","keyboardHelpRef","newWidth","handleSelectionClick","handleRenameStart","parentWbs","seq","localWbs","wbsCode","childPrefix","HEADER_HEIGHT","contentHeight","getFillValue","handleFillDragStart","sourceTaskId","sourceIndex","bodyEl","rowIndexAt","clientY","lastClientY","stopAutoScroll","updateTarget","maybeAutoScroll","edgeZone","maxSpeed","distFromTop","distFromBottom","speed","scroll","onMove","ev","onUp","targetIndex","src","ft","from","to","targetIds","isInFillRange","getDuration","handleRenameSave","handleRenameCancel","handleCreateSubtaskClick","handleDragMove","foundTarget","relativeY","rowHeight","targetId","tree","draggedParent","computePosition","siblings","dragId","sameGroup","targetIdx","dragIdx","renderCellContent","isParentTask","isHovered","GripVertical","dateField","dateValue","isDatePickerOpen","formatDisplayDate","Calendar","nextWeek","remaining","taskAssignedUsers","statusLabel","priorityMapForSelector","reversePriorityMapForTask","currentPriorityValue","getHeaderContextMenuItems","getTaskContextMenuItems","flatAll","isBulk","selectedTasks","bulkIds","statusTargets","sfx","requestDelete","visibleColumns","totalColumnsWidth","colIndex","isLastColumn","isNameColumn","Keyboard","inFillRange","isDropTarget","showDropAbove","showDropBelow","showDropChild","dropStyles","isParentRow","fillColumn","showFillHandle","cellInFill","draggedTask","initialX","initialWidth","dragMode","setDragMode","dragOffset","setDragOffset","ghostX","setGhostX","ghostWidth","setGhostWidth","connectionLine","setConnectionLine","activeZone","setActiveZone","draggedSegmentIndex","setDraggedSegmentIndex","draggedSegmentStartX","setDraggedSegmentStartX","segmentDragOffsetX","setSegmentDragOffsetX","hoveredSegmentIndex","setHoveredSegmentIndex","setIsHovered","width","TaskBar","dayWidth","onDoubleClick","onContextMenu","onDateChange","onDependencyCreate","allTaskPositions","onDragMove","onHoverChange","showTaskBarLabels","readOnly","onProgressChange","svgRef","hasDraggedRef","autoScrollIntervalRef","lastMouseEventRef","isResizing","isConnecting","resetDragState","borderRadius","isSummaryTask","progressDragRef","dragProgress","setDragProgress","force","canDragProgress","isOverdue","isAtRisk","isNeutralTheme","taskColor","barCursor","resizeCursor","RESIZE_ZONE","barWidth","isSmallBar","isVerySmallBar","formatDate","snapToDay","pixelX","pixelToDate","newDate","findTaskAtPoint","pointX","pointY","taskPos","segmentX","svgElement","svgPoint","effectiveX","actualMode","relativeX","performAutoScroll","timelineScroll","edgeThreshold","scrollSpeed","scrollDelta","distance","needsScroll","targetTaskId","rawNewX","snappedX","daysDelta","segmentOffset","rawNewStart","snappedStart","rawNewEnd","taskDuration","isValid","dayOffset","updatedSegments","seg","newSegStart","newSegEnd","allDates","newTaskStart","newTaskEnd","handleGlobalMouseMove","handleGlobalMouseUp","displayX","displayWidth","customClass","linkButtonExtension","cpmOpacity","handleProgressPointerDown","handleProgressPointerMove","ctx","ratio","pct","handleProgressPointerUp","finalPct","handleProgressClickSwallow","liveProgress","blStartMs","blEndMs","rangeStartMs","msPerDay","blStartDays","blDurationDays","blX","blWidth","actualEndX","blEndX","actualEndMs","delayDays","isAhead","masterY","masterR","hasStarted","isOverduePhase","isFuturePhase","spi","totalDays","timelinePct","fillColor","fillWidth","showPctOnBar","progressW","remainX","remainW","rx","xPos","wPos","progressEndX","avatarR","handleX","handleY","isDraggingProgress","visibleRadius","handleOpacity","distanceToEnd","hitRight","hitLeft","segment","segmentStartX","segmentWidth","isThisSegmentDragging","isThisSegmentHovered","displaySegmentX","labelText","truncated","showBelow","tooltipY","arrowPath","nameY","row1Y","row2Y","assigneesY","hintsY","TOOLTIP_WIDTH","SCREEN_PADDING","CURSOR_OFFSET_X","CURSOR_OFFSET_Y","TaskTooltip","tooltipData","workingDaysConfig","useLayoutEffect","mouseX","mouseY","hasTimeData","hasLastActivity","tooltipH","holidaySet","toKey","cursor","dow","formatMinutes","mins","labelColor","valueColor","nameColor","accentColor","tooltip","Row","DependencyLine","x1","y1","x2","y2","lineStyle","isHoverLayer","hoverOverlayOnly","colorOverride","strokeWidthOverride","glowFilter","setIsLocalHovered","mousePos","setMousePos","dy","goingDown","isSameRow","OFFSET","isBackward","path","turnX","dx","midX","R","firstTurnX","secondTurnX","bridgeY","dY1","arrowW","arrowH","isDarkTheme","lineColor","baseStrokeWidth","hoverColor","deleteColor","deleteColorSoft","deleteX","deleteY","segments","minDist","closestPoint","projectPointOnSegment","dist","cp1x","cp1y","cp2x","cp2y","bestX","bestY","it","bx","by","px","py","sx1","sy1","sx2","sy2","sdx","sdy","lenSq","svg","ctm","inverseCTM","handleMouseEnter","renderDeleteButton","animInitial","Milestone","ganttUtils","durationDays","dayOfWeek","workingDays","daysAdded","fromTaskId","toTaskId","buildMap","flatten","parents","currentId","json","parsed","flat","dateString","tasksWithDates","task1","task2","ascending","diff","st","autoTable","XLSX","rateMap","defaultRate","getTaskRate","rates","r","wbsMap","buildWbs","list","wbs","hasCostData","effort","logged","sold","estH","logH","soldH","rate","weight","projectName","totalEstH","totalLogH","totalSoldH","totalCostEst","totalCostExec","totalCostQuoted","totalProgress","taskCount","earliest","latest","summaryRow","worksheet","columnWidths","workbook","pad","taskUIDMap","formatMSDate","projectStart","projectEnd","xmlTasks","uid","predecessorLinks","xml","earlyDates","calculateEarlyDates","depEF","ef","lateDates","calculateLateDates","successors","lf","successor","succLS","ls","criticalPath","early","late","slack","taskMap","successorsOf","inDegree","topoOrder","queue","depEarly","succs","succId","deg","succLate","totalFloat","freeFloat","dependents","daysToEnd","earliestDepStart","changedTaskId","_visited","changedTask","updatedTasks","dependent","predecessorEnd","minStart","updateTaskRec","timelineStartDate","scaledDayWidth","headerHeight","previews","rangeStart","getAffectedTasks","parentDelta","rowIndex","taskStart","originalX","previewX","splitDate","gapDays","firstSegmentEnd","secondSegmentStart","tasksList","Timeline","dependencyLineStyle","onTaskDateChange","onDependencyDelete","weekHeaderFormat","canEditTask","onTaskProgressDrag","contentSvgRef","cascadePreviews","setCascadePreviews","activeTooltip","setActiveTooltip","hoveredDepLine","setHoveredDepLine","isOverDependencyRef","deletedDeps","setDeletedDeps","scheduleIndicator","setScheduleIndicator","handleSvgMouseMove","isOverDep","handleTooltipChange","timelineWidth","getWeekNumber","dayNum","yearStart","isWeekend","isHoliday","handleTimelineClick","handleEmptyRowMouseMove","hoverDate","handleEmptyRowMouseLeave","calculateParentDates","subtasksWithDates","startDates","endDates","earliestStart","latestEnd","tasksWithCalculatedDates","getTaskPosition","taskEnd","daysFromStart","minWidth","taskPositions","handleTaskDragMove","getDragAdjustedPosition","pixelDelta","preview","weekNum","fin","mes","todayX","nextX","isWeekendDay","isHolidayDay","hasTaskBar","isContainer","masterH","masterIsCritical","toIndex","fromIndex","fromPos","toPos","exitX","exitY","enterX","enterY","lineKey","bothCritical","DEFAULT_SUGGESTIONS","AIIcon","SendIcon","CloseIcon","MinimizeIcon","LoadingDots","GanttAIAssistant","_onTasksUpdate","isMinimized","setIsMinimized","messages","setMessages","inputValue","setInputValue","setIsLoading","showSuggestions","setShowSuggestions","mentionQuery","setMentionQuery","mentionStartIndex","setMentionStartIndex","showMentionDropdown","setShowMentionDropdown","mentionSelectedIndex","setMentionSelectedIndex","messagesEndRef","chatContainerRef","mentionDropdownRef","onCommand","suggestions","maxHistory","persistHistory","fabBg","fabBorder","fabShadow","ringBorderA","ringBorderB","tooltipBg","tooltipBorder","tooltipColor","panelBg","panelBorder","panelShadow","headerAccentBg","headerAccentBorder","iconCircleBg","iconCircleBorder","titleColor","btnColor","btnHoverColor","btnHoverBg","suggHintColor","suggBg","suggBorder","suggColor","suggHoverBorder","userMsgBg","userMsgBorder","assistMsgBg","assistMsgBorder","assistMsgColor","inputAreaBorder","inputBoxBg","inputBoxBorder","inputColor","submitBg","submitBorder","submitEmptyColor","hintColor","mentionDropBg","mentionDropBorder","mentionDropShadow","mentionActiveBg","mentionTextColor","mentionEmailColor","mentionAvatarBg","mentionAvatarBorder","persistMaxMessages","filteredMentionUsers","q","handleInputChange","textBeforeCursor","lastAtIndex","query","selectMention","handleMentionKeyDown","selected","saved","messagesWithDates","msg","messagesToPersist","applyCommandResult","handleSendCommand","command","userMessage","loadingMessage","history","withoutLoading","assistantMessage","handleSuggestionClick","suggestion","positionClasses","w","useUndoRedo","initialState","maxHistorySize","setHistory","isApplyingHistory","newStateOrUpdater","addToHistory","currentHistory","resolvedNewState","newPast","undo","previous","redo","newFuture","clearHistory","useGanttUndoRedoKeys","canUndo","canRedo","ctrlKey","defaultTemplates","assigneeNames","classes","mergeTemplates","userTemplates","getRowHeight","density","GanttBoard","forwardRef","onTasksChange","initialTimeScale","initialRowDensity","showExportButton","onExportSuccess","enableAutoCriticalPath","persistExpandedState","persistFilter","persistColumns","clearFiltersKey","aiAssistant","externalTaskFilter","externalOnTaskFilterChange","toolbarContainer","hideWbsLevel","configShowBaseline","configViewMode","configOnViewModeChange","onDependentTasksScheduled","onTaskEdit","onTaskAddSubtask","onTaskMarkIncomplete","onTaskSetInProgress","onBeforeTaskAdd","onAfterTaskAdd","onBeforeTaskUpdate","onAfterTaskUpdate","onBeforeTaskDelete","onAfterTaskDelete","permissions","globalTheme","setCurrentTheme","setTimeScale","setRowDensity","setZoom","setWbsLevel","internalViewMode","setInternalViewMode","handleViewModeChange","setShowCriticalPath","setShowDependencies","setHighlightWeekends","handleShowCriticalPathChange","show","handleShowDependenciesChange","handleHighlightWeekendsChange","onDateRangeChangeRef","getFilterStorageKey","internalTaskFilter","setInternalTaskFilter","setTaskFilter","setHideCompleted","prevClearFiltersKeyRef","scrollTop","setScrollTop","setIsResizing","gridWidthOverride","setGridWidthOverride","editingTask","setEditingTask","deleteConfirmation","setDeleteConfirmation","handleThemeChange","localTasks","setLocalTasks","getMaxDepth","depth","getStorageKey","expandedStatesRef","hasInitializedFromStorage","saveExpandedStatesToStorage","skipSyncCountRef","localTasksRef","skipOnTasksChangeRef","handleWbsLevelChange","apply","expanded","dedupeSubtasks","seen","sub","applyExpandedState","preservedState","dedupedSubtasks","dedupeAll","prevTasksRef","isInitialMount","prevJson","currentJson","getDefaultColumns","visiblesPorDefecto","conVisiblesPorDefecto","cols","columnsStorageKey","setColumns","defaults","byId","prevColumnsKeyRef","calculatedGridWidth","prevVisibleColumnsRef","visibleCols","currentKey","prevKey","hasAdditionalColumns","prevHadAdditional","BUTTONS_WIDTH","MAX_VIEWPORT_PERCENT","gridWidth","contentWidth","viewportMax","maxAllowed","gridScrollRef","gridScrollInnerRef","timelineScrollRef","ganttContainerRef","scrollToTodayDepsRef","ganttThemeContextValue","mergedTemplates","tasksWithCriticalPath","cpmMap","markCritical","cpm","enrichedSubtasks","hasCriticalChild","ss","isCritical","tasksWithStableWbs","stamp","busquedaExterna","filtrarPorEstado","normal","porNombre","lista","out","hijas","filterTasksRecursively","filteredSubtasks","matches","pendingScrollRef","desplazarA","scrollEl","sd","useImperativeHandle","update","remove","newTasks","expand","collapse","expandAll","collapseAll","ganttContainer","gridWrapper","gridScroll","originalGridScrollTop","originalTimelineScrollTop","originalOverflow","originalHeight","originalWrapperOverflow","taskGridContent","timelineSvg","gridContentHeight","timelineContentHeight","totalHeight","dataUrl","toPng","node","zIndex","exportRateRef","imported","dias","escala","handleToggleColumn","handleColumnResize","minW","maxW","clampedWidth","handleTaskToggle","findAndUpdateExpandedState","handleTaskUpdate","oldProgress","updateTask","handleBulkFill","idSet","handleTaskIndent","handleTaskOutdent","handleTaskReparent","handleTaskMove","handleMultiTaskDelete","allowedTaskIds","handleTaskDuplicate","handleTaskCreate","handleTaskRename","handleCreateSubtask","handleTaskProgressDrag","clamped","handleTaskDateChange","newStart","newEnd","isCreatingNewBar","tasksBeforeCascade","flatBefore","flatAfter","changed","startChanged","endChanged","handleTaskContextMenu","handleSplitTask","handleTaskDblClickInternal","currentTask","handleDependencyCreate","fromTask","updateTaskDependencies","handleDependencyDelete","dependencyId","removeTaskDependency","minDate","maxDate","handleExportPNG","originalGridScrollLeft","originalTimelineScrollLeft","originalGridOverflow","originalTimelineOverflow","originalContainerWidth","originalTimelineWidth","svgHeight","timelineSvgWidth","toolbarHeight","totalWidth","handleExportPDF","handleExportExcel","ts","handleExportCSV","csv","handleExportJSON","handleExportMSProject","isSyncingScroll","handleTimelineScroll","scrollY","handleGridScroll","containerLeft","maxWidth","handleTimelineMouseDown","onTodayVisibilityChange","todayVisibleRef","compute","right","visible","hasScrolledToToday","initialStartDateRef","scrollX","barra","staleTask","canCreateTask","canDeleteTask","canDuplicateTask","canUpdateTask","startTime","endTime","midTime","AlertTriangle","parseTimeInput","normalized","hoursMinutesMatch","hoursMatch","minutesMatch","daysMatch","numberMatch","DEFAULT_STATUSES","PRIORITIES","TaskFormModal","defaultStatus","ds","themeColors","colorPickerPosition","setColorPickerPosition","datePickerPosition","setDatePickerPosition","showAdvanced","setShowAdvanced","setPendingFiles","statusRef","priorityRef","assigneesRef","colorRef","dateRowRef","formData","setFormData","setErrors","validate","newErrors","submitData","statusValue","progressValue","currentStatus","currentPriority","currentColor","AlertCircle","CircleDot","Users","pickerHeight","isStart","isEnd","MilestoneIcon","GANTT_AI_SYSTEM_PROMPT","generateTasksContext","findTaskByName","normalizedName","exact","partial","words","taskName","word","parseNaturalDate","referenceDate","dayMatch","targetDay","currentDay","daysToAdd","inMatch","amount","unit","dateMatch","spanishMonths","spanishDateMatch","englishMonths","englishDateMatch","parseNaturalDuration","parseProgress","parseStatus","parseLocalCommand","moveMatch","dateText","extendMatch","durationText","progressMatch","progressText","renameMatch","oldName","linkMatch","fromName","toName","toTask","deleteMatch","validateAIResponse","response","mapCardStatusToTaskStatus","mapTaskStatusToCardStatus","cardToGanttTask","dep","parseDate","isMilestone","ganttTaskToCardUpdate","cardsToGanttTasks","listViewTranslations","getListViewTranslations","mergeListViewTranslations","STATUS_OPTIONS","normalizeStatus","lower","StatusCell","normalizedValue","getLabel","OptionIcon","useLadoDelMenu","ancla","alto","arriba","setArriba","caja","AIRE","cabeAbajo","cabeArriba","PriorityCell","lang","getAvatarColor","hash","AssigneesCell","searchInputRef","userName","newAssignee","Search","assigned","singleDateMode","singleDateField","selectingField","setSelectingField","viewMonth","setViewMonth","dateToUse","popupRef","startDateValue","endDateValue","place","POPUP_WIDTH","POPUP_HEIGHT","flipUp","getCalendarDays","prevMonthDays","handleDateSelect","getQuickOptions","dateToShow","DateCell","useSaveFlash","isFlashing","setIsFlashing","timeoutRef","triggerFlash","useSlotMachine","steps","displayValue","setDisplayValue","isAnimating","setIsAnimating","previousValueRef","animationRef","startValue","endValue","stepDuration","timeout","easedProgress","intermediateValue","useDelayedCheckbox","pendingValue","setPendingValue","setProgress","intervalRef","startChange","elapsed","cancelChange","ProgressCell","enableSlotMachine","enableSaveFlash","handleBarClick","clampedValue","handlePercentClick","commitEdit","num","displayPercent","TextCell","NumberCell","min","numValue","finalValue","DropdownCell","CheckboxCell","enableDelayedConfirm","confirmDelay","isPending","Loader2","MultiSelectCell","maxSelectable","hidden","toggle","picked","capReached","blocked","normalize","FileCell","onOpen","first","TagsCell","remainingCount","formatTime","_locale","parseTimeToMinutes","colonMatch","hmMatch","hMatch","mMatch","TimeCell","_placeholder","isBlurred","lens","hourlyRate","financialOverride","isFin","financialDollars","formattedValue","parsedMinutes","ValueIcon","DollarSign","ScheduleVarianceCell","scheduleVariance","hasTimeAllocated","formatShortDate","getVarianceBadge","HoursBarCell","onOpenTimeLog","fmt","menuOpen","setMenuOpen","popoverMode","setPopoverMode","spentMinutes","allocatedMinutes","soldMinutes","spentHours","allocatedHours","overHours","handleButtonClick","handleMenuOption","hasAnyAction","menuItems","Target","currentPopoverValue","spentIsZero","isSignificantlyOver","collectUniqueAssignees","walk","getLoadBadgeStyle","Avatar","sizeClass","fontSize","TeamLoadCell","isParent","teamLoad","uniqueAssignees","overflow","loadPercent","hasLoad","badgeStyle","SEVERITY_STYLES","BlockersCell","blockers","blocker","TableContextMenu","onColumnHide","onColumnSort","onReportBlocker","onCopyTaskLink","el","margin","getTaskMenuItems","getHeaderMenuItems","menuStyle","SubmenuItem","subItem","COLUMN_ICONS","Type","CalendarCheck","CalendarClock","Hash","CheckSquare","STANDARD_COLUMNS","customFields","onColumnsChange","_onCreateCustomField","mostrarColumnasDensas","setMaxHeight","fixedPos","setFixedPos","panelRef","updateMaxHeight","parentRect","availableHeight","allColumnTypes","types","getColumnLabel","translated","existingCol","toggleColumnVisibility","newColumns","addColumn","customFieldId","existingColumn","newColumn","DENSAS","filteredStandardColumns","filteredCustomFields","accent","isVisible","isName","FIELD_TYPES","CreateFieldModal","setType","setOptions","addOption","updateOption","newOptions","removeOption","StatusFilter","openedAtRef","newHideCompleted","fmtMinutes","fmtCurrency","ProjectHealthSidebar","onUnassignedTaskClick","isFinancial","offered","estimated","executed","marginPct","planMargin","planMarginPct","consumedPct","estLabor","estEq","estTr","showEstBreakdown","subLine","exLabor","exEq","exTr","showExBreakdown","spent","allocated","isBehind","team","DEFAULT_COLUMNS","flattenTasksWithLevel","ancestorPath","calculateGroupSPI","totalSPI","expectedProgress","calculateGroupHours","quoted","nested","formatGroupHours","WeightCellInline","setEditing","editVal","setEditVal","computeWeightedProgress","leaves","weightedSum","totalW","weightedCount","leaf","weightCoverage","den","simpleSum","collectLeaves","ListView","onColumnHeaderClick","columnsWithFilter","filterDotColor","showSearch","showHierarchy","tableColumns","mostrarIndicadoresFinancieros","allowColumnCustomization","allowColumnResize","enableContextMenu","financialBlur","healthSidebar","aggregateParentHours","showProjectTotals","totalsDollarOverride","compacta","totalWeight","calculateGroupDollars","dollarSpent","dollarAllocated","dollarQuoted","sumLeaves","loadPersistedFilter","projectTotalHours","tSpent","tAlloc","tQuoted","parentWeightSums","sums","collectWeights","childSum","healthSidebarWithTotal","sidebarOpen","setSidebarOpen","highlightedTaskId","setHighlightedTaskId","sortField","setSortField","sortOrder","setSortOrder","statusFilter","setStatusFilter","showColumnSelector","setShowColumnSelector","showCreateFieldModal","setShowCreateFieldModal","rowDragId","setRowDragId","rowDragging","setRowDragging","rowDropTargetId","setRowDropTargetId","rowDropPosition","setRowDropPosition","rowGhostPos","setRowGhostPos","rowDragStartY","rowDraggingRef","canDragRows","fillColumnFor","colType","mismaColumnaDeRelleno","displayTasksRef","handleRowDragStart","handleRowDragMove","foundId","relY","handleRowDragEnd","findSiblings","cf","rowEls","rowIds","sourceRowIndex","rangeIdsFor","targetRowIdx","oy","matched","lastRow","lastRect","rafId","sc","maxScroll","targetRowIndex","sourceTask","wbsDropdownOpen","setWbsDropdownOpen","wbsTriggerRef","wbsDropdownRef","setLevel","shouldExpand","isCurrentlyExpanded","tableRef","dragColumnId","setDragColumnId","dragOverColumnId","setDragOverColumnId","identical","expandedTasks","collectExpanded","toggleExpand","handleSort","handleColumnsChange","handleColumnHide","handleColumnSort","handleContextMenu","closeContextMenu","handleResizeStart","latestColumns","delta","handleColumnDragStart","handleColumnDragEnd","handleColumnDragOver","handleColumnDragLeave","handleColumnDrop","handleCreateCustomField","fullField","getTaskStatus","agrupar","claveGrupos","gruposPlegados","setGruposPlegados","porDefecto","g","alternarGrupo","clave","seleccionable","seleccionInterna","setSeleccionInterna","seleccion","ultimaMarcadaRef","displayTasks","cabecerasDeGrupo","tareasSinPlegar","filtroDeEstadoVisible","matchingIds","porPersona","todas","recorrer","nivel","camino","padre","ruta","visibles","FECHA","grupos","claves","titulo","orden","cabeceras","plegado","ORDEN","bloques","raices","raiz","delGrupo","filas","cuenta","aVal","bVal","priorityOrder","alternarSeleccion","conShift","siguiente","i1","i2","desde","hasta","marcar","tid","haySeleccion","casillaDeFila","TITULO_GRUPO","conCabecerasDeGrupo","fila","cabs","nodos","renderCell","getCustomFieldValue","fieldId","updateCustomField","assigneesValue","uniqueMap","collectAssignees","subs","celda","displayProgress","dateVal","checked","people","shouldBlurQuoted","canonicalDollars","groupDollars","estDollars","offDollars","estMins","soldMins","_taskRate","shouldBlurSold","effortMins","loggedMins","hasTime","parentSum","weightVal","columnWidthPercent","fullTotal","List","padres","dt","hojas","esEs","PanelRight","isDraggable","isDragOver","animationDelay","isGroupHeader","FolderOpen","Folder","isBeingDragged","fillCol","varianceMinutes","bd","hasCommittedExtras","effDollarSpent","effDollarAllocated","effDollarQuoted","formatValue","dollarOverride","dollars","varianceDollars","varianceLabelFinancial","totalNote","Info","offTotal","estTotal","weightedPct","DEFAULT_TABLE_COLUMNS","STANDARD_FIELDS","CUSTOM_FIELD_TYPES","listViewThemes","getListViewTheme","layoutWeek","ws","we","maxSlots","lanes","bars","segs","le","colOcc","chips","more","byDay","free","shown","laneCount","DOW_ES","DOW_EN","dowLabels","mondayIndex","buildMonthGrid","offset","gridStart","weeks","serialToDate","serial","dateToSerial","ms","monthStartSerial","lastDay","monthEndSerial","isWeekendSerial","grid","layoutDueWeek","slots","delDia","itemsDia","caben","restoItems","phaseId","phaseName","pId","pName","toDate","fmtCost","buildCalendar","opts","projectColor","projectId","gridEndSerial","calTasks","sSerial","eSerial","hrs","explicitCost","who","initials","shortId","visibleId","isUuid","hoy","dayItems","UUID_RE","MONTHS_ES","MONTHS_EN","monthLabel","DEFAULT_SLOT_H","CHIP_ICON","CalDow","CalBar","bar","money","projColor","slotH","due","showValues","span","cls","conValor","CalChip","chip","CalMoreChip","CalLegend","projects","VISTAS","CalTopBar","view","onViewChange","onMoneyChange","mostrarConmutadorDeDinero","projectLabel","hiddenViews","vistas","CalToolbar","onPrev","onNext","onToday","layersOpen","onToggleLayers","layersOff","phases","phaseFilter","onPhaseChange","offCount","phaseOpen","setPhaseOpen","phaseRef","onDown","selectedName","LAYERS","CalLayersPop","off","onToggle","offList","isOff","TYPE_COLOR","CalMorePopover","dayLabel","itemValue","onDocPointer","onKey","valueOf","EMPTY_COPY","CalEmptyState","upcomingMilestones","irAPrimera","toLocalISO","initialsOf","PERSON_COLORS","colorForIndex","levelClass","NBSP","fmtH","buildCapacityByDay","members","dailyCapacityHours","workKeys","metaByUser","byDateUser","log","userMap","perPerson","meta","CalCapRow","capByDay","selectedKey","onSelectDay","cap","hasData","CalBreakdownPopover","capacity","pOver","denom","WEEK_SLOT_H","WEEK_ROW_H","WeekGridView","todaySerial","capRows","teamSize","onMore","onCapDay","wi","WeekRowTall","lay","deadlineDays","inMonth","buildBacklog","CalBacklogPanel","onItemClick","onCollapse","CalPulseRail","onExpand","CalendarReschedulePopover","sim","busy","onConfirm","critical","deltaLabel","confirmLabel","CalendarAgenda","ensure","fmtDay","depIds","computeSchedule","startOverride","succ","startMs","finishMs","visiting","depFinish","dur","criticalSet","finish","latestFinish","order","minLS","sid","crit","simulateReschedule","moved","oldStart","oldEnd","critBefore","critAfter","byIdAfter","movedSuccessors","bStart","aStart","projectEndDeltaDays","slackDays","toLocalISODate","WEEK_MIN_H","SLOT_H","SLOT_H_DUE","DEFAULT_PROJECT_COLOR","CalendarView","themeMode","mostrarFiltroDeFases","canReschedule","onReschedule","holidayDates","timesheetSettings","onVisibleRangeChange","monthMode","openOnToday","semanasRef","altoSemanas","setAltoSemanas","ro","setView","setCursor","fechas","ini","primera","setLayersOpen","setLayersOff","setPhaseFilter","morePopover","setMorePopover","breakdown","setBreakdown","backlogOpen","setBacklogOpen","reschedule","setReschedule","rescheduleBusy","setRescheduleBusy","holidaySerials","set","iso","perPersonDailyCapacity","hpd","wd","built","showTasks","showCpm","visibleTasks","visibleItems","offTypes","showFestivos","toggleLayer","goPrev","goNext","goToday","primeraTarea","beginReschedule","deltaDays","anchor","ct","confirmReschedule","changes","ok","mLabel","backlog","weekRanges","startW","isWeekView","isAgenda","tasksOfDay","WeekBg","WeekRow","onDragReschedule","pendingGhost","minH","rowRef","onBarPointerDown","colW","startX","lastDays","move","up","dragDays","ghostDays","isGhost","shifted","CardStack","stack","onToggleExpand","onUnstack","onDeleteStack","stackCards","stats","totalCards","priorities","handleToggle","DEFAULT_TIMELINE_CONFIG","formatEventDescription","getEventIcon","getEventColor","CardHistoryTimeline","events","filter","onFilterChange","onClearFilter","onEventClick","selectedEventId","expandedEvents","setExpandedEvents","timelineRef","groupedEvents","dateKey","group","uniqueUsers","uniqueTypes","toggleEvent","eventId","formatRelativeTime","activeFilterCount","eventIndex","eventColor","change","CardHistoryReplay","replayState","onStartReplay","onStopReplay","onTogglePlayback","onPrevious","onGoToEvent","onSpeedChange","speeds","currentEvent","getRelationshipColor","getRelationshipLabel","getRelationshipIcon","isDirectionalRelationship","runForceSimulation","nodes","edges","iterations","simNodes","nodeMap","iter","alpha","centerX","centerY","other","edge","source","CardRelationshipsGraph","_filter","_onFilterChange","onInteraction","simulatedNodes","setSimulatedNodes","draggingNode","setDraggingNode","hoveredNode","setHoveredNode","hoveredEdge","setHoveredEdge","pan","setPan","simulated","handleNodeMouseDown","nodeId","handleNodeClick","handleEdgeClick","getNodePosition","getNodeColor","z","sourcePos","targetPos","isDirectional","GeneratePlanModal","onPlanGenerated","externalLoading","prompt","setPrompt","isGenerating","setIsGenerating","generatedPlan","setGeneratedPlan","handleGenerate","plan","handleApplyPlan","example","AI_MODELS","RATE_LIMITS","AI_FEATURES","calculateCost","model","inputTokens","outputTokens","modelInfo","inputCost","outputCost","formatCost","AIUsageTracker","operation","fullOperation","listener","timeRange","operations","op","totalOperations","totalCost","totalInputTokens","totalOutputTokens","successfulOps","totalDuration","operationsByFeature","costsByFeature","limit","planTier","period","periodOperations","percentUsed","aiUsageTracker","AIUsageDashboard","setStats","setLimit","interval","recentOps","feature","GenerateGanttTasksDialog","onTasksGenerated","onGenerateTasks","setStartDate","setEndDate","generatedTasks","setGeneratedTasks","responseMetadata","setResponseMetadata","handleApplyTasks","similarity","useKanbanState","initialBoard","onPersist","setBoard","persistBoard","updatedBoard","handleCardMove","sourceColumnId","updatedCards","updatedColumns","targetCards","handleCardCreate","newCardId","newCard","handleCardDelete","handleColumnCreate","newColumnId","handleColumnUpdate","addCard","clearBoard","useBoard","initialData","helpers","utils","maxPosition","DEFAULT_FILTERS","DEFAULT_SORT","useFilters","initialFilters","initialSort","currentUserId","setFiltersState","setSortState","setFilters","newFilters","setSort","newSort","resetFilters","filterMyTasks","filterOverdue","filterHighPriority","applyFilters","todayString","dueDate","dueDateString","todayDate","cardDueDate","comparison","aCreated","bCreated","aPriority","bPriority","aDue","bDue","aTime","bTime","aEst","bEst","generateObject","generateText","aiSDK","useAI","isAvailable","onSuggestAssignee","_boardState","onGenerateSubtasks","onEstimateEffort","useSelectionState","selectionStore","setSelectionState","useMultiSelect","selectionState","isCardSelected","selectCard","isCtrlOrCmd","isShift","lastCard","startIndex","endIndex","minIndex","maxIndex","rangeCardIds","newSelection","deselectCard","selectAll","toggleCard","getSelectedCards","DEFAULT_STACKING_CONFIG","useCardStacking","userConfig","aiService","stacks","setStacks","createStack","strategy","newStack","deleteStack","stackId","toggleStack","addToStack","removeFromStack","newCardIds","getStacksForColumn","getSuggestions","byLabels","byAssignee","byPriority","priorityEmoji","highSimilarity","avgConfidence","applySuggestion","topSuggestion","BoardContext","BoardProvider","onStateChange","storeRef","cardsMap","colData","Board","BoardStore","store","_event","useBoardStore","setCards","updateBoard","columnData","updateColumn","deleteColumn","getColumn","updateCard","deleteCard","moveCard","toColumnId","newPosition","getCard","getCardsByColumn","useFilteredCards","matchesTitle","matchesDesc","useSortedCards","sortBy","PluginManager","plugin","pluginId","hookName","defaultValue","hook","hookResult","promises","pluginManager","VirtualList","estimateSize","renderItem","overscan","horizontal","gap","getItemKey","virtualItems","containerStyle","innerStyle","itemStyle","useVirtualList","VirtualGrid","estimateColumnWidth","columnVirtualizer","virtualColumns","virtualColumn","columnStyle","useVirtualGrid","shouldVirtualizeGrid","spacing","fontWeight","lineHeight","shadows","opacity","kanban","gantt","designTokens","getToken","tokens","flattenTokens","obj","newKey","formatCSSValue","generateCSSVariables","flatTokens","cssVars","varValue","generateThemeVariables","flatColors","generateCompleteCSS","tokenVars","themeVars","exportTokensToCSS","ThemeIcon","ThemeSwitcher","showLabels"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * KanbanViewAdapter - ViewAdapter implementation for Kanban board\n * @module views/KanbanViewAdapter\n *\n * Implements the ViewAdapter interface from @libxai/core to enable\n * the Kanban board to work with AsakaaRuntime and ViewRegistry.\n */\n\nimport { createRoot, type Root } from 'react-dom/client'\nimport { BaseViewAdapter, type ViewBoardData, type ViewOptions, type ExportFormat } from '@libxai/core'\nimport { KanbanBoard } from '../components/Board'\nimport type { KanbanBoardProps } from '../types'\nimport type { Card, Column } from '../types'\n\n/**\n * Kanban view configuration\n */\nexport interface KanbanViewConfig {\n  /**\n   * Board callbacks\n   */\n  callbacks?: KanbanBoardProps['callbacks']\n\n  /**\n   * Card click handler\n   */\n  onCardClick?: KanbanBoardProps['onCardClick']\n\n  /**\n   * Custom render props\n   */\n  renderProps?: KanbanBoardProps['renderProps']\n\n  /**\n   * Board configuration\n   */\n  config?: KanbanBoardProps['config']\n\n  /**\n   * Available users for assignment\n   */\n  availableUsers?: KanbanBoardProps['availableUsers']\n\n  /**\n   * Custom class name\n   */\n  className?: string\n\n  /**\n   * Custom inline styles (React.CSSProperties)\n   */\n  style?: React.CSSProperties\n\n  /**\n   * View options\n   */\n  viewOptions?: ViewOptions\n}\n\n/**\n * KanbanViewAdapter\n *\n * React-based ViewAdapter implementation that wraps the KanbanBoard component.\n * This allows the Kanban board to be used as a view in the ViewRegistry and\n * work seamlessly with AsakaaRuntime.\n *\n * @example\n * ```typescript\n * import { KanbanViewAdapter } from '@libxai/board'\n * import { ViewRegistry } from '@libxai/core'\n *\n * const registry = new ViewRegistry()\n * const kanbanView = new KanbanViewAdapter({\n *   callbacks: {\n *     onCardMove: (cardId, columnId) => { ... },\n *     onCardUpdate: (cardId, updates) => { ... }\n *   }\n * })\n *\n * registry.register(kanbanView)\n * await registry.activate('kanban', container, data)\n * ```\n */\nexport class KanbanViewAdapter extends BaseViewAdapter<ViewBoardData> {\n  readonly id = 'kanban'\n  readonly name = 'Kanban Board'\n  readonly version = '1.0.0'\n  readonly description = ''\n  readonly icon = ''\n  readonly supportedExports: ExportFormat[] = ['json', 'csv', 'pdf', 'png']\n\n  private root: Root | null = null\n  private kanbanConfig: KanbanViewConfig\n\n  constructor(config: KanbanViewConfig = {}) {\n    super()\n\n    // Set description and icon after construction\n    ;(this as any).description = 'Interactive Kanban board with drag & drop, filters, and real-time updates'\n    ;(this as any).icon = '📋'\n\n    this.kanbanConfig = config\n    this.options = {\n      animations: config.viewOptions?.animations ?? true,\n      virtualScrolling: config.viewOptions?.virtualScrolling ?? false,\n      theme: config.viewOptions?.theme ?? 'dark',\n      readonly: config.viewOptions?.readonly ?? false,\n    }\n  }\n\n  // ========================================================================\n  // LIFECYCLE\n  // ========================================================================\n\n  /**\n   * Mount the Kanban view\n   *\n   * @param container - DOM element to mount into\n   * @param data - Initial board data\n   */\n  mount(container: HTMLElement, data: ViewBoardData): void {\n    if (this.isMounted()) {\n      console.warn('[KanbanViewAdapter] Already mounted, unmounting first')\n      this.unmount()\n    }\n\n    // Store references\n    this.container = container\n    this.data = data\n\n    // Create React root\n    this.root = createRoot(container)\n\n    // Render Kanban board\n    this.render()\n\n    // Emit mounted event\n    this.emit('view:mounted', { viewId: this.id, timestamp: Date.now() })\n  }\n\n  /**\n   * Unmount the Kanban view\n   */\n  unmount(): void {\n    if (!this.isMounted()) {\n      return\n    }\n\n    // Emit unmounted event BEFORE cleanup\n    this.emit('view:unmounted', { viewId: this.id, timestamp: Date.now() })\n\n    // Unmount React\n    if (this.root) {\n      this.root.unmount()\n      this.root = null\n    }\n\n    // Clear references\n    if (this.container) {\n      this.container.innerHTML = ''\n      this.container = null\n    }\n\n    this.data = null\n  }\n\n  /**\n   * Update the view with new data\n   *\n   * @param data - New board data\n   */\n  update(data: ViewBoardData): void {\n    if (!this.isMounted()) {\n      console.warn('[KanbanViewAdapter] Not mounted, cannot update')\n      return\n    }\n\n    this.data = data\n    this.render()\n\n    this.emit('view:updated', { viewId: this.id, data })\n  }\n\n  /**\n   * Configure the view\n   *\n   * @param options - View options\n   */\n  configure(options: ViewOptions): void {\n    this.options = { ...this.options, ...options }\n\n    // Re-render if mounted\n    if (this.isMounted()) {\n      this.render()\n    }\n  }\n\n  // ========================================================================\n  // EXPORT\n  // ========================================================================\n\n  /**\n   * Export the view to a specific format\n   *\n   * @param format - Export format\n   * @returns Promise resolving to exported data\n   */\n  async export(format: 'json' | 'csv' | 'pdf' | 'png'): Promise<string | Blob> {\n    if (!this.data) {\n      throw new Error('No data to export')\n    }\n\n    switch (format) {\n      case 'json':\n        return JSON.stringify(this.data, null, 2)\n\n      case 'csv':\n        return this.exportToCSV()\n\n      case 'pdf':\n        return this.exportToPDF()\n\n      case 'png':\n        return this.exportToPNG()\n\n      default:\n        throw new Error(`Unsupported export format: ${format}`)\n    }\n  }\n\n  // ========================================================================\n  // PRIVATE METHODS\n  // ========================================================================\n\n  /**\n   * Render the Kanban board\n   */\n  private render(): void {\n    if (!this.root || !this.data) {\n      return\n    }\n\n    // Convert ViewBoardData to KanbanBoard props format\n    const board = {\n      id: this.data.board?.id || 'board-1',\n      title: this.data.board?.title || 'Untitled Board',\n      columns: this.data.columns,\n      cards: this.data.cards,\n    }\n\n    // Render React component\n    this.root.render(\n      <KanbanBoard\n        board={board}\n        callbacks={this.kanbanConfig.callbacks || {}}\n        onCardClick={this.kanbanConfig.onCardClick}\n        renderProps={this.kanbanConfig.renderProps}\n        config={this.kanbanConfig.config}\n        availableUsers={this.kanbanConfig.availableUsers}\n        className={this.kanbanConfig.className}\n        style={this.kanbanConfig.style}\n      />\n    )\n  }\n\n  /**\n   * Export board data to CSV format\n   */\n  private exportToCSV(): string {\n    if (!this.data) return ''\n\n    const rows: string[][] = [\n      ['Card ID', 'Title', 'Column', 'Description', 'Labels', 'Assignees', 'Due Date', 'Position'],\n    ]\n\n    this.data.cards.forEach((card: Card) => {\n      const column = this.data!.columns.find((col: Column) => col.id === card.columnId)\n      rows.push([\n        card.id,\n        card.title,\n        column?.title || '',\n        card.description || '',\n        card.labels?.join(', ') || '',\n        card.assignedUserIds?.join(', ') || card.assigneeId || '',\n        card.dueDate?.toString() || '',\n        card.position.toString(),\n      ])\n    })\n\n    return rows.map((row) => row.map((cell) => `\"${cell}\"`).join(',')).join('\\n')\n  }\n\n  /**\n   * Export board to PDF\n   * Uses the PDF export functionality from the Board component\n   */\n  private async exportToPDF(): Promise<Blob> {\n    // TODO: Integrate with PDF export from CardDetailModal/PDFExport\n    // For now, return a simple PDF placeholder\n    throw new Error('PDF export not yet implemented in ViewAdapter')\n  }\n\n  /**\n   * Export board to PNG image\n   * Uses html2canvas to capture the board\n   */\n  private async exportToPNG(): Promise<Blob> {\n    if (!this.container) {\n      throw new Error('View not mounted')\n    }\n\n    // Dynamic import to avoid bundling if not used\n    const html2canvas = await import('html2canvas')\n\n    const canvas = await html2canvas.default(this.container, {\n      backgroundColor: this.options.theme === 'dark' ? '#1a1a1a' : '#ffffff',\n      scale: 2, // Higher resolution\n    })\n\n    return new Promise((resolve, reject) => {\n      canvas.toBlob((blob) => {\n        if (blob) {\n          resolve(blob)\n        } else {\n          reject(new Error('Failed to create PNG blob'))\n        }\n      }, 'image/png')\n    })\n  }\n}\n\n// ========================================================================\n// FACTORY FUNCTION\n// ========================================================================\n\n/**\n * Create a new Kanban view adapter\n *\n * @param config - View configuration\n * @returns KanbanViewAdapter instance\n *\n * @example\n * ```typescript\n * const kanbanView = createKanbanView({\n *   callbacks: {\n *     onCardMove: (cardId, columnId) => console.log('Card moved'),\n *   },\n *   theme: 'dark',\n * })\n * ```\n */\nexport function createKanbanView(config: KanbanViewConfig = {}): KanbanViewAdapter {\n  return new KanbanViewAdapter(config)\n}\n","// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nexport const canUseDOM =\n  typeof window !== 'undefined' &&\n  typeof window.document !== 'undefined' &&\n  typeof window.document.createElement !== 'undefined';\n","export type Transform = {\n  x: number;\n  y: number;\n  scaleX: number;\n  scaleY: number;\n};\n\nexport interface Transition {\n  property: string;\n  easing: string;\n  duration: number;\n}\n\nexport const CSS = Object.freeze({\n  Translate: {\n    toString(transform: Transform | null) {\n      if (!transform) {\n        return;\n      }\n\n      const {x, y} = transform;\n\n      return `translate3d(${x ? Math.round(x) : 0}px, ${\n        y ? Math.round(y) : 0\n      }px, 0)`;\n    },\n  },\n  Scale: {\n    toString(transform: Transform | null) {\n      if (!transform) {\n        return;\n      }\n\n      const {scaleX, scaleY} = transform;\n\n      return `scaleX(${scaleX}) scaleY(${scaleY})`;\n    },\n  },\n  Transform: {\n    toString(transform: Transform | null) {\n      if (!transform) {\n        return;\n      }\n\n      return [\n        CSS.Translate.toString(transform),\n        CSS.Scale.toString(transform),\n      ].join(' ');\n    },\n  },\n  Transition: {\n    toString({property, duration, easing}: Transition) {\n      return `${property} ${duration}ms ${easing}`;\n    },\n  },\n});\n","/**\r\n * Class name utility (cn)\r\n * Combines clsx and tailwind-merge for optimal Tailwind class handling\r\n */\r\n\r\nimport { type ClassValue, clsx } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\n/**\r\n * Merge class names intelligently\r\n * Handles Tailwind class conflicts properly\r\n *\r\n * @example\r\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4'\r\n * cn('text-red-500', condition && 'text-[#00E5CC]') // => 'text-[#00E5CC]' if condition is true\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n  return twMerge(clsx(inputs))\r\n}\r\n","/**\n * Lexicographic positioning utilities\n * Uses fractional indexing for efficient reordering without touching all items\n * @module utils/positioning\n */\n\n/**\n * Calculate position between two items\n * Uses lexicographic ordering (fractional indexing)\n *\n * @param before - Position of item before (or null if first)\n * @param after - Position of item after (or null if last)\n * @returns New position value\n *\n * @example\n * calculatePosition(null, 1000) // => 500 (before first item)\n * calculatePosition(1000, 2000) // => 1500 (between two items)\n * calculatePosition(1000, null) // => 2000 (after last item)\n */\nexport function calculatePosition(\n  before: number | null,\n  after: number | null\n): number {\n  // First item\n  if (before === null && after === null) {\n    return 1000\n  }\n\n  // Insert at beginning\n  if (before === null && after !== null) {\n    return after / 2\n  }\n\n  // Insert at end\n  if (before !== null && after === null) {\n    return before + 1000\n  }\n\n  // Insert between\n  if (before !== null && after !== null) {\n    return (before + after) / 2\n  }\n\n  return 1000\n}\n\n/**\n * Generate initial positions for an array of items\n * Spaces them 1000 apart for room to insert\n *\n * @param count - Number of items\n * @returns Array of position values\n */\nexport function generateInitialPositions(count: number): number[] {\n  return Array.from({ length: count }, (_, i) => (i + 1) * 1000)\n}\n\n/**\n * Rebalance positions when they get too close\n * Call this periodically to maintain clean spacing\n *\n * @param positions - Current positions (sorted)\n * @returns Rebalanced positions\n */\nexport function rebalancePositions(positions: number[]): number[] {\n  if (positions.length === 0) return []\n  if (positions.length === 1) return [1000]\n\n  const sorted = [...positions].sort((a, b) => a - b)\n  return sorted.map((_, i) => (i + 1) * 1000)\n}\n\n/**\n * Check if positions need rebalancing\n * Returns true if any two positions are < 1 apart\n */\nexport function needsRebalancing(positions: number[]): boolean {\n  const sorted = [...positions].sort((a, b) => a - b)\n\n  for (let i = 0; i < sorted.length - 1; i++) {\n    if (sorted[i + 1]! - sorted[i]! < 1) {\n      return true\n    }\n  }\n\n  return false\n}\n\n/**\n * Find position for dropping a card\n *\n * @param columnCards - Cards in target column (sorted by position)\n * @param dropIndex - Index where card is dropped\n * @returns New position value\n */\nexport function calculateDropPosition(\n  columnCards: { position: number }[],\n  dropIndex: number\n): number {\n  // Empty column\n  if (columnCards.length === 0) {\n    return 1000\n  }\n\n  // Drop at beginning\n  if (dropIndex === 0) {\n    return calculatePosition(null, columnCards[0]!.position)\n  }\n\n  // Drop at end\n  if (dropIndex >= columnCards.length) {\n    return calculatePosition(\n      columnCards[columnCards.length - 1]!.position,\n      null\n    )\n  }\n\n  // Drop between items\n  return calculatePosition(\n    columnCards[dropIndex - 1]!.position,\n    columnCards[dropIndex]!.position\n  )\n}\n","/**\n * Performance utilities\n * @module utils/performance\n */\n\nimport { useEffect, useRef } from 'react'\n\n/**\n * Debounce function calls\n */\nexport function debounce<T extends (...args: any[]) => any>(\n  func: T,\n  wait: number\n): (...args: Parameters<T>) => void {\n  let timeout: ReturnType<typeof setTimeout> | null = null\n\n  return function executedFunction(...args: Parameters<T>) {\n    const later = () => {\n      timeout = null\n      func(...args)\n    }\n\n    if (timeout) {\n      clearTimeout(timeout)\n    }\n    timeout = setTimeout(later, wait)\n  }\n}\n\n/**\n * Throttle function calls\n */\nexport function throttle<T extends (...args: any[]) => any>(\n  func: T,\n  limit: number\n): (...args: Parameters<T>) => void {\n  let inThrottle: boolean\n  let lastResult: ReturnType<T>\n\n  return function executedFunction(...args: Parameters<T>) {\n    if (!inThrottle) {\n      inThrottle = true\n      setTimeout(() => (inThrottle = false), limit)\n      lastResult = func(...args)\n    }\n    return lastResult\n  }\n}\n\n/**\n * Custom hook for measuring render performance\n * Only active in development\n */\nexport function useRenderPerformance(componentName: string) {\n  const renderCount = useRef(0)\n  const lastRenderTime = useRef<number>(0)\n\n  if (process.env.NODE_ENV === 'development') {\n    const start = performance.now()\n\n    useEffect(() => {\n      const end = performance.now()\n      renderCount.current++\n      const renderTime = end - start\n\n      if (renderTime > 16) {\n        // > 1 frame at 60fps\n        console.warn(\n          `[Performance] ${componentName} render #${renderCount.current} took ${renderTime.toFixed(2)}ms`\n        )\n      }\n\n      lastRenderTime.current = renderTime\n    })\n  }\n}\n\n/**\n * Check if virtualization should be enabled\n */\nexport function shouldVirtualize(itemCount: number, threshold = 100): boolean {\n  return itemCount > threshold\n}\n\n/**\n * Request idle callback wrapper with fallback\n */\nexport const requestIdleCallback =\n  typeof window !== 'undefined' && 'requestIdleCallback' in window\n    ? window.requestIdleCallback\n    : (cb: IdleRequestCallback) => setTimeout(cb, 1)\n\n/**\n * Cancel idle callback wrapper with fallback\n */\nexport const cancelIdleCallback =\n  typeof window !== 'undefined' && 'cancelIdleCallback' in window\n    ? window.cancelIdleCallback\n    : (id: number) => clearTimeout(id)\n\n/**\n * Memoization helper for expensive computations\n */\nexport function memoize<T extends (...args: any[]) => any>(fn: T): T {\n  const cache = new Map<string, ReturnType<T>>()\n\n  return ((...args: Parameters<T>) => {\n    const key = JSON.stringify(args)\n    if (cache.has(key)) {\n      return cache.get(key)!\n    }\n    const result = fn(...args)\n    cache.set(key, result)\n    return result\n  }) as T\n}\n","/**\n * Retry utilities with exponential backoff\n * For resilient API calls and persistence operations\n * @module utils/retry\n */\n\nexport interface RetryOptions {\n  /** Maximum number of retry attempts (default: 3) */\n  maxAttempts?: number\n  /** Initial delay in ms (default: 1000) */\n  initialDelay?: number\n  /** Multiplier for exponential backoff (default: 2) */\n  backoffMultiplier?: number\n  /** Maximum delay in ms (default: 10000) */\n  maxDelay?: number\n  /** Function to determine if error should be retried */\n  shouldRetry?: (error: Error, attempt: number) => boolean\n  /** Callback when retry is attempted */\n  onRetry?: (error: Error, attempt: number, delay: number) => void\n}\n\nexport interface RetryResult<T> {\n  data?: T\n  error?: Error\n  attempts: number\n  success: boolean\n}\n\n/**\n * Default retry logic - retries on network errors\n */\nconst defaultShouldRetry = (error: Error): boolean => {\n  // Retry on network errors\n  if (error.message.includes('network') || error.message.includes('fetch')) {\n    return true\n  }\n\n  // Retry on specific error codes\n  if ('status' in error) {\n    const status = (error as any).status\n    // Retry on server errors (5xx) and rate limiting (429)\n    return status >= 500 || status === 429\n  }\n\n  return false\n}\n\n/**\n * Calculate delay with exponential backoff\n */\nfunction calculateDelay(\n  attempt: number,\n  initialDelay: number,\n  backoffMultiplier: number,\n  maxDelay: number\n): number {\n  const delay = initialDelay * Math.pow(backoffMultiplier, attempt - 1)\n  // Add jitter (random variation) to prevent thundering herd\n  const jitter = delay * 0.2 * Math.random()\n  return Math.min(delay + jitter, maxDelay)\n}\n\n/**\n * Retry a function with exponential backoff\n *\n * @example\n * ```ts\n * const result = await retryWithBackoff(\n *   () => api.updateBoard(board),\n *   {\n *     maxAttempts: 3,\n *     onRetry: (error, attempt) => {\n *       console.log(`Retry attempt ${attempt}: ${error.message}`)\n *     }\n *   }\n * )\n * ```\n */\nexport async function retryWithBackoff<T>(\n  fn: () => Promise<T>,\n  options: RetryOptions = {}\n): Promise<RetryResult<T>> {\n  const {\n    maxAttempts = 3,\n    initialDelay = 1000,\n    backoffMultiplier = 2,\n    maxDelay = 10000,\n    shouldRetry = defaultShouldRetry,\n    onRetry,\n  } = options\n\n  let lastError: Error | undefined\n  let attempts = 0\n\n  for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n    attempts = attempt\n\n    try {\n      const data = await fn()\n      return {\n        data,\n        attempts,\n        success: true,\n      }\n    } catch (error) {\n      lastError = error as Error\n\n      // Check if we should retry\n      const isLastAttempt = attempt === maxAttempts\n      if (isLastAttempt || !shouldRetry(lastError, attempt)) {\n        return {\n          error: lastError,\n          attempts,\n          success: false,\n        }\n      }\n\n      // Calculate delay for next attempt\n      const delay = calculateDelay(attempt, initialDelay, backoffMultiplier, maxDelay)\n\n      // Call retry callback\n      if (onRetry) {\n        try {\n          onRetry(lastError, attempt, delay)\n        } catch (callbackError) {\n          console.error('Error in retry callback:', callbackError)\n        }\n      }\n\n      // Wait before retrying\n      await new Promise((resolve) => setTimeout(resolve, delay))\n    }\n  }\n\n  // This should never be reached, but TypeScript doesn't know that\n  return {\n    error: lastError || new Error('Unknown error'),\n    attempts,\n    success: false,\n  }\n}\n\n/**\n * Retry a function synchronously (for non-async operations)\n * No backoff, just immediate retries\n */\nexport function retrySyncOperation<T>(\n  fn: () => T,\n  maxAttempts: number = 3\n): { data?: T; error?: Error; success: boolean } {\n  let lastError: Error | undefined\n\n  for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n    try {\n      const data = fn()\n      return { data, success: true }\n    } catch (error) {\n      lastError = error as Error\n\n      if (attempt === maxAttempts) {\n        return { error: lastError, success: false }\n      }\n    }\n  }\n\n  return { error: lastError || new Error('Unknown error'), success: false }\n}\n\n/**\n * Create a retry wrapper function\n * Returns a function that automatically retries on failure\n *\n * @example\n * ```ts\n * const saveBoard = createRetryWrapper(\n *   api.saveBoard,\n *   { maxAttempts: 3 }\n * )\n *\n * const result = await saveBoard(boardData)\n * ```\n */\nexport function createRetryWrapper<TArgs extends any[], TReturn>(\n  fn: (...args: TArgs) => Promise<TReturn>,\n  options: RetryOptions = {}\n): (...args: TArgs) => Promise<RetryResult<TReturn>> {\n  return async (...args: TArgs) => {\n    return retryWithBackoff(() => fn(...args), options)\n  }\n}\n\n/**\n * Retry with circuit breaker pattern\n * Stops retrying if too many failures occur\n */\nexport class CircuitBreaker {\n  private failures: number = 0\n  private lastFailureTime: number = 0\n  private isOpen: boolean = false\n\n  constructor(\n    private threshold: number = 5,\n    private resetTimeout: number = 60000 // 1 minute\n  ) {}\n\n  async execute<T>(fn: () => Promise<T>): Promise<T> {\n    // Check if circuit is open\n    if (this.isOpen) {\n      const timeSinceLastFailure = Date.now() - this.lastFailureTime\n\n      // Try to close circuit after reset timeout\n      if (timeSinceLastFailure >= this.resetTimeout) {\n        this.reset()\n      } else {\n        throw new Error('Circuit breaker is open - too many failures')\n      }\n    }\n\n    try {\n      const result = await fn()\n      this.onSuccess()\n      return result\n    } catch (error) {\n      this.onFailure()\n      throw error\n    }\n  }\n\n  private onSuccess(): void {\n    this.failures = 0\n    this.isOpen = false\n  }\n\n  private onFailure(): void {\n    this.failures++\n    this.lastFailureTime = Date.now()\n\n    if (this.failures >= this.threshold) {\n      this.isOpen = true\n    }\n  }\n\n  private reset(): void {\n    this.failures = 0\n    this.isOpen = false\n  }\n\n  getStatus(): { failures: number; isOpen: boolean } {\n    return {\n      failures: this.failures,\n      isOpen: this.isOpen,\n    }\n  }\n}\n","/**\n * Structured Logger for ASAKAA\n * Lightweight, browser-compatible logging system\n * @module utils/logger\n */\n\nexport enum LogLevel {\n  DEBUG = 0,\n  INFO = 1,\n  WARN = 2,\n  ERROR = 3,\n  NONE = 4,\n}\n\nexport interface LogContext {\n  [key: string]: any\n}\n\nexport interface LogEntry {\n  timestamp: string\n  level: string\n  message: string\n  context?: LogContext\n  component?: string\n  action?: string\n  duration?: number\n  error?: {\n    message: string\n    stack?: string\n    name: string\n  }\n}\n\nexport interface LoggerOptions {\n  /** Minimum log level (default: INFO in production, DEBUG in development) */\n  minLevel?: LogLevel\n  /** Enable/disable logging (default: true) */\n  enabled?: boolean\n  /** Custom log handler for sending logs to external service */\n  onLog?: (entry: LogEntry) => void\n  /** Enable performance timing (default: true) */\n  enableTiming?: boolean\n  /** Component name prefix */\n  componentName?: string\n}\n\n/**\n * Structured Logger Class\n *\n * @example\n * ```ts\n * const logger = new Logger({ componentName: 'KanbanBoard' })\n *\n * logger.info('Board loaded', { boardId: 'abc-123', cardCount: 42 })\n * logger.warn('Slow operation detected', { duration: 1500 })\n * logger.error('Failed to save', { error: err })\n *\n * // With timing\n * const timer = logger.startTimer('drag-operation')\n * // ... do work\n * timer.end({ cardId: 'card-1' })\n * ```\n */\nexport class Logger {\n  private options: Required<LoggerOptions>\n  private static globalOptions: Partial<LoggerOptions> = {}\n\n  constructor(options: LoggerOptions = {}) {\n    const isDev = process.env.NODE_ENV === 'development'\n\n    this.options = {\n      minLevel: options.minLevel ?? (isDev ? LogLevel.DEBUG : LogLevel.INFO),\n      enabled: options.enabled ?? true,\n      onLog: options.onLog ?? this.defaultLogHandler,\n      enableTiming: options.enableTiming ?? true,\n      componentName: options.componentName ?? 'ASAKAA',\n      ...Logger.globalOptions,\n    }\n  }\n\n  /**\n   * Set global logger configuration\n   * Applies to all logger instances\n   */\n  static configure(options: Partial<LoggerOptions>): void {\n    Logger.globalOptions = { ...Logger.globalOptions, ...options }\n  }\n\n  /**\n   * Create child logger with component name\n   */\n  child(componentName: string): Logger {\n    return new Logger({\n      ...this.options,\n      componentName: `${this.options.componentName}:${componentName}`,\n    })\n  }\n\n  /**\n   * Log debug message\n   */\n  debug(message: string, context?: LogContext): void {\n    this.log(LogLevel.DEBUG, message, context)\n  }\n\n  /**\n   * Log info message\n   */\n  info(message: string, context?: LogContext): void {\n    this.log(LogLevel.INFO, message, context)\n  }\n\n  /**\n   * Log warning message\n   */\n  warn(message: string, context?: LogContext): void {\n    this.log(LogLevel.WARN, message, context)\n  }\n\n  /**\n   * Log error message\n   */\n  error(message: string, error?: Error, context?: LogContext): void {\n    this.log(LogLevel.ERROR, message, {\n      ...context,\n      error: error\n        ? {\n            message: error.message,\n            stack: error.stack,\n            name: error.name,\n          }\n        : undefined,\n    })\n  }\n\n  /**\n   * Start a timer for performance tracking\n   */\n  startTimer(action: string): Timer {\n    if (!this.options.enableTiming) {\n      return new Timer(() => {}, false)\n    }\n\n    return new Timer(\n      (duration: number, context?: LogContext) => {\n        this.log(LogLevel.DEBUG, `${action} completed`, {\n          ...context,\n          action,\n          duration,\n        })\n      },\n      true\n    )\n  }\n\n  /**\n   * Core logging method\n   */\n  private log(level: LogLevel, message: string, context?: LogContext): void {\n    if (!this.options.enabled || level < this.options.minLevel) {\n      return\n    }\n\n    const entry: LogEntry = {\n      timestamp: new Date().toISOString(),\n      level: LogLevel[level],\n      message,\n      component: this.options.componentName,\n      ...context,\n    }\n\n    this.options.onLog(entry)\n  }\n\n  /**\n   * Default log handler (console)\n   */\n  private defaultLogHandler = (entry: LogEntry): void => {\n    const { timestamp, level, message, component, ...rest } = entry\n\n    const prefix = `[${timestamp}] [${level}] [${component}]`\n    const hasContext = Object.keys(rest).length > 0\n\n    switch (level) {\n      case 'DEBUG':\n        console.debug(prefix, message, hasContext ? rest : '')\n        break\n      case 'INFO':\n        console.info(prefix, message, hasContext ? rest : '')\n        break\n      case 'WARN':\n        console.warn(prefix, message, hasContext ? rest : '')\n        break\n      case 'ERROR':\n        console.error(prefix, message, hasContext ? rest : '')\n        if (entry.error?.stack) {\n          console.error(entry.error.stack)\n        }\n        break\n    }\n  }\n}\n\n/**\n * Timer for performance tracking\n */\nclass Timer {\n  private startTime: number\n\n  constructor(\n    private onEnd: (duration: number, context?: LogContext) => void,\n    private enabled: boolean\n  ) {\n    this.startTime = enabled ? performance.now() : 0\n  }\n\n  /**\n   * End timer and log duration\n   */\n  end(context?: LogContext): number {\n    if (!this.enabled) {\n      return 0\n    }\n\n    const duration = Math.round(performance.now() - this.startTime)\n    this.onEnd(duration, context)\n    return duration\n  }\n\n  /**\n   * Get elapsed time without ending timer\n   */\n  elapsed(): number {\n    if (!this.enabled) {\n      return 0\n    }\n    return Math.round(performance.now() - this.startTime)\n  }\n}\n\n/**\n * Global logger instance\n */\nexport const logger = new Logger()\n\n/**\n * Create a scoped logger for a component\n */\nexport function createLogger(componentName: string, options?: LoggerOptions): Logger {\n  return new Logger({\n    ...options,\n    componentName,\n  })\n}\n","import { jsPDF } from 'jspdf'\nimport html2canvas from 'html2canvas'\nimport type { Board, ExportOptions, ExportFormat } from '../types'\n\nexport function exportToJSON(board: Board, _options?: ExportOptions): string {\n  const data = {\n    board: {\n      id: board.id,\n      title: board.title,\n      metadata: board.metadata,\n      exportedAt: new Date().toISOString(),\n    },\n    columns: board.columns,\n    cards: board.cards,\n    options: _options,\n  }\n\n  return JSON.stringify(data, null, 2)\n}\n\nexport function exportToCSV(board: Board, _options?: ExportOptions): string {\n  const headers = [\n    'Card ID',\n    'Title',\n    'Description',\n    'Column',\n    'Priority',\n    'Labels',\n    'Assigned Users',\n    'Start Date',\n    'End Date',\n    'Created At',\n    'Updated At',\n  ]\n\n  const rows = board.cards.map((card) => {\n    const column = board.columns.find((col) => col.id === card.columnId)\n\n    return [\n      card.id,\n      escapeCSV(card.title),\n      escapeCSV(card.description || ''),\n      escapeCSV(column?.title || ''),\n      card.priority || '',\n      (card.labels || []).join(';'),\n      (card.assignedUserIds || []).join(';'),\n      card.startDate || '',\n      card.endDate || '',\n      card.createdAt || '',\n      card.updatedAt || '',\n    ]\n  })\n\n  const csvContent = [\n    headers.join(','),\n    ...rows.map((row) => row.join(',')),\n  ].join('\\n')\n\n  return csvContent\n}\n\nexport async function exportToPDF(\n  board: Board,\n  boardElement?: HTMLElement,\n  _options?: ExportOptions\n): Promise<jsPDF> {\n  // Try to find board element automatically if not provided\n  let element = boardElement\n\n  if (!element) {\n    // Look for the board element in the DOM\n    const boardEl = document.querySelector<HTMLElement>('.asakaa-board')\n    if (boardEl) {\n      element = boardEl.parentElement || boardEl\n    }\n  }\n\n  // If board element is available, capture it visually\n  if (element) {\n    try {\n      const canvas = await html2canvas(element, {\n        backgroundColor: '#0a0a0a',\n        scale: 1.5, // Balance between quality and performance\n        logging: false,\n        useCORS: true,\n        allowTaint: true,\n        windowWidth: element.scrollWidth,\n        windowHeight: element.scrollHeight,\n      })\n\n      const imgData = canvas.toDataURL('image/png')\n\n      // Calculate dimensions for landscape PDF\n      const pdfWidth = 297 // A4 landscape width in mm\n      const pdfHeight = 210 // A4 landscape height in mm\n      const imgAspect = canvas.width / canvas.height\n\n      let imgWidth = pdfWidth - 20 // margins\n      let imgHeight = imgWidth / imgAspect\n\n      // If image is too tall, scale to fit height\n      if (imgHeight > pdfHeight - 20) {\n        imgHeight = pdfHeight - 20\n        imgWidth = imgHeight * imgAspect\n      }\n\n      const doc = new jsPDF({\n        orientation: 'landscape',\n        unit: 'mm',\n        format: 'a4',\n      })\n\n      // Add title\n      doc.setFontSize(16)\n      doc.setTextColor(255, 255, 255)\n      doc.setFillColor(10, 10, 10)\n      doc.rect(0, 0, pdfWidth, 15, 'F')\n      doc.text(board.title || 'Kanban Board', 10, 10)\n\n      // Add board image\n      const xOffset = (pdfWidth - imgWidth) / 2\n      doc.addImage(imgData, 'PNG', xOffset, 20, imgWidth, imgHeight)\n\n      return doc\n    } catch (error) {\n      console.error('Error capturing board:', error)\n      // Fall back to text-based export\n    }\n  }\n\n  // Fallback: Text-based PDF export\n  const doc = new jsPDF()\n  let yPosition = 20\n\n  doc.setFontSize(20)\n  doc.text(board.title || 'Kanban Board', 20, yPosition)\n  yPosition += 10\n\n  doc.setFontSize(10)\n  doc.setTextColor(128, 128, 128)\n  doc.text(`Exported on ${new Date().toLocaleString()}`, 20, yPosition)\n  yPosition += 15\n\n  doc.setTextColor(0, 0, 0)\n\n  board.columns.forEach((column) => {\n    const columnCards = board.cards.filter((card) => card.columnId === column.id)\n\n    if (yPosition > 250) {\n      doc.addPage()\n      yPosition = 20\n    }\n\n    doc.setFontSize(16)\n    doc.setFont('helvetica', 'bold')\n    doc.text(column.title, 20, yPosition)\n    yPosition += 8\n\n    if (columnCards.length === 0) {\n      doc.setFontSize(10)\n      doc.setFont('helvetica', 'italic')\n      doc.setTextColor(128, 128, 128)\n      doc.text('No cards in this column', 20, yPosition)\n      doc.setTextColor(0, 0, 0)\n      yPosition += 10\n    } else {\n      columnCards.forEach((card) => {\n        if (yPosition > 260) {\n          doc.addPage()\n          yPosition = 20\n        }\n\n        doc.setFontSize(12)\n        doc.setFont('helvetica', 'bold')\n        doc.text(card.title, 25, yPosition)\n        yPosition += 6\n\n        if (card.description) {\n          doc.setFontSize(9)\n          doc.setFont('helvetica', 'normal')\n          const lines = doc.splitTextToSize(card.description, 160)\n          doc.text(lines, 25, yPosition)\n          yPosition += lines.length * 5\n        }\n\n        const metadata: string[] = []\n        if (card.priority) metadata.push(`Priority: ${card.priority}`)\n        if (card.labels && card.labels.length > 0) {\n          metadata.push(`Labels: ${card.labels.join(', ')}`)\n        }\n        if (card.assignedUserIds && card.assignedUserIds.length > 0) {\n          metadata.push(`Assigned: ${card.assignedUserIds.length} user(s)`)\n        }\n        if (card.startDate || card.endDate) {\n          const dates = []\n          if (card.startDate) dates.push(`Start: ${card.startDate}`)\n          if (card.endDate) dates.push(`End: ${card.endDate}`)\n          metadata.push(dates.join(' → '))\n        }\n\n        if (metadata.length > 0) {\n          doc.setFontSize(8)\n          doc.setTextColor(100, 100, 100)\n          doc.text(metadata.join(' • '), 25, yPosition)\n          doc.setTextColor(0, 0, 0)\n          yPosition += 5\n        }\n\n        yPosition += 5\n      })\n    }\n\n    yPosition += 5\n  })\n\n  return doc\n}\n\nfunction escapeCSV(value: string): string {\n  if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n    return `\"${value.replace(/\"/g, '\"\"')}\"`\n  }\n  return value\n}\n\nexport async function exportBoard(\n  board: Board,\n  format: ExportFormat,\n  boardElement?: HTMLElement,\n  options?: ExportOptions\n): Promise<string | jsPDF> {\n  switch (format) {\n    case 'json':\n      return exportToJSON(board, options)\n    case 'csv':\n      return exportToCSV(board, options)\n    case 'pdf':\n      return await exportToPDF(board, boardElement, options)\n    default:\n      throw new Error(`Unsupported export format: ${format}`)\n  }\n}\n\nexport function downloadExport(\n  content: string | jsPDF,\n  format: ExportFormat,\n  filename?: string\n): void {\n  const defaultFilename = `board-export-${new Date().getTime()}`\n\n  // Check if content is a jsPDF object by checking for the save method\n  if (format === 'pdf' && typeof content === 'object' && content !== null && 'save' in content) {\n    const finalFilename = filename || `${defaultFilename}.pdf`\n    ;(content as jsPDF).save(finalFilename)\n    return\n  }\n\n  if (typeof content !== 'string') {\n    throw new Error('Invalid content type for non-PDF export')\n  }\n\n  const extensions: Record<ExportFormat, string> = {\n    json: 'json',\n    csv: 'csv',\n    pdf: 'pdf',\n  }\n\n  const finalFilename = filename || `${defaultFilename}.${extensions[format]}`\n\n  const mimeTypes: Record<ExportFormat, string> = {\n    json: 'application/json',\n    csv: 'text/csv',\n    pdf: 'application/pdf',\n  }\n\n  const blob = new Blob([content], { type: mimeTypes[format] })\n  const url = URL.createObjectURL(blob)\n  const link = document.createElement('a')\n  link.href = url\n  link.download = finalFilename\n  document.body.appendChild(link)\n  link.click()\n  document.body.removeChild(link)\n  URL.revokeObjectURL(url)\n}\n","/**\n * Import utility functions\n * @module utils/import\n */\n\nimport type { Board, Card, Column, ImportResult } from '../types'\n\n/**\n * Import board from JSON format\n */\nexport function importFromJSON(jsonString: string): ImportResult {\n  try {\n    const data = JSON.parse(jsonString)\n\n    if (!data.board || !data.columns || !data.cards) {\n      return {\n        success: false,\n        errors: ['Invalid JSON format: missing required fields (board, columns, cards)'],\n      }\n    }\n\n    const board: Board = {\n      id: data.board.id,\n      title: data.board.title,\n      columns: data.columns,\n      cards: data.cards,\n      metadata: data.board.metadata,\n    }\n\n    return {\n      success: true,\n      cardsImported: board.cards.length,\n      columnsImported: board.columns.length,\n    }\n  } catch (error) {\n    return {\n      success: false,\n      errors: [`Failed to parse JSON: ${error instanceof Error ? error.message : 'Unknown error'}`],\n    }\n  }\n}\n\n/**\n * Import board from CSV format\n */\nexport function importFromCSV(csvString: string): ImportResult {\n  try {\n    const lines = csvString.trim().split('\\n')\n\n    if (lines.length < 1 || !lines[0]) {\n      return {\n        success: false,\n        errors: ['CSV file is empty or invalid'],\n      }\n    }\n\n    const headers = parseCSVLine(lines[0])\n    const cards: Card[] = []\n    const columnsMap = new Map<string, Column>()\n    const errors: string[] = []\n\n    for (let i = 1; i < lines.length; i++) {\n      try {\n        const values = parseCSVLine(lines[i] || '')\n\n        if (values.length > headers.length) {\n          errors.push(`Line ${i + 1}: Too many columns`)\n          continue\n        }\n\n        // If missing more than 3 columns, likely a malformed row\n        const missingColumns = headers.length - values.length\n        if (missingColumns > 3) {\n          errors.push(`Line ${i + 1}: Column count mismatch (expected ${headers.length}, got ${values.length})`)\n          continue\n        }\n\n        // Pad trailing empty columns\n        while (values.length < headers.length) {\n          values.push('')\n        }\n\n        const cardData: Record<string, string> = {}\n        headers.forEach((header, index) => {\n          cardData[header] = values[index] || ''\n        })\n\n        // Create column if it doesn't exist\n        const columnTitle = cardData['Column'] || 'Unnamed'\n        if (!columnsMap.has(columnTitle)) {\n          columnsMap.set(columnTitle, {\n            id: `col-${columnsMap.size + 1}`,\n            title: columnTitle,\n            position: columnsMap.size + 1,\n            cardIds: [],\n          })\n        }\n\n        const column = columnsMap.get(columnTitle)!\n\n        const card: Card = {\n          id: cardData['Card ID'] || `card-${i}`,\n          title: cardData['Title'] || 'Untitled',\n          description: cardData['Description'] ? cardData['Description'] : undefined,\n          columnId: column.id,\n          position: column.cardIds.length + 1,\n          priority: (cardData['Priority'] as any) || undefined,\n          labels: cardData['Labels'] ? cardData['Labels'].split(';').filter(Boolean) : undefined,\n          assignedUserIds: cardData['Assigned Users']\n            ? cardData['Assigned Users'].split(';').filter(Boolean)\n            : undefined,\n          startDate: cardData['Start Date'] ? (cardData['Start Date'] as any) : undefined,\n          endDate: cardData['End Date'] ? (cardData['End Date'] as any) : undefined,\n          createdAt: cardData['Created At'] ? (cardData['Created At'] as any) : undefined,\n          updatedAt: cardData['Updated At'] ? (cardData['Updated At'] as any) : undefined,\n        }\n\n        cards.push(card)\n        column.cardIds.push(card.id)\n      } catch (error) {\n        errors.push(\n          `Line ${i + 1}: ${error instanceof Error ? error.message : 'Unknown error'}`\n        )\n      }\n    }\n\n    if (cards.length === 0) {\n      return {\n        success: false,\n        errors: ['No valid cards found in CSV', ...errors],\n      }\n    }\n\n    return {\n      success: true,\n      cardsImported: cards.length,\n      columnsImported: columnsMap.size,\n      errors: errors.length > 0 ? errors : undefined,\n    }\n  } catch (error) {\n    return {\n      success: false,\n      errors: [`Failed to parse CSV: ${error instanceof Error ? error.message : 'Unknown error'}`],\n    }\n  }\n}\n\n/**\n * Parse a CSV line with proper quote handling\n */\nfunction parseCSVLine(line: string): string[] {\n  const result: string[] = []\n  let current = ''\n  let inQuotes = false\n\n  for (let i = 0; i < line.length; i++) {\n    const char = line[i]\n    const nextChar = line[i + 1]\n\n    if (char === '\"' && inQuotes && nextChar === '\"') {\n      current += '\"'\n      i++ // Skip next quote\n    } else if (char === '\"') {\n      inQuotes = !inQuotes\n    } else if (char === ',' && !inQuotes) {\n      result.push(current)\n      current = ''\n    } else {\n      current += char\n    }\n  }\n\n  result.push(current)\n  return result\n}\n\n/**\n * Main import function\n */\nexport function importBoard(content: string, format: 'json' | 'csv'): ImportResult {\n  switch (format) {\n    case 'json':\n      return importFromJSON(content)\n    case 'csv':\n      return importFromCSV(content)\n    default:\n      return {\n        success: false,\n        errors: [`Unsupported import format: ${format}`],\n      }\n  }\n}\n\n/**\n * Read file content\n */\nexport function readFile(file: File): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader()\n    reader.onload = (event) => {\n      if (event.target?.result) {\n        resolve(event.target.result as string)\n      } else {\n        reject(new Error('Failed to read file'))\n      }\n    }\n    reader.onerror = () => reject(new Error('Failed to read file'))\n    reader.readAsText(file)\n  })\n}\n","/**\n * Gantt Theme Context\n * Provides derived theme to Portal components for consistent styling\n * @module components/Gantt/GanttThemeContext\n */\n\nimport { createContext, useContext } from 'react'\nimport type { GanttTheme } from './types'\n\nexport interface GanttThemeContextValue {\n  theme: GanttTheme\n  themeName: 'dark' | 'light' | 'neutral'\n}\n\nexport const GanttThemeContext = createContext<GanttThemeContextValue | null>(null)\n\n/**\n * Hook to access the Gantt theme context\n * Returns null if not within a GanttBoard\n */\nexport function useGanttTheme() {\n  return useContext(GanttThemeContext)\n}\n","/**\n * Kanban Theme Context\n * Provides theme information to Portal components within KanbanBoard\n */\n\nimport { createContext, useContext, type ReactNode } from 'react'\n\nexport interface KanbanThemeContextValue {\n  themeName: 'dark' | 'light' | 'neutral'\n}\n\nexport const KanbanThemeContext = createContext<KanbanThemeContextValue | null>(null)\n\nexport interface KanbanThemeProviderProps {\n  children: ReactNode\n  themeName: 'dark' | 'light' | 'neutral'\n}\n\nexport function KanbanThemeProvider({ children, themeName }: KanbanThemeProviderProps) {\n  return (\n    <KanbanThemeContext.Provider value={{ themeName }}>\n      {children}\n    </KanbanThemeContext.Provider>\n  )\n}\n\nexport function useKanbanTheme(): KanbanThemeContextValue | null {\n  return useContext(KanbanThemeContext)\n}\n","/**\n * Portal Component\n * Renders children outside the parent DOM hierarchy\n * Solves z-index stacking context issues\n */\n\nimport { useEffect, useState, type ReactNode, type CSSProperties } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useGanttTheme } from '../Gantt/GanttThemeContext'\nimport { useKanbanTheme } from '../Board/KanbanThemeContext'\n\nexport interface PortalProps {\n  children: ReactNode\n  /** Element to portal into (defaults to document.body) */\n  container?: HTMLElement\n}\n\n/**\n * Portal component that renders children at the root level\n * Perfect for modals, tooltips, dropdowns that need to escape stacking context\n * Automatically applies Gantt or Kanban theme when used within their respective boards\n */\nexport function Portal({ children, container }: PortalProps) {\n  const [mounted, setMounted] = useState(false)\n  const ganttTheme = useGanttTheme()\n  const kanbanTheme = useKanbanTheme()\n\n  useEffect(() => {\n    setMounted(true)\n    return () => setMounted(false)\n  }, [])\n\n  if (!mounted) {\n    return null\n  }\n\n  const target = container || (typeof document !== 'undefined' ? document.body : null)\n\n  if (!target) {\n    return null\n  }\n\n  // If we have a Gantt theme, wrap children in a themed container\n  if (ganttTheme) {\n    const { theme, themeName } = ganttTheme\n\n    // Generate CSS variables from the theme\n    const themeStyles: CSSProperties & Record<string, string> = {\n      // Background variables\n      '--asakaa-color-background-primary': theme.bgPrimary,\n      '--asakaa-color-background-secondary': theme.bgSecondary,\n      '--asakaa-color-background-card': theme.bgGrid,\n      '--asakaa-color-background-hover': theme.hoverBg,\n\n      // Text variables\n      '--asakaa-color-text-primary': theme.textPrimary,\n      '--asakaa-color-text-secondary': theme.textSecondary,\n      '--asakaa-color-text-tertiary': theme.textTertiary,\n      '--asakaa-color-text-inverse': theme.taskBarHandle || '#FFFFFF',\n\n      // Border variables\n      '--asakaa-color-border-default': theme.border,\n      '--asakaa-color-border-hover': theme.borderLight,\n      '--asakaa-color-border-subtle': theme.borderLight,\n\n      // Interactive variables\n      '--asakaa-color-interactive-primary': theme.accent,\n      '--asakaa-color-interactive-primaryHover': theme.accentHover,\n      '--asakaa-color-interactive-primaryBorder': `${theme.accent}4D`, // 30% opacity\n      '--asakaa-color-interactive-primaryBackground': `${theme.accent}1A`, // 10% opacity\n      '--asakaa-color-interactive-primaryBackgroundHover': `${theme.accent}33`, // 20% opacity\n\n      // Status colors\n      '--asakaa-color-status-success': theme.statusCompleted,\n      '--asakaa-color-status-warning': theme.milestone,\n      '--asakaa-color-status-error': theme.criticalPath,\n      '--asakaa-color-danger': theme.criticalPath,\n      '--asakaa-color-danger-border': `${theme.criticalPath}4D`,\n      '--asakaa-color-danger-background': `${theme.criticalPath}14`,\n      '--asakaa-color-danger-backgroundHover': `${theme.criticalPath}26`,\n    }\n\n    return createPortal(\n      <div\n        data-theme={themeName}\n        data-gantt-portal=\"true\"\n        style={themeStyles}\n      >\n        {children}\n      </div>,\n      target\n    )\n  }\n\n  // If we have a Kanban theme, wrap children with data-theme attribute\n  if (kanbanTheme) {\n    return createPortal(\n      <div\n        data-theme={kanbanTheme.themeName}\n        data-kanban-portal=\"true\"\n      >\n        {children}\n      </div>,\n      target\n    )\n  }\n\n  return createPortal(children, target)\n}\n","import { useState, useRef, useEffect } from 'react'\r\nimport { Portal } from '../Portal'\r\nimport type { Priority } from '../../types'\r\n\r\nexport interface PrioritySelectorProps {\r\n  priority?: Priority\r\n  onChange: (priority?: Priority) => void\r\n  className?: string\r\n}\r\n\r\nconst PRIORITY_CONFIG = {\r\n  URGENT: { label: 'Urgent', color: '#EF4444' },\r\n  HIGH: { label: 'High', color: '#F97316' },\r\n  MEDIUM: { label: 'Normal', color: '#F59E0B' },\r\n  LOW: { label: 'Low', color: '#10B981' },\r\n} as const\r\n\r\nconst CLEAR_COLOR = '#BDC3C7'\r\n\r\nconst PriorityIcon = ({ color }: { color: string }) => (\r\n  <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <circle cx=\"8\" cy=\"8\" r=\"6\" fill={color} opacity=\"0.9\" />\r\n    <circle cx=\"8\" cy=\"8\" r=\"6\" stroke={color} strokeWidth=\"1.5\" opacity=\"0.3\" />\r\n  </svg>\r\n)\r\n\r\nexport function PrioritySelector({\r\n  priority,\r\n  onChange,\r\n  className,\r\n}: PrioritySelectorProps) {\r\n  const [isOpen, setIsOpen] = useState(false)\r\n  const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 })\r\n  const menuRef = useRef<HTMLDivElement>(null)\r\n  const buttonRef = useRef<HTMLButtonElement>(null)\r\n\r\n  // v0.17.63: Calculate position and open menu synchronously\r\n  const openMenu = () => {\r\n    if (!buttonRef.current) return\r\n\r\n    const rect = buttonRef.current.getBoundingClientRect()\r\n    const viewportHeight = window.innerHeight\r\n    const viewportWidth = window.innerWidth\r\n    const menuWidth = 160\r\n    const menuHeight = 220\r\n    const GAP = 4\r\n\r\n    let leftPos = rect.right - menuWidth\r\n    if (leftPos < 10) leftPos = rect.left\r\n    if (leftPos + menuWidth > viewportWidth - 10) {\r\n      leftPos = viewportWidth - menuWidth - 10\r\n    }\r\n\r\n    const spaceBelow = viewportHeight - rect.bottom\r\n    const spaceAbove = rect.top\r\n    let topPos: number\r\n\r\n    if (spaceBelow >= menuHeight + GAP) {\r\n      topPos = rect.bottom + GAP\r\n    } else if (spaceAbove >= menuHeight + GAP) {\r\n      topPos = rect.top - menuHeight - GAP\r\n    } else {\r\n      topPos = spaceBelow >= spaceAbove\r\n        ? rect.bottom + GAP\r\n        : Math.max(10, rect.top - menuHeight - GAP)\r\n    }\r\n\r\n    setMenuPosition({ top: topPos, left: leftPos })\r\n    setIsOpen(true)\r\n  }\r\n\r\n  // v0.17.65: Scroll lock removed - position:fixed handles positioning correctly\r\n  // The Portal renders outside the overflow container, so no lock needed\r\n\r\n  useEffect(() => {\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      if (\r\n        menuRef.current &&\r\n        !menuRef.current.contains(event.target as Node) &&\r\n        !buttonRef.current?.contains(event.target as Node)\r\n      ) {\r\n        setIsOpen(false)\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside)\r\n      return () => document.removeEventListener('mousedown', handleClickOutside)\r\n    }\r\n    return undefined\r\n  }, [isOpen])\r\n\r\n  useEffect(() => {\r\n    const handleEscape = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape') setIsOpen(false)\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('keydown', handleEscape)\r\n      return () => document.removeEventListener('keydown', handleEscape)\r\n    }\r\n    return undefined\r\n  }, [isOpen])\r\n\r\n  const handleSelect = (newPriority?: Priority) => {\r\n    onChange(newPriority)\r\n    setIsOpen(false)\r\n  }\r\n\r\n  const currentConfig = priority ? PRIORITY_CONFIG[priority] : null\r\n  const flagColor = currentConfig?.color || CLEAR_COLOR\r\n\r\n  return (\r\n    <div className={`relative ${className || ''}`}>\r\n      <button\r\n        ref={buttonRef}\r\n        onClick={() => isOpen ? setIsOpen(false) : openMenu()}\r\n        className=\"flex items-center justify-center w-8 h-8 rounded-lg transition-all hover:bg-white/15 hover:scale-110 active:scale-95\"\r\n        style={{\r\n          background: priority ? `${flagColor}10` : 'transparent',\r\n          boxShadow: priority ? `0 0 0 2px ${flagColor}30 inset` : 'none',\r\n        }}\r\n        title={currentConfig?.label || 'Set priority'}\r\n      >\r\n        <svg\r\n          width=\"20\"\r\n          height=\"20\"\r\n          viewBox=\"0 0 16 16\"\r\n          fill=\"none\"\r\n          xmlns=\"http://www.w3.org/2000/svg\"\r\n        >\r\n          <path\r\n            d=\"M3 2L3 14M3 2L13 6L3 8V2Z\"\r\n            stroke={flagColor}\r\n            strokeWidth=\"1.5\"\r\n            strokeLinecap=\"round\"\r\n            strokeLinejoin=\"round\"\r\n            fill={flagColor}\r\n            fillOpacity={priority ? \"0.6\" : \"0.4\"}\r\n          />\r\n        </svg>\r\n      </button>\r\n\r\n      {/* v0.17.57: Fixed positioning for proper viewport handling */}\r\n      {isOpen && (\r\n        <Portal>\r\n          <div\r\n            ref={menuRef}\r\n            className=\"priority-selector-menu\"\r\n            style={{\r\n              position: 'fixed',\r\n              top: `${menuPosition.top}px`,\r\n              left: `${menuPosition.left}px`,\r\n              zIndex: 99999,\r\n              minWidth: '160px',\r\n              maxHeight: 'calc(100vh - 40px)',\r\n              borderRadius: '8px',\r\n              background: 'var(--modal-v2-bg, #1f1f1f)',\r\n              border: '1px solid var(--modal-v2-border, rgba(255, 255, 255, 0.15))',\r\n              boxShadow: '0 10px 40px rgba(0, 0, 0, 0.8), 0 0 0 1px rgba(255, 255, 255, 0.1)',\r\n            }}\r\n          >\r\n          <div\r\n            className=\"px-3 py-1.5 border-b\"\r\n            style={{ borderColor: 'var(--modal-v2-border, rgba(255, 255, 255, 0.1))' }}\r\n          >\r\n            <span\r\n              className=\"text-[10px] font-bold uppercase tracking-wider\"\r\n              style={{ color: 'var(--modal-v2-text-secondary, rgba(255, 255, 255, 0.7))' }}\r\n            >\r\n              Priority\r\n            </span>\r\n          </div>\r\n\r\n          <div className=\"py-1\">\r\n            {(Object.entries(PRIORITY_CONFIG) as [Priority, typeof PRIORITY_CONFIG[Priority]][]).map(\r\n              ([key, config]) => (\r\n                <button\r\n                  key={key}\r\n                  onClick={() => handleSelect(key)}\r\n                  className=\"w-full px-3 py-1.5 flex items-center gap-2 text-xs font-medium transition-all active:scale-[0.98] priority-option\"\r\n                  style={{\r\n                    color: config.color,\r\n                    background: 'transparent'\r\n                  }}\r\n                  onMouseEnter={(e) => {\r\n                    e.currentTarget.style.background = 'var(--modal-v2-bg-tertiary, rgba(255, 255, 255, 0.15))'\r\n                  }}\r\n                  onMouseLeave={(e) => {\r\n                    e.currentTarget.style.background = 'transparent'\r\n                  }}\r\n                >\r\n                  <PriorityIcon color={config.color} />\r\n                  <span className=\"font-semibold text-sm\">{config.label}</span>\r\n                  {priority === key && (\r\n                    <svg className=\"ml-auto\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                      <path d=\"M13.5 4.5L6 12L2.5 8.5\" stroke=\"#00E5CC\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\r\n                    </svg>\r\n                  )}\r\n                </button>\r\n              )\r\n            )}\r\n\r\n            <div\r\n              className=\"mt-0.5 pt-0.5 border-t\"\r\n              style={{ borderColor: 'var(--modal-v2-border, rgba(255, 255, 255, 0.1))' }}\r\n            >\r\n              <button\r\n                onClick={() => handleSelect(undefined)}\r\n                className=\"w-full px-3 py-1.5 flex items-center gap-2 text-xs font-medium transition-all active:scale-[0.98]\"\r\n                style={{\r\n                  color: 'var(--modal-v2-text-primary, #e5e5e5)',\r\n                  background: 'transparent'\r\n                }}\r\n                onMouseEnter={(e) => {\r\n                  e.currentTarget.style.background = 'var(--modal-v2-bg-tertiary, rgba(255, 255, 255, 0.15))'\r\n                }}\r\n                onMouseLeave={(e) => {\r\n                  e.currentTarget.style.background = 'transparent'\r\n                }}\r\n              >\r\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                  <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"#9CA3AF\" strokeWidth=\"1.5\" strokeDasharray=\"2 2\" opacity=\"0.6\" />\r\n                </svg>\r\n                <span className=\"font-semibold text-sm\">Clear</span>\r\n                {!priority && (\r\n                  <svg className=\"ml-auto\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                    <path d=\"M13.5 4.5L6 12L2.5 8.5\" stroke=\"#00E5CC\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\r\n                  </svg>\r\n                )}\r\n              </button>\r\n            </div>\r\n          </div>\r\n          </div>\r\n        </Portal>\r\n      )}\r\n    </div>\r\n  )\r\n}\r\n","/**\n * Date Range Picker Component\n * Quick selection buttons + interactive calendar\n */\n\nimport { useState, useRef, useEffect } from 'react'\nimport { Portal } from '../Portal'\nimport { useKanbanTheme } from '../Board/KanbanThemeContext'\n\nexport interface DateRangePickerProps {\n  startDate?: string\n  endDate?: string\n  onChange: (startDate?: string, endDate?: string) => void\n  className?: string\n}\n\nconst QUICK_OPTIONS = [\n  { label: 'Today', days: 0 },\n  { label: 'Tomorrow', days: 1 },\n  { label: 'Next Week', days: 7 },\n  { label: '2 Weeks', days: 14 },\n  { label: '4 Weeks', days: 28 },\n  { label: '8 Weeks', days: 56 },\n]\n\nexport function DateRangePicker({\n  startDate,\n  endDate,\n  onChange,\n  className,\n}: DateRangePickerProps) {\n  const [isOpen, setIsOpen] = useState(false)\n  const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 })\n  const menuRef = useRef<HTMLDivElement>(null)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const kanbanTheme = useKanbanTheme()\n  const themeName = kanbanTheme?.themeName || 'dark'\n  // Only 'dark' theme uses dark colors, 'light' and 'neutral' use light colors\n  const isDark = themeName === 'dark'\n\n  // v0.17.65: Calculate position and open menu synchronously (same as other selectors)\n  const openMenu = () => {\n    if (!buttonRef.current) return\n\n    const rect = buttonRef.current.getBoundingClientRect()\n    const viewportHeight = window.innerHeight\n    const viewportWidth = window.innerWidth\n    const menuWidth = 320\n    const menuHeight = 380\n    const GAP = 4\n\n    // Horizontal positioning\n    let leftPos = rect.left\n    if (leftPos + menuWidth > viewportWidth - 10) {\n      leftPos = viewportWidth - menuWidth - 10\n    }\n    if (leftPos < 10) leftPos = 10\n\n    // Vertical positioning - open upward if no space below\n    const spaceBelow = viewportHeight - rect.bottom\n    const spaceAbove = rect.top\n    let topPos: number\n\n    if (spaceBelow >= menuHeight + GAP) {\n      topPos = rect.bottom + GAP\n    } else if (spaceAbove >= menuHeight + GAP) {\n      topPos = rect.top - menuHeight - GAP\n    } else {\n      topPos = spaceBelow >= spaceAbove\n        ? rect.bottom + GAP\n        : Math.max(10, rect.top - menuHeight - GAP)\n    }\n\n    setMenuPosition({ top: topPos, left: leftPos })\n    setIsOpen(true)\n  }\n\n  useEffect(() => {\n    const handleClickOutside = (event: MouseEvent) => {\n      if (\n        menuRef.current &&\n        !menuRef.current.contains(event.target as Node) &&\n        !buttonRef.current?.contains(event.target as Node)\n      ) {\n        setIsOpen(false)\n      }\n    }\n\n    if (isOpen) {\n      document.addEventListener('mousedown', handleClickOutside)\n      return () => document.removeEventListener('mousedown', handleClickOutside)\n    }\n    return undefined\n  }, [isOpen])\n\n  useEffect(() => {\n    const handleEscape = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') {\n        setIsOpen(false)\n      }\n    }\n\n    if (isOpen) {\n      document.addEventListener('keydown', handleEscape)\n      return () => document.removeEventListener('keydown', handleEscape)\n    }\n    return undefined\n  }, [isOpen])\n\n  const handleQuickSelect = (days: number) => {\n    const now = new Date()\n\n    const formatLocalDate = (date: Date) => {\n      const year = date.getFullYear()\n      const month = String(date.getMonth() + 1).padStart(2, '0')\n      const day = String(date.getDate()).padStart(2, '0')\n      return `${year}-${month}-${day}`\n    }\n\n    const todayStr = formatLocalDate(now)\n\n    const endDate = new Date(now)\n    endDate.setDate(endDate.getDate() + days)\n    const endStr = formatLocalDate(endDate)\n\n    onChange(todayStr, endStr)\n    setIsOpen(false)\n  }\n\n  const formatDateRange = () => {\n    if (!startDate || !endDate) return 'Set date'\n\n    const parseLocalDate = (dateStr: string | Date) => {\n      if (dateStr instanceof Date) return dateStr\n      if (typeof dateStr !== 'string' || !dateStr.match(/^\\d{4}-\\d{2}-\\d{2}$/)) {\n        return null\n      }\n      const parts = dateStr.split('-').map(Number)\n      if (parts.length !== 3 || parts.some(p => isNaN(p))) {\n        return null\n      }\n      const year = parts[0]\n      const month = parts[1]\n      const day = parts[2]\n      if (year === undefined || month === undefined || day === undefined) {\n        return null\n      }\n      return new Date(year, month - 1, day)\n    }\n\n    const start = parseLocalDate(startDate)\n    const end = parseLocalDate(endDate)\n\n    if (!start || !end || isNaN(start.getTime()) || isNaN(end.getTime())) {\n      return 'Set date'\n    }\n\n    const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\n    return `${monthNames[start.getMonth()]} ${start.getDate()} – ${monthNames[end.getMonth()]} ${end.getDate()}`\n  }\n\n  const hasDateSet = startDate && endDate\n\n  const isOverdue = () => {\n    if (!endDate) return false\n    const end = typeof endDate === 'string' ? new Date(endDate) : endDate\n    const today = new Date()\n    today.setHours(0, 0, 0, 0)\n    return end < today\n  }\n\n  const overdue = isOverdue()\n\n  return (\n    <div className={`relative ${className || ''}`}>\n      <button\n        ref={buttonRef}\n        onClick={() => isOpen ? setIsOpen(false) : openMenu()}\n        className={`flex items-center gap-1.5 px-2 py-1 rounded-md text-xs transition-all hover:bg-white/5 ${\n          overdue ? 'asakaa-date-overdue' : 'asakaa-date'\n        }`}\n        title={hasDateSet ? `${formatDateRange()}` : 'Set date range'}\n      >\n        <svg\n          width=\"14\"\n          height=\"14\"\n          viewBox=\"0 0 16 16\"\n          fill=\"none\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n        >\n          <rect\n            x=\"2\"\n            y=\"3\"\n            width=\"12\"\n            height=\"11\"\n            rx=\"2\"\n            stroke=\"currentColor\"\n            strokeWidth=\"1.5\"\n          />\n          <path d=\"M2 6H14\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n          <path d=\"M5 2V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n          <path d=\"M11 2V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n        </svg>\n        {startDate && endDate && (\n          <span className=\"whitespace-nowrap\">{formatDateRange()}</span>\n        )}\n      </button>\n\n      {isOpen && (\n        <Portal>\n          <div\n            ref={menuRef}\n            className=\"date-picker-menu rounded-xl shadow-2xl border min-w-[320px]\"\n            style={{\n              position: 'fixed',\n              top: `${menuPosition.top}px`,\n              left: `${menuPosition.left}px`,\n              background: isDark ? '#1A1D25' : '#FFFFFF',\n              border: `1px solid ${isDark ? 'rgba(255, 255, 255, 0.15)' : 'rgba(0, 0, 0, 0.12)'}`,\n              boxShadow: isDark\n                ? '0 20px 60px rgba(0, 0, 0, 0.8), 0 0 0 1px rgba(255, 255, 255, 0.1)'\n                : '0 20px 60px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.08)',\n              zIndex: 99999,\n            }}\n          >\n            <div className=\"p-4 border-b\" style={{ borderColor: isDark ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.08)' }}>\n              <span\n                className=\"text-xs font-bold uppercase tracking-wider block mb-3\"\n                style={{ color: isDark ? 'rgba(255, 255, 255, 0.85)' : 'rgba(0, 0, 0, 0.7)' }}\n              >\n                Quick Select\n              </span>\n              <div className=\"grid grid-cols-2 gap-2\">\n                {QUICK_OPTIONS.map((option) => (\n                  <button\n                    key={option.label}\n                    onClick={() => handleQuickSelect(option.days)}\n                    className=\"px-3 py-2.5 rounded-lg text-xs font-semibold transition-all active:scale-95\"\n                    style={{\n                      color: isDark ? 'rgba(255, 255, 255, 0.95)' : 'rgba(0, 0, 0, 0.85)',\n                      border: `1px solid ${isDark ? 'rgba(255, 255, 255, 0.25)' : 'rgba(0, 0, 0, 0.15)'}`,\n                      backgroundColor: isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.05)',\n                    }}\n                    onMouseEnter={(e) => {\n                      e.currentTarget.style.backgroundColor = isDark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.1)'\n                      e.currentTarget.style.border = `1px solid ${isDark ? 'rgba(255, 255, 255, 0.4)' : 'rgba(0, 0, 0, 0.25)'}`\n                    }}\n                    onMouseLeave={(e) => {\n                      e.currentTarget.style.backgroundColor = isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.05)'\n                      e.currentTarget.style.border = `1px solid ${isDark ? 'rgba(255, 255, 255, 0.25)' : 'rgba(0, 0, 0, 0.15)'}`\n                    }}\n                  >\n                    {option.label}\n                  </button>\n                ))}\n              </div>\n            </div>\n\n            <div className=\"p-4\">\n              <span\n                className=\"text-xs font-bold uppercase tracking-wider block mb-3\"\n                style={{ color: isDark ? 'rgba(255, 255, 255, 0.85)' : 'rgba(0, 0, 0, 0.7)' }}\n              >\n                Custom Range\n              </span>\n              <div className=\"space-y-3\">\n                <input\n                  type=\"date\"\n                  value={startDate || ''}\n                  onChange={(e) => onChange(e.target.value, endDate)}\n                  className=\"w-full px-3 py-2.5 rounded-lg text-sm border focus:outline-none transition-all\"\n                  style={{\n                    background: isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.05)',\n                    borderColor: isDark ? 'rgba(255, 255, 255, 0.25)' : 'rgba(0, 0, 0, 0.15)',\n                    color: isDark ? 'rgba(255, 255, 255, 0.95)' : 'rgba(0, 0, 0, 0.85)',\n                    colorScheme: isDark ? 'dark' : 'light',\n                  }}\n                />\n                <input\n                  type=\"date\"\n                  value={endDate || ''}\n                  onChange={(e) => onChange(startDate, e.target.value)}\n                  className=\"w-full px-3 py-2.5 rounded-lg text-sm border focus:outline-none transition-all\"\n                  style={{\n                    background: isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.05)',\n                    borderColor: isDark ? 'rgba(255, 255, 255, 0.25)' : 'rgba(0, 0, 0, 0.15)',\n                    color: isDark ? 'rgba(255, 255, 255, 0.95)' : 'rgba(0, 0, 0, 0.85)',\n                    colorScheme: isDark ? 'dark' : 'light',\n                  }}\n                />\n              </div>\n\n              {(startDate || endDate) && (\n                <button\n                  onClick={() => {\n                    onChange(undefined, undefined)\n                    setIsOpen(false)\n                  }}\n                  className=\"mt-4 w-full px-3 py-2.5 rounded-lg text-sm font-semibold transition-all active:scale-95 border\"\n                  style={{\n                    color: '#ef4444',\n                    borderColor: 'rgba(239, 68, 68, 0.3)',\n                    background: 'rgba(239, 68, 68, 0.1)',\n                  }}\n                  onMouseEnter={(e) => {\n                    e.currentTarget.style.background = 'rgba(239, 68, 68, 0.2)'\n                  }}\n                  onMouseLeave={(e) => {\n                    e.currentTarget.style.background = 'rgba(239, 68, 68, 0.1)'\n                  }}\n                >\n                  Clear Dates\n                </button>\n              )}\n            </div>\n          </div>\n        </Portal>\n      )}\n    </div>\n  )\n}\n","/**\r\n * User Assignment Selector Component\r\n * Multi-select user assignment with avatar display\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport { Portal } from '../Portal'\r\n\r\nexport interface User {\r\n  id: string\r\n  name: string\r\n  avatar?: string\r\n  initials: string\r\n  color: string\r\n}\r\n\r\nexport interface UserAssignmentSelectorProps {\r\n  assignedUsers?: User[]\r\n  availableUsers: User[]\r\n  onChange: (users: User[]) => void\r\n  className?: string\r\n  maxVisibleAvatars?: number\r\n}\r\n\r\nexport function UserAssignmentSelector({\r\n  assignedUsers = [],\r\n  availableUsers,\r\n  onChange,\r\n  className,\r\n  maxVisibleAvatars = 3,\r\n}: UserAssignmentSelectorProps) {\r\n  const [isOpen, setIsOpen] = useState(false)\r\n  const [searchQuery, setSearchQuery] = useState('')\r\n  const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 })\r\n  const menuRef = useRef<HTMLDivElement>(null)\r\n  const buttonRef = useRef<HTMLButtonElement>(null)\r\n\r\n  // v0.17.63: Calculate position and open menu in ONE synchronous action\r\n  const openMenu = () => {\r\n    if (!buttonRef.current) return\r\n\r\n    const rect = buttonRef.current.getBoundingClientRect()\r\n    const viewportHeight = window.innerHeight\r\n    const viewportWidth = window.innerWidth\r\n    const menuWidth = 300\r\n    const menuHeight = 380\r\n    const GAP = 4\r\n\r\n    // Horizontal positioning\r\n    let leftPos = rect.right - menuWidth\r\n    if (leftPos < 10) leftPos = rect.left\r\n    if (leftPos + menuWidth > viewportWidth - 10) {\r\n      leftPos = viewportWidth - menuWidth - 10\r\n    }\r\n\r\n    // Vertical positioning - open upward if no space below\r\n    const spaceBelow = viewportHeight - rect.bottom\r\n    const spaceAbove = rect.top\r\n    let topPos: number\r\n\r\n    if (spaceBelow >= menuHeight + GAP) {\r\n      // Open downward\r\n      topPos = rect.bottom + GAP\r\n    } else if (spaceAbove >= menuHeight + GAP) {\r\n      // Open upward - position so bottom of menu is at top of button\r\n      topPos = rect.top - menuHeight - GAP\r\n    } else {\r\n      // Not enough space either way - use the one with more space\r\n      topPos = spaceBelow >= spaceAbove\r\n        ? rect.bottom + GAP\r\n        : Math.max(10, rect.top - menuHeight - GAP)\r\n    }\r\n\r\n    // Set position FIRST, then open (synchronous batch)\r\n    setMenuPosition({ top: topPos, left: leftPos })\r\n    setIsOpen(true)\r\n  }\r\n\r\n  // v0.17.65: Scroll lock removed - position:fixed handles positioning correctly\r\n  // The Portal renders outside the overflow container, so no lock needed\r\n\r\n  useEffect(() => {\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      if (\r\n        menuRef.current &&\r\n        !menuRef.current.contains(event.target as Node) &&\r\n        !buttonRef.current?.contains(event.target as Node)\r\n      ) {\r\n        setIsOpen(false)\r\n        setSearchQuery('')\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside)\r\n      return () => document.removeEventListener('mousedown', handleClickOutside)\r\n    }\r\n    return undefined\r\n  }, [isOpen])\r\n\r\n  useEffect(() => {\r\n    const handleEscape = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape') {\r\n        setIsOpen(false)\r\n        setSearchQuery('')\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('keydown', handleEscape)\r\n      return () => document.removeEventListener('keydown', handleEscape)\r\n    }\r\n    return undefined\r\n  }, [isOpen])\r\n\r\n  const handleToggleUser = (user: User) => {\r\n    const isAssigned = assignedUsers.some((u) => u.id === user.id)\r\n\r\n    if (isAssigned) {\r\n      onChange(assignedUsers.filter((u) => u.id !== user.id))\r\n    } else {\r\n      onChange([...assignedUsers, user])\r\n    }\r\n  }\r\n\r\n  const filteredUsers = availableUsers.filter((user) =>\r\n    user.name.toLowerCase().includes(searchQuery.toLowerCase())\r\n  )\r\n\r\n  const visibleUsers = assignedUsers.slice(0, maxVisibleAvatars)\r\n  const overflowCount = assignedUsers.length - maxVisibleAvatars\r\n\r\n  return (\r\n    <div className={`relative ${className || ''}`}>\r\n      {/* Avatar display or add button */}\r\n      <button\r\n        ref={buttonRef}\r\n        onClick={() => isOpen ? setIsOpen(false) : openMenu()}\r\n        className=\"flex items-center gap-1 p-0.5 rounded transition-all hover:bg-white/10 hover:scale-105 active:scale-95\"\r\n        title={assignedUsers.length > 0 ? `${assignedUsers.length} assigned` : 'Assign users'}\r\n      >\r\n        {assignedUsers.length > 0 ? (\r\n          <div className=\"asakaa-avatar-group\">\r\n            {visibleUsers.map((user) => (\r\n              <div\r\n                key={user.id}\r\n                className=\"asakaa-avatar\"\r\n                title={user.name}\r\n              >\r\n                {user.avatar ? (\r\n                  <img\r\n                    src={user.avatar}\r\n                    alt={user.name}\r\n                    className=\"asakaa-avatar-img\"\r\n                  />\r\n                ) : (\r\n                  user.initials\r\n                )}\r\n              </div>\r\n            ))}\r\n            {overflowCount > 0 && (\r\n              <div className=\"asakaa-avatar\">\r\n                +{overflowCount}\r\n              </div>\r\n            )}\r\n          </div>\r\n        ) : (\r\n          <div\r\n            className=\"w-7 h-7 rounded-full flex items-center justify-center transition-all\"\r\n            style={{\r\n              background: 'rgba(96, 165, 250, 0.15)',\r\n              border: '1.5px solid rgba(96, 165, 250, 0.4)',\r\n              color: '#60a5fa',\r\n            }}\r\n          >\r\n            <svg\r\n              width=\"16\"\r\n              height=\"16\"\r\n              viewBox=\"0 0 16 16\"\r\n              fill=\"none\"\r\n              xmlns=\"http://www.w3.org/2000/svg\"\r\n            >\r\n              <path\r\n                d=\"M8 8a3 3 0 100-6 3 3 0 000 6zM4 14c0-2.21 1.79-4 4-4s4 1.79 4 4\"\r\n                stroke=\"currentColor\"\r\n                strokeWidth=\"1.5\"\r\n                strokeLinecap=\"round\"\r\n              />\r\n              <line\r\n                x1=\"13\"\r\n                y1=\"5\"\r\n                x2=\"13\"\r\n                y2=\"9\"\r\n                stroke=\"currentColor\"\r\n                strokeWidth=\"1.5\"\r\n                strokeLinecap=\"round\"\r\n              />\r\n              <line\r\n                x1=\"11\"\r\n                y1=\"7\"\r\n                x2=\"15\"\r\n                y2=\"7\"\r\n                stroke=\"currentColor\"\r\n                strokeWidth=\"1.5\"\r\n                strokeLinecap=\"round\"\r\n              />\r\n            </svg>\r\n          </div>\r\n        )}\r\n      </button>\r\n\r\n      {/* User selection menu - Using Portal to escape stacking context */}\r\n      {/* v0.17.57: Fixed positioning + smart upward/downward + maxHeight for viewport safety */}\r\n      {isOpen && (\r\n        <Portal>\r\n          <div\r\n            ref={menuRef}\r\n            className=\"user-selector-menu rounded-xl shadow-2xl border min-w-[300px]\"\r\n            style={{\r\n              position: 'fixed',\r\n              top: `${menuPosition.top}px`,\r\n              left: `${menuPosition.left}px`,\r\n              maxHeight: 'calc(100vh - 40px)',\r\n              overflow: 'hidden',\r\n              display: 'flex',\r\n              flexDirection: 'column',\r\n              background: 'var(--modal-v2-bg, #1f1f1f)',\r\n              border: '1px solid var(--modal-v2-border, rgba(255, 255, 255, 0.15))',\r\n              boxShadow: '0 20px 60px rgba(0, 0, 0, 0.8), 0 0 0 1px rgba(255, 255, 255, 0.1)',\r\n              zIndex: 99999,\r\n            }}\r\n          >\r\n          {/* Header */}\r\n          <div className=\"px-4 py-3 border-b\" style={{ borderColor: 'var(--modal-v2-border, rgba(255, 255, 255, 0.1))' }}>\r\n            <span className=\"text-xs font-bold uppercase tracking-wider\" style={{ color: 'var(--modal-v2-text-secondary, rgba(255, 255, 255, 0.8))' }}>\r\n              Assign Users\r\n            </span>\r\n          </div>\r\n\r\n          {/* Search input */}\r\n          <div className=\"px-3 py-3 border-b\" style={{ borderColor: 'var(--modal-v2-border, rgba(255, 255, 255, 0.1))' }}>\r\n            <input\r\n              type=\"text\"\r\n              value={searchQuery}\r\n              onChange={(e) => setSearchQuery(e.target.value)}\r\n              placeholder=\"Search users...\"\r\n              className=\"w-full px-3 py-2.5 rounded-lg text-sm border outline-none transition-all\"\r\n              style={{\r\n                background: 'var(--modal-v2-bg-secondary, rgba(255, 255, 255, 0.05))',\r\n                borderColor: 'var(--modal-v2-border, rgba(255, 255, 255, 0.2))',\r\n                color: 'var(--modal-v2-text-primary, #ffffff)',\r\n              }}\r\n              autoFocus\r\n            />\r\n          </div>\r\n\r\n          {/* User list */}\r\n          <div className=\"py-2 max-h-[300px] overflow-y-auto\">\r\n            {filteredUsers.length === 0 ? (\r\n              <div className=\"px-4 py-3 text-sm text-center\" style={{ color: 'var(--modal-v2-text-tertiary, rgba(255, 255, 255, 0.6))' }}>\r\n                No users found\r\n              </div>\r\n            ) : (\r\n              filteredUsers.map((user) => {\r\n                const isAssigned = assignedUsers.some((u) => u.id === user.id)\r\n\r\n                return (\r\n                  <button\r\n                    key={user.id}\r\n                    onClick={() => handleToggleUser(user)}\r\n                    className=\"w-full px-4 py-2.5 flex items-center gap-3 text-sm transition-all active:scale-98\"\r\n                    style={{ background: 'transparent' }}\r\n                    onMouseEnter={(e) => {\r\n                      e.currentTarget.style.background = 'var(--modal-v2-bg-tertiary, rgba(255, 255, 255, 0.1))'\r\n                    }}\r\n                    onMouseLeave={(e) => {\r\n                      e.currentTarget.style.background = 'transparent'\r\n                    }}\r\n                  >\r\n                    {/* Avatar */}\r\n                    <div\r\n                      className=\"w-7 h-7 rounded-full flex items-center justify-center text-[11px] font-bold flex-shrink-0 shadow-sm\"\r\n                      style={{\r\n                        backgroundColor: user.color,\r\n                        color: '#fff',\r\n                      }}\r\n                    >\r\n                      {user.avatar ? (\r\n                        <img\r\n                          src={user.avatar}\r\n                          alt={user.name}\r\n                          className=\"w-full h-full rounded-full object-cover\"\r\n                        />\r\n                      ) : (\r\n                        user.initials\r\n                      )}\r\n                    </div>\r\n\r\n                    {/* Name */}\r\n                    <span className=\"font-semibold flex-1 text-left truncate\" style={{ color: 'var(--modal-v2-text-primary, rgba(255, 255, 255, 0.95))' }}>\r\n                      {user.name}\r\n                    </span>\r\n\r\n                    {/* Checkmark - fixed width for consistent alignment */}\r\n                    <span className=\"w-5 text-lg flex-shrink-0 text-right\" style={{ color: isAssigned ? '#00E5CC' : 'transparent' }}>\r\n                      {isAssigned ? '✓' : ''}\r\n                    </span>\r\n                  </button>\r\n                )\r\n              })\r\n            )}\r\n          </div>\r\n\r\n          {/* Clear button */}\r\n          {assignedUsers.length > 0 && (\r\n            <div className=\"px-3 py-3 border-t border-white/10\">\r\n              <button\r\n                onClick={() => {\r\n                  onChange([])\r\n                  setIsOpen(false)\r\n                }}\r\n                className=\"w-full px-3 py-2.5 rounded-lg text-sm font-semibold transition-all hover:bg-red-600/30 active:scale-95 border\"\r\n                style={{\r\n                  color: '#f87171',\r\n                  borderColor: 'rgba(248, 113, 113, 0.3)',\r\n                  background: 'rgba(248, 113, 113, 0.08)',\r\n                }}\r\n              >\r\n                Clear All\r\n              </button>\r\n            </div>\r\n          )}\r\n          </div>\r\n        </Portal>\r\n      )}\r\n    </div>\r\n  )\r\n}\r\n","/**\r\n * Dependencies Selector Component\r\n * Select task dependencies with link icon\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport { Portal } from '../Portal'\r\nimport type { Card } from '../../types'\r\n\r\n/**\r\n * Validate if adding a dependency would create a circular reference\r\n * Uses Depth-First Search (DFS) algorithm\r\n * @param allCards - All cards in the board\r\n * @param fromCardId - The card that would become a dependency (the task being depended on)\r\n * @param toCardId - The card that would depend on fromCardId\r\n * @returns True if adding this dependency would create a circular reference\r\n */\r\nexport function wouldCreateCircularDependency(\r\n  allCards: Card[],\r\n  fromCardId: string,\r\n  toCardId: string\r\n): boolean {\r\n  // Build dependency map from all cards\r\n  const dependencyMap = new Map<string, string[]>()\r\n  allCards.forEach((card) => {\r\n    if (card.dependencies && Array.isArray(card.dependencies)) {\r\n      // Handle both string[] and Dependency[] formats\r\n      // Dependency from @libxai/core has 'taskId', not 'targetId'\r\n      const deps = card.dependencies.map((d) => {\r\n        if (typeof d === 'string') return d\r\n        // Handle both possible formats\r\n        const depObj = d as { taskId?: string; targetId?: string }\r\n        return depObj.taskId || depObj.targetId || ''\r\n      }).filter(Boolean)\r\n      dependencyMap.set(card.id, deps)\r\n    }\r\n  })\r\n\r\n  // Simulate adding the new dependency (toCardId depends on fromCardId)\r\n  const existingDeps = dependencyMap.get(toCardId) || []\r\n  dependencyMap.set(toCardId, [...existingDeps, fromCardId])\r\n\r\n  // DFS to detect cycle\r\n  const visited = new Set<string>()\r\n  const recStack = new Set<string>()\r\n\r\n  const hasCycle = (cardId: string): boolean => {\r\n    if (!visited.has(cardId)) {\r\n      visited.add(cardId)\r\n      recStack.add(cardId)\r\n\r\n      const deps = dependencyMap.get(cardId) || []\r\n      for (const depId of deps) {\r\n        if (!visited.has(depId) && hasCycle(depId)) {\r\n          return true\r\n        } else if (recStack.has(depId)) {\r\n          return true\r\n        }\r\n      }\r\n    }\r\n    recStack.delete(cardId)\r\n    return false\r\n  }\r\n\r\n  return hasCycle(toCardId)\r\n}\r\n\r\nexport interface DependenciesSelectorProps {\r\n  /** Current card (to exclude from dependencies) */\r\n  currentCardId: string\r\n  /** Currently selected dependencies */\r\n  dependencies?: string[]\r\n  /** All available tasks */\r\n  availableTasks: Card[]\r\n  /** Change handler */\r\n  onChange: (dependencies: string[]) => void\r\n  /** Custom className */\r\n  className?: string\r\n  /** Enable circular dependency validation (default: true) */\r\n  validateCircular?: boolean\r\n  /** Callback when circular dependency is detected */\r\n  onCircularDependencyError?: (targetCardId: string, targetCardTitle: string) => void\r\n}\r\n\r\nexport function DependenciesSelector({\r\n  currentCardId,\r\n  dependencies = [],\r\n  availableTasks,\r\n  onChange,\r\n  className,\r\n  validateCircular = true,\r\n  onCircularDependencyError,\r\n}: DependenciesSelectorProps) {\r\n  const [isOpen, setIsOpen] = useState(false)\r\n  const [searchQuery, setSearchQuery] = useState('')\r\n  const [hasDependencies, setHasDependencies] = useState(dependencies.length > 0)\r\n  const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 })\r\n  const [circularError, setCircularError] = useState<string | null>(null)\r\n  const menuRef = useRef<HTMLDivElement>(null)\r\n  const buttonRef = useRef<HTMLButtonElement>(null)\r\n\r\n  // v0.17.66: Calculate position with dynamic height based on menu state\r\n  const openMenu = () => {\r\n    if (!buttonRef.current) return\r\n\r\n    const rect = buttonRef.current.getBoundingClientRect()\r\n    const viewportHeight = window.innerHeight\r\n    const viewportWidth = window.innerWidth\r\n    const menuWidth = 300\r\n    // v0.17.66: Use smaller height for collapsed menu, larger for expanded\r\n    const menuHeight = hasDependencies ? 380 : 120\r\n    const GAP = 4\r\n\r\n    let leftPos = rect.right - menuWidth\r\n    if (leftPos < 10) leftPos = rect.left\r\n    if (leftPos + menuWidth > viewportWidth - 10) {\r\n      leftPos = viewportWidth - menuWidth - 10\r\n    }\r\n\r\n    const spaceBelow = viewportHeight - rect.bottom\r\n    const spaceAbove = rect.top\r\n    let topPos: number\r\n\r\n    if (spaceBelow >= menuHeight + GAP) {\r\n      topPos = rect.bottom + GAP\r\n    } else if (spaceAbove >= menuHeight + GAP) {\r\n      topPos = rect.top - menuHeight - GAP\r\n    } else {\r\n      topPos = spaceBelow >= spaceAbove\r\n        ? rect.bottom + GAP\r\n        : Math.max(10, rect.top - menuHeight - GAP)\r\n    }\r\n\r\n    setMenuPosition({ top: topPos, left: leftPos })\r\n    setIsOpen(true)\r\n  }\r\n\r\n  // v0.17.65: Scroll lock removed - position:fixed handles positioning correctly\r\n  // The Portal renders outside the overflow container, so no lock needed\r\n\r\n  // v0.17.66: Recalculate position when menu expands/collapses\r\n  useEffect(() => {\r\n    if (!isOpen || !buttonRef.current) return\r\n\r\n    const rect = buttonRef.current.getBoundingClientRect()\r\n    const viewportHeight = window.innerHeight\r\n    const viewportWidth = window.innerWidth\r\n    const menuWidth = 300\r\n    const menuHeight = hasDependencies ? 380 : 120\r\n    const GAP = 4\r\n\r\n    let leftPos = rect.right - menuWidth\r\n    if (leftPos < 10) leftPos = rect.left\r\n    if (leftPos + menuWidth > viewportWidth - 10) {\r\n      leftPos = viewportWidth - menuWidth - 10\r\n    }\r\n\r\n    const spaceBelow = viewportHeight - rect.bottom\r\n    const spaceAbove = rect.top\r\n    let topPos: number\r\n\r\n    if (spaceBelow >= menuHeight + GAP) {\r\n      topPos = rect.bottom + GAP\r\n    } else if (spaceAbove >= menuHeight + GAP) {\r\n      topPos = rect.top - menuHeight - GAP\r\n    } else {\r\n      topPos = spaceBelow >= spaceAbove\r\n        ? rect.bottom + GAP\r\n        : Math.max(10, rect.top - menuHeight - GAP)\r\n    }\r\n\r\n    setMenuPosition({ top: topPos, left: leftPos })\r\n  }, [hasDependencies, isOpen])\r\n\r\n  useEffect(() => {\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      if (\r\n        menuRef.current &&\r\n        !menuRef.current.contains(event.target as Node) &&\r\n        !buttonRef.current?.contains(event.target as Node)\r\n      ) {\r\n        setIsOpen(false)\r\n        setSearchQuery('')\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside)\r\n      return () => document.removeEventListener('mousedown', handleClickOutside)\r\n    }\r\n    return undefined\r\n  }, [isOpen])\r\n\r\n  useEffect(() => {\r\n    const handleEscape = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape') {\r\n        setIsOpen(false)\r\n        setSearchQuery('')\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('keydown', handleEscape)\r\n      return () => document.removeEventListener('keydown', handleEscape)\r\n    }\r\n    return undefined\r\n  }, [isOpen])\r\n\r\n  const handleToggleDependency = (taskId: string) => {\r\n    const isDependency = dependencies.includes(taskId)\r\n    const targetTask = availableTasks.find((t) => t.id === taskId)\r\n\r\n    // Clear any previous error\r\n    setCircularError(null)\r\n\r\n    if (isDependency) {\r\n      // Removing dependency - always allowed\r\n      const newDeps = dependencies.filter((id) => id !== taskId)\r\n      onChange(newDeps)\r\n      if (newDeps.length === 0) {\r\n        setHasDependencies(false)\r\n      }\r\n    } else {\r\n      // Adding dependency - validate for circular references\r\n      if (validateCircular) {\r\n        const wouldBeCircular = wouldCreateCircularDependency(\r\n          availableTasks,\r\n          taskId,\r\n          currentCardId\r\n        )\r\n\r\n        if (wouldBeCircular) {\r\n          const errorMsg = `Cannot add \"${targetTask?.title || taskId}\" as dependency - would create circular reference`\r\n          setCircularError(errorMsg)\r\n          onCircularDependencyError?.(taskId, targetTask?.title || taskId)\r\n          // Auto-clear error after 3 seconds\r\n          setTimeout(() => setCircularError(null), 3000)\r\n          return // Don't add the dependency\r\n        }\r\n      }\r\n\r\n      onChange([...dependencies, taskId])\r\n      setHasDependencies(true)\r\n    }\r\n  }\r\n\r\n  const handleToggleHasDependencies = () => {\r\n    const newValue = !hasDependencies\r\n    setHasDependencies(newValue)\r\n\r\n    if (!newValue) {\r\n      // Clear all dependencies\r\n      onChange([])\r\n    }\r\n  }\r\n\r\n  // Filter out current card and apply search\r\n  const filteredTasks = availableTasks\r\n    .filter((task) => task.id !== currentCardId)\r\n    .filter(\r\n      (task) =>\r\n        task.title.toLowerCase().includes(searchQuery.toLowerCase()) ||\r\n        task.id.toLowerCase().includes(searchQuery.toLowerCase())\r\n    )\r\n\r\n  const linkColor = dependencies.length > 0 ? '#00E5CC' : '#BDC3C7'\r\n\r\n  return (\r\n    <div className={`relative ${className || ''}`}>\r\n      {/* Link icon button */}\r\n      <button\r\n        ref={buttonRef}\r\n        onClick={() => isOpen ? setIsOpen(false) : openMenu()}\r\n        className=\"flex items-center gap-1 px-2 py-1 rounded transition-all hover:bg-white/5\"\r\n        title={\r\n          dependencies.length > 0\r\n            ? `${dependencies.length} dependencies`\r\n            : 'Add dependencies'\r\n        }\r\n      >\r\n        <svg\r\n          width=\"16\"\r\n          height=\"16\"\r\n          viewBox=\"0 0 16 16\"\r\n          fill=\"none\"\r\n          xmlns=\"http://www.w3.org/2000/svg\"\r\n        >\r\n          <path\r\n            d=\"M7 9L9 7M11.5 3.5L10 2C8.89543 0.89543 7.10457 0.89543 6 2C4.89543 3.10457 4.89543 4.89543 6 6L7.5 7.5M4.5 12.5L6 14C7.10457 15.1046 8.89543 15.1046 10 14C11.1046 12.8954 11.1046 11.1046 10 10L8.5 8.5\"\r\n            stroke={linkColor}\r\n            strokeWidth=\"1.5\"\r\n            strokeLinecap=\"round\"\r\n            strokeLinejoin=\"round\"\r\n          />\r\n        </svg>\r\n        {dependencies.length > 0 && (\r\n          <span className=\"text-xs font-medium\" style={{ color: linkColor }}>\r\n            {dependencies.length}\r\n          </span>\r\n        )}\r\n      </button>\r\n\r\n      {/* Dependencies menu - Using Portal to escape stacking context */}\r\n      {/* v0.17.57: Fixed positioning for proper viewport handling */}\r\n      {isOpen && (\r\n        <Portal>\r\n          <div\r\n            ref={menuRef}\r\n            className=\"dependencies-selector-menu rounded-xl shadow-2xl border min-w-[300px]\"\r\n            style={{\r\n              position: 'fixed',\r\n              top: `${menuPosition.top}px`,\r\n              left: `${menuPosition.left}px`,\r\n              maxHeight: 'calc(100vh - 40px)',\r\n              overflow: 'hidden',\r\n              display: 'flex',\r\n              flexDirection: 'column',\r\n              background: 'var(--modal-v2-bg, #1f1f1f)',\r\n              border: '1px solid var(--modal-v2-border, rgba(255, 255, 255, 0.15))',\r\n              boxShadow: '0 20px 60px rgba(0, 0, 0, 0.8), 0 0 0 1px rgba(255, 255, 255, 0.1)',\r\n              zIndex: 99999,\r\n            }}\r\n          >\r\n          {/* Circular dependency error */}\r\n          {circularError && (\r\n            <div\r\n              className=\"px-4 py-3 flex items-center gap-2\"\r\n              style={{\r\n                background: 'rgba(239, 68, 68, 0.15)',\r\n                borderBottom: '1px solid rgba(239, 68, 68, 0.3)',\r\n              }}\r\n            >\r\n              <svg\r\n                width=\"16\"\r\n                height=\"16\"\r\n                viewBox=\"0 0 16 16\"\r\n                fill=\"none\"\r\n                xmlns=\"http://www.w3.org/2000/svg\"\r\n              >\r\n                <path\r\n                  d=\"M8 5V8M8 11H8.01M14 8C14 11.3137 11.3137 14 8 14C4.68629 14 2 11.3137 2 8C2 4.68629 4.68629 2 8 2C11.3137 2 14 4.68629 14 8Z\"\r\n                  stroke=\"#ef4444\"\r\n                  strokeWidth=\"1.5\"\r\n                  strokeLinecap=\"round\"\r\n                  strokeLinejoin=\"round\"\r\n                />\r\n              </svg>\r\n              <span className=\"text-xs font-medium\" style={{ color: '#ef4444' }}>\r\n                {circularError}\r\n              </span>\r\n            </div>\r\n          )}\r\n\r\n          {/* Header */}\r\n          <div className=\"px-4 py-2 border-b\" style={{ borderColor: 'var(--modal-v2-border, rgba(255, 255, 255, 0.05))' }}>\r\n            <span className=\"text-xs font-semibold uppercase tracking-wide\" style={{ color: 'var(--modal-v2-text-secondary, rgba(255, 255, 255, 0.7))' }}>\r\n              Task Dependencies\r\n            </span>\r\n          </div>\r\n\r\n          {/* Has dependencies checkbox */}\r\n          <div className=\"px-4 py-3 border-b\" style={{ borderColor: 'var(--modal-v2-border, rgba(255, 255, 255, 0.05))' }}>\r\n            <label\r\n              className=\"flex items-center gap-2 cursor-pointer group\"\r\n              onClick={handleToggleHasDependencies}\r\n            >\r\n              <div\r\n                className=\"w-4 h-4 rounded border-2 flex items-center justify-center transition-all\"\r\n                style={{\r\n                  background: hasDependencies ? '#00E5CC' : 'transparent',\r\n                  borderColor: hasDependencies ? '#00E5CC' : 'var(--modal-v2-border, rgba(255, 255, 255, 0.3))',\r\n                }}\r\n              >\r\n                {hasDependencies && (\r\n                  <svg\r\n                    width=\"12\"\r\n                    height=\"12\"\r\n                    viewBox=\"0 0 12 12\"\r\n                    fill=\"none\"\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                  >\r\n                    <path\r\n                      d=\"M2 6L5 9L10 3\"\r\n                      stroke=\"white\"\r\n                      strokeWidth=\"2\"\r\n                      strokeLinecap=\"round\"\r\n                      strokeLinejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                )}\r\n              </div>\r\n              <span className=\"text-sm font-medium\" style={{ color: 'var(--modal-v2-text-primary, rgba(255, 255, 255, 0.8))' }}>\r\n                Has dependencies\r\n              </span>\r\n            </label>\r\n          </div>\r\n\r\n          {/* Task selection (only if hasDependencies is true) */}\r\n          {hasDependencies && (\r\n            <>\r\n              {/* Search input */}\r\n              <div className=\"px-3 py-2 border-b\" style={{ borderColor: 'var(--modal-v2-border, rgba(255, 255, 255, 0.05))' }}>\r\n                <input\r\n                  type=\"text\"\r\n                  value={searchQuery}\r\n                  onChange={(e) => setSearchQuery(e.target.value)}\r\n                  placeholder=\"Search by name or ID...\"\r\n                  className=\"w-full px-3 py-2 rounded-md text-xs border outline-none transition-all\"\r\n                  style={{\r\n                    background: 'var(--modal-v2-bg-secondary, rgba(255, 255, 255, 0.05))',\r\n                    borderColor: 'var(--modal-v2-border, rgba(255, 255, 255, 0.1))',\r\n                    color: 'var(--modal-v2-text-primary, #ffffff)',\r\n                  }}\r\n                  autoFocus\r\n                />\r\n              </div>\r\n\r\n              {/* Task list */}\r\n              <div className=\"py-2 max-h-[280px] overflow-y-auto\">\r\n                {filteredTasks.length === 0 ? (\r\n                  <div className=\"px-4 py-3 text-xs text-center\" style={{ color: 'var(--modal-v2-text-tertiary, rgba(255, 255, 255, 0.5))' }}>\r\n                    No tasks found\r\n                  </div>\r\n                ) : (\r\n                  filteredTasks.map((task) => {\r\n                    const isDependency = dependencies.includes(task.id)\r\n\r\n                    return (\r\n                      <button\r\n                        key={task.id}\r\n                        onClick={() => handleToggleDependency(task.id)}\r\n                        className=\"w-full px-4 py-2 flex items-start gap-3 text-sm transition-colors\"\r\n                        style={{ background: 'transparent' }}\r\n                        onMouseEnter={(e) => {\r\n                          e.currentTarget.style.background = 'var(--modal-v2-bg-secondary, rgba(255, 255, 255, 0.05))'\r\n                        }}\r\n                        onMouseLeave={(e) => {\r\n                          e.currentTarget.style.background = 'transparent'\r\n                        }}\r\n                      >\r\n                        {/* Checkbox */}\r\n                        <div\r\n                          className=\"w-4 h-4 rounded border-2 flex items-center justify-center flex-shrink-0 mt-0.5 transition-all\"\r\n                          style={{\r\n                            background: isDependency ? '#00E5CC' : 'transparent',\r\n                            borderColor: isDependency ? '#00E5CC' : 'var(--modal-v2-border, rgba(255, 255, 255, 0.3))',\r\n                          }}\r\n                        >\r\n                          {isDependency && (\r\n                            <svg\r\n                              width=\"12\"\r\n                              height=\"12\"\r\n                              viewBox=\"0 0 12 12\"\r\n                              fill=\"none\"\r\n                              xmlns=\"http://www.w3.org/2000/svg\"\r\n                            >\r\n                              <path\r\n                                d=\"M2 6L5 9L10 3\"\r\n                                stroke=\"white\"\r\n                                strokeWidth=\"2\"\r\n                                strokeLinecap=\"round\"\r\n                                strokeLinejoin=\"round\"\r\n                              />\r\n                            </svg>\r\n                          )}\r\n                        </div>\r\n\r\n                        {/* Task info */}\r\n                        <div className=\"flex-1 text-left\">\r\n                          <div className=\"font-medium\" style={{ color: 'var(--modal-v2-text-primary, rgba(255, 255, 255, 0.9))' }}>\r\n                            {task.title}\r\n                          </div>\r\n                          <div className=\"text-xs mt-0.5\" style={{ color: 'var(--modal-v2-text-tertiary, rgba(255, 255, 255, 0.5))' }}>\r\n                            {task.id}\r\n                          </div>\r\n                        </div>\r\n                      </button>\r\n                    )\r\n                  })\r\n                )}\r\n              </div>\r\n            </>\r\n          )}\r\n\r\n          {/* Clear button */}\r\n          {dependencies.length > 0 && (\r\n            <div className=\"px-3 py-2 border-t border-white/5\">\r\n              <button\r\n                onClick={() => {\r\n                  onChange([])\r\n                  setHasDependencies(false)\r\n                  setIsOpen(false)\r\n                }}\r\n                className=\"w-full px-3 py-2 rounded-md text-xs font-medium transition-all hover:bg-red-600/20 border border-red-500/30\"\r\n                style={{ color: '#E74C3C' }}\r\n              >\r\n                Clear All Dependencies\r\n              </button>\r\n            </div>\r\n          )}\r\n          </div>\r\n        </Portal>\r\n      )}\r\n    </div>\r\n  )\r\n}\r\n","/**\r\n * Card Component\r\n * Individual task card in the Kanban board\r\n * @module components/Card\r\n */\r\n\r\nimport { memo } from 'react'\r\nimport { useSortable } from '@dnd-kit/sortable'\r\nimport { CSS } from '@dnd-kit/utilities'\r\nimport type { Card as CardType } from '../../types'\r\nimport type { User } from './UserAssignmentSelector'\r\nimport { cn } from '../../utils'\r\nimport { PrioritySelector } from './PrioritySelector'\r\nimport { DateRangePicker } from './DateRangePicker'\r\nimport { UserAssignmentSelector } from './UserAssignmentSelector'\r\nimport { DependenciesSelector } from './DependenciesSelector'\r\n\r\nexport interface CardProps {\r\n  /** Card data */\r\n  card: CardType\r\n  /** Custom render function */\r\n  render?: (card: CardType) => React.ReactNode\r\n  /** Click handler */\r\n  onClick?: (card: CardType) => void\r\n  /** Is card selected */\r\n  isSelected?: boolean\r\n  /** Disable drag */\r\n  disableDrag?: boolean\r\n  /** Custom className */\r\n  className?: string\r\n  /** Card update handler */\r\n  onUpdate?: (cardId: string, updates: Partial<CardType>) => void\r\n  /** Available users for assignment */\r\n  availableUsers?: User[]\r\n  /** All cards (for dependencies) */\r\n  allCards?: CardType[]\r\n}\r\n\r\n/**\r\n * Default Card Component\r\n * Optimized with memo to prevent unnecessary re-renders\r\n */\r\nexport const Card = memo<CardProps>(\r\n  ({\r\n    card,\r\n    render,\r\n    onClick,\r\n    isSelected,\r\n    disableDrag,\r\n    className,\r\n    onUpdate,\r\n    availableUsers = [],\r\n    allCards = [],\r\n  }) => {\r\n    const {\r\n      attributes,\r\n      listeners,\r\n      setNodeRef,\r\n      transform,\r\n      transition,\r\n      isDragging,\r\n    } = useSortable({\r\n      id: card.id,\r\n      disabled: disableDrag,\r\n      data: {\r\n        type: 'card',\r\n        card,\r\n      },\r\n    })\r\n\r\n    const style = {\r\n      transform: CSS.Transform.toString(transform),\r\n      transition,\r\n    }\r\n\r\n    // If custom render provided, use it\r\n    if (render) {\r\n      return (\r\n        <div\r\n          ref={setNodeRef}\r\n          style={style}\r\n          {...attributes}\r\n          {...listeners}\r\n          onClick={() => onClick?.(card)}\r\n        >\r\n          {render(card)}\r\n        </div>\r\n      )\r\n    }\r\n\r\n    // Get assigned users from IDs\r\n    const assignedUsers = availableUsers.filter((user) =>\r\n      card.assignedUserIds?.includes(user.id)\r\n    )\r\n\r\n    // v0.17.41: Detect completed tasks for strikethrough styling\r\n    const isCompleted = card.progress === 100\r\n\r\n    // v0.17.182: Filter image attachments for thumbnail display\r\n    const imageAttachments = (card.attachments || []).filter((att) =>\r\n      att.type.startsWith('image/')\r\n    )\r\n\r\n    // Default card rendering with optional color accent\r\n    const cardStyle = {\r\n      ...style,\r\n      // v0.17.29: Apply custom color as top border accent\r\n      ...(card.color && {\r\n        borderTopWidth: '3px',\r\n        borderTopStyle: 'solid' as const,\r\n        borderTopColor: card.color,\r\n      }),\r\n    }\r\n\r\n    return (\r\n      <div\r\n        ref={setNodeRef}\r\n        style={cardStyle}\r\n        className={cn(\r\n          'asakaa-card',\r\n          isDragging && 'asakaa-card-dragging',\r\n          isSelected && 'ring-2 ring-asakaa-accent-blue',\r\n          className\r\n        )}\r\n        {...attributes}\r\n        {...listeners}\r\n        onClick={(e) => {\r\n          // Prevent card click when interacting with configurables\r\n          if (\r\n            (e.target as HTMLElement).closest(\r\n              '.priority-selector, .date-picker, .user-selector, .dependencies-selector'\r\n            )\r\n          ) {\r\n            return\r\n          }\r\n          onClick?.(card)\r\n        }}\r\n      >\r\n        {/* Cover Image */}\r\n        {card.coverImage && (\r\n          <div className=\"asakaa-card-cover mb-3\">\r\n            <img\r\n              src={card.coverImage}\r\n              alt={`Cover for ${card.title}`}\r\n              className=\"w-full h-32 object-cover rounded-md\"\r\n              loading=\"lazy\"\r\n              onError={(e) => {\r\n                // Hide image if it fails to load\r\n                e.currentTarget.style.display = 'none'\r\n              }}\r\n            />\r\n          </div>\r\n        )}\r\n\r\n        {/* v0.17.182: Image Attachment Thumbnails */}\r\n        {/* v0.17.228: Fixed blurry thumbnails - use full URL and GPU acceleration */}\r\n        {imageAttachments.length > 0 && !card.coverImage && (\r\n          <div className=\"asakaa-card-attachments mb-3\">\r\n            {imageAttachments.length === 1 && imageAttachments[0] ? (\r\n              // Single image: show as cover-like\r\n              <img\r\n                src={imageAttachments[0].url}\r\n                alt={imageAttachments[0].name}\r\n                className=\"w-full h-32 object-cover rounded-md\"\r\n                loading=\"lazy\"\r\n                decoding=\"async\"\r\n                style={{\r\n                  imageRendering: 'auto',\r\n                  WebkitBackfaceVisibility: 'hidden',\r\n                  backfaceVisibility: 'hidden',\r\n                  transform: 'translateZ(0)',\r\n                }}\r\n                onError={(e) => {\r\n                  e.currentTarget.style.display = 'none'\r\n                }}\r\n              />\r\n            ) : (\r\n              // Multiple images: show grid of thumbnails (max 4)\r\n              <div className=\"grid grid-cols-2 gap-1\">\r\n                {imageAttachments.slice(0, 4).map((att, index) => (\r\n                  <div key={att.id} className=\"relative\">\r\n                    <img\r\n                      src={att.url}\r\n                      alt={att.name}\r\n                      className=\"w-full h-16 object-cover rounded\"\r\n                      loading=\"lazy\"\r\n                      decoding=\"async\"\r\n                      style={{\r\n                        imageRendering: 'auto',\r\n                        WebkitBackfaceVisibility: 'hidden',\r\n                        backfaceVisibility: 'hidden',\r\n                        transform: 'translateZ(0)',\r\n                      }}\r\n                      onError={(e) => {\r\n                        e.currentTarget.style.display = 'none'\r\n                      }}\r\n                    />\r\n                    {/* Show +N overlay on last image if more than 4 */}\r\n                    {index === 3 && imageAttachments.length > 4 && (\r\n                      <div className=\"absolute inset-0 bg-black/60 rounded flex items-center justify-center\">\r\n                        <span className=\"text-white text-sm font-medium\">\r\n                          +{imageAttachments.length - 4}\r\n                        </span>\r\n                      </div>\r\n                    )}\r\n                  </div>\r\n                ))}\r\n              </div>\r\n            )}\r\n          </div>\r\n        )}\r\n\r\n        {/* Title - v0.17.41: Strikethrough for completed tasks */}\r\n        <h3\r\n          className=\"asakaa-card-title mb-2\"\r\n          style={{\r\n            textDecoration: isCompleted ? 'line-through' : 'none',\r\n            opacity: isCompleted ? 0.6 : 1,\r\n          }}\r\n        >\r\n          {card.title}\r\n        </h3>\r\n\r\n        {/* Description */}\r\n        {card.description && (\r\n          <p className=\"asakaa-card-description mb-3\">{card.description}</p>\r\n        )}\r\n\r\n        {/* Configurable properties row */}\r\n        <div className=\"flex items-center gap-3 mb-3 pt-1\">\r\n          {/* Priority selector */}\r\n          <div onClick={(e) => e.stopPropagation()} className=\"priority-selector\">\r\n            <PrioritySelector\r\n              priority={card.priority}\r\n              onChange={(priority) => onUpdate?.(card.id, { priority })}\r\n            />\r\n          </div>\r\n\r\n          {/* Date range picker */}\r\n          <div onClick={(e) => e.stopPropagation()} className=\"date-picker\">\r\n            <DateRangePicker\r\n              startDate={\r\n                card.startDate\r\n                  ? typeof card.startDate === 'string'\r\n                    ? card.startDate\r\n                    : card.startDate.toISOString().split('T')[0]\r\n                  : undefined\r\n              }\r\n              endDate={\r\n                card.endDate\r\n                  ? typeof card.endDate === 'string'\r\n                    ? card.endDate\r\n                    : card.endDate.toISOString().split('T')[0]\r\n                  : undefined\r\n              }\r\n              onChange={(startDate, endDate) =>\r\n                onUpdate?.(card.id, { startDate, endDate })\r\n              }\r\n            />\r\n          </div>\r\n\r\n          {/* User assignment */}\r\n          {availableUsers.length > 0 && (\r\n            <div onClick={(e) => e.stopPropagation()} className=\"user-selector\">\r\n              <UserAssignmentSelector\r\n                assignedUsers={assignedUsers}\r\n                availableUsers={availableUsers}\r\n                onChange={(users) =>\r\n                  onUpdate?.(card.id, {\r\n                    assignedUserIds: users.map((u) => u.id),\r\n                  })\r\n                }\r\n              />\r\n            </div>\r\n          )}\r\n\r\n          {/* Dependencies */}\r\n          <div onClick={(e) => e.stopPropagation()} className=\"dependencies-selector\">\r\n            <DependenciesSelector\r\n              currentCardId={card.id}\r\n              dependencies={\r\n                Array.isArray(card.dependencies)\r\n                  ? card.dependencies.map((d) => (typeof d === 'string' ? d : d.taskId))\r\n                  : []\r\n              }\r\n              availableTasks={allCards}\r\n              onChange={(dependencies) => onUpdate?.(card.id, { dependencies })}\r\n            />\r\n          </div>\r\n        </div>\r\n\r\n        {/* Labels */}\r\n        {card.labels && card.labels.length > 0 && (\r\n          <div className=\"flex flex-wrap gap-1\">\r\n            {card.labels.slice(0, 3).map((label) => (\r\n              <span key={label} className=\"asakaa-label\">\r\n                {label}\r\n              </span>\r\n            ))}\r\n          </div>\r\n        )}\r\n\r\n        {/* Progress Bar - v0.17.37, v0.17.40: Fixed electric blue color */}\r\n        {typeof card.progress === 'number' && (\r\n          <div className=\"mt-3 pt-2 border-t border-white/5\">\r\n            <div className=\"flex items-center justify-between mb-1\">\r\n              <span className=\"text-[10px] text-[#6B7280]\">Progreso</span>\r\n              <span className=\"text-[10px] font-medium\" style={{ color: '#00E5CC' }}>\r\n                {Math.round(card.progress)}%\r\n              </span>\r\n            </div>\r\n            <div className=\"h-1.5 rounded-full bg-white/5 overflow-hidden\">\r\n              <div\r\n                className=\"h-full rounded-full transition-all duration-300\"\r\n                style={{\r\n                  width: `${Math.min(100, Math.max(0, card.progress))}%`,\r\n                  backgroundColor: '#00E5CC',\r\n                }}\r\n              />\r\n            </div>\r\n          </div>\r\n        )}\r\n      </div>\r\n    )\r\n  },\r\n  // Custom comparison function for optimal performance\r\n  (prevProps, nextProps) => {\r\n    return (\r\n      prevProps.card.id === nextProps.card.id &&\r\n      prevProps.card.title === nextProps.card.title &&\r\n      prevProps.card.description === nextProps.card.description &&\r\n      prevProps.card.position === nextProps.card.position &&\r\n      prevProps.card.columnId === nextProps.card.columnId &&\r\n      prevProps.card.priority === nextProps.card.priority &&\r\n      prevProps.card.color === nextProps.card.color && // v0.17.29\r\n      prevProps.card.progress === nextProps.card.progress && // v0.17.37\r\n      prevProps.card.startDate === nextProps.card.startDate &&\r\n      prevProps.card.endDate === nextProps.card.endDate &&\r\n      prevProps.isSelected === nextProps.isSelected &&\r\n      // v2.1.1: Compare render prop so theme changes propagate to custom cards\r\n      prevProps.render === nextProps.render &&\r\n      JSON.stringify(prevProps.card.labels) ===\r\n        JSON.stringify(nextProps.card.labels) &&\r\n      JSON.stringify(prevProps.card.assignedUserIds) ===\r\n        JSON.stringify(nextProps.card.assignedUserIds) &&\r\n      JSON.stringify(prevProps.card.dependencies) ===\r\n        JSON.stringify(nextProps.card.dependencies) &&\r\n      // v0.17.182: Compare attachments for thumbnail updates\r\n      JSON.stringify(prevProps.card.attachments?.map((a) => a.id)) ===\r\n        JSON.stringify(nextProps.card.attachments?.map((a) => a.id))\r\n    )\r\n  }\r\n)\r\n\r\nCard.displayName = 'Card'\r\n","/**\r\n * Status Selector Component\r\n * Reusable status selector for both Card and Gantt\r\n * Follows the same pattern as PrioritySelector\r\n * v0.17.54: Added support for custom statuses from Kanban columns\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport { Portal } from '../Portal'\r\n\r\n// v0.17.54: Keep for backward compatibility, but allow string type for custom statuses\r\nexport type TaskStatus = 'todo' | 'in-progress' | 'completed'\r\n\r\n// v0.17.54: Custom status interface for dynamic Kanban columns\r\nexport interface CustomStatusOption {\r\n  id: string\r\n  title: string\r\n  color?: string\r\n}\r\n\r\nexport interface StatusSelectorProps {\r\n  status?: string // v0.17.54: Changed to string to support custom statuses\r\n  onChange: (status: string) => void // v0.17.54: Changed to string\r\n  className?: string\r\n  customStatuses?: CustomStatusOption[] // v0.17.54: Custom statuses from Kanban columns\r\n}\r\n\r\nconst STATUS_CONFIG = {\r\n  'todo': {\r\n    label: 'To Do',\r\n    color: '#94a3b8',\r\n    icon: 'circle'\r\n  },\r\n  'in-progress': {\r\n    label: 'In Progress',\r\n    color: '#60a5fa',\r\n    icon: 'circle-dot'\r\n  },\r\n  'completed': {\r\n    label: 'Completed',\r\n    color: '#34d399',\r\n    icon: 'check-circle'\r\n  },\r\n} as const\r\n\r\nconst StatusIcon = ({ icon, color }: { icon: string; color: string }) => {\r\n  if (icon === 'circle') {\r\n    return (\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <circle cx=\"8\" cy=\"8\" r=\"6\" stroke={color} strokeWidth=\"1.5\" fill=\"none\" />\r\n      </svg>\r\n    )\r\n  }\r\n\r\n  if (icon === 'circle-dot') {\r\n    return (\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <circle cx=\"8\" cy=\"8\" r=\"6\" stroke={color} strokeWidth=\"1.5\" fill=\"none\" />\r\n        <circle cx=\"8\" cy=\"8\" r=\"3\" fill={color} />\r\n      </svg>\r\n    )\r\n  }\r\n\r\n  // check-circle\r\n  return (\r\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n      <circle cx=\"8\" cy=\"8\" r=\"6\" stroke={color} strokeWidth=\"1.5\" fill={color} fillOpacity=\"0.2\" />\r\n      <path d=\"M5 8L7 10L11 6\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\r\n    </svg>\r\n  )\r\n}\r\n\r\nexport function StatusSelector({\r\n  status = 'todo',\r\n  onChange,\r\n  className,\r\n  customStatuses = [],\r\n}: StatusSelectorProps) {\r\n  const [isOpen, setIsOpen] = useState(false)\r\n  const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 })\r\n  const menuRef = useRef<HTMLDivElement>(null)\r\n  const buttonRef = useRef<HTMLButtonElement>(null)\r\n\r\n  // v0.17.54: Build combined status list (default + custom)\r\n  const allStatuses: Array<{ id: string; label: string; color: string; icon: string }> = [\r\n    ...Object.entries(STATUS_CONFIG).map(([id, config]) => ({\r\n      id,\r\n      label: config.label,\r\n      color: config.color,\r\n      icon: config.icon,\r\n    })),\r\n    ...customStatuses\r\n      .filter(cs => !Object.keys(STATUS_CONFIG).includes(cs.id))\r\n      .map(cs => ({\r\n        id: cs.id,\r\n        label: cs.title,\r\n        color: cs.color || '#8B5CF6', // Default purple for custom statuses\r\n        icon: 'circle-dot', // Default icon for custom\r\n      })),\r\n  ]\r\n\r\n  // v0.17.54: Get current status config (from defaults or custom)\r\n  const getCurrentConfig = () => {\r\n    const defaultConfig = STATUS_CONFIG[status as TaskStatus]\r\n    if (defaultConfig) {\r\n      return { ...defaultConfig, id: status }\r\n    }\r\n    const customConfig = customStatuses.find(cs => cs.id === status)\r\n    if (customConfig) {\r\n      return {\r\n        id: customConfig.id,\r\n        label: customConfig.title,\r\n        color: customConfig.color || '#8B5CF6',\r\n        icon: 'circle-dot',\r\n      }\r\n    }\r\n    // Fallback to todo\r\n    return { ...STATUS_CONFIG['todo'], id: 'todo' }\r\n  }\r\n\r\n  // v0.17.63: Calculate position and open menu synchronously\r\n  const openMenu = () => {\r\n    if (!buttonRef.current) return\r\n\r\n    const rect = buttonRef.current.getBoundingClientRect()\r\n    const viewportHeight = window.innerHeight\r\n    const viewportWidth = window.innerWidth\r\n    const menuWidth = 180\r\n    const menuHeight = 280\r\n    const GAP = 4\r\n\r\n    let leftPos = rect.right - menuWidth\r\n    if (leftPos < 10) leftPos = rect.left\r\n    if (leftPos + menuWidth > viewportWidth - 10) {\r\n      leftPos = viewportWidth - menuWidth - 10\r\n    }\r\n\r\n    const spaceBelow = viewportHeight - rect.bottom\r\n    const spaceAbove = rect.top\r\n    let topPos: number\r\n\r\n    if (spaceBelow >= menuHeight + GAP) {\r\n      topPos = rect.bottom + GAP\r\n    } else if (spaceAbove >= menuHeight + GAP) {\r\n      topPos = rect.top - menuHeight - GAP\r\n    } else {\r\n      topPos = spaceBelow >= spaceAbove\r\n        ? rect.bottom + GAP\r\n        : Math.max(10, rect.top - menuHeight - GAP)\r\n    }\r\n\r\n    setMenuPosition({ top: topPos, left: leftPos })\r\n    setIsOpen(true)\r\n  }\r\n\r\n  // v0.17.65: Scroll lock removed - position:fixed handles positioning correctly\r\n  // The Portal renders outside the overflow container, so no lock needed\r\n\r\n  useEffect(() => {\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      if (\r\n        menuRef.current &&\r\n        !menuRef.current.contains(event.target as Node) &&\r\n        !buttonRef.current?.contains(event.target as Node)\r\n      ) {\r\n        setIsOpen(false)\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside)\r\n      return () => document.removeEventListener('mousedown', handleClickOutside)\r\n    }\r\n    return undefined\r\n  }, [isOpen])\r\n\r\n  useEffect(() => {\r\n    const handleEscape = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape') setIsOpen(false)\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('keydown', handleEscape)\r\n      return () => document.removeEventListener('keydown', handleEscape)\r\n    }\r\n    return undefined\r\n  }, [isOpen])\r\n\r\n  const handleSelect = (newStatus: string) => {\r\n    onChange(newStatus)\r\n    setIsOpen(false)\r\n  }\r\n\r\n  // v0.17.54: Use dynamic config lookup\r\n  const currentConfig = getCurrentConfig()\r\n  const statusColor = currentConfig.color\r\n\r\n  return (\r\n    <div className={`relative ${className || ''}`}>\r\n      <button\r\n        ref={buttonRef}\r\n        onClick={() => isOpen ? setIsOpen(false) : openMenu()}\r\n        className=\"flex items-center justify-center w-8 h-8 rounded-lg transition-all hover:bg-white/15 hover:scale-110 active:scale-95\"\r\n        style={{\r\n          background: `${statusColor}10`,\r\n          boxShadow: `0 0 0 2px ${statusColor}30 inset`,\r\n        }}\r\n        title={currentConfig.label}\r\n      >\r\n        <StatusIcon icon={currentConfig.icon} color={statusColor} />\r\n      </button>\r\n\r\n      {/* v0.17.57: Fixed positioning for proper viewport handling */}\r\n      {isOpen && (\r\n        <Portal>\r\n          <div\r\n            ref={menuRef}\r\n            className=\"status-selector-menu\"\r\n            style={{\r\n              position: 'fixed',\r\n              top: `${menuPosition.top}px`,\r\n              left: `${menuPosition.left}px`,\r\n              zIndex: 99999,\r\n              minWidth: '180px',\r\n              maxHeight: 'calc(100vh - 40px)',\r\n              overflowY: 'auto',\r\n              borderRadius: '8px',\r\n              background: 'var(--modal-v2-bg, #1f1f1f)',\r\n              border: '1px solid var(--modal-v2-border, rgba(255, 255, 255, 0.15))',\r\n              boxShadow: '0 10px 40px rgba(0, 0, 0, 0.8), 0 0 0 1px rgba(255, 255, 255, 0.1)',\r\n            }}\r\n          >\r\n          <div\r\n            className=\"px-3 py-1.5 border-b\"\r\n            style={{ borderColor: 'var(--modal-v2-border, rgba(255, 255, 255, 0.1))' }}\r\n          >\r\n            <span\r\n              className=\"text-[10px] font-bold uppercase tracking-wider\"\r\n              style={{ color: 'var(--modal-v2-text-secondary, rgba(255, 255, 255, 0.7))' }}\r\n            >\r\n              Status\r\n            </span>\r\n          </div>\r\n\r\n          <div className=\"py-1\">\r\n            {/* v0.17.54: Render all statuses (default + custom) */}\r\n            {allStatuses.map((statusOption) => (\r\n                <button\r\n                  key={statusOption.id}\r\n                  onClick={() => handleSelect(statusOption.id)}\r\n                  className=\"w-full px-3 py-2 flex items-center gap-2.5 text-sm font-medium transition-all active:scale-[0.98] status-option\"\r\n                  style={{\r\n                    color: statusOption.color,\r\n                    background: 'transparent'\r\n                  }}\r\n                  onMouseEnter={(e) => {\r\n                    e.currentTarget.style.background = 'var(--modal-v2-bg-tertiary, rgba(255, 255, 255, 0.15))'\r\n                  }}\r\n                  onMouseLeave={(e) => {\r\n                    e.currentTarget.style.background = 'transparent'\r\n                  }}\r\n                >\r\n                  <StatusIcon icon={statusOption.icon} color={statusOption.color} />\r\n                  <span className=\"font-semibold\">{statusOption.label}</span>\r\n                  {status === statusOption.id && (\r\n                    <svg className=\"ml-auto\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                      <path d=\"M13.5 4.5L6 12L2.5 8.5\" stroke=\"#00E5CC\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\r\n                    </svg>\r\n                  )}\r\n                </button>\r\n              )\r\n            )}\r\n          </div>\r\n          </div>\r\n        </Portal>\r\n      )}\r\n    </div>\r\n  )\r\n}\r\n","/**\r\n * Column Menu Component\r\n * Three-dot menu for column actions (rename, delete, etc.)\r\n * v0.17.55: Added delete functionality for custom columns\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport { Portal } from '../Portal'\r\n\r\nconst i18n = {\r\n  en: {\r\n    renameColumn: 'Rename Column',\r\n    rename: 'Rename',\r\n    delete: 'Delete',\r\n    columnName: 'Column name',\r\n    columnOptions: 'Column options',\r\n  },\r\n  es: {\r\n    renameColumn: 'Renombrar Columna',\r\n    rename: 'Renombrar',\r\n    delete: 'Eliminar',\r\n    columnName: 'Nombre de columna',\r\n    columnOptions: 'Opciones de columna',\r\n  },\r\n} as const\r\n\r\nexport interface ColumnMenuProps {\r\n  /** Current column title */\r\n  columnTitle: string\r\n  /** Rename handler */\r\n  onRename: (newTitle: string) => void\r\n  /** v0.17.55: Delete handler - if provided, shows delete option */\r\n  onDelete?: () => void\r\n  /** v0.17.55: Whether column can be deleted (default columns cannot) */\r\n  isDeletable?: boolean\r\n  /** Custom className */\r\n  className?: string\r\n  /** Locale for translations */\r\n  locale?: 'en' | 'es'\r\n}\r\n\r\nexport function ColumnMenu({\r\n  columnTitle,\r\n  onRename,\r\n  onDelete,\r\n  isDeletable = false,\r\n  className,\r\n  locale = 'en',\r\n}: ColumnMenuProps) {\r\n  const t = i18n[locale] || i18n.en\r\n  const [isOpen, setIsOpen] = useState(false)\r\n  const [isRenaming, setIsRenaming] = useState(false)\r\n  const [newTitle, setNewTitle] = useState(columnTitle)\r\n  const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 })\r\n  const menuRef = useRef<HTMLDivElement>(null)\r\n  const buttonRef = useRef<HTMLButtonElement>(null)\r\n  const inputRef = useRef<HTMLInputElement>(null)\r\n\r\n  // Update menu position when opened\r\n  useEffect(() => {\r\n    if (isOpen && buttonRef.current) {\r\n      const rect = buttonRef.current.getBoundingClientRect()\r\n      setMenuPosition({\r\n        top: rect.bottom + window.scrollY + 8,\r\n        left: rect.left + window.scrollX,\r\n      })\r\n    }\r\n  }, [isOpen])\r\n\r\n  // Close menu when clicking outside\r\n  useEffect(() => {\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      if (\r\n        menuRef.current &&\r\n        !menuRef.current.contains(event.target as Node) &&\r\n        !buttonRef.current?.contains(event.target as Node)\r\n      ) {\r\n        setIsOpen(false)\r\n        setIsRenaming(false)\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside)\r\n      return () => document.removeEventListener('mousedown', handleClickOutside)\r\n    }\r\n    return undefined\r\n  }, [isOpen])\r\n\r\n  // Close on escape\r\n  useEffect(() => {\r\n    const handleEscape = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape') {\r\n        setIsOpen(false)\r\n        setIsRenaming(false)\r\n        setNewTitle(columnTitle)\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('keydown', handleEscape)\r\n      return () => document.removeEventListener('keydown', handleEscape)\r\n    }\r\n    return undefined\r\n  }, [isOpen, columnTitle])\r\n\r\n  // Focus input when renaming starts\r\n  useEffect(() => {\r\n    if (isRenaming && inputRef.current) {\r\n      inputRef.current.focus()\r\n      inputRef.current.select()\r\n    }\r\n  }, [isRenaming])\r\n\r\n  const handleRenameClick = () => {\r\n    setIsRenaming(true)\r\n    setNewTitle(columnTitle)\r\n  }\r\n\r\n  const handleRenameSubmit = () => {\r\n    const trimmedTitle = newTitle.trim()\r\n    if (trimmedTitle && trimmedTitle !== columnTitle) {\r\n      onRename(trimmedTitle)\r\n    }\r\n    setIsRenaming(false)\r\n    setIsOpen(false)\r\n    setNewTitle(columnTitle)\r\n  }\r\n\r\n  const handleRenameKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n    if (e.key === 'Enter') {\r\n      handleRenameSubmit()\r\n    } else if (e.key === 'Escape') {\r\n      setIsRenaming(false)\r\n      setNewTitle(columnTitle)\r\n    }\r\n  }\r\n\r\n  return (\r\n    <div className={`relative ${className || ''}`}>\r\n      {/* Three-dot menu button */}\r\n      <button\r\n        ref={buttonRef}\r\n        onClick={() => setIsOpen(!isOpen)}\r\n        className=\"opacity-0 group-hover:opacity-100 transition-opacity p-1 rounded hover:bg-white/10\"\r\n        title={t.columnOptions}\r\n        aria-label={t.columnOptions}\r\n      >\r\n        <svg\r\n          width=\"16\"\r\n          height=\"16\"\r\n          viewBox=\"0 0 16 16\"\r\n          fill=\"none\"\r\n          xmlns=\"http://www.w3.org/2000/svg\"\r\n        >\r\n          <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\" />\r\n          <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\" />\r\n          <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\" />\r\n        </svg>\r\n      </button>\r\n\r\n      {/* Menu dropdown */}\r\n      {isOpen && (\r\n        <Portal>\r\n          <div\r\n            ref={menuRef}\r\n            className=\"fixed rounded-xl shadow-2xl border min-w-[200px]\"\r\n            style={{\r\n              top: `${menuPosition.top}px`,\r\n              left: `${menuPosition.left}px`,\r\n              background: 'linear-gradient(135deg, #1f1f1f 0%, #1a1a1a 100%)',\r\n              borderColor: 'rgba(255, 255, 255, 0.15)',\r\n              boxShadow: '0 20px 60px rgba(0, 0, 0, 0.8), 0 0 0 1px rgba(255, 255, 255, 0.1)',\r\n              zIndex: 99999,\r\n            }}\r\n          >\r\n            {isRenaming ? (\r\n              // Rename input\r\n              <div className=\"p-3\">\r\n                <label className=\"text-xs font-bold text-white/80 uppercase tracking-wider block mb-2\">\r\n                  {t.renameColumn}\r\n                </label>\r\n                <input\r\n                  ref={inputRef}\r\n                  type=\"text\"\r\n                  value={newTitle}\r\n                  onChange={(e) => setNewTitle(e.target.value)}\r\n                  onKeyDown={handleRenameKeyDown}\r\n                  onBlur={handleRenameSubmit}\r\n                  className=\"w-full px-3 py-2 rounded-lg text-sm bg-white/5 border border-white/20 text-white placeholder-white/50 outline-none focus:border-[#00E5CC]/50 transition-all\"\r\n                  placeholder={t.columnName}\r\n                  maxLength={50}\r\n                />\r\n              </div>\r\n            ) : (\r\n              // Menu options\r\n              <div className=\"py-1\">\r\n                <button\r\n                  onClick={handleRenameClick}\r\n                  className=\"w-full px-4 py-2.5 flex items-center gap-3 text-sm text-white/90 hover:bg-white/10 transition-all\"\r\n                >\r\n                  <svg\r\n                    width=\"16\"\r\n                    height=\"16\"\r\n                    viewBox=\"0 0 16 16\"\r\n                    fill=\"none\"\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                  >\r\n                    <path\r\n                      d=\"M11.5 1.5L14.5 4.5L5 14H2V11L11.5 1.5Z\"\r\n                      stroke=\"currentColor\"\r\n                      strokeWidth=\"1.5\"\r\n                      strokeLinecap=\"round\"\r\n                      strokeLinejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                  <span className=\"font-medium\">{t.rename}</span>\r\n                </button>\r\n\r\n                {/* v0.17.55: Delete option - only for custom columns */}\r\n                {isDeletable && onDelete && (\r\n                  <>\r\n                    <div className=\"h-px bg-white/10 mx-2 my-1\" />\r\n                    <button\r\n                      onClick={() => {\r\n                        onDelete()\r\n                        setIsOpen(false)\r\n                      }}\r\n                      className=\"w-full px-4 py-2.5 flex items-center gap-3 text-sm text-red-400 hover:bg-red-500/10 transition-all\"\r\n                    >\r\n                      <svg\r\n                        width=\"16\"\r\n                        height=\"16\"\r\n                        viewBox=\"0 0 16 16\"\r\n                        fill=\"none\"\r\n                        xmlns=\"http://www.w3.org/2000/svg\"\r\n                      >\r\n                        <path\r\n                          d=\"M2 4H14M5 4V2.5C5 2.22386 5.22386 2 5.5 2H10.5C10.7761 2 11 2.22386 11 2.5V4M12.5 4V13.5C12.5 13.7761 12.2761 14 12 14H4C3.72386 14 3.5 13.7761 3.5 13.5V4\"\r\n                          stroke=\"currentColor\"\r\n                          strokeWidth=\"1.5\"\r\n                          strokeLinecap=\"round\"\r\n                          strokeLinejoin=\"round\"\r\n                        />\r\n                        <path\r\n                          d=\"M6.5 7V11M9.5 7V11\"\r\n                          stroke=\"currentColor\"\r\n                          strokeWidth=\"1.5\"\r\n                          strokeLinecap=\"round\"\r\n                        />\r\n                      </svg>\r\n                      <span className=\"font-medium\">{t.delete}</span>\r\n                    </button>\r\n                  </>\r\n                )}\r\n              </div>\r\n            )}\r\n          </div>\r\n        </Portal>\r\n      )}\r\n    </div>\r\n  )\r\n}\r\n","/**\n * Column Component\n * Vertical column containing cards\n * @module components/Column\n */\n\nimport { memo, useRef } from 'react'\nimport { useDroppable } from '@dnd-kit/core'\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport type { Column as ColumnType, Card as CardType } from '../../types'\nimport type { User } from '../Card/UserAssignmentSelector'\nimport { Card } from '../Card'\nimport { ColumnMenu } from './ColumnMenu'\nimport { cn, shouldVirtualize } from '../../utils'\n\nexport interface ColumnProps {\n  /** Column data */\n  column: ColumnType\n  /** Cards in this column */\n  cards: CardType[]\n  /** Custom column renderer */\n  renderColumn?: (column: ColumnType, cards: CardType[]) => React.ReactNode\n  /** Custom card renderer */\n  renderCard?: (card: CardType) => React.ReactNode\n  /** Custom header renderer */\n  renderHeader?: (column: ColumnType, cardCount: number) => React.ReactNode\n  /** Custom empty state */\n  renderEmptyState?: (column: ColumnType) => React.ReactNode\n  /** Card click handler */\n  onCardClick?: (card: CardType) => void\n  /** Card update handler */\n  onCardUpdate?: (cardId: string, updates: Partial<CardType>) => void\n  /** Available users for assignment */\n  availableUsers?: User[]\n  /** All cards (for dependencies) */\n  allCards?: CardType[]\n  /** Enable virtualization */\n  enableVirtualization?: boolean\n  /** Estimated card height for virtualization */\n  cardHeight?: number\n  /** Is column collapsed */\n  isCollapsed?: boolean\n  /** Toggle collapse */\n  onToggleCollapse?: () => void\n  /** Column rename handler */\n  onColumnRename?: (columnId: string, newTitle: string) => void\n  /** v0.17.55: Column delete handler */\n  onColumnDelete?: (columnId: string) => void\n  /** v0.17.55: Whether column can be deleted (false for default columns) */\n  isDeletable?: boolean\n  /** Custom className */\n  className?: string\n  /** v2.0.0: Custom metrics renderer below column header */\n  renderMetrics?: (column: ColumnType, cards: CardType[]) => React.ReactNode\n  /** Locale for i18n */\n  locale?: 'en' | 'es'\n}\n\n/**\n * Column Component\n * Uses virtualization for large lists automatically\n */\nexport const Column = memo<ColumnProps>(\n  ({\n    column,\n    cards,\n    renderColumn,\n    renderCard,\n    renderHeader,\n    renderEmptyState,\n    onCardClick,\n    onCardUpdate,\n    availableUsers,\n    allCards,\n    enableVirtualization,\n    cardHeight = 120,\n    isCollapsed,\n    onToggleCollapse,\n    onColumnRename,\n    onColumnDelete,\n    isDeletable = false,\n    className,\n    renderMetrics,\n    locale,\n  }) => {\n    const { setNodeRef, isOver } = useDroppable({\n      id: column.id,\n      data: {\n        type: 'column',\n        column,\n      },\n    })\n\n    const parentRef = useRef<HTMLDivElement>(null)\n\n    // Auto-enable virtualization for large lists\n    const useVirtualization =\n      enableVirtualization ?? shouldVirtualize(cards.length)\n\n    // Setup virtualizer\n    const virtualizer = useVirtualizer({\n      count: cards.length,\n      getScrollElement: () => parentRef.current,\n      estimateSize: () => cardHeight,\n      enabled: useVirtualization,\n    })\n\n    /*\n     * 1.9.33 · una tarjeta CONTENEDOR (`metadata.isContainer`: una tarea padre)\n     * se ve y se mueve, pero no suma en el número de la columna. Así el tablero\n     * dice el mismo número de tareas que la lista. El límite WIP sigue igual.\n     */\n    const tarjetasQueCuentan = cards.filter(c => !(c.metadata as { isContainer?: boolean } | undefined)?.isContainer).length\n\n    // Custom column renderer\n    if (renderColumn) {\n      return (\n        <div ref={setNodeRef} className={className}>\n          {renderColumn(column, cards)}\n        </div>\n      )\n    }\n\n    // Calculate WIP limit status\n    const getWipLimitStatus = () => {\n      if (!column.wipLimit) return { state: 'none', percentage: 0 }\n\n      const percentage = (cards.length / column.wipLimit) * 100\n\n      if (cards.length > column.wipLimit) {\n        return { state: 'exceeded', percentage }\n      } else if (percentage >= 80) {\n        return { state: 'warning', percentage }\n      } else if (percentage >= 60) {\n        return { state: 'approaching', percentage }\n      } else {\n        return { state: 'ok', percentage }\n      }\n    }\n\n    const wipStatus = getWipLimitStatus()\n    const isOverWipLimit = wipStatus.state === 'exceeded'\n\n    // WIP limit badge styling - simplified without color backgrounds\n    const getWipBadgeClasses = () => {\n      // All WIP limits use the same base class for consistent, subtle display\n      return 'asakaa-column-count'\n    }\n\n    return (\n      <div\n        ref={setNodeRef}\n        className={cn(\n          'asakaa-column',\n          isOver && 'ring-2 ring-asakaa-accent-blue',\n          isOverWipLimit && 'ring-2 ring-asakaa-accent-red',\n          className\n        )}\n      >\n        {/* Header */}\n        {renderHeader ? (\n          renderHeader(column, tarjetasQueCuentan)\n        ) : (\n          <div className=\"asakaa-column-header group\">\n            <h2 className=\"asakaa-column-title\">{column.title}</h2>\n            <div className=\"flex items-center gap-2\">\n              <span className={cn(getWipBadgeClasses())}>\n                {tarjetasQueCuentan}\n                {column.wipLimit && ` / ${column.wipLimit}`}\n              </span>\n              {/* WIP limit status indicator */}\n              {column.wipLimit && wipStatus.state !== 'none' && (\n                <span\n                  className=\"text-xs font-medium flex items-center\"\n                  title={`${wipStatus.percentage.toFixed(0)}% capacity${\n                    column.wipLimitType === 'hard'\n                      ? ' (Hard limit - blocks new cards)'\n                      : ' (Soft limit - shows warning)'\n                  }`}\n                >\n                  {wipStatus.state === 'exceeded' && (\n                    <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n                      <circle cx=\"8\" cy=\"8\" r=\"7\" fill=\"#EF4444\" opacity=\"0.9\" />\n                      <path d=\"M5 5L11 11M11 5L5 11\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n                    </svg>\n                  )}\n                  {wipStatus.state === 'warning' && (\n                    <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n                      <path d=\"M8 1L15 14H1L8 1Z\" fill=\"#F59E0B\" opacity=\"0.9\" />\n                      <path d=\"M8 6V9M8 11V11.5\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n                    </svg>\n                  )}\n                  {wipStatus.state === 'approaching' && (\n                    <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n                      <path d=\"M8 1L10 7H14L10 10L12 16L8 12L4 16L6 10L2 7H6L8 1Z\" fill=\"#FB923C\" opacity=\"0.9\" />\n                    </svg>\n                  )}\n                  {wipStatus.state === 'ok' && (\n                    <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n                      <circle cx=\"8\" cy=\"8\" r=\"7\" fill=\"#10B981\" opacity=\"0.9\" />\n                      <path d=\"M5 8L7 10L11 6\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n                    </svg>\n                  )}\n                </span>\n              )}\n              {(onColumnRename || onColumnDelete) && (\n                <ColumnMenu\n                  columnTitle={column.title}\n                  onRename={(newTitle) => onColumnRename?.(column.id, newTitle)}\n                  onDelete={onColumnDelete ? () => onColumnDelete(column.id) : undefined}\n                  isDeletable={isDeletable}\n                  locale={locale}\n                />\n              )}\n              {onToggleCollapse && (\n                <button\n                  onClick={onToggleCollapse}\n                  className=\"text-asakaa-text-tertiary hover:text-asakaa-text-primary\"\n                  aria-label={isCollapsed ? 'Expand column' : 'Collapse column'}\n                >\n                  {isCollapsed ? '▶' : '▼'}\n                </button>\n              )}\n            </div>\n          </div>\n        )}\n\n        {/* v2.0.0: Column metrics (below header) */}\n        {renderMetrics && renderMetrics(column, cards)}\n\n        {/* Cards */}\n        {!isCollapsed && (\n          <div\n            ref={parentRef}\n            className=\"asakaa-column-cards\"\n            style={{\n              maxHeight: useVirtualization ? '600px' : undefined,\n            }}\n          >\n            <SortableContext\n              items={cards.map((card) => card.id)}\n              strategy={verticalListSortingStrategy}\n            >\n              {cards.length === 0 ? (\n                // Empty state\n                renderEmptyState ? (\n                  renderEmptyState(column)\n                ) : (\n                  <div className=\"asakaa-drop-zone asakaa-empty\">\n                    <p>Drop cards here</p>\n                  </div>\n                )\n              ) : useVirtualization ? (\n                // Virtualized list\n                <div\n                  style={{\n                    height: `${virtualizer.getTotalSize()}px`,\n                    position: 'relative',\n                  }}\n                >\n                  {virtualizer.getVirtualItems().map((virtualItem) => {\n                    const card = cards[virtualItem.index]\n                    if (!card) return null\n\n                    return (\n                      <div\n                        key={card.id}\n                        style={{\n                          position: 'absolute',\n                          top: 0,\n                          left: 0,\n                          width: '100%',\n                          transform: `translateY(${virtualItem.start}px)`,\n                        }}\n                      >\n                        <Card\n                          card={card}\n                          render={renderCard}\n                          onClick={onCardClick}\n                          onUpdate={onCardUpdate}\n                          availableUsers={availableUsers}\n                          allCards={allCards}\n                        />\n                      </div>\n                    )\n                  })}\n                </div>\n              ) : (\n                // Regular list\n                cards.map((card) => (\n                  <Card\n                    key={card.id}\n                    card={card}\n                    render={renderCard}\n                    onClick={onCardClick}\n                    onUpdate={onCardUpdate}\n                    availableUsers={availableUsers}\n                    allCards={allCards}\n                  />\n                ))\n              )}\n            </SortableContext>\n          </div>\n        )}\n\n      </div>\n    )\n  }\n  // Memoization removed to allow card property updates to trigger re-renders\n  // The individual Card components are still memoized for performance\n)\n\nColumn.displayName = 'Column'\n","/**\r\n * Editable Column Title Component\r\n * Allows inline editing of column names\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface EditableColumnTitleProps {\r\n  title: string\r\n  onSave: (newTitle: string) => void\r\n  className?: string\r\n}\r\n\r\nexport function EditableColumnTitle({\r\n  title,\r\n  onSave,\r\n  className,\r\n}: EditableColumnTitleProps) {\r\n  const [isEditing, setIsEditing] = useState(false)\r\n  const [editValue, setEditValue] = useState(title)\r\n  const inputRef = useRef<HTMLInputElement>(null)\r\n\r\n  useEffect(() => {\r\n    if (isEditing && inputRef.current) {\r\n      inputRef.current.focus()\r\n      inputRef.current.select()\r\n    }\r\n  }, [isEditing])\r\n\r\n  const handleSave = () => {\r\n    const trimmed = editValue.trim()\r\n    if (trimmed && trimmed !== title) {\r\n      onSave(trimmed)\r\n    } else {\r\n      setEditValue(title)\r\n    }\r\n    setIsEditing(false)\r\n  }\r\n\r\n  const handleKeyDown = (e: React.KeyboardEvent) => {\r\n    if (e.key === 'Enter') {\r\n      handleSave()\r\n    } else if (e.key === 'Escape') {\r\n      setEditValue(title)\r\n      setIsEditing(false)\r\n    }\r\n  }\r\n\r\n  if (isEditing) {\r\n    return (\r\n      <input\r\n        ref={inputRef}\r\n        type=\"text\"\r\n        value={editValue}\r\n        onChange={(e) => setEditValue(e.target.value)}\r\n        onBlur={handleSave}\r\n        onKeyDown={handleKeyDown}\r\n        className={cn(\r\n          'asakaa-column-title bg-transparent border-b-2 border-[#00E5CC]',\r\n          'outline-none px-1 -ml-1',\r\n          className\r\n        )}\r\n        maxLength={50}\r\n      />\r\n    )\r\n  }\r\n\r\n  return (\r\n    <h2\r\n      className={cn('asakaa-column-title cursor-pointer', className)}\r\n      onClick={() => setIsEditing(true)}\r\n      title=\"Click to edit\"\r\n    >\r\n      {title}\r\n    </h2>\r\n  )\r\n}\r\n","/**\r\n * MentionInput Component\r\n * A textarea with @mention autocomplete functionality\r\n * @version 0.17.422 - Added emoji picker and file attachments\r\n */\r\n\r\nimport { useState, useRef, useEffect, useCallback, KeyboardEvent, ChangeEvent } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { Send, Smile, Paperclip, X, File, Image, FileText } from 'lucide-react';\r\nimport { cn } from '../../utils';\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface MentionUser {\r\n  id: string;\r\n  name: string;\r\n  email?: string;\r\n  avatar?: string;\r\n  avatarUrl?: string;\r\n  color?: string;\r\n}\r\n\r\n/** Attachment for comments */\r\nexport interface CommentAttachment {\r\n  id: string;\r\n  name: string;\r\n  url: string;\r\n  type: string;\r\n  size: number;\r\n}\r\n\r\n/** Pending file before upload */\r\nexport interface PendingFile {\r\n  id: string;\r\n  file: File;\r\n  preview?: string;\r\n}\r\n\r\nexport interface MentionInputProps {\r\n  value: string;\r\n  onChange: (value: string) => void;\r\n  onSubmit: () => void;\r\n  users: MentionUser[];\r\n  placeholder?: string;\r\n  disabled?: boolean;\r\n  isSubmitting?: boolean;\r\n  theme?: 'dark' | 'light';\r\n  locale?: 'en' | 'es';\r\n  currentUser?: {\r\n    id: string;\r\n    name: string;\r\n    avatarUrl?: string;\r\n    color?: string;\r\n  };\r\n  /** v0.17.422: Enable emoji picker */\r\n  enableEmoji?: boolean;\r\n  /** v0.17.422: Enable file attachments */\r\n  enableAttachments?: boolean;\r\n  /** v0.17.422: Pending files to attach */\r\n  pendingFiles?: PendingFile[];\r\n  /** v0.17.422: Callback when files are selected */\r\n  onFilesSelect?: (files: File[]) => void;\r\n  /** v0.17.422: Callback to remove a pending file */\r\n  onRemoveFile?: (fileId: string) => void;\r\n  /** v0.17.422: Max file size in MB */\r\n  maxFileSizeMB?: number;\r\n}\r\n\r\ninterface MentionMatch {\r\n  start: number;\r\n  end: number;\r\n  query: string;\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\n/**\r\n * Find the current @mention being typed\r\n */\r\nfunction findMentionMatch(text: string, cursorPosition: number): MentionMatch | null {\r\n  const beforeCursor = text.slice(0, cursorPosition);\r\n  const atIndex = beforeCursor.lastIndexOf('@');\r\n\r\n  if (atIndex === -1) return null;\r\n\r\n  // Check if @ is at start or preceded by whitespace\r\n  const charBefore = beforeCursor[atIndex - 1];\r\n  if (atIndex > 0 && charBefore && !/\\s/.test(charBefore)) {\r\n    return null;\r\n  }\r\n\r\n  const afterAt = beforeCursor.slice(atIndex + 1);\r\n\r\n  // If there's a space after @, the mention is complete\r\n  if (/\\s/.test(afterAt)) return null;\r\n\r\n  return {\r\n    start: atIndex,\r\n    end: cursorPosition,\r\n    query: afterAt.toLowerCase(),\r\n  };\r\n}\r\n\r\n/**\r\n * Extract all @mentions from text and return mentioned user IDs\r\n * Supports: @DivarParra (full name no spaces), @Divar (first name), @Parra (last name)\r\n */\r\nexport function extractMentionedUserIds(text: string, users: MentionUser[]): string[] {\r\n  const mentionedIds: string[] = [];\r\n  const mentionRegex = /@(\\S+)/g;\r\n  let match;\r\n\r\n  while ((match = mentionRegex.exec(text)) !== null) {\r\n    const mentionName = match[1]?.toLowerCase() ?? '';\r\n    if (!mentionName) continue;\r\n\r\n    const user = users.find(u => {\r\n      const fullNameLower = u.name.toLowerCase();\r\n      const fullNameNoSpaces = fullNameLower.replace(/\\s+/g, '');\r\n      const nameParts = fullNameLower.split(/\\s+/);\r\n\r\n      // Match full name (with or without spaces)\r\n      if (fullNameNoSpaces === mentionName || fullNameLower === mentionName) {\r\n        return true;\r\n      }\r\n\r\n      // Match any part of the name (first name, last name, etc.)\r\n      if (nameParts.some(part => part === mentionName)) {\r\n        return true;\r\n      }\r\n\r\n      return false;\r\n    });\r\n\r\n    if (user && !mentionedIds.includes(user.id)) {\r\n      mentionedIds.push(user.id);\r\n    }\r\n  }\r\n\r\n  return mentionedIds;\r\n}\r\n\r\n/**\r\n * Get initials from name\r\n */\r\nfunction getInitials(name: string): string {\r\n  return name\r\n    .split(' ')\r\n    .map(n => n[0])\r\n    .join('')\r\n    .toUpperCase()\r\n    .slice(0, 2);\r\n}\r\n\r\n/**\r\n * Format file size for display\r\n */\r\nfunction formatFileSize(bytes: number): string {\r\n  if (bytes < 1024) return `${bytes} B`;\r\n  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n  return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n}\r\n\r\n/**\r\n * Common emojis for quick picker\r\n */\r\nconst COMMON_EMOJIS = [\r\n  '😀', '😂', '🥰', '😍', '🤔', '👍', '👎', '🎉',\r\n  '🔥', '❤️', '💯', '✅', '❌', '⚠️', '📌', '💡',\r\n  '🚀', '⭐', '🎯', '💪', '🙏', '👀', '📝', '💬',\r\n];\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function MentionInput({\r\n  value,\r\n  onChange,\r\n  onSubmit,\r\n  users,\r\n  placeholder,\r\n  disabled = false,\r\n  isSubmitting = false,\r\n  theme = 'dark',\r\n  locale = 'es',\r\n  currentUser,\r\n  enableEmoji = true,\r\n  enableAttachments = true,\r\n  pendingFiles = [],\r\n  onFilesSelect,\r\n  onRemoveFile,\r\n  maxFileSizeMB = 10,\r\n}: MentionInputProps) {\r\n  const isDark = theme === 'dark';\r\n  const [showDropdown, setShowDropdown] = useState(false);\r\n  const [filteredUsers, setFilteredUsers] = useState<MentionUser[]>([]);\r\n  const [selectedIndex, setSelectedIndex] = useState(0);\r\n  const [mentionMatch, setMentionMatch] = useState<MentionMatch | null>(null);\r\n  const [showEmojiPicker, setShowEmojiPicker] = useState(false);\r\n\r\n  const inputRef = useRef<HTMLTextAreaElement>(null);\r\n  const dropdownRef = useRef<HTMLDivElement>(null);\r\n  const fileInputRef = useRef<HTMLInputElement>(null);\r\n  const emojiPickerRef = useRef<HTMLDivElement>(null);\r\n\r\n  // Filter users based on mention query\r\n  const updateMentionState = useCallback((text: string, cursorPos: number) => {\r\n    const match = findMentionMatch(text, cursorPos);\r\n    setMentionMatch(match);\r\n\r\n    if (match) {\r\n      const filtered = users.filter(user =>\r\n        user.name.toLowerCase().includes(match.query) ||\r\n        (user.email && user.email.toLowerCase().includes(match.query))\r\n      ).slice(0, 5);\r\n\r\n      setFilteredUsers(filtered);\r\n      setShowDropdown(filtered.length > 0);\r\n      setSelectedIndex(0);\r\n    } else {\r\n      setShowDropdown(false);\r\n      setFilteredUsers([]);\r\n    }\r\n  }, [users]);\r\n\r\n  // Handle text change\r\n  const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\r\n    const newValue = e.target.value;\r\n    onChange(newValue);\r\n    updateMentionState(newValue, e.target.selectionStart || 0);\r\n\r\n    // Auto-resize textarea\r\n    if (inputRef.current) {\r\n      inputRef.current.style.height = '24px'; // Reset to min height\r\n      const scrollHeight = inputRef.current.scrollHeight;\r\n      const maxHeight = 280; // Increased max height for more content\r\n      const newHeight = Math.min(scrollHeight, maxHeight);\r\n      inputRef.current.style.height = `${newHeight}px`;\r\n      // Only show scroll when content exceeds max height\r\n      inputRef.current.style.overflowY = scrollHeight > maxHeight ? 'auto' : 'hidden';\r\n    }\r\n  };\r\n\r\n  // Handle cursor position changes\r\n  const handleSelect = () => {\r\n    if (inputRef.current) {\r\n      updateMentionState(value, inputRef.current.selectionStart || 0);\r\n    }\r\n  };\r\n\r\n  // Insert mention into text\r\n  const insertMention = useCallback((user: MentionUser) => {\r\n    if (!mentionMatch || !inputRef.current) return;\r\n\r\n    const beforeMention = value.slice(0, mentionMatch.start);\r\n    const afterMention = value.slice(mentionMatch.end);\r\n    const mentionText = `@${user.name.replace(/\\s+/g, '')} `;\r\n\r\n    const newValue = beforeMention + mentionText + afterMention;\r\n    onChange(newValue);\r\n\r\n    setShowDropdown(false);\r\n    setMentionMatch(null);\r\n\r\n    setTimeout(() => {\r\n      if (inputRef.current) {\r\n        const newCursorPos = mentionMatch.start + mentionText.length;\r\n        inputRef.current.selectionStart = newCursorPos;\r\n        inputRef.current.selectionEnd = newCursorPos;\r\n        inputRef.current.focus();\r\n      }\r\n    }, 0);\r\n  }, [mentionMatch, value, onChange]);\r\n\r\n  // Handle keyboard navigation\r\n  const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\r\n    if (showDropdown && filteredUsers.length > 0) {\r\n      switch (e.key) {\r\n        case 'ArrowDown':\r\n          e.preventDefault();\r\n          setSelectedIndex(prev =>\r\n            prev < filteredUsers.length - 1 ? prev + 1 : 0\r\n          );\r\n          break;\r\n        case 'ArrowUp':\r\n          e.preventDefault();\r\n          setSelectedIndex(prev =>\r\n            prev > 0 ? prev - 1 : filteredUsers.length - 1\r\n          );\r\n          break;\r\n        case 'Enter': {\r\n          e.preventDefault();\r\n          const selectedUser = filteredUsers[selectedIndex];\r\n          if (selectedUser) insertMention(selectedUser);\r\n          break;\r\n        }\r\n        case 'Tab': {\r\n          e.preventDefault();\r\n          const tabSelectedUser = filteredUsers[selectedIndex];\r\n          if (tabSelectedUser) insertMention(tabSelectedUser);\r\n          break;\r\n        }\r\n        case 'Escape':\r\n          e.preventDefault();\r\n          setShowDropdown(false);\r\n          break;\r\n      }\r\n    } else if (e.key === 'Enter' && !e.shiftKey) {\r\n      e.preventDefault();\r\n      onSubmit();\r\n    }\r\n  };\r\n\r\n  // Close dropdown on click outside\r\n  useEffect(() => {\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      if (\r\n        dropdownRef.current &&\r\n        !dropdownRef.current.contains(e.target as Node) &&\r\n        inputRef.current &&\r\n        !inputRef.current.contains(e.target as Node)\r\n      ) {\r\n        setShowDropdown(false);\r\n      }\r\n      // Close emoji picker on click outside\r\n      if (\r\n        emojiPickerRef.current &&\r\n        !emojiPickerRef.current.contains(e.target as Node)\r\n      ) {\r\n        setShowEmojiPicker(false);\r\n      }\r\n    };\r\n\r\n    document.addEventListener('mousedown', handleClickOutside);\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, []);\r\n\r\n  // Insert emoji at cursor position\r\n  const insertEmoji = useCallback((emoji: string) => {\r\n    if (!inputRef.current) return;\r\n\r\n    const cursorPos = inputRef.current.selectionStart || value.length;\r\n    const newValue = value.slice(0, cursorPos) + emoji + value.slice(cursorPos);\r\n    onChange(newValue);\r\n    setShowEmojiPicker(false);\r\n\r\n    // Focus back and move cursor after emoji\r\n    setTimeout(() => {\r\n      if (inputRef.current) {\r\n        const newCursorPos = cursorPos + emoji.length;\r\n        inputRef.current.selectionStart = newCursorPos;\r\n        inputRef.current.selectionEnd = newCursorPos;\r\n        inputRef.current.focus();\r\n      }\r\n    }, 0);\r\n  }, [value, onChange]);\r\n\r\n  // Handle file selection\r\n  const handleFileSelect = useCallback((e: ChangeEvent<HTMLInputElement>) => {\r\n    if (!onFilesSelect || !e.target.files) return;\r\n\r\n    const files = Array.from(e.target.files);\r\n    const maxBytes = maxFileSizeMB * 1024 * 1024;\r\n\r\n    // Filter files by size\r\n    const validFiles = files.filter(file => {\r\n      if (file.size > maxBytes) {\r\n        console.warn(`File ${file.name} exceeds max size of ${maxFileSizeMB}MB`);\r\n        return false;\r\n      }\r\n      return true;\r\n    });\r\n\r\n    if (validFiles.length > 0) {\r\n      onFilesSelect(validFiles);\r\n    }\r\n\r\n    // Reset input\r\n    e.target.value = '';\r\n  }, [onFilesSelect, maxFileSizeMB]);\r\n\r\n  // Get file icon based on type\r\n  const getFileIcon = useCallback((file: File) => {\r\n    if (file.type.startsWith('image/')) return Image;\r\n    if (file.type.includes('pdf') || file.type.includes('document')) return FileText;\r\n    return File;\r\n  }, []);\r\n\r\n  // Scroll selected item into view\r\n  useEffect(() => {\r\n    if (showDropdown && dropdownRef.current) {\r\n      const selectedElement = dropdownRef.current.children[selectedIndex] as HTMLElement;\r\n      if (selectedElement) {\r\n        selectedElement.scrollIntoView({ block: 'nearest' });\r\n      }\r\n    }\r\n  }, [selectedIndex, showDropdown]);\r\n\r\n  return (\r\n    <div className=\"flex flex-col gap-2\">\r\n      {/* Pending Files Preview */}\r\n      {pendingFiles.length > 0 && (\r\n        <div className=\"flex flex-wrap gap-2\">\r\n          {pendingFiles.map((pf) => {\r\n            const FileIcon = getFileIcon(pf.file);\r\n            const isImage = pf.file.type.startsWith('image/');\r\n\r\n            return (\r\n              <div\r\n                key={pf.id}\r\n                className={cn(\r\n                  \"relative group flex items-center gap-2 px-2 py-1.5 rounded-lg\",\r\n                  isDark ? \"bg-white/10\" : \"bg-gray-100\"\r\n                )}\r\n              >\r\n                {/* Thumbnail or Icon */}\r\n                {isImage && pf.preview ? (\r\n                  <img src={pf.preview} alt={pf.file.name} className=\"w-6 h-6 rounded object-cover\" />\r\n                ) : (\r\n                  <FileIcon className={cn(\"w-4 h-4\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")} />\r\n                )}\r\n                <div className=\"flex-1 min-w-0 max-w-[120px]\">\r\n                  <p className={cn(\"text-xs truncate\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                    {pf.file.name}\r\n                  </p>\r\n                  <p className={cn(\"text-xs\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                    {formatFileSize(pf.file.size)}\r\n                  </p>\r\n                </div>\r\n                {/* Remove button */}\r\n                {onRemoveFile && (\r\n                  <button\r\n                    onClick={() => onRemoveFile(pf.id)}\r\n                    className={cn(\r\n                      \"p-0.5 rounded-full transition-colors\",\r\n                      isDark ? \"hover:bg-white/10 text-[#6B7280] hover:text-white\" : \"hover:bg-gray-200 text-gray-400 hover:text-gray-600\"\r\n                    )}\r\n                  >\r\n                    <X className=\"w-3 h-3\" />\r\n                  </button>\r\n                )}\r\n              </div>\r\n            );\r\n          })}\r\n        </div>\r\n      )}\r\n\r\n      <div className=\"flex items-start gap-2\">\r\n        {/* Current User Avatar */}\r\n        {currentUser && (\r\n          <div\r\n            className=\"w-6 h-6 rounded-full flex items-center justify-center text-white text-[10px] font-medium flex-shrink-0\"\r\n            style={{ backgroundColor: currentUser.color || '#8B5CF6' }}\r\n          >\r\n            {currentUser.name?.slice(0, 2).toUpperCase() || 'U'}\r\n          </div>\r\n        )}\r\n\r\n        <div className={cn(\"flex-1 relative min-w-0\")}>\r\n          <div className={cn(\r\n            \"flex items-end gap-1 px-2 py-2 rounded-lg\",\r\n            isDark ? \"bg-white/5\" : \"bg-white border border-gray-200\"\r\n          )}>\r\n            {/* Emoji Picker Button */}\r\n            {enableEmoji && (\r\n              <div className=\"relative\">\r\n                <button\r\n                  type=\"button\"\r\n                  onClick={() => setShowEmojiPicker(!showEmojiPicker)}\r\n                  disabled={disabled || isSubmitting}\r\n                  className={cn(\r\n                    \"p-1 rounded transition-colors flex-shrink-0\",\r\n                    isDark ? \"hover:bg-white/10 text-[#6B7280] hover:text-white\" : \"hover:bg-gray-100 text-gray-400 hover:text-gray-600\",\r\n                    (disabled || isSubmitting) && \"opacity-50\"\r\n                  )}\r\n                  title={locale === 'es' ? 'Emojis' : 'Emojis'}\r\n                >\r\n                  <Smile className=\"w-4 h-4\" />\r\n                </button>\r\n\r\n                {/* Emoji Picker Dropdown */}\r\n                <AnimatePresence>\r\n                  {showEmojiPicker && (\r\n                    <motion.div\r\n                      ref={emojiPickerRef}\r\n                      initial={{ opacity: 0, y: 5 }}\r\n                      animate={{ opacity: 1, y: 0 }}\r\n                      exit={{ opacity: 0, y: 5 }}\r\n                      className={cn(\r\n                        \"absolute bottom-full left-0 mb-2 p-2 rounded-lg shadow-xl z-50\",\r\n                        isDark ? \"bg-[#1A1D25] border border-white/10\" : \"bg-white border border-gray-200\"\r\n                      )}\r\n                    >\r\n                      <div className=\"grid grid-cols-8 gap-1 w-[200px]\">\r\n                        {COMMON_EMOJIS.map((emoji) => (\r\n                          <button\r\n                            key={emoji}\r\n                            type=\"button\"\r\n                            onClick={() => insertEmoji(emoji)}\r\n                            className={cn(\r\n                              \"w-6 h-6 flex items-center justify-center text-lg rounded transition-colors hover:scale-110\",\r\n                              isDark ? \"hover:bg-white/10\" : \"hover:bg-gray-100\"\r\n                            )}\r\n                          >\r\n                            {emoji}\r\n                          </button>\r\n                        ))}\r\n                      </div>\r\n                    </motion.div>\r\n                  )}\r\n                </AnimatePresence>\r\n              </div>\r\n            )}\r\n\r\n            {/* Attachment Button */}\r\n            {enableAttachments && onFilesSelect && (\r\n              <>\r\n                <button\r\n                  type=\"button\"\r\n                  onClick={() => fileInputRef.current?.click()}\r\n                  disabled={disabled || isSubmitting}\r\n                  className={cn(\r\n                    \"p-1.5 rounded transition-colors\",\r\n                    isDark ? \"hover:bg-white/10 text-[#6B7280] hover:text-white\" : \"hover:bg-gray-100 text-gray-400 hover:text-gray-600\",\r\n                    (disabled || isSubmitting) && \"opacity-50\"\r\n                  )}\r\n                  title={locale === 'es' ? 'Adjuntar archivo' : 'Attach file'}\r\n                >\r\n                  <Paperclip className=\"w-4 h-4\" />\r\n                </button>\r\n                <input\r\n                  ref={fileInputRef}\r\n                  type=\"file\"\r\n                  multiple\r\n                  onChange={handleFileSelect}\r\n                  className=\"hidden\"\r\n                  accept=\"image/*,.pdf,.doc,.docx,.xls,.xlsx,.txt,.zip\"\r\n                />\r\n              </>\r\n            )}\r\n\r\n            {/* Input - Textarea with auto-resize */}\r\n            <textarea\r\n              ref={inputRef}\r\n              value={value}\r\n              onChange={handleChange}\r\n              onSelect={handleSelect}\r\n              onKeyDown={handleKeyDown}\r\n              placeholder={placeholder || (locale === 'es' ? 'Escribe un comentario...' : 'Write a comment...')}\r\n              disabled={disabled || isSubmitting}\r\n              rows={1}\r\n              className={cn(\r\n                \"flex-1 bg-transparent text-sm outline-none min-w-[100px] resize-none py-0.5\",\r\n                isDark ? \"text-white placeholder:text-[#6B7280] scrollbar-slim\" : \"text-gray-900 placeholder:text-gray-400 scrollbar-slim-light\",\r\n                (disabled || isSubmitting) && \"opacity-50\"\r\n              )}\r\n              style={{\r\n                lineHeight: '1.5',\r\n                height: '24px',\r\n                maxHeight: '280px',\r\n                overflowY: 'hidden'\r\n              }}\r\n            />\r\n\r\n            {/* Send Button */}\r\n            <button\r\n              onClick={onSubmit}\r\n              disabled={isSubmitting || (!value.trim() && pendingFiles.length === 0) || disabled}\r\n              className={cn(\r\n                \"p-1.5 rounded transition-colors\",\r\n                (value.trim() || pendingFiles.length > 0) && !disabled\r\n                  ? (isDark ? \"bg-[#00E5CC] text-white hover:bg-[#00C4AE]\" : \"bg-[#00E5CC] text-white hover:bg-[#00C4AE]\")\r\n                  : (isDark ? \"text-[#6B7280]\" : \"text-gray-400\"),\r\n                isSubmitting && \"opacity-50 cursor-not-allowed\"\r\n              )}\r\n            >\r\n              {isSubmitting ? (\r\n                <div className=\"w-4 h-4 border-2 border-current border-t-transparent rounded-full animate-spin\" />\r\n              ) : (\r\n                <Send className=\"w-4 h-4\" />\r\n              )}\r\n            </button>\r\n          </div>\r\n\r\n          {/* Autocomplete Dropdown */}\r\n          <AnimatePresence>\r\n            {showDropdown && filteredUsers.length > 0 && (\r\n              <motion.div\r\n                ref={dropdownRef}\r\n                initial={{ opacity: 0, y: 5 }}\r\n                animate={{ opacity: 1, y: 0 }}\r\n                exit={{ opacity: 0, y: 5 }}\r\n                className={cn(\r\n                  \"absolute bottom-full left-0 right-0 mb-1 py-1 rounded-lg shadow-xl z-50\",\r\n                  \"max-h-[200px] overflow-y-auto\",\r\n                  isDark ? \"bg-[#1A1D25] border border-white/10\" : \"bg-white border border-gray-200\"\r\n                )}\r\n              >\r\n                {filteredUsers.map((user, index) => (\r\n                  <button\r\n                    key={user.id}\r\n                    type=\"button\"\r\n                    onClick={() => insertMention(user)}\r\n                    className={cn(\r\n                      \"w-full flex items-center gap-3 px-3 py-2 text-left transition-colors\",\r\n                      index === selectedIndex\r\n                        ? (isDark ? \"bg-white/10\" : \"bg-gray-100\")\r\n                        : (isDark ? \"hover:bg-white/5\" : \"hover:bg-gray-50\")\r\n                    )}\r\n                  >\r\n                    <div\r\n                      className=\"w-7 h-7 rounded-full flex items-center justify-center text-white text-xs font-medium flex-shrink-0\"\r\n                      style={{ backgroundColor: user.color || '#8B5CF6' }}\r\n                    >\r\n                      {getInitials(user.name)}\r\n                    </div>\r\n                    <div className=\"flex-1 min-w-0\">\r\n                      <p className={cn(\r\n                        \"text-sm font-medium truncate\",\r\n                        isDark ? \"text-white\" : \"text-gray-900\"\r\n                      )}>\r\n                        {user.name}\r\n                      </p>\r\n                      {user.email && (\r\n                        <p className={cn(\r\n                          \"text-xs truncate\",\r\n                          isDark ? \"text-[#6B7280]\" : \"text-gray-500\"\r\n                        )}>\r\n                          {user.email}\r\n                        </p>\r\n                      )}\r\n                    </div>\r\n                  </button>\r\n                ))}\r\n              </motion.div>\r\n            )}\r\n          </AnimatePresence>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\n/**\r\n * Render comment content with highlighted mentions\r\n */\r\nexport function CommentContent({\r\n  content,\r\n  theme = 'dark'\r\n}: {\r\n  content: string;\r\n  theme?: 'dark' | 'light';\r\n}) {\r\n  const isDark = theme === 'dark';\r\n  const parts: { type: 'text' | 'mention'; value: string }[] = [];\r\n  const mentionRegex = /@(\\S+)/g;\r\n  let lastIndex = 0;\r\n  let match;\r\n\r\n  while ((match = mentionRegex.exec(content)) !== null) {\r\n    if (match.index > lastIndex) {\r\n      parts.push({\r\n        type: 'text',\r\n        value: content.slice(lastIndex, match.index),\r\n      });\r\n    }\r\n    parts.push({\r\n      type: 'mention',\r\n      value: match[0],\r\n    });\r\n    lastIndex = match.index + match[0].length;\r\n  }\r\n\r\n  if (lastIndex < content.length) {\r\n    parts.push({\r\n      type: 'text',\r\n      value: content.slice(lastIndex),\r\n    });\r\n  }\r\n\r\n  return (\r\n    <span className=\"whitespace-pre-wrap break-words\">\r\n      {parts.map((part, index) => {\r\n        if (part.type === 'mention') {\r\n          return (\r\n            <span\r\n              key={index}\r\n              className={cn(\r\n                \"inline-flex items-center px-1 py-0.5 rounded\",\r\n                \"font-medium text-sm\",\r\n                isDark\r\n                  ? \"bg-[#00E5CC]/20 text-[#00E5CC]\"\r\n                  : \"bg-[#00E5CC]/15 text-[#00C4AE]\"\r\n              )}\r\n            >\r\n              {part.value}\r\n            </span>\r\n          );\r\n        }\r\n        return <span key={index}>{part.value}</span>;\r\n      })}\r\n    </span>\r\n  );\r\n}\r\n\r\nexport default MentionInput;\r\n","/**\r\n * TagPicker - ClickUp-style tag selector for tasks\r\n * v0.17.158: Initial implementation\r\n *\r\n * Features:\r\n * - Search existing tags\r\n * - Create new tags inline\r\n * - Color picker for new tags\r\n * - Multiple selection\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { Tag, Plus, X, Check, ChevronDown } from 'lucide-react';\r\nimport { TaskTag } from './types';\r\n\r\n// Predefined tag colors (ClickUp-style palette)\r\nconst TAG_COLORS = [\r\n  '#EF4444', // Red\r\n  '#F97316', // Orange\r\n  '#F59E0B', // Amber\r\n  '#EAB308', // Yellow\r\n  '#84CC16', // Lime\r\n  '#22C55E', // Green\r\n  '#10B981', // Emerald\r\n  '#00E5CC', // Teal\r\n  '#00E5CC', // Cyan\r\n  '#0EA5E9', // Sky\r\n  '#00E5CC', // Blue\r\n  '#6366F1', // Indigo\r\n  '#8B5CF6', // Violet\r\n  '#A855F7', // Purple\r\n  '#D946EF', // Fuchsia\r\n  '#EC4899', // Pink\r\n];\r\n\r\ninterface TagPickerProps {\r\n  /** Currently selected tags on the task */\r\n  selectedTags: TaskTag[];\r\n  /** All available tags in the workspace */\r\n  availableTags: TaskTag[];\r\n  /** Callback when tags change */\r\n  onChange: (tags: TaskTag[]) => void;\r\n  /** Callback to create a new tag */\r\n  onCreateTag?: (name: string, color: string) => Promise<TaskTag | null>;\r\n  /** Theme colors */\r\n  theme: any;\r\n  /** Disabled state */\r\n  disabled?: boolean;\r\n  /** Compact mode (pill style) */\r\n  compact?: boolean;\r\n}\r\n\r\nexport function TagPicker({\r\n  selectedTags,\r\n  availableTags,\r\n  onChange,\r\n  onCreateTag,\r\n  theme,\r\n  disabled = false,\r\n  compact: _compact = true,\r\n}: TagPickerProps) {\r\n  void _compact; // Suppress unused variable warning\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const [searchQuery, setSearchQuery] = useState('');\r\n  const [isCreating, setIsCreating] = useState(false);\r\n  const [newTagColor, setNewTagColor] = useState(TAG_COLORS[10] || '#00E5CC'); // Default blue\r\n  const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0 });\r\n  const containerRef = useRef<HTMLDivElement>(null);\r\n  const buttonRef = useRef<HTMLButtonElement>(null);\r\n  const dropdownRef = useRef<HTMLDivElement>(null);\r\n  const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n  // Filter available tags based on search\r\n  const filteredTags = availableTags.filter(tag =>\r\n    tag.name.toLowerCase().includes(searchQuery.toLowerCase())\r\n  );\r\n\r\n  // Check if search query matches an existing tag\r\n  const exactMatch = availableTags.some(\r\n    tag => tag.name.toLowerCase() === searchQuery.toLowerCase()\r\n  );\r\n\r\n  // Calculate dropdown position when opening\r\n  useEffect(() => {\r\n    if (isOpen && buttonRef.current) {\r\n      const rect = buttonRef.current.getBoundingClientRect();\r\n      setDropdownPosition({\r\n        top: rect.bottom + 6,\r\n        left: rect.left,\r\n      });\r\n    }\r\n  }, [isOpen]);\r\n\r\n  // Close on click outside\r\n  useEffect(() => {\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      const target = e.target as Node;\r\n      const isInsideContainer = containerRef.current?.contains(target);\r\n      const isInsideDropdown = dropdownRef.current?.contains(target);\r\n\r\n      if (!isInsideContainer && !isInsideDropdown) {\r\n        setIsOpen(false);\r\n        setSearchQuery('');\r\n        setIsCreating(false);\r\n      }\r\n    };\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n      return () => document.removeEventListener('mousedown', handleClickOutside);\r\n    }\r\n    return undefined;\r\n  }, [isOpen]);\r\n\r\n  // Focus input when opening\r\n  useEffect(() => {\r\n    if (isOpen && inputRef.current) {\r\n      inputRef.current.focus();\r\n    }\r\n  }, [isOpen]);\r\n\r\n  const handleToggleTag = (tag: TaskTag) => {\r\n    const isSelected = selectedTags.some(t => t.id === tag.id);\r\n    if (isSelected) {\r\n      onChange(selectedTags.filter(t => t.id !== tag.id));\r\n    } else {\r\n      onChange([...selectedTags, tag]);\r\n    }\r\n  };\r\n\r\n  const handleCreateTag = async () => {\r\n    if (!onCreateTag || !searchQuery.trim()) return;\r\n\r\n    setIsCreating(true);\r\n    try {\r\n      const newTag = await onCreateTag(searchQuery.trim(), newTagColor);\r\n      if (newTag) {\r\n        onChange([...selectedTags, newTag]);\r\n        setSearchQuery('');\r\n        setNewTagColor(TAG_COLORS[Math.floor(Math.random() * TAG_COLORS.length)] || '#00E5CC');\r\n      }\r\n    } finally {\r\n      setIsCreating(false);\r\n    }\r\n  };\r\n\r\n  const handleRemoveTag = (tagId: string, e: React.MouseEvent) => {\r\n    e.stopPropagation();\r\n    onChange(selectedTags.filter(t => t.id !== tagId));\r\n  };\r\n\r\n  const pillStyle = {\r\n    backgroundColor: `${theme.textTertiary}15`,\r\n    border: `1px solid ${theme.borderLight}`,\r\n    color: theme.textSecondary,\r\n  };\r\n\r\n  return (\r\n    <div ref={containerRef} className=\"relative\">\r\n      {/* Trigger Button */}\r\n      <button\r\n        ref={buttonRef}\r\n        type=\"button\"\r\n        onClick={() => !disabled && setIsOpen(!isOpen)}\r\n        className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-full text-sm transition-all hover:opacity-80\"\r\n        style={pillStyle}\r\n        disabled={disabled}\r\n      >\r\n        <Tag className=\"w-3.5 h-3.5\" />\r\n        {selectedTags.length > 0 ? (\r\n          <div className=\"flex items-center gap-1\">\r\n            {selectedTags.slice(0, 2).map(tag => (\r\n              <span\r\n                key={tag.id}\r\n                className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium\"\r\n                style={{ backgroundColor: `${tag.color}20`, color: tag.color }}\r\n              >\r\n                {tag.name}\r\n              </span>\r\n            ))}\r\n            {selectedTags.length > 2 && (\r\n              <span className=\"text-xs\" style={{ color: theme.textTertiary }}>\r\n                +{selectedTags.length - 2}\r\n              </span>\r\n            )}\r\n          </div>\r\n        ) : (\r\n          <span>Agregar</span>\r\n        )}\r\n        <ChevronDown className=\"w-3 h-3\" style={{ color: theme.textTertiary }} />\r\n      </button>\r\n\r\n      {/* Dropdown - rendered via Portal to escape overflow:hidden containers */}\r\n      {typeof document !== 'undefined' && createPortal(\r\n        <AnimatePresence>\r\n          {isOpen && (\r\n            <motion.div\r\n              ref={dropdownRef}\r\n              initial={{ opacity: 0, y: -5 }}\r\n              animate={{ opacity: 1, y: 0 }}\r\n              exit={{ opacity: 0, y: -5 }}\r\n              transition={{ duration: 0.12 }}\r\n              className=\"rounded-lg min-w-[240px]\"\r\n              style={{\r\n                position: 'fixed',\r\n                top: dropdownPosition.top,\r\n                left: dropdownPosition.left,\r\n                zIndex: 99999,\r\n                backgroundColor: theme.bgPrimary,\r\n                border: `1px solid ${theme.border}`,\r\n                boxShadow: '0 4px 20px rgba(0, 0, 0, 0.25)',\r\n              }}\r\n            >\r\n            {/* Search Input */}\r\n            <div className=\"p-2 border-b\" style={{ borderColor: theme.border }}>\r\n              <input\r\n                ref={inputRef}\r\n                type=\"text\"\r\n                value={searchQuery}\r\n                onChange={(e) => setSearchQuery(e.target.value)}\r\n                placeholder=\"Buscar o crear etiqueta...\"\r\n                className=\"w-full px-3 py-1.5 text-sm rounded-md outline-none\"\r\n                style={{\r\n                  backgroundColor: theme.bgSecondary,\r\n                  color: theme.textPrimary,\r\n                  border: `1px solid ${theme.borderLight}`,\r\n                }}\r\n                onKeyDown={(e) => {\r\n                  if (e.key === 'Enter' && searchQuery.trim() && !exactMatch && onCreateTag) {\r\n                    handleCreateTag();\r\n                  }\r\n                }}\r\n              />\r\n            </div>\r\n\r\n            {/* Selected Tags */}\r\n            {selectedTags.length > 0 && (\r\n              <div className=\"p-2 border-b\" style={{ borderColor: theme.border }}>\r\n                <p className=\"text-xs mb-1.5\" style={{ color: theme.textTertiary }}>\r\n                  Seleccionadas\r\n                </p>\r\n                <div className=\"flex flex-wrap gap-1\">\r\n                  {selectedTags.map(tag => (\r\n                    <span\r\n                      key={tag.id}\r\n                      className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium cursor-pointer hover:opacity-80\"\r\n                      style={{ backgroundColor: `${tag.color}20`, color: tag.color }}\r\n                      onClick={(e) => handleRemoveTag(tag.id, e)}\r\n                    >\r\n                      {tag.name}\r\n                      <X className=\"w-3 h-3\" />\r\n                    </span>\r\n                  ))}\r\n                </div>\r\n              </div>\r\n            )}\r\n\r\n            {/* Available Tags List */}\r\n            <div className=\"max-h-[200px] overflow-y-auto p-1\">\r\n              {filteredTags.length > 0 ? (\r\n                filteredTags.map(tag => {\r\n                  const isSelected = selectedTags.some(t => t.id === tag.id);\r\n                  return (\r\n                    <button\r\n                      key={tag.id}\r\n                      type=\"button\"\r\n                      onClick={() => handleToggleTag(tag)}\r\n                      className=\"w-full flex items-center gap-2 px-3 py-2 rounded-md text-sm transition-colors\"\r\n                      style={{\r\n                        backgroundColor: isSelected ? `${tag.color}15` : 'transparent',\r\n                        color: theme.textPrimary,\r\n                      }}\r\n                      onMouseEnter={(e) => {\r\n                        if (!isSelected) e.currentTarget.style.backgroundColor = theme.hoverBg;\r\n                      }}\r\n                      onMouseLeave={(e) => {\r\n                        if (!isSelected) e.currentTarget.style.backgroundColor = 'transparent';\r\n                      }}\r\n                    >\r\n                      <div\r\n                        className=\"w-3 h-3 rounded-full\"\r\n                        style={{ backgroundColor: tag.color }}\r\n                      />\r\n                      <span className=\"flex-1 text-left\">{tag.name}</span>\r\n                      {isSelected && (\r\n                        <Check className=\"w-4 h-4\" style={{ color: tag.color }} />\r\n                      )}\r\n                    </button>\r\n                  );\r\n                })\r\n              ) : searchQuery.trim() ? (\r\n                <div className=\"p-2 text-center text-sm\" style={{ color: theme.textTertiary }}>\r\n                  No se encontraron etiquetas\r\n                </div>\r\n              ) : (\r\n                <div className=\"p-2 text-center text-sm\" style={{ color: theme.textTertiary }}>\r\n                  No hay etiquetas disponibles\r\n                </div>\r\n              )}\r\n            </div>\r\n\r\n            {/* Create New Tag */}\r\n            {searchQuery.trim() && !exactMatch && onCreateTag && (\r\n              <div className=\"p-2 border-t\" style={{ borderColor: theme.border }}>\r\n                <div className=\"flex items-center gap-2 mb-2\">\r\n                  <p className=\"text-xs\" style={{ color: theme.textTertiary }}>\r\n                    Crear nueva etiqueta\r\n                  </p>\r\n                </div>\r\n\r\n                {/* Color Picker */}\r\n                <div className=\"flex flex-wrap gap-1 mb-2\">\r\n                  {TAG_COLORS.map(color => (\r\n                    <button\r\n                      key={color}\r\n                      type=\"button\"\r\n                      onClick={() => setNewTagColor(color)}\r\n                      className=\"w-5 h-5 rounded-full transition-transform hover:scale-110\"\r\n                      style={{\r\n                        backgroundColor: color,\r\n                        outline: newTagColor === color ? `2px solid ${color}` : 'none',\r\n                        outlineOffset: '2px',\r\n                      }}\r\n                    />\r\n                  ))}\r\n                </div>\r\n\r\n                {/* Create Button */}\r\n                <button\r\n                  type=\"button\"\r\n                  onClick={handleCreateTag}\r\n                  disabled={isCreating}\r\n                  className=\"w-full flex items-center justify-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors\"\r\n                  style={{\r\n                    backgroundColor: newTagColor,\r\n                    color: '#FFFFFF',\r\n                    opacity: isCreating ? 0.7 : 1,\r\n                  }}\r\n                >\r\n                  {isCreating ? (\r\n                    <div className=\"w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin\" />\r\n                  ) : (\r\n                    <Plus className=\"w-4 h-4\" />\r\n                  )}\r\n                  Crear \"{searchQuery.trim()}\"\r\n                </button>\r\n              </div>\r\n            )}\r\n          </motion.div>\r\n          )}\r\n        </AnimatePresence>,\r\n        document.body\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n\r\n/**\r\n * TagBadge - Small tag badge for displaying in cards/lists\r\n */\r\nexport function TagBadge({ tag, onRemove, size = 'sm' }: {\r\n  tag: TaskTag;\r\n  onRemove?: () => void;\r\n  size?: 'xs' | 'sm';\r\n}) {\r\n  const sizeClasses = size === 'xs'\r\n    ? 'px-1.5 py-0.5 text-[10px]'\r\n    : 'px-2 py-0.5 text-xs';\r\n\r\n  return (\r\n    <span\r\n      className={`inline-flex items-center gap-1 rounded-full font-medium ${sizeClasses}`}\r\n      style={{ backgroundColor: `${tag.color}20`, color: tag.color }}\r\n    >\r\n      {tag.name}\r\n      {onRemove && (\r\n        <button\r\n          type=\"button\"\r\n          onClick={(e) => {\r\n            e.stopPropagation();\r\n            onRemove();\r\n          }}\r\n          className=\"hover:opacity-70\"\r\n        >\r\n          <X className=\"w-3 h-3\" />\r\n        </button>\r\n      )}\r\n    </span>\r\n  );\r\n}\r\n\r\n/**\r\n * TagList - Display list of tags (for cards)\r\n */\r\nexport function TagList({\r\n  tags,\r\n  maxVisible = 3,\r\n  size = 'sm',\r\n}: {\r\n  tags: TaskTag[];\r\n  maxVisible?: number;\r\n  size?: 'xs' | 'sm';\r\n}) {\r\n  if (!tags || tags.length === 0) return null;\r\n\r\n  const visibleTags = tags.slice(0, maxVisible);\r\n  const hiddenCount = tags.length - maxVisible;\r\n\r\n  return (\r\n    <div className=\"flex flex-wrap gap-1\">\r\n      {visibleTags.map(tag => (\r\n        <TagBadge key={tag.id} tag={tag} size={size} />\r\n      ))}\r\n      {hiddenCount > 0 && (\r\n        <span\r\n          className={`inline-flex items-center rounded-full font-medium ${\r\n            size === 'xs' ? 'px-1.5 py-0.5 text-[10px]' : 'px-2 py-0.5 text-xs'\r\n          }`}\r\n          style={{ backgroundColor: 'rgba(100,100,100,0.2)', color: '#9CA3AF' }}\r\n        >\r\n          +{hiddenCount}\r\n        </span>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * ColorPicker Component - v0.17.187\r\n * Professional color selector for tasks with pastel palette\r\n * Fixed: All colors now clickable with pointerEvents none on inner circle\r\n */\r\n\r\nimport { Check } from 'lucide-react';\r\n\r\nexport interface TaskColor {\r\n  name: string;\r\n  value: string;\r\n  light: string;\r\n}\r\n\r\n// v0.17.112: Professional vibrant color palette - all colors are eye-catching\r\nexport const TASK_COLORS: TaskColor[] = [\r\n  { name: 'Azul', value: '#00E5CC', light: '#5AADFF' },\r\n  { name: 'Púrpura', value: '#A855F7', light: '#C084FC' },\r\n  { name: 'Rosa', value: '#EC4899', light: '#F472B6' },\r\n  { name: 'Rojo', value: '#EF4444', light: '#F87171' },\r\n  { name: 'Naranja', value: '#F59E0B', light: '#FBBF24' },\r\n  { name: 'Amarillo', value: '#EAB308', light: '#FACC15' },\r\n  { name: 'Lima', value: '#84CC16', light: '#A3E635' },\r\n  { name: 'Verde', value: '#10B981', light: '#34D399' },\r\n  { name: 'Esmeralda', value: '#059669', light: '#10B981' },\r\n  { name: 'Cyan', value: '#00E5CC', light: '#00E5CC' },\r\n  { name: 'Azul Cielo', value: '#0EA5E9', light: '#38BDF8' },\r\n  { name: 'Índigo', value: '#4F46E5', light: '#6366F1' },\r\n  { name: 'Violeta', value: '#8B5CF6', light: '#A78BFA' },\r\n  { name: 'Fucsia', value: '#D946EF', light: '#E879F9' },\r\n  { name: 'Coral', value: '#F97316', light: '#FB923C' },\r\n  { name: 'Magenta', value: '#E11D48', light: '#FB7185' },\r\n];\r\n\r\ninterface ColorPickerProps {\r\n  value?: string;\r\n  onChange: (color: string) => void;\r\n  disabled?: boolean;\r\n}\r\n\r\nexport function ColorPicker({ value = '#00E5CC', onChange, disabled = false }: ColorPickerProps) {\r\n  return (\r\n    <div className=\"space-y-2\">\r\n      {/* v0.17.187: Grid with larger click area (28px) and small visual circle (16px) */}\r\n      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(6, 28px)', gap: '2px' }}>\r\n        {TASK_COLORS.map((color) => {\r\n          const isSelected = value === color.value;\r\n\r\n          return (\r\n            <button\r\n              key={color.value}\r\n              type=\"button\"\r\n              onClick={(e) => {\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n                if (!disabled) onChange(color.value);\r\n              }}\r\n              style={{\r\n                width: '28px',\r\n                height: '28px',\r\n                borderRadius: '6px',\r\n                backgroundColor: 'transparent',\r\n                cursor: disabled ? 'not-allowed' : 'pointer',\r\n                border: 'none',\r\n                display: 'flex',\r\n                alignItems: 'center',\r\n                justifyContent: 'center',\r\n                padding: 0,\r\n                opacity: disabled ? 0.5 : 1,\r\n              }}\r\n              title={color.name}\r\n              disabled={disabled}\r\n            >\r\n              <span\r\n                style={{\r\n                  width: '16px',\r\n                  height: '16px',\r\n                  borderRadius: '50%',\r\n                  backgroundColor: color.value,\r\n                  outline: isSelected ? `2px solid ${color.value}` : 'none',\r\n                  outlineOffset: '2px',\r\n                  pointerEvents: 'none',\r\n                  display: 'flex',\r\n                  alignItems: 'center',\r\n                  justifyContent: 'center',\r\n                }}\r\n              >\r\n                {isSelected && (\r\n                  <Check className=\"w-3 h-3 text-white drop-shadow-md\" strokeWidth={3} style={{ pointerEvents: 'none' }} />\r\n                )}\r\n              </span>\r\n            </button>\r\n          );\r\n        })}\r\n      </div>\r\n\r\n      {/* Color name label */}\r\n      {value && (\r\n        <div className=\"text-xs text-center font-medium\" style={{ color: value }}>\r\n          {TASK_COLORS.find(c => c.value === value)?.name || 'Personalizado'}\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\n * TimePill - Compact time indicator component\n * v1.1.0: Shows logged time vs estimate with visual health indicator\n *\n * Displays: \"2h / 4h\" or \"2h\" (if no estimate)\n * Colors: green (on-track), yellow (at-risk), red (over-budget), gray (no estimate)\n */\n\nimport { cn } from '../../utils'\nimport type { TimeTrackingSummary } from '../../types'\n\nexport interface TimePillProps {\n  /** Time tracking summary data */\n  summary: TimeTrackingSummary\n  /** Size variant */\n  size?: 'sm' | 'md' | 'lg'\n  /** Show estimate in pill */\n  showEstimate?: boolean\n  /** Click handler (e.g., to open time popover) */\n  onClick?: () => void\n  /** Additional class names */\n  className?: string\n}\n\n/**\n * Format minutes as compact duration string\n */\nfunction formatDuration(minutes: number): string {\n  if (minutes < 60) {\n    return `${minutes}m`\n  }\n\n  const hours = Math.floor(minutes / 60)\n  const remainingMinutes = minutes % 60\n\n  if (remainingMinutes === 0) {\n    return `${hours}h`\n  }\n\n  return `${hours}h${remainingMinutes}m`\n}\n\n/**\n * Get color classes based on health status\n */\nfunction getHealthColors(health: TimeTrackingSummary['health']): {\n  text: string\n  bg: string\n  border: string\n} {\n  switch (health) {\n    case 'on-track':\n      return {\n        text: 'text-green-600 dark:text-green-400',\n        bg: 'bg-green-50 dark:bg-green-900/20',\n        border: 'border-green-200 dark:border-green-800',\n      }\n    case 'at-risk':\n      return {\n        text: 'text-yellow-600 dark:text-yellow-400',\n        bg: 'bg-yellow-50 dark:bg-yellow-900/20',\n        border: 'border-yellow-200 dark:border-yellow-800',\n      }\n    case 'over-budget':\n      return {\n        text: 'text-red-600 dark:text-red-400',\n        bg: 'bg-red-50 dark:bg-red-900/20',\n        border: 'border-red-200 dark:border-red-800',\n      }\n    case 'no-estimate':\n    default:\n      return {\n        text: 'text-gray-500 dark:text-gray-400',\n        bg: 'bg-gray-50 dark:bg-gray-800/50',\n        border: 'border-gray-200 dark:border-gray-700',\n      }\n  }\n}\n\n/**\n * Clock icon component\n */\nfunction ClockIcon({ className }: { className?: string }) {\n  return (\n    <svg\n      className={cn('w-3 h-3', className)}\n      fill=\"none\"\n      viewBox=\"0 0 24 24\"\n      stroke=\"currentColor\"\n      strokeWidth={2}\n    >\n      <circle cx=\"12\" cy=\"12\" r=\"10\" />\n      <path d=\"M12 6v6l4 2\" />\n    </svg>\n  )\n}\n\nexport function TimePill({\n  summary,\n  size = 'sm',\n  showEstimate = true,\n  onClick,\n  className,\n}: TimePillProps) {\n  const colors = getHealthColors(summary.health)\n\n  // Size classes\n  const sizeClasses = {\n    sm: 'text-xs px-1.5 py-0.5 gap-1',\n    md: 'text-sm px-2 py-1 gap-1.5',\n    lg: 'text-base px-2.5 py-1.5 gap-2',\n  }\n\n  const iconSizes = {\n    sm: 'w-3 h-3',\n    md: 'w-3.5 h-3.5',\n    lg: 'w-4 h-4',\n  }\n\n  // Format the display text\n  const loggedText = formatDuration(summary.loggedMinutes)\n  const estimateText = summary.estimateMinutes\n    ? formatDuration(summary.estimateMinutes)\n    : null\n\n  const displayText =\n    showEstimate && estimateText\n      ? `${loggedText} / ${estimateText}`\n      : loggedText\n\n  // Show nothing if no time logged and no estimate\n  if (summary.loggedMinutes === 0 && !summary.estimateMinutes) {\n    return null\n  }\n\n  const Component = onClick ? 'button' : 'span'\n\n  return (\n    <Component\n      className={cn(\n        'inline-flex items-center rounded-full border font-medium',\n        'transition-colors duration-150',\n        colors.text,\n        colors.bg,\n        colors.border,\n        sizeClasses[size],\n        onClick && 'cursor-pointer hover:opacity-80 focus:outline-none focus:ring-2 focus:ring-offset-1',\n        className\n      )}\n      onClick={onClick}\n      type={onClick ? 'button' : undefined}\n    >\n      <ClockIcon className={iconSizes[size]} />\n      <span>{displayText}</span>\n    </Component>\n  )\n}\n\nexport default TimePill\n","/**\n * Evaluate Excel-like formula inputs for hour fields.\n *\n * Supports:\n *   =8*9       → 72\n *   +18*9      → 162\n *   8*9        → 72  (bare arithmetic)\n *   =2+3*4    → 14  (standard math precedence)\n *   =(2+3)*4  → 20  (parentheses)\n *   =100/8    → 12.5\n *   =8+4      → 12\n *\n * Returns the numeric result (hours), or null if the input is not a formula.\n * Only allows digits, +, -, *, /, (, ), and whitespace — safe against injection.\n */\nexport function evaluateFormula(raw: string): number | null {\n  const trimmed = raw.trim();\n  if (!trimmed) return null;\n\n  let expr: string;\n\n  if (trimmed.startsWith('=')) {\n    expr = trimmed.slice(1).trim();\n  } else if (trimmed.startsWith('+') && /[*\\/()]/.test(trimmed)) {\n    expr = trimmed.slice(1).trim();\n  } else if (/^\\d[\\d\\s]*[*\\/]/.test(trimmed) || /^\\(/.test(trimmed)) {\n    expr = trimmed;\n  } else {\n    return null;\n  }\n\n  if (!expr) return null;\n\n  // Security: only allow safe characters\n  if (!/^[\\d+\\-*/().\\s]+$/.test(expr)) return null;\n\n  // Reject double operators\n  if (/[+\\-*/]{2,}/.test(expr.replace(/\\s/g, '').replace(/\\*-/g, 'X').replace(/\\/-/g, 'X'))) return null;\n\n  try {\n    // eslint-disable-next-line no-new-func\n    const result = new Function(`\"use strict\"; return (${expr});`)();\n    if (typeof result !== 'number' || !isFinite(result) || result < 0) return null;\n    return result;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Pre-process an input string: if it's a formula, evaluate and return as string.\n * Otherwise return the original string unchanged.\n */\nexport function preprocessFormulaInput(raw: string): string {\n  const result = evaluateFormula(raw);\n  if (result !== null) return String(result);\n  return raw;\n}\n","/**\r\n * TimePopover - Quick time logging popover\r\n * v1.1.0: Allows users to quickly log time or start a timer\r\n *\r\n * Features:\r\n * - Quick duration input (e.g., \"2h\", \"30m\", \"2:30\")\r\n * - Start/Stop timer button\r\n * - Set/update estimate\r\n * - View recent time entries\r\n */\r\n\r\nimport React, { useState, useRef, useEffect } from 'react'\r\nimport { cn } from '../../utils'\r\nimport { preprocessFormulaInput } from '../../utils/formulaEval'\r\nimport type { TimeEntry, TimeLogInput, TimeTrackingSummary } from '../../types'\r\n\r\nexport interface TimePopoverProps {\r\n  /** Task ID */\r\n  taskId: string\r\n  /** Time tracking summary */\r\n  summary: TimeTrackingSummary\r\n  /** Recent time entries */\r\n  entries?: TimeEntry[]\r\n  /** Whether timer is running for this task */\r\n  isTimerRunning?: boolean\r\n  /** Timer elapsed seconds (when running) */\r\n  timerElapsedSeconds?: number\r\n  /** Callback to log time */\r\n  onLogTime?: (input: TimeLogInput) => Promise<void>\r\n  /** Callback to update estimate */\r\n  onUpdateEstimate?: (minutes: number | null) => Promise<void>\r\n  /** Callback to start timer */\r\n  onStartTimer?: () => void\r\n  /** Callback to stop timer */\r\n  onStopTimer?: () => void\r\n  /** Callback to discard timer */\r\n  onDiscardTimer?: () => void\r\n  /** Close popover callback */\r\n  onClose?: () => void\r\n  /** Position anchor element */\r\n  anchorEl?: HTMLElement | null\r\n  /** Additional class names */\r\n  className?: string\r\n}\r\n\r\n/**\r\n * Parse duration string to minutes\r\n */\r\nfunction parseDuration(input: string): number {\r\n  const processed = preprocessFormulaInput(input)\r\n  const trimmed = processed.trim().toLowerCase()\r\n\r\n  // Format: \"2:30\" (hours:minutes)\r\n  if (trimmed.includes(':')) {\r\n    const [hours, minutes] = trimmed.split(':').map(Number)\r\n    return (hours || 0) * 60 + (minutes || 0)\r\n  }\r\n\r\n  // Format: \"2h 30m\" or \"2h\" or \"30m\"\r\n  const hourMatch = trimmed.match(/(\\d+(?:\\.\\d+)?)\\s*h/)\r\n  const minuteMatch = trimmed.match(/(\\d+)\\s*m/)\r\n\r\n  if (hourMatch || minuteMatch) {\r\n    const hours = hourMatch?.[1] ? parseFloat(hourMatch[1]) : 0\r\n    const minutes = minuteMatch?.[1] ? parseInt(minuteMatch[1], 10) : 0\r\n    return Math.round(hours * 60) + minutes\r\n  }\r\n\r\n  // Format: plain number (assume HOURS, not minutes)\r\n  // e.g., \"100\" = 100 hours = 6000 minutes\r\n  const plainNumber = parseFloat(trimmed)\r\n  if (!isNaN(plainNumber)) {\r\n    return Math.round(plainNumber * 60)\r\n  }\r\n\r\n  return 0\r\n}\r\n\r\n/**\r\n * Format minutes as duration string\r\n */\r\nfunction formatDuration(minutes: number): string {\r\n  if (minutes < 60) {\r\n    return `${minutes}m`\r\n  }\r\n\r\n  const hours = Math.floor(minutes / 60)\r\n  const remainingMinutes = minutes % 60\r\n\r\n  if (remainingMinutes === 0) {\r\n    return `${hours}h`\r\n  }\r\n\r\n  return `${hours}h ${remainingMinutes}m`\r\n}\r\n\r\n/**\r\n * Format seconds as timer display (HH:MM:SS)\r\n */\r\nfunction formatTimerDisplay(seconds: number): string {\r\n  const h = Math.floor(seconds / 3600)\r\n  const m = Math.floor((seconds % 3600) / 60)\r\n  const s = seconds % 60\r\n\r\n  if (h > 0) {\r\n    return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`\r\n  }\r\n\r\n  return `${m}:${s.toString().padStart(2, '0')}`\r\n}\r\n\r\n/**\r\n * Play icon\r\n */\r\nfunction PlayIcon({ className }: { className?: string }) {\r\n  return (\r\n    <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n      <path d=\"M8 5v14l11-7z\" />\r\n    </svg>\r\n  )\r\n}\r\n\r\n/**\r\n * Stop icon\r\n */\r\nfunction StopIcon({ className }: { className?: string }) {\r\n  return (\r\n    <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n      <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"1\" />\r\n    </svg>\r\n  )\r\n}\r\n\r\n/**\r\n * X icon for discard\r\n */\r\nfunction XIcon({ className }: { className?: string }) {\r\n  return (\r\n    <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\r\n      <path d=\"M6 18L18 6M6 6l12 12\" />\r\n    </svg>\r\n  )\r\n}\r\n\r\n/**\r\n * Clock icon\r\n */\r\nfunction ClockIcon({ className }: { className?: string }) {\r\n  return (\r\n    <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\r\n      <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n      <path d=\"M12 6v6l4 2\" />\r\n    </svg>\r\n  )\r\n}\r\n\r\nexport function TimePopover({\r\n  taskId: _taskId,\r\n  summary,\r\n  entries = [],\r\n  isTimerRunning = false,\r\n  timerElapsedSeconds = 0,\r\n  onLogTime,\r\n  onUpdateEstimate,\r\n  onStartTimer,\r\n  onStopTimer,\r\n  onDiscardTimer,\r\n  onClose,\r\n  className,\r\n}: TimePopoverProps) {\r\n  const [durationInput, setDurationInput] = useState('')\r\n  const [estimateInput, setEstimateInput] = useState(\r\n    summary.estimateMinutes ? formatDuration(summary.estimateMinutes) : ''\r\n  )\r\n  const [noteInput, setNoteInput] = useState('')\r\n  const [isLogging, setIsLogging] = useState(false)\r\n  const [showEstimateEdit, setShowEstimateEdit] = useState(false)\r\n  const inputRef = useRef<HTMLInputElement>(null)\r\n\r\n  // Focus input on mount\r\n  useEffect(() => {\r\n    inputRef.current?.focus()\r\n  }, [])\r\n\r\n  // Handle log time submit\r\n  const handleLogTime = async () => {\r\n    const minutes = parseDuration(durationInput)\r\n    if (minutes <= 0 || !onLogTime) return\r\n\r\n    setIsLogging(true)\r\n    try {\r\n      await onLogTime({\r\n        durationMinutes: minutes,\r\n        note: noteInput.trim() || undefined,\r\n        source: 'manual',\r\n      })\r\n      setDurationInput('')\r\n      setNoteInput('')\r\n    } finally {\r\n      setIsLogging(false)\r\n    }\r\n  }\r\n\r\n  // Handle estimate update\r\n  const handleUpdateEstimate = async () => {\r\n    if (!onUpdateEstimate) return\r\n\r\n    const minutes = estimateInput.trim() ? parseDuration(estimateInput) : null\r\n    await onUpdateEstimate(minutes)\r\n    setShowEstimateEdit(false)\r\n  }\r\n\r\n  // Handle key press\r\n  const handleKeyDown = (e: React.KeyboardEvent) => {\r\n    if (e.key === 'Enter' && !e.shiftKey) {\r\n      e.preventDefault()\r\n      handleLogTime()\r\n    }\r\n    if (e.key === 'Escape') {\r\n      onClose?.()\r\n    }\r\n  }\r\n\r\n  return (\r\n    <div\r\n      className={cn(\r\n        'w-72 bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700',\r\n        'divide-y divide-gray-100 dark:divide-gray-700',\r\n        className\r\n      )}\r\n    >\r\n      {/* Header */}\r\n      <div className=\"px-3 py-2 flex items-center justify-between\">\r\n        <span className=\"text-sm font-medium text-gray-700 dark:text-gray-200\">\r\n          Time Tracking\r\n        </span>\r\n        <button\r\n          onClick={onClose}\r\n          className=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-400\"\r\n        >\r\n          <XIcon className=\"w-4 h-4\" />\r\n        </button>\r\n      </div>\r\n\r\n      {/* Timer Section */}\r\n      <div className=\"px-3 py-2\">\r\n        {isTimerRunning ? (\r\n          <div className=\"flex items-center gap-2\">\r\n            <div className=\"flex-1 flex items-center gap-2\">\r\n              <span className=\"relative flex h-2 w-2\">\r\n                <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75\" />\r\n                <span className=\"relative inline-flex rounded-full h-2 w-2 bg-green-500\" />\r\n              </span>\r\n              <span className=\"text-lg font-mono font-medium text-gray-900 dark:text-white\">\r\n                {formatTimerDisplay(timerElapsedSeconds)}\r\n              </span>\r\n            </div>\r\n            <button\r\n              onClick={onStopTimer}\r\n              className=\"p-2 rounded-lg bg-green-500 hover:bg-green-600 text-white\"\r\n              title=\"Stop and save\"\r\n            >\r\n              <StopIcon className=\"w-4 h-4\" />\r\n            </button>\r\n            <button\r\n              onClick={onDiscardTimer}\r\n              className=\"p-2 rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 text-gray-600 dark:text-gray-300\"\r\n              title=\"Discard\"\r\n            >\r\n              <XIcon className=\"w-4 h-4\" />\r\n            </button>\r\n          </div>\r\n        ) : (\r\n          <button\r\n            onClick={onStartTimer}\r\n            className={cn(\r\n              'w-full flex items-center justify-center gap-2 px-3 py-2 rounded-lg',\r\n              'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600',\r\n              'text-gray-700 dark:text-gray-200 font-medium text-sm'\r\n            )}\r\n          >\r\n            <PlayIcon className=\"w-4 h-4\" />\r\n            Start Timer\r\n          </button>\r\n        )}\r\n      </div>\r\n\r\n      {/* Quick Log Section */}\r\n      <div className=\"px-3 py-2 space-y-2\">\r\n        <div className=\"flex gap-2\">\r\n          <div className=\"relative flex-1\">\r\n            <ClockIcon className=\"absolute left-2 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400\" />\r\n            <input\r\n              ref={inputRef}\r\n              type=\"text\"\r\n              value={durationInput}\r\n              onChange={(e) => setDurationInput(e.target.value)}\r\n              onKeyDown={handleKeyDown}\r\n              placeholder=\"8 (=8h), 2h 30m\"\r\n              className={cn(\r\n                'w-full pl-8 pr-3 py-1.5 text-sm rounded-lg',\r\n                'bg-gray-50 dark:bg-gray-700 border border-gray-200 dark:border-gray-600',\r\n                'text-gray-900 dark:text-white placeholder-gray-400',\r\n                'focus:outline-none focus:ring-2 focus:ring-[#00E5CC] focus:border-transparent'\r\n              )}\r\n            />\r\n          </div>\r\n          <button\r\n            onClick={handleLogTime}\r\n            disabled={isLogging || !durationInput.trim()}\r\n            className={cn(\r\n              'px-3 py-1.5 rounded-lg text-sm font-medium',\r\n              'bg-[#00E5CC] hover:bg-[#00C4AE] text-white',\r\n              'disabled:opacity-50 disabled:cursor-not-allowed'\r\n            )}\r\n          >\r\n            Log\r\n          </button>\r\n        </div>\r\n        <input\r\n          type=\"text\"\r\n          value={noteInput}\r\n          onChange={(e) => setNoteInput(e.target.value)}\r\n          onKeyDown={handleKeyDown}\r\n          placeholder=\"Note (optional)\"\r\n          className={cn(\r\n            'w-full px-3 py-1.5 text-sm rounded-lg',\r\n            'bg-gray-50 dark:bg-gray-700 border border-gray-200 dark:border-gray-600',\r\n            'text-gray-900 dark:text-white placeholder-gray-400',\r\n            'focus:outline-none focus:ring-2 focus:ring-[#00E5CC] focus:border-transparent'\r\n          )}\r\n        />\r\n      </div>\r\n\r\n      {/* Summary Section */}\r\n      <div className=\"px-3 py-2\">\r\n        <div className=\"flex justify-between text-sm\">\r\n          <span className=\"text-gray-500 dark:text-gray-400\">Logged</span>\r\n          <span className=\"font-medium text-gray-900 dark:text-white\">\r\n            {formatDuration(summary.loggedMinutes)}\r\n          </span>\r\n        </div>\r\n        <div className=\"flex justify-between text-sm mt-1\">\r\n          <span className=\"text-gray-500 dark:text-gray-400\">Estimate</span>\r\n          {showEstimateEdit ? (\r\n            <div className=\"flex items-center gap-1\">\r\n              <input\r\n                type=\"text\"\r\n                value={estimateInput}\r\n                onChange={(e) => setEstimateInput(e.target.value)}\r\n                onKeyDown={(e) => {\r\n                  if (e.key === 'Enter') handleUpdateEstimate()\r\n                  if (e.key === 'Escape') setShowEstimateEdit(false)\r\n                }}\r\n                onBlur={handleUpdateEstimate}\r\n                autoFocus\r\n                className=\"w-16 px-1 py-0.5 text-sm text-right rounded border border-[#00E5CC] bg-transparent focus:outline-none\"\r\n                placeholder=\"4h\"\r\n              />\r\n            </div>\r\n          ) : (\r\n            <button\r\n              onClick={() => setShowEstimateEdit(true)}\r\n              className=\"font-medium text-gray-900 dark:text-white hover:text-[#00E5CC]\"\r\n            >\r\n              {summary.estimateMinutes\r\n                ? formatDuration(summary.estimateMinutes)\r\n                : 'Set estimate'}\r\n            </button>\r\n          )}\r\n        </div>\r\n        {summary.progressPercent !== null && (\r\n          <div className=\"mt-2\">\r\n            <div className=\"flex justify-between text-xs mb-1\">\r\n              <span className=\"text-gray-500 dark:text-gray-400\">Progress</span>\r\n              <span\r\n                className={cn(\r\n                  'font-medium',\r\n                  summary.health === 'on-track' && 'text-green-600',\r\n                  summary.health === 'at-risk' && 'text-yellow-600',\r\n                  summary.health === 'over-budget' && 'text-red-600'\r\n                )}\r\n              >\r\n                {summary.progressPercent}%\r\n              </span>\r\n            </div>\r\n            <div className=\"h-1.5 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\">\r\n              <div\r\n                className={cn(\r\n                  'h-full transition-all duration-300',\r\n                  summary.health === 'on-track' && 'bg-green-500',\r\n                  summary.health === 'at-risk' && 'bg-yellow-500',\r\n                  summary.health === 'over-budget' && 'bg-red-500'\r\n                )}\r\n                style={{ width: `${Math.min(100, summary.progressPercent)}%` }}\r\n              />\r\n            </div>\r\n          </div>\r\n        )}\r\n      </div>\r\n\r\n      {/* Recent Entries */}\r\n      {entries.length > 0 && (\r\n        <div className=\"px-3 py-2\">\r\n          <div className=\"text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\r\n            Recent Entries\r\n          </div>\r\n          <div className=\"space-y-1 max-h-24 overflow-y-auto\">\r\n            {entries.slice(0, 3).map((entry) => (\r\n              <div\r\n                key={entry.id}\r\n                className=\"flex items-center justify-between text-xs text-gray-600 dark:text-gray-300\"\r\n              >\r\n                <span className=\"truncate flex-1\">{entry.note || 'Time logged'}</span>\r\n                <span className=\"font-medium ml-2\">\r\n                  {formatDuration(entry.durationMinutes)}\r\n                </span>\r\n              </div>\r\n            ))}\r\n          </div>\r\n        </div>\r\n      )}\r\n    </div>\r\n  )\r\n}\r\n\r\nexport default TimePopover\r\n","/**\r\n * TimeInputPopover - Chronos V2 micro-popover for time entry\r\n * Glass morphism design matching ListView Chronos style\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\nimport { Clock, X } from 'lucide-react';\r\nimport { cn } from '../../utils';\r\nimport { preprocessFormulaInput } from '../../utils/formulaEval';\r\n\r\nexport interface TimeInputPopoverProps {\r\n  mode: 'estimate' | 'quoted' | 'log';\r\n  locale: 'en' | 'es';\r\n  isDark: boolean;\r\n  currentValue?: number | null;\r\n  onSave: (minutes: number | null, note?: string) => Promise<void>;\r\n  onClose: () => void;\r\n  className?: string;\r\n}\r\n\r\nfunction parseDurationToMinutes(input: string): number | null {\r\n  const processed = preprocessFormulaInput(input);\r\n  const trimmed = processed.trim().toLowerCase();\r\n  if (!trimmed || trimmed === '-') return null;\r\n\r\n  if (trimmed.includes(':')) {\r\n    const [hours, minutes] = trimmed.split(':').map(Number);\r\n    return (hours || 0) * 60 + (minutes || 0);\r\n  }\r\n\r\n  const hourMatch = trimmed.match(/(\\d+(?:\\.\\d+)?)\\s*h/);\r\n  const minuteMatch = trimmed.match(/(\\d+)\\s*m/);\r\n\r\n  if (hourMatch || minuteMatch) {\r\n    const hours = hourMatch?.[1] ? parseFloat(hourMatch[1]) : 0;\r\n    const minutes = minuteMatch?.[1] ? parseInt(minuteMatch[1], 10) : 0;\r\n    return Math.round(hours * 60) + minutes;\r\n  }\r\n\r\n  const plainNumber = parseFloat(trimmed);\r\n  if (!isNaN(plainNumber)) return Math.round(plainNumber * 60);\r\n\r\n  return null;\r\n}\r\n\r\nfunction formatMinutesToDuration(minutes: number | null | undefined): string {\r\n  if (!minutes || minutes === 0) return '';\r\n  const hours = Math.floor(minutes / 60);\r\n  const remainingMinutes = minutes % 60;\r\n  if (hours === 0) return `${remainingMinutes}m`;\r\n  if (remainingMinutes === 0) return `${hours}h`;\r\n  return `${hours}h ${remainingMinutes}m`;\r\n}\r\n\r\nexport function TimeInputPopover({\r\n  mode,\r\n  locale,\r\n  isDark,\r\n  currentValue,\r\n  onSave,\r\n  onClose,\r\n  className,\r\n}: TimeInputPopoverProps) {\r\n  const [durationInput, setDurationInput] = useState(formatMinutesToDuration(currentValue));\r\n  const [note, setNote] = useState('');\r\n  const [isSaving, setIsSaving] = useState(false);\r\n  const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n  useEffect(() => {\r\n    inputRef.current?.focus();\r\n  }, []);\r\n\r\n  const handleSave = async () => {\r\n    setIsSaving(true);\r\n    const totalMinutes = parseDurationToMinutes(durationInput);\r\n    await onSave(totalMinutes && totalMinutes > 0 ? totalMinutes : null, note || undefined);\r\n    setIsSaving(false);\r\n  };\r\n\r\n  const handleClear = async () => {\r\n    setIsSaving(true);\r\n    await onSave(null);\r\n    setIsSaving(false);\r\n  };\r\n\r\n  const handleKeyDown = (e: React.KeyboardEvent) => {\r\n    if (e.key === 'Enter' && !e.shiftKey) {\r\n      e.preventDefault();\r\n      handleSave();\r\n    }\r\n    if (e.key === 'Escape') onClose();\r\n  };\r\n\r\n  const titles = {\r\n    estimate: locale === 'es' ? 'Estimación' : 'Estimate',\r\n    quoted: locale === 'es' ? 'T. Ofertado' : 'Quoted',\r\n    log: locale === 'es' ? 'Registrar' : 'Log Time',\r\n  };\r\n\r\n  const isEs = locale === 'es';\r\n\r\n  return (\r\n    <div\r\n      className={cn(\"w-56\", className)}\r\n      style={{\r\n        background: isDark ? 'rgba(10, 10, 10, 0.95)' : '#FFFFFF',\r\n        border: isDark ? '1px solid rgba(255,255,255,0.10)' : '1px solid #E5E7EB',\r\n        borderRadius: '8px',\r\n        boxShadow: isDark\r\n          ? '0 8px 32px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.05)'\r\n          : '0 8px 32px rgba(0,0,0,0.12)',\r\n        backdropFilter: 'blur(16px)',\r\n      }}\r\n      onClick={(e) => e.stopPropagation()}\r\n    >\r\n      {/* Header */}\r\n      <div\r\n        className=\"flex items-center justify-between px-3 py-2\"\r\n        style={{\r\n          borderBottom: isDark ? '1px solid rgba(255,255,255,0.06)' : '1px solid #F3F4F6',\r\n        }}\r\n      >\r\n        <div className=\"flex items-center gap-1.5\">\r\n          <Clock\r\n            className=\"w-3 h-3\"\r\n            style={{ color: isDark ? '#007FFF' : '#00E5CC' }}\r\n          />\r\n          <span\r\n            className=\"font-mono uppercase tracking-wider\"\r\n            style={{\r\n              fontSize: '10px',\r\n              fontWeight: 600,\r\n              color: isDark ? 'rgba(255,255,255,0.5)' : '#6B7280',\r\n            }}\r\n          >\r\n            {titles[mode]}\r\n          </span>\r\n        </div>\r\n        <button\r\n          type=\"button\"\r\n          onClick={onClose}\r\n          className=\"p-0.5 rounded transition-colors\"\r\n          style={{ color: isDark ? 'rgba(255,255,255,0.3)' : '#9CA3AF' }}\r\n        >\r\n          <X className=\"w-3 h-3\" />\r\n        </button>\r\n      </div>\r\n\r\n      {/* Body */}\r\n      <div className=\"p-3 space-y-2\">\r\n        {/* Duration Input */}\r\n        <input\r\n          ref={inputRef}\r\n          type=\"text\"\r\n          value={durationInput}\r\n          onChange={(e) => setDurationInput(e.target.value)}\r\n          onKeyDown={handleKeyDown}\r\n          placeholder=\"2h 30m\"\r\n          className=\"w-full font-mono outline-none\"\r\n          style={{\r\n            fontSize: '13px',\r\n            fontWeight: 700,\r\n            padding: '6px 10px',\r\n            borderRadius: '4px',\r\n            border: isDark ? '1px solid #333' : '1px solid #E5E7EB',\r\n            background: isDark ? '#1A1A1A' : '#F9FAFB',\r\n            color: isDark ? '#FFFFFF' : '#111827',\r\n          }}\r\n        />\r\n        <p\r\n          className=\"font-mono\"\r\n          style={{\r\n            fontSize: '9px',\r\n            color: isDark ? 'rgba(255,255,255,0.25)' : '#9CA3AF',\r\n            letterSpacing: '0.02em',\r\n          }}\r\n        >\r\n          {isEs ? '8=8h · 1h 30m · 45m · =8*9' : '8=8h · 1h 30m · 45m · =8*9'}\r\n        </p>\r\n\r\n        {/* Note field for log mode */}\r\n        {mode === 'log' && (\r\n          <input\r\n            type=\"text\"\r\n            value={note}\r\n            onChange={(e) => setNote(e.target.value)}\r\n            onKeyDown={handleKeyDown}\r\n            placeholder={isEs ? 'Nota (opcional)' : 'Note (optional)'}\r\n            className=\"w-full outline-none\"\r\n            style={{\r\n              fontSize: '11px',\r\n              padding: '5px 10px',\r\n              borderRadius: '4px',\r\n              border: isDark ? '1px solid #333' : '1px solid #E5E7EB',\r\n              background: isDark ? '#1A1A1A' : '#F9FAFB',\r\n              color: isDark ? 'rgba(255,255,255,0.7)' : '#374151',\r\n            }}\r\n          />\r\n        )}\r\n\r\n        {/* Save Button */}\r\n        <button\r\n          type=\"button\"\r\n          onClick={handleSave}\r\n          disabled={isSaving || !durationInput.trim()}\r\n          className=\"w-full font-mono uppercase tracking-wider transition-all disabled:opacity-30 disabled:cursor-not-allowed\"\r\n          style={{\r\n            fontSize: '10px',\r\n            fontWeight: 600,\r\n            padding: '6px 0',\r\n            borderRadius: '4px',\r\n            border: isDark ? '1px solid rgba(0, 229, 204,0.3)' : '1px solid #00E5CC',\r\n            background: isDark ? 'rgba(0, 229, 204,0.15)' : '#00E5CC',\r\n            color: isDark ? '#007FFF' : '#FFFFFF',\r\n          }}\r\n        >\r\n          {isSaving\r\n            ? (isEs ? 'Guardando...' : 'Saving...')\r\n            : (isEs ? 'Registrar' : 'Save')}\r\n        </button>\r\n\r\n        {/* Clear button for estimate/quoted */}\r\n        {currentValue && mode !== 'log' && (\r\n          <button\r\n            type=\"button\"\r\n            onClick={handleClear}\r\n            disabled={isSaving}\r\n            className=\"w-full font-mono uppercase tracking-wider transition-colors\"\r\n            style={{\r\n              fontSize: '9px',\r\n              padding: '4px 0',\r\n              color: isDark ? 'rgba(255,255,255,0.3)' : '#9CA3AF',\r\n            }}\r\n          >\r\n            {isEs ? 'Quitar' : 'Clear'}\r\n          </button>\r\n        )}\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\nexport default TimeInputPopover;\r\n","/**\n * HealthBar - Visual progress bar with health status colors\n * v1.1.0: Shows time progress with color-coded health indicator\n *\n * Colors:\n * - Green (on-track): < 80% of estimate used\n * - Yellow (at-risk): 80-100% of estimate used\n * - Red (over-budget): > 100% of estimate used\n * - Gray (no-estimate): No estimate set\n */\n\nimport { cn } from '../../utils'\nimport type { TimeTrackingSummary } from '../../types'\n\nexport interface HealthBarProps {\n  /** Time tracking summary data */\n  summary: TimeTrackingSummary\n  /** Show percentage label */\n  showLabel?: boolean\n  /** Size variant */\n  size?: 'sm' | 'md' | 'lg'\n  /** Additional class names */\n  className?: string\n}\n\n/**\n * Get color classes based on health status\n */\nfunction getHealthColor(health: TimeTrackingSummary['health']): string {\n  switch (health) {\n    case 'on-track':\n      return 'bg-green-500'\n    case 'at-risk':\n      return 'bg-yellow-500'\n    case 'over-budget':\n      return 'bg-red-500'\n    case 'no-estimate':\n    default:\n      return 'bg-gray-400'\n  }\n}\n\n/**\n * Get text color classes based on health status\n */\nfunction getHealthTextColor(health: TimeTrackingSummary['health']): string {\n  switch (health) {\n    case 'on-track':\n      return 'text-green-600 dark:text-green-400'\n    case 'at-risk':\n      return 'text-yellow-600 dark:text-yellow-400'\n    case 'over-budget':\n      return 'text-red-600 dark:text-red-400'\n    case 'no-estimate':\n    default:\n      return 'text-gray-500 dark:text-gray-400'\n  }\n}\n\nexport function HealthBar({\n  summary,\n  showLabel = false,\n  size = 'md',\n  className,\n}: HealthBarProps) {\n  const barColor = getHealthColor(summary.health)\n  const textColor = getHealthTextColor(summary.health)\n\n  // Size classes for the bar\n  const sizeClasses = {\n    sm: 'h-1',\n    md: 'h-1.5',\n    lg: 'h-2',\n  }\n\n  // Calculate progress width (capped at 100% for visual but can show overflow indicator)\n  const progress = summary.progressPercent ?? 0\n  const visualProgress = Math.min(100, progress)\n  const isOverBudget = progress > 100\n\n  // If no estimate, show a minimal bar\n  if (summary.health === 'no-estimate') {\n    return (\n      <div className={cn('flex items-center gap-2', className)}>\n        <div\n          className={cn(\n            'flex-1 rounded-full bg-gray-200 dark:bg-gray-700 overflow-hidden',\n            sizeClasses[size]\n          )}\n        >\n          <div className={cn('h-full w-1/4', barColor)} />\n        </div>\n        {showLabel && (\n          <span className={cn('text-xs font-medium', textColor)}>--</span>\n        )}\n      </div>\n    )\n  }\n\n  return (\n    <div className={cn('flex items-center gap-2', className)}>\n      <div\n        className={cn(\n          'flex-1 rounded-full bg-gray-200 dark:bg-gray-700 overflow-hidden relative',\n          sizeClasses[size]\n        )}\n      >\n        {/* Main progress bar */}\n        <div\n          className={cn('h-full transition-all duration-300', barColor)}\n          style={{ width: `${visualProgress}%` }}\n        />\n\n        {/* Overflow indicator stripe pattern for over-budget */}\n        {isOverBudget && (\n          <div\n            className=\"absolute inset-0 bg-red-500\"\n            style={{\n              backgroundImage:\n                'repeating-linear-gradient(45deg, transparent, transparent 2px, rgba(255,255,255,0.2) 2px, rgba(255,255,255,0.2) 4px)',\n            }}\n          />\n        )}\n      </div>\n      {showLabel && (\n        <span className={cn('text-xs font-medium tabular-nums min-w-[2.5rem] text-right', textColor)}>\n          {progress}%\n        </span>\n      )}\n    </div>\n  )\n}\n\nexport default HealthBar\n","/**\r\n * ProfitabilityReport - Displays profitability analysis\r\n * v1.2.0: Compare sold effort vs actual time logged\r\n *\r\n * Features:\r\n * - Summary metrics (total variance, profitable vs loss tasks)\r\n * - Task-level breakdown with status indicators\r\n * - Visual profitability indicators\r\n * - Filter by project\r\n */\r\n\r\nimport { useMemo } from 'react';\r\nimport { cn } from '../../utils';\r\nimport type {\r\n  TaskProfitability,\r\n  ProfitabilitySummary,\r\n  ProfitabilityReport as ProfitabilityReportData,\r\n} from '../../types';\r\n\r\nexport interface ProfitabilityReportProps {\r\n  /** Report data */\r\n  report: ProfitabilityReportData | null;\r\n  /** Loading state */\r\n  isLoading?: boolean;\r\n  /** Locale for i18n */\r\n  locale?: 'en' | 'es';\r\n  /** Theme: 'dark' | 'light' */\r\n  theme?: 'dark' | 'light';\r\n  /** Additional class names */\r\n  className?: string;\r\n  /** Callback when task is clicked */\r\n  onTaskClick?: (taskId: string) => void;\r\n}\r\n\r\n/**\r\n * Format minutes as human readable string\r\n */\r\nfunction formatDuration(minutes: number): string {\r\n  if (minutes < 1) {\r\n    const seconds = Math.round(minutes * 60);\r\n    return `${seconds}s`;\r\n  }\r\n\r\n  const roundedMinutes = Math.round(minutes);\r\n\r\n  if (roundedMinutes < 60) {\r\n    return `${roundedMinutes}m`;\r\n  }\r\n\r\n  const hours = Math.floor(roundedMinutes / 60);\r\n  const remainingMinutes = roundedMinutes % 60;\r\n\r\n  if (remainingMinutes === 0) {\r\n    return `${hours}h`;\r\n  }\r\n\r\n  return `${hours}h ${remainingMinutes}m`;\r\n}\r\n\r\n/**\r\n * Get status color class\r\n */\r\nfunction getStatusColor(status: TaskProfitability['status'], isDark: boolean): string {\r\n  switch (status) {\r\n    case 'profitable':\r\n      return isDark ? 'text-green-400' : 'text-green-600';\r\n    case 'at-cost':\r\n      return isDark ? 'text-[#00E5CC]' : 'text-[#00C4AE]';\r\n    case 'loss':\r\n      return isDark ? 'text-red-400' : 'text-red-600';\r\n    case 'no-estimate':\r\n      return isDark ? 'text-gray-500' : 'text-gray-400';\r\n  }\r\n}\r\n\r\n/**\r\n * Get status background color class\r\n */\r\nfunction getStatusBgColor(status: TaskProfitability['status'], isDark: boolean): string {\r\n  switch (status) {\r\n    case 'profitable':\r\n      return isDark\r\n        ? 'bg-green-900/30 border-green-700/50'\r\n        : 'bg-green-50 border-green-200';\r\n    case 'at-cost':\r\n      return isDark\r\n        ? 'bg-[#00A893]/30 border-[#00C4AE]/50'\r\n        : 'bg-[#00E5CC]/15 border-[#00E5CC]/15';\r\n    case 'loss':\r\n      return isDark\r\n        ? 'bg-red-900/30 border-red-700/50'\r\n        : 'bg-red-50 border-red-200';\r\n    case 'no-estimate':\r\n      return isDark\r\n        ? 'bg-gray-800/50 border-gray-700'\r\n        : 'bg-gray-50 border-gray-200';\r\n  }\r\n}\r\n\r\n/**\r\n * Get status label\r\n */\r\nfunction getStatusLabel(status: TaskProfitability['status'], locale: 'en' | 'es'): string {\r\n  if (locale === 'es') {\r\n    switch (status) {\r\n      case 'profitable':\r\n        return 'Rentable';\r\n      case 'at-cost':\r\n        return 'En costo';\r\n      case 'loss':\r\n        return 'Pérdida';\r\n      case 'no-estimate':\r\n        return 'Sin oferta';\r\n    }\r\n  }\r\n\r\n  switch (status) {\r\n    case 'profitable':\r\n      return 'Profitable';\r\n    case 'at-cost':\r\n      return 'At Cost';\r\n    case 'loss':\r\n      return 'Loss';\r\n    case 'no-estimate':\r\n      return 'No Estimate';\r\n  }\r\n}\r\n\r\n/**\r\n * Summary metrics card\r\n */\r\nfunction SummaryCard({\r\n  summary,\r\n  locale,\r\n  isDark,\r\n}: {\r\n  summary: ProfitabilitySummary;\r\n  locale: 'en' | 'es';\r\n  isDark: boolean;\r\n}) {\r\n  const isProfit = summary.totalVarianceMinutes > 0;\r\n  const varianceColor = isProfit\r\n    ? isDark\r\n      ? 'text-green-400'\r\n      : 'text-green-600'\r\n    : summary.totalVarianceMinutes < 0\r\n    ? isDark\r\n      ? 'text-red-400'\r\n      : 'text-red-600'\r\n    : isDark\r\n    ? 'text-gray-400'\r\n    : 'text-gray-600';\r\n\r\n  const cardBg = isDark ? 'bg-[#1A1D25]' : 'bg-white';\r\n  const borderColor = isDark ? 'border-white/5' : 'border-gray-200';\r\n  const textMuted = isDark ? 'text-[#9CA3AF]' : 'text-gray-500';\r\n  const textPrimary = isDark ? 'text-[#E5E7EB]' : 'text-gray-900';\r\n\r\n  return (\r\n    <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4 mb-6\">\r\n      {/* Total Variance */}\r\n      <div className={cn('p-4 rounded-lg border', cardBg, borderColor)}>\r\n        <div className={cn('text-sm font-medium mb-1', textMuted)}>\r\n          {locale === 'es' ? 'Variación Total' : 'Total Variance'}\r\n        </div>\r\n        <div className={cn('text-2xl font-bold', varianceColor)}>\r\n          {isProfit ? '+' : ''}\r\n          {formatDuration(Math.abs(summary.totalVarianceMinutes))}\r\n        </div>\r\n        <div className={cn('text-xs mt-1', textMuted)}>\r\n          {summary.avgVariancePercent > 0 ? '+' : ''}\r\n          {summary.avgVariancePercent}%\r\n        </div>\r\n      </div>\r\n\r\n      {/* Task Breakdown */}\r\n      <div className={cn('p-4 rounded-lg border', cardBg, borderColor)}>\r\n        <div className={cn('text-sm font-medium mb-2', textMuted)}>\r\n          {locale === 'es' ? 'Distribución' : 'Distribution'}\r\n        </div>\r\n        <div className=\"space-y-1 text-sm\">\r\n          <div className=\"flex justify-between\">\r\n            <span className={isDark ? 'text-green-400' : 'text-green-600'}>\r\n              {locale === 'es' ? 'Rentables' : 'Profitable'}\r\n            </span>\r\n            <span className={cn('font-medium', textPrimary)}>{summary.profitableTasksCount}</span>\r\n          </div>\r\n          <div className=\"flex justify-between\">\r\n            <span className={isDark ? 'text-[#00E5CC]' : 'text-[#00C4AE]'}>\r\n              {locale === 'es' ? 'En costo' : 'At Cost'}\r\n            </span>\r\n            <span className={cn('font-medium', textPrimary)}>{summary.atCostTasksCount}</span>\r\n          </div>\r\n          <div className=\"flex justify-between\">\r\n            <span className={isDark ? 'text-red-400' : 'text-red-600'}>\r\n              {locale === 'es' ? 'Pérdidas' : 'Loss'}\r\n            </span>\r\n            <span className={cn('font-medium', textPrimary)}>{summary.lossTasksCount}</span>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      {/* Time Summary */}\r\n      <div className={cn('p-4 rounded-lg border', cardBg, borderColor)}>\r\n        <div className={cn('text-sm font-medium mb-2', textMuted)}>\r\n          {locale === 'es' ? 'Tiempos' : 'Time Summary'}\r\n        </div>\r\n        <div className=\"space-y-1 text-sm\">\r\n          <div className=\"flex justify-between\">\r\n            <span className={textMuted}>\r\n              {locale === 'es' ? 'Ofertado' : 'Sold'}\r\n            </span>\r\n            <span className={cn('font-medium', textPrimary)}>\r\n              {formatDuration(summary.totalSoldMinutes)}\r\n            </span>\r\n          </div>\r\n          <div className=\"flex justify-between\">\r\n            <span className={textMuted}>\r\n              {locale === 'es' ? 'Trabajado' : 'Logged'}\r\n            </span>\r\n            <span className={cn('font-medium', textPrimary)}>\r\n              {formatDuration(summary.totalLoggedMinutes)}\r\n            </span>\r\n          </div>\r\n          <div className={cn('flex justify-between pt-1 border-t', borderColor)}>\r\n            <span className={textMuted}>\r\n              {locale === 'es' ? 'Tareas' : 'Tasks'}\r\n            </span>\r\n            <span className={cn('font-medium', textPrimary)}>\r\n              {summary.totalTasksWithEstimate}\r\n            </span>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\n/**\r\n * Task row component\r\n */\r\nfunction TaskRow({\r\n  task,\r\n  locale,\r\n  isDark,\r\n  onClick,\r\n}: {\r\n  task: TaskProfitability;\r\n  locale: 'en' | 'es';\r\n  isDark: boolean;\r\n  onClick?: (taskId: string) => void;\r\n}) {\r\n  // Show + for profit, - for loss, nothing for zero\r\n  const varianceSign = task.varianceMinutes !== null\r\n    ? task.varianceMinutes > 0\r\n      ? '+'\r\n      : task.varianceMinutes < 0\r\n        ? '-'\r\n        : ''\r\n    : '';\r\n  const borderColor = isDark ? 'border-white/5' : 'border-gray-200';\r\n  const textPrimary = isDark ? 'text-[#E5E7EB]' : 'text-gray-900';\r\n  const textMuted = isDark ? 'text-[#9CA3AF]' : 'text-gray-500';\r\n  const hoverBg = isDark ? 'hover:bg-white/5' : 'hover:bg-gray-50';\r\n\r\n  return (\r\n    <tr\r\n      className={cn('border-b', borderColor, onClick && cn('cursor-pointer', hoverBg))}\r\n      onClick={() => onClick?.(task.taskId)}\r\n    >\r\n      <td className=\"px-4 py-3\">\r\n        <div className={cn('font-medium', textPrimary)}>{task.taskName}</div>\r\n        {task.projectName && (\r\n          <div className={cn('text-xs mt-1', textMuted)}>{task.projectName}</div>\r\n        )}\r\n      </td>\r\n      <td className=\"px-4 py-3 text-sm text-center\">\r\n        {task.soldEffortMinutes ? formatDuration(task.soldEffortMinutes) : '-'}\r\n      </td>\r\n      <td className=\"px-4 py-3 text-sm text-center\">{formatDuration(task.loggedMinutes)}</td>\r\n      <td className=\"px-4 py-3 text-sm text-center\">\r\n        {task.varianceMinutes !== null ? (\r\n          <span\r\n            className={cn(\r\n              'font-medium',\r\n              task.varianceMinutes > 0\r\n                ? isDark\r\n                  ? 'text-green-400'\r\n                  : 'text-green-600'\r\n                : task.varianceMinutes < 0\r\n                ? isDark\r\n                  ? 'text-red-400'\r\n                  : 'text-red-600'\r\n                : textMuted\r\n            )}\r\n          >\r\n            {varianceSign}\r\n            {formatDuration(Math.abs(task.varianceMinutes))}\r\n          </span>\r\n        ) : (\r\n          '-'\r\n        )}\r\n      </td>\r\n      <td className=\"px-4 py-3 text-sm text-center\">\r\n        {task.variancePercent !== null ? (\r\n          <span\r\n            className={cn(\r\n              'font-medium',\r\n              task.variancePercent > 0\r\n                ? isDark\r\n                  ? 'text-green-400'\r\n                  : 'text-green-600'\r\n                : task.variancePercent < 0\r\n                ? isDark\r\n                  ? 'text-red-400'\r\n                  : 'text-red-600'\r\n                : textMuted\r\n            )}\r\n          >\r\n            {varianceSign}\r\n            {Math.abs(task.variancePercent)}%\r\n          </span>\r\n        ) : (\r\n          '-'\r\n        )}\r\n      </td>\r\n      <td className=\"px-4 py-3 text-center\">\r\n        <span\r\n          className={cn(\r\n            'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium border',\r\n            getStatusBgColor(task.status, isDark),\r\n            getStatusColor(task.status, isDark)\r\n          )}\r\n        >\r\n          {getStatusLabel(task.status, locale)}\r\n        </span>\r\n      </td>\r\n    </tr>\r\n  );\r\n}\r\n\r\nexport function ProfitabilityReport({\r\n  report,\r\n  isLoading = false,\r\n  locale = 'en',\r\n  theme = 'light',\r\n  className,\r\n  onTaskClick,\r\n}: ProfitabilityReportProps) {\r\n  const isDark = theme === 'dark';\r\n  const bgColor = isDark ? 'bg-[#050505]' : 'bg-gray-50';\r\n  const cardBg = isDark ? 'bg-[#0A0A0A]' : 'bg-white';\r\n  const borderColor = isDark ? 'border-white/[0.08]' : 'border-gray-200';\r\n  const textPrimary = isDark ? 'text-white/[0.92]' : 'text-gray-900';\r\n  const textMuted = isDark ? 'text-white/[0.60]' : 'text-gray-500';\r\n  const tableHeaderBg = isDark ? 'bg-[#050505]/50' : 'bg-gray-50';\r\n\r\n  // Sort tasks by variance (most profitable first)\r\n  const sortedTasks = useMemo(() => {\r\n    if (!report) return [];\r\n    return [...report.tasks].sort((a, b) => {\r\n      if (a.varianceMinutes === null) return 1;\r\n      if (b.varianceMinutes === null) return -1;\r\n      return b.varianceMinutes - a.varianceMinutes;\r\n    });\r\n  }, [report]);\r\n\r\n  if (isLoading) {\r\n    return (\r\n      <div className={cn('p-8 text-center', textMuted, className)}>\r\n        {locale === 'es' ? 'Cargando reporte...' : 'Loading report...'}\r\n      </div>\r\n    );\r\n  }\r\n\r\n  if (!report || report.tasks.length === 0) {\r\n    return (\r\n      <div className={cn('p-8 text-center', textMuted, className)}>\r\n        {locale === 'es'\r\n          ? 'No hay datos de rentabilidad disponibles'\r\n          : 'No profitability data available'}\r\n      </div>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <div className={cn('space-y-6 p-6', bgColor, className)}>\r\n      {/* Header */}\r\n      <div className=\"flex items-center justify-between\">\r\n        <div>\r\n          <h2 className={cn('text-2xl font-bold', textPrimary)}>\r\n            {locale === 'es' ? 'Reporte de Rentabilidad' : 'Profitability Report'}\r\n          </h2>\r\n          <p className={cn('text-sm mt-1', textMuted)}>\r\n            {locale === 'es'\r\n              ? 'Análisis de tiempo ofertado vs tiempo trabajado'\r\n              : 'Analysis of sold effort vs actual time logged'}\r\n          </p>\r\n        </div>\r\n      </div>\r\n\r\n      {/* Summary Cards */}\r\n      <SummaryCard summary={report.summary} locale={locale} isDark={isDark} />\r\n\r\n      {/* Tasks Table */}\r\n      <div className={cn('rounded-lg border overflow-hidden', cardBg, borderColor)}>\r\n        <div className=\"overflow-x-auto\">\r\n          <table className=\"min-w-full divide-y divide-gray-200 dark:divide-white/5\">\r\n            <thead className={tableHeaderBg}>\r\n              <tr>\r\n                <th className={cn('px-4 py-3 text-left text-xs font-medium uppercase tracking-wider', textMuted)}>\r\n                  {locale === 'es' ? 'Tarea' : 'Task'}\r\n                </th>\r\n                <th className={cn('px-4 py-3 text-center text-xs font-medium uppercase tracking-wider', textMuted)}>\r\n                  {locale === 'es' ? 'Ofertado' : 'Sold'}\r\n                </th>\r\n                <th className={cn('px-4 py-3 text-center text-xs font-medium uppercase tracking-wider', textMuted)}>\r\n                  {locale === 'es' ? 'Trabajado' : 'Logged'}\r\n                </th>\r\n                <th className={cn('px-4 py-3 text-center text-xs font-medium uppercase tracking-wider', textMuted)}>\r\n                  {locale === 'es' ? 'Variación' : 'Variance'}\r\n                </th>\r\n                <th className={cn('px-4 py-3 text-center text-xs font-medium uppercase tracking-wider', textMuted)}>\r\n                  %\r\n                </th>\r\n                <th className={cn('px-4 py-3 text-center text-xs font-medium uppercase tracking-wider', textMuted)}>\r\n                  {locale === 'es' ? 'Estado' : 'Status'}\r\n                </th>\r\n              </tr>\r\n            </thead>\r\n            <tbody className={cn('divide-y', borderColor)}>\r\n              {sortedTasks.map((task) => (\r\n                <TaskRow\r\n                  key={task.taskId}\r\n                  task={task}\r\n                  locale={locale}\r\n                  isDark={isDark}\r\n                  onClick={onTaskClick}\r\n                />\r\n              ))}\r\n            </tbody>\r\n          </table>\r\n        </div>\r\n      </div>\r\n\r\n      {/* Footer note */}\r\n      <div className={cn('text-xs text-center', textMuted)}>\r\n        {locale === 'es' ? (\r\n          <>\r\n            Rentable: variación &gt; +5% | En costo: ±5% | Pérdida: variación &lt; -5%\r\n          </>\r\n        ) : (\r\n          <>\r\n            Profitable: variance &gt; +5% | At cost: ±5% | Loss: variance &lt; -5%\r\n          </>\r\n        )}\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\nexport default ProfitabilityReport;\r\n","/**\r\n * TaskDetailModal Component\r\n * Shared task detail modal for Calendar, Kanban, and Gantt views\r\n * ClickUp-style full-screen modal with all task fields\r\n * @version 0.18.9\r\n *\r\n * v0.18.9: Removed unused sections (Custom Fields, Checklists), made Subtasks functional\r\n * v0.17.422: Added emoji picker and file attachments in comments\r\n * v0.17.401: Added @mentions support in comments\r\n * v0.17.253: Editable task name with debounce auto-save\r\n */\r\n\r\nimport { useState, useCallback, useEffect, useRef } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport {\r\n  CheckCircle2,\r\n  Circle,\r\n  X,\r\n  Flag,\r\n  User,\r\n  CalendarDays,\r\n  Clock,\r\n  Tag,\r\n  Link2,\r\n  FileText,\r\n  Plus,\r\n  Upload,\r\n  MessageSquare,\r\n  Check,\r\n  ChevronDown,\r\n  Trash2,\r\n  File,\r\n  Image,\r\n  FileText as FileTextIcon,\r\n  Palette,\r\n  Diamond,\r\n  Hourglass,\r\n  Square,\r\n  Play,\r\n} from 'lucide-react';\r\nimport { MentionInput, CommentContent, extractMentionedUserIds } from './MentionInput';\r\nimport type { MentionUser, CommentAttachment, PendingFile } from './MentionInput';\r\nimport type { Task, Assignee, TaskTag } from '../Gantt/types';\r\nimport type { Card, Attachment, TimeEntry, TimeLogInput, TimeTrackingSummary } from '../../types';\r\nimport { cn } from '../../utils';\r\nimport { TagPicker } from '../Gantt/TagPicker';\r\nimport { TASK_COLORS } from '../Gantt/ColorPicker';\r\nimport { TimeInputPopover } from '../TimeTracking';\r\n\r\n// v1.1.0: Helper function to format minutes as display string (e.g., \"2h 30m\")\r\nfunction formatMinutesToDisplay(minutes: number): string {\r\n  if (minutes < 60) {\r\n    return `${minutes}m`;\r\n  }\r\n  const hours = Math.floor(minutes / 60);\r\n  const remainingMinutes = minutes % 60;\r\n  if (remainingMinutes === 0) {\r\n    return `${hours}h`;\r\n  }\r\n  return `${hours}h ${remainingMinutes}m`;\r\n}\r\n\r\n// v1.1.0: Helper function to format seconds as display string for running timer (e.g., \"00:05:23\")\r\nfunction formatSecondsToDisplay(seconds: number): string {\r\n  const hours = Math.floor(seconds / 3600);\r\n  const minutes = Math.floor((seconds % 3600) / 60);\r\n  const secs = seconds % 60;\r\n\r\n  if (hours > 0) {\r\n    return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\r\n  }\r\n  return `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\r\n}\r\n\r\n// Type for item that can be either Task or Card\r\nexport type TaskOrCard = Task | Card;\r\n\r\n// Helper to convert Card to Task format for internal use\r\nfunction normalizeToTask(item: TaskOrCard, availableUsers: Assignee[] = []): Task {\r\n  // Check if it's a Card (has 'title' instead of 'name')\r\n  if ('title' in item && !('name' in item)) {\r\n    const card = item as Card;\r\n    // Map card assignedUserIds to Task assignees format\r\n    // Resolve IDs to actual user info from availableUsers\r\n    const assignees: Assignee[] = (card.assignedUserIds || []).map(id => {\r\n      // Try to find user by ID in availableUsers\r\n      const user = availableUsers.find(u => (u as any).id === id);\r\n      if (user) {\r\n        return user;\r\n      }\r\n      // Fallback if user not found - but don't show as assignee\r\n      return null;\r\n    }).filter((a): a is Assignee => a !== null);\r\n\r\n    return {\r\n      id: card.id,\r\n      name: card.title,\r\n      startDate: card.startDate ? new Date(card.startDate) : undefined,\r\n      endDate: card.endDate ? new Date(card.endDate) : undefined,\r\n      progress: card.progress || 0,\r\n      status: card.columnId as any,\r\n      priority: card.priority?.toLowerCase() as any,\r\n      assignees,\r\n      dependencies: Array.isArray(card.dependencies)\r\n        ? card.dependencies.map(d => typeof d === 'string' ? d : d.taskId)\r\n        : [],\r\n      tags: card.tags,\r\n      subtasks: card.subtasks?.map(s => ({\r\n        id: s.id,\r\n        name: s.title,\r\n        progress: s.completed ? 100 : 0,\r\n        startDate: new Date(),\r\n        endDate: new Date(),\r\n      })),\r\n      color: card.color,\r\n      description: card.description,\r\n      // v1.2.0: Preserve time tracking fields from Card\r\n      effortMinutes: card.effortMinutes,\r\n      timeLoggedMinutes: card.timeLoggedMinutes,\r\n      soldEffortMinutes: card.soldEffortMinutes,\r\n    } as Task;\r\n  }\r\n  return item as Task;\r\n}\r\n\r\n// Helper to convert Task back to Card format\r\nfunction taskToCard(task: Task, originalCard: Card): Card {\r\n  return {\r\n    ...originalCard,\r\n    title: task.name,\r\n    startDate: task.startDate,\r\n    endDate: task.endDate,\r\n    progress: task.progress,\r\n    priority: task.priority?.toUpperCase() as any,\r\n    tags: task.tags,\r\n    description: (task as any).description,\r\n    color: task.color,\r\n    columnId: task.status as string,\r\n    // Keep original assignedUserIds - assignees in Task don't have IDs\r\n    // The original card's assignedUserIds remain unchanged unless consumer updates them\r\n    assignedUserIds: originalCard.assignedUserIds,\r\n    // v0.17.441: Include dependencies when converting back to Card\r\n    dependencies: task.dependencies,\r\n  };\r\n}\r\n\r\n/** Comment type for activity panel */\r\nexport interface TaskComment {\r\n  id: string;\r\n  taskId: string;\r\n  userId: string;\r\n  content: string;\r\n  /** v0.17.422: Attachments for comments */\r\n  attachments?: CommentAttachment[];\r\n  createdAt: Date | string;\r\n  updatedAt?: Date | string;\r\n  user?: {\r\n    id: string;\r\n    name: string;\r\n    email?: string;\r\n    avatarUrl?: string;\r\n    color?: string;\r\n  };\r\n}\r\n\r\nexport interface TaskDetailModalProps {\r\n  /** Task or Card to display */\r\n  task: TaskOrCard | null;\r\n  /** Whether modal is open */\r\n  isOpen: boolean;\r\n  /** Close callback */\r\n  onClose: () => void;\r\n  /** Update task callback (receives Task type) */\r\n  onTaskUpdate?: (task: Task) => void;\r\n  /** Update card callback (receives Card type) - use this for Kanban */\r\n  onCardUpdate?: (card: Card) => void;\r\n  /** Theme */\r\n  theme?: 'dark' | 'light';\r\n  /** Locale */\r\n  locale?: 'en' | 'es';\r\n  /** Available users for assignment */\r\n  availableUsers?: Assignee[];\r\n  /** Available tags in workspace for selection */\r\n  availableTags?: TaskTag[];\r\n  /** Callback to create a new tag */\r\n  onCreateTag?: (name: string, color: string) => Promise<TaskTag | null>;\r\n  /** v0.17.241: Attachments for the task */\r\n  attachments?: Attachment[];\r\n  /** v0.17.241: Callback when files are dropped/selected for upload */\r\n  onUploadAttachments?: (taskId: string, files: File[]) => Promise<void>;\r\n  /** v0.17.241: Callback to delete an attachment */\r\n  onDeleteAttachment?: (attachmentId: string) => Promise<void>;\r\n  /** v0.17.243: Available tasks for dependencies selection */\r\n  availableTasks?: Task[];\r\n  /** v0.17.252: Comments for activity panel */\r\n  comments?: TaskComment[];\r\n  /** v0.17.422: Callback to add a new comment (with optional mentionedUserIds and attachments) */\r\n  onAddComment?: (taskId: string, content: string, mentionedUserIds?: string[], attachments?: CommentAttachment[]) => Promise<void>;\r\n  /** v0.17.252: Current user info for displaying comments */\r\n  currentUser?: {\r\n    id: string;\r\n    name: string;\r\n    avatarUrl?: string;\r\n    color?: string;\r\n  };\r\n  /** v0.17.401: Users available for @mentions in comments */\r\n  mentionableUsers?: MentionUser[];\r\n  /** v0.17.422: Upload comment attachments callback */\r\n  onUploadCommentAttachments?: (files: File[]) => Promise<CommentAttachment[]>;\r\n  // v1.1.0: Time Tracking Props\r\n  /** Enable time tracking section */\r\n  enableTimeTracking?: boolean;\r\n  /** Time tracking summary for current task */\r\n  timeTrackingSummary?: TimeTrackingSummary;\r\n  /** Time entries for current task */\r\n  timeEntries?: TimeEntry[];\r\n  /** Whether timer is running for this task */\r\n  isTimerRunning?: boolean;\r\n  /** Timer elapsed seconds */\r\n  timerElapsedSeconds?: number;\r\n  /** Log time callback */\r\n  onTimeLog?: (taskId: string, input: TimeLogInput) => Promise<void>;\r\n  /** Update estimate callback */\r\n  onEstimateUpdate?: (taskId: string, minutes: number | null) => Promise<void>;\r\n  /** Update sold effort callback (v1.2.0: Commercial time tracking) */\r\n  onSoldEffortUpdate?: (taskId: string, minutes: number | null) => Promise<void>;\r\n  /** Start timer callback */\r\n  onTimerStart?: (taskId: string) => void;\r\n  /** Stop timer callback */\r\n  onTimerStop?: (taskId: string) => void;\r\n  /** Discard timer callback */\r\n  onTimerDiscard?: (taskId: string) => void;\r\n  /**\r\n   * v1.4.11: Governance v2.0 - Blur financial data for unauthorized users\r\n   * When true, \"Tiempo ofertado\" (Quoted time) field will be blurred\r\n   */\r\n  blurFinancials?: boolean;\r\n}\r\n\r\n/**\r\n * TaskDetailModal - ClickUp style full-screen task detail\r\n */\r\nexport function TaskDetailModal({\r\n  task,\r\n  isOpen,\r\n  onClose,\r\n  onTaskUpdate,\r\n  onCardUpdate,\r\n  theme = 'dark',\r\n  locale = 'es',\r\n  availableUsers = [],\r\n  availableTags = [],\r\n  onCreateTag,\r\n  attachments = [],\r\n  onUploadAttachments,\r\n  onDeleteAttachment,\r\n  availableTasks = [],\r\n  comments = [],\r\n  onAddComment,\r\n  currentUser,\r\n  mentionableUsers = [],\r\n  onUploadCommentAttachments,\r\n  // v1.1.0: Time Tracking\r\n  enableTimeTracking = false,\r\n  timeTrackingSummary,\r\n  timeEntries: _timeEntries = [],\r\n  isTimerRunning = false,\r\n  timerElapsedSeconds = 0,\r\n  onTimeLog,\r\n  onEstimateUpdate,\r\n  onSoldEffortUpdate,\r\n  onTimerStart,\r\n  onTimerStop,\r\n  onTimerDiscard: _onTimerDiscard,\r\n  // v1.4.11: Governance v2.0 - Financial blur\r\n  blurFinancials = false,\r\n}: TaskDetailModalProps) {\r\n  // Suppress unused variable warnings (reserved for future features)\r\n  void _timeEntries;\r\n  void _onTimerDiscard;\r\n  const isDark = theme === 'dark';\r\n\r\n  // Theme object for TagPicker\r\n  const tagPickerTheme = {\r\n    textTertiary: isDark ? '#6B7280' : '#9CA3AF',\r\n    textSecondary: isDark ? '#9CA3AF' : '#6B7280',\r\n    textPrimary: isDark ? '#FFFFFF' : '#111827',\r\n    borderLight: isDark ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.1)',\r\n    border: isDark ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.1)',\r\n    bgPrimary: isDark ? '#1A1D25' : '#FFFFFF',\r\n    bgSecondary: isDark ? '#0A0A0A' : '#F9FAFB',\r\n    hoverBg: isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.05)',\r\n  };\r\n\r\n  // Check if original item is a Card\r\n  const isCard = task && 'title' in task && !('name' in task);\r\n  const originalItem = task;\r\n\r\n  // Local state for editing (always use Task format internally)\r\n  const [selectedTask, setSelectedTask] = useState<Task | null>(task ? normalizeToTask(task, availableUsers) : null);\r\n  const [showStatusDropdown, setShowStatusDropdown] = useState(false);\r\n  const [showPriorityDropdown, setShowPriorityDropdown] = useState(false);\r\n  const [showAssigneesDropdown, setShowAssigneesDropdown] = useState(false);\r\n  const [showDatePicker, setShowDatePicker] = useState<'start' | 'end' | null>(null);\r\n  const [datePickerMonth, setDatePickerMonth] = useState(new Date());\r\n  const [editingProgress, setEditingProgress] = useState(false);\r\n  const [showDependenciesDropdown, setShowDependenciesDropdown] = useState(false);\r\n  const [dependencySearch, setDependencySearch] = useState('');\r\n  const [showColorPicker, setShowColorPicker] = useState(false);\r\n\r\n  // v1.1.0: Time tracking popover state - 'estimate' | 'quoted' | 'log' | false\r\n  const [showTimePopover, setShowTimePopover] = useState<false | 'estimate' | 'quoted' | 'log'>(false);\r\n\r\n  // v0.17.241: Attachment drag state\r\n  const [isDraggingFile, setIsDraggingFile] = useState(false);\r\n  const [isUploadingFiles, setIsUploadingFiles] = useState(false);\r\n\r\n  // v0.17.251: Local description state with debounce for auto-save\r\n  const [localDescription, setLocalDescription] = useState('');\r\n  const descriptionDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n  // v0.17.442: Auto-resize textarea ref\r\n  const descriptionTextareaRef = useRef<HTMLTextAreaElement | null>(null);\r\n\r\n  // v0.17.253: Local task name state with debounce for auto-save\r\n  const [localTaskName, setLocalTaskName] = useState('');\r\n  const taskNameDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n  // v0.17.252: Comment input state\r\n  const [commentText, setCommentText] = useState('');\r\n  const [isSubmittingComment, setIsSubmittingComment] = useState(false);\r\n  // v0.17.422: Pending files for comment attachments\r\n  const [pendingCommentFiles, setPendingCommentFiles] = useState<PendingFile[]>([]);\r\n\r\n  // v0.18.9: Subtasks state\r\n  const [newSubtaskName, setNewSubtaskName] = useState('');\r\n  const [isAddingSubtask, setIsAddingSubtask] = useState(false);\r\n\r\n  // v0.18.11: Comments container ref for auto-scroll to bottom\r\n  const commentsContainerRef = useRef<HTMLDivElement | null>(null);\r\n\r\n  // Update local state when task prop changes or modal opens\r\n  useEffect(() => {\r\n    // v1.2.0: Debug logging for task received by modal\r\n    console.log('📥 TaskDetailModal useEffect - task received:', {\r\n      isOpen,\r\n      taskId: task?.id,\r\n      taskName: (task as any)?.name,\r\n      soldEffortMinutes: (task as any)?.soldEffortMinutes,\r\n      quotedMinutes: (task as any)?.quotedMinutes,\r\n      effortMinutes: (task as any)?.effortMinutes,\r\n      timeLoggedMinutes: (task as any)?.timeLoggedMinutes,\r\n      fullTask: task\r\n    });\r\n\r\n    if (task && isOpen) {\r\n      const normalizedTask = normalizeToTask(task, availableUsers);\r\n\r\n      console.log('📥 After normalizeToTask:', {\r\n        taskId: normalizedTask?.id,\r\n        taskName: normalizedTask?.name,\r\n        soldEffortMinutes: (normalizedTask as any)?.soldEffortMinutes,\r\n        quotedMinutes: (normalizedTask as any)?.quotedMinutes,\r\n        effortMinutes: (normalizedTask as any)?.effortMinutes,\r\n        timeLoggedMinutes: (normalizedTask as any)?.timeLoggedMinutes\r\n      });\r\n\r\n      setSelectedTask(normalizedTask);\r\n      setLocalDescription((normalizedTask as any).description || '');\r\n      setLocalTaskName(normalizedTask.name || '');\r\n    }\r\n  }, [task?.id, (task as any)?.quotedMinutes, availableUsers, isOpen]);\r\n\r\n  // v0.17.442: Auto-resize description textarea when description changes or modal opens\r\n  useEffect(() => {\r\n    if (!isOpen || !localDescription) return;\r\n\r\n    // Small delay to ensure textarea is rendered\r\n    const timer = setTimeout(() => {\r\n      const textarea = descriptionTextareaRef.current;\r\n      if (textarea) {\r\n        textarea.style.height = 'auto';\r\n        textarea.style.height = `${Math.max(100, textarea.scrollHeight)}px`;\r\n      }\r\n    }, 50);\r\n    return () => clearTimeout(timer);\r\n  }, [isOpen, localDescription]);\r\n\r\n  // Cleanup debounce timers on unmount\r\n  useEffect(() => {\r\n    return () => {\r\n      if (descriptionDebounceRef.current) {\r\n        clearTimeout(descriptionDebounceRef.current);\r\n      }\r\n      if (taskNameDebounceRef.current) {\r\n        clearTimeout(taskNameDebounceRef.current);\r\n      }\r\n    };\r\n  }, []);\r\n\r\n  // v0.18.11: Auto-scroll comments to bottom when comments change or modal opens\r\n  useEffect(() => {\r\n    if (isOpen && commentsContainerRef.current && comments.length > 0) {\r\n      // Small delay to ensure DOM is updated\r\n      setTimeout(() => {\r\n        if (commentsContainerRef.current) {\r\n          commentsContainerRef.current.scrollTop = commentsContainerRef.current.scrollHeight;\r\n        }\r\n      }, 100);\r\n    }\r\n  }, [isOpen, comments.length]);\r\n\r\n  // Handle update - emit in correct format\r\n  const handleUpdate = useCallback((updatedTask: Task) => {\r\n    setSelectedTask(updatedTask);\r\n\r\n    // If original was a Card, convert back and call onCardUpdate\r\n    if (isCard && onCardUpdate && originalItem) {\r\n      onCardUpdate(taskToCard(updatedTask, originalItem as Card));\r\n    } else if (onTaskUpdate) {\r\n      onTaskUpdate(updatedTask);\r\n    }\r\n  }, [isCard, originalItem, onCardUpdate, onTaskUpdate]);\r\n\r\n  // Close all dropdowns\r\n  const closeAllDropdowns = useCallback(() => {\r\n    setShowStatusDropdown(false);\r\n    setShowPriorityDropdown(false);\r\n    setShowAssigneesDropdown(false);\r\n    setShowDatePicker(null);\r\n    setShowDependenciesDropdown(false);\r\n    setDependencySearch('');\r\n    setShowColorPicker(false);\r\n  }, []);\r\n\r\n  // Update task field\r\n  const updateTaskField = useCallback((field: keyof Task, value: any) => {\r\n    if (!selectedTask) return;\r\n    const updatedTask = { ...selectedTask, [field]: value };\r\n    handleUpdate(updatedTask);\r\n  }, [selectedTask, handleUpdate]);\r\n\r\n  // v0.17.442: Auto-resize description textarea\r\n  const autoResizeDescription = useCallback(() => {\r\n    const textarea = descriptionTextareaRef.current;\r\n    if (textarea) {\r\n      textarea.style.height = 'auto';\r\n      textarea.style.height = `${Math.max(100, textarea.scrollHeight)}px`;\r\n    }\r\n  }, []);\r\n\r\n  // v0.17.251: Handle description change with debounce (auto-save after typing stops)\r\n  const handleDescriptionChange = useCallback((value: string) => {\r\n    // Update local state immediately for responsive UI\r\n    setLocalDescription(value);\r\n\r\n    // v0.17.442: Auto-resize textarea\r\n    setTimeout(autoResizeDescription, 0);\r\n\r\n    // Clear any existing debounce timer\r\n    if (descriptionDebounceRef.current) {\r\n      clearTimeout(descriptionDebounceRef.current);\r\n    }\r\n\r\n    // Set new debounce timer (800ms delay before saving)\r\n    descriptionDebounceRef.current = setTimeout(() => {\r\n      if (selectedTask) {\r\n        const updatedTask = { ...selectedTask, description: value } as Task;\r\n        handleUpdate(updatedTask);\r\n      }\r\n    }, 800);\r\n  }, [selectedTask, handleUpdate, autoResizeDescription]);\r\n\r\n  // v0.17.253: Handle task name change with debounce (auto-save after typing stops)\r\n  const handleTaskNameChange = useCallback((value: string) => {\r\n    // Update local state immediately for responsive UI\r\n    setLocalTaskName(value);\r\n\r\n    // Clear any existing debounce timer\r\n    if (taskNameDebounceRef.current) {\r\n      clearTimeout(taskNameDebounceRef.current);\r\n    }\r\n\r\n    // Set new debounce timer (800ms delay before saving)\r\n    taskNameDebounceRef.current = setTimeout(() => {\r\n      if (selectedTask && value.trim()) {\r\n        const updatedTask = { ...selectedTask, name: value.trim() };\r\n        handleUpdate(updatedTask);\r\n      }\r\n    }, 800);\r\n  }, [selectedTask, handleUpdate]);\r\n\r\n  // v0.17.422: Handle file selection for comment attachments\r\n  const handleCommentFilesSelect = useCallback((files: File[]) => {\r\n    const newPendingFiles: PendingFile[] = files.map(file => {\r\n      const pendingFile: PendingFile = {\r\n        id: `pending-${Date.now()}-${Math.random().toString(36).slice(2)}`,\r\n        file,\r\n      };\r\n\r\n      // Create preview for images\r\n      if (file.type.startsWith('image/')) {\r\n        pendingFile.preview = URL.createObjectURL(file);\r\n      }\r\n\r\n      return pendingFile;\r\n    });\r\n\r\n    setPendingCommentFiles(prev => [...prev, ...newPendingFiles]);\r\n  }, []);\r\n\r\n  // v0.17.422: Handle remove pending file\r\n  const handleRemoveCommentFile = useCallback((fileId: string) => {\r\n    setPendingCommentFiles(prev => {\r\n      const fileToRemove = prev.find(f => f.id === fileId);\r\n      // Revoke preview URL to prevent memory leaks\r\n      if (fileToRemove?.preview) {\r\n        URL.revokeObjectURL(fileToRemove.preview);\r\n      }\r\n      return prev.filter(f => f.id !== fileId);\r\n    });\r\n  }, []);\r\n\r\n  // v0.17.422: Handle submit comment with mentions and attachments support\r\n  const handleSubmitComment = useCallback(async () => {\r\n    if (!selectedTask || (!commentText.trim() && pendingCommentFiles.length === 0) || !onAddComment) return;\r\n\r\n    setIsSubmittingComment(true);\r\n    try {\r\n      // Extract mentioned user IDs from the comment text\r\n      const mentionedUserIds = extractMentionedUserIds(commentText, mentionableUsers);\r\n\r\n      // Upload pending files if any\r\n      let uploadedAttachments: CommentAttachment[] = [];\r\n      if (pendingCommentFiles.length > 0 && onUploadCommentAttachments) {\r\n        const files = pendingCommentFiles.map(pf => pf.file);\r\n        uploadedAttachments = await onUploadCommentAttachments(files);\r\n      }\r\n\r\n      await onAddComment(\r\n        selectedTask.id,\r\n        commentText.trim(),\r\n        mentionedUserIds.length > 0 ? mentionedUserIds : undefined,\r\n        uploadedAttachments.length > 0 ? uploadedAttachments : undefined\r\n      );\r\n\r\n      // Clear comment input and pending files\r\n      setCommentText('');\r\n      // Revoke all preview URLs\r\n      pendingCommentFiles.forEach(pf => {\r\n        if (pf.preview) URL.revokeObjectURL(pf.preview);\r\n      });\r\n      setPendingCommentFiles([]);\r\n    } finally {\r\n      setIsSubmittingComment(false);\r\n    }\r\n  }, [selectedTask, commentText, pendingCommentFiles, onAddComment, mentionableUsers, onUploadCommentAttachments]);\r\n\r\n  // v0.18.9: Handle add subtask\r\n  const handleAddSubtask = useCallback(() => {\r\n    if (!selectedTask || !newSubtaskName.trim()) return;\r\n\r\n    const existingSubtasks = selectedTask.subtasks || [];\r\n    const newSubtask: Task = {\r\n      id: `subtask-${Date.now()}-${Math.random().toString(36).slice(2)}`,\r\n      name: newSubtaskName.trim(),\r\n      progress: 0,\r\n      startDate: new Date(),\r\n      endDate: new Date(),\r\n      position: existingSubtasks.length,\r\n    };\r\n\r\n    const updatedSubtasks = [...existingSubtasks, newSubtask];\r\n    const updatedTask = { ...selectedTask, subtasks: updatedSubtasks };\r\n    handleUpdate(updatedTask);\r\n    setNewSubtaskName('');\r\n    setIsAddingSubtask(false);\r\n  }, [selectedTask, newSubtaskName, handleUpdate]);\r\n\r\n  // v0.18.9: Handle toggle subtask completion\r\n  const handleToggleSubtask = useCallback((subtaskId: string) => {\r\n    if (!selectedTask?.subtasks) return;\r\n\r\n    const updatedSubtasks = selectedTask.subtasks.map(subtask => {\r\n      if (subtask.id === subtaskId) {\r\n        return { ...subtask, progress: subtask.progress === 100 ? 0 : 100 };\r\n      }\r\n      return subtask;\r\n    });\r\n\r\n    const updatedTask = { ...selectedTask, subtasks: updatedSubtasks };\r\n    handleUpdate(updatedTask);\r\n  }, [selectedTask, handleUpdate]);\r\n\r\n  // v0.18.9: Handle delete subtask\r\n  const handleDeleteSubtask = useCallback((subtaskId: string) => {\r\n    if (!selectedTask?.subtasks) return;\r\n\r\n    const updatedSubtasks = selectedTask.subtasks.filter(s => s.id !== subtaskId);\r\n    const updatedTask = { ...selectedTask, subtasks: updatedSubtasks };\r\n    handleUpdate(updatedTask);\r\n  }, [selectedTask, handleUpdate]);\r\n\r\n  // v0.17.252: Format comment date\r\n  const formatCommentDate = useCallback((date: Date | string) => {\r\n    const d = typeof date === 'string' ? new Date(date) : date;\r\n    const now = new Date();\r\n    const diffMs = now.getTime() - d.getTime();\r\n    const diffMins = Math.floor(diffMs / 60000);\r\n    const diffHours = Math.floor(diffMs / 3600000);\r\n    const diffDays = Math.floor(diffMs / 86400000);\r\n\r\n    if (diffMins < 1) return locale === 'es' ? 'Ahora' : 'Just now';\r\n    if (diffMins < 60) return locale === 'es' ? `Hace ${diffMins} min` : `${diffMins}m ago`;\r\n    if (diffHours < 24) return locale === 'es' ? `Hace ${diffHours}h` : `${diffHours}h ago`;\r\n    if (diffDays < 7) return locale === 'es' ? `Hace ${diffDays}d` : `${diffDays}d ago`;\r\n\r\n    return d.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', {\r\n      month: 'short',\r\n      day: 'numeric'\r\n    });\r\n  }, [locale]);\r\n\r\n  // Update task status\r\n  const updateTaskStatus = useCallback((statusId: string) => {\r\n    if (!selectedTask) return;\r\n    let progress = selectedTask.progress || 0;\r\n    if (statusId === 'completed') progress = 100;\r\n    else if (statusId === 'in-progress' && progress === 0) progress = 10;\r\n    else if (statusId === 'todo') progress = 0;\r\n\r\n    const updatedTask = { ...selectedTask, status: statusId as any, progress };\r\n    handleUpdate(updatedTask);\r\n    setShowStatusDropdown(false);\r\n  }, [selectedTask, handleUpdate]);\r\n\r\n  // Update task dates\r\n  const updateTaskDates = useCallback((startDate: Date | undefined, endDate: Date | undefined) => {\r\n    if (!selectedTask) return;\r\n    const updatedTask = { ...selectedTask, startDate, endDate };\r\n    handleUpdate(updatedTask);\r\n  }, [selectedTask, handleUpdate]);\r\n\r\n  // Generate calendar days for date picker\r\n  const getDatePickerDays = useCallback(() => {\r\n    const year = datePickerMonth.getFullYear();\r\n    const month = datePickerMonth.getMonth();\r\n    const firstDay = new Date(year, month, 1);\r\n    const lastDay = new Date(year, month + 1, 0);\r\n    const daysInMonth = lastDay.getDate();\r\n    const startDayOfWeek = firstDay.getDay();\r\n\r\n    const days: { date: Date; isCurrentMonth: boolean }[] = [];\r\n\r\n    // Previous month days\r\n    const prevMonthLastDay = new Date(year, month, 0).getDate();\r\n    for (let i = startDayOfWeek - 1; i >= 0; i--) {\r\n      days.push({\r\n        date: new Date(year, month - 1, prevMonthLastDay - i),\r\n        isCurrentMonth: false,\r\n      });\r\n    }\r\n\r\n    // Current month days\r\n    for (let i = 1; i <= daysInMonth; i++) {\r\n      days.push({\r\n        date: new Date(year, month, i),\r\n        isCurrentMonth: true,\r\n      });\r\n    }\r\n\r\n    // Next month days\r\n    const remainingDays = 42 - days.length;\r\n    for (let i = 1; i <= remainingDays; i++) {\r\n      days.push({\r\n        date: new Date(year, month + 1, i),\r\n        isCurrentMonth: false,\r\n      });\r\n    }\r\n\r\n    return days;\r\n  }, [datePickerMonth]);\r\n\r\n  // v0.17.241: Handle file drop for attachments\r\n  const handleFileDrop = useCallback(async (e: React.DragEvent) => {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    setIsDraggingFile(false);\r\n\r\n    if (!selectedTask || !onUploadAttachments) return;\r\n\r\n    const files = Array.from(e.dataTransfer.files);\r\n    if (files.length === 0) return;\r\n\r\n    setIsUploadingFiles(true);\r\n    try {\r\n      await onUploadAttachments(selectedTask.id, files);\r\n    } finally {\r\n      setIsUploadingFiles(false);\r\n    }\r\n  }, [selectedTask, onUploadAttachments]);\r\n\r\n  // v0.17.241: Handle file input change\r\n  const handleFileInputChange = useCallback(async (e: React.ChangeEvent<HTMLInputElement>) => {\r\n    if (!selectedTask || !onUploadAttachments || !e.target.files) return;\r\n\r\n    const files = Array.from(e.target.files);\r\n    if (files.length === 0) return;\r\n\r\n    setIsUploadingFiles(true);\r\n    try {\r\n      await onUploadAttachments(selectedTask.id, files);\r\n    } finally {\r\n      setIsUploadingFiles(false);\r\n    }\r\n    // Reset input\r\n    e.target.value = '';\r\n  }, [selectedTask, onUploadAttachments]);\r\n\r\n  // v0.17.241: Handle drag events\r\n  const handleDragOver = useCallback((e: React.DragEvent) => {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    setIsDraggingFile(true);\r\n  }, []);\r\n\r\n  const handleDragLeave = useCallback((e: React.DragEvent) => {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    setIsDraggingFile(false);\r\n  }, []);\r\n\r\n  // v0.17.241: Format file size\r\n  const formatFileSize = useCallback((bytes: number): string => {\r\n    if (bytes < 1024) return `${bytes} B`;\r\n    if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n    return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n  }, []);\r\n\r\n  // v0.17.241: Get file icon based on type\r\n  const getFileIcon = useCallback((mimeType: string) => {\r\n    if (mimeType.startsWith('image/')) return Image;\r\n    if (mimeType.includes('pdf') || mimeType.includes('document')) return FileTextIcon;\r\n    return File;\r\n  }, []);\r\n\r\n  if (!isOpen || !selectedTask) return null;\r\n\r\n  return (\r\n    <AnimatePresence>\r\n      {isOpen && selectedTask && (\r\n        <>\r\n          {/* Overlay */}\r\n          <motion.div\r\n            initial={{ opacity: 0 }}\r\n            animate={{ opacity: 1 }}\r\n            exit={{ opacity: 0 }}\r\n            onClick={onClose}\r\n            className=\"fixed inset-0 bg-black/50 z-40\"\r\n          />\r\n          {/* Modal - Full screen like ClickUp */}\r\n          <motion.div\r\n            initial={{ opacity: 0, scale: 0.98 }}\r\n            animate={{ opacity: 1, scale: 1 }}\r\n            exit={{ opacity: 0, scale: 0.98 }}\r\n            className={cn(\r\n              \"fixed inset-4 md:inset-8 lg:inset-12 rounded-xl shadow-2xl z-50 flex overflow-hidden\",\r\n              isDark ? \"bg-[#1A1D25]\" : \"bg-white\"\r\n            )}\r\n          >\r\n            {/* Main Content */}\r\n            <div className=\"flex-1 flex flex-col overflow-hidden\">\r\n              {/* Header */}\r\n              <div className={cn(\"px-6 py-3 border-b flex items-center gap-3 h-[49px]\", isDark ? \"border-white/10\" : \"border-gray-200\")}>\r\n                <div className=\"flex items-center gap-2\">\r\n                  <Circle className={cn(\"w-4 h-4\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")} />\r\n                  <span className={cn(\"text-xs px-2 py-0.5 rounded\", isDark ? \"bg-white/10 text-[#9CA3AF]\" : \"bg-gray-100 text-gray-600\")}>\r\n                    {locale === 'es' ? 'Tarea' : 'Task'} ∨\r\n                  </span>\r\n                  <span className={cn(\"text-xs font-mono\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                    {selectedTask.id.slice(0, 8)}\r\n                  </span>\r\n                </div>\r\n                <div className=\"flex-1\" />\r\n              </div>\r\n\r\n              {/* Task Title with checkbox - v0.17.253: Editable name */}\r\n              <div className=\"px-6 py-4\">\r\n                <div className=\"flex items-start gap-3\">\r\n                  <button\r\n                    onClick={() => {\r\n                      const newProgress = selectedTask.progress === 100 ? 0 : 100;\r\n                      const newStatus = newProgress === 100 ? 'completed' : 'todo';\r\n                      const updatedTask = { ...selectedTask, progress: newProgress, status: newStatus as any };\r\n                      handleUpdate(updatedTask);\r\n                    }}\r\n                    className={cn(\r\n                      \"mt-2 w-5 h-5 rounded-full border-2 flex items-center justify-center transition-colors flex-shrink-0\",\r\n                      selectedTask.progress === 100\r\n                        ? \"bg-green-500 border-green-500\"\r\n                        : isDark ? \"border-white/30 hover:border-white/50\" : \"border-gray-300 hover:border-gray-400\"\r\n                    )}\r\n                  >\r\n                    {selectedTask.progress === 100 && (\r\n                      <CheckCircle2 className=\"w-3 h-3 text-white\" />\r\n                    )}\r\n                  </button>\r\n                  <input\r\n                    type=\"text\"\r\n                    value={localTaskName}\r\n                    onChange={(e) => handleTaskNameChange(e.target.value)}\r\n                    placeholder={locale === 'es' ? 'Nombre de la tarea...' : 'Task name...'}\r\n                    className={cn(\r\n                      \"text-xl font-semibold flex-1 bg-transparent outline-none border-none px-0 py-0\",\r\n                      \"focus:ring-0 focus:outline-none\",\r\n                      selectedTask.progress === 100\r\n                        ? \"line-through text-[#6B7280]\"\r\n                        : (isDark ? \"text-white placeholder:text-[#6B7280]\" : \"text-gray-900 placeholder:text-gray-400\")\r\n                    )}\r\n                  />\r\n                </div>\r\n              </div>\r\n\r\n              {/* Fields Grid */}\r\n              <div className=\"px-6 pb-6 flex-1 overflow-y-auto overflow-x-visible\">\r\n                <div className=\"grid grid-cols-2 gap-x-12 gap-y-5\">\r\n                  {/* Status */}\r\n                  <div className=\"flex items-center gap-3 relative\">\r\n                    <CheckCircle2 className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                      {locale === 'es' ? 'Estado' : 'Status'}\r\n                    </span>\r\n                    <button\r\n                      onClick={() => {\r\n                        closeAllDropdowns();\r\n                        setShowStatusDropdown(!showStatusDropdown);\r\n                      }}\r\n                      className={cn(\r\n                        \"text-xs px-2 py-1 rounded font-medium cursor-pointer transition-all hover:ring-2 hover:ring-white/20\",\r\n                        selectedTask.progress === 100 || selectedTask.status === 'completed'\r\n                          ? \"bg-green-500/20 text-green-400\"\r\n                          : (selectedTask.progress && selectedTask.progress > 0) || selectedTask.status === 'in-progress'\r\n                            ? \"bg-[#00E5CC]/20 text-[#00E5CC]\"\r\n                            : isDark ? \"bg-white/10 text-white\" : \"bg-gray-100 text-gray-700\"\r\n                      )}\r\n                    >\r\n                      {selectedTask.progress === 100 || selectedTask.status === 'completed'\r\n                        ? (locale === 'es' ? 'COMPLETADO' : 'DONE')\r\n                        : (selectedTask.progress && selectedTask.progress > 0) || selectedTask.status === 'in-progress'\r\n                          ? (locale === 'es' ? 'EN PROGRESO' : 'IN PROGRESS')\r\n                          : (locale === 'es' ? 'POR HACER' : 'TO DO')}\r\n                    </button>\r\n                    {/* Status Dropdown */}\r\n                    <AnimatePresence>\r\n                      {showStatusDropdown && (\r\n                        <>\r\n                          <div className=\"fixed inset-0 z-40\" onClick={() => setShowStatusDropdown(false)} />\r\n                          <motion.div\r\n                            initial={{ opacity: 0, y: -5 }}\r\n                            animate={{ opacity: 1, y: 0 }}\r\n                            exit={{ opacity: 0, y: -5 }}\r\n                            className={cn(\r\n                              \"absolute left-32 top-full mt-1 z-50 rounded-lg shadow-xl overflow-hidden min-w-[140px]\",\r\n                              isDark ? \"bg-[#1A1D25] border border-white/10\" : \"bg-white border border-gray-200\"\r\n                            )}\r\n                          >\r\n                            {[\r\n                              { id: 'todo', label: locale === 'es' ? 'Por hacer' : 'To Do', color: 'bg-gray-400' },\r\n                              { id: 'in-progress', label: locale === 'es' ? 'En progreso' : 'In Progress', color: 'bg-[#00E5CC]' },\r\n                              { id: 'completed', label: locale === 'es' ? 'Completado' : 'Done', color: 'bg-green-500' },\r\n                            ].map((status) => (\r\n                              <button\r\n                                key={status.id}\r\n                                onClick={() => updateTaskStatus(status.id)}\r\n                                className={cn(\r\n                                  \"w-full flex items-center gap-2 px-3 py-2 text-sm transition-colors text-left\",\r\n                                  isDark ? \"hover:bg-white/5\" : \"hover:bg-gray-50\",\r\n                                  selectedTask.status === status.id && (isDark ? \"bg-white/5\" : \"bg-gray-50\")\r\n                                )}\r\n                              >\r\n                                <span className={cn(\"w-2 h-2 rounded-full\", status.color)} />\r\n                                <span className={isDark ? \"text-white\" : \"text-gray-900\"}>{status.label}</span>\r\n                              </button>\r\n                            ))}\r\n                          </motion.div>\r\n                        </>\r\n                      )}\r\n                    </AnimatePresence>\r\n                  </div>\r\n\r\n                  {/* Assignees */}\r\n                  <div className=\"flex items-center gap-3 relative\">\r\n                    <User className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                      {locale === 'es' ? 'Asignados' : 'Assignees'}\r\n                    </span>\r\n                    <button\r\n                      onClick={() => {\r\n                        closeAllDropdowns();\r\n                        setShowAssigneesDropdown(!showAssigneesDropdown);\r\n                      }}\r\n                      className={cn(\r\n                        \"flex items-center gap-2 px-3 py-1.5 rounded-lg text-sm transition-colors\",\r\n                        isDark ? \"bg-white/5 hover:bg-white/10\" : \"bg-gray-100 hover:bg-gray-200\"\r\n                      )}\r\n                    >\r\n                      {selectedTask.assignees && selectedTask.assignees.length > 0 ? (\r\n                        <div className=\"flex items-center gap-1\">\r\n                          {selectedTask.assignees.slice(0, 3).map((assignee, i) => (\r\n                            <div\r\n                              key={i}\r\n                              className=\"w-6 h-6 rounded-full flex items-center justify-center text-white text-xs font-medium\"\r\n                              style={{ backgroundColor: assignee.color || '#8B5CF6' }}\r\n                              title={assignee.name}\r\n                            >\r\n                              {assignee.initials || assignee.name.slice(0, 2).toUpperCase()}\r\n                            </div>\r\n                          ))}\r\n                          {selectedTask.assignees.length > 3 && (\r\n                            <span className={cn(\"text-xs\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                              +{selectedTask.assignees.length - 3}\r\n                            </span>\r\n                          )}\r\n                        </div>\r\n                      ) : (\r\n                        <span className={cn(\"text-sm\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                          {locale === 'es' ? 'Agregar' : 'Add'}\r\n                        </span>\r\n                      )}\r\n                      <ChevronDown className={cn(\"w-3 h-3\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    </button>\r\n\r\n                    {/* Assignees Dropdown */}\r\n                    <AnimatePresence>\r\n                      {showAssigneesDropdown && (\r\n                        <>\r\n                          <div className=\"fixed inset-0 z-40\" onClick={() => setShowAssigneesDropdown(false)} />\r\n                          <motion.div\r\n                            initial={{ opacity: 0, y: -5 }}\r\n                            animate={{ opacity: 1, y: 0 }}\r\n                            exit={{ opacity: 0, y: -5 }}\r\n                            className={cn(\r\n                              \"absolute left-32 top-full mt-1 z-50 rounded-lg shadow-xl overflow-hidden min-w-[200px] max-h-[280px] overflow-y-auto\",\r\n                              isDark ? \"bg-[#1A1D25] border border-white/10\" : \"bg-white border border-gray-200\"\r\n                            )}\r\n                          >\r\n                            {availableUsers.length > 0 ? (\r\n                              availableUsers.map((user) => {\r\n                                const isSelected = selectedTask.assignees?.some(a => a.name === user.name);\r\n                                return (\r\n                                  <button\r\n                                    key={user.name}\r\n                                    onClick={() => {\r\n                                      const currentAssignees = selectedTask.assignees || [];\r\n                                      let newAssignees: Assignee[];\r\n                                      if (isSelected) {\r\n                                        newAssignees = currentAssignees.filter(a => a.name !== user.name);\r\n                                      } else {\r\n                                        newAssignees = [...currentAssignees, user];\r\n                                      }\r\n                                      updateTaskField('assignees', newAssignees);\r\n                                    }}\r\n                                    className={cn(\r\n                                      \"w-full flex items-center gap-3 px-3 py-2 text-sm transition-colors text-left\",\r\n                                      isDark ? \"hover:bg-white/5\" : \"hover:bg-gray-50\",\r\n                                      isSelected && (isDark ? \"bg-white/5\" : \"bg-gray-50\")\r\n                                    )}\r\n                                  >\r\n                                    <div\r\n                                      className=\"w-7 h-7 rounded-full flex items-center justify-center text-white text-xs font-medium flex-shrink-0\"\r\n                                      style={{ backgroundColor: user.color || '#8B5CF6' }}\r\n                                    >\r\n                                      {user.initials || user.name.slice(0, 2).toUpperCase()}\r\n                                    </div>\r\n                                    <span className={cn(\"flex-1\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                                      {user.name}\r\n                                    </span>\r\n                                    {isSelected && (\r\n                                      <Check className=\"w-4 h-4 text-green-500\" />\r\n                                    )}\r\n                                  </button>\r\n                                );\r\n                              })\r\n                            ) : (\r\n                              <div className={cn(\"px-3 py-4 text-sm text-center\", isDark ? \"text-[#6B7280]\" : \"text-gray-500\")}>\r\n                                {locale === 'es' ? 'No hay usuarios disponibles' : 'No users available'}\r\n                              </div>\r\n                            )}\r\n                          </motion.div>\r\n                        </>\r\n                      )}\r\n                    </AnimatePresence>\r\n                  </div>\r\n\r\n                  {/* Dates */}\r\n                  <div className=\"flex items-center gap-3 relative\">\r\n                    <CalendarDays className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                      {locale === 'es' ? 'Fechas' : 'Dates'}\r\n                    </span>\r\n                    <button\r\n                      onClick={() => {\r\n                        setShowDatePicker(showDatePicker ? null : 'start');\r\n                        setDatePickerMonth(selectedTask.startDate || new Date());\r\n                      }}\r\n                      className={cn(\r\n                        \"flex items-center gap-2 px-3 py-1.5 rounded-lg text-sm transition-colors\",\r\n                        isDark ? \"bg-white/5 hover:bg-white/10 text-white\" : \"bg-gray-100 hover:bg-gray-200 text-gray-900\"\r\n                      )}\r\n                    >\r\n                      {selectedTask.startDate?.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { month: 'short', day: 'numeric' }) || (locale === 'es' ? 'Inicio' : 'Start')}\r\n                      <span className={cn(\"mx-1\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>→</span>\r\n                      {selectedTask.endDate?.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { month: 'short', day: 'numeric' }) || (locale === 'es' ? 'Fin' : 'End')}\r\n                    </button>\r\n\r\n                    {/* Date Picker Popover */}\r\n                    <AnimatePresence>\r\n                      {showDatePicker && (\r\n                        <>\r\n                          <div className=\"fixed inset-0 z-40\" onClick={() => setShowDatePicker(null)} />\r\n                          <motion.div\r\n                            initial={{ opacity: 0, y: -10 }}\r\n                            animate={{ opacity: 1, y: 0 }}\r\n                            exit={{ opacity: 0, y: -10 }}\r\n                            className={cn(\r\n                              \"absolute left-0 top-full mt-2 z-50 rounded-xl shadow-2xl overflow-hidden flex\",\r\n                              isDark ? \"bg-[#1A1D25] border border-white/10\" : \"bg-white border border-gray-200\"\r\n                            )}\r\n                            onClick={(e) => e.stopPropagation()}\r\n                          >\r\n                            {/* Quick Options - Left Side */}\r\n                            <div className={cn(\"w-44 py-2 border-r\", isDark ? \"border-white/10\" : \"border-gray-200\")}>\r\n                              {(() => {\r\n                                const today = new Date();\r\n                                const tomorrow = new Date(today); tomorrow.setDate(today.getDate() + 1);\r\n                                const nextSaturday = new Date(today); nextSaturday.setDate(today.getDate() + ((6 - today.getDay() + 7) % 7 || 7));\r\n                                const nextMonday = new Date(today); nextMonday.setDate(today.getDate() + ((1 - today.getDay() + 7) % 7 || 7));\r\n                                const nextWeekend = new Date(today); nextWeekend.setDate(today.getDate() + ((6 - today.getDay() + 7) % 7) + 7);\r\n                                const twoWeeks = new Date(today); twoWeeks.setDate(today.getDate() + 14);\r\n                                const fourWeeks = new Date(today); fourWeeks.setDate(today.getDate() + 28);\r\n\r\n                                const quickOptions = [\r\n                                  { label: locale === 'es' ? 'Hoy' : 'Today', date: today, display: today.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { weekday: 'short' }).slice(0, 3) + '.' },\r\n                                  { label: locale === 'es' ? 'Mañana' : 'Tomorrow', date: tomorrow, display: tomorrow.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { weekday: 'short' }).slice(0, 3) + '.' },\r\n                                  { label: locale === 'es' ? 'Este fin de semana' : 'This weekend', date: nextSaturday, display: locale === 'es' ? 'sáb.' : 'sat.' },\r\n                                  { label: locale === 'es' ? 'Próxima semana' : 'Next week', date: nextMonday, display: locale === 'es' ? 'lun.' : 'mon.' },\r\n                                  { label: locale === 'es' ? 'Próximo fin de semana' : 'Next weekend', date: nextWeekend, display: nextWeekend.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { day: 'numeric', month: 'short' }) },\r\n                                  { label: locale === 'es' ? '2 semanas' : '2 weeks', date: twoWeeks, display: twoWeeks.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { day: 'numeric', month: 'short' }) },\r\n                                  { label: locale === 'es' ? '4 semanas' : '4 weeks', date: fourWeeks, display: fourWeeks.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { day: 'numeric', month: 'short' }) },\r\n                                ];\r\n\r\n                                return quickOptions.map((option, i) => (\r\n                                  <button\r\n                                    key={i}\r\n                                    className={cn(\r\n                                      \"w-full flex items-center justify-between px-3 py-2 text-sm transition-colors\",\r\n                                      isDark ? \"hover:bg-white/5 text-white\" : \"hover:bg-gray-50 text-gray-900\"\r\n                                    )}\r\n                                    onClick={() => {\r\n                                      if (showDatePicker === 'start') {\r\n                                        const newEndDate = selectedTask.endDate && option.date > selectedTask.endDate\r\n                                          ? option.date\r\n                                          : selectedTask.endDate;\r\n                                        updateTaskDates(option.date, newEndDate);\r\n                                        setShowDatePicker('end');\r\n                                      } else {\r\n                                        const newStartDate = selectedTask.startDate && option.date < selectedTask.startDate\r\n                                          ? option.date\r\n                                          : selectedTask.startDate;\r\n                                        updateTaskDates(newStartDate, option.date);\r\n                                        setShowDatePicker(null);\r\n                                      }\r\n                                    }}\r\n                                  >\r\n                                    <span>{option.label}</span>\r\n                                    <span className={cn(\"text-xs\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                                      {option.display}\r\n                                    </span>\r\n                                  </button>\r\n                                ));\r\n                              })()}\r\n                              {/* Clear dates button */}\r\n                              <div className={cn(\"border-t mt-2 pt-2\", isDark ? \"border-white/10\" : \"border-gray-200\")}>\r\n                                <button\r\n                                  onClick={() => {\r\n                                    updateTaskDates(undefined, undefined);\r\n                                    setShowDatePicker(null);\r\n                                  }}\r\n                                  className={cn(\r\n                                    \"w-full flex items-center justify-between px-3 py-2 text-sm transition-colors\",\r\n                                    isDark ? \"hover:bg-white/5 text-red-400\" : \"hover:bg-gray-50 text-red-500\"\r\n                                  )}\r\n                                >\r\n                                  <span>{locale === 'es' ? 'Quitar fechas' : 'Clear dates'}</span>\r\n                                  <X className=\"w-4 h-4 opacity-50\" />\r\n                                </button>\r\n                              </div>\r\n                            </div>\r\n\r\n                            {/* Calendar - Right Side */}\r\n                            <div className=\"p-4\">\r\n                              {/* Selection indicator */}\r\n                              <div className={cn(\"text-xs mb-3 px-2 py-1 rounded\", isDark ? \"bg-white/5 text-[#9CA3AF]\" : \"bg-gray-100 text-gray-600\")}>\r\n                                {showDatePicker === 'start'\r\n                                  ? (locale === 'es' ? '📅 Selecciona fecha de inicio' : '📅 Select start date')\r\n                                  : (locale === 'es' ? '📅 Selecciona fecha de fin' : '📅 Select end date')}\r\n                              </div>\r\n                              {/* Month Header */}\r\n                              <div className=\"flex items-center justify-between mb-4\">\r\n                                <span className={cn(\"font-medium\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                                  {datePickerMonth.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { month: 'long', year: 'numeric' })}\r\n                                </span>\r\n                                <div className=\"flex items-center gap-1\">\r\n                                  <button\r\n                                    onClick={() => setDatePickerMonth(new Date())}\r\n                                    className={cn(\r\n                                      \"p-1 rounded text-sm transition-colors\",\r\n                                      isDark ? \"hover:bg-white/10 text-white\" : \"hover:bg-gray-100 text-gray-700\"\r\n                                    )}\r\n                                  >\r\n                                    {locale === 'es' ? 'Hoy' : 'Today'}\r\n                                  </button>\r\n                                  <button\r\n                                    onClick={() => setDatePickerMonth(new Date(datePickerMonth.getFullYear(), datePickerMonth.getMonth() - 1))}\r\n                                    className={cn(\"p-1 rounded\", isDark ? \"hover:bg-white/10\" : \"hover:bg-gray-100\")}\r\n                                  >\r\n                                    <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" /></svg>\r\n                                  </button>\r\n                                  <button\r\n                                    onClick={() => setDatePickerMonth(new Date(datePickerMonth.getFullYear(), datePickerMonth.getMonth() + 1))}\r\n                                    className={cn(\"p-1 rounded\", isDark ? \"hover:bg-white/10\" : \"hover:bg-gray-100\")}\r\n                                  >\r\n                                    <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" /></svg>\r\n                                  </button>\r\n                                </div>\r\n                              </div>\r\n\r\n                              {/* Weekday Headers */}\r\n                              <div className=\"grid grid-cols-7 gap-1 mb-2\">\r\n                                {(locale === 'es'\r\n                                  ? ['do', 'lu', 'ma', 'mi', 'ju', 'vi', 'sá']\r\n                                  : ['su', 'mo', 'tu', 'we', 'th', 'fr', 'sa']\r\n                                ).map((day) => (\r\n                                  <div key={day} className={cn(\"w-8 h-8 flex items-center justify-center text-xs\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                                    {day}\r\n                                  </div>\r\n                                ))}\r\n                              </div>\r\n\r\n                              {/* Calendar Days */}\r\n                              <div className=\"grid grid-cols-7 gap-1\">\r\n                                {getDatePickerDays().map((d, i) => {\r\n                                  const isToday = d.date.toDateString() === new Date().toDateString();\r\n                                  const isStartDate = selectedTask.startDate?.toDateString() === d.date.toDateString();\r\n                                  const isEndDate = selectedTask.endDate?.toDateString() === d.date.toDateString();\r\n                                  const isSelected = isStartDate || isEndDate;\r\n                                  const isInRange = selectedTask.startDate && selectedTask.endDate &&\r\n                                    d.date >= selectedTask.startDate && d.date <= selectedTask.endDate;\r\n\r\n                                  return (\r\n                                    <button\r\n                                      key={i}\r\n                                      onClick={() => {\r\n                                        const clickedDate = new Date(d.date);\r\n                                        if (showDatePicker === 'start') {\r\n                                          const newEndDate = selectedTask.endDate && clickedDate > selectedTask.endDate\r\n                                            ? clickedDate\r\n                                            : selectedTask.endDate;\r\n                                          updateTaskDates(clickedDate, newEndDate);\r\n                                          setShowDatePicker('end');\r\n                                        } else {\r\n                                          const newStartDate = selectedTask.startDate && clickedDate < selectedTask.startDate\r\n                                            ? clickedDate\r\n                                            : selectedTask.startDate;\r\n                                          updateTaskDates(newStartDate, clickedDate);\r\n                                          setShowDatePicker(null);\r\n                                        }\r\n                                      }}\r\n                                      className={cn(\r\n                                        \"w-8 h-8 rounded-full flex items-center justify-center text-sm transition-colors\",\r\n                                        !d.isCurrentMonth && (isDark ? \"text-[#4B5563]\" : \"text-gray-300\"),\r\n                                        d.isCurrentMonth && (isDark ? \"text-white\" : \"text-gray-900\"),\r\n                                        isToday && \"ring-2 ring-[#00E5CC]\",\r\n                                        isStartDate && \"bg-[#00E5CC] text-white\",\r\n                                        isEndDate && !isStartDate && \"bg-[#7C3AED] text-white\",\r\n                                        isInRange && !isSelected && (isDark ? \"bg-[#7C3AED]/20\" : \"bg-purple-100\"),\r\n                                        !isSelected && (isDark ? \"hover:bg-white/10\" : \"hover:bg-gray-100\")\r\n                                      )}\r\n                                    >\r\n                                      {d.date.getDate()}\r\n                                    </button>\r\n                                  );\r\n                                })}\r\n                              </div>\r\n                            </div>\r\n                          </motion.div>\r\n                        </>\r\n                      )}\r\n                    </AnimatePresence>\r\n                  </div>\r\n\r\n                  {/* Priority */}\r\n                  <div className=\"flex items-center gap-3 relative\">\r\n                    <Flag className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                      {locale === 'es' ? 'Prioridad' : 'Priority'}\r\n                    </span>\r\n                    <button\r\n                      onClick={() => {\r\n                        closeAllDropdowns();\r\n                        setShowPriorityDropdown(!showPriorityDropdown);\r\n                      }}\r\n                      className={cn(\r\n                        \"text-xs px-2 py-1 rounded font-medium transition-all hover:ring-2 hover:ring-white/20\",\r\n                        selectedTask.priority === 'high' || selectedTask.priority === 'urgent'\r\n                          ? \"bg-red-500/20 text-red-400\"\r\n                          : selectedTask.priority === 'medium'\r\n                            ? \"bg-yellow-500/20 text-yellow-400\"\r\n                            : selectedTask.priority === 'low'\r\n                              ? \"bg-green-500/20 text-green-400\"\r\n                              : isDark ? \"bg-white/10 text-white\" : \"bg-gray-100 text-gray-700\"\r\n                      )}\r\n                    >\r\n                      {selectedTask.priority\r\n                        ? (selectedTask.priority === 'high' || selectedTask.priority === 'urgent'\r\n                            ? (locale === 'es' ? 'Alta' : 'High')\r\n                            : selectedTask.priority === 'medium'\r\n                              ? (locale === 'es' ? 'Media' : 'Medium')\r\n                              : (locale === 'es' ? 'Baja' : 'Low'))\r\n                        : (locale === 'es' ? 'Sin prioridad' : 'No priority')}\r\n                    </button>\r\n                    {/* Priority Dropdown */}\r\n                    <AnimatePresence>\r\n                      {showPriorityDropdown && (\r\n                        <>\r\n                          <div className=\"fixed inset-0 z-40\" onClick={() => setShowPriorityDropdown(false)} />\r\n                          <motion.div\r\n                            initial={{ opacity: 0, y: -5 }}\r\n                            animate={{ opacity: 1, y: 0 }}\r\n                            exit={{ opacity: 0, y: -5 }}\r\n                            className={cn(\r\n                              \"absolute left-32 top-full mt-1 z-50 rounded-lg shadow-xl overflow-hidden min-w-[140px]\",\r\n                              isDark ? \"bg-[#1A1D25] border border-white/10\" : \"bg-white border border-gray-200\"\r\n                            )}\r\n                          >\r\n                            {[\r\n                              { id: 'urgent', label: locale === 'es' ? 'Urgente' : 'Urgent', color: 'bg-red-500' },\r\n                              { id: 'high', label: locale === 'es' ? 'Alta' : 'High', color: 'bg-orange-500' },\r\n                              { id: 'medium', label: locale === 'es' ? 'Media' : 'Medium', color: 'bg-yellow-500' },\r\n                              { id: 'low', label: locale === 'es' ? 'Baja' : 'Low', color: 'bg-green-500' },\r\n                              { id: undefined, label: locale === 'es' ? 'Sin prioridad' : 'No priority', color: 'bg-gray-400' },\r\n                            ].map((priority) => (\r\n                              <button\r\n                                key={priority.id || 'none'}\r\n                                onClick={() => {\r\n                                  updateTaskField('priority', priority.id as Task['priority']);\r\n                                  setShowPriorityDropdown(false);\r\n                                }}\r\n                                className={cn(\r\n                                  \"w-full flex items-center gap-2 px-3 py-2 text-sm transition-colors text-left\",\r\n                                  isDark ? \"hover:bg-white/5\" : \"hover:bg-gray-50\",\r\n                                  selectedTask.priority === priority.id && (isDark ? \"bg-white/5\" : \"bg-gray-50\")\r\n                                )}\r\n                              >\r\n                                <span className={cn(\"w-2 h-2 rounded-full\", priority.color)} />\r\n                                <span className={isDark ? \"text-white\" : \"text-gray-900\"}>{priority.label}</span>\r\n                              </button>\r\n                            ))}\r\n                          </motion.div>\r\n                        </>\r\n                      )}\r\n                    </AnimatePresence>\r\n                  </div>\r\n\r\n                  {/* Duration */}\r\n                  <div className=\"flex items-center gap-3\">\r\n                    <Clock className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                      {locale === 'es' ? 'Duración' : 'Duration'}\r\n                    </span>\r\n                    <span className={cn(\"text-sm\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                      {selectedTask.startDate && selectedTask.endDate\r\n                        ? `${Math.ceil((selectedTask.endDate.getTime() - selectedTask.startDate.getTime()) / (1000 * 60 * 60 * 24))} ${locale === 'es' ? 'días' : 'days'}`\r\n                        : (locale === 'es' ? 'Sin definir' : 'Not set')}\r\n                    </span>\r\n                  </div>\r\n\r\n                  {/* Progress */}\r\n                  <div className=\"flex items-center gap-3\">\r\n                    <div className={cn(\"w-4 h-4 rounded-full border-2\", isDark ? \"border-[#6B7280]\" : \"border-gray-400\")} />\r\n                    <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                      {locale === 'es' ? 'Progreso' : 'Progress'}\r\n                    </span>\r\n                    <div className=\"flex items-center gap-2 flex-1\">\r\n                      {editingProgress ? (\r\n                        <input\r\n                          type=\"range\"\r\n                          min=\"0\"\r\n                          max=\"100\"\r\n                          step=\"5\"\r\n                          value={selectedTask.progress || 0}\r\n                          onChange={(e) => {\r\n                            const newProgress = parseInt(e.target.value);\r\n                            let newStatus = selectedTask.status;\r\n                            if (newProgress === 100) newStatus = 'completed';\r\n                            else if (newProgress > 0) newStatus = 'in-progress';\r\n                            else newStatus = 'todo';\r\n                            const updatedTask = { ...selectedTask, progress: newProgress, status: newStatus as any };\r\n                            handleUpdate(updatedTask);\r\n                          }}\r\n                          onBlur={() => setEditingProgress(false)}\r\n                          className={cn(\r\n                            \"flex-1 max-w-[120px] h-2 rounded-full appearance-none cursor-pointer\",\r\n                            isDark ? \"bg-white/10\" : \"bg-gray-200\",\r\n                            \"[&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-[#00E5CC] [&::-webkit-slider-thumb]:cursor-pointer\"\r\n                          )}\r\n                          autoFocus\r\n                        />\r\n                      ) : (\r\n                        <button\r\n                          onClick={() => setEditingProgress(true)}\r\n                          className={cn(\r\n                            \"flex-1 h-2 rounded-full overflow-hidden max-w-[120px] cursor-pointer hover:ring-2 hover:ring-white/20 transition-all\",\r\n                            isDark ? \"bg-white/10\" : \"bg-gray-200\"\r\n                          )}\r\n                        >\r\n                          <div\r\n                            className={cn(\r\n                              \"h-full rounded-full transition-all\",\r\n                              selectedTask.progress === 100 ? \"bg-green-500\" : \"bg-[#00E5CC]\"\r\n                            )}\r\n                            style={{ width: `${selectedTask.progress || 0}%` }}\r\n                          />\r\n                        </button>\r\n                      )}\r\n                      <span className={cn(\"text-sm font-medium min-w-[40px]\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                        {selectedTask.progress || 0}%\r\n                      </span>\r\n                    </div>\r\n                  </div>\r\n\r\n                  {/* Time Tracking - v1.1.0 - Rediseñado estilo ClickUp */}\r\n                  {enableTimeTracking && (\r\n                    <>\r\n                      {/* Row 1: Duración estimada (Esfuerzo Estimado) - disabled for completed tasks */}\r\n                      <div className=\"flex items-center gap-3 relative\">\r\n                        <Hourglass className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                        <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                          {locale === 'es' ? 'Duración estimada' : 'Estimated duration'}\r\n                        </span>\r\n                        <div className=\"flex items-center gap-2 flex-1\">\r\n                          {(selectedTask.status === 'completed' || selectedTask.progress === 100) ? (\r\n                            <span\r\n                              className={cn(\r\n                                \"text-sm px-2 py-0.5 cursor-not-allowed\",\r\n                                isDark ? \"text-gray-600\" : \"text-gray-300\"\r\n                              )}\r\n                              title={locale === 'es' ? 'Tarea completada' : 'Task completed'}\r\n                            >\r\n                              {timeTrackingSummary?.estimateMinutes\r\n                                ? formatMinutesToDisplay(timeTrackingSummary.estimateMinutes)\r\n                                : (locale === 'es' ? 'Vacío' : 'Empty')}\r\n                            </span>\r\n                          ) : timeTrackingSummary?.estimateMinutes ? (\r\n                            <button\r\n                              type=\"button\"\r\n                              onClick={() => setShowTimePopover('estimate')}\r\n                              className={cn(\r\n                                \"text-sm px-2 py-0.5 rounded\",\r\n                                isDark ? \"text-white hover:bg-white/10\" : \"text-gray-900 hover:bg-gray-100\"\r\n                              )}\r\n                            >\r\n                              {formatMinutesToDisplay(timeTrackingSummary.estimateMinutes)}\r\n                            </button>\r\n                          ) : (\r\n                            <button\r\n                              type=\"button\"\r\n                              onClick={() => setShowTimePopover('estimate')}\r\n                              className={cn(\r\n                                \"text-sm\",\r\n                                isDark ? \"text-[#6B7280] hover:text-[#9CA3AF]\" : \"text-gray-400 hover:text-gray-500\"\r\n                              )}\r\n                            >\r\n                              {locale === 'es' ? 'Vacío' : 'Empty'}\r\n                            </button>\r\n                          )}\r\n                        </div>\r\n\r\n                        {/* Popover for estimate */}\r\n                        <AnimatePresence>\r\n                          {showTimePopover === 'estimate' && (\r\n                            <motion.div\r\n                              initial={{ opacity: 0, y: -10 }}\r\n                              animate={{ opacity: 1, y: 0 }}\r\n                              exit={{ opacity: 0, y: -10 }}\r\n                              className=\"absolute top-full left-28 mt-2 z-50\"\r\n                            >\r\n                              <TimeInputPopover\r\n                                mode=\"estimate\"\r\n                                locale={locale}\r\n                                isDark={isDark}\r\n                                currentValue={timeTrackingSummary?.estimateMinutes || null}\r\n                                onSave={async (minutes) => {\r\n                                  await onEstimateUpdate?.(selectedTask.id, minutes);\r\n                                  setShowTimePopover(false);\r\n                                }}\r\n                                onClose={() => setShowTimePopover(false)}\r\n                              />\r\n                            </motion.div>\r\n                          )}\r\n                        </AnimatePresence>\r\n                      </div>\r\n\r\n                      {/* Row 2: Tiempo ofertado (Quoted Time) - disabled for completed tasks */}\r\n                      {/* v1.4.11: Governance v2.0 - Blur for unauthorized users */}\r\n                      <div className=\"flex items-center gap-3 relative\">\r\n                        <FileText className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                        <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                          {locale === 'es' ? 'Tiempo ofertado' : 'Quoted time'}\r\n                        </span>\r\n                        <div className=\"flex items-center gap-2 flex-1\">\r\n                          {/* v1.4.11: Blurred mode for unauthorized users */}\r\n                          {blurFinancials ? (\r\n                            <span\r\n                              className={cn(\r\n                                \"text-sm select-none blur-[4px] opacity-60 pointer-events-none\",\r\n                                isDark ? \"text-[#94A3B8]\" : \"text-gray-500\"\r\n                              )}\r\n                              title={locale === 'es' ? 'No tienes permisos para ver este dato' : \"You don't have permission to view this data\"}\r\n                              aria-hidden=\"true\"\r\n                            >\r\n                              ••••\r\n                            </span>\r\n                          ) : (selectedTask.status === 'completed' || selectedTask.progress === 100) ? (\r\n                            <span\r\n                              className={cn(\r\n                                \"text-sm px-2 py-0.5 cursor-not-allowed\",\r\n                                isDark ? \"text-gray-600\" : \"text-gray-300\"\r\n                              )}\r\n                              title={locale === 'es' ? 'Tarea completada' : 'Task completed'}\r\n                            >\r\n                              {(selectedTask as any).quotedMinutes\r\n                                ? formatMinutesToDisplay((selectedTask as any).quotedMinutes)\r\n                                : (locale === 'es' ? 'Vacío' : 'Empty')}\r\n                            </span>\r\n                          ) : (selectedTask as any).quotedMinutes ? (\r\n                            <button\r\n                              type=\"button\"\r\n                              onClick={() => setShowTimePopover('quoted')}\r\n                              className={cn(\r\n                                \"text-sm px-2 py-0.5 rounded\",\r\n                                isDark ? \"text-white hover:bg-white/10\" : \"text-gray-900 hover:bg-gray-100\"\r\n                              )}\r\n                            >\r\n                              {formatMinutesToDisplay((selectedTask as any).quotedMinutes)}\r\n                            </button>\r\n                          ) : (\r\n                            <button\r\n                              type=\"button\"\r\n                              onClick={() => setShowTimePopover('quoted')}\r\n                              className={cn(\r\n                                \"text-sm\",\r\n                                isDark ? \"text-[#6B7280] hover:text-[#9CA3AF]\" : \"text-gray-400 hover:text-gray-500\"\r\n                              )}\r\n                            >\r\n                              {locale === 'es' ? 'Vacío' : 'Empty'}\r\n                            </button>\r\n                          )}\r\n                        </div>\r\n\r\n                        {/* Popover for quoted - only show if not blurred */}\r\n                        <AnimatePresence>\r\n                          {showTimePopover === 'quoted' && !blurFinancials && (\r\n                            <motion.div\r\n                              initial={{ opacity: 0, y: -10 }}\r\n                              animate={{ opacity: 1, y: 0 }}\r\n                              exit={{ opacity: 0, y: -10 }}\r\n                              className=\"absolute top-full left-28 mt-2 z-50\"\r\n                            >\r\n                              <TimeInputPopover\r\n                                mode=\"quoted\"\r\n                                locale={locale}\r\n                                isDark={isDark}\r\n                                currentValue={(selectedTask as any).quotedMinutes || null}\r\n                                onSave={async (minutes) => {\r\n                                  if (onSoldEffortUpdate) {\r\n                                    await onSoldEffortUpdate(selectedTask.id, minutes);\r\n                                    // Update local state to reflect the change\r\n                                    setSelectedTask(prev => prev ? { ...prev, quotedMinutes: minutes } as any : null);\r\n                                  } else {\r\n                                    updateTaskField('quotedMinutes' as any, minutes);\r\n                                  }\r\n                                  setShowTimePopover(false);\r\n                                }}\r\n                                onClose={() => setShowTimePopover(false)}\r\n                              />\r\n                            </motion.div>\r\n                          )}\r\n                        </AnimatePresence>\r\n                      </div>\r\n\r\n                      {/* Row 3: Registrar el tiempo (Log Time) */}\r\n                      <div className=\"flex items-center gap-3 relative\">\r\n                        <Clock className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                        <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                          {locale === 'es' ? 'Registrar tiempo' : 'Track time'}\r\n                        </span>\r\n                        <div className=\"flex items-center gap-2 flex-1\">\r\n                          {/* Timer Play/Stop toggle - disabled for completed tasks */}\r\n                          {(selectedTask.status === 'completed' || selectedTask.progress === 100) ? (\r\n                            <div\r\n                              className={cn(\r\n                                \"flex items-center gap-1.5 p-1.5 rounded-full cursor-not-allowed\",\r\n                                isDark\r\n                                  ? \"bg-white/5 text-gray-600\"\r\n                                  : \"bg-gray-50 text-gray-300\"\r\n                              )}\r\n                              title={locale === 'es' ? 'Tarea completada' : 'Task completed'}\r\n                            >\r\n                              <Play className=\"w-3.5 h-3.5 fill-current\" />\r\n                            </div>\r\n                          ) : isTimerRunning ? (\r\n                            <button\r\n                              type=\"button\"\r\n                              onClick={() => onTimerStop?.(selectedTask.id)}\r\n                              className={cn(\r\n                                \"flex items-center gap-1.5 px-2 py-1 rounded text-sm transition-colors\",\r\n                                \"bg-red-500/10 text-red-500 hover:bg-red-500/20\"\r\n                              )}\r\n                            >\r\n                              <Square className=\"w-3.5 h-3.5 fill-current\" />\r\n                              {formatSecondsToDisplay(timerElapsedSeconds || 0)}\r\n                            </button>\r\n                          ) : (\r\n                            <button\r\n                              type=\"button\"\r\n                              onClick={() => onTimerStart?.(selectedTask.id)}\r\n                              className={cn(\r\n                                \"flex items-center gap-1.5 p-1.5 rounded-full transition-colors\",\r\n                                isDark\r\n                                  ? \"bg-white/10 text-white hover:bg-white/20\"\r\n                                  : \"bg-gray-100 text-gray-700 hover:bg-gray-200\"\r\n                              )}\r\n                              title={locale === 'es' ? 'Iniciar temporizador' : 'Start timer'}\r\n                            >\r\n                              <Play className=\"w-3.5 h-3.5 fill-current\" />\r\n                            </button>\r\n                          )}\r\n\r\n                          {/* Add time button - disabled for completed tasks */}\r\n                          {(selectedTask.status === 'completed' || selectedTask.progress === 100) ? (\r\n                            <div\r\n                              className={cn(\r\n                                \"flex items-center gap-1.5 px-2 py-1 rounded text-sm cursor-not-allowed\",\r\n                                isDark ? \"text-gray-600\" : \"text-gray-300\"\r\n                              )}\r\n                              title={locale === 'es' ? 'Tarea completada' : 'Task completed'}\r\n                            >\r\n                              <Plus className=\"w-3.5 h-3.5\" />\r\n                              {locale === 'es' ? 'Agregar tiempo' : 'Add time'}\r\n                            </div>\r\n                          ) : (\r\n                            <button\r\n                              type=\"button\"\r\n                              onClick={() => setShowTimePopover('log')}\r\n                              className={cn(\r\n                                \"flex items-center gap-1.5 px-2 py-1 rounded text-sm transition-colors\",\r\n                                isDark\r\n                                  ? \"text-[#9CA3AF] hover:bg-white/10 hover:text-white\"\r\n                                  : \"text-gray-500 hover:bg-gray-100 hover:text-gray-700\"\r\n                              )}\r\n                            >\r\n                              <Plus className=\"w-3.5 h-3.5\" />\r\n                              {locale === 'es' ? 'Agregar tiempo' : 'Add time'}\r\n                            </button>\r\n                          )}\r\n\r\n                          {/* Logged time display with health bar */}\r\n                          {timeTrackingSummary && timeTrackingSummary.loggedMinutes > 0 && (\r\n                            <div className=\"flex items-center gap-2\">\r\n                              <span className={cn(\r\n                                \"text-sm font-medium\",\r\n                                timeTrackingSummary.health === 'over-budget'\r\n                                  ? \"text-red-500\"\r\n                                  : timeTrackingSummary.health === 'at-risk'\r\n                                    ? \"text-yellow-500\"\r\n                                    : isDark ? \"text-white\" : \"text-gray-900\"\r\n                              )}>\r\n                                {formatMinutesToDisplay(timeTrackingSummary.loggedMinutes)}\r\n                                {timeTrackingSummary.estimateMinutes && (\r\n                                  <span className={cn(\"font-normal\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                                    {' / '}{formatMinutesToDisplay(timeTrackingSummary.estimateMinutes)}\r\n                                  </span>\r\n                                )}\r\n                              </span>\r\n                              {/* Mini health bar */}\r\n                              {timeTrackingSummary.health !== 'no-estimate' && (\r\n                                <div className=\"w-16 h-1.5 rounded-full overflow-hidden bg-gray-200 dark:bg-gray-700\">\r\n                                  <div\r\n                                    className={cn(\r\n                                      \"h-full rounded-full transition-all\",\r\n                                      timeTrackingSummary.health === 'over-budget'\r\n                                        ? \"bg-red-500\"\r\n                                        : timeTrackingSummary.health === 'at-risk'\r\n                                          ? \"bg-yellow-500\"\r\n                                          : \"bg-green-500\"\r\n                                    )}\r\n                                    style={{ width: `${Math.min(100, timeTrackingSummary.progressPercent || 0)}%` }}\r\n                                  />\r\n                                </div>\r\n                              )}\r\n                            </div>\r\n                          )}\r\n                        </div>\r\n\r\n                        {/* Time Input Popover for Log */}\r\n                        <AnimatePresence>\r\n                          {showTimePopover === 'log' && (\r\n                            <motion.div\r\n                              initial={{ opacity: 0, y: -10 }}\r\n                              animate={{ opacity: 1, y: 0 }}\r\n                              exit={{ opacity: 0, y: -10 }}\r\n                              className=\"absolute top-full left-28 mt-2 z-50\"\r\n                            >\r\n                              <TimeInputPopover\r\n                                mode=\"log\"\r\n                                locale={locale}\r\n                                isDark={isDark}\r\n                                currentValue={null}\r\n                                onSave={async (minutes, note) => {\r\n                                  if (minutes) {\r\n                                    await onTimeLog?.(selectedTask.id, { durationMinutes: minutes, note, source: 'manual' });\r\n                                  }\r\n                                  setShowTimePopover(false);\r\n                                }}\r\n                                onClose={() => setShowTimePopover(false)}\r\n                              />\r\n                            </motion.div>\r\n                          )}\r\n                        </AnimatePresence>\r\n                      </div>\r\n                    </>\r\n                  )}\r\n\r\n                  {/* Tags */}\r\n                  <div className=\"flex items-center gap-3\">\r\n                    <Tag className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                      {locale === 'es' ? 'Etiquetas' : 'Tags'}\r\n                    </span>\r\n                    <TagPicker\r\n                      selectedTags={selectedTask.tags || []}\r\n                      availableTags={availableTags}\r\n                      onChange={(newTags) => {\r\n                        updateTaskField('tags', newTags);\r\n                      }}\r\n                      onCreateTag={onCreateTag}\r\n                      theme={tagPickerTheme}\r\n                    />\r\n                  </div>\r\n\r\n                  {/* Dependencies */}\r\n                  <div className=\"flex items-start gap-3 relative\">\r\n                    <Link2 className={cn(\"w-4 h-4 mt-1.5\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    <span className={cn(\"text-sm w-28 truncate flex-shrink-0 mt-1\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                      {locale === 'es' ? 'Relaciones' : 'Relations'}\r\n                    </span>\r\n                    <div className=\"flex-1\">\r\n                      {/* Selected dependencies as chips */}\r\n                      {selectedTask.dependencies && selectedTask.dependencies.length > 0 && (\r\n                        <div className=\"flex flex-wrap gap-1.5 mb-2\">\r\n                          {selectedTask.dependencies.map((depId) => {\r\n                            const depTask = availableTasks.find(t => t.id === depId);\r\n                            return (\r\n                              <span\r\n                                key={depId}\r\n                                className={cn(\r\n                                  \"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium\",\r\n                                  isDark ? \"bg-[#00E5CC]/20 text-[#00E5CC]\" : \"bg-[#00E5CC]/15 text-[#00C4AE]\"\r\n                                )}\r\n                              >\r\n                                {depTask?.name || depId.slice(0, 8)}\r\n                                <button\r\n                                  onClick={() => {\r\n                                    const newDeps = (selectedTask.dependencies || []).filter(id => id !== depId);\r\n                                    updateTaskField('dependencies', newDeps);\r\n                                  }}\r\n                                  className={cn(\r\n                                    \"ml-0.5 hover:bg-white/20 rounded-full p-0.5 transition-colors\"\r\n                                  )}\r\n                                >\r\n                                  <X className=\"w-3 h-3\" />\r\n                                </button>\r\n                              </span>\r\n                            );\r\n                          })}\r\n                        </div>\r\n                      )}\r\n\r\n                      {/* Add dependency button */}\r\n                      <button\r\n                        onClick={() => {\r\n                          closeAllDropdowns();\r\n                          setShowDependenciesDropdown(!showDependenciesDropdown);\r\n                        }}\r\n                        className={cn(\r\n                          \"flex items-center gap-2 px-3 py-1.5 rounded-lg text-sm transition-colors\",\r\n                          isDark ? \"bg-white/5 hover:bg-white/10\" : \"bg-gray-100 hover:bg-gray-200\"\r\n                        )}\r\n                      >\r\n                        <Plus className=\"w-3.5 h-3.5\" />\r\n                        <span className={cn(\"text-sm\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                          {locale === 'es' ? 'Agregar dependencia' : 'Add dependency'}\r\n                        </span>\r\n                      </button>\r\n\r\n                      {/* Dependencies Dropdown */}\r\n                      <AnimatePresence>\r\n                        {showDependenciesDropdown && (\r\n                          <>\r\n                            <div className=\"fixed inset-0 z-40\" onClick={() => {\r\n                              setShowDependenciesDropdown(false);\r\n                              setDependencySearch('');\r\n                            }} />\r\n                            <motion.div\r\n                              initial={{ opacity: 0, y: -5 }}\r\n                              animate={{ opacity: 1, y: 0 }}\r\n                              exit={{ opacity: 0, y: -5 }}\r\n                              className={cn(\r\n                                \"absolute left-32 top-full mt-1 z-50 rounded-lg shadow-xl overflow-hidden min-w-[280px] max-h-[320px]\",\r\n                                isDark ? \"bg-[#1A1D25] border border-white/10\" : \"bg-white border border-gray-200\"\r\n                              )}\r\n                            >\r\n                              {/* Search input */}\r\n                              <div className={cn(\"p-2 border-b\", isDark ? \"border-white/10\" : \"border-gray-200\")}>\r\n                                <input\r\n                                  type=\"text\"\r\n                                  value={dependencySearch}\r\n                                  onChange={(e) => setDependencySearch(e.target.value)}\r\n                                  placeholder={locale === 'es' ? 'Buscar tarea...' : 'Search task...'}\r\n                                  className={cn(\r\n                                    \"w-full px-3 py-2 rounded-md text-sm outline-none\",\r\n                                    isDark\r\n                                      ? \"bg-white/5 text-white placeholder:text-[#6B7280] focus:bg-white/10\"\r\n                                      : \"bg-gray-100 text-gray-900 placeholder:text-gray-400\"\r\n                                  )}\r\n                                  autoFocus\r\n                                />\r\n                              </div>\r\n\r\n                              {/* Task list */}\r\n                              <div className=\"max-h-[240px] overflow-y-auto\">\r\n                                {availableTasks.length > 0 ? (\r\n                                  availableTasks\r\n                                    .filter(t => t.id !== selectedTask.id)\r\n                                    .filter(t =>\r\n                                      dependencySearch === '' ||\r\n                                      t.name.toLowerCase().includes(dependencySearch.toLowerCase())\r\n                                    )\r\n                                    .map((depTask) => {\r\n                                      const isSelected = selectedTask.dependencies?.includes(depTask.id);\r\n                                      return (\r\n                                        <button\r\n                                          key={depTask.id}\r\n                                          onClick={() => {\r\n                                            const currentDeps = selectedTask.dependencies || [];\r\n                                            let newDeps: string[];\r\n                                            if (isSelected) {\r\n                                              newDeps = currentDeps.filter(id => id !== depTask.id);\r\n                                            } else {\r\n                                              newDeps = [...currentDeps, depTask.id];\r\n                                            }\r\n                                            updateTaskField('dependencies', newDeps);\r\n                                          }}\r\n                                          className={cn(\r\n                                            \"w-full flex items-center gap-3 px-3 py-2 text-sm transition-colors text-left\",\r\n                                            isDark ? \"hover:bg-white/5\" : \"hover:bg-gray-50\",\r\n                                            isSelected && (isDark ? \"bg-white/5\" : \"bg-gray-50\")\r\n                                          )}\r\n                                        >\r\n                                          <div\r\n                                            className={cn(\r\n                                              \"w-4 h-4 rounded border-2 flex items-center justify-center flex-shrink-0\",\r\n                                              isSelected\r\n                                                ? \"bg-[#00E5CC] border-[#00E5CC]\"\r\n                                                : isDark ? \"border-white/30\" : \"border-gray-300\"\r\n                                            )}\r\n                                          >\r\n                                            {isSelected && (\r\n                                              <Check className=\"w-3 h-3 text-white\" />\r\n                                            )}\r\n                                          </div>\r\n                                          <div className=\"flex-1 min-w-0\">\r\n                                            <span className={cn(\"block truncate\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                                              {depTask.name}\r\n                                            </span>\r\n                                            <span className={cn(\"text-xs\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                                              {depTask.id.slice(0, 8)}\r\n                                            </span>\r\n                                          </div>\r\n                                        </button>\r\n                                      );\r\n                                    })\r\n                                ) : (\r\n                                  <div className={cn(\"px-3 py-4 text-sm text-center\", isDark ? \"text-[#6B7280]\" : \"text-gray-500\")}>\r\n                                    {locale === 'es' ? 'No hay tareas disponibles' : 'No tasks available'}\r\n                                  </div>\r\n                                )}\r\n                              </div>\r\n                            </motion.div>\r\n                          </>\r\n                        )}\r\n                      </AnimatePresence>\r\n                    </div>\r\n                  </div>\r\n\r\n                  {/* Color */}\r\n                  <div className=\"flex items-center gap-3 relative\">\r\n                    <Palette className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                      {locale === 'es' ? 'Color' : 'Color'}\r\n                    </span>\r\n                    <button\r\n                      onClick={() => {\r\n                        closeAllDropdowns();\r\n                        setShowColorPicker(!showColorPicker);\r\n                      }}\r\n                      className={cn(\r\n                        \"flex items-center gap-2 px-3 py-1.5 rounded-lg text-sm transition-colors\",\r\n                        isDark ? \"bg-white/5 hover:bg-white/10\" : \"bg-gray-100 hover:bg-gray-200\"\r\n                      )}\r\n                    >\r\n                      <div\r\n                        className=\"w-4 h-4 rounded-full\"\r\n                        style={{ backgroundColor: selectedTask.color || '#6366F1' }}\r\n                      />\r\n                      <span className={cn(\"text-sm\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                        {TASK_COLORS.find(c => c.value === selectedTask.color)?.name || (locale === 'es' ? 'Azul' : 'Blue')}\r\n                      </span>\r\n                      <ChevronDown className={cn(\"w-3 h-3\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    </button>\r\n\r\n                    {/* Color Picker Dropdown */}\r\n                    <AnimatePresence>\r\n                      {showColorPicker && (\r\n                        <>\r\n                          <div className=\"fixed inset-0 z-40\" onClick={() => setShowColorPicker(false)} />\r\n                          <motion.div\r\n                            initial={{ opacity: 0, y: -5 }}\r\n                            animate={{ opacity: 1, y: 0 }}\r\n                            exit={{ opacity: 0, y: -5 }}\r\n                            className={cn(\r\n                              \"absolute left-32 top-full mt-1 z-50 rounded-lg shadow-xl overflow-hidden p-3\",\r\n                              isDark ? \"bg-[#1A1D25] border border-white/10\" : \"bg-white border border-gray-200\"\r\n                            )}\r\n                          >\r\n                            <div className=\"grid grid-cols-6 gap-1.5\">\r\n                              {TASK_COLORS.map((color) => {\r\n                                const isSelected = selectedTask.color === color.value;\r\n                                return (\r\n                                  <button\r\n                                    key={color.value}\r\n                                    onClick={() => {\r\n                                      updateTaskField('color', color.value);\r\n                                      setShowColorPicker(false);\r\n                                    }}\r\n                                    className={cn(\r\n                                      \"w-7 h-7 rounded-full flex items-center justify-center transition-all\",\r\n                                      isSelected && \"ring-2 ring-offset-2\",\r\n                                      isDark ? \"ring-offset-[#1A1D25]\" : \"ring-offset-white\"\r\n                                    )}\r\n                                    style={{\r\n                                      backgroundColor: color.value,\r\n                                      outlineColor: isSelected ? color.value : undefined,\r\n                                    }}\r\n                                    title={color.name}\r\n                                  >\r\n                                    {isSelected && (\r\n                                      <Check className=\"w-3.5 h-3.5 text-white\" />\r\n                                    )}\r\n                                  </button>\r\n                                );\r\n                              })}\r\n                            </div>\r\n                          </motion.div>\r\n                        </>\r\n                      )}\r\n                    </AnimatePresence>\r\n                  </div>\r\n\r\n                  {/* Milestone */}\r\n                  <div className=\"flex items-center gap-3\">\r\n                    <Diamond className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    <span className={cn(\"text-sm w-28 truncate flex-shrink-0\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                      {locale === 'es' ? 'Hito' : 'Milestone'}\r\n                    </span>\r\n                    <label className=\"flex items-center gap-2 cursor-pointer\">\r\n                      <input\r\n                        type=\"checkbox\"\r\n                        checked={selectedTask.isMilestone || false}\r\n                        onChange={(e) => updateTaskField('isMilestone' as any, e.target.checked)}\r\n                        className={cn(\r\n                          \"w-4 h-4 rounded border-2 cursor-pointer appearance-none transition-colors\",\r\n                          selectedTask.isMilestone\r\n                            ? \"bg-purple-500 border-purple-500\"\r\n                            : isDark ? \"border-white/30 bg-transparent\" : \"border-gray-300 bg-transparent\",\r\n                          \"checked:bg-purple-500 checked:border-purple-500\"\r\n                        )}\r\n                      />\r\n                      <span className={cn(\"text-sm\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                        {locale === 'es' ? 'Marcar como hito' : 'Mark as milestone'}\r\n                      </span>\r\n                    </label>\r\n                  </div>\r\n                </div>\r\n\r\n                {/* Description section */}\r\n                <div className={cn(\"mt-6 pt-4 border-t\", isDark ? \"border-white/10\" : \"border-gray-200\")}>\r\n                  <div className=\"flex items-center gap-2 mb-3\">\r\n                    <FileText className={cn(\"w-4 h-4\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")} />\r\n                    <h3 className={cn(\"text-sm font-semibold\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                      {locale === 'es' ? 'Descripción' : 'Description'}\r\n                    </h3>\r\n                  </div>\r\n                  <textarea\r\n                    ref={descriptionTextareaRef}\r\n                    value={localDescription}\r\n                    onChange={(e) => handleDescriptionChange(e.target.value)}\r\n                    placeholder={locale === 'es' ? 'Agregar descripción...' : 'Add description...'}\r\n                    className={cn(\r\n                      \"w-full min-h-[100px] max-h-[400px] px-3 py-2 rounded-lg text-sm resize-none outline-none transition-colors overflow-y-auto\",\r\n                      isDark\r\n                        ? \"bg-white/5 text-white placeholder:text-[#6B7280] focus:bg-white/10\"\r\n                        : \"bg-gray-100 text-gray-900 placeholder:text-gray-400 focus:bg-gray-200\"\r\n                    )}\r\n                  />\r\n                </div>\r\n\r\n                {/* Subtasks section - v0.18.9: Functional */}\r\n                <div className={cn(\"mt-6 pt-4 border-t\", isDark ? \"border-white/10\" : \"border-gray-200\")}>\r\n                  <div className=\"flex items-center justify-between mb-3\">\r\n                    <h3 className={cn(\"text-sm font-semibold\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                      {locale === 'es' ? 'Subtareas' : 'Subtasks'}\r\n                      {selectedTask.subtasks && selectedTask.subtasks.length > 0 && (\r\n                        <span className={cn(\"ml-2 text-xs font-normal\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                          ({selectedTask.subtasks.filter(s => s.progress === 100).length}/{selectedTask.subtasks.length})\r\n                        </span>\r\n                      )}\r\n                    </h3>\r\n                  </div>\r\n                  {selectedTask.subtasks && selectedTask.subtasks.length > 0 && (\r\n                    <div className=\"space-y-2 mb-3\">\r\n                      {[...selectedTask.subtasks].sort((a, b) => (a.position ?? 0) - (b.position ?? 0)).map((subtask) => (\r\n                        <div key={subtask.id} className={cn(\r\n                          \"flex items-center gap-2 group p-2 rounded-lg -mx-2 transition-colors\",\r\n                          isDark ? \"hover:bg-white/5\" : \"hover:bg-gray-50\"\r\n                        )}>\r\n                          <button\r\n                            onClick={() => handleToggleSubtask(subtask.id)}\r\n                            className={cn(\r\n                              \"w-5 h-5 rounded border flex items-center justify-center flex-shrink-0 transition-colors\",\r\n                              subtask.progress === 100\r\n                                ? \"bg-green-500 border-green-500\"\r\n                                : isDark ? \"border-white/20 hover:border-green-500/50\" : \"border-gray-300 hover:border-green-500\"\r\n                            )}\r\n                          >\r\n                            {subtask.progress === 100 && (\r\n                              <Check className=\"w-3 h-3 text-white\" />\r\n                            )}\r\n                          </button>\r\n                          <span className={cn(\r\n                            \"text-sm flex-1\",\r\n                            subtask.progress === 100\r\n                              ? \"line-through text-[#6B7280]\"\r\n                              : isDark ? \"text-white\" : \"text-gray-900\"\r\n                          )}>\r\n                            {subtask.name}\r\n                          </span>\r\n                          <button\r\n                            onClick={() => handleDeleteSubtask(subtask.id)}\r\n                            className={cn(\r\n                              \"p-1 rounded opacity-0 group-hover:opacity-100 transition-opacity\",\r\n                              isDark ? \"hover:bg-white/10 text-[#6B7280] hover:text-red-400\" : \"hover:bg-gray-100 text-gray-400 hover:text-red-500\"\r\n                            )}\r\n                          >\r\n                            <Trash2 className=\"w-3.5 h-3.5\" />\r\n                          </button>\r\n                        </div>\r\n                      ))}\r\n                    </div>\r\n                  )}\r\n\r\n                  {/* Add subtask form */}\r\n                  {isAddingSubtask ? (\r\n                    <div className=\"flex items-center gap-2\">\r\n                      <input\r\n                        type=\"text\"\r\n                        value={newSubtaskName}\r\n                        onChange={(e) => setNewSubtaskName(e.target.value)}\r\n                        onKeyDown={(e) => {\r\n                          if (e.key === 'Enter' && newSubtaskName.trim()) {\r\n                            handleAddSubtask();\r\n                          } else if (e.key === 'Escape') {\r\n                            setIsAddingSubtask(false);\r\n                            setNewSubtaskName('');\r\n                          }\r\n                        }}\r\n                        placeholder={locale === 'es' ? 'Nombre de la subtarea...' : 'Subtask name...'}\r\n                        autoFocus\r\n                        className={cn(\r\n                          \"flex-1 px-3 py-2 rounded-lg text-sm outline-none transition-colors\",\r\n                          isDark\r\n                            ? \"bg-white/5 border border-white/10 text-white placeholder:text-[#6B7280] focus:border-[#00E5CC]/50\"\r\n                            : \"bg-gray-50 border border-gray-200 text-gray-900 placeholder:text-gray-400 focus:border-[#00E5CC]\"\r\n                        )}\r\n                      />\r\n                      <button\r\n                        onClick={handleAddSubtask}\r\n                        disabled={!newSubtaskName.trim()}\r\n                        className={cn(\r\n                          \"px-3 py-2 rounded-lg text-sm font-medium transition-colors\",\r\n                          newSubtaskName.trim()\r\n                            ? \"bg-[#00E5CC] hover:bg-[#00C4AE] text-white\"\r\n                            : isDark ? \"bg-white/5 text-[#6B7280] cursor-not-allowed\" : \"bg-gray-100 text-gray-400 cursor-not-allowed\"\r\n                        )}\r\n                      >\r\n                        {locale === 'es' ? 'Agregar' : 'Add'}\r\n                      </button>\r\n                      <button\r\n                        onClick={() => {\r\n                          setIsAddingSubtask(false);\r\n                          setNewSubtaskName('');\r\n                        }}\r\n                        className={cn(\r\n                          \"p-2 rounded-lg transition-colors\",\r\n                          isDark ? \"hover:bg-white/10 text-[#9CA3AF]\" : \"hover:bg-gray-100 text-gray-500\"\r\n                        )}\r\n                      >\r\n                        <X className=\"w-4 h-4\" />\r\n                      </button>\r\n                    </div>\r\n                  ) : (\r\n                    <button\r\n                      onClick={() => setIsAddingSubtask(true)}\r\n                      className={cn(\r\n                        \"w-full flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors\",\r\n                        isDark ? \"bg-white/5 hover:bg-white/10 text-[#9CA3AF]\" : \"bg-gray-100 hover:bg-gray-200 text-gray-600\"\r\n                      )}\r\n                    >\r\n                      <Plus className=\"w-4 h-4\" />\r\n                      {locale === 'es' ? 'Agregar subtarea' : 'Add subtask'}\r\n                    </button>\r\n                  )}\r\n                </div>\r\n\r\n                {/* Attachments Section - v0.17.241: Functional */}\r\n                <div className={cn(\r\n                  \"mt-6 pt-4 border-t\",\r\n                  isDark ? \"border-white/10\" : \"border-gray-200\"\r\n                )}>\r\n                  <h3 className={cn(\r\n                    \"text-sm font-semibold mb-3\",\r\n                    isDark ? \"text-white\" : \"text-gray-900\"\r\n                  )}>\r\n                    {locale === 'es' ? 'Adjuntos' : 'Attachments'}\r\n                    {attachments.length > 0 && (\r\n                      <span className={cn(\"ml-2 text-xs font-normal\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                        ({attachments.length})\r\n                      </span>\r\n                    )}\r\n                  </h3>\r\n\r\n                  {/* Existing attachments */}\r\n                  {attachments.length > 0 && (\r\n                    <div className=\"space-y-2 mb-4\">\r\n                      {attachments.map((attachment) => {\r\n                        const FileIcon = getFileIcon(attachment.type);\r\n                        const isImage = attachment.type.startsWith('image/');\r\n\r\n                        return (\r\n                          <div\r\n                            key={attachment.id}\r\n                            className={cn(\r\n                              \"flex items-center gap-3 p-2 rounded-lg group transition-colors\",\r\n                              isDark ? \"bg-white/5 hover:bg-white/10\" : \"bg-gray-50 hover:bg-gray-100\"\r\n                            )}\r\n                          >\r\n                            {/* Thumbnail or icon */}\r\n                            {isImage && attachment.thumbnailUrl ? (\r\n                              <img\r\n                                src={attachment.thumbnailUrl}\r\n                                alt={attachment.name}\r\n                                className=\"w-10 h-10 rounded object-cover\"\r\n                              />\r\n                            ) : (\r\n                              <div className={cn(\r\n                                \"w-10 h-10 rounded flex items-center justify-center\",\r\n                                isDark ? \"bg-white/10\" : \"bg-gray-200\"\r\n                              )}>\r\n                                <FileIcon className={cn(\"w-5 h-5\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")} />\r\n                              </div>\r\n                            )}\r\n\r\n                            {/* File info */}\r\n                            <div className=\"flex-1 min-w-0\">\r\n                              <a\r\n                                href={attachment.url}\r\n                                target=\"_blank\"\r\n                                rel=\"noopener noreferrer\"\r\n                                className={cn(\r\n                                  \"text-sm font-medium truncate block hover:underline\",\r\n                                  isDark ? \"text-white\" : \"text-gray-900\"\r\n                                )}\r\n                              >\r\n                                {attachment.name}\r\n                              </a>\r\n                              <p className={cn(\"text-xs\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                                {formatFileSize(attachment.size)}\r\n                              </p>\r\n                            </div>\r\n\r\n                            {/* Delete button */}\r\n                            {onDeleteAttachment && (\r\n                              <button\r\n                                onClick={() => onDeleteAttachment(attachment.id)}\r\n                                className={cn(\r\n                                  \"p-1.5 rounded opacity-0 group-hover:opacity-100 transition-all\",\r\n                                  isDark ? \"hover:bg-red-500/20 text-red-400\" : \"hover:bg-red-100 text-red-500\"\r\n                                )}\r\n                                title={locale === 'es' ? 'Eliminar' : 'Delete'}\r\n                              >\r\n                                <Trash2 className=\"w-4 h-4\" />\r\n                              </button>\r\n                            )}\r\n                          </div>\r\n                        );\r\n                      })}\r\n                    </div>\r\n                  )}\r\n\r\n                  {/* Drop zone */}\r\n                  <div\r\n                    onDragOver={handleDragOver}\r\n                    onDragLeave={handleDragLeave}\r\n                    onDrop={handleFileDrop}\r\n                    className={cn(\r\n                      \"border-2 border-dashed rounded-lg p-6 text-center transition-all cursor-pointer relative\",\r\n                      isDraggingFile\r\n                        ? (isDark ? \"border-[#00E5CC] bg-[#00E5CC]/10\" : \"border-[#00E5CC] bg-[#00E5CC]/15\")\r\n                        : (isDark ? \"border-white/10 hover:border-white/20\" : \"border-gray-200 hover:border-gray-300\"),\r\n                      isUploadingFiles && \"pointer-events-none opacity-50\"\r\n                    )}\r\n                  >\r\n                    <input\r\n                      type=\"file\"\r\n                      multiple\r\n                      onChange={handleFileInputChange}\r\n                      className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer\"\r\n                      disabled={!onUploadAttachments || isUploadingFiles}\r\n                    />\r\n                    {isUploadingFiles ? (\r\n                      <>\r\n                        <div className=\"w-6 h-6 mx-auto mb-2 border-2 border-[#00E5CC] border-t-transparent rounded-full animate-spin\" />\r\n                        <p className={cn(\"text-sm\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                          {locale === 'es' ? 'Subiendo...' : 'Uploading...'}\r\n                        </p>\r\n                      </>\r\n                    ) : (\r\n                      <>\r\n                        <Upload className={cn(\r\n                          \"w-6 h-6 mx-auto mb-2\",\r\n                          isDraggingFile ? \"text-[#00E5CC]\" : (isDark ? \"text-[#6B7280]\" : \"text-gray-400\")\r\n                        )} />\r\n                        <p className={cn(\"text-sm\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")}>\r\n                          {isDraggingFile\r\n                            ? (locale === 'es' ? 'Suelta los archivos aquí' : 'Drop files here')\r\n                            : (locale === 'es'\r\n                                ? <>Suelta tus archivos aquí o <span className=\"underline\">haz clic para subir</span></>\r\n                                : <>Drop your files here or <span className=\"underline\">click to upload</span></>\r\n                              )\r\n                          }\r\n                        </p>\r\n                        {!onUploadAttachments && (\r\n                          <p className={cn(\"text-xs mt-1\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                            {locale === 'es' ? 'Upload no disponible' : 'Upload not available'}\r\n                          </p>\r\n                        )}\r\n                      </>\r\n                    )}\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n\r\n            {/* Activity Panel - Right Sidebar */}\r\n            <div className={cn(\r\n              \"w-96 border-l flex flex-col\",\r\n              isDark ? \"border-white/[0.08] bg-[#0A0A0A]\" : \"border-gray-200 bg-gray-50\"\r\n            )}>\r\n              {/* Activity Header */}\r\n              <div className={cn(\r\n                \"px-4 py-3 border-b flex items-center justify-between h-[49px]\",\r\n                isDark ? \"border-white/10\" : \"border-gray-200\"\r\n              )}>\r\n                <h3 className={cn(\r\n                  \"text-sm font-semibold\",\r\n                  isDark ? \"text-white\" : \"text-gray-900\"\r\n                )}>\r\n                  {locale === 'es' ? 'Actividad' : 'Activity'}\r\n                  {comments.length > 0 && (\r\n                    <span className={cn(\"ml-2 text-xs font-normal\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                      ({comments.length})\r\n                    </span>\r\n                  )}\r\n                </h3>\r\n                <button\r\n                  onClick={onClose}\r\n                  className={cn(\"p-1.5 rounded transition-colors\", isDark ? \"hover:bg-white/10 text-[#9CA3AF]\" : \"hover:bg-gray-100 text-gray-500\")}\r\n                >\r\n                  <X className=\"w-5 h-5\" />\r\n                </button>\r\n              </div>\r\n\r\n              {/* Activity Content - Comments List */}\r\n              <style>{`\r\n                .activity-comments-scroll::-webkit-scrollbar {\r\n                  width: 4px !important;\r\n                }\r\n                .activity-comments-scroll::-webkit-scrollbar-track {\r\n                  background: transparent !important;\r\n                }\r\n                .activity-comments-scroll::-webkit-scrollbar-thumb {\r\n                  background: transparent !important;\r\n                  border-radius: 4px !important;\r\n                }\r\n                .activity-comments-scroll:hover::-webkit-scrollbar-thumb {\r\n                  background: ${isDark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.15)'} !important;\r\n                }\r\n              `}</style>\r\n              <div ref={commentsContainerRef} className={cn(\"flex-1 overflow-y-auto py-4 pl-4 pr-2 activity-comments-scroll\", isDark ? \"scrollbar-slim\" : \"scrollbar-slim-light\")}>\r\n                {comments.length > 0 ? (\r\n                  <div className=\"space-y-4\">\r\n                    {/* Sort comments by date ascending (oldest first, newest at bottom like a chat) */}\r\n                    {[...comments].sort((a, b) => {\r\n                      const dateA = typeof a.createdAt === 'string' ? new Date(a.createdAt) : a.createdAt;\r\n                      const dateB = typeof b.createdAt === 'string' ? new Date(b.createdAt) : b.createdAt;\r\n                      return dateA.getTime() - dateB.getTime();\r\n                    }).map((comment) => (\r\n                      <div key={comment.id} className=\"flex gap-3\">\r\n                        {/* Avatar */}\r\n                        <div\r\n                          className=\"w-6 h-6 rounded-full flex items-center justify-center text-white text-[10px] font-medium flex-shrink-0\"\r\n                          style={{ backgroundColor: comment.user?.color || '#8B5CF6' }}\r\n                        >\r\n                          {comment.user?.name?.slice(0, 2).toUpperCase() || 'U'}\r\n                        </div>\r\n                        {/* Comment Content */}\r\n                        <div className=\"flex-1 min-w-0\">\r\n                          <div className=\"flex items-center gap-2 mb-1\">\r\n                            <span className={cn(\"text-sm font-medium\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                              {comment.user?.name || (locale === 'es' ? 'Usuario' : 'User')}\r\n                            </span>\r\n                            <span className={cn(\"text-xs\", isDark ? \"text-[#6B7280]\" : \"text-gray-400\")}>\r\n                              {formatCommentDate(comment.createdAt)}\r\n                            </span>\r\n                          </div>\r\n                          <div className={cn(\"text-sm\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-600\")}>\r\n                            <CommentContent content={comment.content} theme={theme} />\r\n                          </div>\r\n                          {/* v0.17.422: Comment Attachments */}\r\n                          {comment.attachments && comment.attachments.length > 0 && (\r\n                            <div className=\"flex flex-wrap gap-2 mt-2\">\r\n                              {comment.attachments.map((attachment) => {\r\n                                const isImage = attachment.type.startsWith('image/');\r\n                                return (\r\n                                  <a\r\n                                    key={attachment.id}\r\n                                    href={attachment.url}\r\n                                    target=\"_blank\"\r\n                                    rel=\"noopener noreferrer\"\r\n                                    className={cn(\r\n                                      \"flex items-center gap-2 px-2 py-1.5 rounded-lg transition-colors\",\r\n                                      isDark ? \"bg-white/5 hover:bg-white/10\" : \"bg-gray-100 hover:bg-gray-200\"\r\n                                    )}\r\n                                  >\r\n                                    {isImage ? (\r\n                                      <Image className={cn(\"w-4 h-4\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")} />\r\n                                    ) : (\r\n                                      <File className={cn(\"w-4 h-4\", isDark ? \"text-[#9CA3AF]\" : \"text-gray-500\")} />\r\n                                    )}\r\n                                    <span className={cn(\"text-xs truncate max-w-[100px]\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n                                      {attachment.name}\r\n                                    </span>\r\n                                  </a>\r\n                                );\r\n                              })}\r\n                            </div>\r\n                          )}\r\n                        </div>\r\n                      </div>\r\n                    ))}\r\n                  </div>\r\n                ) : (\r\n                  /* Empty State */\r\n                  <div className=\"flex flex-col items-center justify-center h-full text-center\">\r\n                    <MessageSquare className={cn(\r\n                      \"w-10 h-10 mb-3\",\r\n                      isDark ? \"text-[#3B4252]\" : \"text-gray-300\"\r\n                    )} />\r\n                    <p className={cn(\r\n                      \"text-sm\",\r\n                      isDark ? \"text-[#6B7280]\" : \"text-gray-500\"\r\n                    )}>\r\n                      {locale === 'es' ? 'Sin actividad reciente' : 'No recent activity'}\r\n                    </p>\r\n                  </div>\r\n                )}\r\n              </div>\r\n\r\n              {/* Comment Input - v0.17.422: Now with @mentions, emojis and attachments support */}\r\n              <div className={cn(\r\n                \"py-4 pl-4 pr-2 border-t\",\r\n                isDark ? \"border-white/10\" : \"border-gray-200\"\r\n              )}>\r\n                <MentionInput\r\n                  value={commentText}\r\n                  onChange={setCommentText}\r\n                  onSubmit={handleSubmitComment}\r\n                  users={mentionableUsers}\r\n                  placeholder={locale === 'es' ? 'Escribe un comentario... (usa @ para mencionar)' : 'Write a comment... (use @ to mention)'}\r\n                  disabled={!onAddComment}\r\n                  isSubmitting={isSubmittingComment}\r\n                  theme={theme}\r\n                  locale={locale}\r\n                  currentUser={currentUser}\r\n                  enableEmoji\r\n                  enableAttachments={!!onUploadCommentAttachments}\r\n                  pendingFiles={pendingCommentFiles}\r\n                  onFilesSelect={handleCommentFilesSelect}\r\n                  onRemoveFile={handleRemoveCommentFile}\r\n                />\r\n              </div>\r\n            </div>\r\n          </motion.div>\r\n        </>\r\n      )}\r\n    </AnimatePresence>\r\n  );\r\n}\r\n","/**\n * useDragState - React hook for drag state management\n * @module hooks/useDragState\n *\n * Replacement for Jotai's useAtom(dragStateAtom)\n */\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { dragStore, type DragState } from '@libxai/core'\n\n/**\n * Hook return type\n */\nexport type UseDragStateReturn = [\n  state: DragState,\n  setState: (state: DragState) => void\n]\n\n/**\n * React hook for drag state\n *\n * Drop-in replacement for `useAtom(dragStateAtom)`\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const [dragState, setDragState] = useDragState()\n *\n *   const handleDragStart = () => {\n *     setDragState({\n *       isDragging: true,\n *       draggedCardId: 'card-1',\n *       sourceColumnId: 'col-1',\n *       targetColumnId: 'col-1',\n *     })\n *   }\n *\n *   return <div>{dragState.isDragging ? 'Dragging...' : 'Idle'}</div>\n * }\n * ```\n */\nexport function useDragState(): UseDragStateReturn {\n  const [state, setState] = useState<DragState>(() => dragStore.getState())\n\n  useEffect(() => {\n    // Subscribe to store changes\n    const unsubscribe = dragStore.subscribe((newState) => {\n      setState(newState)\n    })\n\n    return unsubscribe\n  }, [])\n\n  const setDragState = useCallback((newState: DragState) => {\n    dragStore.setState(newState)\n  }, [])\n\n  return [state, setDragState]\n}\n","import { useCallback, useMemo, useState, useRef, useEffect } from 'react'\r\nimport {\r\n  DndContext,\r\n  DragOverlay,\r\n  closestCorners,\r\n  PointerSensor,\r\n  KeyboardSensor,\r\n  useSensor,\r\n  useSensors,\r\n  DragStartEvent,\r\n  DragEndEvent,\r\n  DragOverEvent,\r\n} from '@dnd-kit/core'\r\nimport { sortableKeyboardCoordinates } from '@dnd-kit/sortable'\r\nimport type { KanbanBoardProps, Card as CardType } from '../../types'\r\nimport type { Task } from '../Gantt/types'\r\nimport { Column } from '../Column'\r\nimport { Card } from '../Card'\r\nimport { TaskDetailModal } from '../TaskDetailModal'\r\nimport { cn, calculateDropPosition } from '../../utils'\r\nimport { useDragState } from '../../hooks/useDragState'\r\nimport { KanbanThemeProvider } from './KanbanThemeContext'\r\n\r\nexport function KanbanBoard({\r\n  board,\r\n  callbacks,\r\n  onCardClick,\r\n  renderProps,\r\n  config,\r\n  availableUsers = [],\r\n  className,\r\n  style,\r\n  isLoading,\r\n  error,\r\n  children,\r\n  availableTags = [],\r\n  onCreateTag,\r\n  attachmentsByCard,\r\n  onUploadAttachments,\r\n  onDeleteAttachment,\r\n  // v0.17.254: Comments support\r\n  comments,\r\n  onAddComment,\r\n  currentUser,\r\n  mentionableUsers,\r\n  onTaskOpen,\r\n  // v0.18.13: Comment attachments support\r\n  onUploadCommentAttachments,\r\n  // v1.1.0: Time tracking support\r\n  enableTimeTracking,\r\n  timeTrackingSummary,\r\n  timeEntries,\r\n  timerState,\r\n  onLogTime,\r\n  onUpdateEstimate,\r\n  onUpdateSoldEffort,\r\n  onStartTimer,\r\n  onStopTimer,\r\n  onDiscardTimer,\r\n  // v1.4.11: Governance v2.0 - Financial blur\r\n  blurFinancials = false,\r\n  // v2.0.0: Kanban RBAC\r\n  sidePanel,\r\n  renderColumnMetrics,\r\n  // v2.1.0: Suppress internal TaskDetailModal\r\n  suppressDetailModal = false,\r\n}: KanbanBoardProps & { children?: React.ReactNode }) {\r\n  const [dragState, setDragState] = useDragState()\r\n\r\n  // State for task detail modal\r\n  const [selectedCard, setSelectedCard] = useState<CardType | null>(null)\r\n\r\n  // v0.17.443: Pan/drag state for grabbing and dragging the board (like Gantt)\r\n  const [isPanning, setIsPanning] = useState(false)\r\n  const boardRef = useRef<HTMLDivElement>(null)\r\n  const panStartRef = useRef({ x: 0, y: 0, scrollLeft: 0, scrollTop: 0 })\r\n\r\n  // Determine theme class - default to 'dark'\r\n  const themeName = config?.theme || 'dark'\r\n  const isDark = themeName === 'dark' || themeName === 'neutral'\r\n  const themeClass = isDark ? 'dark' : ''\r\n\r\n  const handleCardUpdate = useCallback(\r\n    (cardId: string, updates: Partial<typeof board.cards[0]>) => {\r\n      callbacks.onCardUpdate?.(cardId, updates)\r\n    },\r\n    [callbacks]\r\n  )\r\n\r\n  const handleColumnRename = useCallback(\r\n    (columnId: string, newTitle: string) => {\r\n      callbacks.onColumnUpdate?.(columnId, { title: newTitle })\r\n    },\r\n    [callbacks]\r\n  )\r\n\r\n  // v0.17.55: Handler for column delete\r\n  const handleColumnDelete = useCallback(\r\n    (columnId: string) => {\r\n      callbacks.onColumnDelete?.(columnId)\r\n    },\r\n    [callbacks]\r\n  )\r\n\r\n  // v0.17.55: Default column IDs that cannot be deleted\r\n  const DEFAULT_COLUMN_IDS = ['todo', 'in-progress', 'completed']\r\n\r\n  const sensors = useSensors(\r\n    useSensor(PointerSensor, {\r\n      activationConstraint: {\r\n        distance: 8,\r\n      },\r\n    }),\r\n    useSensor(KeyboardSensor, {\r\n      coordinateGetter: sortableKeyboardCoordinates,\r\n    })\r\n  )\r\n\r\n  const cardsByColumn = useMemo(() => {\r\n    const map = new Map<string, typeof board.cards>()\r\n\r\n    board.columns.forEach((column) => {\r\n      const columnCards = column.cardIds\r\n        .map((cardId) => board.cards.find((card) => card.id === cardId))\r\n        .filter((card): card is NonNullable<typeof card> => card !== undefined)\r\n        .sort((a, b) => a.position - b.position)\r\n\r\n      map.set(column.id, columnCards)\r\n    })\r\n\r\n    return map\r\n  }, [board.cards, board.columns])\r\n\r\n  // v0.17.443: Pan/drag handlers for grabbing and dragging the board\r\n  useEffect(() => {\r\n    const boardElement = boardRef.current\r\n    if (!boardElement) return\r\n\r\n    const handleMouseDown = (e: MouseEvent) => {\r\n      // Only start panning on middle mouse button OR when clicking on empty space\r\n      const target = e.target as HTMLElement\r\n\r\n      // Middle mouse button (button === 1) always enables panning\r\n      // Left click only enables panning on empty board space\r\n      const isMiddleButton = e.button === 1\r\n      const isEmptySpace = target === boardElement ||\r\n                          (target.classList.contains('asakaa-column') && !target.closest('.asakaa-card'))\r\n\r\n      if (isMiddleButton || (e.button === 0 && isEmptySpace && !dragState.isDragging)) {\r\n        e.preventDefault()\r\n        setIsPanning(true)\r\n        panStartRef.current = {\r\n          x: e.clientX,\r\n          y: e.clientY,\r\n          scrollLeft: boardElement.scrollLeft,\r\n          scrollTop: boardElement.scrollTop,\r\n        }\r\n        boardElement.style.cursor = 'grabbing'\r\n        boardElement.style.userSelect = 'none'\r\n      }\r\n    }\r\n\r\n    const handleMouseMove = (e: MouseEvent) => {\r\n      if (!isPanning) return\r\n\r\n      const deltaX = e.clientX - panStartRef.current.x\r\n      const deltaY = e.clientY - panStartRef.current.y\r\n\r\n      boardElement.scrollLeft = panStartRef.current.scrollLeft - deltaX\r\n      boardElement.scrollTop = panStartRef.current.scrollTop - deltaY\r\n    }\r\n\r\n    const handleMouseUp = () => {\r\n      if (isPanning) {\r\n        setIsPanning(false)\r\n        boardElement.style.cursor = ''\r\n        boardElement.style.userSelect = ''\r\n      }\r\n    }\r\n\r\n    const handleMouseLeave = () => {\r\n      if (isPanning) {\r\n        setIsPanning(false)\r\n        boardElement.style.cursor = ''\r\n        boardElement.style.userSelect = ''\r\n      }\r\n    }\r\n\r\n    boardElement.addEventListener('mousedown', handleMouseDown)\r\n    document.addEventListener('mousemove', handleMouseMove)\r\n    document.addEventListener('mouseup', handleMouseUp)\r\n    boardElement.addEventListener('mouseleave', handleMouseLeave)\r\n\r\n    return () => {\r\n      boardElement.removeEventListener('mousedown', handleMouseDown)\r\n      document.removeEventListener('mousemove', handleMouseMove)\r\n      document.removeEventListener('mouseup', handleMouseUp)\r\n      boardElement.removeEventListener('mouseleave', handleMouseLeave)\r\n    }\r\n  }, [isPanning, dragState.isDragging])\r\n\r\n  // v0.17.243: Convert cards to Task format for dependencies in TaskDetailModal\r\n  const availableTasksForDependencies = useMemo((): Task[] => {\r\n    return board.cards.map(card => ({\r\n      id: card.id,\r\n      name: card.title,\r\n      startDate: card.startDate ? new Date(card.startDate) : undefined,\r\n      endDate: card.endDate ? new Date(card.endDate) : undefined,\r\n      progress: card.progress || 0,\r\n      status: card.columnId as any,\r\n      priority: card.priority?.toLowerCase() as any,\r\n      dependencies: Array.isArray(card.dependencies)\r\n        ? card.dependencies.map(d => typeof d === 'string' ? d : d.taskId)\r\n        : [],\r\n    }))\r\n  }, [board.cards])\r\n\r\n  const handleDragStart = useCallback(\r\n    (event: DragStartEvent) => {\r\n      const { active } = event\r\n      const card = board.cards.find((c) => c.id === active.id)\r\n\r\n      if (card) {\r\n        setDragState({\r\n          isDragging: true,\r\n          draggedCardId: card.id,\r\n          sourceColumnId: card.columnId,\r\n          targetColumnId: card.columnId,\r\n        })\r\n      }\r\n    },\r\n    [board.cards, setDragState]\r\n  )\r\n\r\n  const handleDragOver = useCallback(\r\n    (event: DragOverEvent) => {\r\n      const { active, over } = event\r\n      if (!over) return\r\n\r\n      const activeCard = board.cards.find((c) => c.id === active.id)\r\n      if (!activeCard) return\r\n\r\n      let targetColumnId: string | null = null\r\n\r\n      if (over.data.current?.type === 'column') {\r\n        targetColumnId = over.id as string\r\n      } else if (over.data.current?.type === 'card') {\r\n        const overCard = board.cards.find((c) => c.id === over.id)\r\n        targetColumnId = overCard?.columnId || null\r\n      }\r\n\r\n      if (targetColumnId && targetColumnId !== dragState.targetColumnId) {\r\n        setDragState({\r\n          ...dragState,\r\n          targetColumnId,\r\n        })\r\n      }\r\n    },\r\n    [board.cards, dragState, setDragState]\r\n  )\r\n\r\n  const handleDragEnd = useCallback(\r\n    async (event: DragEndEvent) => {\r\n      const { active, over } = event\r\n\r\n      setDragState({\r\n        isDragging: false,\r\n        draggedCardId: null,\r\n        sourceColumnId: null,\r\n        targetColumnId: null,\r\n      })\r\n\r\n      if (!over) return\r\n\r\n      const activeCard = board.cards.find((c) => c.id === active.id)\r\n      if (!activeCard) return\r\n\r\n      let targetColumnId: string\r\n      let targetPosition: number\r\n\r\n      if (over.data.current?.type === 'column') {\r\n        targetColumnId = over.id as string\r\n        const targetColumnCards = cardsByColumn.get(targetColumnId) || []\r\n        targetPosition = calculateDropPosition(targetColumnCards, 0)\r\n      } else {\r\n        const overCard = board.cards.find((c) => c.id === over.id)\r\n        if (!overCard) return\r\n\r\n        targetColumnId = overCard.columnId\r\n        const targetColumnCards = cardsByColumn.get(targetColumnId) || []\r\n        const overIndex = targetColumnCards.findIndex((c) => c.id === over.id)\r\n\r\n        targetPosition = calculateDropPosition(targetColumnCards, overIndex)\r\n      }\r\n\r\n      const targetColumn = board.columns.find((col) => col.id === targetColumnId)\r\n      if (targetColumn && targetColumn.wipLimit && targetColumn.wipLimitType === 'hard') {\r\n        const targetColumnCards = cardsByColumn.get(targetColumnId) || []\r\n\r\n        if (activeCard.columnId !== targetColumnId) {\r\n          if (targetColumnCards.length >= targetColumn.wipLimit) {\r\n            callbacks.onWipLimitExceeded?.(targetColumn, activeCard)\r\n            return\r\n          }\r\n        }\r\n      }\r\n\r\n      if (\r\n        activeCard.columnId !== targetColumnId ||\r\n        activeCard.position !== targetPosition\r\n      ) {\r\n        await callbacks.onCardMove?.(activeCard.id, targetColumnId, targetPosition)\r\n      }\r\n    },\r\n    [board.cards, board.columns, cardsByColumn, callbacks, setDragState]\r\n  )\r\n\r\n  // Handle card click - open modal and notify consumer\r\n  // v0.17.254: Also call onTaskOpen to load comments\r\n  const handleCardClick = useCallback(\r\n    (card: typeof board.cards[0]) => {\r\n      if (!suppressDetailModal) {\r\n        setSelectedCard(card)\r\n      }\r\n      onCardClick?.(card)\r\n      onTaskOpen?.(card.id)\r\n    },\r\n    [onCardClick, onTaskOpen, suppressDetailModal]\r\n  )\r\n\r\n  // Handle card update from modal\r\n  const handleModalCardUpdate = useCallback(\r\n    (updatedCard: CardType) => {\r\n      callbacks.onCardUpdate?.(updatedCard.id, updatedCard)\r\n      setSelectedCard(updatedCard)\r\n    },\r\n    [callbacks]\r\n  )\r\n\r\n  if (isLoading) {\r\n    return (\r\n      <div className={cn('asakaa-board', themeClass, className)} style={style}>\r\n        <LoadingSkeleton columnCount={3} />\r\n      </div>\r\n    )\r\n  }\r\n\r\n  if (error) {\r\n    return (\r\n      <div className={cn('asakaa-board', themeClass, className)} style={style}>\r\n        <div className=\"flex items-center justify-center w-full h-64\">\r\n          <div className=\"text-center\">\r\n            <p className=\"text-asakaa-accent-red text-lg font-semibold mb-2\">\r\n              Error loading board\r\n            </p>\r\n            <p className=\"text-asakaa-text-secondary text-sm\">\r\n              {typeof error === 'string' ? error : error.message}\r\n            </p>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    )\r\n  }\r\n\r\n  return (\r\n    <KanbanThemeProvider themeName={themeName}>\r\n      <div className={cn('flex h-full overflow-hidden', sidePanel ? 'flex-row' : '')}>\r\n        <DndContext\r\n          sensors={sensors}\r\n          collisionDetection={closestCorners}\r\n          onDragStart={handleDragStart}\r\n          onDragOver={handleDragOver}\r\n          onDragEnd={handleDragEnd}\r\n        >\r\n          <div\r\n            ref={boardRef}\r\n            className={cn('asakaa-board', sidePanel ? 'flex-1' : '', themeClass, className)}\r\n            style={{ ...style, cursor: isPanning ? 'grabbing' : undefined }}\r\n            data-theme={themeName}\r\n          >\r\n            {board.columns\r\n              .sort((a, b) => a.position - b.position)\r\n              .map((column) => {\r\n                const cards = cardsByColumn.get(column.id) || []\r\n\r\n                // v0.17.55: Check if column is deletable (not a default column)\r\n                const isDeletable = !DEFAULT_COLUMN_IDS.includes(column.id)\r\n\r\n                const columnFooter = renderProps?.renderColumnFooter?.(column)\r\n\r\n                return (\r\n                  <div key={column.id} className=\"asakaa-column-wrapper\">\r\n                    <Column\r\n                      column={column}\r\n                      cards={cards}\r\n                      renderCard={renderProps?.renderCard}\r\n                      renderColumn={renderProps?.renderColumn}\r\n                      renderHeader={renderProps?.renderColumnHeader}\r\n                      renderEmptyState={renderProps?.renderEmptyState}\r\n                      renderMetrics={renderColumnMetrics ? (col, crds) => renderColumnMetrics(col, crds) : undefined}\r\n                      onCardClick={handleCardClick}\r\n                      onCardUpdate={handleCardUpdate}\r\n                      onColumnRename={callbacks.onColumnUpdate ? handleColumnRename : undefined}\r\n                      onColumnDelete={callbacks.onColumnDelete ? handleColumnDelete : undefined}\r\n                      isDeletable={isDeletable}\r\n                      locale={config?.locale === 'es' ? 'es' : 'en'}\r\n                      availableUsers={availableUsers}\r\n                      allCards={board.cards}\r\n                      enableVirtualization={config?.enableVirtualization}\r\n                      cardHeight={config?.cardHeight}\r\n                      isCollapsed={config?.collapsedColumnIds?.includes(column.id)}\r\n                    />\r\n                    {columnFooter}\r\n                  </div>\r\n                )\r\n              })}\r\n            {children}\r\n          </div>\r\n\r\n          <DragOverlay>\r\n            {dragState.draggedCardId ? (\r\n              <Card\r\n                card={\r\n                  board.cards.find((c) => c.id === dragState.draggedCardId)!\r\n                }\r\n                render={renderProps?.renderCardOverlay || renderProps?.renderCard}\r\n                disableDrag\r\n                className=\"opacity-90 rotate-3 shadow-2xl\"\r\n              />\r\n            ) : null}\r\n          </DragOverlay>\r\n        </DndContext>\r\n\r\n        {/* v2.0.0: Side panel */}\r\n        {sidePanel}\r\n      </div>\r\n\r\n      {/* Task Detail Modal - same as Calendar */}\r\n      {/* v0.17.254: Added comments support */}\r\n      {/* v2.1.0: Suppress when consumer provides own drawer */}\r\n      {!suppressDetailModal && <TaskDetailModal\r\n        task={selectedCard}\r\n        isOpen={!!selectedCard}\r\n        onClose={() => setSelectedCard(null)}\r\n        onCardUpdate={handleModalCardUpdate}\r\n        theme={isDark ? 'dark' : 'light'}\r\n        locale={config?.locale === 'es' ? 'es' : 'en'}\r\n        availableUsers={availableUsers}\r\n        availableTags={availableTags}\r\n        onCreateTag={onCreateTag}\r\n        attachments={selectedCard ? attachmentsByCard?.get(selectedCard.id) || [] : []}\r\n        onUploadAttachments={onUploadAttachments}\r\n        onDeleteAttachment={onDeleteAttachment}\r\n        availableTasks={availableTasksForDependencies}\r\n        comments={comments}\r\n        onAddComment={onAddComment}\r\n        currentUser={currentUser}\r\n        mentionableUsers={mentionableUsers}\r\n        onUploadCommentAttachments={onUploadCommentAttachments}\r\n        // v1.1.0: Time tracking props\r\n        enableTimeTracking={enableTimeTracking}\r\n        timeTrackingSummary={timeTrackingSummary}\r\n        timeEntries={timeEntries}\r\n        isTimerRunning={timerState?.isRunning}\r\n        timerElapsedSeconds={timerState?.elapsedSeconds}\r\n        onTimeLog={onLogTime}\r\n        onEstimateUpdate={onUpdateEstimate}\r\n        onSoldEffortUpdate={onUpdateSoldEffort}\r\n        onTimerStart={onStartTimer}\r\n        onTimerStop={onStopTimer}\r\n        onTimerDiscard={onDiscardTimer}\r\n        // v1.4.11: Governance v2.0 - Financial blur\r\n        blurFinancials={blurFinancials}\r\n      />}\r\n    </KanbanThemeProvider>\r\n  )\r\n}\r\n\r\nfunction LoadingSkeleton({ columnCount }: { columnCount: number }) {\r\n  return (\r\n    <>\r\n      {Array.from({ length: columnCount }).map((_, i) => (\r\n        <div key={i} className=\"asakaa-column\">\r\n          <div className=\"asakaa-skeleton h-8 mb-3\" />\r\n          <div className=\"flex flex-col gap-2\">\r\n            <div className=\"asakaa-skeleton h-24\" />\r\n            <div className=\"asakaa-skeleton h-32\" />\r\n            <div className=\"asakaa-skeleton h-28\" />\r\n          </div>\r\n        </div>\r\n      ))}\r\n    </>\r\n  )\r\n}\r\n","import { useState, useRef, useEffect } from 'react';\r\nimport { Plus, ChevronDown, Download, FileSpreadsheet, FileText, FileJson } from 'lucide-react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport type { Column as ColumnType } from '../../types';\r\n\r\n// v0.17.27: Simple button mode vs column selector mode\r\n\r\n// Theme type for toolbar styling\r\ninterface KanbanToolbarTheme {\r\n  bgGrid: string;\r\n  bgSecondary: string;\r\n  border: string;\r\n  borderLight: string;\r\n  textPrimary: string;\r\n  textSecondary: string;\r\n  textTertiary: string;\r\n  accent: string;\r\n  accentLight: string;\r\n  hoverBg: string;\r\n}\r\n\r\n// Default themes\r\nconst darkTheme: KanbanToolbarTheme = {\r\n  bgGrid: '#050505',\r\n  bgSecondary: '#0A0A0A',\r\n  border: 'rgba(255, 255, 255, 0.08)',\r\n  borderLight: 'rgba(255, 255, 255, 0.05)',\r\n  textPrimary: 'rgba(255, 255, 255, 0.92)',\r\n  textSecondary: 'rgba(255, 255, 255, 0.60)',\r\n  textTertiary: 'rgba(255, 255, 255, 0.35)',\r\n  accent: '#007FFF',\r\n  accentLight: 'rgba(0, 229, 204, 0.15)',\r\n  hoverBg: 'rgba(255, 255, 255, 0.04)',\r\n};\r\n\r\nconst lightTheme: KanbanToolbarTheme = {\r\n  bgGrid: '#FFFFFF',\r\n  bgSecondary: '#F9FAFB',\r\n  border: 'rgba(0, 0, 0, 0.1)',\r\n  borderLight: 'rgba(0, 0, 0, 0.05)',\r\n  textPrimary: '#111827',\r\n  textSecondary: '#6B7280',\r\n  textTertiary: '#9CA3AF',\r\n  accent: '#00E5CC',\r\n  accentLight: 'rgba(0, 229, 204, 0.1)',\r\n  hoverBg: 'rgba(0, 0, 0, 0.05)',\r\n};\r\n\r\n// i18n translations\r\ninterface KanbanToolbarI18n {\r\n  newTask: string;\r\n  selectColumn: string;\r\n  export: string;\r\n  exportCSV: string;\r\n  exportJSON: string;\r\n  exportExcel: string;\r\n}\r\n\r\nconst defaultI18n: KanbanToolbarI18n = {\r\n  newTask: 'Nueva Tarea',\r\n  selectColumn: 'Seleccionar columna',\r\n  export: 'Exportar',\r\n  exportCSV: 'CSV',\r\n  exportJSON: 'JSON',\r\n  exportExcel: 'Excel',\r\n};\r\n\r\nconst englishI18n: KanbanToolbarI18n = {\r\n  newTask: 'New Task',\r\n  selectColumn: 'Select column',\r\n  export: 'Export',\r\n  exportCSV: 'CSV',\r\n  exportJSON: 'JSON',\r\n  exportExcel: 'Excel',\r\n};\r\n\r\nexport interface KanbanToolbarProps {\r\n  columns: ColumnType[];\r\n  /**\r\n   * Handler for creating a new task.\r\n   * - If useColumnSelector is true: receives columnId as parameter\r\n   * - If useColumnSelector is false: called with no parameters (opens modal)\r\n   */\r\n  onCreateTask?: (columnId?: string) => void;\r\n  createTaskLabel?: string;\r\n  theme?: 'dark' | 'light';\r\n  locale?: 'es' | 'en';\r\n  /**\r\n   * v0.17.27: If true, shows dropdown to select column before creating task.\r\n   * If false, shows a simple button that triggers onCreateTask() without columnId.\r\n   * @default false\r\n   */\r\n  useColumnSelector?: boolean;\r\n  // Export handlers\r\n  onExportCSV?: () => void;\r\n  onExportJSON?: () => void;\r\n  onExportExcel?: () => Promise<void>;\r\n  // Custom translations\r\n  translations?: Partial<KanbanToolbarI18n>;\r\n  /** Render custom content on the right side of toolbar (e.g. lens toggle) */\r\n  toolbarRightContent?: React.ReactNode;\r\n  /** v2.5.0: Render content just before the Create Task button (e.g., share/export dropdown) */\r\n  toolbarEndContent?: React.ReactNode;\r\n}\r\n\r\n// Column Selector Dropdown\r\ninterface ColumnSelectorProps {\r\n  columns: ColumnType[];\r\n  onSelect: (columnId: string) => void;\r\n  theme: KanbanToolbarTheme;\r\n  t: KanbanToolbarI18n;\r\n  createTaskLabel?: string;\r\n}\r\n\r\nfunction ColumnSelector({ columns, onSelect, theme, t, createTaskLabel }: ColumnSelectorProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n  // Close dropdown when clicking outside\r\n  useEffect(() => {\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n    }\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  const handleSelect = (columnId: string) => {\r\n    onSelect(columnId);\r\n    setIsOpen(false);\r\n  };\r\n\r\n  return (\r\n    <div ref={dropdownRef} className=\"relative\">\r\n      <motion.button\r\n        onClick={() => setIsOpen(!isOpen)}\r\n        className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg text-xs transition-all\"\r\n        style={{\r\n          background: 'linear-gradient(135deg, #007FFF 0%, #0055CC 100%)',\r\n          color: '#FFFFFF',\r\n          fontFamily: 'Inter, sans-serif',\r\n          fontWeight: 500,\r\n          boxShadow: '0 2px 8px rgba(0, 229, 204, 0.3)',\r\n        }}\r\n        whileHover={{\r\n          scale: 1.02,\r\n          boxShadow: '0 4px 12px rgba(0, 229, 204, 0.4)',\r\n        }}\r\n        whileTap={{ scale: 0.98 }}\r\n      >\r\n        <Plus className=\"w-3.5 h-3.5\" />\r\n        <span>{createTaskLabel || t.newTask}</span>\r\n        <ChevronDown\r\n          className=\"w-3 h-3 transition-transform\"\r\n          style={{ transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)' }}\r\n        />\r\n      </motion.button>\r\n\r\n      <AnimatePresence>\r\n        {isOpen && (\r\n          <motion.div\r\n            initial={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            animate={{ opacity: 1, y: 0, scale: 1 }}\r\n            exit={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            transition={{ duration: 0.15, ease: 'easeOut' }}\r\n            className=\"absolute right-0 mt-2 w-48 rounded-lg overflow-hidden z-50\"\r\n            style={{\r\n              backgroundColor: theme.bgSecondary,\r\n              border: `1px solid ${theme.border}`,\r\n              boxShadow: '0 10px 40px rgba(0, 0, 0, 0.25)',\r\n            }}\r\n          >\r\n            <div className=\"py-1\">\r\n              <div\r\n                className=\"px-3 py-2 text-[10px] uppercase tracking-wider\"\r\n                style={{ color: theme.textTertiary }}\r\n              >\r\n                {t.selectColumn}\r\n              </div>\r\n              {columns\r\n                .sort((a, b) => a.position - b.position)\r\n                .map((column, index) => (\r\n                  <motion.button\r\n                    key={column.id}\r\n                    onClick={() => handleSelect(column.id)}\r\n                    className=\"w-full flex items-center gap-3 px-3 py-2.5 text-left transition-all\"\r\n                    style={{\r\n                      backgroundColor: 'transparent',\r\n                      borderBottom: index < columns.length - 1 ? `1px solid ${theme.borderLight}` : 'none',\r\n                    }}\r\n                    whileHover={{\r\n                      backgroundColor: theme.hoverBg,\r\n                    }}\r\n                    initial={{ opacity: 0, x: -10 }}\r\n                    animate={{ opacity: 1, x: 0 }}\r\n                    transition={{ delay: index * 0.03 }}\r\n                  >\r\n                    {/* Column color indicator */}\r\n                    <div\r\n                      className=\"w-2 h-2 rounded-full\"\r\n                      style={{\r\n                        backgroundColor: column.color || theme.accent,\r\n                      }}\r\n                    />\r\n                    <div className=\"flex-1 min-w-0\">\r\n                      <div\r\n                        className=\"text-xs font-medium truncate\"\r\n                        style={{ color: theme.textPrimary }}\r\n                      >\r\n                        {column.title}\r\n                      </div>\r\n                      <div\r\n                        className=\"text-[10px] truncate\"\r\n                        style={{ color: theme.textTertiary }}\r\n                      >\r\n                        {column.cardIds.length} {column.cardIds.length === 1 ? 'tarea' : 'tareas'}\r\n                      </div>\r\n                    </div>\r\n                  </motion.button>\r\n                ))}\r\n            </div>\r\n          </motion.div>\r\n        )}\r\n      </AnimatePresence>\r\n    </div>\r\n  );\r\n}\r\n\r\n// Export Dropdown Component\r\ninterface ExportDropdownProps {\r\n  theme: KanbanToolbarTheme;\r\n  t: KanbanToolbarI18n;\r\n  onExportCSV?: () => void;\r\n  onExportJSON?: () => void;\r\n  onExportExcel?: () => Promise<void>;\r\n}\r\n\r\nfunction ExportDropdown({ theme, t, onExportCSV, onExportJSON, onExportExcel }: ExportDropdownProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const [isExporting, setIsExporting] = useState<string | null>(null);\r\n  const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n  // Close dropdown when clicking outside\r\n  useEffect(() => {\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n    }\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  const hasAnyExport = onExportCSV || onExportJSON || onExportExcel;\r\n\r\n  if (!hasAnyExport) return null;\r\n\r\n  const exportOptions = [\r\n    {\r\n      id: 'csv',\r\n      label: t.exportCSV,\r\n      description: 'Comma-separated',\r\n      icon: <FileText className=\"w-4 h-4\" />,\r\n      handler: onExportCSV,\r\n    },\r\n    {\r\n      id: 'json',\r\n      label: t.exportJSON,\r\n      description: 'Data',\r\n      icon: <FileJson className=\"w-4 h-4\" />,\r\n      handler: onExportJSON,\r\n    },\r\n    {\r\n      id: 'excel',\r\n      label: t.exportExcel,\r\n      description: 'Spreadsheet',\r\n      icon: <FileSpreadsheet className=\"w-4 h-4\" />,\r\n      handler: onExportExcel,\r\n    },\r\n  ].filter(opt => opt.handler);\r\n\r\n  const handleExport = async (id: string, handler: (() => void | Promise<void>) | undefined) => {\r\n    if (!handler) return;\r\n\r\n    setIsExporting(id);\r\n    try {\r\n      await handler();\r\n    } catch (error) {\r\n      console.error(`Export ${id} failed:`, error);\r\n    } finally {\r\n      setIsExporting(null);\r\n      setIsOpen(false);\r\n    }\r\n  };\r\n\r\n  return (\r\n    <div ref={dropdownRef} className=\"relative\">\r\n      <motion.button\r\n        onClick={() => setIsOpen(!isOpen)}\r\n        className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg text-xs transition-all\"\r\n        style={{\r\n          backgroundColor: isOpen ? theme.accent : theme.bgSecondary,\r\n          border: `1px solid ${isOpen ? theme.accent : theme.borderLight}`,\r\n          color: isOpen ? '#FFFFFF' : theme.textSecondary,\r\n          fontFamily: 'Inter, sans-serif',\r\n          fontWeight: 500,\r\n        }}\r\n        whileHover={{\r\n          scale: 1.02,\r\n          backgroundColor: theme.accent,\r\n          color: '#FFFFFF',\r\n        }}\r\n        whileTap={{ scale: 0.98 }}\r\n      >\r\n        <Download className=\"w-3.5 h-3.5\" />\r\n        <span>{t.export}</span>\r\n        <ChevronDown\r\n          className=\"w-3 h-3 transition-transform\"\r\n          style={{ transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)' }}\r\n        />\r\n      </motion.button>\r\n\r\n      <AnimatePresence>\r\n        {isOpen && (\r\n          <motion.div\r\n            initial={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            animate={{ opacity: 1, y: 0, scale: 1 }}\r\n            exit={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            transition={{ duration: 0.15, ease: 'easeOut' }}\r\n            className=\"absolute right-0 mt-2 w-44 rounded-lg overflow-hidden z-50\"\r\n            style={{\r\n              backgroundColor: theme.bgSecondary,\r\n              border: `1px solid ${theme.border}`,\r\n              boxShadow: '0 10px 40px rgba(0, 0, 0, 0.25)',\r\n            }}\r\n          >\r\n            <div className=\"py-1\">\r\n              {exportOptions.map((option, index) => (\r\n                <motion.button\r\n                  key={option.id}\r\n                  onClick={() => handleExport(option.id, option.handler)}\r\n                  disabled={isExporting !== null}\r\n                  className=\"w-full flex items-center gap-3 px-3 py-2.5 text-left transition-all\"\r\n                  style={{\r\n                    backgroundColor: 'transparent',\r\n                    borderBottom: index < exportOptions.length - 1 ? `1px solid ${theme.borderLight}` : 'none',\r\n                  }}\r\n                  whileHover={{\r\n                    backgroundColor: theme.hoverBg,\r\n                  }}\r\n                  initial={{ opacity: 0, x: -10 }}\r\n                  animate={{ opacity: 1, x: 0 }}\r\n                  transition={{ delay: index * 0.03 }}\r\n                >\r\n                  <div\r\n                    className=\"flex items-center justify-center w-8 h-8 rounded-md\"\r\n                    style={{\r\n                      backgroundColor: theme.accentLight,\r\n                      color: theme.accent,\r\n                    }}\r\n                  >\r\n                    {isExporting === option.id ? (\r\n                      <motion.div\r\n                        animate={{ rotate: 360 }}\r\n                        transition={{ duration: 1, repeat: Infinity, ease: 'linear' }}\r\n                      >\r\n                        <Download className=\"w-4 h-4\" />\r\n                      </motion.div>\r\n                    ) : (\r\n                      option.icon\r\n                    )}\r\n                  </div>\r\n                  <div className=\"flex-1 min-w-0\">\r\n                    <div\r\n                      className=\"text-xs font-medium truncate\"\r\n                      style={{ color: theme.textPrimary }}\r\n                    >\r\n                      {option.label}\r\n                    </div>\r\n                    <div\r\n                      className=\"text-[10px] truncate\"\r\n                      style={{ color: theme.textTertiary }}\r\n                    >\r\n                      {option.description}\r\n                    </div>\r\n                  </div>\r\n                </motion.button>\r\n              ))}\r\n            </div>\r\n          </motion.div>\r\n        )}\r\n      </AnimatePresence>\r\n    </div>\r\n  );\r\n}\r\n\r\n// Simple Create Task Button (no dropdown)\r\ninterface SimpleCreateButtonProps {\r\n  onClick: () => void;\r\n  label: string;\r\n}\r\n\r\nfunction SimpleCreateButton({ onClick, label }: SimpleCreateButtonProps) {\r\n  return (\r\n    <motion.button\r\n      onClick={onClick}\r\n      className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg text-xs transition-all\"\r\n      style={{\r\n        background: 'linear-gradient(135deg, #007FFF 0%, #0055CC 100%)',\r\n        color: '#FFFFFF',\r\n        fontFamily: 'Inter, sans-serif',\r\n        fontWeight: 500,\r\n        boxShadow: '0 2px 8px rgba(0, 229, 204, 0.3)',\r\n      }}\r\n      whileHover={{\r\n        scale: 1.02,\r\n        boxShadow: '0 4px 12px rgba(0, 229, 204, 0.4)',\r\n      }}\r\n      whileTap={{ scale: 0.98 }}\r\n    >\r\n      <Plus className=\"w-3.5 h-3.5\" />\r\n      <span>{label}</span>\r\n    </motion.button>\r\n  );\r\n}\r\n\r\nexport function KanbanToolbar({\r\n  columns,\r\n  onCreateTask,\r\n  createTaskLabel,\r\n  theme = 'dark',\r\n  locale = 'es',\r\n  useColumnSelector = false,\r\n  onExportCSV,\r\n  onExportJSON,\r\n  onExportExcel,\r\n  translations,\r\n  toolbarRightContent,\r\n  toolbarEndContent,\r\n}: KanbanToolbarProps) {\r\n  const themeStyles = theme === 'dark' ? darkTheme : lightTheme;\r\n  const t: KanbanToolbarI18n = {\r\n    ...(locale === 'es' ? defaultI18n : englishI18n),\r\n    ...translations,\r\n  };\r\n\r\n  const hasExport = onExportCSV || onExportJSON || onExportExcel;\r\n\r\n  // v0.17.37: Removed redundant task counts - column headers already show counts\r\n\r\n  return (\r\n    <div\r\n      className=\"h-12 px-4 flex items-center justify-end border-b sticky top-0 z-10\"\r\n      style={{\r\n        backgroundColor: themeStyles.bgGrid,\r\n        borderColor: themeStyles.border,\r\n      }}\r\n    >\r\n      {/* Right Section - Custom content + Create Task + Export */}\r\n      <div className=\"flex items-center gap-3\">\r\n        {toolbarRightContent && (\r\n          <>\r\n            {toolbarRightContent}\r\n            <div className=\"w-px h-5\" style={{ backgroundColor: themeStyles.borderLight }} />\r\n          </>\r\n        )}\r\n        {hasExport && (\r\n          <>\r\n            <ExportDropdown\r\n              theme={themeStyles}\r\n              t={t}\r\n              onExportCSV={onExportCSV}\r\n              onExportJSON={onExportJSON}\r\n              onExportExcel={onExportExcel}\r\n            />\r\n            {onCreateTask && (\r\n              <div\r\n                className=\"w-px h-6\"\r\n                style={{ backgroundColor: themeStyles.borderLight }}\r\n              />\r\n            )}\r\n          </>\r\n        )}\r\n\r\n        {toolbarEndContent}\r\n\r\n        {onCreateTask && (\r\n          useColumnSelector ? (\r\n            <ColumnSelector\r\n              columns={columns}\r\n              onSelect={onCreateTask}\r\n              theme={themeStyles}\r\n              t={t}\r\n              createTaskLabel={createTaskLabel}\r\n            />\r\n          ) : (\r\n            <SimpleCreateButton\r\n              onClick={() => onCreateTask()}\r\n              label={createTaskLabel || t.newTask}\r\n            />\r\n          )\r\n        )}\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n","/**\n * AddColumnButton Component\n * Button to add new columns to the Kanban board\n * @module components/Board/AddColumnButton\n */\n\nimport { useState, useCallback } from 'react'\nimport { cn } from '../../utils'\n\nexport interface AddColumnButtonProps {\n  /** Callback when a new column should be created */\n  onAddColumn: (title: string) => void\n  /** Custom class name */\n  className?: string\n  /** Placeholder text for input */\n  placeholder?: string\n  /** Button label */\n  buttonLabel?: string\n  /** Whether the button is disabled */\n  disabled?: boolean\n}\n\n/**\n * AddColumnButton - A button that allows users to add new columns to the Kanban board\n *\n * Can be used in two modes:\n * 1. Simple mode: Just a button that calls onAddColumn with a default name\n * 2. Input mode: Shows an input field for the user to type the column name\n *\n * @example\n * ```tsx\n * // Simple usage - inside KanbanBoard as children\n * <KanbanBoard board={board} callbacks={callbacks}>\n *   <AddColumnButton onAddColumn={(title) => callbacks.onColumnCreate?.({ title, position: 1000 })} />\n * </KanbanBoard>\n *\n * // With useKanbanState hook\n * const { helpers } = useKanbanState({ initialBoard })\n * <AddColumnButton onAddColumn={(title) => helpers.addColumn({ title, position: Date.now() })} />\n * ```\n */\nexport function AddColumnButton({\n  onAddColumn,\n  className,\n  placeholder = 'Nombre de la columna...',\n  buttonLabel = 'Agregar Columna',\n  disabled = false,\n}: AddColumnButtonProps) {\n  const [isEditing, setIsEditing] = useState(false)\n  const [title, setTitle] = useState('')\n\n  const handleSubmit = useCallback(() => {\n    const trimmedTitle = title.trim()\n    if (trimmedTitle) {\n      onAddColumn(trimmedTitle)\n      setTitle('')\n      setIsEditing(false)\n    }\n  }, [title, onAddColumn])\n\n  const handleKeyDown = useCallback(\n    (e: React.KeyboardEvent<HTMLInputElement>) => {\n      if (e.key === 'Enter') {\n        e.preventDefault()\n        handleSubmit()\n      } else if (e.key === 'Escape') {\n        setTitle('')\n        setIsEditing(false)\n      }\n    },\n    [handleSubmit]\n  )\n\n  const handleBlur = useCallback(() => {\n    // Small delay to allow submit button click to register\n    setTimeout(() => {\n      if (!title.trim()) {\n        setIsEditing(false)\n      }\n    }, 150)\n  }, [title])\n\n  if (isEditing) {\n    return (\n      <div\n        className={cn(\n          'asakaa-add-column asakaa-add-column--editing',\n          className\n        )}\n      >\n        <div className=\"asakaa-add-column__input-wrapper\">\n          <input\n            type=\"text\"\n            value={title}\n            onChange={(e) => setTitle(e.target.value)}\n            onKeyDown={handleKeyDown}\n            onBlur={handleBlur}\n            placeholder={placeholder}\n            autoFocus\n            className=\"asakaa-add-column__input\"\n          />\n          <div className=\"asakaa-add-column__actions\">\n            <button\n              onClick={handleSubmit}\n              disabled={!title.trim()}\n              className=\"asakaa-add-column__submit\"\n              type=\"button\"\n            >\n              <svg\n                width=\"16\"\n                height=\"16\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                strokeWidth=\"2\"\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n              >\n                <polyline points=\"20 6 9 17 4 12\" />\n              </svg>\n            </button>\n            <button\n              onClick={() => {\n                setTitle('')\n                setIsEditing(false)\n              }}\n              className=\"asakaa-add-column__cancel\"\n              type=\"button\"\n            >\n              <svg\n                width=\"16\"\n                height=\"16\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                strokeWidth=\"2\"\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n              >\n                <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n                <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n              </svg>\n            </button>\n          </div>\n        </div>\n      </div>\n    )\n  }\n\n  return (\n    <div className={cn('asakaa-add-column', className)}>\n      <button\n        onClick={() => setIsEditing(true)}\n        disabled={disabled}\n        className=\"asakaa-add-column__button\"\n        type=\"button\"\n      >\n        <svg\n          width=\"16\"\n          height=\"16\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n        >\n          <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n          <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n        </svg>\n        {buttonLabel}\n      </button>\n    </div>\n  )\n}\n","/**\r\n * QuickTaskCreate — Chronos V2.0 Glass inline task creation form\r\n * Shared between CalendarBoard and KanbanBoard (AddCardButton)\r\n * @module components/Board/QuickTaskCreate\r\n */\r\n\r\nimport { useState, useCallback, useRef, useEffect } from 'react'\r\nimport { motion, AnimatePresence } from 'framer-motion'\r\nimport { Flag, CalendarDays, User, ChevronLeft, ChevronRight } from 'lucide-react'\r\nimport { cn } from '../../utils'\r\nimport type { User as UserType } from '../Card/UserAssignmentSelector'\r\n\r\nexport interface QuickTaskCreateData {\r\n  name: string\r\n  priority?: 'low' | 'medium' | 'high' | 'urgent'\r\n  assignee?: UserType\r\n  assigneeId?: string | null\r\n  startDate?: Date\r\n  endDate?: Date\r\n}\r\n\r\nexport interface QuickTaskCreateProps {\r\n  /** Called when user submits the form */\r\n  onSubmit: (data: QuickTaskCreateData) => void\r\n  /** Called when user cancels / clicks outside */\r\n  onCancel: () => void\r\n  /** Available users for assignee picker */\r\n  availableUsers?: UserType[]\r\n  /** Dark or light theme */\r\n  isDark?: boolean\r\n  /** Locale for i18n */\r\n  locale?: 'en' | 'es'\r\n  /** Default date (e.g. the calendar cell's date) */\r\n  defaultDate?: Date\r\n  /** Extra CSS class */\r\n  className?: string\r\n  /** Whether dropdowns open upward (bottom-full) or downward (top-full). Default: 'up' */\r\n  dropdownDirection?: 'up' | 'down'\r\n}\r\n\r\nexport function QuickTaskCreate({\r\n  onSubmit,\r\n  onCancel,\r\n  availableUsers = [],\r\n  isDark = true,\r\n  locale = 'es',\r\n  defaultDate,\r\n  className,\r\n  dropdownDirection = 'up',\r\n}: QuickTaskCreateProps) {\r\n  const [name, setName] = useState('')\r\n  const [priority, setPriority] = useState<'low' | 'medium' | 'high' | 'urgent' | undefined>(undefined)\r\n  const [assigneeId, setAssigneeId] = useState<string | null>(null)\r\n  const [selectedDate, setSelectedDate] = useState<Date | null>(null)\r\n  const [showPriorityDropdown, setShowPriorityDropdown] = useState(false)\r\n  const [showAssigneeDropdown, setShowAssigneeDropdown] = useState(false)\r\n  const [showDatePicker, setShowDatePicker] = useState(false)\r\n  const [datePickerMonth, setDatePickerMonth] = useState(defaultDate || new Date())\r\n\r\n  const inputRef = useRef<HTMLInputElement>(null)\r\n  const isEs = locale === 'es'\r\n\r\n  // Dropdown position classes\r\n  const ddPos = dropdownDirection === 'up' ? 'bottom-full mb-1' : 'top-full mt-1'\r\n\r\n  useEffect(() => {\r\n    inputRef.current?.focus()\r\n  }, [])\r\n\r\n  const closeAllDropdowns = useCallback(() => {\r\n    setShowPriorityDropdown(false)\r\n    setShowAssigneeDropdown(false)\r\n    setShowDatePicker(false)\r\n  }, [])\r\n\r\n  const resetAndClose = useCallback(() => {\r\n    setName('')\r\n    setPriority(undefined)\r\n    setAssigneeId(null)\r\n    setSelectedDate(null)\r\n    closeAllDropdowns()\r\n    onCancel()\r\n  }, [onCancel, closeAllDropdowns])\r\n\r\n  /**\r\n   * La fecha que se VE y la que se GUARDA son esta, y solo esta.\r\n   *\r\n   * Antes habia dos calculos distintos: lo que se pintaba caia en `new Date()`\r\n   * y lo que se enviaba caia en `undefined`. El compositor ensenaba «30 ago» y\r\n   * la tarea se creaba con otra fecha —quien recibe el `undefined` pone lo que\r\n   * le parece; en el SaaS, hoy + 7 dias, que es de donde salia el «6 sep»—.\r\n   *\r\n   * Un control que ensena un valor y guarda otro es peor que uno que no ensena\r\n   * nada: el usuario no tiene motivo para revisar lo que ya leyo.\r\n   */\r\n  const fechaDeLaTarea = selectedDate || defaultDate || new Date()\r\n\r\n  const handleSubmit = useCallback(() => {\r\n    const trimmed = name.trim()\r\n    if (!trimmed) return\r\n    const selectedUser = availableUsers.find(u => u.id === assigneeId)\r\n    const taskDate = fechaDeLaTarea\r\n    onSubmit({\r\n      name: trimmed,\r\n      priority,\r\n      assignee: selectedUser || undefined,\r\n      assigneeId,\r\n      startDate: taskDate,\r\n      endDate: taskDate,\r\n    })\r\n    // Reset for next task\r\n    setName('')\r\n    setPriority(undefined)\r\n    setAssigneeId(null)\r\n    setSelectedDate(null)\r\n    closeAllDropdowns()\r\n    inputRef.current?.focus()\r\n  }, [name, priority, assigneeId, fechaDeLaTarea, availableUsers, onSubmit, closeAllDropdowns])\r\n\r\n  const handleKeyDown = useCallback(\r\n    (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n      if (e.key === 'Enter' && name.trim()) {\r\n        e.preventDefault()\r\n        handleSubmit()\r\n      }\r\n      if (e.key === 'Escape') {\r\n        resetAndClose()\r\n      }\r\n    },\r\n    [handleSubmit, resetAndClose, name]\r\n  )\r\n\r\n  const displayDate = fechaDeLaTarea\r\n\r\n  return (\r\n    <div\r\n      className={cn('quick-task-create', className)}\r\n      onClick={() => closeAllDropdowns()}\r\n    >\r\n      {/* Name input */}\r\n      <div className=\"p-2.5\">\r\n        <input\r\n          ref={inputRef}\r\n          type=\"text\"\r\n          value={name}\r\n          onChange={(e) => setName(e.target.value)}\r\n          placeholder={isEs ? 'Nombre de la tarea...' : 'Task name...'}\r\n          className={cn(\r\n            'w-full bg-transparent text-sm outline-none font-mono',\r\n            isDark ? 'text-white/90 placeholder:text-white/20' : 'text-gray-900 placeholder:text-gray-400'\r\n          )}\r\n          autoFocus\r\n          onKeyDown={handleKeyDown}\r\n        />\r\n      </div>\r\n\r\n      {/* Toolbar: Flag | Date | Assignee | Save */}\r\n      <div className={cn(\r\n        'px-2.5 py-2 flex items-center justify-between border-t',\r\n        isDark ? 'border-white/[0.08]' : 'border-gray-100'\r\n      )}>\r\n        <div className=\"flex items-center gap-1\">\r\n          {/* Priority dropdown */}\r\n          <div className=\"relative\">\r\n            <button\r\n              onClick={(e) => {\r\n                e.stopPropagation()\r\n                setShowPriorityDropdown(!showPriorityDropdown)\r\n                setShowAssigneeDropdown(false)\r\n                setShowDatePicker(false)\r\n              }}\r\n              type=\"button\"\r\n              className={cn(\r\n                'p-1 rounded transition-colors',\r\n                priority\r\n                  ? priority === 'urgent' || priority === 'high'\r\n                    ? 'text-red-400 bg-red-500/20'\r\n                    : priority === 'medium'\r\n                      ? 'text-yellow-400 bg-yellow-500/20'\r\n                      : 'text-green-400 bg-green-500/20'\r\n                  : isDark ? 'hover:bg-white/10 text-white/30' : 'hover:bg-gray-100 text-gray-400'\r\n              )}\r\n            >\r\n              <Flag className=\"w-3.5 h-3.5\" />\r\n            </button>\r\n            <AnimatePresence>\r\n              {showPriorityDropdown && (\r\n                <motion.div\r\n                  initial={{ opacity: 0, y: dropdownDirection === 'up' ? -5 : 5 }}\r\n                  animate={{ opacity: 1, y: 0 }}\r\n                  exit={{ opacity: 0, y: dropdownDirection === 'up' ? -5 : 5 }}\r\n                  className={cn(\r\n                    'absolute left-0 z-[60] rounded-lg shadow-xl overflow-hidden min-w-[120px]',\r\n                    ddPos,\r\n                    isDark ? 'bg-[#111] border border-white/10' : 'bg-white border border-gray-200'\r\n                  )}\r\n                  onClick={(e) => e.stopPropagation()}\r\n                >\r\n                  {[\r\n                    { id: 'urgent' as const, label: isEs ? 'Urgente' : 'Urgent', color: 'bg-red-500' },\r\n                    { id: 'high' as const, label: isEs ? 'Alta' : 'High', color: 'bg-orange-500' },\r\n                    { id: 'medium' as const, label: isEs ? 'Media' : 'Medium', color: 'bg-yellow-500' },\r\n                    { id: 'low' as const, label: isEs ? 'Baja' : 'Low', color: 'bg-green-500' },\r\n                    { id: undefined, label: isEs ? 'Sin prioridad' : 'No priority', color: 'bg-gray-400' },\r\n                  ].map((p) => (\r\n                    <button\r\n                      key={p.id || 'none'}\r\n                      onClick={() => {\r\n                        setPriority(p.id)\r\n                        setShowPriorityDropdown(false)\r\n                      }}\r\n                      type=\"button\"\r\n                      className={cn(\r\n                        'w-full flex items-center gap-2 px-3 py-1.5 text-xs transition-colors text-left',\r\n                        isDark ? 'hover:bg-white/5' : 'hover:bg-gray-50',\r\n                        priority === p.id && (isDark ? 'bg-white/5' : 'bg-gray-50')\r\n                      )}\r\n                    >\r\n                      <span className={cn('w-2 h-2 rounded-full', p.color)} />\r\n                      <span className={isDark ? 'text-white' : 'text-gray-900'}>{p.label}</span>\r\n                    </button>\r\n                  ))}\r\n                </motion.div>\r\n              )}\r\n            </AnimatePresence>\r\n          </div>\r\n\r\n          {/* Date picker */}\r\n          <div className=\"relative\">\r\n            <button\r\n              onClick={(e) => {\r\n                e.stopPropagation()\r\n                setShowDatePicker(!showDatePicker)\r\n                setShowPriorityDropdown(false)\r\n                setShowAssigneeDropdown(false)\r\n                setDatePickerMonth(selectedDate || defaultDate || new Date())\r\n              }}\r\n              type=\"button\"\r\n              className={cn(\r\n                'flex items-center gap-1 text-xs px-1.5 py-0.5 rounded transition-colors font-mono',\r\n                selectedDate\r\n                  ? isDark ? 'bg-[#007FFF]/20 text-[#007FFF]' : 'bg-[#00E5CC]/20 text-[#00C4AE]'\r\n                  : isDark ? 'bg-white/5 text-white/30 hover:bg-white/10' : 'bg-gray-100 text-gray-500 hover:bg-gray-200'\r\n              )}\r\n            >\r\n              <CalendarDays className=\"w-3 h-3\" />\r\n              {displayDate.toLocaleDateString(isEs ? 'es-ES' : 'en-US', { day: 'numeric', month: 'short' })}\r\n            </button>\r\n            <AnimatePresence>\r\n              {showDatePicker && (\r\n                <motion.div\r\n                  initial={{ opacity: 0, y: dropdownDirection === 'up' ? -5 : 5 }}\r\n                  animate={{ opacity: 1, y: 0 }}\r\n                  exit={{ opacity: 0, y: dropdownDirection === 'up' ? -5 : 5 }}\r\n                  className={cn(\r\n                    'absolute left-0 z-[60] rounded-xl shadow-2xl overflow-hidden flex',\r\n                    ddPos,\r\n                    isDark ? 'bg-[#111] border border-white/10' : 'bg-white border border-gray-200'\r\n                  )}\r\n                  onClick={(e) => e.stopPropagation()}\r\n                >\r\n                  {/* Quick Options */}\r\n                  <div className={cn('w-40 py-2 border-r', isDark ? 'border-white/10' : 'border-gray-200')}>\r\n                    {(() => {\r\n                      const today = new Date()\r\n                      const tomorrow = new Date(today); tomorrow.setDate(today.getDate() + 1)\r\n                      const nextSat = new Date(today); nextSat.setDate(today.getDate() + ((6 - today.getDay() + 7) % 7 || 7))\r\n                      const nextMon = new Date(today); nextMon.setDate(today.getDate() + ((1 - today.getDay() + 7) % 7 || 7))\r\n                      const twoWeeks = new Date(today); twoWeeks.setDate(today.getDate() + 14)\r\n                      const fourWeeks = new Date(today); fourWeeks.setDate(today.getDate() + 28)\r\n                      const loc = isEs ? 'es-ES' : 'en-US'\r\n                      const opts = [\r\n                        { label: isEs ? 'Hoy' : 'Today', date: today, display: today.toLocaleDateString(loc, { weekday: 'short' }).slice(0, 3) + '.' },\r\n                        { label: isEs ? 'Mañana' : 'Tomorrow', date: tomorrow, display: tomorrow.toLocaleDateString(loc, { weekday: 'short' }).slice(0, 3) + '.' },\r\n                        { label: isEs ? 'Este fin de semana' : 'This weekend', date: nextSat, display: isEs ? 'sáb.' : 'sat.' },\r\n                        { label: isEs ? 'Próxima semana' : 'Next week', date: nextMon, display: isEs ? 'lun.' : 'mon.' },\r\n                        { label: isEs ? '2 semanas' : '2 weeks', date: twoWeeks, display: twoWeeks.toLocaleDateString(loc, { day: 'numeric', month: 'short' }) },\r\n                        { label: isEs ? '4 semanas' : '4 weeks', date: fourWeeks, display: fourWeeks.toLocaleDateString(loc, { day: 'numeric', month: 'short' }) },\r\n                      ]\r\n                      return opts.map((o, i) => (\r\n                        <button\r\n                          key={i}\r\n                          type=\"button\"\r\n                          className={cn(\r\n                            'w-full flex items-center justify-between px-3 py-1.5 text-xs transition-colors',\r\n                            isDark ? 'hover:bg-white/5 text-white' : 'hover:bg-gray-50 text-gray-900'\r\n                          )}\r\n                          onClick={() => { setSelectedDate(o.date); setShowDatePicker(false) }}\r\n                        >\r\n                          <span>{o.label}</span>\r\n                          <span className={cn('text-[10px] font-mono', isDark ? 'text-white/30' : 'text-gray-400')}>{o.display}</span>\r\n                        </button>\r\n                      ))\r\n                    })()}\r\n                  </div>\r\n\r\n                  {/* Mini calendar */}\r\n                  <div className=\"p-3\">\r\n                    <div className=\"flex items-center justify-between mb-3\">\r\n                      <span className={cn('text-xs font-medium font-mono', isDark ? 'text-white' : 'text-gray-900')}>\r\n                        {datePickerMonth.toLocaleDateString(isEs ? 'es-ES' : 'en-US', { month: 'long', year: 'numeric' })}\r\n                      </span>\r\n                      <div className=\"flex items-center gap-0.5\">\r\n                        <button\r\n                          type=\"button\"\r\n                          onClick={() => setDatePickerMonth(new Date())}\r\n                          className={cn('px-1.5 py-0.5 rounded text-[10px] transition-colors font-mono', isDark ? 'hover:bg-white/10 text-white/40' : 'hover:bg-gray-100 text-gray-500')}\r\n                        >\r\n                          {isEs ? 'Hoy' : 'Today'}\r\n                        </button>\r\n                        <button\r\n                          type=\"button\"\r\n                          onClick={() => setDatePickerMonth(new Date(datePickerMonth.getFullYear(), datePickerMonth.getMonth() - 1))}\r\n                          className={cn('p-0.5 rounded', isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100')}\r\n                        >\r\n                          <ChevronLeft className=\"w-3.5 h-3.5\" />\r\n                        </button>\r\n                        <button\r\n                          type=\"button\"\r\n                          onClick={() => setDatePickerMonth(new Date(datePickerMonth.getFullYear(), datePickerMonth.getMonth() + 1))}\r\n                          className={cn('p-0.5 rounded', isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100')}\r\n                        >\r\n                          <ChevronRight className=\"w-3.5 h-3.5\" />\r\n                        </button>\r\n                      </div>\r\n                    </div>\r\n\r\n                    <div className=\"grid grid-cols-7 gap-0.5 mb-1\">\r\n                      {(isEs\r\n                        ? ['do', 'lu', 'ma', 'mi', 'ju', 'vi', 'sá']\r\n                        : ['su', 'mo', 'tu', 'we', 'th', 'fr', 'sa']\r\n                      ).map((d) => (\r\n                        <div key={d} className={cn('w-6 h-6 flex items-center justify-center text-[10px] font-mono', isDark ? 'text-white/30' : 'text-gray-400')}>\r\n                          {d}\r\n                        </div>\r\n                      ))}\r\n                    </div>\r\n\r\n                    <div className=\"grid grid-cols-7 gap-0.5\">\r\n                      {(() => {\r\n                        const yr = datePickerMonth.getFullYear(), mo = datePickerMonth.getMonth()\r\n                        const firstDay = new Date(yr, mo, 1).getDay()\r\n                        const daysInMonth = new Date(yr, mo + 1, 0).getDate()\r\n                        const prevDays = new Date(yr, mo, 0).getDate()\r\n                        const todayStr = new Date().toDateString()\r\n                        const calDays: Array<{ dayNum: number; isCurrent: boolean; date: Date }> = []\r\n                        for (let i = firstDay - 1; i >= 0; i--) calDays.push({ dayNum: prevDays - i, isCurrent: false, date: new Date(yr, mo - 1, prevDays - i) })\r\n                        for (let i = 1; i <= daysInMonth; i++) calDays.push({ dayNum: i, isCurrent: true, date: new Date(yr, mo, i) })\r\n                        const rem = 42 - calDays.length\r\n                        for (let i = 1; i <= rem; i++) calDays.push({ dayNum: i, isCurrent: false, date: new Date(yr, mo + 1, i) })\r\n                        return calDays.map((d, i) => {\r\n                          const isToday = d.date.toDateString() === todayStr\r\n                          const isSel = (selectedDate || defaultDate)?.toDateString() === d.date.toDateString()\r\n                          return (\r\n                            <button\r\n                              key={i}\r\n                              type=\"button\"\r\n                              className={cn(\r\n                                'w-6 h-6 rounded-full flex items-center justify-center text-[10px] transition-colors font-mono',\r\n                                !d.isCurrent && (isDark ? 'text-white/20' : 'text-gray-300'),\r\n                                d.isCurrent && (isDark ? 'text-white' : 'text-gray-900'),\r\n                                isToday && 'ring-1 ring-[#007FFF]',\r\n                                isSel && 'bg-[#007FFF] text-white',\r\n                                !isSel && (isDark ? 'hover:bg-white/10' : 'hover:bg-gray-100')\r\n                              )}\r\n                              onClick={() => { setSelectedDate(d.date); setShowDatePicker(false) }}\r\n                            >\r\n                              {d.dayNum}\r\n                            </button>\r\n                          )\r\n                        })\r\n                      })()}\r\n                    </div>\r\n                  </div>\r\n                </motion.div>\r\n              )}\r\n            </AnimatePresence>\r\n          </div>\r\n\r\n          {/* Assignee dropdown */}\r\n          <div className=\"relative\">\r\n            <button\r\n              onClick={(e) => {\r\n                e.stopPropagation()\r\n                setShowAssigneeDropdown(!showAssigneeDropdown)\r\n                setShowPriorityDropdown(false)\r\n                setShowDatePicker(false)\r\n              }}\r\n              type=\"button\"\r\n              className={cn(\r\n                'p-1 rounded transition-colors',\r\n                assigneeId\r\n                  ? 'text-[#007FFF] bg-[#007FFF]/20'\r\n                  : isDark ? 'hover:bg-white/10 text-white/30' : 'hover:bg-gray-100 text-gray-400'\r\n              )}\r\n            >\r\n              {assigneeId ? (\r\n                <div\r\n                  className=\"w-4 h-4 rounded-full flex items-center justify-center text-white text-[8px] font-mono font-bold\"\r\n                  style={{ backgroundColor: availableUsers.find(u => u.id === assigneeId)?.color || '#007FFF' }}\r\n                >\r\n                  {availableUsers.find(u => u.id === assigneeId)?.initials ||\r\n                   availableUsers.find(u => u.id === assigneeId)?.name?.slice(0, 2).toUpperCase()}\r\n                </div>\r\n              ) : (\r\n                <User className=\"w-3.5 h-3.5\" />\r\n              )}\r\n            </button>\r\n            <AnimatePresence>\r\n              {showAssigneeDropdown && (\r\n                <motion.div\r\n                  initial={{ opacity: 0, y: dropdownDirection === 'up' ? -5 : 5 }}\r\n                  animate={{ opacity: 1, y: 0 }}\r\n                  exit={{ opacity: 0, y: dropdownDirection === 'up' ? -5 : 5 }}\r\n                  className={cn(\r\n                    'absolute left-0 z-[60] rounded-lg shadow-xl overflow-hidden min-w-[160px] max-h-[200px] overflow-y-auto',\r\n                    ddPos,\r\n                    isDark ? 'bg-[#111] border border-white/10' : 'bg-white border border-gray-200'\r\n                  )}\r\n                  onClick={(e) => e.stopPropagation()}\r\n                >\r\n                  <button\r\n                    type=\"button\"\r\n                    onClick={() => { setAssigneeId(null); setShowAssigneeDropdown(false) }}\r\n                    className={cn(\r\n                      'w-full flex items-center gap-2 px-3 py-1.5 text-xs transition-colors text-left',\r\n                      isDark ? 'hover:bg-white/5' : 'hover:bg-gray-50',\r\n                      !assigneeId && (isDark ? 'bg-white/5' : 'bg-gray-50')\r\n                    )}\r\n                  >\r\n                    <div className={cn('w-5 h-5 rounded-full flex items-center justify-center', isDark ? 'bg-white/10' : 'bg-gray-200')}>\r\n                      <User className=\"w-3 h-3 text-gray-400\" />\r\n                    </div>\r\n                    <span className={isDark ? 'text-white/40' : 'text-gray-500'}>\r\n                      {isEs ? 'Sin asignar' : 'Unassigned'}\r\n                    </span>\r\n                  </button>\r\n                  {availableUsers.map((user) => (\r\n                    <button\r\n                      key={user.id}\r\n                      type=\"button\"\r\n                      onClick={() => { setAssigneeId(user.id); setShowAssigneeDropdown(false) }}\r\n                      className={cn(\r\n                        'w-full flex items-center gap-2 px-3 py-1.5 text-xs transition-colors text-left',\r\n                        isDark ? 'hover:bg-white/5' : 'hover:bg-gray-50',\r\n                        assigneeId === user.id && (isDark ? 'bg-white/5' : 'bg-gray-50')\r\n                      )}\r\n                    >\r\n                      <div\r\n                        className=\"w-5 h-5 rounded-full flex items-center justify-center text-white text-[9px] font-mono font-bold\"\r\n                        style={{ backgroundColor: user.color || '#007FFF' }}\r\n                      >\r\n                        {user.initials || user.name?.slice(0, 2).toUpperCase()}\r\n                      </div>\r\n                      <span className={isDark ? 'text-white' : 'text-gray-900'}>{user.name}</span>\r\n                    </button>\r\n                  ))}\r\n                  {availableUsers.length === 0 && (\r\n                    <div className={cn('px-3 py-2 text-xs font-mono', isDark ? 'text-white/30' : 'text-gray-400')}>\r\n                      {isEs ? 'No hay usuarios disponibles' : 'No users available'}\r\n                    </div>\r\n                  )}\r\n                </motion.div>\r\n              )}\r\n            </AnimatePresence>\r\n          </div>\r\n        </div>\r\n\r\n        {/* Save button */}\r\n        <button\r\n          onClick={handleSubmit}\r\n          disabled={!name.trim()}\r\n          type=\"button\"\r\n          className={cn(\r\n            'px-2.5 py-1 rounded text-xs font-mono font-medium transition-colors',\r\n            name.trim()\r\n              ? 'bg-[#007FFF] hover:bg-[#0066CC] text-white'\r\n              : isDark ? 'bg-white/5 text-white/20' : 'bg-gray-100 text-gray-400'\r\n          )}\r\n        >\r\n          {isEs ? 'Guardar' : 'Save'}\r\n        </button>\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n","/**\n * AddCardButton Component — Dashed \"+\" button + floating Chronos quick-create form\n * The form appears as a popover below the button, outside the column container\n * @module components/Board/AddCardButton\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { cn } from '../../utils'\nimport { QuickTaskCreate } from './QuickTaskCreate'\nimport type { QuickTaskCreateData } from './QuickTaskCreate'\nimport type { User as UserType } from '../Card/UserAssignmentSelector'\n\nexport interface AddCardData {\n  /** Task name (required) */\n  name: string\n  /** Column ID where the card will be created */\n  columnId: string\n  /** Assigned user IDs */\n  assigneeIds?: string[]\n  /** Start date */\n  startDate?: Date\n  /** End date / due date */\n  endDate?: Date\n  /** Priority */\n  priority?: 'low' | 'medium' | 'high' | 'urgent'\n}\n\nexport interface AddCardButtonProps {\n  /** Column ID where cards will be created */\n  columnId: string\n  /** Callback when a new card should be created */\n  onAddCard: (data: AddCardData) => void | Promise<void>\n  /** Available users for assignment */\n  availableUsers?: UserType[]\n  /** Custom class name */\n  className?: string\n  /** Placeholder text for input */\n  placeholder?: string\n  /** Button label */\n  buttonLabel?: string\n  /** Whether the button is disabled */\n  disabled?: boolean\n  /** Theme: 'light' or 'dark' */\n  theme?: 'light' | 'dark'\n  /** Locale for translations */\n  locale?: 'en' | 'es'\n}\n\nexport function AddCardButton({\n  columnId,\n  onAddCard,\n  availableUsers = [],\n  className,\n  buttonLabel,\n  disabled = false,\n  theme = 'dark',\n  locale = 'es',\n}: AddCardButtonProps) {\n  const [isExpanded, setIsExpanded] = useState(false)\n  const buttonRef = useRef<HTMLDivElement>(null)\n  const formRef = useRef<HTMLDivElement>(null)\n  const [popoverStyle, setPopoverStyle] = useState<React.CSSProperties>({})\n  const [opensUp, setOpensUp] = useState(false)\n\n  const isDark = theme === 'dark'\n  const isEs = locale === 'es'\n\n  const t = {\n    buttonLabel: buttonLabel || (isEs ? 'Agregar Tarea' : 'Add Task'),\n  }\n\n  // Position the popover: below button if space, above if not\n  useEffect(() => {\n    if (!isExpanded || !buttonRef.current) return\n\n    const POPOVER_HEIGHT = 90 // approximate height of the quick-create form\n\n    const updatePosition = () => {\n      const rect = buttonRef.current!.getBoundingClientRect()\n      const spaceBelow = window.innerHeight - rect.bottom\n      const goUp = spaceBelow < POPOVER_HEIGHT + 8\n\n      setOpensUp(goUp)\n      setPopoverStyle({\n        position: 'fixed',\n        ...(goUp\n          ? { bottom: window.innerHeight - rect.top + 4 }\n          : { top: rect.bottom + 4 }),\n        left: rect.left,\n        width: rect.width,\n        zIndex: 9999,\n      })\n    }\n\n    updatePosition()\n\n    window.addEventListener('scroll', updatePosition, true)\n    window.addEventListener('resize', updatePosition)\n    return () => {\n      window.removeEventListener('scroll', updatePosition, true)\n      window.removeEventListener('resize', updatePosition)\n    }\n  }, [isExpanded])\n\n  // Click-outside to close\n  useEffect(() => {\n    if (!isExpanded) return\n    const handleClickOutside = (e: MouseEvent) => {\n      const target = e.target as Node\n      if (\n        formRef.current && !formRef.current.contains(target) &&\n        buttonRef.current && !buttonRef.current.contains(target)\n      ) {\n        setIsExpanded(false)\n      }\n    }\n    document.addEventListener('mousedown', handleClickOutside)\n    return () => document.removeEventListener('mousedown', handleClickOutside)\n  }, [isExpanded])\n\n  const handleSubmit = useCallback((data: QuickTaskCreateData) => {\n    onAddCard({\n      name: data.name,\n      columnId,\n      assigneeIds: data.assigneeId ? [data.assigneeId] : undefined,\n      startDate: data.startDate,\n      endDate: data.endDate,\n      priority: data.priority,\n    })\n  }, [onAddCard, columnId])\n\n  return (\n    <div ref={buttonRef} className={cn('asakaa-add-card', className)}>\n      <button\n        onClick={() => setIsExpanded(!isExpanded)}\n        disabled={disabled}\n        className=\"asakaa-add-card__button\"\n        type=\"button\"\n      >\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n          <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n          <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n        </svg>\n        {t.buttonLabel}\n      </button>\n\n      {/* Portal popover — floats below the button, outside column */}\n      {createPortal(\n        <AnimatePresence>\n          {isExpanded && (\n            <motion.div\n              ref={formRef}\n              initial={{ opacity: 0, y: opensUp ? 4 : -4, scale: 0.97 }}\n              animate={{ opacity: 1, y: 0, scale: 1 }}\n              exit={{ opacity: 0, y: opensUp ? 4 : -4, scale: 0.97 }}\n              transition={{ duration: 0.12 }}\n              style={popoverStyle}\n              className={cn(\n                'rounded-lg shadow-2xl',\n                isDark\n                  ? 'bg-[#0A0A0A]/95 backdrop-blur-xl border border-white/[0.08] shadow-[0_8px_32px_rgba(0,0,0,0.6)]'\n                  : 'bg-white border border-gray-200 shadow-xl'\n              )}\n            >\n              <QuickTaskCreate\n                onSubmit={handleSubmit}\n                onCancel={() => setIsExpanded(false)}\n                availableUsers={availableUsers}\n                isDark={isDark}\n                locale={locale}\n                dropdownDirection=\"up\"\n              />\n            </motion.div>\n          )}\n        </AnimatePresence>,\n        document.body\n      )}\n    </div>\n  )\n}\n","/**\n * Error Boundary Component\n * Catches errors in child components and provides fallback UI\n * @module components/ErrorBoundary\n */\n\nimport React, { Component, ErrorInfo, ReactNode } from 'react'\n\nexport interface ErrorBoundaryProps {\n  /** Child components to wrap */\n  children: ReactNode\n  /** Custom fallback UI (receives error and reset callback) */\n  fallback?: (error: Error, reset: () => void) => ReactNode\n  /** Callback when error is caught */\n  onError?: (error: Error, errorInfo: ErrorInfo) => void\n  /** Component identifier for error tracking */\n  componentName?: string\n}\n\ninterface ErrorBoundaryState {\n  hasError: boolean\n  error: Error | null\n  errorInfo: ErrorInfo | null\n}\n\n/**\n * Error Boundary for catching React errors\n *\n * @example\n * ```tsx\n * <ErrorBoundary\n *   onError={(error) => console.error(error)}\n *   componentName=\"KanbanBoard\"\n * >\n *   <KanbanBoard {...props} />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n  constructor(props: ErrorBoundaryProps) {\n    super(props)\n    this.state = {\n      hasError: false,\n      error: null,\n      errorInfo: null,\n    }\n  }\n\n  static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n    return {\n      hasError: true,\n      error,\n    }\n  }\n\n  componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n    const { onError, componentName } = this.props\n\n    // Log error to console in development\n    if (process.env.NODE_ENV === 'development') {\n      console.error(`Error in ${componentName || 'Component'}:`, error)\n      console.error('Error Info:', errorInfo)\n    }\n\n    // Update state with error info\n    this.setState({\n      errorInfo,\n    })\n\n    // Call custom error handler\n    if (onError) {\n      try {\n        onError(error, errorInfo)\n      } catch (handlerError) {\n        console.error('Error in error handler:', handlerError)\n      }\n    }\n  }\n\n  resetError = (): void => {\n    this.setState({\n      hasError: false,\n      error: null,\n      errorInfo: null,\n    })\n  }\n\n  render(): ReactNode {\n    const { hasError, error } = this.state\n    const { children, fallback, componentName } = this.props\n\n    if (hasError && error) {\n      // Use custom fallback if provided\n      if (fallback) {\n        return fallback(error, this.resetError)\n      }\n\n      // Default fallback UI\n      return (\n        <div\n          className=\"p-6 rounded-lg border\"\n          style={{\n            background: 'linear-gradient(135deg, #2d1b1b 0%, #1a1a1a 100%)',\n            borderColor: 'rgba(239, 68, 68, 0.3)',\n          }}\n        >\n          <div className=\"flex items-start gap-3\">\n            {/* Error icon */}\n            <svg\n              width=\"24\"\n              height=\"24\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              xmlns=\"http://www.w3.org/2000/svg\"\n              className=\"flex-shrink-0\"\n            >\n              <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"#EF4444\" strokeWidth=\"2\" />\n              <path d=\"M12 8V12\" stroke=\"#EF4444\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n              <circle cx=\"12\" cy=\"16\" r=\"1\" fill=\"#EF4444\" />\n            </svg>\n\n            <div className=\"flex-1\">\n              <h3 className=\"text-lg font-semibold text-red-400 mb-1\">\n                {componentName ? `Error in ${componentName}` : 'Something went wrong'}\n              </h3>\n              <p className=\"text-sm text-white/70 mb-3\">\n                {error.message || 'An unexpected error occurred'}\n              </p>\n\n              {process.env.NODE_ENV === 'development' && (\n                <details className=\"mb-3\">\n                  <summary className=\"text-xs text-white/50 cursor-pointer hover:text-white/70 mb-2\">\n                    Error Details (Development Only)\n                  </summary>\n                  <pre className=\"text-xs text-white/60 bg-black/30 p-3 rounded overflow-auto max-h-48\">\n                    {error.stack}\n                  </pre>\n                </details>\n              )}\n\n              <button\n                onClick={this.resetError}\n                className=\"px-4 py-2 rounded-lg text-sm font-medium transition-all hover:bg-red-600/20 border border-red-500/30\"\n                style={{ color: '#EF4444' }}\n              >\n                Try Again\n              </button>\n            </div>\n          </div>\n        </div>\n      )\n    }\n\n    return children\n  }\n}\n\n/**\n * Hook-based error boundary wrapper\n * Use this for functional components\n */\nexport function withErrorBoundary<P extends object>(\n  Component: React.ComponentType<P>,\n  errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>\n) {\n  const WrappedComponent = (props: P) => (\n    <ErrorBoundary {...errorBoundaryProps}>\n      <Component {...props} />\n    </ErrorBoundary>\n  )\n\n  WrappedComponent.displayName = `withErrorBoundary(${Component.displayName || Component.name || 'Component'})`\n\n  return WrappedComponent\n}\n","/**\r\n * CommandPalette - Premium command palette (Cmd+K / Ctrl+K)\r\n * Quick access to all board actions, search, navigation, and AI features\r\n */\r\n\r\nimport { useEffect, useState, useCallback } from 'react'\r\nimport { Command } from 'cmdk'\r\nimport { Portal } from '../Portal'\r\nimport type { Board, Priority, User } from '../../types'\r\nimport './command-palette.css'\r\n\r\nexport interface CommandPaletteProps {\r\n  /** Current board state */\r\n  board: Board\r\n\r\n  /** Available users for assignment */\r\n  availableUsers?: User[]\r\n\r\n  /** Callback to create a new card */\r\n  onCreateCard?: (columnId: string, title: string) => void\r\n\r\n  /** Callback to navigate to a card */\r\n  onNavigateToCard?: (cardId: string) => void\r\n\r\n  /** Callback to search and filter cards */\r\n  onSearch?: (query: string) => void\r\n\r\n  /** Callback to change card priority */\r\n  onChangePriority?: (cardId: string, priority: Priority) => void\r\n\r\n  /** Callback to assign user to card */\r\n  onAssignUser?: (cardId: string, userId: string) => void\r\n\r\n  /** AI Callbacks */\r\n  onGeneratePlan?: () => void\r\n  onPredictRisks?: () => void\r\n  onOpenAIUsage?: () => void\r\n\r\n  /** Custom keyboard shortcut (default: Cmd+K / Ctrl+K) */\r\n  shortcut?: string\r\n\r\n  /** Custom CSS class */\r\n  className?: string\r\n}\r\n\r\ntype CommandPage = 'home' | 'create-card' | 'navigate' | 'priority' | 'assign' | 'ai'\r\n\r\nexport function CommandPalette({\r\n  board,\r\n  onCreateCard,\r\n  onNavigateToCard,\r\n  onSearch,\r\n  onChangePriority,\r\n  onAssignUser,\r\n  onGeneratePlan,\r\n  onPredictRisks,\r\n  onOpenAIUsage,\r\n  shortcut = 'k',\r\n  className = '',\r\n}: CommandPaletteProps) {\r\n  const [isOpen, setIsOpen] = useState(false)\r\n  const [search, setSearch] = useState('')\r\n  const [page, setPage] = useState<CommandPage>('home')\r\n  const [selectedColumn, setSelectedColumn] = useState<string>('')\r\n  const [selectedCard, setSelectedCard] = useState<string>('')\r\n\r\n  // Keyboard shortcut handler\r\n  useEffect(() => {\r\n    const handleKeyDown = (e: KeyboardEvent) => {\r\n      if ((e.metaKey || e.ctrlKey) && e.key === shortcut) {\r\n        e.preventDefault()\r\n        setIsOpen((open) => !open)\r\n      }\r\n\r\n      // Escape to close\r\n      if (e.key === 'Escape') {\r\n        setIsOpen(false)\r\n        setPage('home')\r\n        setSearch('')\r\n      }\r\n    }\r\n\r\n    document.addEventListener('keydown', handleKeyDown)\r\n    return () => document.removeEventListener('keydown', handleKeyDown)\r\n  }, [shortcut])\r\n\r\n  // Reset state when closed\r\n  useEffect(() => {\r\n    if (!isOpen) {\r\n      setPage('home')\r\n      setSearch('')\r\n      setSelectedColumn('')\r\n      setSelectedCard('')\r\n    }\r\n  }, [isOpen])\r\n\r\n  const handleClose = useCallback(() => {\r\n    setIsOpen(false)\r\n  }, [])\r\n\r\n  const handleSelectCommand = useCallback(\r\n    (value: string) => {\r\n      // Parse command value\r\n      const [action, param] = value.split(':')\r\n\r\n      switch (action) {\r\n        case 'create-card':\r\n          setPage('create-card')\r\n          break\r\n\r\n        case 'create-card-in':\r\n          setSelectedColumn(param || '')\r\n          // Focus on input to type card title\r\n          break\r\n\r\n        case 'navigate':\r\n          if (param) {\r\n            onNavigateToCard?.(param)\r\n            handleClose()\r\n          } else {\r\n            setPage('navigate')\r\n          }\r\n          break\r\n\r\n        case 'search':\r\n          onSearch?.(search)\r\n          handleClose()\r\n          break\r\n\r\n        case 'priority':\r\n          setPage('priority')\r\n          break\r\n\r\n        case 'set-priority':\r\n          if (selectedCard && param) {\r\n            onChangePriority?.(selectedCard, param as Priority)\r\n            handleClose()\r\n          }\r\n          break\r\n\r\n        case 'assign':\r\n          setPage('assign')\r\n          break\r\n\r\n        case 'assign-user':\r\n          if (selectedCard && param) {\r\n            onAssignUser?.(selectedCard, param)\r\n            handleClose()\r\n          }\r\n          break\r\n\r\n        case 'ai':\r\n          setPage('ai')\r\n          break\r\n\r\n        case 'ai-generate-plan':\r\n          onGeneratePlan?.()\r\n          handleClose()\r\n          break\r\n\r\n        case 'ai-predict-risks':\r\n          onPredictRisks?.()\r\n          handleClose()\r\n          break\r\n\r\n        case 'ai-usage':\r\n          onOpenAIUsage?.()\r\n          handleClose()\r\n          break\r\n\r\n        case 'back':\r\n          setPage('home')\r\n          break\r\n\r\n        default:\r\n          break\r\n      }\r\n    },\r\n    [\r\n      search,\r\n      selectedCard,\r\n      onCreateCard,\r\n      onNavigateToCard,\r\n      onSearch,\r\n      onChangePriority,\r\n      onAssignUser,\r\n      onGeneratePlan,\r\n      onPredictRisks,\r\n      onOpenAIUsage,\r\n      handleClose,\r\n    ]\r\n  )\r\n\r\n  const handleCreateCard = useCallback(() => {\r\n    if (selectedColumn && search.trim()) {\r\n      onCreateCard?.(selectedColumn, search.trim())\r\n      handleClose()\r\n    }\r\n  }, [selectedColumn, search, onCreateCard, handleClose])\r\n\r\n  if (!isOpen) return null\r\n\r\n  return (\r\n    <Portal>\r\n      <div className=\"command-palette-overlay\" onClick={handleClose}>\r\n        <div\r\n          className={`command-palette ${className}`}\r\n          onClick={(e) => e.stopPropagation()}\r\n        >\r\n          <Command value={search} onValueChange={setSearch} label=\"Command Menu\">\r\n            <div className=\"command-palette-header\">\r\n              <svg\r\n                width=\"20\"\r\n                height=\"20\"\r\n                viewBox=\"0 0 24 24\"\r\n                fill=\"none\"\r\n                stroke=\"currentColor\"\r\n                strokeWidth=\"2\"\r\n                strokeLinecap=\"round\"\r\n                strokeLinejoin=\"round\"\r\n              >\r\n                <circle cx=\"11\" cy=\"11\" r=\"8\" />\r\n                <path d=\"m21 21-4.35-4.35\" />\r\n              </svg>\r\n              <Command.Input\r\n                placeholder={\r\n                  page === 'create-card' && selectedColumn\r\n                    ? 'Type card title and press Enter...'\r\n                    : page === 'create-card'\r\n                    ? 'Select a column first...'\r\n                    : 'Type a command or search...'\r\n                }\r\n                className=\"command-palette-input\"\r\n                onKeyDown={(e) => {\r\n                  if (e.key === 'Enter' && page === 'create-card' && selectedColumn) {\r\n                    handleCreateCard()\r\n                  }\r\n                }}\r\n              />\r\n              <div className=\"command-palette-shortcut\">\r\n                <kbd>{navigator.platform.includes('Mac') ? '⌘' : 'Ctrl'}</kbd>\r\n                <kbd>K</kbd>\r\n              </div>\r\n            </div>\r\n\r\n            <Command.List className=\"command-palette-list\">\r\n              <Command.Empty className=\"command-palette-empty\">\r\n                No results found.\r\n              </Command.Empty>\r\n\r\n              {/* HOME PAGE */}\r\n              {page === 'home' && (\r\n                <>\r\n                  <Command.Group heading=\"Actions\" className=\"command-palette-group\">\r\n                    <Command.Item\r\n                      value=\"create-card\"\r\n                      onSelect={handleSelectCommand}\r\n                      className=\"command-palette-item\"\r\n                    >\r\n                      <svg\r\n                        width=\"16\"\r\n                        height=\"16\"\r\n                        viewBox=\"0 0 24 24\"\r\n                        fill=\"none\"\r\n                        stroke=\"currentColor\"\r\n                        strokeWidth=\"2\"\r\n                      >\r\n                        <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\r\n                        <path d=\"M12 8v8m-4-4h8\" />\r\n                      </svg>\r\n                      <span>Create Card</span>\r\n                      <div className=\"command-palette-item-shortcut\">C</div>\r\n                    </Command.Item>\r\n\r\n                    <Command.Item\r\n                      value=\"navigate\"\r\n                      onSelect={handleSelectCommand}\r\n                      className=\"command-palette-item\"\r\n                    >\r\n                      <svg\r\n                        width=\"16\"\r\n                        height=\"16\"\r\n                        viewBox=\"0 0 24 24\"\r\n                        fill=\"none\"\r\n                        stroke=\"currentColor\"\r\n                        strokeWidth=\"2\"\r\n                      >\r\n                        <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n                        <polyline points=\"12 16 16 12 12 8\" />\r\n                        <line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\" />\r\n                      </svg>\r\n                      <span>Navigate to Card</span>\r\n                      <div className=\"command-palette-item-shortcut\">G</div>\r\n                    </Command.Item>\r\n\r\n                    <Command.Item\r\n                      value=\"search\"\r\n                      onSelect={handleSelectCommand}\r\n                      className=\"command-palette-item\"\r\n                    >\r\n                      <svg\r\n                        width=\"16\"\r\n                        height=\"16\"\r\n                        viewBox=\"0 0 24 24\"\r\n                        fill=\"none\"\r\n                        stroke=\"currentColor\"\r\n                        strokeWidth=\"2\"\r\n                      >\r\n                        <circle cx=\"11\" cy=\"11\" r=\"8\" />\r\n                        <path d=\"m21 21-4.35-4.35\" />\r\n                      </svg>\r\n                      <span>Search Cards</span>\r\n                      <div className=\"command-palette-item-shortcut\">/</div>\r\n                    </Command.Item>\r\n                  </Command.Group>\r\n\r\n                  <Command.Group heading=\"AI Features\" className=\"command-palette-group\">\r\n                    <Command.Item\r\n                      value=\"ai\"\r\n                      onSelect={handleSelectCommand}\r\n                      className=\"command-palette-item command-palette-item-ai\"\r\n                    >\r\n                      <svg\r\n                        width=\"16\"\r\n                        height=\"16\"\r\n                        viewBox=\"0 0 24 24\"\r\n                        fill=\"none\"\r\n                        stroke=\"currentColor\"\r\n                        strokeWidth=\"2\"\r\n                      >\r\n                        <path d=\"M12 2L2 7L12 12L22 7L12 2Z\" />\r\n                        <path d=\"M2 17L12 22L22 17\" />\r\n                        <path d=\"M2 12L12 17L22 12\" />\r\n                      </svg>\r\n                      <span>AI Commands</span>\r\n                      <div className=\"command-palette-item-badge\">AI</div>\r\n                    </Command.Item>\r\n                  </Command.Group>\r\n\r\n                  <Command.Group heading=\"Cards\" className=\"command-palette-group\">\r\n                    {board.cards.slice(0, 5).map((card) => (\r\n                      <Command.Item\r\n                        key={card.id}\r\n                        value={`navigate:${card.id}`}\r\n                        onSelect={handleSelectCommand}\r\n                        className=\"command-palette-item\"\r\n                      >\r\n                        <div\r\n                          className=\"command-palette-item-dot\"\r\n                          style={{\r\n                            background:\r\n                              card.priority === 'URGENT'\r\n                                ? '#EF4444'\r\n                                : card.priority === 'HIGH'\r\n                                ? '#F59E0B'\r\n                                : card.priority === 'MEDIUM'\r\n                                ? '#00E5CC'\r\n                                : '#6B7280',\r\n                          }}\r\n                        />\r\n                        <span>{card.title}</span>\r\n                        {card.labels && card.labels.length > 0 && (\r\n                          <div className=\"command-palette-item-labels\">\r\n                            {card.labels.slice(0, 2).map((label) => (\r\n                              <span key={label} className=\"command-palette-item-label\">\r\n                                {label}\r\n                              </span>\r\n                            ))}\r\n                          </div>\r\n                        )}\r\n                      </Command.Item>\r\n                    ))}\r\n                  </Command.Group>\r\n                </>\r\n              )}\r\n\r\n              {/* CREATE CARD PAGE */}\r\n              {page === 'create-card' && (\r\n                <>\r\n                  <Command.Item\r\n                    value=\"back\"\r\n                    onSelect={handleSelectCommand}\r\n                    className=\"command-palette-item\"\r\n                  >\r\n                    <svg\r\n                      width=\"16\"\r\n                      height=\"16\"\r\n                      viewBox=\"0 0 24 24\"\r\n                      fill=\"none\"\r\n                      stroke=\"currentColor\"\r\n                      strokeWidth=\"2\"\r\n                    >\r\n                      <path d=\"M19 12H5M12 19l-7-7 7-7\" />\r\n                    </svg>\r\n                    <span>Back</span>\r\n                  </Command.Item>\r\n\r\n                  <Command.Group\r\n                    heading=\"Select Column\"\r\n                    className=\"command-palette-group\"\r\n                  >\r\n                    {board.columns.map((column) => (\r\n                      <Command.Item\r\n                        key={column.id}\r\n                        value={`create-card-in:${column.id}`}\r\n                        onSelect={handleSelectCommand}\r\n                        className=\"command-palette-item\"\r\n                      >\r\n                        <svg\r\n                          width=\"16\"\r\n                          height=\"16\"\r\n                          viewBox=\"0 0 24 24\"\r\n                          fill=\"none\"\r\n                          stroke=\"currentColor\"\r\n                          strokeWidth=\"2\"\r\n                        >\r\n                          <rect x=\"3\" y=\"3\" width=\"7\" height=\"18\" rx=\"1\" />\r\n                        </svg>\r\n                        <span>{column.title}</span>\r\n                        <div className=\"command-palette-item-count\">\r\n                          {column.cardIds.length} cards\r\n                        </div>\r\n                      </Command.Item>\r\n                    ))}\r\n                  </Command.Group>\r\n                </>\r\n              )}\r\n\r\n              {/* NAVIGATE PAGE */}\r\n              {page === 'navigate' && (\r\n                <>\r\n                  <Command.Item\r\n                    value=\"back\"\r\n                    onSelect={handleSelectCommand}\r\n                    className=\"command-palette-item\"\r\n                  >\r\n                    <svg\r\n                      width=\"16\"\r\n                      height=\"16\"\r\n                      viewBox=\"0 0 24 24\"\r\n                      fill=\"none\"\r\n                      stroke=\"currentColor\"\r\n                      strokeWidth=\"2\"\r\n                    >\r\n                      <path d=\"M19 12H5M12 19l-7-7 7-7\" />\r\n                    </svg>\r\n                    <span>Back</span>\r\n                  </Command.Item>\r\n\r\n                  <Command.Group heading=\"All Cards\" className=\"command-palette-group\">\r\n                    {board.cards.map((card) => {\r\n                      const column = board.columns.find((c) => c.id === card.columnId)\r\n                      return (\r\n                        <Command.Item\r\n                          key={card.id}\r\n                          value={`navigate:${card.id}`}\r\n                          onSelect={handleSelectCommand}\r\n                          className=\"command-palette-item\"\r\n                          keywords={[card.title, card.description || '', ...(card.labels || [])]}\r\n                        >\r\n                          <div\r\n                            className=\"command-palette-item-dot\"\r\n                            style={{\r\n                              background:\r\n                                card.priority === 'URGENT'\r\n                                  ? '#EF4444'\r\n                                  : card.priority === 'HIGH'\r\n                                  ? '#F59E0B'\r\n                                  : card.priority === 'MEDIUM'\r\n                                  ? '#00E5CC'\r\n                                  : '#6B7280',\r\n                            }}\r\n                          />\r\n                          <div className=\"command-palette-item-content\">\r\n                            <div>{card.title}</div>\r\n                            <div className=\"command-palette-item-meta\">\r\n                              {column?.title}\r\n                            </div>\r\n                          </div>\r\n                          {card.labels && card.labels.length > 0 && (\r\n                            <div className=\"command-palette-item-labels\">\r\n                              {card.labels.slice(0, 2).map((label) => (\r\n                                <span key={label} className=\"command-palette-item-label\">\r\n                                  {label}\r\n                                </span>\r\n                              ))}\r\n                            </div>\r\n                          )}\r\n                        </Command.Item>\r\n                      )\r\n                    })}\r\n                  </Command.Group>\r\n                </>\r\n              )}\r\n\r\n              {/* AI PAGE */}\r\n              {page === 'ai' && (\r\n                <>\r\n                  <Command.Item\r\n                    value=\"back\"\r\n                    onSelect={handleSelectCommand}\r\n                    className=\"command-palette-item\"\r\n                  >\r\n                    <svg\r\n                      width=\"16\"\r\n                      height=\"16\"\r\n                      viewBox=\"0 0 24 24\"\r\n                      fill=\"none\"\r\n                      stroke=\"currentColor\"\r\n                      strokeWidth=\"2\"\r\n                    >\r\n                      <path d=\"M19 12H5M12 19l-7-7 7-7\" />\r\n                    </svg>\r\n                    <span>Back</span>\r\n                  </Command.Item>\r\n\r\n                  <Command.Group heading=\"AI Features\" className=\"command-palette-group\">\r\n                    <Command.Item\r\n                      value=\"ai-generate-plan\"\r\n                      onSelect={handleSelectCommand}\r\n                      className=\"command-palette-item command-palette-item-ai\"\r\n                    >\r\n                      <svg\r\n                        width=\"16\"\r\n                        height=\"16\"\r\n                        viewBox=\"0 0 24 24\"\r\n                        fill=\"none\"\r\n                        stroke=\"currentColor\"\r\n                        strokeWidth=\"2\"\r\n                      >\r\n                        <path d=\"M12 2L2 7L12 12L22 7L12 2Z\" />\r\n                        <path d=\"M2 17L12 22L22 17\" />\r\n                        <path d=\"M2 12L12 17L22 12\" />\r\n                      </svg>\r\n                      <span>Generate Project Plan</span>\r\n                      <div className=\"command-palette-item-badge\">AI</div>\r\n                    </Command.Item>\r\n\r\n                    <Command.Item\r\n                      value=\"ai-predict-risks\"\r\n                      onSelect={handleSelectCommand}\r\n                      className=\"command-palette-item command-palette-item-ai\"\r\n                    >\r\n                      <svg\r\n                        width=\"16\"\r\n                        height=\"16\"\r\n                        viewBox=\"0 0 24 24\"\r\n                        fill=\"none\"\r\n                        stroke=\"currentColor\"\r\n                        strokeWidth=\"2\"\r\n                      >\r\n                        <path d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\" />\r\n                        <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\r\n                        <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\r\n                      </svg>\r\n                      <span>Predict Risks</span>\r\n                      <div className=\"command-palette-item-badge\">AI</div>\r\n                    </Command.Item>\r\n\r\n                    <Command.Item\r\n                      value=\"ai-usage\"\r\n                      onSelect={handleSelectCommand}\r\n                      className=\"command-palette-item command-palette-item-ai\"\r\n                    >\r\n                      <svg\r\n                        width=\"16\"\r\n                        height=\"16\"\r\n                        viewBox=\"0 0 24 24\"\r\n                        fill=\"none\"\r\n                        stroke=\"currentColor\"\r\n                        strokeWidth=\"2\"\r\n                      >\r\n                        <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"23\" />\r\n                        <path d=\"M17 5H9.5a3.5 3.5 0 000 7h5a3.5 3.5 0 010 7H6\" />\r\n                      </svg>\r\n                      <span>AI Usage & Costs</span>\r\n                      <div className=\"command-palette-item-badge\">AI</div>\r\n                    </Command.Item>\r\n                  </Command.Group>\r\n                </>\r\n              )}\r\n            </Command.List>\r\n\r\n            <div className=\"command-palette-footer\">\r\n              <div className=\"command-palette-footer-hint\">\r\n                <kbd>↑</kbd>\r\n                <kbd>↓</kbd>\r\n                <span>Navigate</span>\r\n              </div>\r\n              <div className=\"command-palette-footer-hint\">\r\n                <kbd>Enter</kbd>\r\n                <span>Select</span>\r\n              </div>\r\n              <div className=\"command-palette-footer-hint\">\r\n                <kbd>Esc</kbd>\r\n                <span>Close</span>\r\n              </div>\r\n            </div>\r\n          </Command>\r\n        </div>\r\n      </div>\r\n    </Portal>\r\n  )\r\n}\r\n","/**\n * AttachmentUploader Component\n * Drag & drop file uploader with preview\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport type { Attachment } from '../../types'\nimport './attachments.css'\n\n// v0.17.171: Native DOM lightbox to escape all stacking contexts (framer-motion transform issue)\nfunction openNativeLightbox(\n  imageUrl: string,\n  imageName: string,\n  allImages: Attachment[],\n  currentIndex: number,\n  onNavigate: (newIndex: number) => void\n) {\n  // Remove any existing lightbox\n  const existing = document.getElementById('attachment-lightbox-native')\n  if (existing) existing.remove()\n\n  // Create lightbox container\n  const lightbox = document.createElement('div')\n  lightbox.id = 'attachment-lightbox-native'\n  lightbox.className = 'attachment-lightbox'\n  lightbox.style.cssText = `\n    position: fixed !important;\n    inset: 0 !important;\n    z-index: 2147483647 !important;\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    background: rgba(0, 0, 0, 0.95) !important;\n    cursor: pointer !important;\n  `\n\n  // Create image\n  const img = document.createElement('img')\n  img.src = imageUrl\n  img.alt = imageName\n  img.className = 'attachment-lightbox-image'\n  img.style.cssText = `\n    max-width: 92vw !important;\n    max-height: 92vh !important;\n    object-fit: contain !important;\n    cursor: default !important;\n  `\n  img.onclick = (e) => e.stopPropagation()\n\n  // Create hint\n  const hint = document.createElement('div')\n  hint.className = 'attachment-lightbox-hint'\n  hint.textContent = 'Click anywhere or press ESC to close'\n  hint.style.cssText = `\n    position: absolute !important;\n    bottom: 24px !important;\n    left: 50% !important;\n    transform: translateX(-50%) !important;\n    font-size: 12px !important;\n    color: rgba(255, 255, 255, 0.4) !important;\n    pointer-events: none !important;\n  `\n\n  // Close function\n  const closeLightbox = () => {\n    lightbox.remove()\n    document.removeEventListener('keydown', handleKeyDown)\n  }\n\n  // Keyboard handler\n  const handleKeyDown = (e: KeyboardEvent) => {\n    if (e.key === 'Escape') {\n      closeLightbox()\n    } else if (e.key === 'ArrowLeft' && allImages.length > 1) {\n      const newIdx = currentIndex > 0 ? currentIndex - 1 : allImages.length - 1\n      closeLightbox()\n      onNavigate(newIdx)\n    } else if (e.key === 'ArrowRight' && allImages.length > 1) {\n      const newIdx = currentIndex < allImages.length - 1 ? currentIndex + 1 : 0\n      closeLightbox()\n      onNavigate(newIdx)\n    }\n  }\n\n  lightbox.onclick = closeLightbox\n  document.addEventListener('keydown', handleKeyDown)\n\n  // Add navigation if multiple images\n  if (allImages.length > 1) {\n    // Dots container\n    const dots = document.createElement('div')\n    dots.className = 'attachment-lightbox-dots'\n    dots.style.cssText = `\n      position: absolute !important;\n      bottom: 48px !important;\n      left: 50% !important;\n      transform: translateX(-50%) !important;\n      display: flex !important;\n      gap: 8px !important;\n      padding: 8px 12px !important;\n      background: rgba(0, 0, 0, 0.4) !important;\n      border-radius: 20px !important;\n    `\n    dots.onclick = (e) => e.stopPropagation()\n\n    allImages.forEach((_, idx) => {\n      const dot = document.createElement('button')\n      dot.className = `attachment-lightbox-dot ${idx === currentIndex ? 'active' : ''}`\n      dot.style.cssText = `\n        width: 8px !important;\n        height: 8px !important;\n        border-radius: 50% !important;\n        background: ${idx === currentIndex ? 'white' : 'rgba(255, 255, 255, 0.3)'} !important;\n        border: none !important;\n        padding: 0 !important;\n        cursor: pointer !important;\n      `\n      dot.onclick = (e) => {\n        e.stopPropagation()\n        closeLightbox()\n        onNavigate(idx)\n      }\n      dots.appendChild(dot)\n    })\n\n    // Navigation arrows\n    const prevBtn = document.createElement('button')\n    prevBtn.className = 'attachment-lightbox-nav-area attachment-lightbox-nav-prev'\n    prevBtn.innerHTML = '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M15 18L9 12L15 6\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>'\n    prevBtn.style.cssText = `\n      position: absolute !important;\n      left: 0 !important;\n      top: 0 !important;\n      bottom: 0 !important;\n      width: 120px !important;\n      display: flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      background: transparent !important;\n      border: none !important;\n      cursor: pointer !important;\n      opacity: 0.5 !important;\n    `\n    prevBtn.onmouseenter = () => { prevBtn.style.opacity = '1' }\n    prevBtn.onmouseleave = () => { prevBtn.style.opacity = '0.5' }\n    prevBtn.onclick = (e) => {\n      e.stopPropagation()\n      const newIdx = currentIndex > 0 ? currentIndex - 1 : allImages.length - 1\n      closeLightbox()\n      onNavigate(newIdx)\n    }\n\n    const nextBtn = document.createElement('button')\n    nextBtn.className = 'attachment-lightbox-nav-area attachment-lightbox-nav-next'\n    nextBtn.innerHTML = '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M9 18L15 12L9 6\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>'\n    nextBtn.style.cssText = `\n      position: absolute !important;\n      right: 0 !important;\n      top: 0 !important;\n      bottom: 0 !important;\n      width: 120px !important;\n      display: flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      background: transparent !important;\n      border: none !important;\n      cursor: pointer !important;\n      opacity: 0.5 !important;\n    `\n    nextBtn.onmouseenter = () => { nextBtn.style.opacity = '1' }\n    nextBtn.onmouseleave = () => { nextBtn.style.opacity = '0.5' }\n    nextBtn.onclick = (e) => {\n      e.stopPropagation()\n      const newIdx = currentIndex < allImages.length - 1 ? currentIndex + 1 : 0\n      closeLightbox()\n      onNavigate(newIdx)\n    }\n\n    lightbox.appendChild(dots)\n    lightbox.appendChild(prevBtn)\n    lightbox.appendChild(nextBtn)\n  }\n\n  lightbox.appendChild(img)\n  lightbox.appendChild(hint)\n  document.body.appendChild(lightbox)\n\n  // Fade out hint after 2 seconds\n  setTimeout(() => {\n    hint.style.transition = 'opacity 0.5s ease'\n    hint.style.opacity = '0'\n  }, 2000)\n}\n\nexport interface AttachmentUploaderProps {\n  /** Card ID for attachments */\n  cardId: string\n  /** Existing attachments */\n  attachments?: Attachment[]\n  /** Callback when files are uploaded */\n  onUpload?: (files: File[]) => Promise<void> | void\n  /** Callback when attachment is deleted */\n  onDelete?: (attachmentId: string) => void\n  /** Current user ID */\n  currentUserId?: string\n  /** Max file size in MB */\n  maxSizeMB?: number\n  /** Allowed file types (MIME types) */\n  allowedTypes?: string[]\n  /** Max number of files */\n  maxFiles?: number\n}\n\n/**\n * Format file size to human readable string\n */\nfunction formatFileSize(bytes: number): string {\n  if (bytes === 0) return '0 Bytes'\n  const k = 1024\n  const sizes = ['Bytes', 'KB', 'MB', 'GB']\n  const i = Math.floor(Math.log(bytes) / Math.log(k))\n  return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i]\n}\n\n/**\n * Get file icon based on MIME type\n */\nfunction getFileIcon(type: string): string {\n  if (type.startsWith('image/')) return '🖼️'\n  if (type.startsWith('video/')) return '🎥'\n  if (type.startsWith('audio/')) return '🎵'\n  if (type.includes('pdf')) return '📄'\n  if (type.includes('word') || type.includes('document')) return '📝'\n  if (type.includes('sheet') || type.includes('excel')) return '📊'\n  if (type.includes('presentation') || type.includes('powerpoint')) return '📽️'\n  if (type.includes('zip') || type.includes('rar') || type.includes('compressed')) return '🗜️'\n  if (type.includes('text')) return '📃'\n  return '📎'\n}\n\n/**\n * Check if file is an image\n */\nfunction isImage(type: string): boolean {\n  return type.startsWith('image/')\n}\n\nexport function AttachmentUploader({\n  attachments = [],\n  onUpload,\n  onDelete,\n  maxSizeMB = 10,\n  allowedTypes,\n  maxFiles = 10,\n}: AttachmentUploaderProps) {\n  const [isDragging, setIsDragging] = useState(false)\n  const [isUploading, setIsUploading] = useState(false)\n  const [error, setError] = useState<string | null>(null)\n  const fileInputRef = useRef<HTMLInputElement>(null)\n  // Store attachments ref for native lightbox navigation\n  const attachmentsRef = useRef(attachments)\n  attachmentsRef.current = attachments\n\n  // v0.17.171: Handle image click - use native DOM lightbox to escape all stacking contexts\n  const handleImageClick = useCallback((attachment: Attachment, e: React.MouseEvent) => {\n    e.preventDefault()\n    e.stopPropagation()\n\n    const imageAttachments = attachmentsRef.current.filter(a => isImage(a.type))\n    const currentIndex = imageAttachments.findIndex(a => a.id === attachment.id)\n\n    const handleNavigate = (newIndex: number) => {\n      const imgs = attachmentsRef.current.filter(a => isImage(a.type))\n      const newImg = imgs[newIndex]\n      if (newImg) {\n        openNativeLightbox(newImg.url, newImg.name, imgs, newIndex, handleNavigate)\n      }\n    }\n\n    openNativeLightbox(attachment.url, attachment.name, imageAttachments, currentIndex, handleNavigate)\n  }, [])\n\n  // Handle file validation\n  const validateFiles = useCallback(\n    (files: File[]): { valid: File[]; errors: string[] } => {\n      const valid: File[] = []\n      const errors: string[] = []\n\n      // Check max files\n      if (attachments.length + files.length > maxFiles) {\n        errors.push(`Maximum ${maxFiles} files allowed`)\n        return { valid, errors }\n      }\n\n      files.forEach((file) => {\n        // Check file size\n        const sizeMB = file.size / (1024 * 1024)\n        if (sizeMB > maxSizeMB) {\n          errors.push(`${file.name} is too large (max ${maxSizeMB}MB)`)\n          return\n        }\n\n        // Check file type\n        if (allowedTypes && !allowedTypes.some((type) => file.type.match(type))) {\n          errors.push(`${file.name} has invalid file type`)\n          return\n        }\n\n        valid.push(file)\n      })\n\n      return { valid, errors }\n    },\n    [attachments.length, maxFiles, maxSizeMB, allowedTypes]\n  )\n\n  // Handle file upload\n  const handleUpload = useCallback(\n    async (files: File[]) => {\n      const { valid, errors } = validateFiles(files)\n\n      if (errors.length > 0) {\n        setError(errors.join(', '))\n        setTimeout(() => setError(null), 5000)\n        return\n      }\n\n      if (valid.length === 0) return\n\n      setIsUploading(true)\n      setError(null)\n\n      try {\n        await onUpload?.(valid)\n      } catch (err) {\n        setError(err instanceof Error ? err.message : 'Upload failed')\n        setTimeout(() => setError(null), 5000)\n      } finally {\n        setIsUploading(false)\n      }\n    },\n    [validateFiles, onUpload]\n  )\n\n  // Handle drag events\n  const handleDragEnter = useCallback((e: React.DragEvent) => {\n    e.preventDefault()\n    e.stopPropagation()\n    setIsDragging(true)\n  }, [])\n\n  const handleDragLeave = useCallback((e: React.DragEvent) => {\n    e.preventDefault()\n    e.stopPropagation()\n    setIsDragging(false)\n  }, [])\n\n  const handleDragOver = useCallback((e: React.DragEvent) => {\n    e.preventDefault()\n    e.stopPropagation()\n  }, [])\n\n  const handleDrop = useCallback(\n    (e: React.DragEvent) => {\n      e.preventDefault()\n      e.stopPropagation()\n      setIsDragging(false)\n\n      const files = Array.from(e.dataTransfer.files)\n      handleUpload(files)\n    },\n    [handleUpload]\n  )\n\n  // Handle file input change\n  const handleFileInputChange = useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>) => {\n      const files = e.target.files ? Array.from(e.target.files) : []\n      handleUpload(files)\n      // Reset input\n      if (fileInputRef.current) {\n        fileInputRef.current.value = ''\n      }\n    },\n    [handleUpload]\n  )\n\n  // Handle click to open file dialog\n  const handleClick = useCallback(() => {\n    fileInputRef.current?.click()\n  }, [])\n\n  // Handle delete\n  const handleDelete = useCallback(\n    (attachmentId: string) => {\n      if (confirm('Are you sure you want to delete this attachment?')) {\n        onDelete?.(attachmentId)\n      }\n    },\n    [onDelete]\n  )\n\n  return (\n    <div className=\"attachment-uploader\">\n      {/* Drop zone */}\n      <div\n        className={`attachment-dropzone ${isDragging ? 'dragging' : ''} ${isUploading ? 'uploading' : ''}`}\n        onDragEnter={handleDragEnter}\n        onDragLeave={handleDragLeave}\n        onDragOver={handleDragOver}\n        onDrop={handleDrop}\n        onClick={handleClick}\n      >\n        <input\n          ref={fileInputRef}\n          type=\"file\"\n          multiple\n          onChange={handleFileInputChange}\n          style={{ display: 'none' }}\n          accept={allowedTypes?.join(',')}\n        />\n\n        <div className=\"attachment-dropzone-content\">\n          {isUploading ? (\n            <>\n              <div className=\"attachment-spinner\" />\n              <p className=\"attachment-dropzone-text\">Uploading...</p>\n            </>\n          ) : (\n            <>\n              <svg\n                width=\"48\"\n                height=\"48\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                className=\"attachment-dropzone-icon\"\n              >\n                <path\n                  d=\"M21 15V19C21 19.5304 20.7893 20.0391 20.4142 20.4142C20.0391 20.7893 19.5304 21 19 21H5C4.46957 21 3.96086 20.7893 3.58579 20.4142C3.21071 20.0391 3 19.5304 3 19V15\"\n                  stroke=\"currentColor\"\n                  strokeWidth=\"2\"\n                  strokeLinecap=\"round\"\n                  strokeLinejoin=\"round\"\n                />\n                <path\n                  d=\"M17 8L12 3L7 8\"\n                  stroke=\"currentColor\"\n                  strokeWidth=\"2\"\n                  strokeLinecap=\"round\"\n                  strokeLinejoin=\"round\"\n                />\n                <path\n                  d=\"M12 3V15\"\n                  stroke=\"currentColor\"\n                  strokeWidth=\"2\"\n                  strokeLinecap=\"round\"\n                  strokeLinejoin=\"round\"\n                />\n              </svg>\n              <p className=\"attachment-dropzone-text\">\n                {isDragging ? 'Drop files here' : 'Drag & drop files here'}\n              </p>\n              <p className=\"attachment-dropzone-subtext\">or click to browse</p>\n              <p className=\"attachment-dropzone-info\">\n                Max {maxSizeMB}MB • {attachments.length}/{maxFiles} files\n              </p>\n            </>\n          )}\n        </div>\n      </div>\n\n      {/* Error message */}\n      {error && (\n        <div className=\"attachment-error\">\n          <span className=\"attachment-error-icon\">⚠️</span>\n          <span className=\"attachment-error-text\">{error}</span>\n        </div>\n      )}\n\n      {/* Attachment list */}\n      {attachments.length > 0 && (\n        <div className=\"attachment-list\">\n          {attachments.map((attachment) => (\n            <div key={attachment.id} className=\"attachment-item\">\n              <div className=\"attachment-preview\">\n                {isImage(attachment.type) && attachment.url ? (\n                  <button\n                    type=\"button\"\n                    className=\"attachment-thumbnail-btn\"\n                    onClick={(e) => handleImageClick(attachment, e)}\n                    title=\"Click to view full size\"\n                  >\n                    <img\n                      src={attachment.thumbnailUrl || attachment.url}\n                      alt={attachment.name}\n                      className=\"attachment-thumbnail\"\n                    />\n                    <div className=\"attachment-thumbnail-overlay\">\n                      <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path d=\"M15 3H21V9\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n                        <path d=\"M9 21H3V15\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n                        <path d=\"M21 3L14 10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n                        <path d=\"M3 21L10 14\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n                      </svg>\n                    </div>\n                  </button>\n                ) : (\n                  <div className=\"attachment-icon\">{getFileIcon(attachment.type)}</div>\n                )}\n              </div>\n\n              <div className=\"attachment-info\">\n                <a\n                  href={attachment.url}\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                  className=\"attachment-name\"\n                  title={attachment.name}\n                >\n                  {attachment.name}\n                </a>\n                <div className=\"attachment-meta\">\n                  <span className=\"attachment-size\">{formatFileSize(attachment.size)}</span>\n                  <span className=\"attachment-separator\">•</span>\n                  <span className=\"attachment-date\">\n                    {new Date(attachment.uploadedAt).toLocaleDateString()}\n                  </span>\n                </div>\n              </div>\n\n              <button\n                onClick={() => handleDelete(attachment.id)}\n                className=\"attachment-delete\"\n                title=\"Delete attachment\"\n                type=\"button\"\n              >\n                <svg\n                  width=\"16\"\n                  height=\"16\"\n                  viewBox=\"0 0 24 24\"\n                  fill=\"none\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                >\n                  <path\n                    d=\"M18 6L6 18M6 6L18 18\"\n                    stroke=\"currentColor\"\n                    strokeWidth=\"2\"\n                    strokeLinecap=\"round\"\n                    strokeLinejoin=\"round\"\n                  />\n                </svg>\n              </button>\n            </div>\n          ))}\n        </div>\n      )}\n\n      {/* v0.17.171: Lightbox is now handled via native DOM (openNativeLightbox) to escape all stacking contexts */}\n    </div>\n  )\n}\n","/**\r\n * VelocityChart Component\r\n * Shows team velocity over time (cards completed per week/sprint)\r\n */\r\n\r\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'\r\nimport './charts.css'\r\n\r\nexport interface VelocityDataPoint {\r\n  /** Period name (e.g., \"Week 1\", \"Sprint 3\") */\r\n  period: string\r\n  /** Number of cards completed */\r\n  completed: number\r\n  /** Number of cards planned */\r\n  planned?: number\r\n  /** Average velocity (optional) */\r\n  average?: number\r\n}\r\n\r\nexport interface VelocityChartProps {\r\n  /** Velocity data points */\r\n  data: VelocityDataPoint[]\r\n  /** Chart title */\r\n  title?: string\r\n  /** Chart height in pixels */\r\n  height?: number\r\n  /** Show average line */\r\n  showAverage?: boolean\r\n  /** Show planned line */\r\n  showPlanned?: boolean\r\n}\r\n\r\n/**\r\n * Custom tooltip for velocity chart\r\n */\r\nfunction CustomTooltip({ active, payload }: any) {\r\n  if (!active || !payload || !payload.length) return null\r\n\r\n  return (\r\n    <div className=\"chart-tooltip\">\r\n      <p className=\"chart-tooltip-label\">{payload[0].payload.period}</p>\r\n      {payload.map((entry: any, index: number) => (\r\n        <p key={index} className=\"chart-tooltip-value\" style={{ color: entry.color }}>\r\n          {entry.name}: <strong>{entry.value}</strong> cards\r\n        </p>\r\n      ))}\r\n    </div>\r\n  )\r\n}\r\n\r\nexport function VelocityChart({\r\n  data,\r\n  title = 'Team Velocity',\r\n  height = 300,\r\n  showAverage = true,\r\n  showPlanned = true,\r\n}: VelocityChartProps) {\r\n  // Calculate average if not provided\r\n  const dataWithAverage = data.map((point) => ({\r\n    ...point,\r\n    average:\r\n      point.average ??\r\n      data.reduce((sum, p) => sum + p.completed, 0) / data.length,\r\n  }))\r\n\r\n  return (\r\n    <div className=\"chart-container\">\r\n      {title && <h3 className=\"chart-title\">{title}</h3>}\r\n\r\n      <ResponsiveContainer width=\"100%\" height={height}>\r\n        <LineChart\r\n          data={dataWithAverage}\r\n          margin={{ top: 5, right: 30, left: 20, bottom: 5 }}\r\n        >\r\n          <CartesianGrid strokeDasharray=\"3 3\" stroke=\"rgba(255, 255, 255, 0.1)\" />\r\n          <XAxis\r\n            dataKey=\"period\"\r\n            stroke=\"rgba(255, 255, 255, 0.5)\"\r\n            style={{ fontSize: '12px' }}\r\n          />\r\n          <YAxis\r\n            stroke=\"rgba(255, 255, 255, 0.5)\"\r\n            style={{ fontSize: '12px' }}\r\n          />\r\n          <Tooltip content={<CustomTooltip />} />\r\n          <Legend\r\n            wrapperStyle={{ fontSize: '12px', color: 'rgba(255, 255, 255, 0.7)' }}\r\n          />\r\n\r\n          {/* Completed cards line */}\r\n          <Line\r\n            type=\"monotone\"\r\n            dataKey=\"completed\"\r\n            stroke=\"#10B981\"\r\n            strokeWidth={3}\r\n            name=\"Completed\"\r\n            dot={{ fill: '#10B981', r: 5 }}\r\n            activeDot={{ r: 7 }}\r\n          />\r\n\r\n          {/* Planned cards line */}\r\n          {showPlanned && (\r\n            <Line\r\n              type=\"monotone\"\r\n              dataKey=\"planned\"\r\n              stroke=\"#00E5CC\"\r\n              strokeWidth={2}\r\n              strokeDasharray=\"5 5\"\r\n              name=\"Planned\"\r\n              dot={{ fill: '#00E5CC', r: 4 }}\r\n            />\r\n          )}\r\n\r\n          {/* Average line */}\r\n          {showAverage && (\r\n            <Line\r\n              type=\"monotone\"\r\n              dataKey=\"average\"\r\n              stroke=\"#F59E0B\"\r\n              strokeWidth={2}\r\n              strokeDasharray=\"3 3\"\r\n              name=\"Average\"\r\n              dot={false}\r\n            />\r\n          )}\r\n        </LineChart>\r\n      </ResponsiveContainer>\r\n\r\n      {/* Stats */}\r\n      <div className=\"chart-stats\">\r\n        <div className=\"chart-stat\">\r\n          <span className=\"chart-stat-label\">Total Completed</span>\r\n          <span className=\"chart-stat-value\" style={{ color: '#10B981' }}>\r\n            {data.reduce((sum, point) => sum + point.completed, 0)}\r\n          </span>\r\n        </div>\r\n        <div className=\"chart-stat\">\r\n          <span className=\"chart-stat-label\">Average Velocity</span>\r\n          <span className=\"chart-stat-value\" style={{ color: '#F59E0B' }}>\r\n            {(data.reduce((sum, point) => sum + point.completed, 0) / data.length).toFixed(1)}\r\n          </span>\r\n        </div>\r\n        {showPlanned && data.some((p) => p.planned) && (\r\n          <div className=\"chart-stat\">\r\n            <span className=\"chart-stat-label\">Total Planned</span>\r\n            <span className=\"chart-stat-value\" style={{ color: '#00E5CC' }}>\r\n              {data.reduce((sum, point) => sum + (point.planned || 0), 0)}\r\n            </span>\r\n          </div>\r\n        )}\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n","/**\n * BurnDownChart Component\n * Shows remaining work over time compared to ideal burndown\n */\n\nimport { AreaChart, Area, LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'\nimport './charts.css'\n\nexport interface BurnDownDataPoint {\n  /** Day/Date label */\n  day: string\n  /** Remaining tasks */\n  remaining: number\n  /** Ideal burndown line */\n  ideal: number\n}\n\nexport interface BurnDownChartProps {\n  /** Burndown data points */\n  data: BurnDownDataPoint[]\n  /** Chart title */\n  title?: string\n  /** Chart height in pixels */\n  height?: number\n  /** Total tasks at start */\n  totalTasks?: number\n  /** Use area chart instead of line */\n  useArea?: boolean\n}\n\n/**\n * Custom tooltip for burndown chart\n */\nfunction CustomTooltip({ active, payload }: any) {\n  if (!active || !payload || !payload.length) return null\n\n  return (\n    <div className=\"chart-tooltip\">\n      <p className=\"chart-tooltip-label\">{payload[0].payload.day}</p>\n      {payload.map((entry: any, index: number) => (\n        <p key={index} className=\"chart-tooltip-value\" style={{ color: entry.color }}>\n          {entry.name}: <strong>{entry.value}</strong> tasks\n        </p>\n      ))}\n    </div>\n  )\n}\n\nexport function BurnDownChart({\n  data,\n  title = 'Sprint Burndown',\n  height = 300,\n  totalTasks,\n  useArea = false,\n}: BurnDownChartProps) {\n  // Calculate total tasks if not provided\n  const total = totalTasks ?? (data[0]?.ideal || data[0]?.remaining || 0)\n\n  // Calculate stats\n  const currentRemaining = data[data.length - 1]?.remaining || 0\n  const idealRemaining = data[data.length - 1]?.ideal || 0\n  const progress = total > 0 ? ((total - currentRemaining) / total) * 100 : 0\n  const isOnTrack = currentRemaining <= idealRemaining\n\n  const ChartComponent = useArea ? AreaChart : LineChart\n\n  return (\n    <div className=\"chart-container\">\n      {title && <h3 className=\"chart-title\">{title}</h3>}\n\n      <ResponsiveContainer width=\"100%\" height={height}>\n        <ChartComponent\n          data={data}\n          margin={{ top: 5, right: 30, left: 20, bottom: 5 }}\n        >\n          <CartesianGrid strokeDasharray=\"3 3\" stroke=\"rgba(255, 255, 255, 0.1)\" />\n          <XAxis\n            dataKey=\"day\"\n            stroke=\"rgba(255, 255, 255, 0.5)\"\n            style={{ fontSize: '12px' }}\n          />\n          <YAxis\n            stroke=\"rgba(255, 255, 255, 0.5)\"\n            style={{ fontSize: '12px' }}\n          />\n          <Tooltip content={<CustomTooltip />} />\n          <Legend\n            wrapperStyle={{ fontSize: '12px', color: 'rgba(255, 255, 255, 0.7)' }}\n          />\n\n          {useArea ? (\n            <>\n              {/* Ideal burndown area */}\n              <Area\n                type=\"monotone\"\n                dataKey=\"ideal\"\n                stroke=\"#F59E0B\"\n                fill=\"rgba(245, 158, 11, 0.2)\"\n                strokeWidth={2}\n                strokeDasharray=\"5 5\"\n                name=\"Ideal\"\n              />\n              {/* Actual burndown area */}\n              <Area\n                type=\"monotone\"\n                dataKey=\"remaining\"\n                stroke={isOnTrack ? '#10B981' : '#EF4444'}\n                fill={isOnTrack ? 'rgba(16, 185, 129, 0.2)' : 'rgba(239, 68, 68, 0.2)'}\n                strokeWidth={3}\n                name=\"Remaining\"\n              />\n            </>\n          ) : (\n            <>\n              {/* Ideal burndown line */}\n              <Line\n                type=\"linear\"\n                dataKey=\"ideal\"\n                stroke=\"#F59E0B\"\n                strokeWidth={2}\n                strokeDasharray=\"5 5\"\n                name=\"Ideal\"\n                dot={{ fill: '#F59E0B', r: 4 }}\n              />\n              {/* Actual burndown line */}\n              <Line\n                type=\"monotone\"\n                dataKey=\"remaining\"\n                stroke={isOnTrack ? '#10B981' : '#EF4444'}\n                strokeWidth={3}\n                name=\"Remaining\"\n                dot={{ fill: isOnTrack ? '#10B981' : '#EF4444', r: 5 }}\n                activeDot={{ r: 7 }}\n              />\n            </>\n          )}\n        </ChartComponent>\n      </ResponsiveContainer>\n\n      {/* Stats */}\n      <div className=\"chart-stats\">\n        <div className=\"chart-stat\">\n          <span className=\"chart-stat-label\">Progress</span>\n          <span\n            className=\"chart-stat-value\"\n            style={{ color: progress >= 50 ? '#10B981' : '#F59E0B' }}\n          >\n            {progress.toFixed(0)}%\n          </span>\n        </div>\n        <div className=\"chart-stat\">\n          <span className=\"chart-stat-label\">Remaining</span>\n          <span\n            className=\"chart-stat-value\"\n            style={{ color: isOnTrack ? '#10B981' : '#EF4444' }}\n          >\n            {currentRemaining}\n          </span>\n        </div>\n        <div className=\"chart-stat\">\n          <span className=\"chart-stat-label\">Status</span>\n          <span\n            className=\"chart-stat-badge\"\n            style={{\n              background: isOnTrack\n                ? 'rgba(16, 185, 129, 0.15)'\n                : 'rgba(239, 68, 68, 0.15)',\n              color: isOnTrack ? '#10B981' : '#EF4444',\n            }}\n          >\n            {isOnTrack ? '✓ On Track' : '⚠ Behind'}\n          </span>\n        </div>\n      </div>\n    </div>\n  )\n}\n","/**\r\n * DistributionCharts Component\r\n * Shows distribution of cards by priority, status, or assignees\r\n */\r\n\r\nimport { PieChart, Pie, Cell, BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'\r\nimport './charts.css'\r\n\r\nexport interface DistributionDataPoint {\r\n  /** Category name */\r\n  name: string\r\n  /** Value/count */\r\n  value: number\r\n  /** Optional color */\r\n  color?: string\r\n}\r\n\r\nexport interface DistributionChartsProps {\r\n  /** Distribution data */\r\n  data: DistributionDataPoint[]\r\n  /** Chart title */\r\n  title?: string\r\n  /** Chart type */\r\n  type?: 'pie' | 'bar'\r\n  /** Chart height in pixels */\r\n  height?: number\r\n  /** Show percentages */\r\n  showPercentages?: boolean\r\n}\r\n\r\n// Default colors for priority\r\nconst PRIORITY_COLORS: Record<string, string> = {\r\n  URGENT: '#EF4444',\r\n  HIGH: '#F59E0B',\r\n  MEDIUM: '#00E5CC',\r\n  LOW: '#10B981',\r\n}\r\n\r\n// Default colors for common categories\r\nconst DEFAULT_COLORS = ['#00E5CC', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899']\r\n\r\n/**\r\n * Custom label for pie chart\r\n */\r\nfunction renderPieLabel({\r\n  cx,\r\n  cy,\r\n  midAngle,\r\n  innerRadius,\r\n  outerRadius,\r\n  percent,\r\n}: any) {\r\n  const radius = innerRadius + (outerRadius - innerRadius) * 0.5\r\n  const x = cx + radius * Math.cos(-midAngle * (Math.PI / 180))\r\n  const y = cy + radius * Math.sin(-midAngle * (Math.PI / 180))\r\n\r\n  if (percent < 0.05) return null // Don't show label for small slices\r\n\r\n  return (\r\n    <text\r\n      x={x}\r\n      y={y}\r\n      fill=\"white\"\r\n      textAnchor={x > cx ? 'start' : 'end'}\r\n      dominantBaseline=\"central\"\r\n      style={{ fontSize: '12px', fontWeight: 600 }}\r\n    >\r\n      {`${(percent * 100).toFixed(0)}%`}\r\n    </text>\r\n  )\r\n}\r\n\r\n/**\r\n * Custom tooltip\r\n */\r\nfunction CustomTooltip({ active, payload }: any) {\r\n  if (!active || !payload || !payload.length) return null\r\n\r\n  const data = payload[0].payload\r\n  const total = payload[0].payload.totalValue || 0\r\n  const percentage = total > 0 ? ((data.value / total) * 100).toFixed(1) : '0'\r\n\r\n  return (\r\n    <div className=\"chart-tooltip\">\r\n      <p className=\"chart-tooltip-label\">{data.name}</p>\r\n      <p className=\"chart-tooltip-value\" style={{ color: data.color || payload[0].color }}>\r\n        Count: <strong>{data.value}</strong>\r\n      </p>\r\n      <p className=\"chart-tooltip-value\" style={{ color: 'rgba(255, 255, 255, 0.7)' }}>\r\n        Percentage: <strong>{percentage}%</strong>\r\n      </p>\r\n    </div>\r\n  )\r\n}\r\n\r\nexport function DistributionCharts({\r\n  data,\r\n  title = 'Distribution',\r\n  type = 'pie',\r\n  height = 300,\r\n  showPercentages = true,\r\n}: DistributionChartsProps) {\r\n  // Calculate total and add to each data point\r\n  const total = data.reduce((sum, point) => sum + point.value, 0)\r\n  const dataWithTotal = data.map((point) => ({\r\n    ...point,\r\n    totalValue: total,\r\n    color: point.color || PRIORITY_COLORS[point.name] || DEFAULT_COLORS[data.indexOf(point) % DEFAULT_COLORS.length],\r\n  }))\r\n\r\n  // Get colors array\r\n  const colors = dataWithTotal.map((point) => point.color)\r\n\r\n  return (\r\n    <div className=\"chart-container\">\r\n      {title && <h3 className=\"chart-title\">{title}</h3>}\r\n\r\n      <ResponsiveContainer width=\"100%\" height={height}>\r\n        {type === 'pie' ? (\r\n          <PieChart>\r\n            <Pie\r\n              data={dataWithTotal}\r\n              cx=\"50%\"\r\n              cy=\"50%\"\r\n              labelLine={false}\r\n              label={showPercentages ? renderPieLabel : false}\r\n              outerRadius={height * 0.35}\r\n              fill=\"#8884d8\"\r\n              dataKey=\"value\"\r\n            >\r\n              {dataWithTotal.map((_, index) => (\r\n                <Cell key={`cell-${index}`} fill={colors[index]} />\r\n              ))}\r\n            </Pie>\r\n            <Tooltip content={<CustomTooltip />} />\r\n            <Legend\r\n              wrapperStyle={{ fontSize: '12px', color: 'rgba(255, 255, 255, 0.7)' }}\r\n              formatter={(value, legendEntry: any) => {\r\n                const point = legendEntry.payload\r\n                const percentage = total > 0 ? ((point.value / total) * 100).toFixed(0) : '0'\r\n                return `${value} (${point.value} - ${percentage}%)`\r\n              }}\r\n            />\r\n          </PieChart>\r\n        ) : (\r\n          <BarChart\r\n            data={dataWithTotal}\r\n            margin={{ top: 5, right: 30, left: 20, bottom: 5 }}\r\n          >\r\n            <CartesianGrid strokeDasharray=\"3 3\" stroke=\"rgba(255, 255, 255, 0.1)\" />\r\n            <XAxis\r\n              dataKey=\"name\"\r\n              stroke=\"rgba(255, 255, 255, 0.5)\"\r\n              style={{ fontSize: '12px' }}\r\n            />\r\n            <YAxis\r\n              stroke=\"rgba(255, 255, 255, 0.5)\"\r\n              style={{ fontSize: '12px' }}\r\n            />\r\n            <Tooltip content={<CustomTooltip />} />\r\n            <Legend\r\n              wrapperStyle={{ fontSize: '12px', color: 'rgba(255, 255, 255, 0.7)' }}\r\n            />\r\n            <Bar dataKey=\"value\" name=\"Count\" radius={[8, 8, 0, 0]}>\r\n              {dataWithTotal.map((_, index) => (\r\n                <Cell key={`cell-${index}`} fill={colors[index]} />\r\n              ))}\r\n            </Bar>\r\n          </BarChart>\r\n        )}\r\n      </ResponsiveContainer>\r\n\r\n      {/* Stats */}\r\n      <div className=\"chart-stats\">\r\n        <div className=\"chart-stat\">\r\n          <span className=\"chart-stat-label\">Total Cards</span>\r\n          <span className=\"chart-stat-value\" style={{ color: '#00E5CC' }}>\r\n            {total}\r\n          </span>\r\n        </div>\r\n        <div className=\"chart-stat\">\r\n          <span className=\"chart-stat-label\">Categories</span>\r\n          <span className=\"chart-stat-value\" style={{ color: '#10B981' }}>\r\n            {data.length}\r\n          </span>\r\n        </div>\r\n        {data.length > 0 && (\r\n          <div className=\"chart-stat\">\r\n            <span className=\"chart-stat-label\">Largest Category</span>\r\n            <span className=\"chart-stat-value\" style={{ color: '#F59E0B' }}>\r\n              {data.reduce((max, point) => (point.value > max.value ? point : max)).name}\r\n            </span>\r\n          </div>\r\n        )}\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n","/**\n * Bulk Operations Toolbar\n * Floating toolbar for performing bulk actions on selected cards\n * @module components/BulkOperations\n */\n\nimport { memo, useState } from 'react'\nimport type { Card, Priority, BulkOperationsCallbacks } from '../../types'\nimport type { User } from '../Card/UserAssignmentSelector'\nimport { cn } from '../../utils'\n\nexport interface BulkOperationsToolbarProps {\n  /** Selected cards */\n  selectedCards: Card[]\n  /** Available users for assignment */\n  availableUsers?: User[]\n  /** Callback when selection is cleared */\n  onClearSelection: () => void\n  /** Bulk operations callbacks */\n  callbacks: BulkOperationsCallbacks\n  /** Available columns for move operation */\n  columns?: Array<{ id: string; title: string }>\n  /** Available labels */\n  availableLabels?: string[]\n}\n\n/**\n * Bulk Operations Toolbar Component\n */\nexport const BulkOperationsToolbar = memo<BulkOperationsToolbarProps>(\n  ({\n    selectedCards,\n    availableUsers = [],\n    onClearSelection,\n    callbacks,\n    columns = [],\n    availableLabels = [],\n  }) => {\n    const [showPriorityMenu, setShowPriorityMenu] = useState(false)\n    const [showMoveMenu, setShowMoveMenu] = useState(false)\n    const [showUserMenu, setShowUserMenu] = useState(false)\n    const [showLabelMenu, setShowLabelMenu] = useState(false)\n\n    if (selectedCards.length === 0) return null\n\n    const cardIds = selectedCards.map((card) => card.id)\n\n    const handleUpdatePriority = (priority: Priority) => {\n      callbacks.onBulkUpdate?.(cardIds, { priority })\n      setShowPriorityMenu(false)\n    }\n\n    const handleMove = (columnId: string) => {\n      callbacks.onBulkMove?.(cardIds, columnId)\n      setShowMoveMenu(false)\n      onClearSelection()\n    }\n\n    const handleAssignUsers = (userIds: string[]) => {\n      callbacks.onBulkUpdate?.(cardIds, { assignedUserIds: userIds })\n      setShowUserMenu(false)\n    }\n\n    const handleAddLabels = (labels: string[]) => {\n      // Get existing labels from all selected cards\n      const existingLabels = new Set<string>()\n      selectedCards.forEach((card) => {\n        card.labels?.forEach((label) => existingLabels.add(label))\n      })\n\n      // Merge with new labels\n      const allLabels = Array.from(new Set([...existingLabels, ...labels]))\n\n      callbacks.onBulkUpdate?.(cardIds, { labels: allLabels })\n      setShowLabelMenu(false)\n    }\n\n    const handleDelete = () => {\n      if (confirm(`Delete ${selectedCards.length} card(s)? This cannot be undone.`)) {\n        callbacks.onBulkDelete?.(cardIds)\n        onClearSelection()\n      }\n    }\n\n    return (\n      <div className=\"asakaa-bulk-toolbar\">\n        <div className=\"asakaa-bulk-toolbar-content\">\n          {/* Selection count */}\n          <div className=\"asakaa-bulk-toolbar-count\">\n            {selectedCards.length} card{selectedCards.length !== 1 ? 's' : ''} selected\n          </div>\n\n          {/* Actions */}\n          <div className=\"asakaa-bulk-toolbar-actions\">\n            {/* Priority */}\n            <div className=\"relative\">\n              <button\n                className=\"asakaa-bulk-toolbar-button\"\n                onClick={() => setShowPriorityMenu(!showPriorityMenu)}\n                title=\"Update priority\"\n              >\n                <span className=\"text-sm\">Priority</span>\n              </button>\n              {showPriorityMenu && (\n                <div className=\"asakaa-bulk-menu\">\n                  {(['LOW', 'MEDIUM', 'HIGH', 'URGENT'] as Priority[]).map((priority) => (\n                    <button\n                      key={priority}\n                      className=\"asakaa-bulk-menu-item\"\n                      onClick={() => handleUpdatePriority(priority)}\n                    >\n                      <span\n                        className={cn(\n                          'asakaa-priority-dot',\n                          priority === 'LOW' && 'bg-asakaa-priority-low',\n                          priority === 'MEDIUM' && 'bg-asakaa-priority-medium',\n                          priority === 'HIGH' && 'bg-asakaa-priority-high',\n                          priority === 'URGENT' && 'bg-asakaa-priority-urgent'\n                        )}\n                      />\n                      {priority}\n                    </button>\n                  ))}\n                </div>\n              )}\n            </div>\n\n            {/* Move to column */}\n            {columns.length > 0 && (\n              <div className=\"relative\">\n                <button\n                  className=\"asakaa-bulk-toolbar-button\"\n                  onClick={() => setShowMoveMenu(!showMoveMenu)}\n                  title=\"Move to column\"\n                >\n                  <span className=\"text-sm\">Move</span>\n                </button>\n                {showMoveMenu && (\n                  <div className=\"asakaa-bulk-menu\">\n                    {columns.map((column) => (\n                      <button\n                        key={column.id}\n                        className=\"asakaa-bulk-menu-item\"\n                        onClick={() => handleMove(column.id)}\n                      >\n                        {column.title}\n                      </button>\n                    ))}\n                  </div>\n                )}\n              </div>\n            )}\n\n            {/* Assign users */}\n            {availableUsers.length > 0 && (\n              <div className=\"relative\">\n                <button\n                  className=\"asakaa-bulk-toolbar-button\"\n                  onClick={() => setShowUserMenu(!showUserMenu)}\n                  title=\"Assign users\"\n                >\n                  <span className=\"text-sm\">Assign</span>\n                </button>\n                {showUserMenu && (\n                  <div className=\"asakaa-bulk-menu\">\n                    {availableUsers.map((user) => (\n                      <button\n                        key={user.id}\n                        className=\"asakaa-bulk-menu-item\"\n                        onClick={() => handleAssignUsers([user.id])}\n                      >\n                        <div\n                          className=\"w-5 h-5 rounded-full flex items-center justify-center text-xs font-medium\"\n                          style={{ backgroundColor: user.color }}\n                        >\n                          {user.initials}\n                        </div>\n                        {user.name}\n                      </button>\n                    ))}\n                  </div>\n                )}\n              </div>\n            )}\n\n            {/* Add labels */}\n            {availableLabels.length > 0 && (\n              <div className=\"relative\">\n                <button\n                  className=\"asakaa-bulk-toolbar-button\"\n                  onClick={() => setShowLabelMenu(!showLabelMenu)}\n                  title=\"Add labels\"\n                >\n                  <span className=\"text-sm\">Labels</span>\n                </button>\n                {showLabelMenu && (\n                  <div className=\"asakaa-bulk-menu\">\n                    {availableLabels.map((label) => (\n                      <button\n                        key={label}\n                        className=\"asakaa-bulk-menu-item\"\n                        onClick={() => handleAddLabels([label])}\n                      >\n                        {label}\n                      </button>\n                    ))}\n                  </div>\n                )}\n              </div>\n            )}\n\n            {/* Delete */}\n            <button\n              className=\"asakaa-bulk-toolbar-button asakaa-bulk-toolbar-button-danger\"\n              onClick={handleDelete}\n              title=\"Delete selected cards\"\n            >\n              <span className=\"text-sm\">Delete</span>\n            </button>\n\n            {/* Clear selection */}\n            <button\n              className=\"asakaa-bulk-toolbar-button\"\n              onClick={onClearSelection}\n              title=\"Clear selection\"\n            >\n              <span className=\"text-sm\">✕</span>\n            </button>\n          </div>\n        </div>\n      </div>\n    )\n  }\n)\n\nBulkOperationsToolbar.displayName = 'BulkOperationsToolbar'\n","/**\r\n * SwimlaneBoardView Component\r\n * Displays board grouped by swimlanes (horizontal rows)\r\n * @module components/Swimlanes\r\n */\r\n\r\nimport { useMemo, useState, useCallback } from 'react'\r\nimport type { ReactNode } from 'react'\r\nimport type {\r\n  Board,\r\n  Card,\r\n  Column,\r\n  GroupByOption,\r\n  KanbanBoardProps,\r\n  Swimlane,\r\n  SwimlaneConfig,\r\n} from '../../types'\r\nimport type { User } from '../Card/UserAssignmentSelector'\r\nimport { KanbanBoard } from '../Board'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface SwimlaneBoardViewProps {\r\n  /** Board data */\r\n  board: Board\r\n  /** Swimlane configuration */\r\n  swimlaneConfig: SwimlaneConfig\r\n  /** All available users */\r\n  availableUsers?: User[]\r\n  /** Board callbacks */\r\n  callbacks: {\r\n    onCardMove?: (cardId: string, targetColumnId: string, position: number) => void\r\n    onCardUpdate?: (cardId: string, updates: Partial<Card>) => void\r\n    onColumnUpdate?: (columnId: string, updates: Partial<Column>) => void\r\n    onWipLimitExceeded?: (column: Column, card: Card) => void\r\n  }\r\n  /** Custom className */\r\n  className?: string\r\n\r\n  // ── Extensiones para jerarquía WBS (consumidor-driven) ──\r\n  /**\r\n   * Swimlanes PRE-CONSTRUIDOS por el consumidor. Si se proveen, se usan tal\r\n   * cual y se ignora `swimlaneConfig.groupBy` / generateSwimlanes. Permite\r\n   * agrupar por cualquier criterio externo (p.ej. jerarquía WBS padre→hojas)\r\n   * que la librería no modela internamente.\r\n   */\r\n  swimlanes?: Swimlane[]\r\n  /**\r\n   * Render custom de la cabecera de cada lane. Si se omite, se usa el header\r\n   * por defecto (icono + título + conteo). Recibe la lane y si está colapsada;\r\n   * el click de colapso lo gestiona el contenedor — envolver el contenido en\r\n   * el área clickeable es responsabilidad del header default, así que cuando\r\n   * se provee este render, el toggle se expone vía `onToggleCollapse`.\r\n   */\r\n  renderSwimlaneHeader?: (args: {\r\n    lane: Swimlane\r\n    isCollapsed: boolean\r\n    cardCount: number\r\n    onToggleCollapse: () => void\r\n  }) => ReactNode\r\n  /**\r\n   * renderProps/config/onCardClick que se reenvían al KanbanBoard de CADA\r\n   * lane (antes se perdían: las tarjetas dentro de swimlanes no podían usar\r\n   * renderers custom). Opcionales y retrocompatibles.\r\n   */\r\n  renderProps?: KanbanBoardProps['renderProps']\r\n  config?: KanbanBoardProps['config']\r\n  onCardClick?: KanbanBoardProps['onCardClick']\r\n  suppressDetailModal?: boolean\r\n  availableTags?: KanbanBoardProps['availableTags']\r\n  attachmentsByCard?: KanbanBoardProps['attachmentsByCard']\r\n  renderColumnMetrics?: KanbanBoardProps['renderColumnMetrics']\r\n}\r\n\r\n/**\r\n * Generate swimlanes based on groupBy option\r\n */\r\nfunction generateSwimlanes(\r\n  cards: Card[],\r\n  groupBy: GroupByOption,\r\n  availableUsers?: User[]\r\n): Swimlane[] {\r\n  if (groupBy === 'none') {\r\n    return []\r\n  }\r\n\r\n  const laneMap = new Map<string, Swimlane>()\r\n\r\n  // Group cards by the selected criteria\r\n  cards.forEach((card) => {\r\n    let groupValue: any\r\n    let laneId: string\r\n    let laneTitle: string\r\n    let laneColor: string | undefined\r\n    let laneIcon: string | undefined\r\n\r\n    switch (groupBy) {\r\n      case 'assignee':\r\n        // Use assignedUserIds or fallback to assigneeId\r\n        const assignedUserIds = card.assignedUserIds || (card.assigneeId ? [card.assigneeId] : [])\r\n\r\n        if (assignedUserIds.length > 0) {\r\n          assignedUserIds.forEach((userId: string) => {\r\n            const user = availableUsers?.find((u) => u.id === userId)\r\n            laneId = `assignee-${userId}`\r\n            laneTitle = user?.name || `User ${userId}`\r\n            laneColor = user?.color\r\n            laneIcon = user?.avatar\r\n\r\n            if (!laneMap.has(laneId)) {\r\n              laneMap.set(laneId, {\r\n                id: laneId,\r\n                title: laneTitle,\r\n                groupValue: userId,\r\n                cardIds: [],\r\n                color: laneColor,\r\n                icon: laneIcon,\r\n              })\r\n            }\r\n            laneMap.get(laneId)!.cardIds.push(card.id)\r\n          })\r\n        } else {\r\n          // Unassigned lane\r\n          laneId = 'assignee-unassigned'\r\n          laneTitle = 'Unassigned'\r\n          laneColor = '#6b7280'\r\n          laneIcon = '👤'\r\n\r\n          if (!laneMap.has(laneId)) {\r\n            laneMap.set(laneId, {\r\n              id: laneId,\r\n              title: laneTitle,\r\n              groupValue: null,\r\n              cardIds: [],\r\n              color: laneColor,\r\n              icon: laneIcon,\r\n            })\r\n          }\r\n          laneMap.get(laneId)!.cardIds.push(card.id)\r\n        }\r\n        break\r\n\r\n      case 'priority':\r\n        groupValue = card.priority || 'NONE'\r\n        laneId = `priority-${groupValue}`\r\n\r\n        // Priority styling\r\n        const priorityConfig = {\r\n          URGENT: { title: '🔴 Urgent', color: '#ef4444' },\r\n          HIGH: { title: '🟠 High', color: '#f97316' },\r\n          MEDIUM: { title: '🟡 Medium', color: '#eab308' },\r\n          LOW: { title: '🟢 Low', color: '#22c55e' },\r\n          NONE: { title: '⚪ No Priority', color: '#6b7280' },\r\n        }\r\n\r\n        const config = priorityConfig[groupValue as keyof typeof priorityConfig]\r\n        laneTitle = config.title\r\n        laneColor = config.color\r\n\r\n        if (!laneMap.has(laneId)) {\r\n          laneMap.set(laneId, {\r\n            id: laneId,\r\n            title: laneTitle,\r\n            groupValue,\r\n            cardIds: [],\r\n            color: laneColor,\r\n          })\r\n        }\r\n        laneMap.get(laneId)!.cardIds.push(card.id)\r\n        break\r\n\r\n      case 'label':\r\n        if (card.labels && card.labels.length > 0) {\r\n          card.labels.forEach((label: string) => {\r\n            laneId = `label-${label}`\r\n            laneTitle = label\r\n            laneColor = '#6b7280' // Default gray color for string labels\r\n\r\n            if (!laneMap.has(laneId)) {\r\n              laneMap.set(laneId, {\r\n                id: laneId,\r\n                title: laneTitle,\r\n                groupValue: label,\r\n                cardIds: [],\r\n                color: laneColor,\r\n              })\r\n            }\r\n            laneMap.get(laneId)!.cardIds.push(card.id)\r\n          })\r\n        } else {\r\n          // No labels lane\r\n          laneId = 'label-none'\r\n          laneTitle = 'No Labels'\r\n          laneColor = '#6b7280'\r\n\r\n          if (!laneMap.has(laneId)) {\r\n            laneMap.set(laneId, {\r\n              id: laneId,\r\n              title: laneTitle,\r\n              groupValue: null,\r\n              cardIds: [],\r\n              color: laneColor,\r\n            })\r\n          }\r\n          laneMap.get(laneId)!.cardIds.push(card.id)\r\n        }\r\n        break\r\n    }\r\n  })\r\n\r\n  return Array.from(laneMap.values()).sort((a, b) => {\r\n    // Sort by title\r\n    return a.title.localeCompare(b.title)\r\n  })\r\n}\r\n\r\n/**\r\n * SwimlaneBoardView Component\r\n */\r\nexport function SwimlaneBoardView({\r\n  board,\r\n  swimlaneConfig,\r\n  availableUsers,\r\n  callbacks,\r\n  className,\r\n  swimlanes: providedSwimlanes,\r\n  renderSwimlaneHeader,\r\n  renderProps,\r\n  config,\r\n  onCardClick,\r\n  suppressDetailModal,\r\n  availableTags,\r\n  attachmentsByCard,\r\n  renderColumnMetrics,\r\n}: SwimlaneBoardViewProps) {\r\n  // Lanes completadas pueden nacer colapsadas (R15): el consumidor lo indica\r\n  // con isCollapsed en las lanes pre-construidas.\r\n  const [collapsedLanes, setCollapsedLanes] = useState<Set<string>>(() => {\r\n    const init = new Set<string>()\r\n    if (providedSwimlanes) {\r\n      for (const l of providedSwimlanes) if (l.isCollapsed) init.add(l.id)\r\n    }\r\n    return init\r\n  })\r\n\r\n  // Swimlanes: pre-construidos por el consumidor (WBS) o generados por groupBy\r\n  const swimlanes = useMemo(() => {\r\n    if (providedSwimlanes) return providedSwimlanes\r\n    return generateSwimlanes(\r\n      board.cards,\r\n      swimlaneConfig.groupBy,\r\n      availableUsers\r\n    )\r\n  }, [providedSwimlanes, board.cards, swimlaneConfig.groupBy, availableUsers])\r\n\r\n  // Props comunes que se reenvían al KanbanBoard de cada lane\r\n  const innerBoardProps = {\r\n    callbacks,\r\n    availableUsers,\r\n    renderProps,\r\n    config,\r\n    onCardClick,\r\n    suppressDetailModal,\r\n    availableTags,\r\n    attachmentsByCard,\r\n    renderColumnMetrics,\r\n  }\r\n\r\n  // Toggle lane collapse\r\n  const toggleLaneCollapse = useCallback((laneId: string) => {\r\n    setCollapsedLanes((prev) => {\r\n      const next = new Set(prev)\r\n      if (next.has(laneId)) {\r\n        next.delete(laneId)\r\n      } else {\r\n        next.add(laneId)\r\n      }\r\n      return next\r\n    })\r\n  }, [])\r\n\r\n  // Sin agrupación (y sin lanes pre-construidos): board plano (R19)\r\n  if (!providedSwimlanes && (swimlaneConfig.groupBy === 'none' || swimlanes.length === 0)) {\r\n    return (\r\n      <KanbanBoard\r\n        board={board}\r\n        className={className}\r\n        {...innerBoardProps}\r\n      />\r\n    )\r\n  }\r\n\r\n  return (\r\n    <div className={cn('asakaa-swimlane-view', className)}>\r\n      {swimlanes.map((lane) => {\r\n        const isCollapsed = collapsedLanes.has(lane.id)\r\n\r\n        // Filter cards for this lane\r\n        const laneCards = board.cards.filter((card) =>\r\n          lane.cardIds.includes(card.id)\r\n        )\r\n\r\n        // Create filtered board for this lane\r\n        const laneBoard: Board = {\r\n          ...board,\r\n          cards: laneCards,\r\n        }\r\n\r\n        return (\r\n          <div\r\n            key={lane.id}\r\n            className=\"asakaa-swimlane mb-6 rounded-lg border border-white/10 overflow-hidden\"\r\n          >\r\n            {/* Swimlane Header — custom (R9 WBS) o default */}\r\n            {renderSwimlaneHeader ? (\r\n              renderSwimlaneHeader({\r\n                lane,\r\n                isCollapsed,\r\n                cardCount: lane.cardIds.length,\r\n                onToggleCollapse: () => toggleLaneCollapse(lane.id),\r\n              })\r\n            ) : (\r\n              <div\r\n                className=\"asakaa-swimlane-header px-4 py-3 bg-white/5 backdrop-blur-sm flex items-center justify-between cursor-pointer hover:bg-white/10 transition-colors\"\r\n                onClick={() => swimlaneConfig.collapsible && toggleLaneCollapse(lane.id)}\r\n                style={{\r\n                  borderLeft: lane.color ? `4px solid ${lane.color}` : undefined,\r\n                }}\r\n              >\r\n                <div className=\"flex items-center gap-3\">\r\n                  {lane.icon && (\r\n                    <span className=\"text-2xl leading-none\">{lane.icon}</span>\r\n                  )}\r\n                  <h3\r\n                    className=\"text-lg font-semibold\"\r\n                    style={{ color: lane.color }}\r\n                  >\r\n                    {lane.title}\r\n                  </h3>\r\n                  <span className=\"text-sm text-white/50 font-medium\">\r\n                    ({lane.cardIds.length} {lane.cardIds.length === 1 ? 'card' : 'cards'})\r\n                  </span>\r\n                </div>\r\n\r\n                {swimlaneConfig.collapsible && (\r\n                  <button\r\n                    className=\"text-white/50 hover:text-white transition-colors\"\r\n                    aria-label={isCollapsed ? 'Expand lane' : 'Collapse lane'}\r\n                  >\r\n                    {isCollapsed ? '▶' : '▼'}\r\n                  </button>\r\n                )}\r\n              </div>\r\n            )}\r\n\r\n            {/* Swimlane Content */}\r\n            {!isCollapsed && (\r\n              <div className=\"asakaa-swimlane-content p-4\">\r\n                <KanbanBoard\r\n                  board={laneBoard}\r\n                  {...innerBoardProps}\r\n                />\r\n              </div>\r\n            )}\r\n          </div>\r\n        )\r\n      })}\r\n\r\n      {/* Empty state */}\r\n      {swimlanes.length === 0 && (\r\n        <div className=\"text-center py-12 text-white/50\">\r\n          <p className=\"text-lg\">No cards to display</p>\r\n          <p className=\"text-sm mt-2\">\r\n            Cards will appear here when they match the grouping criteria\r\n          </p>\r\n        </div>\r\n      )}\r\n    </div>\r\n  )\r\n}\r\n","/**\r\n * GroupBySelector Component\r\n * Dropdown to select swimlane grouping option\r\n * @module components/Swimlanes\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport type { GroupByOption } from '../../types'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface GroupBySelectorProps {\r\n  /** Current groupBy value */\r\n  value: GroupByOption\r\n  /** Change handler */\r\n  onChange: (groupBy: GroupByOption) => void\r\n  /** Custom className */\r\n  className?: string\r\n}\r\n\r\ninterface GroupByConfig {\r\n  value: GroupByOption\r\n  label: string\r\n  icon: string\r\n  description: string\r\n}\r\n\r\nconst GROUP_BY_OPTIONS: GroupByConfig[] = [\r\n  {\r\n    value: 'none',\r\n    label: 'No Grouping',\r\n    icon: '📋',\r\n    description: 'Standard Kanban board view',\r\n  },\r\n  {\r\n    value: 'assignee',\r\n    label: 'By Assignee',\r\n    icon: '👥',\r\n    description: 'Group cards by assigned user',\r\n  },\r\n  {\r\n    value: 'priority',\r\n    label: 'By Priority',\r\n    icon: '🎯',\r\n    description: 'Group cards by priority level',\r\n  },\r\n  {\r\n    value: 'label',\r\n    label: 'By Label',\r\n    icon: '🏷️',\r\n    description: 'Group cards by label/tag',\r\n  },\r\n]\r\n\r\n/**\r\n * GroupBySelector Component\r\n */\r\nexport function GroupBySelector({\r\n  value,\r\n  onChange,\r\n  className,\r\n}: GroupBySelectorProps) {\r\n  const [isOpen, setIsOpen] = useState(false)\r\n  const menuRef = useRef<HTMLDivElement>(null)\r\n  const buttonRef = useRef<HTMLButtonElement>(null)\r\n\r\n  const currentOption = GROUP_BY_OPTIONS.find((opt) => opt.value === value) || GROUP_BY_OPTIONS[0]!\r\n\r\n  // Close menu on outside click\r\n  useEffect(() => {\r\n    function handleClickOutside(event: MouseEvent): void {\r\n      if (\r\n        menuRef.current &&\r\n        !menuRef.current.contains(event.target as Node) &&\r\n        buttonRef.current &&\r\n        !buttonRef.current.contains(event.target as Node)\r\n      ) {\r\n        setIsOpen(false)\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside)\r\n      return () => document.removeEventListener('mousedown', handleClickOutside)\r\n    }\r\n    return undefined\r\n  }, [isOpen])\r\n\r\n  const handleSelect = (option: GroupByOption) => {\r\n    onChange(option)\r\n    setIsOpen(false)\r\n  }\r\n\r\n  return (\r\n    <div className={cn('relative inline-block', className)}>\r\n      {/* Trigger Button */}\r\n      <button\r\n        ref={buttonRef}\r\n        onClick={() => setIsOpen(!isOpen)}\r\n        className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-white/10 hover:bg-white/15 border border-white/20 transition-all text-sm font-medium text-white/90\"\r\n      >\r\n        <span className=\"text-base leading-none\">{currentOption.icon}</span>\r\n        <span>{currentOption.label}</span>\r\n        <svg\r\n          className={cn(\r\n            'w-4 h-4 transition-transform',\r\n            isOpen && 'rotate-180'\r\n          )}\r\n          fill=\"none\"\r\n          stroke=\"currentColor\"\r\n          viewBox=\"0 0 24 24\"\r\n        >\r\n          <path\r\n            strokeLinecap=\"round\"\r\n            strokeLinejoin=\"round\"\r\n            strokeWidth={2}\r\n            d=\"M19 9l-7 7-7-7\"\r\n          />\r\n        </svg>\r\n      </button>\r\n\r\n      {/* Dropdown Menu */}\r\n      {isOpen && (\r\n        <div\r\n          ref={menuRef}\r\n          className=\"absolute top-full left-0 mt-2 min-w-[280px] rounded-lg bg-gradient-to-br from-gray-900/95 to-gray-800/95 backdrop-blur-xl border border-white/20 shadow-2xl z-50 overflow-hidden\"\r\n        >\r\n          <div className=\"px-3 py-2 border-b border-white/10\">\r\n            <span className=\"text-[10px] font-bold text-white/70 uppercase tracking-wider\">\r\n              Group By\r\n            </span>\r\n          </div>\r\n\r\n          <div className=\"py-1\">\r\n            {GROUP_BY_OPTIONS.map((option) => (\r\n              <button\r\n                key={option.value}\r\n                onClick={() => handleSelect(option.value)}\r\n                className={cn(\r\n                  'w-full px-3 py-2 flex items-start gap-3 text-left transition-all hover:bg-white/10',\r\n                  value === option.value && 'bg-white/5'\r\n                )}\r\n              >\r\n                <span className=\"text-xl leading-none mt-0.5\">\r\n                  {option.icon}\r\n                </span>\r\n                <div className=\"flex-1 min-w-0\">\r\n                  <div className=\"flex items-center gap-2\">\r\n                    <span className=\"font-semibold text-sm text-white\">\r\n                      {option.label}\r\n                    </span>\r\n                    {value === option.value && (\r\n                      <span className=\"text-[#00E5CC] text-xs\">✓</span>\r\n                    )}\r\n                  </div>\r\n                  <p className=\"text-xs text-white/60 mt-0.5\">\r\n                    {option.description}\r\n                  </p>\r\n                </div>\r\n              </button>\r\n            ))}\r\n          </div>\r\n        </div>\r\n      )}\r\n    </div>\r\n  )\r\n}\r\n","/**\n * useKeyboardShortcuts Hook\n * Global keyboard shortcuts system for board navigation and actions\n * @module hooks/keyboard\n */\n\nimport { useEffect, useCallback, useRef } from 'react'\nimport type { KeyboardShortcut, KeyboardAction } from '../../types'\n\nexport interface UseKeyboardShortcutsOptions {\n  /** Shortcuts configuration */\n  shortcuts?: KeyboardShortcut[]\n  /** Enable/disable shortcuts */\n  enabled?: boolean\n  /** Prevent default browser behavior */\n  preventDefault?: boolean\n}\n\nexport interface UseKeyboardShortcutsReturn {\n  /** Register a keyboard shortcut dynamically */\n  registerShortcut: (shortcut: KeyboardShortcut) => void\n  /** Unregister a keyboard shortcut */\n  unregisterShortcut: (action: KeyboardAction) => void\n  /** Check if shortcuts are enabled */\n  isEnabled: boolean\n}\n\n/**\n * Default keyboard shortcuts for Kanban board\n */\nexport const DEFAULT_SHORTCUTS: KeyboardShortcut[] = [\n  {\n    keys: 'ArrowUp',\n    action: 'navigate_up',\n    description: 'Navigate to card above',\n  },\n  {\n    keys: 'ArrowDown',\n    action: 'navigate_down',\n    description: 'Navigate to card below',\n  },\n  {\n    keys: 'ArrowLeft',\n    action: 'navigate_left',\n    description: 'Navigate to previous column',\n  },\n  {\n    keys: 'ArrowRight',\n    action: 'navigate_right',\n    description: 'Navigate to next column',\n  },\n  {\n    keys: 'Enter',\n    action: 'open_card',\n    description: 'Open selected card',\n  },\n  {\n    keys: 'Escape',\n    action: 'close_modal',\n    description: 'Close modal or dialog',\n  },\n  {\n    keys: 'Delete',\n    action: 'delete_card',\n    description: 'Delete selected card',\n    modifiers: { shift: true },\n  },\n  {\n    keys: 'n',\n    action: 'new_card',\n    description: 'Create new card',\n    modifiers: { ctrl: true },\n  },\n  {\n    keys: 'k',\n    action: 'search',\n    description: 'Open search/command palette',\n    modifiers: { ctrl: true },\n  },\n  {\n    keys: 's',\n    action: 'save',\n    description: 'Save changes',\n    modifiers: { ctrl: true },\n  },\n  {\n    keys: 'z',\n    action: 'undo',\n    description: 'Undo last action',\n    modifiers: { ctrl: true },\n  },\n  {\n    keys: 'y',\n    action: 'redo',\n    description: 'Redo last undone action',\n    modifiers: { ctrl: true },\n  },\n  {\n    keys: 'a',\n    action: 'select_all',\n    description: 'Select all cards',\n    modifiers: { ctrl: true },\n  },\n  {\n    keys: 'Escape',\n    action: 'deselect_all',\n    description: 'Deselect all cards',\n  },\n  {\n    keys: '?',\n    action: 'show_shortcuts',\n    description: 'Show keyboard shortcuts help',\n    modifiers: { shift: true },\n  },\n]\n\n/**\n * Check if keyboard event matches shortcut\n */\nfunction matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n  const keys = Array.isArray(shortcut.keys) ? shortcut.keys : [shortcut.keys]\n  const keyMatches = keys.some((key) => event.key === key || event.code === key)\n\n  if (!keyMatches) return false\n\n  const modifiers = shortcut.modifiers || {}\n  const ctrlMatch = modifiers.ctrl ? (event.ctrlKey || event.metaKey) : !event.ctrlKey && !event.metaKey\n  const shiftMatch = modifiers.shift ? event.shiftKey : !event.shiftKey\n  const altMatch = modifiers.alt ? event.altKey : !event.altKey\n  const metaMatch = modifiers.meta ? event.metaKey : true // Don't enforce meta unless specified\n\n  return ctrlMatch && shiftMatch && altMatch && metaMatch\n}\n\n/**\n * useKeyboardShortcuts Hook\n *\n * @example\n * ```tsx\n * const { registerShortcut } = useKeyboardShortcuts({\n *   shortcuts: DEFAULT_SHORTCUTS,\n *   enabled: true,\n *   preventDefault: true,\n * })\n *\n * // Listen for keyboard actions\n * useEffect(() => {\n *   const handleKeyboardAction = (event: CustomEvent<KeyboardAction>) => {\n *     console.log('Action triggered:', event.detail)\n *   }\n *\n *   window.addEventListener('keyboard-action', handleKeyboardAction)\n *   return () => window.removeEventListener('keyboard-action', handleKeyboardAction)\n * }, [])\n * ```\n */\nexport function useKeyboardShortcuts(\n  options: UseKeyboardShortcutsOptions = {}\n): UseKeyboardShortcutsReturn {\n  const {\n    shortcuts = DEFAULT_SHORTCUTS,\n    enabled = true,\n    preventDefault = true,\n  } = options\n\n  const shortcutsRef = useRef<KeyboardShortcut[]>(shortcuts)\n  const enabledRef = useRef(enabled)\n\n  // Update refs when options change\n  useEffect(() => {\n    shortcutsRef.current = shortcuts\n    enabledRef.current = enabled\n  }, [shortcuts, enabled])\n\n  // Register a new shortcut dynamically\n  const registerShortcut = useCallback((shortcut: KeyboardShortcut) => {\n    shortcutsRef.current = [...shortcutsRef.current, shortcut]\n  }, [])\n\n  // Unregister a shortcut\n  const unregisterShortcut = useCallback((action: KeyboardAction) => {\n    shortcutsRef.current = shortcutsRef.current.filter((s) => s.action !== action)\n  }, [])\n\n  // Handle keyboard events\n  useEffect(() => {\n    function handleKeyDown(event: KeyboardEvent): void {\n      if (!enabledRef.current) return\n\n      // Don't trigger shortcuts when typing in inputs, textareas, or contenteditable\n      const target = event.target as HTMLElement\n      if (\n        target.tagName === 'INPUT' ||\n        target.tagName === 'TEXTAREA' ||\n        target.isContentEditable\n      ) {\n        // Allow Escape and Ctrl+shortcuts even in inputs\n        if (event.key !== 'Escape' && !event.ctrlKey && !event.metaKey) {\n          return\n        }\n      }\n\n      // Check each shortcut\n      for (const shortcut of shortcutsRef.current) {\n        if (matchesShortcut(event, shortcut)) {\n          if (preventDefault) {\n            event.preventDefault()\n          }\n\n          // Dispatch custom event with action\n          const customEvent = new CustomEvent('keyboard-action', {\n            detail: shortcut.action,\n            bubbles: true,\n            cancelable: true,\n          })\n          window.dispatchEvent(customEvent)\n\n          break // Only trigger first matching shortcut\n        }\n      }\n    }\n\n    window.addEventListener('keydown', handleKeyDown)\n    return () => window.removeEventListener('keydown', handleKeyDown)\n  }, [preventDefault])\n\n  return {\n    registerShortcut,\n    unregisterShortcut,\n    isEnabled: enabled,\n  }\n}\n","/**\r\n * KeyboardShortcutsHelp Component\r\n * Modal displaying available keyboard shortcuts\r\n * @module components/KeyboardShortcuts\r\n */\r\n\r\nimport { useEffect, useState } from 'react'\r\nimport type { KeyboardShortcut } from '../../types'\r\nimport { DEFAULT_SHORTCUTS } from '../../hooks/keyboard/useKeyboardShortcuts'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface KeyboardShortcutsHelpProps {\r\n  /** Custom shortcuts to display */\r\n  shortcuts?: KeyboardShortcut[]\r\n  /** Is modal open */\r\n  isOpen: boolean\r\n  /** Close handler */\r\n  onClose: () => void\r\n  /** Custom className */\r\n  className?: string\r\n}\r\n\r\n/**\r\n * Format keyboard key for display\r\n */\r\nfunction formatKey(key: string): string {\r\n  const keyMap: Record<string, string> = {\r\n    ArrowUp: '↑',\r\n    ArrowDown: '↓',\r\n    ArrowLeft: '←',\r\n    ArrowRight: '→',\r\n    Enter: '↵',\r\n    Escape: 'Esc',\r\n    Delete: 'Del',\r\n    ' ': 'Space',\r\n  }\r\n  return keyMap[key] || key.toUpperCase()\r\n}\r\n\r\n/**\r\n * Format modifiers for display\r\n */\r\nfunction formatModifiers(shortcut: KeyboardShortcut): string {\r\n  const parts: string[] = []\r\n  const isMac = typeof navigator !== 'undefined' && navigator.platform.includes('Mac')\r\n\r\n  if (shortcut.modifiers?.ctrl) {\r\n    parts.push(isMac ? '⌘' : 'Ctrl')\r\n  }\r\n  if (shortcut.modifiers?.shift) {\r\n    parts.push('Shift')\r\n  }\r\n  if (shortcut.modifiers?.alt) {\r\n    parts.push(isMac ? '⌥' : 'Alt')\r\n  }\r\n  if (shortcut.modifiers?.meta) {\r\n    parts.push('⌘')\r\n  }\r\n\r\n  return parts.join(' + ')\r\n}\r\n\r\n/**\r\n * Get full shortcut display\r\n */\r\nfunction getShortcutDisplay(shortcut: KeyboardShortcut): string {\r\n  const keys = Array.isArray(shortcut.keys) ? shortcut.keys[0] : shortcut.keys\r\n  const modifiers = formatModifiers(shortcut)\r\n  const key = keys ? formatKey(keys) : ''\r\n\r\n  return modifiers ? `${modifiers} + ${key}` : key\r\n}\r\n\r\n/**\r\n * Group shortcuts by category\r\n */\r\nfunction groupShortcuts(shortcuts: KeyboardShortcut[]): Record<string, KeyboardShortcut[]> {\r\n  const groups: Record<string, KeyboardShortcut[]> = {\r\n    Navigation: [],\r\n    Actions: [],\r\n    Editing: [],\r\n    Selection: [],\r\n  }\r\n\r\n  shortcuts.forEach((shortcut) => {\r\n    if (shortcut.action.includes('navigate')) {\r\n      groups.Navigation?.push(shortcut)\r\n    } else if (shortcut.action.includes('select')) {\r\n      groups.Selection?.push(shortcut)\r\n    } else if (['undo', 'redo', 'save'].includes(shortcut.action)) {\r\n      groups.Editing?.push(shortcut)\r\n    } else {\r\n      groups.Actions?.push(shortcut)\r\n    }\r\n  })\r\n\r\n  return groups\r\n}\r\n\r\n/**\r\n * KeyboardShortcutsHelp Component\r\n */\r\nexport function KeyboardShortcutsHelp({\r\n  shortcuts = DEFAULT_SHORTCUTS,\r\n  isOpen,\r\n  onClose,\r\n  className,\r\n}: KeyboardShortcutsHelpProps) {\r\n  const [isMounted, setIsMounted] = useState(false)\r\n\r\n  useEffect(() => {\r\n    setIsMounted(true)\r\n  }, [])\r\n\r\n  // Close on Escape\r\n  useEffect(() => {\r\n    function handleKeyDown(event: KeyboardEvent): void {\r\n      if (event.key === 'Escape' && isOpen) {\r\n        onClose()\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('keydown', handleKeyDown)\r\n      return () => document.removeEventListener('keydown', handleKeyDown)\r\n    }\r\n    return undefined\r\n  }, [isOpen, onClose])\r\n\r\n  if (!isMounted || !isOpen) return null\r\n\r\n  const groups = groupShortcuts(shortcuts)\r\n\r\n  return (\r\n    <div className={cn('fixed inset-0 z-[9999] flex items-center justify-center', className)}>\r\n      {/* Backdrop */}\r\n      <div\r\n        className=\"absolute inset-0 backdrop-blur-sm bg-black/40 dark:bg-black/60\"\r\n        onClick={onClose}\r\n      />\r\n\r\n      {/* Modal */}\r\n      <div className=\"relative backdrop-blur-xl rounded-2xl border shadow-2xl max-w-3xl w-full mx-4 max-h-[80vh] overflow-hidden bg-white dark:bg-gradient-to-br dark:from-gray-900/95 dark:to-gray-800/95 border-gray-200 dark:border-white/20\">\r\n        {/* Header */}\r\n        <div className=\"px-6 py-5 border-b flex items-center justify-between border-gray-200 dark:border-white/10\">\r\n          <div>\r\n            <h2 className=\"text-2xl font-bold flex items-center gap-3 text-gray-900 dark:text-white\">\r\n              <span className=\"text-3xl\">⌨️</span>\r\n              Keyboard Shortcuts\r\n            </h2>\r\n            <p className=\"text-sm mt-1 text-gray-500 dark:text-white/60\">\r\n              Speed up your workflow with these shortcuts\r\n            </p>\r\n          </div>\r\n          <button\r\n            onClick={onClose}\r\n            className=\"transition-colors text-2xl leading-none p-2 rounded-lg text-gray-400 hover:text-gray-600 hover:bg-gray-100 dark:text-white/50 dark:hover:text-white dark:hover:bg-white/10\"\r\n            aria-label=\"Close\"\r\n          >\r\n            ×\r\n          </button>\r\n        </div>\r\n\r\n        {/* Content */}\r\n        <div className=\"px-6 py-6 overflow-y-auto max-h-[calc(80vh-120px)]\">\r\n          <div className=\"grid grid-cols-1 md:grid-cols-2 gap-8\">\r\n            {Object.entries(groups).map(([category, categoryShortcuts]) => {\r\n              if (categoryShortcuts.length === 0) return null\r\n\r\n              return (\r\n                <div key={category}>\r\n                  <h3 className=\"text-lg font-semibold mb-4 flex items-center gap-2 text-gray-800 dark:text-white/90\">\r\n                    <span className=\"w-1 h-5 bg-[#00E5CC] rounded-full\" />\r\n                    {category}\r\n                  </h3>\r\n                  <div className=\"space-y-3\">\r\n                    {categoryShortcuts.map((shortcut) => (\r\n                      <div\r\n                        key={shortcut.action}\r\n                        className=\"flex items-center justify-between gap-4 p-3 rounded-lg transition-colors bg-gray-50 hover:bg-gray-100 dark:bg-white/5 dark:hover:bg-white/10\"\r\n                      >\r\n                        <span className=\"text-sm text-gray-700 dark:text-white/80\">\r\n                          {shortcut.description}\r\n                        </span>\r\n                        <kbd className=\"px-3 py-1.5 border rounded-md text-xs font-mono shadow-sm whitespace-nowrap bg-white border-gray-300 text-gray-800 dark:bg-gradient-to-br dark:from-gray-700 dark:to-gray-800 dark:border-white/20 dark:text-white/90\">\r\n                          {getShortcutDisplay(shortcut)}\r\n                        </kbd>\r\n                      </div>\r\n                    ))}\r\n                  </div>\r\n                </div>\r\n              )\r\n            })}\r\n          </div>\r\n        </div>\r\n\r\n        {/* Footer */}\r\n        <div className=\"px-6 py-4 border-t border-gray-200 bg-gray-50 dark:border-white/10 dark:bg-white/5\">\r\n          <p className=\"text-xs text-center text-gray-500 dark:text-white/50\">\r\n            Press <kbd className=\"px-2 py-0.5 rounded bg-gray-200 text-gray-600 dark:bg-white/10 dark:text-white/70\">?</kbd> to toggle this help panel\r\n          </p>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n","/**\n * CardTemplateSelector Component\n * Dropdown to select and apply card templates\n * @module components/Templates\n */\n\nimport { useState, useRef, useEffect } from 'react'\nimport type { CardTemplate } from '../../types'\nimport { cn } from '../../utils'\n\nexport interface CardTemplateSelectorProps {\n  /** Available templates */\n  templates: CardTemplate[]\n  /** Template selection handler */\n  onSelectTemplate: (template: CardTemplate) => void\n  /** Custom className */\n  className?: string\n}\n\n/**\n * Default card templates\n */\nexport const DEFAULT_TEMPLATES: CardTemplate[] = [\n  {\n    id: 'bug-report',\n    name: 'Bug Report',\n    description: 'Report a bug or issue',\n    icon: '🐛',\n    category: 'Development',\n    template: {\n      title: '[BUG] ',\n      description: '**Steps to reproduce:**\\n1. \\n\\n**Expected behavior:**\\n\\n**Actual behavior:**\\n\\n**Screenshots:**',\n      priority: 'HIGH',\n      labels: ['bug'],\n    },\n  },\n  {\n    id: 'feature-request',\n    name: 'Feature Request',\n    description: 'Propose a new feature',\n    icon: '✨',\n    category: 'Development',\n    template: {\n      title: '[FEATURE] ',\n      description: '**Problem:**\\n\\n**Proposed solution:**\\n\\n**Alternatives considered:**\\n\\n**Additional context:**',\n      priority: 'MEDIUM',\n      labels: ['feature', 'enhancement'],\n    },\n  },\n  {\n    id: 'task',\n    name: 'Task',\n    description: 'General task or to-do',\n    icon: '📝',\n    category: 'General',\n    template: {\n      title: '',\n      description: '**Objective:**\\n\\n**Acceptance criteria:**\\n- [ ] \\n\\n**Notes:**',\n      priority: 'MEDIUM',\n    },\n  },\n  {\n    id: 'research',\n    name: 'Research',\n    description: 'Investigation or research task',\n    icon: '🔬',\n    category: 'General',\n    template: {\n      title: '[RESEARCH] ',\n      description: '**Goal:**\\n\\n**Questions to answer:**\\n- \\n\\n**Resources:**\\n- \\n\\n**Findings:**',\n      priority: 'LOW',\n      labels: ['research'],\n    },\n  },\n  {\n    id: 'documentation',\n    name: 'Documentation',\n    description: 'Documentation task',\n    icon: '📚',\n    category: 'Documentation',\n    template: {\n      title: '[DOCS] ',\n      description: '**What needs to be documented:**\\n\\n**Target audience:**\\n\\n**Key points:**\\n- ',\n      priority: 'LOW',\n      labels: ['documentation'],\n    },\n  },\n  {\n    id: 'meeting',\n    name: 'Meeting',\n    description: 'Meeting or discussion',\n    icon: '💬',\n    category: 'Communication',\n    template: {\n      title: 'Meeting: ',\n      description: '**Date & Time:**\\n\\n**Participants:**\\n- \\n\\n**Agenda:**\\n1. \\n\\n**Action items:**\\n- [ ] ',\n      priority: 'MEDIUM',\n      labels: ['meeting'],\n    },\n  },\n]\n\n/**\n * CardTemplateSelector Component\n */\nexport function CardTemplateSelector({\n  templates,\n  onSelectTemplate,\n  className,\n}: CardTemplateSelectorProps) {\n  const [isOpen, setIsOpen] = useState(false)\n  const menuRef = useRef<HTMLDivElement>(null)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n\n  // Close menu on outside click\n  useEffect(() => {\n    function handleClickOutside(event: MouseEvent): void {\n      if (\n        menuRef.current &&\n        !menuRef.current.contains(event.target as Node) &&\n        buttonRef.current &&\n        !buttonRef.current.contains(event.target as Node)\n      ) {\n        setIsOpen(false)\n      }\n    }\n\n    if (isOpen) {\n      document.addEventListener('mousedown', handleClickOutside)\n      return () => document.removeEventListener('mousedown', handleClickOutside)\n    }\n    return undefined\n  }, [isOpen])\n\n  const handleSelect = (template: CardTemplate) => {\n    onSelectTemplate(template)\n    setIsOpen(false)\n  }\n\n  // Group templates by category\n  const groupedTemplates = templates.reduce((acc, template) => {\n    const category = template.category || 'Other'\n    if (!acc[category]) {\n      acc[category] = []\n    }\n    acc[category].push(template)\n    return acc\n  }, {} as Record<string, CardTemplate[]>)\n\n  return (\n    <div className={cn('relative inline-block', className)}>\n      {/* Trigger Button */}\n      <button\n        ref={buttonRef}\n        onClick={() => setIsOpen(!isOpen)}\n        className=\"flex items-center gap-2 px-3 py-2 rounded-lg border transition-all text-sm font-medium shadow-lg\"\n        style={{\n          backgroundColor: 'var(--theme-bg-secondary)',\n          borderColor: 'var(--theme-border-primary)',\n          color: 'var(--theme-text-primary)',\n        }}\n        onMouseEnter={(e) => {\n          e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\n          e.currentTarget.style.borderColor = 'var(--theme-border-secondary)'\n        }}\n        onMouseLeave={(e) => {\n          e.currentTarget.style.backgroundColor = 'var(--theme-bg-secondary)'\n          e.currentTarget.style.borderColor = 'var(--theme-border-primary)'\n        }}\n        title=\"Create from template\"\n      >\n        <span className=\"text-base leading-none\">📋</span>\n        <span>Templates</span>\n        <svg\n          className={cn(\n            'w-4 h-4 transition-transform',\n            isOpen && 'rotate-180'\n          )}\n          fill=\"none\"\n          stroke=\"currentColor\"\n          viewBox=\"0 0 24 24\"\n        >\n          <path\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            strokeWidth={2}\n            d=\"M19 9l-7 7-7-7\"\n          />\n        </svg>\n      </button>\n\n      {/* Dropdown Menu */}\n      {isOpen && (\n        <div\n          ref={menuRef}\n          className=\"absolute top-full left-0 mt-2 min-w-[320px] max-w-[400px] rounded-xl backdrop-blur-xl border shadow-2xl z-50 overflow-hidden max-h-[500px] overflow-y-auto\"\n          style={{\n            backgroundColor: 'var(--theme-bg-primary)',\n            borderColor: 'var(--theme-border-primary)',\n          }}\n        >\n          <div\n            className=\"px-4 py-3 border-b sticky top-0 backdrop-blur-sm\"\n            style={{\n              borderColor: 'var(--theme-border-primary)',\n              backgroundColor: 'var(--theme-bg-secondary)',\n            }}\n          >\n            <span\n              className=\"text-sm font-bold uppercase tracking-wider\"\n              style={{ color: 'var(--theme-text-primary)' }}\n            >\n              Card Templates\n            </span>\n            <p\n              className=\"text-xs mt-0.5\"\n              style={{ color: 'var(--theme-text-tertiary)' }}\n            >\n              Quick start with pre-configured cards\n            </p>\n          </div>\n\n          {Object.entries(groupedTemplates).map(([category, categoryTemplates]) => (\n            <div key={category} className=\"py-2\">\n              <div className=\"px-4 py-2\">\n                <h4\n                  className=\"text-xs font-semibold uppercase tracking-wider\"\n                  style={{ color: 'var(--theme-text-secondary)' }}\n                >\n                  {category}\n                </h4>\n              </div>\n              <div>\n                {categoryTemplates.map((template) => (\n                  <button\n                    key={template.id}\n                    onClick={() => handleSelect(template)}\n                    className=\"w-full px-4 py-3 flex items-start gap-3 text-left transition-all active:scale-[0.98]\"\n                    style={{ color: 'var(--theme-text-primary)' }}\n                    onMouseEnter={(e) => {\n                      e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\n                    }}\n                    onMouseLeave={(e) => {\n                      e.currentTarget.style.backgroundColor = 'transparent'\n                    }}\n                  >\n                    <span className=\"text-2xl leading-none mt-0.5\">\n                      {template.icon}\n                    </span>\n                    <div className=\"flex-1 min-w-0\">\n                      <div\n                        className=\"font-semibold text-sm\"\n                        style={{ color: 'var(--theme-text-primary)' }}\n                      >\n                        {template.name}\n                      </div>\n                      {template.description && (\n                        <p\n                          className=\"text-xs mt-0.5\"\n                          style={{ color: 'var(--theme-text-tertiary)' }}\n                        >\n                          {template.description}\n                        </p>\n                      )}\n                    </div>\n                  </button>\n                ))}\n              </div>\n            </div>\n          ))}\n\n          {templates.length === 0 && (\n            <div\n              className=\"px-4 py-8 text-center\"\n              style={{ color: 'var(--theme-text-tertiary)' }}\n            >\n              <p className=\"text-sm\">No templates available</p>\n            </div>\n          )}\n        </div>\n      )}\n    </div>\n  )\n}\n","/**\r\n * ExportImportModal Component\r\n * Modal for exporting and importing board data\r\n * @module components/ExportImport\r\n */\r\n\r\nimport { useState, useRef } from 'react'\r\nimport type { Board, ExportFormat, ImportResult } from '../../types'\r\nimport { exportBoard, downloadExport } from '../../utils/export'\r\nimport { readFile, importBoard } from '../../utils/import'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface ExportImportModalProps {\r\n  /** Board data to export */\r\n  board: Board\r\n  /** Is modal open */\r\n  isOpen: boolean\r\n  /** Close handler */\r\n  onClose: () => void\r\n  /** Import handler */\r\n  onImport?: (result: ImportResult, content: string) => void\r\n  /** Board element ref for PDF export */\r\n  boardElementRef?: React.RefObject<HTMLElement>\r\n  /** Custom className */\r\n  className?: string\r\n}\r\n\r\n/**\r\n * ExportImportModal Component\r\n */\r\nexport function ExportImportModal({\r\n  board,\r\n  isOpen,\r\n  onClose,\r\n  onImport,\r\n  boardElementRef,\r\n  className,\r\n}: ExportImportModalProps) {\r\n  const [activeTab, setActiveTab] = useState<'export' | 'import'>('export')\r\n  const [selectedFormat, setSelectedFormat] = useState<ExportFormat>('json')\r\n  const [importResult, setImportResult] = useState<ImportResult | null>(null)\r\n  const fileInputRef = useRef<HTMLInputElement>(null)\r\n\r\n  if (!isOpen) return null\r\n\r\n  const handleExport = async () => {\r\n    const boardElement = boardElementRef?.current || undefined\r\n    const content = await exportBoard(board, selectedFormat, boardElement)\r\n    downloadExport(content, selectedFormat)\r\n  }\r\n\r\n  const handleFileSelect = async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n    const file = event.target.files?.[0]\r\n    if (!file) return\r\n\r\n    try {\r\n      const content = await readFile(file)\r\n      const format = file.name.endsWith('.json') ? 'json' : 'csv'\r\n      const result = importBoard(content, format)\r\n\r\n      setImportResult(result)\r\n\r\n      if (result.success && onImport) {\r\n        onImport(result, content)\r\n      }\r\n    } catch (error) {\r\n      setImportResult({\r\n        success: false,\r\n        errors: [`Failed to read file: ${error instanceof Error ? error.message : 'Unknown error'}`],\r\n      })\r\n    }\r\n\r\n    // Reset file input\r\n    if (fileInputRef.current) {\r\n      fileInputRef.current.value = ''\r\n    }\r\n  }\r\n\r\n  return (\r\n    <div className={cn('fixed inset-0 z-[9999] flex items-center justify-center', className)}>\r\n      {/* Backdrop */}\r\n      <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" onClick={onClose} />\r\n\r\n      {/* Modal */}\r\n      <div className=\"relative bg-gradient-to-br from-gray-900/95 to-gray-800/95 backdrop-blur-xl rounded-2xl border border-white/20 shadow-2xl max-w-2xl w-full mx-4\">\r\n        {/* Header */}\r\n        <div className=\"px-6 py-5 border-b border-white/10 flex items-center justify-between\">\r\n          <div>\r\n            <h2 className=\"text-2xl font-bold text-white flex items-center gap-3\">\r\n              <span className=\"text-3xl\">📦</span>\r\n              Export / Import\r\n            </h2>\r\n            <p className=\"text-sm text-white/60 mt-1\">\r\n              Transfer your board data\r\n            </p>\r\n          </div>\r\n          <button\r\n            onClick={onClose}\r\n            className=\"text-white/50 hover:text-white transition-colors text-2xl leading-none p-2 hover:bg-white/10 rounded-lg\"\r\n            aria-label=\"Close\"\r\n          >\r\n            ×\r\n          </button>\r\n        </div>\r\n\r\n        {/* Tabs */}\r\n        <div className=\"flex border-b border-white/10\">\r\n          <button\r\n            onClick={() => setActiveTab('export')}\r\n            className={cn(\r\n              'flex-1 px-6 py-4 font-semibold transition-colors',\r\n              activeTab === 'export'\r\n                ? 'text-white border-b-2 border-[#00E5CC]'\r\n                : 'text-white/50 hover:text-white/80'\r\n            )}\r\n          >\r\n            Export\r\n          </button>\r\n          <button\r\n            onClick={() => setActiveTab('import')}\r\n            className={cn(\r\n              'flex-1 px-6 py-4 font-semibold transition-colors',\r\n              activeTab === 'import'\r\n                ? 'text-white border-b-2 border-[#00E5CC]'\r\n                : 'text-white/50 hover:text-white/80'\r\n            )}\r\n          >\r\n            Import\r\n          </button>\r\n        </div>\r\n\r\n        {/* Content */}\r\n        <div className=\"p-6\">\r\n          {activeTab === 'export' && (\r\n            <div className=\"space-y-6\">\r\n              <div>\r\n                <label className=\"block text-sm font-semibold text-white/90 mb-3\">\r\n                  Select format\r\n                </label>\r\n                <div className=\"grid grid-cols-3 gap-3\">\r\n                  {(['json', 'csv', 'pdf'] as ExportFormat[]).map((format) => (\r\n                    <button\r\n                      key={format}\r\n                      onClick={() => setSelectedFormat(format)}\r\n                      className={cn(\r\n                        'p-4 rounded-lg border-2 transition-all text-center',\r\n                        selectedFormat === format\r\n                          ? 'border-[#00E5CC] bg-[#00E5CC]/20 text-white'\r\n                          : 'border-white/20 hover:border-white/40 text-white/70 hover:text-white'\r\n                      )}\r\n                    >\r\n                      <div className=\"text-2xl mb-2\">\r\n                        {format === 'json' && '📄'}\r\n                        {format === 'csv' && '📊'}\r\n                        {format === 'pdf' && '📝'}\r\n                      </div>\r\n                      <div className=\"font-semibold uppercase text-xs\">\r\n                        {format}\r\n                      </div>\r\n                    </button>\r\n                  ))}\r\n                </div>\r\n              </div>\r\n\r\n              <div className=\"bg-white/5 rounded-lg p-4\">\r\n                <h3 className=\"text-sm font-semibold text-white/90 mb-2\">Preview</h3>\r\n                <div className=\"text-xs text-white/60\">\r\n                  <div>Board: <span className=\"text-white/90\">{board.title || 'Untitled'}</span></div>\r\n                  <div>Columns: <span className=\"text-white/90\">{board.columns.length}</span></div>\r\n                  <div>Cards: <span className=\"text-white/90\">{board.cards.length}</span></div>\r\n                </div>\r\n              </div>\r\n\r\n              <button\r\n                onClick={handleExport}\r\n                className=\"w-full py-3 px-4 bg-gradient-to-r from-[#00C4AE] to-[#00C4AE] hover:from-[#00E5CC] hover:to-[#00C4AE] text-white font-semibold rounded-lg transition-all shadow-lg shadow-[#00E5CC]/20\"\r\n              >\r\n                Export Board\r\n              </button>\r\n            </div>\r\n          )}\r\n\r\n          {activeTab === 'import' && (\r\n            <div className=\"space-y-6\">\r\n              <div>\r\n                <label className=\"block text-sm font-semibold text-white/90 mb-3\">\r\n                  Upload file\r\n                </label>\r\n                <input\r\n                  ref={fileInputRef}\r\n                  type=\"file\"\r\n                  accept=\".json,.csv\"\r\n                  onChange={handleFileSelect}\r\n                  className=\"hidden\"\r\n                />\r\n                <button\r\n                  onClick={() => fileInputRef.current?.click()}\r\n                  className=\"w-full py-12 px-4 border-2 border-dashed border-white/30 hover:border-white/50 rounded-lg transition-colors text-white/70 hover:text-white\"\r\n                >\r\n                  <div className=\"text-5xl mb-3\">📁</div>\r\n                  <div className=\"font-semibold mb-1\">Click to select file</div>\r\n                  <div className=\"text-xs text-white/50\">Supports JSON and CSV files</div>\r\n                </button>\r\n              </div>\r\n\r\n              {importResult && (\r\n                <div\r\n                  className={cn(\r\n                    'p-4 rounded-lg',\r\n                    importResult.success\r\n                      ? 'bg-green-500/20 border border-green-500/30'\r\n                      : 'bg-red-500/20 border border-red-500/30'\r\n                  )}\r\n                >\r\n                  <h3\r\n                    className={cn(\r\n                      'font-semibold mb-2',\r\n                      importResult.success ? 'text-green-400' : 'text-red-400'\r\n                    )}\r\n                  >\r\n                    {importResult.success ? '✓ Import Successful' : '✗ Import Failed'}\r\n                  </h3>\r\n                  {importResult.success && (\r\n                    <div className=\"text-sm text-white/80\">\r\n                      <div>Cards imported: {importResult.cardsImported}</div>\r\n                      <div>Columns imported: {importResult.columnsImported}</div>\r\n                    </div>\r\n                  )}\r\n                  {importResult.errors && importResult.errors.length > 0 && (\r\n                    <div className=\"mt-2 text-sm\">\r\n                      {importResult.errors.map((error, index) => (\r\n                        <div key={index} className=\"text-red-300\">\r\n                          • {error}\r\n                        </div>\r\n                      ))}\r\n                    </div>\r\n                  )}\r\n                </div>\r\n              )}\r\n            </div>\r\n          )}\r\n        </div>\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n","import { useCallback, useState } from 'react'\nimport type { Priority, User } from '../../types'\nimport type { FilterState, SortState, SortBy } from '../../hooks/useFilters'\nimport type { GroupByOption } from '../../types'\nimport './filter-bar.css'\n\nexport interface FilterBarProps {\n  filters: FilterState\n  sort: SortState\n  onFiltersChange: (filters: Partial<FilterState>) => void\n  onSortChange: (sort: Partial<SortState>) => void\n  onReset: () => void\n  onFilterMyTasks?: () => void\n  onFilterOverdue?: () => void\n  onFilterHighPriority?: () => void\n  availableUsers?: User[]\n  availableLabels?: string[]\n  availableColumns?: Array<{ id: string; title: string }>\n  showQuickFilters?: boolean\n  compact?: boolean\n  groupBy?: GroupByOption\n  onGroupByChange?: (value: GroupByOption) => void\n}\n\nconst PRIORITY_OPTIONS: Priority[] = ['URGENT', 'HIGH', 'MEDIUM', 'LOW']\n\nconst SORT_OPTIONS: Array<{ value: SortBy; label: string }> = [\n  { value: 'none', label: 'None' },\n  { value: 'created', label: 'Date Created' },\n  { value: 'priority', label: 'Priority' },\n  { value: 'dueDate', label: 'Due Date' },\n  { value: 'title', label: 'Title' },\n  { value: 'estimate', label: 'Estimate' },\n]\n\nconst GROUPBY_OPTIONS: Array<{ value: GroupByOption; label: string }> = [\n  { value: 'none', label: 'No Grouping' },\n  { value: 'priority', label: 'By Priority' },\n  { value: 'assignee', label: 'By Assignee' },\n  { value: 'label', label: 'By Label' },\n]\n\nexport function FilterBar({\n  filters,\n  sort,\n  onFiltersChange,\n  onSortChange,\n  onReset,\n  onFilterMyTasks,\n  onFilterOverdue,\n  onFilterHighPriority,\n  availableUsers = [],\n  availableLabels = [],\n  availableColumns: _availableColumns = [],\n  showQuickFilters = true,\n  compact = false,\n  groupBy = 'none',\n  onGroupByChange,\n}: FilterBarProps) {\n  const [isCollapsed, setIsCollapsed] = useState(true)\n\n  const handleSearchChange = useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>) => {\n      onFiltersChange({ search: e.target.value })\n    },\n    [onFiltersChange]\n  )\n\n  const handleDateFilterChange = useCallback(\n    (e: React.ChangeEvent<HTMLSelectElement>) => {\n      onFiltersChange({ dateFilter: e.target.value as any })\n    },\n    [onFiltersChange]\n  )\n\n  const handleSortChange = useCallback(\n    (e: React.ChangeEvent<HTMLSelectElement>) => {\n      onSortChange({ by: e.target.value as SortBy })\n    },\n    [onSortChange]\n  )\n\n  const handleSortOrderToggle = useCallback(() => {\n    onSortChange({ order: sort.order === 'asc' ? 'desc' : 'asc' })\n  }, [sort.order, onSortChange])\n\n  const hasActiveFilters =\n    filters.search ||\n    filters.dateFilter !== 'all' ||\n    filters.priorities.length > 0 ||\n    filters.assignees.length > 0 ||\n    filters.labels.length > 0 ||\n    sort.by !== 'none'\n\n  return (\n    <div\n      className={`filter-bar ${compact ? 'filter-bar--compact' : ''} ${isCollapsed ? 'filter-bar--collapsed' : ''}`}\n    >\n      <div\n        className=\"filter-bar__header\"\n        onClick={() => setIsCollapsed(!isCollapsed)}\n        style={{\n          cursor: 'pointer',\n          display: 'flex',\n          alignItems: 'center',\n          gap: '8px',\n          marginBottom: isCollapsed ? '0' : '12px',\n          padding: '4px 6px',\n          borderRadius: '6px',\n          transition: 'all 0.2s ease',\n        }}\n        onMouseEnter={(e) => {\n          e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\n        }}\n        onMouseLeave={(e) => {\n          e.currentTarget.style.backgroundColor = 'transparent'\n        }}\n      >\n        <svg\n          width=\"14\"\n          height=\"14\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth=\"2\"\n          style={{\n            transform: isCollapsed ? 'rotate(-90deg)' : 'rotate(0deg)',\n            transition: 'transform 0.2s',\n            color: 'var(--theme-text-secondary)',\n          }}\n        >\n          <polyline points=\"6 9 12 15 18 9\" />\n        </svg>\n        <span className=\"filter-bar__label\" style={{ fontWeight: 500, fontSize: '0.875rem', color: 'var(--theme-text-primary)' }}>\n          Filters & Grouping\n        </span>\n        {hasActiveFilters && (\n          <span\n            style={{\n              color: 'var(--theme-accent-primary)',\n              fontSize: '0.75rem',\n              fontWeight: 600,\n            }}\n          >\n            ({[filters.search && 'search', filters.dateFilter !== 'all' && 'date', filters.priorities.length > 0 && 'priority', filters.assignees.length > 0 && 'assignee', filters.labels.length > 0 && 'label', sort.by !== 'none' && 'sort'].filter(Boolean).length} active)\n          </span>\n        )}\n      </div>\n\n      {!isCollapsed && (\n        <div className=\"filter-bar__content\">\n          {showQuickFilters && (\n            <div className=\"filter-bar__quick\" style={{ marginBottom: '12px' }}>\n              <span className=\"filter-bar__label\">Quick:</span>\n              {onFilterMyTasks && (\n                <button\n                  onClick={onFilterMyTasks}\n                  className=\"filter-bar__quick-btn\"\n                  title=\"Show only my tasks\"\n                >\n                  My Tasks\n                </button>\n              )}\n              {onFilterOverdue && (\n                <button\n                  onClick={onFilterOverdue}\n                  className=\"filter-bar__quick-btn\"\n                  title=\"Show overdue tasks\"\n                >\n                  Overdue\n                </button>\n              )}\n              {onFilterHighPriority && (\n                <button\n                  onClick={onFilterHighPriority}\n                  className=\"filter-bar__quick-btn\"\n                  title=\"Show high priority tasks\"\n                >\n                  High Priority\n                </button>\n              )}\n            </div>\n          )}\n\n          <div className=\"filter-bar__main\">\n            <div className=\"filter-bar__field\">\n              <input\n                type=\"text\"\n                placeholder=\"Search tasks...\"\n                value={filters.search}\n                onChange={handleSearchChange}\n                className=\"filter-bar__search\"\n              />\n            </div>\n\n            <div className=\"filter-bar__field\">\n              <select\n                value={filters.dateFilter}\n                onChange={handleDateFilterChange}\n                className=\"filter-bar__select\"\n              >\n                <option value=\"all\">All Dates</option>\n                <option value=\"overdue\">Overdue</option>\n                <option value=\"today\">Today</option>\n                <option value=\"this-week\">This Week</option>\n              </select>\n            </div>\n\n            <div className=\"filter-bar__field\">\n              <select\n                value={filters.priorities[0] || 'all'}\n                onChange={(e) => {\n                  const value = e.target.value\n                  onFiltersChange({\n                    priorities: value === 'all' ? [] : [value as Priority],\n                  })\n                }}\n                className=\"filter-bar__select\"\n              >\n                <option value=\"all\">All Priorities</option>\n                {PRIORITY_OPTIONS.map((priority) => (\n                  <option key={priority} value={priority}>\n                    {priority}\n                  </option>\n                ))}\n              </select>\n            </div>\n\n            {availableUsers.length > 0 && (\n              <div className=\"filter-bar__field\">\n                <select\n                  value={filters.assignees[0] || 'all'}\n                  onChange={(e) => {\n                    const value = e.target.value\n                    onFiltersChange({\n                      assignees: value === 'all' ? [] : [value],\n                    })\n                  }}\n                  className=\"filter-bar__select\"\n                >\n                  <option value=\"all\">All Assignees</option>\n                  {availableUsers.map((user) => (\n                    <option key={user.id} value={user.id}>\n                      {user.name}\n                    </option>\n                  ))}\n                </select>\n              </div>\n            )}\n\n            {availableLabels.length > 0 && (\n              <div className=\"filter-bar__field\">\n                <select\n                  value={filters.labels[0] || 'all'}\n                  onChange={(e) => {\n                    const value = e.target.value\n                    onFiltersChange({\n                      labels: value === 'all' ? [] : [value],\n                    })\n                  }}\n                  className=\"filter-bar__select\"\n                >\n                  <option value=\"all\">All Labels</option>\n                  {availableLabels.map((label) => (\n                    <option key={label} value={label}>\n                      {label}\n                    </option>\n                  ))}\n                </select>\n              </div>\n            )}\n\n            <div className=\"filter-bar__field filter-bar__sort\">\n              <span className=\"filter-bar__label\" style={{ color: 'var(--theme-text-secondary)' }}>Sort:</span>\n              <select\n                value={sort.by}\n                onChange={handleSortChange}\n                className=\"filter-bar__select filter-bar__select--sm\"\n              >\n                {SORT_OPTIONS.map((option) => (\n                  <option key={option.value} value={option.value}>\n                    {option.label}\n                  </option>\n                ))}\n              </select>\n              {sort.by !== 'none' && (\n                <button\n                  onClick={handleSortOrderToggle}\n                  className=\"filter-bar__sort-toggle\"\n                  title={`Sort ${sort.order === 'asc' ? 'descending' : 'ascending'}`}\n                >\n                  {sort.order === 'asc' ? '↑' : '↓'}\n                </button>\n              )}\n            </div>\n\n            {onGroupByChange && (\n              <div className=\"filter-bar__field\">\n                <select\n                  value={groupBy}\n                  onChange={(e) => onGroupByChange(e.target.value as GroupByOption)}\n                  className=\"filter-bar__select\"\n                  style={{\n                    fontWeight: 500,\n                    borderWidth: '2px',\n                  }}\n                >\n                  {GROUPBY_OPTIONS.map((option) => (\n                    <option key={option.value} value={option.value}>\n                      {option.label}\n                    </option>\n                  ))}\n                </select>\n              </div>\n            )}\n\n            {hasActiveFilters && (\n              <button\n                onClick={onReset}\n                className=\"filter-bar__reset\"\n                title=\"Clear all filters\"\n              >\n                Clear\n              </button>\n            )}\n          </div>\n        </div>\n      )}\n    </div>\n  )\n}\n","import { useState, useRef, useEffect } from 'react'\nimport { cn } from '../../utils'\n\nexport interface ConfigMenuProps {\n  onOpenExport: () => void\n  onOpenThemes: () => void\n  onOpenShortcuts: () => void\n  className?: string\n  // v0.8.1: Gantt-specific exports\n  viewMode?: 'kanban' | 'gantt'\n  onExportGanttPDF?: () => Promise<void>\n  onExportGanttExcel?: () => Promise<void>\n  onExportGanttPNG?: () => Promise<void>\n  onExportGanttCSV?: () => void\n}\n\nexport function ConfigMenu({\n  onOpenExport,\n  onOpenThemes,\n  onOpenShortcuts,\n  className,\n  viewMode = 'kanban',\n  onExportGanttPDF,\n  onExportGanttExcel,\n  onExportGanttPNG,\n  onExportGanttCSV,\n}: ConfigMenuProps) {\n  const [isOpen, setIsOpen] = useState(false)\n  const menuRef = useRef<HTMLDivElement>(null)\n\n  useEffect(() => {\n    const handleClickOutside = (event: MouseEvent) => {\n      if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n        setIsOpen(false)\n      }\n    }\n\n    if (isOpen) {\n      document.addEventListener('mousedown', handleClickOutside)\n    }\n\n    return () => {\n      document.removeEventListener('mousedown', handleClickOutside)\n    }\n  }, [isOpen])\n\n  const handleItemClick = (action: () => void) => {\n    action()\n    setIsOpen(false)\n  }\n\n  return (\n    <div className={cn('relative', className)} ref={menuRef}>\n      <button\n        onClick={() => setIsOpen(!isOpen)}\n        className=\"flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium transition-all border\"\n        style={{\n          backgroundColor: 'var(--theme-bg-secondary)',\n          borderColor: 'var(--theme-border-primary)',\n          color: 'var(--theme-text-secondary)'\n        }}\n        onMouseEnter={(e) => {\n          e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\n          e.currentTarget.style.color = 'var(--theme-text-primary)'\n        }}\n        onMouseLeave={(e) => {\n          e.currentTarget.style.backgroundColor = 'var(--theme-bg-secondary)'\n          e.currentTarget.style.color = 'var(--theme-text-secondary)'\n        }}\n        aria-label=\"Configuration Menu\"\n        aria-expanded={isOpen}\n      >\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n          <circle cx=\"12\" cy=\"12\" r=\"3\" />\n          <path d=\"M12 1v6m0 6v6M5.6 5.6l4.2 4.2m4.2 4.2l4.2 4.2M1 12h6m6 0h6M5.6 18.4l4.2-4.2m4.2-4.2l4.2-4.2\" />\n        </svg>\n        <span>Config</span>\n      </button>\n\n      {isOpen && (\n        <div\n          className=\"absolute right-0 mt-2 w-48 rounded-lg border shadow-lg overflow-hidden z-50\"\n          style={{\n            backgroundColor: 'var(--theme-bg-secondary)',\n            borderColor: 'var(--theme-border-primary)',\n          }}\n        >\n          {/* v0.8.1: Show different export options based on view mode */}\n          {viewMode === 'kanban' ? (\n            <button\n              onClick={() => handleItemClick(onOpenExport)}\n              className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\n              style={{ color: 'var(--theme-text-primary)' }}\n              onMouseEnter={(e) => {\n                e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\n              }}\n              onMouseLeave={(e) => {\n                e.currentTarget.style.backgroundColor = 'transparent'\n              }}\n            >\n              <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n                <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3\" />\n              </svg>\n              Export\n            </button>\n          ) : (\n            <>\n              <button\n                onClick={() => handleItemClick(async () => await onExportGanttPDF?.())}\n                className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\n                style={{ color: 'var(--theme-text-primary)' }}\n                onMouseEnter={(e) => {\n                  e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\n                }}\n                onMouseLeave={(e) => {\n                  e.currentTarget.style.backgroundColor = 'transparent'\n                }}\n              >\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n                  <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n                  <polyline points=\"14 2 14 8 20 8\" />\n                  <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n                  <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n                  <polyline points=\"10 9 9 9 8 9\" />\n                </svg>\n                Export PDF\n              </button>\n              <button\n                onClick={() => handleItemClick(async () => await onExportGanttExcel?.())}\n                className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\n                style={{ color: 'var(--theme-text-primary)' }}\n                onMouseEnter={(e) => {\n                  e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\n                }}\n                onMouseLeave={(e) => {\n                  e.currentTarget.style.backgroundColor = 'transparent'\n                }}\n              >\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n                  <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n                  <polyline points=\"14 2 14 8 20 8\" />\n                  <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"12\" />\n                  <line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\" />\n                </svg>\n                Export Excel\n              </button>\n              <button\n                onClick={() => handleItemClick(async () => await onExportGanttPNG?.())}\n                className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\n                style={{ color: 'var(--theme-text-primary)' }}\n                onMouseEnter={(e) => {\n                  e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\n                }}\n                onMouseLeave={(e) => {\n                  e.currentTarget.style.backgroundColor = 'transparent'\n                }}\n              >\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n                  <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n                  <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n                  <polyline points=\"21 15 16 10 5 21\" />\n                </svg>\n                Export PNG\n              </button>\n              <button\n                onClick={() => handleItemClick(() => onExportGanttCSV?.())}\n                className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\n                style={{ color: 'var(--theme-text-primary)' }}\n                onMouseEnter={(e) => {\n                  e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\n                }}\n                onMouseLeave={(e) => {\n                  e.currentTarget.style.backgroundColor = 'transparent'\n                }}\n              >\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n                  <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n                  <polyline points=\"14 2 14 8 20 8\" />\n                  <line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\" />\n                  <line x1=\"8\" y1=\"17\" x2=\"16\" y2=\"17\" />\n                </svg>\n                Export CSV\n              </button>\n            </>\n          )}\n\n          <button\n            onClick={() => handleItemClick(onOpenThemes)}\n            className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\n            style={{ color: 'var(--theme-text-primary)' }}\n            onMouseEnter={(e) => {\n              e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\n            }}\n            onMouseLeave={(e) => {\n              e.currentTarget.style.backgroundColor = 'transparent'\n            }}\n          >\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n              <circle cx=\"12\" cy=\"12\" r=\"5\" />\n              <path d=\"M12 1v6m0 6v6m8.5-8.5L17 15M7 9L3.5 5.5M7 15l-3.5 3.5M20.5 5.5L17 9m3.5 11.5L17 17\" />\n            </svg>\n            Themes\n          </button>\n\n          <button\n            onClick={() => handleItemClick(onOpenShortcuts)}\n            className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\n            style={{ color: 'var(--theme-text-primary)' }}\n            onMouseEnter={(e) => {\n              e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\n            }}\n            onMouseLeave={(e) => {\n              e.currentTarget.style.backgroundColor = 'transparent'\n            }}\n          >\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n              <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n              <path d=\"M6 8h.01M10 8h.01M14 8h.01M18 8h.01M8 12h.01M12 12h.01M16 12h.01M7 16h10\" />\n            </svg>\n            Shortcuts\n          </button>\n        </div>\n      )}\n    </div>\n  )\n}\n","/**\r\n * Theme Definitions\r\n * ASAKAA v0.5.0 - Elite Theming System\r\n */\r\n\r\nimport type { Theme, ThemeName } from './types'\r\n\r\n/**\r\n * DARK THEME (Enhanced) - DEFAULT\r\n * Philosophy: Speed, efficiency, focus\r\n * Optimized for developer productivity\r\n */\r\nexport const darkTheme: Theme = {\r\n  name: 'dark',\r\n  displayName: 'Dark (Enhanced)',\r\n  emoji: '🌙',\r\n  colors: {\r\n    // Background colors\r\n    bgPrimary: '#222326',\r\n    bgSecondary: '#2A2B2F',\r\n    bgTertiary: '#33343A',\r\n    bgCard: '#2d2d2d',\r\n    bgHover: '#353535',\r\n    bgActive: '#404040',\r\n    bgInput: '#2a2a2a',\r\n\r\n    // Text colors\r\n    textPrimary: '#F4F5F8',\r\n    textSecondary: '#AEB6C0',\r\n    textTertiary: '#7A7F8A',\r\n    textDisabled: '#606060',\r\n    textInverse: '#1a1a1a',\r\n\r\n    // Border colors\r\n    borderPrimary: 'rgba(255, 255, 255, 0.1)',\r\n    borderSecondary: 'rgba(255, 255, 255, 0.05)',\r\n    borderDefault: '#404040',\r\n    borderHover: '#505050',\r\n    borderSubtle: '#2a2a2a',\r\n\r\n    // Interactive colors\r\n    accentPrimary: '#5E6AD2',\r\n    accentHover: '#7780DD',\r\n    interactivePrimary: '#0ea5e9',\r\n    interactivePrimaryHover: '#0284c7',\r\n    interactivePrimaryBorder: 'rgba(14, 165, 233, 0.3)',\r\n    interactivePrimaryBackground: 'rgba(14, 165, 233, 0.1)',\r\n    interactivePrimaryBackgroundHover: 'rgba(14, 165, 233, 0.2)',\r\n\r\n    // Status colors\r\n    success: '#10B981',\r\n    warning: '#F59E0B',\r\n    error: '#EF4444',\r\n    info: '#00E5CC',\r\n    danger: '#ef4444',\r\n    dangerBorder: 'rgba(239, 68, 68, 0.3)',\r\n    dangerBackground: 'rgba(239, 68, 68, 0.1)',\r\n    dangerBackgroundHover: 'rgba(239, 68, 68, 0.2)',\r\n  },\r\n  shadows: {\r\n    sm: '0 1px 2px rgba(0, 0, 0, 0.3)',\r\n    md: '0 4px 12px rgba(0, 0, 0, 0.4)',\r\n    lg: '0 12px 32px rgba(0, 0, 0, 0.5)',\r\n  },\r\n  radii: {\r\n    sm: '6px',\r\n    md: '8px',\r\n    lg: '12px',\r\n    full: '9999px',\r\n  },\r\n  spacing: {\r\n    xs: '4px',\r\n    sm: '8px',\r\n    md: '16px',\r\n    lg: '24px',\r\n    xl: '32px',\r\n  },\r\n}\r\n\r\n/**\r\n * LIGHT THEME (Accessible Standard)\r\n * Philosophy: Clarity, legibility, professionalism\r\n * WCAG AAA compliant (7:1 contrast)\r\n */\r\nexport const lightTheme: Theme = {\r\n  name: 'light',\r\n  displayName: 'Light (Standard)',\r\n  emoji: '☀️',\r\n  colors: {\r\n    // Background colors\r\n    bgPrimary: '#FFFFFF',\r\n    bgSecondary: '#F7F7F8',\r\n    bgTertiary: '#EEEFF1',\r\n    bgCard: '#ffffff',\r\n    bgHover: '#f3f4f6',\r\n    bgActive: '#e5e7eb',\r\n    bgInput: '#f9fafb',\r\n\r\n    // Text colors\r\n    textPrimary: '#1A1A1A',\r\n    textSecondary: '#5A5A5A',\r\n    textTertiary: '#8A8A8A',\r\n    textDisabled: '#d1d5db',\r\n    textInverse: '#ffffff',\r\n\r\n    // Border colors\r\n    borderPrimary: 'rgba(0, 0, 0, 0.1)',\r\n    borderSecondary: 'rgba(0, 0, 0, 0.05)',\r\n    borderDefault: '#e5e7eb',\r\n    borderHover: '#d1d5db',\r\n    borderSubtle: '#f3f4f6',\r\n\r\n    // Interactive colors\r\n    accentPrimary: '#5E6AD2',\r\n    accentHover: '#4A56B8',\r\n    interactivePrimary: '#0ea5e9',\r\n    interactivePrimaryHover: '#0284c7',\r\n    interactivePrimaryBorder: 'rgba(14, 165, 233, 0.3)',\r\n    interactivePrimaryBackground: 'rgba(14, 165, 233, 0.08)',\r\n    interactivePrimaryBackgroundHover: 'rgba(14, 165, 233, 0.15)',\r\n\r\n    // Status colors\r\n    success: '#059669',\r\n    warning: '#D97706',\r\n    error: '#DC2626',\r\n    info: '#00E5CC',\r\n    danger: '#dc2626',\r\n    dangerBorder: 'rgba(220, 38, 38, 0.3)',\r\n    dangerBackground: 'rgba(220, 38, 38, 0.08)',\r\n    dangerBackgroundHover: 'rgba(220, 38, 38, 0.15)',\r\n  },\r\n  shadows: {\r\n    sm: '0 1px 3px rgba(0, 0, 0, 0.12)',\r\n    md: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n    lg: '0 12px 32px rgba(0, 0, 0, 0.2)',\r\n  },\r\n  radii: {\r\n    sm: '6px',\r\n    md: '8px',\r\n    lg: '12px',\r\n    full: '9999px',\r\n  },\r\n  spacing: {\r\n    xs: '4px',\r\n    sm: '8px',\r\n    md: '16px',\r\n    lg: '24px',\r\n    xl: '32px',\r\n  },\r\n}\r\n\r\n/**\r\n * NEUTRAL THEME (Zen Mode)\r\n * Philosophy: Minimalism, calm technology, maximum concentration\r\n * Strictly monochromatic - states communicated via icons/typography\r\n */\r\nexport const neutralTheme: Theme = {\r\n  name: 'neutral',\r\n  emoji: '⚪',\r\n  displayName: 'Neutral (Zen)',\r\n  colors: {\r\n    // Background colors - Light neutral tones (matching Gantt neutral theme)\r\n    bgPrimary: '#FAFAF9',\r\n    bgSecondary: '#F5F5F4',\r\n    bgTertiary: '#E7E5E4',\r\n    bgCard: '#FEFEFE',\r\n    bgHover: '#F0EFEE',\r\n    bgActive: '#E7E5E4',\r\n    bgInput: '#FAFAF9',\r\n\r\n    // Text colors\r\n    textPrimary: '#1C1917',\r\n    textSecondary: '#57534E',\r\n    textTertiary: '#A8A29E',\r\n    textDisabled: '#D6D3D1',\r\n    textInverse: '#FAFAF9',\r\n\r\n    // Border colors\r\n    borderPrimary: '#E7E5E4',\r\n    borderSecondary: '#F0EFEE',\r\n    borderDefault: '#E7E5E4',\r\n    borderHover: '#D6D3D1',\r\n    borderSubtle: '#F5F5F4',\r\n\r\n    // Interactive colors - Neutral with subtle accents\r\n    accentPrimary: '#292524',\r\n    accentHover: '#44403C',\r\n    interactivePrimary: '#292524',\r\n    interactivePrimaryHover: '#44403C',\r\n    interactivePrimaryBorder: 'rgba(41, 37, 36, 0.3)',\r\n    interactivePrimaryBackground: 'rgba(41, 37, 36, 0.06)',\r\n    interactivePrimaryBackgroundHover: 'rgba(41, 37, 36, 0.12)',\r\n\r\n    // Status colors (minimal in Zen mode)\r\n    success: '#15803D',\r\n    warning: '#CA8A04',\r\n    error: '#B91C1C',\r\n    info: '#1D4ED8',\r\n    danger: '#B91C1C',\r\n    dangerBorder: 'rgba(185, 28, 28, 0.3)',\r\n    dangerBackground: 'rgba(185, 28, 28, 0.08)',\r\n    dangerBackgroundHover: 'rgba(185, 28, 28, 0.15)',\r\n  },\r\n  shadows: {\r\n    sm: '0 1px 3px rgba(0, 0, 0, 0.1)',\r\n    md: '0 4px 12px rgba(0, 0, 0, 0.12)',\r\n    lg: '0 12px 32px rgba(0, 0, 0, 0.15)',\r\n  },\r\n  radii: {\r\n    sm: '6px',\r\n    md: '8px',\r\n    lg: '12px',\r\n    full: '9999px',\r\n  },\r\n  spacing: {\r\n    xs: '4px',\r\n    sm: '8px',\r\n    md: '16px',\r\n    lg: '24px',\r\n    xl: '32px',\r\n  },\r\n}\r\n\r\n/**\r\n * All themes registry\r\n */\r\nexport const themes: Record<ThemeName, Theme> = {\r\n  dark: darkTheme,\r\n  light: lightTheme,\r\n  neutral: neutralTheme,\r\n}\r\n\r\n/**\r\n * Default theme\r\n */\r\nexport const defaultTheme: ThemeName = 'dark'\r\n","/**\n * Theme Provider\n * ASAKAA v0.5.0\n */\n\nimport { createContext, useContext, useEffect, useState, useCallback, type ReactNode } from 'react'\nimport type { ThemeName, ThemeContextValue } from './types'\nimport { themes, defaultTheme } from './themes'\n\nexport const ThemeContext = createContext<ThemeContextValue | undefined>(undefined)\n\nconst STORAGE_KEY = 'asakaa-theme'\n\nexport interface ThemeProviderProps {\n  children: ReactNode\n  defaultTheme?: ThemeName\n  storageKey?: string\n}\n\nexport function ThemeProvider({\n  children,\n  defaultTheme: initialTheme = defaultTheme,\n  storageKey = STORAGE_KEY,\n}: ThemeProviderProps) {\n  const [theme, setThemeState] = useState<ThemeName>(() => {\n    // Try to load from localStorage\n    if (typeof window !== 'undefined') {\n      const stored = localStorage.getItem(storageKey)\n      if (stored && (stored === 'dark' || stored === 'light' || stored === 'neutral')) {\n        return stored as ThemeName\n      }\n    }\n    return initialTheme\n  })\n\n  const setTheme = useCallback(\n    (newTheme: ThemeName) => {\n      setThemeState(newTheme)\n      if (typeof window !== 'undefined') {\n        localStorage.setItem(storageKey, newTheme)\n      }\n    },\n    [storageKey]\n  )\n\n  // Apply theme to document\n  useEffect(() => {\n    if (typeof window === 'undefined') return\n\n    const root = document.documentElement\n    const currentTheme = themes[theme]\n\n    // DUAL SYSTEM: Generate BOTH --theme-* AND --asakaa-color-* variables\n    // This ensures compatibility during migration from old to new system\n\n    // 1. Generate --theme-* variables (legacy compatibility)\n    Object.entries(currentTheme.colors).forEach(([key, value]) => {\n      if (value) {\n        root.style.setProperty(`--theme-${camelToKebab(key)}`, value)\n      }\n    })\n\n    // 2. Generate --asakaa-color-* variables (new system - following tokens.css naming)\n    const colorMap: Record<string, string> = {\n      // Background\n      bgPrimary: '--asakaa-color-background-primary',\n      bgSecondary: '--asakaa-color-background-secondary',\n      bgTertiary: '--asakaa-color-background-tertiary',\n      bgCard: '--asakaa-color-background-card',\n      bgHover: '--asakaa-color-background-hover',\n      bgActive: '--asakaa-color-background-active',\n      bgInput: '--asakaa-color-background-input',\n\n      // Text\n      textPrimary: '--asakaa-color-text-primary',\n      textSecondary: '--asakaa-color-text-secondary',\n      textTertiary: '--asakaa-color-text-tertiary',\n      textDisabled: '--asakaa-color-text-disabled',\n      textInverse: '--asakaa-color-text-inverse',\n\n      // Border\n      borderPrimary: '--asakaa-color-border-primary',\n      borderSecondary: '--asakaa-color-border-secondary',\n      borderDefault: '--asakaa-color-border-default',\n      borderHover: '--asakaa-color-border-hover',\n      borderSubtle: '--asakaa-color-border-subtle',\n\n      // Interactive\n      accentPrimary: '--asakaa-color-accent-primary',\n      accentHover: '--asakaa-color-accent-hover',\n      interactivePrimary: '--asakaa-color-interactive-primary',\n      interactivePrimaryHover: '--asakaa-color-interactive-primaryHover',\n      interactivePrimaryBorder: '--asakaa-color-interactive-primaryBorder',\n      interactivePrimaryBackground: '--asakaa-color-interactive-primaryBackground',\n      interactivePrimaryBackgroundHover: '--asakaa-color-interactive-primaryBackgroundHover',\n\n      // Status & Danger\n      success: '--asakaa-color-status-success',\n      warning: '--asakaa-color-status-warning',\n      error: '--asakaa-color-status-error',\n      info: '--asakaa-color-status-info',\n      danger: '--asakaa-color-danger',\n      dangerBorder: '--asakaa-color-danger-border',\n      dangerBackground: '--asakaa-color-danger-background',\n      dangerBackgroundHover: '--asakaa-color-danger-backgroundHover',\n    }\n\n    Object.entries(colorMap).forEach(([themeKey, cssVar]) => {\n      const value = currentTheme.colors[themeKey as keyof typeof currentTheme.colors]\n      if (value) {\n        root.style.setProperty(cssVar, value)\n      }\n    })\n\n    // 3. Set data-theme attribute for CSS selectors\n    root.setAttribute('data-theme', theme)\n\n    // 4. Set class for backward compatibility\n    root.classList.remove('theme-dark', 'theme-light', 'theme-neutral')\n    root.classList.add(`theme-${theme}`)\n  }, [theme])\n\n  const value: ThemeContextValue = {\n    theme,\n    setTheme,\n    themes,\n  }\n\n  return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n}\n\n/**\n * Hook to access theme context\n */\nexport function useTheme() {\n  const context = useContext(ThemeContext)\n  if (!context) {\n    throw new Error('useTheme must be used within ThemeProvider')\n  }\n  return context\n}\n\n/**\n * Utility: Convert camelCase to kebab-case\n */\nfunction camelToKebab(str: string): string {\n  return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()\n}\n","import { useTheme } from '../../theme/ThemeProvider'\r\nimport { themes } from '../../theme/themes'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface ThemeModalProps {\r\n  isOpen: boolean\r\n  onClose: () => void\r\n  className?: string\r\n}\r\n\r\nexport function ThemeModal({ isOpen, onClose, className }: ThemeModalProps) {\r\n  const { theme, setTheme } = useTheme()\r\n\r\n  if (!isOpen) return null\r\n\r\n  return (\r\n    <div className={cn('fixed inset-0 z-[9999] flex items-center justify-center', className)}>\r\n      <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" onClick={onClose} />\r\n\r\n      <div\r\n        className=\"relative rounded-2xl border shadow-2xl max-w-md w-full mx-4\"\r\n        style={{\r\n          backgroundColor: 'var(--theme-bg-secondary)',\r\n          borderColor: 'var(--theme-border-primary)',\r\n        }}\r\n      >\r\n        <div className=\"px-6 py-5 border-b flex items-center justify-between\" style={{ borderColor: 'var(--theme-border-primary)' }}>\r\n          <h2 className=\"text-2xl font-bold\" style={{ color: 'var(--theme-text-primary)' }}>\r\n            Select Theme\r\n          </h2>\r\n          <button\r\n            onClick={onClose}\r\n            className=\"text-2xl leading-none p-2 hover:bg-white/10 rounded-lg transition-colors\"\r\n            style={{ color: 'var(--theme-text-secondary)' }}\r\n            aria-label=\"Close\"\r\n          >\r\n            ×\r\n          </button>\r\n        </div>\r\n\r\n        <div className=\"p-6 space-y-3\">\r\n          {Object.entries(themes).map(([key, themeData]) => (\r\n            <button\r\n              key={key}\r\n              onClick={() => {\r\n                setTheme(key as any)\r\n                onClose()\r\n              }}\r\n              className={cn(\r\n                'w-full p-4 rounded-lg border-2 transition-all flex items-center gap-4',\r\n                theme === key\r\n                  ? 'border-[#00E5CC] bg-[#00E5CC]/20'\r\n                  : 'border-white/20 hover:border-white/40'\r\n              )}\r\n              style={{\r\n                backgroundColor: theme === key ? 'var(--theme-accent-primary)20' : 'transparent',\r\n              }}\r\n            >\r\n              <div className=\"text-3xl\">{themeData.emoji}</div>\r\n              <div className=\"text-left flex-1\">\r\n                <div className=\"font-semibold\" style={{ color: 'var(--theme-text-primary)' }}>\r\n                  {themeData.displayName}\r\n                </div>\r\n                <div className=\"text-xs\" style={{ color: 'var(--theme-text-secondary)' }}>\r\n                  {key === 'dark' && 'Default dark theme with Linear-inspired colors'}\r\n                  {key === 'light' && 'Clean light theme with high contrast'}\r\n                  {key === 'neutral' && 'Monochrome zen theme'}\r\n                </div>\r\n              </div>\r\n              {theme === key && (\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\">\r\n                  <path d=\"M20 6L9 17l-5-5\" />\r\n                </svg>\r\n              )}\r\n            </button>\r\n          ))}\r\n        </div>\r\n      </div>\r\n    </div>\r\n  )\r\n}\r\n","import { GanttTheme } from './types';\r\n\r\nexport const themes: Record<string, GanttTheme> = {\r\n  dark: {\r\n    // Backgrounds — Chronos V2: Ultra-dark base\r\n    bgPrimary: '#050505',\r\n    bgSecondary: '#0A0A0A',\r\n    bgGrid: 'rgba(255, 255, 255, 0.02)',\r\n    bgWeekend: 'rgba(17, 17, 17, 0.4)',\r\n\r\n    // Borders — Chronos V2: Subtle glass borders\r\n    border: 'rgba(255, 255, 255, 0.08)',\r\n    borderLight: 'rgba(255, 255, 255, 0.05)',\r\n\r\n    // Text — Chronos V2: Unified with drawer tokens\r\n    textPrimary: 'rgba(255, 255, 255, 0.92)',\r\n    textSecondary: 'rgba(255, 255, 255, 0.60)',\r\n    textTertiary: 'rgba(255, 255, 255, 0.35)',\r\n\r\n    // Accent & Interactive — Chronos Blue (#00E5CC)\r\n    accent: '#00E5CC',\r\n    accentHover: '#5AADFF',\r\n    accentLight: 'rgba(0, 229, 204, 0.12)',\r\n\r\n    // Task Elements — Chronos blue execution bars\r\n    taskBarPrimary: '#00E5CC',\r\n    taskBarProgress: '#5AADFF',\r\n    taskBarHandle: '#FFFFFF',\r\n\r\n    // Dependencies & Critical Path — Softer Tailwind red\r\n    dependency: '#444444',\r\n    dependencyHover: '#FFFFFF',\r\n    criticalPath: '#EF4444',\r\n    criticalPathLight: 'rgba(239, 68, 68, 0.15)',\r\n\r\n    // Special Elements — Softer red today marker\r\n    today: '#EF4444',\r\n    todayLight: 'rgba(239, 68, 68, 0.08)',\r\n    milestone: '#FFFFFF',\r\n    milestoneLight: 'rgba(255, 255, 255, 0.1)',\r\n\r\n    // Status Colors\r\n    statusTodo: '#666666',\r\n    statusInProgress: '#00E5CC',\r\n    statusCompleted: '#10B981',\r\n\r\n    // Hover & Focus States\r\n    hoverBg: 'rgba(255, 255, 255, 0.04)',\r\n    focusRing: '#00E5CC',\r\n\r\n    // Chronos V2 additions\r\n    dotGrid: 'rgba(255, 255, 255, 0.05)',\r\n    glassHeader: '#0A0A0A',\r\n    glassToolbar: 'rgba(0, 0, 0, 0.4)',\r\n    forecastHud: 'rgba(15, 15, 15, 0.9)',\r\n    neonRedGlow: '0 0 8px rgba(239, 68, 68, 0.25)',\r\n    executionBarBg: 'rgba(0, 229, 204, 0.12)',\r\n  },\r\n  \r\n  light: {\r\n    // Backgrounds\r\n    // v0.17.71: Improved contrast and visual breathing\r\n    bgPrimary: '#FFFFFF',\r\n    bgSecondary: '#F8FAFC',  // Slate 50 - subtle contrast\r\n    bgGrid: '#F1F5F9',  // Slate 100 - more visible zebra stripes\r\n    bgWeekend: 'rgba(0, 196, 174, 0.03)',\r\n\r\n    // Borders - v0.17.71: More visible separation\r\n    border: '#CBD5E1',  // Slate 300 - stronger column dividers\r\n    borderLight: '#E2E8F0',  // Slate 200\r\n\r\n    // Text - v0.17.71: Enhanced hierarchy\r\n    textPrimary: '#0F172A',  // Slate 900 - darkest for phases\r\n    textSecondary: '#334155',  // Slate 700 - for child tasks\r\n    textTertiary: '#64748B',  // Slate 500 - for metadata\r\n\r\n    // Accent & Interactive\r\n    accent: '#00E5CC',\r\n    accentHover: '#1D4ED8',\r\n    accentLight: 'rgba(0, 196, 174, 0.08)',\r\n\r\n    // Task Elements\r\n    taskBarPrimary: '#00E5CC',\r\n    taskBarProgress: '#00A893',\r\n    taskBarHandle: '#FFFFFF',\r\n\r\n    // Dependencies & Critical Path\r\n    // v0.17.361: Solid colors for better visibility\r\n    dependency: '#6B7280',\r\n    dependencyHover: '#00E5CC',  // v0.17.450: Bright blue hover for better visibility\r\n    criticalPath: '#DC2626',\r\n    criticalPathLight: 'rgba(220, 38, 38, 0.1)',\r\n\r\n    // Special Elements - v0.17.180: Exact ClickUp \"Today\" line color\r\n    today: '#D21E24',  // Exact ClickUp red\r\n    todayLight: 'rgba(210, 30, 36, 0.1)',\r\n    milestone: '#F59E0B',\r\n    milestoneLight: 'rgba(245, 158, 11, 0.08)',\r\n\r\n    // Status Colors\r\n    statusTodo: '#64748B',  // Slate 500\r\n    statusInProgress: '#00E5CC',\r\n    statusCompleted: '#059669',\r\n\r\n    // Hover & Focus States\r\n    hoverBg: 'rgba(0, 0, 0, 0.04)',\r\n    focusRing: '#00E5CC',\r\n\r\n    // Chronos V2 additions (light-mode equivalents)\r\n    dotGrid: 'rgba(0, 0, 0, 0.04)',\r\n    glassHeader: '#F8FAFC',\r\n    glassToolbar: 'rgba(255, 255, 255, 0.85)',\r\n    forecastHud: 'rgba(248, 250, 252, 0.95)',\r\n    neonRedGlow: '0 0 10px rgba(220, 38, 38, 0.3)',\r\n    executionBarBg: 'rgba(0, 196, 174, 0.28)',\r\n  },\r\n\r\n  neutral: {\r\n    // Backgrounds\r\n    // v0.17.71: Improved contrast and visual breathing\r\n    bgPrimary: '#FAFAF9',\r\n    bgSecondary: '#F5F5F4',\r\n    bgGrid: '#EFEDEC',  // v0.17.71: More visible zebra stripes\r\n    bgWeekend: 'rgba(41, 37, 36, 0.02)',\r\n\r\n    // Borders - v0.17.71: More visible separation\r\n    border: '#D6D3D1',  // Stone 300 - visible column dividers\r\n    borderLight: '#E7E5E4',  // Stone 200\r\n\r\n    // Text - v0.17.71: Enhanced hierarchy\r\n    textPrimary: '#0C0A09',  // Stone 950 - maximum contrast for phases\r\n    textSecondary: '#44403C',  // Stone 700 - for child tasks\r\n    textTertiary: '#78716C',  // Stone 500 - for metadata\r\n\r\n    // Accent & Interactive\r\n    accent: '#292524',\r\n    accentHover: '#44403C',\r\n    accentLight: 'rgba(41, 37, 36, 0.08)',\r\n\r\n    // Task Elements\r\n    taskBarPrimary: '#292524',\r\n    taskBarProgress: '#1C1917',\r\n    taskBarHandle: '#FFFFFF',\r\n\r\n    // Dependencies & Critical Path\r\n    // v0.17.361: Solid colors for better visibility\r\n    dependency: '#78716C',\r\n    dependencyHover: '#A8A29E',  // v0.17.450: Lighter stone hover for better visibility\r\n    criticalPath: '#44403C',  // Dark gray instead of red - monochromatic\r\n    criticalPathLight: 'rgba(68, 64, 60, 0.08)',\r\n\r\n    // Special Elements - v0.17.71: Darker \"Today\" line for zen mode\r\n    today: '#1C1917',  // Black - maintains monochrome philosophy\r\n    todayLight: 'rgba(28, 25, 23, 0.06)',\r\n    milestone: '#57534E',  // Medium gray - no yellow\r\n    milestoneLight: 'rgba(87, 83, 78, 0.08)',\r\n\r\n    // Status Colors\r\n    statusTodo: '#78716C',  // Stone 500\r\n    statusInProgress: '#292524',\r\n    statusCompleted: '#15803D',\r\n\r\n    // Hover & Focus States\r\n    hoverBg: 'rgba(0, 0, 0, 0.035)',\r\n    focusRing: '#292524',\r\n\r\n    // Chronos V2 additions (neutral-mode equivalents)\r\n    dotGrid: 'rgba(0, 0, 0, 0.03)',\r\n    glassHeader: '#F5F5F4',\r\n    glassToolbar: 'rgba(250, 250, 249, 0.85)',\r\n    forecastHud: 'rgba(245, 245, 244, 0.95)',\r\n    neonRedGlow: '0 0 10px rgba(68, 64, 60, 0.3)',\r\n    executionBarBg: 'rgba(41, 37, 36, 0.25)',\r\n  },\r\n};","import { GanttTheme } from './types';\nimport { themes } from './themes';\n\n/**\n * Deriva un objeto GanttTheme desde las variables CSS del ThemeProvider global.\n * Si no hay ThemeProvider, retorna el theme especificado o 'dark' por defecto.\n *\n * @param themeName - Nombre del tema ('dark' | 'light' | 'neutral')\n * @returns GanttTheme object con colores derivados de CSS variables\n */\nexport function deriveThemeFromCSS(themeName: 'dark' | 'light' | 'neutral' = 'dark'): GanttTheme {\n  // Si estamos en SSR, retornar theme estático\n  if (typeof window === 'undefined' || typeof getComputedStyle === 'undefined') {\n    return themes[themeName] || themes.dark;\n  }\n\n  // Obtener valores computados de variables CSS\n  const root = document.documentElement;\n  const styles = getComputedStyle(root);\n\n  // Helper para obtener variable CSS con fallback\n  const getVar = (varName: string, fallback: string): string => {\n    const value = styles.getPropertyValue(varName).trim();\n    return value || fallback;\n  };\n\n  // Derivar theme desde variables CSS (sistema --theme-*)\n  const derivedTheme: GanttTheme = {\n    // Backgrounds\n    bgPrimary: getVar('--theme-bg-primary', themes[themeName].bgPrimary),\n    bgSecondary: getVar('--theme-bg-secondary', themes[themeName].bgSecondary),\n    bgGrid: getVar('--theme-bg-card', themes[themeName].bgGrid),\n    bgWeekend: getVar('--theme-bg-hover', themes[themeName].bgWeekend),\n\n    // Borders\n    border: getVar('--theme-border-primary', themes[themeName].border),\n    borderLight: getVar('--theme-border-subtle', themes[themeName].borderLight),\n\n    // Text\n    textPrimary: getVar('--theme-text-primary', themes[themeName].textPrimary),\n    textSecondary: getVar('--theme-text-secondary', themes[themeName].textSecondary),\n    textTertiary: getVar('--theme-text-tertiary', themes[themeName].textTertiary),\n\n    // Accent & Interactive\n    accent: getVar('--theme-accent-primary', themes[themeName].accent),\n    accentHover: getVar('--theme-accent-hover', themes[themeName].accentHover),\n    accentLight: getVar('--theme-accent-primary', themes[themeName].accentLight), // usaremos opacity\n\n    // Task Elements\n    taskBarPrimary: getVar('--theme-accent-primary', themes[themeName].taskBarPrimary),\n    taskBarProgress: getVar('--theme-accent-hover', themes[themeName].taskBarProgress),\n    taskBarHandle: getVar('--theme-text-inverse', themes[themeName].taskBarHandle || '#FFFFFF'),\n\n    // Dependencies & Critical Path\n    dependency: getVar('--theme-border-secondary', themes[themeName].dependency),\n    dependencyHover: getVar('--theme-border-secondary', themes[themeName].dependencyHover),\n    criticalPath: getVar('--theme-error', themes[themeName].criticalPath),\n    criticalPathLight: getVar('--theme-error', themes[themeName].criticalPathLight),\n\n    // Special Elements - Theme-specific today indicator\n    // Light: uses accent (blue), Neutral: uses text primary (black), Dark: custom\n    today: themeName === 'light'\n      ? getVar('--theme-accent-primary', themes[themeName].today)\n      : themeName === 'neutral'\n      ? getVar('--theme-text-primary', themes[themeName].today)\n      : getVar('--theme-error', themes[themeName].today),\n    todayLight: themeName === 'light'\n      ? getVar('--theme-accent-primary', themes[themeName].todayLight)\n      : themeName === 'neutral'\n      ? getVar('--theme-text-primary', themes[themeName].todayLight)\n      : getVar('--theme-error', themes[themeName].todayLight),\n    milestone: getVar('--theme-warning', themes[themeName].milestone),\n    milestoneLight: getVar('--theme-warning', themes[themeName].milestoneLight),\n\n    // Status Colors\n    statusTodo: getVar('--theme-text-tertiary', themes[themeName].statusTodo),\n    statusInProgress: getVar('--theme-accent-primary', themes[themeName].statusInProgress),\n    statusCompleted: getVar('--theme-success', themes[themeName].statusCompleted),\n\n    // Hover & Focus States\n    hoverBg: getVar('--theme-bg-hover', themes[themeName].hoverBg),\n    focusRing: getVar('--theme-accent-primary', themes[themeName].focusRing),\n\n    // Chronos V2 tokens — pass through from static theme (not CSS-derived)\n    ...(themes[themeName].dotGrid && { dotGrid: themes[themeName].dotGrid }),\n    ...(themes[themeName].glassHeader && { glassHeader: themes[themeName].glassHeader }),\n    ...(themes[themeName].glassToolbar && { glassToolbar: themes[themeName].glassToolbar }),\n    ...(themes[themeName].forecastHud && { forecastHud: themes[themeName].forecastHud }),\n    ...(themes[themeName].neonRedGlow && { neonRedGlow: themes[themeName].neonRedGlow }),\n    ...(themes[themeName].executionBarBg && { executionBarBg: themes[themeName].executionBarBg }),\n  };\n\n  return derivedTheme;\n}\n","/**\r\n * Internationalization (i18n) system for GanttBoard\r\n * @version 0.15.0\r\n *\r\n * Supports English (en) and Spanish (es) out of the box.\r\n * Users can provide custom translations via the `locale` config prop.\r\n */\r\n\r\nexport type SupportedLocale = 'en' | 'es';\r\n\r\nexport interface GanttTranslations {\r\n  // Column headers\r\n  columns: {\r\n    taskName: string;\r\n    startDate: string;\r\n    endDate: string;\r\n    duration: string;\r\n    assignees: string;\r\n    status: string;\r\n    progress: string;\r\n    priority: string; // v0.17.29\r\n  };\r\n\r\n  // Toolbar\r\n  toolbar: {\r\n    today: string;\r\n    day: string;\r\n    week: string;\r\n    month: string;\r\n    export: string;\r\n    exportPdf: string;\r\n    exportPng: string;\r\n    exportCsv: string;\r\n    exportExcel: string;\r\n    exportMsProject: string;\r\n    undo: string;\r\n    redo: string;\r\n    createTask: string;\r\n    // v0.16.0: Density dropdown\r\n    density: string;\r\n    compact: string;\r\n    normal: string;\r\n    spacious: string;\r\n    // v0.17.300: Task filter\r\n    filterAll: string;\r\n    filterIncomplete: string;\r\n    filterInProgress: string;\r\n    filterCompleted: string;\r\n    // v0.17.320: Filter dropdown enhancements\r\n    filter: string;\r\n    filterBy: string;\r\n    filterAllDesc: string;\r\n    filterIncompleteDesc: string;\r\n    filterInProgressDesc: string;\r\n    filterCompletedDesc: string;\r\n    clearFilter: string;\r\n    // v0.18.0: Hide completed toggle\r\n    hideCompleted: string;\r\n    toDo: string;\r\n    // v3.0.0: WBS Level selector\r\n    wbsLevel: string;\r\n    wbsAllLevels: string;\r\n    // v3.1.0: Chronos view modes & forecast\r\n    viewExecution: string;\r\n    viewOracle: string;\r\n    simulateScenario: string;\r\n    projectForecast: string;\r\n    expectedFinish: string;\r\n    confidence: string;\r\n    costAtCompletion: string;\r\n    delayLabel: string;\r\n    earlyLabel: string;\r\n    onTimeLabel: string;\r\n    budgetOver: string;\r\n    budgetUnder: string;\r\n    baselines: string;\r\n    visibility: string;\r\n    share: string;\r\n    copySnapshotLink: string;\r\n    copied: string;\r\n    /** 1.9.44 · tooltip del gestor de columnas de la rejilla. */\r\n    columns: string;\r\n  };\r\n\r\n  // v0.16.0: Context menu labels (right-click menu)\r\n  contextMenu: {\r\n    editTask: string;\r\n    addSubtask: string;\r\n    markIncomplete: string;\r\n    setInProgress: string;\r\n    markComplete: string;\r\n    duplicateTask: string;\r\n    splitTask: string;\r\n    deleteTask: string;\r\n  };\r\n\r\n  // Task actions (context menu)\r\n  actions: {\r\n    edit: string;\r\n    delete: string;\r\n    duplicate: string;\r\n    addSubtask: string;\r\n    indent: string;\r\n    outdent: string;\r\n    moveUp: string;\r\n    moveDown: string;\r\n    splitTask: string;\r\n    linkTasks: string;\r\n    unlinkTasks: string;\r\n  };\r\n\r\n  // Status labels\r\n  status: {\r\n    todo: string;\r\n    inProgress: string;\r\n    completed: string;\r\n  };\r\n\r\n  // Tooltips and labels\r\n  labels: {\r\n    progress: string;\r\n    duration: string;\r\n    days: string;\r\n    day: string;\r\n    assigned: string;\r\n    milestone: string;\r\n    criticalPath: string;\r\n    subtask: string;\r\n    task: string;\r\n    noTasks: string;\r\n    addTask: string;\r\n    newTask: string;\r\n    loading: string;\r\n    error: string;\r\n    today: string;\r\n    week: string; // v0.17.400: \"Week\" prefix for timeline headers\r\n    clickToSetDates: string; // v0.17.400: Placeholder for tasks without dates\r\n  };\r\n\r\n  // AI Assistant\r\n  ai: {\r\n    placeholder: string;\r\n    thinking: string;\r\n    suggestions: {\r\n      moveTask: string;\r\n      extendTask: string;\r\n      renameTask: string;\r\n      setProgress: string;\r\n      linkTasks: string;\r\n      createTask: string;\r\n      deleteTask: string;\r\n      assignTask: string;\r\n    };\r\n    errors: {\r\n      taskNotFound: string;\r\n      invalidDate: string;\r\n      invalidDuration: string;\r\n      invalidProgress: string;\r\n      unknownCommand: string;\r\n      processingError: string;\r\n    };\r\n  };\r\n\r\n  // Export\r\n  export: {\r\n    projectName: string;\r\n    ganttTasks: string;\r\n    taskId: string;\r\n    taskName: string;\r\n    startDate: string;\r\n    endDate: string;\r\n    isMilestone: string;\r\n    parentId: string;\r\n    yes: string;\r\n    no: string;\r\n    noTasksToExport: string;\r\n  };\r\n\r\n  // Date formats (for display)\r\n  dateFormat: {\r\n    short: string; // e.g., 'MM/dd' or 'dd/MM'\r\n    medium: string; // e.g., 'MMM d' or 'd MMM'\r\n    long: string; // e.g., 'MMMM d, yyyy' or 'd de MMMM de yyyy'\r\n  };\r\n}\r\n\r\n/**\r\n * English translations (default)\r\n */\r\nexport const en: GanttTranslations = {\r\n  columns: {\r\n    taskName: 'TASK NAME',\r\n    startDate: 'Start Date',\r\n    endDate: 'End Date',\r\n    duration: 'Duration',\r\n    assignees: 'Assignees',\r\n    status: 'Status',\r\n    progress: '% Complete',\r\n    priority: 'Priority', // v0.17.29\r\n  },\r\n\r\n  toolbar: {\r\n    today: 'Today',\r\n    day: 'Day',\r\n    week: 'Week',\r\n    month: 'Month',\r\n    export: 'Export',\r\n    exportPdf: 'Export to PDF',\r\n    exportPng: 'Export to PNG',\r\n    exportCsv: 'Export to CSV',\r\n    exportExcel: 'Export to Excel',\r\n    exportMsProject: 'Export to MS Project',\r\n    undo: 'Undo',\r\n    redo: 'Redo',\r\n    createTask: 'New Task',\r\n    // v0.16.0: Density dropdown\r\n    density: 'Row Density',\r\n    compact: 'Compact',\r\n    normal: 'Normal',\r\n    spacious: 'Spacious',\r\n    // v0.17.300: Task filter\r\n    filterAll: 'All',\r\n    filterIncomplete: 'Incomplete',\r\n    filterInProgress: 'In Progress',\r\n    filterCompleted: 'Completed',\r\n    // v0.17.320: Filter dropdown enhancements\r\n    filter: 'Filters',\r\n    filterBy: 'FILTER BY STATUS',\r\n    filterAllDesc: 'Show all tasks',\r\n    filterIncompleteDesc: 'Hide completed tasks',\r\n    filterInProgressDesc: 'Tasks currently being worked on',\r\n    filterCompletedDesc: 'Only show finished tasks',\r\n    clearFilter: 'Clear filter',\r\n    // v0.18.0: Hide completed toggle\r\n    hideCompleted: 'Hide Completed Tasks',\r\n    toDo: 'To Do / Pending',\r\n    // v3.0.0: WBS Level selector\r\n    wbsLevel: 'Level',\r\n    wbsAllLevels: 'All',\r\n    // v3.1.0: Chronos view modes & forecast\r\n    viewExecution: 'Execution',\r\n    viewOracle: 'Pulse View',\r\n    simulateScenario: 'Simulate Scenario',\r\n    projectForecast: 'PROJECT FORECAST',\r\n    expectedFinish: 'Expected Finish',\r\n    confidence: 'Confidence',\r\n    costAtCompletion: 'Cost at Completion',\r\n    delayLabel: 'Delay',\r\n    earlyLabel: 'Early',\r\n    onTimeLabel: 'On Time',\r\n    budgetOver: 'Over',\r\n    budgetUnder: 'Under',\r\n    baselines: 'Baselines',\r\n    visibility: 'Visibility',\r\n    share: 'Share',\r\n    copySnapshotLink: 'Copy Snapshot Link',\r\n    copied: 'Copied!',\r\n    columns: 'Columns',\r\n  },\r\n\r\n  // v0.16.0: Context menu labels (right-click menu)\r\n  contextMenu: {\r\n    editTask: 'Edit Task',\r\n    addSubtask: 'Add Subtask',\r\n    markIncomplete: 'Mark Incomplete',\r\n    setInProgress: 'Set In Progress',\r\n    markComplete: 'Mark Complete',\r\n    duplicateTask: 'Duplicate Task',\r\n    splitTask: 'Split Task',\r\n    deleteTask: 'Delete Task',\r\n  },\r\n\r\n  actions: {\r\n    edit: 'Edit',\r\n    delete: 'Delete',\r\n    duplicate: 'Duplicate',\r\n    addSubtask: 'Add Subtask',\r\n    indent: 'Indent',\r\n    outdent: 'Outdent',\r\n    moveUp: 'Move Up',\r\n    moveDown: 'Move Down',\r\n    splitTask: 'Split Task',\r\n    linkTasks: 'Link Tasks',\r\n    unlinkTasks: 'Unlink Tasks',\r\n  },\r\n\r\n  status: {\r\n    todo: 'To Do',\r\n    inProgress: 'In Progress',\r\n    completed: 'Completed',\r\n  },\r\n\r\n  labels: {\r\n    progress: 'Progress',\r\n    duration: 'Duration',\r\n    days: 'days',\r\n    day: 'day',\r\n    assigned: 'Assigned',\r\n    milestone: 'Milestone',\r\n    criticalPath: 'Critical Path',\r\n    subtask: 'Subtask',\r\n    task: 'Task',\r\n    noTasks: 'No tasks yet',\r\n    addTask: 'Add task',\r\n    newTask: 'New Task',\r\n    loading: 'Loading...',\r\n    error: 'Error',\r\n    today: 'Today',\r\n    week: 'Week', // v0.17.400\r\n    clickToSetDates: 'Click to set dates...', // v0.17.400\r\n  },\r\n\r\n  ai: {\r\n    placeholder: 'Ask AI to edit tasks... (e.g., \"Move Design to next week\")',\r\n    thinking: 'Thinking...',\r\n    suggestions: {\r\n      moveTask: 'Move \"Task Name\" to next Monday',\r\n      extendTask: 'Extend \"Task Name\" by 3 days',\r\n      renameTask: 'Rename \"Old Name\" to \"New Name\"',\r\n      setProgress: 'Set \"Task Name\" progress to 50%',\r\n      linkTasks: 'Link \"Task A\" to \"Task B\"',\r\n      createTask: 'Create a new task called \"New Task\"',\r\n      deleteTask: 'Delete \"Task Name\"',\r\n      assignTask: 'Assign John to \"Task Name\"',\r\n    },\r\n    errors: {\r\n      taskNotFound: 'Task not found',\r\n      invalidDate: 'Invalid date',\r\n      invalidDuration: 'Invalid duration',\r\n      invalidProgress: 'Invalid progress value',\r\n      unknownCommand: 'Unknown command',\r\n      processingError: 'Error processing command',\r\n    },\r\n  },\r\n\r\n  export: {\r\n    projectName: 'Gantt Project',\r\n    ganttTasks: 'Gantt Tasks',\r\n    taskId: 'Task ID',\r\n    taskName: 'Task Name',\r\n    startDate: 'Start Date',\r\n    endDate: 'End Date',\r\n    isMilestone: 'Is Milestone',\r\n    parentId: 'Parent ID',\r\n    yes: 'Yes',\r\n    no: 'No',\r\n    noTasksToExport: 'No tasks available to export',\r\n  },\r\n\r\n  dateFormat: {\r\n    short: 'MM/dd',\r\n    medium: 'MMM d',\r\n    long: 'MMMM d, yyyy',\r\n  },\r\n};\r\n\r\n/**\r\n * Spanish translations\r\n */\r\nexport const es: GanttTranslations = {\r\n  columns: {\r\n    taskName: 'NOMBRE DE TAREA',\r\n    startDate: 'Fecha Inicio',\r\n    endDate: 'Fecha Fin',\r\n    duration: 'Duración',\r\n    assignees: 'Asignados',\r\n    status: 'Estado',\r\n    progress: '% Completado',\r\n    priority: 'Prioridad', // v0.17.29\r\n  },\r\n\r\n  toolbar: {\r\n    today: 'Hoy',\r\n    day: 'Día',\r\n    week: 'Semana',\r\n    month: 'Mes',\r\n    export: 'Exportar',\r\n    exportPdf: 'Exportar a PDF',\r\n    exportPng: 'Exportar a PNG',\r\n    exportCsv: 'Exportar a CSV',\r\n    exportExcel: 'Exportar a Excel',\r\n    exportMsProject: 'Exportar a MS Project',\r\n    undo: 'Deshacer',\r\n    redo: 'Rehacer',\r\n    createTask: 'Nueva Tarea',\r\n    // v0.16.0: Density dropdown\r\n    density: 'Densidad',\r\n    compact: 'Compacto',\r\n    normal: 'Normal',\r\n    spacious: 'Espacioso',\r\n    // v0.17.300: Task filter\r\n    filterAll: 'Todas',\r\n    filterIncomplete: 'Sin completar',\r\n    filterInProgress: 'En progreso',\r\n    filterCompleted: 'Completadas',\r\n    // v0.17.320: Filter dropdown enhancements\r\n    filter: 'Filtros',\r\n    filterBy: 'FILTRAR POR ESTADO',\r\n    filterAllDesc: 'Mostrar todas las tareas',\r\n    filterIncompleteDesc: 'Ocultar tareas completadas',\r\n    filterInProgressDesc: 'Tareas en las que se está trabajando',\r\n    filterCompletedDesc: 'Solo mostrar tareas terminadas',\r\n    clearFilter: 'Limpiar filtro',\r\n    // v0.18.0: Hide completed toggle\r\n    hideCompleted: 'Ocultar Tareas Completadas',\r\n    toDo: 'Por Hacer / Pendiente',\r\n    // v3.0.0: WBS Level selector\r\n    wbsLevel: 'Nivel',\r\n    wbsAllLevels: 'Todos',\r\n    // v3.1.0: Chronos view modes & forecast\r\n    viewExecution: 'Ejecución',\r\n    viewOracle: 'Vista Pulse',\r\n    simulateScenario: 'Simular Escenario',\r\n    projectForecast: 'PRONÓSTICO DEL PROYECTO',\r\n    expectedFinish: 'Fin Estimado',\r\n    confidence: 'Confianza',\r\n    costAtCompletion: 'Costo al Completar',\r\n    delayLabel: 'Retraso',\r\n    earlyLabel: 'Adelanto',\r\n    onTimeLabel: 'A Tiempo',\r\n    budgetOver: 'Excedido',\r\n    budgetUnder: 'Bajo',\r\n    baselines: 'Líneas Base',\r\n    visibility: 'Visibilidad',\r\n    share: 'Compartir',\r\n    copySnapshotLink: 'Copiar enlace de vista',\r\n    copied: '¡Copiado!',\r\n    columns: 'Columnas',\r\n  },\r\n\r\n  // v0.16.0: Context menu labels (right-click menu)\r\n  contextMenu: {\r\n    editTask: 'Editar Tarea',\r\n    addSubtask: 'Agregar Subtarea',\r\n    markIncomplete: 'Marcar Incompleta',\r\n    setInProgress: 'Marcar En Progreso',\r\n    markComplete: 'Marcar Completada',\r\n    duplicateTask: 'Duplicar Tarea',\r\n    splitTask: 'Dividir Tarea',\r\n    deleteTask: 'Eliminar Tarea',\r\n  },\r\n\r\n  actions: {\r\n    edit: 'Editar',\r\n    delete: 'Eliminar',\r\n    duplicate: 'Duplicar',\r\n    addSubtask: 'Agregar Subtarea',\r\n    indent: 'Aumentar Nivel',\r\n    outdent: 'Disminuir Nivel',\r\n    moveUp: 'Mover Arriba',\r\n    moveDown: 'Mover Abajo',\r\n    splitTask: 'Dividir Tarea',\r\n    linkTasks: 'Vincular Tareas',\r\n    unlinkTasks: 'Desvincular Tareas',\r\n  },\r\n\r\n  status: {\r\n    todo: 'Por Hacer',\r\n    inProgress: 'En Progreso',\r\n    completed: 'Completado',\r\n  },\r\n\r\n  labels: {\r\n    progress: 'Progreso',\r\n    duration: 'Duración',\r\n    days: 'días',\r\n    day: 'día',\r\n    assigned: 'Asignado',\r\n    milestone: 'Hito',\r\n    criticalPath: 'Ruta Crítica',\r\n    subtask: 'Subtarea',\r\n    task: 'Tarea',\r\n    noTasks: 'Sin tareas aún',\r\n    addTask: 'Agregar tarea',\r\n    newTask: 'Nueva Tarea',\r\n    loading: 'Cargando...',\r\n    error: 'Error',\r\n    today: 'Hoy',\r\n    week: 'Semana', // v0.17.400\r\n    clickToSetDates: 'Clic para establecer fechas...', // v0.17.400\r\n  },\r\n\r\n  ai: {\r\n    placeholder: 'Pídele a la IA que edite tareas... (ej: \"Mover Diseño a la próxima semana\")',\r\n    thinking: 'Pensando...',\r\n    suggestions: {\r\n      moveTask: 'Mover \"Nombre de Tarea\" al próximo lunes',\r\n      extendTask: 'Extender \"Nombre de Tarea\" por 3 días',\r\n      renameTask: 'Renombrar \"Nombre Anterior\" a \"Nombre Nuevo\"',\r\n      setProgress: 'Establecer progreso de \"Nombre de Tarea\" al 50%',\r\n      linkTasks: 'Vincular \"Tarea A\" con \"Tarea B\"',\r\n      createTask: 'Crear una nueva tarea llamada \"Nueva Tarea\"',\r\n      deleteTask: 'Eliminar \"Nombre de Tarea\"',\r\n      assignTask: 'Asignar a Juan a \"Nombre de Tarea\"',\r\n    },\r\n    errors: {\r\n      taskNotFound: 'Tarea no encontrada',\r\n      invalidDate: 'Fecha inválida',\r\n      invalidDuration: 'Duración inválida',\r\n      invalidProgress: 'Valor de progreso inválido',\r\n      unknownCommand: 'Comando desconocido',\r\n      processingError: 'Error procesando el comando',\r\n    },\r\n  },\r\n\r\n  export: {\r\n    projectName: 'Proyecto Gantt',\r\n    ganttTasks: 'Tareas Gantt',\r\n    taskId: 'ID de Tarea',\r\n    taskName: 'Nombre de Tarea',\r\n    startDate: 'Fecha Inicio',\r\n    endDate: 'Fecha Fin',\r\n    isMilestone: 'Es Hito',\r\n    parentId: 'ID Padre',\r\n    yes: 'Sí',\r\n    no: 'No',\r\n    noTasksToExport: 'No hay tareas disponibles para exportar',\r\n  },\r\n\r\n  dateFormat: {\r\n    short: 'dd/MM',\r\n    medium: 'd MMM',\r\n    long: 'd de MMMM de yyyy',\r\n  },\r\n};\r\n\r\n/**\r\n * All available translations\r\n */\r\nexport const translations: Record<SupportedLocale, GanttTranslations> = {\r\n  en,\r\n  es,\r\n};\r\n\r\n/**\r\n * Get translations for a specific locale\r\n * Falls back to English if locale is not found\r\n */\r\nexport function getTranslations(locale: SupportedLocale | string): GanttTranslations {\r\n  return translations[locale as SupportedLocale] || translations.en;\r\n}\r\n\r\n/**\r\n * Merge custom translations with default translations\r\n * Allows partial overrides while keeping defaults for missing keys\r\n */\r\nexport function mergeTranslations(\r\n  locale: SupportedLocale | string,\r\n  customTranslations?: Partial<GanttTranslations>\r\n): GanttTranslations {\r\n  const base = getTranslations(locale);\r\n\r\n  if (!customTranslations) {\r\n    return base;\r\n  }\r\n\r\n  return {\r\n    columns: { ...base.columns, ...customTranslations.columns },\r\n    toolbar: { ...base.toolbar, ...customTranslations.toolbar },\r\n    contextMenu: { ...base.contextMenu, ...customTranslations.contextMenu }, // v0.16.0\r\n    actions: { ...base.actions, ...customTranslations.actions },\r\n    status: { ...base.status, ...customTranslations.status },\r\n    labels: { ...base.labels, ...customTranslations.labels },\r\n    ai: {\r\n      ...base.ai,\r\n      ...customTranslations.ai,\r\n      suggestions: { ...base.ai.suggestions, ...customTranslations.ai?.suggestions },\r\n      errors: { ...base.ai.errors, ...customTranslations.ai?.errors },\r\n    },\r\n    export: { ...base.export, ...customTranslations.export },\r\n    dateFormat: { ...base.dateFormat, ...customTranslations.dateFormat },\r\n  };\r\n}\r\n","/**\n * GanttI18nContext - Provides translations to all Gantt components\n * @version 0.15.0\n */\n\nimport { createContext, useContext } from 'react';\nimport { GanttTranslations, en } from './i18n';\n\n/**\n * Context for Gantt internationalization\n * Default value is English translations\n */\nexport const GanttI18nContext = createContext<GanttTranslations>(en);\n\n/**\n * Hook to access translations in Gantt components\n * @returns The current translations object\n *\n * @example\n * ```tsx\n * function MyGanttComponent() {\n *   const t = useGanttI18n();\n *   return <button>{t.toolbar.createTask}</button>;\n * }\n * ```\n */\nexport function useGanttI18n(): GanttTranslations {\n  return useContext(GanttI18nContext);\n}\n","import { useState, useRef, useEffect } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { ZoomIn, ZoomOut, Sun, Moon, Palette, Download, FileImage, FileSpreadsheet, FileText, FileJson, ChevronDown, FolderKanban, Plus, Rows3, Check, Filter, CheckCircle2, PlayCircle, Circle, EyeOff, Eye, Share2, Layers, GitBranch, CalendarDays, Zap, Link2 } from 'lucide-react';\r\nimport { TimeScale, Theme, RowDensity, TaskFilterType, ProjectForecast } from './types';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { useGanttI18n } from './GanttI18nContext'; // v0.15.0: i18n\r\n\r\n/**\r\n * v3.0.1: Hook to position dropdown menus via portal at document.body.\r\n * Escapes overflow:clip and stacking context issues.\r\n */\r\nfunction useDropdownPortal(triggerRef: React.RefObject<HTMLElement | null>, isOpen: boolean, align: 'left' | 'right' = 'left', dropdownWidth = 208) {\r\n  const [pos, setPos] = useState({ top: 0, left: 0 });\r\n\r\n  useEffect(() => {\r\n    if (!isOpen || !triggerRef.current) return;\r\n    const rect = triggerRef.current.getBoundingClientRect();\r\n    const top = rect.bottom + 4;\r\n    let left: number;\r\n    if (align === 'right') {\r\n      // Right-align: dropdown's right edge = trigger's right edge\r\n      left = rect.right - dropdownWidth;\r\n    } else {\r\n      left = rect.left;\r\n    }\r\n    // Clamp so dropdown never overflows right edge of viewport\r\n    const PADDING = 8;\r\n    if (left + dropdownWidth > window.innerWidth - PADDING) {\r\n      left = window.innerWidth - PADDING - dropdownWidth;\r\n    }\r\n    if (left < PADDING) left = PADDING;\r\n    setPos({ top, left });\r\n  }, [isOpen, align, triggerRef, dropdownWidth]);\r\n\r\n  return pos;\r\n}\r\n\r\n// Export options configuration\r\nexport interface ExportOption {\r\n  id: string;\r\n  label: string;\r\n  description: string;\r\n  icon: React.ReactNode;\r\n  action: () => void | Promise<void>;\r\n}\r\n\r\ninterface GanttToolbarProps {\r\n  /** 1.9.34 · versión compacta para una cabecera de una fila (ver `toolbarContainer`). */\r\n  enCabecera?: boolean;\r\n  theme: any;\r\n  timeScale: TimeScale;\r\n  onTimeScaleChange: (scale: TimeScale) => void;\r\n  zoom: number;\r\n  onZoomChange: (zoom: number) => void;\r\n  currentTheme: Theme;\r\n  onThemeChange: (theme: Theme) => void;\r\n  rowDensity: RowDensity;\r\n  onRowDensityChange: (density: RowDensity) => void;\r\n  showThemeSelector?: boolean;\r\n  // v0.14.3: Create task button\r\n  showCreateTaskButton?: boolean;\r\n  createTaskLabel?: string;\r\n  onCreateTask?: () => void;\r\n  // v0.17.300: Task filter\r\n  taskFilter?: TaskFilterType;\r\n  onTaskFilterChange?: (filter: TaskFilterType) => void;\r\n  // v0.18.0: Hide completed toggle\r\n  hideCompleted?: boolean;\r\n  onHideCompletedChange?: (hide: boolean) => void;\r\n  // Custom toolbar right content\r\n  toolbarRightContent?: React.ReactNode;\r\n  // v3.0.0: WBS Level selector\r\n  wbsLevel?: number | 'all';\r\n  onWbsLevelChange?: (level: number | 'all') => void;\r\n  maxWbsDepth?: number;\r\n  // v3.0.0: Execution/Oracle view mode toggle\r\n  viewMode?: 'execution' | 'oracle';\r\n  onViewModeChange?: (mode: 'execution' | 'oracle') => void;\r\n  // v3.1.0: Forecast HUD data\r\n  projectForecast?: ProjectForecast;\r\n  // Oculta la barra interna del pronóstico (el consumidor la muestra en otro sitio,\r\n  // p. ej. una barra de áreas propia). Si es true, no se renderiza aunque haya forecast.\r\n  hideForecastHud?: boolean;\r\n  // Export handlers\r\n  onExportPNG?: () => Promise<void>;\r\n  onExportPDF?: () => Promise<void>;\r\n  onExportExcel?: () => Promise<void>;\r\n  onExportCSV?: () => void;\r\n  onExportJSON?: () => void;\r\n  onExportMSProject?: () => void;\r\n  // View Options (eye icon dropdown)\r\n  showCriticalPath?: boolean;\r\n  onShowCriticalPathChange?: (show: boolean) => void;\r\n  showDependencies?: boolean;\r\n  onShowDependenciesChange?: (show: boolean) => void;\r\n  highlightWeekends?: boolean;\r\n  onHighlightWeekendsChange?: (show: boolean) => void;\r\n  showBaseline?: boolean;\r\n  onShowBaselineChange?: (show: boolean) => void;\r\n  // Share dropdown\r\n  onCopySnapshotLink?: () => void;\r\n  // v5.1.0: Disable CPM toggle when no dependencies\r\n  hasDependencies?: boolean;\r\n}\r\n\r\n// Export Dropdown Component\r\ninterface ExportDropdownProps {\r\n  theme: any;\r\n  onExportPNG?: () => Promise<void>;\r\n  onExportPDF?: () => Promise<void>;\r\n  onExportExcel?: () => Promise<void>;\r\n  onExportCSV?: () => void;\r\n  onExportJSON?: () => void;\r\n  onExportMSProject?: () => void;\r\n}\r\n\r\nexport function ExportDropdown({ theme, onExportPNG, onExportPDF, onExportExcel, onExportCSV, onExportJSON, onExportMSProject }: ExportDropdownProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const [isExporting, setIsExporting] = useState<string | null>(null);\r\n  const triggerRef = useRef<HTMLButtonElement>(null);\r\n  const dropdownRef = useRef<HTMLDivElement>(null);\r\n  const t = useGanttI18n(); // v0.15.0: i18n\r\n  const portalPos = useDropdownPortal(triggerRef, isOpen, 'right', 176);\r\n\r\n  // Close dropdown when clicking outside\r\n  useEffect(() => {\r\n    if (!isOpen) return;\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      const target = event.target as Node;\r\n      if (\r\n        triggerRef.current && !triggerRef.current.contains(target) &&\r\n        dropdownRef.current && !dropdownRef.current.contains(target)\r\n      ) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n    document.addEventListener('mousedown', handleClickOutside);\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  const hasAnyExport = onExportPNG || onExportPDF || onExportExcel || onExportCSV || onExportJSON || onExportMSProject;\r\n\r\n  if (!hasAnyExport) return null;\r\n\r\n  const exportOptions = [\r\n    {\r\n      id: 'png',\r\n      label: 'PNG',\r\n      description: 'Image',\r\n      icon: <FileImage className=\"w-4 h-4\" />,\r\n      handler: onExportPNG,\r\n    },\r\n    {\r\n      id: 'pdf',\r\n      label: 'PDF',\r\n      description: 'Document',\r\n      icon: <FileText className=\"w-4 h-4\" />,\r\n      handler: onExportPDF,\r\n    },\r\n    {\r\n      id: 'excel',\r\n      label: 'Excel',\r\n      description: 'Spreadsheet',\r\n      icon: <FileSpreadsheet className=\"w-4 h-4\" />,\r\n      handler: onExportExcel,\r\n    },\r\n    {\r\n      id: 'csv',\r\n      label: 'CSV',\r\n      description: 'Comma-separated',\r\n      icon: <FileText className=\"w-4 h-4\" />,\r\n      handler: onExportCSV,\r\n    },\r\n    {\r\n      id: 'json',\r\n      label: 'JSON',\r\n      description: 'Data',\r\n      icon: <FileJson className=\"w-4 h-4\" />,\r\n      handler: onExportJSON,\r\n    },\r\n    {\r\n      id: 'msproject',\r\n      label: 'MS Project',\r\n      description: 'XML',\r\n      icon: <FolderKanban className=\"w-4 h-4\" />,\r\n      handler: onExportMSProject,\r\n    },\r\n  ].filter(opt => opt.handler);\r\n\r\n  const handleExport = async (id: string, handler: (() => void | Promise<void>) | undefined) => {\r\n    if (!handler) return;\r\n\r\n    setIsExporting(id);\r\n    try {\r\n      await handler();\r\n    } catch (error) {\r\n      console.error(`Export ${id} failed:`, error);\r\n    } finally {\r\n      setIsExporting(null);\r\n      setIsOpen(false);\r\n    }\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <motion.button\r\n        ref={triggerRef}\r\n        onClick={() => setIsOpen(!isOpen)}\r\n        className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg text-[11px] transition-all\"\r\n        style={{\r\n          backgroundColor: isOpen ? theme.accent : theme.bgSecondary,\r\n          border: `1px solid ${isOpen ? theme.accent : theme.borderLight}`,\r\n          color: isOpen ? '#FFFFFF' : theme.textSecondary,\r\n          fontFamily: 'Inter, sans-serif',\r\n          fontWeight: 500,\r\n        }}\r\n        whileHover={{\r\n          scale: 1.02,\r\n          backgroundColor: theme.accent,\r\n          color: '#FFFFFF',\r\n        }}\r\n        whileTap={{ scale: 0.98 }}\r\n      >\r\n        <Download className=\"w-3.5 h-3.5\" />\r\n        <span>{t.toolbar.export}</span>\r\n        <ChevronDown\r\n          className=\"w-3 h-3 transition-transform\"\r\n          style={{ transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)' }}\r\n        />\r\n      </motion.button>\r\n\r\n      {createPortal(\r\n      <AnimatePresence>\r\n        {isOpen && (\r\n          <motion.div\r\n            ref={dropdownRef}\r\n            initial={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            animate={{ opacity: 1, y: 0, scale: 1 }}\r\n            exit={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            transition={{ duration: 0.15, ease: 'easeOut' }}\r\n            className=\"fixed w-44 rounded-xl overflow-hidden\"\r\n            style={{\r\n              top: portalPos.top,\r\n              left: portalPos.left,\r\n              zIndex: 99999,\r\n              backgroundColor: theme.bgPrimary === '#050505' ? 'rgba(10, 10, 10, 0.95)' : theme.bgSecondary,\r\n              border: `1px solid ${theme.bgPrimary === '#050505' ? 'rgba(255,255,255,0.08)' : theme.border}`,\r\n              boxShadow: theme.bgPrimary === '#050505'\r\n                ? '0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255,255,255,0.04)'\r\n                : '0 10px 40px rgba(0, 0, 0, 0.12)',\r\n              backdropFilter: 'blur(16px)',\r\n            }}\r\n          >\r\n            <div className=\"py-1\">\r\n              {exportOptions.map((option, index) => (\r\n                <motion.button\r\n                  key={option.id}\r\n                  onClick={() => handleExport(option.id, option.handler)}\r\n                  disabled={isExporting !== null}\r\n                  className=\"w-full flex items-center gap-2.5 px-3 py-2 text-left transition-all\"\r\n                  style={{\r\n                    backgroundColor: 'transparent',\r\n                    borderBottom: index < exportOptions.length - 1 ? `1px solid ${theme.bgPrimary === '#050505' ? 'rgba(255,255,255,0.06)' : theme.borderLight}` : 'none',\r\n                    fontFamily: 'Inter, sans-serif',\r\n                  }}\r\n                  whileHover={{\r\n                    backgroundColor: theme.bgPrimary === '#050505' ? 'rgba(255,255,255,0.06)' : theme.hoverBg,\r\n                  }}\r\n                  initial={{ opacity: 0, x: -10 }}\r\n                  animate={{ opacity: 1, x: 0 }}\r\n                  transition={{ delay: index * 0.03 }}\r\n                >\r\n                  <div\r\n                    className=\"flex items-center justify-center w-7 h-7 rounded-md\"\r\n                    style={{\r\n                      backgroundColor: theme.accentLight,\r\n                      color: theme.accent,\r\n                    }}\r\n                  >\r\n                    {isExporting === option.id ? (\r\n                      <motion.div\r\n                        animate={{ rotate: 360 }}\r\n                        transition={{ duration: 1, repeat: Infinity, ease: 'linear' }}\r\n                      >\r\n                        <Download className=\"w-3.5 h-3.5\" />\r\n                      </motion.div>\r\n                    ) : (\r\n                      option.icon\r\n                    )}\r\n                  </div>\r\n                  <div className=\"flex-1 min-w-0\">\r\n                    <div\r\n                      className=\"text-[11px] font-medium truncate\"\r\n                      style={{ color: theme.textPrimary }}\r\n                    >\r\n                      {option.label}\r\n                    </div>\r\n                    <div\r\n                      className=\"text-[9px] truncate\"\r\n                      style={{ color: theme.textTertiary }}\r\n                    >\r\n                      {option.description}\r\n                    </div>\r\n                  </div>\r\n                </motion.button>\r\n              ))}\r\n            </div>\r\n          </motion.div>\r\n        )}\r\n      </AnimatePresence>,\r\n      document.body\r\n      )}\r\n    </>\r\n  );\r\n}\r\n\r\n// ─── ShareExportDropdown ─────────────────────────────────────────────────────\r\n// Consolidates Export (PDF, Excel, MS Project) + Share (Copy Snapshot Link)\r\n// under the Share2 icon, replacing both the old Share placeholder and ExportDropdown.\r\n\r\ninterface ShareExportDropdownProps {\r\n  theme: any;\r\n  onExportPNG?: () => Promise<void>;\r\n  onExportPDF?: () => Promise<void>;\r\n  onExportExcel?: () => Promise<void>;\r\n  onExportMSProject?: () => void;\r\n  onCopySnapshotLink?: () => void;\r\n}\r\n\r\nfunction ShareExportDropdown({ theme, onExportPNG, onExportPDF, onExportExcel, onExportMSProject, onCopySnapshotLink }: ShareExportDropdownProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const [isExporting, setIsExporting] = useState<string | null>(null);\r\n  const [copied, setCopied] = useState(false);\r\n  const triggerRef = useRef<HTMLButtonElement>(null);\r\n  const dropdownRef = useRef<HTMLDivElement>(null);\r\n  const t = useGanttI18n();\r\n  const portalPos = useDropdownPortal(triggerRef, isOpen, 'right', 224);\r\n  const isDark = theme.bgPrimary === '#050505' || (theme.bgPrimary || '').charAt(1) === '0';\r\n  const isEs = t.toolbar.visibility === 'Visibilidad';\r\n\r\n  useEffect(() => {\r\n    if (!isOpen) return;\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      const target = event.target as Node;\r\n      if (\r\n        triggerRef.current && !triggerRef.current.contains(target) &&\r\n        dropdownRef.current && !dropdownRef.current.contains(target)\r\n      ) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n    document.addEventListener('mousedown', handleClickOutside);\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  const exportOptions = [\r\n    { id: 'png', label: t.toolbar.exportPng, icon: <FileImage className=\"w-3.5 h-3.5\" />, handler: onExportPNG },\r\n    { id: 'pdf', label: t.toolbar.exportPdf, icon: <FileText className=\"w-3.5 h-3.5\" />, handler: onExportPDF },\r\n    { id: 'excel', label: t.toolbar.exportExcel, icon: <FileSpreadsheet className=\"w-3.5 h-3.5\" />, handler: onExportExcel },\r\n    { id: 'msproject', label: t.toolbar.exportMsProject, icon: <FolderKanban className=\"w-3.5 h-3.5\" />, handler: onExportMSProject },\r\n  ].filter(opt => opt.handler);\r\n\r\n  const handleExport = async (id: string, handler: (() => void | Promise<void>) | undefined) => {\r\n    if (!handler) return;\r\n    setIsExporting(id);\r\n    try {\r\n      await handler();\r\n    } catch (error) {\r\n      console.error(`Export ${id} failed:`, error);\r\n    } finally {\r\n      setIsExporting(null);\r\n      setIsOpen(false);\r\n    }\r\n  };\r\n\r\n  const handleCopyLink = () => {\r\n    onCopySnapshotLink?.();\r\n    setCopied(true);\r\n    setTimeout(() => setCopied(false), 2000);\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <motion.button\r\n        ref={triggerRef}\r\n        onClick={() => setIsOpen(!isOpen)}\r\n        className=\"flex items-center justify-center w-8 h-8 rounded-lg\"\r\n        style={{\r\n          color: isOpen ? theme.accent : theme.textTertiary,\r\n          backgroundColor: isOpen ? theme.accentLight : 'transparent',\r\n        }}\r\n        whileHover={{ color: theme.textPrimary, backgroundColor: theme.hoverBg }}\r\n        title={t.toolbar.share}\r\n      >\r\n        <Share2 className=\"w-4 h-4\" />\r\n      </motion.button>\r\n\r\n      {createPortal(\r\n        <AnimatePresence>\r\n          {isOpen && (\r\n            <motion.div\r\n              ref={dropdownRef}\r\n              initial={{ opacity: 0, y: -8, scale: 0.95 }}\r\n              animate={{ opacity: 1, y: 0, scale: 1 }}\r\n              exit={{ opacity: 0, y: -8, scale: 0.95 }}\r\n              transition={{ duration: 0.15, ease: 'easeOut' }}\r\n              className=\"fixed w-56 rounded-xl overflow-hidden\"\r\n              style={{\r\n                top: portalPos.top,\r\n                left: portalPos.left,\r\n                zIndex: 99999,\r\n                backgroundColor: isDark ? 'rgba(10, 10, 10, 0.95)' : theme.bgSecondary || '#F8FAFC',\r\n                border: `1px solid ${isDark ? 'rgba(255,255,255,0.08)' : theme.border || '#CBD5E1'}`,\r\n                boxShadow: isDark\r\n                  ? '0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255,255,255,0.04)'\r\n                  : '0 10px 40px rgba(0, 0, 0, 0.12)',\r\n                backdropFilter: 'blur(16px)',\r\n              }}\r\n            >\r\n              {/* EXPORT Section */}\r\n              {exportOptions.length > 0 && (\r\n                <>\r\n                  <div className=\"px-3 pt-2.5 pb-1.5\">\r\n                    <span className=\"text-[10px] font-medium uppercase tracking-[0.1em]\"\r\n                      style={{ color: isDark ? 'rgba(255,255,255,0.35)' : theme.textTertiary }}>\r\n                      {isEs ? 'EXPORTAR' : 'EXPORT'}\r\n                    </span>\r\n                  </div>\r\n                  <div className=\"py-0.5\">\r\n                    {exportOptions.map((option, index) => (\r\n                      <motion.button\r\n                        key={option.id}\r\n                        onClick={() => handleExport(option.id, option.handler)}\r\n                        disabled={isExporting !== null}\r\n                        className=\"w-full flex items-center gap-2.5 px-3 py-2 text-[11px] transition-colors\"\r\n                        style={{ color: isDark ? 'rgba(255,255,255,0.85)' : '#111827' }}\r\n                        whileHover={{ backgroundColor: theme.hoverBg }}\r\n                        initial={{ opacity: 0, x: -10 }}\r\n                        animate={{ opacity: 1, x: 0 }}\r\n                        transition={{ delay: index * 0.03 }}\r\n                      >\r\n                        <div\r\n                          className=\"flex items-center justify-center w-7 h-7 rounded-md flex-shrink-0\"\r\n                          style={{ backgroundColor: theme.accentLight, color: theme.accent }}\r\n                        >\r\n                          {isExporting === option.id ? (\r\n                            <motion.div\r\n                              animate={{ rotate: 360 }}\r\n                              transition={{ duration: 1, repeat: Infinity, ease: 'linear' }}\r\n                            >\r\n                              <Download className=\"w-3.5 h-3.5\" />\r\n                            </motion.div>\r\n                          ) : (\r\n                            option.icon\r\n                          )}\r\n                        </div>\r\n                        <span className=\"flex-1 text-left\">{option.label}</span>\r\n                      </motion.button>\r\n                    ))}\r\n                  </div>\r\n                </>\r\n              )}\r\n\r\n              {/* Divider */}\r\n              {exportOptions.length > 0 && onCopySnapshotLink && (\r\n                <div className=\"mx-3 h-px\" style={{ backgroundColor: isDark ? 'rgba(255,255,255,0.06)' : theme.borderLight }} />\r\n              )}\r\n\r\n              {/* SHARE Section */}\r\n              {onCopySnapshotLink && (\r\n                <>\r\n                  <div className=\"px-3 pt-2.5 pb-1.5\">\r\n                    <span className=\"text-[10px] font-medium uppercase tracking-[0.1em]\"\r\n                      style={{ color: isDark ? 'rgba(255,255,255,0.35)' : theme.textTertiary }}>\r\n                      {isEs ? 'COMPARTIR' : 'SHARE'}\r\n                    </span>\r\n                  </div>\r\n                  <div className=\"py-0.5 pb-1.5\">\r\n                    <motion.button\r\n                      onClick={handleCopyLink}\r\n                      className=\"w-full flex items-center gap-2.5 px-3 py-2 text-[11px] transition-colors\"\r\n                      style={{ color: isDark ? 'rgba(255,255,255,0.85)' : '#111827' }}\r\n                      whileHover={{ backgroundColor: theme.hoverBg }}\r\n                      initial={{ opacity: 0, x: -10 }}\r\n                      animate={{ opacity: 1, x: 0 }}\r\n                      transition={{ delay: exportOptions.length * 0.03 }}\r\n                    >\r\n                      <div\r\n                        className=\"flex items-center justify-center w-7 h-7 rounded-md flex-shrink-0\"\r\n                        style={{\r\n                          backgroundColor: copied ? 'rgba(34,197,94,0.15)' : theme.accentLight,\r\n                          color: copied ? '#22C55E' : theme.accent,\r\n                        }}\r\n                      >\r\n                        {copied ? <Check className=\"w-3.5 h-3.5\" /> : <Link2 className=\"w-3.5 h-3.5\" />}\r\n                      </div>\r\n                      <span className=\"flex-1 text-left\">\r\n                        {copied ? t.toolbar.copied : t.toolbar.copySnapshotLink}\r\n                      </span>\r\n                    </motion.button>\r\n                  </div>\r\n                </>\r\n              )}\r\n            </motion.div>\r\n          )}\r\n        </AnimatePresence>,\r\n        document.body\r\n      )}\r\n    </>\r\n  );\r\n}\r\n\r\n// Segmented Control Component (kept for theme selector)\r\ninterface SegmentedControlProps {\r\n  options: Array<{ value: string; label: string; icon?: React.ReactNode }>;\r\n  value: string;\r\n  onChange: (value: string) => void;\r\n  theme: any;\r\n  layoutId?: string;\r\n}\r\n\r\nfunction SegmentedControl({ options, value, onChange, theme, layoutId = 'activeSegment' }: SegmentedControlProps) {\r\n  return (\r\n    <div\r\n      className=\"inline-flex p-1 rounded-lg relative\"\r\n      style={{\r\n        backgroundColor: theme.bgSecondary,\r\n        border: `1px solid ${theme.borderLight}`,\r\n      }}\r\n    >\r\n      {options.map((option) => {\r\n        const isActive = value === option.value;\r\n        return (\r\n          <motion.button\r\n            key={option.value}\r\n            onClick={() => onChange(option.value)}\r\n            className=\"relative px-3 py-1.5 rounded-md text-[11px] transition-all flex items-center gap-1.5 min-w-[70px] justify-center\"\r\n            style={{\r\n              color: isActive ? theme.textPrimary : theme.textTertiary,\r\n              fontFamily: 'Inter, sans-serif',\r\n              fontWeight: isActive ? 600 : 500,\r\n              zIndex: isActive ? 2 : 1,\r\n            }}\r\n            whileHover={{ scale: 1.02 }}\r\n            whileTap={{ scale: 0.98 }}\r\n          >\r\n            {isActive && (\r\n              <motion.div\r\n                layoutId={layoutId}\r\n                className=\"absolute inset-0 rounded-md\"\r\n                style={{\r\n                  backgroundColor: theme.accent,\r\n                  boxShadow: '0 1px 3px rgba(0, 0, 0, 0.1)',\r\n                }}\r\n                transition={{\r\n                  type: 'spring',\r\n                  stiffness: 400,\r\n                  damping: 30,\r\n                }}\r\n              />\r\n            )}\r\n            {option.icon && (\r\n              <span className=\"relative z-10\" style={{ color: isActive ? '#FFFFFF' : theme.textTertiary }}>\r\n                {option.icon}\r\n              </span>\r\n            )}\r\n            <span className=\"relative z-10\" style={{ color: isActive ? '#FFFFFF' : theme.textTertiary }}>\r\n              {option.label}\r\n            </span>\r\n          </motion.button>\r\n        );\r\n      })}\r\n    </div>\r\n  );\r\n}\r\n\r\n/**\r\n * v0.16.0: Minimal Tabs Component - Linear/Notion style\r\n * Minimalist tab selector with underline indicator\r\n */\r\ninterface MinimalTabsProps {\r\n  options: Array<{ value: string; label: string }>;\r\n  value: string;\r\n  onChange: (value: string) => void;\r\n  theme: any;\r\n}\r\n\r\nfunction MinimalTabs({ options, value, onChange, theme }: MinimalTabsProps) {\r\n  return (\r\n    <div className=\"inline-flex items-center gap-1\">\r\n      {options.map((option) => {\r\n        const isActive = value === option.value;\r\n        return (\r\n          <motion.button\r\n            key={option.value}\r\n            onClick={() => onChange(option.value)}\r\n            className=\"relative px-3 py-1.5 text-[11px] transition-all\"\r\n            style={{\r\n              color: isActive ? theme.accent : theme.textTertiary,\r\n              fontFamily: 'Inter, sans-serif',\r\n              fontWeight: isActive ? 600 : 500,\r\n            }}\r\n            whileHover={{ color: isActive ? theme.accent : theme.textSecondary }}\r\n            whileTap={{ scale: 0.98 }}\r\n          >\r\n            <span>{option.label}</span>\r\n            {/* Underline indicator */}\r\n            {isActive && (\r\n              <motion.div\r\n                layoutId=\"timeScaleUnderline\"\r\n                className=\"absolute bottom-0 left-1 right-1 h-0.5 rounded-full\"\r\n                style={{ backgroundColor: theme.accent }}\r\n                transition={{\r\n                  type: 'spring',\r\n                  stiffness: 400,\r\n                  damping: 30,\r\n                }}\r\n              />\r\n            )}\r\n          </motion.button>\r\n        );\r\n      })}\r\n    </div>\r\n  );\r\n}\r\n\r\n/**\r\n * v0.16.0: Density Dropdown Component\r\n * Consolidated density selector as a compact dropdown\r\n */\r\ninterface DensityDropdownProps {\r\n  theme: any;\r\n  value: RowDensity;\r\n  onChange: (density: RowDensity) => void;\r\n}\r\n\r\n/* exported for potential standalone use */\r\nexport function DensityDropdown({ theme, value, onChange }: DensityDropdownProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const triggerRef = useRef<HTMLButtonElement>(null);\r\n  const dropdownRef = useRef<HTMLDivElement>(null);\r\n  const t = useGanttI18n();\r\n  const portalPos = useDropdownPortal(triggerRef, isOpen, 'left');\r\n\r\n  // Close dropdown when clicking outside\r\n  useEffect(() => {\r\n    if (!isOpen) return;\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      const target = event.target as Node;\r\n      if (\r\n        triggerRef.current && !triggerRef.current.contains(target) &&\r\n        dropdownRef.current && !dropdownRef.current.contains(target)\r\n      ) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n    document.addEventListener('mousedown', handleClickOutside);\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  const densityOptions = [\r\n    { value: 'compact' as RowDensity, label: t.toolbar.compact || 'Compact' },\r\n    { value: 'comfortable' as RowDensity, label: t.toolbar.normal || 'Normal' },\r\n    { value: 'spacious' as RowDensity, label: t.toolbar.spacious || 'Spacious' },\r\n  ];\r\n\r\n  const currentLabel = densityOptions.find(opt => opt.value === value)?.label || 'Normal';\r\n\r\n  return (\r\n    <>\r\n      <motion.button\r\n        ref={triggerRef}\r\n        onClick={() => setIsOpen(!isOpen)}\r\n        className=\"flex items-center justify-center p-2 rounded-lg transition-all\"\r\n        style={{\r\n          backgroundColor: isOpen ? theme.accentLight : theme.bgSecondary,\r\n          border: `1px solid ${isOpen ? theme.accent : theme.borderLight}`,\r\n          color: isOpen ? theme.accent : theme.textSecondary,\r\n        }}\r\n        whileHover={{\r\n          backgroundColor: theme.hoverBg,\r\n          scale: 1.02,\r\n        }}\r\n        whileTap={{ scale: 0.98 }}\r\n        title={`${t.toolbar.density || 'Density'}: ${currentLabel}`}\r\n      >\r\n        <Rows3 className=\"w-4 h-4\" />\r\n      </motion.button>\r\n\r\n      {createPortal(\r\n      <AnimatePresence>\r\n        {isOpen && (\r\n          <motion.div\r\n            ref={dropdownRef}\r\n            initial={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            animate={{ opacity: 1, y: 0, scale: 1 }}\r\n            exit={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            transition={{ duration: 0.15, ease: 'easeOut' }}\r\n            className=\"fixed w-32 rounded-xl overflow-hidden\"\r\n            style={{\r\n              top: portalPos.top,\r\n              left: portalPos.left,\r\n              zIndex: 99999,\r\n              backgroundColor: theme.bgPrimary === '#050505' ? 'rgba(10, 10, 10, 0.95)' : theme.bgSecondary,\r\n              border: `1px solid ${theme.bgPrimary === '#050505' ? 'rgba(255,255,255,0.08)' : theme.border}`,\r\n              boxShadow: theme.bgPrimary === '#050505'\r\n                ? '0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255,255,255,0.04)'\r\n                : '0 10px 40px rgba(0, 0, 0, 0.12)',\r\n              backdropFilter: 'blur(16px)',\r\n            }}\r\n          >\r\n            <div className=\"py-1\">\r\n              {densityOptions.map((option, index) => {\r\n                const isActive = value === option.value;\r\n                return (\r\n                  <motion.button\r\n                    key={option.value}\r\n                    onClick={() => {\r\n                      onChange(option.value);\r\n                      setIsOpen(false);\r\n                    }}\r\n                    className=\"w-full flex items-center justify-between px-3 py-2 text-left transition-all\"\r\n                    style={{\r\n                      backgroundColor: isActive ? theme.accentLight : 'transparent',\r\n                      borderBottom: index < densityOptions.length - 1 ? `1px solid ${theme.bgPrimary === '#050505' ? 'rgba(255,255,255,0.06)' : theme.borderLight}` : 'none',\r\n                    }}\r\n                    whileHover={{\r\n                      backgroundColor: isActive ? theme.accentLight : (theme.bgPrimary === '#050505' ? 'rgba(255,255,255,0.06)' : theme.hoverBg),\r\n                    }}\r\n                    initial={{ opacity: 0, x: -10 }}\r\n                    animate={{ opacity: 1, x: 0 }}\r\n                    transition={{ delay: index * 0.03 }}\r\n                  >\r\n                    <span\r\n                      className=\"text-[11px]\"\r\n                      style={{\r\n                        color: isActive ? theme.accent : theme.textPrimary,\r\n                        fontFamily: 'Inter, sans-serif',\r\n                        fontWeight: isActive ? 600 : 500,\r\n                      }}\r\n                    >\r\n                      {option.label}\r\n                    </span>\r\n                    {isActive && (\r\n                      <Check className=\"w-3.5 h-3.5\" style={{ color: theme.accent }} />\r\n                    )}\r\n                  </motion.button>\r\n                );\r\n              })}\r\n            </div>\r\n          </motion.div>\r\n        )}\r\n      </AnimatePresence>,\r\n      document.body\r\n      )}\r\n    </>\r\n  );\r\n}\r\n\r\n/**\r\n * v3.0.0: WBS Level Dropdown Component\r\n * Allows collapsing the task tree to a specific depth level\r\n */\r\ninterface WbsLevelDropdownProps {\r\n  theme: any;\r\n  value: number | 'all';\r\n  onChange: (level: number | 'all') => void;\r\n  maxDepth: number;\r\n}\r\n\r\nfunction WbsLevelDropdown({ theme, value, onChange, maxDepth }: WbsLevelDropdownProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const triggerRef = useRef<HTMLButtonElement>(null);\r\n  const dropdownRef = useRef<HTMLDivElement>(null);\r\n  const t = useGanttI18n();\r\n  const portalPos = useDropdownPortal(triggerRef, isOpen, 'left');\r\n\r\n  useEffect(() => {\r\n    if (!isOpen) return;\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      const target = event.target as Node;\r\n      if (\r\n        triggerRef.current && !triggerRef.current.contains(target) &&\r\n        dropdownRef.current && !dropdownRef.current.contains(target)\r\n      ) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n    document.addEventListener('mousedown', handleClickOutside);\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  const options: Array<{ value: number | 'all'; label: string }> = [\r\n    { value: 'all', label: t.toolbar.wbsAllLevels || 'All' },\r\n    ...Array.from({ length: Math.min(maxDepth, 5) }, (_, i) => ({\r\n      value: i + 1,\r\n      label: `L${i + 1}`,\r\n    })),\r\n  ];\r\n\r\n  const currentLabel = value === 'all' ? (t.toolbar.wbsAllLevels || 'All') : `L${value}`;\r\n\r\n  return (\r\n    <>\r\n      <motion.button\r\n        ref={triggerRef}\r\n        onClick={() => setIsOpen(!isOpen)}\r\n        className=\"flex items-center gap-1.5 px-2 py-1.5 rounded-lg transition-all\"\r\n        style={{\r\n          backgroundColor: isOpen ? theme.accentLight : theme.bgSecondary,\r\n          border: `1px solid ${isOpen ? theme.accent : theme.borderLight}`,\r\n          color: isOpen ? theme.accent : theme.textSecondary,\r\n        }}\r\n        whileHover={{\r\n          backgroundColor: theme.hoverBg,\r\n          scale: 1.02,\r\n        }}\r\n        whileTap={{ scale: 0.98 }}\r\n        title={`${t.toolbar.wbsLevel || 'Level'}: ${currentLabel}`}\r\n      >\r\n        <Layers className=\"w-3.5 h-3.5\" />\r\n        <span\r\n          className=\"text-[11px] font-medium\"\r\n          style={{ fontFamily: \"'JetBrains Mono', monospace\" }}\r\n        >\r\n          {currentLabel}\r\n        </span>\r\n      </motion.button>\r\n\r\n      {createPortal(\r\n      <AnimatePresence>\r\n        {isOpen && (\r\n          <motion.div\r\n            ref={dropdownRef}\r\n            initial={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            animate={{ opacity: 1, y: 0, scale: 1 }}\r\n            exit={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            transition={{ duration: 0.15, ease: 'easeOut' }}\r\n            className=\"fixed w-24 rounded-xl overflow-hidden\"\r\n            style={{\r\n              top: portalPos.top,\r\n              left: portalPos.left,\r\n              zIndex: 99999,\r\n              backgroundColor: theme.bgPrimary === '#050505' ? 'rgba(10, 10, 10, 0.95)' : theme.bgSecondary,\r\n              border: `1px solid ${theme.bgPrimary === '#050505' ? 'rgba(255,255,255,0.08)' : theme.border}`,\r\n              boxShadow: theme.bgPrimary === '#050505'\r\n                ? '0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255,255,255,0.04)'\r\n                : '0 10px 40px rgba(0, 0, 0, 0.12)',\r\n              backdropFilter: 'blur(16px)',\r\n            }}\r\n          >\r\n            <div className=\"py-1\">\r\n              {options.map((option, index) => {\r\n                const isActive = value === option.value;\r\n                return (\r\n                  <motion.button\r\n                    key={String(option.value)}\r\n                    onClick={() => {\r\n                      onChange(option.value);\r\n                      setIsOpen(false);\r\n                    }}\r\n                    className=\"w-full flex items-center justify-between px-3 py-2 text-left transition-all\"\r\n                    style={{\r\n                      backgroundColor: isActive ? theme.accentLight : 'transparent',\r\n                      borderBottom: index < options.length - 1 ? `1px solid ${theme.bgPrimary === '#050505' ? 'rgba(255,255,255,0.06)' : theme.borderLight}` : 'none',\r\n                    }}\r\n                    whileHover={{\r\n                      backgroundColor: isActive ? theme.accentLight : (theme.bgPrimary === '#050505' ? 'rgba(255,255,255,0.06)' : theme.hoverBg),\r\n                    }}\r\n                    initial={{ opacity: 0, x: -10 }}\r\n                    animate={{ opacity: 1, x: 0 }}\r\n                    transition={{ delay: index * 0.03 }}\r\n                  >\r\n                    <span\r\n                      className=\"text-[11px]\"\r\n                      style={{\r\n                        color: isActive ? theme.accent : theme.textPrimary,\r\n                        fontFamily: \"'JetBrains Mono', monospace\",\r\n                        fontWeight: isActive ? 600 : 500,\r\n                      }}\r\n                    >\r\n                      {option.label}\r\n                    </span>\r\n                    {isActive && (\r\n                      <Check className=\"w-3.5 h-3.5\" style={{ color: theme.accent }} />\r\n                    )}\r\n                  </motion.button>\r\n                );\r\n              })}\r\n            </div>\r\n          </motion.div>\r\n        )}\r\n      </AnimatePresence>,\r\n      document.body\r\n      )}\r\n    </>\r\n  );\r\n}\r\n\r\n/**\r\n * v0.18.0: ClickUp-style Filter Dropdown Component\r\n * Shows status filter options with icons and \"Hide Completed\" toggle\r\n */\r\ninterface FilterDropdownProps {\r\n  theme: any;\r\n  value: TaskFilterType;\r\n  onChange: (filter: TaskFilterType) => void;\r\n  hideCompleted?: boolean;\r\n  onHideCompletedChange?: (hide: boolean) => void;\r\n}\r\n\r\nfunction FilterDropdown({ theme, value, onChange, hideCompleted = false, onHideCompletedChange }: FilterDropdownProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const triggerRef = useRef<HTMLButtonElement>(null);\r\n  const dropdownRef = useRef<HTMLDivElement>(null);\r\n  const t = useGanttI18n();\r\n  const portalPos = useDropdownPortal(triggerRef, isOpen, 'left');\r\n\r\n  // Close dropdown when clicking outside (with delay to prevent immediate close)\r\n  useEffect(() => {\r\n    if (!isOpen) return;\r\n\r\n    const timeoutId = setTimeout(() => {\r\n      const handleClickOutside = (e: MouseEvent) => {\r\n        const target = e.target as Node;\r\n        if (\r\n          triggerRef.current && !triggerRef.current.contains(target) &&\r\n          dropdownRef.current && !dropdownRef.current.contains(target)\r\n        ) {\r\n          setIsOpen(false);\r\n        }\r\n      };\r\n\r\n      const handleEscape = (e: KeyboardEvent) => {\r\n        if (e.key === 'Escape') setIsOpen(false);\r\n      };\r\n\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n      document.addEventListener('keydown', handleEscape);\r\n\r\n      (dropdownRef as any)._cleanup = () => {\r\n        document.removeEventListener('mousedown', handleClickOutside);\r\n        document.removeEventListener('keydown', handleEscape);\r\n      };\r\n    }, 100);\r\n\r\n    return () => {\r\n      clearTimeout(timeoutId);\r\n      if ((dropdownRef as any)._cleanup) {\r\n        (dropdownRef as any)._cleanup();\r\n      }\r\n    };\r\n  }, [isOpen]);\r\n\r\n  // Status filter options with icons (ClickUp-style)\r\n  const filterOptions: Array<{ value: TaskFilterType; label: string; icon: React.ReactNode; color: string }> = [\r\n    {\r\n      value: 'all',\r\n      label: t.toolbar.filterAll || 'Show All',\r\n      icon: <div className=\"w-3.5 h-3.5 rounded-full border-2 border-[#00E5CC] bg-[#00E5CC]\" />,\r\n      color: 'text-[#00E5CC]'\r\n    },\r\n    {\r\n      value: 'completed',\r\n      label: t.toolbar.filterCompleted || 'Completed',\r\n      icon: <CheckCircle2 className=\"w-3.5 h-3.5\" />,\r\n      color: 'text-green-500'\r\n    },\r\n    {\r\n      value: 'in_progress',\r\n      label: t.toolbar.filterInProgress || 'In Progress',\r\n      icon: <PlayCircle className=\"w-3.5 h-3.5\" />,\r\n      color: 'text-[#00E5CC]'\r\n    },\r\n    {\r\n      value: 'incomplete',\r\n      label: t.toolbar.toDo || 'To Do / Pending',\r\n      icon: <Circle className=\"w-3.5 h-3.5\" />,\r\n      color: 'text-gray-400'\r\n    },\r\n  ];\r\n\r\n  const hasActiveFilter = value !== 'all' || hideCompleted;\r\n  /* 1.9.44 · el botón dice cuántos filtros hay activos («Filters · 1»). */\r\n  const filtrosActivos = (value !== 'all' ? 1 : 0) + (hideCompleted ? 1 : 0);\r\n  const isDark = theme.bgPrimary === '#0F1117' || theme.bgPrimary === '#0a0a0a' || theme.bgPrimary === '#050505' || theme.textPrimary === '#FFFFFF';\r\n\r\n  return (\r\n    <>\r\n      {/* Filter Button */}\r\n      <motion.button\r\n        ref={triggerRef}\r\n        onClick={(e) => {\r\n          e.stopPropagation();\r\n          setIsOpen(prev => !prev);\r\n        }}\r\n        className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg text-[11px] transition-all\"\r\n        style={{\r\n          backgroundColor: hasActiveFilter\r\n            ? (isDark ? 'rgba(0, 229, 204, 0.2)' : 'rgb(239 246 255)')\r\n            : (isOpen ? theme.hoverBg : theme.bgSecondary),\r\n          border: `1px solid ${hasActiveFilter\r\n            ? (isDark ? 'rgba(0, 229, 204, 0.5)' : 'rgb(191 219 254)')\r\n            : theme.borderLight}`,\r\n          color: hasActiveFilter\r\n            ? '#00E5CC'\r\n            : theme.textSecondary,\r\n          fontFamily: 'Inter, sans-serif',\r\n          fontWeight: 500,\r\n        }}\r\n        whileHover={{\r\n          backgroundColor: theme.hoverBg,\r\n          scale: 1.02,\r\n        }}\r\n        whileTap={{ scale: 0.98 }}\r\n      >\r\n        <Filter className=\"w-4 h-4\" />\r\n        <span>{t.toolbar.filter || 'Filters'}{filtrosActivos > 0 ? ` · ${filtrosActivos}` : ''}</span>\r\n      </motion.button>\r\n\r\n      {/* Dropdown */}\r\n      {createPortal(\r\n      <AnimatePresence>\r\n        {isOpen && (\r\n          <motion.div\r\n            ref={dropdownRef}\r\n            initial={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            animate={{ opacity: 1, y: 0, scale: 1 }}\r\n            exit={{ opacity: 0, y: -8, scale: 0.95 }}\r\n            transition={{ duration: 0.15, ease: 'easeOut' }}\r\n            className=\"fixed w-56 rounded-xl overflow-hidden\"\r\n            style={{\r\n              top: portalPos.top,\r\n              left: portalPos.left,\r\n              zIndex: 99999,\r\n              backgroundColor: isDark ? 'rgba(10, 10, 10, 0.95)' : '#FFFFFF',\r\n              border: `1px solid ${isDark ? 'rgba(255,255,255,0.08)' : 'rgb(229 231 235)'}`,\r\n              boxShadow: isDark\r\n                ? '0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255,255,255,0.04)'\r\n                : '0 10px 40px rgba(0, 0, 0, 0.12)',\r\n              backdropFilter: 'blur(16px)',\r\n            }}\r\n          >\r\n            {/* Header */}\r\n            <div\r\n              className=\"px-3 py-2 border-b\"\r\n              style={{ borderColor: isDark ? 'rgba(255,255,255,0.06)' : 'rgb(229 231 235)' }}\r\n            >\r\n              <span\r\n                className=\"text-[10px] font-medium uppercase tracking-[0.1em]\"\r\n                style={{\r\n                  color: isDark ? 'rgba(255,255,255,0.35)' : '#9CA3AF',\r\n                  fontFamily: 'Inter, sans-serif',\r\n                }}\r\n              >\r\n                {t.toolbar.filterBy || 'FILTER BY STATUS'}\r\n              </span>\r\n            </div>\r\n\r\n            {/* Status Options */}\r\n            <div className=\"py-1\">\r\n              {filterOptions.map((option) => {\r\n                // Don't show checkmark on status options when hideCompleted is active\r\n                const isSelected = value === option.value && !hideCompleted;\r\n\r\n                // Dynamic icon for \"all\" option - solid when selected, outline when not\r\n                const getIcon = () => {\r\n                  if (option.value === 'all') {\r\n                    return isSelected\r\n                      ? <div className=\"w-3.5 h-3.5 rounded-full border-2 border-[#00E5CC] bg-[#00E5CC]\" />\r\n                      : <div className=\"w-3.5 h-3.5 rounded-full border-2 border-gray-400\" />;\r\n                  }\r\n                  return option.icon;\r\n                };\r\n\r\n                return (\r\n                  <motion.button\r\n                    key={option.value}\r\n                    onClick={() => {\r\n                      onChange(option.value);\r\n                      // If selecting a specific status, disable hide completed\r\n                      if (onHideCompletedChange) {\r\n                        onHideCompletedChange(false);\r\n                      }\r\n                      // Close dropdown after selection\r\n                      setIsOpen(false);\r\n                    }}\r\n                    className=\"w-full flex items-center gap-2.5 px-3 py-2 text-[11px] transition-colors\"\r\n                    style={{\r\n                      backgroundColor: isSelected\r\n                        ? (isDark ? 'rgba(255,255,255,0.05)' : 'rgb(249 250 251)')\r\n                        : 'transparent',\r\n                      fontFamily: 'Inter, sans-serif',\r\n                    }}\r\n                    whileHover={{\r\n                      backgroundColor: isDark ? 'rgba(255,255,255,0.06)' : 'rgb(243 244 246)',\r\n                    }}\r\n                  >\r\n                    <span className={`${isSelected ? option.color : 'text-gray-400'} flex-shrink-0`}>\r\n                      {getIcon()}\r\n                    </span>\r\n                    <span\r\n                      className=\"flex-1 text-left whitespace-nowrap font-medium\"\r\n                      style={{ color: isDark ? 'rgba(255,255,255,0.85)' : '#111827' }}\r\n                    >\r\n                      {option.label}\r\n                    </span>\r\n                    {isSelected && (\r\n                      <Check\r\n                        className=\"w-3.5 h-3.5 flex-shrink-0\"\r\n                        style={{ color: '#00E5CC' }}\r\n                      />\r\n                    )}\r\n                  </motion.button>\r\n                );\r\n              })}\r\n            </div>\r\n\r\n            {/* Separator */}\r\n            <div\r\n              className=\"mx-3 h-px\"\r\n              style={{ backgroundColor: isDark ? 'rgba(255,255,255,0.06)' : 'rgb(229 231 235)' }}\r\n            />\r\n\r\n            {/* Hide Completed Toggle */}\r\n            {onHideCompletedChange && (\r\n              <div className=\"py-1\">\r\n                <motion.button\r\n                  onClick={() => {\r\n                    onHideCompletedChange(!hideCompleted);\r\n                    // If enabling hide completed, reset to show all\r\n                    if (!hideCompleted) {\r\n                      onChange('all');\r\n                    }\r\n                    // Close dropdown after selection\r\n                    setIsOpen(false);\r\n                  }}\r\n                  className=\"w-full flex items-center gap-2.5 px-3 py-2 text-[11px] transition-colors\"\r\n                  style={{\r\n                    backgroundColor: hideCompleted\r\n                      ? (isDark ? 'rgba(255,255,255,0.05)' : 'rgb(249 250 251)')\r\n                      : 'transparent',\r\n                    fontFamily: 'Inter, sans-serif',\r\n                  }}\r\n                  whileHover={{\r\n                    backgroundColor: isDark ? 'rgba(255,255,255,0.06)' : 'rgb(243 244 246)',\r\n                  }}\r\n                >\r\n                  <EyeOff\r\n                    className=\"w-3.5 h-3.5 flex-shrink-0\"\r\n                    style={{\r\n                      color: hideCompleted\r\n                        ? '#00E5CC'\r\n                        : (isDark ? 'rgba(255,255,255,0.35)' : '#9CA3AF')\r\n                    }}\r\n                  />\r\n                  <span\r\n                    className=\"flex-1 text-left whitespace-nowrap font-medium\"\r\n                    style={{ color: isDark ? 'rgba(255,255,255,0.85)' : '#111827' }}\r\n                  >\r\n                    {t.toolbar.hideCompleted || 'Hide Completed Tasks'}\r\n                  </span>\r\n                  {hideCompleted && (\r\n                    <Check\r\n                      className=\"w-3.5 h-3.5 flex-shrink-0\"\r\n                      style={{ color: '#00E5CC' }}\r\n                    />\r\n                  )}\r\n                </motion.button>\r\n              </div>\r\n            )}\r\n          </motion.div>\r\n        )}\r\n      </AnimatePresence>,\r\n      document.body\r\n      )}\r\n    </>\r\n  );\r\n}\r\n\r\n/**\r\n * Chronos V2: Time Capsule — pill-shaped time scale selector\r\n */\r\nfunction TimeCapsule({ value, onChange, theme }: { value: TimeScale; onChange: (s: TimeScale) => void; theme: any }) {\r\n  const t = useGanttI18n();\r\n  const isDark = theme.bgPrimary === '#050505' || theme.textPrimary === '#FFFFFF';\r\n  const scales: Array<{ value: TimeScale; label: string }> = [\r\n    { value: 'day', label: t.toolbar.day.charAt(0).toUpperCase() },\r\n    { value: 'week', label: t.toolbar.week.charAt(0).toUpperCase() },\r\n    { value: 'month', label: t.toolbar.month.charAt(0).toUpperCase() },\r\n  ];\r\n\r\n  return (\r\n    <div\r\n      className=\"inline-flex items-center rounded-full p-0.5\"\r\n      style={{\r\n        backgroundColor: isDark ? '#000000' : theme.bgSecondary,\r\n        border: `1px solid ${isDark ? 'rgba(255,255,255,0.1)' : theme.border}`,\r\n      }}\r\n    >\r\n      {scales.map((s) => {\r\n        const isActive = value === s.value;\r\n        return (\r\n          <motion.button\r\n            key={s.value}\r\n            onClick={() => onChange(s.value)}\r\n            className=\"relative px-3 py-1 text-[11px] font-medium rounded-full transition-colors\"\r\n            style={{\r\n              color: isActive ? (isDark ? '#FFFFFF' : theme.textPrimary) : theme.textTertiary,\r\n              fontFamily: 'Inter, sans-serif',\r\n              backgroundColor: isActive ? (isDark ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.06)') : 'transparent',\r\n            }}\r\n            whileHover={{ color: isDark ? '#FFFFFF' : theme.textPrimary }}\r\n            whileTap={{ scale: 0.95 }}\r\n          >\r\n            {s.label}\r\n          </motion.button>\r\n        );\r\n      })}\r\n    </div>\r\n  );\r\n}\r\n\r\n/**\r\n * Chronos V2: Forecast HUD Panel — real KPIs bar (v3.1.0)\r\n */\r\nfunction ForecastHUD({ theme, forecast }: { theme: any; forecast?: ProjectForecast }) {\r\n  const t = useGanttI18n();\r\n  const isDark = theme.bgPrimary === '#050505' || theme.textPrimary === '#FFFFFF';\r\n\r\n  // Format expected finish date\r\n  const finishLabel = forecast?.expectedFinish\r\n    ? forecast.expectedFinish.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })\r\n    : '—';\r\n\r\n  // Delay badge — always show when baseline is active (including \"On Time\" at 0)\r\n  const delay = forecast?.delayDays;\r\n  const hasDelay = delay != null;\r\n  const delayLabel = delay != null\r\n    ? (delay > 0 ? `+${delay}d ${t.toolbar.delayLabel}` : delay < 0 ? `${delay}d ${t.toolbar.earlyLabel}` : t.toolbar.onTimeLabel)\r\n    : null;\r\n  const delayColor = delay != null && delay > 0\r\n    ? { bg: isDark ? 'rgba(239,68,68,0.15)' : 'rgba(220,38,38,0.1)', text: isDark ? '#EF4444' : '#DC2626' }\r\n    : delay != null && delay < 0\r\n      ? { bg: isDark ? 'rgba(34,197,94,0.15)' : 'rgba(22,163,74,0.1)', text: isDark ? '#22C55E' : '#16A34A' }\r\n      : { bg: isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.05)', text: theme.textTertiary };\r\n\r\n  // Confidence color\r\n  const conf = forecast?.confidencePercent;\r\n  const confColor = conf != null\r\n    ? conf >= 75 ? '#22C55E' : conf >= 40 ? '#F59E0B' : '#EF4444'\r\n    : theme.textTertiary;\r\n\r\n  // Format cost\r\n  const cost = forecast?.costAtCompletion;\r\n  const currency = forecast?.currency || '$';\r\n  const costLabel = cost != null\r\n    ? cost >= 1_000_000\r\n      ? `${currency}${(cost / 1_000_000).toFixed(2)}M`\r\n      : cost >= 1_000\r\n        ? `${currency}${(cost / 1_000).toFixed(1)}K`\r\n        : `${currency}${cost.toFixed(0)}`\r\n    : '—';\r\n\r\n  // Budget variance badge\r\n  const variance = forecast?.budgetVariancePercent;\r\n  const hasVariance = variance != null && variance !== 0;\r\n  const varianceLabel = variance != null\r\n    ? (variance > 0 ? `+${variance.toFixed(0)}% ${t.toolbar.budgetOver}` : `${variance.toFixed(0)}% ${t.toolbar.budgetUnder}`)\r\n    : null;\r\n  const varianceColor = variance != null && variance > 0\r\n    ? { bg: isDark ? 'rgba(239,68,68,0.15)' : 'rgba(220,38,38,0.1)', text: isDark ? '#EF4444' : '#DC2626' }\r\n    : variance != null && variance < 0\r\n      ? { bg: isDark ? 'rgba(34,197,94,0.15)' : 'rgba(22,163,74,0.1)', text: isDark ? '#22C55E' : '#16A34A' }\r\n      : { bg: 'transparent', text: theme.textTertiary };\r\n\r\n  return (\r\n    <div\r\n      className=\"h-12 px-4 flex items-center justify-between border-b\"\r\n      style={{\r\n        backgroundColor: theme.forecastHud || (isDark ? 'rgba(15,15,15,0.9)' : 'rgba(248,250,252,0.95)'),\r\n        borderColor: theme.borderLight,\r\n        backdropFilter: 'blur(12px)',\r\n      }}\r\n    >\r\n      {/* Left: Project Forecast label + Expected Finish */}\r\n      <div className=\"flex items-center gap-6\">\r\n        <span\r\n          className=\"text-[9px] uppercase tracking-[0.15em]\"\r\n          style={{\r\n            color: theme.textTertiary,\r\n            fontFamily: \"'JetBrains Mono', monospace\",\r\n            fontWeight: 500,\r\n          }}\r\n        >\r\n          {t.toolbar.projectForecast}\r\n        </span>\r\n\r\n        <div className=\"flex items-center gap-2\">\r\n          <span\r\n            className=\"text-[13px] font-semibold\"\r\n            style={{ color: theme.textPrimary, fontFamily: 'Inter, sans-serif' }}\r\n          >\r\n            {t.toolbar.expectedFinish}: {finishLabel}\r\n          </span>\r\n          {hasDelay && delayLabel && (\r\n            <span\r\n              className=\"px-1.5 py-0.5 rounded text-[10px] font-medium\"\r\n              style={{\r\n                backgroundColor: delayColor.bg,\r\n                color: delayColor.text,\r\n                fontFamily: \"'JetBrains Mono', monospace\",\r\n                cursor: forecast?.causaDelDesvio ? 'help' : undefined,\r\n              }}\r\n              /*\r\n               * REQ-05 §8.4 · la causa, al pasar el raton.\r\n               *\r\n               * Va en el `title` y no en la barra a proposito: la insignia\r\n               * vive en una fila apretada y una frase entera la desbordaria.\r\n               * El numero sigue siendo lo primero que se lee; la explicacion\r\n               * esta a un gesto, que es justo lo que §8.4 pide evitar —«un\r\n               * numero que obliga a ABRIR EL CRONOGRAMA»—.\r\n               *\r\n               * El bloque completo de §8.3 va en el Resumen del proyecto,\r\n               * que es REQ-02 y todavia no existe.\r\n               */\r\n              title={forecast?.causaDelDesvio || undefined}\r\n            >\r\n              {delayLabel}\r\n            </span>\r\n          )}\r\n        </div>\r\n      </div>\r\n\r\n      {/* Right: Confidence + Cost */}\r\n      <div className=\"flex items-center gap-6\">\r\n        <div className=\"flex items-center gap-2\">\r\n          <span\r\n            className=\"text-[11px]\"\r\n            style={{ color: theme.textTertiary, fontFamily: 'Inter, sans-serif' }}\r\n          >\r\n            {t.toolbar.confidence}:\r\n          </span>\r\n          <span\r\n            className=\"text-[13px] font-semibold\"\r\n            style={{\r\n              color: confColor,\r\n              fontFamily: \"'JetBrains Mono', monospace\",\r\n            }}\r\n          >\r\n            {conf != null ? `${conf.toFixed(0)}%` : '—'}\r\n          </span>\r\n        </div>\r\n\r\n        <div\r\n          className=\"w-px h-5\"\r\n          style={{ backgroundColor: isDark ? 'rgba(255,255,255,0.08)' : theme.borderLight }}\r\n        />\r\n\r\n        <div className=\"flex items-center gap-2\">\r\n          <span\r\n            className=\"text-[11px]\"\r\n            style={{ color: theme.textTertiary, fontFamily: 'Inter, sans-serif' }}\r\n          >\r\n            {t.toolbar.costAtCompletion}:\r\n          </span>\r\n          <span\r\n            className=\"text-[13px] font-bold\"\r\n            style={{ color: theme.textPrimary, fontFamily: \"'JetBrains Mono', monospace\" }}\r\n          >\r\n            {costLabel}\r\n          </span>\r\n          {hasVariance && varianceLabel && (\r\n            <span\r\n              className=\"px-1.5 py-0.5 rounded text-[10px] font-medium\"\r\n              style={{\r\n                backgroundColor: varianceColor.bg,\r\n                color: varianceColor.text,\r\n                fontFamily: \"'JetBrains Mono', monospace\",\r\n              }}\r\n            >\r\n              {varianceLabel}\r\n            </span>\r\n          )}\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\n// ============================================================================\r\n// VIEW OPTIONS DROPDOWN (Eye icon)\r\n// ============================================================================\r\ninterface ViewOptionsDropdownProps {\r\n  theme: any;\r\n  showCriticalPath: boolean;\r\n  onShowCriticalPathChange?: (show: boolean) => void;\r\n  showBaseline: boolean;\r\n  onShowBaselineChange?: (show: boolean) => void;\r\n  highlightWeekends: boolean;\r\n  onHighlightWeekendsChange?: (show: boolean) => void;\r\n  showDependencies: boolean;\r\n  onShowDependenciesChange?: (show: boolean) => void;\r\n  rowDensity: RowDensity;\r\n  onRowDensityChange: (density: RowDensity) => void;\r\n  // v5.1.0: Disable critical path toggle when no dependencies exist\r\n  hasDependencies?: boolean;\r\n}\r\n\r\nfunction ViewOptionsDropdown({\r\n  theme,\r\n  showCriticalPath,\r\n  onShowCriticalPathChange,\r\n  showBaseline,\r\n  onShowBaselineChange,\r\n  highlightWeekends,\r\n  onHighlightWeekendsChange,\r\n  showDependencies,\r\n  onShowDependenciesChange,\r\n  rowDensity,\r\n  onRowDensityChange,\r\n  hasDependencies = true,\r\n}: ViewOptionsDropdownProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const triggerRef = useRef<HTMLButtonElement>(null);\r\n  const dropdownRef = useRef<HTMLDivElement>(null);\r\n  const t = useGanttI18n();\r\n  const portalPos = useDropdownPortal(triggerRef, isOpen, 'right', 208);\r\n  const isDark = theme.bgPrimary === '#050505' || (theme.bgPrimary || '').charAt(1) === '0';\r\n\r\n  useEffect(() => {\r\n    if (!isOpen) return;\r\n    const handleClickOutside = (event: MouseEvent) => {\r\n      const target = event.target as Node;\r\n      if (\r\n        triggerRef.current && !triggerRef.current.contains(target) &&\r\n        dropdownRef.current && !dropdownRef.current.contains(target)\r\n      ) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n    document.addEventListener('mousedown', handleClickOutside);\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  const isSpanish = t.toolbar.visibility === 'Visibilidad';\r\n  const toggleOptions = [\r\n    { key: 'criticalPath', label: isSpanish ? 'Ruta Crítica' : 'Critical Path', icon: Zap, active: showCriticalPath, onChange: onShowCriticalPathChange, disabled: !hasDependencies, tooltip: !hasDependencies ? (isSpanish ? 'Agrega dependencias entre tareas para ver la ruta crítica' : 'Add dependencies between tasks to see the critical path') : undefined },\r\n    { key: 'baselines', label: isSpanish ? 'Líneas Base' : 'Baselines', icon: Layers, active: showBaseline, onChange: onShowBaselineChange },\r\n    { key: 'weekends', label: isSpanish ? 'Fines de Semana' : 'Weekends', icon: CalendarDays, active: highlightWeekends, onChange: onHighlightWeekendsChange },\r\n    { key: 'dependencies', label: isSpanish ? 'Dependencias' : 'Dependencies', icon: GitBranch, active: showDependencies, onChange: onShowDependenciesChange },\r\n  ];\r\n\r\n  const densityOptions: { value: RowDensity; label: string }[] = [\r\n    { value: 'compact', label: t.toolbar.visibility === 'Visibilidad' ? 'Compacto' : 'Compact' },\r\n    { value: 'comfortable', label: 'Normal' },\r\n    { value: 'spacious', label: t.toolbar.visibility === 'Visibilidad' ? 'Amplio' : 'Spacious' },\r\n  ];\r\n\r\n  return (\r\n    <>\r\n      <motion.button\r\n        ref={triggerRef}\r\n        onClick={() => setIsOpen(!isOpen)}\r\n        className=\"flex items-center justify-center w-8 h-8 rounded-lg\"\r\n        style={{\r\n          color: isOpen ? theme.accent : theme.textTertiary,\r\n          backgroundColor: isOpen ? theme.accentLight : 'transparent',\r\n        }}\r\n        whileHover={{ color: theme.textPrimary, backgroundColor: theme.hoverBg }}\r\n        title={t.toolbar.visibility}\r\n      >\r\n        <Eye className=\"w-4 h-4\" />\r\n      </motion.button>\r\n\r\n      {createPortal(\r\n        <AnimatePresence>\r\n          {isOpen && (\r\n            <motion.div\r\n              ref={dropdownRef}\r\n              initial={{ opacity: 0, y: -8, scale: 0.95 }}\r\n              animate={{ opacity: 1, y: 0, scale: 1 }}\r\n              exit={{ opacity: 0, y: -8, scale: 0.95 }}\r\n              transition={{ duration: 0.15, ease: 'easeOut' }}\r\n              className=\"fixed w-52 rounded-xl overflow-hidden\"\r\n              style={{\r\n                top: portalPos.top,\r\n                left: portalPos.left,\r\n                zIndex: 99999,\r\n                backgroundColor: isDark ? 'rgba(10, 10, 10, 0.95)' : theme.bgSecondary || '#F8FAFC',\r\n                border: `1px solid ${isDark ? 'rgba(255,255,255,0.08)' : theme.border || '#CBD5E1'}`,\r\n                boxShadow: isDark\r\n                  ? '0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255,255,255,0.04)'\r\n                  : '0 10px 40px rgba(0, 0, 0, 0.12)',\r\n                backdropFilter: 'blur(16px)',\r\n              }}\r\n            >\r\n              {/* Header */}\r\n              <div className=\"px-3 pt-2.5 pb-1.5\">\r\n                <span className=\"text-[10px] font-medium uppercase tracking-[0.1em]\"\r\n                  style={{ color: isDark ? 'rgba(255,255,255,0.35)' : theme.textTertiary }}>\r\n                  {t.toolbar.visibility === 'Visibilidad' ? 'OPCIONES DE VISTA' : 'DISPLAY OPTIONS'}\r\n                </span>\r\n              </div>\r\n\r\n              {/* Toggle Options */}\r\n              <div className=\"py-0.5\">\r\n                {toggleOptions.map((option, index) => {\r\n                  const Icon = option.icon;\r\n                  const isDisabled = (option as any).disabled;\r\n                  const tooltipText = (option as any).tooltip;\r\n                  return (\r\n                    <motion.button\r\n                      key={option.key}\r\n                      onClick={() => !isDisabled && option.onChange?.(!option.active)}\r\n                      className=\"w-full flex items-center gap-2.5 px-3 py-2 text-[11px] transition-colors\"\r\n                      style={{\r\n                        color: isDisabled ? (isDark ? 'rgba(255,255,255,0.3)' : '#9CA3AF') : (isDark ? 'rgba(255,255,255,0.85)' : '#111827'),\r\n                        cursor: isDisabled ? 'not-allowed' : 'pointer',\r\n                      }}\r\n                      whileHover={isDisabled ? {} : { backgroundColor: theme.hoverBg }}\r\n                      initial={{ opacity: 0, x: -10 }}\r\n                      animate={{ opacity: 1, x: 0 }}\r\n                      transition={{ delay: index * 0.03 }}\r\n                      title={tooltipText}\r\n                    >\r\n                      <Icon className=\"w-3.5 h-3.5 flex-shrink-0\"\r\n                        style={{ color: isDisabled ? (isDark ? 'rgba(255,255,255,0.2)' : '#D1D5DB') : (option.active ? theme.accent || '#00E5CC' : theme.textTertiary) }} />\r\n                      <span className=\"flex-1 text-left\">{option.label}</span>\r\n                      {option.active && !isDisabled && <Check className=\"w-3.5 h-3.5\" style={{ color: theme.accent || '#00E5CC' }} />}\r\n                    </motion.button>\r\n                  );\r\n                })}\r\n              </div>\r\n\r\n              {/* Divider */}\r\n              <div className=\"mx-3 h-px\" style={{ backgroundColor: isDark ? 'rgba(255,255,255,0.06)' : theme.borderLight }} />\r\n\r\n              {/* Density Section */}\r\n              <div className=\"py-0.5\">\r\n                <div className=\"px-3 pt-2 pb-1\">\r\n                  <span className=\"text-[10px] font-medium uppercase tracking-[0.1em]\"\r\n                    style={{ color: isDark ? 'rgba(255,255,255,0.35)' : theme.textTertiary }}>\r\n                    {t.toolbar.visibility === 'Visibilidad' ? 'DENSIDAD' : 'DENSITY'}\r\n                  </span>\r\n                </div>\r\n                {densityOptions.map((option, index) => {\r\n                  const isActive = rowDensity === option.value;\r\n                  return (\r\n                    <motion.button\r\n                      key={option.value}\r\n                      onClick={() => onRowDensityChange(option.value)}\r\n                      className=\"w-full flex items-center justify-between px-3 py-2 text-[11px] transition-colors\"\r\n                      style={{ color: isDark ? 'rgba(255,255,255,0.85)' : '#111827' }}\r\n                      whileHover={{ backgroundColor: theme.hoverBg }}\r\n                      initial={{ opacity: 0, x: -10 }}\r\n                      animate={{ opacity: 1, x: 0 }}\r\n                      transition={{ delay: (toggleOptions.length + index) * 0.03 }}\r\n                    >\r\n                      <span style={{ color: isActive ? theme.accent || '#00E5CC' : (isDark ? 'rgba(255,255,255,0.85)' : theme.textPrimary) }}>\r\n                        {option.label}\r\n                      </span>\r\n                      {isActive && <Check className=\"w-3.5 h-3.5\" style={{ color: theme.accent || '#00E5CC' }} />}\r\n                    </motion.button>\r\n                  );\r\n                })}\r\n              </div>\r\n            </motion.div>\r\n          )}\r\n        </AnimatePresence>,\r\n        document.body\r\n      )}\r\n    </>\r\n  );\r\n}\r\n\r\n/** 1.9.34 · el «⋯» de la barra compacta: lo que se toca poco. */\r\nfunction MasHerramientas({ theme, etiqueta, children }: { theme: any; etiqueta: string; children: React.ReactNode }) {\r\n  const [abierto, setAbierto] = useState(false);\r\n  const ref = useRef<HTMLDivElement>(null);\r\n  useEffect(() => {\r\n    if (!abierto) return;\r\n    const fuera = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setAbierto(false); };\r\n    const esc = (e: KeyboardEvent) => { if (e.key === 'Escape') setAbierto(false); };\r\n    document.addEventListener('mousedown', fuera);\r\n    document.addEventListener('keydown', esc);\r\n    return () => { document.removeEventListener('mousedown', fuera); document.removeEventListener('keydown', esc); };\r\n  }, [abierto]);\r\n  return (\r\n    <div ref={ref} className=\"relative\">\r\n      <button\r\n        type=\"button\"\r\n        onClick={() => setAbierto((v) => !v)}\r\n        aria-label={etiqueta}\r\n        aria-expanded={abierto}\r\n        title={etiqueta}\r\n        className=\"flex items-center justify-center rounded-md\"\r\n        style={{ width: 32, height: 32, color: theme.textSecondary, border: `1px solid ${theme.borderLight}` }}\r\n      >\r\n        ⋯\r\n      </button>\r\n      {abierto && (\r\n        <div\r\n          className=\"absolute right-0 mt-1 p-1.5 rounded-lg shadow-lg\"\r\n          style={{ top: '100%', minWidth: 200, zIndex: 300, backgroundColor: theme.bgPrimary, border: `1px solid ${theme.borderLight}` }}\r\n        >\r\n          {children}\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n\r\nexport function GanttToolbar({\r\n  enCabecera = false,\r\n  theme,\r\n  timeScale,\r\n  onTimeScaleChange,\r\n  zoom,\r\n  onZoomChange,\r\n  currentTheme,\r\n  onThemeChange,\r\n  rowDensity,\r\n  onRowDensityChange,\r\n  showThemeSelector = false, // v0.17.29: Default to false - themes should be in app settings\r\n  showCreateTaskButton = false,\r\n  createTaskLabel, // v0.15.0: Will use translations if not provided\r\n  onCreateTask,\r\n  taskFilter = 'all', // v0.17.300: Task filter\r\n  onTaskFilterChange,\r\n  hideCompleted = false, // v0.18.0: Hide completed toggle\r\n  onHideCompletedChange,\r\n  toolbarRightContent,\r\n  // v3.0.0: WBS Level selector\r\n  wbsLevel,\r\n  onWbsLevelChange,\r\n  maxWbsDepth = 4,\r\n  // v3.0.0: Execution/Oracle view mode\r\n  viewMode = 'execution',\r\n  onViewModeChange,\r\n  // v3.1.0: Forecast HUD data\r\n  projectForecast,\r\n  hideForecastHud,\r\n  onExportPNG,\r\n  onExportPDF,\r\n  onExportExcel,\r\n  onExportCSV,\r\n  onExportJSON,\r\n  onExportMSProject,\r\n  // View Options\r\n  showCriticalPath = true,\r\n  onShowCriticalPathChange,\r\n  showDependencies = true,\r\n  onShowDependenciesChange,\r\n  highlightWeekends = true,\r\n  onHighlightWeekendsChange,\r\n  showBaseline = false,\r\n  onShowBaselineChange,\r\n  onCopySnapshotLink,\r\n  hasDependencies = true, // v5.1.0\r\n}: GanttToolbarProps) {\r\n  const t = useGanttI18n(); // v0.15.0: i18n\r\n  const hasExport = onExportPNG || onExportPDF || onExportExcel || onExportCSV || onExportJSON || onExportMSProject;\r\n  const isChronos = !!theme.glassToolbar;\r\n\r\n  // v0.16.0: Use minimal tabs for time scale (Linear/Notion style)\r\n  const timeScaleOptions = [\r\n    { value: 'day', label: t.toolbar.day },\r\n    { value: 'week', label: t.toolbar.week },\r\n    { value: 'month', label: t.toolbar.month },\r\n  ];\r\n\r\n  // v0.17.320: Task filter options moved to FilterDropdown component\r\n\r\n  const themeOptions = [\r\n    { value: 'dark', label: 'Dark', icon: <Moon className=\"w-3.5 h-3.5\" /> },\r\n    { value: 'light', label: 'Light', icon: <Sun className=\"w-3.5 h-3.5\" /> },\r\n    { value: 'neutral', label: 'Zen', icon: <Palette className=\"w-3.5 h-3.5\" /> },\r\n  ];\r\n\r\n  // ─── Chronos V2 Layout (all themes) ──────────────────────────────────\r\n  const isDark = theme.bgPrimary === '#050505' || theme.textPrimary === '#FFFFFF';\r\n\r\n  /*\r\n   * 1.9.34 · BARRA COMPACTA, para la cabecera de una fila de quien la pide\r\n   * (`toolbarContainer`). Lo de uso diario a la vista —escala, filtro, lo\r\n   * propio de la app, vista y compartir—; el modo de vista y el nivel WBS,\r\n   * que se tocan poco, en «⋯».\r\n   */\r\n  if (enCabecera) {\r\n    return (\r\n      <div className=\"flex items-center gap-2\">\r\n        <TimeCapsule value={timeScale} onChange={onTimeScaleChange} theme={theme} />\r\n        {onTaskFilterChange && (\r\n          <FilterDropdown\r\n            theme={theme}\r\n            value={taskFilter}\r\n            onChange={onTaskFilterChange}\r\n            hideCompleted={hideCompleted}\r\n            onHideCompletedChange={onHideCompletedChange}\r\n          />\r\n        )}\r\n        {toolbarRightContent}\r\n        <ViewOptionsDropdown\r\n          theme={theme}\r\n          showCriticalPath={showCriticalPath}\r\n          onShowCriticalPathChange={onShowCriticalPathChange}\r\n          showBaseline={showBaseline}\r\n          onShowBaselineChange={onShowBaselineChange}\r\n          highlightWeekends={highlightWeekends}\r\n          onHighlightWeekendsChange={onHighlightWeekendsChange}\r\n          showDependencies={showDependencies}\r\n          onShowDependenciesChange={onShowDependenciesChange}\r\n          rowDensity={rowDensity}\r\n          onRowDensityChange={onRowDensityChange}\r\n          hasDependencies={hasDependencies}\r\n        />\r\n        <ShareExportDropdown\r\n          theme={theme}\r\n          onExportPNG={onExportPNG}\r\n          onExportPDF={onExportPDF}\r\n          onExportExcel={onExportExcel}\r\n          onExportMSProject={onExportMSProject}\r\n          onCopySnapshotLink={onCopySnapshotLink}\r\n        />\r\n        {(onViewModeChange || onWbsLevelChange) && (\r\n          <MasHerramientas theme={theme} etiqueta={t.toolbar.today === 'Hoy' ? 'Más opciones' : 'More options'}>\r\n            {onViewModeChange && (\r\n              <div className=\"flex flex-col gap-1\">\r\n                {(['execution', 'oracle'] as const).map((m) => (\r\n                  <button\r\n                    key={m}\r\n                    type=\"button\"\r\n                    onClick={() => onViewModeChange(m)}\r\n                    className=\"flex items-center justify-between gap-3 px-2 py-1.5 rounded-md text-[12px] text-left\"\r\n                    style={{\r\n                      color: theme.textPrimary,\r\n                      backgroundColor: viewMode === m ? (isDark ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.05)') : 'transparent',\r\n                    }}\r\n                  >\r\n                    {m === 'execution' ? t.toolbar.viewExecution : t.toolbar.viewOracle}\r\n                    {viewMode === m && <Check className=\"w-3.5 h-3.5\" />}\r\n                  </button>\r\n                ))}\r\n              </div>\r\n            )}\r\n            {onWbsLevelChange && (\r\n              <div className=\"pt-1 mt-1\" style={{ borderTop: `1px solid ${theme.borderLight}` }}>\r\n                <WbsLevelDropdown theme={theme} value={wbsLevel ?? 'all'} onChange={onWbsLevelChange} maxDepth={maxWbsDepth} />\r\n              </div>\r\n            )}\r\n          </MasHerramientas>\r\n        )}\r\n      </div>\r\n    );\r\n  }\r\n\r\n  if (isChronos) {\r\n    const dividerColor = isDark ? 'rgba(255,255,255,0.08)' : theme.borderLight;\r\n\r\n    return (\r\n      <div className=\"flex flex-col\">\r\n        {/* Bar 1: Glass Toolbar (52px) */}\r\n        <div\r\n          className=\"h-[52px] px-4 flex items-center justify-between border-b\"\r\n          style={{\r\n            backgroundColor: theme.glassToolbar,\r\n            borderColor: theme.borderLight,\r\n            backdropFilter: 'blur(12px)',\r\n          }}\r\n        >\r\n          {/* Left section (el buscador-lupa se eliminó por redundante con el\r\n              buscador global del header; además su input no filtraba nada). */}\r\n          <div className=\"flex items-center gap-3\">\r\n            {/* Segmented Control: Execution | Oracle View — only if onViewModeChange provided */}\r\n            {onViewModeChange && (\r\n              <div\r\n                className=\"inline-flex items-center rounded-full p-0.5\"\r\n                style={{\r\n                  backgroundColor: isDark ? '#000000' : theme.bgSecondary,\r\n                  border: `1px solid ${isDark ? 'rgba(255,255,255,0.08)' : theme.border}`,\r\n                }}\r\n              >\r\n                <motion.button\r\n                  onClick={() => onViewModeChange('execution')}\r\n                  className=\"px-3 py-1.5 rounded-full text-[11px] font-medium transition-colors\"\r\n                  style={{\r\n                    backgroundColor: viewMode === 'execution'\r\n                      ? (isDark ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.06)')\r\n                      : 'transparent',\r\n                    color: viewMode === 'execution' ? theme.textPrimary : theme.textTertiary,\r\n                    fontFamily: 'Inter, sans-serif',\r\n                  }}\r\n                  whileHover={viewMode !== 'execution' ? { color: theme.textSecondary } : {}}\r\n                >\r\n                  {t.toolbar.viewExecution}\r\n                </motion.button>\r\n                <motion.button\r\n                  onClick={() => onViewModeChange('oracle')}\r\n                  className=\"px-3 py-1.5 rounded-full text-[11px] font-medium transition-colors\"\r\n                  style={{\r\n                    backgroundColor: viewMode === 'oracle'\r\n                      ? (isDark ? 'rgba(0, 229, 204,0.15)' : 'rgba(0, 196, 174,0.08)')\r\n                      : 'transparent',\r\n                    color: viewMode === 'oracle'\r\n                      ? (isDark ? '#00E5CC' : '#00E5CC')\r\n                      : theme.textTertiary,\r\n                    fontFamily: 'Inter, sans-serif',\r\n                  }}\r\n                  whileHover={viewMode !== 'oracle' ? { color: theme.textSecondary } : {}}\r\n                >\r\n                  {t.toolbar.viewOracle}\r\n                </motion.button>\r\n              </div>\r\n            )}\r\n          </div>\r\n\r\n          {/* Right: Time Capsule + Icons + Create Task */}\r\n          <div className=\"flex items-center gap-3\">\r\n            {/* Time Capsule */}\r\n            <TimeCapsule value={timeScale} onChange={onTimeScaleChange} theme={theme} />\r\n\r\n            {/* Divider */}\r\n            <div className=\"w-px h-5\" style={{ backgroundColor: dividerColor }} />\r\n\r\n            {/* v3.0.0: WBS Level Selector */}\r\n            {onWbsLevelChange && (\r\n              <WbsLevelDropdown\r\n                theme={theme}\r\n                value={wbsLevel ?? 'all'}\r\n                onChange={onWbsLevelChange}\r\n                maxDepth={maxWbsDepth}\r\n              />\r\n            )}\r\n\r\n            {/* Filter */}\r\n            {onTaskFilterChange && (\r\n              <FilterDropdown\r\n                theme={theme}\r\n                value={taskFilter}\r\n                onChange={onTaskFilterChange}\r\n                hideCompleted={hideCompleted}\r\n                onHideCompletedChange={onHideCompletedChange}\r\n              />\r\n            )}\r\n\r\n            {/* Custom right content (e.g. Hrs/$ lens toggle) */}\r\n            {toolbarRightContent && (\r\n              <>\r\n                <div className=\"w-px h-5\" style={{ backgroundColor: dividerColor }} />\r\n                {toolbarRightContent}\r\n              </>\r\n            )}\r\n\r\n            {/* Divider */}\r\n            <div className=\"w-px h-5\" style={{ backgroundColor: dividerColor }} />\r\n\r\n            {/* View Options Dropdown (Eye icon) */}\r\n            <ViewOptionsDropdown\r\n              theme={theme}\r\n              showCriticalPath={showCriticalPath}\r\n              onShowCriticalPathChange={onShowCriticalPathChange}\r\n              showBaseline={showBaseline}\r\n              onShowBaselineChange={onShowBaselineChange}\r\n              highlightWeekends={highlightWeekends}\r\n              onHighlightWeekendsChange={onHighlightWeekendsChange}\r\n              showDependencies={showDependencies}\r\n              onShowDependenciesChange={onShowDependenciesChange}\r\n              rowDensity={rowDensity}\r\n              onRowDensityChange={onRowDensityChange}\r\n              hasDependencies={hasDependencies}\r\n            />\r\n\r\n            {/* Share & Export Dropdown */}\r\n            <ShareExportDropdown\r\n              theme={theme}\r\n              onExportPNG={onExportPNG}\r\n              onExportPDF={onExportPDF}\r\n              onExportExcel={onExportExcel}\r\n              onExportMSProject={onExportMSProject}\r\n              onCopySnapshotLink={onCopySnapshotLink}\r\n            />\r\n\r\n            {/* Create Task Button */}\r\n            {showCreateTaskButton && onCreateTask && (\r\n              <motion.button\r\n                onClick={onCreateTask}\r\n                className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg text-[11px]\"\r\n                style={{\r\n                  background: `linear-gradient(135deg, ${theme.accent} 0%, ${theme.accentHover} 100%)`,\r\n                  color: '#FFFFFF',\r\n                  fontFamily: 'Inter, sans-serif',\r\n                  fontWeight: 500,\r\n                  boxShadow: `0 2px 8px ${isDark ? 'rgba(0, 229, 204,0.3)' : 'rgba(0, 196, 174,0.3)'}`,\r\n                }}\r\n                whileHover={{ scale: 1.02, boxShadow: `0 4px 12px ${isDark ? 'rgba(0, 229, 204,0.4)' : 'rgba(0, 196, 174,0.4)'}` }}\r\n                whileTap={{ scale: 0.98 }}\r\n              >\r\n                <Plus className=\"w-3.5 h-3.5\" />\r\n                <span>{createTaskLabel || t.toolbar.createTask}</span>\r\n              </motion.button>\r\n            )}\r\n          </div>\r\n        </div>\r\n\r\n        {/* Bar 2: Forecast HUD Panel (48px) — only if forecast data provided */}\r\n        {projectForecast && !hideForecastHud && <ForecastHUD theme={theme} forecast={projectForecast} />}\r\n      </div>\r\n    );\r\n  }\r\n\r\n  // ─── Standard Layout (light/neutral themes) ───────────────────────────\r\n  return (\r\n    <div\r\n      className=\"h-12 px-4 flex items-center justify-between border-b\"\r\n      style={{\r\n        backgroundColor: theme.bgGrid,\r\n        borderColor: theme.border,\r\n      }}\r\n    >\r\n      {/* Left Section - Time Scale as Minimal Tabs */}\r\n      <div className=\"flex items-center gap-3\">\r\n        {/* v0.16.0: Minimal tabs for time scale */}\r\n        <MinimalTabs\r\n          options={timeScaleOptions}\r\n          value={timeScale}\r\n          onChange={(val) => onTimeScaleChange(val as TimeScale)}\r\n          theme={theme}\r\n        />\r\n\r\n        {/* Divider */}\r\n        <div\r\n          className=\"w-px h-5\"\r\n          style={{ backgroundColor: theme.borderLight }}\r\n        />\r\n\r\n        {/* Zoom Controls - Compact */}\r\n        <div className=\"flex items-center gap-1\">\r\n          <motion.button\r\n            onClick={() => onZoomChange(Math.max(0.5, zoom - 0.1))}\r\n            className=\"p-1.5 rounded-md transition-all\"\r\n            style={{\r\n              backgroundColor: 'transparent',\r\n              color: theme.textSecondary,\r\n            }}\r\n            whileHover={{\r\n              backgroundColor: theme.hoverBg,\r\n              scale: 1.05,\r\n            }}\r\n            whileTap={{ scale: 0.95 }}\r\n          >\r\n            <ZoomOut className=\"w-3.5 h-3.5\" />\r\n          </motion.button>\r\n\r\n          <div\r\n            className=\"px-2 py-0.5 rounded text-[11px] tabular-nums min-w-[42px] text-center\"\r\n            style={{\r\n              color: theme.textSecondary,\r\n              fontFamily: \"'JetBrains Mono', monospace\",\r\n              fontWeight: 500,\r\n            }}\r\n          >\r\n            {Math.round(zoom * 100)}%\r\n          </div>\r\n\r\n          <motion.button\r\n            onClick={() => onZoomChange(Math.min(2, zoom + 0.1))}\r\n            className=\"p-1.5 rounded-md transition-all\"\r\n            style={{\r\n              backgroundColor: 'transparent',\r\n              color: theme.textSecondary,\r\n            }}\r\n            whileHover={{\r\n              backgroundColor: theme.hoverBg,\r\n              scale: 1.05,\r\n            }}\r\n            whileTap={{ scale: 0.95 }}\r\n          >\r\n            <ZoomIn className=\"w-3.5 h-3.5\" />\r\n          </motion.button>\r\n        </div>\r\n\r\n        {/* Divider */}\r\n        <div\r\n          className=\"w-px h-5\"\r\n          style={{ backgroundColor: theme.borderLight }}\r\n        />\r\n\r\n        {/* v3.0.0: WBS Level Selector */}\r\n        {onWbsLevelChange && (\r\n          <WbsLevelDropdown\r\n            theme={theme}\r\n            value={wbsLevel ?? 'all'}\r\n            onChange={onWbsLevelChange}\r\n            maxDepth={maxWbsDepth}\r\n          />\r\n        )}\r\n\r\n        {/* v0.17.320: Professional Filter Dropdown */}\r\n        {onTaskFilterChange && (\r\n          <>\r\n            {/* Divider */}\r\n            <div\r\n              className=\"w-px h-5\"\r\n              style={{ backgroundColor: theme.borderLight }}\r\n            />\r\n\r\n            {/* Filter Dropdown */}\r\n            <FilterDropdown\r\n              theme={theme}\r\n              value={taskFilter}\r\n              onChange={onTaskFilterChange}\r\n              hideCompleted={hideCompleted}\r\n              onHideCompletedChange={onHideCompletedChange}\r\n            />\r\n          </>\r\n        )}\r\n      </div>\r\n\r\n      {/* Right Section - Custom content + Create Task + Export + Theme Selector */}\r\n      <div className=\"flex items-center gap-3\">\r\n        {/* Custom right content (e.g. Hrs/$ lens toggle) */}\r\n        {toolbarRightContent && (\r\n          <>\r\n            {toolbarRightContent}\r\n            <div className=\"w-px h-5\" style={{ backgroundColor: theme.borderLight }} />\r\n          </>\r\n        )}\r\n        {/* v0.14.3: Create Task Button */}\r\n        {showCreateTaskButton && onCreateTask && (\r\n          <>\r\n            <motion.button\r\n              onClick={onCreateTask}\r\n              className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg text-[11px] transition-all\"\r\n              style={{\r\n                background: 'linear-gradient(135deg, #00E5CC 0%, #00E5CC 100%)',\r\n                color: '#FFFFFF',\r\n                fontFamily: 'Inter, sans-serif',\r\n                fontWeight: 500,\r\n                boxShadow: '0 2px 8px rgba(0, 229, 204, 0.3)',\r\n              }}\r\n              whileHover={{\r\n                scale: 1.02,\r\n                boxShadow: '0 4px 12px rgba(0, 229, 204, 0.4)',\r\n              }}\r\n              whileTap={{ scale: 0.98 }}\r\n            >\r\n              <Plus className=\"w-3.5 h-3.5\" />\r\n              <span>{createTaskLabel || t.toolbar.createTask}</span>\r\n            </motion.button>\r\n            {(hasExport || showThemeSelector) && (\r\n              <div\r\n                className=\"w-px h-6\"\r\n                style={{ backgroundColor: theme.borderLight }}\r\n              />\r\n            )}\r\n          </>\r\n        )}\r\n\r\n        <ShareExportDropdown\r\n          theme={theme}\r\n          onExportPNG={onExportPNG}\r\n          onExportPDF={onExportPDF}\r\n          onExportExcel={onExportExcel}\r\n          onExportMSProject={onExportMSProject}\r\n          onCopySnapshotLink={onCopySnapshotLink}\r\n        />\r\n        {showThemeSelector && (\r\n          <div\r\n            className=\"w-px h-6\"\r\n            style={{ backgroundColor: theme.borderLight }}\r\n          />\r\n        )}\r\n        {showThemeSelector && (\r\n          <SegmentedControl\r\n            options={themeOptions}\r\n            value={currentTheme}\r\n            onChange={(val) => onThemeChange(val as Theme)}\r\n            theme={theme}\r\n          />\r\n        )}\r\n      </div>\r\n    </div>\r\n  );\r\n}","import { useState, useRef, useEffect } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { Columns3, Check } from 'lucide-react';\r\nimport { useGanttI18n } from './GanttI18nContext';\r\nimport { Portal } from '../Portal';\r\nimport { GanttColumn, ColumnType } from './types';\r\n\r\ninterface ColumnManagerProps {\r\n  columns: GanttColumn[];\r\n  onToggleColumn: (columnId: ColumnType) => void;\r\n  theme: any;\r\n}\r\n\r\nexport function ColumnManager({ columns, onToggleColumn, theme }: ColumnManagerProps) {\r\n  const tr = useGanttI18n();\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 });\r\n  const menuRef = useRef<HTMLDivElement>(null);\r\n  const buttonRef = useRef<HTMLButtonElement>(null);\r\n\r\n  useEffect(() => {\r\n    if (!isOpen) return;\r\n\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n\r\n    document.addEventListener('mousedown', handleClickOutside);\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  const availableColumns = columns.filter(col => col.id !== 'name');\r\n\r\n  return (\r\n    <>\r\n      <motion.button\r\n        ref={buttonRef}\r\n        onClick={() => {\r\n          if (!isOpen && buttonRef.current) {\r\n            const rect = buttonRef.current.getBoundingClientRect();\r\n            setMenuPosition({ x: rect.left, y: rect.bottom + 4 });\r\n          }\r\n          setIsOpen(!isOpen);\r\n        }}\r\n        className=\"p-2 rounded-md transition-colors flex items-center gap-1\"\r\n        title={tr.toolbar.columns || 'Columns'}\r\n        aria-label={tr.toolbar.columns || 'Columns'}\r\n        style={{\r\n          backgroundColor: theme.bgSecondary,\r\n          border: `1px solid ${theme.borderLight}`,\r\n          color: theme.textSecondary,\r\n        }}\r\n        whileHover={{\r\n          backgroundColor: theme.hoverBg,\r\n          scale: 1.05,\r\n        }}\r\n        whileTap={{ scale: 0.95 }}\r\n      >\r\n        {/* 1.9.44 · Yesid: «+» se entiende como «crear»; esto abre las columnas. */}\r\n        <Columns3 className=\"w-4 h-4\" />\r\n      </motion.button>\r\n\r\n      <AnimatePresence>\r\n        {isOpen && (\r\n          <Portal>\r\n            <motion.div\r\n              ref={menuRef}\r\n              initial={{ opacity: 0, scale: 0.95, y: -10 }}\r\n              animate={{ opacity: 1, scale: 1, y: 0 }}\r\n              exit={{ opacity: 0, scale: 0.95, y: -10 }}\r\n              transition={{ duration: 0.15 }}\r\n              className=\"column-manager-menu fixed min-w-[180px] rounded-lg shadow-xl z-[9999]\"\r\n              style={{\r\n                left: `${menuPosition.x}px`,\r\n                top: `${menuPosition.y}px`,\r\n                backgroundColor: theme.bgSecondary,\r\n                border: `1px solid ${theme.border}`,\r\n              }}\r\n            >\r\n              <div className=\"py-1\">\r\n                <div\r\n                  className=\"px-3 py-2 text-xs uppercase tracking-wider\"\r\n                  style={{\r\n                    color: theme.textTertiary,\r\n                    fontFamily: 'Inter, sans-serif',\r\n                    fontWeight: 600,\r\n                  }}\r\n                >\r\n                  Add Column\r\n                </div>\r\n                {availableColumns.map((column) => (\r\n                  <button\r\n                    key={column.id}\r\n                    onClick={() => {\r\n                      onToggleColumn(column.id);\r\n                    }}\r\n                    className=\"w-full px-3 py-2 text-left flex items-center justify-between transition-colors text-sm\"\r\n                    style={{\r\n                      color: theme.textPrimary,\r\n                      backgroundColor: 'transparent',\r\n                      fontFamily: 'Inter, sans-serif',\r\n                    }}\r\n                    onMouseEnter={(e) => {\r\n                      e.currentTarget.style.backgroundColor = theme.hoverBg;\r\n                    }}\r\n                    onMouseLeave={(e) => {\r\n                      e.currentTarget.style.backgroundColor = 'transparent';\r\n                    }}\r\n                  >\r\n                    <span>{column.label}</span>\r\n                    {column.visible && (\r\n                      <Check className=\"w-4 h-4\" style={{ color: theme.accent }} />\r\n                    )}\r\n                  </button>\r\n                ))}\r\n              </div>\r\n            </motion.div>\r\n          </Portal>\r\n        )}\r\n      </AnimatePresence>\r\n    </>\r\n  );\r\n}\r\n","import { useEffect, useRef, useState } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport {\n  Plus,\n  Minus,\n  Edit3,\n  Trash2,\n  Link2,\n  BarChart3,\n  ArrowUpDown,\n  ArrowUp,\n  ArrowDown,\n  ChevronRight,\n  Eye,\n  EyeOff,\n  Settings,\n  Scissors, // v0.8.0: For Split task\n  Circle, // v0.16.0: For Mark Incomplete\n  PlayCircle, // v0.16.0: For Set In Progress\n  CheckCircle2, // v0.16.0: For Mark Complete\n  Pencil, // v0.16.0: Alias for Edit\n  Copy, // v1.4.3: For Duplicate task\n} from 'lucide-react';\n\nexport interface ContextMenuItem {\n  id: string;\n  label: string;\n  icon?: React.ReactNode;\n  onClick: () => void;\n  separator?: boolean;\n  disabled?: boolean;\n  submenu?: ContextMenuItem[];\n}\n\ninterface ContextMenuProps {\n  isOpen: boolean;\n  x: number;\n  y: number;\n  items: ContextMenuItem[];\n  onClose: () => void;\n  theme: any;\n}\n\nexport function ContextMenu({ isOpen, x, y, items, onClose, theme }: ContextMenuProps) {\n  const menuRef = useRef<HTMLDivElement>(null);\n  // v0.17.32: Adaptive positioning to prevent menu from being cut off at edges\n  const [adjustedPosition, setAdjustedPosition] = useState({ x, y });\n\n  // v0.17.32: Calculate adjusted position when menu opens or position changes\n  useEffect(() => {\n    if (!isOpen) return;\n\n    // Menu dimensions (approximate - will be refined after render)\n    const menuWidth = 200; // min-w-[200px]\n    const menuHeight = items.length * 36 + 8; // ~36px per item + padding\n    const padding = 8; // Distance from edge\n\n    // Get viewport dimensions\n    const viewportWidth = window.innerWidth;\n    const viewportHeight = window.innerHeight;\n\n    let adjustedX = x;\n    let adjustedY = y;\n\n    // Adjust X if menu would overflow right edge\n    if (x + menuWidth + padding > viewportWidth) {\n      adjustedX = x - menuWidth; // Show to the left of cursor\n      // Ensure it doesn't go off left edge\n      if (adjustedX < padding) {\n        adjustedX = padding;\n      }\n    }\n\n    // Adjust Y if menu would overflow bottom edge\n    if (y + menuHeight + padding > viewportHeight) {\n      adjustedY = viewportHeight - menuHeight - padding;\n      // Ensure it doesn't go off top edge\n      if (adjustedY < padding) {\n        adjustedY = padding;\n      }\n    }\n\n    setAdjustedPosition({ x: adjustedX, y: adjustedY });\n  }, [isOpen, x, y, items.length]);\n\n  useEffect(() => {\n    if (!isOpen) return;\n\n    const handleClickOutside = (e: MouseEvent) => {\n      if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n        onClose();\n      }\n    };\n\n    const handleEscape = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') {\n        onClose();\n      }\n    };\n\n    document.addEventListener('mousedown', handleClickOutside);\n    document.addEventListener('keydown', handleEscape);\n\n    return () => {\n      document.removeEventListener('mousedown', handleClickOutside);\n      document.removeEventListener('keydown', handleEscape);\n    };\n  }, [isOpen, onClose]);\n\n  if (!isOpen) return null;\n\n  // v0.17.33: Ensure solid background color (not transparent)\n  // Some themes use rgba colors, so we need to ensure full opacity\n  const getSolidBackground = (color: string): string => {\n    // If it's already a solid hex color, return as-is\n    if (color.startsWith('#') && (color.length === 7 || color.length === 4)) {\n      return color;\n    }\n    // For dark themes, use a solid dark color\n    // For light themes, use a solid light color\n    const isDarkTheme = theme.bgPrimary?.includes('1') || theme.bgPrimary?.includes('2') ||\n                        theme.textPrimary?.toLowerCase().includes('fff') ||\n                        theme.textPrimary?.toLowerCase().includes('white');\n    return isDarkTheme ? '#1E2128' : '#FFFFFF';\n  };\n\n  return (\n    <AnimatePresence>\n      <motion.div\n        ref={menuRef}\n        initial={{ opacity: 0, scale: 0.95, y: -10 }}\n        animate={{ opacity: 1, scale: 1, y: 0 }}\n        exit={{ opacity: 0, scale: 0.95, y: -10 }}\n        transition={{ duration: 0.15, ease: [0.4, 0, 0.2, 1] }}\n        className=\"fixed z-[9999] min-w-[200px] rounded-lg\"\n        style={{\n          left: `${adjustedPosition.x}px`,\n          top: `${adjustedPosition.y}px`,\n          backgroundColor: getSolidBackground(theme.bgSecondary),\n          border: `1px solid ${theme.border}`,\n          boxShadow: '0 10px 40px rgba(0, 0, 0, 0.3), 0 4px 12px rgba(0, 0, 0, 0.2)',\n          backdropFilter: 'none', // v0.17.33: Ensure no blur effect\n        }}\n      >\n        <div className=\"py-1\">\n          {items.map((item) => (\n            <div key={item.id}>\n              {item.separator && (\n                <div\n                  className=\"my-1 h-px\"\n                  style={{ backgroundColor: theme.borderLight }}\n                />\n              )}\n              <button\n                onClick={() => {\n                  if (!item.disabled) {\n                    item.onClick();\n                    onClose();\n                  }\n                }}\n                disabled={item.disabled}\n                className=\"w-full px-3 py-2 text-left flex items-center gap-2 transition-colors text-sm\"\n                style={{\n                  color: item.disabled ? theme.textTertiary : theme.textPrimary,\n                  backgroundColor: 'transparent',\n                  fontFamily: 'Inter, sans-serif',\n                  cursor: item.disabled ? 'not-allowed' : 'pointer',\n                  opacity: item.disabled ? 0.5 : 1,\n                }}\n                onMouseEnter={(e) => {\n                  if (!item.disabled) {\n                    e.currentTarget.style.backgroundColor = theme.hoverBg;\n                  }\n                }}\n                onMouseLeave={(e) => {\n                  e.currentTarget.style.backgroundColor = 'transparent';\n                }}\n              >\n                {item.icon && (\n                  <span style={{ color: theme.textSecondary }}>\n                    {item.icon}\n                  </span>\n                )}\n                <span className=\"flex-1\">{item.label}</span>\n                {item.submenu && (\n                  <ChevronRight className=\"w-3.5 h-3.5\" style={{ color: theme.textTertiary }} />\n                )}\n              </button>\n            </div>\n          ))}\n        </div>\n      </motion.div>\n    </AnimatePresence>\n  );\n}\n\n// Icon components for menu items\nexport const MenuIcons = {\n  Edit: <Edit3 className=\"w-4 h-4\" />,\n  Pencil: <Pencil className=\"w-4 h-4\" />, // v0.16.0: Alias for Edit\n  Delete: <Trash2 className=\"w-4 h-4\" />,\n  Add: <Plus className=\"w-4 h-4\" />,\n  AddSubtask: <Plus className=\"w-4 h-4\" />, // v0.16.0: Add subtask\n  Remove: <Minus className=\"w-4 h-4\" />,\n  Link: <Link2 className=\"w-4 h-4\" />,\n  Progress: <BarChart3 className=\"w-4 h-4\" />,\n  Sort: <ArrowUpDown className=\"w-4 h-4\" />,\n  SortAsc: <ArrowUp className=\"w-4 h-4\" />,\n  SortDesc: <ArrowDown className=\"w-4 h-4\" />,\n  Hide: <EyeOff className=\"w-4 h-4\" />,\n  Show: <Eye className=\"w-4 h-4\" />,\n  Settings: <Settings className=\"w-4 h-4\" />,\n  Split: <Scissors className=\"w-4 h-4\" />, // v0.8.0: Split task\n  Duplicate: <Copy className=\"w-4 h-4\" />, // v1.4.3: Duplicate task\n  // v0.16.0: Task status icons\n  MarkIncomplete: <Circle className=\"w-4 h-4\" />,\n  SetInProgress: <PlayCircle className=\"w-4 h-4\" />,\n  MarkComplete: <CheckCircle2 className=\"w-4 h-4\" />,\n};\n","import { useEffect, useCallback, useRef } from 'react';\nimport { Task } from './types';\n\ninterface UseGanttKeyboardProps {\n  tasks: Task[];\n  selectedTaskIds: Set<string>;\n  onTaskSelect: (taskId: string, multiSelect?: boolean) => void;\n  onTaskCreate: (afterTaskId: string, direction: 'above' | 'below') => void;\n  onTaskDelete: (taskIds: string[]) => void;\n  onTaskDuplicate: (taskIds: string[]) => void;\n  onTaskMove: (taskIds: string[], direction: 'up' | 'down') => void;\n  onTaskIndent: (taskIds: string[]) => void;\n  onTaskOutdent: (taskIds: string[]) => void;\n  onTaskRename: (taskId: string) => void;\n  onTaskToggleExpand: (taskId: string) => void;\n  onOpenTaskModal: (taskId: string) => void;\n  enableKeyboard?: boolean;\n}\n\nexport function useGanttKeyboard({\n  tasks,\n  selectedTaskIds,\n  onTaskSelect,\n  onTaskCreate,\n  onTaskDelete,\n  onTaskDuplicate,\n  onTaskMove,\n  onTaskIndent,\n  onTaskOutdent,\n  onTaskRename,\n  onTaskToggleExpand,\n  onOpenTaskModal,\n  enableKeyboard = true,\n}: UseGanttKeyboardProps) {\n  const isEditingRef = useRef(false);\n\n  // Set editing state from outside\n  const setIsEditing = useCallback((editing: boolean) => {\n    isEditingRef.current = editing;\n  }, []);\n\n  // Flatten tasks for navigation\n  const flattenTasks = useCallback((tasks: Task[]): Task[] => {\n    const result: Task[] = [];\n    const traverse = (tasks: Task[]) => {\n      for (const task of tasks) {\n        result.push(task);\n        if (task.subtasks && task.subtasks.length > 0 && task.isExpanded) {\n          traverse(task.subtasks);\n        }\n      }\n    };\n    traverse(tasks);\n    return result;\n  }, []);\n\n  // Get first selected task\n  const getFirstSelectedTask = useCallback(() => {\n    const flatTasks = flattenTasks(tasks);\n    for (const task of flatTasks) {\n      if (selectedTaskIds.has(task.id)) {\n        return task;\n      }\n    }\n    return null;\n  }, [tasks, selectedTaskIds, flattenTasks]);\n\n  // Navigate with arrow keys\n  const handleNavigation = useCallback(\n    (direction: 'up' | 'down', multiSelect: boolean) => {\n      const flatTasks = flattenTasks(tasks);\n      if (flatTasks.length === 0) return;\n\n      const selectedTask = getFirstSelectedTask();\n      if (!selectedTask) {\n        // No selection, select first task\n        onTaskSelect(flatTasks[0].id, false);\n        return;\n      }\n\n      const currentIndex = flatTasks.findIndex((t) => t.id === selectedTask.id);\n      if (currentIndex === -1) return;\n\n      const nextIndex = direction === 'up' ? currentIndex - 1 : currentIndex + 1;\n      if (nextIndex < 0 || nextIndex >= flatTasks.length) return;\n\n      const nextTask = flatTasks[nextIndex];\n      onTaskSelect(nextTask.id, multiSelect);\n    },\n    [tasks, getFirstSelectedTask, flattenTasks, onTaskSelect]\n  );\n\n  // Handle keyboard shortcuts\n  const handleKeyDown = useCallback(\n    (e: KeyboardEvent) => {\n      // Ignore if keyboard is disabled\n      if (!enableKeyboard) return;\n\n      // Ignore if user is typing in an input/textarea\n      const target = e.target as HTMLElement;\n      const isInputField =\n        target.tagName === 'INPUT' ||\n        target.tagName === 'TEXTAREA' ||\n        target.isContentEditable ||\n        isEditingRef.current;\n\n      if (isInputField) {\n        // Only allow Escape to cancel editing\n        if (e.key === 'Escape') {\n          target.blur();\n          isEditingRef.current = false;\n        }\n        return;\n      }\n\n      const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n      const ctrlOrCmd = isMac ? e.metaKey : e.ctrlKey;\n      const selectedIds = Array.from(selectedTaskIds);\n      const selectedTask = getFirstSelectedTask();\n\n      // Navigation: Arrow Up/Down\n      if (e.key === 'ArrowUp') {\n        e.preventDefault();\n        handleNavigation('up', e.shiftKey);\n        return;\n      }\n      if (e.key === 'ArrowDown') {\n        e.preventDefault();\n        handleNavigation('down', e.shiftKey);\n        return;\n      }\n\n      // Expand/Collapse: Arrow Right/Left\n      if (selectedTask && (e.key === 'ArrowRight' || e.key === 'ArrowLeft')) {\n        if (selectedTask.subtasks && selectedTask.subtasks.length > 0) {\n          e.preventDefault();\n          if (e.key === 'ArrowRight' && !selectedTask.isExpanded) {\n            onTaskToggleExpand(selectedTask.id);\n          } else if (e.key === 'ArrowLeft' && selectedTask.isExpanded) {\n            onTaskToggleExpand(selectedTask.id);\n          }\n        }\n        return;\n      }\n\n      // Move: Alt + Arrow Up/Down\n      if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n        if (selectedIds.length > 0) {\n          e.preventDefault();\n          onTaskMove(selectedIds, e.key === 'ArrowUp' ? 'up' : 'down');\n        }\n        return;\n      }\n\n      // Indent: Tab\n      if (e.key === 'Tab' && !e.shiftKey) {\n        if (selectedIds.length > 0) {\n          e.preventDefault();\n          onTaskIndent(selectedIds);\n        }\n        return;\n      }\n\n      // Outdent: Shift + Tab\n      if (e.key === 'Tab' && e.shiftKey) {\n        if (selectedIds.length > 0) {\n          e.preventDefault();\n          onTaskOutdent(selectedIds);\n        }\n        return;\n      }\n\n      // Create below: Enter\n      if (e.key === 'Enter' && !e.shiftKey && !ctrlOrCmd) {\n        if (selectedTask) {\n          e.preventDefault();\n          onTaskCreate(selectedTask.id, 'below');\n        }\n        return;\n      }\n\n      // Create above: Shift + Enter\n      if (e.key === 'Enter' && e.shiftKey && !ctrlOrCmd) {\n        if (selectedTask) {\n          e.preventDefault();\n          onTaskCreate(selectedTask.id, 'above');\n        }\n        return;\n      }\n\n      // Open modal: Ctrl/Cmd + Enter\n      if (e.key === 'Enter' && ctrlOrCmd) {\n        if (selectedTask) {\n          e.preventDefault();\n          onOpenTaskModal(selectedTask.id);\n        }\n        return;\n      }\n\n      // Rename: F2\n      if (e.key === 'F2') {\n        if (selectedTask) {\n          e.preventDefault();\n          onTaskRename(selectedTask.id);\n        }\n        return;\n      }\n\n      // Delete: Delete or Cmd/Ctrl + Backspace\n      if (e.key === 'Delete' || (e.key === 'Backspace' && ctrlOrCmd)) {\n        if (selectedIds.length > 0) {\n          e.preventDefault();\n          onTaskDelete(selectedIds);\n        }\n        return;\n      }\n\n      // Duplicate: Ctrl/Cmd + D\n      if (e.key === 'd' && ctrlOrCmd && !e.shiftKey) {\n        if (selectedIds.length > 0) {\n          e.preventDefault();\n          onTaskDuplicate(selectedIds);\n        }\n        return;\n      }\n    },\n    [\n      enableKeyboard,\n      selectedTaskIds,\n      getFirstSelectedTask,\n      handleNavigation,\n      onTaskCreate,\n      onTaskDelete,\n      onTaskDuplicate,\n      onTaskMove,\n      onTaskIndent,\n      onTaskOutdent,\n      onTaskRename,\n      onTaskToggleExpand,\n      onOpenTaskModal,\n    ]\n  );\n\n  // Register keyboard event listener\n  useEffect(() => {\n    if (!enableKeyboard) return;\n\n    window.addEventListener('keydown', handleKeyDown);\n    return () => {\n      window.removeEventListener('keydown', handleKeyDown);\n    };\n  }, [enableKeyboard, handleKeyDown]);\n\n  return { setIsEditing };\n}\n","import { useState, useCallback, useEffect } from 'react';\r\n\r\n/**\r\n * ═══ LA SELECCION TAMBIEN ENTRA, NO SOLO SALE ═══════════════════════════════\r\n *\r\n * Divar, 27-ago: «al seleccionar el nombre de la subtarea, el selector en gantt\r\n * tambien se reubique».\r\n *\r\n * En 1.9.16 la seleccion empezo a SALIR (`onTaskSelectionChange`), y con eso el\r\n * panel del SaaS pudo seguir al resaltado. Pero el camino de vuelta no existia:\r\n * quien abre una tarea desde fuera —una subtarea, el breadcrumb, una\r\n * notificacion— no tenia forma de mover el resaltado, y las dos cosas quedaban\r\n * diciendo tareas distintas. Es el mismo desajuste que se arreglo, del otro\r\n * lado.\r\n *\r\n * `selectedTaskId` deja el resaltado gobernable desde fuera SIN quitarle su\r\n * estado propio: el Gantt sigue seleccionando solo con clic y flechas, y quien\r\n * lo monta puede ademas empujarlo a una fila concreta.\r\n */\r\nexport function useGanttSelection(selectedTaskId?: string | null) {\r\n  const [selectedTaskIds, setSelectedTaskIds] = useState<Set<string>>(new Set());\r\n  const [lastSelectedId, setLastSelectedId] = useState<string | null>(null);\r\n\r\n  /*\r\n   * SE SINCRONIZA SOLO CUANDO DE VERDAD CAMBIA, y esto es lo que evita un\r\n   * bucle: el Gantt avisa hacia fuera al seleccionar, quien escucha abre esa\r\n   * tarea, y eso vuelve aqui como `selectedTaskId`. Si se reescribiera el\r\n   * estado sin comprobar, cada vuelta dispararia la siguiente.\r\n   *\r\n   * Comparando contra lo que YA hay, la segunda vuelta no hace nada y la\r\n   * cadena se para sola.\r\n   */\r\n  useEffect(() => {\r\n    if (!selectedTaskId) return;\r\n    setSelectedTaskIds(prev => {\r\n      if (prev.size === 1 && prev.has(selectedTaskId)) return prev;\r\n      return new Set([selectedTaskId]);\r\n    });\r\n    setLastSelectedId(prev => (prev === selectedTaskId ? prev : selectedTaskId));\r\n  }, [selectedTaskId]);\r\n\r\n  // Select a single task\r\n  const selectTask = useCallback((taskId: string) => {\r\n    setSelectedTaskIds(new Set([taskId]));\r\n    setLastSelectedId(taskId);\r\n  }, []);\r\n\r\n  // Toggle task selection (Ctrl/Cmd + Click)\r\n  const toggleTaskSelection = useCallback((taskId: string) => {\r\n    setSelectedTaskIds((prev) => {\r\n      const next = new Set(prev);\r\n      if (next.has(taskId)) {\r\n        next.delete(taskId);\r\n      } else {\r\n        next.add(taskId);\r\n      }\r\n      return next;\r\n    });\r\n    setLastSelectedId(taskId);\r\n  }, []);\r\n\r\n  // Select range (Shift + Click or Shift + Arrow)\r\n  const selectTaskRange = useCallback(\r\n    (taskId: string, flatTaskIds: string[]) => {\r\n      if (!lastSelectedId) {\r\n        selectTask(taskId);\r\n        return;\r\n      }\r\n\r\n      const lastIndex = flatTaskIds.indexOf(lastSelectedId);\r\n      const currentIndex = flatTaskIds.indexOf(taskId);\r\n\r\n      if (lastIndex === -1 || currentIndex === -1) {\r\n        selectTask(taskId);\r\n        return;\r\n      }\r\n\r\n      const start = Math.min(lastIndex, currentIndex);\r\n      const end = Math.max(lastIndex, currentIndex);\r\n      const rangeIds = flatTaskIds.slice(start, end + 1);\r\n\r\n      setSelectedTaskIds(new Set(rangeIds));\r\n      setLastSelectedId(taskId);\r\n    },\r\n    [lastSelectedId, selectTask]\r\n  );\r\n\r\n  // Handle task click with modifiers\r\n  const handleTaskClick = useCallback(\r\n    (taskId: string, flatTaskIds: string[], ctrlOrCmd: boolean, shift: boolean) => {\r\n      if (shift) {\r\n        selectTaskRange(taskId, flatTaskIds);\r\n      } else if (ctrlOrCmd) {\r\n        toggleTaskSelection(taskId);\r\n      } else {\r\n        selectTask(taskId);\r\n      }\r\n    },\r\n    [selectTask, toggleTaskSelection, selectTaskRange]\r\n  );\r\n\r\n  // Handle selection from keyboard\r\n  const handleKeyboardSelection = useCallback(\r\n    (taskId: string, multiSelect: boolean) => {\r\n      if (multiSelect) {\r\n        setSelectedTaskIds((prev) => {\r\n          const next = new Set(prev);\r\n          next.add(taskId);\r\n          return next;\r\n        });\r\n      } else {\r\n        selectTask(taskId);\r\n      }\r\n    },\r\n    [selectTask]\r\n  );\r\n\r\n  // Clear selection\r\n  const clearSelection = useCallback(() => {\r\n    setSelectedTaskIds(new Set());\r\n    setLastSelectedId(null);\r\n  }, []);\r\n\r\n  // Check if task is selected\r\n  const isTaskSelected = useCallback(\r\n    (taskId: string) => {\r\n      return selectedTaskIds.has(taskId);\r\n    },\r\n    [selectedTaskIds]\r\n  );\r\n\r\n  return {\r\n    selectedTaskIds,\r\n    selectTask,\r\n    toggleTaskSelection,\r\n    selectTaskRange,\r\n    handleTaskClick,\r\n    handleKeyboardSelection,\r\n    clearSelection,\r\n    isTaskSelected,\r\n  };\r\n}\r\n","import { Task } from './types';\r\n\r\n/**\r\n * Re-index position properties for all tasks at each level\r\n * so that array order matches position values.\r\n */\r\nfunction reindexPositions(tasks: Task[]): Task[] {\r\n  return tasks.map((t, idx) => ({\r\n    ...t,\r\n    position: idx,\r\n    subtasks: t.subtasks?.length ? reindexPositions(t.subtasks) : t.subtasks,\r\n  }));\r\n}\r\n\r\n/**\r\n * Flatten tasks into a single array with level information\r\n */\r\nexport function flattenTasks(tasks: Task[]): Task[] {\r\n  const result: Task[] = [];\r\n  const traverse = (tasks: Task[], parentId?: string, level = 0) => {\r\n    // Sort tasks by position to maintain creation order\r\n    const sortedTasks = [...tasks].sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\r\n    for (let i = 0; i < sortedTasks.length; i++) {\r\n      const task = { ...sortedTasks[i], parentId, level, position: sortedTasks[i].position ?? i };\r\n      result.push(task);\r\n      if (task.subtasks && task.subtasks.length > 0 && task.isExpanded) {\r\n        traverse(task.subtasks, task.id, level + 1);\r\n      }\r\n    }\r\n  };\r\n  traverse(tasks);\r\n  return result;\r\n}\r\n\r\n/**\r\n * Find task by ID recursively\r\n */\r\nexport function findTask(tasks: Task[], taskId: string): Task | null {\r\n  for (const task of tasks) {\r\n    if (task.id === taskId) return task;\r\n    if (task.subtasks) {\r\n      const found = findTask(task.subtasks, taskId);\r\n      if (found) return found;\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\n/**\r\n * Find parent task by child ID\r\n */\r\nexport function findParentTask(tasks: Task[], childId: string): Task | null {\r\n  for (const task of tasks) {\r\n    if (task.subtasks) {\r\n      if (task.subtasks.some((t) => t.id === childId)) {\r\n        return task;\r\n      }\r\n      const found = findParentTask(task.subtasks, childId);\r\n      if (found) return found;\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\n/**\r\n * Indent tasks (make them children of the previous sibling)\r\n */\r\nexport function indentTasks(tasks: Task[], taskIds: string[]): Task[] {\r\n  if (taskIds.length === 0) return tasks;\r\n\r\n  // Get flat list to find positions\r\n  const flatTasks = flattenTasks(tasks);\r\n  const firstTaskId = taskIds[0];\r\n  const taskIndex = flatTasks.findIndex((t) => t.id === firstTaskId);\r\n\r\n  if (taskIndex <= 0) return tasks; // Can't indent first task\r\n\r\n  const targetParent = flatTasks[taskIndex - 1]; // Previous sibling becomes parent\r\n\r\n  // Helper to remove tasks from array\r\n  const removeTasks = (tasks: Task[], ids: Set<string>): { tasks: Task[]; removed: Task[] } => {\r\n    const removed: Task[] = [];\r\n    const filtered = tasks.filter((task) => {\r\n      if (ids.has(task.id)) {\r\n        removed.push(task);\r\n        return false;\r\n      }\r\n      if (task.subtasks) {\r\n        const result = removeTasks(task.subtasks, ids);\r\n        task.subtasks = result.tasks;\r\n        removed.push(...result.removed);\r\n      }\r\n      return true;\r\n    });\r\n    return { tasks: filtered, removed };\r\n  };\r\n\r\n  // Helper to add tasks as children\r\n  const addAsChildren = (tasks: Task[], parentId: string, children: Task[]): Task[] => {\r\n    return tasks.map((task) => {\r\n      if (task.id === parentId) {\r\n        return {\r\n          ...task,\r\n          subtasks: [...(task.subtasks || []), ...children],\r\n          isExpanded: true, // Auto-expand when adding children\r\n        };\r\n      }\r\n      if (task.subtasks) {\r\n        return { ...task, subtasks: addAsChildren(task.subtasks, parentId, children) };\r\n      }\r\n      return task;\r\n    });\r\n  };\r\n\r\n  const idsSet = new Set(taskIds);\r\n  const { tasks: filtered, removed } = removeTasks(tasks, idsSet);\r\n  const indented = addAsChildren(filtered, targetParent.id, removed);\r\n  // Re-index positions at each level to reflect new order\r\n  return reindexPositions(indented);\r\n}\r\n\r\n/**\r\n * Outdent tasks (move them up one level in hierarchy)\r\n */\r\nexport function outdentTasks(tasks: Task[], taskIds: string[]): Task[] {\r\n  if (taskIds.length === 0) return tasks;\r\n\r\n  const result = [...tasks];\r\n\r\n  for (const taskId of taskIds) {\r\n    const parent = findParentTask(result, taskId);\r\n    if (!parent) continue; // Already root level\r\n\r\n    const grandparent = findParentTask(result, parent.id);\r\n\r\n    // Helper to remove task from parent\r\n    const removeFromParent = (tasks: Task[], parentId: string, taskId: string): Task | null => {\r\n      for (let i = 0; i < tasks.length; i++) {\r\n        const task = tasks[i];\r\n        if (task.id === parentId && task.subtasks) {\r\n          const taskIndex = task.subtasks.findIndex((t) => t.id === taskId);\r\n          if (taskIndex !== -1) {\r\n            const [removed] = task.subtasks.splice(taskIndex, 1);\r\n            return removed;\r\n          }\r\n        }\r\n        if (task.subtasks) {\r\n          const removed = removeFromParent(task.subtasks, parentId, taskId);\r\n          if (removed) return removed;\r\n        }\r\n      }\r\n      return null;\r\n    };\r\n\r\n    // Helper to insert task after parent\r\n    const insertAfterTask = (tasks: Task[], afterId: string, task: Task): Task[] => {\r\n      const index = tasks.findIndex((t) => t.id === afterId);\r\n      if (index !== -1) {\r\n        tasks.splice(index + 1, 0, task);\r\n        return tasks;\r\n      }\r\n      for (const t of tasks) {\r\n        if (t.subtasks) {\r\n          insertAfterTask(t.subtasks, afterId, task);\r\n        }\r\n      }\r\n      return tasks;\r\n    };\r\n\r\n    const removed = removeFromParent(result, parent.id, taskId);\r\n    if (removed) {\r\n      if (grandparent && grandparent.subtasks) {\r\n        // Move to grandparent's children after parent\r\n        insertAfterTask(grandparent.subtasks, parent.id, removed);\r\n      } else {\r\n        // Move to root level after parent\r\n        insertAfterTask(result, parent.id, removed);\r\n      }\r\n    }\r\n  }\r\n\r\n  // Re-index positions at each level to reflect new order\r\n  return reindexPositions(result);\r\n}\r\n\r\n/**\r\n * Move tasks up or down within their level\r\n */\r\nexport function moveTasks(tasks: Task[], taskIds: string[], direction: 'up' | 'down'): Task[] {\r\n  if (taskIds.length === 0) return tasks;\r\n\r\n  const result = [...tasks];\r\n  const firstTaskId = taskIds[0];\r\n\r\n  // Helper to move task within array\r\n  const moveInArray = (tasks: Task[], taskId: string, direction: 'up' | 'down'): boolean => {\r\n    const index = tasks.findIndex((t) => t.id === taskId);\r\n    if (index === -1) {\r\n      // Try in subtasks\r\n      for (const task of tasks) {\r\n        if (task.subtasks && moveInArray(task.subtasks, taskId, direction)) {\r\n          return true;\r\n        }\r\n      }\r\n      return false;\r\n    }\r\n\r\n    const newIndex = direction === 'up' ? index - 1 : index + 1;\r\n    if (newIndex < 0 || newIndex >= tasks.length) return false;\r\n\r\n    // Swap tasks\r\n    [tasks[index], tasks[newIndex]] = [tasks[newIndex], tasks[index]];\r\n    // Update position properties after swap\r\n    tasks[index] = { ...tasks[index], position: index };\r\n    tasks[newIndex] = { ...tasks[newIndex], position: newIndex };\r\n    return true;\r\n  };\r\n\r\n  moveInArray(result, firstTaskId, direction);\r\n  return result;\r\n}\r\n\r\n/**\r\n * Delete tasks by IDs\r\n */\r\nexport function deleteTasks(tasks: Task[], taskIds: string[]): Task[] {\r\n  const idsSet = new Set(taskIds);\r\n\r\n  const filterTasks = (tasks: Task[]): Task[] => {\r\n    return tasks\r\n      .filter((task) => !idsSet.has(task.id))\r\n      .map((task) => {\r\n        if (task.subtasks) {\r\n          return { ...task, subtasks: filterTasks(task.subtasks) };\r\n        }\r\n        return task;\r\n      });\r\n  };\r\n\r\n  return filterTasks(tasks);\r\n}\r\n\r\n/**\r\n * Duplicate tasks\r\n * v1.4.14: Returns both updated tasks array and array of duplicated tasks (with subtasks)\r\n */\r\nexport function duplicateTasks(tasks: Task[], taskIds: string[]): { tasks: Task[]; duplicatedTasks: Task[] } {\r\n  const result = [...tasks];\r\n  const duplicatedTasks: Task[] = [];\r\n\r\n  for (const taskId of taskIds) {\r\n    const duplicateSubtasks = (subtasks: Task[], parentId: string): Task[] => {\r\n      return subtasks.map((task, idx) => ({\r\n        ...task,\r\n        id: `${task.id}-copy-${Date.now()}-${idx}`,\r\n        parentId,\r\n        subtasks: task.subtasks ? duplicateSubtasks(task.subtasks, `${task.id}-copy-${Date.now()}-${idx}`) : undefined,\r\n      }));\r\n    };\r\n\r\n    const duplicateTask = (tasks: Task[]): Task | null => {\r\n      const index = tasks.findIndex((t) => t.id === taskId);\r\n      if (index === -1) {\r\n        // Try in subtasks\r\n        for (const task of tasks) {\r\n          if (task.subtasks) {\r\n            const found = duplicateTask(task.subtasks);\r\n            if (found) return found;\r\n          }\r\n        }\r\n        return null;\r\n      }\r\n\r\n      const original = tasks[index];\r\n      const newId = `${original.id}-copy-${Date.now()}`;\r\n      const copy: Task = {\r\n        ...original,\r\n        id: newId,\r\n        name: `${original.name} (Copy)`,\r\n        subtasks: original.subtasks ? duplicateSubtasks(original.subtasks, newId) : undefined,\r\n      };\r\n\r\n      tasks.splice(index + 1, 0, copy);\r\n      return copy;\r\n    };\r\n\r\n    const duplicated = duplicateTask(result);\r\n    if (duplicated) {\r\n      duplicatedTasks.push(duplicated);\r\n    }\r\n  }\r\n\r\n  return { tasks: result, duplicatedTasks };\r\n}\r\n\r\n/**\r\n * Create a new task\r\n * v0.11.0: New tasks start with default blue color\r\n */\r\nexport function createTask(\r\n  tasks: Task[],\r\n  afterTaskId: string,\r\n  direction: 'above' | 'below'\r\n): { tasks: Task[]; newTask: Task } {\r\n  const result = [...tasks];\r\n  const today = new Date();\r\n  const weekFromNow = new Date(today);\r\n  weekFromNow.setDate(weekFromNow.getDate() + 7);\r\n\r\n  const newTask: Task = {\r\n    id: `task-${Date.now()}`,\r\n    name: 'New Task',\r\n    progress: 0,\r\n    status: 'todo',\r\n    startDate: today,\r\n    endDate: weekFromNow,\r\n    color: '#00E5CC', // v1.4.29: Default Chronos Blue\r\n  };\r\n\r\n  const insertTask = (tasks: Task[]): boolean => {\r\n    const index = tasks.findIndex((t) => t.id === afterTaskId);\r\n    if (index === -1) {\r\n      // Try in subtasks\r\n      for (const task of tasks) {\r\n        if (task.subtasks && insertTask(task.subtasks)) {\r\n          return true;\r\n        }\r\n      }\r\n      return false;\r\n    }\r\n\r\n    const insertIndex = direction === 'above' ? index : index + 1;\r\n    tasks.splice(insertIndex, 0, newTask);\r\n    return true;\r\n  };\r\n\r\n  insertTask(result);\r\n  return { tasks: result, newTask };\r\n}\r\n\r\n/**\r\n * Rename a task\r\n */\r\nexport function renameTask(tasks: Task[], taskId: string, newName: string): Task[] {\r\n  return tasks.map((task) => {\r\n    if (task.id === taskId) {\r\n      return { ...task, name: newName };\r\n    }\r\n    if (task.subtasks) {\r\n      return { ...task, subtasks: renameTask(task.subtasks, taskId, newName) };\r\n    }\r\n    return task;\r\n  });\r\n}\r\n\r\n/**\r\n * Toggle task expansion\r\n */\r\nexport function toggleTaskExpansion(tasks: Task[], taskId: string): Task[] {\r\n  return tasks.map((task) => {\r\n    if (task.id === taskId) {\r\n      return { ...task, isExpanded: !task.isExpanded };\r\n    }\r\n    if (task.subtasks) {\r\n      return { ...task, subtasks: toggleTaskExpansion(task.subtasks, taskId) };\r\n    }\r\n    return task;\r\n  });\r\n}\r\n\r\n/**\r\n * Create a subtask for a parent task\r\n * v0.11.0: Subtasks inherit parent color\r\n */\r\nexport function createSubtask(\r\n  tasks: Task[],\r\n  parentTaskId: string\r\n): { tasks: Task[]; newTask: Task } {\r\n  // Find parent task to inherit properties\r\n  const findParent = (tasks: Task[]): Task | null => {\r\n    for (const task of tasks) {\r\n      if (task.id === parentTaskId) return task;\r\n      if (task.subtasks) {\r\n        const found = findParent(task.subtasks);\r\n        if (found) return found;\r\n      }\r\n    }\r\n    return null;\r\n  };\r\n\r\n  const parentTask = findParent(tasks);\r\n\r\n  // v0.16.7: Inherit dates from parent task (subtask should fit within parent)\r\n  // If parent has dates, use them. Otherwise fall back to today + 7 days\r\n  const today = new Date();\r\n  const weekFromNow = new Date(today);\r\n  weekFromNow.setDate(weekFromNow.getDate() + 7);\r\n\r\n  const startDate = parentTask?.startDate || today;\r\n  const endDate = parentTask?.endDate || weekFromNow;\r\n\r\n  // Find parent to get subtask count for position\r\n  const getSubtaskCount = (tasks: Task[]): number => {\r\n    for (const task of tasks) {\r\n      if (task.id === parentTaskId) return (task.subtasks || []).length;\r\n      if (task.subtasks) {\r\n        const count = getSubtaskCount(task.subtasks);\r\n        if (count >= 0) return count;\r\n      }\r\n    }\r\n    return 0;\r\n  };\r\n\r\n  const subtaskCount = getSubtaskCount(tasks);\r\n\r\n  const newTask: Task = {\r\n    id: `task-${Date.now()}`,\r\n    name: 'New Subtask',\r\n    progress: 0,\r\n    status: 'todo',\r\n    startDate: new Date(startDate), // Clone to avoid reference issues\r\n    endDate: new Date(endDate),     // Clone to avoid reference issues\r\n    color: parentTask?.color || '#00E5CC', // v0.16.7: Inherit parent color (default: electric blue)\r\n    position: subtaskCount, // Ensure position is at the end\r\n    parentId: parentTaskId, // Link to parent for proper hierarchy\r\n  };\r\n\r\n  const addSubtask = (tasks: Task[]): Task[] => {\r\n    return tasks.map((task) => {\r\n      if (task.id === parentTaskId) {\r\n        // Add subtask to the end of existing subtasks\r\n        const subtasks = task.subtasks || [];\r\n        return {\r\n          ...task,\r\n          subtasks: [...subtasks, newTask],\r\n          isExpanded: true, // Auto-expand parent to show new subtask\r\n        };\r\n      }\r\n      if (task.subtasks) {\r\n        return { ...task, subtasks: addSubtask(task.subtasks) };\r\n      }\r\n      return task;\r\n    });\r\n  };\r\n\r\n  return { tasks: addSubtask(tasks), newTask };\r\n}\r\n\r\n/**\r\n * v0.17.68: Reparent a task - move it to become a child of another task\r\n * This allows dragging subtasks between different parent tasks\r\n *\r\n * @param tasks - The task tree\r\n * @param taskId - The ID of the task to move\r\n * @param newParentId - The ID of the new parent task (null to move to root level)\r\n * @param position - Optional position index within the new parent's subtasks\r\n * @returns Updated task tree\r\n */\r\nexport function reparentTask(\r\n  tasks: Task[],\r\n  taskId: string,\r\n  newParentId: string | null,\r\n  position?: number\r\n): Task[] {\r\n  // Prevent moving a task to itself\r\n  if (taskId === newParentId) return tasks;\r\n\r\n  // Find the task to move\r\n  const taskToMove = findTask(tasks, taskId);\r\n  if (!taskToMove) return tasks;\r\n\r\n  // Prevent moving a parent to its own descendant (would create circular reference)\r\n  if (newParentId) {\r\n    const isDescendant = (parentTask: Task, childId: string): boolean => {\r\n      if (!parentTask.subtasks) return false;\r\n      for (const subtask of parentTask.subtasks) {\r\n        if (subtask.id === childId) return true;\r\n        if (isDescendant(subtask, childId)) return true;\r\n      }\r\n      return false;\r\n    };\r\n    if (isDescendant(taskToMove, newParentId)) return tasks;\r\n  }\r\n\r\n  // Step 1: Remove the task from its current location and re-index siblings\r\n  const removeTask = (taskList: Task[]): Task[] => {\r\n    const filtered = taskList.filter((t) => t.id !== taskId);\r\n    const hadRemoval = filtered.length < taskList.length;\r\n    return filtered.map((t, idx) => {\r\n      const updated = hadRemoval ? { ...t, position: idx } : t;\r\n      if (updated.subtasks && updated.subtasks.length > 0) {\r\n        return { ...updated, subtasks: removeTask(updated.subtasks) };\r\n      }\r\n      return updated;\r\n    });\r\n  };\r\n\r\n  let result = removeTask(tasks);\r\n\r\n  // Step 2: Add the task to its new location\r\n  if (newParentId === null) {\r\n    // Move to root level\r\n    const insertPos = position !== undefined ? position : result.length;\r\n    result.splice(insertPos, 0, { ...taskToMove, parentId: undefined });\r\n    // Update position property for all root-level siblings\r\n    result = result.map((t, idx) => ({ ...t, position: idx }));\r\n  } else {\r\n    // Move to be a child of newParentId\r\n    const addToParent = (taskList: Task[]): Task[] => {\r\n      return taskList.map((t) => {\r\n        if (t.id === newParentId) {\r\n          const subtasks = t.subtasks || [];\r\n          const insertPos = position !== undefined ? position : subtasks.length;\r\n          const newSubtasks = [...subtasks];\r\n          newSubtasks.splice(insertPos, 0, { ...taskToMove, parentId: newParentId });\r\n          // Update position property for all siblings in the new parent\r\n          const reindexed = newSubtasks.map((s, idx) => ({ ...s, position: idx }));\r\n          return {\r\n            ...t,\r\n            subtasks: reindexed,\r\n            isExpanded: true, // Auto-expand to show the moved task\r\n          };\r\n        }\r\n        if (t.subtasks && t.subtasks.length > 0) {\r\n          return { ...t, subtasks: addToParent(t.subtasks) };\r\n        }\r\n        return t;\r\n      });\r\n    };\r\n    result = addToParent(result);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * v0.17.68: Check if a task can be reparented to a new parent\r\n * Returns false if the move would create a circular reference\r\n */\r\nexport function canReparent(\r\n  tasks: Task[],\r\n  taskId: string,\r\n  newParentId: string | null\r\n): boolean {\r\n  // Can always move to root\r\n  if (newParentId === null) return true;\r\n\r\n  // Can't be parent of itself\r\n  if (taskId === newParentId) return false;\r\n\r\n  // Find the task\r\n  const task = findTask(tasks, taskId);\r\n  if (!task) return false;\r\n\r\n  // Check if newParentId is a descendant of taskId (would create circular ref)\r\n  const isDescendant = (parentTask: Task, childId: string): boolean => {\r\n    if (!parentTask.subtasks) return false;\r\n    for (const subtask of parentTask.subtasks) {\r\n      if (subtask.id === childId) return true;\r\n      if (isDescendant(subtask, childId)) return true;\r\n    }\r\n    return false;\r\n  };\r\n\r\n  return !isDescendant(task, newParentId);\r\n}\r\n\r\n/**\r\n * Roll-up parent dates and progress from children (Leaf Node Rule).\r\n * Parent tasks with subtasks become read-only containers:\r\n * - startDate = min(children startDates)\r\n * - endDate = max(children endDates)\r\n * - progress = average(children progress)\r\n * Recurses bottom-up so grandparents also roll up correctly.\r\n */\r\nexport function rollUpParentDates(tasks: Task[]): Task[] {\r\n  return tasks.map(task => {\r\n    if (!task.subtasks || task.subtasks.length === 0) return task;\r\n\r\n    // First, recurse into children so nested parents roll up first\r\n    const updatedSubtasks = rollUpParentDates(task.subtasks);\r\n\r\n    // Collect dates and progress from all children\r\n    const childDates = updatedSubtasks.reduce<{ starts: number[]; ends: number[]; progresses: number[] }>(\r\n      (acc, child) => {\r\n        if (child.startDate) acc.starts.push(new Date(child.startDate).getTime());\r\n        if (child.endDate) acc.ends.push(new Date(child.endDate).getTime());\r\n        acc.progresses.push(child.progress ?? 0);\r\n        return acc;\r\n      },\r\n      { starts: [], ends: [], progresses: [] }\r\n    );\r\n\r\n    const rolledStart = childDates.starts.length > 0\r\n      ? new Date(Math.min(...childDates.starts))\r\n      : task.startDate;\r\n    const rolledEnd = childDates.ends.length > 0\r\n      ? new Date(Math.max(...childDates.ends))\r\n      : task.endDate;\r\n    const rolledProgress = childDates.progresses.length > 0\r\n      ? Math.round(childDates.progresses.reduce((a, b) => a + b, 0) / childDates.progresses.length)\r\n      : task.progress;\r\n\r\n    return {\r\n      ...task,\r\n      subtasks: updatedSubtasks,\r\n      startDate: rolledStart,\r\n      endDate: rolledEnd,\r\n      progress: rolledProgress,\r\n    };\r\n  });\r\n}\r\n","import { useState, useEffect, useRef, useContext } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { ChevronDown, ChevronRight, ChevronLeft, Plus, Edit3, GripVertical, Calendar, Keyboard } from 'lucide-react';\r\nimport { Task, GanttColumn, ColumnType, GanttTemplates } from './types';\r\nimport { motion } from 'framer-motion';\r\nimport { ColumnManager } from './ColumnManager'; // v0.17.215: Back with sticky positioning\r\nimport { ContextMenu, ContextMenuItem, MenuIcons } from './ContextMenu';\r\nimport { useGanttKeyboard } from './useGanttKeyboard';\r\nimport { useGanttSelection } from './useGanttSelection';\r\nimport { flattenTasks as flattenTasksUtil, findTask as findTaskInTree } from './hierarchyUtils';\r\nimport { UserAssignmentSelector } from '../Card/UserAssignmentSelector';\r\nimport { StatusSelector } from '../Card/StatusSelector';\r\nimport { PrioritySelector } from '../Card/PrioritySelector'; // v0.17.29\r\nimport { GanttI18nContext } from './GanttI18nContext';\r\nimport type { User } from '../Card/UserAssignmentSelector';\r\n\r\ninterface TaskGridProps {\r\n  tasks: Task[];\r\n  theme: any;\r\n  rowHeight: number;\r\n  availableUsers?: Array<{ id: string; name: string; initials: string; color: string }>;\r\n  templates: Required<GanttTemplates>; // v0.8.0\r\n  onTaskClick?: (task: Task) => void;\r\n  /** v1.9.16: la seleccion sale del Gantt — ver `onTaskSelectionChange` en types.ts */\r\n  onTaskSelectionChange?: (taskId: string | null) => void;\r\n  /** v1.9.17: ...y tambien entra — ver `selectedTaskId` en types.ts */\r\n  selectedTaskId?: string | null;\r\n  onTaskDblClick?: (task: Task) => void; // v0.8.0\r\n  onTaskContextMenu?: (task: Task, event: React.MouseEvent) => void; // v0.8.0\r\n  onTaskToggle?: (taskId: string) => void;\r\n  scrollTop: number;\r\n  columns: GanttColumn[];\r\n  onToggleColumn: (columnType: ColumnType) => void;\r\n  onColumnResize?: (columnId: ColumnType, newWidth: number) => void; // v0.13.8\r\n  onTaskUpdate?: (taskId: string, updates: Partial<Task>) => void;\r\n  // Drag-fill: apply a value to many tasks at once (assignees/start/end date).\r\n  onBulkFill?: (\r\n    taskIds: string[],\r\n    column: 'assignees' | 'startDate' | 'endDate',\r\n    value: any,\r\n  ) => void;\r\n\r\n  // Hierarchy handlers\r\n  onTaskIndent?: (taskIds: string[]) => void;\r\n  onTaskOutdent?: (taskIds: string[]) => void;\r\n  onTaskMove?: (taskIds: string[], direction: 'up' | 'down') => void;\r\n  onMultiTaskDelete?: (taskIds: string[]) => void;\r\n  onTaskDuplicate?: (taskIds: string[]) => void;\r\n  onTaskCreate?: (afterTaskId: string, direction: 'above' | 'below') => void;\r\n  onTaskRename?: (taskId: string, newName: string) => void;\r\n  /** 1.9.45 · fila «+ Add task» al final de la rejilla (la app decide qué hace). */\r\n  addTaskRow?: { label: string; onClick: () => void };\r\n  onCreateSubtask?: (parentTaskId: string) => void;\r\n  onOpenTaskModal?: (task: Task) => void;\r\n  // v0.17.34: Delete confirmation request (shows modal instead of deleting directly)\r\n  /** v1.9.6: ahora recibe TODOS los ids a borrar (bulk desde el menú contextual\r\n   *  con multi-selección) + una etiqueta para el modal de confirmación. */\r\n  onDeleteRequest?: (taskIds: string[], label: string) => void;\r\n  // v0.17.68: Reparent task via drag & drop\r\n  onTaskReparent?: (taskId: string, newParentId: string | null, position?: number) => void;\r\n  /** v1.9.10: árbol COMPLETO sin filtrar. Cuando hay un filtro activo, `tasks`\r\n   *  es un subconjunto; para reordenar correctamente la posición de destino debe\r\n   *  traducirse al índice real entre TODOS los hermanos (no solo los visibles). */\r\n  allTasks?: Task[];\r\n  // v0.18.15: Scroll container ref for auto-scroll during drag\r\n  scrollContainerRef?: React.RefObject<HTMLElement>;\r\n  // v5.1.0: CPM visual state\r\n  showCriticalPath?: boolean;\r\n}\r\n\r\nexport function TaskGrid({\r\n  tasks,\r\n  theme,\r\n  rowHeight: ROW_HEIGHT,\r\n  availableUsers = [],\r\n  templates: _templates, // TODO: Use templates for custom rendering\r\n  onTaskClick,\r\n  onTaskSelectionChange,\r\n  selectedTaskId,\r\n  onTaskDblClick, // v0.8.0\r\n  onTaskContextMenu, // v0.8.0\r\n  onTaskToggle,\r\n  scrollTop: _scrollTop,\r\n  columns,\r\n  onToggleColumn,\r\n  onColumnResize,\r\n  onTaskUpdate,\r\n  onBulkFill,\r\n  onTaskIndent,\r\n  onTaskOutdent,\r\n  onTaskMove,\r\n  onMultiTaskDelete,\r\n  onTaskDuplicate,\r\n  onTaskCreate,\r\n  onTaskRename,\r\n  addTaskRow,\r\n  onCreateSubtask,\r\n  onOpenTaskModal,\r\n  onDeleteRequest, // v0.17.34\r\n  onTaskReparent, // v0.17.68\r\n  allTasks, // v1.9.10: árbol completo para traducir posición con filtros activos\r\n  scrollContainerRef, // v0.18.15\r\n  showCriticalPath = false, // v5.1.0\r\n}: TaskGridProps) {\r\n  // v0.16.2: Get translations from context\r\n  const translations = useContext(GanttI18nContext);\r\n\r\n  const [hoveredTaskId, setHoveredTaskId] = useState<string | null>(null);\r\n  const [editingTaskId, setEditingTaskId] = useState<string | null>(null);\r\n  const [editingTaskName, setEditingTaskName] = useState('');\r\n  const editInputRef = useRef<HTMLInputElement>(null);\r\n\r\n  // v0.13.8: Column resize state\r\n  const [resizingColumn, setResizingColumn] = useState<ColumnType | null>(null);\r\n  const [resizeStartX, setResizeStartX] = useState(0);\r\n  const [resizeStartWidth, setResizeStartWidth] = useState(0);\r\n  const [contextMenu, setContextMenu] = useState<{\r\n    isOpen: boolean;\r\n    x: number;\r\n    y: number;\r\n    type: 'header' | 'task';\r\n    columnId?: ColumnType;\r\n    task?: Task;\r\n  }>({\r\n    isOpen: false,\r\n    x: 0,\r\n    y: 0,\r\n    type: 'header',\r\n  });\r\n\r\n  // v0.17.68: Drag & drop state for reparenting tasks\r\n  const [draggedTaskId, setDraggedTaskId] = useState<string | null>(null);\r\n  const [dropTargetTaskId, setDropTargetTaskId] = useState<string | null>(null);\r\n  const [dropPosition, setDropPosition] = useState<'above' | 'below' | 'child' | null>(null);\r\n  const dragStartY = useRef<number>(0);\r\n  const dragThreshold = 5; // Minimum pixels to move before drag starts\r\n  const isDraggingRef = useRef<boolean>(false);\r\n  // v0.17.146: Ghost position for drag preview + isDragging state for re-render\r\n  const [ghostPosition, setGhostPosition] = useState<{ x: number; y: number } | null>(null);\r\n  const [isDraggingState, setIsDraggingState] = useState(false);\r\n  // v0.18.15: Auto-scroll during drag\r\n  const autoScrollRAF = useRef<number | null>(null);\r\n\r\n  // Drag-fill (Excel-style): drag a value from one cell down across rows to\r\n  // apply it to all covered tasks at once. Supported for assignees + dates.\r\n  const [fillDrag, setFillDrag] = useState<{\r\n    sourceTaskId: string;\r\n    column: 'assignees' | 'startDate' | 'endDate';\r\n    sourceIndex: number;   // index in flatTasks of the source row\r\n    targetIndex: number;   // index of the last row currently covered\r\n  } | null>(null);\r\n\r\n  // v0.17.132: Date picker state for column cells\r\n  const [datePickerState, setDatePickerState] = useState<{\r\n    taskId: string;\r\n    field: 'startDate' | 'endDate';\r\n    month: Date;\r\n    position: { top: number; left: number };\r\n  } | null>(null);\r\n\r\n  // v0.17.215: Keyboard shortcuts with sticky positioning - always visible\r\n  const [showKeyboardHelp, setShowKeyboardHelp] = useState(false);\r\n  const keyboardHelpRef = useRef<HTMLDivElement>(null);\r\n\r\n  // v0.17.215: Close keyboard help when clicking outside\r\n  useEffect(() => {\r\n    function handleClickOutside(event: MouseEvent) {\r\n      if (keyboardHelpRef.current && !keyboardHelpRef.current.contains(event.target as Node)) {\r\n        setShowKeyboardHelp(false);\r\n      }\r\n    }\r\n    if (showKeyboardHelp) {\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n      return () => document.removeEventListener('mousedown', handleClickOutside);\r\n    }\r\n    return undefined;\r\n  }, [showKeyboardHelp]);\r\n\r\n  // Focus input when editing starts\r\n  useEffect(() => {\r\n    if (editingTaskId && editInputRef.current) {\r\n      editInputRef.current.focus();\r\n      editInputRef.current.select();\r\n    }\r\n  }, [editingTaskId]);\r\n\r\n  // v0.13.8: Handle column resize mouse events\r\n  useEffect(() => {\r\n    if (!resizingColumn) return;\r\n\r\n    const handleMouseMove = (e: MouseEvent) => {\r\n      const deltaX = e.clientX - resizeStartX;\r\n      const newWidth = resizeStartWidth + deltaX;\r\n      onColumnResize?.(resizingColumn, newWidth);\r\n    };\r\n\r\n    const handleMouseUp = () => {\r\n      setResizingColumn(null);\r\n      document.body.style.cursor = '';\r\n      document.body.style.userSelect = '';\r\n    };\r\n\r\n    document.addEventListener('mousemove', handleMouseMove);\r\n    document.addEventListener('mouseup', handleMouseUp);\r\n    document.body.style.cursor = 'col-resize';\r\n    document.body.style.userSelect = 'none';\r\n\r\n    return () => {\r\n      document.removeEventListener('mousemove', handleMouseMove);\r\n      document.removeEventListener('mouseup', handleMouseUp);\r\n      document.body.style.cursor = '';\r\n      document.body.style.userSelect = '';\r\n    };\r\n  }, [resizingColumn, resizeStartX, resizeStartWidth, onColumnResize]);\r\n\r\n  // Multi-selection hook\r\n  const {\r\n    selectedTaskIds,\r\n    handleTaskClick: handleSelectionClick,\r\n    isTaskSelected,\r\n  } = useGanttSelection(selectedTaskId);\r\n\r\n  // Keyboard shortcuts hook\r\n  const { setIsEditing } = useGanttKeyboard({\r\n    tasks,\r\n    selectedTaskIds,\r\n    onTaskSelect: (taskId: string, multiSelect?: boolean) => {\r\n      const flatTasks = flattenTasksUtil(tasks);\r\n      const flatTaskIds = flatTasks.map(t => t.id);\r\n      handleSelectionClick(taskId, flatTaskIds, multiSelect || false, false);\r\n      /*\r\n       * SE AVISA HACIA FUERA. Antes esta seleccion moria aqui dentro: quien\r\n       * montara el Gantt no tenia forma de seguir el resaltado, y el SaaS\r\n       * acabo con su propio recorrido en paralelo que se desincronizaba.\r\n       *\r\n       * En seleccion multiple (Shift) se manda la tarea a la que se acaba de\r\n       * llegar, que es la que el usuario esta mirando.\r\n       */\r\n      onTaskSelectionChange?.(taskId);\r\n    },\r\n    onTaskCreate: onTaskCreate || (() => {}),\r\n    onTaskDelete: onMultiTaskDelete || (() => {}),\r\n    onTaskDuplicate: onTaskDuplicate || (() => {}),\r\n    onTaskMove: onTaskMove || (() => {}),\r\n    onTaskIndent: onTaskIndent || (() => {}),\r\n    onTaskOutdent: onTaskOutdent || (() => {}),\r\n    onTaskRename: (taskId: string) => {\r\n      // Start inline rename when F2 is pressed\r\n      const task = flattenTasksUtil(tasks).find(t => t.id === taskId);\r\n      if (task) {\r\n        handleRenameStart(task);\r\n      }\r\n    },\r\n    onTaskToggleExpand: onTaskToggle || (() => {}),\r\n    onOpenTaskModal: (taskId: string) => {\r\n      const task = flattenTasksUtil(tasks).find(t => t.id === taskId);\r\n      if (task && onOpenTaskModal) {\r\n        onOpenTaskModal(task);\r\n      }\r\n    },\r\n    enableKeyboard: true,\r\n  });\r\n\r\n  const flattenTasks = (tasks: Task[], level = 0, parentWbs = ''): Array<{ task: Task; level: number }> => {\r\n    const result: Array<{ task: Task; level: number }> = [];\r\n\r\n    // Sort by position to maintain creation order\r\n    const sortedTasks = [...tasks].sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\r\n    for (let i = 0; i < sortedTasks.length; i++) {\r\n      const task = sortedTasks[i]!;\r\n      // v1.5.93: Honor a pre-stamped wbsCode (set by GanttBoard.tasksWithStableWbs\r\n      // BEFORE filtering) so visible numbers stay stable when the user filters.\r\n      // Fallback to local sequence when none was provided.\r\n      const seq = i + 1;\r\n      const localWbs = parentWbs\r\n        ? `${parentWbs}.${seq}`         // Child: \"1.1\", \"1.1.1\"\r\n        : `${seq}.0`;                    // Root: \"1.0\", \"2.0\"\r\n      const wbsCode = task.wbsCode || localWbs;\r\n      task.wbsCode = wbsCode;\r\n      result.push({ task, level });\r\n      if (task.subtasks && task.subtasks.length > 0 && task.isExpanded) {\r\n        // Strip a trailing \".0\" from a stamped root WBS so children build \"4.1\" not \"4.0.1\"\r\n        const stampedChildPrefix = task.wbsCode?.replace(/\\.0$/, '');\r\n        const childPrefix = stampedChildPrefix\r\n          || (parentWbs ? `${parentWbs}.${seq}` : `${seq}`);\r\n        result.push(...flattenTasks(task.subtasks, level + 1, childPrefix));\r\n      }\r\n    }\r\n\r\n    return result;\r\n  };\r\n\r\n  const flatTasks = flattenTasks(tasks);\r\n  const HEADER_HEIGHT = 48;\r\n\r\n  // v0.17.221: Calculate content height to match Timeline exactly\r\n  // This ensures proper scroll sync without content cutoff\r\n  const contentHeight = Math.max(flatTasks.length * ROW_HEIGHT, 600 - HEADER_HEIGHT);\r\n\r\n  // ── Drag-fill (Excel-style fill handle) ─────────────────────────────────\r\n  // Reads the source cell's value and applies it to every task between the\r\n  // source row and the row under the cursor (inclusive). Parent tasks are\r\n  // skipped (their assignees/dates are read-only / auto-calculated).\r\n  const getFillValue = (task: Task, column: 'assignees' | 'startDate' | 'endDate') => {\r\n    if (column === 'assignees') return task.assignees;\r\n    if (column === 'startDate') return task.startDate;\r\n    return task.endDate;\r\n  };\r\n\r\n  const handleFillDragStart = (\r\n    e: React.MouseEvent,\r\n    sourceTaskId: string,\r\n    column: 'assignees' | 'startDate' | 'endDate',\r\n    sourceIndex: number,\r\n  ) => {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    setFillDrag({ sourceTaskId, column, sourceIndex, targetIndex: sourceIndex });\r\n\r\n    // v1.9.7: cursor global durante el arrastre — sin esto el cursor \"parpadea\"\r\n    // o desaparece al pasar sobre celdas con estilos de cursor propios.\r\n    document.body.style.cursor = 'crosshair';\r\n    document.body.style.userSelect = 'none';\r\n\r\n    // Measure the grid body's top edge in viewport coords. The rows are laid\r\n    // out at fixed ROW_HEIGHT starting from this top, so the row index under\r\n    // the cursor = floor((cursorY - bodyTop) / ROW_HEIGHT).\r\n    const bodyEl = (e.currentTarget as HTMLElement).closest('[data-grid-body]') as HTMLElement | null;\r\n\r\n    const rowIndexAt = (clientY: number): number => {\r\n      const top = bodyEl?.getBoundingClientRect().top ?? 0;\r\n      let idx = Math.floor((clientY - top) / ROW_HEIGHT);\r\n      idx = Math.max(0, Math.min(flatTasks.length - 1, idx));\r\n      if (idx < sourceIndex) idx = sourceIndex; // fill downward only\r\n      return idx;\r\n    };\r\n\r\n    // v1.9.7: auto-scroll cerca de los bordes del contenedor (mismo patrón que\r\n    // el drag de reordenar, v0.18.15). Sin esto, en proyectos grandes el\r\n    // relleno se detiene en la última fila visible y no se puede seguir\r\n    // arrastrando hacia abajo. El loop RAF también actualiza targetIndex\r\n    // mientras desplaza (no llegan mousemove si el mouse está quieto).\r\n    let lastClientY = e.clientY;\r\n    const container = scrollContainerRef?.current ?? null;\r\n\r\n    const stopAutoScroll = () => {\r\n      if (autoScrollRAF.current) {\r\n        cancelAnimationFrame(autoScrollRAF.current);\r\n        autoScrollRAF.current = null;\r\n      }\r\n    };\r\n\r\n    const updateTarget = () => {\r\n      const idx = rowIndexAt(lastClientY);\r\n      setFillDrag(prev => (prev ? { ...prev, targetIndex: idx } : prev));\r\n    };\r\n\r\n    const maybeAutoScroll = () => {\r\n      stopAutoScroll();\r\n      if (!container) return;\r\n      const rect = container.getBoundingClientRect();\r\n      const edgeZone = 60;\r\n      const maxSpeed = 12;\r\n      const distFromTop = lastClientY - rect.top;\r\n      const distFromBottom = rect.bottom - lastClientY;\r\n\r\n      if (distFromBottom < edgeZone && container.scrollTop < container.scrollHeight - container.clientHeight) {\r\n        const speed = Math.max(1, Math.round(maxSpeed * (1 - Math.max(0, distFromBottom) / edgeZone)));\r\n        const scroll = () => {\r\n          container.scrollTop += speed;\r\n          updateTarget();\r\n          if (container.scrollTop < container.scrollHeight - container.clientHeight) {\r\n            autoScrollRAF.current = requestAnimationFrame(scroll);\r\n          }\r\n        };\r\n        autoScrollRAF.current = requestAnimationFrame(scroll);\r\n      } else if (distFromTop < edgeZone && container.scrollTop > 0) {\r\n        const speed = Math.max(1, Math.round(maxSpeed * (1 - Math.max(0, distFromTop) / edgeZone)));\r\n        const scroll = () => {\r\n          container.scrollTop -= speed;\r\n          updateTarget();\r\n          if (container.scrollTop > 0) {\r\n            autoScrollRAF.current = requestAnimationFrame(scroll);\r\n          }\r\n        };\r\n        autoScrollRAF.current = requestAnimationFrame(scroll);\r\n      }\r\n    };\r\n\r\n    const onMove = (ev: MouseEvent) => {\r\n      lastClientY = ev.clientY;\r\n      updateTarget();\r\n      maybeAutoScroll();\r\n    };\r\n\r\n    const onUp = (ev: MouseEvent) => {\r\n      window.removeEventListener('mousemove', onMove);\r\n      window.removeEventListener('mouseup', onUp);\r\n      stopAutoScroll();\r\n      document.body.style.cursor = '';\r\n      document.body.style.userSelect = '';\r\n      setFillDrag(null);\r\n\r\n      // Compute the target index directly from the final cursor position so we\r\n      // don't depend on async state having flushed.\r\n      const targetIndex = rowIndexAt(ev.clientY);\r\n      const src = flatTasks.find(ft => ft.task.id === sourceTaskId)?.task;\r\n      if (!src) return;\r\n      const value = getFillValue(src, column);\r\n      const from = Math.min(sourceIndex, targetIndex);\r\n      const to = Math.max(sourceIndex, targetIndex);\r\n\r\n      // Collect the target task ids (skip the source + parent rows).\r\n      const targetIds: string[] = [];\r\n      for (let i = from; i <= to; i++) {\r\n        if (i === sourceIndex) continue;\r\n        const target = flatTasks[i]?.task;\r\n        if (!target) continue;\r\n        const isParent = !!(target.subtasks && target.subtasks.length > 0);\r\n        if (isParent) continue; // parents are read-only for assignees/dates\r\n        targetIds.push(target.id);\r\n      }\r\n      if (targetIds.length === 0) return;\r\n\r\n      // Single dedicated callback (like onTaskReparent/onTaskMove) — the\r\n      // consumer applies the value to all targets and persists them. This is\r\n      // far more reliable than firing onTaskUpdate N times and hoping the\r\n      // batched state + onTasksChange diff picks them all up.\r\n      onBulkFill?.(targetIds, column, value);\r\n    };\r\n\r\n    window.addEventListener('mousemove', onMove);\r\n    window.addEventListener('mouseup', onUp);\r\n  };\r\n\r\n  // True if this row index is inside the current fill-drag range (for preview).\r\n  const isInFillRange = (index: number) => {\r\n    if (!fillDrag) return false;\r\n    const from = Math.min(fillDrag.sourceIndex, fillDrag.targetIndex);\r\n    const to = Math.max(fillDrag.sourceIndex, fillDrag.targetIndex);\r\n    return index >= from && index <= to;\r\n  };\r\n\r\n  // Calculate duration\r\n  const getDuration = (task: Task) => {\r\n    if (!task.startDate || !task.endDate) return '-';\r\n    const days = Math.ceil((task.endDate.getTime() - task.startDate.getTime()) / (1000 * 60 * 60 * 24));\r\n    return `${days}d`;\r\n  };\r\n\r\n  // Handle rename start\r\n  const handleRenameStart = (task: Task) => {\r\n    setEditingTaskId(task.id);\r\n    setEditingTaskName(task.name);\r\n    setIsEditing(true);\r\n  };\r\n\r\n  // Handle rename save\r\n  const handleRenameSave = (taskId: string) => {\r\n    if (editingTaskName.trim() && editingTaskName !== tasks.find(t => t.id === taskId)?.name) {\r\n      onTaskRename?.(taskId, editingTaskName.trim());\r\n    }\r\n    setEditingTaskId(null);\r\n    setEditingTaskName('');\r\n    setIsEditing(false);\r\n  };\r\n\r\n  // Handle rename cancel\r\n  const handleRenameCancel = () => {\r\n    setEditingTaskId(null);\r\n    setEditingTaskName('');\r\n    setIsEditing(false);\r\n  };\r\n\r\n  // Handle create subtask\r\n  const handleCreateSubtaskClick = (task: Task, e: React.MouseEvent) => {\r\n    e.stopPropagation();\r\n    // Create subtask at the end of parent's children\r\n    onCreateSubtask?.(task.id);\r\n  };\r\n\r\n  // v0.17.68: Drag handlers for reparenting\r\n  const handleDragStart = (taskId: string, e: React.MouseEvent) => {\r\n    // Only start drag from the drag handle area\r\n    e.preventDefault();\r\n    dragStartY.current = e.clientY;\r\n    setDraggedTaskId(taskId);\r\n    isDraggingRef.current = false;\r\n    setIsDraggingState(false);\r\n    // v0.17.146: Initialize ghost position\r\n    setGhostPosition({ x: e.clientX, y: e.clientY });\r\n  };\r\n\r\n  const handleDragMove = (e: MouseEvent) => {\r\n    if (!draggedTaskId) return;\r\n\r\n    const deltaY = Math.abs(e.clientY - dragStartY.current);\r\n    if (deltaY > dragThreshold && !isDraggingRef.current) {\r\n      isDraggingRef.current = true;\r\n      setIsDraggingState(true);\r\n    }\r\n\r\n    // v0.17.146: Update ghost position\r\n    setGhostPosition({ x: e.clientX, y: e.clientY });\r\n\r\n    if (!isDraggingRef.current) return;\r\n\r\n    // v0.18.15: Auto-scroll when dragging near edges of scroll container\r\n    if (scrollContainerRef?.current) {\r\n      const container = scrollContainerRef.current;\r\n      const rect = container.getBoundingClientRect();\r\n      const edgeZone = 60; // px from edge to start scrolling\r\n      const maxSpeed = 12; // max px per frame\r\n\r\n      if (autoScrollRAF.current) {\r\n        cancelAnimationFrame(autoScrollRAF.current);\r\n        autoScrollRAF.current = null;\r\n      }\r\n\r\n      const distFromTop = e.clientY - rect.top;\r\n      const distFromBottom = rect.bottom - e.clientY;\r\n\r\n      if (distFromTop < edgeZone && container.scrollTop > 0) {\r\n        // Scroll up — speed increases as mouse gets closer to edge\r\n        const speed = Math.round(maxSpeed * (1 - distFromTop / edgeZone));\r\n        const scroll = () => {\r\n          container.scrollTop -= speed;\r\n          if (isDraggingRef.current && container.scrollTop > 0) {\r\n            autoScrollRAF.current = requestAnimationFrame(scroll);\r\n          }\r\n        };\r\n        autoScrollRAF.current = requestAnimationFrame(scroll);\r\n      } else if (distFromBottom < edgeZone && container.scrollTop < container.scrollHeight - container.clientHeight) {\r\n        // Scroll down\r\n        const speed = Math.round(maxSpeed * (1 - distFromBottom / edgeZone));\r\n        const scroll = () => {\r\n          container.scrollTop += speed;\r\n          if (isDraggingRef.current && container.scrollTop < container.scrollHeight - container.clientHeight) {\r\n            autoScrollRAF.current = requestAnimationFrame(scroll);\r\n          }\r\n        };\r\n        autoScrollRAF.current = requestAnimationFrame(scroll);\r\n      }\r\n    }\r\n\r\n    // Find which task we're hovering over\r\n    const rows = document.querySelectorAll('[data-task-row]');\r\n    let foundTarget: string | null = null;\r\n    let position: 'above' | 'below' | 'child' | null = null;\r\n\r\n    rows.forEach((row) => {\r\n      const rect = row.getBoundingClientRect();\r\n      const taskId = row.getAttribute('data-task-row');\r\n\r\n      if (taskId && taskId !== draggedTaskId && e.clientY >= rect.top && e.clientY <= rect.bottom) {\r\n        foundTarget = taskId;\r\n\r\n        // Determine drop position based on Y position within the row\r\n        const relativeY = e.clientY - rect.top;\r\n        const rowHeight = rect.height;\r\n\r\n        if (relativeY < rowHeight * 0.25) {\r\n          position = 'above';\r\n        } else if (relativeY > rowHeight * 0.75) {\r\n          position = 'below';\r\n        } else {\r\n          // Middle zone = make it a child\r\n          position = 'child';\r\n        }\r\n      }\r\n    });\r\n\r\n    setDropTargetTaskId(foundTarget);\r\n    setDropPosition(position);\r\n  };\r\n\r\n  const handleDragEnd = () => {\r\n    if (isDraggingRef.current && draggedTaskId && dropTargetTaskId && dropPosition) {\r\n      // Determine the new parent and position\r\n      if (dropPosition === 'child') {\r\n        // Make it a child of the target task\r\n        onTaskReparent?.(draggedTaskId, dropTargetTaskId);\r\n      } else if (dropPosition === 'above' || dropPosition === 'below') {\r\n        // Find the parent of the target task\r\n        const findParent = (taskList: Task[], targetId: string, parent: string | null = null): string | null => {\r\n          for (const t of taskList) {\r\n            if (t.id === targetId) return parent;\r\n            if (t.subtasks) {\r\n              const found = findParent(t.subtasks, targetId, t.id);\r\n              if (found !== undefined) return found;\r\n            }\r\n          }\r\n          return undefined as unknown as string | null;\r\n        };\r\n\r\n        // v1.9.10: para traducir la posición correctamente cuando hay un filtro\r\n        // activo, usamos el árbol COMPLETO (allTasks) si está disponible; si no,\r\n        // caemos a `tasks` (comportamiento previo, sin filtro). El target/parent\r\n        // se buscan también en el árbol elegido.\r\n        const tree = allTasks && allTasks.length > 0 ? allTasks : tasks;\r\n\r\n        // Find the parent of the dragged task (to know if it's in the same sibling group)\r\n        const draggedParent = findParent(tree, draggedTaskId, null);\r\n        const targetParent = findParent(tree, dropTargetTaskId, null);\r\n\r\n        // v0.18.13: Compute position accounting for the dragged task being removed first.\r\n        // reparentTask() removes the task then inserts — if the dragged task is before the\r\n        // target in the SAME sibling group, all subsequent indices shift down by 1.\r\n        // v1.9.10: `siblings` son los hermanos del ÁRBOL COMPLETO → el índice es la\r\n        // posición real en BD, aunque la vista esté filtrada.\r\n        const computePosition = (siblings: Task[], targetId: string, dragId: string, sameGroup: boolean): number => {\r\n          const targetIdx = siblings.findIndex(t => t.id === targetId);\r\n          const dragIdx = sameGroup ? siblings.findIndex(t => t.id === dragId) : -1;\r\n          let pos = dropPosition === 'below' ? targetIdx + 1 : targetIdx;\r\n          // If dragged task is before the target in the same group, removing it shifts indices down\r\n          if (sameGroup && dragIdx !== -1 && dragIdx < targetIdx) {\r\n            pos -= 1;\r\n          }\r\n          return Math.max(0, pos);\r\n        };\r\n\r\n        if (targetParent === null) {\r\n          // Target is at root level\r\n          const sameGroup = draggedParent === null; // dragged is also at root\r\n          const pos = computePosition(tree, dropTargetTaskId, draggedTaskId, sameGroup);\r\n          onTaskReparent?.(draggedTaskId, null, pos);\r\n        } else {\r\n          // Target has a parent\r\n          const parentTask = findTaskInTree(tree, targetParent);\r\n          if (parentTask?.subtasks) {\r\n            const sameGroup = draggedParent === targetParent; // same parent\r\n            const pos = computePosition(parentTask.subtasks, dropTargetTaskId, draggedTaskId, sameGroup);\r\n            onTaskReparent?.(draggedTaskId, targetParent, pos);\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // Reset drag state\r\n    if (autoScrollRAF.current) {\r\n      cancelAnimationFrame(autoScrollRAF.current);\r\n      autoScrollRAF.current = null;\r\n    }\r\n    setDraggedTaskId(null);\r\n    setDropTargetTaskId(null);\r\n    setDropPosition(null);\r\n    setGhostPosition(null); // v0.17.146: Clear ghost\r\n    isDraggingRef.current = false;\r\n    setIsDraggingState(false);\r\n  };\r\n\r\n  // v0.17.68: Set up global drag listeners\r\n  useEffect(() => {\r\n    if (draggedTaskId) {\r\n      document.addEventListener('mousemove', handleDragMove);\r\n      document.addEventListener('mouseup', handleDragEnd);\r\n      document.body.style.cursor = 'grabbing';\r\n      document.body.style.userSelect = 'none';\r\n\r\n      return () => {\r\n        document.removeEventListener('mousemove', handleDragMove);\r\n        document.removeEventListener('mouseup', handleDragEnd);\r\n        document.body.style.cursor = '';\r\n        document.body.style.userSelect = '';\r\n      };\r\n    }\r\n    return undefined;\r\n  }, [draggedTaskId, dropTargetTaskId, dropPosition]);\r\n\r\n  // Render cell content based on column type\r\n  const renderCellContent = (column: GanttColumn, task: Task, level: number) => {\r\n    // Leaf Node Rule: parent tasks with children are read-only containers\r\n    const isParentTask = task.subtasks && task.subtasks.length > 0;\r\n\r\n    switch (column.id) {\r\n      case 'name':\r\n        const isEditing = editingTaskId === task.id;\r\n        const isHovered = hoveredTaskId === task.id;\r\n\r\n        return (\r\n          <div className=\"flex items-center gap-2 flex-1 min-w-0 relative\" style={{ paddingLeft: `${level * 20}px` }}>\r\n            {/* v0.17.68: Drag handle for reparenting - always visible, more prominent on hover */}\r\n            {onTaskReparent && (\r\n              <div\r\n                className=\"cursor-grab active:cursor-grabbing p-0.5 rounded hover:bg-white/10 transition-all flex-shrink-0\"\r\n                style={{\r\n                  color: theme.textTertiary,\r\n                  opacity: isHovered ? 1 : 0.3,\r\n                }}\r\n                onMouseDown={(e) => handleDragStart(task.id, e)}\r\n                title=\"Arrastrar para mover tarea\"\r\n              >\r\n                <GripVertical className=\"w-4 h-4\" />\r\n              </div>\r\n            )}\r\n\r\n            {/* Expand/Collapse Button OR Color Indicator - same position for alignment */}\r\n            {task.subtasks && task.subtasks.length > 0 ? (\r\n              <button\r\n                onClick={(e) => {\r\n                  e.stopPropagation();\r\n                  onTaskToggle?.(task.id);\r\n                }}\r\n                className=\"p-0.5 hover:bg-opacity-10 rounded transition-colors flex-shrink-0\"\r\n                style={{ color: theme.textSecondary }}\r\n              >\r\n                {task.isExpanded ? (\r\n                  <ChevronDown className=\"w-4 h-4\" />\r\n                ) : (\r\n                  <ChevronRight className=\"w-4 h-4\" />\r\n                )}\r\n              </button>\r\n            ) : (\r\n              /* v2.2.0: Removed color dot — spacer keeps alignment with chevron */\r\n              <div className=\"w-5 h-5 flex-shrink-0\" />\r\n            )}\r\n\r\n            {/* Task Name or Input */}\r\n            {isEditing ? (\r\n              <input\r\n                ref={editInputRef}\r\n                type=\"text\"\r\n                value={editingTaskName}\r\n                onChange={(e) => setEditingTaskName(e.target.value)}\r\n                onKeyDown={(e) => {\r\n                  if (e.key === 'Enter') {\r\n                    handleRenameSave(task.id);\r\n                  } else if (e.key === 'Escape') {\r\n                    handleRenameCancel();\r\n                  }\r\n                }}\r\n                onBlur={() => handleRenameSave(task.id)}\r\n                className=\"flex-1 px-2 py-1 rounded border outline-none\"\r\n                style={{\r\n                  backgroundColor: theme.bgPrimary,\r\n                  borderColor: theme.accent,\r\n                  color: theme.textPrimary,\r\n                  fontFamily: 'Inter, sans-serif',\r\n                  fontSize: '13px',\r\n                  fontWeight: 500,\r\n                }}\r\n                onClick={(e) => e.stopPropagation()}\r\n              />\r\n            ) : (\r\n              <>\r\n                <span\r\n                  className=\"flex-1 min-w-0\"\r\n                  style={{\r\n                    // v0.17.72: Enhanced visual hierarchy - Root tasks (level 0) are always \"phases\"\r\n                    display: 'flex',\r\n                    alignItems: 'baseline',\r\n                    gap: '6px',\r\n                    color: !task.parentId\r\n                      ? theme.textPrimary\r\n                      : theme.textSecondary,\r\n                    fontFamily: 'Inter, sans-serif',\r\n                    fontSize: !task.parentId\r\n                      ? '14px'\r\n                      : '13px',\r\n                    fontWeight: task.isMilestone\r\n                      ? 600\r\n                      : !task.parentId\r\n                        ? 600\r\n                        : 400,\r\n                    letterSpacing: !task.parentId\r\n                      ? '-0.01em'\r\n                      : '0',\r\n                  }}\r\n                  title={task.name}\r\n                >\r\n                  {task.wbsCode && (\r\n                    <span style={{\r\n                      color: theme.textTertiary,\r\n                      fontFamily: \"'JetBrains Mono', monospace\",\r\n                      fontSize: '11px',\r\n                      fontWeight: 500,\r\n                      opacity: 0.65,\r\n                      flexShrink: 0,\r\n                    }}>\r\n                      {task.wbsCode}\r\n                    </span>\r\n                  )}\r\n                  {/* v5.2.0: Estrella de Reconocimiento */}\r\n                  {(task as any).isHighlighted && task.status === 'completed' && (\r\n                    <span\r\n                      title=\"★\"\r\n                      style={{\r\n                        color: '#F59E0B',\r\n                        fontSize: '10px',\r\n                        flexShrink: 0,\r\n                        lineHeight: 1,\r\n                      }}\r\n                    >★</span>\r\n                  )}\r\n                  <span style={{\r\n                    flex: 1,\r\n                    minWidth: 0,\r\n                    overflow: 'hidden',\r\n                    textOverflow: 'ellipsis',\r\n                    whiteSpace: 'nowrap',\r\n                  }}>\r\n                    {task.name}\r\n                  </span>\r\n                  {/* v5.0.0: Master/summary tasks show progress percentage */}\r\n                  {task.subtasks && task.subtasks.length > 0 && (\r\n                    <span style={{\r\n                      color: '#6B7280',\r\n                      fontFamily: \"'JetBrains Mono', monospace\",\r\n                      fontSize: '12px',\r\n                      fontWeight: 400,\r\n                      flexShrink: 0,\r\n                      whiteSpace: 'nowrap',\r\n                    }}>\r\n                      · {Math.round(task.progress || 0)}%\r\n                    </span>\r\n                  )}\r\n                  {/* v5.1.0: CPM — critical dot + float indicator */}\r\n                  {showCriticalPath && task.isCriticalPath && (\r\n                    <span style={{\r\n                      display: 'inline-block',\r\n                      width: '6px',\r\n                      height: '6px',\r\n                      borderRadius: '50%',\r\n                      backgroundColor: '#EF4444',\r\n                      flexShrink: 0,\r\n                      marginLeft: '2px',\r\n                    }} />\r\n                  )}\r\n                  {showCriticalPath && task.cpmData && (\r\n                    <span style={{\r\n                      color: task.cpmData.totalFloat <= 0 ? '#EF4444'\r\n                        : task.cpmData.totalFloat <= 5 ? '#F59E0B'\r\n                        : '#6B7280',\r\n                      fontFamily: \"'JetBrains Mono', monospace\",\r\n                      fontSize: '10px',\r\n                      fontWeight: 500,\r\n                      flexShrink: 0,\r\n                      whiteSpace: 'nowrap',\r\n                      marginLeft: '4px',\r\n                    }}>\r\n                      TF: {Math.round(task.cpmData.totalFloat)}d\r\n                    </span>\r\n                  )}\r\n                </span>\r\n\r\n                {/* Hover Action Buttons */}\r\n                {isHovered && !isEditing && (\r\n                  <div className=\"flex items-center gap-1 ml-2\" onClick={(e) => e.stopPropagation()}>\r\n                    {/* Create Subtask Button */}\r\n                    <button\r\n                      onClick={(e) => handleCreateSubtaskClick(task, e)}\r\n                      className=\"p-1 rounded hover:bg-opacity-20 transition-colors\"\r\n                      style={{\r\n                        color: theme.textTertiary,\r\n                        backgroundColor: 'transparent'\r\n                      }}\r\n                      title=\"Create subtask\"\r\n                    >\r\n                      <Plus className=\"w-3.5 h-3.5\" />\r\n                    </button>\r\n\r\n                    {/* Rename Button */}\r\n                    <button\r\n                      onClick={(e) => {\r\n                        e.stopPropagation();\r\n                        handleRenameStart(task);\r\n                      }}\r\n                      className=\"p-1 rounded hover:bg-opacity-20 transition-colors\"\r\n                      style={{\r\n                        color: theme.textTertiary,\r\n                        backgroundColor: 'transparent'\r\n                      }}\r\n                      title=\"Rename (F2)\"\r\n                    >\r\n                      <Edit3 className=\"w-3.5 h-3.5\" />\r\n                    </button>\r\n                  </div>\r\n                )}\r\n              </>\r\n            )}\r\n          </div>\r\n        );\r\n      \r\n      case 'startDate':\r\n      case 'endDate':\r\n        const isStartDate = column.id === 'startDate';\r\n        const dateField = isStartDate ? 'startDate' : 'endDate';\r\n        const dateValue = task[dateField];\r\n        const isDatePickerOpen = datePickerState?.taskId === task.id && datePickerState?.field === dateField;\r\n\r\n        const formatDisplayDate = (date: Date | string | undefined) => {\r\n          if (!date) return '-';\r\n          const d = typeof date === 'string' ? new Date(date) : date;\r\n          return d.toLocaleDateString('es-ES', { day: '2-digit', month: '2-digit', year: 'numeric' });\r\n        };\r\n\r\n        return (\r\n          <div\r\n            className=\"flex items-center justify-center w-full relative\"\r\n            onClick={(e) => e.stopPropagation()}\r\n          >\r\n            <button\r\n              type=\"button\"\r\n              className=\"flex items-center gap-1.5 px-2 py-1 rounded text-xs transition-colors hover:bg-white/5\"\r\n              style={{\r\n                color: theme.textSecondary,\r\n                opacity: isParentTask ? 0.5 : 1,\r\n                cursor: isParentTask ? 'default' : 'pointer',\r\n              }}\r\n              title={isParentTask ? 'Auto-calculated from subtasks' : undefined}\r\n              onClick={(e) => {\r\n                if (isParentTask) return; // Parent dates are read-only (roll-up)\r\n                if (isDatePickerOpen) {\r\n                  setDatePickerState(null);\r\n                } else {\r\n                  const rect = e.currentTarget.getBoundingClientRect();\r\n                  setDatePickerState({\r\n                    taskId: task.id,\r\n                    field: dateField,\r\n                    month: (dateValue ? (typeof dateValue === 'string' ? new Date(dateValue) : dateValue) : new Date()),\r\n                    position: { top: rect.bottom + 4, left: rect.left }\r\n                  });\r\n                }\r\n              }}\r\n            >\r\n              <Calendar className=\"w-3 h-3\" style={{ color: theme.textTertiary }} />\r\n              <span>{formatDisplayDate(dateValue)}</span>\r\n              {isParentTask && <span style={{ fontSize: '9px', color: theme.textTertiary, marginLeft: '2px' }}>▼</span>}\r\n            </button>\r\n\r\n            {/* Date Picker Popover - Using Portal to render outside overflow:hidden containers */}\r\n            {isDatePickerOpen && typeof document !== 'undefined' && createPortal(\r\n              <>\r\n                <div className=\"fixed inset-0 z-[9998]\" onClick={() => setDatePickerState(null)} />\r\n                <motion.div\r\n                  initial={{ opacity: 0, y: -10 }}\r\n                  animate={{ opacity: 1, y: 0 }}\r\n                  exit={{ opacity: 0, y: -10 }}\r\n                  className=\"fixed z-[9999] rounded-xl shadow-2xl overflow-visible flex\"\r\n                  style={{\r\n                    backgroundColor: theme.bgPrimary,\r\n                    border: `1px solid ${theme.border}`,\r\n                    top: datePickerState?.position.top,\r\n                    left: datePickerState?.position.left,\r\n                  }}\r\n                  onClick={(e) => e.stopPropagation()}\r\n                >\r\n                  {/* Quick Options */}\r\n                  <div className=\"w-36 py-2\" style={{ borderRight: `1px solid ${theme.border}` }}>\r\n                    {(() => {\r\n                      const today = new Date();\r\n                      const tomorrow = new Date(today); tomorrow.setDate(today.getDate() + 1);\r\n                      const nextWeek = new Date(today); nextWeek.setDate(today.getDate() + 7);\r\n                      const twoWeeks = new Date(today); twoWeeks.setDate(today.getDate() + 14);\r\n\r\n                      const options = [\r\n                        { label: 'Hoy', date: today },\r\n                        { label: 'Mañana', date: tomorrow },\r\n                        { label: 'Próxima semana', date: nextWeek },\r\n                        { label: '2 semanas', date: twoWeeks },\r\n                      ];\r\n\r\n                      return options.map((opt, i) => (\r\n                        <button\r\n                          key={i}\r\n                          type=\"button\"\r\n                          className=\"w-full px-3 py-1.5 text-xs text-left transition-colors\"\r\n                          style={{ color: theme.textPrimary }}\r\n                          onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = theme.hoverBg || 'rgba(255,255,255,0.05)')}\r\n                          onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\r\n                          onClick={() => {\r\n                            onTaskUpdate?.(task.id, { [dateField]: opt.date });\r\n                            setDatePickerState(null);\r\n                          }}\r\n                        >\r\n                          {opt.label}\r\n                        </button>\r\n                      ));\r\n                    })()}\r\n                    <div style={{ borderTop: `1px solid ${theme.border}`, margin: '0.25rem 0' }} />\r\n                    <button\r\n                      type=\"button\"\r\n                      className=\"w-full px-3 py-1.5 text-xs text-left transition-colors\"\r\n                      style={{ color: '#EF4444' }}\r\n                      onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = theme.hoverBg || 'rgba(255,255,255,0.05)')}\r\n                      onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\r\n                      onClick={() => {\r\n                        onTaskUpdate?.(task.id, { [dateField]: undefined });\r\n                        setDatePickerState(null);\r\n                      }}\r\n                    >\r\n                      Borrar\r\n                    </button>\r\n                  </div>\r\n\r\n                  {/* Calendar */}\r\n                  <div className=\"p-2\">\r\n                    <div className=\"flex items-center justify-between mb-2\">\r\n                      <button\r\n                        type=\"button\"\r\n                        onClick={() => setDatePickerState(prev => prev ? { ...prev, month: new Date(prev.month.getFullYear(), prev.month.getMonth() - 1) } : null)}\r\n                        className=\"p-1 rounded hover:bg-white/10\"\r\n                      >\r\n                        <ChevronLeft className=\"w-3.5 h-3.5\" style={{ color: theme.textSecondary }} />\r\n                      </button>\r\n                      <span className=\"text-xs font-medium\" style={{ color: theme.textPrimary }}>\r\n                        {datePickerState?.month.toLocaleDateString('es-ES', { month: 'long', year: 'numeric' })}\r\n                      </span>\r\n                      <button\r\n                        type=\"button\"\r\n                        onClick={() => setDatePickerState(prev => prev ? { ...prev, month: new Date(prev.month.getFullYear(), prev.month.getMonth() + 1) } : null)}\r\n                        className=\"p-1 rounded hover:bg-white/10\"\r\n                      >\r\n                        <ChevronRight className=\"w-3.5 h-3.5\" style={{ color: theme.textSecondary }} />\r\n                      </button>\r\n                    </div>\r\n                    <div className=\"grid grid-cols-7 gap-0.5 mb-1\">\r\n                      {['D', 'L', 'M', 'M', 'J', 'V', 'S'].map((d, i) => (\r\n                        <div key={i} className=\"w-6 h-6 flex items-center justify-center text-[10px]\" style={{ color: theme.textTertiary }}>{d}</div>\r\n                      ))}\r\n                    </div>\r\n                    <div className=\"grid grid-cols-7 gap-0.5\">\r\n                      {(() => {\r\n                        const month = datePickerState?.month || new Date();\r\n                        const year = month.getFullYear(), m = month.getMonth();\r\n                        const firstDay = new Date(year, m, 1).getDay();\r\n                        const daysInMonth = new Date(year, m + 1, 0).getDate();\r\n                        const today = new Date();\r\n                        const days: { day: number; date: Date; isCurrentMonth: boolean }[] = [];\r\n\r\n                        for (let i = firstDay - 1; i >= 0; i--) days.push({ day: new Date(year, m, -i).getDate(), date: new Date(year, m - 1, new Date(year, m, -i).getDate()), isCurrentMonth: false });\r\n                        for (let i = 1; i <= daysInMonth; i++) days.push({ day: i, date: new Date(year, m, i), isCurrentMonth: true });\r\n                        const remaining = 42 - days.length;\r\n                        for (let i = 1; i <= remaining; i++) days.push({ day: i, date: new Date(year, m + 1, i), isCurrentMonth: false });\r\n\r\n                        return days.map((d, i) => {\r\n                          const isToday = d.date.toDateString() === today.toDateString();\r\n                          const currentDateValue = dateValue ? (typeof dateValue === 'string' ? new Date(dateValue) : dateValue) : null;\r\n                          const isSelected = currentDateValue?.toDateString() === d.date.toDateString();\r\n\r\n                          return (\r\n                            <button\r\n                              key={i}\r\n                              type=\"button\"\r\n                              className=\"w-6 h-6 rounded-full flex items-center justify-center text-[10px] transition-colors\"\r\n                              style={{\r\n                                color: !d.isCurrentMonth ? theme.textTertiary : isSelected ? '#FFF' : theme.textPrimary,\r\n                                backgroundColor: isSelected ? '#00E5CC' : 'transparent',\r\n                                boxShadow: isToday && !isSelected ? 'inset 0 0 0 1px #00E5CC' : 'none',\r\n                              }}\r\n                              onClick={() => {\r\n                                onTaskUpdate?.(task.id, { [dateField]: d.date });\r\n                                setDatePickerState(null);\r\n                              }}\r\n                            >\r\n                              {d.day}\r\n                            </button>\r\n                          );\r\n                        });\r\n                      })()}\r\n                    </div>\r\n                  </div>\r\n                </motion.div>\r\n              </>,\r\n              document.body\r\n            )}\r\n          </div>\r\n        );\r\n\r\n      case 'duration':\r\n        return (\r\n          <div className=\"flex items-center justify-center w-full\">\r\n            <span\r\n              className=\"text-xs tabular-nums\"\r\n              style={{\r\n                color: theme.textSecondary,\r\n                fontFamily: 'Inter, sans-serif',\r\n                fontWeight: 600,\r\n              }}\r\n            >\r\n              {getDuration(task)}\r\n            </span>\r\n          </div>\r\n        );\r\n      \r\n      case 'assignees':\r\n        // Parent tasks: no assignees (read-only container)\r\n        if (isParentTask) {\r\n          return (\r\n            <div className=\"flex items-center justify-center w-full\" style={{ opacity: 0.4 }}>\r\n              <span className=\"text-xs\" style={{ color: theme.textTertiary }}>—</span>\r\n            </div>\r\n          );\r\n        }\r\n        // Match by id first (robust when two people share a name / initials,\r\n        // e.g. a real user + a virtual profile). Fall back to name/initials only\r\n        // for legacy assignees that were stored without an id.\r\n        const taskAssignedUsers: User[] = availableUsers.filter(user =>\r\n          task.assignees?.some(a =>\r\n            (a as any).id\r\n              ? (a as any).id === user.id\r\n              : (a.name === user.name || a.initials === user.initials)\r\n          )\r\n        );\r\n\r\n        return (\r\n          <div\r\n            className=\"flex items-center justify-center w-full\"\r\n            onClick={(e) => e.stopPropagation()}\r\n          >\r\n            <UserAssignmentSelector\r\n              assignedUsers={taskAssignedUsers}\r\n              availableUsers={availableUsers}\r\n              onChange={(users: User[]) => {\r\n                const newAssignees = users.map(u => ({\r\n                  id: u.id,\r\n                  name: u.name,\r\n                  initials: u.initials,\r\n                  color: u.color\r\n                }));\r\n                // Pass an empty array (not undefined) when cleared, so consumers\r\n                // that only sync assignees \"when defined\" still process the\r\n                // removal and delete the rows. undefined = \"untouched\", [] = \"none\".\r\n                onTaskUpdate?.(task.id, {\r\n                  assignees: newAssignees,\r\n                });\r\n              }}\r\n            />\r\n          </div>\r\n        );\r\n\r\n      case 'status':\r\n        // Parent tasks: show rolled-up status (read-only)\r\n        if (isParentTask) {\r\n          const statusLabel = task.progress === 100 ? '✓' : task.progress > 0 ? '◐' : '○';\r\n          return (\r\n            <div className=\"flex items-center justify-center w-full\" style={{ opacity: 0.5 }}>\r\n              <span className=\"text-xs\" style={{ color: theme.textTertiary }}>{statusLabel}</span>\r\n            </div>\r\n          );\r\n        }\r\n        return (\r\n          <div\r\n            className=\"flex items-center justify-center w-full\"\r\n            onClick={(e) => e.stopPropagation()}\r\n          >\r\n            <StatusSelector\r\n              status={task.status || 'todo'}\r\n              onChange={(status) => {\r\n                onTaskUpdate?.(task.id, {\r\n                  status,\r\n                  progress: status === 'completed' ? 100 : task.progress\r\n                });\r\n              }}\r\n            />\r\n          </div>\r\n        );\r\n\r\n      case 'progress':\r\n        return (\r\n          <div className=\"flex items-center justify-center gap-2 w-full\" style={{ opacity: isParentTask ? 0.6 : 1 }}>\r\n            <div className=\"flex-1 h-1.5 rounded-full overflow-hidden max-w-[60px]\" style={{ backgroundColor: theme.bgSecondary }}>\r\n              <div\r\n                className=\"h-full rounded-full transition-all\"\r\n                style={{\r\n                  width: `${task.progress}%`,\r\n                  backgroundColor: task.progress === 100 ? theme.statusCompleted : theme.accent,\r\n                }}\r\n              />\r\n            </div>\r\n            <span\r\n              className=\"text-xs tabular-nums min-w-[35px] text-right\"\r\n              style={{\r\n                color: theme.textTertiary,\r\n                fontFamily: 'Inter, sans-serif',\r\n                fontWeight: 600,\r\n              }}\r\n            >\r\n              {task.progress}%\r\n            </span>\r\n          </div>\r\n        );\r\n\r\n      // v0.17.29: Priority column\r\n      case 'priority':\r\n        // Map task priority to PrioritySelector format\r\n        const priorityMapForSelector: Record<string, 'LOW' | 'MEDIUM' | 'HIGH' | 'URGENT'> = {\r\n          low: 'LOW',\r\n          medium: 'MEDIUM',\r\n          high: 'HIGH',\r\n          urgent: 'URGENT',\r\n        };\r\n        const reversePriorityMapForTask: Record<string, 'low' | 'medium' | 'high' | 'urgent'> = {\r\n          LOW: 'low',\r\n          MEDIUM: 'medium',\r\n          HIGH: 'high',\r\n          URGENT: 'urgent',\r\n        };\r\n        const currentPriorityValue = priorityMapForSelector[task.priority || 'medium'] || 'MEDIUM';\r\n\r\n        return (\r\n          <div\r\n            className=\"flex items-center justify-center w-full\"\r\n            onClick={(e) => e.stopPropagation()}\r\n          >\r\n            <PrioritySelector\r\n              priority={currentPriorityValue}\r\n              onChange={(newPriority) => {\r\n                if (newPriority) {\r\n                  onTaskUpdate?.(task.id, {\r\n                    priority: reversePriorityMapForTask[newPriority] || 'medium',\r\n                  });\r\n                }\r\n              }}\r\n            />\r\n          </div>\r\n        );\r\n\r\n      default:\r\n        return null;\r\n    }\r\n  };\r\n\r\n  // Context menu items for header\r\n  const getHeaderContextMenuItems = (columnId: ColumnType): ContextMenuItem[] => {\r\n    return [\r\n      {\r\n        id: 'hide',\r\n        label: 'Hide Column',\r\n        icon: MenuIcons.Hide,\r\n        onClick: () => onToggleColumn(columnId),\r\n        disabled: columnId === 'name',\r\n      },\r\n      { id: 'sep1', label: '', onClick: () => {}, separator: true },\r\n      {\r\n        id: 'sortAsc',\r\n        label: 'Sort Ascending',\r\n        icon: MenuIcons.SortAsc,\r\n        onClick: () => {\r\n          // Implement sorting in parent component if needed\r\n        },\r\n      },\r\n      {\r\n        id: 'sortDesc',\r\n        label: 'Sort Descending',\r\n        icon: MenuIcons.SortDesc,\r\n        onClick: () => {\r\n          // Implement sorting in parent component if needed\r\n        },\r\n      },\r\n    ];\r\n  };\r\n\r\n  // v0.16.2: Context menu items for task row - unified with GanttBoard context menu\r\n  // v0.17.46: Parent tasks (with subtasks) have limited menu - no edit, no status changes\r\n  const getTaskContextMenuItems = (task: Task): ContextMenuItem[] => {\r\n    const isParentTask = task.subtasks && task.subtasks.length > 0;\r\n\r\n    // v1.9.6: Acciones masivas — si la tarea bajo el cursor es parte de una\r\n    // multi-selección (Ctrl/Shift+click), las acciones de estado, duplicar y\r\n    // eliminar aplican a TODAS las tareas seleccionadas. Editar / Agregar\r\n    // subtarea / Dividir siguen siendo de una sola tarea.\r\n    const flatAll = flattenTasksUtil(tasks);\r\n    const isBulk = selectedTaskIds.size > 1 && selectedTaskIds.has(task.id);\r\n    const selectedTasks = isBulk\r\n      ? flatAll.filter((t) => selectedTaskIds.has(t.id))\r\n      : [task];\r\n    const bulkIds = selectedTasks.map((t) => t.id);\r\n    // Cambios de estado solo a tareas hoja: el estado/progreso de los padres\r\n    // se auto-calcula desde sus subtareas.\r\n    const statusTargets = selectedTasks.filter(\r\n      (t) => !(t.subtasks && t.subtasks.length > 0)\r\n    );\r\n    const sfx = isBulk ? ` (${bulkIds.length})` : '';\r\n    const requestDelete = () => {\r\n      if (onDeleteRequest) {\r\n        // En bulk el modal muestra solo el conteo; el nombre aplica al caso single.\r\n        onDeleteRequest(bulkIds, task.name);\r\n      } else {\r\n        onMultiTaskDelete?.(bulkIds);\r\n      }\r\n    };\r\n\r\n    // v0.17.46: Parent tasks can only add subtasks, duplicate and delete - status/progress is auto-calculated\r\n    if (isParentTask) {\r\n      return [\r\n        // Add Subtask - main action for parent tasks\r\n        {\r\n          id: 'addSubtask',\r\n          label: translations?.contextMenu?.addSubtask || 'Add Subtask',\r\n          icon: MenuIcons.Add,\r\n          onClick: () => {\r\n            onCreateSubtask?.(task.id);\r\n          },\r\n        },\r\n        // Duplicate Task (with subtasks) — bulk-aware\r\n        {\r\n          id: 'duplicate',\r\n          label: (translations?.contextMenu?.duplicateTask || 'Duplicate Task') + sfx,\r\n          icon: MenuIcons.Duplicate,\r\n          onClick: () => {\r\n            onTaskDuplicate?.(bulkIds);\r\n          },\r\n        },\r\n        // Separator before delete\r\n        { id: 'sep1', label: '', onClick: () => {}, separator: true },\r\n        // Delete Task — bulk-aware\r\n        {\r\n          id: 'delete',\r\n          label: (translations?.contextMenu?.deleteTask || 'Delete Task') + sfx,\r\n          icon: MenuIcons.Delete,\r\n          onClick: requestDelete,\r\n        },\r\n      ];\r\n    }\r\n\r\n    // Regular tasks (no subtasks) - full menu\r\n    return [\r\n      // Edit Task - opens edit modal via double-click handler\r\n      {\r\n        id: 'edit',\r\n        label: translations?.contextMenu?.editTask || 'Edit Task',\r\n        icon: MenuIcons.Pencil,\r\n        onClick: () => {\r\n          onTaskDblClick?.(task);\r\n        },\r\n      },\r\n      // Add Subtask\r\n      {\r\n        id: 'addSubtask',\r\n        label: translations?.contextMenu?.addSubtask || 'Add Subtask',\r\n        icon: MenuIcons.Add,\r\n        onClick: () => {\r\n          onCreateSubtask?.(task.id);\r\n        },\r\n      },\r\n      // Separator before status changes\r\n      { id: 'sep1', label: '', onClick: () => {}, separator: true },\r\n      // Mark Incomplete (status: 'todo', progress: 0) — bulk-aware\r\n      {\r\n        id: 'markIncomplete',\r\n        label: (translations?.contextMenu?.markIncomplete || 'Mark Incomplete') + sfx,\r\n        icon: MenuIcons.MarkIncomplete,\r\n        onClick: () => {\r\n          statusTargets.forEach((t) => onTaskUpdate?.(t.id, { status: 'todo', progress: 0 }));\r\n        },\r\n        disabled: statusTargets.length === 0 || statusTargets.every((t) => t.status === 'todo'),\r\n      },\r\n      // Set In Progress (status: 'in-progress') — bulk-aware\r\n      {\r\n        id: 'setInProgress',\r\n        label: (translations?.contextMenu?.setInProgress || 'Set In Progress') + sfx,\r\n        icon: MenuIcons.SetInProgress,\r\n        onClick: () => {\r\n          statusTargets.forEach((t) => onTaskUpdate?.(t.id, { status: 'in-progress' }));\r\n        },\r\n        disabled: statusTargets.length === 0 || statusTargets.every((t) => t.status === 'in-progress'),\r\n      },\r\n      // Mark Complete (status: 'completed', progress: 100) — bulk-aware\r\n      {\r\n        id: 'markComplete',\r\n        label: (translations?.contextMenu?.markComplete || 'Mark Complete') + sfx,\r\n        icon: MenuIcons.MarkComplete,\r\n        onClick: () => {\r\n          statusTargets.forEach((t) => onTaskUpdate?.(t.id, { status: 'completed', progress: 100 }));\r\n        },\r\n        disabled: statusTargets.length === 0 || statusTargets.every((t) => t.status === 'completed'),\r\n      },\r\n      // Separator before advanced options\r\n      { id: 'sep2', label: '', onClick: () => {}, separator: true },\r\n      // v1.4.3: Duplicate Task — bulk-aware\r\n      {\r\n        id: 'duplicate',\r\n        label: (translations?.contextMenu?.duplicateTask || 'Duplicate Task') + sfx,\r\n        icon: MenuIcons.Duplicate,\r\n        onClick: () => {\r\n          onTaskDuplicate?.(bulkIds);\r\n        },\r\n      },\r\n      // Split Task\r\n      {\r\n        id: 'split',\r\n        label: translations?.contextMenu?.splitTask || 'Split Task',\r\n        icon: MenuIcons.Split,\r\n        onClick: () => {},\r\n        // Split task is only available via Timeline context menu (right-click on task bar)\r\n        disabled: true,\r\n      },\r\n      // Separator before delete\r\n      { id: 'sep3', label: '', onClick: () => {}, separator: true },\r\n      // Delete Task - v0.17.34: Use confirmation modal if available — bulk-aware\r\n      {\r\n        id: 'delete',\r\n        label: (translations?.contextMenu?.deleteTask || 'Delete Task') + sfx,\r\n        icon: MenuIcons.Delete,\r\n        onClick: requestDelete,\r\n      },\r\n    ];\r\n  };\r\n\r\n  const visibleColumns = columns.filter(col => col.visible);\r\n\r\n  // v0.17.213: Buttons now in flex flow, no extra width needed\r\n  const totalColumnsWidth = visibleColumns.reduce((sum, col) => sum + col.width, 0);\r\n\r\n  // v0.13.10: TaskGrid no longer has its own scroll - it syncs with Timeline scroll\r\n  // v0.17.372: Removed h-full to allow sticky header to work correctly during scroll\r\n  return (\r\n    <div\r\n      className=\"gantt-taskgrid-content\"\r\n      style={{\r\n        backgroundColor: theme.bgPrimary,\r\n        minWidth: totalColumnsWidth, // v0.17.194: Enable horizontal scroll when needed\r\n      }}\r\n    >\r\n      {/* Header - v0.17.213: Buttons now in flex flow (not absolute) for proper space */}\r\n      <div\r\n        className=\"sticky top-0 z-10 flex items-center\"\r\n        style={{\r\n          backgroundColor: theme.glassHeader || theme.bgSecondary,\r\n          height: `${HEADER_HEIGHT}px`,\r\n          paddingLeft: '3px',\r\n          borderBottom: `1px solid ${theme.border}`,\r\n          boxSizing: 'border-box',\r\n        }}\r\n      >\r\n        {/* Columns container - takes remaining space */}\r\n        <div className=\"flex items-center flex-1 min-w-0\">\r\n        {visibleColumns.map((column, colIndex) => {\r\n          const isLastColumn = colIndex === visibleColumns.length - 1;\r\n          const isNameColumn = column.id === 'name';\r\n\r\n          return (\r\n          <div\r\n            key={column.id}\r\n            className={`flex items-center px-4 cursor-pointer hover:bg-opacity-50 transition-colors relative ${\r\n              isNameColumn ? '' : 'justify-center'\r\n            }`}\r\n            style={{\r\n              // v0.17.129: All columns use fixed width for consistent resize behavior\r\n              width: `${column.width}px`,\r\n              minWidth: `${column.minWidth ?? (isNameColumn ? 200 : 60)}px`,\r\n              maxWidth: `${column.maxWidth ?? 2000}px`,\r\n              flexShrink: isNameColumn && visibleColumns.length === 1 ? 1 : 0,\r\n              flexGrow: isNameColumn && visibleColumns.length === 1 ? 1 : 0,\r\n              // v0.17.129: Border between columns, none on last (GanttBoard has the main divider)\r\n              borderRight: !isLastColumn ? `1px solid ${theme.borderLight}` : 'none',\r\n              height: '100%',\r\n              boxSizing: 'border-box',\r\n              overflow: 'hidden',\r\n            }}\r\n            onContextMenu={(e) => {\r\n              e.preventDefault();\r\n              setContextMenu({\r\n                isOpen: true,\r\n                x: e.clientX,\r\n                y: e.clientY,\r\n                type: 'header',\r\n                columnId: column.id,\r\n              });\r\n            }}\r\n            onMouseEnter={(e) => {\r\n              e.currentTarget.style.backgroundColor = theme.hoverBg;\r\n            }}\r\n            onMouseLeave={(e) => {\r\n              e.currentTarget.style.backgroundColor = 'transparent';\r\n            }}\r\n          >\r\n            <span\r\n              className=\"text-xs uppercase tracking-wider\"\r\n              style={{\r\n                color: theme.textTertiary,\r\n                fontFamily: 'Inter, sans-serif',\r\n                fontWeight: 600,\r\n                // v0.17.129: Truncate long labels elegantly\r\n                overflow: 'hidden',\r\n                textOverflow: 'ellipsis',\r\n                whiteSpace: 'nowrap',\r\n                minWidth: 0,\r\n                // v0.17.191: No extra padding needed - buttons are now at header level\r\n                paddingRight: '0',\r\n              }}\r\n              title={column.label}\r\n            >\r\n              {column.label}\r\n            </span>\r\n\r\n            {/* v0.17.191: Action buttons moved outside column flow - see header level */}\r\n\r\n            {/* v0.13.8: Resize handle for resizable columns */}\r\n            {/* v0.17.56: Improved resize handle - wider for easier grabbing */}\r\n            {column.resizable && (\r\n              <div\r\n                className=\"absolute right-0 top-0 bottom-0 cursor-col-resize transition-colors group\"\r\n                style={{\r\n                  width: '12px',\r\n                  marginRight: '-6px',\r\n                  backgroundColor: resizingColumn === column.id ? `${theme.accent}30` : 'transparent',\r\n                  zIndex: 5,\r\n                }}\r\n                onMouseDown={(e) => {\r\n                  e.preventDefault();\r\n                  e.stopPropagation();\r\n                  setResizingColumn(column.id);\r\n                  setResizeStartX(e.clientX);\r\n                  setResizeStartWidth(column.width);\r\n                }}\r\n                title=\"Drag to resize column\"\r\n              >\r\n                {/* Visual indicator line — always slightly visible, brighter on hover */}\r\n                <div\r\n                  className=\"absolute top-0 bottom-0 transition-opacity\"\r\n                  style={{\r\n                    left: '5px',\r\n                    width: '2px',\r\n                    backgroundColor: theme.accent,\r\n                    borderRadius: '1px',\r\n                    opacity: resizingColumn === column.id ? 0.8 : undefined,\r\n                  }}\r\n                >\r\n                  <div className=\"absolute inset-0 opacity-20 group-hover:opacity-80 transition-opacity\" style={{ backgroundColor: theme.accent }} />\r\n                </div>\r\n              </div>\r\n            )}\r\n          </div>\r\n        );\r\n        })}\r\n        </div>\r\n\r\n        {/* v0.17.215: Action buttons with sticky positioning - always visible at right edge */}\r\n        <div\r\n          className=\"flex items-center gap-1 px-2\"\r\n          style={{\r\n            position: 'sticky',\r\n            right: 0,\r\n            height: '100%',\r\n            backgroundColor: theme.glassHeader || theme.bgSecondary,\r\n            zIndex: 5,\r\n          }}\r\n        >\r\n          <ColumnManager\r\n            columns={columns}\r\n            onToggleColumn={onToggleColumn}\r\n            theme={theme}\r\n          />\r\n          <button\r\n            onClick={() => setShowKeyboardHelp(!showKeyboardHelp)}\r\n            className=\"p-1.5 rounded hover:bg-opacity-10 transition-colors\"\r\n            style={{ color: theme.textTertiary }}\r\n            title=\"Keyboard shortcuts\"\r\n          >\r\n            <Keyboard className=\"w-4 h-4\" />\r\n          </button>\r\n\r\n          {/* Keyboard help tooltip */}\r\n          {showKeyboardHelp && (\r\n            <div\r\n              ref={keyboardHelpRef}\r\n              className=\"absolute top-full right-0 mt-2 p-4 rounded-lg shadow-2xl z-50 min-w-[400px]\"\r\n              style={{\r\n                backgroundColor: theme.bgPrimary,\r\n                border: `1px solid ${theme.border}`,\r\n                color: theme.textPrimary,\r\n              }}\r\n              onClick={(e) => e.stopPropagation()}\r\n            >\r\n              <div className=\"flex items-center justify-between mb-3 pb-2 border-b\" style={{ borderColor: theme.border }}>\r\n                <h3 className=\"font-semibold text-sm\" style={{ color: theme.textPrimary }}>Keyboard Shortcuts</h3>\r\n                <button onClick={() => setShowKeyboardHelp(false)} className=\"text-xs px-2 py-1 rounded hover:bg-opacity-10\" style={{ color: theme.textTertiary }}>Close</button>\r\n              </div>\r\n              <div className=\"space-y-3 text-xs\">\r\n                <div>\r\n                  <div className=\"font-semibold mb-1.5\" style={{ color: theme.textSecondary }}>Navigation</div>\r\n                  <div className=\"space-y-1\">\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Move focus up/down</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>↑ / ↓</kbd></div>\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Select range</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Shift + ↑ / ↓</kbd></div>\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Toggle selection</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Cmd/Ctrl + Click</kbd></div>\r\n                  </div>\r\n                </div>\r\n                <div>\r\n                  <div className=\"font-semibold mb-1.5\" style={{ color: theme.textSecondary }}>Hierarchy</div>\r\n                  <div className=\"space-y-1\">\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Indent task</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Tab</kbd></div>\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Outdent task</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Shift + Tab</kbd></div>\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Expand/Collapse</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>→ / ←</kbd></div>\r\n                  </div>\r\n                </div>\r\n                <div>\r\n                  <div className=\"font-semibold mb-1.5\" style={{ color: theme.textSecondary }}>Editing</div>\r\n                  <div className=\"space-y-1\">\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Create task below</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Enter</kbd></div>\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Create task above</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Shift + Enter</kbd></div>\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Open task modal</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Cmd/Ctrl + Enter</kbd></div>\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Rename task</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>F2</kbd></div>\r\n                  </div>\r\n                </div>\r\n                <div>\r\n                  <div className=\"font-semibold mb-1.5\" style={{ color: theme.textSecondary }}>Actions</div>\r\n                  <div className=\"space-y-1\">\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Move task up/down</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Alt + ↑ / ↓</kbd></div>\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Delete task</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Delete</kbd></div>\r\n                    <div className=\"flex justify-between\"><span style={{ color: theme.textTertiary }}>Duplicate task</span><kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Cmd/Ctrl + D</kbd></div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          )}\r\n        </div>\r\n      </div>\r\n\r\n      {/* Task Rows Container - v0.17.222: Now uses real scroll instead of CSS transform */}\r\n      {/* minHeight ensures scroll area matches Timeline for proper sync */}\r\n      <div className=\"gantt-taskgrid-content\" data-grid-body style={{ minHeight: contentHeight }}>\r\n      {flatTasks.map(({ task, level }, index) => {\r\n        const isSelected = isTaskSelected(task.id);\r\n        const inFillRange = isInFillRange(index);\r\n\r\n        // v0.17.146: Calculate drop indicator styles - ClickUp style with prominent line\r\n        const isDropTarget = dropTargetTaskId === task.id;\r\n        const showDropAbove = isDropTarget && dropPosition === 'above';\r\n        const showDropBelow = isDropTarget && dropPosition === 'below';\r\n        const showDropChild = isDropTarget && dropPosition === 'child';\r\n        const dropStyles: React.CSSProperties = {};\r\n        if (showDropChild) {\r\n          dropStyles.backgroundColor = `${theme.accent}15`;\r\n          dropStyles.boxShadow = `inset 0 0 0 2px ${theme.accent}`;\r\n        }\r\n\r\n        return (\r\n          <motion.div\r\n            key={task.id}\r\n            data-task-row={task.id}\r\n            className={`flex items-center cursor-pointer group ${draggedTaskId === task.id ? 'opacity-50' : ''}`}\r\n            style={{\r\n              position: 'relative', // v0.17.146: For drop indicator positioning\r\n              height: `${ROW_HEIGHT}px`,\r\n              borderLeft: isSelected ? `3px solid ${theme.accent}` : `3px solid transparent`,\r\n              backgroundColor: isSelected\r\n                ? theme.accentLight\r\n                : showDropChild\r\n                  ? `${theme.accent}15`\r\n                  : (index % 2 === 0 ? theme.bgPrimary : theme.bgGrid),\r\n              // v5.1.0: CPM opacity — non-critical tasks fade\r\n              opacity: showCriticalPath ? (task.isCriticalPath ? 1.0 : 0.4) : undefined,\r\n              transition: 'opacity 300ms ease',\r\n              ...dropStyles,\r\n            }}\r\n            onMouseEnter={() => setHoveredTaskId(task.id)}\r\n            onMouseLeave={() => setHoveredTaskId(null)}\r\n            onClick={(e) => {\r\n              const flatTasks = flattenTasksUtil(tasks);\r\n              const flatTaskIds = flatTasks.map(t => t.id);\r\n              const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\r\n              const ctrlOrCmd = isMac ? e.metaKey : e.ctrlKey;\r\n\r\n              // Handle multi-selection\r\n              handleSelectionClick(task.id, flatTaskIds, ctrlOrCmd, e.shiftKey);\r\n              /* Pulsar tambien mueve el resaltado, asi que tambien se avisa:\r\n                 quien siga la seleccion no debe tener que distinguir si vino\r\n                 del raton o del teclado. */\r\n              onTaskSelectionChange?.(task.id);\r\n\r\n              // v1.9.6: Ctrl/Shift+click = solo selección — NO disparar onTaskClick\r\n              // (el consumidor abre un drawer/modal ahí, lo que rompía la\r\n              // multi-selección abriendo el detalle de cada tarea clickeada).\r\n              if (!ctrlOrCmd && !e.shiftKey) {\r\n                onTaskClick?.(task);\r\n              }\r\n            }}\r\n            onDoubleClick={(e) => {\r\n              // v0.8.0: Double-click event\r\n              e.stopPropagation();\r\n              onTaskDblClick?.(task);\r\n            }}\r\n            onContextMenu={(e) => {\r\n              e.preventDefault();\r\n              setContextMenu({\r\n                isOpen: true,\r\n                x: e.clientX,\r\n                y: e.clientY,\r\n                type: 'task',\r\n                task,\r\n              });\r\n\r\n              // v0.8.0: Context menu event\r\n              onTaskContextMenu?.(task, e);\r\n            }}\r\n            whileHover={{\r\n              backgroundColor: isSelected ? theme.accentLight : theme.hoverBg,\r\n            }}\r\n          >\r\n            {/* v0.17.147: Drop indicator line ABOVE - clean horizontal line */}\r\n            {showDropAbove && (\r\n              <div\r\n                style={{\r\n                  position: 'absolute',\r\n                  top: 0,\r\n                  left: 0,\r\n                  right: 0,\r\n                  height: '2px',\r\n                  backgroundColor: theme.accent,\r\n                  zIndex: 10,\r\n                }}\r\n              />\r\n            )}\r\n\r\n            {/* v0.17.147: Drop indicator line BELOW - clean horizontal line */}\r\n            {showDropBelow && (\r\n              <div\r\n                style={{\r\n                  position: 'absolute',\r\n                  bottom: 0,\r\n                  left: 0,\r\n                  right: 0,\r\n                  height: '2px',\r\n                  backgroundColor: theme.accent,\r\n                  zIndex: 10,\r\n                }}\r\n              />\r\n            )}\r\n\r\n          {visibleColumns.map((column, colIndex) => {\r\n            const isLastColumn = colIndex === visibleColumns.length - 1;\r\n            const isNameColumn = column.id === 'name';\r\n\r\n            // Drag-fill is available on assignees + date cells for non-parent tasks.\r\n            const isParentRow = !!(task.subtasks && task.subtasks.length > 0);\r\n            const fillColumn = (column.id === 'assignees' || column.id === 'startDate' || column.id === 'endDate')\r\n              ? (column.id as 'assignees' | 'startDate' | 'endDate')\r\n              : null;\r\n            const canFill = !!fillColumn && !isParentRow;\r\n            const showFillHandle = canFill && hoveredTaskId === task.id && !fillDrag;\r\n            // Excel-style preview: highlight ONLY the cell of the column being\r\n            // filled (not the whole row), on the rows covered by the drag.\r\n            const cellInFill = inFillRange && !!fillDrag && fillDrag.column === column.id;\r\n\r\n            return (\r\n            <div\r\n              key={`${task.id}-${column.id}`}\r\n              className={`px-4 flex items-center ${\r\n                isNameColumn ? 'justify-start' : 'justify-center'\r\n              }`}\r\n              style={{\r\n                position: 'relative', // for the fill handle\r\n                // v0.17.129: All columns use fixed width for consistent resize behavior\r\n                width: `${column.width}px`,\r\n                minWidth: `${column.minWidth ?? (isNameColumn ? 200 : 60)}px`,\r\n                maxWidth: `${column.maxWidth ?? 2000}px`,\r\n                flexShrink: isNameColumn && visibleColumns.length === 1 ? 1 : 0,\r\n                flexGrow: isNameColumn && visibleColumns.length === 1 ? 1 : 0,\r\n                // v0.17.129: Consistent border handling - inline style like header\r\n                borderRight: !isLastColumn ? `1px solid ${hoveredTaskId === task.id ? theme.border : theme.borderLight}` : 'none',\r\n                height: '100%',\r\n                boxSizing: 'border-box',\r\n                overflow: 'visible',\r\n                // Drag-fill preview on the target column's cells only.\r\n                backgroundColor: cellInFill ? `${theme.accent}22` : undefined,\r\n                boxShadow: cellInFill ? `inset 0 0 0 1px ${theme.accent}66` : undefined,\r\n              }}\r\n            >\r\n              {renderCellContent(column, task, isNameColumn ? level : 0)}\r\n              {showFillHandle && fillColumn && (\r\n                <div\r\n                  title=\"Arrastrá hacia abajo para aplicar a varias tareas\"\r\n                  onMouseDown={(e) => handleFillDragStart(e, task.id, fillColumn, index)}\r\n                  style={{\r\n                    position: 'absolute',\r\n                    right: 2,\r\n                    bottom: 2,\r\n                    width: 8,\r\n                    height: 8,\r\n                    borderRadius: 2,\r\n                    background: theme.accent,\r\n                    border: `1px solid ${theme.bgPrimary}`,\r\n                    cursor: 'crosshair',\r\n                    zIndex: 5,\r\n                  }}\r\n                />\r\n              )}\r\n            </div>\r\n          );\r\n          })}\r\n          </motion.div>\r\n        );\r\n      })}\r\n      {/* 1.9.45 · «+ Add task» en línea, al final (ESPEC pestañas §4.10). */}\r\n      {addTaskRow && (\r\n        <button\r\n          type=\"button\"\r\n          data-anadir-tarea\r\n          onClick={addTaskRow.onClick}\r\n          className=\"w-full flex items-center gap-2 px-3 text-left text-[13px] transition-colors\"\r\n          style={{ height: `${ROW_HEIGHT}px`, color: theme.textTertiary, borderBottom: `1px solid ${theme.borderLight}` }}\r\n          onMouseEnter={(e) => { e.currentTarget.style.color = theme.textPrimary; }}\r\n          onMouseLeave={(e) => { e.currentTarget.style.color = theme.textTertiary; }}\r\n        >\r\n          <Plus className=\"w-3.5 h-3.5\" />\r\n          {addTaskRow.label}\r\n        </button>\r\n      )}\r\n      </div>\r\n\r\n      {/* Context Menu */}\r\n      <ContextMenu\r\n        isOpen={contextMenu.isOpen}\r\n        x={contextMenu.x}\r\n        y={contextMenu.y}\r\n        items={\r\n          contextMenu.type === 'header' && contextMenu.columnId\r\n            ? getHeaderContextMenuItems(contextMenu.columnId)\r\n            : contextMenu.type === 'task' && contextMenu.task\r\n            ? getTaskContextMenuItems(contextMenu.task)\r\n            : []\r\n        }\r\n        onClose={() => setContextMenu({ ...contextMenu, isOpen: false })}\r\n        theme={theme}\r\n      />\r\n\r\n      {/* v0.17.147: Ghost/Phantom drag preview - subtle horizontal line style */}\r\n      {isDraggingState && ghostPosition && draggedTaskId && typeof document !== 'undefined' && createPortal(\r\n        <div\r\n          style={{\r\n            position: 'fixed',\r\n            left: ghostPosition.x + 12,\r\n            top: ghostPosition.y - 10,\r\n            zIndex: 99999,\r\n            pointerEvents: 'none',\r\n          }}\r\n        >\r\n          {/* Subtle ghost - just text with slight background */}\r\n          {(() => {\r\n            const draggedTask = flatTasks.find(ft => ft.task.id === draggedTaskId)?.task;\r\n            return draggedTask ? (\r\n              <div\r\n                className=\"flex items-center gap-2 px-2 py-1 rounded\"\r\n                style={{\r\n                  backgroundColor: 'rgba(255, 255, 255, 0.08)',\r\n                  backdropFilter: 'blur(4px)',\r\n                }}\r\n              >\r\n                <span\r\n                  className=\"text-xs font-medium\"\r\n                  style={{\r\n                    color: theme.textSecondary,\r\n                    opacity: 0.9,\r\n                  }}\r\n                >\r\n                  {draggedTask.name}\r\n                </span>\r\n              </div>\r\n            ) : null;\r\n          })()}\r\n        </div>,\r\n        document.body\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\n * useDragState - Centralized drag state management\n * Manages all drag-related state in one place\n *\n * @version 0.8.1\n * @version 0.13.6 - Removed dragDaysDelta (direction-based colors removed)\n */\n\nimport { useState } from 'react';\n\nexport type DragMode = 'none' | 'move' | 'resize-start' | 'resize-end' | 'connect';\nexport type ActiveZone = 'move' | 'resize-start' | 'resize-end' | 'connect' | null;\n\nexport interface DragState {\n  // Drag mode\n  dragMode: DragMode;\n  setDragMode: (mode: DragMode) => void;\n\n  // Drag offset (distance from click to element origin)\n  dragOffset: number;\n  setDragOffset: (offset: number) => void;\n\n  // Ghost position (visual feedback during drag)\n  ghostX: number;\n  setGhostX: (x: number) => void;\n  ghostWidth: number;\n  setGhostWidth: (width: number) => void;\n\n  // Connection line\n  connectionLine: { x: number; y: number } | null;\n  setConnectionLine: (line: { x: number; y: number } | null) => void;\n\n  // Hovered task (for dependency creation)\n  hoveredTaskId: string | null;\n  setHoveredTaskId: (id: string | null) => void;\n\n  // Active zone (for visual feedback)\n  activeZone: ActiveZone;\n  setActiveZone: (zone: ActiveZone) => void;\n\n  // Split task specific state\n  draggedSegmentIndex: number | null;\n  setDraggedSegmentIndex: (index: number | null) => void;\n  draggedSegmentStartX: number;\n  setDraggedSegmentStartX: (x: number) => void;\n  segmentDragOffsetX: number;\n  setSegmentDragOffsetX: (offset: number) => void;\n\n  // Hover state\n  hoveredSegmentIndex: number | null;\n  setHoveredSegmentIndex: (index: number | null) => void;\n  isHovered: boolean;\n  setIsHovered: (hovered: boolean) => void;\n\n  // Computed state\n  isDragging: boolean;\n  isResizing: boolean;\n  isConnecting: boolean;\n\n  // Reset all drag state\n  resetDragState: (x: number, width: number) => void;\n}\n\nexport function useDragState(initialX: number, initialWidth: number): DragState {\n  const [dragMode, setDragMode] = useState<DragMode>('none');\n  const [dragOffset, setDragOffset] = useState(0);\n  const [ghostX, setGhostX] = useState(initialX);\n  const [ghostWidth, setGhostWidth] = useState(initialWidth);\n  const [connectionLine, setConnectionLine] = useState<{ x: number; y: number } | null>(null);\n  const [hoveredTaskId, setHoveredTaskId] = useState<string | null>(null);\n  const [activeZone, setActiveZone] = useState<ActiveZone>(null);\n\n  // Split task state\n  const [draggedSegmentIndex, setDraggedSegmentIndex] = useState<number | null>(null);\n  const [draggedSegmentStartX, setDraggedSegmentStartX] = useState(0);\n  const [segmentDragOffsetX, setSegmentDragOffsetX] = useState(0);\n  const [hoveredSegmentIndex, setHoveredSegmentIndex] = useState<number | null>(null);\n  const [isHovered, setIsHovered] = useState(false);\n\n  // Computed state\n  const isDragging = dragMode !== 'none';\n  const isResizing = dragMode === 'resize-start' || dragMode === 'resize-end';\n  const isConnecting = dragMode === 'connect';\n\n  // Reset all state to initial values\n  const resetDragState = (x: number, width: number) => {\n    setDragMode('none');\n    setConnectionLine(null);\n    setHoveredTaskId(null);\n    setGhostX(x);\n    setGhostWidth(width);\n    setSegmentDragOffsetX(0);\n    setDraggedSegmentIndex(null);\n    setDraggedSegmentStartX(0);\n  };\n\n  return {\n    dragMode,\n    setDragMode,\n    dragOffset,\n    setDragOffset,\n    ghostX,\n    setGhostX,\n    ghostWidth,\n    setGhostWidth,\n    connectionLine,\n    setConnectionLine,\n    hoveredTaskId,\n    setHoveredTaskId,\n    activeZone,\n    setActiveZone,\n    draggedSegmentIndex,\n    setDraggedSegmentIndex,\n    draggedSegmentStartX,\n    setDraggedSegmentStartX,\n    segmentDragOffsetX,\n    setSegmentDragOffsetX,\n    hoveredSegmentIndex,\n    setHoveredSegmentIndex,\n    isHovered,\n    setIsHovered,\n    isDragging,\n    isResizing,\n    isConnecting,\n    resetDragState,\n  };\n}\n","import { useRef, useCallback, useEffect, useState } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { Task, GanttTemplates } from './types';\r\nimport { TaskPosition } from './Timeline';\r\nimport { useDragState } from './hooks/useDragState';\r\n\r\n// v0.17.76: Tooltip data structure for external rendering\r\nexport interface TaskTooltipData {\r\n  task: Task;\r\n  x: number;\r\n  y: number;\r\n  width: number;\r\n  height: number;\r\n  showBelow: boolean;\r\n  /** Viewport mouse position — tooltip follows cursor for fluid UX */\r\n  mouseX: number;\r\n  mouseY: number;\r\n}\r\n\r\ninterface TaskBarProps {\r\n  task: Task;\r\n  x: number;\r\n  y: number;\r\n  width: number;\r\n  theme: any;\r\n  dayWidth: number;\r\n  startDate: Date;\r\n  templates: Required<GanttTemplates>; // v0.8.0\r\n  onClick?: (task: Task) => void;\r\n  onDoubleClick?: (task: Task) => void; // v0.8.0\r\n  onContextMenu?: (task: Task, event: React.MouseEvent) => void; // v0.8.0\r\n  onDateChange?: (task: Task, newStart: Date, newEnd: Date) => void;\r\n  onDependencyCreate?: (fromTask: Task, toTaskId: string) => void;\r\n  allTaskPositions?: TaskPosition[];\r\n  // v0.13.0: Callback for dependency cascade preview during drag\r\n  onDragMove?: (taskId: string, daysDelta: number, isDragging: boolean) => void;\r\n  // v0.17.76: Callback for tooltip hover state - enables rendering tooltips in a top layer\r\n  onHoverChange?: (tooltipData: TaskTooltipData | null) => void;\r\n  // v3.0.0: Show baseline ghost bar behind actual bar\r\n  showBaseline?: boolean;\r\n  showTaskBarLabels?: boolean;\r\n  showCriticalPath?: boolean;\r\n  // v4.1.0: When true, disable drag/resize/connect interactions (read-only bar)\r\n  readOnly?: boolean;\r\n  // v4.2.0: Drag the progress edge to change task.progress (0–100). Fires once\r\n  // on pointerup with the committed value. Rendered only for leaf tasks with\r\n  // valid dates when the consumer provides this handler and readOnly is false.\r\n  onProgressChange?: (task: Task, newProgress: number) => void;\r\n}\r\n\r\ntype DragMode = 'none' | 'move' | 'resize-start' | 'resize-end' | 'connect';\r\n\r\nexport function TaskBar({\r\n  task,\r\n  x,\r\n  y,\r\n  width,\r\n  theme,\r\n  dayWidth,\r\n  startDate,\r\n  templates,\r\n  onClick,\r\n  onDoubleClick, // v0.8.0\r\n  onContextMenu, // v0.8.0\r\n  onDateChange,\r\n  onDependencyCreate,\r\n  allTaskPositions = [],\r\n  onDragMove, // v0.13.0\r\n  onHoverChange, // v0.17.76\r\n  showBaseline, // v3.0.0\r\n  showTaskBarLabels = true,\r\n  showCriticalPath = true,\r\n  readOnly = false,\r\n  onProgressChange,\r\n}: TaskBarProps) {\r\n  // v0.8.1: Centralized drag state management for better modularity\r\n  const dragState = useDragState(x, width);\r\n  const svgRef = useRef<SVGGElement>(null);\r\n\r\n  // v2.3.0: Track real mouse movement to distinguish click vs drag\r\n  const hasDraggedRef = useRef(false);\r\n\r\n  // v0.17.379: Auto-scroll when dragging near edges\r\n  const autoScrollIntervalRef = useRef<number | null>(null);\r\n  const lastMouseEventRef = useRef<MouseEvent | null>(null);\r\n\r\n  // Destructure for easier access (keeps existing code readable)\r\n  const {\r\n    dragMode, setDragMode,\r\n    dragOffset, setDragOffset,\r\n    ghostX, setGhostX,\r\n    ghostWidth, setGhostWidth,\r\n    connectionLine, setConnectionLine,\r\n    hoveredTaskId, setHoveredTaskId,\r\n    activeZone, setActiveZone,\r\n    draggedSegmentIndex, setDraggedSegmentIndex,\r\n    draggedSegmentStartX, setDraggedSegmentStartX,\r\n    segmentDragOffsetX, setSegmentDragOffsetX,\r\n    hoveredSegmentIndex, setHoveredSegmentIndex,\r\n    isHovered, setIsHovered,\r\n    isDragging, isResizing, isConnecting,\r\n    resetDragState\r\n  } = dragState;\r\n\r\n  const height = 18; // v1.4.29: Slimmer elegant bars (was 24)\r\n  // Chronos V2: Angular bars (4px) vs rounded (8px)\r\n  const isChronos = !!theme.executionBarBg;\r\n  const isDark = theme.textPrimary === '#FFFFFF' || theme.bgPrimary === '#050505';\r\n  const borderRadius = isChronos ? 3 : 6;\r\n  // Chronos: Any task with children is a \"summary\" bar (thin line, no label)\r\n  const isSummaryTask = task.subtasks && task.subtasks.length > 0;\r\n\r\n  // v4.2.0: Progress drag state — tracks live % during pointer drag.\r\n  // `dragProgress` is null when not dragging; otherwise holds the current\r\n  // live-clamped percentage. On pointerup we commit via onProgressChange\r\n  // and reset to null so the row re-renders from props.\r\n  const progressDragRef = useRef<{ barRect: DOMRect | null; initialPct: number } | null>(null);\r\n  const [dragProgress, setDragProgress] = (() => {\r\n    // Use refs to avoid re-rendering the whole TaskBar on every pointermove —\r\n    // we only want to refresh the handle + fill. React state is good enough\r\n    // because TaskBar is already per-row; re-renders are cheap.\r\n    const ref = useRef<number | null>(null);\r\n    const [, force] = useState(0);\r\n    return [\r\n      ref.current,\r\n      (v: number | null) => { ref.current = v; force(n => n + 1); },\r\n    ] as const;\r\n  })();\r\n  const canDragProgress = !!onProgressChange\r\n    && !readOnly\r\n    && !isSummaryTask\r\n    && !task.segments\r\n    && !!task.startDate\r\n    && !!task.endDate;\r\n\r\n  // Detect task states for neutral theme visualization\r\n  // Compare date-only: task is overdue only AFTER endDate day has fully passed (midnight)\r\n  const isOverdue = task.endDate && (() => {\r\n    const today = new Date();\r\n    today.setHours(0, 0, 0, 0);\r\n    const end = new Date(task.endDate!);\r\n    end.setHours(0, 0, 0, 0);\r\n    return end < today;\r\n  })() && task.progress < 100;\r\n  const isAtRisk = showCriticalPath && task.isCriticalPath;  // Critical path tasks are \"at risk\"\r\n  const isNeutralTheme = theme.name === 'neutral' || theme.today === '#1C1917';  // Detect neutral theme\r\n  // v0.17.41: Detect completed tasks for strikethrough styling\r\n  const isCompleted = task.status === 'completed' || task.progress === 100;\r\n\r\n  // v0.17.38: Priority-based colors - aligned with PrioritySelector component\r\n  // Supports both lowercase (from DB) and uppercase (from component) priority values\r\n  const PRIORITY_COLORS: Record<string, string> = {\r\n    low: '#10B981',      // Emerald-500 (Chronos status green)\r\n    LOW: '#10B981',\r\n    medium: '#F59E0B',   // Amber-500\r\n    MEDIUM: '#F59E0B',\r\n    high: '#F97316',     // Orange-500\r\n    HIGH: '#F97316',\r\n    urgent: '#EF4444',   // Red-500 (matches Chronos criticalPath)\r\n    URGENT: '#EF4444',\r\n  };\r\n\r\n  // Get task color: priority color > custom color > theme default\r\n  const getTaskColor = () => {\r\n    if ((showCriticalPath && task.isCriticalPath) || isOverdue) return '#EF4444'; // Critical/overdue = Chronos red-500\r\n    if (task.color) return task.color; // Custom color takes precedence\r\n    if (task.priority && PRIORITY_COLORS[task.priority]) return PRIORITY_COLORS[task.priority];\r\n    return theme.taskBarPrimary; // Fallback to theme\r\n  };\r\n\r\n  const taskColor = getTaskColor();\r\n\r\n  // v4.1.0: Cursor for read-only bars\r\n  const barCursor = readOnly ? 'default' : (isDragging ? (isConnecting ? 'crosshair' : isResizing ? 'ew-resize' : 'grabbing') : 'grab');\r\n  const resizeCursor = readOnly ? 'default' : 'ew-resize';\r\n\r\n  // Dynamic resize zones based on bar width for better UX\r\n  const getResizeZone = (barWidth: number): number => {\r\n    if (barWidth >= 80) return 20;      // Large bars: 20px zones\r\n    if (barWidth >= 60) return 15;      // Medium bars: 15px zones\r\n    if (barWidth >= 50) return 12;      // Small bars: 12px zones\r\n    return 10;                          // Very small bars: 10px zones\r\n  };\r\n\r\n  const RESIZE_ZONE = getResizeZone(width);\r\n  const isSmallBar = width < 50;          // Flag for special handling\r\n  const isVerySmallBar = width < 40;      // Flag for ultra-small bars (simplified UX)\r\n\r\n  // v0.17.76: Notify parent of hover state changes for top-layer tooltip rendering\r\n  // This ensures tooltips always appear above all task bars (SVG z-order fix)\r\n  useEffect(() => {\r\n    if (onHoverChange && (!isHovered || isDragging || task.segments)) {\r\n      onHoverChange(null);\r\n    }\r\n  }, [isHovered, isDragging, task.segments, onHoverChange]);\r\n\r\n  // Format date for tooltip\r\n  const formatDate = (date: Date) => {\r\n    return date.toLocaleDateString('en-US', {\r\n      month: 'short',\r\n      day: 'numeric',\r\n      year: 'numeric',\r\n    });\r\n  };\r\n\r\n  // Calculate duration\r\n  const getDuration = () => {\r\n    const days = Math.ceil((task.endDate!.getTime() - task.startDate!.getTime()) / (1000 * 60 * 60 * 24));\r\n    return `${days} day${days !== 1 ? 's' : ''}`;\r\n  };\r\n\r\n  // Snap position to nearest day\r\n  const snapToDay = (pixelX: number): number => {\r\n    const dayOffset = Math.round(pixelX / dayWidth) * dayWidth;\r\n    return dayOffset;\r\n  };\r\n\r\n  // Convert pixel position to date\r\n  const pixelToDate = (pixelX: number): Date => {\r\n    const days = Math.round(pixelX / dayWidth);\r\n    const newDate = new Date(startDate);\r\n    newDate.setDate(newDate.getDate() + days);\r\n    return newDate;\r\n  };\r\n\r\n  // Check if point is inside a task's bounding box\r\n  const findTaskAtPoint = (pointX: number, pointY: number): string | null => {\r\n    for (const taskPos of allTaskPositions) {\r\n      // Skip current task\r\n      if (taskPos.id === task.id) continue;\r\n\r\n      // Check if point is within task bounds (with some padding for easier targeting)\r\n      const padding = 5;\r\n      if (\r\n        pointX >= taskPos.x - padding &&\r\n        pointX <= taskPos.x + taskPos.width + padding &&\r\n        pointY >= taskPos.y - padding &&\r\n        pointY <= taskPos.y + taskPos.height + padding\r\n      ) {\r\n        return taskPos.id;\r\n      }\r\n    }\r\n    return null;\r\n  };\r\n\r\n  // TODO: Implement dynamic cursor styling based on mouse position\r\n  // Determine cursor based on position\r\n  // const getCursorStyle = (mouseX: number): string => {\r\n  //   if (dragMode !== 'none') {\r\n  //     if (dragMode === 'connect') return 'crosshair';\r\n  //     if (dragMode === 'resize-start' || dragMode === 'resize-end') return 'ew-resize';\r\n  //     if (dragMode === 'move') return 'grabbing';\r\n  //   }\r\n  //   const relativeX = mouseX - x;\r\n  //   // Resize zones at edges\r\n  //   if (relativeX <= RESIZE_ZONE) return 'ew-resize';\r\n  //   if (relativeX >= width - RESIZE_ZONE) return 'ew-resize';\r\n  //   // Move zone in the middle\r\n  //   return 'grab';\r\n  // };\r\n\r\n  // Handle mouse down for dragging\r\n  // v0.8.1: Added segmentX parameter for split tasks - allows segments to calculate their own offset\r\n  // v4.1.0: Block all drag interactions when readOnly\r\n  const handleMouseDown = useCallback((e: React.MouseEvent, mode?: DragMode, segmentX?: number) => {\r\n    if (readOnly) return; // v4.1.0: No drag/resize/connect for read-only bars\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n\r\n    const svgElement = svgRef.current?.ownerSVGElement;\r\n    if (!svgElement) return;\r\n\r\n    const point = svgElement.createSVGPoint();\r\n    point.x = e.clientX;\r\n    point.y = e.clientY;\r\n    const svgPoint = point.matrixTransform(svgElement.getScreenCTM()?.inverse());\r\n\r\n    // v0.8.1: Use segment position if provided (for split tasks), otherwise use global x\r\n    const effectiveX = segmentX !== undefined ? segmentX : x;\r\n\r\n    // Determine mode based on click position if not specified\r\n    let actualMode = mode;\r\n    if (!actualMode) {\r\n      const relativeX = svgPoint.x - effectiveX;\r\n\r\n      // Keyboard modifiers for forced modes\r\n      if (e.shiftKey) {\r\n        // SHIFT: Connection mode\r\n        actualMode = 'connect';\r\n        setConnectionLine({ x: x + width, y: y + height / 2 });\r\n      } else if (e.ctrlKey || e.metaKey) {\r\n        // CTRL/CMD: Force MOVE (useful for small bars)\r\n        actualMode = 'move';\r\n      } else if (e.altKey) {\r\n        // ALT: Force RESIZE based on which half of bar is clicked\r\n        actualMode = relativeX < width / 2 ? 'resize-start' : 'resize-end';\r\n      }\r\n      // Auto-detection based on position (adaptive based on bar size)\r\n      else if (isVerySmallBar) {\r\n        // Very small bars (<40px): Simple split - left half = move, right half = resize\r\n        if (relativeX < width / 2) {\r\n          actualMode = 'move';\r\n        } else {\r\n          actualMode = 'resize-end';  // Always resize from end for consistency\r\n        }\r\n      } else if (isSmallBar) {\r\n        // Small bars (40-50px): Only resize if clicking very close to edges\r\n        if (relativeX <= RESIZE_ZONE / 2) {\r\n          actualMode = 'resize-start';\r\n        } else if (relativeX >= width - RESIZE_ZONE / 2) {\r\n          actualMode = 'resize-end';\r\n        } else {\r\n          actualMode = 'move';  // Default to move for small bars\r\n        }\r\n      } else {\r\n        // Normal bars: Standard zone detection\r\n        if (relativeX <= RESIZE_ZONE) {\r\n          actualMode = 'resize-start';\r\n        } else if (relativeX >= width - RESIZE_ZONE) {\r\n          actualMode = 'resize-end';\r\n        } else {\r\n          actualMode = 'move';\r\n        }\r\n      }\r\n    }\r\n\r\n    hasDraggedRef.current = false; // v2.3.0: Reset on new interaction\r\n    setDragMode(actualMode);\r\n    setIsHovered(false); // Hide all tooltips when dragging starts\r\n    setActiveZone(null); // Clear active zone\r\n\r\n    if (actualMode === 'move') {\r\n      // v0.8.1: Use effectiveX (segment position for split tasks, global x otherwise)\r\n      setDragOffset(svgPoint.x - effectiveX);\r\n    } else if (actualMode === 'connect') {\r\n      setConnectionLine({ x: x + width, y: y + height / 2 });\r\n    } else {\r\n      setDragOffset(0);\r\n    }\r\n\r\n    setGhostX(effectiveX);\r\n    setGhostWidth(width);\r\n  }, [x, width, y, height, readOnly]);\r\n\r\n  // v0.17.379: Auto-scroll function when dragging near edges\r\n  const performAutoScroll = useCallback((e: MouseEvent) => {\r\n    const svgElement = svgRef.current?.ownerSVGElement;\r\n    if (!svgElement) return;\r\n\r\n    // Find the timeline scroll container\r\n    const timelineScroll = svgElement.closest('.gantt-timeline-scroll') as HTMLElement;\r\n    if (!timelineScroll) return;\r\n\r\n    const rect = timelineScroll.getBoundingClientRect();\r\n    const edgeThreshold = 60; // Distance from edge to start scrolling\r\n    const scrollSpeed = 15; // Pixels per frame\r\n\r\n    let scrollDelta = 0;\r\n\r\n    // Check if near left edge\r\n    if (e.clientX < rect.left + edgeThreshold) {\r\n      const distance = rect.left + edgeThreshold - e.clientX;\r\n      scrollDelta = -Math.min(scrollSpeed, distance / 2);\r\n    }\r\n    // Check if near right edge\r\n    else if (e.clientX > rect.right - edgeThreshold) {\r\n      const distance = e.clientX - (rect.right - edgeThreshold);\r\n      scrollDelta = Math.min(scrollSpeed, distance / 2);\r\n    }\r\n\r\n    if (scrollDelta !== 0) {\r\n      timelineScroll.scrollLeft += scrollDelta;\r\n    }\r\n\r\n    return scrollDelta !== 0;\r\n  }, []);\r\n\r\n  // Handle mouse move for dragging\r\n  const handleMouseMove = useCallback((e: MouseEvent) => {\r\n    if (dragMode === 'none') return;\r\n\r\n    // v2.3.0: Mark that real movement occurred (distinguishes click from drag)\r\n    hasDraggedRef.current = true;\r\n\r\n    // v0.17.379: Store last mouse event for auto-scroll interval\r\n    lastMouseEventRef.current = e;\r\n\r\n    const svgElement = svgRef.current?.ownerSVGElement;\r\n    if (!svgElement) return;\r\n\r\n    // v0.17.379: Perform auto-scroll when near edges\r\n    if (dragMode === 'move' || dragMode === 'resize-start' || dragMode === 'resize-end') {\r\n      const needsScroll = performAutoScroll(e);\r\n\r\n      // Start auto-scroll interval if near edge and not already scrolling\r\n      if (needsScroll && !autoScrollIntervalRef.current) {\r\n        autoScrollIntervalRef.current = window.setInterval(() => {\r\n          if (lastMouseEventRef.current) {\r\n            performAutoScroll(lastMouseEventRef.current);\r\n            // Re-trigger mouse move to update ghost position after scroll\r\n            handleMouseMove(lastMouseEventRef.current);\r\n          }\r\n        }, 16); // ~60fps\r\n      } else if (!needsScroll && autoScrollIntervalRef.current) {\r\n        // Stop auto-scroll when not near edge\r\n        window.clearInterval(autoScrollIntervalRef.current);\r\n        autoScrollIntervalRef.current = null;\r\n      }\r\n    }\r\n\r\n    const point = svgElement.createSVGPoint();\r\n    point.x = e.clientX;\r\n    point.y = e.clientY;\r\n    const svgPoint = point.matrixTransform(svgElement.getScreenCTM()?.inverse());\r\n\r\n    if (dragMode === 'connect') {\r\n      // Update connection line end point\r\n      setConnectionLine({ x: svgPoint.x, y: svgPoint.y });\r\n\r\n      // Check if hovering over another task\r\n      const targetTaskId = findTaskAtPoint(svgPoint.x, svgPoint.y);\r\n      setHoveredTaskId(targetTaskId);\r\n    } else if (dragMode === 'move') {\r\n      // Move entire bar (or all segments if split task)\r\n      const rawNewX = svgPoint.x - dragOffset;\r\n      const snappedX = snapToDay(rawNewX);\r\n      setGhostX(snappedX);\r\n      setGhostWidth(width);\r\n\r\n      // v0.13.0: Calculate days delta and notify for cascade preview\r\n      const daysDelta = Math.round((snappedX - x) / dayWidth);\r\n      onDragMove?.(task.id, daysDelta, true);\r\n\r\n      // v0.8.1: For split tasks, calculate offset relative to the DRAGGED SEGMENT position\r\n      if (task.segments && task.segments.length > 0 && draggedSegmentIndex !== null) {\r\n        const segmentOffset = snappedX - draggedSegmentStartX; // Use saved segment position\r\n        setSegmentDragOffsetX(segmentOffset);\r\n      }\r\n    } else if (dragMode === 'resize-start') {\r\n      // Resize from start\r\n      const rawNewStart = svgPoint.x;\r\n      const snappedStart = snapToDay(rawNewStart);\r\n      const newWidth = (x + width) - snappedStart;\r\n\r\n      // Prevent negative or too small width (minimum 1 day)\r\n      if (newWidth >= dayWidth) {\r\n        setGhostX(snappedStart);\r\n        setGhostWidth(newWidth);\r\n      }\r\n    } else if (dragMode === 'resize-end') {\r\n      // Resize from end\r\n      const rawNewEnd = svgPoint.x;\r\n      const snappedEnd = snapToDay(rawNewEnd);\r\n      const newWidth = snappedEnd - x;\r\n\r\n      // Prevent negative or too small width (minimum 1 day)\r\n      if (newWidth >= dayWidth) {\r\n        setGhostWidth(newWidth);\r\n      }\r\n    }\r\n  }, [dragMode, x, width, dayWidth, dragOffset, task, snapToDay, draggedSegmentIndex, draggedSegmentStartX, findTaskAtPoint, setHoveredTaskId, setConnectionLine, setGhostX, setGhostWidth, setSegmentDragOffsetX, onDragMove, performAutoScroll]);\r\n\r\n  // Handle mouse up to finish dragging\r\n  const handleMouseUp = useCallback(() => {\r\n    // v0.17.379: Clear auto-scroll interval\r\n    if (autoScrollIntervalRef.current) {\r\n      window.clearInterval(autoScrollIntervalRef.current);\r\n      autoScrollIntervalRef.current = null;\r\n    }\r\n    lastMouseEventRef.current = null;\r\n\r\n    if (dragMode === 'none') return;\r\n\r\n    if (dragMode === 'connect') {\r\n      // Create dependency if hovering over a valid task\r\n      if (hoveredTaskId && onDependencyCreate) {\r\n        onDependencyCreate(task, hoveredTaskId);\r\n      }\r\n      setConnectionLine(null);\r\n      setHoveredTaskId(null);\r\n    } else {\r\n      const taskDuration = task.endDate!.getTime() - task.startDate!.getTime();\r\n      let newStartDate: Date;\r\n      let newEndDate: Date;\r\n      let isValid = true;\r\n\r\n      if (dragMode === 'move') {\r\n        // Calculate new dates maintaining duration\r\n        newStartDate = pixelToDate(ghostX);\r\n        newEndDate = new Date(newStartDate.getTime() + taskDuration);\r\n\r\n        // v0.8.1: Bryntum-style - Update ONLY the dragged segment (independent movement)\r\n        if (task.segments && task.segments.length > 0 && draggedSegmentIndex !== null) {\r\n          const dayOffset = Math.round(segmentDragOffsetX / dayWidth);\r\n          const updatedSegments = task.segments.map((seg, idx) => {\r\n            // Only update the segment that was dragged\r\n            if (idx === draggedSegmentIndex) {\r\n              const newSegStart = new Date(seg.startDate);\r\n              const newSegEnd = new Date(seg.endDate);\r\n              newSegStart.setDate(newSegStart.getDate() + dayOffset);\r\n              newSegEnd.setDate(newSegEnd.getDate() + dayOffset);\r\n              return { startDate: newSegStart, endDate: newSegEnd };\r\n            }\r\n            // Keep other segments unchanged\r\n            return seg;\r\n          });\r\n\r\n          // Calculate new overall task dates (from all segments)\r\n          const allDates = updatedSegments.flatMap(s => [s.startDate, s.endDate]);\r\n          const newTaskStart = new Date(Math.min(...allDates.map(d => d.getTime())));\r\n          const newTaskEnd = new Date(Math.max(...allDates.map(d => d.getTime())));\r\n\r\n          // Update task with new segments\r\n          onDateChange?.({ ...task, segments: updatedSegments }, newTaskStart, newTaskEnd);\r\n          // v0.8.1: Use centralized reset function from useDragState hook\r\n          resetDragState(x, width);\r\n          return; // Exit early since we handled the update\r\n        }\r\n      } else if (dragMode === 'resize-start') {\r\n        // Change start date, keep end date\r\n        newStartDate = pixelToDate(ghostX);\r\n        newEndDate = task.endDate!;\r\n\r\n        // Validate: start date must be before or equal to end date (allow same-day tasks)\r\n        if (newStartDate > newEndDate) {\r\n          console.warn('Invalid date range: start date must be before or equal to end date');\r\n          isValid = false;\r\n        }\r\n      } else if (dragMode === 'resize-end') {\r\n        // Change end date, keep start date\r\n        // Subtract 1 day because visual width includes +1 for inclusive end-date rendering\r\n        newStartDate = task.startDate!;\r\n        newEndDate = pixelToDate(ghostX + ghostWidth);\r\n        newEndDate.setDate(newEndDate.getDate() - 1);\r\n\r\n        // Validate: end date must be after or equal to start date (allow same-day tasks)\r\n        if (newEndDate < newStartDate) {\r\n          console.warn('Invalid date range: end date must be after or equal to start date');\r\n          isValid = false;\r\n        }\r\n      } else {\r\n        // Shouldn't reach here, but handle gracefully\r\n        isValid = false;\r\n      }\r\n\r\n      // Only update if valid\r\n      if (isValid && newStartDate! && newEndDate!) {\r\n        // v0.17.184: Allow same-day tasks (duration = 0), only reject negative durations\r\n        if (newEndDate.getTime() < newStartDate.getTime()) {\r\n          console.warn('Invalid date range: end date cannot be before start date');\r\n          // Reset to original dates by not calling onDateChange\r\n        } else {\r\n          onDateChange?.(task, newStartDate, newEndDate);\r\n        }\r\n      }\r\n    }\r\n\r\n    // v0.13.0: Notify drag ended to clear cascade previews\r\n    onDragMove?.(task.id, 0, false);\r\n\r\n    // v0.8.1: Use centralized reset function from useDragState hook\r\n    resetDragState(x, width);\r\n  }, [dragMode, ghostX, ghostWidth, task, onDateChange, hoveredTaskId, onDependencyCreate, x, width, dayWidth, pixelToDate, segmentDragOffsetX, draggedSegmentIndex, resetDragState, onDragMove]);\r\n\r\n  // Setup global mouse listeners for smooth dragging\r\n  useEffect(() => {\r\n    if (dragMode === 'none') return;\r\n\r\n    const handleGlobalMouseMove = (e: MouseEvent) => {\r\n      handleMouseMove(e);\r\n    };\r\n\r\n    const handleGlobalMouseUp = () => {\r\n      handleMouseUp();\r\n    };\r\n\r\n    window.addEventListener('mousemove', handleGlobalMouseMove);\r\n    window.addEventListener('mouseup', handleGlobalMouseUp);\r\n\r\n    return () => {\r\n      window.removeEventListener('mousemove', handleGlobalMouseMove);\r\n      window.removeEventListener('mouseup', handleGlobalMouseUp);\r\n      // v0.17.379: Clean up auto-scroll interval on unmount\r\n      if (autoScrollIntervalRef.current) {\r\n        window.clearInterval(autoScrollIntervalRef.current);\r\n        autoScrollIntervalRef.current = null;\r\n      }\r\n    };\r\n  }, [dragMode, handleMouseMove, handleMouseUp]);\r\n\r\n  // v0.8.1: isDragging, isResizing, isConnecting now provided by useDragState hook\r\n  const displayX = isDragging && !isConnecting ? ghostX : x;\r\n  const displayWidth = isDragging && !isConnecting ? ghostWidth : width;\r\n\r\n  // v0.8.0: Generate custom class using templates\r\n  // v0.17.30: Removed tooltipText - native SVG <title> replaced by custom tooltip\r\n  const customClass = templates.taskClass(task);\r\n\r\n  // v0.17.334: Definitive solution - proper hover zone with visible fill for bounding box\r\n  // Key insight: transparent fill doesn't contribute to SVG group bounding box\r\n  // Using near-invisible fill (opacity 0.001) ensures the rect is part of the hover area\r\n\r\n  // v0.17.371: Extended hover area to include Link button position\r\n  // Link button is at x + width + 10 with radius 10, so we need to extend hover area\r\n  const linkButtonExtension = 24; // Extra width to include Link button area\r\n\r\n  // v5.1.0: CPM opacity — non-critical tasks fade when showCriticalPath is on\r\n  const cpmOpacity = showCriticalPath ? (task.isCriticalPath ? 1.0 : 0.25) : 1.0;\r\n\r\n  // v4.2.0: Pointer handlers for dragging the progress edge. We clamp the\r\n  // result to [0, 100], round to nearest integer, and only commit on pointerup.\r\n  // Shift held during drag soft-snaps to 0/25/50/75/100 for convenience.\r\n  const handleProgressPointerDown = useCallback((e: React.PointerEvent<SVGElement>) => {\r\n    if (!canDragProgress) return;\r\n    e.stopPropagation();\r\n    e.preventDefault();\r\n    // Cache the bar rect so subsequent moves can compute % without extra lookups\r\n    const barEl = svgRef.current?.querySelector<SVGRectElement>('rect[data-bar-background=\"true\"]');\r\n    const rect = barEl?.getBoundingClientRect() ?? null;\r\n    progressDragRef.current = { barRect: rect, initialPct: task.progress || 0 };\r\n    (e.currentTarget as Element).setPointerCapture(e.pointerId);\r\n    setDragProgress(task.progress || 0);\r\n  }, [canDragProgress, task.progress, setDragProgress]);\r\n\r\n  const handleProgressPointerMove = useCallback((e: React.PointerEvent<SVGElement>) => {\r\n    const ctx = progressDragRef.current;\r\n    if (!ctx) return;\r\n    // Refresh the rect on every move so horizontal scroll in the timeline\r\n    // doesn't throw off the math when the user drags long distances.\r\n    const barEl = svgRef.current?.querySelector<SVGRectElement>('rect[data-bar-background=\"true\"]');\r\n    const rect = barEl?.getBoundingClientRect() ?? ctx.barRect;\r\n    if (!rect || rect.width <= 0) return;\r\n    const ratio = (e.clientX - rect.left) / rect.width;\r\n    let pct = Math.round(Math.max(0, Math.min(1, ratio)) * 100);\r\n    if (e.shiftKey) {\r\n      // Soft snap to quarters when Shift is held\r\n      pct = Math.round(pct / 25) * 25;\r\n    }\r\n    setDragProgress(pct);\r\n  }, [setDragProgress]);\r\n\r\n  const handleProgressPointerUp = useCallback((e: React.PointerEvent<SVGElement>) => {\r\n    const ctx = progressDragRef.current;\r\n    if (!ctx) return;\r\n    // Prevent the pointerup from bubbling into the bar's click/dblclick path,\r\n    // which would open the task drawer right after a progress drag.\r\n    e.stopPropagation();\r\n    e.preventDefault();\r\n    try { (e.currentTarget as Element).releasePointerCapture(e.pointerId); } catch { /* ignore */ }\r\n    const finalPct = dragProgress;\r\n    progressDragRef.current = null;\r\n    setDragProgress(null);\r\n    if (finalPct != null && finalPct !== ctx.initialPct && onProgressChange) {\r\n      onProgressChange(task, finalPct);\r\n    }\r\n  }, [dragProgress, onProgressChange, task, setDragProgress]);\r\n\r\n  // v4.2.0: Swallow click and dblclick on the handle so they don't reach the\r\n  // bar group (which opens the drawer). Works together with pointerdown/up\r\n  // stopPropagation — covers the synthetic click fired after pointerup.\r\n  const handleProgressClickSwallow = useCallback((e: React.SyntheticEvent) => {\r\n    e.stopPropagation();\r\n    e.preventDefault();\r\n  }, []);\r\n\r\n  // Live progress for rendering: prefer the drag value so the fill + handle\r\n  // follow the pointer smoothly. Falls back to the persisted value.\r\n  const liveProgress = dragProgress != null ? dragProgress : (task.progress || 0);\r\n\r\n  return (\r\n    <g\r\n      ref={svgRef}\r\n      data-task-bar=\"true\"\r\n      /* 1.9.36 · estado y tipo por barra, para que la app pinte con CSS sin tocar task.color. */\r\n      data-estado={isCompleted ? 'completed' : isOverdue ? 'overdue' : 'planned'}\r\n      data-resumen={isSummaryTask ? 'true' : undefined}\r\n      style={{ opacity: cpmOpacity, transition: 'opacity 300ms ease' }}\r\n      onClick={() => {\r\n        // v2.3.0: Only fire click if no real drag movement occurred\r\n        if (!isDragging && !hasDraggedRef.current) {\r\n          onClick?.(task);\r\n        }\r\n        // Reset after click event is processed\r\n        hasDraggedRef.current = false;\r\n      }}\r\n      onDoubleClick={(e) => {\r\n        if (!isDragging && !hasDraggedRef.current) {\r\n          e.stopPropagation();\r\n          onDoubleClick?.(task);\r\n        }\r\n      }}\r\n      onContextMenu={(e) => {\r\n        e.preventDefault();\r\n        onContextMenu?.(task, e as any);\r\n      }}\r\n      onMouseEnter={() => !isDragging && setIsHovered(true)}\r\n      onMouseMove={(e) => {\r\n        if (onHoverChange && isHovered && !isDragging && !task.segments) {\r\n          onHoverChange({\r\n            task,\r\n            x,\r\n            y,\r\n            width,\r\n            height,\r\n            showBelow: false,\r\n            mouseX: e.clientX,\r\n            mouseY: e.clientY,\r\n          });\r\n        }\r\n      }}\r\n      onMouseLeave={() => {\r\n        if (!isDragging) {\r\n          setIsHovered(false);\r\n          setActiveZone(null);\r\n        }\r\n      }}\r\n    >\r\n      {/* v0.17.367: Extended hover detection area - includes Link button position */}\r\n      {/* This invisible rect ensures hover state is maintained while cursor moves to Link button */}\r\n      <rect\r\n        x={x}\r\n        y={y}\r\n        width={width + linkButtonExtension}\r\n        height={height}\r\n        fill=\"transparent\"\r\n        style={{ pointerEvents: 'all' }}\r\n      />\r\n      {/* v0.17.30: Removed native SVG <title> tooltip - using custom tooltip instead (lines ~1025-1162) */}\r\n      {/* Zone Indicators with hover feedback - v0.8.1: Disabled for split tasks (segments are independent) */}\r\n      {isHovered && !isDragging && !isSmallBar && !task.segments && (\r\n        <>\r\n          {/* Left resize zone with subtle highlight on hover */}\r\n          <rect\r\n            x={x}\r\n            y={y}\r\n            width={RESIZE_ZONE}\r\n            height={height}\r\n            fill={activeZone === 'resize-start' ? theme.accent : 'transparent'}\r\n            opacity={activeZone === 'resize-start' ? 0.15 : 0}\r\n            style={{ cursor: resizeCursor, pointerEvents: 'all' }}\r\n            onMouseEnter={() => setActiveZone('resize-start')}\r\n            onMouseDown={(e) => handleMouseDown(e as any, 'resize-start')}\r\n          />\r\n          {/* Center move zone */}\r\n          <rect\r\n            x={x + RESIZE_ZONE}\r\n            y={y}\r\n            width={width - RESIZE_ZONE * 2}\r\n            height={height}\r\n            fill={activeZone === 'move' ? theme.accent : 'transparent'}\r\n            opacity={activeZone === 'move' ? 0.1 : 0}\r\n            style={{ cursor: readOnly ? 'default' : 'grab', pointerEvents: 'all' }}\r\n            onMouseEnter={() => setActiveZone('move')}\r\n            onMouseDown={(e) => handleMouseDown(e as any, 'move')}\r\n          />\r\n          {/* Right resize zone with subtle highlight on hover */}\r\n          <rect\r\n            x={x + width - RESIZE_ZONE}\r\n            y={y}\r\n            width={RESIZE_ZONE}\r\n            height={height}\r\n            fill={activeZone === 'resize-end' ? theme.accent : 'transparent'}\r\n            opacity={activeZone === 'resize-end' ? 0.15 : 0}\r\n            style={{ cursor: resizeCursor, pointerEvents: 'all' }}\r\n            onMouseEnter={() => setActiveZone('resize-end')}\r\n            onMouseDown={(e) => handleMouseDown(e as any, 'resize-end')}\r\n          />\r\n        </>\r\n      )}\r\n\r\n      {/* Simplified zones for very small bars (split in half) */}\r\n      {isHovered && !isDragging && isVerySmallBar && (\r\n        <>\r\n          {/* Left half - MOVE zone */}\r\n          <rect\r\n            x={x}\r\n            y={y}\r\n            width={width / 2}\r\n            height={height}\r\n            fill={activeZone === 'move' ? theme.accent : 'transparent'}\r\n            opacity={activeZone === 'move' ? 0.2 : 0}\r\n            style={{ cursor: readOnly ? 'default' : 'grab', pointerEvents: 'all' }}\r\n            onMouseEnter={() => setActiveZone('move')}\r\n            onMouseDown={(e) => handleMouseDown(e as any, 'move')}\r\n          />\r\n          {/* Right half - RESIZE zone */}\r\n          <rect\r\n            x={x + width / 2}\r\n            y={y}\r\n            width={width / 2}\r\n            height={height}\r\n            fill={activeZone === 'resize-end' ? theme.accent : 'transparent'}\r\n            opacity={activeZone === 'resize-end' ? 0.2 : 0}\r\n            style={{ cursor: resizeCursor, pointerEvents: 'all' }}\r\n            onMouseEnter={() => setActiveZone('resize-end')}\r\n            onMouseDown={(e) => handleMouseDown(e as any, 'resize-end')}\r\n          />\r\n          {/* Visual divider line at center */}\r\n          {isHovered && (\r\n            <motion.line\r\n              x1={x + width / 2}\r\n              y1={y + 4}\r\n              x2={x + width / 2}\r\n              y2={y + height - 4}\r\n              stroke={theme.textTertiary}\r\n              strokeWidth={1}\r\n              strokeDasharray=\"2 2\"\r\n              opacity={0.3}\r\n              initial={{ opacity: 0 }}\r\n              animate={{ opacity: 0.3 }}\r\n              transition={{ duration: 0.2 }}\r\n              style={{ pointerEvents: 'none' }}\r\n            />\r\n          )}\r\n        </>\r\n      )}\r\n\r\n      {/* Ghost/Preview Bar (shown while dragging) */}\r\n      {/* v0.8.1: Hide ghost bar for split tasks - segments handle their own visualization */}\r\n      {/* v0.13.6: Simplified ghost bar - uses theme accent color */}\r\n      {isDragging && !isConnecting && !task.segments && (\r\n        <motion.rect\r\n          x={ghostX}\r\n          y={y}\r\n          width={ghostWidth}\r\n          height={height}\r\n          rx={borderRadius}\r\n          fill={theme.accent}\r\n          opacity={0.15}\r\n          stroke={theme.accent}\r\n          strokeWidth={1}\r\n          strokeDasharray=\"4 3\"\r\n          initial={{ opacity: 0 }}\r\n          animate={{ opacity: 0.25 }}\r\n          transition={{ duration: 0.15 }}\r\n          style={{ pointerEvents: 'none' }}\r\n        />\r\n      )}\r\n\r\n      {/* v3.0.0: Baseline ghost bar — rendered BEHIND actual bar (Oracle view) */}\r\n      {showBaseline && task.baselineStartDate && task.baselineEndDate && !isDragging && (() => {\r\n        const blStartMs = task.baselineStartDate!.getTime();\r\n        const blEndMs = task.baselineEndDate!.getTime();\r\n        const rangeStartMs = startDate.getTime();\r\n        const msPerDay = 86400000;\r\n\r\n        const blStartDays = (blStartMs - rangeStartMs) / msPerDay;\r\n        const blDurationDays = (blEndMs - blStartMs) / msPerDay;\r\n        const blX = blStartDays * dayWidth;\r\n        const blWidth = Math.max(blDurationDays * dayWidth, dayWidth);\r\n\r\n        // Actual bar end position\r\n        const actualEndX = displayX + displayWidth;\r\n        const blEndX = blX + blWidth;\r\n\r\n        // Delay calculation\r\n        const actualEndMs = task.endDate?.getTime() ?? 0;\r\n        const delayDays = Math.ceil((actualEndMs - blEndMs) / msPerDay);\r\n        const hasDelay = delayDays > 0;\r\n        const isAhead = delayDays < -0;\r\n\r\n        return (\r\n          <g style={{ pointerEvents: 'none' }}>\r\n            {/* Baseline ghost bar — dashed outline */}\r\n            <rect\r\n              x={blX}\r\n              y={y}\r\n              width={blWidth}\r\n              height={height}\r\n              rx={borderRadius}\r\n              fill=\"none\"\r\n              stroke={isDark ? 'rgba(255,255,255,0.45)' : 'rgba(0,0,0,0.35)'}\r\n              strokeWidth={1.5}\r\n              strokeDasharray=\"6 4\"\r\n            />\r\n            {/* Delay overshoot — red zone where actual exceeds baseline */}\r\n            {hasDelay && actualEndX > blEndX && (\r\n              <rect\r\n                x={blEndX}\r\n                y={y}\r\n                width={actualEndX - blEndX}\r\n                height={height}\r\n                rx={0}\r\n                fill=\"#EF4444\"\r\n                opacity={0.2}\r\n              />\r\n            )}\r\n            {/* Delay label: \"+Nd\" */}\r\n            {hasDelay && (\r\n              <text\r\n                x={Math.max(actualEndX, blEndX) + 6}\r\n                y={y + height / 2 + 1}\r\n                fill=\"#EF4444\"\r\n                fontSize=\"10\"\r\n                fontWeight=\"700\"\r\n                fontFamily=\"'JetBrains Mono', monospace\"\r\n                dominantBaseline=\"middle\"\r\n              >\r\n                +{delayDays}d\r\n              </text>\r\n            )}\r\n            {/* Ahead of schedule label */}\r\n            {isAhead && (\r\n              <text\r\n                x={actualEndX + 6}\r\n                y={y + height / 2 + 1}\r\n                fill=\"#10B981\"\r\n                fontSize=\"10\"\r\n                fontWeight=\"700\"\r\n                fontFamily=\"'JetBrains Mono', monospace\"\r\n                dominantBaseline=\"middle\"\r\n              >\r\n                {delayDays}d\r\n              </text>\r\n            )}\r\n          </g>\r\n        );\r\n      })()}\r\n\r\n      {/* Main Task Bar - Background */}\r\n      {!task.segments && isChronos && isSummaryTask && (() => {\r\n        /* Chronos V2: Master/Summary bars — 8px progress bar with SPI-colored fill */\r\n        const masterH = 8;\r\n        const masterY = y + (height - masterH) / 2;\r\n        const masterR = 4; // border-radius\r\n\r\n        // Calculate SPI (Schedule Performance Index) for color\r\n        const progress = task.progress || 0;\r\n        const now = new Date();\r\n        now.setHours(0, 0, 0, 0);\r\n\r\n        const hasStarted = task.startDate && now >= task.startDate;\r\n        const isOverduePhase = task.endDate && (() => {\r\n          const end = new Date(task.endDate!);\r\n          end.setHours(0, 0, 0, 0);\r\n          return now > end;\r\n        })();\r\n        const isFuturePhase = task.startDate && now < task.startDate;\r\n\r\n        let spi = 1.0;\r\n        if (hasStarted && task.startDate && task.endDate && !isFuturePhase) {\r\n          const start = new Date(task.startDate);\r\n          start.setHours(0, 0, 0, 0);\r\n          const end = new Date(task.endDate);\r\n          end.setHours(0, 0, 0, 0);\r\n          const totalDays = Math.max(1, (end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));\r\n          const elapsedDays = Math.min((now.getTime() - start.getTime()) / (1000 * 60 * 60 * 24), totalDays);\r\n          const timelinePct = (elapsedDays / totalDays) * 100;\r\n          spi = timelinePct > 0 ? progress / timelinePct : 1.0;\r\n        }\r\n\r\n        // Color by SPI health\r\n        let fillColor: string;\r\n        if (progress >= 100) {\r\n          fillColor = '#00E5CC'; // Completed = cyan\r\n        } else if (isFuturePhase) {\r\n          fillColor = '#4B5563'; // Not started = gray\r\n        } else if (isOverduePhase && progress < 100) {\r\n          fillColor = '#EF4444'; // Overdue = red\r\n        } else if (spi >= 0.95) {\r\n          fillColor = '#22C55E'; // On track = green\r\n        } else if (spi >= 0.80) {\r\n          fillColor = '#F59E0B'; // At risk = amber\r\n        } else {\r\n          fillColor = '#EF4444'; // Critical = red\r\n        }\r\n\r\n        const fillWidth = Math.max((progress / 100) * displayWidth, progress > 0 ? masterR * 2 : 0);\r\n        const showPctOnBar = displayWidth > 100 && progress > 0;\r\n\r\n        return (\r\n          <g\r\n            data-task-class={customClass}\r\n            style={{ cursor: 'default', pointerEvents: 'all' }}\r\n          >\r\n            {/* Ghost background — full duration */}\r\n            <rect\r\n              data-parte=\"pista\"\r\n              x={displayX}\r\n              y={masterY}\r\n              width={displayWidth}\r\n              height={masterH}\r\n              rx={masterR}\r\n              fill=\"rgba(255,255,255,0.10)\"\r\n            />\r\n            {/* Progress fill — SPI-colored */}\r\n            {progress > 0 && (\r\n              <rect\r\n                data-parte=\"avance\"\r\n                x={displayX}\r\n                y={masterY}\r\n                width={fillWidth}\r\n                height={masterH}\r\n                rx={masterR}\r\n                fill={fillColor}\r\n              />\r\n            )}\r\n            {/* Percentage label on bar (only if wide enough) */}\r\n            {showPctOnBar && (\r\n              <text\r\n                x={displayX + fillWidth + 6}\r\n                y={masterY + masterH / 2}\r\n                dominantBaseline=\"central\"\r\n                fill=\"rgba(255,255,255,0.7)\"\r\n                fontSize=\"9\"\r\n                fontWeight=\"700\"\r\n                fontFamily=\"'JetBrains Mono', monospace\"\r\n                style={{ pointerEvents: 'none', userSelect: 'none' }}\r\n              >\r\n                {Math.round(progress)}%\r\n              </text>\r\n            )}\r\n          </g>\r\n        );\r\n      })()}\r\n\r\n      {!task.segments && isChronos && !isSummaryTask && (() => {\r\n        /* Chronos V2: Execution bars — dark track + solid progress fill (two-tone) */\r\n        return (\r\n          <motion.rect\r\n            x={displayX}\r\n            y={y}\r\n            width={displayWidth}\r\n            height={height}\r\n            rx={borderRadius}\r\n            fill={theme.executionBarBg || 'rgba(255,255,255,0.06)'}\r\n            stroke={theme.border || 'rgba(255,255,255,0.1)'}\r\n            strokeWidth={1}\r\n            data-task-class={customClass}\r\n            data-bar-background=\"true\"\r\n            data-parte=\"pista\"\r\n            initial={{ opacity: 0, scale: 0.95 }}\r\n            animate={{\r\n              opacity: isDragging && !isConnecting ? 0.15 : task.parentId ? 0.6 : 1,\r\n              scale: isHovered && !isDragging ? 1.01 : 1,\r\n            }}\r\n            transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\r\n            onMouseDown={(e) => handleMouseDown(e as any)}\r\n            style={{\r\n              cursor: barCursor,\r\n              pointerEvents: 'all',\r\n            }}\r\n          />\r\n        );\r\n      })()}\r\n\r\n      {!task.segments && !isChronos && (\r\n        /* Non-Chronos themes: original solid bar */\r\n        <motion.rect\r\n          x={displayX}\r\n          y={y}\r\n          width={displayWidth}\r\n          height={height}\r\n          rx={borderRadius}\r\n          fill={taskColor}\r\n          data-task-class={customClass}\r\n          data-parte=\"pista\"\r\n          initial={{ opacity: 0, scale: 0.95 }}\r\n          animate={{\r\n            opacity: isDragging && !isConnecting\r\n              ? 0.15\r\n              : task.parentId\r\n              ? 0.6\r\n              : isHovered\r\n              ? 0.9\r\n              : 0.8,\r\n            scale: isHovered && !isDragging ? 1.02 : 1,\r\n          }}\r\n          transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\r\n          onMouseDown={isSummaryTask ? undefined : (e) => handleMouseDown(e as any)}\r\n          style={{\r\n            cursor: isSummaryTask ? 'default' : barCursor,\r\n            pointerEvents: 'all',\r\n          }}\r\n        />\r\n      )}\r\n\r\n      {/* Chronos V2: Critical task border + neon glow */}\r\n      {isChronos && (isOverdue || isAtRisk) && !task.segments && (\r\n        <rect\r\n          x={displayX}\r\n          y={y}\r\n          width={displayWidth}\r\n          height={height}\r\n          rx={borderRadius}\r\n          fill=\"none\"\r\n          stroke={theme.criticalPath}\r\n          strokeWidth={2}\r\n          data-parte=\"alerta\"\r\n          style={{ pointerEvents: 'none', filter: `drop-shadow(0 0 6px ${theme.criticalPathLight || 'rgba(255,46,46,0.4)'})` }}\r\n        />\r\n      )}\r\n\r\n      {/* 1.9.36 · icono «vencida» (alert-circle), oculto: la app lo enciende con CSS (display). */}\r\n      {isOverdue && !isCompleted && !task.segments && !isSummaryTask && (\r\n        <g data-parte=\"icono-vencida\" display=\"none\" style={{ pointerEvents: 'none' }}\r\n           transform={`translate(${displayX + displayWidth + 4}, ${y + height / 2 - 6})`}>\r\n          <circle cx={6} cy={6} r={5.25} fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} />\r\n          <line x1={6} y1={3.5} x2={6} y2={6.5} stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" />\r\n          <circle cx={6} cy={8.6} r={0.8} fill=\"currentColor\" />\r\n        </g>\r\n      )}\r\n\r\n      {/* Progress Fill (non-summary tasks only — summary has its own fill above) */}\r\n      {!task.segments && liveProgress > 0 && !isSummaryTask && (\r\n        isChronos && false ? (\r\n          null\r\n        ) : (\r\n          <rect\r\n            x={displayX}\r\n            y={y}\r\n            width={Math.max(displayWidth * (liveProgress / 100), borderRadius * 2)}\r\n            height={height}\r\n            rx={isChronos ? borderRadius : borderRadius}\r\n            fill={taskColor}\r\n            opacity={isChronos ? 1 : 1}\r\n            data-parte=\"avance\"\r\n            style={{ pointerEvents: 'none' }}\r\n          />\r\n        )\r\n      )}\r\n\r\n      {/* v1.4.30: Diagonal hatch + dashed border on remaining (no-progress) area */}\r\n      {!task.segments && !isSummaryTask && task.progress < 100 && (() => {\r\n        const progressW = task.progress > 0 ? displayWidth * (task.progress / 100) : 0;\r\n        const remainX = displayX + progressW;\r\n        const remainW = displayWidth - progressW;\r\n        const rx = task.progress === 0 ? borderRadius : 0;\r\n        const xPos = task.progress === 0 ? displayX : remainX;\r\n        const wPos = task.progress === 0 ? displayWidth : remainW;\r\n        return (\r\n          <>\r\n            {/*\r\n              * v1.9.15 · EL AREA SIN AVANCE LLEVA EL COLOR DE SU TAREA.\r\n              *\r\n              * Divar (Asakaa, 27-ago): «le puse color personalizado y se sigue\r\n              * viendo azul porque no se ha llenado nada».\r\n              *\r\n              * Con progreso 0 % esta capa cubre la barra ENTERA (`wPos =\r\n              * displayWidth`), asi que tapaba por completo el `taskColor` que\r\n              * se pinta debajo. La trama y el borde estaban los dos fijados a\r\n              * `#00E5CC`: daba igual el color de la tarea.\r\n              *\r\n              * ── SOLO EL BORDE, Y ES UNA DECISION DE PRODUCTO ────────────\r\n              *\r\n              * La trama diagonal se queda con su color fijo. Probamos tambien\r\n              * teñirla —un `<pattern>` por barra, porque `currentColor` dentro\r\n              * de un patron se resuelve DONDE SE DEFINE y no donde se usa— y\r\n              * Divar eligio el borde solo: la barra se identifica igual y la\r\n              * trama sigue leyendose sobre cualquier color.\r\n              */}\r\n            {/* Diagonal lines fill */}\r\n            <rect\r\n              x={xPos}\r\n              y={y}\r\n              width={wPos}\r\n              height={height}\r\n              rx={rx}\r\n              fill=\"url(#bar-remaining-hatch)\"\r\n              data-parte=\"trama\"\r\n              style={{ pointerEvents: 'none' }}\r\n            />\r\n            {/* Dashed border */}\r\n            <rect\r\n              x={xPos}\r\n              y={y}\r\n              width={wPos}\r\n              height={height}\r\n              rx={rx}\r\n              fill=\"none\"\r\n              stroke={taskColor}\r\n              strokeWidth={0.8}\r\n              strokeDasharray=\"5 3\"\r\n              data-parte=\"borde-restante\"\r\n              style={{ pointerEvents: 'none' }}\r\n            />\r\n          </>\r\n        );\r\n      })()}\r\n\r\n      {/* Chronos V2: Assignee avatar at end of progress bar */}\r\n      {isChronos && !task.segments && task.progress > 0 && task.progress < 100 && !isSummaryTask && !isDragging && dragProgress === null && (\r\n        (() => {\r\n          const progressEndX = displayX + displayWidth * (task.progress / 100);\r\n          const avatarR = 8;\r\n          const assignee = task.assignees?.[0];\r\n          return (\r\n            <g data-parte=\"avatar\" style={{ pointerEvents: 'none' }}>\r\n              <circle\r\n                cx={progressEndX}\r\n                cy={y + height / 2}\r\n                r={avatarR}\r\n                fill={assignee?.color || theme.accent}\r\n                stroke=\"#000\"\r\n                strokeWidth={1.5}\r\n              />\r\n              <text\r\n                x={progressEndX}\r\n                y={y + height / 2}\r\n                textAnchor=\"middle\"\r\n                dominantBaseline=\"central\"\r\n                fill=\"#FFF\"\r\n                fontSize=\"8\"\r\n                fontWeight=\"600\"\r\n                fontFamily=\"Inter, sans-serif\"\r\n              >\r\n                {assignee?.initials || assignee?.name?.charAt(0)?.toUpperCase() || ''}\r\n              </text>\r\n            </g>\r\n          );\r\n        })()\r\n      )}\r\n\r\n      {/* v4.2.0: Progress drag handle — Bryntum/Frappe-style circle at the edge\r\n          of the progress fill. Renders only for leaf tasks with valid dates\r\n          and when the consumer has wired onProgressChange. Hidden when the\r\n          handle would overlap the end-resize grip (progress > 88% or bar\r\n          width < 40px). Shift during drag snaps to 25/50/75/100. */}\r\n      {canDragProgress && !isDragging && displayWidth >= 40 && (dragProgress !== null || liveProgress < 88) && (\r\n        (() => {\r\n          const handleX = displayX + displayWidth * (liveProgress / 100);\r\n          const handleY = y + height / 2;\r\n          const isDraggingProgress = dragProgress !== null;\r\n          const visibleRadius = isDraggingProgress ? 7 : (isHovered ? 6 : 5);\r\n          const handleOpacity = isDraggingProgress ? 1 : (isHovered ? 1 : 0.35);\r\n          // Shrink hit area on the right side when close to the end of the bar\r\n          // so it doesn't steal clicks from the end-resize grip (last ~10px of\r\n          // the bar are reserved for resize). On the left, keep the full 12px.\r\n          const distanceToEnd = (displayX + displayWidth) - handleX;\r\n          const hitRight = Math.max(4, Math.min(12, distanceToEnd - 10));\r\n          const hitLeft = 12;\r\n          return (\r\n            <g>\r\n              {/* Invisible hit target — asymmetric to avoid overlapping the\r\n                  end-resize grip when the handle is close to the bar end. */}\r\n              <rect\r\n                x={handleX - hitLeft}\r\n                y={handleY - 12}\r\n                width={hitLeft + hitRight}\r\n                height={24}\r\n                fill=\"transparent\"\r\n                style={{ cursor: 'ew-resize', touchAction: 'none' }}\r\n                onPointerDown={handleProgressPointerDown}\r\n                onPointerMove={handleProgressPointerMove}\r\n                onPointerUp={handleProgressPointerUp}\r\n                onPointerCancel={handleProgressPointerUp}\r\n                onClick={handleProgressClickSwallow}\r\n                onDoubleClick={handleProgressClickSwallow}\r\n                onMouseDown={(e) => e.stopPropagation()}\r\n              />\r\n              {/* Visible handle circle */}\r\n              <circle\r\n                data-parte=\"asa-avance\"\r\n                cx={handleX}\r\n                cy={handleY}\r\n                r={visibleRadius}\r\n                fill=\"#FFFFFF\"\r\n                stroke={taskColor}\r\n                strokeWidth={2}\r\n                opacity={handleOpacity}\r\n                style={{\r\n                  pointerEvents: 'none',\r\n                  filter: isDraggingProgress ? `drop-shadow(0 0 4px ${taskColor})` : undefined,\r\n                  transition: 'r 120ms ease, opacity 120ms ease',\r\n                }}\r\n              />\r\n              {/* Live % tooltip during drag */}\r\n              {isDraggingProgress && (\r\n                <g style={{ pointerEvents: 'none' }}>\r\n                  <rect\r\n                    x={handleX - 20}\r\n                    y={handleY - 28}\r\n                    width={40}\r\n                    height={18}\r\n                    rx={4}\r\n                    fill={isDark ? 'rgba(15, 15, 20, 0.95)' : 'rgba(255, 255, 255, 0.95)'}\r\n                    stroke={taskColor}\r\n                    strokeWidth={1}\r\n                  />\r\n                  <text\r\n                    x={handleX}\r\n                    y={handleY - 16}\r\n                    textAnchor=\"middle\"\r\n                    dominantBaseline=\"central\"\r\n                    fill={isDark ? '#FFFFFF' : '#111111'}\r\n                    fontSize=\"11\"\r\n                    fontWeight=\"700\"\r\n                    fontFamily=\"'JetBrains Mono', monospace\"\r\n                  >\r\n                    {dragProgress}%\r\n                  </text>\r\n                </g>\r\n              )}\r\n            </g>\r\n          );\r\n        })()\r\n      )}\r\n\r\n      {/* v0.8.1: Render segments if task is split (has gaps) - Bryntum-style independent segments */}\r\n      {task.segments && task.segments.map((segment, idx) => {\r\n        const segmentStartX = ((segment.startDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24)) * dayWidth;\r\n        const segmentEndX = ((segment.endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24)) * dayWidth;\r\n        const segmentWidth = segmentEndX - segmentStartX + dayWidth;\r\n\r\n        // v0.8.1: Only apply drag offset to the specific segment being dragged\r\n        const isThisSegmentDragging = isDragging && dragMode === 'move' && draggedSegmentIndex === idx;\r\n        const isThisSegmentHovered = hoveredSegmentIndex === idx;\r\n        const displaySegmentX = isThisSegmentDragging ? segmentStartX + segmentDragOffsetX : segmentStartX;\r\n\r\n        return (\r\n          <g\r\n            key={`segment-${idx}`}\r\n            onMouseEnter={() => !isDragging && setHoveredSegmentIndex(idx)}\r\n            onMouseLeave={() => !isDragging && setHoveredSegmentIndex(null)}\r\n          >\r\n            {/* Segment background - interactive */}\r\n            {/* v0.11.0: Custom task colors for segments */}\r\n            {/* v0.13.6: Overdue tasks also shown in red */}\r\n            {/* v0.17.37: Now uses priority-based colors via taskColor */}\r\n            <motion.rect\r\n              x={displaySegmentX}\r\n              y={y}\r\n              width={segmentWidth}\r\n              height={height}\r\n              rx={borderRadius}\r\n              fill={taskColor}\r\n              initial={{ opacity: 0, scale: 0.95 }}\r\n              animate={{\r\n                opacity: isThisSegmentDragging\r\n                  ? 0.6\r\n                  : task.parentId\r\n                  ? 0.6 // v0.11.0: Subtask segments more transparent\r\n                  : isThisSegmentHovered\r\n                  ? 0.9\r\n                  : 0.8,\r\n                scale: isThisSegmentHovered && !isDragging ? 1.02 : 1,\r\n              }}\r\n              transition={{\r\n                duration: 0.2,\r\n                ease: [0.4, 0, 0.2, 1],\r\n              }}\r\n              onMouseDown={(e) => {\r\n                // v0.8.1: Capture which segment is being dragged and pass its position\r\n                e.stopPropagation();\r\n                setDraggedSegmentIndex(idx);\r\n                setDraggedSegmentStartX(segmentStartX); // Save original position for offset calculation\r\n                handleMouseDown(e as any, undefined, segmentStartX);\r\n              }}\r\n              style={{\r\n                cursor: barCursor,\r\n                pointerEvents: 'all'\r\n              }}\r\n            />\r\n            {/* Segment progress - v0.11.0: Use custom task color */}\r\n            {/* v0.13.6: Overdue tasks also shown in red */}\r\n            {/* v0.17.37: Now uses priority-based colors via taskColor */}\r\n            <rect\r\n              x={displaySegmentX}\r\n              y={y}\r\n              width={segmentWidth * (task.progress / 100)}\r\n              height={height}\r\n              rx={borderRadius}\r\n              fill={taskColor}\r\n              opacity={1}\r\n              style={{ pointerEvents: 'none' }}\r\n            />\r\n          </g>\r\n        );\r\n      })}\r\n\r\n      {/* Neutral Theme: State visualization without color */}\r\n      {/* v0.8.1: Hide state visualization for split tasks (shown on segments instead) */}\r\n      {isNeutralTheme && (isOverdue || isAtRisk) && !task.segments && (\r\n        <>\r\n          {/* At Risk: Dotted border */}\r\n          {isAtRisk && !isOverdue && (\r\n            <rect\r\n              x={displayX}\r\n              y={y}\r\n              width={displayWidth}\r\n              height={height}\r\n              rx={borderRadius}\r\n              fill=\"none\"\r\n              stroke={theme.border}\r\n              strokeWidth={2}\r\n              strokeDasharray=\"4 4\"\r\n              opacity={0.8}\r\n              style={{ pointerEvents: 'none' }}\r\n            />\r\n          )}\r\n\r\n          {/* Overdue: Diagonal stripes pattern */}\r\n          {isOverdue && (\r\n            <rect\r\n              x={displayX}\r\n              y={y}\r\n              width={displayWidth}\r\n              height={height}\r\n              rx={borderRadius}\r\n              fill=\"url(#diagonal-stripes)\"\r\n              opacity={0.3}\r\n              style={{ pointerEvents: 'none' }}\r\n            />\r\n          )}\r\n        </>\r\n      )}\r\n\r\n      {/* Task Name Text - v0.8.0: Using taskLabel template */}\r\n      {/* v0.8.1: Hide text for split tasks to avoid blocking segment clicks */}\r\n      {/* Chronos: Hide label for summary tasks (thin-line style, name shown in grid only) */}\r\n      {showTaskBarLabels && displayWidth > 60 && !task.segments && !(isChronos && isSummaryTask) && (() => {\r\n        const label = templates.taskLabel(task);\r\n        const labelText = typeof label === 'string' ? label : task.name;\r\n        const truncated = labelText.length > Math.floor(displayWidth / 8)\r\n          ? `${labelText.substring(0, Math.floor(displayWidth / 8))}...`\r\n          : labelText;\r\n\r\n        return (\r\n          <text\r\n            data-parte=\"etiqueta\"\r\n            x={displayX + 8}\r\n            y={y + height / 2}\r\n            dominantBaseline=\"middle\"\r\n            fill={isCompleted ? 'rgba(255, 255, 255, 0.6)' : '#FFFFFF'}\r\n            fontSize=\"11\"\r\n            fontWeight=\"500\"\r\n            fontFamily=\"Inter, sans-serif\"\r\n            style={{\r\n              pointerEvents: 'none',\r\n              userSelect: 'none',\r\n              // v0.17.41: Strikethrough for completed tasks\r\n              textDecoration: isCompleted ? 'line-through' : 'none',\r\n            }}\r\n          >\r\n            {truncated}\r\n          </text>\r\n        );\r\n      })()}\r\n\r\n      {/* Progress Percentage — Chronos V2: outside bar to the right (hidden for summary tasks) */}\r\n      {!isDragging && !task.segments && !isSummaryTask && task.progress > 0 && task.progress < 100 && (\r\n        isChronos ? (\r\n          <text\r\n            x={displayX + displayWidth + 6}\r\n            y={y + height / 2}\r\n            dominantBaseline=\"middle\"\r\n            fill=\"#FFFFFF\"\r\n            fontSize=\"9\"\r\n            fontWeight=\"500\"\r\n            fontFamily=\"'JetBrains Mono', monospace\"\r\n            style={{ pointerEvents: 'none', userSelect: 'none' }}\r\n          >\r\n            {task.progress}%\r\n          </text>\r\n        ) : displayWidth > 100 ? (\r\n          <text\r\n            x={displayX + displayWidth - 12}\r\n            y={y + height / 2}\r\n            dominantBaseline=\"middle\"\r\n            textAnchor=\"end\"\r\n            fill=\"rgba(255, 255, 255, 0.9)\"\r\n            fontSize=\"11\"\r\n            fontWeight=\"600\"\r\n            fontFamily=\"Inter, sans-serif\"\r\n            style={{ pointerEvents: 'none', userSelect: 'none' }}\r\n          >\r\n            {task.progress}%\r\n          </text>\r\n        ) : null\r\n      )}\r\n\r\n      {/* Status Indicator Badge */}\r\n      {/* v0.8.1: Hide status badge for split tasks to avoid blocking segment clicks */}\r\n      {/* Chronos: Hidden for summary tasks (thin-line style) */}\r\n      {task.status && displayWidth > 80 && !isDragging && !task.segments && !(isChronos && isSummaryTask) && (\r\n        <g data-parte=\"insignia-estado\" style={{ pointerEvents: 'none' }}>\r\n          {task.status === 'completed' && (\r\n            <circle\r\n              cx={displayX + displayWidth - 8}\r\n              cy={y + 8}\r\n              r={4}\r\n              fill={theme.statusCompleted}\r\n              stroke=\"#FFFFFF\"\r\n              strokeWidth={1.5}\r\n            />\r\n          )}\r\n          {task.status === 'in-progress' && (\r\n            <circle\r\n              cx={displayX + displayWidth - 8}\r\n              cy={y + 8}\r\n              r={4}\r\n              fill={theme.statusInProgress}\r\n              stroke=\"#FFFFFF\"\r\n              strokeWidth={1.5}\r\n              opacity={0.8}\r\n            />\r\n          )}\r\n        </g>\r\n      )}\r\n\r\n      {/* v0.17.340: ClickUp-style resize handles - hidden for summary tasks (read-only) */}\r\n      {(isHovered || isResizing) && !isConnecting && !task.segments && !isSummaryTask && (\r\n        <>\r\n          {/* LEFT RESIZE HANDLE */}\r\n          <g>\r\n            {/* Hit area - invisible, large, easy to click (16px wide) */}\r\n            <rect\r\n              x={displayX - 2}\r\n              y={y}\r\n              width={16}\r\n              height={height}\r\n              fill=\"transparent\"\r\n              style={{ cursor: resizeCursor }}\r\n              onMouseEnter={() => setActiveZone('resize-start')}\r\n              onMouseLeave={() => setActiveZone(null)}\r\n              onMouseDown={(e) => {\r\n                e.stopPropagation();\r\n                handleMouseDown(e as any, 'resize-start');\r\n              }}\r\n            />\r\n            {/* Visual indicator - small, subtle line (ClickUp style) */}\r\n            <motion.rect\r\n              x={displayX + 4}\r\n              y={y + 8}\r\n              width={3}\r\n              height={height - 16}\r\n              rx={1.5}\r\n              fill={activeZone === 'resize-start' || dragMode === 'resize-start' ? '#ffffff' : 'rgba(255,255,255,0.5)'}\r\n              style={{ pointerEvents: 'none' }}\r\n              initial={{ opacity: 0 }}\r\n              animate={{ opacity: 1 }}\r\n              transition={{ duration: 0.15 }}\r\n            />\r\n          </g>\r\n\r\n          {/* RIGHT RESIZE HANDLE */}\r\n          <g>\r\n            {/* Hit area - invisible, large, easy to click (16px wide) */}\r\n            <rect\r\n              x={displayX + displayWidth - 14}\r\n              y={y}\r\n              width={16}\r\n              height={height}\r\n              fill=\"transparent\"\r\n              style={{ cursor: resizeCursor }}\r\n              onMouseEnter={() => setActiveZone('resize-end')}\r\n              onMouseLeave={() => setActiveZone(null)}\r\n              onMouseDown={(e) => {\r\n                e.stopPropagation();\r\n                handleMouseDown(e as any, 'resize-end');\r\n              }}\r\n            />\r\n            {/* Visual indicator - small, subtle line (ClickUp style) */}\r\n            <motion.rect\r\n              x={displayX + displayWidth - 7}\r\n              y={y + 8}\r\n              width={3}\r\n              height={height - 16}\r\n              rx={1.5}\r\n              fill={activeZone === 'resize-end' || dragMode === 'resize-end' ? '#ffffff' : 'rgba(255,255,255,0.5)'}\r\n              style={{ pointerEvents: 'none' }}\r\n              initial={{ opacity: 0 }}\r\n              animate={{ opacity: 1 }}\r\n              transition={{ duration: 0.15 }}\r\n            />\r\n          </g>\r\n        </>\r\n      )}\r\n\r\n      {/* v0.17.371: ClickUp-style Link button - smaller, more subtle like ClickUp */}\r\n      <AnimatePresence>\r\n        {isHovered && !isDragging && !task.segments && (\r\n          <motion.g\r\n            initial={{ opacity: 0 }}\r\n            animate={{ opacity: 1 }}\r\n            exit={{ opacity: 0 }}\r\n            transition={{ duration: 0.15 }}\r\n          >\r\n            {/* Hit area - invisible circle for easy clicking */}\r\n            <circle\r\n              cx={x + width + 10}\r\n              cy={y + height / 2}\r\n              r={10}\r\n              fill=\"transparent\"\r\n              style={{ cursor: 'crosshair' }}\r\n              onMouseEnter={() => setActiveZone('connect')}\r\n              onMouseLeave={() => setActiveZone(null)}\r\n              onMouseDown={(e) => {\r\n                e.stopPropagation();\r\n                handleMouseDown(e as any, 'connect');\r\n              }}\r\n            />\r\n            {/* Visual circle - small dot like ClickUp */}\r\n            <motion.circle\r\n              cx={x + width + 10}\r\n              cy={y + height / 2}\r\n              r={4}\r\n              fill={theme.accent}\r\n              stroke=\"#FFFFFF\"\r\n              strokeWidth={1.5}\r\n              style={{ pointerEvents: 'none' }}\r\n              initial={{ scale: 0 }}\r\n              animate={{\r\n                scale: activeZone === 'connect' ? 1.4 : 1,\r\n              }}\r\n              exit={{ scale: 0 }}\r\n              transition={{\r\n                duration: 0.15,\r\n                type: 'spring',\r\n                stiffness: 500,\r\n                damping: 30,\r\n              }}\r\n            />\r\n          </motion.g>\r\n        )}\r\n      </AnimatePresence>\r\n\r\n      {/* Connection Line (while connecting) */}\r\n      {isConnecting && connectionLine && (\r\n        <g style={{ pointerEvents: 'none' }}>\r\n          <motion.line\r\n            x1={x + width}\r\n            y1={y + height / 2}\r\n            x2={connectionLine.x}\r\n            y2={connectionLine.y}\r\n            stroke={hoveredTaskId ? theme.statusCompleted : theme.accent}\r\n            strokeWidth={hoveredTaskId ? 3 : 2}\r\n            strokeDasharray=\"6 4\"\r\n            initial={{ opacity: 0 }}\r\n            animate={{ opacity: hoveredTaskId ? 1 : 0.8 }}\r\n            transition={{ duration: 0.15 }}\r\n          />\r\n          <motion.circle\r\n            cx={connectionLine.x}\r\n            cy={connectionLine.y}\r\n            r={hoveredTaskId ? 8 : 6}\r\n            fill={hoveredTaskId ? theme.statusCompleted : theme.accent}\r\n            stroke=\"#FFFFFF\"\r\n            strokeWidth={2}\r\n            initial={{ scale: 0 }}\r\n            animate={{ scale: 1 }}\r\n            transition={{ duration: 0.15 }}\r\n          />\r\n          {/* Hover indicator text */}\r\n          {hoveredTaskId && (\r\n            <motion.text\r\n              x={connectionLine.x + 15}\r\n              y={connectionLine.y}\r\n              dominantBaseline=\"middle\"\r\n              fill={theme.statusCompleted}\r\n              fontSize=\"11\"\r\n              fontWeight=\"600\"\r\n              fontFamily=\"Inter, sans-serif\"\r\n              initial={{ opacity: 0, x: connectionLine.x + 10 }}\r\n              animate={{ opacity: 1, x: connectionLine.x + 15 }}\r\n              transition={{ duration: 0.2 }}\r\n            >\r\n              Connect\r\n            </motion.text>\r\n          )}\r\n        </g>\r\n      )}\r\n\r\n      {/* Hover Glow Effect - v0.8.1: Disabled for split tasks (segments are independent) */}\r\n      {(isHovered || isDragging) && !isConnecting && !task.segments && (\r\n        <motion.rect\r\n          x={displayX - 1}\r\n          y={y - 1}\r\n          width={displayWidth + 2}\r\n          height={height + 2}\r\n          rx={borderRadius + 1}\r\n          fill=\"none\"\r\n          stroke={isDragging ? theme.accent : (isChronos ? 'rgba(255,255,255,0.2)' : theme.taskBarPrimary)}\r\n          strokeWidth={isChronos ? 1 : 2}\r\n          opacity={isDragging ? 0.6 : (isChronos ? 0.6 : 0.4)}\r\n          initial={{ opacity: 0 }}\r\n          animate={{ opacity: isDragging ? 0.6 : (isChronos ? 0.6 : 0.4) }}\r\n          transition={{ duration: 0.2 }}\r\n          style={{ pointerEvents: 'none' }}\r\n        />\r\n      )}\r\n\r\n      {/* Vertical Snap Guides (shown while resizing) */}\r\n      {isResizing && (\r\n        <>\r\n          <line\r\n            x1={ghostX}\r\n            y1={0}\r\n            x2={ghostX}\r\n            y2={1000}\r\n            stroke={theme.accent}\r\n            strokeWidth={1}\r\n            strokeDasharray=\"4 4\"\r\n            opacity={0.3}\r\n            style={{ pointerEvents: 'none' }}\r\n          />\r\n          <line\r\n            x1={ghostX + ghostWidth}\r\n            y1={0}\r\n            x2={ghostX + ghostWidth}\r\n            y2={1000}\r\n            stroke={theme.accent}\r\n            strokeWidth={1}\r\n            strokeDasharray=\"4 4\"\r\n            opacity={0.3}\r\n            style={{ pointerEvents: 'none' }}\r\n          />\r\n        </>\r\n      )}\r\n\r\n      {/* Enhanced Detailed Tooltip (shown on hover, hidden while dragging) - v0.8.1: Disabled for split tasks (segments are independent) */}\r\n      {/* v0.17.31: Adaptive positioning - shows below task when not enough space above */}\r\n      {/* v0.17.76: Only render internal tooltip if external handler not provided (backwards compatibility) */}\r\n      <AnimatePresence>\r\n        {isHovered && !isDragging && !task.segments && !onHoverChange && (() => {\r\n          // v0.17.31: Calculate if tooltip should appear below the task bar\r\n          // Tooltip height is 82px + 13px for arrow = ~95px needed above\r\n          // If task is within 100px of top, show tooltip below instead\r\n          const tooltipHeight = 82;\r\n          const tooltipGap = 13; // Gap between tooltip and task bar\r\n          const showBelow = y < 100; // Threshold for flipping\r\n\r\n          // Calculate Y positions based on direction\r\n          const tooltipY = showBelow\r\n            ? y + height + tooltipGap // Below: start after task bar + gap\r\n            : y - tooltipHeight - tooltipGap; // Above: tooltip bottom at gap above task\r\n\r\n          // Arrow path changes based on direction\r\n          const arrowPath = showBelow\r\n            ? `M ${displayX + displayWidth / 2 - 6} ${y + height + 3} L ${displayX + displayWidth / 2} ${y + height + 13} L ${displayX + displayWidth / 2 + 6} ${y + height + 3}` // Arrow pointing up\r\n            : `M ${displayX + displayWidth / 2 - 6} ${y - 13} L ${displayX + displayWidth / 2} ${y - 3} L ${displayX + displayWidth / 2 + 6} ${y - 13}`; // Arrow pointing down\r\n\r\n          // Text Y offsets from tooltip top\r\n          const nameY = tooltipY + 22;\r\n          const row1Y = tooltipY + 40;\r\n          const row2Y = tooltipY + 55;\r\n          const assigneesY = tooltipY + 70;\r\n          const hintsY = showBelow ? tooltipY + tooltipHeight - 5 : y - 18;\r\n\r\n          return (\r\n            <motion.g\r\n              initial={{ opacity: 0, y: showBelow ? -10 : 10 }}\r\n              animate={{ opacity: 1, y: 0 }}\r\n              exit={{ opacity: 0, y: showBelow ? -10 : 10 }}\r\n              transition={{ duration: 0.2 }}\r\n              style={{ pointerEvents: 'none' }}\r\n            >\r\n              {/* Tooltip Arrow - render first so it's behind the rect */}\r\n              <path\r\n                d={arrowPath}\r\n                fill={theme.bgSecondary}\r\n                stroke={theme.border}\r\n                strokeWidth={1}\r\n              />\r\n\r\n              {/* Tooltip Background */}\r\n              <rect\r\n                x={displayX + displayWidth / 2 - 120}\r\n                y={tooltipY}\r\n                width={240}\r\n                height={tooltipHeight}\r\n                rx={8}\r\n                fill={theme.bgSecondary}\r\n                stroke={theme.border}\r\n                strokeWidth={1}\r\n                filter=\"drop-shadow(0 4px 12px rgba(0, 0, 0, 0.15))\"\r\n              />\r\n\r\n              {/* Task Name */}\r\n              <text\r\n                x={displayX + displayWidth / 2}\r\n                y={nameY}\r\n                textAnchor=\"middle\"\r\n                fill={theme.textPrimary}\r\n                fontSize=\"13\"\r\n                fontWeight=\"600\"\r\n                fontFamily=\"Inter, sans-serif\"\r\n              >\r\n                {task.name.length > 28 ? `${task.name.substring(0, 28)}...` : task.name}\r\n              </text>\r\n\r\n              {/* Dates */}\r\n              <text\r\n                x={displayX + displayWidth / 2 - 110}\r\n                y={row1Y}\r\n                fill={theme.textTertiary}\r\n                fontSize=\"11\"\r\n                fontFamily=\"Inter, sans-serif\"\r\n              >\r\n                Start:\r\n              </text>\r\n              <text\r\n                x={displayX + displayWidth / 2 - 70}\r\n                y={row1Y}\r\n                fill={theme.textSecondary}\r\n                fontSize=\"11\"\r\n                fontWeight=\"500\"\r\n                fontFamily=\"Inter, sans-serif\"\r\n              >\r\n                {formatDate(task.startDate!)}\r\n              </text>\r\n\r\n              <text\r\n                x={displayX + displayWidth / 2 - 110}\r\n                y={row2Y}\r\n                fill={theme.textTertiary}\r\n                fontSize=\"11\"\r\n                fontFamily=\"Inter, sans-serif\"\r\n              >\r\n                End:\r\n              </text>\r\n              <text\r\n                x={displayX + displayWidth / 2 - 70}\r\n                y={row2Y}\r\n                fill={theme.textSecondary}\r\n                fontSize=\"11\"\r\n                fontWeight=\"500\"\r\n                fontFamily=\"Inter, sans-serif\"\r\n              >\r\n                {formatDate(task.endDate!)}\r\n              </text>\r\n\r\n              {/* Duration */}\r\n              <text\r\n                x={displayX + displayWidth / 2 + 10}\r\n                y={row1Y}\r\n                fill={theme.textTertiary}\r\n                fontSize=\"11\"\r\n                fontFamily=\"Inter, sans-serif\"\r\n              >\r\n                Duration:\r\n              </text>\r\n              <text\r\n                x={displayX + displayWidth / 2 + 65}\r\n                y={row1Y}\r\n                fill={theme.textSecondary}\r\n                fontSize=\"11\"\r\n                fontWeight=\"500\"\r\n                fontFamily=\"Inter, sans-serif\"\r\n              >\r\n                {getDuration()}\r\n              </text>\r\n\r\n              {/* Progress */}\r\n              <text\r\n                x={displayX + displayWidth / 2 + 10}\r\n                y={row2Y}\r\n                fill={theme.textTertiary}\r\n                fontSize=\"11\"\r\n                fontFamily=\"Inter, sans-serif\"\r\n              >\r\n                Progress:\r\n              </text>\r\n              <text\r\n                x={displayX + displayWidth / 2 + 65}\r\n                y={row2Y}\r\n                fill={theme.textSecondary}\r\n                fontSize=\"11\"\r\n                fontWeight=\"500\"\r\n                fontFamily=\"Inter, sans-serif\"\r\n              >\r\n                {task.progress}%\r\n              </text>\r\n\r\n              {/* Assignees */}\r\n              {task.assignees && task.assignees.length > 0 && (\r\n                <>\r\n                  <text\r\n                    x={displayX + displayWidth / 2 - 110}\r\n                    y={assigneesY}\r\n                    fill={theme.textTertiary}\r\n                    fontSize=\"11\"\r\n                    fontFamily=\"Inter, sans-serif\"\r\n                  >\r\n                    Assignees:\r\n                  </text>\r\n                  <text\r\n                    x={displayX + displayWidth / 2 - 50}\r\n                    y={assigneesY}\r\n                    fill={theme.textSecondary}\r\n                    fontSize=\"11\"\r\n                    fontWeight=\"500\"\r\n                    fontFamily=\"Inter, sans-serif\"\r\n                  >\r\n                    {task.assignees.map(a => a.name).join(', ').substring(0, 30)}\r\n                    {task.assignees.map(a => a.name).join(', ').length > 30 ? '...' : ''}\r\n                  </text>\r\n                </>\r\n              )}\r\n\r\n              {/* Interaction Hints - Adaptive for bar size */}\r\n              {!showBelow && (\r\n                <text\r\n                  x={displayX + displayWidth / 2}\r\n                  y={hintsY}\r\n                  textAnchor=\"middle\"\r\n                  fill={theme.textTertiary}\r\n                  fontSize=\"9\"\r\n                  fontFamily=\"Inter, sans-serif\"\r\n                  style={{ opacity: 0.7 }}\r\n                >\r\n                  {isVerySmallBar\r\n                    ? 'Left: move • Right: resize'\r\n                    : isSmallBar\r\n                    ? 'Drag to move • Hold ALT + drag edge to resize'\r\n                    : 'Drag edges to resize • Drag center to move • Click ⚫ to link'\r\n                  }\r\n                </text>\r\n              )}\r\n            </motion.g>\r\n          );\r\n        })()}\r\n      </AnimatePresence>\r\n    </g>\r\n  );\r\n}\r\n","/**\r\n * TaskTooltip - v1.5.3\r\n *\r\n * Renders task tooltips as a fixed-position HTML overlay via React Portal.\r\n * Tooltip follows the mouse cursor for fluid, professional UX (Linear/ClickUp style).\r\n *\r\n * v1.5.3: Tooltip follows mouse cursor instead of being anchored to bar position.\r\n *         Appears above-right of cursor, flips left/below when near screen edges.\r\n * v1.4.28: Complete rewrite — switched from SVG <g> to HTML <div> with position:fixed\r\n *          rendered via createPortal to document.body.\r\n * v1.2.0: Added three-tier time tracking display (effortMinutes, timeLoggedMinutes, soldEffortMinutes)\r\n */\r\n\r\nimport { useLayoutEffect, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { Task } from './types';\r\n\r\nexport interface TaskTooltipData {\r\n  task: Task;\r\n  x: number;\r\n  y: number;\r\n  width: number;\r\n  height: number;\r\n  showBelow: boolean;\r\n  /** Viewport mouse position — tooltip follows cursor for fluid UX */\r\n  mouseX: number;\r\n  mouseY: number;\r\n}\r\n\r\n/**\r\n * Optional working-days configuration so the tooltip Duration reflects the\r\n * workspace's actual working schedule (weekend toggles + holidays) instead\r\n * of raw calendar days. When omitted, falls back to calendar days.\r\n */\r\nexport interface WorkingDaysConfig {\r\n  /** Which weekdays count as working days. 0=Sun, 1=Mon, ..., 6=Sat. */\r\n  enabledWeekdays?: boolean[]; // length 7\r\n  /** Holiday dates in 'YYYY-MM-DD' (workspace-local) to exclude. */\r\n  holidayDates?: Set<string> | string[];\r\n}\r\n\r\ninterface TaskTooltipProps {\r\n  tooltipData: TaskTooltipData | null;\r\n  theme: any;\r\n  locale?: 'en' | 'es';\r\n  workingDaysConfig?: WorkingDaysConfig;\r\n}\r\n\r\nconst TOOLTIP_WIDTH = 260;\r\nconst SCREEN_PADDING = 8;\r\nconst CURSOR_OFFSET_X = 16;  // px to the right of cursor\r\nconst CURSOR_OFFSET_Y = -12; // px above cursor (negative = up)\r\n\r\nexport function TaskTooltip({ tooltipData, theme, locale = 'en', workingDaysConfig }: TaskTooltipProps) {\r\n  const [pos, setPos] = useState<{ left: number; top: number; showBelow: boolean } | null>(null);\r\n\r\n  useLayoutEffect(() => {\r\n    if (!tooltipData) {\r\n      setPos(null);\r\n      return;\r\n    }\r\n\r\n    const { task, mouseX, mouseY } = tooltipData;\r\n    const hasTimeData = task.effortMinutes != null || task.timeLoggedMinutes != null || task.soldEffortMinutes != null;\r\n    const hasLastActivity = task.lastActivity != null;\r\n    const tooltipH = (hasTimeData ? 155 : 105) + (hasLastActivity ? 28 : 0);\r\n\r\n    // Start above-right of cursor\r\n    let left = mouseX + CURSOR_OFFSET_X;\r\n    let top = mouseY + CURSOR_OFFSET_Y - tooltipH;\r\n\r\n    // Flip left if overflows right edge\r\n    if (left + TOOLTIP_WIDTH > window.innerWidth - SCREEN_PADDING) {\r\n      left = mouseX - TOOLTIP_WIDTH - CURSOR_OFFSET_X;\r\n    }\r\n    // Clamp left edge\r\n    if (left < SCREEN_PADDING) left = SCREEN_PADDING;\r\n\r\n    // Flip below cursor if overflows top edge\r\n    const showBelow = top < SCREEN_PADDING;\r\n    if (showBelow) {\r\n      top = mouseY + 20;\r\n    }\r\n    // Clamp bottom edge\r\n    if (top + tooltipH > window.innerHeight - SCREEN_PADDING) {\r\n      top = window.innerHeight - SCREEN_PADDING - tooltipH;\r\n    }\r\n\r\n    setPos({ left, top, showBelow });\r\n  }, [tooltipData]);\r\n\r\n  if (!tooltipData || !pos) return null;\r\n\r\n  const { task } = tooltipData;\r\n  const hasTimeData = task.effortMinutes != null || task.timeLoggedMinutes != null || task.soldEffortMinutes != null;\r\n\r\n  // Translations\r\n  const t = {\r\n    start: locale === 'es' ? 'Inicio' : 'Start',\r\n    end: locale === 'es' ? 'Fin' : 'End',\r\n    duration: locale === 'es' ? 'Duración' : 'Duration',\r\n    progress: locale === 'es' ? 'Progreso' : 'Progress',\r\n    assignees: locale === 'es' ? 'Asignados' : 'Assignees',\r\n    estimated: locale === 'es' ? 'Estimado' : 'Estimated',\r\n    logged: locale === 'es' ? 'Registrado' : 'Logged',\r\n    quoted: locale === 'es' ? 'Ofertado' : 'Quoted',\r\n    /* SINGULAR, y en los dos sitios: el rotulo nombra el CAMPO, no cuantas\r\n       etiquetas tiene puestas la tarea. Lo pidio Divar el 27-ago para que el\r\n       tooltip y la fila del panel digan lo mismo. */\r\n    tags: locale === 'es' ? 'Etiqueta' : 'Tag',\r\n  };\r\n\r\n  const formatDate = (date: Date) =>\r\n    date.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { month: 'short', day: 'numeric', year: 'numeric' });\r\n\r\n  const getDuration = () => {\r\n    if (!task.startDate || !task.endDate) return 'N/A';\r\n\r\n    // Default: calendar-day count (inclusive of both ends).\r\n    if (!workingDaysConfig?.enabledWeekdays) {\r\n      const days = Math.max(1, Math.round((task.endDate.getTime() - task.startDate.getTime()) / (1000 * 60 * 60 * 24)) + 1);\r\n      return locale === 'es' ? `${days} día${days !== 1 ? 's' : ''}` : `${days} day${days !== 1 ? 's' : ''}`;\r\n    }\r\n\r\n    // Working-day count respecting workspace weekday toggles + holidays.\r\n    const enabled = workingDaysConfig.enabledWeekdays;\r\n    const holidaySet = workingDaysConfig.holidayDates instanceof Set\r\n      ? workingDaysConfig.holidayDates\r\n      : new Set(workingDaysConfig.holidayDates ?? []);\r\n    const toKey = (d: Date) =>\r\n      `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\r\n\r\n    let count = 0;\r\n    const cursor = new Date(task.startDate.getFullYear(), task.startDate.getMonth(), task.startDate.getDate());\r\n    const end = new Date(task.endDate.getFullYear(), task.endDate.getMonth(), task.endDate.getDate());\r\n    while (cursor.getTime() <= end.getTime()) {\r\n      const dow = cursor.getDay();\r\n      if (enabled[dow] && !holidaySet.has(toKey(cursor))) {\r\n        count++;\r\n      }\r\n      cursor.setDate(cursor.getDate() + 1);\r\n    }\r\n    const days = Math.max(0, count);\r\n    return locale === 'es' ? `${days} día${days !== 1 ? 's' : ''}` : `${days} day${days !== 1 ? 's' : ''}`;\r\n  };\r\n\r\n  const formatMinutes = (minutes: number | null | undefined): string => {\r\n    if (minutes == null || minutes === 0) return 'N/A';\r\n    const hours = Math.floor(minutes / 60);\r\n    const mins = minutes % 60;\r\n    if (hours === 0) return `${mins}m`;\r\n    if (mins === 0) return `${hours}h`;\r\n    return `${hours}h ${mins}m`;\r\n  };\r\n\r\n  const labelColor = theme.textTertiary || '#9CA3AF';\r\n  const valueColor = theme.textSecondary || '#D1D5DB';\r\n  const nameColor = theme.textPrimary || '#F9FAFB';\r\n  const accentColor = theme.accent || '#00E5CC';\r\n  const bgColor = theme.bgSecondary || '#1F2937';\r\n  const borderColor = theme.border || '#374151';\r\n\r\n  const tooltip = (\r\n    <div\r\n      style={{\r\n        position: 'fixed',\r\n        left: pos.left,\r\n        top: pos.top,\r\n        width: TOOLTIP_WIDTH,\r\n        zIndex: 99999,\r\n        pointerEvents: 'none',\r\n        fontFamily: 'Inter, system-ui, sans-serif',\r\n        animation: 'gantt-tooltip-fade 0.12s ease-out',\r\n      }}\r\n    >\r\n      <div\r\n        style={{\r\n          background: bgColor,\r\n          border: `1px solid ${borderColor}`,\r\n          borderRadius: 8,\r\n          padding: '12px 14px',\r\n          boxShadow: '0 8px 24px rgba(0,0,0,0.3)',\r\n        }}\r\n      >\r\n        {/* Task Name */}\r\n        <div style={{ fontSize: 13, fontWeight: 600, color: nameColor, marginBottom: 8, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n          {task.name}\r\n        </div>\r\n\r\n        {/* Info Grid */}\r\n        <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '3px 12px', fontSize: 11 }}>\r\n          <Row label={t.start} value={task.startDate ? formatDate(task.startDate) : 'N/A'} labelColor={labelColor} valueColor={valueColor} />\r\n          <Row label={t.duration} value={getDuration()} labelColor={labelColor} valueColor={valueColor} />\r\n          <Row label={t.end} value={task.endDate ? formatDate(task.endDate) : 'N/A'} labelColor={labelColor} valueColor={valueColor} />\r\n          <Row label={t.progress} value={`${task.progress}%`} labelColor={labelColor} valueColor={valueColor} />\r\n        </div>\r\n\r\n        {/* Assignees */}\r\n        {task.assignees && task.assignees.length > 0 && (\r\n          <div style={{ fontSize: 11, marginTop: 6 }}>\r\n            <span style={{ color: labelColor }}>{t.assignees}: </span>\r\n            <span style={{ color: valueColor, fontWeight: 500 }}>\r\n              {task.assignees.map(a => a.name).join(', ')}\r\n            </span>\r\n          </div>\r\n        )}\r\n\r\n        {/*\r\n          * ═══ LAS ETIQUETAS ═══════════════════════════════════════════════\r\n          *\r\n          * Divar, 27-ago: «poder ver el campo etiqueta cuando marco o creo una\r\n          * al hacer hover en la tarea de gantt».\r\n          *\r\n          * `task.tags` YA LLEGABA hasta aqui —el SaaS las carga y las asigna al\r\n          * mapear la tarea— y este tooltip no las miraba. Otra de las que se\r\n          * escriben y nadie lee.\r\n          *\r\n          * Se pintan CON SU COLOR, que es como se distinguen en el resto de la\r\n          * app: una lista de nombres en gris obligaria a recordar cual es cual.\r\n          */}\r\n        {task.tags && task.tags.length > 0 && (\r\n          <div style={{ marginTop: 6, fontSize: 11 }}>\r\n            <span style={{ color: labelColor }}>{t.tags}: </span>\r\n            <span style={{ display: 'inline-flex', flexWrap: 'wrap', gap: 4, verticalAlign: 'middle' }}>\r\n              {task.tags.map(tag => (\r\n                <span\r\n                  key={tag.id}\r\n                  style={{\r\n                    padding: '1px 6px',\r\n                    borderRadius: 4,\r\n                    fontSize: 10,\r\n                    fontWeight: 600,\r\n                    /*\r\n                     * El color de la etiqueta como FONDO tenue y como texto: un\r\n                     * relleno solido obligaria a calcular si el texto va en\r\n                     * blanco o negro para cada color que elija el usuario, y\r\n                     * con un color claro quedaria ilegible.\r\n                     */\r\n                    backgroundColor: `${tag.color}22`,\r\n                    color: tag.color,\r\n                    border: `1px solid ${tag.color}55`,\r\n                    whiteSpace: 'nowrap',\r\n                  }}\r\n                >\r\n                  {tag.name}\r\n                </span>\r\n              ))}\r\n            </span>\r\n          </div>\r\n        )}\r\n\r\n        {/* Time Tracking */}\r\n        {hasTimeData && (\r\n          <div style={{ marginTop: 6, display: 'flex', gap: 10, fontSize: 11 }}>\r\n            {task.effortMinutes != null && (\r\n              <span>\r\n                <span style={{ color: labelColor }}>{t.estimated}:</span>{' '}\r\n                <span style={{ color: valueColor, fontWeight: 600 }}>{formatMinutes(task.effortMinutes)}</span>\r\n              </span>\r\n            )}\r\n            {task.timeLoggedMinutes != null && (\r\n              <span>\r\n                <span style={{ color: labelColor }}>{t.logged}:</span>{' '}\r\n                <span style={{ color: accentColor, fontWeight: 600 }}>{formatMinutes(task.timeLoggedMinutes)}</span>\r\n              </span>\r\n            )}\r\n            {task.soldEffortMinutes != null && (\r\n              <span>\r\n                <span style={{ color: labelColor }}>{t.quoted}:</span>{' '}\r\n                <span style={{ color: valueColor, fontWeight: 600 }}>{formatMinutes(task.soldEffortMinutes)}</span>\r\n              </span>\r\n            )}\r\n          </div>\r\n        )}\r\n\r\n        {/* v2.7.0: Last activity — subtle 11px divider + one-line summary */}\r\n        {task.lastActivity && (\r\n          <div style={{\r\n            marginTop: 8,\r\n            paddingTop: 8,\r\n            borderTop: `1px solid ${theme?.borderSubtle || 'rgba(255,255,255,0.08)'}`,\r\n            fontSize: 11,\r\n            color: labelColor,\r\n            lineHeight: 1.4,\r\n          }}>\r\n            <span style={{ opacity: 0.7 }}>{locale === 'es' ? 'Último: ' : 'Last: '}</span>\r\n            <span style={{ color: valueColor }}>{task.lastActivity.userName}</span>{' '}\r\n            <span>{task.lastActivity.summary}</span>{' '}\r\n            <span style={{ opacity: 0.6 }}>{task.lastActivity.relativeTime}</span>\r\n          </div>\r\n        )}\r\n      </div>\r\n\r\n      {/* CSS animation */}\r\n      <style>{`\r\n        @keyframes gantt-tooltip-fade {\r\n          from { opacity: 0; transform: translateY(${pos.showBelow ? '-4px' : '4px'}); }\r\n          to { opacity: 1; transform: translateY(0); }\r\n        }\r\n      `}</style>\r\n    </div>\r\n  );\r\n\r\n  return createPortal(tooltip, document.body);\r\n}\r\n\r\n/** Simple label: value row */\r\nfunction Row({ label, value, labelColor, valueColor }: { label: string; value: string; labelColor: string; valueColor: string }) {\r\n  return (\r\n    <div>\r\n      <span style={{ color: labelColor }}>{label}: </span>\r\n      <span style={{ color: valueColor, fontWeight: 500 }}>{value}</span>\r\n    </div>\r\n  );\r\n}\r\n","import { useState } from 'react';\nimport { motion } from 'framer-motion';\nimport type { DependencyLineStyle } from './types';\n\n// v0.17.363: Simplified to single-layer rendering with correct ClickUp-style routing\n// Data for hover state (delete button position tracking)\nexport interface DependencyHoverData {\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n  onDelete: () => void;\n  lineStyle?: DependencyLineStyle;\n}\n\n// Keep old interface name for backwards compatibility\nexport type DependencyDeleteButtonData = DependencyHoverData;\n\ninterface DependencyLineProps {\n  x1: number; // Exit X (right side of source bar)\n  y1: number; // Exit Y (center of source bar)\n  x2: number; // Enter X (left side of destination bar)\n  y2: number; // Enter Y (center of destination bar)\n  theme: any;\n  onDelete?: () => void;\n  // v0.17.310: Dependency line style (curved or squared)\n  lineStyle?: DependencyLineStyle;\n  // v0.17.363: Is this line being rendered in the hover layer?\n  isHoverLayer?: boolean;\n  // v0.17.451: Callback when hover state changes (for z-order management)\n  onHoverChange?: (isHovered: boolean) => void;\n  // v0.17.451: Only render the hover overlay (for top-layer)\n  hoverOverlayOnly?: boolean;\n  // v5.1.0: CPM — override line/arrow color for critical dependencies\n  colorOverride?: string;\n  // v5.1.0: CPM — override stroke width\n  strokeWidthOverride?: number;\n  // v5.1.0: CPM — glow filter for critical deps\n  glowFilter?: string;\n}\n\n/**\n * v0.17.364: TRUE ClickUp-style dependency line routing\n *\n * RULES:\n * 1. Lines ALWAYS exit from the RIGHT side of the source bar\n * 2. Lines ALWAYS enter from the LEFT side of the destination bar\n * 3. The vertical segment is ALWAYS placed to the LEFT of the destination bar\n *\n * Pattern: source(right) → horizontal → vertical → horizontal → destination(left)\n *\n * For FORWARD dependencies (x2 > x1, destination RIGHT of source):\n *   The vertical segment is just before destination: turnX = x2 - OFFSET\n *   Path: right → horizontal → down/up → right into destination\n *\n * For BACKWARD dependencies (x2 <= x1, destination LEFT of or at same X as source):\n *   The vertical segment must still be LEFT of destination: turnX = x2 - OFFSET\n *   Path: right → horizontal past source → down/up → LEFT back to destination\n */\nexport function DependencyLine({\n  x1, y1, x2, y2,\n  theme,\n  onDelete,\n  lineStyle = 'curved',\n  isHoverLayer = false,\n  onHoverChange,\n  hoverOverlayOnly = false,\n  colorOverride,\n  strokeWidthOverride,\n  glowFilter,\n}: DependencyLineProps) {\n  // v0.17.451: Local hover state only used for tracking, actual rendering done via Timeline\n  const [, setIsLocalHovered] = useState(false);\n  const [mousePos, setMousePos] = useState<{ x: number; y: number } | null>(null);\n\n  const dy = y2 - y1;\n  const goingDown = dy > 0;\n  const isSameRow = Math.abs(dy) < 5;\n\n  // OFFSET from bars for the vertical segment\n  const OFFSET = 20;\n\n  // v0.17.366: isBackward needs to be defined outside the else block for delete button positioning\n  const isBackward = !isSameRow && x2 <= x1;\n\n  let path: string;\n  let turnX: number;\n\n  // v0.17.440: Original elegant S-curve for curved style, squared routing for squared style\n  const dx = x2 - x1;\n  const midX = x1 + dx / 2;\n  turnX = midX; // Default for delete button positioning\n\n  // v5.0.0: Rounded corner radius for squared dependency lines\n  const R = 8;\n\n  if (lineStyle === 'squared') {\n    // Squared style with rounded corners (8px radius at each turn)\n    if (isSameRow) {\n      path = `M ${x1} ${y1} L ${x2} ${y2}`;\n    } else if (isBackward) {\n      const exitPadding = 15;\n      const firstTurnX = x1 + exitPadding;\n      const secondTurnX = x2 - OFFSET;\n      const bridgeY = goingDown ? y1 + 20 : y1 - 20;\n      turnX = secondTurnX;\n      const dY1 = goingDown ? 1 : -1; // direction sign for vertical movement\n\n      path = `M ${x1} ${y1} ` +\n             `L ${firstTurnX - R} ${y1} ` +\n             `Q ${firstTurnX} ${y1} ${firstTurnX} ${y1 + dY1 * R} ` +\n             `L ${firstTurnX} ${bridgeY - dY1 * R} ` +\n             `Q ${firstTurnX} ${bridgeY} ${firstTurnX - R} ${bridgeY} ` +\n             `L ${secondTurnX + R} ${bridgeY} ` +\n             `Q ${secondTurnX} ${bridgeY} ${secondTurnX} ${bridgeY + dY1 * R} ` +\n             `L ${secondTurnX} ${y2 - dY1 * R} ` +\n             `Q ${secondTurnX} ${y2} ${secondTurnX + R} ${y2} ` +\n             `L ${x2} ${y2}`;\n    } else {\n      turnX = x2 - OFFSET;\n      const dY1 = goingDown ? 1 : -1;\n\n      path = `M ${x1} ${y1} ` +\n             `L ${turnX - R} ${y1} ` +\n             `Q ${turnX} ${y1} ${turnX} ${y1 + dY1 * R} ` +\n             `L ${turnX} ${y2 - dY1 * R} ` +\n             `Q ${turnX} ${y2} ${turnX + R} ${y2} ` +\n             `L ${x2} ${y2}`;\n    }\n  } else {\n    // v0.17.440: ORIGINAL elegant S-curve - simple Bézier, no routing logic\n    // This is the exact curve from before the squared option was added\n    path = `M ${x1} ${y1} C ${midX} ${y1}, ${midX} ${y2}, ${x2} ${y2}`;\n  }\n\n  // v5.0.0: Arrow marker — filled triangle 6x5px pointing RIGHT\n  const arrowW = 6;\n  const arrowH = 5;\n  const arrowPath = `M ${x2} ${y2} L ${x2 - arrowW} ${y2 - arrowH / 2} L ${x2 - arrowW} ${y2 + arrowH / 2} Z`;\n\n  // v5.0.0: Dependencies ALWAYS neutral — never inherit task state color\n  // v5.1.0: CPM can override color for critical dependencies\n  const isDarkTheme = !theme.bgPrimary || theme.bgPrimary.startsWith('#0') || theme.bgPrimary.startsWith('#1');\n  const lineColor = colorOverride || (isDarkTheme ? 'rgba(255,255,255,0.25)' : 'rgba(0,0,0,0.20)');\n  const baseStrokeWidth = strokeWidthOverride || 1;\n  const hoverColor = theme.dependencyHover || (isDarkTheme ? 'rgba(255,255,255,0.5)' : 'rgba(0,0,0,0.45)');\n\n  // Delete button colors\n  const deleteColor = '#f87171';\n  const deleteColorSoft = 'rgba(248, 113, 113, 0.15)';\n\n  // Delete button position - follows cursor along the line, projected onto nearest segment\n  // Default: midpoint of the line\n  let deleteX = turnX;\n  let deleteY = (y1 + y2) / 2;\n\n  if (mousePos) {\n    if (lineStyle === 'squared') {\n      if (isSameRow) {\n        deleteX = Math.max(x1 + 10, Math.min(x2 - 10, mousePos.x));\n        deleteY = y1;\n      } else if (isBackward) {\n        const firstTurnX = x1 + 15;\n        const secondTurnX = x2 - OFFSET;\n        const bridgeY = goingDown ? y1 + 20 : y1 - 20;\n\n        const segments: [number, number, number, number][] = [\n          [x1, y1, firstTurnX, y1],\n          [firstTurnX, y1, firstTurnX, bridgeY],\n          [firstTurnX, bridgeY, secondTurnX, bridgeY],\n          [secondTurnX, bridgeY, secondTurnX, y2],\n          [secondTurnX, y2, x2, y2],\n        ];\n\n        let minDist = Infinity;\n        let closestPoint = { x: deleteX, y: deleteY };\n\n        for (const seg of segments) {\n          const point = projectPointOnSegment(mousePos.x, mousePos.y, seg[0], seg[1], seg[2], seg[3]);\n          const dist = Math.hypot(mousePos.x - point.x, mousePos.y - point.y);\n          if (dist < minDist) {\n            minDist = dist;\n            closestPoint = point;\n          }\n        }\n\n        deleteX = closestPoint.x;\n        deleteY = closestPoint.y;\n      } else {\n        const segments: [number, number, number, number][] = [\n          [x1, y1, turnX, y1],\n          [turnX, y1, turnX, y2],\n          [turnX, y2, x2, y2],\n        ];\n\n        let minDist = Infinity;\n        let closestPoint = { x: deleteX, y: deleteY };\n\n        for (const seg of segments) {\n          const point = projectPointOnSegment(mousePos.x, mousePos.y, seg[0], seg[1], seg[2], seg[3]);\n          const dist = Math.hypot(mousePos.x - point.x, mousePos.y - point.y);\n          if (dist < minDist) {\n            minDist = dist;\n            closestPoint = point;\n          }\n        }\n\n        deleteX = closestPoint.x;\n        deleteY = closestPoint.y;\n      }\n    } else {\n      // Curved: sample the Bézier and find closest point\n      const cp1x = midX, cp1y = y1, cp2x = midX, cp2y = y2;\n      let minDist = Infinity;\n      let bestX = deleteX, bestY = deleteY;\n      for (let t = 0; t <= 1; t += 0.02) {\n        const it = 1 - t;\n        const bx = it*it*it*x1 + 3*it*it*t*cp1x + 3*it*t*t*cp2x + t*t*t*x2;\n        const by = it*it*it*y1 + 3*it*it*t*cp1y + 3*it*t*t*cp2y + t*t*t*y2;\n        const d = Math.hypot(mousePos.x - bx, mousePos.y - by);\n        if (d < minDist) {\n          minDist = d;\n          bestX = bx;\n          bestY = by;\n        }\n      }\n      deleteX = bestX;\n      deleteY = bestY;\n    }\n  }\n\n  // Helper function to project a point onto a line segment\n  function projectPointOnSegment(px: number, py: number, sx1: number, sy1: number, sx2: number, sy2: number) {\n    const sdx = sx2 - sx1;\n    const sdy = sy2 - sy1;\n    const lenSq = sdx * sdx + sdy * sdy;\n\n    if (lenSq === 0) return { x: sx1, y: sy1 };\n\n    let t = ((px - sx1) * sdx + (py - sy1) * sdy) / lenSq;\n    t = Math.max(0, Math.min(1, t));\n\n    return {\n      x: sx1 + t * sdx,\n      y: sy1 + t * sdy,\n    };\n  }\n\n  // v1.4.27: Use SVG getScreenCTM() for accurate mouse→SVG coordinate conversion\n  // This correctly handles scroll offsets, zoom, and any CSS transforms on parent elements\n  const handleMouseMove = (e: React.MouseEvent<SVGElement>) => {\n    const svg = e.currentTarget.ownerSVGElement;\n    if (!svg) return;\n\n    const ctm = svg.getScreenCTM();\n    if (!ctm) return;\n\n    const inverseCTM = ctm.inverse();\n    setMousePos({\n      x: inverseCTM.a * e.clientX + inverseCTM.c * e.clientY + inverseCTM.e,\n      y: inverseCTM.b * e.clientX + inverseCTM.d * e.clientY + inverseCTM.f,\n    });\n  };\n\n  const handleMouseLeave = () => {\n    setIsLocalHovered(false);\n    setMousePos(null);\n    onHoverChange?.(false);\n  };\n\n  const handleMouseEnter = () => {\n    setIsLocalHovered(true);\n    onHoverChange?.(true);\n  };\n\n  // Render the delete button SVG elements\n  const renderDeleteButton = (animInitial: Record<string, any>) => {\n    if (!onDelete) return null;\n    return (\n      <motion.g\n        initial={animInitial}\n        animate={{ opacity: 1, scale: 1 }}\n        transition={{ duration: 0.15, ease: 'easeOut' }}\n        onClick={(e) => {\n          e.stopPropagation();\n          onDelete();\n        }}\n        style={{ cursor: 'pointer', pointerEvents: 'auto' }}\n      >\n        {/* Larger invisible hit area so the X is easy to click */}\n        <circle\n          cx={deleteX}\n          cy={deleteY}\n          r={16}\n          fill=\"transparent\"\n          style={{ cursor: 'pointer' }}\n        />\n        <circle\n          cx={deleteX}\n          cy={deleteY}\n          r={9}\n          fill={deleteColorSoft}\n          stroke={deleteColor}\n          strokeWidth={1.5}\n          style={{ pointerEvents: 'none' }}\n        />\n        <line\n          x1={deleteX - 3}\n          y1={deleteY - 3}\n          x2={deleteX + 3}\n          y2={deleteY + 3}\n          stroke={deleteColor}\n          strokeWidth={1.5}\n          strokeLinecap=\"round\"\n          style={{ pointerEvents: 'none' }}\n        />\n        <line\n          x1={deleteX + 3}\n          y1={deleteY - 3}\n          x2={deleteX - 3}\n          y2={deleteY + 3}\n          stroke={deleteColor}\n          strokeWidth={1.5}\n          strokeLinecap=\"round\"\n          style={{ pointerEvents: 'none' }}\n        />\n      </motion.g>\n    );\n  };\n\n  // For hover layer, we render with glow effect\n  if (isHoverLayer) {\n    return (\n      <g\n        data-dependency-line=\"true\"\n        onMouseLeave={handleMouseLeave}\n        onMouseMove={handleMouseMove}\n      >\n        {/* Wider hover detection area */}\n        <path\n          d={path}\n          fill=\"none\"\n          stroke=\"transparent\"\n          strokeWidth={20}\n          strokeLinecap=\"round\"\n          style={{ cursor: 'pointer' }}\n        />\n\n        {/* Glow effect layer */}\n        <path\n          d={path}\n          fill=\"none\"\n          stroke={hoverColor}\n          strokeWidth={8}\n          strokeLinecap=\"round\"\n          opacity={0.15}\n          style={{ pointerEvents: 'none', filter: 'blur(4px)' }}\n        />\n\n        {/* Highlighted dependency line */}\n        <path\n          d={path}\n          fill=\"none\"\n          stroke={hoverColor}\n          strokeWidth={2.5}\n          strokeLinecap=\"round\"\n          opacity={0.9}\n          style={{ pointerEvents: 'none' }}\n        />\n\n        {/* Arrow head — filled triangle */}\n        <path\n          d={arrowPath}\n          fill={hoverColor}\n          stroke=\"none\"\n          opacity={0.9}\n          style={{ pointerEvents: 'none' }}\n        />\n\n        {/* Endpoint dot */}\n        <circle\n          cx={x2}\n          cy={y2}\n          r={4}\n          fill={hoverColor}\n          opacity={0.9}\n          style={{ pointerEvents: 'none' }}\n        />\n\n        {/* Delete button */}\n        {renderDeleteButton({ opacity: 0, scale: 0.8 })}\n      </g>\n    );\n  }\n\n  // v0.17.451: If hoverOverlayOnly, only render the hover overlay for top-layer\n  if (hoverOverlayOnly) {\n    return (\n      <g\n        data-dependency-hover-overlay=\"true\"\n        onMouseEnter={handleMouseEnter}\n        onMouseLeave={handleMouseLeave}\n        onMouseMove={handleMouseMove}\n        style={{ cursor: onDelete ? 'pointer' : 'default' }}\n      >\n        {/* Invisible wider path for hover detection */}\n        <path\n          d={path}\n          fill=\"none\"\n          stroke=\"transparent\"\n          strokeWidth={16}\n          strokeLinecap=\"round\"\n          style={{ cursor: onDelete ? 'pointer' : 'default' }}\n        />\n        {/* Background cover - hide gray lines underneath */}\n        <path\n          d={path}\n          fill=\"none\"\n          stroke={theme.bgPrimary || '#1A1D21'}\n          strokeWidth={4}\n          strokeLinecap=\"round\"\n          style={{ pointerEvents: 'none' }}\n        />\n        {/* Subtle outer glow - very light */}\n        <path\n          d={path}\n          fill=\"none\"\n          stroke={hoverColor}\n          strokeWidth={5}\n          strokeLinecap=\"round\"\n          opacity={0.12}\n          style={{ pointerEvents: 'none' }}\n        />\n        {/* Main highlighted line */}\n        <path\n          d={path}\n          fill=\"none\"\n          stroke={hoverColor}\n          strokeWidth={1.5}\n          strokeLinecap=\"round\"\n          style={{ pointerEvents: 'none' }}\n        />\n        {/* Highlighted arrow — filled triangle */}\n        <path\n          d={arrowPath}\n          fill={hoverColor}\n          stroke=\"none\"\n          style={{ pointerEvents: 'none' }}\n        />\n        {/* Highlighted dot - slightly larger */}\n        <circle\n          cx={x2}\n          cy={y2}\n          r={3.5}\n          fill={hoverColor}\n          style={{ pointerEvents: 'none' }}\n        />\n        {/* Delete button */}\n        {renderDeleteButton({ opacity: 0, scale: 0 })}\n      </g>\n    );\n  }\n\n  // Base layer rendering (non-hover)\n  return (\n    <g\n      data-dependency-line=\"true\"\n      onMouseEnter={handleMouseEnter}\n      onMouseLeave={handleMouseLeave}\n      onMouseMove={handleMouseMove}\n      style={{ cursor: onDelete ? 'pointer' : 'default' }}\n    >\n      {/* Invisible wider path for easier hover detection */}\n      <path\n        d={path}\n        fill=\"none\"\n        stroke=\"transparent\"\n        strokeWidth={16}\n        strokeLinecap=\"round\"\n        style={{ cursor: onDelete ? 'pointer' : 'default' }}\n      />\n\n      {/* Main dependency line - base layer */}\n      <motion.path\n        d={path}\n        fill=\"none\"\n        stroke={lineColor}\n        strokeWidth={baseStrokeWidth}\n        strokeLinecap=\"round\"\n        initial={{ pathLength: 0, opacity: 0 }}\n        animate={{ pathLength: 1, opacity: 1 }}\n        transition={{\n          pathLength: { duration: 0.5, ease: 'easeInOut' },\n          opacity: { duration: 0.2 },\n        }}\n        style={{ pointerEvents: 'none', filter: glowFilter || 'none' }}\n      />\n\n      {/* Arrow head - filled triangle */}\n      <motion.path\n        d={arrowPath}\n        fill={lineColor}\n        stroke=\"none\"\n        initial={{ opacity: 0 }}\n        animate={{ opacity: 1 }}\n        transition={{ duration: 0.2, delay: 0.3 }}\n        style={{ pointerEvents: 'none' }}\n      />\n\n      {/* Endpoint dot - base layer */}\n      <motion.circle\n        cx={x2}\n        cy={y2}\n        r={3}\n        fill={lineColor}\n        initial={{ scale: 0 }}\n        animate={{ scale: 1 }}\n        transition={{ delay: 0.3, duration: 0.15 }}\n        style={{ pointerEvents: 'none' }}\n      />\n\n      {/* v0.17.451: Hover overlay is now rendered in a separate top-layer via Timeline */}\n    </g>\n  );\n}\n","import { useState } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { Task } from './types';\r\n\r\ninterface MilestoneProps {\r\n  task: Task;\r\n  x: number;\r\n  y: number;\r\n  theme: any;\r\n  onClick?: (task: Task) => void;\r\n}\r\n\r\nexport function Milestone({ task, x, y, theme, onClick }: MilestoneProps) {\r\n  const [isHovered, setIsHovered] = useState(false);\r\n  const size = 16;\r\n\r\n  // Format date for tooltip\r\n  const formatDate = (date: Date) => {\r\n    return date.toLocaleDateString('en-US', {\r\n      month: 'short',\r\n      day: 'numeric',\r\n      year: 'numeric',\r\n    });\r\n  };\r\n\r\n  return (\r\n    <g\r\n      data-task-bar=\"true\"\r\n      data-estado=\"milestone\"\r\n      onMouseEnter={() => setIsHovered(true)}\r\n      onMouseLeave={() => setIsHovered(false)}\r\n      onClick={() => onClick?.(task)}\r\n      style={{ cursor: 'pointer' }}\r\n    >\r\n      {/* Critical Path Glow (if applicable) */}\r\n      {task.isCriticalPath && (\r\n        <motion.circle\r\n          cx={x}\r\n          cy={y + 16}\r\n          r={size + 4}\r\n          fill={theme.criticalPathLight}\r\n          initial={{ scale: 0 }}\r\n          animate={{ scale: isHovered ? 1.2 : 1 }}\r\n          transition={{ duration: 0.3 }}\r\n        />\r\n      )}\r\n\r\n      {/* Diamond Shape (rotated square) */}\r\n      <motion.rect\r\n        data-parte=\"rombo\"\r\n        x={x - size / 2}\r\n        y={y + 16 - size / 2}\r\n        width={size}\r\n        height={size}\r\n        fill={task.isCriticalPath ? theme.criticalPath : theme.milestone}\r\n        stroke={theme.bgGrid}\r\n        strokeWidth={2}\r\n        transform={`rotate(45 ${x} ${y + 16})`}\r\n        initial={{ scale: 0, rotate: 0 }}\r\n        animate={{\r\n          scale: isHovered ? 1.15 : 1,\r\n          rotate: 45,\r\n        }}\r\n        transition={{\r\n          duration: 0.3,\r\n          type: 'spring',\r\n          stiffness: 300,\r\n          damping: 20,\r\n        }}\r\n      />\r\n\r\n      {/* Hover Effect - Outer Ring */}\r\n      {isHovered && (\r\n        <motion.rect\r\n          x={x - (size + 4) / 2}\r\n          y={y + 16 - (size + 4) / 2}\r\n          width={size + 4}\r\n          height={size + 4}\r\n          fill=\"none\"\r\n          stroke={task.isCriticalPath ? theme.criticalPath : theme.milestone}\r\n          strokeWidth={2}\r\n          opacity={0.5}\r\n          transform={`rotate(45 ${x} ${y + 16})`}\r\n          initial={{ scale: 0.8, opacity: 0 }}\r\n          animate={{ scale: 1, opacity: 0.5 }}\r\n          transition={{ duration: 0.2 }}\r\n        />\r\n      )}\r\n\r\n      {/* Enhanced Tooltip */}\r\n      <AnimatePresence>\r\n        {isHovered && (\r\n          <motion.g\r\n            initial={{ opacity: 0, y: 10 }}\r\n            animate={{ opacity: 1, y: 0 }}\r\n            exit={{ opacity: 0, y: 10 }}\r\n            transition={{ duration: 0.2 }}\r\n          >\r\n            {/* Tooltip Background */}\r\n            <rect\r\n              x={x - 80}\r\n              y={y - 50}\r\n              width={160}\r\n              height={44}\r\n              rx={8}\r\n              fill={theme.bgSecondary}\r\n              stroke={theme.border}\r\n              strokeWidth={1}\r\n              filter=\"drop-shadow(0 4px 12px rgba(0, 0, 0, 0.15))\"\r\n            />\r\n\r\n            {/* Tooltip Arrow */}\r\n            <path\r\n              d={`M ${x - 6} ${y - 6} L ${x} ${y + 4} L ${x + 6} ${y - 6}`}\r\n              fill={theme.bgSecondary}\r\n              stroke={theme.border}\r\n              strokeWidth={1}\r\n            />\r\n\r\n            {/* Milestone Icon in Tooltip */}\r\n            <rect\r\n              x={x - 70}\r\n              y={y - 38}\r\n              width={8}\r\n              height={8}\r\n              fill={task.isCriticalPath ? theme.criticalPath : theme.milestone}\r\n              transform={`rotate(45 ${x - 66} ${y - 34})`}\r\n            />\r\n\r\n            {/* Task Name */}\r\n            <text\r\n              x={x - 55}\r\n              y={y - 32}\r\n              fill={theme.textPrimary}\r\n              fontSize=\"12\"\r\n              fontWeight=\"600\"\r\n              fontFamily=\"Inter, sans-serif\"\r\n            >\r\n              {task.name.length > 18 ? `${task.name.substring(0, 18)}...` : task.name}\r\n            </text>\r\n\r\n            {/* Date */}\r\n            <text\r\n              x={x - 55}\r\n              y={y - 18}\r\n              fill={theme.textTertiary}\r\n              fontSize=\"10\"\r\n              fontFamily=\"Inter, sans-serif\"\r\n            >\r\n              {formatDate(task.startDate!)}\r\n            </text>\r\n\r\n            {/* Critical Path Badge */}\r\n            {task.isCriticalPath && (\r\n              <g>\r\n                <rect\r\n                  x={x + 10}\r\n                  y={y - 40}\r\n                  width={60}\r\n                  height={16}\r\n                  rx={4}\r\n                  fill={theme.criticalPathLight}\r\n                />\r\n                <text\r\n                  x={x + 40}\r\n                  y={y - 30}\r\n                  textAnchor=\"middle\"\r\n                  fill={theme.criticalPath}\r\n                  fontSize=\"9\"\r\n                  fontWeight=\"700\"\r\n                  fontFamily=\"Inter, sans-serif\"\r\n                  letterSpacing=\"0.5\"\r\n                >\r\n                  CRITICAL\r\n                </text>\r\n              </g>\r\n            )}\r\n          </motion.g>\r\n        )}\r\n      </AnimatePresence>\r\n    </g>\r\n  );\r\n}","import { Task, TaskSegment } from './types';\n\n/**\n * Public utility functions for Gantt operations\n * Similar to DHTMLX gantt.* utility methods\n */\nexport const ganttUtils = {\n  /**\n   * Calculate end date based on start date and duration in days\n   * @param start - Start date\n   * @param durationDays - Duration in days\n   * @returns End date\n   */\n  calculateEndDate: (start: Date, durationDays: number): Date => {\n    const end = new Date(start);\n    end.setDate(end.getDate() + durationDays);\n    return end;\n  },\n\n  /**\n   * Calculate duration in days between two dates\n   * @param start - Start date\n   * @param end - End date\n   * @returns Duration in days (rounded up)\n   */\n  calculateDuration: (start: Date, end: Date): number => {\n    const diffMs = end.getTime() - start.getTime();\n    return Math.ceil(diffMs / (1000 * 60 * 60 * 24));\n  },\n\n  /**\n   * Calculate working days between two dates (excluding weekends)\n   * @param start - Start date\n   * @param end - End date\n   * @returns Number of working days\n   */\n  calculateWorkingDays: (start: Date, end: Date): number => {\n    let count = 0;\n    const current = new Date(start);\n\n    while (current <= end) {\n      const dayOfWeek = current.getDay();\n      if (dayOfWeek !== 0 && dayOfWeek !== 6) { // Not Sunday (0) or Saturday (6)\n        count++;\n      }\n      current.setDate(current.getDate() + 1);\n    }\n\n    return count;\n  },\n\n  /**\n   * Add working days to a date (excluding weekends)\n   * @param start - Start date\n   * @param workingDays - Number of working days to add\n   * @returns End date\n   */\n  addWorkingDays: (start: Date, workingDays: number): Date => {\n    const result = new Date(start);\n    let daysAdded = 0;\n\n    while (daysAdded < workingDays) {\n      result.setDate(result.getDate() + 1);\n      const dayOfWeek = result.getDay();\n      if (dayOfWeek !== 0 && dayOfWeek !== 6) {\n        daysAdded++;\n      }\n    }\n\n    return result;\n  },\n\n  /**\n   * Check if a date is a weekend\n   * @param date - Date to check\n   * @returns True if weekend\n   */\n  isWeekend: (date: Date): boolean => {\n    const dayOfWeek = date.getDay();\n    return dayOfWeek === 0 || dayOfWeek === 6;\n  },\n\n  /**\n   * Validate if creating a dependency would create a circular reference\n   * Uses Depth-First Search (DFS) algorithm\n   * @param tasks - All tasks\n   * @param fromTaskId - Source task ID\n   * @param toTaskId - Target task ID\n   * @returns True if would create circular dependency\n   */\n  validateDependencies: (tasks: Task[], fromTaskId: string, toTaskId: string): boolean => {\n    // Build dependency map\n    const dependencyMap = new Map<string, string[]>();\n\n    const buildMap = (taskList: Task[]) => {\n      taskList.forEach(task => {\n        if (task.dependencies) {\n          dependencyMap.set(task.id, task.dependencies);\n        }\n        if (task.subtasks) {\n          buildMap(task.subtasks);\n        }\n      });\n    };\n\n    buildMap(tasks);\n\n    // Simulate adding the new dependency\n    const existingDeps = dependencyMap.get(toTaskId) || [];\n    dependencyMap.set(toTaskId, [...existingDeps, fromTaskId]);\n\n    // DFS to detect cycle\n    const visited = new Set<string>();\n    const recStack = new Set<string>();\n\n    const hasCycle = (taskId: string): boolean => {\n      if (!visited.has(taskId)) {\n        visited.add(taskId);\n        recStack.add(taskId);\n\n        const deps = dependencyMap.get(taskId) || [];\n        for (const depId of deps) {\n          if (!visited.has(depId) && hasCycle(depId)) {\n            return true;\n          } else if (recStack.has(depId)) {\n            return true;\n          }\n        }\n      }\n      recStack.delete(taskId);\n      return false;\n    };\n\n    return hasCycle(toTaskId);\n  },\n\n  /**\n   * Flatten nested tasks into a single array\n   * @param tasks - Tasks with potential subtasks\n   * @returns Flat array of all tasks\n   */\n  flattenTasks: (tasks: Task[]): Task[] => {\n    const result: Task[] = [];\n\n    const flatten = (taskList: Task[]) => {\n      // Sort by position to maintain creation order\n      const sortedList = [...taskList].sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n      sortedList.forEach(task => {\n        result.push(task);\n        if (task.subtasks && task.subtasks.length > 0) {\n          flatten(task.subtasks);\n        }\n      });\n    };\n\n    flatten(tasks);\n    return result;\n  },\n\n  /**\n   * Find a task by ID in nested structure\n   * @param tasks - Tasks to search\n   * @param taskId - ID to find\n   * @returns Task if found, undefined otherwise\n   */\n  findTaskById: (tasks: Task[], taskId: string): Task | undefined => {\n    for (const task of tasks) {\n      if (task.id === taskId) {\n        return task;\n      }\n      if (task.subtasks) {\n        const found = ganttUtils.findTaskById(task.subtasks, taskId);\n        if (found) return found;\n      }\n    }\n    return undefined;\n  },\n\n  /**\n   * Get all parent tasks recursively\n   * @param tasks - All tasks\n   * @param taskId - Child task ID\n   * @returns Array of parent tasks\n   */\n  getParentTasks: (tasks: Task[], taskId: string): Task[] => {\n    const parents: Task[] = [];\n    const task = ganttUtils.findTaskById(tasks, taskId);\n\n    if (!task || !task.parentId) return parents;\n\n    let currentId: string | undefined = task.parentId;\n    while (currentId) {\n      const parent = ganttUtils.findTaskById(tasks, currentId);\n      if (parent) {\n        parents.unshift(parent);\n        currentId = parent.parentId;\n      } else {\n        break;\n      }\n    }\n\n    return parents;\n  },\n\n  /**\n   * Export tasks to JSON string\n   * @param tasks - Tasks to export\n   * @returns JSON string\n   */\n  exportToJSON: (tasks: Task[]): string => {\n    return JSON.stringify(tasks, null, 2);\n  },\n\n  /**\n   * Import tasks from JSON string\n   * @param json - JSON string\n   * @returns Parsed tasks\n   */\n  importFromJSON: (json: string): Task[] => {\n    try {\n      const parsed = JSON.parse(json);\n\n      // Validate it's an array\n      if (!Array.isArray(parsed)) {\n        throw new Error('Invalid JSON: expected an array of tasks');\n      }\n\n      // Basic validation of task structure\n      parsed.forEach((task, index) => {\n        if (!task.id || !task.name) {\n          throw new Error(`Invalid task at index ${index}: missing required fields (id, name)`);\n        }\n      });\n\n      return parsed;\n    } catch (error) {\n      throw new Error(`Failed to import tasks: ${error instanceof Error ? error.message : 'Unknown error'}`);\n    }\n  },\n\n  /**\n   * Export tasks to CSV format\n   * @param tasks - Tasks to export\n   * @returns CSV string\n   */\n  exportToCSV: (tasks: Task[]): string => {\n    const flat = ganttUtils.flattenTasks(tasks);\n\n    // CSV Headers\n    const headers = ['ID', 'Name', 'Start Date', 'End Date', 'Progress', 'Status', 'Dependencies'];\n    const rows: string[] = [headers.join(',')];\n\n    // CSV Data\n    flat.forEach(task => {\n      const row = [\n        task.id,\n        `\"${task.name.replace(/\"/g, '\"\"')}\"`, // Escape quotes in name\n        task.startDate ? task.startDate.toISOString().split('T')[0] : '',\n        task.endDate ? task.endDate.toISOString().split('T')[0] : '',\n        task.progress.toString(),\n        task.status || '',\n        task.dependencies?.join(';') || '',\n      ];\n      rows.push(row.join(','));\n    });\n\n    return rows.join('\\n');\n  },\n\n  /**\n   * Format date to string (YYYY-MM-DD)\n   * @param date - Date to format\n   * @returns Formatted string\n   */\n  formatDate: (date: Date): string => {\n    const year = date.getFullYear();\n    const month = String(date.getMonth() + 1).padStart(2, '0');\n    const day = String(date.getDate()).padStart(2, '0');\n    return `${year}-${month}-${day}`;\n  },\n\n  /**\n   * Parse date from string (YYYY-MM-DD)\n   * @param dateString - Date string\n   * @returns Parsed Date\n   */\n  parseDate: (dateString: string): Date => {\n    return new Date(dateString);\n  },\n\n  /**\n   * Get date range for a task\n   * @param task - Task to get range for\n   * @returns Object with start and end dates, or null if no dates\n   */\n  getTaskDateRange: (task: Task): { start: Date; end: Date } | null => {\n    if (!task.startDate || !task.endDate) return null;\n    return {\n      start: task.startDate,\n      end: task.endDate,\n    };\n  },\n\n  /**\n   * Get the earliest start date from tasks\n   * @param tasks - Tasks to search\n   * @returns Earliest date or null\n   */\n  getEarliestStartDate: (tasks: Task[]): Date | null => {\n    const flat = ganttUtils.flattenTasks(tasks);\n    const tasksWithDates = flat.filter(t => t.startDate);\n\n    if (tasksWithDates.length === 0) return null;\n\n    return new Date(Math.min(...tasksWithDates.map(t => t.startDate!.getTime())));\n  },\n\n  /**\n   * Get the latest end date from tasks\n   * @param tasks - Tasks to search\n   * @returns Latest date or null\n   */\n  getLatestEndDate: (tasks: Task[]): Date | null => {\n    const flat = ganttUtils.flattenTasks(tasks);\n    const tasksWithDates = flat.filter(t => t.endDate);\n\n    if (tasksWithDates.length === 0) return null;\n\n    return new Date(Math.max(...tasksWithDates.map(t => t.endDate!.getTime())));\n  },\n\n  /**\n   * Check if two tasks overlap in time\n   * @param task1 - First task\n   * @param task2 - Second task\n   * @returns True if tasks overlap\n   */\n  tasksOverlap: (task1: Task, task2: Task): boolean => {\n    if (!task1.startDate || !task1.endDate || !task2.startDate || !task2.endDate) {\n      return false;\n    }\n\n    return task1.startDate <= task2.endDate && task2.startDate <= task1.endDate;\n  },\n\n  /**\n   * Get all tasks that depend on a given task (children in dependency tree)\n   * @param tasks - All tasks\n   * @param taskId - Task ID to find dependents for\n   * @returns Array of tasks that depend on this task\n   */\n  getDependentTasks: (tasks: Task[], taskId: string): Task[] => {\n    const flat = ganttUtils.flattenTasks(tasks);\n    return flat.filter(task =>\n      task.dependencies && task.dependencies.includes(taskId)\n    );\n  },\n\n  /**\n   * Get all tasks that a given task depends on (parents in dependency tree)\n   * @param tasks - All tasks\n   * @param taskId - Task ID to find dependencies for\n   * @returns Array of tasks this task depends on\n   */\n  getDependencyTasks: (tasks: Task[], taskId: string): Task[] => {\n    const task = ganttUtils.findTaskById(tasks, taskId);\n    if (!task || !task.dependencies) return [];\n\n    const flat = ganttUtils.flattenTasks(tasks);\n    return flat.filter(t => task.dependencies!.includes(t.id));\n  },\n\n  /**\n   * Filter tasks by status\n   * @param tasks - Tasks to filter\n   * @param status - Status to filter by\n   * @returns Filtered tasks\n   */\n  filterByStatus: (tasks: Task[], status: 'todo' | 'in-progress' | 'completed'): Task[] => {\n    return ganttUtils.flattenTasks(tasks).filter(t => t.status === status);\n  },\n\n  /**\n   * Filter tasks by date range\n   * @param tasks - Tasks to filter\n   * @param startDate - Range start\n   * @param endDate - Range end\n   * @returns Tasks that fall within the date range\n   */\n  filterByDateRange: (tasks: Task[], startDate: Date, endDate: Date): Task[] => {\n    return ganttUtils.flattenTasks(tasks).filter(task => {\n      if (!task.startDate || !task.endDate) return false;\n      return task.startDate <= endDate && task.endDate >= startDate;\n    });\n  },\n\n  /**\n   * Sort tasks by start date\n   * @param tasks - Tasks to sort\n   * @param ascending - Sort ascending (default) or descending\n   * @returns Sorted tasks\n   */\n  sortByStartDate: (tasks: Task[], ascending = true): Task[] => {\n    return [...tasks].sort((a, b) => {\n      if (!a.startDate || !b.startDate) return 0;\n      const diff = a.startDate.getTime() - b.startDate.getTime();\n      return ascending ? diff : -diff;\n    });\n  },\n\n  /**\n   * Sort tasks by end date\n   * @param tasks - Tasks to sort\n   * @param ascending - Sort ascending (default) or descending\n   * @returns Sorted tasks\n   */\n  sortByEndDate: (tasks: Task[], ascending = true): Task[] => {\n    return [...tasks].sort((a, b) => {\n      if (!a.endDate || !b.endDate) return 0;\n      const diff = a.endDate.getTime() - b.endDate.getTime();\n      return ascending ? diff : -diff;\n    });\n  },\n\n  /**\n   * Sort tasks by progress\n   * @param tasks - Tasks to sort\n   * @param ascending - Sort ascending (default) or descending\n   * @returns Sorted tasks\n   */\n  sortByProgress: (tasks: Task[], ascending = true): Task[] => {\n    return [...tasks].sort((a, b) => {\n      const diff = a.progress - b.progress;\n      return ascending ? diff : -diff;\n    });\n  },\n\n  /**\n   * Calculate total progress across all tasks\n   * @param tasks - Tasks to calculate\n   * @returns Average progress percentage\n   */\n  calculateTotalProgress: (tasks: Task[]): number => {\n    const flat = ganttUtils.flattenTasks(tasks);\n    if (flat.length === 0) return 0;\n\n    const total = flat.reduce((sum, task) => sum + task.progress, 0);\n    return Math.round(total / flat.length);\n  },\n\n  /**\n   * Get task by path (array of indices in nested structure)\n   * @param tasks - Root tasks\n   * @param path - Array of indices [0, 2, 1] means tasks[0].subtasks[2].subtasks[1]\n   * @returns Task at path or undefined\n   */\n  getTaskByPath: (tasks: Task[], path: number[]): Task | undefined => {\n    let current: Task[] = tasks;\n    let task: Task | undefined;\n\n    for (let i = 0; i < path.length; i++) {\n      const index = path[i];\n      if (!current || index === undefined || index >= current.length) return undefined;\n\n      task = current[index];\n      if (!task) return undefined;\n\n      if (i < path.length - 1) {\n        current = task.subtasks || [];\n      }\n    }\n\n    return task;\n  },\n\n  /**\n   * Clone a task deeply (including subtasks)\n   * @param task - Task to clone\n   * @param newId - Optional new ID for the clone\n   * @returns Cloned task\n   */\n  cloneTask: (task: Task, newId?: string): Task => {\n    return {\n      ...task,\n      id: newId || `${task.id}-copy`,\n      subtasks: task.subtasks?.map(st => ganttUtils.cloneTask(st)),\n    };\n  },\n\n  /**\n   * Export tasks to PDF format\n   * @param tasks - Tasks to export\n   * @param filename - Optional filename (default: 'gantt-chart.pdf')\n   * @returns Promise<void>\n   */\n  exportToPDF: async (tasks: Task[], filename = 'gantt-chart.pdf'): Promise<void> => {\n    try {\n      if (!tasks || tasks.length === 0) {\n        alert('No tasks available to export to PDF');\n        return;\n      }\n\n      // v0.8.1: FIXED - Use correct jspdf-autotable v5.0 API\n      const { jsPDF } = await import('jspdf');\n      const { default: autoTable } = await import('jspdf-autotable');\n\n      const doc = new jsPDF();\n      const flat = ganttUtils.flattenTasks(tasks);\n\n      if (flat.length === 0) {\n        alert('No tasks found to export');\n        return;\n      }\n\n      // Title\n      doc.setFontSize(16);\n      doc.text('Gantt Chart - Task List', 14, 20);\n\n      // Table data\n      const headers = [['Task Name', 'Start Date', 'End Date', 'Duration', 'Progress', 'Status']];\n      const data = flat.map(task => {\n        const duration = task.startDate && task.endDate\n          ? ganttUtils.calculateDuration(task.startDate, task.endDate)\n          : 0;\n\n        return [\n          task.name,\n          task.startDate ? ganttUtils.formatDate(task.startDate) : 'N/A',\n          task.endDate ? ganttUtils.formatDate(task.endDate) : 'N/A',\n          duration > 0 ? `${duration} days` : 'N/A',\n          `${task.progress}%`,\n          task.status || 'N/A',\n        ];\n      });\n\n      // v0.8.1: Use autoTable function (v5.0 API) instead of doc.autoTable() (old API)\n      autoTable(doc, {\n        head: headers,\n        body: data,\n        startY: 30,\n        styles: {\n          fontSize: 9,\n          cellPadding: 3,\n        },\n        headStyles: {\n          fillColor: [66, 139, 202],\n          textColor: 255,\n          fontStyle: 'bold',\n        },\n        alternateRowStyles: {\n          fillColor: [245, 245, 245],\n        },\n        columnStyles: {\n          0: { cellWidth: 60 }, // Task Name\n          1: { cellWidth: 30 }, // Start Date\n          2: { cellWidth: 30 }, // End Date\n          3: { cellWidth: 25 }, // Duration\n          4: { cellWidth: 20 }, // Progress\n          5: { cellWidth: 25 }, // Status\n        },\n      });\n\n      // Save the PDF\n      doc.save(filename);\n    } catch (error) {\n      throw error;\n    }\n  },\n\n  /**\n   * Export tasks to Excel format\n   * @param tasks - Tasks to export\n   * @param filename - Optional filename (default: 'gantt-chart.xlsx')\n   * @returns Promise<void>\n   */\n  exportToExcel: async (tasks: Task[], filename?: string, options?: { rateMap?: Record<string, number>; defaultRate?: number; projectName?: string }): Promise<void> => {\n    const XLSX = await import('xlsx');\n    const flat = ganttUtils.flattenTasks(tasks);\n    const rateMap = options?.rateMap;\n    const defaultRate = options?.defaultRate || 0;\n\n    // Resolve hourly rate for a task based on its assignees\n    const getTaskRate = (task: Task): number => {\n      if (!rateMap || !task.assignees || task.assignees.length === 0) return defaultRate;\n      const rates = task.assignees\n        .map((a: any) => a.id ? rateMap[a.id] : undefined)\n        .filter((r): r is number => r != null && r > 0);\n      if (rates.length === 0) return defaultRate;\n      return rates.reduce((a, b) => a + b, 0) / rates.length;\n    };\n\n    // Build WBS codes for human-readable hierarchy\n    const wbsMap = new Map<string, string>();\n    const buildWbs = (list: Task[], prefix = '') => {\n      const sorted = [...list].sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n      sorted.forEach((task, idx) => {\n        const wbs = prefix ? `${prefix}.${idx + 1}` : `${idx + 1}`;\n        wbsMap.set(task.id, wbs);\n        if (task.subtasks?.length) buildWbs(task.subtasks, wbs);\n      });\n    };\n    buildWbs(tasks);\n\n    // Check if cost data is available — either via rateMap OR task._costRate\n    const hasCostData = (rateMap && Object.keys(rateMap).length > 0) ||\n      flat.some(t => (t as any)._costRate > 0);\n\n    // Prepare data — no internal IDs, include hours + costs\n    const data = flat.map(task => {\n      const duration = task.startDate && task.endDate\n        ? ganttUtils.calculateDuration(task.startDate, task.endDate)\n        : 0;\n      const effort = (task as any).effortMinutes;\n      const logged = (task as any).timeLoggedMinutes;\n      const sold = (task as any).soldEffortMinutes;\n\n      const estH = typeof effort === 'number' ? +(effort / 60).toFixed(1) : 0;\n      const logH = typeof logged === 'number' ? +(logged / 60).toFixed(1) : 0;\n      const soldH = typeof sold === 'number' ? +(sold / 60).toFixed(1) : 0;\n      // Priority: task-level rate (injected by consumer) → rateMap lookup → defaultRate\n      const rate = (task as any)._costRate > 0 ? (task as any)._costRate : getTaskRate(task);\n\n      const row: Record<string, any> = {\n        'WBS': wbsMap.get(task.id) || '',\n        'Task Name': task.name,\n        'Start Date': task.startDate ? ganttUtils.formatDate(task.startDate) : '',\n        'End Date': task.endDate ? ganttUtils.formatDate(task.endDate) : '',\n        'Duration (days)': duration > 0 ? duration : '',\n        'Progress (%)': task.progress,\n        'Status': task.status || '',\n        'Assignees': task.assignees?.map(a => a.name).join(', ') || '',\n        'Estimated (h)': estH || '',\n        'Logged (h)': logH || '',\n        'Quoted (h)': soldH || '',\n      };\n\n      if (hasCostData) {\n        row['$ Estimated'] = estH > 0 && rate > 0 ? Math.round(estH * rate) : '';\n        row['$ Executed'] = logH > 0 && rate > 0 ? Math.round(logH * rate) : '';\n        row['$ Quoted'] = soldH > 0 && rate > 0 ? Math.round(soldH * rate) : '';\n        row['Rate ($/h)'] = rate > 0 ? rate : '';\n      }\n\n      const weight = (task as any).weight;\n      row['Weight (%)'] = typeof weight === 'number' && weight > 0 ? weight : '';\n      row['Is Milestone'] = task.isMilestone ? 'Yes' : 'No';\n      return row;\n    });\n\n    // Task 0: Project summary row with totals\n    const projectName = options?.projectName || '';\n    if (projectName || data.length > 0) {\n      // Calculate totals from all task rows\n      let totalEstH = 0, totalLogH = 0, totalSoldH = 0;\n      let totalCostEst = 0, totalCostExec = 0, totalCostQuoted = 0;\n      let totalProgress = 0, taskCount = 0;\n      const earliest = flat.filter(t => t.startDate).map(t => t.startDate!.getTime());\n      const latest = flat.filter(t => t.endDate).map(t => t.endDate!.getTime());\n\n      for (const row of data) {\n        if (typeof row['Estimated (h)'] === 'number') totalEstH += row['Estimated (h)'];\n        if (typeof row['Logged (h)'] === 'number') totalLogH += row['Logged (h)'];\n        if (typeof row['Quoted (h)'] === 'number') totalSoldH += row['Quoted (h)'];\n        if (hasCostData) {\n          if (typeof row['$ Estimated'] === 'number') totalCostEst += row['$ Estimated'];\n          if (typeof row['$ Executed'] === 'number') totalCostExec += row['$ Executed'];\n          if (typeof row['$ Quoted'] === 'number') totalCostQuoted += row['$ Quoted'];\n        }\n        if (typeof row['Progress (%)'] === 'number') { totalProgress += row['Progress (%)']; taskCount++; }\n      }\n\n      const summaryRow: Record<string, any> = {\n        'WBS': '0',\n        'Task Name': `📋 ${projectName || 'PROJECT TOTAL'}`,\n        'Start Date': earliest.length > 0 ? ganttUtils.formatDate(new Date(Math.min(...earliest))) : '',\n        'End Date': latest.length > 0 ? ganttUtils.formatDate(new Date(Math.max(...latest))) : '',\n        'Duration (days)': earliest.length > 0 && latest.length > 0\n          ? ganttUtils.calculateDuration(new Date(Math.min(...earliest)), new Date(Math.max(...latest)))\n          : '',\n        'Progress (%)': taskCount > 0 ? Math.round(totalProgress / taskCount) : 0,\n        'Status': '',\n        'Assignees': '',\n        'Estimated (h)': +(totalEstH.toFixed(1)) || '',\n        'Logged (h)': +(totalLogH.toFixed(1)) || '',\n        'Quoted (h)': +(totalSoldH.toFixed(1)) || '',\n      };\n      if (hasCostData) {\n        summaryRow['$ Estimated'] = totalCostEst || '';\n        summaryRow['$ Executed'] = totalCostExec || '';\n        summaryRow['$ Quoted'] = totalCostQuoted || '';\n        summaryRow['Rate ($/h)'] = '';\n      }\n      summaryRow['Is Milestone'] = 'No';\n\n      data.unshift(summaryRow);\n    }\n\n    // Create worksheet\n    const worksheet = XLSX.utils.json_to_sheet(data);\n\n    // Set column widths\n    const columnWidths = [\n      { wch: 10 }, // WBS\n      { wch: 40 }, // Task Name\n      { wch: 12 }, // Start Date\n      { wch: 12 }, // End Date\n      { wch: 15 }, // Duration\n      { wch: 12 }, // Progress\n      { wch: 15 }, // Status\n      { wch: 30 }, // Assignees\n      { wch: 14 }, // Estimated (h)\n      { wch: 12 }, // Logged (h)\n      { wch: 12 }, // Quoted (h)\n      ...(hasCostData ? [\n        { wch: 14 }, // $ Estimated\n        { wch: 14 }, // $ Executed\n        { wch: 14 }, // $ Quoted\n        { wch: 12 }, // Rate\n      ] : []),\n      { wch: 12 }, // Is Milestone\n    ];\n    worksheet['!cols'] = columnWidths;\n\n    // Create workbook\n    const workbook = XLSX.utils.book_new();\n    XLSX.utils.book_append_sheet(workbook, worksheet, 'Gantt Tasks');\n\n    // Generate filename with project name + timestamp\n    if (!filename) {\n      const now = new Date();\n      const pad = (n: number) => String(n).padStart(2, '0');\n      const ts = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}_${pad(now.getHours())}${pad(now.getMinutes())}`;\n      filename = `Project_${ts}.xlsx`;\n    }\n\n    // Save the file\n    XLSX.writeFile(workbook, filename);\n  },\n\n  /**\n   * Export tasks to Microsoft Project XML format\n   * Compatible with MS Project 2010+ and other project management tools\n   * @param tasks - Tasks to export\n   * @param projectName - Project name (default: 'Gantt Project')\n   * @param filename - Optional filename (default: 'project.xml')\n   * @returns void - Downloads the XML file\n   */\n  exportToMSProject: (tasks: Task[], projectName = 'Gantt Project', filename = 'project.xml'): void => {\n    const flat = ganttUtils.flattenTasks(tasks);\n\n    // Generate unique UIDs for tasks (MS Project requires numeric UIDs)\n    const taskUIDMap = new Map<string, number>();\n    flat.forEach((task, index) => {\n      taskUIDMap.set(task.id, index + 1); // UID starts at 1\n    });\n\n    // Format date for MS Project XML (ISO 8601)\n    const formatMSDate = (date: Date): string => {\n      return date.toISOString().replace('Z', '');\n    };\n\n    // Calculate project start and end dates\n    const projectStart = ganttUtils.getEarliestStartDate(tasks) || new Date();\n    const projectEnd = ganttUtils.getLatestEndDate(tasks) || new Date();\n\n    // Build XML structure\n    const xmlTasks = flat.map((task, index) => {\n      const uid = taskUIDMap.get(task.id)!;\n      const duration = task.startDate && task.endDate\n        ? ganttUtils.calculateDuration(task.startDate, task.endDate)\n        : 0;\n\n      // Build predecessor links (dependencies)\n      const predecessorLinks = (task.dependencies || [])\n        .filter(depId => taskUIDMap.has(depId))\n        .map(depId => `\n        <PredecessorLink>\n          <PredecessorUID>${taskUIDMap.get(depId)}</PredecessorUID>\n          <Type>1</Type>\n          <CrossProject>0</CrossProject>\n          <LinkLag>0</LinkLag>\n          <LagFormat>7</LagFormat>\n        </PredecessorLink>`).join('');\n\n      return `\n    <Task>\n      <UID>${uid}</UID>\n      <ID>${index + 1}</ID>\n      <Name>${task.name.replace(/[<>&'\"]/g, c => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;', \"'\": '&apos;', '\"': '&quot;' })[c] || c)}</Name>\n      <Type>0</Type>\n      <IsNull>0</IsNull>\n      <CreateDate>${formatMSDate(new Date())}</CreateDate>\n      <WBS>${index + 1}</WBS>\n      <OutlineNumber>${index + 1}</OutlineNumber>\n      <OutlineLevel>${task.level || 0}</OutlineLevel>\n      <Priority>500</Priority>\n      <Start>${task.startDate ? formatMSDate(task.startDate) : ''}</Start>\n      <Finish>${task.endDate ? formatMSDate(task.endDate) : ''}</Finish>\n      <Duration>PT${duration * 8}H0M0S</Duration>\n      <DurationFormat>7</DurationFormat>\n      <Work>PT${duration * 8}H0M0S</Work>\n      <Stop>${task.endDate ? formatMSDate(task.endDate) : ''}</Stop>\n      <Resume>${task.startDate ? formatMSDate(task.startDate) : ''}</Resume>\n      <ResumeValid>0</ResumeValid>\n      <EffortDriven>1</EffortDriven>\n      <Recurring>0</Recurring>\n      <OverAllocated>0</OverAllocated>\n      <Estimated>0</Estimated>\n      <Milestone>${task.isMilestone ? '1' : '0'}</Milestone>\n      <Summary>${(task.subtasks && task.subtasks.length > 0) ? '1' : '0'}</Summary>\n      <Critical>${task.isCriticalPath ? '1' : '0'}</Critical>\n      <IsSubproject>0</IsSubproject>\n      <IsSubprojectReadOnly>0</IsSubprojectReadOnly>\n      <ExternalTask>0</ExternalTask>\n      <EarlyStart>${task.startDate ? formatMSDate(task.startDate) : ''}</EarlyStart>\n      <EarlyFinish>${task.endDate ? formatMSDate(task.endDate) : ''}</EarlyFinish>\n      <LateStart>${task.startDate ? formatMSDate(task.startDate) : ''}</LateStart>\n      <LateFinish>${task.endDate ? formatMSDate(task.endDate) : ''}</LateFinish>\n      <StartVariance>0</StartVariance>\n      <FinishVariance>0</FinishVariance>\n      <WorkVariance>0</WorkVariance>\n      <FreeSlack>0</FreeSlack>\n      <TotalSlack>0</TotalSlack>\n      <FixedCost>0</FixedCost>\n      <FixedCostAccrual>3</FixedCostAccrual>\n      <PercentComplete>${task.progress}</PercentComplete>\n      <PercentWorkComplete>${task.progress}</PercentWorkComplete>\n      <Cost>0</Cost>\n      <OvertimeCost>0</OvertimeCost>\n      <OvertimeWork>PT0H0M0S</OvertimeWork>\n      <ActualStart>${task.progress > 0 && task.startDate ? formatMSDate(task.startDate) : ''}</ActualStart>\n      <ActualFinish>${task.progress === 100 && task.endDate ? formatMSDate(task.endDate) : ''}</ActualFinish>\n      <ActualDuration>PT${Math.round(duration * task.progress / 100) * 8}H0M0S</ActualDuration>\n      <ActualCost>0</ActualCost>\n      <ActualOvertimeCost>0</ActualOvertimeCost>\n      <ActualWork>PT${Math.round(duration * task.progress / 100) * 8}H0M0S</ActualWork>\n      <ActualOvertimeWork>PT0H0M0S</ActualOvertimeWork>\n      <RegularWork>PT${duration * 8}H0M0S</RegularWork>\n      <RemainingDuration>PT${Math.round(duration * (100 - task.progress) / 100) * 8}H0M0S</RemainingDuration>\n      <RemainingCost>0</RemainingCost>\n      <RemainingWork>PT${Math.round(duration * (100 - task.progress) / 100) * 8}H0M0S</RemainingWork>\n      <RemainingOvertimeCost>0</RemainingOvertimeCost>\n      <RemainingOvertimeWork>PT0H0M0S</RemainingOvertimeWork>\n      <ACWP>0</ACWP>\n      <CV>0</CV>\n      <ConstraintType>0</ConstraintType>\n      <CalendarUID>-1</CalendarUID>\n      <LevelAssignments>1</LevelAssignments>\n      <LevelingCanSplit>1</LevelingCanSplit>\n      <LevelingDelay>0</LevelingDelay>\n      <LevelingDelayFormat>8</LevelingDelayFormat>\n      <IgnoreResourceCalendar>0</IgnoreResourceCalendar>\n      <HideBar>0</HideBar>\n      <Rollup>0</Rollup>\n      <BCWS>0</BCWS>\n      <BCWP>0</BCWP>\n      <PhysicalPercentComplete>0</PhysicalPercentComplete>\n      <EarnedValueMethod>0</EarnedValueMethod>\n      <IsPublished>1</IsPublished>\n      <CommitmentType>0</CommitmentType>${predecessorLinks}\n    </Task>`;\n    }).join('');\n\n    // Complete MS Project XML structure\n    const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Project xmlns=\"http://schemas.microsoft.com/project\">\n  <SaveVersion>14</SaveVersion>\n  <Name>${projectName.replace(/[<>&'\"]/g, c => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;', \"'\": '&apos;', '\"': '&quot;' })[c] || c)}</Name>\n  <Title>${projectName.replace(/[<>&'\"]/g, c => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;', \"'\": '&apos;', '\"': '&quot;' })[c] || c)}</Title>\n  <CreationDate>${formatMSDate(new Date())}</CreationDate>\n  <LastSaved>${formatMSDate(new Date())}</LastSaved>\n  <ScheduleFromStart>1</ScheduleFromStart>\n  <StartDate>${formatMSDate(projectStart)}</StartDate>\n  <FinishDate>${formatMSDate(projectEnd)}</FinishDate>\n  <FYStartDate>1</FYStartDate>\n  <CriticalSlackLimit>0</CriticalSlackLimit>\n  <CurrencyDigits>2</CurrencyDigits>\n  <CurrencySymbol>$</CurrencySymbol>\n  <CurrencyCode>USD</CurrencyCode>\n  <CurrencySymbolPosition>0</CurrencySymbolPosition>\n  <CalendarUID>1</CalendarUID>\n  <DefaultStartTime>08:00:00</DefaultStartTime>\n  <DefaultFinishTime>17:00:00</DefaultFinishTime>\n  <MinutesPerDay>480</MinutesPerDay>\n  <MinutesPerWeek>2400</MinutesPerWeek>\n  <DaysPerMonth>20</DaysPerMonth>\n  <DefaultTaskType>1</DefaultTaskType>\n  <DefaultFixedCostAccrual>3</DefaultFixedCostAccrual>\n  <DefaultStandardRate>0</DefaultStandardRate>\n  <DefaultOvertimeRate>0</DefaultOvertimeRate>\n  <DurationFormat>7</DurationFormat>\n  <WorkFormat>2</WorkFormat>\n  <EditableActualCosts>0</EditableActualCosts>\n  <HonorConstraints>1</HonorConstraints>\n  <InsertedProjectsLikeSummary>1</InsertedProjectsLikeSummary>\n  <MultipleCriticalPaths>0</MultipleCriticalPaths>\n  <NewTasksEffortDriven>1</NewTasksEffortDriven>\n  <NewTasksEstimated>1</NewTasksEstimated>\n  <SplitsInProgressTasks>1</SplitsInProgressTasks>\n  <SpreadActualCost>0</SpreadActualCost>\n  <SpreadPercentComplete>0</SpreadPercentComplete>\n  <TaskUpdatesResource>1</TaskUpdatesResource>\n  <FiscalYearStart>0</FiscalYearStart>\n  <WeekStartDay>1</WeekStartDay>\n  <MoveCompletedEndsBack>0</MoveCompletedEndsBack>\n  <MoveRemainingStartsBack>0</MoveRemainingStartsBack>\n  <MoveRemainingStartsForward>0</MoveRemainingStartsForward>\n  <MoveCompletedEndsForward>0</MoveCompletedEndsForward>\n  <BaselineForEarnedValue>0</BaselineForEarnedValue>\n  <AutoAddNewResourcesAndTasks>1</AutoAddNewResourcesAndTasks>\n  <CurrentDate>${formatMSDate(new Date())}</CurrentDate>\n  <MicrosoftProjectServerURL>1</MicrosoftProjectServerURL>\n  <Autolink>1</Autolink>\n  <NewTaskStartDate>0</NewTaskStartDate>\n  <DefaultTaskEVMethod>0</DefaultTaskEVMethod>\n  <ProjectExternallyEdited>0</ProjectExternallyEdited>\n  <ExtendedCreationDate>${formatMSDate(new Date())}</ExtendedCreationDate>\n  <ActualsInSync>0</ActualsInSync>\n  <RemoveFileProperties>0</RemoveFileProperties>\n  <AdminProject>0</AdminProject>\n  <Calendars>\n    <Calendar>\n      <UID>1</UID>\n      <Name>Standard</Name>\n      <IsBaseCalendar>1</IsBaseCalendar>\n      <IsBaselineCalendar>0</IsBaselineCalendar>\n      <BaseCalendarUID>-1</BaseCalendarUID>\n      <WeekDays>\n        <WeekDay>\n          <DayType>1</DayType>\n          <DayWorking>0</DayWorking>\n        </WeekDay>\n        <WeekDay>\n          <DayType>2</DayType>\n          <DayWorking>1</DayWorking>\n          <WorkingTimes>\n            <WorkingTime>\n              <FromTime>08:00:00</FromTime>\n              <ToTime>12:00:00</ToTime>\n            </WorkingTime>\n            <WorkingTime>\n              <FromTime>13:00:00</FromTime>\n              <ToTime>17:00:00</ToTime>\n            </WorkingTime>\n          </WorkingTimes>\n        </WeekDay>\n        <WeekDay>\n          <DayType>3</DayType>\n          <DayWorking>1</DayWorking>\n          <WorkingTimes>\n            <WorkingTime>\n              <FromTime>08:00:00</FromTime>\n              <ToTime>12:00:00</ToTime>\n            </WorkingTime>\n            <WorkingTime>\n              <FromTime>13:00:00</FromTime>\n              <ToTime>17:00:00</ToTime>\n            </WorkingTime>\n          </WorkingTimes>\n        </WeekDay>\n        <WeekDay>\n          <DayType>4</DayType>\n          <DayWorking>1</DayWorking>\n          <WorkingTimes>\n            <WorkingTime>\n              <FromTime>08:00:00</FromTime>\n              <ToTime>12:00:00</ToTime>\n            </WorkingTime>\n            <WorkingTime>\n              <FromTime>13:00:00</FromTime>\n              <ToTime>17:00:00</ToTime>\n            </WorkingTime>\n          </WorkingTimes>\n        </WeekDay>\n        <WeekDay>\n          <DayType>5</DayType>\n          <DayWorking>1</DayWorking>\n          <WorkingTimes>\n            <WorkingTime>\n              <FromTime>08:00:00</FromTime>\n              <ToTime>12:00:00</ToTime>\n            </WorkingTime>\n            <WorkingTime>\n              <FromTime>13:00:00</FromTime>\n              <ToTime>17:00:00</ToTime>\n            </WorkingTime>\n          </WorkingTimes>\n        </WeekDay>\n        <WeekDay>\n          <DayType>6</DayType>\n          <DayWorking>1</DayWorking>\n          <WorkingTimes>\n            <WorkingTime>\n              <FromTime>08:00:00</FromTime>\n              <ToTime>12:00:00</ToTime>\n            </WorkingTime>\n            <WorkingTime>\n              <FromTime>13:00:00</FromTime>\n              <ToTime>17:00:00</ToTime>\n            </WorkingTime>\n          </WorkingTimes>\n        </WeekDay>\n        <WeekDay>\n          <DayType>7</DayType>\n          <DayWorking>0</DayWorking>\n        </WeekDay>\n      </WeekDays>\n    </Calendar>\n  </Calendars>\n  <Tasks>${xmlTasks}\n  </Tasks>\n</Project>`;\n\n    // Download the file\n    const blob = new Blob([xml], { type: 'application/xml;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.download = filename;\n    link.click();\n    URL.revokeObjectURL(link.href);\n  },\n\n  /**\n   * Calculate Critical Path Method (CPM) - identifies tasks with zero slack\n   * @param tasks - All tasks\n   * @returns Array of task IDs on the critical path\n   */\n  calculateCriticalPath: (tasks: Task[]): string[] => {\n    const flat = ganttUtils.flattenTasks(tasks);\n    const tasksWithDates = flat.filter(t => t.startDate && t.endDate);\n\n    if (tasksWithDates.length === 0) return [];\n\n    // Step 1: Calculate Early Start (ES) and Early Finish (EF) - Forward Pass\n    const earlyDates = new Map<string, { es: number; ef: number }>();\n\n    const calculateEarlyDates = (task: Task): void => {\n      if (earlyDates.has(task.id)) return;\n\n      const duration = task.startDate && task.endDate\n        ? ganttUtils.calculateDuration(task.startDate, task.endDate)\n        : 0;\n\n      let es = 0;\n\n      // If task has dependencies, ES = max(EF of all predecessors)\n      if (task.dependencies && task.dependencies.length > 0) {\n        for (const depId of task.dependencies) {\n          const depTask = flat.find(t => t.id === depId);\n          if (depTask) {\n            calculateEarlyDates(depTask);\n            const depEF = earlyDates.get(depId)?.ef || 0;\n            es = Math.max(es, depEF);\n          }\n        }\n      }\n\n      const ef = es + duration;\n      earlyDates.set(task.id, { es, ef });\n    };\n\n    tasksWithDates.forEach(calculateEarlyDates);\n\n    // Step 2: Find project end date (max EF)\n    const projectEnd = Math.max(...Array.from(earlyDates.values()).map(d => d.ef));\n\n    // Step 3: Calculate Late Start (LS) and Late Finish (LF) - Backward Pass\n    const lateDates = new Map<string, { ls: number; lf: number }>();\n\n    const calculateLateDates = (task: Task): void => {\n      if (lateDates.has(task.id)) return;\n\n      const duration = task.startDate && task.endDate\n        ? ganttUtils.calculateDuration(task.startDate, task.endDate)\n        : 0;\n\n      // Find all tasks that depend on this task\n      const successors = flat.filter(t =>\n        t.dependencies && t.dependencies.includes(task.id)\n      );\n\n      let lf = projectEnd;\n\n      // If task has successors, LF = min(LS of all successors)\n      if (successors.length > 0) {\n        for (const successor of successors) {\n          calculateLateDates(successor);\n          const succLS = lateDates.get(successor.id)?.ls || 0;\n          lf = Math.min(lf, succLS);\n        }\n      }\n\n      const ls = lf - duration;\n      lateDates.set(task.id, { ls, lf });\n    };\n\n    tasksWithDates.forEach(calculateLateDates);\n\n    // Step 4: Calculate Slack (Float) = LS - ES = LF - EF\n    // Tasks with slack = 0 are on the critical path\n    const criticalPath: string[] = [];\n\n    for (const task of tasksWithDates) {\n      const early = earlyDates.get(task.id);\n      const late = lateDates.get(task.id);\n\n      if (early && late) {\n        const slack = late.ls - early.es;\n        if (Math.abs(slack) < 0.01) { // Float point comparison\n          criticalPath.push(task.id);\n        }\n      }\n    }\n\n    return criticalPath;\n  },\n\n  /**\n   * v5.1.0: Full CPM calculation — returns ES/EF/LS/LF/TF/FF per task\n   * Used by GanttBoard to enrich tasks with cpmData for visual rendering\n   */\n  calculateCriticalPathFull: (tasks: Task[]): Map<string, { earlyStart: number; earlyFinish: number; lateStart: number; lateFinish: number; totalFloat: number; freeFloat: number; isCritical: boolean }> => {\n    const result = new Map<string, { earlyStart: number; earlyFinish: number; lateStart: number; lateFinish: number; totalFloat: number; freeFloat: number; isCritical: boolean }>();\n    const flat = ganttUtils.flattenTasks(tasks);\n    const tasksWithDates = flat.filter(t => t.startDate && t.endDate);\n\n    if (tasksWithDates.length === 0) return result;\n\n    // Build adjacency: predecessors and successors\n    const taskMap = new Map(tasksWithDates.map(t => [t.id, t]));\n    const successorsOf = new Map<string, string[]>();\n    for (const t of tasksWithDates) {\n      if (!successorsOf.has(t.id)) successorsOf.set(t.id, []);\n    }\n    for (const t of tasksWithDates) {\n      if (t.dependencies) {\n        for (const depId of t.dependencies) {\n          if (taskMap.has(depId)) {\n            const list = successorsOf.get(depId);\n            if (list) list.push(t.id);\n          }\n        }\n      }\n    }\n\n    // --- Forward Pass (Kahn's topological sort) ---\n    const inDegree = new Map<string, number>();\n    for (const t of tasksWithDates) {\n      inDegree.set(t.id, 0);\n    }\n    for (const t of tasksWithDates) {\n      if (t.dependencies) {\n        for (const depId of t.dependencies) {\n          if (taskMap.has(depId)) {\n            inDegree.set(t.id, (inDegree.get(t.id) || 0) + 1);\n          }\n        }\n      }\n    }\n\n    const earlyDates = new Map<string, { es: number; ef: number }>();\n    const topoOrder: string[] = [];\n    const queue: string[] = [];\n\n    for (const t of tasksWithDates) {\n      if ((inDegree.get(t.id) || 0) === 0) queue.push(t.id);\n    }\n\n    while (queue.length > 0) {\n      const id = queue.shift()!;\n      topoOrder.push(id);\n      const task = taskMap.get(id);\n      if (!task || !task.startDate || !task.endDate) continue;\n      const duration = ganttUtils.calculateDuration(task.startDate, task.endDate);\n\n      // ES = max(EF of all predecessors), default 0\n      let es = 0;\n      if (task.dependencies) {\n        for (const depId of task.dependencies) {\n          const depEarly = earlyDates.get(depId);\n          if (depEarly) es = Math.max(es, depEarly.ef);\n        }\n      }\n      earlyDates.set(id, { es, ef: es + duration });\n\n      // Decrement in-degree of successors\n      const succs = successorsOf.get(id) || [];\n      for (const succId of succs) {\n        const deg = (inDegree.get(succId) || 1) - 1;\n        inDegree.set(succId, deg);\n        if (deg === 0) queue.push(succId);\n      }\n    }\n\n    // Cycle detection: if topoOrder < tasksWithDates, there's a cycle — return empty\n    if (topoOrder.length < tasksWithDates.length) return result;\n\n    const projectEnd = Math.max(...Array.from(earlyDates.values()).map(d => d.ef));\n\n    // --- Backward Pass (reverse topological order) ---\n    const lateDates = new Map<string, { ls: number; lf: number }>();\n\n    for (let i = topoOrder.length - 1; i >= 0; i--) {\n      const id = topoOrder[i];\n      if (!id) continue;\n      const task = taskMap.get(id);\n      if (!task || !task.startDate || !task.endDate) continue;\n      const duration = ganttUtils.calculateDuration(task.startDate, task.endDate);\n      const succs = successorsOf.get(id) || [];\n\n      let lf = projectEnd;\n      if (succs.length > 0) {\n        for (const succId of succs) {\n          const succLate = lateDates.get(succId);\n          if (succLate) lf = Math.min(lf, succLate.ls);\n        }\n      }\n      lateDates.set(id, { ls: lf - duration, lf });\n    }\n\n    // --- Calculate Float ---\n    for (const id of topoOrder) {\n      const early = earlyDates.get(id)!;\n      const late = lateDates.get(id)!;\n      const totalFloat = late.ls - early.es;\n\n      // Free Float = min(ES of successors) - EF of this task\n      const succs = successorsOf.get(id) || [];\n      let freeFloat: number;\n      if (succs.length > 0) {\n        freeFloat = Math.min(...succs.map(s => earlyDates.get(s)!.es)) - early.ef;\n      } else {\n        freeFloat = projectEnd - early.ef;\n      }\n\n      result.set(id, {\n        earlyStart: early.es,\n        earlyFinish: early.ef,\n        lateStart: late.ls,\n        lateFinish: late.lf,\n        totalFloat: Math.round(totalFloat * 100) / 100,\n        freeFloat: Math.max(0, Math.round(freeFloat * 100) / 100),\n        isCritical: totalFloat <= 0.01,\n      });\n    }\n\n    return result;\n  },\n\n  /**\n   * Calculate slack (float) time for a task\n   * @param tasks - All tasks\n   * @param taskId - Task ID to calculate slack for\n   * @returns Slack in days, or null if cannot be calculated\n   */\n  calculateSlack: (tasks: Task[], taskId: string): number | null => {\n    const task = ganttUtils.findTaskById(tasks, taskId);\n    if (!task || !task.startDate || !task.endDate) return null;\n\n    const criticalPath = ganttUtils.calculateCriticalPath(tasks);\n\n    // If on critical path, slack is 0\n    if (criticalPath.includes(taskId)) return 0;\n\n    // Otherwise calculate slack using CPM algorithm\n    // This is simplified - in production would use full CPM\n    // For now, we approximate: slack = time until next dependent task\n    const dependents = ganttUtils.getDependentTasks(tasks, taskId);\n\n    if (dependents.length === 0) {\n      // No dependents = float until project end\n      const projectEnd = ganttUtils.getLatestEndDate(tasks);\n      if (!projectEnd) return null;\n\n      const daysToEnd = ganttUtils.calculateDuration(task.endDate, projectEnd);\n      return Math.max(0, daysToEnd);\n    }\n\n    // Find earliest dependent\n    const earliestDepStart = dependents\n      .filter(d => d.startDate)\n      .map(d => d.startDate!.getTime())\n      .sort((a, b) => a - b)[0];\n\n    if (!earliestDepStart) return null;\n\n    const slack = ganttUtils.calculateDuration(\n      task.endDate,\n      new Date(earliestDepStart)\n    );\n\n    return Math.max(0, slack);\n  },\n\n  /**\n   * Check if a task is on the critical path\n   * @param tasks - All tasks\n   * @param taskId - Task ID to check\n   * @returns True if task is on critical path\n   */\n  isOnCriticalPath: (tasks: Task[], taskId: string): boolean => {\n    const criticalPath = ganttUtils.calculateCriticalPath(tasks);\n    return criticalPath.includes(taskId);\n  },\n\n  /**\n   * Auto-schedule dependent tasks when a task changes\n   * v0.13.3: Now takes optional daysDelta to shift dependents by same amount (preserves gap)\n   * @param tasks - All tasks\n   * @param changedTaskId - Task that was changed\n   * @param daysDelta - Optional: days the parent moved (for preserving relative gaps)\n   * @returns Updated tasks with rescheduled dependencies\n   */\n  autoScheduleDependents: (tasks: Task[], changedTaskId: string, daysDelta?: number, _visited?: Set<string>): Task[] => {\n    const visited = _visited || new Set<string>();\n    if (visited.has(changedTaskId)) return tasks; // prevent cycles & double-moves\n    visited.add(changedTaskId);\n\n    const changedTask = ganttUtils.findTaskById(tasks, changedTaskId);\n    if (!changedTask || !changedTask.endDate) return tasks;\n\n    const dependents = ganttUtils.getDependentTasks(tasks, changedTaskId);\n    if (dependents.length === 0) return tasks;\n\n    let updatedTasks = [...tasks];\n\n    // For each dependent, shift by the same daysDelta (preserves relative gap)\n    for (const dependent of dependents) {\n      if (visited.has(dependent.id)) continue; // already scheduled by another path\n      if (!dependent.startDate || !dependent.endDate) continue;\n\n      // Calculate duration of dependent task\n      const duration = ganttUtils.calculateDuration(dependent.startDate, dependent.endDate);\n\n      let newStartDate: Date;\n\n      if (daysDelta !== undefined) {\n        // v0.13.3: Shift by same delta as parent (preserves relative gap)\n        newStartDate = new Date(dependent.startDate);\n        newStartDate.setDate(newStartDate.getDate() + daysDelta);\n      } else {\n        // Legacy behavior: New start date = changed task end date + 1 day\n        newStartDate = new Date(changedTask.endDate);\n        newStartDate.setDate(newStartDate.getDate() + 1);\n      }\n\n      // v2.2.0: Ensure dependent doesn't start before its predecessor ends\n      if (daysDelta !== undefined) {\n        const predecessorEnd = new Date(changedTask.endDate);\n        const minStart = new Date(predecessorEnd);\n        minStart.setDate(minStart.getDate() + 1);\n        if (newStartDate < minStart) {\n          newStartDate = minStart;\n        }\n      }\n\n      // Calculate new end date based on duration\n      const newEndDate = ganttUtils.calculateEndDate(newStartDate, duration);\n\n      // Update the task recursively in nested structure\n      const updateTaskRec = (tasks: Task[]): Task[] => {\n        return tasks.map(t => {\n          if (t.id === dependent.id) {\n            return { ...t, startDate: newStartDate, endDate: newEndDate };\n          }\n          if (t.subtasks) {\n            return { ...t, subtasks: updateTaskRec(t.subtasks) };\n          }\n          return t;\n        });\n      };\n\n      updatedTasks = updateTaskRec(updatedTasks);\n\n      // Recursively update dependents of this task (pass same delta, share visited set)\n      updatedTasks = ganttUtils.autoScheduleDependents(updatedTasks, dependent.id, daysDelta, visited);\n    }\n\n    return updatedTasks;\n  },\n\n  /**\n   * v0.13.0: Calculate cascade preview positions for dependent tasks during drag\n   * v0.13.3: FIXED - Preview shows ONLY actual movement needed (keeps same relative gap)\n   * Dependents shift by the same daysDelta as their parent, preserving the original gap\n   * @param tasks - All tasks (nested structure)\n   * @param draggedTaskId - Task being dragged\n   * @param daysDelta - How many days the dragged task is being moved\n   * @param flatTasks - Flattened task list with row indices\n   * @param timelineStartDate - Start date of the timeline\n   * @param scaledDayWidth - Width of one day in pixels (already includes zoom: dayWidth * zoom)\n   * @param rowHeight - Height of each row\n   * @param headerHeight - Height of the header\n   * @returns Array of DependentTaskPreview objects\n   */\n  calculateCascadePreview: (\n    tasks: Task[],\n    draggedTaskId: string,\n    daysDelta: number,\n    flatTasks: Task[],\n    timelineStartDate: Date,\n    scaledDayWidth: number, // Note: This already includes zoom (dayWidth * zoom)\n    rowHeight: number,\n    headerHeight: number\n  ): Array<{\n    taskId: string;\n    taskName: string;\n    originalX: number;\n    previewX: number;\n    width: number;\n    y: number;\n    rowIndex: number;\n    daysDelta: number;\n    color?: string;\n  }> => {\n    if (daysDelta === 0) return [];\n\n    const previews: Array<{\n      taskId: string;\n      taskName: string;\n      originalX: number;\n      previewX: number;\n      width: number;\n      y: number;\n      rowIndex: number;\n      daysDelta: number;\n      color?: string;\n    }> = [];\n\n    const rangeStart = timelineStartDate.getTime();\n    const msPerDay = 1000 * 60 * 60 * 24;\n\n    // Get dragged task info\n    const draggedTask = ganttUtils.findTaskById(tasks, draggedTaskId);\n    if (!draggedTask || !draggedTask.endDate) return [];\n\n    // v0.13.3: Dependents move by the SAME daysDelta as their parent\n    // This preserves the relative gap between tasks, making preview accurate\n    const getAffectedTasks = (parentTaskId: string, parentDelta: number, visited = new Set<string>()): void => {\n      if (visited.has(parentTaskId)) return; // Prevent infinite loops\n      visited.add(parentTaskId);\n\n      const dependents = ganttUtils.getDependentTasks(tasks, parentTaskId);\n\n      for (const dependent of dependents) {\n        if (!dependent.startDate || !dependent.endDate) continue;\n\n        // Find row index in flattened list\n        const rowIndex = flatTasks.findIndex(t => t.id === dependent.id);\n        if (rowIndex === -1) continue;\n\n        // Calculate task duration and current position\n        const taskStart = dependent.startDate.getTime();\n        const taskEnd = dependent.endDate.getTime();\n        const durationDays = (taskEnd - taskStart) / msPerDay;\n\n        // Original X position\n        const daysFromStart = (taskStart - rangeStart) / msPerDay;\n        const originalX = daysFromStart * scaledDayWidth;\n\n        // v0.13.3: Preview X = Original X + daysDelta (same shift as parent)\n        // This shows the task moving exactly with its parent, preserving the gap\n        const previewX = originalX + (parentDelta * scaledDayWidth);\n\n        // Width calculation - minimum 1 day width for visibility\n        const width = Math.max(durationDays * scaledDayWidth, scaledDayWidth);\n\n        // Y position - same formula as Timeline.tsx: HEADER_HEIGHT + index * ROW_HEIGHT + (ROW_HEIGHT - 18) / 2\n        const y = headerHeight + rowIndex * rowHeight + (rowHeight - 18) / 2;\n\n        previews.push({\n          taskId: dependent.id,\n          taskName: dependent.name,\n          originalX,\n          previewX,\n          width,\n          y,\n          rowIndex,\n          daysDelta: parentDelta,\n          color: dependent.color,\n        });\n\n        // Recursively get dependents of this task (same delta propagates)\n        getAffectedTasks(dependent.id, parentDelta, visited);\n      }\n    };\n\n    getAffectedTasks(draggedTaskId, daysDelta);\n\n    return previews;\n  },\n\n  /**\n   * 🚀 KILLER FEATURE #3: Split a task (create GAP in the middle, like Bryntum/DHTMLX)\n   * Same task, but work is paused for some days then continues\n   * Example: Jan 1-10 → Split at Jan 5 with 3 day gap → Jan 1-4 [GAP] Jan 8-13\n   * @param tasks - All tasks\n   * @param taskId - Task to split\n   * @param splitDate - Date where gap starts\n   * @param gapDays - Number of days to pause (default: 3)\n   * @returns Updated tasks with split segments\n   */\n  splitTask: (tasks: Task[], taskId: string, splitDate: Date, gapDays = 3): Task[] => {\n    const task = ganttUtils.findTaskById(tasks, taskId);\n    if (!task || !task.startDate || !task.endDate) return tasks;\n\n    // Validate split date is within task range\n    if (splitDate <= task.startDate || splitDate >= task.endDate) {\n      console.warn('Split date must be between task start and end dates');\n      return tasks;\n    }\n\n    // Calculate the split point (end of first segment)\n    const firstSegmentEnd = new Date(splitDate);\n    firstSegmentEnd.setDate(firstSegmentEnd.getDate() - 1); // Day before split\n\n    // Calculate second segment start (after gap)\n    const secondSegmentStart = new Date(splitDate);\n    secondSegmentStart.setDate(secondSegmentStart.getDate() + gapDays);\n\n    // Calculate new end date (original end + gap days to preserve work duration)\n    const newEndDate = new Date(task.endDate);\n    newEndDate.setDate(newEndDate.getDate() + gapDays);\n\n    // Create segments array\n    const segments: TaskSegment[] = [\n      {\n        startDate: new Date(task.startDate),\n        endDate: firstSegmentEnd,\n      },\n      {\n        startDate: secondSegmentStart,\n        endDate: newEndDate,\n      },\n    ];\n\n    // Update task with segments\n    const updateTaskRec = (tasksList: Task[]): Task[] => {\n      return tasksList.map(t => {\n        if (t.id === task.id) {\n          return {\n            ...t,\n            endDate: newEndDate, // Overall end date extends\n            segments, // Add segments to show gaps\n          };\n        }\n        if (t.subtasks) {\n          return { ...t, subtasks: updateTaskRec(t.subtasks) };\n        }\n        return t;\n      });\n    };\n\n    return updateTaskRec(tasks);\n  },\n};\n","import React, { useMemo, useCallback, useState, useRef } from 'react';\r\nimport { TimeScale, Task, GanttTemplates, DependentTaskPreview, DependencyLineStyle } from './types';\r\nimport { TaskBar, TaskTooltipData } from './TaskBar';\r\nimport { TaskTooltip, WorkingDaysConfig } from './TaskTooltip';\r\nimport { DependencyLine } from './DependencyLine';\r\nimport { Milestone } from './Milestone';\r\nimport { ganttUtils } from './ganttUtils';\r\nimport { useGanttI18n } from './GanttI18nContext';\r\n\r\ninterface TimelineProps {\r\n  tasks: Task[];\r\n  theme: any;\r\n  rowHeight: number;\r\n  timeScale: TimeScale;\r\n  startDate: Date;\r\n  endDate: Date;\r\n  zoom: number;\r\n  locale?: string; // v0.17.400: Locale for date formatting (e.g., 'en', 'es')\r\n  templates: Required<GanttTemplates>; // v0.8.0\r\n  dependencyLineStyle?: DependencyLineStyle; // v0.17.310: Dependency line style\r\n  showTaskBarLabels?: boolean;\r\n  onTaskClick?: (task: Task) => void;\r\n  onTaskDblClick?: (task: Task) => void; // v0.8.0\r\n  onTaskContextMenu?: (task: Task, event: React.MouseEvent) => void; // v0.8.0\r\n  onTaskDateChange?: (task: Task, newStart: Date, newEnd: Date) => void;\r\n  onDependencyCreate?: (fromTask: Task, toTaskId: string) => void;\r\n  onDependencyDelete?: (taskId: string, dependencyId: string) => void;\r\n  /** v3.0.0: Show baseline ghost bars behind actual bars (Oracle view) */\r\n  showBaseline?: boolean;\r\n  showCriticalPath?: boolean;\r\n  showDependencies?: boolean;\r\n  highlightWeekends?: boolean;\r\n  /** 1.9.36 · 'range' pinta «Sep 1–7» en la escala W. */\r\n  weekHeaderFormat?: 'number' | 'range';\r\n  /** v4.1.0: Per-task edit check — returns false for read-only bars */\r\n  canEditTask?: (task: Task) => boolean;\r\n  /** v4.2.0: Committed on pointerup after dragging the progress edge of a task bar. */\r\n  onTaskProgressDrag?: (task: Task, newProgress: number) => void;\r\n  /** v4.3.0: Workspace working-day config for the tooltip Duration field. */\r\n  workingDaysConfig?: WorkingDaysConfig;\r\n}\r\n\r\nexport interface TaskPosition {\r\n  id: string;\r\n  x: number;\r\n  y: number;\r\n  width: number;\r\n  height: number;\r\n}\r\n\r\nexport function Timeline({\r\n  tasks,\r\n  theme,\r\n  rowHeight: ROW_HEIGHT,\r\n  timeScale,\r\n  startDate,\r\n  endDate,\r\n  zoom,\r\n  locale = 'en', // v0.17.400: Default to English\r\n  templates,\r\n  dependencyLineStyle = 'curved', // v0.17.310\r\n  showTaskBarLabels = true,\r\n  onTaskClick,\r\n  onTaskDblClick, // v0.8.0\r\n  onTaskContextMenu, // v0.8.0\r\n  onTaskDateChange,\r\n  onDependencyCreate,\r\n  onDependencyDelete,\r\n  showBaseline,\r\n  showCriticalPath = true,\r\n  showDependencies = true,\r\n  highlightWeekends = true,\r\n  weekHeaderFormat = 'number',\r\n  canEditTask,\r\n  onTaskProgressDrag,\r\n  workingDaysConfig,\r\n}: TimelineProps) {\r\n  const HEADER_HEIGHT = 48; // Must match TaskGrid's HEADER_HEIGHT for alignment\r\n\r\n  // v0.17.400: Get i18n translations\r\n  const t = useGanttI18n();\r\n\r\n  // v1.4.28: Ref to content SVG for viewport-aware tooltip positioning\r\n  const contentSvgRef = useRef<SVGSVGElement>(null);\r\n\r\n  // v0.13.0: State for dependency cascade preview\r\n  const [cascadePreviews, setCascadePreviews] = useState<DependentTaskPreview[]>([]);\r\n\r\n  // v1.5.0: Track drag offset so dependency lines follow the dragged bar in real-time\r\n  const [dragOffset, setDragOffset] = useState<{ taskId: string; daysDelta: number } | null>(null);\r\n\r\n  // v0.17.76: State for active tooltip - rendered in top layer for proper z-order\r\n  const [activeTooltip, setActiveTooltip] = useState<TaskTooltipData | null>(null);\r\n\r\n  // v0.17.451: Track hovered dependency line for top-layer rendering\r\n  const [hoveredDepLine, setHoveredDepLine] = useState<{\r\n    key: string;\r\n    fromId: string;\r\n    toId: string;\r\n    exitX: number;\r\n    exitY: number;\r\n    enterX: number;\r\n    enterY: number;\r\n  } | null>(null);\r\n\r\n  // v0.17.452: Ref to track if mouse is over a dependency line (for fast mouse movement fix)\r\n  const isOverDependencyRef = useRef(false);\r\n\r\n  // v0.17.452: Track deleted dependencies locally for instant UI feedback\r\n  // Note: We don't clear this on tasks change - once deleted, it stays hidden\r\n  // The Set will naturally become irrelevant as the dependency no longer exists in data\r\n  const [deletedDeps, setDeletedDeps] = useState<Set<string>>(new Set());\r\n\r\n  // v1.4.19: State for click-to-schedule indicator (ClickUp-style)\r\n  // Tracks mouse position over empty task rows to show where the bar will be created\r\n  const [scheduleIndicator, setScheduleIndicator] = useState<{\r\n    taskId: string;\r\n    x: number;\r\n    y: number;\r\n    date: Date;\r\n  } | null>(null);\r\n\r\n  // v0.17.452: Handler for SVG mouse move - clears hover if mouse moved off dependency lines\r\n  const handleSvgMouseMove = useCallback((e: React.MouseEvent<SVGSVGElement>) => {\r\n    // If we have a hovered line but mouse is not over a dependency element, clear it\r\n    if (hoveredDepLine && !isOverDependencyRef.current) {\r\n      // Check if the target or any parent has the dependency data attribute\r\n      let target = e.target as Element | null;\r\n      let isOverDep = false;\r\n      while (target && target !== e.currentTarget) {\r\n        if (target.getAttribute?.('data-dependency-line') === 'true' ||\r\n            target.getAttribute?.('data-dependency-hover-overlay') === 'true') {\r\n          isOverDep = true;\r\n          break;\r\n        }\r\n        target = target.parentElement;\r\n      }\r\n      if (!isOverDep) {\r\n        setHoveredDepLine(null);\r\n      }\r\n    }\r\n  }, [hoveredDepLine]);\r\n\r\n  // v0.17.76: Callback for TaskBar hover changes\r\n  const handleTooltipChange = useCallback((tooltipData: TaskTooltipData | null) => {\r\n    setActiveTooltip(tooltipData);\r\n  }, []);\r\n\r\n  // v0.17.363: calculateVerticalX removed - DependencyLine now handles its own routing\r\n\r\n  // Calculate dimensions\r\n  const totalDays = Math.ceil((endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24));\r\n  const dayWidth = timeScale === 'day' ? 60 : timeScale === 'week' ? 20 : 8;\r\n  const timelineWidth = totalDays * dayWidth * zoom;\r\n\r\n  // Get week number - moved before useMemo\r\n  const getWeekNumber = (date: Date): number => {\r\n    const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n    const dayNum = d.getUTCDay() || 7;\r\n    d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n    const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n    return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\r\n  };\r\n\r\n  // Check if date is weekend\r\n  const isWeekend = (date: Date): boolean => {\r\n    const day = date.getDay();\r\n    return day === 0 || day === 6;\r\n  };\r\n\r\n  // Holiday set (workspace-local 'YYYY-MM-DD') derived from workingDaysConfig.\r\n  // Se usa para sombrear los festivos en gris igual que los fines de semana.\r\n  const holidaySet = useMemo(() => {\r\n    const raw = workingDaysConfig?.holidayDates;\r\n    if (!raw) return null;\r\n    return raw instanceof Set ? raw : new Set(raw);\r\n  }, [workingDaysConfig?.holidayDates]);\r\n\r\n  const isHoliday = (date: Date): boolean => {\r\n    if (!holidaySet) return false;\r\n    const key = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\r\n    return holidaySet.has(key);\r\n  };\r\n\r\n  // Convert pixel position to date\r\n  const pixelToDate = useCallback((pixelX: number): Date => {\r\n    const days = Math.round(pixelX / (dayWidth * zoom));\r\n    const newDate = new Date(startDate);\r\n    newDate.setDate(newDate.getDate() + days);\r\n    return newDate;\r\n  }, [startDate, dayWidth, zoom]);\r\n\r\n  // Handle click on timeline to create task bar for tasks without dates\r\n  const handleTimelineClick = useCallback((e: React.MouseEvent<SVGRectElement>, task: Task) => {\r\n    // Only create bar if task doesn't have dates (no existing bar)\r\n    if (task.startDate && task.endDate) {\r\n      return; // Task already has dates, do nothing\r\n    }\r\n\r\n    const svgElement = e.currentTarget.ownerSVGElement;\r\n    if (!svgElement) return;\r\n\r\n    const point = svgElement.createSVGPoint();\r\n    point.x = e.clientX;\r\n    point.y = e.clientY;\r\n    const svgPoint = point.matrixTransform(svgElement.getScreenCTM()?.inverse());\r\n\r\n    // Calculate the clicked date\r\n    const clickedDate = pixelToDate(svgPoint.x);\r\n\r\n    // Create a 1-day task bar\r\n    const endDate = new Date(clickedDate);\r\n    endDate.setDate(endDate.getDate() + 1);\r\n\r\n    // Clear the schedule indicator\r\n    setScheduleIndicator(null);\r\n\r\n    // Call the date change handler to create the task bar\r\n    onTaskDateChange?.(task, clickedDate, endDate);\r\n  }, [pixelToDate, onTaskDateChange]);\r\n\r\n  // v1.4.19: Handle mouse move over empty task row to show schedule indicator\r\n  const handleEmptyRowMouseMove = useCallback((e: React.MouseEvent<SVGRectElement>, task: Task, rowIndex: number) => {\r\n    const svgElement = e.currentTarget.ownerSVGElement;\r\n    if (!svgElement) return;\r\n\r\n    const point = svgElement.createSVGPoint();\r\n    point.x = e.clientX;\r\n    point.y = e.clientY;\r\n    const svgPoint = point.matrixTransform(svgElement.getScreenCTM()?.inverse());\r\n\r\n    // Calculate the date at cursor position\r\n    const hoverDate = pixelToDate(svgPoint.x);\r\n\r\n    // Calculate snapped X position (align to day grid)\r\n    const days = Math.round(svgPoint.x / (dayWidth * zoom));\r\n    const snappedX = days * dayWidth * zoom;\r\n\r\n    setScheduleIndicator({\r\n      taskId: task.id,\r\n      x: snappedX,\r\n      y: rowIndex * ROW_HEIGHT + ROW_HEIGHT / 2,\r\n      date: hoverDate,\r\n    });\r\n  }, [pixelToDate, dayWidth, zoom, ROW_HEIGHT]);\r\n\r\n  // v1.4.19: Handle mouse leave from empty task row\r\n  const handleEmptyRowMouseLeave = useCallback(() => {\r\n    setScheduleIndicator(null);\r\n  }, []);\r\n\r\n  // Calculate parent task dates from subtasks and flatten for rendering\r\n  const flatTasks = useMemo(() => {\r\n    // Helper function to calculate parent dates from subtasks (MS Project style)\r\n    // v0.17.47: Parent tasks ALWAYS derive dates from subtasks (summary task behavior)\r\n    // This is the standard behavior in professional project management tools\r\n    const calculateParentDates = (tasks: Task[]): Task[] => {\r\n      return tasks.map(task => {\r\n        // If task has subtasks, calculate dates from them\r\n        if (task.subtasks && task.subtasks.length > 0) {\r\n          // First, recursively calculate dates for nested subtasks\r\n          const updatedSubtasks = calculateParentDates(task.subtasks);\r\n\r\n          // Filter subtasks that have dates\r\n          const subtasksWithDates = updatedSubtasks.filter(st => st.startDate && st.endDate);\r\n\r\n          if (subtasksWithDates.length > 0) {\r\n            // Calculate earliest start and latest end from subtasks\r\n            const startDates = subtasksWithDates.map(st => st.startDate!.getTime());\r\n            const endDates = subtasksWithDates.map(st => st.endDate!.getTime());\r\n\r\n            const earliestStart = new Date(Math.min(...startDates));\r\n            const latestEnd = new Date(Math.max(...endDates));\r\n\r\n            // v0.17.47: ALWAYS update parent dates from subtasks (MS Project summary task behavior)\r\n            // Parent tasks are read-only containers - their dates are derived from children\r\n            return {\r\n              ...task,\r\n              subtasks: updatedSubtasks,\r\n              startDate: earliestStart,\r\n              endDate: latestEnd,\r\n            };\r\n          }\r\n\r\n          return { ...task, subtasks: updatedSubtasks };\r\n        }\r\n\r\n        return task;\r\n      });\r\n    };\r\n\r\n    // Helper function to flatten tasks for rendering\r\n    const flattenTasks = (tasks: Task[], result: Task[] = []): Task[] => {\r\n      // Sort by position to maintain creation order\r\n      const sortedTasks = [...tasks].sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\r\n      for (const task of sortedTasks) {\r\n        result.push(task);\r\n        // Only include subtasks if parent is expanded (or if isExpanded is undefined, default to true)\r\n        if (task.subtasks && task.subtasks.length > 0 && (task.isExpanded === undefined || task.isExpanded)) {\r\n          flattenTasks(task.subtasks, result);\r\n        }\r\n      }\r\n      return result;\r\n    };\r\n\r\n    // Apply parent date calculation before flattening\r\n    const tasksWithCalculatedDates = calculateParentDates(tasks);\r\n    const flattened = flattenTasks(tasksWithCalculatedDates);\r\n\r\n    return flattened;\r\n  }, [tasks]);\r\n\r\n  // Calculate task position\r\n  const getTaskPosition = useCallback((task: Task) => {\r\n    // Return null position for tasks without dates\r\n    if (!task.startDate || !task.endDate) {\r\n      return { x: 0, width: 0 };\r\n    }\r\n\r\n    const taskStart = task.startDate.getTime();\r\n    const taskEnd = task.endDate.getTime();\r\n    const rangeStart = startDate.getTime();\r\n\r\n    const daysFromStart = (taskStart - rangeStart) / (1000 * 60 * 60 * 24);\r\n    // +1 so the end-date day is fully included (e.g. 16→28 feb = 13 columns, not 12)\r\n    const duration = (taskEnd - taskStart) / (1000 * 60 * 60 * 24) + 1;\r\n\r\n    const x = daysFromStart * dayWidth * zoom;\r\n    // Minimum width: allow 1 day minimum, but ensure at least 40px for visibility\r\n    const minWidth = Math.max(dayWidth * zoom, 40);\r\n    const width = Math.max(duration * dayWidth * zoom, minWidth);\r\n\r\n    return { x, width };\r\n  }, [startDate, dayWidth, zoom]);\r\n\r\n  // Build task positions map for collision detection\r\n  // v0.13.7: Y positions no longer include HEADER_HEIGHT (header is now separate sticky element)\r\n  const taskPositions = useMemo((): TaskPosition[] => {\r\n    return flatTasks\r\n      .filter(task => task.startDate && task.endDate) // Only include tasks with dates\r\n      .map((task) => {\r\n        const { x, width } = getTaskPosition(task);\r\n        const actualIndex = flatTasks.findIndex(t => t.id === task.id);\r\n        const y = actualIndex * ROW_HEIGHT + (ROW_HEIGHT - 18) / 2; // v1.4.29: Centered for 18px bar\r\n        return {\r\n          id: task.id,\r\n          x,\r\n          y,\r\n          width,\r\n          height: 18, // v1.4.29: Slimmer elegant bars\r\n        };\r\n      });\r\n  }, [flatTasks, getTaskPosition]);\r\n\r\n  // v0.13.0: Handle drag move for dependency cascade preview\r\n  // v1.5.0: Also store drag offset so dependency lines follow in real-time\r\n  const handleTaskDragMove = useCallback((taskId: string, daysDelta: number, isDragging: boolean) => {\r\n    if (!isDragging) {\r\n      setCascadePreviews([]);\r\n      setDragOffset(null);\r\n      return;\r\n    }\r\n\r\n    // Store drag offset for dependency line adjustment\r\n    setDragOffset({ taskId, daysDelta });\r\n\r\n    if (daysDelta === 0) {\r\n      setCascadePreviews([]);\r\n      return;\r\n    }\r\n\r\n    // Calculate cascade preview positions for all dependent tasks\r\n    const previews = ganttUtils.calculateCascadePreview(\r\n      tasks,\r\n      taskId,\r\n      daysDelta,\r\n      flatTasks,\r\n      startDate,\r\n      dayWidth * zoom,\r\n      ROW_HEIGHT,\r\n      HEADER_HEIGHT\r\n    );\r\n\r\n    setCascadePreviews(previews);\r\n  }, [tasks, flatTasks, startDate, dayWidth, zoom, ROW_HEIGHT, HEADER_HEIGHT]);\r\n\r\n  // v1.5.0: Get drag-adjusted position for dependency line endpoints\r\n  // During drag, offsets the dragged task and its cascade dependents\r\n  const getDragAdjustedPosition = useCallback((taskId: string, pos: { x: number; width: number }) => {\r\n    if (!dragOffset) return pos;\r\n    const scaledDayWidth = dayWidth * zoom;\r\n    const pixelDelta = dragOffset.daysDelta * scaledDayWidth;\r\n\r\n    // Dragged task — offset by daysDelta\r\n    if (taskId === dragOffset.taskId) {\r\n      return { x: pos.x + pixelDelta, width: pos.width };\r\n    }\r\n\r\n    // Dependent task with cascade preview — use preview position\r\n    const preview = cascadePreviews.find(p => p.taskId === taskId);\r\n    if (preview) {\r\n      return { x: preview.previewX, width: preview.width };\r\n    }\r\n\r\n    return pos;\r\n  }, [dragOffset, cascadePreviews, dayWidth, zoom]);\r\n\r\n  // Generate timeline headers\r\n  // v0.17.400: Use locale for date formatting (e.g., 'es' -> 'Dic 22', 'en' -> 'Dec 22')\r\n  const headers = useMemo(() => {\r\n    const result: Array<{ date: Date; label: string; x: number }> = [];\r\n    const current = new Date(startDate);\r\n    let index = 0;\r\n\r\n    while (current <= endDate) {\r\n      const daysFromStart =\r\n        (current.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24);\r\n      const x = daysFromStart * dayWidth * zoom;\r\n\r\n      if (timeScale === 'day') {\r\n        result.push({\r\n          date: new Date(current),\r\n          label: current.toLocaleDateString(locale, { day: 'numeric', month: 'short' }),\r\n          x,\r\n        });\r\n        current.setDate(current.getDate() + 1);\r\n      } else if (timeScale === 'week') {\r\n        const weekNum = getWeekNumber(current);\r\n        result.push({\r\n          date: new Date(current),\r\n          label: weekHeaderFormat === 'range'\r\n            ? (() => {\r\n                const fin = new Date(current);\r\n                fin.setDate(fin.getDate() + 6);\r\n                const mes = (d: Date) => d.toLocaleDateString(locale, { month: 'short' });\r\n                return mes(current) === mes(fin)\r\n                  ? `${mes(current)} ${current.getDate()}–${fin.getDate()}`\r\n                  : `${mes(current)} ${current.getDate()}–${mes(fin)} ${fin.getDate()}`;\r\n              })()\r\n            : `${t.labels.week} ${weekNum}`,\r\n          x,\r\n        });\r\n        current.setDate(current.getDate() + 7);\r\n      } else {\r\n        result.push({\r\n          date: new Date(current),\r\n          label: current.toLocaleDateString(locale, { month: 'short', year: 'numeric' }),\r\n          x,\r\n        });\r\n        current.setMonth(current.getMonth() + 1);\r\n      }\r\n      index++;\r\n    }\r\n\r\n    return result;\r\n  }, [startDate, endDate, timeScale, dayWidth, zoom, locale, t.labels.week, weekHeaderFormat]);\r\n\r\n  // Today position\r\n  const todayX = useMemo(() => {\r\n    const today = new Date();\r\n    const daysFromStart = (today.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24);\r\n    return daysFromStart * dayWidth * zoom;\r\n  }, [startDate, dayWidth, zoom]);\r\n\r\n  // v0.13.7: Content height calculation (without header - header is now separate)\r\n  const contentHeight = Math.max(flatTasks.length * ROW_HEIGHT, 600 - HEADER_HEIGHT);\r\n\r\n  return (\r\n    <div\r\n      className=\"w-full flex flex-col\"\r\n      data-gantt-chart\r\n      /* 1.9.36 · la escala visible, para que la app ajuste por CSS (rayado solo en D, etc.). */\r\n      data-escala={timeScale}\r\n      style={{ backgroundColor: theme.bgPrimary }}\r\n    >\r\n      {/* v0.13.7: Sticky Header - stays visible during vertical scroll */}\r\n      {/* Chronos V2: Frosted glass header */}\r\n      <div\r\n        style={{\r\n          position: 'sticky',\r\n          top: 0,\r\n          zIndex: 10,\r\n          backgroundColor: theme.glassHeader || theme.bgSecondary,\r\n          flexShrink: 0,\r\n          height: `${HEADER_HEIGHT}px`,\r\n          borderBottom: `1px solid ${theme.borderLight}`,\r\n          boxSizing: 'border-box', // Border included in height\r\n        }}\r\n      >\r\n        <svg\r\n          width={Math.max(timelineWidth, 1000)}\r\n          height={HEADER_HEIGHT - 1} // -1 for border\r\n          style={{ display: 'block' }}\r\n        >\r\n          {/* Header Background — opaque to prevent task bars bleeding through */}\r\n          <rect\r\n            x={0}\r\n            y={0}\r\n            width={Math.max(timelineWidth, 1000)}\r\n            height={HEADER_HEIGHT}\r\n            fill={theme.glassHeader || theme.bgSecondary}\r\n          />\r\n\r\n          {/* Header Grid Lines and Text */}\r\n          {headers.map((header, index) => (\r\n            <g key={`header-${index}`}>\r\n              {/* Grid line in header - skip first line since TaskGrid border serves as divider */}\r\n              {index > 0 && (\r\n                <line\r\n                  x1={header.x}\r\n                  y1={0}\r\n                  x2={header.x}\r\n                  y2={HEADER_HEIGHT}\r\n                  stroke={theme.border}\r\n                  strokeWidth={1}\r\n                  opacity={0.1}\r\n                />\r\n              )}\r\n\r\n              {/* Header text - JetBrains Mono for technical/date display.\r\n                  Los días festivos se resaltan en ámbar para distinguirlos. */}\r\n              <text\r\n                x={header.x + 8}\r\n                y={HEADER_HEIGHT / 2}\r\n                fill={timeScale === 'day' && !isWeekend(header.date) && isHoliday(header.date) ? '#F59E0B' : theme.textTertiary}\r\n                fontSize=\"11\"\r\n                fontFamily=\"'JetBrains Mono', ui-monospace, monospace\"\r\n                fontWeight=\"500\"\r\n                dominantBaseline=\"middle\"\r\n              >\r\n                {header.label}\r\n              </text>\r\n            </g>\r\n          ))}\r\n\r\n          {/* Today marker in header — Chronos V2: Badge instead of circle */}\r\n          {todayX >= 0 && todayX <= timelineWidth && (\r\n            <g data-hoy=\"cabecera\">\r\n              {/* Neon glow circle */}\r\n              <circle cx={todayX} cy={HEADER_HEIGHT - 10} r={4} fill={theme.today} opacity={1} />\r\n              {theme.neonRedGlow && (\r\n                <circle cx={todayX} cy={HEADER_HEIGHT - 10} r={6} fill=\"none\" stroke={theme.today} strokeWidth={1} opacity={0.3} />\r\n              )}\r\n              {/* TODAY badge */}\r\n              {theme.neonRedGlow && (\r\n                <g transform={`translate(${todayX - 18}, 2)`}>\r\n                  <rect x={0} y={0} width={36} height={14} rx={2} fill=\"rgba(0,0,0,0.8)\" stroke={theme.today} strokeWidth={0.5} opacity={0.8} />\r\n                  <text x={18} y={10} textAnchor=\"middle\" fill={theme.today} fontSize=\"7\" fontFamily=\"'JetBrains Mono', monospace\" fontWeight=\"700\" letterSpacing=\"0.1em\">{t.labels.today.toUpperCase()}</text>\r\n                </g>\r\n              )}\r\n            </g>\r\n          )}\r\n        </svg>\r\n      </div>\r\n\r\n      {/* Scrollable Content Area */}\r\n      {/* v0.17.31: Added overflow:visible to allow tooltips to render above the header */}\r\n      {/* v0.17.452: Added onMouseMove to detect when mouse leaves dependency lines (fast movement fix) */}\r\n      <svg\r\n        ref={contentSvgRef}\r\n        width={Math.max(timelineWidth, 1000)}\r\n        height={contentHeight}\r\n        style={{ display: 'block', flexShrink: 0, overflow: 'visible' }}\r\n        onMouseMove={handleSvgMouseMove}\r\n      >\r\n        <defs>\r\n          <filter id=\"shadow\">\r\n            <feDropShadow dx=\"0\" dy=\"1\" stdDeviation=\"2\" floodOpacity=\"0.1\" />\r\n          </filter>\r\n\r\n          {/* Neutral theme: Diagonal stripes pattern for critical/overdue tasks */}\r\n          <pattern id=\"diagonal-stripes\" width=\"8\" height=\"8\" patternUnits=\"userSpaceOnUse\" patternTransform=\"rotate(45)\">\r\n            <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"8\" stroke={theme.border} strokeWidth=\"2\" />\r\n          </pattern>\r\n\r\n          {/* Chronos V2: Weekend hatched pattern — diagonal toward right */}\r\n          <pattern id=\"weekend-hatch\" width=\"8\" height=\"8\" patternUnits=\"userSpaceOnUse\" patternTransform=\"rotate(45)\">\r\n            <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"8\" stroke={(theme.bgPrimary || '').charAt(1) === '0' ? 'rgba(255,255,255,0.055)' : 'rgba(0,0,0,0.04)'} strokeWidth=\"4\" />\r\n          </pattern>\r\n\r\n          {/*\r\n            * v1.4.29: Diagonal stripes for remaining (no-progress) area of task bars.\r\n            *\r\n            * v1.9.15 · LA BANDA SIGUE EL COLOR DE SU TAREA.\r\n            *\r\n            * Divar (Asakaa, 27-ago): «le puse color personalizado y se sigue\r\n            * viendo azul porque no se ha llenado nada — deberia verse el rojizo\r\n            * transparentoso».\r\n            *\r\n            * Y tenia razon: esta banda estaba fijada a `#00E5CC`. Con progreso\r\n            * 0 % el area restante cubre la barra ENTERA, asi que tapaba el\r\n            * color custom que se pintaba debajo. El color se guardaba, viajaba\r\n            * y llegaba bien — se perdia justo aqui, en el ultimo pixel.\r\n            *\r\n            * ── ESTE PATRON GLOBAL YA NO LO USA LA BARRA ────────────────\r\n            *\r\n            * Mi primer intento fue poner `currentColor` aqui, creyendo que\r\n            * heredaria el color de quien lo referencia. NO ES ASI:\r\n            * `currentColor` dentro de un `<pattern>` se resuelve DONDE SE\r\n            * DEFINE, no donde se usa. El borde de la barra salio del color\r\n            * correcto y la trama de dentro siguio turquesa — medio arreglo,\r\n            * que en una captura parece el arreglo entero.\r\n            *\r\n            * La solucion vive en `TaskBar`: cada barra declara SU patron con\r\n            * su color y un `id` propio. Este se queda por si algo externo lo\r\n            * referencia, con el color que siempre tuvo.\r\n            */}\r\n          <pattern id=\"bar-remaining-hatch\" width=\"10\" height=\"10\" patternUnits=\"userSpaceOnUse\" patternTransform=\"rotate(45)\">\r\n            {/* Stripe 1: colored band — hereda el color de la barra que la usa */}\r\n            <rect x=\"0\" y=\"0\" width=\"5\" height=\"10\" fill=\"#00E5CC\" opacity=\"0.18\" />\r\n            {/* Stripe 2: gray band */}\r\n            <rect x=\"5\" y=\"0\" width=\"5\" height=\"10\" fill=\"#94A3B8\" opacity=\"0.12\" />\r\n          </pattern>\r\n        </defs>\r\n\r\n        {/* Full SVG Background - v0.17.220: Matches TaskGrid bgPrimary for alignment */}\r\n        <rect\r\n          x={0}\r\n          y={0}\r\n          width={Math.max(timelineWidth, 1000)}\r\n          height={contentHeight}\r\n          fill={theme.bgPrimary}\r\n        />\r\n\r\n        {/* Weekend backgrounds removed — only hatch overlay after row backgrounds */}\r\n\r\n        {/* Row Backgrounds - v0.17.220: Alternating rows matching TaskGrid */}\r\n        {flatTasks.map((task, index) => (\r\n          <rect\r\n            key={`row-bg-${task.id}`}\r\n            x={0}\r\n            y={index * ROW_HEIGHT}\r\n            width={Math.max(timelineWidth, 1000)}\r\n            height={ROW_HEIGHT}\r\n            fill={index % 2 === 0 ? theme.bgPrimary : theme.bgGrid}\r\n            opacity={1}\r\n            style={{ pointerEvents: 'none' }}\r\n          />\r\n        ))}\r\n\r\n        {/* v1.4.29: Grid lines rendered AFTER row backgrounds so they are never covered */}\r\n        {/* Vertical column grid lines */}\r\n        {headers.map((header, index) =>\r\n          index > 0 ? (\r\n            <line\r\n              key={`vgrid-${index}`}\r\n              x1={header.x}\r\n              y1={0}\r\n              x2={header.x}\r\n              y2={flatTasks.length * ROW_HEIGHT}\r\n              stroke={theme.borderLight}\r\n              strokeWidth={1}\r\n              shapeRendering=\"crispEdges\"\r\n              opacity={theme.neonRedGlow ? 1 : 0.1}\r\n            />\r\n          ) : null\r\n        )}\r\n\r\n        {/* Weekend + holiday overlays — subtle gray tint + diagonal hatch.\r\n            Los festivos (workingDaysConfig.holidayDates) se sombrean igual que\r\n            los fines de semana. Solo aplica en escala de día. */}\r\n        {headers.map((header, index) => {\r\n          const nextX = headers[index + 1]?.x || timelineWidth;\r\n          const isWeekendDay = highlightWeekends && isWeekend(header.date);\r\n          // Solo marcar festivo si NO es ya fin de semana (evita doble pintado).\r\n          const isHolidayDay = timeScale === 'day' && !isWeekend(header.date) && isHoliday(header.date);\r\n          const shouldShade = isWeekendDay || isHolidayDay;\r\n\r\n          return shouldShade ? (\r\n            <g key={`we-overlay-${index}`} data-finde=\"true\">\r\n              <rect\r\n                x={header.x}\r\n                y={0}\r\n                width={nextX - header.x}\r\n                height={flatTasks.length * ROW_HEIGHT}\r\n                fill={(theme.bgPrimary || '').charAt(1) === '0' ? 'rgba(255,255,255,0.04)' : 'rgba(0,0,0,0.03)'}\r\n                style={{ pointerEvents: 'none' }}\r\n              />\r\n              <rect\r\n                x={header.x}\r\n                y={0}\r\n                width={nextX - header.x}\r\n                height={flatTasks.length * ROW_HEIGHT}\r\n                fill=\"url(#weekend-hatch)\"\r\n                style={{ pointerEvents: 'none' }}\r\n              />\r\n            </g>\r\n          ) : null;\r\n        })}\r\n\r\n        {/* Row interactions: Click-to-Create functionality */}\r\n        {flatTasks.map((task, index) => {\r\n          const hasTaskBar = task.startDate && task.endDate;\r\n\r\n          return (\r\n            <g key={`row-group-${task.id}`}>\r\n              {/* Clickable area for tasks without dates - v1.4.19: ClickUp-style with moving indicator */}\r\n              {!hasTaskBar && (\r\n                <>\r\n                  <rect\r\n                    key={`clickable-${task.id}`}\r\n                    x={0}\r\n                    y={index * ROW_HEIGHT}\r\n                    width={timelineWidth}\r\n                    height={ROW_HEIGHT}\r\n                    fill=\"transparent\"\r\n                    style={{\r\n                      cursor: 'pointer',\r\n                      pointerEvents: 'all'\r\n                    }}\r\n                    onClick={(e) => handleTimelineClick(e, task)}\r\n                    onMouseMove={(e) => handleEmptyRowMouseMove(e, task, index)}\r\n                    onMouseLeave={() => {\r\n                      handleEmptyRowMouseLeave();\r\n                    }}\r\n                  />\r\n                  {/* v1.4.19: Schedule indicator - circular marker that follows cursor (ClickUp-style) */}\r\n                  {scheduleIndicator && scheduleIndicator.taskId === task.id && (\r\n                    <g style={{ pointerEvents: 'none' }}>\r\n                      {/* Vertical line at cursor position */}\r\n                      <line\r\n                        x1={scheduleIndicator.x}\r\n                        y1={index * ROW_HEIGHT + 4}\r\n                        x2={scheduleIndicator.x}\r\n                        y2={index * ROW_HEIGHT + ROW_HEIGHT - 4}\r\n                        stroke={theme.accent}\r\n                        strokeWidth={2}\r\n                        opacity={0.8}\r\n                      />\r\n                      {/* Circle indicator */}\r\n                      <circle\r\n                        cx={scheduleIndicator.x}\r\n                        cy={scheduleIndicator.y}\r\n                        r={8}\r\n                        fill={theme.accent}\r\n                        opacity={0.9}\r\n                      />\r\n                      {/* Inner circle for visual effect */}\r\n                      <circle\r\n                        cx={scheduleIndicator.x}\r\n                        cy={scheduleIndicator.y}\r\n                        r={4}\r\n                        fill=\"white\"\r\n                        opacity={0.9}\r\n                      />\r\n                      {/* Date tooltip above the indicator */}\r\n                      <g transform={`translate(${scheduleIndicator.x}, ${index * ROW_HEIGHT - 8})`}>\r\n                        <rect\r\n                          x={-40}\r\n                          y={-20}\r\n                          width={80}\r\n                          height={20}\r\n                          rx={4}\r\n                          fill={theme.bgSecondary}\r\n                          stroke={theme.border}\r\n                          strokeWidth={1}\r\n                        />\r\n                        <text\r\n                          x={0}\r\n                          y={-6}\r\n                          textAnchor=\"middle\"\r\n                          fill={theme.textPrimary}\r\n                          fontSize=\"11\"\r\n                          fontFamily=\"Inter, sans-serif\"\r\n                          fontWeight=\"500\"\r\n                        >\r\n                          {scheduleIndicator.date.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', {\r\n                            day: 'numeric',\r\n                            month: 'short'\r\n                          })}\r\n                        </text>\r\n                      </g>\r\n                    </g>\r\n                  )}\r\n                  {/* Placeholder text - only show when no indicator is active */}\r\n                  {(!scheduleIndicator || scheduleIndicator.taskId !== task.id) && (\r\n                    <text\r\n                      key={`placeholder-${task.id}`}\r\n                      x={todayX > 0 ? todayX : 100}\r\n                      y={index * ROW_HEIGHT + ROW_HEIGHT / 2}\r\n                      fill={theme.textTertiary}\r\n                      fontSize=\"12\"\r\n                      fontFamily=\"Inter, sans-serif\"\r\n                      fontStyle=\"italic\"\r\n                      dominantBaseline=\"middle\"\r\n                      opacity={0.4}\r\n                      style={{ pointerEvents: 'none', userSelect: 'none' }}\r\n                    >\r\n                      {t.labels.clickToSetDates}\r\n                    </text>\r\n                  )}\r\n                </>\r\n              )}\r\n            </g>\r\n          );\r\n        })}\r\n\r\n        {/* v0.17.363: Dependencies moved to AFTER tasks for proper layering */}\r\n\r\n        {/* Tasks - v0.13.7: Adjusted Y positions */}\r\n        {flatTasks.map((task, index) => {\r\n          // Don't render task bar if task doesn't have dates\r\n          if (!task.startDate || !task.endDate) {\r\n            return null;\r\n          }\r\n\r\n          const { x, width } = getTaskPosition(task);\r\n          const y = index * ROW_HEIGHT + (ROW_HEIGHT - 18) / 2; // v1.4.29: Centered for 18px bar\r\n\r\n          // Container phase (has subtasks): render as bracket bar\r\n          const isContainer = task.subtasks && task.subtasks.length > 0 && !task.isMilestone;\r\n\r\n          if (task.isMilestone) {\r\n            return (\r\n              <Milestone\r\n                key={task.id}\r\n                task={task}\r\n                x={x + width / 2}\r\n                y={y + 12}\r\n                theme={theme}\r\n                onClick={onTaskClick}\r\n              />\r\n            );\r\n          }\r\n\r\n          if (isContainer) {\r\n            // v5.0.0: Master/Summary bars — 8px progress bar with SPI-colored fill\r\n            const isDarkTheme = !theme.bgPrimary || theme.bgPrimary.startsWith('#0') || theme.bgPrimary.startsWith('#1');\r\n            const masterH = 8;\r\n            const masterY = y + (ROW_HEIGHT - 18) / 2 + (18 - masterH) / 2;\r\n            const masterR = 4;\r\n\r\n            // Calculate SPI for color\r\n            const progress = task.progress || 0;\r\n            const now = new Date();\r\n            now.setHours(0, 0, 0, 0);\r\n\r\n            const hasStarted = task.startDate && now >= task.startDate;\r\n            const isOverduePhase = task.endDate && (() => {\r\n              const end = new Date(task.endDate!);\r\n              end.setHours(0, 0, 0, 0);\r\n              return now > end;\r\n            })();\r\n            const isFuturePhase = task.startDate && now < task.startDate;\r\n\r\n            let spi = 1.0;\r\n            if (hasStarted && task.startDate && task.endDate && !isFuturePhase) {\r\n              const start = new Date(task.startDate);\r\n              start.setHours(0, 0, 0, 0);\r\n              const end = new Date(task.endDate);\r\n              end.setHours(0, 0, 0, 0);\r\n              const totalDays = Math.max(1, (end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));\r\n              const elapsedDays = Math.min((now.getTime() - start.getTime()) / (1000 * 60 * 60 * 24), totalDays);\r\n              const timelinePct = (elapsedDays / totalDays) * 100;\r\n              spi = timelinePct > 0 ? progress / timelinePct : 1.0;\r\n            }\r\n\r\n            let fillColor: string;\r\n            if (progress >= 100) {\r\n              fillColor = '#00E5CC';\r\n            } else if (isFuturePhase) {\r\n              fillColor = '#4B5563';\r\n            } else if (isOverduePhase && progress < 100) {\r\n              fillColor = '#EF4444';\r\n            } else if (spi >= 0.95) {\r\n              fillColor = '#22C55E';\r\n            } else if (spi >= 0.80) {\r\n              fillColor = '#F59E0B';\r\n            } else {\r\n              fillColor = '#EF4444';\r\n            }\r\n\r\n            const fillWidth = Math.max((progress / 100) * width, progress > 0 ? masterR * 2 : 0);\r\n            const showPctOnBar = width > 100 && progress > 0;\r\n\r\n            // v5.1.0: CPM — master bar is critical if isCriticalPath is set (from GanttBoard)\r\n            const masterIsCritical = task.isCriticalPath;\r\n            const masterCpmOpacity = showCriticalPath ? (masterIsCritical ? 1.0 : 0.25) : 1.0;\r\n\r\n            return (\r\n              <g\r\n                key={task.id}\r\n                onClick={() => onTaskClick?.(task)}\r\n                onContextMenu={(e) => {\r\n                  e.preventDefault();\r\n                  e.stopPropagation();\r\n                  onTaskContextMenu?.(task, e as unknown as React.MouseEvent);\r\n                }}\r\n                onMouseMove={(e) => {\r\n                  handleTooltipChange({\r\n                    task,\r\n                    x,\r\n                    y: masterY,\r\n                    width,\r\n                    height: masterH,\r\n                    showBelow: masterY < 100,\r\n                    mouseX: e.clientX,\r\n                    mouseY: e.clientY,\r\n                  });\r\n                }}\r\n                onMouseLeave={() => handleTooltipChange(null)}\r\n                style={{ cursor: 'default', opacity: masterCpmOpacity, transition: 'opacity 300ms ease' }}\r\n                /* 1.9.36 · barra resumen: mismo estado que las hojas (la app pinta por CSS). */\r\n                data-barra-resumen=\"true\"\r\n                data-estado={progress >= 100 ? 'completed' : (isOverduePhase ? 'overdue' : 'planned')}\r\n              >\r\n                {/* Invisible hover area — full row height for easy targeting */}\r\n                <rect\r\n                  x={x}\r\n                  y={y}\r\n                  width={width}\r\n                  height={ROW_HEIGHT}\r\n                  fill=\"transparent\"\r\n                  style={{ pointerEvents: 'all' }}\r\n                />\r\n                {/* Ghost background — full duration */}\r\n                <rect\r\n                  x={x}\r\n                  y={masterY}\r\n                  width={width}\r\n                  height={masterH}\r\n                  rx={masterR}\r\n                  fill={isDarkTheme ? \"rgba(255,255,255,0.10)\" : \"rgba(0,0,0,0.08)\"}\r\n                  data-parte=\"pista\"\r\n                />\r\n                {/* Progress fill — SPI-colored */}\r\n                {progress > 0 && (\r\n                  <rect\r\n                    x={x}\r\n                    y={masterY}\r\n                    width={fillWidth}\r\n                    height={masterH}\r\n                    rx={masterR}\r\n                    fill={fillColor}\r\n                    data-parte=\"avance\"\r\n                  />\r\n                )}\r\n                {/* v5.1.0: CPM critical border + glow on master bar */}\r\n                {showCriticalPath && masterIsCritical && (\r\n                  <rect\r\n                    x={x}\r\n                    y={masterY}\r\n                    width={width}\r\n                    height={masterH}\r\n                    rx={masterR}\r\n                    fill=\"none\"\r\n                    stroke=\"#EF4444\"\r\n                    strokeWidth={2}\r\n                    style={{ pointerEvents: 'none', filter: 'drop-shadow(0 0 6px rgba(239, 68, 68, 0.4))' }}\r\n                  />\r\n                )}\r\n                {/* Percentage label on bar (only if wide enough) */}\r\n                {showPctOnBar && (\r\n                  <text\r\n                    x={x + fillWidth + 6}\r\n                    y={masterY + masterH / 2}\r\n                    dominantBaseline=\"central\"\r\n                    fill={isDarkTheme ? \"rgba(255,255,255,0.7)\" : \"rgba(0,0,0,0.55)\"}\r\n                    fontSize=\"9\"\r\n                    fontWeight=\"700\"\r\n                    fontFamily=\"'JetBrains Mono', monospace\"\r\n                    style={{ pointerEvents: 'none', userSelect: 'none' }}\r\n                  >\r\n                    {Math.round(progress)}%\r\n                  </text>\r\n                )}\r\n              </g>\r\n            );\r\n          }\r\n\r\n          return (\r\n            <TaskBar\r\n              key={task.id}\r\n              task={task}\r\n              x={x}\r\n              y={y}\r\n              width={width}\r\n              theme={theme}\r\n              dayWidth={dayWidth * zoom}\r\n              startDate={startDate}\r\n              templates={templates}\r\n              onClick={onTaskClick}\r\n              onDoubleClick={onTaskDblClick} // v0.8.0\r\n              onContextMenu={onTaskContextMenu} // v0.8.0\r\n              onDateChange={onTaskDateChange}\r\n              onDependencyCreate={onDependencyCreate}\r\n              allTaskPositions={taskPositions}\r\n              onDragMove={handleTaskDragMove} // v0.13.0\r\n              onHoverChange={handleTooltipChange} // v0.17.76: Top-layer tooltip\r\n              showBaseline={showBaseline} // v3.0.0: Baseline overlay\r\n              showTaskBarLabels={showTaskBarLabels}\r\n              showCriticalPath={showCriticalPath}\r\n              readOnly={canEditTask ? !canEditTask(task) : false}\r\n              onProgressChange={onTaskProgressDrag}\r\n            />\r\n          );\r\n        })}\r\n\r\n        {/* v0.17.363: SINGLE dependency layer - rendered AFTER tasks for proper z-order */}\r\n        {/* v0.17.451: Base layer only - hover overlay rendered separately at end */}\r\n        {showDependencies && flatTasks.map((task, toIndex) => {\r\n          if (!task.dependencies || task.dependencies.length === 0) return null;\r\n          if (!task.startDate || !task.endDate) return null;\r\n\r\n          return task.dependencies.map((depId) => {\r\n            const depTask = flatTasks.find((t) => t.id === depId);\r\n            if (!depTask) return null;\r\n            if (!depTask.startDate || !depTask.endDate) return null;\r\n\r\n            const fromIndex = flatTasks.findIndex((t) => t.id === depId);\r\n            // v1.5.0: Use drag-adjusted positions so lines follow during drag\r\n            const fromPos = getDragAdjustedPosition(depTask.id, getTaskPosition(depTask));\r\n            const toPos = getDragAdjustedPosition(task.id, getTaskPosition(task));\r\n\r\n            const exitX = fromPos.x + fromPos.width;\r\n            const exitY = fromIndex * ROW_HEIGHT + 26;\r\n            const enterX = toPos.x;\r\n            const enterY = toIndex * ROW_HEIGHT + 26;\r\n\r\n            const lineKey = `dep-${depId}-${task.id}`;\r\n\r\n            // v0.17.452: Skip rendering if this dependency was deleted locally\r\n            if (deletedDeps.has(lineKey)) return null;\r\n\r\n            // v5.1.0: CPM — critical deps in red, non-critical almost invisible\r\n            const bothCritical = showCriticalPath && task.isCriticalPath && depTask.isCriticalPath;\r\n            const cpmColorOverride = showCriticalPath\r\n              ? (bothCritical ? '#EF4444' : 'rgba(255,255,255,0.10)')\r\n              : undefined;\r\n            const cpmStrokeWidth = showCriticalPath\r\n              ? (bothCritical ? 2 : 1)\r\n              : undefined;\r\n            const cpmGlow = bothCritical\r\n              ? 'drop-shadow(0 0 4px rgba(239, 68, 68, 0.3))'\r\n              : undefined;\r\n\r\n            return (\r\n              <DependencyLine\r\n                key={lineKey}\r\n                x1={exitX}\r\n                y1={exitY}\r\n                x2={enterX}\r\n                y2={enterY}\r\n                theme={theme}\r\n                lineStyle={dependencyLineStyle}\r\n                colorOverride={cpmColorOverride}\r\n                strokeWidthOverride={cpmStrokeWidth}\r\n                glowFilter={cpmGlow}\r\n                onDelete={() => onDependencyDelete?.(task.id, depId)}\r\n                onHoverChange={(isHovered) => {\r\n                  // v0.17.452: Update ref for fast mouse movement detection\r\n                  isOverDependencyRef.current = isHovered;\r\n                  if (isHovered) {\r\n                    setHoveredDepLine({\r\n                      key: lineKey,\r\n                      fromId: depId,\r\n                      toId: task.id,\r\n                      exitX,\r\n                      exitY,\r\n                      enterX,\r\n                      enterY,\r\n                    });\r\n                  }\r\n                  // v0.17.451: Don't clear on base layer mouseLeave - let overlay handle it\r\n                }}\r\n              />\r\n            );\r\n          });\r\n        })}\r\n\r\n        {/* v0.13.0: Dependency Cascade Preview - Ghost bars showing where dependent tasks will move */}\r\n        {/* v0.13.4: Simplified - no conflicting animation, direct position */}\r\n        {/* v0.13.7: Adjusted Y positions for cascade previews */}\r\n        {cascadePreviews.map((preview) => (\r\n          <g\r\n            key={`cascade-preview-${preview.taskId}`}\r\n            style={{ pointerEvents: 'none' }}\r\n          >\r\n            {/* Ghost bar at exact preview position - matched to actual bar height (18px) */}\r\n            <rect\r\n              x={preview.previewX}\r\n              y={preview.y - HEADER_HEIGHT}\r\n              width={preview.width}\r\n              height={18}\r\n              rx={6}\r\n              fill={preview.color || theme.accent}\r\n              opacity={0.15}\r\n              stroke={theme.accent}\r\n              strokeWidth={1}\r\n              strokeDasharray=\"4 3\"\r\n            />\r\n            {/* Days delta label */}\r\n            {Math.abs(preview.daysDelta) > 0 && (\r\n              <text\r\n                x={preview.previewX + preview.width / 2}\r\n                y={preview.y - HEADER_HEIGHT + 9}\r\n                textAnchor=\"middle\"\r\n                dominantBaseline=\"middle\"\r\n                fill={theme.accent}\r\n                fontSize=\"10\"\r\n                fontWeight=\"600\"\r\n                fontFamily=\"Inter, sans-serif\"\r\n                style={{ userSelect: 'none' }}\r\n              >\r\n                {preview.daysDelta > 0 ? `+${preview.daysDelta}d` : `${preview.daysDelta}d`}\r\n              </text>\r\n            )}\r\n          </g>\r\n        ))}\r\n\r\n        {/* v0.17.451: Dependency hover overlay - rendered LAST to appear on top of all lines */}\r\n        {showDependencies && hoveredDepLine && (\r\n          <DependencyLine\r\n            key={`${hoveredDepLine.key}-hover-overlay`}\r\n            x1={hoveredDepLine.exitX}\r\n            y1={hoveredDepLine.exitY}\r\n            x2={hoveredDepLine.enterX}\r\n            y2={hoveredDepLine.enterY}\r\n            theme={theme}\r\n            lineStyle={dependencyLineStyle}\r\n            onDelete={() => {\r\n              // v0.17.452: Clear hover state and mark as deleted for instant UI feedback\r\n              const lineKey = hoveredDepLine.key;\r\n              setHoveredDepLine(null);\r\n              isOverDependencyRef.current = false;\r\n              setDeletedDeps(prev => new Set(prev).add(lineKey));\r\n              onDependencyDelete?.(hoveredDepLine.toId, hoveredDepLine.fromId);\r\n            }}\r\n            hoverOverlayOnly={true}\r\n            onHoverChange={(isHovered) => {\r\n              // v0.17.452: Update ref for fast mouse movement detection\r\n              isOverDependencyRef.current = isHovered;\r\n              // Only clear if mouse actually left the overlay area\r\n              if (!isHovered) {\r\n                setHoveredDepLine(null);\r\n              }\r\n            }}\r\n          />\r\n        )}\r\n\r\n        {/* v0.17.179: Today Line — Chronos V2: Neon red with glow */}\r\n        {todayX >= 0 && todayX <= timelineWidth && (\r\n          <g data-hoy=\"linea\" style={{ pointerEvents: 'none' }}>\r\n            {/* Glow effect (wider, transparent) */}\r\n            {theme.neonRedGlow && (\r\n              <line\r\n                x1={todayX}\r\n                y1={0}\r\n                x2={todayX}\r\n                y2={contentHeight}\r\n                stroke={theme.today}\r\n                strokeWidth={6}\r\n                opacity={0.15}\r\n              />\r\n            )}\r\n            {/* Sharp line */}\r\n            <line\r\n              x1={todayX}\r\n              y1={0}\r\n              x2={todayX}\r\n              y2={contentHeight}\r\n              stroke={theme.today}\r\n              strokeWidth={1}\r\n              opacity={1}\r\n            />\r\n          </g>\r\n        )}\r\n\r\n      </svg>\r\n\r\n      {/* v1.4.28: Tooltip rendered via portal to document.body — never clipped by scroll containers */}\r\n      {activeTooltip && (\r\n        <TaskTooltip\r\n          tooltipData={activeTooltip}\r\n          theme={theme}\r\n          locale={locale === 'es' ? 'es' : 'en'}\r\n          workingDaysConfig={workingDaysConfig}\r\n        />\r\n      )}\r\n    </div>\r\n  );\r\n}","/**\r\n * GanttAIAssistant - AI-powered natural language task editor\r\n * Allows users to edit Gantt tasks using natural language commands\r\n *\r\n * @version 0.14.0\r\n *\r\n * @example\r\n * // In GanttBoard with AI assistant\r\n * <GanttBoard\r\n *   tasks={tasks}\r\n *   config={{\r\n *     aiAssistant: {\r\n *       enabled: true,\r\n *       onCommand: async (command, tasks) => {\r\n *         // Call your AI API and return task updates\r\n *         const response = await fetch('/api/gantt-ai', {\r\n *           method: 'POST',\r\n *           body: JSON.stringify({ command, tasks })\r\n *         });\r\n *         return response.json();\r\n *       }\r\n *     }\r\n *   }}\r\n * />\r\n */\r\n\r\nimport { useState, useRef, useEffect, useCallback } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { Portal } from '../Portal';\r\nimport {\r\n  Task,\r\n  GanttTheme,\r\n  AICommandResult,\r\n  AIMessage,\r\n  GanttAIAssistantConfig,\r\n} from './types';\r\n\r\n// Re-export types for backwards compatibility\r\nexport type { AICommandResult, AIMessage, GanttAIAssistantConfig } from './types';\r\nexport type { PersistHistoryConfig } from './types';\r\n\r\nexport interface GanttAIAssistantProps {\r\n  /** All current tasks in the Gantt */\r\n  tasks: Task[];\r\n  /** Theme configuration */\r\n  theme: GanttTheme;\r\n  /** AI assistant configuration */\r\n  config: GanttAIAssistantConfig;\r\n  /** Callback when tasks should be updated */\r\n  onTasksUpdate: (updatedTasks: Task[]) => void;\r\n  /** Callback for single task update */\r\n  onTaskUpdate?: (taskId: string, updates: Partial<Task>) => void;\r\n  /** Callback for task creation */\r\n  onTaskCreate?: (task: Task) => void;\r\n  /** Callback for task deletion */\r\n  onTaskDelete?: (taskId: string) => void;\r\n  /** Callback for dependency creation */\r\n  onDependencyCreate?: (fromTaskId: string, toTaskId: string) => void;\r\n  /** Callback for dependency deletion */\r\n  onDependencyDelete?: (taskId: string, dependencyId: string) => void;\r\n}\r\n\r\n// Default suggestions for the command palette\r\nconst DEFAULT_SUGGESTIONS = [\r\n  'Move \"Task Name\" to next Monday',\r\n  'Extend \"Task Name\" by 3 days',\r\n  'Rename \"Old Name\" to \"New Name\"',\r\n  'Set \"Task Name\" progress to 50%',\r\n  'Link \"Task A\" to \"Task B\"',\r\n  'Create a new task called \"New Task\"',\r\n  'Delete \"Task Name\"',\r\n  'Assign John to \"Task Name\"',\r\n];\r\n\r\n// Sparkle/AI icon component — compact 16px for mini FAB\r\nconst AIIcon = ({ size = 16 }: { size?: number }) => (\r\n  <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n    <path d=\"M12 2l2.4 7.2L22 12l-7.6 2.8L12 22l-2.4-7.2L2 12l7.6-2.8L12 2z\" />\r\n  </svg>\r\n);\r\n\r\n// Send icon\r\nconst SendIcon = () => (\r\n  <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n    <path d=\"M22 2L11 13M22 2L15 22L11 13M22 2L2 9L11 13\" />\r\n  </svg>\r\n);\r\n\r\n// Close icon\r\nconst CloseIcon = () => (\r\n  <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n    <path d=\"M18 6L6 18M6 6L18 18\" />\r\n  </svg>\r\n);\r\n\r\n// Minimize icon\r\nconst MinimizeIcon = () => (\r\n  <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n    <path d=\"M5 12h14\" />\r\n  </svg>\r\n);\r\n\r\n// Loading dots animation\r\nconst LoadingDots = () => (\r\n  <div className=\"flex gap-1 items-center\">\r\n    {[0, 1, 2].map((i) => (\r\n      <motion.div\r\n        key={i}\r\n        className=\"w-2 h-2 rounded-full bg-current\"\r\n        animate={{\r\n          scale: [1, 1.2, 1],\r\n          opacity: [0.5, 1, 0.5],\r\n        }}\r\n        transition={{\r\n          duration: 0.8,\r\n          repeat: Infinity,\r\n          delay: i * 0.15,\r\n        }}\r\n      />\r\n    ))}\r\n  </div>\r\n);\r\n\r\nexport function GanttAIAssistant({\r\n  tasks,\r\n  theme,\r\n  config,\r\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n  onTasksUpdate: _onTasksUpdate, // Reserved for batch updates\r\n  onTaskUpdate,\r\n  onTaskCreate,\r\n  onTaskDelete,\r\n  onDependencyCreate,\r\n  onDependencyDelete,\r\n}: GanttAIAssistantProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const [isMinimized, setIsMinimized] = useState(false);\r\n  const [messages, setMessages] = useState<AIMessage[]>([]);\r\n  const [inputValue, setInputValue] = useState('');\r\n  const [isLoading, setIsLoading] = useState(false);\r\n  const [showSuggestions, setShowSuggestions] = useState(true);\r\n\r\n  // @mention autocomplete state\r\n  const [mentionQuery, setMentionQuery] = useState('');\r\n  const [mentionStartIndex, setMentionStartIndex] = useState(-1);\r\n  const [showMentionDropdown, setShowMentionDropdown] = useState(false);\r\n  const [mentionSelectedIndex, setMentionSelectedIndex] = useState(0);\r\n\r\n  const inputRef = useRef<HTMLInputElement>(null);\r\n  const messagesEndRef = useRef<HTMLDivElement>(null);\r\n  const chatContainerRef = useRef<HTMLDivElement>(null);\r\n  const mentionDropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n  const {\r\n    enabled = true,\r\n    placeholder = 'Ask AI to edit tasks... (e.g., \"Move Design to next week\")',\r\n    position = 'bottom-right',\r\n    onCommand,\r\n    suggestions = DEFAULT_SUGGESTIONS,\r\n    maxHistory = 50,\r\n    persistHistory,\r\n    mentionableUsers = [],\r\n  } = config;\r\n\r\n  // Theme-aware color tokens\r\n  const isDark = theme.bgPrimary === '#050505' || theme.bgPrimary === '#0a0a0a' || theme.textPrimary === '#FFFFFF';\r\n  const fabBg = isDark ? 'rgba(10, 10, 10, 0.75)' : 'rgba(255, 255, 255, 0.85)';\r\n  const fabBorder = isDark ? 'rgba(0, 229, 204, 0.15)' : 'rgba(0, 229, 204, 0.25)';\r\n  const fabShadow = isDark\r\n    ? '0 0 20px rgba(0, 229, 204, 0.08), 0 4px 12px rgba(0, 0, 0, 0.4), inset 0 0 12px rgba(0, 229, 204, 0.04)'\r\n    : '0 0 20px rgba(0, 229, 204, 0.06), 0 4px 12px rgba(0, 0, 0, 0.08)';\r\n  const ringBorderA = isDark ? 'rgba(0, 229, 204, 0.2)' : 'rgba(0, 229, 204, 0.15)';\r\n  const ringBorderB = isDark ? 'rgba(0, 229, 204, 0.08)' : 'rgba(0, 229, 204, 0.06)';\r\n  const tooltipBg = isDark ? 'rgba(10, 10, 10, 0.85)' : 'rgba(255, 255, 255, 0.95)';\r\n  const tooltipBorder = isDark ? 'rgba(0, 229, 204, 0.12)' : 'rgba(0, 229, 204, 0.2)';\r\n  const tooltipColor = isDark ? 'rgba(0, 229, 204, 0.9)' : '#00E5CC';\r\n  const panelBg = isDark ? 'rgba(10, 10, 10, 0.92)' : 'rgba(255, 255, 255, 0.95)';\r\n  const panelBorder = isDark ? 'rgba(0, 229, 204, 0.1)' : 'rgba(0, 229, 204, 0.15)';\r\n  const panelShadow = isDark\r\n    ? '0 20px 60px rgba(0, 0, 0, 0.5), 0 0 40px rgba(0, 229, 204, 0.04), inset 0 1px 0 rgba(255,255,255,0.03)'\r\n    : '0 20px 60px rgba(0, 0, 0, 0.1), 0 0 20px rgba(0, 229, 204, 0.04)';\r\n  const headerAccentBg = isDark ? 'rgba(0, 229, 204, 0.04)' : 'rgba(0, 229, 204, 0.03)';\r\n  const headerAccentBorder = isDark ? 'rgba(0, 229, 204, 0.1)' : 'rgba(0, 229, 204, 0.08)';\r\n  const iconCircleBg = isDark ? 'rgba(0, 229, 204, 0.08)' : 'rgba(0, 229, 204, 0.06)';\r\n  const iconCircleBorder = isDark ? 'rgba(0, 229, 204, 0.2)' : 'rgba(0, 229, 204, 0.15)';\r\n  const titleColor = isDark ? 'rgba(255, 255, 255, 0.85)' : 'rgba(0, 0, 0, 0.85)';\r\n  const btnColor = isDark ? 'rgba(255,255,255,0.4)' : 'rgba(0,0,0,0.35)';\r\n  const btnHoverColor = isDark ? 'rgba(255,255,255,0.7)' : 'rgba(0,0,0,0.6)';\r\n  const btnHoverBg = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.05)';\r\n  const suggHintColor = isDark ? 'rgba(255,255,255,0.35)' : 'rgba(0,0,0,0.4)';\r\n  const suggBg = isDark ? 'rgba(0, 229, 204, 0.04)' : 'rgba(0, 229, 204, 0.04)';\r\n  const suggBorder = isDark ? 'rgba(0, 229, 204, 0.08)' : 'rgba(0, 229, 204, 0.12)';\r\n  const suggColor = isDark ? 'rgba(255,255,255,0.5)' : 'rgba(0,0,0,0.5)';\r\n  const suggHoverBorder = isDark ? 'rgba(0, 229, 204, 0.25)' : 'rgba(0, 229, 204, 0.3)';\r\n  const userMsgBg = isDark ? 'rgba(0, 229, 204, 0.12)' : 'rgba(0, 229, 204, 0.08)';\r\n  const userMsgBorder = isDark ? 'rgba(0, 229, 204, 0.15)' : 'rgba(0, 229, 204, 0.12)';\r\n  const assistMsgBg = isDark ? 'rgba(255, 255, 255, 0.04)' : 'rgba(0, 0, 0, 0.03)';\r\n  const assistMsgBorder = isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.06)';\r\n  const assistMsgColor = isDark ? 'rgba(255,255,255,0.8)' : 'rgba(0,0,0,0.8)';\r\n  const inputAreaBorder = isDark ? 'rgba(0, 229, 204, 0.06)' : 'rgba(0, 229, 204, 0.06)';\r\n  const inputBoxBg = isDark ? 'rgba(255, 255, 255, 0.03)' : 'rgba(0, 0, 0, 0.02)';\r\n  const inputBoxBorder = isDark ? 'rgba(0, 229, 204, 0.08)' : 'rgba(0, 229, 204, 0.1)';\r\n  const inputColor = isDark ? 'rgba(255,255,255,0.85)' : 'rgba(0,0,0,0.85)';\r\n  const submitBg = isDark ? 'rgba(0, 229, 204, 0.12)' : 'rgba(0, 229, 204, 0.08)';\r\n  const submitBorder = isDark ? 'rgba(0, 229, 204, 0.2)' : 'rgba(0, 229, 204, 0.15)';\r\n  const submitEmptyColor = isDark ? 'rgba(255,255,255,0.2)' : 'rgba(0,0,0,0.2)';\r\n  const hintColor = isDark ? 'rgba(255,255,255,0.2)' : 'rgba(0,0,0,0.25)';\r\n  const mentionDropBg = isDark ? 'rgba(15, 15, 15, 0.95)' : 'rgba(255, 255, 255, 0.98)';\r\n  const mentionDropBorder = isDark ? 'rgba(0, 229, 204, 0.1)' : 'rgba(0, 229, 204, 0.15)';\r\n  const mentionDropShadow = isDark ? '0 -4px 20px rgba(0, 0, 0, 0.4)' : '0 -4px 20px rgba(0, 0, 0, 0.08)';\r\n  const mentionActiveBg = isDark ? 'rgba(0, 229, 204, 0.08)' : 'rgba(0, 229, 204, 0.06)';\r\n  const mentionTextColor = isDark ? 'rgba(255,255,255,0.85)' : 'rgba(0,0,0,0.85)';\r\n  const mentionEmailColor = isDark ? 'rgba(255,255,255,0.35)' : 'rgba(0,0,0,0.4)';\r\n  const mentionAvatarBg = isDark ? 'rgba(0, 229, 204, 0.12)' : 'rgba(0, 229, 204, 0.08)';\r\n  const mentionAvatarBorder = isDark ? 'rgba(0, 229, 204, 0.2)' : 'rgba(0, 229, 204, 0.15)';\r\n\r\n  // Get storage key for localStorage\r\n  const storageKey = persistHistory?.storageKey || 'gantt-ai-history';\r\n  const persistMaxMessages = persistHistory?.maxMessages ?? 5;\r\n\r\n  // Filter mentionable users based on current query\r\n  const filteredMentionUsers = mentionableUsers.filter((u) => {\r\n    if (!mentionQuery) return true;\r\n    const q = mentionQuery.toLowerCase();\r\n    return u.name.toLowerCase().includes(q) || (u.email && u.email.toLowerCase().includes(q));\r\n  }).slice(0, 5);\r\n\r\n  // Handle @mention detection on input change\r\n  const handleInputChange = useCallback((value: string) => {\r\n    setInputValue(value);\r\n\r\n    if (mentionableUsers.length === 0) return;\r\n\r\n    const input = inputRef.current;\r\n    if (!input) return;\r\n\r\n    const cursorPos = input.selectionStart || value.length;\r\n    const textBeforeCursor = value.slice(0, cursorPos);\r\n\r\n    // Find the last @ symbol before cursor\r\n    const lastAtIndex = textBeforeCursor.lastIndexOf('@');\r\n\r\n    if (lastAtIndex >= 0) {\r\n      // Check there's no space before @ (or it's at the start)\r\n      const charBefore = lastAtIndex > 0 ? textBeforeCursor[lastAtIndex - 1] : ' ';\r\n      if (charBefore === ' ' || lastAtIndex === 0) {\r\n        const query = textBeforeCursor.slice(lastAtIndex + 1);\r\n        // Show dropdown while query is reasonable length (names can have spaces)\r\n        if (query.length <= 40) {\r\n          setMentionQuery(query);\r\n          setMentionStartIndex(lastAtIndex);\r\n          setShowMentionDropdown(true);\r\n          setMentionSelectedIndex(0);\r\n          return;\r\n        }\r\n      }\r\n    }\r\n\r\n    setShowMentionDropdown(false);\r\n    setMentionQuery('');\r\n    setMentionStartIndex(-1);\r\n  }, [mentionableUsers.length]);\r\n\r\n  // Select a user from the mention dropdown\r\n  const selectMention = useCallback((user: { id: string; name: string }) => {\r\n    const before = inputValue.slice(0, mentionStartIndex);\r\n    const after = inputValue.slice(\r\n      mentionStartIndex + 1 + mentionQuery.length\r\n    );\r\n    const newValue = `${before}@${user.name} ${after}`;\r\n    setInputValue(newValue);\r\n    setShowMentionDropdown(false);\r\n    setMentionQuery('');\r\n    setMentionStartIndex(-1);\r\n    // Re-focus input\r\n    setTimeout(() => inputRef.current?.focus(), 0);\r\n  }, [inputValue, mentionStartIndex, mentionQuery]);\r\n\r\n  // Handle keyboard navigation in mention dropdown\r\n  const handleMentionKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n    if (!showMentionDropdown || filteredMentionUsers.length === 0) return false;\r\n\r\n    if (e.key === 'ArrowDown') {\r\n      e.preventDefault();\r\n      setMentionSelectedIndex((prev) =>\r\n        prev < filteredMentionUsers.length - 1 ? prev + 1 : 0\r\n      );\r\n      return true;\r\n    }\r\n    if (e.key === 'ArrowUp') {\r\n      e.preventDefault();\r\n      setMentionSelectedIndex((prev) =>\r\n        prev > 0 ? prev - 1 : filteredMentionUsers.length - 1\r\n      );\r\n      return true;\r\n    }\r\n    if (e.key === 'Enter' || e.key === 'Tab') {\r\n      e.preventDefault();\r\n      const selected = filteredMentionUsers[mentionSelectedIndex];\r\n      if (selected) selectMention(selected);\r\n      return true;\r\n    }\r\n    if (e.key === 'Escape') {\r\n      setShowMentionDropdown(false);\r\n      return true;\r\n    }\r\n    return false;\r\n  }, [showMentionDropdown, filteredMentionUsers, mentionSelectedIndex, selectMention]);\r\n\r\n  // Load persisted history on mount\r\n  useEffect(() => {\r\n    if (persistHistory?.enabled) {\r\n      try {\r\n        const saved = localStorage.getItem(storageKey);\r\n        if (saved) {\r\n          const parsed = JSON.parse(saved) as AIMessage[];\r\n          // Convert timestamp strings back to Date objects\r\n          const messagesWithDates = parsed.map(msg => ({\r\n            ...msg,\r\n            timestamp: new Date(msg.timestamp),\r\n          }));\r\n          setMessages(messagesWithDates.slice(-persistMaxMessages));\r\n        }\r\n      } catch (error) {\r\n        console.warn('[GanttAIAssistant] Failed to load persisted history:', error);\r\n      }\r\n    }\r\n  }, [persistHistory?.enabled, storageKey, persistMaxMessages]);\r\n\r\n  // Persist history when messages change\r\n  useEffect(() => {\r\n    if (persistHistory?.enabled && messages.length > 0) {\r\n      try {\r\n        // Only persist non-loading messages\r\n        const messagesToPersist = messages\r\n          .filter(m => !m.isLoading)\r\n          .slice(-persistMaxMessages);\r\n        localStorage.setItem(storageKey, JSON.stringify(messagesToPersist));\r\n      } catch (error) {\r\n        console.warn('[GanttAIAssistant] Failed to persist history:', error);\r\n      }\r\n    }\r\n  }, [messages, persistHistory?.enabled, storageKey, persistMaxMessages]);\r\n\r\n  // Auto-scroll to bottom on new messages\r\n  useEffect(() => {\r\n    if (messagesEndRef.current) {\r\n      messagesEndRef.current.scrollIntoView({ behavior: 'smooth' });\r\n    }\r\n  }, [messages]);\r\n\r\n  // Focus input when chat opens\r\n  useEffect(() => {\r\n    if (isOpen && !isMinimized && inputRef.current) {\r\n      setTimeout(() => inputRef.current?.focus(), 100);\r\n    }\r\n  }, [isOpen, isMinimized]);\r\n\r\n  // Apply task updates based on AI command result\r\n  const applyCommandResult = useCallback((result: AICommandResult) => {\r\n    if (!result.success) return;\r\n\r\n    switch (result.type) {\r\n      case 'move_task':\r\n      case 'resize_task':\r\n      case 'rename_task':\r\n      case 'set_progress':\r\n      case 'set_status':\r\n      case 'assign_task':\r\n        if (result.taskId && result.updates) {\r\n          onTaskUpdate?.(result.taskId, result.updates);\r\n        }\r\n        break;\r\n\r\n      case 'create_task':\r\n        if (result.newTask) {\r\n          onTaskCreate?.(result.newTask);\r\n        }\r\n        break;\r\n\r\n      case 'delete_task':\r\n        if (result.taskId) {\r\n          onTaskDelete?.(result.taskId);\r\n        }\r\n        break;\r\n\r\n      case 'link_tasks':\r\n        if (result.dependencyFrom && result.dependencyTo) {\r\n          onDependencyCreate?.(result.dependencyFrom, result.dependencyTo);\r\n        }\r\n        break;\r\n\r\n      case 'unlink_tasks':\r\n        if (result.taskId && result.dependencyFrom) {\r\n          onDependencyDelete?.(result.taskId, result.dependencyFrom);\r\n        }\r\n        break;\r\n    }\r\n  }, [onTaskUpdate, onTaskCreate, onTaskDelete, onDependencyCreate, onDependencyDelete]);\r\n\r\n  // Handle sending a command\r\n  const handleSendCommand = useCallback(async (command: string) => {\r\n    if (!command.trim() || isLoading) return;\r\n\r\n    // Add user message\r\n    const userMessage: AIMessage = {\r\n      id: `user-${Date.now()}`,\r\n      role: 'user',\r\n      content: command,\r\n      timestamp: new Date(),\r\n    };\r\n\r\n    setMessages((prev) => [...prev.slice(-(maxHistory - 1)), userMessage]);\r\n    setInputValue('');\r\n    setShowSuggestions(false);\r\n    setIsLoading(true);\r\n\r\n    // Add loading message\r\n    const loadingMessage: AIMessage = {\r\n      id: `loading-${Date.now()}`,\r\n      role: 'assistant',\r\n      content: '',\r\n      timestamp: new Date(),\r\n      isLoading: true,\r\n    };\r\n    setMessages((prev) => [...prev, loadingMessage]);\r\n\r\n    try {\r\n      if (onCommand) {\r\n        // Build the recent conversation (last few turns) so the assistant can\r\n        // resolve follow-ups (\"ahora movelas un día más\"). Exclude loading\r\n        // placeholders and the just-added user command.\r\n        const history = messages\r\n          .filter((m) => !m.isLoading && m.content)\r\n          .slice(-6)\r\n          .map((m) => ({ role: m.role, content: m.content }));\r\n        const result = await onCommand(command, tasks, history);\r\n\r\n        // Remove loading message and add response\r\n        setMessages((prev) => {\r\n          const withoutLoading = prev.filter((m) => !m.isLoading);\r\n          const assistantMessage: AIMessage = {\r\n            id: `assistant-${Date.now()}`,\r\n            role: 'assistant',\r\n            content: result.message,\r\n            timestamp: new Date(),\r\n            command: result,\r\n          };\r\n          return [...withoutLoading, assistantMessage];\r\n        });\r\n\r\n        // Apply the command result\r\n        applyCommandResult(result);\r\n      } else {\r\n        // No handler provided - show helpful message\r\n        setMessages((prev) => {\r\n          const withoutLoading = prev.filter((m) => !m.isLoading);\r\n          return [\r\n            ...withoutLoading,\r\n            {\r\n              id: `assistant-${Date.now()}`,\r\n              role: 'assistant',\r\n              content: 'AI handler not configured. Please provide an onCommand handler in the aiAssistant config.',\r\n              timestamp: new Date(),\r\n            },\r\n          ];\r\n        });\r\n      }\r\n    } catch (error) {\r\n      // Handle error\r\n      setMessages((prev) => {\r\n        const withoutLoading = prev.filter((m) => !m.isLoading);\r\n        return [\r\n          ...withoutLoading,\r\n          {\r\n            id: `error-${Date.now()}`,\r\n            role: 'assistant',\r\n            content: `Sorry, I encountered an error: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n            timestamp: new Date(),\r\n          },\r\n        ];\r\n      });\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  }, [isLoading, maxHistory, onCommand, tasks, applyCommandResult]);\r\n\r\n  // Handle input submit\r\n  const handleSubmit = (e: React.FormEvent) => {\r\n    e.preventDefault();\r\n    handleSendCommand(inputValue);\r\n  };\r\n\r\n  // Handle suggestion click\r\n  const handleSuggestionClick = (suggestion: string) => {\r\n    setInputValue(suggestion);\r\n    inputRef.current?.focus();\r\n  };\r\n\r\n  // Handle keyboard shortcuts\r\n  useEffect(() => {\r\n    const handleKeyDown = (e: KeyboardEvent) => {\r\n      // Toggle chat with Cmd/Ctrl + K\r\n      if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\r\n        e.preventDefault();\r\n        setIsOpen((prev) => !prev);\r\n        if (!isOpen) {\r\n          setIsMinimized(false);\r\n        }\r\n      }\r\n      // Close on Escape\r\n      if (e.key === 'Escape' && isOpen) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n\r\n    document.addEventListener('keydown', handleKeyDown);\r\n    return () => document.removeEventListener('keydown', handleKeyDown);\r\n  }, [isOpen]);\r\n\r\n  // Close when clicking outside the chat panel\r\n  useEffect(() => {\r\n    if (!isOpen) return;\r\n\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      const target = e.target as HTMLElement;\r\n      // Check if click is outside the chat container\r\n      if (chatContainerRef.current && !chatContainerRef.current.contains(target)) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n\r\n    // Add listener with a small delay to avoid closing immediately on open\r\n    const timeoutId = setTimeout(() => {\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n    }, 100);\r\n\r\n    return () => {\r\n      clearTimeout(timeoutId);\r\n      document.removeEventListener('mousedown', handleClickOutside);\r\n    };\r\n  }, [isOpen]);\r\n\r\n  if (!enabled) return null;\r\n\r\n  // Position classes\r\n  const positionClasses = {\r\n    'bottom-right': 'bottom-4 right-4',\r\n    'bottom-left': 'bottom-4 left-4',\r\n    'top-right': 'top-4 right-4',\r\n    'top-left': 'top-4 left-4',\r\n  };\r\n\r\n  return (\r\n    <Portal>\r\n      {/* Floating AI Assistant — Mini Chronos FAB */}\r\n      <AnimatePresence>\r\n        {!isOpen && (\r\n          <motion.button\r\n            initial={{ scale: 0, opacity: 0, rotate: -180 }}\r\n            animate={{ scale: 1, opacity: 1, rotate: 0 }}\r\n            exit={{ scale: 0, opacity: 0, rotate: 180 }}\r\n            transition={{ type: 'spring', damping: 20, stiffness: 260 }}\r\n            whileHover={{ scale: 1.12 }}\r\n            whileTap={{ scale: 0.9 }}\r\n            className={`fixed ${positionClasses[position]} z-[99999] group`}\r\n            style={{\r\n              width: 44,\r\n              height: 44,\r\n              borderRadius: '50%',\r\n              display: 'flex',\r\n              alignItems: 'center',\r\n              justifyContent: 'center',\r\n              background: fabBg,\r\n              backdropFilter: 'blur(12px)',\r\n              WebkitBackdropFilter: 'blur(12px)',\r\n              border: `1px solid ${fabBorder}`,\r\n              color: '#00E5CC',\r\n              cursor: 'pointer',\r\n              boxShadow: fabShadow,\r\n              overflow: 'visible',\r\n            }}\r\n            onClick={() => setIsOpen(true)}\r\n          >\r\n            {/* Orbital ring animation */}\r\n            <span\r\n              style={{\r\n                position: 'absolute',\r\n                inset: -3,\r\n                borderRadius: '50%',\r\n                border: `1px solid ${ringBorderA}`,\r\n                animation: 'ai-fab-pulse 3s ease-in-out infinite',\r\n                pointerEvents: 'none',\r\n              }}\r\n            />\r\n            {/* Second orbital ring — offset phase */}\r\n            <span\r\n              style={{\r\n                position: 'absolute',\r\n                inset: -6,\r\n                borderRadius: '50%',\r\n                border: `1px solid ${ringBorderB}`,\r\n                animation: 'ai-fab-pulse 3s ease-in-out infinite 1.5s',\r\n                pointerEvents: 'none',\r\n              }}\r\n            />\r\n            <AIIcon size={18} />\r\n            {/* Tooltip on hover */}\r\n            <span\r\n              className=\"pointer-events-none opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\r\n              style={{\r\n                position: 'absolute',\r\n                right: '100%',\r\n                marginRight: 10,\r\n                whiteSpace: 'nowrap',\r\n                fontSize: 11,\r\n                fontWeight: 500,\r\n                fontFamily: \"'JetBrains Mono', monospace\",\r\n                letterSpacing: '0.05em',\r\n                textTransform: 'uppercase',\r\n                color: tooltipColor,\r\n                background: tooltipBg,\r\n                backdropFilter: 'blur(8px)',\r\n                padding: '4px 10px',\r\n                borderRadius: 6,\r\n                border: `1px solid ${tooltipBorder}`,\r\n              }}\r\n            >\r\n              AI · ⌘K\r\n            </span>\r\n            {/* Inject keyframes */}\r\n            <style>{`\r\n              @keyframes ai-fab-pulse {\r\n                0%, 100% { transform: scale(1); opacity: 0.4; }\r\n                50% { transform: scale(1.15); opacity: 0; }\r\n              }\r\n            `}</style>\r\n          </motion.button>\r\n        )}\r\n      </AnimatePresence>\r\n\r\n      {/* Chat Panel — Chronos dark glass */}\r\n      <AnimatePresence>\r\n        {isOpen && (\r\n          <motion.div\r\n            ref={chatContainerRef}\r\n            initial={{ opacity: 0, y: 20, scale: 0.95 }}\r\n            animate={{\r\n              opacity: 1,\r\n              y: 0,\r\n              scale: 1,\r\n              height: isMinimized ? 'auto' : 500,\r\n            }}\r\n            exit={{ opacity: 0, y: 20, scale: 0.95 }}\r\n            transition={{ type: 'spring', damping: 25, stiffness: 300 }}\r\n            className={`fixed ${positionClasses[position]} z-[99999] w-96 rounded-2xl overflow-hidden flex flex-col`}\r\n            style={{\r\n              background: panelBg,\r\n              backdropFilter: 'blur(20px)',\r\n              WebkitBackdropFilter: 'blur(20px)',\r\n              border: `1px solid ${panelBorder}`,\r\n              boxShadow: panelShadow,\r\n            }}\r\n          >\r\n            {/* Header — glass with cyan accent line */}\r\n            <div\r\n              className=\"flex items-center justify-between px-4 py-3\"\r\n              style={{\r\n                background: headerAccentBg,\r\n                borderBottom: `1px solid ${headerAccentBorder}`,\r\n              }}\r\n            >\r\n              <div className=\"flex items-center gap-2.5\">\r\n                <div\r\n                  style={{\r\n                    width: 28, height: 28, borderRadius: '50%',\r\n                    display: 'flex', alignItems: 'center', justifyContent: 'center',\r\n                    background: iconCircleBg,\r\n                    border: `1px solid ${iconCircleBorder}`,\r\n                    color: '#00E5CC',\r\n                  }}\r\n                >\r\n                  <AIIcon size={14} />\r\n                </div>\r\n                <span\r\n                  style={{\r\n                    fontSize: 12, fontWeight: 600,\r\n                    fontFamily: \"'JetBrains Mono', monospace\",\r\n                    letterSpacing: '0.06em',\r\n                    textTransform: 'uppercase',\r\n                    color: titleColor,\r\n                  }}\r\n                >\r\n                  AI Assistant\r\n                </span>\r\n              </div>\r\n              <div className=\"flex items-center gap-0.5\">\r\n                <button\r\n                  onClick={() => setIsMinimized((prev) => !prev)}\r\n                  className=\"p-1.5 rounded-lg transition-colors\"\r\n                  style={{ color: btnColor }}\r\n                  onMouseEnter={e => { e.currentTarget.style.background = btnHoverBg; e.currentTarget.style.color = btnHoverColor; }}\r\n                  onMouseLeave={e => { e.currentTarget.style.background = 'transparent'; e.currentTarget.style.color = btnColor; }}\r\n                >\r\n                  <MinimizeIcon />\r\n                </button>\r\n                <button\r\n                  onClick={() => setIsOpen(false)}\r\n                  className=\"p-1.5 rounded-lg transition-colors\"\r\n                  style={{ color: btnColor }}\r\n                  onMouseEnter={e => { e.currentTarget.style.background = btnHoverBg; e.currentTarget.style.color = btnHoverColor; }}\r\n                  onMouseLeave={e => { e.currentTarget.style.background = 'transparent'; e.currentTarget.style.color = btnColor; }}\r\n                >\r\n                  <CloseIcon />\r\n                </button>\r\n              </div>\r\n            </div>\r\n\r\n            {/* Chat Content */}\r\n            <AnimatePresence>\r\n              {!isMinimized && (\r\n                <motion.div\r\n                  initial={{ height: 0, opacity: 0 }}\r\n                  animate={{ height: 'auto', opacity: 1 }}\r\n                  exit={{ height: 0, opacity: 0 }}\r\n                  className=\"flex flex-col flex-1 min-h-0\"\r\n                >\r\n                  {/* Messages */}\r\n                  <div\r\n                    className=\"flex-1 overflow-y-auto p-4 space-y-4\"\r\n                    style={{ maxHeight: 350 }}\r\n                  >\r\n                    {messages.length === 0 && showSuggestions && (\r\n                      <div className=\"space-y-3\">\r\n                        <p\r\n                          className=\"text-xs text-center\"\r\n                          style={{ color: suggHintColor, fontFamily: \"'JetBrains Mono', monospace\" }}\r\n                        >\r\n                          Try asking me to edit your Gantt chart:\r\n                        </p>\r\n                        <div className=\"flex flex-wrap gap-2\">\r\n                          {suggestions.slice(0, 4).map((suggestion, index) => (\r\n                            <button\r\n                              key={index}\r\n                              onClick={() => handleSuggestionClick(suggestion)}\r\n                              className=\"text-xs px-3 py-1.5 rounded-full transition-all\"\r\n                              style={{\r\n                                background: suggBg,\r\n                                color: suggColor,\r\n                                border: `1px solid ${suggBorder}`,\r\n                              }}\r\n                              onMouseEnter={e => { e.currentTarget.style.borderColor = suggHoverBorder; e.currentTarget.style.color = '#00E5CC'; }}\r\n                              onMouseLeave={e => { e.currentTarget.style.borderColor = suggBorder; e.currentTarget.style.color = suggColor; }}\r\n                            >\r\n                              {suggestion.length > 30\r\n                                ? suggestion.slice(0, 30) + '...'\r\n                                : suggestion}\r\n                            </button>\r\n                          ))}\r\n                        </div>\r\n                      </div>\r\n                    )}\r\n\r\n                    {messages.map((message) => (\r\n                      <motion.div\r\n                        key={message.id}\r\n                        initial={{ opacity: 0, y: 10 }}\r\n                        animate={{ opacity: 1, y: 0 }}\r\n                        className={`flex ${\r\n                          message.role === 'user' ? 'justify-end' : 'justify-start'\r\n                        }`}\r\n                      >\r\n                        <div\r\n                          className={`max-w-[85%] rounded-2xl px-4 py-2.5 ${\r\n                            message.role === 'user'\r\n                              ? 'rounded-br-md'\r\n                              : 'rounded-bl-md'\r\n                          }`}\r\n                          style={{\r\n                            background:\r\n                              message.role === 'user'\r\n                                ? userMsgBg\r\n                                : assistMsgBg,\r\n                            color:\r\n                              message.role === 'user'\r\n                                ? '#00E5CC'\r\n                                : assistMsgColor,\r\n                            border: message.role === 'user'\r\n                              ? `1px solid ${userMsgBorder}`\r\n                              : `1px solid ${assistMsgBorder}`,\r\n                          }}\r\n                        >\r\n                          {message.isLoading ? (\r\n                            <LoadingDots />\r\n                          ) : (\r\n                            <p className=\"text-sm whitespace-pre-wrap\">\r\n                              {message.content}\r\n                            </p>\r\n                          )}\r\n\r\n                          {/* Command result badge */}\r\n                          {message.command && (\r\n                            <div\r\n                              className=\"mt-2 text-xs px-2 py-1 rounded-md inline-flex items-center gap-1\"\r\n                              style={{\r\n                                background: message.command.success\r\n                                  ? 'rgba(16, 185, 129, 0.15)'\r\n                                  : 'rgba(239, 68, 68, 0.15)',\r\n                                color: message.command.success\r\n                                  ? '#10B981'\r\n                                  : '#EF4444',\r\n                                border: `1px solid ${message.command.success ? 'rgba(16,185,129,0.2)' : 'rgba(239,68,68,0.2)'}`,\r\n                              }}\r\n                            >\r\n                              {message.command.success ? '✓' : '✗'}\r\n                              <span className=\"capitalize\">\r\n                                {message.command.type.replace(/_/g, ' ')}\r\n                              </span>\r\n                            </div>\r\n                          )}\r\n                        </div>\r\n                      </motion.div>\r\n                    ))}\r\n                    <div ref={messagesEndRef} />\r\n                  </div>\r\n\r\n                  {/* Input */}\r\n                  <form\r\n                    onSubmit={(e) => {\r\n                      if (showMentionDropdown && filteredMentionUsers.length > 0) {\r\n                        e.preventDefault();\r\n                        return;\r\n                      }\r\n                      handleSubmit(e);\r\n                    }}\r\n                    className=\"p-3 relative\"\r\n                    style={{ borderTop: `1px solid ${inputAreaBorder}` }}\r\n                  >\r\n                    {/* @Mention Autocomplete Dropdown */}\r\n                    <AnimatePresence>\r\n                      {showMentionDropdown && filteredMentionUsers.length > 0 && (\r\n                        <motion.div\r\n                          ref={mentionDropdownRef}\r\n                          initial={{ opacity: 0, y: 4 }}\r\n                          animate={{ opacity: 1, y: 0 }}\r\n                          exit={{ opacity: 0, y: 4 }}\r\n                          transition={{ duration: 0.12 }}\r\n                          className=\"absolute bottom-full left-3 right-3 mb-1 rounded-lg overflow-hidden z-10\"\r\n                          style={{\r\n                            background: mentionDropBg,\r\n                            border: `1px solid ${mentionDropBorder}`,\r\n                            boxShadow: mentionDropShadow,\r\n                            backdropFilter: 'blur(12px)',\r\n                          }}\r\n                        >\r\n                          {filteredMentionUsers.map((user, idx) => (\r\n                            <button\r\n                              key={user.id}\r\n                              type=\"button\"\r\n                              onClick={() => selectMention(user)}\r\n                              className=\"w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors\"\r\n                              style={{\r\n                                background: idx === mentionSelectedIndex\r\n                                  ? mentionActiveBg\r\n                                  : 'transparent',\r\n                                color: mentionTextColor,\r\n                              }}\r\n                              onMouseEnter={() => setMentionSelectedIndex(idx)}\r\n                            >\r\n                              <div\r\n                                className=\"w-7 h-7 rounded-full flex items-center justify-center text-xs font-bold flex-shrink-0\"\r\n                                style={{\r\n                                  background: mentionAvatarBg,\r\n                                  border: `1px solid ${mentionAvatarBorder}`,\r\n                                  color: '#00E5CC',\r\n                                }}\r\n                              >\r\n                                {user.name.split(' ').map(w => w[0]).join('').slice(0, 2).toUpperCase()}\r\n                              </div>\r\n                              <div className=\"flex-1 min-w-0\">\r\n                                <div className=\"text-sm font-medium truncate\">{user.name}</div>\r\n                                {user.email && (\r\n                                  <div className=\"text-xs truncate\" style={{ color: mentionEmailColor }}>\r\n                                    {user.email}\r\n                                  </div>\r\n                                )}\r\n                              </div>\r\n                            </button>\r\n                          ))}\r\n                        </motion.div>\r\n                      )}\r\n                    </AnimatePresence>\r\n\r\n                    <div\r\n                      className=\"flex items-center gap-2 rounded-xl px-4 py-2\"\r\n                      style={{\r\n                        background: inputBoxBg,\r\n                        border: `1px solid ${inputBoxBorder}`,\r\n                      }}\r\n                    >\r\n                      <input\r\n                        ref={inputRef}\r\n                        type=\"text\"\r\n                        value={inputValue}\r\n                        onChange={(e) => handleInputChange(e.target.value)}\r\n                        onKeyDown={(e) => {\r\n                          if (handleMentionKeyDown(e)) return;\r\n                        }}\r\n                        placeholder={placeholder}\r\n                        disabled={isLoading}\r\n                        className=\"flex-1 bg-transparent text-sm outline-none\"\r\n                        style={{ color: inputColor, fontFamily: 'Inter, sans-serif' }}\r\n                      />\r\n                      <button\r\n                        type=\"submit\"\r\n                        disabled={!inputValue.trim() || isLoading}\r\n                        className=\"p-2 rounded-lg transition-all disabled:opacity-30\"\r\n                        style={{\r\n                          background: inputValue.trim()\r\n                            ? submitBg\r\n                            : 'transparent',\r\n                          color: inputValue.trim() ? '#00E5CC' : submitEmptyColor,\r\n                          border: inputValue.trim() ? `1px solid ${submitBorder}` : '1px solid transparent',\r\n                        }}\r\n                      >\r\n                        <SendIcon />\r\n                      </button>\r\n                    </div>\r\n                    <p\r\n                      className=\"text-[10px] text-center mt-2\"\r\n                      style={{ color: hintColor, fontFamily: \"'JetBrains Mono', monospace\" }}\r\n                    >\r\n                      Enter to send · Esc to close\r\n                    </p>\r\n                  </form>\r\n                </motion.div>\r\n              )}\r\n            </AnimatePresence>\r\n          </motion.div>\r\n        )}\r\n      </AnimatePresence>\r\n    </Portal>\r\n  );\r\n}\r\n\r\nexport default GanttAIAssistant;\r\n","import { useState, useCallback, useRef } from 'react';\n\ninterface HistoryState<T> {\n  past: T[];\n  present: T;\n  future: T[];\n}\n\ninterface UseUndoRedoResult<T> {\n  state: T;\n  setState: (newStateOrUpdater: T | ((prev: T) => T), addToHistory?: boolean) => void;\n  undo: () => void;\n  redo: () => void;\n  canUndo: boolean;\n  canRedo: boolean;\n  clearHistory: () => void;\n}\n\n/**\n * Custom hook for undo/redo functionality\n * @param initialState - Initial state value\n * @param maxHistorySize - Maximum number of history entries (default: 50)\n */\nexport function useUndoRedo<T>(\n  initialState: T,\n  maxHistorySize: number = 50\n): UseUndoRedoResult<T> {\n  const [history, setHistory] = useState<HistoryState<T>>({\n    past: [],\n    present: initialState,\n    future: [],\n  });\n\n  // Track if we're currently applying undo/redo to avoid infinite loops\n  const isApplyingHistory = useRef(false);\n\n  const setState = useCallback(\n    (newStateOrUpdater: T | ((prev: T) => T), addToHistory: boolean = true) => {\n      setHistory((currentHistory) => {\n        // Resolve the new state (handle both direct values and updater functions)\n        const resolvedNewState =\n          typeof newStateOrUpdater === 'function'\n            ? (newStateOrUpdater as (prev: T) => T)(currentHistory.present)\n            : newStateOrUpdater;\n\n        if (isApplyingHistory.current) {\n          // If we're applying history, just update present without adding to history\n          return {\n            ...currentHistory,\n            present: resolvedNewState,\n          };\n        }\n\n        if (!addToHistory) {\n          // Direct state update without history\n          return {\n            ...currentHistory,\n            present: resolvedNewState,\n          };\n        }\n\n        const newPast = [...currentHistory.past, currentHistory.present];\n\n        // Limit history size\n        if (newPast.length > maxHistorySize) {\n          newPast.shift();\n        }\n\n        return {\n          past: newPast,\n          present: resolvedNewState,\n          future: [], // Clear future when making a new change\n        };\n      });\n    },\n    [maxHistorySize]\n  );\n\n  const undo = useCallback(() => {\n    setHistory((currentHistory) => {\n      if (currentHistory.past.length === 0) {\n        return currentHistory;\n      }\n\n      const previous = currentHistory.past[currentHistory.past.length - 1];\n      const newPast = currentHistory.past.slice(0, currentHistory.past.length - 1);\n\n      isApplyingHistory.current = true;\n      setTimeout(() => {\n        isApplyingHistory.current = false;\n      }, 0);\n\n      return {\n        past: newPast,\n        present: previous,\n        future: [currentHistory.present, ...currentHistory.future],\n      };\n    });\n  }, []);\n\n  const redo = useCallback(() => {\n    setHistory((currentHistory) => {\n      if (currentHistory.future.length === 0) {\n        return currentHistory;\n      }\n\n      const next = currentHistory.future[0];\n      const newFuture = currentHistory.future.slice(1);\n\n      isApplyingHistory.current = true;\n      setTimeout(() => {\n        isApplyingHistory.current = false;\n      }, 0);\n\n      return {\n        past: [...currentHistory.past, currentHistory.present],\n        present: next,\n        future: newFuture,\n      };\n    });\n  }, []);\n\n  const clearHistory = useCallback(() => {\n    setHistory((currentHistory) => ({\n      past: [],\n      present: currentHistory.present,\n      future: [],\n    }));\n  }, []);\n\n  return {\n    state: history.present,\n    setState,\n    undo,\n    redo,\n    canUndo: history.past.length > 0,\n    canRedo: history.future.length > 0,\n    clearHistory,\n  };\n}\n","import { useEffect } from 'react';\n\ninterface UseGanttUndoRedoKeysOptions {\n  undo: () => void;\n  redo: () => void;\n  canUndo: boolean;\n  canRedo: boolean;\n  enabled?: boolean;\n}\n\n/**\n * Hook to handle keyboard shortcuts for undo/redo\n * Ctrl+Z / Cmd+Z for undo\n * Ctrl+Y / Cmd+Shift+Z for redo\n */\nexport function useGanttUndoRedoKeys({\n  undo,\n  redo,\n  canUndo,\n  canRedo,\n  enabled = true,\n}: UseGanttUndoRedoKeysOptions) {\n  useEffect(() => {\n    if (!enabled) return;\n\n    const handleKeyDown = (e: KeyboardEvent) => {\n      const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n      const ctrlKey = isMac ? e.metaKey : e.ctrlKey;\n\n      // Undo: Ctrl+Z (Windows/Linux) or Cmd+Z (Mac)\n      if (ctrlKey && e.key === 'z' && !e.shiftKey && canUndo) {\n        e.preventDefault();\n        undo();\n        return;\n      }\n\n      // Redo: Ctrl+Y (Windows/Linux) or Cmd+Shift+Z (Mac)\n      if (canRedo) {\n        if (!isMac && ctrlKey && e.key === 'y') {\n          e.preventDefault();\n          redo();\n          return;\n        }\n        if (isMac && ctrlKey && e.shiftKey && e.key === 'z') {\n          e.preventDefault();\n          redo();\n          return;\n        }\n      }\n    };\n\n    window.addEventListener('keydown', handleKeyDown);\n\n    return () => {\n      window.removeEventListener('keydown', handleKeyDown);\n    };\n  }, [undo, redo, canUndo, canRedo, enabled]);\n}\n","import { Task, GanttTemplates } from './types';\nimport { ganttUtils } from './ganttUtils';\n\n/**\n * Default templates for Gantt rendering\n * Users can override these with custom templates\n */\nexport const defaultTemplates: Required<GanttTemplates> = {\n  taskTooltip: (task: Task) => {\n    const lines: string[] = [\n      `<strong>${task.name}</strong>`,\n    ];\n\n    if (task.startDate && task.endDate) {\n      lines.push(\n        `${ganttUtils.formatDate(task.startDate)} - ${ganttUtils.formatDate(task.endDate)}`\n      );\n      const duration = ganttUtils.calculateDuration(task.startDate, task.endDate);\n      lines.push(`Duration: ${duration} days`);\n    }\n\n    if (task.progress !== undefined) {\n      lines.push(`Progress: ${task.progress}%`);\n    }\n\n    if (task.status) {\n      lines.push(`Status: ${task.status}`);\n    }\n\n    if (task.assignees && task.assignees.length > 0) {\n      const assigneeNames = task.assignees.map(a => a.name).join(', ');\n      lines.push(`Assigned: ${assigneeNames}`);\n    }\n\n    if (task.dependencies && task.dependencies.length > 0) {\n      lines.push(`Dependencies: ${task.dependencies.length}`);\n    }\n\n    return lines.join('<br/>');\n  },\n\n  taskLabel: (task: Task) => {\n    return task.name;\n  },\n\n  gridCell: (task: Task, column, value) => {\n    // Return default value as-is\n    return value;\n  },\n\n  taskClass: (task: Task) => {\n    const classes: string[] = [];\n\n    if (task.isCriticalPath) {\n      classes.push('critical-path');\n    }\n\n    if (task.status === 'completed') {\n      classes.push('completed');\n    } else if (task.status === 'in-progress') {\n      classes.push('in-progress');\n    } else if (task.status === 'todo') {\n      classes.push('todo');\n    }\n\n    if (task.isMilestone) {\n      classes.push('milestone');\n    }\n\n    return classes.join(' ');\n  },\n\n  milestoneContent: (task: Task) => {\n    return `◆ ${task.name}`;\n  },\n\n  dateFormat: (date: Date) => {\n    return ganttUtils.formatDate(date);\n  },\n\n  durationFormat: (days: number) => {\n    if (days === 1) return '1 day';\n    return `${days} days`;\n  },\n\n  progressFormat: (progress: number) => {\n    return `${progress}%`;\n  },\n};\n\n/**\n * Merge user templates with defaults\n */\nexport function mergeTemplates(\n  userTemplates?: Partial<GanttTemplates>\n): Required<GanttTemplates> {\n  return {\n    ...defaultTemplates,\n    ...userTemplates,\n  };\n}\n","import { createPortal } from 'react-dom';\r\nimport { useState, useRef, useEffect, useLayoutEffect, useCallback, useMemo, useContext, forwardRef, useImperativeHandle } from 'react';\r\nimport { Task, TimeScale, Theme, GanttConfig, GanttColumn, ColumnType, RowDensity, TaskFilterType } from './types';\r\nimport { deriveThemeFromCSS } from './deriveThemeFromCSS';\r\nimport { GanttToolbar } from './GanttToolbar';\r\nimport { TaskGrid } from './TaskGrid';\r\nimport { Timeline } from './Timeline';\r\nimport { ContextMenu, MenuIcons } from './ContextMenu'; // v0.8.0: Split task context menu\r\nimport { TaskDetailModal } from '../TaskDetailModal'; // v0.17.244: Unified task detail modal (replaces TaskFormModal)\r\nimport { GanttAIAssistant } from './GanttAIAssistant'; // v0.14.0: AI Assistant\r\nimport { motion, AnimatePresence } from 'framer-motion'; // v0.17.33: For delete confirmation modal\r\nimport { AlertTriangle, Trash2 } from 'lucide-react'; // v0.17.33: Icons for delete confirmation\r\n// v0.17.215: ColumnManager and Keyboard back in TaskGrid with sticky positioning\r\nimport { useUndoRedo } from './useUndoRedo';\r\nimport { useGanttUndoRedoKeys } from './useGanttUndoRedoKeys';\r\nimport { ThemeContext } from '../../theme/ThemeProvider';\r\nimport { GanttThemeContext } from './GanttThemeContext';\r\nimport { GanttI18nContext } from './GanttI18nContext'; // v0.15.0: i18n context\r\nimport { mergeTranslations, GanttTranslations } from './i18n'; // v0.15.0: i18n\r\nimport { GanttBoardRef } from './GanttBoardRef';\r\nimport { ganttUtils } from './ganttUtils';\r\nimport { mergeTemplates } from './defaultTemplates';\r\nimport { toPng } from 'html-to-image';\r\nimport {\r\n  indentTasks,\r\n  outdentTasks,\r\n  moveTasks,\r\n  deleteTasks,\r\n  duplicateTasks,\r\n  createTask,\r\n  renameTask,\r\n  toggleTaskExpansion,\r\n  createSubtask,\r\n  reparentTask,\r\n  findTask,\r\n  rollUpParentDates,\r\n} from './hierarchyUtils';\r\n\r\ninterface GanttBoardProps {\r\n  tasks: Task[];\r\n  config?: GanttConfig;\r\n  onTasksChange?: (tasks: Task[]) => void;\r\n}\r\n\r\n// v1.4.29: Slimmer rows for elegant Chronos look\r\nconst getRowHeight = (density: RowDensity): number => {\r\n  switch (density) {\r\n    case 'compact':\r\n      return 36;\r\n    case 'comfortable':\r\n      return 42;\r\n    case 'spacious':\r\n      return 52;\r\n    default:\r\n      return 42;\r\n  }\r\n};\r\n\r\nexport const GanttBoard = forwardRef<GanttBoardRef, GanttBoardProps>(function GanttBoard(\r\n  { tasks, config = {}, onTasksChange },\r\n  ref\r\n) {\r\n  const {\r\n    theme: initialTheme,\r\n    timeScale: initialTimeScale = 'week',\r\n    rowDensity: initialRowDensity = 'comfortable',\r\n    showThemeSelector = true,\r\n    showExportButton = true, // v0.12.0: Show export dropdown in toolbar\r\n    onExportSuccess, // v2.8.0: Callback fired after any export completes (for audit logging)\r\n    projectName,\r\n    availableUsers = [],\r\n    templates,\r\n    enableAutoCriticalPath = true, // v0.11.1: Allow disabling automatic CPM calculation\r\n    persistExpandedState, // v0.17.181: Persist expanded state in localStorage\r\n    persistFilter, // v0.18.0: Persist filter state in localStorage\r\n    persistColumns, // Persist visible-columns config in localStorage (per-project key)\r\n    clearFiltersKey, // v1.4.10: Clear filters when this key changes\r\n    aiAssistant, // v0.14.0: AI Assistant configuration\r\n    // v0.15.0: Internationalization\r\n    locale = 'en',\r\n    customTranslations,\r\n    // v0.14.3: Create Task button in toolbar\r\n    showCreateTaskButton = false,\r\n    createTaskLabel,\r\n    onCreateTask,\r\n    // v0.17.300: Task filter\r\n    taskFilter: externalTaskFilter,\r\n    onTaskFilterChange: externalOnTaskFilterChange,\r\n    // Custom toolbar content\r\n    toolbarRightContent,\r\n    toolbarContainer,\r\n    hideWbsLevel,\r\n    // v3.0.0: Baseline & WBS\r\n    showBaseline: configShowBaseline,\r\n    viewMode: configViewMode,\r\n    onViewModeChange: configOnViewModeChange,\r\n    // v3.1.0: Forecast HUD\r\n    projectForecast,\r\n    hideForecastHud,\r\n    // UI events\r\n    onThemeChange, // v0.9.0\r\n    // Basic events\r\n    onTaskClick,\r\n    onTaskSelectionChange, // v1.9.16: la seleccion sale del Gantt\r\n    selectedTaskId, // v1.9.17: ...y tambien entra\r\n    onTaskDblClick, // v0.8.0\r\n    onTaskContextMenu, // v0.8.0\r\n    onTaskUpdate,\r\n    onDependentTasksScheduled, // v2.2.0\r\n    onProgressChange, // v0.8.0\r\n    // v0.16.0: Context menu action callbacks\r\n    onTaskEdit,\r\n    onTaskAddSubtask,\r\n    onTaskMarkIncomplete,\r\n    onTaskSetInProgress,\r\n    // Dependency events\r\n    onDependencyCreate,\r\n    onDependencyDelete,\r\n    // Lifecycle events (v0.8.0)\r\n    onBeforeTaskAdd,\r\n    onAfterTaskAdd,\r\n    onBeforeTaskUpdate,\r\n    onAfterTaskUpdate,\r\n    onBeforeTaskDelete,\r\n    onAfterTaskDelete,\r\n    // v1.4.10: Permissions\r\n    permissions,\r\n    // Share dropdown\r\n    onCopySnapshotLink,\r\n  } = config;\r\n\r\n  // Try to get global theme from ThemeProvider (will return undefined if not in ThemeProvider)\r\n  const themeContext = useContext(ThemeContext);\r\n  const globalTheme = themeContext?.theme as Theme | undefined;\r\n\r\n  // Use global theme if available, otherwise fall back to initialTheme or 'dark'\r\n  const [currentTheme, setCurrentTheme] = useState<Theme>(globalTheme || initialTheme || 'dark');\r\n\r\n  const [timeScale, setTimeScale] = useState<TimeScale>(initialTimeScale);\r\n  const [rowDensity, setRowDensity] = useState<RowDensity>(initialRowDensity);\r\n  const [zoom, setZoom] = useState(1);\r\n\r\n  // v3.0.0: WBS Level selector state\r\n  const [wbsLevel, setWbsLevel] = useState<number | 'all'>('all');\r\n\r\n  // v3.0.0: Execution/Oracle view mode (controlled or internal)\r\n  const [internalViewMode, setInternalViewMode] = useState<'execution' | 'oracle'>(configViewMode || 'execution');\r\n  const viewMode = configViewMode ?? internalViewMode;\r\n  const handleViewModeChange = useCallback((mode: 'execution' | 'oracle') => {\r\n    setInternalViewMode(mode);\r\n    configOnViewModeChange?.(mode);\r\n  }, [configOnViewModeChange]);\r\n\r\n  // v3.0.0: Derive showBaseline from config or viewMode\r\n  const showBaseline = configShowBaseline ?? (viewMode === 'oracle');\r\n\r\n  // View Options state (eye icon dropdown)\r\n  const [showCriticalPath, setShowCriticalPath] = useState(config.showCriticalPath !== false);\r\n  const [showDependencies, setShowDependencies] = useState(config.showDependencies !== false);\r\n  const [highlightWeekends, setHighlightWeekends] = useState(config.highlightWeekends !== false);\r\n\r\n  const handleShowCriticalPathChange = useCallback((show: boolean) => {\r\n    setShowCriticalPath(show);\r\n    config.onShowCriticalPathChange?.(show);\r\n  }, [config.onShowCriticalPathChange]);\r\n  const handleShowDependenciesChange = useCallback((show: boolean) => {\r\n    setShowDependencies(show);\r\n    config.onShowDependenciesChange?.(show);\r\n  }, [config.onShowDependenciesChange]);\r\n  const handleHighlightWeekendsChange = useCallback((show: boolean) => {\r\n    setHighlightWeekends(show);\r\n    config.onHighlightWeekendsChange?.(show);\r\n  }, [config.onHighlightWeekendsChange]);\r\n\r\n  // v1.5.0: Notify consumer of timeScale/zoom changes\r\n  useEffect(() => { config.onTimeScaleChange?.(timeScale); }, [timeScale]);\r\n  useEffect(() => { config.onZoomChange?.(zoom); }, [zoom]);\r\n\r\n  // v1.5.1: Ref to avoid stale closure in useEffect below\r\n  const onDateRangeChangeRef = useRef(config.onDateRangeChange);\r\n  onDateRangeChangeRef.current = config.onDateRangeChange;\r\n\r\n  // v0.18.0: Filter persistence helpers\r\n  const getFilterStorageKey = useCallback(() => {\r\n    if (!persistFilter) return null;\r\n    return typeof persistFilter === 'string' ? persistFilter : 'gantt-filter-state';\r\n  }, [persistFilter]);\r\n\r\n  // v0.17.300: Task filter state (internal or controlled)\r\n  const [internalTaskFilter, setInternalTaskFilter] = useState<TaskFilterType>(() => {\r\n    if (!persistFilter) return 'all';\r\n    try {\r\n      const key = typeof persistFilter === 'string' ? persistFilter : 'gantt-filter-state';\r\n      const stored = localStorage.getItem(key);\r\n      if (stored) {\r\n        const parsed = JSON.parse(stored);\r\n        if (parsed.taskFilter) return parsed.taskFilter as TaskFilterType;\r\n      }\r\n    } catch (e) {\r\n      console.warn('[GanttBoard] Error loading filter state from localStorage:', e);\r\n    }\r\n    return 'all';\r\n  });\r\n  const taskFilter = externalTaskFilter ?? internalTaskFilter;\r\n  const setTaskFilter = externalOnTaskFilterChange ?? setInternalTaskFilter;\r\n\r\n  // v0.18.0: Hide completed toggle (also persisted)\r\n  const [hideCompleted, setHideCompleted] = useState(() => {\r\n    if (!persistFilter) return false;\r\n    try {\r\n      const key = typeof persistFilter === 'string' ? persistFilter : 'gantt-filter-state';\r\n      const stored = localStorage.getItem(key);\r\n      if (stored) {\r\n        const parsed = JSON.parse(stored);\r\n        if (typeof parsed.hideCompleted === 'boolean') return parsed.hideCompleted;\r\n      }\r\n    } catch (e) {\r\n      console.warn('[GanttBoard] Error loading hideCompleted state from localStorage:', e);\r\n    }\r\n    return false;\r\n  });\r\n\r\n  // v0.18.0: Save filter state to localStorage when it changes\r\n  // Use taskFilter (effective value) instead of internalTaskFilter to support controlled mode\r\n  useEffect(() => {\r\n    const key = getFilterStorageKey();\r\n    if (!key) return;\r\n\r\n    try {\r\n      const state = { taskFilter, hideCompleted };\r\n      localStorage.setItem(key, JSON.stringify(state));\r\n    } catch (e) {\r\n      console.warn('[GanttBoard] Error saving filter state to localStorage:', e);\r\n    }\r\n  }, [taskFilter, hideCompleted, getFilterStorageKey]);\r\n\r\n  // v1.4.10: Reset filters when clearFiltersKey changes (for notification navigation)\r\n  const prevClearFiltersKeyRef = useRef(clearFiltersKey);\r\n  useEffect(() => {\r\n    // Only reset if the key actually changed (not on initial mount)\r\n    if (prevClearFiltersKeyRef.current !== clearFiltersKey && clearFiltersKey !== undefined) {\r\n      setInternalTaskFilter('all');\r\n      setHideCompleted(false);\r\n      // Also clear localStorage\r\n      const key = getFilterStorageKey();\r\n      if (key) {\r\n        try {\r\n          localStorage.removeItem(key);\r\n        } catch (e) {\r\n          console.warn('[GanttBoard] Error clearing filter state from localStorage:', e);\r\n        }\r\n      }\r\n    }\r\n    prevClearFiltersKeyRef.current = clearFiltersKey;\r\n  }, [clearFiltersKey, getFilterStorageKey]);\r\n\r\n  const [scrollTop, setScrollTop] = useState(0);\r\n  const [isResizing, setIsResizing] = useState(false);\r\n  const [gridWidthOverride, setGridWidthOverride] = useState<number | null>(null);\r\n\r\n  // v0.8.0: Context menu state for Split task feature\r\n  const [contextMenu, setContextMenu] = useState<{ isOpen: boolean; x: number; y: number; task: Task | null }>({\r\n    isOpen: false,\r\n    x: 0,\r\n    y: 0,\r\n    task: null,\r\n  });\r\n\r\n  // v0.10.0: Task form modal state for editing\r\n  const [editingTask, setEditingTask] = useState<Task | null>(null);\r\n\r\n  // v0.17.33: Delete confirmation modal state\r\n  // v1.9.6: taskIds (array) para soportar borrado masivo desde el menú\r\n  // contextual con multi-selección. taskName es la etiqueta del modal.\r\n  const [deleteConfirmation, setDeleteConfirmation] = useState<{ taskIds: string[]; taskName: string } | null>(null);\r\n\r\n  // v0.17.215: Keyboard shortcuts state moved back to TaskGrid (with sticky positioning)\r\n\r\n  // Sync with global theme changes (from ThemeContext)\r\n  useEffect(() => {\r\n    if (globalTheme && globalTheme !== currentTheme) {\r\n      setCurrentTheme(globalTheme);\r\n    }\r\n  }, [globalTheme]);\r\n\r\n  // v0.11.6: Sync with initialTheme prop changes (for external theme control)\r\n  useEffect(() => {\r\n    if (initialTheme && initialTheme !== currentTheme) {\r\n      setCurrentTheme(initialTheme);\r\n    }\r\n  }, [initialTheme]);\r\n\r\n  // v0.9.0: Handle theme change with callback\r\n  const handleThemeChange = useCallback(\r\n    (newTheme: Theme) => {\r\n      setCurrentTheme(newTheme);\r\n      onThemeChange?.(newTheme);\r\n    },\r\n    [onThemeChange]\r\n  );\r\n\r\n  // Use undo/redo hook for task management\r\n  const {\r\n    state: localTasks,\r\n    setState: setLocalTasks,\r\n    undo,\r\n    redo,\r\n    canUndo,\r\n    canRedo,\r\n    clearHistory,\r\n  } = useUndoRedo<Task[]>(tasks, 50);\r\n\r\n  // v3.0.0: Compute max WBS depth from task tree\r\n  const maxWbsDepth = useMemo(() => {\r\n    const getMaxDepth = (tasks: Task[], depth = 0): number => {\r\n      let max = depth;\r\n      for (const task of tasks) {\r\n        if (task.subtasks?.length) {\r\n          max = Math.max(max, getMaxDepth(task.subtasks, depth + 1));\r\n        }\r\n      }\r\n      return max;\r\n    };\r\n    return getMaxDepth(localTasks) + 1; // +1 because level 1 = depth 0\r\n  }, [localTasks]);\r\n\r\n  // v0.17.163: Track expanded states separately to preserve them across task reloads\r\n  // This ref stores the isExpanded state for each task ID, updated whenever tasks are toggled\r\n  // v0.17.181: Initialize from localStorage if persistExpandedState is enabled\r\n  const getStorageKey = useCallback(() => {\r\n    if (!persistExpandedState) return null;\r\n    return typeof persistExpandedState === 'string'\r\n      ? persistExpandedState\r\n      : 'gantt-expanded-tasks';\r\n  }, [persistExpandedState]);\r\n\r\n  // Initialize expandedStatesRef from localStorage if persistExpandedState is enabled\r\n  const expandedStatesRef = useRef<Map<string, boolean>>(new Map());\r\n  const hasInitializedFromStorage = useRef(false);\r\n\r\n  // Load from localStorage on first render if persistExpandedState is enabled\r\n  if (!hasInitializedFromStorage.current && persistExpandedState) {\r\n    hasInitializedFromStorage.current = true;\r\n    const storageKey = typeof persistExpandedState === 'string'\r\n      ? persistExpandedState\r\n      : 'gantt-expanded-tasks';\r\n\r\n    try {\r\n      const stored = localStorage.getItem(storageKey);\r\n      if (stored) {\r\n        const parsed = JSON.parse(stored);\r\n        if (Array.isArray(parsed)) {\r\n          // stored as array of [taskId, isExpanded] tuples\r\n          expandedStatesRef.current = new Map(parsed);\r\n        }\r\n      }\r\n    } catch (e) {\r\n      console.warn('[GanttBoard] Error loading expanded state from localStorage:', e);\r\n    }\r\n  }\r\n\r\n  // v0.17.181: Save expanded states to localStorage when they change\r\n  const saveExpandedStatesToStorage = useCallback(() => {\r\n    const storageKey = getStorageKey();\r\n    if (!storageKey) return;\r\n\r\n    try {\r\n      const entries = Array.from(expandedStatesRef.current.entries());\r\n      localStorage.setItem(storageKey, JSON.stringify(entries));\r\n    } catch (e) {\r\n      console.warn('[GanttBoard] Error saving expanded state to localStorage:', e);\r\n    }\r\n  }, [getStorageKey]);\r\n\r\n  // v0.18.13: Counter-based skip to handle multiple sync cycles after internal operations.\r\n  // Each internal operation increments the counter; each useEffect([tasks]) cycle decrements it.\r\n  // This prevents the parent's stale tasks prop from overwriting localTasks after reparent/move/indent.\r\n  const skipSyncCountRef = useRef(0);\r\n\r\n  // Ref to always have the latest localTasks (avoids stale closures in dependency handlers)\r\n  const localTasksRef = useRef(localTasks);\r\n  useEffect(() => { localTasksRef.current = localTasks; }, [localTasks]);\r\n\r\n  // v0.18.13: Also suppress onTasksChange for internal hierarchy ops (reparent/move/indent/outdent).\r\n  // These operations have their own dedicated callbacks; onTasksChange is for date/property edits only.\r\n  const skipOnTasksChangeRef = useRef(false);\r\n\r\n\r\n  // v3.0.0: WBS Level change handler — collapses tree to specified depth\r\n  // Placed after expandedStatesRef, saveExpandedStatesToStorage, skipSyncCountRef to avoid TDZ\r\n  const handleWbsLevelChange = useCallback((level: number | 'all') => {\r\n    setWbsLevel(level);\r\n    // Skip next useEffect([tasks]) sync so it doesn't re-apply old expandedStatesRef\r\n    skipSyncCountRef.current += 1;\r\n    setLocalTasks((prev: Task[]) => {\r\n      const apply = (tasks: Task[], depth = 0): Task[] =>\r\n        tasks.map((t: Task) => {\r\n          const expanded = level === 'all' || depth < (level as number) - 1;\r\n          // Update expandedStatesRef so useEffect([tasks]) sync doesn't override\r\n          if (t.subtasks?.length) {\r\n            expandedStatesRef.current.set(t.id, expanded);\r\n          }\r\n          return {\r\n            ...t,\r\n            isExpanded: expanded,\r\n            subtasks: t.subtasks ? apply(t.subtasks, depth + 1) : undefined,\r\n          };\r\n        });\r\n      const result = apply(prev);\r\n      // Persist to localStorage\r\n      saveExpandedStatesToStorage();\r\n      return result;\r\n    });\r\n  }, [setLocalTasks, saveExpandedStatesToStorage]);\r\n\r\n  // Sync parent tasks prop changes to local state (e.g., after external DB operations)\r\n  // v0.17.163: Preserve isExpanded state using ref to prevent subtasks from auto-expanding\r\n  // v0.18.10: Deduplicate subtasks by ID to prevent visual duplicates during sync\r\n  // v0.18.11: Fixed - dedupe by ID instead of name to allow multiple subtasks with same name\r\n  useEffect(() => {\r\n    if (skipSyncCountRef.current > 0) {\r\n      skipSyncCountRef.current -= 1;\r\n      return;\r\n    }\r\n    // Deduplicate subtasks by ID (keep first occurrence, prefer non-temp IDs)\r\n    const dedupeSubtasks = (subtasks: Task[]): Task[] => {\r\n      const seen = new Map<string, Task>();\r\n      for (const sub of subtasks) {\r\n        // v0.18.11: Use ID for deduplication, not name - allows multiple subtasks with same name\r\n        const key = sub.id;\r\n        const existing = seen.get(key);\r\n        // Keep existing if it has a real ID (not temp), otherwise use new one\r\n        if (!existing) {\r\n          seen.set(key, sub);\r\n        }\r\n      }\r\n      return Array.from(seen.values());\r\n    };\r\n\r\n    // Apply preserved expanded states to incoming tasks\r\n    const applyExpandedState = (taskList: Task[]): Task[] => {\r\n      return taskList.map(task => {\r\n        const preservedState = expandedStatesRef.current.get(task.id);\r\n        const newTask = preservedState !== undefined\r\n          ? { ...task, isExpanded: preservedState }\r\n          : task;\r\n\r\n        if (newTask.subtasks?.length) {\r\n          // Deduplicate subtasks and apply expanded state recursively\r\n          const dedupedSubtasks = dedupeSubtasks(newTask.subtasks);\r\n          return { ...newTask, subtasks: applyExpandedState(dedupedSubtasks) };\r\n        }\r\n        return newTask;\r\n      });\r\n    };\r\n\r\n    // If we have preserved states, apply them; otherwise just use tasks as-is\r\n    // Apply roll-up on initial load so parent dates/progress reflect children\r\n    if (expandedStatesRef.current.size > 0) {\r\n      setLocalTasks(rollUpParentDates(applyExpandedState(tasks)));\r\n    } else {\r\n      // Still deduplicate even without preserved states\r\n      const dedupeAll = (taskList: Task[]): Task[] => {\r\n        return taskList.map(task => {\r\n          if (task.subtasks?.length) {\r\n            return { ...task, subtasks: dedupeSubtasks(dedupeAll(task.subtasks)) };\r\n          }\r\n          return task;\r\n        });\r\n      };\r\n      setLocalTasks(rollUpParentDates(dedupeAll(tasks)));\r\n    }\r\n  }, [tasks, setLocalTasks]);\r\n\r\n  // v0.17.19: Track previous tasks for comparison to avoid unnecessary onTasksChange calls\r\n  const prevTasksRef = useRef<Task[]>(tasks);\r\n  const isInitialMount = useRef(true);\r\n\r\n  // Sync local tasks with parent when they change (optimized to avoid unnecessary calls)\r\n  useEffect(() => {\r\n    // Skip on initial mount - parent already has the tasks\r\n    if (isInitialMount.current) {\r\n      isInitialMount.current = false;\r\n      prevTasksRef.current = localTasks;\r\n      return;\r\n    }\r\n\r\n    // v0.18.13: Skip onTasksChange for internal hierarchy ops (they have dedicated callbacks)\r\n    if (skipOnTasksChangeRef.current) {\r\n      skipOnTasksChangeRef.current = false;\r\n      prevTasksRef.current = localTasks;\r\n      return;\r\n    }\r\n\r\n    if (!onTasksChange) return;\r\n\r\n    const prevJson = JSON.stringify(prevTasksRef.current);\r\n    const currentJson = JSON.stringify(localTasks);\r\n\r\n    if (prevJson !== currentJson) {\r\n      prevTasksRef.current = localTasks;\r\n      onTasksChange(localTasks);\r\n    }\r\n  }, [localTasks, onTasksChange]);\r\n\r\n  // v0.15.0: Compute translations based on locale (must be before columns)\r\n  const translations: GanttTranslations = useMemo(() => {\r\n    return mergeTranslations(locale, customTranslations);\r\n  }, [locale, customTranslations]);\r\n\r\n  // Column configuration - Default: Only show task name\r\n  // v0.13.8: Name column is resizable with min/max width constraints\r\n  // v0.13.9: Increased default width to 320px for better readability of long task names\r\n  // v0.15.0: Column labels now use translations\r\n  // v0.17.56: All columns are now resizable with proper min/max constraints\r\n  const getDefaultColumns = useCallback((t: GanttTranslations): GanttColumn[] => [\r\n    { id: 'name', label: t.columns.taskName, width: 400, minWidth: 200, maxWidth: 2000, visible: true, sortable: true, resizable: true },\r\n    { id: 'startDate', label: t.columns.startDate, width: 110, minWidth: 80, maxWidth: 200, visible: false, sortable: true, resizable: true },\r\n    { id: 'endDate', label: t.columns.endDate, width: 110, minWidth: 80, maxWidth: 200, visible: false, sortable: true, resizable: true },\r\n    { id: 'duration', label: t.columns.duration, width: 80, minWidth: 60, maxWidth: 150, visible: false, sortable: true, resizable: true },\r\n    { id: 'assignees', label: t.columns.assignees, width: 120, minWidth: 80, maxWidth: 300, visible: false, sortable: false, resizable: true },\r\n    { id: 'status', label: t.columns.status, width: 100, minWidth: 70, maxWidth: 180, visible: false, sortable: true, resizable: true },\r\n    { id: 'progress', label: t.columns.progress, width: 120, minWidth: 80, maxWidth: 200, visible: false, sortable: true, resizable: true },\r\n    { id: 'priority', label: t.columns.priority, width: 90, minWidth: 70, maxWidth: 150, visible: false, sortable: true, resizable: true }, // v0.17.29\r\n  ], []);\r\n\r\n  // 1.9.36 · config.defaultVisibleColumns cambia el punto de partida (no lo guardado).\r\n  const visiblesPorDefecto = config.defaultVisibleColumns;\r\n  const conVisiblesPorDefecto = useCallback((cols: GanttColumn[]): GanttColumn[] =>\r\n    visiblesPorDefecto\r\n      ? cols.map(c => c.id === 'name' ? c : { ...c, visible: visiblesPorDefecto.includes(c.id) })\r\n      : cols,\r\n  [visiblesPorDefecto]);\r\n\r\n  // Persist columns config in localStorage (same pattern as persistFilter /\r\n  // persistExpandedState). Only the per-column `visible` + `width` are restored;\r\n  // labels are always re-derived from translations so locale changes still work.\r\n  const columnsStorageKey = useMemo(() => {\r\n    if (!persistColumns) return null;\r\n    return typeof persistColumns === 'string' ? persistColumns : 'gantt-columns-state';\r\n  }, [persistColumns]);\r\n\r\n  const [columns, setColumns] = useState<GanttColumn[]>(() => {\r\n    const defaults = conVisiblesPorDefecto(getDefaultColumns(translations));\r\n    if (!persistColumns) return defaults;\r\n    try {\r\n      const key = typeof persistColumns === 'string' ? persistColumns : 'gantt-columns-state';\r\n      const stored = localStorage.getItem(key);\r\n      if (!stored) return defaults;\r\n      // stored = [{ id, visible, width }]. Merge onto defaults so new columns\r\n      // added in future versions still appear (forward compatible).\r\n      const saved = JSON.parse(stored) as Array<{ id: string; visible?: boolean; width?: number }>;\r\n      const byId = new Map(saved.map(s => [s.id, s]));\r\n      return defaults.map(col => {\r\n        const s = byId.get(col.id);\r\n        return s ? { ...col, visible: s.visible ?? col.visible, width: s.width ?? col.width } : col;\r\n      });\r\n    } catch (e) {\r\n      console.warn('[GanttBoard] Error loading columns state from localStorage:', e);\r\n      return defaults;\r\n    }\r\n  });\r\n\r\n  // Reload columns when the storage key changes (e.g. switching projects while\r\n  // staying on the Gantt view, where the component is NOT remounted). Without\r\n  // this, the lazy useState init only runs once and the columns of the first\r\n  // project would \"stick\" across projects — making per-project config look global.\r\n  const prevColumnsKeyRef = useRef<string | null>(columnsStorageKey);\r\n  useEffect(() => {\r\n    if (prevColumnsKeyRef.current === columnsStorageKey) return;\r\n    prevColumnsKeyRef.current = columnsStorageKey;\r\n    const defaults = conVisiblesPorDefecto(getDefaultColumns(translations));\r\n    if (!columnsStorageKey) {\r\n      setColumns(defaults);\r\n      return;\r\n    }\r\n    try {\r\n      const stored = localStorage.getItem(columnsStorageKey);\r\n      if (!stored) {\r\n        setColumns(defaults);\r\n        return;\r\n      }\r\n      const saved = JSON.parse(stored) as Array<{ id: string; visible?: boolean; width?: number }>;\r\n      const byId = new Map(saved.map(s => [s.id, s]));\r\n      setColumns(defaults.map(col => {\r\n        const s = byId.get(col.id);\r\n        return s ? { ...col, visible: s.visible ?? col.visible, width: s.width ?? col.width } : col;\r\n      }));\r\n    } catch (e) {\r\n      console.warn('[GanttBoard] Error reloading columns state from localStorage:', e);\r\n      setColumns(defaults);\r\n    }\r\n  }, [columnsStorageKey, getDefaultColumns, translations]);\r\n\r\n  // Save columns config to localStorage when visibility/width changes.\r\n  // Guard: skip the render where the key just changed — at that moment `columns`\r\n  // may still hold the PREVIOUS project's state, and the reload effect above is\r\n  // about to replace it. Writing here would leak project A's columns into B's key.\r\n  useEffect(() => {\r\n    if (!columnsStorageKey) return;\r\n    if (prevColumnsKeyRef.current !== columnsStorageKey) return;\r\n    try {\r\n      const state = columns.map(col => ({ id: col.id, visible: col.visible, width: col.width }));\r\n      localStorage.setItem(columnsStorageKey, JSON.stringify(state));\r\n    } catch (e) {\r\n      console.warn('[GanttBoard] Error saving columns state to localStorage:', e);\r\n    }\r\n  }, [columns, columnsStorageKey]);\r\n\r\n  // Update column labels when locale changes\r\n  useEffect(() => {\r\n    setColumns(prev => prev.map(col => ({\r\n      ...col,\r\n      label: translations.columns[col.id === 'name' ? 'taskName' : col.id as keyof typeof translations.columns] || col.label,\r\n    })));\r\n  }, [translations]);\r\n\r\n  // Calculate grid width based on visible columns (memoized)\r\n  // v0.17.213: Buttons now in flex flow, no extra space needed\r\n  const calculatedGridWidth = useMemo(() => {\r\n    const visibleCols = columns.filter(col => col.visible);\r\n    return visibleCols.reduce((sum, col) => sum + col.width, 0);\r\n  }, [columns]);\r\n\r\n  // v0.17.193: Track previous column state for change detection\r\n  const prevVisibleColumnsRef = useRef<string>(\r\n    columns.filter(col => col.visible).map(c => c.id).join(',')\r\n  );\r\n\r\n  // v0.17.193: Handle column visibility changes ONLY\r\n  // This effect ONLY runs when columns are toggled, NOT when user drags\r\n  useEffect(() => {\r\n    const visibleCols = columns.filter(col => col.visible);\r\n    const currentKey = visibleCols.map(c => c.id).join(',');\r\n    const prevKey = prevVisibleColumnsRef.current;\r\n\r\n    // Only act if columns actually changed (not just a re-render)\r\n    if (currentKey !== prevKey) {\r\n      const hasAdditionalColumns = visibleCols.some(col => col.id !== 'name');\r\n      const prevHadAdditional = prevKey.includes(','); // Had more than just 'name'\r\n\r\n      if (!hasAdditionalColumns) {\r\n        // All extra columns removed - reset to auto width\r\n        setGridWidthOverride(null);\r\n      } else if (!prevHadAdditional && hasAdditionalColumns) {\r\n        // First additional column added - start with full width\r\n        setGridWidthOverride(null); // Let it auto-calculate\r\n      }\r\n      // Note: When adding more columns to existing ones, we don't change gridWidthOverride\r\n      // This allows the curtain behavior to work - user controls the width\r\n\r\n      prevVisibleColumnsRef.current = currentKey;\r\n    }\r\n  }, [columns]);\r\n\r\n  // v0.17.192: Grid width calculation - ClickUp style \"curtain\" behavior\r\n  // User can drag to cover/uncover columns like pulling a curtain\r\n  // v0.17.218: Allow expansion up to 60% of viewport width (ClickUp style)\r\n  const BUTTONS_WIDTH = 60; // Space for ColumnManager + Keyboard buttons\r\n  const MAX_VIEWPORT_PERCENT = 0.6; // 60% of viewport width max\r\n  const gridWidth = useMemo(() => {\r\n    const minRequired = 200; // Minimum: just name column\r\n    const contentWidth = calculatedGridWidth + BUTTONS_WIDTH;\r\n    // Max: 60% of viewport OR content width, whichever is larger\r\n    const viewportMax = typeof window !== 'undefined' ? window.innerWidth * MAX_VIEWPORT_PERCENT : 800;\r\n    const maxAllowed = Math.max(contentWidth, viewportMax);\r\n\r\n    // If user has manually resized, respect their choice within bounds\r\n    if (gridWidthOverride !== null) {\r\n      return Math.max(minRequired, Math.min(gridWidthOverride, maxAllowed));\r\n    }\r\n    // Default: show all visible columns + buttons (exact fit)\r\n    return Math.max(minRequired, contentWidth);\r\n  }, [gridWidthOverride, calculatedGridWidth]);\r\n\r\n  const gridScrollRef = useRef<HTMLDivElement>(null);\r\n  const gridScrollInnerRef = useRef<HTMLDivElement>(null); // v0.18.15: The actual scrollable .gantt-grid-scroll element\r\n  const timelineScrollRef = useRef<HTMLDivElement>(null);\r\n  const ganttContainerRef = useRef<HTMLDivElement>(null);\r\n  // Cache the inputs the imperative scrollToToday() needs in a ref so\r\n  // it can read them without listing them in useImperativeHandle deps\r\n  // (where they would create a temporal-dead-zone before the useMemo\r\n  // that derives startDate runs further down).\r\n  const scrollToTodayDepsRef = useRef<{ startDate: Date; timeScale: TimeScale; zoom: number } | null>(null);\r\n\r\n  // Derivar theme desde CSS variables si hay ThemeProvider, sino usar theme estático\r\n  const theme = useMemo(() => {\r\n    return deriveThemeFromCSS(currentTheme);\r\n  }, [currentTheme]);\r\n\r\n  // Crear valor del contexto del tema para componentes hijos (Portal, etc.)\r\n  const ganttThemeContextValue = useMemo(() => ({\r\n    theme,\r\n    themeName: currentTheme,\r\n  }), [theme, currentTheme]);\r\n\r\n  // Merge user templates with defaults\r\n  const mergedTemplates = useMemo(() => {\r\n    return mergeTemplates(templates);\r\n  }, [templates]);\r\n\r\n  // 🚀 KILLER FEATURE #1: Calculate Critical Path (auto-updates when tasks change)\r\n  // v5.1.0: Full CPM data (ES/EF/LS/LF/TF/FF) per task for visual rendering\r\n  const tasksWithCriticalPath = useMemo(() => {\r\n    // Only run the (expensive, full-tree) CPM computation when it's actually\r\n    // needed: either auto-CPM is enabled AND the user is showing the critical\r\n    // path, or showCriticalPath is on. With CPM off-by-default this skips the\r\n    // heavy calc on every mount/view-switch until the user toggles it on.\r\n    if (!enableAutoCriticalPath || !showCriticalPath) {\r\n      return localTasks;\r\n    }\r\n\r\n    const cpmMap = ganttUtils.calculateCriticalPathFull(localTasks);\r\n\r\n    const markCritical = (tasks: Task[]): Task[] => {\r\n      return tasks.map(task => {\r\n        const cpm = cpmMap.get(task.id);\r\n        const enrichedSubtasks = task.subtasks ? markCritical(task.subtasks) : undefined;\r\n        // Master bar is critical if ANY child is critical\r\n        const hasCriticalChild = enrichedSubtasks?.some(s => s.isCriticalPath || (s.subtasks && s.subtasks.some(ss => ss.isCriticalPath))) || false;\r\n        const isCritical = cpm ? cpm.isCritical : hasCriticalChild;\r\n        return {\r\n          ...task,\r\n          isCriticalPath: isCritical,\r\n          cpmData: cpm || undefined,\r\n          subtasks: enrichedSubtasks,\r\n        };\r\n      });\r\n    };\r\n\r\n    return markCritical(localTasks);\r\n  }, [localTasks, enableAutoCriticalPath, showCriticalPath]);\r\n\r\n  // v5.1.0: Check if any task has dependencies (for disabling CPM button)\r\n  const hasDependencies = useMemo(() => {\r\n    const flat = ganttUtils.flattenTasks(localTasks);\r\n    return flat.some(t => t.dependencies && t.dependencies.length > 0);\r\n  }, [localTasks]);\r\n\r\n  // v1.5.93: Stamp each task with its UNFILTERED WBS code so the visible\r\n  // numbering stays stable when the user filters (e.g. \"4.0 Diseño\" stays\r\n  // \"4.0\" instead of becoming \"2.0\" because earlier siblings were hidden).\r\n  // TaskGrid will read task.wbsCode if present and skip recomputing.\r\n  const tasksWithStableWbs = useMemo((): Task[] => {\r\n    const stamp = (taskList: Task[], parentWbs = ''): Task[] => {\r\n      const sorted = [...taskList].sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\r\n      return sorted.map((task, i) => {\r\n        const seq = i + 1;\r\n        const wbsCode = parentWbs ? `${parentWbs}.${seq}` : `${seq}.0`;\r\n        const childPrefix = parentWbs ? `${parentWbs}.${seq}` : `${seq}`;\r\n        return {\r\n          ...task,\r\n          wbsCode,\r\n          subtasks: task.subtasks?.length ? stamp(task.subtasks, childPrefix) : task.subtasks,\r\n        };\r\n      });\r\n    };\r\n    return stamp(tasksWithCriticalPath);\r\n  }, [tasksWithCriticalPath]);\r\n\r\n  // v0.17.300: Filter tasks based on taskFilter state\r\n  // v0.18.0: Added hideCompleted filter\r\n  /*\r\n   * 1.9.43 · config.searchQuery: la app pasa lo que se escribe en SU buscador y\r\n   * aquí solo se OCULTA lo que no coincide (como hideCompleted: los datos no se\r\n   * tocan). Una tarea que coincide se ve entera; si coincide una hija, su padre\r\n   * se queda con las ramas que coinciden. Sin tildes ni mayúsculas.\r\n   */\r\n  const busquedaExterna = (config.searchQuery ?? '').trim();\r\n  const filteredTasks = useMemo((): Task[] => {\r\n    const base = filtrarPorEstado();\r\n    if (!busquedaExterna) return base;\r\n    const normal = (x: string) => x.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase();\r\n    const q = normal(busquedaExterna);\r\n    const porNombre = (lista: Task[]): Task[] => {\r\n      const out: Task[] = [];\r\n      for (const t of lista) {\r\n        if (normal(t.name || '').includes(q)) { out.push(t); continue; }\r\n        const hijas = t.subtasks?.length ? porNombre(t.subtasks) : [];\r\n        if (hijas.length) out.push({ ...t, subtasks: hijas });\r\n      }\r\n      return out;\r\n    };\r\n    return porNombre(base);\r\n\r\n    function filtrarPorEstado(): Task[] {\r\n    // If no filters active, return all tasks\r\n    if (taskFilter === 'all' && !hideCompleted) return tasksWithStableWbs;\r\n\r\n    const filterTasksRecursively = (taskList: Task[]): Task[] => {\r\n      const result: Task[] = [];\r\n\r\n      for (const task of taskList) {\r\n        // Filter subtasks recursively\r\n        const filteredSubtasks = task.subtasks?.length\r\n          ? filterTasksRecursively(task.subtasks)\r\n          : undefined;\r\n\r\n        // Check if task matches filter\r\n        let matches = false;\r\n\r\n        // v0.18.0: Handle hideCompleted filter\r\n        if (hideCompleted) {\r\n          // 1.9.36 · terminada = estado completed O 100 %, igual que la barra (isCompleted).\r\n          matches = task.progress < 100 && task.status !== 'completed';\r\n        } else {\r\n          switch (taskFilter) {\r\n            case 'all':\r\n              matches = true;\r\n              break;\r\n            case 'incomplete':\r\n              matches = task.progress < 100;\r\n              break;\r\n            case 'in_progress':\r\n              matches = task.progress > 0 && task.progress < 100;\r\n              break;\r\n            case 'completed':\r\n              matches = task.progress === 100;\r\n              break;\r\n          }\r\n        }\r\n\r\n        // Include task if it matches OR has matching subtasks\r\n        if (matches || (filteredSubtasks && filteredSubtasks.length > 0)) {\r\n          result.push({\r\n            ...task,\r\n            subtasks: filteredSubtasks,\r\n          });\r\n        }\r\n      }\r\n\r\n      return result;\r\n    };\r\n\r\n    return filterTasksRecursively(tasksWithStableWbs);\r\n    }\r\n  }, [tasksWithStableWbs, taskFilter, hideCompleted, busquedaExterna]);\r\n\r\n  // Calculate row height based on density\r\n  const rowHeight = getRowHeight(rowDensity);\r\n\r\n  // Enable undo/redo keyboard shortcuts\r\n  useGanttUndoRedoKeys({\r\n    undo,\r\n    redo,\r\n    canUndo,\r\n    canRedo,\r\n    enabled: true,\r\n  });\r\n\r\n  // Expose imperative API via ref (similar to DHTMLX gantt.* methods)\r\n  // 1.9.35 · scrollToDate / fitToDates: misma fórmula de ancho de día que scrollToToday.\r\n  const pendingScrollRef = useRef<Date | null>(null);\r\n  const desplazarA = (date: Date, align: 'start' | 'center' = 'start') => {\r\n    const scrollEl = timelineScrollRef.current;\r\n    const sd = scrollToTodayDepsRef.current;\r\n    if (!scrollEl || !sd) return;\r\n    const days = (date.getTime() - sd.startDate.getTime()) / (1000 * 60 * 60 * 24);\r\n    const dayWidth = sd.timeScale === 'day' ? 60 : sd.timeScale === 'week' ? 20 : 8;\r\n    const x = days * dayWidth * sd.zoom;\r\n    const target = align === 'center' ? x - scrollEl.clientWidth / 2 : x - dayWidth * sd.zoom * 2;\r\n    scrollEl.scrollTo({ left: Math.max(0, target), behavior: 'auto' });\r\n  };\r\n\r\n  useImperativeHandle(ref, () => ({\r\n    // ==================== CRUD Methods ====================\r\n    getTask: (id: string) => ganttUtils.findTaskById(localTasks, id),\r\n\r\n    addTask: (task: Task, parentId?: string) => {\r\n      setLocalTasks((prev) => {\r\n        if (!parentId) {\r\n          // Add as root-level task\r\n          return [...prev, { ...task, level: 0 }];\r\n        }\r\n\r\n        // Add as subtask\r\n        const addToParent = (tasks: Task[]): Task[] => {\r\n          return tasks.map((t) => {\r\n            if (t.id === parentId) {\r\n              return {\r\n                ...t,\r\n                subtasks: [...(t.subtasks || []), { ...task, parentId, level: (t.level || 0) + 1 }],\r\n                isExpanded: true,\r\n              };\r\n            }\r\n            if (t.subtasks) {\r\n              return { ...t, subtasks: addToParent(t.subtasks) };\r\n            }\r\n            return t;\r\n          });\r\n        };\r\n        return addToParent(prev);\r\n      });\r\n    },\r\n\r\n    updateTask: (id: string, updates: Partial<Task>) => {\r\n      setLocalTasks((prev) => {\r\n        const update = (tasks: Task[]): Task[] => {\r\n          return tasks.map((task) => {\r\n            if (task.id === id) {\r\n              return { ...task, ...updates };\r\n            }\r\n            if (task.subtasks) {\r\n              return { ...task, subtasks: update(task.subtasks) };\r\n            }\r\n            return task;\r\n          });\r\n        };\r\n        return update(prev);\r\n      });\r\n    },\r\n\r\n    deleteTask: (id: string) => {\r\n      setLocalTasks((prev) => {\r\n        const remove = (tasks: Task[]): Task[] => {\r\n          return tasks.filter((task) => {\r\n            if (task.id === id) return false;\r\n            if (task.subtasks) {\r\n              task.subtasks = remove(task.subtasks);\r\n            }\r\n            return true;\r\n          });\r\n        };\r\n        return remove(prev);\r\n      });\r\n    },\r\n\r\n    deleteTasks: (ids: string[]) => {\r\n      setLocalTasks((prev) => deleteTasks(prev, ids));\r\n    },\r\n\r\n    duplicateTask: (id: string) => {\r\n      // v1.4.14: If callback exists, delegate to consumer (SaaS handles DB persistence)\r\n      if (config.onTaskDuplicate) {\r\n        const task = ganttUtils.findTaskById(localTasks, id);\r\n        if (task) config.onTaskDuplicate(task);\r\n      } else {\r\n        // No callback - duplicate in memory only (standalone mode)\r\n        setLocalTasks((prev) => duplicateTasks(prev, [id]).tasks);\r\n      }\r\n    },\r\n\r\n    // v0.8.1: Split task feature (creates GAP like Bryntum)\r\n    splitTask: (id: string, splitDate: Date, gapDays = 3) => {\r\n      setLocalTasks((prev) => ganttUtils.splitTask(prev, id, splitDate, gapDays));\r\n    },\r\n\r\n    // ==================== Utility Methods ====================\r\n    calculateEndDate: ganttUtils.calculateEndDate,\r\n    calculateDuration: ganttUtils.calculateDuration,\r\n    validateDependency: (fromTaskId: string, toTaskId: string) => {\r\n      return !ganttUtils.validateDependencies(localTasks, fromTaskId, toTaskId);\r\n    },\r\n\r\n    // ==================== Data Methods ====================\r\n    getAllTasks: () => ganttUtils.flattenTasks(localTasks),\r\n\r\n    getTasksByStatus: (status: 'todo' | 'in-progress' | 'completed') => {\r\n      return ganttUtils.flattenTasks(localTasks).filter((t) => t.status === status);\r\n    },\r\n\r\n    getTasksByParent: (parentId?: string) => {\r\n      if (!parentId) {\r\n        // Return root-level tasks\r\n        return localTasks.filter((t) => !t.parentId);\r\n      }\r\n      const parent = ganttUtils.findTaskById(localTasks, parentId);\r\n      return parent?.subtasks || [];\r\n    },\r\n\r\n    getCriticalPath: () => {\r\n      return ganttUtils.flattenTasks(localTasks).filter((t) => t.isCriticalPath);\r\n    },\r\n\r\n    // ==================== Hierarchy Methods ====================\r\n    indentTask: (taskId: string) => {\r\n      setLocalTasks((prev) => rollUpParentDates(indentTasks(prev, [taskId])));\r\n    },\r\n\r\n    outdentTask: (taskId: string) => {\r\n      setLocalTasks((prev) => rollUpParentDates(outdentTasks(prev, [taskId])));\r\n    },\r\n\r\n    moveTask: (taskId: string, direction: 'up' | 'down') => {\r\n      setLocalTasks((prev) => moveTasks(prev, [taskId], direction));\r\n    },\r\n\r\n    createSubtask: async (parentId: string) => {\r\n      // Create subtask first\r\n      const { tasks: newTasks, newTask } = createSubtask(localTasks, parentId);\r\n\r\n      // v0.8.0: Before event (cancelable, supports async)\r\n      if (onBeforeTaskAdd) {\r\n        const result = onBeforeTaskAdd({ ...newTask, parentId });\r\n        // Handle both sync and async callbacks\r\n        const shouldContinue = result instanceof Promise ? await result : result;\r\n        if (shouldContinue === false) {\r\n          return; // Cancel creation\r\n        }\r\n      }\r\n\r\n      // Only update state if not cancelled — apply roll-up to recalculate parent\r\n      setLocalTasks(rollUpParentDates(newTasks));\r\n\r\n      // v0.8.0: After event (non-cancelable)\r\n      if (onAfterTaskAdd) {\r\n        onAfterTaskAdd({ ...newTask, parentId });\r\n      }\r\n    },\r\n\r\n    // ==================== UI Methods ====================\r\n    scrollToTask: (id: string) => {\r\n      // Find task index in flattened list\r\n      const flatTasks = ganttUtils.flattenTasks(localTasks);\r\n      const index = flatTasks.findIndex((t) => t.id === id);\r\n\r\n      if (index !== -1 && gridScrollRef.current) {\r\n        const scrollTop = index * rowHeight;\r\n        gridScrollRef.current.scrollTo({ top: scrollTop, behavior: 'smooth' });\r\n        if (timelineScrollRef.current) {\r\n          timelineScrollRef.current.scrollTo({ top: scrollTop, behavior: 'smooth' });\r\n        }\r\n      }\r\n    },\r\n\r\n    highlightTask: (id: string, duration = 2000) => {\r\n      // TODO: Implement visual highlighting - currently a no-op\r\n      void id;\r\n      void duration;\r\n    },\r\n\r\n    expandTask: (id: string) => {\r\n      setLocalTasks((prev) => {\r\n        const expand = (tasks: Task[]): Task[] => {\r\n          return tasks.map((task) => {\r\n            if (task.id === id) {\r\n              return { ...task, isExpanded: true };\r\n            }\r\n            if (task.subtasks) {\r\n              return { ...task, subtasks: expand(task.subtasks) };\r\n            }\r\n            return task;\r\n          });\r\n        };\r\n        return expand(prev);\r\n      });\r\n    },\r\n\r\n    collapseTask: (id: string) => {\r\n      setLocalTasks((prev) => {\r\n        const collapse = (tasks: Task[]): Task[] => {\r\n          return tasks.map((task) => {\r\n            if (task.id === id) {\r\n              return { ...task, isExpanded: false };\r\n            }\r\n            if (task.subtasks) {\r\n              return { ...task, subtasks: collapse(task.subtasks) };\r\n            }\r\n            return task;\r\n          });\r\n        };\r\n        return collapse(prev);\r\n      });\r\n    },\r\n\r\n    expandAll: () => {\r\n      setLocalTasks((prev) => {\r\n        const expandAll = (tasks: Task[]): Task[] => {\r\n          return tasks.map((task) => ({\r\n            ...task,\r\n            isExpanded: true,\r\n            subtasks: task.subtasks ? expandAll(task.subtasks) : undefined,\r\n          }));\r\n        };\r\n        return expandAll(prev);\r\n      });\r\n    },\r\n\r\n    collapseAll: () => {\r\n      setLocalTasks((prev) => {\r\n        const collapseAll = (tasks: Task[]): Task[] => {\r\n          return tasks.map((task) => ({\r\n            ...task,\r\n            isExpanded: false,\r\n            subtasks: task.subtasks ? collapseAll(task.subtasks) : undefined,\r\n          }));\r\n        };\r\n        return collapseAll(prev);\r\n      });\r\n    },\r\n\r\n    // v3.0.0: Collapse to a specific WBS level\r\n    collapseToLevel: (level: number | 'all') => {\r\n      handleWbsLevelChange(level);\r\n    },\r\n\r\n    // ==================== Undo/Redo ====================\r\n    undo,\r\n    redo,\r\n    canUndo: () => canUndo,\r\n    canRedo: () => canRedo,\r\n    clearHistory,\r\n\r\n    // ==================== Export/Import ====================\r\n    // v0.17.224: Enhanced PNG export - captures full diagram\r\n    exportToPNG: async () => {\r\n      if (!ganttContainerRef.current || !gridScrollRef.current || !timelineScrollRef.current) {\r\n        throw new Error('Gantt container not found');\r\n      }\r\n\r\n      const ganttContainer = ganttContainerRef.current;\r\n      const gridWrapper = gridScrollRef.current;\r\n      const gridScroll = (gridScrollInnerRef.current ||\r\n        gridWrapper.querySelector('.gantt-grid-scroll')) as HTMLElement | null;\r\n      const timelineScroll = timelineScrollRef.current;\r\n\r\n      // Store original state\r\n      const originalGridScrollTop = gridScroll?.scrollTop || 0;\r\n      const originalTimelineScrollTop = timelineScroll.scrollTop;\r\n      const originalOverflow = ganttContainer.style.overflow;\r\n      const originalHeight = ganttContainer.style.height;\r\n      const originalWrapperOverflow = gridWrapper.style.overflow;\r\n\r\n      try {\r\n        // Calculate full content dimensions\r\n        const taskGridContent = gridScroll?.querySelector('.gantt-taskgrid-content') as HTMLElement | null;\r\n        const timelineSvg = timelineScroll.querySelector('svg') as SVGElement | null;\r\n        const gridContentHeight = taskGridContent?.scrollHeight || gridScroll?.scrollHeight || 600;\r\n        const timelineContentHeight = timelineSvg?.getBoundingClientRect().height || timelineScroll.scrollHeight;\r\n        const toolbar = ganttContainer.querySelector('[style*=\"z-index: 100\"]') as HTMLElement | null;\r\n        const toolbarHeight = toolbar?.offsetHeight || 48;\r\n        const totalHeight = toolbarHeight + Math.max(gridContentHeight, timelineContentHeight) + 20;\r\n\r\n        // Reset scroll and expand; remove overflow:clip from wrapper\r\n        if (gridScroll) gridScroll.scrollTop = 0;\r\n        timelineScroll.scrollTop = 0;\r\n        ganttContainer.style.overflow = 'visible';\r\n        ganttContainer.style.height = `${totalHeight}px`;\r\n        gridWrapper.style.overflow = 'visible';\r\n\r\n        await new Promise(resolve => setTimeout(resolve, 100));\r\n\r\n        const dataUrl = await toPng(ganttContainer, {\r\n          backgroundColor: theme.bgPrimary,\r\n          pixelRatio: 2,\r\n          filter: (node) => {\r\n            if (!(node instanceof Element)) return true;\r\n            const style = window.getComputedStyle(node);\r\n            const zIndex = parseInt(style.zIndex, 10);\r\n            return (isNaN(zIndex) || zIndex < 50) && style.position !== 'fixed';\r\n          },\r\n        });\r\n\r\n        // Convert dataUrl to Blob\r\n        const res = await fetch(dataUrl);\r\n        return await res.blob();\r\n      } finally {\r\n        // Restore original state\r\n        ganttContainer.style.overflow = originalOverflow;\r\n        ganttContainer.style.height = originalHeight;\r\n        gridWrapper.style.overflow = originalWrapperOverflow;\r\n        if (gridScroll) gridScroll.scrollTop = originalGridScrollTop;\r\n        timelineScroll.scrollTop = originalTimelineScrollTop;\r\n      }\r\n    },\r\n\r\n    exportToPDF: async (filename?: string) => {\r\n      await ganttUtils.exportToPDF(localTasks, filename);\r\n    },\r\n\r\n    exportToExcel: async (filename?: string) => {\r\n      await ganttUtils.exportToExcel(localTasks, filename, exportRateRef.current);\r\n    },\r\n\r\n    exportToJSON: () => ganttUtils.exportToJSON(localTasks),\r\n    exportToCSV: () => ganttUtils.exportToCSV(localTasks),\r\n\r\n    importFromJSON: (json: string) => {\r\n      const imported = ganttUtils.importFromJSON(json);\r\n      setLocalTasks(imported);\r\n    },\r\n\r\n    // ==================== State Methods ====================\r\n    getTasks: () => localTasks,\r\n\r\n    refresh: () => {\r\n      // Force re-render by creating a new reference\r\n      setLocalTasks((prev) => [...prev]);\r\n    },\r\n\r\n    clearAll: () => {\r\n      setLocalTasks([]);\r\n    },\r\n\r\n    scrollToDate: (date: Date, align: 'start' | 'center' = 'start') => desplazarA(date, align),\r\n\r\n    fitToDates: (start: Date, end: Date) => {\r\n      const dias = Math.max(1, (end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));\r\n      const escala: TimeScale = dias <= 21 ? 'day' : dias <= 122 ? 'week' : 'month';\r\n      pendingScrollRef.current = start;\r\n      setTimeScale(escala);\r\n      // Misma escala: no hay re-render que consuma el desplazamiento.\r\n      if (escala === scrollToTodayDepsRef.current?.timeScale) {\r\n        requestAnimationFrame(() => {\r\n          const d = pendingScrollRef.current;\r\n          pendingScrollRef.current = null;\r\n          if (d) desplazarA(d);\r\n        });\r\n      }\r\n    },\r\n\r\n    scrollToToday: () => {\r\n      const scrollEl = timelineScrollRef.current;\r\n      const sd = scrollToTodayDepsRef.current;\r\n      if (!scrollEl || !sd) return;\r\n      const today = new Date();\r\n      const daysFromStart = (today.getTime() - sd.startDate.getTime()) / (1000 * 60 * 60 * 24);\r\n      // Match the dayWidth formula used inside Timeline.tsx so the\r\n      // computed pixel position lines up with the rendered TODAY line.\r\n      const dayWidth = sd.timeScale === 'day' ? 60 : sd.timeScale === 'week' ? 20 : 8;\r\n      const todayX = daysFromStart * dayWidth * sd.zoom;\r\n      const viewportWidth = scrollEl.clientWidth;\r\n      // Center today in the viewport. Clamp to valid scroll range.\r\n      const target = Math.max(0, todayX - viewportWidth / 2);\r\n      scrollEl.scrollTo({ left: target, behavior: 'smooth' });\r\n    },\r\n  }), [localTasks, undo, redo, canUndo, canRedo, clearHistory, theme, rowHeight]);\r\n\r\n  // Handle column toggle (memoized)\r\n  const handleToggleColumn = useCallback((columnId: ColumnType) => {\r\n    setColumns(prev =>\r\n      prev.map(col =>\r\n        col.id === columnId ? { ...col, visible: !col.visible } : col\r\n      )\r\n    );\r\n  }, []);\r\n\r\n  // v0.13.8: Handle column resize (memoized)\r\n  const handleColumnResize = useCallback((columnId: ColumnType, newWidth: number) => {\r\n    setColumns(prev =>\r\n      prev.map(col => {\r\n        if (col.id !== columnId) return col;\r\n        // Clamp width to min/max constraints\r\n        const minW = col.minWidth ?? 100;\r\n        const maxW = col.maxWidth ?? 800;\r\n        const clampedWidth = Math.max(minW, Math.min(maxW, newWidth));\r\n        return { ...col, width: clampedWidth };\r\n      })\r\n    );\r\n  }, []);\r\n\r\n  // Handle task toggle (memoized)\r\n  // v0.17.163: Also update expandedStatesRef to persist state across task reloads\r\n  // v0.17.181: Save to localStorage if persistExpandedState is enabled\r\n  const handleTaskToggle = useCallback((taskId: string) => {\r\n    setLocalTasks((prev) => {\r\n      const newTasks = toggleTaskExpansion(prev, taskId);\r\n\r\n      // Find the toggled task and update the ref with its new expanded state\r\n      const findAndUpdateExpandedState = (taskList: Task[]) => {\r\n        for (const task of taskList) {\r\n          if (task.id === taskId) {\r\n            expandedStatesRef.current.set(taskId, task.isExpanded ?? true);\r\n            return;\r\n          }\r\n          if (task.subtasks?.length) {\r\n            findAndUpdateExpandedState(task.subtasks);\r\n          }\r\n        }\r\n      };\r\n      findAndUpdateExpandedState(newTasks);\r\n\r\n      // v0.17.181: Persist to localStorage\r\n      saveExpandedStatesToStorage();\r\n\r\n      return newTasks;\r\n    });\r\n    config.onTaskToggleExpand?.(taskId);\r\n  }, [config, saveExpandedStatesToStorage]);\r\n\r\n  // Handle task updates from context menu (memoized)\r\n  const handleTaskUpdate = useCallback((taskId: string, updates: Partial<Task>) => {\r\n    // v0.8.0: Before event (cancelable)\r\n    if (onBeforeTaskUpdate) {\r\n      const shouldContinue = onBeforeTaskUpdate(taskId, updates);\r\n      if (shouldContinue === false) {\r\n        return; // Cancel the update\r\n      }\r\n    }\r\n\r\n    // Find current task to detect progress change\r\n    const currentTask = ganttUtils.findTaskById(localTasks, taskId);\r\n    const oldProgress = currentTask?.progress;\r\n\r\n    const updateTask = (tasks: Task[]): Task[] => {\r\n      return tasks.map((task) => {\r\n        if (task.id === taskId) {\r\n          return { ...task, ...updates };\r\n        }\r\n        if (task.subtasks) {\r\n          return { ...task, subtasks: updateTask(task.subtasks) };\r\n        }\r\n        return task;\r\n      });\r\n    };\r\n    // Use the functional updater so multiple synchronous calls (e.g. drag-fill\r\n    // applying a value to many rows in one tick) each build on the previous\r\n    // result instead of all reading the same stale `localTasks` closure.\r\n    setLocalTasks((prev) => updateTask(prev));\r\n\r\n    // Call callback events\r\n    const updatedTask = ganttUtils.findTaskById(updateTask(localTasks), taskId);\r\n    if (updatedTask) {\r\n      onTaskUpdate?.(updatedTask);\r\n\r\n      // v0.8.0: After event\r\n      onAfterTaskUpdate?.(updatedTask);\r\n\r\n      // v0.8.0: Progress change event\r\n      if (updates.progress !== undefined && oldProgress !== undefined && updates.progress !== oldProgress) {\r\n        onProgressChange?.(taskId, oldProgress, updates.progress);\r\n      }\r\n    }\r\n  }, [localTasks, onTaskUpdate, onBeforeTaskUpdate, onAfterTaskUpdate, onProgressChange]);\r\n\r\n  // Drag-fill: apply ONE value to MANY tasks in a single state update, then let\r\n  // the consumer persist via a dedicated callback. Doing it in one pass (instead\r\n  // of N onTaskUpdate calls) avoids stale-state batching and guarantees every\r\n  // target row is updated.\r\n  const handleBulkFill = useCallback((\r\n    taskIds: string[],\r\n    column: 'assignees' | 'startDate' | 'endDate',\r\n    value: any,\r\n  ) => {\r\n    if (taskIds.length === 0) return;\r\n    const idSet = new Set(taskIds);\r\n    const apply = (tasks: Task[]): Task[] =>\r\n      tasks.map((task) => {\r\n        const next = idSet.has(task.id) ? { ...task, [column]: value } : task;\r\n        if (next.subtasks) return { ...next, subtasks: apply(next.subtasks) };\r\n        return next;\r\n      });\r\n    setLocalTasks((prev) => {\r\n      const updated = apply(prev);\r\n      // Notify the consumer with the freshly-updated tree so it persists the\r\n      // exact tasks that changed (does not rely on diffing).\r\n      config.onBulkFill?.(taskIds, column, value, updated);\r\n      return updated;\r\n    });\r\n  }, [config]);\r\n\r\n  // Hierarchy handlers\r\n  // v0.18.13: All hierarchy handlers set both skipSyncCountRef (to prevent useEffect([tasks]) overwrite)\r\n  // and skipOnTasksChangeRef (to prevent useEffect([localTasks]) from calling onTasksChange,\r\n  // since these operations have their own dedicated callbacks).\r\n  const handleTaskIndent = useCallback((taskIds: string[]) => {\r\n    if (taskIds.length === 0) return;\r\n    skipSyncCountRef.current += 1;\r\n    skipOnTasksChangeRef.current = true;\r\n    setLocalTasks((prev) => rollUpParentDates(indentTasks(prev, taskIds)));\r\n    config.onTaskIndent?.(taskIds[0]!);\r\n  }, [config]);\r\n\r\n  const handleTaskOutdent = useCallback((taskIds: string[]) => {\r\n    if (taskIds.length === 0) return;\r\n    skipSyncCountRef.current += 1;\r\n    skipOnTasksChangeRef.current = true;\r\n    setLocalTasks((prev) => rollUpParentDates(outdentTasks(prev, taskIds)));\r\n    config.onTaskOutdent?.(taskIds[0]!);\r\n  }, [config]);\r\n\r\n  // v0.17.68: Handle task reparenting via drag & drop\r\n  const handleTaskReparent = useCallback((taskId: string, newParentId: string | null, position?: number) => {\r\n    skipSyncCountRef.current += 1;\r\n    skipOnTasksChangeRef.current = true;\r\n    setLocalTasks((prev) => rollUpParentDates(reparentTask(prev, taskId, newParentId, position)));\r\n    config.onTaskReparent?.(taskId, newParentId, position);\r\n  }, [config]);\r\n\r\n  const handleTaskMove = useCallback((taskIds: string[], direction: 'up' | 'down') => {\r\n    if (taskIds.length === 0) return;\r\n    skipSyncCountRef.current += 1;\r\n    skipOnTasksChangeRef.current = true;\r\n    setLocalTasks((prev) => moveTasks(prev, taskIds, direction));\r\n    config.onTaskMove?.(taskIds[0]!, direction);\r\n  }, [config]);\r\n\r\n  const handleMultiTaskDelete = useCallback(async (taskIds: string[]) => {\r\n    // v0.17.19: Support lifecycle callbacks for delete operations\r\n    // Filter out tasks that are blocked by onBeforeTaskDelete\r\n    const allowedTaskIds: string[] = [];\r\n\r\n    for (const taskId of taskIds) {\r\n      if (onBeforeTaskDelete) {\r\n        const result = await Promise.resolve(onBeforeTaskDelete(taskId));\r\n        if (result === false) {\r\n          // Skip this task - deletion was cancelled\r\n          continue;\r\n        }\r\n      }\r\n      allowedTaskIds.push(taskId);\r\n    }\r\n\r\n    // If no tasks are allowed to be deleted, return early\r\n    if (allowedTaskIds.length === 0) {\r\n      return;\r\n    }\r\n\r\n    // Call the consumer's onMultiTaskDelete handler if provided\r\n    if (config.onMultiTaskDelete) {\r\n      config.onMultiTaskDelete(allowedTaskIds);\r\n    } else {\r\n      // Fallback: update local state and call individual delete handlers\r\n      setLocalTasks((prev) => rollUpParentDates(deleteTasks(prev, allowedTaskIds)));\r\n      allowedTaskIds.forEach(id => config.onTaskDelete?.(id));\r\n    }\r\n\r\n    // v0.17.19: Call onAfterTaskDelete for each successfully deleted task\r\n    if (onAfterTaskDelete) {\r\n      allowedTaskIds.forEach(id => onAfterTaskDelete(id));\r\n    }\r\n  }, [config, onBeforeTaskDelete, onAfterTaskDelete]);\r\n\r\n  // v1.4.14: Pass original task to callback - consumer handles persistence and reload\r\n  const handleTaskDuplicate = useCallback((taskIds: string[]) => {\r\n    // If callback exists, delegate to consumer (SaaS handles DB persistence)\r\n    if (config.onTaskDuplicate) {\r\n      taskIds.forEach(id => {\r\n        const task = ganttUtils.findTaskById(localTasks, id);\r\n        if (task) config.onTaskDuplicate!(task);\r\n      });\r\n    } else {\r\n      // No callback - duplicate in memory only (standalone mode)\r\n      setLocalTasks((prev) => duplicateTasks(prev, taskIds).tasks);\r\n    }\r\n  }, [config, localTasks]);\r\n\r\n  const handleTaskCreate = useCallback((afterTaskId: string, direction: 'above' | 'below') => {\r\n    setLocalTasks((prev) => {\r\n      const { tasks, newTask } = createTask(prev, afterTaskId, direction);\r\n\r\n      // v0.8.0: Before event (cancelable)\r\n      if (onBeforeTaskAdd) {\r\n        const shouldContinue = onBeforeTaskAdd(newTask);\r\n        if (shouldContinue === false) {\r\n          return prev; // Cancel the addition, return unchanged tasks\r\n        }\r\n      }\r\n\r\n      config.onTaskCreate?.(newTask.parentId, newTask.position || 0);\r\n\r\n      // v0.8.0: After event\r\n      onAfterTaskAdd?.(newTask);\r\n\r\n      return tasks;\r\n    });\r\n  }, [config, onBeforeTaskAdd, onAfterTaskAdd]);\r\n\r\n  const handleTaskRename = useCallback((taskId: string, newName: string) => {\r\n    setLocalTasks((prev) => renameTask(prev, taskId, newName));\r\n    config.onTaskRename?.(taskId, newName);\r\n  }, [config]);\r\n\r\n  const handleCreateSubtask = useCallback((parentTaskId: string) => {\r\n    // v1.4.15: If onTaskAddSubtask is provided, use it for proper position handling\r\n    // This ensures the subtask is created with the correct position in the database\r\n    const { onTaskAddSubtask } = config;\r\n    if (onTaskAddSubtask) {\r\n      const parentTask = findTask(localTasks, parentTaskId);\r\n      if (parentTask) {\r\n        onTaskAddSubtask(parentTask);\r\n        return;\r\n      }\r\n    }\r\n\r\n    // Fallback: create subtask locally (when no callback is provided)\r\n    setLocalTasks((prev) => {\r\n      const { tasks } = createSubtask(prev, parentTaskId);\r\n      config.onTaskCreate?.(parentTaskId, 0);\r\n      return tasks;\r\n    });\r\n  }, [config, localTasks]);\r\n\r\n  // 🚀 KILLER FEATURE #2: Handle task date changes WITH auto-scheduling\r\n  // v4.2.0: Commit on pointerup after dragging the progress edge of a bar.\r\n  // Auto-promote to status=completed when progress hits 100, and back to\r\n  // in-progress (or todo) based on the new value, matching the Status column\r\n  // behavior elsewhere. Goes through handleTaskUpdate so all downstream\r\n  // listeners (onTaskUpdate, onProgressChange, onAfterTaskUpdate) fire.\r\n  const handleTaskProgressDrag = useCallback((task: Task, newProgress: number) => {\r\n    const clamped = Math.max(0, Math.min(100, Math.round(newProgress)));\r\n    const updates: Partial<Task> = { progress: clamped };\r\n    if (clamped === 100) updates.status = 'completed';\r\n    else if (clamped > 0) updates.status = 'in-progress';\r\n    else updates.status = 'todo';\r\n    handleTaskUpdate(task.id, updates);\r\n  }, [handleTaskUpdate]);\r\n\r\n  // When you move a task, all dependent tasks are automatically rescheduled\r\n  // This is BETTER than DHTMLX - they require manual configuration\r\n  const handleTaskDateChange = useCallback((task: Task, newStart: Date, newEnd: Date) => {\r\n    // v1.4.18: Check if this is creating a new bar for a task without dates (ClickUp-style)\r\n    const isCreatingNewBar = !task.startDate && !task.endDate;\r\n\r\n    // v0.13.3: Calculate daysDelta to preserve relative gaps in cascade\r\n    const daysDelta = task.startDate\r\n      ? Math.round((newStart.getTime() - task.startDate.getTime()) / (1000 * 60 * 60 * 24))\r\n      : 0;\r\n\r\n    const updateTaskDates = (tasks: Task[]): Task[] => {\r\n      return tasks.map((t) => {\r\n        if (t.id === task.id) {\r\n          // v0.8.1: Preserve segments array when updating task dates\r\n          // This is critical for split tasks - we must keep the updated segments\r\n          return {\r\n            ...t,\r\n            startDate: newStart,\r\n            endDate: newEnd,\r\n            ...(task.segments && { segments: task.segments }) // Preserve segments if they exist\r\n          };\r\n        }\r\n        if (t.subtasks) {\r\n          return { ...t, subtasks: updateTaskDates(t.subtasks) };\r\n        }\r\n        return t;\r\n      });\r\n    };\r\n\r\n    // First, update the dragged task's dates\r\n    let updatedTasks = updateTaskDates(localTasks);\r\n\r\n    // Then, auto-schedule all dependent tasks (cascade effect)\r\n    // v0.13.3: Pass daysDelta to preserve relative gaps between tasks\r\n    const tasksBeforeCascade = updatedTasks;\r\n    updatedTasks = ganttUtils.autoScheduleDependents(updatedTasks, task.id, daysDelta);\r\n\r\n    // Roll-up: recalculate parent dates/progress from children\r\n    updatedTasks = rollUpParentDates(updatedTasks);\r\n\r\n    setLocalTasks(updatedTasks);\r\n\r\n    // v0.8.1: Pass full updated task object including segments\r\n    const updatedTask = { ...task, startDate: newStart, endDate: newEnd };\r\n\r\n    // v1.4.18: If creating a new bar (task had no dates), call config.onTaskDateChange\r\n    // This allows the parent app to persist the new dates to the database\r\n    if (isCreatingNewBar && config?.onTaskDateChange) {\r\n      config.onTaskDateChange(task, newStart, newEnd);\r\n    } else {\r\n      // Normal case: task already had dates, use onTaskUpdate for drag operations\r\n      onTaskUpdate?.(updatedTask);\r\n    }\r\n\r\n    // v2.2.0: Notify consumer about all dependent tasks that were rescheduled\r\n    if (onDependentTasksScheduled && daysDelta !== 0) {\r\n      const flatBefore = ganttUtils.flattenTasks(tasksBeforeCascade);\r\n      const flatAfter = ganttUtils.flattenTasks(updatedTasks);\r\n      const changed: Task[] = [];\r\n      for (const after of flatAfter) {\r\n        if (after.id === task.id) continue; // skip the dragged task itself\r\n        const before = flatBefore.find(b => b.id === after.id);\r\n        if (!before) continue;\r\n        const startChanged = after.startDate?.getTime() !== before.startDate?.getTime();\r\n        const endChanged = after.endDate?.getTime() !== before.endDate?.getTime();\r\n        if (startChanged || endChanged) {\r\n          changed.push(after);\r\n        }\r\n      }\r\n      if (changed.length > 0) {\r\n        onDependentTasksScheduled(changed);\r\n      }\r\n    }\r\n  }, [localTasks, onTaskUpdate, onDependentTasksScheduled, config]);\r\n\r\n  // 🚀 KILLER FEATURE #3: Handle context menu for Split task\r\n  // This is BETTER than DHTMLX - they don't have a built-in split task feature\r\n  const handleTaskContextMenu = useCallback((task: Task, event: React.MouseEvent) => {\r\n    // Call user's custom handler if provided\r\n    onTaskContextMenu?.(task, event);\r\n\r\n    // Show our built-in context menu with Split option\r\n    setContextMenu({\r\n      isOpen: true,\r\n      x: event.clientX,\r\n      y: event.clientY,\r\n      task,\r\n    });\r\n  }, [onTaskContextMenu]);\r\n\r\n  // Handle split task action\r\n  const handleSplitTask = useCallback((task: Task, splitDate: Date) => {\r\n    // Call ganttUtils.splitTask to split the task\r\n    const updatedTasks = ganttUtils.splitTask(localTasks, task.id, splitDate);\r\n    setLocalTasks(updatedTasks);\r\n\r\n    // Close context menu\r\n    setContextMenu({ isOpen: false, x: 0, y: 0, task: null });\r\n  }, [localTasks]);\r\n\r\n  // v0.10.0: Handle task double click - open edit modal\r\n  // v0.16.1: If onTaskEdit is provided, let the user handle editing (don't open built-in modal)\r\n  // v0.17.162: Fix bug where inline rename changes weren't reflected in edit modal\r\n  // We now look up the current task from localTasks to get the latest state\r\n  const handleTaskDblClickInternal = useCallback((task: Task) => {\r\n    // Look up the current version of the task from localTasks\r\n    // This ensures we get the latest data (e.g., after inline rename)\r\n    const currentTask = ganttUtils.findTaskById(localTasks, task.id) || task;\r\n\r\n    // Call user's custom handler if provided\r\n    onTaskDblClick?.(currentTask);\r\n\r\n    // Only open built-in edit modal if user hasn't provided a custom edit handler\r\n    // This prevents double modals when user handles editing themselves\r\n    if (!onTaskEdit) {\r\n      setEditingTask(currentTask);\r\n    }\r\n  }, [localTasks, onTaskDblClick, onTaskEdit]);\r\n\r\n  // Helper function to detect circular dependencies using DFS\r\n  const wouldCreateCircularDependency = useCallback((fromTaskId: string, toTaskId: string, tasks: Task[]): boolean => {\r\n    // Build dependency map\r\n    const dependencyMap = new Map<string, string[]>();\r\n\r\n    const buildMap = (taskList: Task[]) => {\r\n      taskList.forEach(task => {\r\n        if (task.dependencies) {\r\n          dependencyMap.set(task.id, task.dependencies);\r\n        }\r\n        if (task.subtasks) {\r\n          buildMap(task.subtasks);\r\n        }\r\n      });\r\n    };\r\n\r\n    buildMap(tasks);\r\n\r\n    // Simulate adding the new dependency\r\n    const existingDeps = dependencyMap.get(toTaskId) || [];\r\n    dependencyMap.set(toTaskId, [...existingDeps, fromTaskId]);\r\n\r\n    // DFS to detect cycle\r\n    const visited = new Set<string>();\r\n    const recStack = new Set<string>();\r\n\r\n    const hasCycle = (taskId: string): boolean => {\r\n      if (!visited.has(taskId)) {\r\n        visited.add(taskId);\r\n        recStack.add(taskId);\r\n\r\n        const deps = dependencyMap.get(taskId) || [];\r\n        for (const depId of deps) {\r\n          if (!visited.has(depId) && hasCycle(depId)) {\r\n            return true;\r\n          } else if (recStack.has(depId)) {\r\n            return true;\r\n          }\r\n        }\r\n      }\r\n      recStack.delete(taskId);\r\n      return false;\r\n    };\r\n\r\n    return hasCycle(toTaskId);\r\n  }, []);\r\n\r\n  // Handle dependency creation (memoized)\r\n  // Uses functional setter to avoid stale closure issues when creating multiple dependencies quickly\r\n  const handleDependencyCreate = useCallback((fromTask: Task, toTaskId: string) => {\r\n    // Use ref for circular check so we always have the latest state\r\n    if (wouldCreateCircularDependency(fromTask.id, toTaskId, localTasksRef.current)) {\r\n      console.warn('Cannot create dependency: would create a circular dependency');\r\n      alert('Cannot create this dependency: it would create a circular dependency chain.\\n\\nTask dependencies must flow in one direction only.');\r\n      return;\r\n    }\r\n\r\n    const updateTaskDependencies = (tasks: Task[]): Task[] => {\r\n      return tasks.map((t) => {\r\n        if (t.id === toTaskId) {\r\n          const dependencies = t.dependencies || [];\r\n          if (!dependencies.includes(fromTask.id)) {\r\n            return { ...t, dependencies: [...dependencies, fromTask.id] };\r\n          }\r\n        }\r\n        if (t.subtasks) {\r\n          return { ...t, subtasks: updateTaskDependencies(t.subtasks) };\r\n        }\r\n        return t;\r\n      });\r\n    };\r\n    // Functional setter ensures we always operate on the latest state\r\n    skipSyncCountRef.current += 1;\r\n    setLocalTasks((prev) => updateTaskDependencies(prev));\r\n    onDependencyCreate?.(fromTask.id, toTaskId);\r\n  }, [onDependencyCreate, wouldCreateCircularDependency]);\r\n\r\n  // Handle dependency deletion (memoized)\r\n  const handleDependencyDelete = useCallback((taskId: string, dependencyId: string) => {\r\n    const removeTaskDependency = (tasks: Task[]): Task[] => {\r\n      return tasks.map((t) => {\r\n        if (t.id === taskId && t.dependencies) {\r\n          const dependencies = t.dependencies.filter((depId) => depId !== dependencyId);\r\n          return { ...t, dependencies };\r\n        }\r\n        if (t.subtasks) {\r\n          return { ...t, subtasks: removeTaskDependency(t.subtasks) };\r\n        }\r\n        return t;\r\n      });\r\n    };\r\n    skipSyncCountRef.current += 1;\r\n    setLocalTasks((prev) => removeTaskDependency(prev));\r\n    onDependencyDelete?.(taskId, dependencyId);\r\n  }, [onDependencyDelete]);\r\n\r\n  // Calculate date range (memoized)\r\n  const { startDate, endDate } = useMemo(() => {\r\n    // Filter tasks that have dates\r\n    const tasksWithDates = localTasks.filter(t => t.startDate && t.endDate);\r\n\r\n    if (tasksWithDates.length === 0) {\r\n      // Default range if no tasks have dates\r\n      const today = new Date();\r\n      const start = new Date(today);\r\n      start.setDate(start.getDate() - 30);\r\n      const end = new Date(today);\r\n      end.setDate(end.getDate() + 60);\r\n      return { startDate: start, endDate: end };\r\n    }\r\n\r\n    const allDates = tasksWithDates.flatMap((t) => [t.startDate, t.endDate]).filter((d): d is Date => d !== undefined);\r\n    const minDate = new Date(Math.min(...allDates.map((d) => d.getTime())));\r\n    const maxDate = new Date(Math.max(...allDates.map((d) => d.getTime())));\r\n\r\n    const padding = timeScale === 'day' ? 7 : timeScale === 'week' ? 14 : 30;\r\n    minDate.setDate(minDate.getDate() - padding);\r\n    maxDate.setDate(maxDate.getDate() + padding);\r\n\r\n    return { startDate: minDate, endDate: maxDate };\r\n  }, [localTasks, timeScale]);\r\n\r\n  // v1.5.1: Notify consumer of computed date range\r\n  useEffect(() => {\r\n    onDateRangeChangeRef.current?.(startDate, endDate);\r\n  }, [startDate, endDate]);\r\n\r\n  // Handlers (future implementation - currently unused but kept for future features)\r\n  // TODO: Implement zoom controls in toolbar\r\n  // const handleZoomIn = () => setZoom((z) => Math.min(z + 0.2, 2));\r\n  // const handleZoomOut = () => setZoom((z) => Math.max(z - 0.2, 0.5));\r\n\r\n  // TODO: Implement \"Today\" button in toolbar\r\n  // const handleTodayClick = () => {\r\n  //   if (timelineScrollRef.current) {\r\n  //     const today = new Date();\r\n  //     const dayWidth = timeScale === 'day' ? 60 : timeScale === 'week' ? 20 : 8;\r\n  //     const daysFromStart = (today.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24);\r\n  //     const scrollX = daysFromStart * dayWidth * zoom - 300;\r\n  //     timelineScrollRef.current.scrollTo({ left: Math.max(0, scrollX), behavior: 'smooth' });\r\n  //   }\r\n  // };\r\n\r\n  // TODO: Implement add task functionality\r\n  // const handleAddTask = () => {\r\n  //   // Placeholder - implement in parent component if needed\r\n  // };\r\n\r\n  // v0.12.0: Export handlers for toolbar\r\n  // v0.17.224: Enhanced PNG export - captures full diagram without dropdown\r\n  const handleExportPNG = useCallback(async () => {\r\n    if (!ganttContainerRef.current || !gridScrollRef.current || !timelineScrollRef.current) return;\r\n\r\n    // Wait for dropdown to close (animation takes ~150ms)\r\n    await new Promise(resolve => setTimeout(resolve, 200));\r\n\r\n    const ganttContainer = ganttContainerRef.current;\r\n    // gridScrollRef points to the flex wrapper (overflow:clip); gridScrollInner is the actual scrollable panel\r\n    const gridWrapper = gridScrollRef.current;\r\n    const gridScroll = (gridScrollInnerRef.current ||\r\n      gridWrapper.querySelector('.gantt-grid-scroll')) as HTMLElement | null;\r\n    const timelineScroll = timelineScrollRef.current;\r\n\r\n    // Store original scroll positions and dimensions\r\n    const originalGridScrollTop = gridScroll?.scrollTop || 0;\r\n    const originalGridScrollLeft = gridScroll?.scrollLeft || 0;\r\n    const originalTimelineScrollTop = timelineScroll.scrollTop;\r\n    const originalTimelineScrollLeft = timelineScroll.scrollLeft;\r\n    const originalOverflow = ganttContainer.style.overflow;\r\n    const originalHeight = ganttContainer.style.height;\r\n    const originalGridOverflow = gridScroll?.style.overflow || '';\r\n    const originalTimelineOverflow = timelineScroll.style.overflow;\r\n    // Fix: also save/restore the wrapper's overflow:clip so content isn't clipped during capture\r\n    const originalWrapperOverflow = gridWrapper.style.overflow;\r\n\r\n    // Store original dimensions for restoration\r\n    const originalContainerWidth = ganttContainer.style.width;\r\n    const originalTimelineWidth = timelineScroll.style.width;\r\n\r\n    try {\r\n      // Calculate full content dimensions\r\n      const taskGridContent = gridScroll?.querySelector('.gantt-taskgrid-content') as HTMLElement | null;\r\n      const timelineSvg = timelineScroll.querySelector('svg') as SVGElement | null;\r\n\r\n      // v0.17.226: Get height from SVG attribute for accurate full height\r\n      const svgHeight = timelineSvg?.getAttribute('height')\r\n        ? parseInt(timelineSvg.getAttribute('height')!, 10)\r\n        : timelineSvg?.getBoundingClientRect().height || 0;\r\n\r\n      const gridContentHeight = taskGridContent?.scrollHeight || gridScroll?.scrollHeight || 600;\r\n      const timelineContentHeight = Math.max(svgHeight, timelineScroll.scrollHeight);\r\n\r\n      // v0.17.225: Get actual SVG width for full timeline capture\r\n      const timelineSvgWidth = timelineSvg?.getAttribute('width')\r\n        ? parseInt(timelineSvg.getAttribute('width')!, 10)\r\n        : timelineSvg?.getBoundingClientRect().width || timelineScroll.scrollWidth;\r\n\r\n      // Get toolbar height (to include it)\r\n      const toolbar = ganttContainer.querySelector('[style*=\"z-index: 100\"]') as HTMLElement | null;\r\n      const toolbarHeight = toolbar?.offsetHeight || 48;\r\n\r\n      // v0.17.226: Calculate total height with extra padding to ensure all content is captured\r\n      const contentHeight = Math.max(gridContentHeight, timelineContentHeight, svgHeight);\r\n      const totalHeight = toolbarHeight + contentHeight + 50; // +50 extra padding for safety\r\n\r\n      // v0.17.225: Calculate total width = grid width + timeline SVG full width + separator\r\n      const gridWidth = gridScroll?.offsetWidth || gridWrapper.offsetWidth || 300;\r\n      const totalWidth = gridWidth + timelineSvgWidth + 10; // +10 for separator and padding\r\n\r\n      // Reset scroll positions to capture from the beginning\r\n      if (gridScroll) {\r\n        gridScroll.scrollTop = 0;\r\n        gridScroll.scrollLeft = 0;\r\n      }\r\n      timelineScroll.scrollTop = 0;\r\n      timelineScroll.scrollLeft = 0;\r\n\r\n      // Temporarily expand containers to show all content\r\n      // Fix: remove overflow:clip from wrapper so html2canvas can see the full content\r\n      ganttContainer.style.overflow = 'visible';\r\n      ganttContainer.style.height = `${totalHeight}px`;\r\n      ganttContainer.style.width = `${totalWidth}px`;\r\n      gridWrapper.style.overflow = 'visible';\r\n      if (gridScroll) {\r\n        gridScroll.style.overflow = 'visible';\r\n        gridScroll.style.height = `${contentHeight + 50}px`;\r\n      }\r\n      timelineScroll.style.overflow = 'visible';\r\n      timelineScroll.style.height = `${contentHeight + 50}px`;\r\n      timelineScroll.style.width = `${timelineSvgWidth + 10}px`;\r\n\r\n      // Wait for DOM to update\r\n      await new Promise(resolve => setTimeout(resolve, 150));\r\n\r\n      // Capture with html-to-image (handles SVGs correctly unlike html2canvas)\r\n      const dataUrl = await toPng(ganttContainer, {\r\n        backgroundColor: theme.bgPrimary,\r\n        pixelRatio: 2,\r\n        width: totalWidth,\r\n        height: totalHeight,\r\n        skipFonts: false,\r\n        filter: (node) => {\r\n          if (!(node instanceof Element)) return true;\r\n          const style = window.getComputedStyle(node);\r\n          const zIndex = parseInt(style.zIndex, 10);\r\n          if (!isNaN(zIndex) && zIndex >= 50) return false;\r\n          if (style.position === 'fixed') return false;\r\n          return true;\r\n        },\r\n      });\r\n\r\n      // Create download link\r\n      const link = document.createElement('a');\r\n      link.download = `gantt-chart-${new Date().toISOString().slice(0, 10)}.png`;\r\n      link.href = dataUrl;\r\n      link.click();\r\n\r\n    } finally {\r\n      // Restore original state\r\n      ganttContainer.style.overflow = originalOverflow;\r\n      ganttContainer.style.height = originalHeight;\r\n      ganttContainer.style.width = originalContainerWidth;\r\n      gridWrapper.style.overflow = originalWrapperOverflow;\r\n      if (gridScroll) {\r\n        gridScroll.style.overflow = originalGridOverflow;\r\n        gridScroll.style.height = '';\r\n        gridScroll.scrollTop = originalGridScrollTop;\r\n        gridScroll.scrollLeft = originalGridScrollLeft;\r\n      }\r\n      timelineScroll.style.overflow = originalTimelineOverflow;\r\n      timelineScroll.style.height = '';\r\n      timelineScroll.style.width = originalTimelineWidth;\r\n      timelineScroll.scrollTop = originalTimelineScrollTop;\r\n      timelineScroll.scrollLeft = originalTimelineScrollLeft;\r\n    }\r\n    onExportSuccess?.('png');\r\n  }, [theme, onExportSuccess]);\r\n\r\n  const handleExportPDF = useCallback(async () => {\r\n    await ganttUtils.exportToPDF(localTasks);\r\n    onExportSuccess?.('pdf');\r\n  }, [localTasks, onExportSuccess]);\r\n\r\n  // Ref to always have latest rateMap/defaultRate (avoids stale closure in useCallback)\r\n  const exportRateRef = useRef({ rateMap: config.rateMap, defaultRate: config.defaultRate, projectName });\r\n  exportRateRef.current = { rateMap: config.rateMap, defaultRate: config.defaultRate, projectName };\r\n\r\n  const handleExportExcel = useCallback(async () => {\r\n    // Consumer-supplied override takes priority. Lets apps replace the\r\n    // built-in exporter with their own (custom template, branded format,\r\n    // server-side export, etc.) while keeping the same toolbar button.\r\n    if (config.onExportExcel) {\r\n      await config.onExportExcel();\r\n      onExportSuccess?.('excel');\r\n      return;\r\n    }\r\n    const now = new Date();\r\n    const pad = (n: number) => String(n).padStart(2, '0');\r\n    const ts = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}_${pad(now.getHours())}${pad(now.getMinutes())}`;\r\n    const name = projectName ? projectName.replace(/[^a-zA-Z0-9áéíóúñÁÉÍÓÚÑ _-]/g, '') : 'Project';\r\n    await ganttUtils.exportToExcel(localTasks, `${name}_${ts}.xlsx`, exportRateRef.current);\r\n    onExportSuccess?.('excel');\r\n  }, [localTasks, projectName, onExportSuccess, config.onExportExcel]);\r\n\r\n  const handleExportCSV = useCallback(() => {\r\n    const csv = ganttUtils.exportToCSV(localTasks);\r\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\r\n    const link = document.createElement('a');\r\n    link.href = URL.createObjectURL(blob);\r\n    link.download = 'gantt-chart.csv';\r\n    link.click();\r\n    URL.revokeObjectURL(link.href);\r\n    onExportSuccess?.('csv');\r\n  }, [localTasks, onExportSuccess]);\r\n\r\n  const handleExportJSON = useCallback(() => {\r\n    const json = ganttUtils.exportToJSON(localTasks);\r\n    const blob = new Blob([json], { type: 'application/json;charset=utf-8;' });\r\n    const link = document.createElement('a');\r\n    link.href = URL.createObjectURL(blob);\r\n    link.download = 'gantt-chart.json';\r\n    link.click();\r\n    URL.revokeObjectURL(link.href);\r\n    onExportSuccess?.('json');\r\n  }, [localTasks, onExportSuccess]);\r\n\r\n  const handleExportMSProject = useCallback(() => {\r\n    ganttUtils.exportToMSProject(localTasks, 'Gantt Project', 'project.xml');\r\n    onExportSuccess?.('msproject');\r\n  }, [localTasks, onExportSuccess]);\r\n\r\n  // Handle separator resize\r\n  const handleMouseDown = (e: React.MouseEvent) => {\r\n    e.preventDefault();\r\n    setIsResizing(true);\r\n  };\r\n\r\n  // v0.17.222: Both panels have real scroll, synchronized bidirectionally\r\n  // This fixes the bug where TaskGrid content was cut off when using translateY\r\n  const isSyncingScroll = useRef(false);\r\n\r\n  // v0.17.378: Pan/drag state for grabbing and dragging the timeline (ClickUp style)\r\n  const [isPanning, setIsPanning] = useState(false);\r\n  const panStartRef = useRef({ x: 0, y: 0, scrollLeft: 0, scrollTop: 0 });\r\n\r\n  useEffect(() => {\r\n    const timelineScroll = timelineScrollRef.current;\r\n    const gridScroll = gridScrollRef.current?.querySelector('.gantt-grid-scroll') as HTMLElement;\r\n\r\n    if (!timelineScroll || !gridScroll) return;\r\n\r\n    // v0.17.222: Bidirectional scroll sync - both panels scroll together\r\n    const handleTimelineScroll = () => {\r\n      if (isSyncingScroll.current) return;\r\n      isSyncingScroll.current = true;\r\n      const scrollY = timelineScroll.scrollTop;\r\n      setScrollTop(scrollY);\r\n      gridScroll.scrollTop = scrollY;\r\n      requestAnimationFrame(() => {\r\n        isSyncingScroll.current = false;\r\n      });\r\n    };\r\n\r\n    const handleGridScroll = () => {\r\n      if (isSyncingScroll.current) return;\r\n      isSyncingScroll.current = true;\r\n      const scrollY = gridScroll.scrollTop;\r\n      setScrollTop(scrollY);\r\n      timelineScroll.scrollTop = scrollY;\r\n      requestAnimationFrame(() => {\r\n        isSyncingScroll.current = false;\r\n      });\r\n    };\r\n\r\n    const handleMouseMove = (e: MouseEvent) => {\r\n      // Handle column resize\r\n      if (isResizing && gridScroll) {\r\n        // Calculate width relative to the container's left edge for accuracy\r\n        const containerRect = gridScroll.parentElement?.getBoundingClientRect();\r\n        const containerLeft = containerRect?.left || 0;\r\n        const newWidth = e.clientX - containerLeft;\r\n\r\n        // v0.17.218: Limit max width to 60% of viewport (ClickUp style)\r\n        const minWidth = 200;\r\n        const contentWidth = calculatedGridWidth + BUTTONS_WIDTH;\r\n        const viewportMax = window.innerWidth * MAX_VIEWPORT_PERCENT;\r\n        const maxWidth = Math.max(contentWidth, viewportMax);\r\n\r\n        if (newWidth >= minWidth && newWidth <= maxWidth) {\r\n          setGridWidthOverride(newWidth);\r\n        }\r\n      }\r\n\r\n      // v0.17.378: Handle pan/drag\r\n      if (isPanning && timelineScroll) {\r\n        const deltaX = e.clientX - panStartRef.current.x;\r\n        const deltaY = e.clientY - panStartRef.current.y;\r\n\r\n        timelineScroll.scrollLeft = panStartRef.current.scrollLeft - deltaX;\r\n        timelineScroll.scrollTop = panStartRef.current.scrollTop - deltaY;\r\n      }\r\n    };\r\n\r\n    const handleMouseUp = () => {\r\n      setIsResizing(false);\r\n      setIsPanning(false);\r\n    };\r\n\r\n    // v0.17.378: Pan/drag - mousedown on timeline background starts panning\r\n    const handleTimelineMouseDown = (e: MouseEvent) => {\r\n      // Only pan with left mouse button and when clicking on background (not on task bars)\r\n      if (e.button !== 0) return;\r\n\r\n      // Don't start panning if clicking on interactive elements\r\n      const target = e.target as HTMLElement;\r\n      const isInteractive = target.closest('[data-task-bar]') ||\r\n                           target.closest('[data-dependency-line]') ||\r\n                           target.closest('button') ||\r\n                           target.closest('[role=\"button\"]') ||\r\n                           target.tagName === 'rect' && target.getAttribute('data-clickable') === 'true';\r\n\r\n      if (isInteractive) return;\r\n\r\n      // Start panning\r\n      setIsPanning(true);\r\n      panStartRef.current = {\r\n        x: e.clientX,\r\n        y: e.clientY,\r\n        scrollLeft: timelineScroll.scrollLeft,\r\n        scrollTop: timelineScroll.scrollTop,\r\n      };\r\n\r\n      // Prevent text selection while dragging\r\n      e.preventDefault();\r\n    };\r\n\r\n    timelineScroll.addEventListener('scroll', handleTimelineScroll);\r\n    gridScroll.addEventListener('scroll', handleGridScroll);\r\n    timelineScroll.addEventListener('mousedown', handleTimelineMouseDown);\r\n    document.addEventListener('mousemove', handleMouseMove);\r\n    document.addEventListener('mouseup', handleMouseUp);\r\n\r\n    return () => {\r\n      timelineScroll.removeEventListener('scroll', handleTimelineScroll);\r\n      gridScroll.removeEventListener('scroll', handleGridScroll);\r\n      timelineScroll.removeEventListener('mousedown', handleTimelineMouseDown);\r\n      document.removeEventListener('mousemove', handleMouseMove);\r\n      document.removeEventListener('mouseup', handleMouseUp);\r\n    };\r\n  }, [isResizing, isPanning, calculatedGridWidth]);\r\n\r\n  // Keep the imperative scrollToToday() call site fed with fresh inputs.\r\n  scrollToTodayDepsRef.current = { startDate, timeScale, zoom };\r\n\r\n  // Notify the consumer whenever the TODAY marker enters or leaves the\r\n  // viewport. Powers floating \"go to today\" affordances in apps that\r\n  // render their own UI on top of the Gantt.\r\n  const onTodayVisibilityChange = config.onTodayVisibilityChange;\r\n  const todayVisibleRef = useRef<boolean | null>(null);\r\n  useEffect(() => {\r\n    if (!onTodayVisibilityChange) return;\r\n    const scrollEl = timelineScrollRef.current;\r\n    if (!scrollEl) return;\r\n    const dayWidth = timeScale === 'day' ? 60 : timeScale === 'week' ? 20 : 8;\r\n    const compute = () => {\r\n      const today = new Date();\r\n      const daysFromStart = (today.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24);\r\n      const todayX = daysFromStart * dayWidth * zoom;\r\n      const left = scrollEl.scrollLeft;\r\n      const right = left + scrollEl.clientWidth;\r\n      const visible = todayX >= left && todayX <= right;\r\n      if (todayVisibleRef.current !== visible) {\r\n        todayVisibleRef.current = visible;\r\n        onTodayVisibilityChange(visible);\r\n      }\r\n    };\r\n    compute();\r\n    scrollEl.addEventListener('scroll', compute, { passive: true });\r\n    window.addEventListener('resize', compute);\r\n    return () => {\r\n      scrollEl.removeEventListener('scroll', compute);\r\n      window.removeEventListener('resize', compute);\r\n    };\r\n  }, [onTodayVisibilityChange, startDate, timeScale, zoom]);\r\n\r\n  // v0.17.377: Scroll to today on initial mount (like ClickUp)\r\n  // Uses useLayoutEffect to scroll BEFORE the browser paints, avoiding visible jump\r\n  const hasScrolledToToday = useRef(false);\r\n  const initialStartDateRef = useRef<Date | null>(null);\r\n\r\n  // Capture the first valid startDate (when tasks are loaded)\r\n  useLayoutEffect(() => {\r\n    // Only scroll once, when we have tasks and a valid startDate\r\n    if (hasScrolledToToday.current) return;\r\n    if (localTasks.length === 0) return;\r\n    if (!timelineScrollRef.current) return;\r\n\r\n    // Mark as scrolled immediately to prevent re-runs\r\n    hasScrolledToToday.current = true;\r\n    initialStartDateRef.current = startDate;\r\n\r\n    const timelineScroll = timelineScrollRef.current;\r\n    const today = new Date();\r\n    const dayWidth = timeScale === 'day' ? 60 : timeScale === 'week' ? 20 : 8;\r\n    const daysFromStart = (today.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24);\r\n\r\n    // Calculate scroll position to center today in the viewport\r\n    const viewportWidth = timelineScroll.clientWidth;\r\n    const todayPosition = daysFromStart * dayWidth * zoom;\r\n    const scrollX = todayPosition - (viewportWidth / 2);\r\n\r\n    // Only scroll if today is within the timeline range\r\n    if (daysFromStart >= 0 && viewportWidth > 0) {\r\n      timelineScroll.scrollLeft = Math.max(0, scrollX);\r\n    }\r\n  }, [localTasks.length, startDate, timeScale, zoom]); // Re-run when tasks load\r\n\r\n  // 1.9.35 · fitToDates cambió la escala: desplazar cuando ya se pintó con la nueva.\r\n  useLayoutEffect(() => {\r\n    const d = pendingScrollRef.current;\r\n    if (!d || scrollToTodayDepsRef.current?.timeScale !== timeScale) return;\r\n    pendingScrollRef.current = null;\r\n    desplazarA(d);\r\n  }, [timeScale, startDate, zoom]);\r\n\r\n  return (\r\n    <GanttI18nContext.Provider value={translations}>\r\n    <GanttThemeContext.Provider value={ganttThemeContextValue}>\r\n    <div\r\n      ref={ganttContainerRef}\r\n      className=\"flex flex-col h-full w-full\"\r\n      style={{\r\n        backgroundColor: theme.bgPrimary,\r\n        fontFamily: 'Inter, sans-serif',\r\n        minHeight: 0, // Critical for flex children to shrink\r\n        // Chronos V2: Dot-grid background pattern\r\n        ...(theme.dotGrid && {\r\n          backgroundImage: `radial-gradient(circle, ${theme.dotGrid} 1px, transparent 1px)`,\r\n          backgroundSize: '24px 24px',\r\n        }),\r\n        // v0.9.1: Prevent browser auto-scroll when disableScrollSync is enabled\r\n        ...(config.disableScrollSync && {\r\n          scrollBehavior: 'auto',\r\n          overflowAnchor: 'none',\r\n        }),\r\n      }}\r\n    >\r\n      {/* Toolbar — z-index ensures dropdowns render above the overflow:clip grid below */}\r\n      {(() => { const barra = (\r\n      <GanttToolbar\r\n        enCabecera={!!toolbarContainer}\r\n        theme={theme}\r\n        timeScale={timeScale}\r\n        onTimeScaleChange={setTimeScale}\r\n        zoom={zoom}\r\n        onZoomChange={setZoom}\r\n        currentTheme={currentTheme}\r\n        onThemeChange={handleThemeChange}\r\n        rowDensity={rowDensity}\r\n        onRowDensityChange={setRowDensity}\r\n        showThemeSelector={showThemeSelector}\r\n        // v0.14.3: Create Task button\r\n        // v1.4.10: Hide if canCreateTask is false OR canCreateSubtaskOnly is true (user can only create subtasks, not root tasks)\r\n        showCreateTaskButton={showCreateTaskButton && permissions?.canCreateTask !== false && !permissions?.canCreateSubtaskOnly}\r\n        createTaskLabel={createTaskLabel}\r\n        onCreateTask={onCreateTask}\r\n        // v0.17.300: Task filter\r\n        taskFilter={taskFilter}\r\n        onTaskFilterChange={setTaskFilter}\r\n        // v0.18.0: Hide completed toggle\r\n        hideCompleted={hideCompleted}\r\n        onHideCompletedChange={setHideCompleted}\r\n        // Custom toolbar content\r\n        toolbarRightContent={toolbarRightContent}\r\n        // v3.0.0: WBS Level selector\r\n        wbsLevel={wbsLevel}\r\n        /* 1.9.35 · quien no navega por fases (hideWbsLevel) no ve el selector. */\r\n        onWbsLevelChange={hideWbsLevel ? undefined : handleWbsLevelChange}\r\n        maxWbsDepth={maxWbsDepth}\r\n        // v3.0.0: Execution/Oracle view mode\r\n        viewMode={viewMode}\r\n        /* 1.9.35 · el conmutador Execution/Pulse solo si la app lo pide: sin línea base, Pulse no hacía nada al pulsarlo. */\r\n        onViewModeChange={configOnViewModeChange ? handleViewModeChange : undefined}\r\n        // v3.1.0: Forecast HUD\r\n        projectForecast={projectForecast}\r\n        hideForecastHud={hideForecastHud}\r\n        // v0.12.0: Export handlers\r\n        onExportPNG={showExportButton ? handleExportPNG : undefined}\r\n        onExportPDF={showExportButton ? handleExportPDF : undefined}\r\n        onExportExcel={showExportButton ? handleExportExcel : undefined}\r\n        onExportCSV={showExportButton ? handleExportCSV : undefined}\r\n        onExportJSON={showExportButton ? handleExportJSON : undefined}\r\n        onExportMSProject={showExportButton ? handleExportMSProject : undefined}\r\n        // View Options (eye icon)\r\n        showCriticalPath={showCriticalPath}\r\n        onShowCriticalPathChange={handleShowCriticalPathChange}\r\n        showDependencies={showDependencies}\r\n        onShowDependenciesChange={handleShowDependenciesChange}\r\n        highlightWeekends={highlightWeekends}\r\n        onHighlightWeekendsChange={handleHighlightWeekendsChange}\r\n        showBaseline={showBaseline}\r\n        onShowBaselineChange={(show) => {\r\n          if (show && viewMode !== 'oracle') handleViewModeChange('oracle');\r\n          if (!show && viewMode === 'oracle') handleViewModeChange('execution');\r\n        }}\r\n        onCopySnapshotLink={onCopySnapshotLink}\r\n        hasDependencies={hasDependencies}\r\n      />\r\n      );\r\n      /* 1.9.34 · con `toolbarContainer`, la barra compacta se pinta en la cabecera de quien la pide. */\r\n      return toolbarContainer\r\n        ? createPortal(barra, toolbarContainer)\r\n        : <div style={{ position: 'relative', zIndex: 100 }}>{barra}</div>;\r\n      })()}\r\n\r\n      {/* Main Content - v0.13.9: TaskGrid has no scroll, Timeline has the unified vertical scroll */}\r\n      {/* v0.17.31: Changed to clip to allow tooltips to render above header */}\r\n      <div\r\n        ref={gridScrollRef}\r\n        className=\"flex-1 flex min-h-0\"\r\n        style={{\r\n          position: 'relative',\r\n          zIndex: 1, // Below toolbar (z-index: 100) so dropdowns render on top\r\n          overflow: 'clip',\r\n          overflowClipMargin: '100px', // Allow tooltip to overflow above\r\n        }}\r\n      >\r\n        {/* Task Grid - v0.17.194: Horizontal scroll when columns exceed width (ClickUp style) */}\r\n        {/* v0.17.222: Real scroll instead of transform - synced bidirectionally with Timeline */}\r\n        {/* v0.17.223: Hide scrollbar visually but keep scroll functional */}\r\n        <div\r\n          ref={gridScrollInnerRef}\r\n          className=\"gantt-grid-scroll flex-shrink-0\"\r\n          style={{\r\n            width: gridWidth,\r\n            overflowX: 'auto', // v0.17.194: Allow horizontal scroll for many columns\r\n            overflowY: 'scroll', // v0.17.222: Real scroll synced with Timeline\r\n            scrollbarWidth: 'none', // v0.17.223: Hide scrollbar (Firefox)\r\n            msOverflowStyle: 'none', // v0.17.223: Hide scrollbar (IE/Edge)\r\n          }}\r\n        >\r\n          <TaskGrid\r\n            addTaskRow={config.addTaskRow}\r\n            tasks={filteredTasks}\r\n            allTasks={tasksWithStableWbs} // v1.9.10: árbol completo para reordenar bien con filtros\r\n            theme={theme}\r\n            rowHeight={rowHeight}\r\n            availableUsers={availableUsers}\r\n            templates={mergedTemplates}\r\n            showCriticalPath={showCriticalPath}\r\n            onTaskClick={onTaskClick}\r\n            onTaskSelectionChange={onTaskSelectionChange}\r\n            selectedTaskId={selectedTaskId}\r\n            onTaskDblClick={handleTaskDblClickInternal} // v0.10.0: Use internal handler that opens modal\r\n            onTaskContextMenu={onTaskContextMenu} // v0.8.0\r\n            onTaskToggle={handleTaskToggle}\r\n            scrollTop={scrollTop}\r\n            columns={columns}\r\n            onToggleColumn={handleToggleColumn}\r\n            onColumnResize={handleColumnResize}\r\n            onTaskUpdate={handleTaskUpdate}\r\n            onBulkFill={handleBulkFill}\r\n            onTaskIndent={handleTaskIndent}\r\n            onTaskOutdent={handleTaskOutdent}\r\n            onTaskMove={handleTaskMove}\r\n            onMultiTaskDelete={handleMultiTaskDelete}\r\n            onTaskDuplicate={handleTaskDuplicate}\r\n            onTaskCreate={handleTaskCreate}\r\n            onTaskRename={handleTaskRename}\r\n            onCreateSubtask={handleCreateSubtask}\r\n            onOpenTaskModal={onTaskClick ? (task: Task) => onTaskClick(task) : undefined}\r\n            onDeleteRequest={(taskIds: string[], label: string) => setDeleteConfirmation({ taskIds, taskName: label })} // v1.9.6: bulk-aware\r\n            onTaskReparent={handleTaskReparent} // v0.17.68\r\n            scrollContainerRef={gridScrollInnerRef} // v0.18.15: Auto-scroll during drag\r\n          />\r\n        </div>\r\n\r\n        {/* v0.17.220: Resize handle - 1px width */}\r\n        <div\r\n          className=\"flex-shrink-0 cursor-col-resize hover:bg-[#00E5CC]/50 transition-colors h-full\"\r\n          style={{\r\n            width: 1,\r\n            backgroundColor: theme.border,\r\n            zIndex: 15,\r\n          }}\r\n          onMouseDown={handleMouseDown}\r\n        />\r\n\r\n        {/* Timeline - v0.13.9: Has both scrolls, TaskGrid syncs to this scroll */}\r\n        {/* v0.17.31: Added overflow-y:clip to allow tooltips to render above while maintaining scroll */}\r\n        {/* v0.17.378: Added grab cursor for pan/drag functionality (ClickUp style) */}\r\n        <div\r\n          ref={timelineScrollRef}\r\n          className=\"gantt-timeline-scroll flex-1\"\r\n          style={{\r\n            minHeight: 0,\r\n            overflowX: 'auto',\r\n            overflowY: 'auto',\r\n            cursor: isPanning ? 'grabbing' : 'grab',\r\n            // v0.9.1: Prevent browser auto-scroll when disableScrollSync is enabled\r\n            ...(config.disableScrollSync && {\r\n              scrollBehavior: 'auto',\r\n              overflowAnchor: 'none',\r\n            }),\r\n          }}\r\n        >\r\n          <Timeline\r\n            tasks={filteredTasks}\r\n            theme={theme}\r\n            rowHeight={rowHeight}\r\n            timeScale={timeScale}\r\n            startDate={startDate}\r\n            endDate={endDate}\r\n            zoom={zoom}\r\n            locale={locale} // v0.17.400: Pass locale for date formatting\r\n            templates={mergedTemplates}\r\n            dependencyLineStyle={config?.dependencyLineStyle} // v0.17.310\r\n            showTaskBarLabels={config?.showTaskBarLabels !== false} // default true\r\n            onTaskClick={onTaskClick}\r\n            onTaskDblClick={handleTaskDblClickInternal} // v0.10.0: Use internal handler that opens modal\r\n            onTaskContextMenu={handleTaskContextMenu} // v0.8.0: Now uses our handler for Split feature\r\n            onTaskDateChange={handleTaskDateChange}\r\n            onTaskProgressDrag={handleTaskProgressDrag}\r\n            onDependencyCreate={handleDependencyCreate}\r\n            onDependencyDelete={handleDependencyDelete}\r\n            showBaseline={showBaseline}\r\n            showCriticalPath={showCriticalPath}\r\n            showDependencies={showDependencies}\r\n            highlightWeekends={highlightWeekends}\r\n            weekHeaderFormat={config.weekHeaderFormat}\r\n            canEditTask={permissions?.canEditTask}\r\n            workingDaysConfig={config?.workingDaysConfig}\r\n          />\r\n        </div>\r\n      </div>\r\n\r\n      {/* v0.8.0: Context Menu for task operations (v0.16.0: Enhanced with Edit, Add Subtask, Status changes) */}\r\n      {/* v0.17.46: Parent tasks (with subtasks) have limited menu - no edit, no status changes */}\r\n      {contextMenu.task && (\r\n        <ContextMenu\r\n          isOpen={contextMenu.isOpen}\r\n          x={contextMenu.x}\r\n          y={contextMenu.y}\r\n          theme={theme}\r\n          onClose={() => setContextMenu({ isOpen: false, x: 0, y: 0, task: null })}\r\n          items={(() => {\r\n            const staleTask = contextMenu.task;\r\n            if (!staleTask) return [];\r\n\r\n            // v0.17.162: Look up current task from localTasks to get latest data (e.g., after inline rename)\r\n            const task = ganttUtils.findTaskById(localTasks, staleTask.id) || staleTask;\r\n            const isParentTask = task.subtasks && task.subtasks.length > 0;\r\n\r\n            // v1.4.10: Check if user can create tasks (affects Add Subtask option)\r\n            const canCreateTask = permissions?.canCreateTask !== false;\r\n            const canDeleteTask = permissions?.canDeleteTask !== false;\r\n\r\n            // v0.17.46: Parent tasks - limited menu (status/progress is auto-calculated from subtasks)\r\n            // v1.4.14: Added duplicate option for parent tasks\r\n            if (isParentTask) {\r\n              const items = [];\r\n              const canDuplicateTask = permissions?.canDuplicateTask !== false;\r\n\r\n              // Add Subtask - main action for parent tasks (only if canCreateTask)\r\n              if (canCreateTask) {\r\n                items.push({\r\n                  id: 'addSubtask',\r\n                  label: translations.contextMenu?.addSubtask || 'Add Subtask',\r\n                  icon: MenuIcons.Add,\r\n                  onClick: () => {\r\n                    if (onTaskAddSubtask) {\r\n                      onTaskAddSubtask(task);\r\n                    } else {\r\n                      handleCreateSubtask(task.id);\r\n                    }\r\n                  },\r\n                });\r\n              }\r\n\r\n              // v1.4.14: Duplicate Task with subtasks (only if canDuplicateTask)\r\n              if (canDuplicateTask) {\r\n                items.push({\r\n                  id: 'duplicate',\r\n                  label: translations.contextMenu?.duplicateTask || 'Duplicate Task',\r\n                  icon: MenuIcons.Duplicate,\r\n                  onClick: () => {\r\n                    // v1.4.14: If callback exists, delegate to consumer (SaaS handles DB persistence)\r\n                    // Consumer will reload tasks after creating, so don't update local state\r\n                    if (config.onTaskDuplicate) {\r\n                      config.onTaskDuplicate(task);\r\n                    } else {\r\n                      // No callback - duplicate in memory only (standalone mode)\r\n                      setLocalTasks((prev) => duplicateTasks(prev, [task.id]).tasks);\r\n                    }\r\n                    setContextMenu({ isOpen: false, x: 0, y: 0, task: null });\r\n                  },\r\n                });\r\n              }\r\n\r\n              // Delete Task (only if canDeleteTask)\r\n              if (canDeleteTask) {\r\n                // Separator before delete (only if there are items before)\r\n                if (items.length > 0) {\r\n                  items.push({\r\n                    id: 'separator-delete',\r\n                    label: '',\r\n                    separator: true,\r\n                    onClick: () => {},\r\n                  });\r\n                }\r\n                items.push({\r\n                  id: 'delete',\r\n                  label: translations.contextMenu?.deleteTask || 'Delete Task',\r\n                  icon: MenuIcons.Delete,\r\n                  onClick: () => {\r\n                    setDeleteConfirmation({\r\n                      taskIds: [task.id],\r\n                      taskName: task.name,\r\n                    });\r\n                  },\r\n                });\r\n              }\r\n\r\n              return items;\r\n            }\r\n\r\n            // Regular tasks (no subtasks) - full menu\r\n            // v1.4.10: Additional permission checks\r\n            const canUpdateTask = permissions?.canUpdateTask !== false;\r\n            const canDuplicateTask = permissions?.canDuplicateTask !== false;\r\n\r\n            const items = [];\r\n\r\n            // v0.16.0: Edit Task - opens edit modal or calls custom handler\r\n            if (canUpdateTask) {\r\n              items.push({\r\n                id: 'edit',\r\n                label: translations.contextMenu?.editTask || 'Edit Task',\r\n                icon: MenuIcons.Pencil,\r\n                onClick: () => {\r\n                  if (onTaskEdit) {\r\n                    onTaskEdit(task);\r\n                  } else {\r\n                    setEditingTask(task);\r\n                  }\r\n                },\r\n              });\r\n            }\r\n\r\n            // v0.16.0: Add Subtask (only if canCreateTask)\r\n            if (canCreateTask) {\r\n              items.push({\r\n                id: 'addSubtask',\r\n                label: translations.contextMenu?.addSubtask || 'Add Subtask',\r\n                icon: MenuIcons.Add,\r\n                onClick: () => {\r\n                  if (onTaskAddSubtask) {\r\n                    onTaskAddSubtask(task);\r\n                  } else {\r\n                    handleCreateSubtask(task.id);\r\n                  }\r\n                },\r\n              });\r\n            }\r\n\r\n            // Separator before status changes (only if there are items before and we can update)\r\n            if (items.length > 0 && canUpdateTask) {\r\n              items.push({\r\n                id: 'separator-status',\r\n                label: '',\r\n                separator: true,\r\n                onClick: () => {},\r\n              });\r\n            }\r\n\r\n            // Status change options (only if canUpdateTask)\r\n            if (canUpdateTask) {\r\n              // v0.16.0: Mark Incomplete (status: 'todo', progress: 0)\r\n              items.push({\r\n                id: 'markIncomplete',\r\n                label: translations.contextMenu?.markIncomplete || 'Mark Incomplete',\r\n                icon: MenuIcons.MarkIncomplete,\r\n                onClick: () => {\r\n                  if (onTaskMarkIncomplete) {\r\n                    onTaskMarkIncomplete(task);\r\n                  } else {\r\n                    handleTaskUpdate(task.id, { status: 'todo', progress: 0 });\r\n                  }\r\n                },\r\n                disabled: task.status === 'todo',\r\n              });\r\n\r\n              // v0.16.0: Set In Progress (status: 'in-progress')\r\n              items.push({\r\n                id: 'setInProgress',\r\n                label: translations.contextMenu?.setInProgress || 'Set In Progress',\r\n                icon: MenuIcons.SetInProgress,\r\n                onClick: () => {\r\n                  if (onTaskSetInProgress) {\r\n                    onTaskSetInProgress(task);\r\n                  } else {\r\n                    handleTaskUpdate(task.id, { status: 'in-progress' });\r\n                  }\r\n                },\r\n                disabled: task.status === 'in-progress',\r\n              });\r\n\r\n              // v0.16.0: Mark Complete (status: 'completed', progress: 100)\r\n              items.push({\r\n                id: 'markComplete',\r\n                label: translations.contextMenu?.markComplete || 'Mark Complete',\r\n                icon: MenuIcons.MarkComplete,\r\n                onClick: () => {\r\n                  handleTaskUpdate(task.id, { status: 'completed', progress: 100 });\r\n                },\r\n                disabled: task.status === 'completed',\r\n              });\r\n            }\r\n\r\n            // Advanced options section\r\n            const hasAdvancedOptions = canDuplicateTask || (canUpdateTask && task.startDate && task.endDate);\r\n            if (hasAdvancedOptions && items.length > 0) {\r\n              items.push({\r\n                id: 'separator-advanced',\r\n                label: '',\r\n                separator: true,\r\n                onClick: () => {},\r\n              });\r\n            }\r\n\r\n            // v1.4.3: Duplicate Task (only if canDuplicateTask)\r\n            if (canDuplicateTask) {\r\n              items.push({\r\n                id: 'duplicate',\r\n                label: translations.contextMenu?.duplicateTask || 'Duplicate Task',\r\n                icon: MenuIcons.Duplicate,\r\n                onClick: () => {\r\n                  // v1.4.14: If callback exists, delegate to consumer (SaaS handles DB persistence)\r\n                  // Consumer will reload tasks after creating, so don't update local state\r\n                  if (config.onTaskDuplicate) {\r\n                    config.onTaskDuplicate(task);\r\n                  } else {\r\n                    // No callback - duplicate in memory only (standalone mode)\r\n                    setLocalTasks((prev) => duplicateTasks(prev, [task.id]).tasks);\r\n                  }\r\n                  setContextMenu({ isOpen: false, x: 0, y: 0, task: null });\r\n                },\r\n              });\r\n            }\r\n\r\n            // Split Task (existing feature from v0.8.0) - requires canUpdateTask\r\n            if (canUpdateTask && task.startDate && task.endDate) {\r\n              items.push({\r\n                id: 'split',\r\n                label: translations.contextMenu?.splitTask || 'Split Task',\r\n                icon: MenuIcons.Split,\r\n                onClick: () => {\r\n                  // Calculate midpoint date for split\r\n                  const startTime = task.startDate!.getTime();\r\n                  const endTime = task.endDate!.getTime();\r\n                  const midTime = startTime + (endTime - startTime) / 2;\r\n                  const splitDate = new Date(midTime);\r\n\r\n                  // Call split handler\r\n                  handleSplitTask(task, splitDate);\r\n                },\r\n              });\r\n            }\r\n\r\n            // Delete section\r\n            if (canDeleteTask) {\r\n              // Separator before delete (only if there are items before)\r\n              if (items.length > 0) {\r\n                items.push({\r\n                  id: 'separator-delete',\r\n                  label: '',\r\n                  separator: true,\r\n                  onClick: () => {},\r\n                });\r\n              }\r\n\r\n              // Delete Task - v0.17.33: Now shows confirmation modal\r\n              items.push({\r\n                id: 'delete',\r\n                label: translations.contextMenu?.deleteTask || 'Delete Task',\r\n                icon: MenuIcons.Delete,\r\n                onClick: () => {\r\n                  setDeleteConfirmation({\r\n                    taskIds: [task.id],\r\n                    taskName: task.name,\r\n                  });\r\n                },\r\n              });\r\n            }\r\n\r\n            return items;\r\n          })()}\r\n        />\r\n      )}\r\n\r\n      {/* v0.17.244: Unified Task Detail Modal (replaces TaskFormModal) */}\r\n      <TaskDetailModal\r\n        task={editingTask}\r\n        isOpen={!!editingTask}\r\n        onClose={() => setEditingTask(null)}\r\n        onTaskUpdate={(updatedTask) => {\r\n          if (editingTask) {\r\n            handleTaskUpdate(editingTask.id, updatedTask);\r\n            setEditingTask(null);\r\n          }\r\n        }}\r\n        theme={currentTheme === 'light' ? 'light' : 'dark'}\r\n        locale={locale === 'es' ? 'es' : 'en'}\r\n        availableUsers={availableUsers}\r\n        availableTasks={tasks}\r\n      />\r\n\r\n      {/* v0.17.33: Delete Confirmation Modal */}\r\n      <AnimatePresence>\r\n        {deleteConfirmation && (\r\n          <motion.div\r\n            initial={{ opacity: 0 }}\r\n            animate={{ opacity: 1 }}\r\n            exit={{ opacity: 0 }}\r\n            className=\"fixed inset-0 z-[10000] flex items-center justify-center p-4\"\r\n            style={{ backgroundColor: 'rgba(0, 0, 0, 0.6)' }}\r\n            onClick={() => setDeleteConfirmation(null)}\r\n          >\r\n            <motion.div\r\n              initial={{ opacity: 0, scale: 0.9 }}\r\n              animate={{ opacity: 1, scale: 1 }}\r\n              exit={{ opacity: 0, scale: 0.9 }}\r\n              transition={{ duration: 0.2, ease: 'easeOut' }}\r\n              onClick={(e) => e.stopPropagation()}\r\n              className=\"w-full max-w-md rounded-xl shadow-2xl overflow-hidden\"\r\n              style={{\r\n                backgroundColor: theme.bgSecondary,\r\n                border: `1px solid ${theme.border}`,\r\n              }}\r\n            >\r\n              {/* Header */}\r\n              <div\r\n                className=\"px-6 py-4\"\r\n                style={{ borderBottom: `1px solid ${theme.border}` }}\r\n              >\r\n                <div className=\"flex items-start gap-3\">\r\n                  <div\r\n                    className=\"w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0\"\r\n                    style={{ backgroundColor: 'rgba(239, 68, 68, 0.2)' }}\r\n                  >\r\n                    <AlertTriangle className=\"w-5 h-5\" style={{ color: '#EF4444' }} />\r\n                  </div>\r\n                  <div className=\"flex-1\">\r\n                    <h3\r\n                      className=\"text-lg font-semibold\"\r\n                      style={{ color: theme.textPrimary, fontFamily: 'Inter, sans-serif' }}\r\n                    >\r\n                      {translations.contextMenu?.deleteTask || 'Delete Task'}?\r\n                    </h3>\r\n                    <p\r\n                      className=\"text-sm mt-1\"\r\n                      style={{ color: theme.textSecondary, fontFamily: 'Inter, sans-serif' }}\r\n                    >\r\n                      {locale === 'es' ? 'Esta acción no se puede deshacer' : 'This action cannot be undone'}\r\n                    </p>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n\r\n              {/* Body */}\r\n              <div className=\"px-6 py-4\">\r\n                <p\r\n                  className=\"text-sm leading-relaxed\"\r\n                  style={{ color: theme.textSecondary, fontFamily: 'Inter, sans-serif' }}\r\n                >\r\n                  {/* v1.9.6: en borrado masivo solo se muestra el conteo (los\r\n                      nombres largos volvían el texto ilegible) */}\r\n                  {deleteConfirmation.taskIds.length > 1 ? (\r\n                    <>\r\n                      {locale === 'es' ? 'Estás a punto de eliminar' : 'You are about to delete'}{' '}\r\n                      <span className=\"font-semibold\" style={{ color: theme.textPrimary }}>\r\n                        {deleteConfirmation.taskIds.length} {locale === 'es' ? 'tareas' : 'tasks'}\r\n                      </span>\r\n                      .\r\n                    </>\r\n                  ) : (\r\n                    <>\r\n                      {locale === 'es' ? 'Estás a punto de eliminar la tarea' : 'You are about to delete the task'}{' '}\r\n                      <span className=\"font-semibold\" style={{ color: theme.textPrimary }}>\r\n                        \"{deleteConfirmation.taskName}\"\r\n                      </span>\r\n                      .\r\n                    </>\r\n                  )}\r\n                </p>\r\n              </div>\r\n\r\n              {/* Footer */}\r\n              <div\r\n                className=\"px-6 py-4 flex items-center justify-end gap-3\"\r\n                style={{\r\n                  backgroundColor: theme.bgPrimary,\r\n                  borderTop: `1px solid ${theme.border}`,\r\n                }}\r\n              >\r\n                <button\r\n                  onClick={() => setDeleteConfirmation(null)}\r\n                  className=\"px-4 py-2 text-sm font-medium rounded-lg transition-colors\"\r\n                  style={{\r\n                    color: theme.textSecondary,\r\n                    fontFamily: 'Inter, sans-serif',\r\n                  }}\r\n                  onMouseEnter={(e) => {\r\n                    e.currentTarget.style.backgroundColor = theme.hoverBg;\r\n                  }}\r\n                  onMouseLeave={(e) => {\r\n                    e.currentTarget.style.backgroundColor = 'transparent';\r\n                  }}\r\n                >\r\n                  {locale === 'es' ? 'Cancelar' : 'Cancel'}\r\n                </button>\r\n                <button\r\n                  onClick={() => {\r\n                    handleMultiTaskDelete(deleteConfirmation.taskIds);\r\n                    setDeleteConfirmation(null);\r\n                  }}\r\n                  className=\"px-4 py-2 text-sm font-medium text-white rounded-lg transition-colors flex items-center gap-2\"\r\n                  style={{\r\n                    backgroundColor: '#EF4444',\r\n                    fontFamily: 'Inter, sans-serif',\r\n                  }}\r\n                  onMouseEnter={(e) => {\r\n                    e.currentTarget.style.backgroundColor = '#DC2626';\r\n                  }}\r\n                  onMouseLeave={(e) => {\r\n                    e.currentTarget.style.backgroundColor = '#EF4444';\r\n                  }}\r\n                >\r\n                  <Trash2 className=\"w-4 h-4\" />\r\n                  {locale === 'es' ? 'Eliminar' : 'Delete'}\r\n                </button>\r\n              </div>\r\n            </motion.div>\r\n          </motion.div>\r\n        )}\r\n      </AnimatePresence>\r\n\r\n      {/* v0.14.0: AI Assistant for natural language task editing */}\r\n      {aiAssistant?.enabled && (\r\n        <GanttAIAssistant\r\n          tasks={localTasks}\r\n          theme={theme}\r\n          config={aiAssistant}\r\n          onTasksUpdate={setLocalTasks}\r\n          onTaskUpdate={handleTaskUpdate}\r\n          onTaskCreate={(task) => {\r\n            setLocalTasks((prev) => [...prev, task]);\r\n          }}\r\n          onTaskDelete={(taskId) => {\r\n            // v0.17.19: Use handleMultiTaskDelete to respect lifecycle hooks\r\n            handleMultiTaskDelete([taskId]);\r\n          }}\r\n          onDependencyCreate={(fromTaskId, toTaskId) => {\r\n            const fromTask = ganttUtils.findTaskById(localTasks, fromTaskId);\r\n            if (fromTask) {\r\n              handleDependencyCreate(fromTask, toTaskId);\r\n            }\r\n          }}\r\n          onDependencyDelete={handleDependencyDelete}\r\n        />\r\n      )}\r\n    </div>\r\n    </GanttThemeContext.Provider>\r\n    </GanttI18nContext.Provider>\r\n  );\r\n})","/**\r\n * Task Form Modal - Complete CRUD for Gantt Tasks\r\n * v0.17.98: Complete ClickUp-style redesign\r\n * - Cleaner, more minimal design\r\n * - Color picker in popover instead of inline grid\r\n * - Pill-button style for Status/Priority/Assignees\r\n * - Larger, more prominent task name input\r\n * - Horizontal field row like ClickUp\r\n */\r\n\r\nimport { useState, useEffect, useRef } from 'react'\r\nimport { motion, AnimatePresence } from 'framer-motion'\r\nimport {\r\n  X,\r\n  Calendar,\r\n  Users,\r\n  Link2,\r\n  AlertCircle,\r\n  Milestone as MilestoneIcon,\r\n  Flag,\r\n  ChevronDown,\r\n  ChevronLeft,\r\n  ChevronRight,\r\n  Check,\r\n  CircleDot,\r\n  Plus,\r\n} from 'lucide-react'\r\nimport { Task, Theme, TaskTag } from './types'\r\nimport { themes } from './themes'\r\nimport { TASK_COLORS } from './ColorPicker'\r\nimport { Portal } from '../Portal'\r\nimport { TagPicker } from './TagPicker'\r\nimport { AttachmentUploader } from '../Attachments'\r\nimport type { Attachment } from '../../types'\r\n\r\n// v1.2.0: Time formatting utilities\r\nfunction formatMinutesToDisplay(minutes: number): string {\r\n  if (minutes < 60) {\r\n    return `${minutes}m`;\r\n  }\r\n  const hours = Math.floor(minutes / 60);\r\n  const remainingMinutes = minutes % 60;\r\n  if (remainingMinutes === 0) {\r\n    return `${hours}h`;\r\n  }\r\n  return `${hours}h ${remainingMinutes}m`;\r\n}\r\n\r\nfunction parseTimeInput(input: string): number | null {\r\n  if (!input || input.trim() === '') return null;\r\n\r\n  const normalized = input.trim().toLowerCase();\r\n\r\n  // Pattern: \"2h 30m\" or \"2h30m\"\r\n  const hoursMinutesMatch = normalized.match(/(\\d+)h\\s*(\\d+)m/);\r\n  if (hoursMinutesMatch && hoursMinutesMatch[1] && hoursMinutesMatch[2]) {\r\n    const hours = parseInt(hoursMinutesMatch[1], 10);\r\n    const minutes = parseInt(hoursMinutesMatch[2], 10);\r\n    return hours * 60 + minutes;\r\n  }\r\n\r\n  // Pattern: \"2h\"\r\n  const hoursMatch = normalized.match(/(\\d+)h/);\r\n  if (hoursMatch && hoursMatch[1]) {\r\n    return parseInt(hoursMatch[1], 10) * 60;\r\n  }\r\n\r\n  // Pattern: \"30m\"\r\n  const minutesMatch = normalized.match(/(\\d+)m/);\r\n  if (minutesMatch && minutesMatch[1]) {\r\n    return parseInt(minutesMatch[1], 10);\r\n  }\r\n\r\n  // Pattern: \"1d\" (1 day = 8 hours = 480 minutes)\r\n  const daysMatch = normalized.match(/(\\d+)d/);\r\n  if (daysMatch && daysMatch[1]) {\r\n    return parseInt(daysMatch[1], 10) * 480;\r\n  }\r\n\r\n  // Pattern: just a number (assume HOURS, not minutes)\r\n  // e.g., \"100\" = 100 hours = 6000 minutes\r\n  const numberMatch = normalized.match(/^(\\d+)$/);\r\n  if (numberMatch && numberMatch[1]) {\r\n    return parseInt(numberMatch[1], 10) * 60;\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\n// v0.17.28: Priority type for Kanban sync\r\nexport type TaskPriority = 'low' | 'medium' | 'high' | 'urgent'\r\n\r\n// v0.17.54: Custom status type for dynamic Kanban columns\r\nexport interface CustomStatus {\r\n  id: string\r\n  title: string\r\n  color?: string\r\n}\r\n\r\n// v0.17.54: Default statuses that are always available\r\nexport const DEFAULT_STATUSES: CustomStatus[] = [\r\n  { id: 'todo', title: 'Por Hacer', color: '#6B7280' },\r\n  { id: 'in-progress', title: 'En Progreso', color: '#F59E0B' },\r\n  { id: 'completed', title: 'Completada', color: '#10B981' },\r\n]\r\n\r\nexport interface TaskFormData {\r\n  name: string\r\n  description?: string\r\n  startDate?: Date\r\n  endDate?: Date\r\n  progress: number\r\n  status: string\r\n  priority?: TaskPriority\r\n  isMilestone: boolean\r\n  color?: string\r\n  assignees?: Array<{ name: string; avatar?: string; initials: string; color: string }>\r\n  dependencies?: string[]\r\n  tags?: TaskTag[] // v0.17.158: Tags/Labels support\r\n  pendingFiles?: File[] // v0.17.166: Files to upload after task creation\r\n  effortMinutes?: number | null // v1.2.0: Estimated effort in minutes\r\n  parentId?: string | null // v2.3.0: Parent task (phase) for hierarchy\r\n  location?: string // v2.3.0: Location field\r\n  equipment?: string // v2.3.0: Asset/Equipment field\r\n}\r\n\r\nexport interface TaskFormModalProps {\r\n  isOpen: boolean\r\n  onClose: () => void\r\n  task?: Task\r\n  availableTasks?: Task[]\r\n  availableUsers?: Array<{ id: string; name: string; avatar?: string }>\r\n  onSubmit: (data: TaskFormData) => void | Promise<void>\r\n  isLoading?: boolean\r\n  mode?: 'create' | 'edit'\r\n  theme?: Theme\r\n  customStatuses?: CustomStatus[]\r\n  // v0.17.158: Tags support\r\n  availableTags?: TaskTag[]\r\n  onCreateTag?: (name: string, color: string) => Promise<TaskTag | null>\r\n  // v0.17.165: Attachments support\r\n  attachments?: Attachment[]\r\n  onUploadAttachments?: (taskId: string, files: File[]) => Promise<void> | void\r\n  onDeleteAttachment?: (attachmentId: string) => void\r\n  /** v2.2.0: Pre-select status when creating from a specific column */\r\n  defaultStatus?: string\r\n}\r\n\r\n// Priority configuration\r\nconst PRIORITIES = [\r\n  { id: 'low', label: 'Baja', color: '#10B981', icon: '🟢' },\r\n  { id: 'medium', label: 'Media', color: '#F59E0B', icon: '🟡' },\r\n  { id: 'high', label: 'Alta', color: '#F97316', icon: '🟠' },\r\n  { id: 'urgent', label: 'Urgente', color: '#EF4444', icon: '🔴' },\r\n]\r\n\r\nexport function TaskFormModal({\r\n  isOpen,\r\n  onClose,\r\n  task,\r\n  availableTasks = [],\r\n  availableUsers = [],\r\n  onSubmit,\r\n  isLoading = false,\r\n  mode = task ? 'edit' : 'create',\r\n  theme = 'dark',\r\n  customStatuses = [],\r\n  availableTags = [],\r\n  onCreateTag,\r\n  attachments = [],\r\n  onUploadAttachments,\r\n  onDeleteAttachment,\r\n  defaultStatus,\r\n}: TaskFormModalProps) {\r\n  const allStatuses: CustomStatus[] = [\r\n    ...DEFAULT_STATUSES,\r\n    ...customStatuses.filter(cs => !DEFAULT_STATUSES.some(ds => ds.id === cs.id)),\r\n  ]\r\n\r\n  const themeColors = (themes[theme] || themes.dark)!\r\n\r\n  // Dropdown states\r\n  const [showStatusDropdown, setShowStatusDropdown] = useState(false)\r\n  const [showPriorityDropdown, setShowPriorityDropdown] = useState(false)\r\n  const [showAssigneesDropdown, setShowAssigneesDropdown] = useState(false)\r\n  const [showColorPicker, setShowColorPicker] = useState(false)\r\n  const [colorPickerPosition, setColorPickerPosition] = useState({ top: 0, left: 0 }) // v0.17.155\r\n  const [showDatePicker, setShowDatePicker] = useState<'start' | 'end' | null>(null)\r\n  const [datePickerMonth, setDatePickerMonth] = useState(new Date())\r\n  const [datePickerPosition, setDatePickerPosition] = useState({ top: 0, left: 0 })\r\n  const [showAdvanced, setShowAdvanced] = useState(false)\r\n  // v0.17.166: Pending files for create mode (files selected before task is created)\r\n  const [pendingFiles, setPendingFiles] = useState<File[]>([])\r\n  // v0.18.0: Dependencies dropdown state (same UI as TaskDetailModal)\r\n  const [showDependenciesDropdown, setShowDependenciesDropdown] = useState(false)\r\n  const [dependencySearch, setDependencySearch] = useState('')\r\n\r\n  // Refs for click outside\r\n  const statusRef = useRef<HTMLDivElement>(null)\r\n  const priorityRef = useRef<HTMLDivElement>(null)\r\n  const assigneesRef = useRef<HTMLDivElement>(null)\r\n  const colorRef = useRef<HTMLDivElement>(null)\r\n  const dateRowRef = useRef<HTMLDivElement>(null)\r\n\r\n  const [formData, setFormData] = useState<TaskFormData>({\r\n    name: '',\r\n    description: '',\r\n    progress: 0,\r\n    status: 'todo',\r\n    priority: 'medium',\r\n    isMilestone: false,\r\n    color: '#00E5CC',\r\n    assignees: [],\r\n    dependencies: [],\r\n    tags: [], // v0.17.158\r\n    parentId: null,\r\n    location: '',\r\n    equipment: '',\r\n  })\r\n\r\n  const [errors, setErrors] = useState<Record<string, string>>({})\r\n\r\n  // Initialize form with task data\r\n  useEffect(() => {\r\n    if (task) {\r\n      setFormData({\r\n        name: task.name,\r\n        description: (task as any).description || '',\r\n        startDate: task.startDate,\r\n        endDate: task.endDate,\r\n        progress: task.progress,\r\n        status: task.status || 'todo',\r\n        priority: (task as any).priority || 'medium',\r\n        isMilestone: task.isMilestone || false,\r\n        color: task.color || '#00E5CC',\r\n        assignees: task.assignees || [],\r\n        dependencies: task.dependencies || [],\r\n        tags: task.tags || [], // v0.17.158\r\n        parentId: task.parentId || null,\r\n        location: (task as any).location || '',\r\n        equipment: (task as any).equipment || '',\r\n      })\r\n      if ((task.dependencies && task.dependencies.length > 0) || task.isMilestone) {\r\n        setShowAdvanced(true)\r\n      }\r\n    } else {\r\n      setFormData({\r\n        name: '',\r\n        description: '',\r\n        progress: 0,\r\n        status: defaultStatus || 'todo',\r\n        priority: 'medium',\r\n        isMilestone: false,\r\n        color: '#00E5CC',\r\n        assignees: [],\r\n        dependencies: [],\r\n        pendingFiles: [], // v0.17.166\r\n        tags: [], // v0.17.158\r\n        parentId: null,\r\n        location: '',\r\n        equipment: '',\r\n      })\r\n      setShowAdvanced(false)\r\n      setPendingFiles([]) // v0.17.166: Clear pending files on reset\r\n    }\r\n  }, [task, isOpen, defaultStatus])\r\n\r\n  // Close dropdowns on click outside\r\n  useEffect(() => {\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      if (statusRef.current && !statusRef.current.contains(e.target as Node)) setShowStatusDropdown(false)\r\n      if (priorityRef.current && !priorityRef.current.contains(e.target as Node)) setShowPriorityDropdown(false)\r\n      if (assigneesRef.current && !assigneesRef.current.contains(e.target as Node)) setShowAssigneesDropdown(false)\r\n      if (colorRef.current && !colorRef.current.contains(e.target as Node)) setShowColorPicker(false)\r\n    }\r\n    document.addEventListener('mousedown', handleClickOutside)\r\n    return () => document.removeEventListener('mousedown', handleClickOutside)\r\n  }, [])\r\n\r\n  const validate = (): boolean => {\r\n    const newErrors: Record<string, string> = {}\r\n    if (!formData.name.trim()) newErrors.name = 'El nombre es requerido'\r\n    if (formData.startDate && formData.endDate && formData.startDate > formData.endDate) {\r\n      newErrors.endDate = 'La fecha de fin debe ser posterior a la de inicio'\r\n    }\r\n    setErrors(newErrors)\r\n    return Object.keys(newErrors).length === 0\r\n  }\r\n\r\n  const handleSubmit = async (e: React.FormEvent) => {\r\n    e.preventDefault()\r\n    if (!validate()) return\r\n    try {\r\n      // v0.17.166: Include pending files in form data for create mode\r\n      const submitData = mode === 'create' && pendingFiles.length > 0\r\n        ? { ...formData, pendingFiles }\r\n        : formData\r\n      await onSubmit(submitData)\r\n      setPendingFiles([]) // Clear pending files after submit\r\n      onClose()\r\n    } catch (error) {\r\n      console.error('Error submitting task:', error)\r\n    }\r\n  }\r\n\r\n  const handleChange = (field: keyof TaskFormData, value: any) => {\r\n    setFormData((prev) => {\r\n      const updated = { ...prev, [field]: value }\r\n      // v0.17.110: Sync progress when status changes\r\n      if (field === 'status') {\r\n        const statusValue = value as string\r\n        if (statusValue === 'todo') updated.progress = 0\r\n        else if (statusValue === 'in-progress') {\r\n          // If coming from completed/todo, set to 50%, otherwise keep current\r\n          if (prev.progress === 0 || prev.progress === 100) updated.progress = 50\r\n        }\r\n        else if (statusValue === 'completed' || statusValue === 'closed') updated.progress = 100\r\n        else if (statusValue === 'in-review' || statusValue === 'review') updated.progress = 75\r\n      }\r\n      // Sync status when progress changes\r\n      if (field === 'progress') {\r\n        const progressValue = typeof value === 'number' ? value : parseInt(value, 10)\r\n        if (progressValue === 100 && prev.status !== 'completed') updated.status = 'completed'\r\n        else if (progressValue > 0 && progressValue < 100 && prev.status === 'todo') updated.status = 'in-progress'\r\n        else if (progressValue === 0 && prev.status !== 'todo') updated.status = 'todo'\r\n      }\r\n      return updated\r\n    })\r\n    if (errors[field]) {\r\n      setErrors((prev) => { const e = { ...prev }; delete e[field]; return e })\r\n    }\r\n  }\r\n\r\n  // Get current status/priority info\r\n  const currentStatus = allStatuses.find(s => s.id === formData.status) ?? DEFAULT_STATUSES[0]!\r\n  const currentPriority = PRIORITIES.find(p => p.id === formData.priority) ?? PRIORITIES[1]!\r\n  const currentColor = TASK_COLORS.find(c => c.value === formData.color) ?? TASK_COLORS[0]!\r\n\r\n  // Pill button base style — glass surface for dark, solid for light\r\n  const isDarkTheme = theme === 'dark'\r\n  const pillStyle = {\r\n    backgroundColor: isDarkTheme ? '#1d1f27' : themeColors.bgSecondary,\r\n    border: `1px solid ${isDarkTheme ? 'rgba(65,71,84,0.1)' : themeColors.borderLight}`,\r\n    color: themeColors.textPrimary,\r\n  }\r\n\r\n\r\n  return (\r\n    <AnimatePresence>\r\n      {isOpen && (\r\n        <>\r\n          {/* Backdrop */}\r\n          <motion.div\r\n            initial={{ opacity: 0 }}\r\n            animate={{ opacity: 1 }}\r\n            exit={{ opacity: 0 }}\r\n            className=\"fixed inset-0 z-[9999]\"\r\n            style={{\r\n              backgroundColor: isDarkTheme ? 'rgba(0, 0, 0, 0.85)' : 'rgba(0, 0, 0, 0.4)',\r\n              backdropFilter: 'blur(16px)',\r\n              WebkitBackdropFilter: 'blur(16px)',\r\n            }}\r\n            onClick={onClose}\r\n          />\r\n\r\n          {/* Modal */}\r\n          <motion.div\r\n            initial={{ opacity: 0, scale: 0.95, y: 20 }}\r\n            animate={{ opacity: 1, scale: 1, y: 0 }}\r\n            exit={{ opacity: 0, scale: 0.95, y: 20 }}\r\n            transition={{ duration: 0.15, ease: [0.4, 0, 0.2, 1] }}\r\n            className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4 pointer-events-none\"\r\n          >\r\n            <div\r\n              className=\"w-full max-w-[640px] rounded-xl pointer-events-auto flex flex-col\"\r\n              data-theme={theme}\r\n              style={{\r\n                backgroundColor: isDarkTheme ? '#0a0a0a' : themeColors.bgPrimary,\r\n                border: `1px solid ${isDarkTheme ? 'rgba(65,71,84,0.1)' : themeColors.border}`,\r\n                boxShadow: isDarkTheme ? '0 8px 48px rgba(0, 0, 0, 0.8)' : '0 8px 32px rgba(0, 0, 0, 0.12)',\r\n                maxHeight: '90vh',\r\n              }}\r\n              onClick={(e) => e.stopPropagation()}\r\n            >\r\n              {/* Form Content */}\r\n              <form onSubmit={handleSubmit} className=\"flex flex-col overflow-hidden flex-1\" style={{ fontFamily: \"'Inter', system-ui, sans-serif\" }}>\r\n                {/* 1. Header Section — fixed, not scrollable */}\r\n                <header className=\"px-8 pt-8 pb-4 space-y-4 flex-shrink-0\">\r\n                  <input\r\n                    type=\"text\"\r\n                    value={formData.name}\r\n                    onChange={(e) => handleChange('name', e.target.value)}\r\n                    className=\"w-full bg-transparent border-none p-0 focus:outline-none focus:ring-0\"\r\n                    style={{\r\n                      color: themeColors.textPrimary,\r\n                      fontSize: 30,\r\n                      fontWeight: 700,\r\n                      fontFamily: \"'Inter', system-ui, sans-serif\",\r\n                    }}\r\n                    placeholder=\"Nombre de la tarea\"\r\n                    disabled={isLoading}\r\n                    autoFocus\r\n                  />\r\n                  {errors.name && (\r\n                    <p className=\"text-xs text-red-400 flex items-center gap-1\">\r\n                      <AlertCircle className=\"w-3 h-3\" />\r\n                      {errors.name}\r\n                    </p>\r\n                  )}\r\n                  <textarea\r\n                    value={formData.description || ''}\r\n                    onChange={(e) => handleChange('description', e.target.value)}\r\n                    className=\"w-full bg-transparent border-none p-0 focus:outline-none focus:ring-0 resize-none task-form-description\"\r\n                    style={{\r\n                      color: themeColors.textPrimary,\r\n                      fontSize: 16,\r\n                      fontFamily: \"'Inter', system-ui, sans-serif\",\r\n                      ['--placeholder-color' as any]: themeColors.textTertiary,\r\n                    }}\r\n                    placeholder=\"Agregar descripción...\"\r\n                    rows={2}\r\n                    disabled={isLoading}\r\n                  />\r\n                </header>\r\n\r\n                {/* Scrollable content */}\r\n                <div className=\"flex-1 overflow-y-auto px-8 py-4 space-y-6\">\r\n\r\n                  {/* v0.17.98: Pill Button Row - ClickUp Style */}\r\n                  <div className=\"flex flex-wrap items-center gap-2\">\r\n                    {/* Status Pill */}\r\n                    <div ref={statusRef} className=\"relative\">\r\n                      <button\r\n                        type=\"button\"\r\n                        onClick={() => !isLoading && setShowStatusDropdown(!showStatusDropdown)}\r\n                        className=\"flex items-center gap-2 px-3 py-1.5 rounded-full text-sm transition-all hover:opacity-80\"\r\n                        style={{\r\n                          ...pillStyle,\r\n                          borderColor: currentStatus.color,\r\n                          backgroundColor: `${currentStatus.color}15`,\r\n                        }}\r\n                        disabled={isLoading}\r\n                      >\r\n                        <CircleDot className=\"w-3.5 h-3.5\" style={{ color: currentStatus.color }} />\r\n                        <span style={{ color: currentStatus.color }}>{currentStatus.title}</span>\r\n                        <ChevronDown className=\"w-3 h-3\" style={{ color: currentStatus.color }} />\r\n                      </button>\r\n\r\n                      <AnimatePresence>\r\n                        {showStatusDropdown && (\r\n                          <motion.div\r\n                            initial={{ opacity: 0, y: -5 }}\r\n                            animate={{ opacity: 1, y: 0 }}\r\n                            exit={{ opacity: 0, y: -5 }}\r\n                            className=\"absolute left-0 top-full mt-1 z-50 min-w-[140px] rounded-lg overflow-hidden\"\r\n                            style={{\r\n                              backgroundColor: isDarkTheme ? '#0a0a0a' : themeColors.bgPrimary,\r\n                              backdropFilter: isDarkTheme ? 'blur(16px)' : undefined,\r\n                              border: `1px solid ${isDarkTheme ? '#262626' : themeColors.border}`,\r\n                              boxShadow: isDarkTheme ? '0 8px 24px rgba(0, 0, 0, 0.5)' : '0 8px 24px rgba(0, 0, 0, 0.12)',\r\n                            }}\r\n                          >\r\n                            {allStatuses.map((status) => (\r\n                              <button\r\n                                key={status.id}\r\n                                type=\"button\"\r\n                                className=\"w-full flex items-center gap-2 px-3 py-2 text-sm transition-colors\"\r\n                                style={{ color: themeColors.textPrimary }}\r\n                                onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = themeColors.hoverBg)}\r\n                                onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\r\n                                onClick={() => { handleChange('status', status.id); setShowStatusDropdown(false) }}\r\n                              >\r\n                                <CircleDot className=\"w-3.5 h-3.5\" style={{ color: status.color }} />\r\n                                {status.title}\r\n                                {formData.status === status.id && <Check className=\"w-3.5 h-3.5 ml-auto\" style={{ color: themeColors.accent }} />}\r\n                              </button>\r\n                            ))}\r\n                          </motion.div>\r\n                        )}\r\n                      </AnimatePresence>\r\n                    </div>\r\n\r\n                    {/* Priority Pill */}\r\n                    <div ref={priorityRef} className=\"relative\">\r\n                      <button\r\n                        type=\"button\"\r\n                        onClick={() => !isLoading && setShowPriorityDropdown(!showPriorityDropdown)}\r\n                        className=\"flex items-center gap-2 px-3 py-1.5 rounded-full text-sm transition-all hover:opacity-80\"\r\n                        style={pillStyle}\r\n                        disabled={isLoading}\r\n                      >\r\n                        <Flag className=\"w-3.5 h-3.5\" style={{ color: currentPriority.color }} />\r\n                        <span>{currentPriority.label}</span>\r\n                        <ChevronDown className=\"w-3 h-3\" style={{ color: themeColors.textTertiary }} />\r\n                      </button>\r\n\r\n                      <AnimatePresence>\r\n                        {showPriorityDropdown && (\r\n                          <motion.div\r\n                            initial={{ opacity: 0, y: -5 }}\r\n                            animate={{ opacity: 1, y: 0 }}\r\n                            exit={{ opacity: 0, y: -5 }}\r\n                            className=\"absolute left-0 top-full mt-1 z-50 min-w-[130px] rounded-lg overflow-hidden\"\r\n                            style={{\r\n                              backgroundColor: isDarkTheme ? '#0a0a0a' : themeColors.bgPrimary,\r\n                              backdropFilter: isDarkTheme ? 'blur(16px)' : undefined,\r\n                              border: `1px solid ${isDarkTheme ? '#262626' : themeColors.border}`,\r\n                              boxShadow: isDarkTheme ? '0 8px 24px rgba(0, 0, 0, 0.5)' : '0 8px 24px rgba(0, 0, 0, 0.12)',\r\n                            }}\r\n                          >\r\n                            {PRIORITIES.map((priority) => (\r\n                              <button\r\n                                key={priority.id}\r\n                                type=\"button\"\r\n                                className=\"w-full flex items-center gap-2 px-3 py-2 text-sm transition-colors\"\r\n                                style={{ color: themeColors.textPrimary }}\r\n                                onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = themeColors.hoverBg)}\r\n                                onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\r\n                                onClick={() => { handleChange('priority', priority.id as TaskPriority); setShowPriorityDropdown(false) }}\r\n                              >\r\n                                <span>{priority.icon}</span>\r\n                                {priority.label}\r\n                                {formData.priority === priority.id && <Check className=\"w-3.5 h-3.5 ml-auto\" style={{ color: themeColors.accent }} />}\r\n                              </button>\r\n                            ))}\r\n                          </motion.div>\r\n                        )}\r\n                      </AnimatePresence>\r\n                    </div>\r\n\r\n                    {/* Assignees Pill */}\r\n                    {availableUsers.length > 0 && (\r\n                      <div ref={assigneesRef} className=\"relative\">\r\n                        <button\r\n                          type=\"button\"\r\n                          onClick={() => !isLoading && setShowAssigneesDropdown(!showAssigneesDropdown)}\r\n                          className=\"flex items-center gap-2 px-3 py-1.5 rounded-full text-sm transition-all hover:opacity-80\"\r\n                          style={pillStyle}\r\n                          disabled={isLoading}\r\n                        >\r\n                          {formData.assignees && formData.assignees.length > 0 ? (\r\n                            <>\r\n                              <div className=\"flex -space-x-1\">\r\n                                {formData.assignees.slice(0, 3).map((a, i) => (\r\n                                  <div\r\n                                    key={i}\r\n                                    className=\"w-5 h-5 rounded-full flex items-center justify-center text-[10px] text-white font-medium border-2\"\r\n                                    style={{ backgroundColor: a.color || themeColors.accent, borderColor: themeColors.bgSecondary }}\r\n                                  >\r\n                                    {a.initials}\r\n                                  </div>\r\n                                ))}\r\n                              </div>\r\n                              {formData.assignees.length > 3 && (\r\n                                <span style={{ color: themeColors.textTertiary }}>+{formData.assignees.length - 3}</span>\r\n                              )}\r\n                            </>\r\n                          ) : (\r\n                            <>\r\n                              <Users className=\"w-3.5 h-3.5\" style={{ color: themeColors.textTertiary }} />\r\n                              <span style={{ color: themeColors.textTertiary }}>Asignar</span>\r\n                            </>\r\n                          )}\r\n                          <ChevronDown className=\"w-3 h-3\" style={{ color: themeColors.textTertiary }} />\r\n                        </button>\r\n\r\n                        <AnimatePresence>\r\n                          {showAssigneesDropdown && (\r\n                            <motion.div\r\n                              initial={{ opacity: 0, y: -5 }}\r\n                              animate={{ opacity: 1, y: 0 }}\r\n                              exit={{ opacity: 0, y: -5 }}\r\n                              className=\"absolute left-0 top-full mt-1 z-50 min-w-[180px] max-h-[200px] overflow-y-auto rounded-lg\"\r\n                              style={{\r\n                                backgroundColor: isDarkTheme ? '#0a0a0a' : themeColors.bgPrimary,\r\n                                backdropFilter: isDarkTheme ? 'blur(16px)' : undefined,\r\n                                border: `1px solid ${isDarkTheme ? '#262626' : themeColors.border}`,\r\n                                boxShadow: isDarkTheme ? '0 8px 24px rgba(0, 0, 0, 0.5)' : '0 8px 24px rgba(0, 0, 0, 0.12)',\r\n                              }}\r\n                            >\r\n                              {availableUsers.map((user) => {\r\n                                const isSelected = formData.assignees?.some(a => a.name === user.name)\r\n                                return (\r\n                                  <button\r\n                                    key={user.id}\r\n                                    type=\"button\"\r\n                                    className=\"w-full flex items-center gap-2 px-3 py-2 text-sm transition-colors\"\r\n                                    style={{ color: themeColors.textPrimary }}\r\n                                    onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = themeColors.hoverBg)}\r\n                                    onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\r\n                                    onClick={() => {\r\n                                      const newAssignees = isSelected\r\n                                        ? (formData.assignees || []).filter(a => a.name !== user.name)\r\n                                        : [...(formData.assignees || []), {\r\n                                            name: user.name,\r\n                                            avatar: user.avatar,\r\n                                            initials: user.name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2),\r\n                                            color: themeColors.accent,\r\n                                          }]\r\n                                      handleChange('assignees', newAssignees)\r\n                                    }}\r\n                                  >\r\n                                    <div\r\n                                      className=\"w-6 h-6 rounded-full flex items-center justify-center text-xs text-white font-medium flex-shrink-0\"\r\n                                      style={{ backgroundColor: themeColors.accent }}\r\n                                    >\r\n                                      {user.name.charAt(0).toUpperCase()}\r\n                                    </div>\r\n                                    <span className=\"truncate flex-1 text-left\">{user.name}</span>\r\n                                    {/* Fixed width checkmark area for consistent alignment */}\r\n                                    <div className=\"w-4 flex-shrink-0 flex justify-end\">\r\n                                      {isSelected && <Check className=\"w-3.5 h-3.5\" style={{ color: themeColors.accent }} />}\r\n                                    </div>\r\n                                  </button>\r\n                                )\r\n                              })}\r\n                            </motion.div>\r\n                          )}\r\n                        </AnimatePresence>\r\n                      </div>\r\n                    )}\r\n\r\n                    {/* Color Pill */}\r\n                    <div ref={colorRef} className=\"relative\">\r\n                      <button\r\n                        type=\"button\"\r\n                        onClick={() => {\r\n                          if (!isLoading) {\r\n                            if (showColorPicker) {\r\n                              setShowColorPicker(false)\r\n                            } else {\r\n                              // v0.17.155: Calculate position for Portal\r\n                              if (colorRef.current) {\r\n                                const rect = colorRef.current.getBoundingClientRect()\r\n                                const viewportHeight = window.innerHeight\r\n                                const pickerHeight = 120 // Approximate height of color picker\r\n                                const spaceBelow = viewportHeight - rect.bottom\r\n                                const top = spaceBelow < pickerHeight ? rect.top - pickerHeight - 8 : rect.bottom + 8\r\n                                setColorPickerPosition({ top, left: rect.left })\r\n                              }\r\n                              setShowColorPicker(true)\r\n                            }\r\n                          }\r\n                        }}\r\n                        className=\"flex items-center gap-2 px-3 py-1.5 rounded-full text-sm transition-all hover:opacity-80\"\r\n                        style={pillStyle}\r\n                        disabled={isLoading}\r\n                      >\r\n                        <div className=\"w-3.5 h-3.5 rounded-full\" style={{ backgroundColor: formData.color }} />\r\n                        <span>{currentColor.name}</span>\r\n                        <ChevronDown className=\"w-3 h-3\" style={{ color: themeColors.textTertiary }} />\r\n                      </button>\r\n\r\n                      {/* v0.17.155: Color Picker using Portal to escape overflow:hidden */}\r\n                      <AnimatePresence>\r\n                        {showColorPicker && (\r\n                          <Portal>\r\n                            <div className=\"fixed inset-0\" style={{ zIndex: 99998 }} onClick={() => setShowColorPicker(false)} />\r\n                            <motion.div\r\n                              initial={{ opacity: 0, y: -5 }}\r\n                              animate={{ opacity: 1, y: 0 }}\r\n                              exit={{ opacity: 0, y: -5 }}\r\n                              transition={{ duration: 0.12 }}\r\n                              className=\"rounded-lg\"\r\n                              style={{\r\n                                position: 'fixed',\r\n                                top: `${colorPickerPosition.top}px`,\r\n                                left: `${colorPickerPosition.left}px`,\r\n                                zIndex: 99999,\r\n                                backgroundColor: isDarkTheme ? '#0a0a0a' : themeColors.bgPrimary,\r\n                                backdropFilter: isDarkTheme ? 'blur(16px)' : undefined,\r\n                                border: `1px solid ${isDarkTheme ? '#262626' : themeColors.border}`,\r\n                                boxShadow: isDarkTheme ? '0 8px 24px rgba(0, 0, 0, 0.5)' : '0 4px 20px rgba(0, 0, 0, 0.25)',\r\n                              }}\r\n                              onClick={(e) => e.stopPropagation()}\r\n                            >\r\n                              {/* v0.17.186: Fixed click area with pointerEvents none on inner circle */}\r\n                              <div style={{ padding: '6px 8px' }}>\r\n                                <div style={{ display: 'grid', gridTemplateColumns: 'repeat(6, 28px)', gap: '2px' }}>\r\n                                  {TASK_COLORS.slice(0, 18).map((color) => {\r\n                                    const isSelected = formData.color === color.value;\r\n                                    return (\r\n                                      <button\r\n                                        key={color.value}\r\n                                        type=\"button\"\r\n                                        onClick={(e) => {\r\n                                          e.preventDefault();\r\n                                          e.stopPropagation();\r\n                                          handleChange('color', color.value);\r\n                                          setShowColorPicker(false);\r\n                                        }}\r\n                                        style={{\r\n                                          width: '28px',\r\n                                          height: '28px',\r\n                                          borderRadius: '6px',\r\n                                          backgroundColor: 'transparent',\r\n                                          cursor: 'pointer',\r\n                                          border: 'none',\r\n                                          display: 'flex',\r\n                                          alignItems: 'center',\r\n                                          justifyContent: 'center',\r\n                                          padding: 0,\r\n                                        }}\r\n                                        title={color.name}\r\n                                      >\r\n                                        <span\r\n                                          style={{\r\n                                            width: '16px',\r\n                                            height: '16px',\r\n                                            borderRadius: '50%',\r\n                                            backgroundColor: color.value,\r\n                                            outline: isSelected ? `2px solid ${color.value}` : 'none',\r\n                                            outlineOffset: '2px',\r\n                                            pointerEvents: 'none',\r\n                                            display: 'block',\r\n                                          }}\r\n                                        />\r\n                                      </button>\r\n                                    );\r\n                                  })}\r\n                                </div>\r\n                              </div>\r\n                            </motion.div>\r\n                          </Portal>\r\n                        )}\r\n                      </AnimatePresence>\r\n                    </div>\r\n\r\n                    {/* v0.17.158: Tags Picker */}\r\n                    {availableTags.length > 0 || onCreateTag ? (\r\n                      <TagPicker\r\n                        selectedTags={formData.tags || []}\r\n                        availableTags={availableTags}\r\n                        onChange={(tags) => handleChange('tags', tags)}\r\n                        onCreateTag={onCreateTag}\r\n                        theme={themeColors}\r\n                        disabled={isLoading}\r\n                      />\r\n                    ) : null}\r\n                  </div>\r\n\r\n                  {/* 3. Row 2: Date & Progress — 2-col grid */}\r\n                  <section className=\"grid grid-cols-1 md:grid-cols-2 gap-8 items-end\">\r\n                  <div className=\"space-y-3\">\r\n                    <label style={{ fontSize: 10, fontWeight: 700, letterSpacing: '0.1em', textTransform: 'uppercase', color: themeColors.textTertiary, display: 'block' }}>\r\n                      Rango de Fechas\r\n                    </label>\r\n                  <div className=\"flex items-center gap-3\" style={{ backgroundColor: isDarkTheme ? '#191b22' : themeColors.bgSecondary, borderRadius: 8, border: `1px solid ${isDarkTheme ? 'rgba(65,71,84,0.05)' : themeColors.borderLight}`, padding: '10px 16px' }}>\r\n                    <Calendar className=\"w-5 h-5\" style={{ color: '#00E5CC' }} />\r\n                    <div ref={dateRowRef} className=\"flex items-center gap-2 flex-1 relative\">\r\n                      <button\r\n                        type=\"button\"\r\n                        onClick={() => {\r\n                          if (!isLoading && !formData.isMilestone) {\r\n                            if (showDatePicker === 'start') {\r\n                              setShowDatePicker(null)\r\n                            } else {\r\n                              // Calculate position for Portal\r\n                              if (dateRowRef.current) {\r\n                                const rect = dateRowRef.current.getBoundingClientRect()\r\n                                setDatePickerPosition({ top: rect.bottom + 8, left: Math.max(16, rect.left - 40) })\r\n                              }\r\n                              setShowDatePicker('start')\r\n                              setDatePickerMonth(formData.startDate || new Date())\r\n                            }\r\n                          }\r\n                        }}\r\n                        className=\"px-3 py-1.5 rounded-lg text-sm transition-colors\"\r\n                        style={{\r\n                          ...pillStyle,\r\n                          opacity: formData.isMilestone ? 0.5 : 1,\r\n                          cursor: formData.isMilestone ? 'not-allowed' : 'pointer',\r\n                        }}\r\n                        disabled={isLoading || formData.isMilestone}\r\n                      >\r\n                        {formData.startDate ? formData.startDate.toLocaleDateString('es-ES', { day: 'numeric', month: 'short' }) : 'Inicio'}\r\n                      </button>\r\n                      <span style={{ color: themeColors.textTertiary }}>→</span>\r\n                      <button\r\n                        type=\"button\"\r\n                        onClick={() => {\r\n                          if (!isLoading && !formData.isMilestone) {\r\n                            if (showDatePicker === 'end') {\r\n                              setShowDatePicker(null)\r\n                            } else {\r\n                              // Calculate position for Portal\r\n                              if (dateRowRef.current) {\r\n                                const rect = dateRowRef.current.getBoundingClientRect()\r\n                                setDatePickerPosition({ top: rect.bottom + 8, left: Math.max(16, rect.left - 40) })\r\n                              }\r\n                              setShowDatePicker('end')\r\n                              setDatePickerMonth(formData.endDate || formData.startDate || new Date())\r\n                            }\r\n                          }\r\n                        }}\r\n                        className=\"px-3 py-1.5 rounded-lg text-sm transition-colors\"\r\n                        style={{\r\n                          ...pillStyle,\r\n                          opacity: formData.isMilestone ? 0.5 : 1,\r\n                          cursor: formData.isMilestone ? 'not-allowed' : 'pointer',\r\n                        }}\r\n                        disabled={isLoading || formData.isMilestone}\r\n                      >\r\n                        {formData.endDate ? formData.endDate.toLocaleDateString('es-ES', { day: 'numeric', month: 'short' }) : 'Fin'}\r\n                      </button>\r\n\r\n                      {/* Date Picker Popover - Using Portal to escape overflow:hidden */}\r\n                      <AnimatePresence>\r\n                        {showDatePicker && (\r\n                          <Portal>\r\n                            <div className=\"fixed inset-0\" style={{ zIndex: 99998 }} onClick={() => setShowDatePicker(null)} />\r\n                            <motion.div\r\n                              initial={{ opacity: 0, y: -10 }}\r\n                              animate={{ opacity: 1, y: 0 }}\r\n                              exit={{ opacity: 0, y: -10 }}\r\n                              className=\"rounded-xl shadow-2xl overflow-hidden flex\"\r\n                              style={{\r\n                                position: 'fixed',\r\n                                top: `${datePickerPosition.top}px`,\r\n                                left: `${datePickerPosition.left}px`,\r\n                                zIndex: 99999,\r\n                                backgroundColor: isDarkTheme ? '#0a0a0a' : themeColors.bgPrimary,\r\n                                border: `1px solid ${isDarkTheme ? '#262626' : themeColors.border}`,\r\n                                boxShadow: isDarkTheme ? '0 8px 32px rgba(0, 0, 0, 0.6)' : '0 8px 24px rgba(0, 0, 0, 0.12)',\r\n                              }}\r\n                              onClick={(e) => e.stopPropagation()}\r\n                            >\r\n                              {/* Quick Options */}\r\n                              <div className=\"w-40 py-2\" style={{ borderRight: `1px solid ${isDarkTheme ? '#262626' : themeColors.border}` }}>\r\n                                {(() => {\r\n                                  const today = new Date()\r\n                                  const tomorrow = new Date(today); tomorrow.setDate(today.getDate() + 1)\r\n                                  const nextWeek = new Date(today); nextWeek.setDate(today.getDate() + 7)\r\n                                  const twoWeeks = new Date(today); twoWeeks.setDate(today.getDate() + 14)\r\n\r\n                                  const options = [\r\n                                    { label: 'Hoy', date: today },\r\n                                    { label: 'Mañana', date: tomorrow },\r\n                                    { label: 'Próxima semana', date: nextWeek },\r\n                                    { label: '2 semanas', date: twoWeeks },\r\n                                  ]\r\n\r\n                                  return options.map((opt, i) => (\r\n                                    <button\r\n                                      key={i}\r\n                                      type=\"button\"\r\n                                      className=\"w-full px-3 py-2 text-sm text-left transition-colors\"\r\n                                      style={{ color: themeColors.textPrimary }}\r\n                                      onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = themeColors.hoverBg)}\r\n                                      onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\r\n                                      onClick={() => {\r\n                                        if (showDatePicker === 'start') {\r\n                                          handleChange('startDate', opt.date)\r\n                                          if (!formData.endDate || opt.date > formData.endDate) handleChange('endDate', opt.date)\r\n                                          setShowDatePicker('end')\r\n                                        } else {\r\n                                          handleChange('endDate', opt.date)\r\n                                          if (!formData.startDate || opt.date < formData.startDate) handleChange('startDate', opt.date)\r\n                                          setShowDatePicker(null)\r\n                                        }\r\n                                      }}\r\n                                    >\r\n                                      {opt.label}\r\n                                    </button>\r\n                                  ))\r\n                                })()}\r\n                                <div style={{ borderTop: `1px solid ${themeColors.border}`, margin: '0.5rem 0' }} />\r\n                                <button\r\n                                  type=\"button\"\r\n                                  className=\"w-full px-3 py-2 text-sm text-left transition-colors\"\r\n                                  style={{ color: '#EF4444' }}\r\n                                  onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = themeColors.hoverBg)}\r\n                                  onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\r\n                                  onClick={() => { handleChange('startDate', undefined); handleChange('endDate', undefined); setShowDatePicker(null) }}\r\n                                >\r\n                                  Borrar fechas\r\n                                </button>\r\n                              </div>\r\n\r\n                              {/* Calendar */}\r\n                              <div className=\"p-3\">\r\n                                <div className=\"flex items-center justify-between mb-3\">\r\n                                  <button\r\n                                    type=\"button\"\r\n                                    onClick={() => setDatePickerMonth(new Date(datePickerMonth.getFullYear(), datePickerMonth.getMonth() - 1))}\r\n                                    className=\"p-1 rounded\"\r\n                                    onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = themeColors.hoverBg)}\r\n                                    onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\r\n                                  >\r\n                                    <ChevronLeft className=\"w-4 h-4\" style={{ color: themeColors.textSecondary }} />\r\n                                  </button>\r\n                                  <span className=\"text-sm font-medium\" style={{ color: themeColors.textPrimary, fontFamily: 'JetBrains Mono, monospace' }}>{datePickerMonth.toLocaleDateString('es-ES', { month: 'long', year: 'numeric' })}</span>\r\n                                  <button\r\n                                    type=\"button\"\r\n                                    onClick={() => setDatePickerMonth(new Date(datePickerMonth.getFullYear(), datePickerMonth.getMonth() + 1))}\r\n                                    className=\"p-1 rounded\"\r\n                                    onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = themeColors.hoverBg)}\r\n                                    onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\r\n                                  >\r\n                                    <ChevronRight className=\"w-4 h-4\" style={{ color: themeColors.textSecondary }} />\r\n                                  </button>\r\n                                </div>\r\n                                <div className=\"grid grid-cols-7 gap-1 mb-1\">\r\n                                  {['D', 'L', 'M', 'M', 'J', 'V', 'S'].map((d, i) => (\r\n                                    <div key={i} className=\"w-7 h-7 flex items-center justify-center text-xs\" style={{ color: themeColors.textTertiary }}>{d}</div>\r\n                                  ))}\r\n                                </div>\r\n                                <div className=\"grid grid-cols-7 gap-1\">\r\n                                  {(() => {\r\n                                    const year = datePickerMonth.getFullYear(), month = datePickerMonth.getMonth()\r\n                                    const firstDay = new Date(year, month, 1).getDay()\r\n                                    const daysInMonth = new Date(year, month + 1, 0).getDate()\r\n                                    const today = new Date()\r\n                                    const days: { day: number; date: Date; isCurrentMonth: boolean }[] = []\r\n\r\n                                    for (let i = firstDay - 1; i >= 0; i--) days.push({ day: new Date(year, month, -i).getDate(), date: new Date(year, month - 1, new Date(year, month, -i).getDate()), isCurrentMonth: false })\r\n                                    for (let i = 1; i <= daysInMonth; i++) days.push({ day: i, date: new Date(year, month, i), isCurrentMonth: true })\r\n                                    const remaining = 42 - days.length\r\n                                    for (let i = 1; i <= remaining; i++) days.push({ day: i, date: new Date(year, month + 1, i), isCurrentMonth: false })\r\n\r\n                                    return days.map((d, i) => {\r\n                                      const isToday = d.date.toDateString() === today.toDateString()\r\n                                      const isStart = formData.startDate?.toDateString() === d.date.toDateString()\r\n                                      const isEnd = formData.endDate?.toDateString() === d.date.toDateString()\r\n                                      const isInRange = formData.startDate && formData.endDate && d.date >= formData.startDate && d.date <= formData.endDate\r\n\r\n                                      return (\r\n                                        <button\r\n                                          key={i}\r\n                                          type=\"button\"\r\n                                          className=\"w-7 h-7 rounded-full flex items-center justify-center text-xs transition-colors\"\r\n                                          style={{\r\n                                            color: !d.isCurrentMonth ? themeColors.textTertiary : isStart || isEnd ? '#FFF' : themeColors.textPrimary,\r\n                                            backgroundColor: isStart ? themeColors.accent : isEnd ? '#7C3AED' : isInRange ? 'rgba(124, 58, 237, 0.2)' : 'transparent',\r\n                                            boxShadow: isToday && !isStart && !isEnd ? `inset 0 0 0 1px ${themeColors.accent}` : 'none',\r\n                                          }}\r\n                                          onClick={() => {\r\n                                            if (showDatePicker === 'start') {\r\n                                              handleChange('startDate', d.date)\r\n                                              if (formData.endDate && d.date > formData.endDate) handleChange('endDate', d.date)\r\n                                              setShowDatePicker('end')\r\n                                            } else {\r\n                                              handleChange('endDate', d.date)\r\n                                              if (formData.startDate && d.date < formData.startDate) handleChange('startDate', d.date)\r\n                                              setShowDatePicker(null)\r\n                                            }\r\n                                          }}\r\n                                        >\r\n                                          {d.day}\r\n                                        </button>\r\n                                      )\r\n                                    })\r\n                                  })()}\r\n                                </div>\r\n                              </div>\r\n                            </motion.div>\r\n                          </Portal>\r\n                        )}\r\n                      </AnimatePresence>\r\n                    </div>\r\n                    {errors.endDate && <span className=\"text-xs text-red-400\">{errors.endDate}</span>}\r\n                  </div>\r\n                  </div>\r\n                  {/* Progress — static bar matching design */}\r\n                  <div className=\"space-y-3\">\r\n                    <div className=\"flex justify-between items-center\">\r\n                      <label style={{ fontSize: 10, fontWeight: 700, letterSpacing: '0.1em', textTransform: 'uppercase', color: themeColors.textTertiary }}>\r\n                        Progreso Inicial\r\n                      </label>\r\n                      <span style={{ fontSize: 10, fontWeight: 700, color: '#00E5CC' }}>\r\n                        {formData.progress}%\r\n                      </span>\r\n                    </div>\r\n                    <div\r\n                      className=\"h-2 w-full rounded-full overflow-hidden cursor-pointer\"\r\n                      style={{ backgroundColor: isDarkTheme ? '#33343c' : '#E5E7EB' }}\r\n                      onClick={(e) => {\r\n                        if (isLoading) return;\r\n                        const rect = e.currentTarget.getBoundingClientRect();\r\n                        const pct = Math.round(((e.clientX - rect.left) / rect.width) * 100 / 5) * 5;\r\n                        handleChange('progress', Math.max(0, Math.min(100, pct)));\r\n                      }}\r\n                    >\r\n                      <div\r\n                        className=\"h-full rounded-full transition-all\"\r\n                        style={{ width: `${formData.progress}%`, backgroundColor: '#00E5CC' }}\r\n                      />\r\n                    </div>\r\n                  </div>\r\n                  </section>\r\n\r\n                  {/* Advanced Options - Collapsible */}\r\n                  <div style={{ borderTop: `1px solid ${isDarkTheme ? 'rgba(65,71,84,0.05)' : themeColors.borderLight}`, paddingTop: 16 }}>\r\n                    <button\r\n                      type=\"button\"\r\n                      onClick={() => setShowAdvanced(!showAdvanced)}\r\n                      className=\"flex items-center gap-2 w-full py-2 transition-colors\"\r\n                      style={{ color: themeColors.textPrimary }}\r\n                    >\r\n                      <ChevronDown className={`w-4 h-4 transition-transform ${showAdvanced ? '' : '-rotate-90'}`} style={{ color: themeColors.textTertiary }} />\r\n                      <span style={{ fontSize: 16, fontWeight: 700, fontFamily: \"'Inter', system-ui, sans-serif\" }}>Opciones Avanzadas</span>\r\n                    </button>\r\n\r\n                    <AnimatePresence>\r\n                      {showAdvanced && (\r\n                        <motion.div\r\n                          initial={{ height: 0, opacity: 0 }}\r\n                          animate={{ height: 'auto', opacity: 1 }}\r\n                          exit={{ height: 0, opacity: 0 }}\r\n                          className=\"overflow-hidden\"\r\n                        >\r\n                          <div className=\"pt-3 space-y-3\">\r\n                            {/* v1.2.0: Duración estimada (Effort Estimate) */}\r\n                            <div>\r\n                              <div className=\"flex items-center gap-2 mb-2\">\r\n                                <svg\r\n                                  width=\"16\"\r\n                                  height=\"16\"\r\n                                  viewBox=\"0 0 24 24\"\r\n                                  fill=\"none\"\r\n                                  stroke=\"currentColor\"\r\n                                  strokeWidth=\"2\"\r\n                                  style={{ color: themeColors.textTertiary }}\r\n                                >\r\n                                  <path d=\"M12 6v6l4 2\" />\r\n                                  <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n                                </svg>\r\n                                <span className=\"text-xs\" style={{ color: themeColors.textTertiary }}>\r\n                                  Horas Estimadas\r\n                                </span>\r\n                              </div>\r\n                              <input\r\n                                type=\"text\"\r\n                                placeholder=\"Ej: 8 (=8h), 2h 30m, 45m, 1d (1 día = 8h)\"\r\n                                value={formData.effortMinutes ? formatMinutesToDisplay(formData.effortMinutes) : ''}\r\n                                onChange={(e) => {\r\n                                  const minutes = parseTimeInput(e.target.value);\r\n                                  handleChange('effortMinutes', minutes);\r\n                                }}\r\n                                className=\"w-full px-3 py-2 rounded-lg text-sm transition-colors\"\r\n                                style={{\r\n                                  backgroundColor: themeColors.bgSecondary,\r\n                                  color: themeColors.textPrimary,\r\n                                  border: `1px solid ${themeColors.borderLight}`,\r\n                                }}\r\n                              />\r\n                            </div>\r\n\r\n                            {/* v2.3.0: Parent Phase dropdown */}\r\n                            {availableTasks.length > 0 && (\r\n                              <div>\r\n                                <div className=\"flex items-center gap-2 mb-2\">\r\n                                  <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" style={{ color: themeColors.textTertiary }}>\r\n                                    <path d=\"M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z\"/>\r\n                                  </svg>\r\n                                  <span className=\"text-xs\" style={{ color: themeColors.textTertiary }}>\r\n                                    Fase Padre\r\n                                  </span>\r\n                                </div>\r\n                                <select\r\n                                  value={formData.parentId || ''}\r\n                                  onChange={(e) => handleChange('parentId', e.target.value || null)}\r\n                                  className=\"w-full px-3 py-2 rounded-lg text-sm transition-colors appearance-none cursor-pointer\"\r\n                                  style={{\r\n                                    backgroundColor: themeColors.bgSecondary,\r\n                                    color: themeColors.textPrimary,\r\n                                    border: `1px solid ${themeColors.borderLight}`,\r\n                                  }}\r\n                                  disabled={isLoading}\r\n                                >\r\n                                  <option value=\"\">— Sin fase padre (raíz) —</option>\r\n                                  {availableTasks\r\n                                    .filter(t => t.id !== task?.id)\r\n                                    .map(t => (\r\n                                      <option key={t.id} value={t.id}>{t.name}</option>\r\n                                    ))}\r\n                                </select>\r\n                              </div>\r\n                            )}\r\n\r\n                            {/* v2.3.0: Location & Equipment fields */}\r\n                            <div className=\"grid grid-cols-2 gap-3\">\r\n                              <div>\r\n                                <div className=\"flex items-center gap-2 mb-2\">\r\n                                  <span style={{ fontSize: 14 }}>📍</span>\r\n                                  <span className=\"text-xs\" style={{ color: themeColors.textTertiary }}>\r\n                                    Ubicación\r\n                                  </span>\r\n                                </div>\r\n                                <input\r\n                                  type=\"text\"\r\n                                  placeholder=\"Ej: Zona Norte, Piso 3\"\r\n                                  value={formData.location || ''}\r\n                                  onChange={(e) => handleChange('location', e.target.value)}\r\n                                  className=\"w-full px-3 py-2 rounded-lg text-sm transition-colors\"\r\n                                  style={{\r\n                                    backgroundColor: themeColors.bgSecondary,\r\n                                    color: themeColors.textPrimary,\r\n                                    border: `1px solid ${themeColors.borderLight}`,\r\n                                  }}\r\n                                  disabled={isLoading}\r\n                                />\r\n                              </div>\r\n                              <div>\r\n                                <div className=\"flex items-center gap-2 mb-2\">\r\n                                  <span style={{ fontSize: 14 }}>🔧</span>\r\n                                  <span className=\"text-xs\" style={{ color: themeColors.textTertiary }}>\r\n                                    Activo / Equipo\r\n                                  </span>\r\n                                </div>\r\n                                <input\r\n                                  type=\"text\"\r\n                                  placeholder=\"Ej: CMC-256\"\r\n                                  value={formData.equipment || ''}\r\n                                  onChange={(e) => handleChange('equipment', e.target.value)}\r\n                                  className=\"w-full px-3 py-2 rounded-lg text-sm transition-colors\"\r\n                                  style={{\r\n                                    backgroundColor: themeColors.bgSecondary,\r\n                                    color: themeColors.textPrimary,\r\n                                    border: `1px solid ${themeColors.borderLight}`,\r\n                                  }}\r\n                                  disabled={isLoading}\r\n                                />\r\n                              </div>\r\n                            </div>\r\n\r\n                            {/* v0.17.227: Attachments Section - moved here for cleaner form */}\r\n                            {(onUploadAttachments || attachments.length > 0 || mode === 'create') && (\r\n                              <div>\r\n                                <div className=\"flex items-center gap-2 mb-2\">\r\n                                  <svg\r\n                                    width=\"16\"\r\n                                    height=\"16\"\r\n                                    viewBox=\"0 0 24 24\"\r\n                                    fill=\"none\"\r\n                                    stroke=\"currentColor\"\r\n                                    strokeWidth=\"2\"\r\n                                    style={{ color: themeColors.textTertiary }}\r\n                                  >\r\n                                    <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\" />\r\n                                  </svg>\r\n                                  <span className=\"text-xs\" style={{ color: themeColors.textTertiary }}>\r\n                                    Adjuntos {mode === 'create'\r\n                                      ? (pendingFiles.length > 0 && `(${pendingFiles.length})`)\r\n                                      : (attachments.length > 0 && `(${attachments.length})`)}\r\n                                  </span>\r\n                                </div>\r\n                                {mode === 'create' ? (\r\n                                  <AttachmentUploader\r\n                                    cardId=\"pending\"\r\n                                    attachments={pendingFiles.map((file, idx) => ({\r\n                                      id: `pending-${idx}`,\r\n                                      cardId: 'pending',\r\n                                      name: file.name,\r\n                                      size: file.size,\r\n                                      type: file.type,\r\n                                      url: URL.createObjectURL(file),\r\n                                      uploadedAt: new Date().toISOString(),\r\n                                      uploadedBy: 'current-user',\r\n                                    }))}\r\n                                    onUpload={(files) => setPendingFiles(prev => [...prev, ...files])}\r\n                                    onDelete={(id) => {\r\n                                      const idx = parseInt(id.replace('pending-', ''), 10)\r\n                                      setPendingFiles(prev => prev.filter((_, i) => i !== idx))\r\n                                    }}\r\n                                    maxSizeMB={10}\r\n                                    maxFiles={20}\r\n                                  />\r\n                                ) : (\r\n                                  <AttachmentUploader\r\n                                    cardId={task?.id || 'new'}\r\n                                    attachments={attachments}\r\n                                    onUpload={onUploadAttachments && task?.id ? (files) => onUploadAttachments(task.id, files) : undefined}\r\n                                    onDelete={onDeleteAttachment}\r\n                                    maxSizeMB={10}\r\n                                    maxFiles={20}\r\n                                  />\r\n                                )}\r\n                                {mode === 'create' && pendingFiles.length > 0 && (\r\n                                  <p className=\"text-xs mt-1\" style={{ color: themeColors.textTertiary }}>\r\n                                    {pendingFiles.length} archivo(s) se subirán al crear la tarea\r\n                                  </p>\r\n                                )}\r\n                              </div>\r\n                            )}\r\n\r\n                            {/* Milestone */}\r\n                            <label\r\n                              className=\"flex items-center gap-3 cursor-pointer p-2 rounded-lg transition-colors\"\r\n                              onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = themeColors.hoverBg)}\r\n                              onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\r\n                            >\r\n                              <input\r\n                                type=\"checkbox\"\r\n                                checked={formData.isMilestone}\r\n                                onChange={(e) => handleChange('isMilestone', e.target.checked)}\r\n                                className=\"w-4 h-4 rounded\"\r\n                                style={{ accentColor: themeColors.accent }}\r\n                                disabled={isLoading}\r\n                              />\r\n                              <MilestoneIcon className=\"w-4 h-4 text-yellow-500\" />\r\n                              <span className=\"text-sm\" style={{ color: themeColors.textPrimary }}>Marcar como hito</span>\r\n                            </label>\r\n\r\n                            {/* Dependencies - v0.18.0: Same UI as TaskDetailModal */}\r\n                            {availableTasks.length > 0 && (\r\n                              <div className=\"relative\">\r\n                                <label className=\"flex items-center gap-2 text-xs mb-2\" style={{ color: themeColors.textTertiary }}>\r\n                                  <Link2 className=\"w-3.5 h-3.5\" />\r\n                                  Dependencias\r\n                                </label>\r\n\r\n                                {/* Selected dependencies as chips */}\r\n                                {formData.dependencies && formData.dependencies.length > 0 && (\r\n                                  <div className=\"flex flex-wrap gap-1.5 mb-2\">\r\n                                    {formData.dependencies.map((depId) => {\r\n                                      const depTask = availableTasks.find(t => t.id === depId)\r\n                                      return (\r\n                                        <span\r\n                                          key={depId}\r\n                                          className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium\"\r\n                                          style={{\r\n                                            backgroundColor: `${themeColors.accent}20`,\r\n                                            color: themeColors.accent,\r\n                                          }}\r\n                                        >\r\n                                          {depTask?.name || depId.slice(0, 8)}\r\n                                          <button\r\n                                            type=\"button\"\r\n                                            onClick={() => {\r\n                                              const newDeps = (formData.dependencies || []).filter(id => id !== depId)\r\n                                              handleChange('dependencies', newDeps)\r\n                                            }}\r\n                                            className=\"ml-0.5 rounded-full p-0.5 transition-colors hover:bg-white/20\"\r\n                                            disabled={isLoading}\r\n                                          >\r\n                                            <X className=\"w-3 h-3\" />\r\n                                          </button>\r\n                                        </span>\r\n                                      )\r\n                                    })}\r\n                                  </div>\r\n                                )}\r\n\r\n                                {/* Add dependency button */}\r\n                                <button\r\n                                  type=\"button\"\r\n                                  onClick={() => {\r\n                                    setShowDependenciesDropdown(!showDependenciesDropdown)\r\n                                    setDependencySearch('')\r\n                                  }}\r\n                                  className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg text-xs transition-colors\"\r\n                                  style={{\r\n                                    backgroundColor: themeColors.bgSecondary,\r\n                                    color: themeColors.textSecondary,\r\n                                  }}\r\n                                  disabled={isLoading}\r\n                                >\r\n                                  <Plus className=\"w-3.5 h-3.5\" />\r\n                                  <span>Agregar dependencia</span>\r\n                                </button>\r\n\r\n                                {/* Dependencies Dropdown */}\r\n                                <AnimatePresence>\r\n                                  {showDependenciesDropdown && (\r\n                                    <>\r\n                                      <div\r\n                                        className=\"fixed inset-0 z-40\"\r\n                                        onClick={() => {\r\n                                          setShowDependenciesDropdown(false)\r\n                                          setDependencySearch('')\r\n                                        }}\r\n                                      />\r\n                                      <motion.div\r\n                                        initial={{ opacity: 0, y: -5 }}\r\n                                        animate={{ opacity: 1, y: 0 }}\r\n                                        exit={{ opacity: 0, y: -5 }}\r\n                                        className=\"absolute left-0 top-full mt-1 z-50 rounded-lg overflow-hidden min-w-[280px] max-h-[280px]\"\r\n                                        style={{\r\n                                          backgroundColor: isDarkTheme ? '#0a0a0a' : themeColors.bgPrimary,\r\n                                          backdropFilter: isDarkTheme ? 'blur(16px)' : undefined,\r\n                                          border: `1px solid ${isDarkTheme ? '#262626' : themeColors.border}`,\r\n                                          boxShadow: isDarkTheme ? '0 8px 24px rgba(0, 0, 0, 0.5)' : '0 8px 24px rgba(0, 0, 0, 0.12)',\r\n                                        }}\r\n                                      >\r\n                                        {/* Search input */}\r\n                                        <div className=\"p-2\" style={{ borderBottom: `1px solid ${themeColors.border}` }}>\r\n                                          <input\r\n                                            type=\"text\"\r\n                                            value={dependencySearch}\r\n                                            onChange={(e) => setDependencySearch(e.target.value)}\r\n                                            placeholder=\"Buscar tarea...\"\r\n                                            className=\"w-full px-3 py-2 rounded-md text-xs outline-none\"\r\n                                            style={{\r\n                                              backgroundColor: themeColors.bgSecondary,\r\n                                              color: themeColors.textPrimary,\r\n                                            }}\r\n                                            autoFocus\r\n                                          />\r\n                                        </div>\r\n\r\n                                        {/* Task list */}\r\n                                        <div className=\"max-h-[200px] overflow-y-auto\">\r\n                                          {availableTasks\r\n                                            .filter(t => t.id !== task?.id)\r\n                                            .filter(t =>\r\n                                              dependencySearch === '' ||\r\n                                              t.name.toLowerCase().includes(dependencySearch.toLowerCase())\r\n                                            )\r\n                                            .map((depTask) => {\r\n                                              const isSelected = formData.dependencies?.includes(depTask.id)\r\n                                              return (\r\n                                                <button\r\n                                                  key={depTask.id}\r\n                                                  type=\"button\"\r\n                                                  onClick={() => {\r\n                                                    const currentDeps = formData.dependencies || []\r\n                                                    let newDeps: string[]\r\n                                                    if (isSelected) {\r\n                                                      newDeps = currentDeps.filter(id => id !== depTask.id)\r\n                                                    } else {\r\n                                                      newDeps = [...currentDeps, depTask.id]\r\n                                                    }\r\n                                                    handleChange('dependencies', newDeps)\r\n                                                  }}\r\n                                                  className=\"w-full flex items-center gap-3 px-3 py-2 text-xs transition-colors text-left\"\r\n                                                  style={{\r\n                                                    backgroundColor: isSelected ? `${themeColors.accent}10` : 'transparent',\r\n                                                  }}\r\n                                                  onMouseEnter={(e) => {\r\n                                                    if (!isSelected) e.currentTarget.style.backgroundColor = themeColors.hoverBg\r\n                                                  }}\r\n                                                  onMouseLeave={(e) => {\r\n                                                    e.currentTarget.style.backgroundColor = isSelected ? `${themeColors.accent}10` : 'transparent'\r\n                                                  }}\r\n                                                >\r\n                                                  <div\r\n                                                    className=\"w-4 h-4 rounded border-2 flex items-center justify-center flex-shrink-0\"\r\n                                                    style={{\r\n                                                      backgroundColor: isSelected ? themeColors.accent : 'transparent',\r\n                                                      borderColor: isSelected ? themeColors.accent : themeColors.borderLight,\r\n                                                    }}\r\n                                                  >\r\n                                                    {isSelected && <Check className=\"w-3 h-3 text-white\" />}\r\n                                                  </div>\r\n                                                  <div className=\"flex-1 min-w-0\">\r\n                                                    <span\r\n                                                      className=\"block truncate\"\r\n                                                      style={{ color: themeColors.textPrimary }}\r\n                                                    >\r\n                                                      {depTask.name}\r\n                                                    </span>\r\n                                                    <span\r\n                                                      className=\"text-[10px]\"\r\n                                                      style={{ color: themeColors.textTertiary }}\r\n                                                    >\r\n                                                      {depTask.id.slice(0, 8)}\r\n                                                    </span>\r\n                                                  </div>\r\n                                                </button>\r\n                                              )\r\n                                            })}\r\n                                          {availableTasks.filter(t => t.id !== task?.id).length === 0 && (\r\n                                            <div\r\n                                              className=\"px-3 py-4 text-xs text-center\"\r\n                                              style={{ color: themeColors.textTertiary }}\r\n                                            >\r\n                                              No hay tareas disponibles\r\n                                            </div>\r\n                                          )}\r\n                                        </div>\r\n                                      </motion.div>\r\n                                    </>\r\n                                  )}\r\n                                </AnimatePresence>\r\n                              </div>\r\n                            )}\r\n                          </div>\r\n                        </motion.div>\r\n                      )}\r\n                    </AnimatePresence>\r\n                  </div>\r\n\r\n                </div>\r\n                {/* End scrollable content */}\r\n\r\n                {/* Footer - Executive style */}\r\n                <div className=\"flex items-center justify-end gap-6 px-8 py-5 flex-shrink-0\" style={{ borderTop: `1px solid ${isDarkTheme ? 'rgba(65,71,84,0.1)' : themeColors.border}`, backgroundColor: isDarkTheme ? 'rgba(25,27,34,0.2)' : undefined }}>\r\n                  <button\r\n                    type=\"button\"\r\n                    onClick={onClose}\r\n                    className=\"text-sm font-semibold transition-colors\"\r\n                    style={{ color: themeColors.textTertiary }}\r\n                    onMouseEnter={(e) => (e.currentTarget.style.color = themeColors.textPrimary)}\r\n                    onMouseLeave={(e) => (e.currentTarget.style.color = themeColors.textTertiary)}\r\n                    disabled={isLoading}\r\n                  >\r\n                    Cancelar\r\n                  </button>\r\n                  <button\r\n                    type=\"submit\"\r\n                    disabled={isLoading}\r\n                    className=\"px-8 py-3 font-bold rounded-lg transition-all flex items-center gap-2\"\r\n                    style={{\r\n                      backgroundColor: '#00E5CC',\r\n                      color: '#FFF',\r\n                      fontSize: 14,\r\n                      fontFamily: \"'Inter', system-ui, sans-serif\",\r\n                      boxShadow: '0 4px 20px rgba(0, 123, 255, 0.2)',\r\n                    }}\r\n                    onMouseEnter={(e) => !isLoading && (e.currentTarget.style.filter = 'brightness(1.1)')}\r\n                    onMouseLeave={(e) => !isLoading && (e.currentTarget.style.filter = 'brightness(1)')}\r\n                  >\r\n                    {isLoading ? (\r\n                      <><div className=\"w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin\" />Guardando...</>\r\n                    ) : (\r\n                      <>{mode === 'create' ? 'Crear Tarea' : 'Guardar'}</>\r\n                    )}\r\n                  </button>\r\n                </div>\r\n              </form>\r\n            </div>\r\n          </motion.div>\r\n        </>\r\n      )}\r\n    </AnimatePresence>\r\n  )\r\n}\r\n","/**\n * AI Command Parser for Gantt Chart\n * Parses natural language commands and converts them to task operations\n *\n * This module provides utilities for parsing AI responses and generating\n * prompts for natural language task editing.\n *\n * @version 0.14.0\n */\n\nimport { Task, AICommandResult } from './types';\n\n/**\n * System prompt for the AI model to understand Gantt task commands\n */\nexport const GANTT_AI_SYSTEM_PROMPT = `You are a Gantt chart AI assistant. You help users edit project tasks using natural language commands.\n\nAVAILABLE COMMANDS:\n1. move_task - Move a task to a different date\n2. resize_task - Change task duration (extend/shorten)\n3. rename_task - Rename a task\n4. delete_task - Delete a task\n5. create_task - Create a new task\n6. link_tasks - Create dependency between tasks\n7. unlink_tasks - Remove dependency\n8. assign_task - Assign users to task\n9. set_progress - Update task progress (0-100%)\n10. set_status - Change task status (todo, in-progress, completed)\n\nRESPONSE FORMAT (JSON):\n{\n  \"type\": \"command_type\",\n  \"taskId\": \"id of the task to modify (if found)\",\n  \"taskName\": \"name of the task mentioned\",\n  \"updates\": { /* partial task updates */ },\n  \"newTask\": { /* for create_task only */ },\n  \"dependencyFrom\": \"source task id (for link/unlink)\",\n  \"dependencyTo\": \"target task id (for link/unlink)\",\n  \"message\": \"Human-readable response explaining what was done\",\n  \"success\": true/false,\n  \"error\": \"error message if failed\"\n}\n\nEXAMPLES:\n- \"Move Design to next Monday\" -> move_task with startDate update\n- \"Extend Testing by 3 days\" -> resize_task with endDate update\n- \"Rename 'Old Task' to 'New Task'\" -> rename_task with name update\n- \"Set Development progress to 50%\" -> set_progress with progress: 50\n- \"Link Design to Development\" -> link_tasks\n- \"Create a new task called 'Review'\" -> create_task\n\nTASK DATA FORMAT:\nTasks have: id, name, startDate, endDate, progress, status, dependencies[], assignees[]\n\nAlways try to match task names case-insensitively and handle partial matches.\nIf you can't find a task by name, search through the provided task list.\nIf ambiguous, ask for clarification in the message field.`;\n\n/**\n * Generate the user prompt with current tasks context\n */\nexport function generateTasksContext(tasks: Task[]): string {\n  const flatTasks = flattenTasks(tasks);\n  const taskList = flatTasks\n    .map((t) => {\n      const start = t.startDate ? t.startDate.toISOString().split('T')[0] : 'no date';\n      const end = t.endDate ? t.endDate.toISOString().split('T')[0] : 'no date';\n      const deps = t.dependencies?.length ? `deps: [${t.dependencies.join(', ')}]` : '';\n      return `- ${t.id}: \"${t.name}\" (${start} to ${end}, ${t.progress}%, ${t.status || 'todo'}) ${deps}`;\n    })\n    .join('\\n');\n\n  return `CURRENT TASKS:\\n${taskList}\\n\\nToday's date: ${new Date().toISOString().split('T')[0]}`;\n}\n\n/**\n * Flatten nested tasks into a single array\n */\nfunction flattenTasks(tasks: Task[]): Task[] {\n  const result: Task[] = [];\n  const flatten = (taskList: Task[]) => {\n    for (const task of taskList) {\n      result.push(task);\n      if (task.subtasks?.length) {\n        flatten(task.subtasks);\n      }\n    }\n  };\n  flatten(tasks);\n  return result;\n}\n\n/**\n * Find a task by name (case-insensitive, partial match)\n */\nexport function findTaskByName(tasks: Task[], name: string): Task | undefined {\n  const flatTasks = flattenTasks(tasks);\n  const normalizedName = name.toLowerCase().trim();\n\n  // Exact match first\n  const exact = flatTasks.find((t) => t.name.toLowerCase() === normalizedName);\n  if (exact) return exact;\n\n  // Partial match\n  const partial = flatTasks.find((t) => t.name.toLowerCase().includes(normalizedName));\n  if (partial) return partial;\n\n  // Fuzzy match (contains all words)\n  const words = normalizedName.split(/\\s+/);\n  return flatTasks.find((t) => {\n    const taskName = t.name.toLowerCase();\n    return words.every((word) => taskName.includes(word));\n  });\n}\n\n/**\n * Parse date from natural language\n */\nexport function parseNaturalDate(text: string, referenceDate = new Date()): Date | null {\n  const normalized = text.toLowerCase().trim();\n  const today = new Date(referenceDate);\n  today.setHours(0, 0, 0, 0);\n\n  // Today\n  if (normalized === 'today' || normalized === 'hoy') {\n    return today;\n  }\n\n  // Tomorrow\n  if (normalized === 'tomorrow' || normalized === 'mañana') {\n    const date = new Date(today);\n    date.setDate(date.getDate() + 1);\n    return date;\n  }\n\n  // Yesterday\n  if (normalized === 'yesterday' || normalized === 'ayer') {\n    const date = new Date(today);\n    date.setDate(date.getDate() - 1);\n    return date;\n  }\n\n  // Next week\n  if (normalized === 'next week' || normalized === 'la próxima semana') {\n    const date = new Date(today);\n    date.setDate(date.getDate() + 7);\n    return date;\n  }\n\n  // Day of week (next Monday, next Tuesday, etc.)\n  const dayMatch = normalized.match(/(?:next\\s+)?(monday|tuesday|wednesday|thursday|friday|saturday|sunday|lunes|martes|miércoles|miercoles|jueves|viernes|sábado|sabado|domingo)/i);\n  if (dayMatch) {\n    const dayNames: Record<string, number> = {\n      sunday: 0, domingo: 0,\n      monday: 1, lunes: 1,\n      tuesday: 2, martes: 2,\n      wednesday: 3, miércoles: 3, miercoles: 3,\n      thursday: 4, jueves: 4,\n      friday: 5, viernes: 5,\n      saturday: 6, sábado: 6, sabado: 6,\n    };\n    const targetDay = dayNames[dayMatch[1]!.toLowerCase()];\n    if (targetDay !== undefined) {\n      const date = new Date(today);\n      const currentDay = date.getDay();\n      let daysToAdd = targetDay - currentDay;\n      if (daysToAdd <= 0) daysToAdd += 7; // Always next occurrence\n      date.setDate(date.getDate() + daysToAdd);\n      return date;\n    }\n  }\n\n  // In X days/weeks/months\n  const inMatch = normalized.match(/in\\s+(\\d+)\\s+(day|week|month|día|dias|semana|semanas|mes|meses)s?/i);\n  if (inMatch && inMatch[1] && inMatch[2]) {\n    const amount = parseInt(inMatch[1], 10);\n    const unit = inMatch[2].toLowerCase();\n    const date = new Date(today);\n\n    if (unit === 'day' || unit === 'día' || unit === 'dias') {\n      date.setDate(date.getDate() + amount);\n    } else if (unit === 'week' || unit === 'semana' || unit === 'semanas') {\n      date.setDate(date.getDate() + amount * 7);\n    } else if (unit === 'month' || unit === 'mes' || unit === 'meses') {\n      date.setMonth(date.getMonth() + amount);\n    }\n    return date;\n  }\n\n  // ISO date (YYYY-MM-DD)\n  const isoMatch = normalized.match(/(\\d{4})-(\\d{2})-(\\d{2})/);\n  if (isoMatch) {\n    return new Date(normalized);\n  }\n\n  // DD/MM/YYYY or MM/DD/YYYY\n  const dateMatch = normalized.match(/(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})/);\n  if (dateMatch && dateMatch[1] && dateMatch[2] && dateMatch[3]) {\n    // Assume DD/MM/YYYY for non-US locales\n    const day = parseInt(dateMatch[1], 10);\n    const month = parseInt(dateMatch[2], 10) - 1;\n    const year = parseInt(dateMatch[3], 10);\n    return new Date(year, month, day);\n  }\n\n  // Spanish date format: \"1 de diciembre de 2025\", \"15 de enero\", \"20 de marzo de 2024\"\n  const spanishMonths: Record<string, number> = {\n    enero: 0, febrero: 1, marzo: 2, abril: 3, mayo: 4, junio: 5,\n    julio: 6, agosto: 7, septiembre: 8, octubre: 9, noviembre: 10, diciembre: 11,\n  };\n  const spanishDateMatch = normalized.match(/(\\d{1,2})\\s+de\\s+(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)(?:\\s+de\\s+(\\d{4}))?/i);\n  if (spanishDateMatch && spanishDateMatch[1] && spanishDateMatch[2]) {\n    const day = parseInt(spanishDateMatch[1], 10);\n    const month = spanishMonths[spanishDateMatch[2].toLowerCase()];\n    const year = spanishDateMatch[3] ? parseInt(spanishDateMatch[3], 10) : today.getFullYear();\n    if (month !== undefined) {\n      return new Date(year, month, day);\n    }\n  }\n\n  // English date format: \"December 1, 2025\", \"January 15\", \"March 20 2024\"\n  const englishMonths: Record<string, number> = {\n    january: 0, february: 1, march: 2, april: 3, may: 4, june: 5,\n    july: 6, august: 7, september: 8, october: 9, november: 10, december: 11,\n  };\n  const englishDateMatch = normalized.match(/(january|february|march|april|may|june|july|august|september|october|november|december)\\s+(\\d{1,2})(?:,?\\s+(\\d{4}))?/i);\n  if (englishDateMatch && englishDateMatch[1] && englishDateMatch[2]) {\n    const month = englishMonths[englishDateMatch[1].toLowerCase()];\n    const day = parseInt(englishDateMatch[2], 10);\n    const year = englishDateMatch[3] ? parseInt(englishDateMatch[3], 10) : today.getFullYear();\n    if (month !== undefined) {\n      return new Date(year, month, day);\n    }\n  }\n\n  return null;\n}\n\n/**\n * Parse duration from natural language\n */\nexport function parseNaturalDuration(text: string): number | null {\n  const normalized = text.toLowerCase().trim();\n\n  // X days/weeks/months\n  const match = normalized.match(/(\\d+)\\s*(day|week|month|día|dias|semana|semanas|mes|meses)s?/i);\n  if (match && match[1] && match[2]) {\n    const amount = parseInt(match[1], 10);\n    const unit = match[2].toLowerCase();\n\n    if (unit === 'day' || unit === 'día' || unit === 'dias') {\n      return amount;\n    } else if (unit === 'week' || unit === 'semana' || unit === 'semanas') {\n      return amount * 7;\n    } else if (unit === 'month' || unit === 'mes' || unit === 'meses') {\n      return amount * 30;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Parse progress percentage from natural language\n */\nexport function parseProgress(text: string): number | null {\n  const match = text.match(/(\\d+)(?:\\s*%)?/);\n  if (match && match[1]) {\n    const value = parseInt(match[1], 10);\n    return Math.max(0, Math.min(100, value));\n  }\n  return null;\n}\n\n/**\n * Parse task status from natural language\n */\nexport function parseStatus(text: string): 'todo' | 'in-progress' | 'completed' | null {\n  const normalized = text.toLowerCase().trim();\n\n  if (normalized.includes('todo') || normalized.includes('pendiente') || normalized.includes('por hacer')) {\n    return 'todo';\n  }\n  if (normalized.includes('in progress') || normalized.includes('in-progress') || normalized.includes('en progreso') || normalized.includes('working') || normalized.includes('trabajando')) {\n    return 'in-progress';\n  }\n  if (normalized.includes('done') || normalized.includes('complete') || normalized.includes('finished') || normalized.includes('completado') || normalized.includes('terminado') || normalized.includes('hecho')) {\n    return 'completed';\n  }\n\n  return null;\n}\n\n/**\n * Local command parser (for offline/simple commands without AI)\n * This can handle basic commands without needing an AI API call\n */\nexport function parseLocalCommand(command: string, tasks: Task[]): AICommandResult | null {\n  const normalized = command.toLowerCase().trim();\n\n  // Move task pattern: \"move X to Y\" or \"mueve la tarea X a la fecha Y\"\n  // Handles: \"move Task to Monday\", \"mover Diseño a próximo lunes\", \"mueve la tarea Fase 1 a la fecha 1 de diciembre\"\n  const moveMatch = normalized.match(/(?:move|mover|mueve)\\s+(?:la\\s+tarea\\s+)?[\"\"\"]?(.+?)[\"\"\"]?\\s+(?:to|a|para)\\s+(?:la\\s+fecha\\s+)?(.+)/i);\n  if (moveMatch && moveMatch[1] && moveMatch[2]) {\n    const taskName = moveMatch[1].trim();\n    const dateText = moveMatch[2].trim();\n    const task = findTaskByName(tasks, taskName);\n    const newDate = parseNaturalDate(dateText);\n\n    if (!task) {\n      return {\n        type: 'move_task',\n        taskName,\n        message: `Could not find a task named \"${taskName}\". Please check the task name and try again.`,\n        success: false,\n        error: 'Task not found',\n      };\n    }\n\n    if (!newDate) {\n      return {\n        type: 'move_task',\n        taskId: task.id,\n        taskName: task.name,\n        message: `Could not parse the date \"${dateText}\". Try using formats like \"next Monday\", \"in 3 days\", or \"2024-01-15\".`,\n        success: false,\n        error: 'Invalid date',\n      };\n    }\n\n    // Calculate new end date maintaining duration\n    const duration = task.startDate && task.endDate\n      ? Math.round((task.endDate.getTime() - task.startDate.getTime()) / (1000 * 60 * 60 * 24))\n      : 1;\n    const newEndDate = new Date(newDate);\n    newEndDate.setDate(newEndDate.getDate() + duration);\n\n    return {\n      type: 'move_task',\n      taskId: task.id,\n      taskName: task.name,\n      updates: {\n        startDate: newDate,\n        endDate: newEndDate,\n      },\n      message: `Moved \"${task.name}\" to ${newDate.toLocaleDateString()}.`,\n      success: true,\n    };\n  }\n\n  // Extend task pattern: \"extend X by Y days\"\n  const extendMatch = normalized.match(/(?:extend|extender|extiende|alargar)\\s+[\"\"\"]?(.+?)[\"\"\"]?\\s+(?:by|por)\\s+(.+)/i);\n  if (extendMatch && extendMatch[1] && extendMatch[2]) {\n    const taskName = extendMatch[1].trim();\n    const durationText = extendMatch[2].trim();\n    const task = findTaskByName(tasks, taskName);\n    const days = parseNaturalDuration(durationText);\n\n    if (!task) {\n      return {\n        type: 'resize_task',\n        taskName,\n        message: `Could not find a task named \"${taskName}\".`,\n        success: false,\n        error: 'Task not found',\n      };\n    }\n\n    if (!days || !task.endDate) {\n      return {\n        type: 'resize_task',\n        taskId: task.id,\n        taskName: task.name,\n        message: `Could not parse the duration \"${durationText}\".`,\n        success: false,\n        error: 'Invalid duration',\n      };\n    }\n\n    const newEndDate = new Date(task.endDate);\n    newEndDate.setDate(newEndDate.getDate() + days);\n\n    return {\n      type: 'resize_task',\n      taskId: task.id,\n      taskName: task.name,\n      updates: { endDate: newEndDate },\n      message: `Extended \"${task.name}\" by ${days} days. New end date: ${newEndDate.toLocaleDateString()}.`,\n      success: true,\n    };\n  }\n\n  // Set progress pattern: \"set X progress to Y%\"\n  const progressMatch = normalized.match(/(?:set|establecer|poner)\\s+[\"\"\"]?(.+?)[\"\"\"]?\\s+(?:progress|progreso)\\s+(?:to|a|en)\\s+(.+)/i);\n  if (progressMatch && progressMatch[1] && progressMatch[2]) {\n    const taskName = progressMatch[1].trim();\n    const progressText = progressMatch[2].trim();\n    const task = findTaskByName(tasks, taskName);\n    const progress = parseProgress(progressText);\n\n    if (!task) {\n      return {\n        type: 'set_progress',\n        taskName,\n        message: `Could not find a task named \"${taskName}\".`,\n        success: false,\n        error: 'Task not found',\n      };\n    }\n\n    if (progress === null) {\n      return {\n        type: 'set_progress',\n        taskId: task.id,\n        taskName: task.name,\n        message: `Could not parse the progress value \"${progressText}\".`,\n        success: false,\n        error: 'Invalid progress',\n      };\n    }\n\n    return {\n      type: 'set_progress',\n      taskId: task.id,\n      taskName: task.name,\n      updates: { progress },\n      message: `Set \"${task.name}\" progress to ${progress}%.`,\n      success: true,\n    };\n  }\n\n  // Rename pattern: \"rename X to Y\"\n  const renameMatch = normalized.match(/(?:rename|renombrar|cambiar nombre de)\\s+[\"\"\"]?(.+?)[\"\"\"]?\\s+(?:to|a|por)\\s+[\"\"\"]?(.+?)[\"\"\"]?$/i);\n  if (renameMatch && renameMatch[1] && renameMatch[2]) {\n    const oldName = renameMatch[1].trim();\n    const newName = renameMatch[2].trim();\n    const task = findTaskByName(tasks, oldName);\n\n    if (!task) {\n      return {\n        type: 'rename_task',\n        taskName: oldName,\n        message: `Could not find a task named \"${oldName}\".`,\n        success: false,\n        error: 'Task not found',\n      };\n    }\n\n    return {\n      type: 'rename_task',\n      taskId: task.id,\n      taskName: task.name,\n      updates: { name: newName },\n      message: `Renamed \"${task.name}\" to \"${newName}\".`,\n      success: true,\n    };\n  }\n\n  // Link tasks pattern: \"link X to Y\"\n  const linkMatch = normalized.match(/(?:link|vincular|conectar)\\s+[\"\"\"]?(.+?)[\"\"\"]?\\s+(?:to|a|con)\\s+[\"\"\"]?(.+?)[\"\"\"]?$/i);\n  if (linkMatch && linkMatch[1] && linkMatch[2]) {\n    const fromName = linkMatch[1].trim();\n    const toName = linkMatch[2].trim();\n    const fromTask = findTaskByName(tasks, fromName);\n    const toTask = findTaskByName(tasks, toName);\n\n    if (!fromTask) {\n      return {\n        type: 'link_tasks',\n        taskName: fromName,\n        message: `Could not find a task named \"${fromName}\".`,\n        success: false,\n        error: 'Source task not found',\n      };\n    }\n\n    if (!toTask) {\n      return {\n        type: 'link_tasks',\n        taskName: toName,\n        message: `Could not find a task named \"${toName}\".`,\n        success: false,\n        error: 'Target task not found',\n      };\n    }\n\n    return {\n      type: 'link_tasks',\n      taskId: toTask.id,\n      taskName: toTask.name,\n      dependencyFrom: fromTask.id,\n      dependencyTo: toTask.id,\n      message: `Linked \"${fromTask.name}\" → \"${toTask.name}\".`,\n      success: true,\n    };\n  }\n\n  // Delete pattern: \"delete X\"\n  const deleteMatch = normalized.match(/(?:delete|eliminar|borrar|remove|quitar)\\s+[\"\"\"]?(.+?)[\"\"\"]?$/i);\n  if (deleteMatch && deleteMatch[1]) {\n    const taskName = deleteMatch[1].trim();\n    const task = findTaskByName(tasks, taskName);\n\n    if (!task) {\n      return {\n        type: 'delete_task',\n        taskName,\n        message: `Could not find a task named \"${taskName}\".`,\n        success: false,\n        error: 'Task not found',\n      };\n    }\n\n    return {\n      type: 'delete_task',\n      taskId: task.id,\n      taskName: task.name,\n      message: `Deleted \"${task.name}\".`,\n      success: true,\n    };\n  }\n\n  // No local pattern matched - return null to indicate AI should handle it\n  return null;\n}\n\n/**\n * Validate and sanitize AI response\n */\nexport function validateAIResponse(response: unknown): AICommandResult {\n  if (!response || typeof response !== 'object') {\n    return {\n      type: 'unknown',\n      message: 'Invalid response from AI',\n      success: false,\n      error: 'Invalid response format',\n    };\n  }\n\n  const r = response as Record<string, unknown>;\n\n  return {\n    type: (r.type as AICommandResult['type']) || 'unknown',\n    taskId: typeof r.taskId === 'string' ? r.taskId : undefined,\n    taskName: typeof r.taskName === 'string' ? r.taskName : undefined,\n    updates: r.updates as Partial<Task> | undefined,\n    newTask: r.newTask as Task | undefined,\n    dependencyFrom: typeof r.dependencyFrom === 'string' ? r.dependencyFrom : undefined,\n    dependencyTo: typeof r.dependencyTo === 'string' ? r.dependencyTo : undefined,\n    message: typeof r.message === 'string' ? r.message : 'Command processed',\n    success: typeof r.success === 'boolean' ? r.success : false,\n    error: typeof r.error === 'string' ? r.error : undefined,\n  };\n}\n","/**\n * Type adapters for converting between ASAKAA Card types and Gantt Task types\n * @module Gantt/adapters\n */\n\nimport type { Card } from '../../types'\nimport type { Task, Assignee } from './types'\n\n/**\n * Maps ASAKAA CardStatus to Gantt task status\n */\nfunction mapCardStatusToTaskStatus(\n  status?: string\n): 'todo' | 'in-progress' | 'completed' | undefined {\n  if (!status) return undefined\n\n  switch (status.toUpperCase()) {\n    case 'TODO':\n    case 'BLOCKED':\n      return 'todo'\n    case 'IN_PROGRESS':\n    case 'REVIEW':\n      return 'in-progress'\n    case 'DONE':\n      return 'completed'\n    default:\n      return 'todo'\n  }\n}\n\n/**\n * Maps Gantt task status to ASAKAA CardStatus\n * v0.17.54: Updated to accept string for custom statuses\n */\nfunction mapTaskStatusToCardStatus(\n  status?: string\n): string {\n  // Default statuses map to card statuses\n  switch (status) {\n    case 'todo':\n      return 'TODO'\n    case 'in-progress':\n      return 'IN_PROGRESS'\n    case 'completed':\n      return 'DONE'\n    default:\n      // v0.17.54: For custom statuses, return as-is (column ID)\n      return status || 'TODO'\n  }\n}\n\n/**\n * Converts an ASAKAA Card to a Gantt Task\n *\n * @param card - ASAKAA Card object\n * @param allCards - All cards in the board (for resolving subtasks)\n * @param users - Available users for assignee mapping\n * @returns Gantt Task object\n */\nexport function cardToGanttTask(\n  card: Card,\n  allCards: Card[] = [],\n  users: Array<{ id: string; name: string; initials: string; color: string }> = []\n): Task {\n  // Map assignees\n  const assignees: Assignee[] | undefined = card.assignedUserIds\n    ?.map((userId) => {\n      const user = users.find((u) => u.id === userId)\n      if (!user) return null\n      return {\n        name: user.name,\n        initials: user.initials,\n        color: user.color,\n      }\n    })\n    .filter((a): a is Assignee => a !== null)\n\n  // Find subtasks (cards that reference this card as parent)\n  const subtasks: Task[] | undefined = allCards\n    .filter((c) => c.metadata?.parentCardId === card.id)\n    .map((c) => cardToGanttTask(c, allCards, users))\n\n  // Extract dependency IDs\n  let dependencies: string[] | undefined\n  if (card.dependencies) {\n    if (typeof card.dependencies[0] === 'string') {\n      // Legacy format: string[]\n      dependencies = card.dependencies as string[]\n    } else {\n      // New format: Dependency[] - only use finish-to-start\n      dependencies = (card.dependencies as any[])\n        .filter((dep) => dep.type === 'finish-to-start')\n        .map((dep) => dep.taskId)\n    }\n  }\n\n  // Parse dates (handle both Date and string) - allow undefined for tasks without dates\n  const parseDate = (date: Date | string | undefined): Date | undefined => {\n    if (!date) return undefined\n    return typeof date === 'string' ? new Date(date) : date\n  }\n\n  const startDate = parseDate(card.startDate)\n  const endDate = parseDate(card.endDate)\n\n  // Determine if this is a milestone (0 or 1 day duration, or explicitly marked)\n  const isMilestone = card.metadata?.isMilestone === true ||\n    (startDate && endDate && Math.abs(endDate.getTime() - startDate.getTime()) <= 86400000)\n\n  return {\n    id: card.id,\n    name: card.title,\n    startDate,\n    endDate,\n    progress: card.progress || 0,\n    status: mapCardStatusToTaskStatus(card.metadata?.status as string),\n    assignees: assignees?.length ? assignees : undefined,\n    dependencies: dependencies?.length ? dependencies : undefined,\n    subtasks: subtasks?.length ? subtasks : undefined,\n    isExpanded: card.metadata?.isExpanded === true,\n    isMilestone,\n    isCriticalPath: card.metadata?.isCriticalPath === true,\n  }\n}\n\n/**\n * Converts a Gantt Task back to an ASAKAA Card (partial update)\n * Note: This only returns the fields that Gantt can modify\n *\n * @param task - Gantt Task object\n * @param users - Available users for reverse mapping assignees to userIds\n * @returns Partial Card update object\n */\nexport function ganttTaskToCardUpdate(\n  task: Task,\n  users: Array<{ id: string; name: string; initials: string; color: string }> = []\n): Partial<Card> {\n  // Convert assignees back to userIds\n  let assignedUserIds: string[] | undefined\n  if (task.assignees && task.assignees.length > 0) {\n    assignedUserIds = task.assignees\n      .map((assignee) => {\n        // Find user by name or initials\n        const user = users.find(\n          (u) => u.name === assignee.name || u.initials === assignee.initials\n        )\n        return user?.id\n      })\n      .filter((id): id is string => id !== undefined)\n  }\n\n  return {\n    id: task.id,\n    title: task.name,\n    startDate: task.startDate,\n    endDate: task.endDate,\n    progress: task.progress,\n    assignedUserIds: assignedUserIds?.length ? assignedUserIds : undefined,\n    metadata: {\n      status: mapTaskStatusToCardStatus(task.status),\n      isExpanded: task.isExpanded,\n      isMilestone: task.isMilestone,\n      isCriticalPath: task.isCriticalPath,\n    },\n  }\n}\n\n/**\n * Converts an array of Cards to an array of Gantt Tasks\n *\n * @param cards - Array of ASAKAA Card objects\n * @param users - Available users for assignee mapping\n * @returns Array of Gantt Task objects\n */\nexport function cardsToGanttTasks(\n  cards: Card[],\n  users: Array<{ id: string; name: string; initials: string; color: string }> = []\n): Task[] {\n  // Filter out cards that are subtasks (have parentCardId)\n  const topLevelCards = cards.filter((c) => !c.metadata?.parentCardId)\n\n  return topLevelCards.map((card) => cardToGanttTask(card, cards, users))\n}\n","/**\n * Internationalization (i18n) for ListView\n * @version 0.17.0\n */\n\nimport type { ListViewTranslations } from './types';\n\nexport type ListViewSupportedLocale = 'en' | 'es';\n\n/**\n * English translations\n */\nexport const en: ListViewTranslations = {\n  columns: {\n    name: 'Task ID / Name',\n    startDate: 'Start Date',\n    endDate: 'End Date',\n    progress: 'Progress',\n    status: 'Status',\n    assignees: 'Assignees',\n    priority: 'Priority',\n    actions: 'Actions',\n    // v0.18.3: Time tracking columns\n    estimatedTime: 'Estimated',\n    // v1.1.0: Quoted time column\n    quotedTime: 'Quoted',\n    elapsedTime: 'Executed',\n    tags: 'Tags',\n    // v2.0.0: Chronos columns\n    scheduleVariance: 'Sched / Var',\n    hoursBar: 'Hours (Spent / Allocated)',\n    teamLoad: 'Team Load',\n    blockers: 'Blockers',\n    weight: 'Weight',\n  },\n\n  toolbar: {\n    search: 'Search',\n    searchPlaceholder: 'Search tasks...',\n    filter: 'Filter',\n    clearFilters: 'Clear Filters',\n    export: 'Export',\n    columns: 'Columns',\n    newTask: 'New Task',\n  },\n\n  filters: {\n    status: 'Status',\n    assignees: 'Assignees',\n    dateRange: 'Date Range',\n    showCompleted: 'Show Completed',\n    all: 'All',\n    none: 'None',\n  },\n\n  status: {\n    todo: 'To Do',\n    inProgress: 'In Progress',\n    completed: 'Completed',\n  },\n\n  actions: {\n    edit: 'Edit',\n    delete: 'Delete',\n    duplicate: 'Duplicate',\n    viewDetails: 'View Details',\n  },\n\n  empty: {\n    noTasks: 'No tasks yet',\n    noResults: 'No tasks match your filters',\n    addFirstTask: 'Add your first task',\n  },\n\n  pagination: {\n    showing: 'Showing',\n    of: 'of',\n    tasks: 'tasks',\n    previous: 'Previous',\n    next: 'Next',\n  },\n\n  bulk: {\n    selected: 'selected',\n    delete: 'Delete',\n    move: 'Move to',\n    assignTo: 'Assign to',\n  },\n};\n\n/**\n * Spanish translations\n */\nexport const es: ListViewTranslations = {\n  columns: {\n    name: 'ID Tarea / Nombre',\n    startDate: 'Fecha Inicio',\n    endDate: 'Fecha Fin',\n    progress: 'Progreso',\n    status: 'Estado',\n    assignees: 'Asignados',\n    priority: 'Prioridad',\n    actions: 'Acciones',\n    // v0.18.3: Time tracking columns\n    estimatedTime: 'Estimado',\n    // v1.1.0: Quoted time column\n    quotedTime: 'Ofertado',\n    elapsedTime: 'Ejecutado',\n    tags: 'Etiquetas',\n    // v2.0.0: Chronos columns\n    scheduleVariance: 'Prog / Var',\n    hoursBar: 'Horas (Usado / Asignado)',\n    teamLoad: 'Equipo',\n    blockers: 'Bloqueantes',\n    weight: 'Peso',\n  },\n\n  toolbar: {\n    search: 'Buscar',\n    searchPlaceholder: 'Buscar tareas...',\n    filter: 'Filtrar',\n    clearFilters: 'Limpiar Filtros',\n    export: 'Exportar',\n    columns: 'Columnas',\n    newTask: 'Nueva Tarea',\n  },\n\n  filters: {\n    status: 'Estado',\n    assignees: 'Asignados',\n    dateRange: 'Rango de Fechas',\n    showCompleted: 'Mostrar Completadas',\n    all: 'Todos',\n    none: 'Ninguno',\n  },\n\n  status: {\n    todo: 'Por Hacer',\n    inProgress: 'En Progreso',\n    completed: 'Completado',\n  },\n\n  actions: {\n    edit: 'Editar',\n    delete: 'Eliminar',\n    duplicate: 'Duplicar',\n    viewDetails: 'Ver Detalles',\n  },\n\n  empty: {\n    noTasks: 'Sin tareas aún',\n    noResults: 'Ninguna tarea coincide con los filtros',\n    addFirstTask: 'Agrega tu primera tarea',\n  },\n\n  pagination: {\n    showing: 'Mostrando',\n    of: 'de',\n    tasks: 'tareas',\n    previous: 'Anterior',\n    next: 'Siguiente',\n  },\n\n  bulk: {\n    selected: 'seleccionadas',\n    delete: 'Eliminar',\n    move: 'Mover a',\n    assignTo: 'Asignar a',\n  },\n};\n\n/**\n * All available translations\n */\nexport const listViewTranslations: Record<ListViewSupportedLocale, ListViewTranslations> = {\n  en,\n  es,\n};\n\n/**\n * Get translations for a specific locale\n */\nexport function getListViewTranslations(locale: ListViewSupportedLocale | string): ListViewTranslations {\n  return listViewTranslations[locale as ListViewSupportedLocale] || listViewTranslations.en;\n}\n\n/**\n * Merge custom translations with default translations\n */\nexport function mergeListViewTranslations(\n  locale: ListViewSupportedLocale | string,\n  customTranslations?: Partial<ListViewTranslations>\n): ListViewTranslations {\n  const base = getListViewTranslations(locale);\n\n  if (!customTranslations) {\n    return base;\n  }\n\n  return {\n    columns: { ...base.columns, ...customTranslations.columns },\n    toolbar: { ...base.toolbar, ...customTranslations.toolbar },\n    filters: { ...base.filters, ...customTranslations.filters },\n    status: { ...base.status, ...customTranslations.status },\n    actions: { ...base.actions, ...customTranslations.actions },\n    empty: { ...base.empty, ...customTranslations.empty },\n    pagination: { ...base.pagination, ...customTranslations.pagination },\n    bulk: { ...base.bulk, ...customTranslations.bulk },\n  };\n}\n","/**\n * StatusCell - Status dropdown cell for ListView\n */\n\nimport { useState, useRef, useEffect } from 'react';\nimport { CheckCircle2, Circle, PlayCircle, ChevronDown } from 'lucide-react';\nimport { cn } from '../../../utils';\n\ninterface StatusCellProps {\n  value: string;\n  onChange?: (value: string) => void;\n  isDark: boolean;\n  locale: string;\n  translations: {\n    todo: string;\n    inProgress: string;\n    completed: string;\n  };\n  disabled?: boolean;\n}\n\n// Only 3 options shown in dropdown\nconst STATUS_OPTIONS = [\n  { value: 'todo', icon: Circle, color: 'text-gray-400' },\n  { value: 'in-progress', icon: PlayCircle, color: 'text-[#3B9EFF]' },\n  { value: 'completed', icon: CheckCircle2, color: 'text-[#3BF06E]' },\n];\n\n// Normalize status value to handle different formats\nfunction normalizeStatus(status: string): string {\n  const lower = status?.toLowerCase() || 'todo';\n  if (lower === 'inprogress' || lower === 'in-progress' || lower === 'in_progress') {\n    return 'in-progress';\n  }\n  if (lower === 'completed' || lower === 'done' || lower === 'complete') {\n    return 'completed';\n  }\n  return 'todo';\n}\n\nexport function StatusCell({\n  value,\n  onChange,\n  isDark,\n  translations,\n  disabled = false,\n}: StatusCellProps) {\n  const [isOpen, setIsOpen] = useState(false);\n  const ref = useRef<HTMLDivElement>(null);\n\n  // Close on click outside\n  useEffect(() => {\n    const handleClickOutside = (e: MouseEvent) => {\n      if (ref.current && !ref.current.contains(e.target as Node)) {\n        setIsOpen(false);\n      }\n    };\n    if (isOpen) {\n      document.addEventListener('mousedown', handleClickOutside);\n    }\n    return () => document.removeEventListener('mousedown', handleClickOutside);\n  }, [isOpen]);\n\n  // Normalize the incoming value\n  const normalizedValue = normalizeStatus(value);\n  const defaultStatus = STATUS_OPTIONS[0]!;\n  const currentStatus = STATUS_OPTIONS.find(s => s.value === normalizedValue) ?? defaultStatus;\n  const Icon = currentStatus.icon;\n\n  const getLabel = (statusValue: string) => {\n    const normalized = normalizeStatus(statusValue);\n    switch (normalized) {\n      case 'completed': return translations.completed;\n      case 'in-progress': return translations.inProgress;\n      default: return translations.todo;\n    }\n  };\n\n  if (disabled || !onChange) {\n    return (\n      <div className=\"flex items-center gap-2\">\n        <Icon className={cn('w-4 h-4 flex-shrink-0', currentStatus.color)} />\n        <span className={cn('text-sm whitespace-nowrap', isDark ? 'text-white/60' : 'text-gray-500')}>\n          {getLabel(value)}\n        </span>\n      </div>\n    );\n  }\n\n  return (\n    <div ref={ref} className=\"relative\">\n      <button\n        onClick={(e) => {\n          e.stopPropagation();\n          setIsOpen(!isOpen);\n        }}\n        className={cn(\n          'flex items-center gap-2 px-2 py-1 rounded transition-colors',\n          isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100'\n        )}\n      >\n        <Icon className={cn('w-4 h-4 flex-shrink-0', currentStatus.color)} />\n        <span className={cn('text-sm whitespace-nowrap', isDark ? 'text-white/60' : 'text-gray-500')}>\n          {getLabel(value)}\n        </span>\n        <ChevronDown className={cn('w-3 h-3', isDark ? 'text-white/30' : 'text-gray-400')} />\n      </button>\n\n      {isOpen && (\n        <div\n          className={cn(\n            'absolute z-50 top-full left-0 mt-1 py-1 rounded-lg shadow-lg border min-w-[140px]',\n            isDark ? 'bg-[#1A1A1A] border-[#222]' : 'bg-white border-gray-200'\n          )}\n        >\n          {STATUS_OPTIONS.map((option) => {\n            const OptionIcon = option.icon;\n            return (\n              <button\n                key={option.value}\n                onClick={(e) => {\n                  e.stopPropagation();\n                  onChange(option.value);\n                  setIsOpen(false);\n                }}\n                className={cn(\n                  'w-full flex items-center gap-2 px-3 py-2 text-sm transition-colors',\n                  isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100',\n                  normalizedValue === option.value && (isDark ? 'bg-white/[0.03]' : 'bg-gray-50')\n                )}\n              >\n                <OptionIcon className={cn('w-4 h-4', option.color)} />\n                <span className={isDark ? 'text-white' : 'text-gray-900'}>\n                  {getLabel(option.value)}\n                </span>\n              </button>\n            );\n          })}\n        </div>\n      )}\n    </div>\n  );\n}\n","import { useLayoutEffect, useState, type RefObject } from 'react';\r\n\r\n/**\r\n * ═══ UN MENÚ SE ABRE HACIA DONDE CABE ══════════════════════════════════════\r\n *\r\n * Reportado con captura: en la ÚLTIMA fila de la Lista, el selector de\r\n * miembros se salía por debajo y lo tapaba la barra de totales. El menú\r\n * existía, pero para el usuario no.\r\n *\r\n * LA CAUSA, y la comparten NUEVE desplegables de las celdas: `top-full` ancla\r\n * el menú al borde inferior de la celda y lo extiende hacia abajo SIEMPRE, sin\r\n * mirar si cabe. En las filas de arriba no se nota; en la última, sí.\r\n *\r\n * ── POR QUÉ UN HOOK Y NO EL ARREGLO EN CADA CELDA ─────────────────────────\r\n *\r\n * Son nueve sitios. Copiar la medición nueve veces significa que la décima\r\n * celda que alguien escriba mañana volverá a nacer rota, y que corregir un\r\n * matiz obliga a tocar nueve ficheros. La causa es UNA.\r\n *\r\n * ── LO QUE DECIDE, Y LO QUE NO ────────────────────────────────────────────\r\n *\r\n * Devuelve `true` si el menú debe abrirse HACIA ARRIBA. Se prefiere abajo —es\r\n * el lado natural de un desplegable, y el que la gente espera— y sólo se\r\n * cambia cuando abajo NO cabe y arriba SÍ.\r\n *\r\n * Si no cabe por ninguno de los dos (una ventana muy baja), se queda abajo: al\r\n * menos la cabecera y el buscador quedan a la vista, y el scroll alcanza el\r\n * resto. Abrirlo arriba en ese caso lo dejaría igual de cortado, pero por el\r\n * otro extremo y sin su parte útil.\r\n *\r\n * ── POR QUÉ `useLayoutEffect` ─────────────────────────────────────────────\r\n *\r\n * Se mide sobre el layout ya hecho. Con `useEffect` se pintaría un fotograma\r\n * en el lado equivocado y se vería el salto.\r\n *\r\n * @param ancla   el elemento del que cuelga el menú (la celda o su botón)\r\n * @param abierto si el menú está abierto — sólo se mide al abrir\r\n * @param alto    la cota PEOR del menú, en px. No se mide el alto real: para\r\n *                medirlo habría que pintarlo antes, que es el fotograma que\r\n *                se quiere evitar.\r\n */\r\nexport function useLadoDelMenu(\r\n  ancla: RefObject<HTMLElement | null>,\r\n  abierto: boolean,\r\n  alto = 320,\r\n): boolean {\r\n  const [arriba, setArriba] = useState(false);\r\n\r\n  useLayoutEffect(() => {\r\n    if (!abierto) return;\r\n    const caja = ancla.current?.getBoundingClientRect();\r\n    if (!caja) return;\r\n\r\n    const AIRE = 12;\r\n    const cabeAbajo = caja.bottom + alto + AIRE <= window.innerHeight;\r\n    const cabeArriba = caja.top - alto - AIRE >= 0;\r\n\r\n    setArriba(!cabeAbajo && cabeArriba);\r\n  }, [abierto, alto, ancla]);\r\n\r\n  return arriba;\r\n}\r\n","/**\r\n * PriorityCell - Priority selector cell for ListView\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\n/* El menu se abre hacia donde cabe: en la ultima fila, `top-full` lo sacaba\r\n   fuera de la lista. La medicion vive en el hook — el mismo defecto lo tenian\r\n   nueve desplegables. */\r\nimport { useLadoDelMenu } from '../../../hooks/useLadoDelMenu';\r\nimport { Flag, ChevronDown } from 'lucide-react';\r\nimport { cn } from '../../../utils';\r\n\r\ninterface PriorityCellProps {\r\n  value?: string;\r\n  onChange?: (value: string) => void;\r\n  isDark: boolean;\r\n  locale: string;\r\n  disabled?: boolean;\r\n}\r\n\r\nconst PRIORITY_OPTIONS = [\r\n  { value: 'urgent', label: { en: 'Urgent', es: 'Urgente' }, color: 'text-[#FF2D20]', bg: 'bg-[#FF2D20]' },\r\n  { value: 'high', label: { en: 'High', es: 'Alta' }, color: 'text-[#FF2D20]', bg: 'bg-[#FF2D20]' },\r\n  { value: 'medium', label: { en: 'Medium', es: 'Media' }, color: 'text-[#FFD60A]', bg: 'bg-[#FFD60A]' },\r\n  { value: 'low', label: { en: 'Low', es: 'Baja' }, color: 'text-[#3B9EFF]', bg: 'bg-[#3B9EFF]' },\r\n  { value: 'none', label: { en: 'None', es: 'Ninguna' }, color: 'text-gray-400', bg: 'bg-gray-400' },\r\n];\r\n\r\nexport function PriorityCell({\r\n  value = 'none',\r\n  onChange,\r\n  isDark,\r\n  locale,\r\n  disabled = false,\r\n}: PriorityCellProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const ref = useRef<HTMLDivElement>(null);\r\n  const arriba = useLadoDelMenu(ref, isOpen, 180);\r\n\r\n  useEffect(() => {\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      if (ref.current && !ref.current.contains(e.target as Node)) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n    }\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  const currentPriority = PRIORITY_OPTIONS.find(p => p.value === value) ?? PRIORITY_OPTIONS[4]!;\r\n  const lang = locale === 'es' ? 'es' : 'en';\r\n\r\n  if (disabled || !onChange) {\r\n    return (\r\n      <div className=\"flex items-center gap-2\">\r\n        <Flag className={cn('w-4 h-4', currentPriority.color)} />\r\n        <span className={cn('text-sm', isDark ? 'text-white/60' : 'text-gray-500')}>\r\n          {currentPriority.label[lang]}\r\n        </span>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <div ref={ref} className=\"relative\">\r\n      <button\r\n        onClick={(e) => {\r\n          e.stopPropagation();\r\n          setIsOpen(!isOpen);\r\n        }}\r\n        className={cn(\r\n          'flex items-center gap-2 px-2 py-1 rounded transition-colors',\r\n          isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100'\r\n        )}\r\n      >\r\n        <Flag className={cn('w-4 h-4', currentPriority.color)} />\r\n        <span className={cn('text-sm', isDark ? 'text-white/60' : 'text-gray-500')}>\r\n          {currentPriority.label[lang]}\r\n        </span>\r\n        <ChevronDown className={cn('w-3 h-3', isDark ? 'text-white/30' : 'text-gray-400')} />\r\n      </button>\r\n\r\n      {isOpen && (\r\n        <div\r\n          className={cn(\r\n            'absolute z-50 left-0 ' + (arriba ? 'bottom-full mb-1 ' : 'top-full mt-1 ') + 'py-1 rounded-lg shadow-lg border min-w-[120px]',\r\n            isDark ? 'bg-[#1A1A1A] border-[#222]' : 'bg-white border-gray-200'\r\n          )}\r\n        >\r\n          {PRIORITY_OPTIONS.map((option) => (\r\n            <button\r\n              key={option.value}\r\n              onClick={(e) => {\r\n                e.stopPropagation();\r\n                onChange(option.value);\r\n                setIsOpen(false);\r\n              }}\r\n              className={cn(\r\n                'w-full flex items-center gap-2 px-3 py-2 text-sm transition-colors',\r\n                isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100',\r\n                value === option.value && (isDark ? 'bg-white/[0.03]' : 'bg-gray-50')\r\n              )}\r\n            >\r\n              <div className={cn('w-2 h-2 rounded-full', option.bg)} />\r\n              <span className={isDark ? 'text-white' : 'text-gray-900'}>\r\n                {option.label[lang]}\r\n              </span>\r\n            </button>\r\n          ))}\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * AssigneesCell - User assignment cell for ListView\r\n * v2.0.0: Redesigned to match PulseTaskDrawer assignee picker\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\n/*\r\n * El menu se abre hacia donde cabe. La medicion vive en el hook porque el\r\n * mismo defecto lo tienen NUEVE desplegables de las celdas: copiarla aqui\r\n * significaria que la decima celda vuelve a nacer rota.\r\n */\r\nimport { useLadoDelMenu } from '../../../hooks/useLadoDelMenu';\r\nimport { User, Plus, X, Search } from 'lucide-react';\r\nimport { cn } from '../../../utils';\r\nimport type { AvailableUser } from '../types';\r\n\r\n// Local type that matches Task.assignees inline definition (includes avatar)\r\ninterface TaskAssignee {\r\n  name: string;\r\n  avatar?: string;\r\n  initials: string;\r\n  color: string;\r\n}\r\n\r\ninterface AssigneesCellProps {\r\n  value?: TaskAssignee[];\r\n  availableUsers?: AvailableUser[];\r\n  onChange?: (assignees: TaskAssignee[]) => void;\r\n  isDark: boolean;\r\n  locale: string;\r\n  disabled?: boolean;\r\n  /** @deprecated v2.0 — workload indicators removed to match drawer design */\r\n  showWorkloadIndicators?: boolean;\r\n}\r\n\r\nfunction getInitials(name: string): string {\r\n  return name\r\n    .split(' ')\r\n    .map(n => n[0])\r\n    .join('')\r\n    .toUpperCase()\r\n    .slice(0, 2);\r\n}\r\n\r\nfunction getAvatarColor(name: string): string {\r\n  const colors = [\r\n    'bg-[#00E5CC]', 'bg-green-500', 'bg-purple-500', 'bg-pink-500',\r\n    'bg-yellow-500', 'bg-red-500', 'bg-indigo-500', 'bg-[#00E5CC]'\r\n  ];\r\n  let hash = 0;\r\n  for (let i = 0; i < name.length; i++) {\r\n    hash = name.charCodeAt(i) + ((hash << 5) - hash);\r\n  }\r\n  return colors[Math.abs(hash) % colors.length] ?? 'bg-[#00E5CC]';\r\n}\r\n\r\nexport function AssigneesCell({\r\n  value = [],\r\n  availableUsers = [],\r\n  onChange,\r\n  isDark,\r\n  locale,\r\n  disabled = false,\r\n}: AssigneesCellProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n\r\n  const [search, setSearch] = useState('');\r\n  const ref = useRef<HTMLDivElement>(null);\r\n  const searchInputRef = useRef<HTMLInputElement>(null);\r\n  const arriba = useLadoDelMenu(ref, isOpen);\r\n\r\n  useEffect(() => {\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      if (ref.current && !ref.current.contains(e.target as Node)) {\r\n        setIsOpen(false);\r\n        setSearch('');\r\n      }\r\n    };\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n    }\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  // Auto-focus search on open\r\n  useEffect(() => {\r\n    if (isOpen && searchInputRef.current) {\r\n      searchInputRef.current.focus();\r\n    }\r\n  }, [isOpen]);\r\n\r\n  const filteredUsers = availableUsers.filter(u =>\r\n    u.name.toLowerCase().includes(search.toLowerCase())\r\n  );\r\n\r\n  // Check if user is assigned by name (since Assignee type uses name, not id)\r\n  const isAssigned = (userName: string) => value.some(a => a.name === userName);\r\n\r\n  const handleToggleUser = (user: AvailableUser) => {\r\n    if (!onChange) return;\r\n\r\n    if (isAssigned(user.name)) {\r\n      onChange(value.filter(a => a.name !== user.name));\r\n    } else {\r\n      const newAssignee: TaskAssignee = {\r\n        name: user.name,\r\n        initials: getInitials(user.name),\r\n        color: user.color || getAvatarColor(user.name).replace('bg-', '').replace('-500', ''),\r\n        avatar: user.avatarUrl,\r\n        id: user.id,\r\n      } as any;\r\n      onChange([...value, newAssignee]);\r\n    }\r\n    setIsOpen(false);\r\n    setSearch('');\r\n  };\r\n\r\n  // Display mode (no onChange or disabled)\r\n  if (disabled || !onChange) {\r\n    if (value.length === 0) {\r\n      return (\r\n        <span className={cn('text-sm', isDark ? 'text-white/30' : 'text-gray-400')}>\r\n          -\r\n        </span>\r\n      );\r\n    }\r\n\r\n    return (\r\n      <div className=\"flex items-center -space-x-2\">\r\n        {value.slice(0, 3).map((assignee, idx) => (\r\n          <div\r\n            key={`${assignee.name}-${idx}`}\r\n            className={cn(\r\n              'w-7 h-7 rounded-full flex items-center justify-center text-xs font-medium text-white border-2',\r\n              isDark ? 'border-[#0D0D0D]' : 'border-white',\r\n              !assignee.avatar && getAvatarColor(assignee.name)\r\n            )}\r\n            style={assignee.color && !assignee.avatar ? { backgroundColor: assignee.color } : undefined}\r\n            title={assignee.name}\r\n          >\r\n            {assignee.avatar ? (\r\n              <img src={assignee.avatar} alt={assignee.name} className=\"w-full h-full rounded-full object-cover\" />\r\n            ) : (\r\n              assignee.initials || getInitials(assignee.name)\r\n            )}\r\n          </div>\r\n        ))}\r\n        {value.length > 3 && (\r\n          <div\r\n            className={cn(\r\n              'w-7 h-7 rounded-full flex items-center justify-center text-xs font-medium border-2',\r\n              isDark ? 'bg-[#1A1A1A] border-[#0D0D0D] text-white' : 'bg-gray-200 border-white text-gray-600'\r\n            )}\r\n          >\r\n            +{value.length - 3}\r\n          </div>\r\n        )}\r\n      </div>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <div ref={ref} className=\"relative\">\r\n      <button\r\n        onClick={(e) => {\r\n          e.stopPropagation();\r\n          setIsOpen(!isOpen);\r\n        }}\r\n        className={cn(\r\n          'flex items-center gap-1 px-2 py-1 rounded transition-colors',\r\n          isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100'\r\n        )}\r\n      >\r\n        {value.length === 0 ? (\r\n          <>\r\n            <User className={cn('w-4 h-4', isDark ? 'text-white/30' : 'text-gray-400')} />\r\n            <Plus className={cn('w-3 h-3', isDark ? 'text-white/30' : 'text-gray-400')} />\r\n          </>\r\n        ) : (\r\n          <div className=\"flex items-center -space-x-1\">\r\n            {value.slice(0, 2).map((assignee, idx) => (\r\n              <div\r\n                key={`${assignee.name}-${idx}`}\r\n                className={cn(\r\n                  'w-6 h-6 rounded-full flex items-center justify-center text-[10px] font-medium text-white border',\r\n                  isDark ? 'border-[#0D0D0D]' : 'border-white',\r\n                  !assignee.avatar && getAvatarColor(assignee.name)\r\n                )}\r\n                style={assignee.color && !assignee.avatar ? { backgroundColor: assignee.color } : undefined}\r\n              >\r\n                {assignee.avatar ? (\r\n                  <img src={assignee.avatar} alt={assignee.name} className=\"w-full h-full rounded-full object-cover\" />\r\n                ) : (\r\n                  assignee.initials || getInitials(assignee.name)\r\n                )}\r\n              </div>\r\n            ))}\r\n            {value.length > 2 && (\r\n              <span className={cn('text-xs ml-1', isDark ? 'text-white/60' : 'text-gray-500')}>\r\n                +{value.length - 2}\r\n              </span>\r\n            )}\r\n          </div>\r\n        )}\r\n      </button>\r\n\r\n      {isOpen && (\r\n        <div\r\n          className={cn(\r\n            'absolute z-50 left-0 rounded-lg overflow-hidden',\r\n            arriba ? 'bottom-full mb-1.5' : 'top-full mt-1.5',\r\n          )}\r\n          style={{\r\n            width: 260,\r\n            backgroundColor: isDark ? 'rgba(17, 17, 17, 0.98)' : 'rgba(255, 255, 255, 0.98)',\r\n            border: `1px solid ${isDark ? 'rgba(255,255,255,0.10)' : 'rgba(0,0,0,0.1)'}`,\r\n            boxShadow: isDark ? '0 8px 24px rgba(0,0,0,0.5)' : '0 8px 24px rgba(0,0,0,0.12)',\r\n          }}\r\n        >\r\n          {/* Search — icon + input inline */}\r\n          <div\r\n            className=\"flex items-center gap-1.5\"\r\n            style={{\r\n              padding: '8px 10px',\r\n              borderBottom: `1px solid ${isDark ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.06)'}`,\r\n            }}\r\n          >\r\n            <Search\r\n              className=\"flex-shrink-0\"\r\n              style={{\r\n                width: 14, height: 14,\r\n                color: isDark ? 'rgba(255,255,255,0.20)' : '#94A3B8',\r\n              }}\r\n            />\r\n            <input\r\n              ref={searchInputRef}\r\n              type=\"text\"\r\n              value={search}\r\n              onChange={(e) => setSearch(e.target.value)}\r\n              placeholder={locale === 'es' ? 'Buscar miembros...' : 'Search members...'}\r\n              onClick={(e) => e.stopPropagation()}\r\n              style={{\r\n                flex: 1,\r\n                fontSize: 12,\r\n                color: isDark ? 'rgba(255,255,255,0.92)' : '#0F172A',\r\n                backgroundColor: 'transparent',\r\n                border: 'none',\r\n                outline: 'none',\r\n                fontFamily: 'Inter, sans-serif',\r\n              }}\r\n            />\r\n          </div>\r\n\r\n          {/* Selected chips */}\r\n          {value.length > 0 && (\r\n            <div\r\n              className=\"flex flex-wrap gap-1\"\r\n              style={{\r\n                padding: '6px 10px',\r\n                borderBottom: `1px solid ${isDark ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.06)'}`,\r\n              }}\r\n            >\r\n              {value.map((assignee, idx) => (\r\n                <span\r\n                  key={`${assignee.name}-${idx}`}\r\n                  className=\"flex items-center gap-1\"\r\n                  style={{\r\n                    fontSize: 11,\r\n                    padding: '2px 6px 2px 4px',\r\n                    borderRadius: 4,\r\n                    backgroundColor: assignee.color ? `${assignee.color}20` : (isDark ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.06)'),\r\n                    color: assignee.color || (isDark ? '#fff' : '#334155'),\r\n                  }}\r\n                >\r\n                  <span\r\n                    className=\"flex items-center justify-center\"\r\n                    style={{\r\n                      width: 16, height: 16, borderRadius: '50%',\r\n                      backgroundColor: assignee.color || (isDark ? '#00E5CC' : '#00E5CC'),\r\n                      fontSize: 8, fontWeight: 700, color: '#fff',\r\n                    }}\r\n                  >\r\n                    {assignee.avatar ? (\r\n                      <img src={assignee.avatar} alt={assignee.name} className=\"w-full h-full rounded-full object-cover\" />\r\n                    ) : (\r\n                      assignee.initials || getInitials(assignee.name)\r\n                    )}\r\n                  </span>\r\n                  {assignee.name.split(' ')[0]}\r\n                  <button\r\n                    onClick={(e) => {\r\n                      e.stopPropagation();\r\n                      onChange(value.filter(a => a.name !== assignee.name));\r\n                    }}\r\n                    className=\"flex items-center justify-center\"\r\n                    style={{\r\n                      width: 14, height: 14, borderRadius: 3,\r\n                      border: 'none', background: 'transparent',\r\n                      color: 'inherit', cursor: 'pointer', opacity: 0.7,\r\n                    }}\r\n                  >\r\n                    <X style={{ width: 10, height: 10 }} />\r\n                  </button>\r\n                </span>\r\n              ))}\r\n            </div>\r\n          )}\r\n\r\n          {/* User list */}\r\n          <div style={{ maxHeight: 200, overflowY: 'auto', padding: 4 }}>\r\n            {filteredUsers.length === 0 ? (\r\n              <div\r\n                style={{\r\n                  padding: '12px 10px',\r\n                  fontSize: 12,\r\n                  color: isDark ? 'rgba(255,255,255,0.35)' : '#94A3B8',\r\n                  textAlign: 'center',\r\n                }}\r\n              >\r\n                {locale === 'es' ? 'No se encontraron miembros' : 'No members found'}\r\n              </div>\r\n            ) : (\r\n              filteredUsers.map((user) => {\r\n                const assigned = isAssigned(user.name);\r\n                return (\r\n                  <button\r\n                    key={user.id}\r\n                    onClick={(e) => {\r\n                      e.stopPropagation();\r\n                      handleToggleUser(user);\r\n                    }}\r\n                    className=\"flex items-center w-full\"\r\n                    style={{\r\n                      gap: 8,\r\n                      padding: '6px 10px',\r\n                      borderRadius: 4,\r\n                      border: 'none',\r\n                      cursor: 'pointer',\r\n                      backgroundColor: assigned\r\n                        ? (isDark ? 'rgba(0, 229, 204, 0.12)' : 'rgba(0, 229, 204, 0.08)')\r\n                        : 'transparent',\r\n                      color: isDark ? 'rgba(255,255,255,0.92)' : '#0F172A',\r\n                      fontSize: 12,\r\n                      textAlign: 'left' as const,\r\n                      transition: 'background-color 0.1s',\r\n                    }}\r\n                    onMouseEnter={e => {\r\n                      if (!assigned) e.currentTarget.style.backgroundColor = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.04)';\r\n                    }}\r\n                    onMouseLeave={e => {\r\n                      if (!assigned) e.currentTarget.style.backgroundColor = 'transparent';\r\n                    }}\r\n                  >\r\n                    <div\r\n                      className=\"flex items-center justify-center flex-shrink-0\"\r\n                      style={{\r\n                        width: 24, height: 24, borderRadius: '50%',\r\n                        backgroundColor: user.color || '#00E5CC',\r\n                        fontSize: 9, fontWeight: 700, color: '#fff',\r\n                      }}\r\n                    >\r\n                      {user.avatarUrl ? (\r\n                        <img src={user.avatarUrl} alt={user.name} className=\"w-full h-full rounded-full object-cover\" />\r\n                      ) : (\r\n                        getInitials(user.name)\r\n                      )}\r\n                    </div>\r\n                    <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\r\n                      {user.name}\r\n                    </span>\r\n                    {assigned && (\r\n                      <div\r\n                        className=\"flex items-center justify-center\"\r\n                        style={{\r\n                          width: 16, height: 16, borderRadius: 4,\r\n                          backgroundColor: 'rgba(96, 165, 250, 0.2)',\r\n                        }}\r\n                      >\r\n                        <div style={{ width: 8, height: 8, borderRadius: 2, backgroundColor: '#60A5FA' }} />\r\n                      </div>\r\n                    )}\r\n                  </button>\r\n                );\r\n              })\r\n            )}\r\n          </div>\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * DateRangePicker - Enhanced date picker with quick options\r\n * Matches the style from TaskDetailModal\r\n * Can be used for single date or date range selection\r\n */\r\n\r\nimport { useState, useRef, useEffect, useLayoutEffect, useCallback } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { Calendar, X, ChevronLeft, ChevronRight } from 'lucide-react';\r\nimport { cn } from '../../../utils';\r\n\r\nexport interface DateRangePickerProps {\r\n  /** Start date value */\r\n  startDate?: Date | string | null;\r\n  /** End date value (optional - for range mode) */\r\n  endDate?: Date | string | null;\r\n  /** Called when dates change */\r\n  onChange: (startDate: Date | undefined, endDate: Date | undefined) => void;\r\n  /** Single date mode - only select one date */\r\n  singleDateMode?: boolean;\r\n  /** Which date to select in single mode: 'start' | 'end' */\r\n  singleDateField?: 'start' | 'end';\r\n  isDark: boolean;\r\n  locale: string;\r\n  disabled?: boolean;\r\n  /** Placeholder text when no date selected */\r\n  placeholder?: string;\r\n}\r\n\r\nexport function DateRangePicker({\r\n  startDate,\r\n  endDate,\r\n  onChange,\r\n  singleDateMode = false,\r\n  singleDateField = 'end',\r\n  isDark,\r\n  locale,\r\n  disabled = false,\r\n  placeholder,\r\n}: DateRangePickerProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const [selectingField, setSelectingField] = useState<'start' | 'end'>(singleDateField);\r\n  const [viewMonth, setViewMonth] = useState(() => {\r\n    const dateToUse = singleDateField === 'start' ? startDate : endDate;\r\n    if (dateToUse) {\r\n      const d = dateToUse instanceof Date ? dateToUse : new Date(dateToUse);\r\n      return new Date(d.getFullYear(), d.getMonth(), 1);\r\n    }\r\n    return new Date(new Date().getFullYear(), new Date().getMonth(), 1);\r\n  });\r\n  const ref = useRef<HTMLDivElement>(null);\r\n  const triggerRef = useRef<HTMLButtonElement>(null);\r\n  const popupRef = useRef<HTMLDivElement>(null);\r\n  // v1.8.1 — anchor-based fixed positioning for the popup. Without this,\r\n  // the dropdown was a child of the table cell and got clipped (or pushed\r\n  // off-screen) when the cell sat near the right or bottom edge of the\r\n  // viewport. Now we portal it to <body> and place it relative to the\r\n  // trigger's bounding rect, flipping above/right when there's no room.\r\n  const [pos, setPos] = useState<{ top: number; left: number; flipUp: boolean } | null>(null);\r\n\r\n  const startDateValue = startDate ? (startDate instanceof Date ? startDate : new Date(startDate)) : null;\r\n  const endDateValue = endDate ? (endDate instanceof Date ? endDate : new Date(endDate)) : null;\r\n\r\n  // Close on outside click — must consider the portaled popup since it\r\n  // lives outside `ref`'s subtree.\r\n  useEffect(() => {\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      const target = e.target as Node;\r\n      if (ref.current && ref.current.contains(target)) return;\r\n      if (popupRef.current && popupRef.current.contains(target)) return;\r\n      setIsOpen(false);\r\n    };\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n    }\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  // Compute popup position when open. Re-runs on scroll/resize so the popup\r\n  // tracks the trigger if the user scrolls the table while it's open.\r\n  useLayoutEffect(() => {\r\n    if (!isOpen) {\r\n      setPos(null);\r\n      return;\r\n    }\r\n    const place = () => {\r\n      const rect = triggerRef.current?.getBoundingClientRect();\r\n      if (!rect) return;\r\n      // The popup is a 2-pane layout (sidebar + calendar). Width ~520px\r\n      // covers the typical layout; height ~360px (six week-rows + header).\r\n      const POPUP_WIDTH = 520;\r\n      const POPUP_HEIGHT = 360;\r\n      const spaceBelow = window.innerHeight - rect.bottom;\r\n      const flipUp = spaceBelow < POPUP_HEIGHT && rect.top > spaceBelow;\r\n      const top = flipUp ? rect.top - 4 : rect.bottom + 4;\r\n      // Clamp horizontally so the popup never escapes the viewport.\r\n      const left = Math.min(\r\n        Math.max(rect.left, 8),\r\n        window.innerWidth - POPUP_WIDTH - 8,\r\n      );\r\n      setPos({ top, left, flipUp });\r\n    };\r\n    place();\r\n    window.addEventListener('scroll', place, true);\r\n    window.addEventListener('resize', place);\r\n    return () => {\r\n      window.removeEventListener('scroll', place, true);\r\n      window.removeEventListener('resize', place);\r\n    };\r\n  }, [isOpen]);\r\n\r\n  // Reset selecting field when opening\r\n  useEffect(() => {\r\n    if (isOpen) {\r\n      setSelectingField(singleDateMode ? singleDateField : 'start');\r\n    }\r\n  }, [isOpen, singleDateMode, singleDateField]);\r\n\r\n  const formatDate = (date: Date | null) => {\r\n    if (!date) return placeholder || '-';\r\n    return date.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', {\r\n      day: 'numeric',\r\n      month: 'short',\r\n    });\r\n  };\r\n\r\n  // Generate calendar days\r\n  const getCalendarDays = useCallback(() => {\r\n    const year = viewMonth.getFullYear();\r\n    const month = viewMonth.getMonth();\r\n    const firstDay = new Date(year, month, 1);\r\n    const lastDay = new Date(year, month + 1, 0);\r\n    const daysInMonth = lastDay.getDate();\r\n    const startDayOfWeek = firstDay.getDay();\r\n\r\n    const days: { date: Date; isCurrentMonth: boolean }[] = [];\r\n\r\n    // Previous month days\r\n    const prevMonth = new Date(year, month, 0);\r\n    const prevMonthDays = prevMonth.getDate();\r\n    for (let i = startDayOfWeek - 1; i >= 0; i--) {\r\n      days.push({\r\n        date: new Date(year, month - 1, prevMonthDays - i),\r\n        isCurrentMonth: false,\r\n      });\r\n    }\r\n\r\n    // Current month days\r\n    for (let day = 1; day <= daysInMonth; day++) {\r\n      days.push({\r\n        date: new Date(year, month, day),\r\n        isCurrentMonth: true,\r\n      });\r\n    }\r\n\r\n    // Next month days to fill grid\r\n    const remainingDays = 42 - days.length;\r\n    for (let i = 1; i <= remainingDays; i++) {\r\n      days.push({\r\n        date: new Date(year, month + 1, i),\r\n        isCurrentMonth: false,\r\n      });\r\n    }\r\n\r\n    return days;\r\n  }, [viewMonth]);\r\n\r\n  // Handle date selection\r\n  const handleDateSelect = (date: Date) => {\r\n    if (singleDateMode) {\r\n      if (singleDateField === 'start') {\r\n        onChange(date, endDateValue || undefined);\r\n      } else {\r\n        onChange(startDateValue || undefined, date);\r\n      }\r\n      setIsOpen(false);\r\n    } else {\r\n      if (selectingField === 'start') {\r\n        const newEndDate = endDateValue && date > endDateValue ? date : endDateValue;\r\n        onChange(date, newEndDate || undefined);\r\n        setSelectingField('end');\r\n      } else {\r\n        const newStartDate = startDateValue && date < startDateValue ? date : startDateValue;\r\n        onChange(newStartDate || undefined, date);\r\n        setIsOpen(false);\r\n      }\r\n    }\r\n  };\r\n\r\n  // Quick date options\r\n  const getQuickOptions = () => {\r\n    const today = new Date();\r\n    const tomorrow = new Date(today);\r\n    tomorrow.setDate(today.getDate() + 1);\r\n    const nextSaturday = new Date(today);\r\n    nextSaturday.setDate(today.getDate() + ((6 - today.getDay() + 7) % 7 || 7));\r\n    const nextMonday = new Date(today);\r\n    nextMonday.setDate(today.getDate() + ((1 - today.getDay() + 7) % 7 || 7));\r\n    const nextWeekend = new Date(today);\r\n    nextWeekend.setDate(today.getDate() + ((6 - today.getDay() + 7) % 7) + 7);\r\n    const twoWeeks = new Date(today);\r\n    twoWeeks.setDate(today.getDate() + 14);\r\n    const fourWeeks = new Date(today);\r\n    fourWeeks.setDate(today.getDate() + 28);\r\n\r\n    return [\r\n      {\r\n        label: locale === 'es' ? 'Hoy' : 'Today',\r\n        date: today,\r\n        display: today.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { weekday: 'short' }).slice(0, 3) + '.',\r\n      },\r\n      {\r\n        label: locale === 'es' ? 'Mañana' : 'Tomorrow',\r\n        date: tomorrow,\r\n        display: tomorrow.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { weekday: 'short' }).slice(0, 3) + '.',\r\n      },\r\n      {\r\n        label: locale === 'es' ? 'Este fin de semana' : 'This weekend',\r\n        date: nextSaturday,\r\n        display: locale === 'es' ? 'sáb.' : 'sat.',\r\n      },\r\n      {\r\n        label: locale === 'es' ? 'Próxima semana' : 'Next week',\r\n        date: nextMonday,\r\n        display: locale === 'es' ? 'lun.' : 'mon.',\r\n      },\r\n      {\r\n        label: locale === 'es' ? 'Próximo fin de semana' : 'Next weekend',\r\n        date: nextWeekend,\r\n        display: nextWeekend.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { day: 'numeric', month: 'short' }),\r\n      },\r\n      {\r\n        label: locale === 'es' ? '2 semanas' : '2 weeks',\r\n        date: twoWeeks,\r\n        display: twoWeeks.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { day: 'numeric', month: 'short' }),\r\n      },\r\n      {\r\n        label: locale === 'es' ? '4 semanas' : '4 weeks',\r\n        date: fourWeeks,\r\n        display: fourWeeks.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { day: 'numeric', month: 'short' }),\r\n      },\r\n    ];\r\n  };\r\n\r\n  // Read-only mode\r\n  if (disabled) {\r\n    const displayDate = singleDateMode\r\n      ? (singleDateField === 'start' ? startDateValue : endDateValue)\r\n      : endDateValue;\r\n    return (\r\n      <div className=\"flex items-center gap-2\">\r\n        <Calendar className={cn('w-4 h-4', isDark ? 'text-white/30' : 'text-gray-400')} />\r\n        <span className={cn('text-sm', isDark ? 'text-white/60' : 'text-gray-500')}>\r\n          {formatDate(displayDate)}\r\n        </span>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  const displayDate = singleDateMode\r\n    ? (singleDateField === 'start' ? startDateValue : endDateValue)\r\n    : endDateValue;\r\n\r\n  return (\r\n    <div ref={ref} className=\"relative\">\r\n      {/* Trigger Button */}\r\n      <button\r\n        ref={triggerRef}\r\n        onClick={(e) => {\r\n          e.stopPropagation();\r\n          setIsOpen(!isOpen);\r\n          // Reset view month to selected date\r\n          const dateToShow = singleDateField === 'start' ? startDateValue : endDateValue;\r\n          if (dateToShow) {\r\n            setViewMonth(new Date(dateToShow.getFullYear(), dateToShow.getMonth(), 1));\r\n          }\r\n        }}\r\n        className={cn(\r\n          'flex items-center gap-2 px-2 py-1 rounded transition-colors',\r\n          isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100'\r\n        )}\r\n      >\r\n        <Calendar className={cn('w-4 h-4', isDark ? 'text-white/30' : 'text-gray-400')} />\r\n        <span className={cn('text-sm', isDark ? 'text-white/60' : 'text-gray-500')}>\r\n          {formatDate(displayDate)}\r\n        </span>\r\n      </button>\r\n\r\n      {/* Dropdown — portaled to <body> with anchor-based positioning so it\r\n          escapes the table's overflow clipping and flips when near edges. */}\r\n      {isOpen && pos && createPortal(\r\n        <div\r\n          ref={popupRef}\r\n          className={cn(\r\n            'rounded-xl shadow-2xl overflow-hidden flex',\r\n            isDark ? 'bg-[#1A1A1A] border border-[#222]' : 'bg-white border border-gray-200'\r\n          )}\r\n          style={{\r\n            position: 'fixed',\r\n            top: pos.flipUp ? undefined : pos.top,\r\n            bottom: pos.flipUp ? window.innerHeight - pos.top : undefined,\r\n            left: pos.left,\r\n            zIndex: 10001,\r\n          }}\r\n          onClick={(e) => e.stopPropagation()}\r\n        >\r\n            {/* Quick Options - Left Side */}\r\n            <div className={cn('w-44 py-2 border-r', isDark ? 'border-[#222]' : 'border-gray-200')}>\r\n              {getQuickOptions().map((option, i) => (\r\n                <button\r\n                  key={i}\r\n                  className={cn(\r\n                    'w-full flex items-center justify-between px-3 py-2 text-sm transition-colors',\r\n                    isDark ? 'hover:bg-white/[0.05] text-white' : 'hover:bg-gray-50 text-gray-900'\r\n                  )}\r\n                  onClick={() => handleDateSelect(option.date)}\r\n                >\r\n                  <span>{option.label}</span>\r\n                  <span className={cn('text-xs', isDark ? 'text-white/30' : 'text-gray-400')}>\r\n                    {option.display}\r\n                  </span>\r\n                </button>\r\n              ))}\r\n\r\n              {/* Clear date button */}\r\n              <div className={cn('border-t mt-2 pt-2', isDark ? 'border-[#222]' : 'border-gray-200')}>\r\n                <button\r\n                  onClick={() => {\r\n                    if (singleDateMode) {\r\n                      if (singleDateField === 'start') {\r\n                        onChange(undefined, endDateValue || undefined);\r\n                      } else {\r\n                        onChange(startDateValue || undefined, undefined);\r\n                      }\r\n                    } else {\r\n                      onChange(undefined, undefined);\r\n                    }\r\n                    setIsOpen(false);\r\n                  }}\r\n                  className={cn(\r\n                    'w-full flex items-center justify-between px-3 py-2 text-sm transition-colors',\r\n                    isDark ? 'hover:bg-white/[0.05] text-red-400' : 'hover:bg-gray-50 text-red-500'\r\n                  )}\r\n                >\r\n                  <span>{locale === 'es' ? 'Quitar fecha' : 'Clear date'}</span>\r\n                  <X className=\"w-4 h-4 opacity-50\" />\r\n                </button>\r\n              </div>\r\n            </div>\r\n\r\n            {/* Calendar - Right Side */}\r\n            <div className=\"p-4\">\r\n              {/* Selection indicator (only in range mode) */}\r\n              {!singleDateMode && (\r\n                <div className={cn('text-xs mb-3 px-2 py-1 rounded', isDark ? 'bg-white/[0.03] text-white/60' : 'bg-gray-100 text-gray-600')}>\r\n                  {selectingField === 'start'\r\n                    ? (locale === 'es' ? '📅 Selecciona fecha de inicio' : '📅 Select start date')\r\n                    : (locale === 'es' ? '📅 Selecciona fecha de fin' : '📅 Select end date')}\r\n                </div>\r\n              )}\r\n\r\n              {/* Month Header */}\r\n              <div className=\"flex items-center justify-between mb-4\">\r\n                <span className={cn('font-medium', isDark ? 'text-white' : 'text-gray-900')}>\r\n                  {viewMonth.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { month: 'long', year: 'numeric' })}\r\n                </span>\r\n                <div className=\"flex items-center gap-1\">\r\n                  <button\r\n                    onClick={() => setViewMonth(new Date())}\r\n                    className={cn(\r\n                      'p-1 rounded text-sm transition-colors',\r\n                      isDark ? 'hover:bg-white/[0.05] text-white' : 'hover:bg-gray-100 text-gray-700'\r\n                    )}\r\n                  >\r\n                    {locale === 'es' ? 'Hoy' : 'Today'}\r\n                  </button>\r\n                  <button\r\n                    onClick={() => setViewMonth(new Date(viewMonth.getFullYear(), viewMonth.getMonth() - 1))}\r\n                    className={cn('p-1 rounded', isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100')}\r\n                  >\r\n                    <ChevronLeft className={cn('w-4 h-4', isDark ? 'text-white' : 'text-gray-600')} />\r\n                  </button>\r\n                  <button\r\n                    onClick={() => setViewMonth(new Date(viewMonth.getFullYear(), viewMonth.getMonth() + 1))}\r\n                    className={cn('p-1 rounded', isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100')}\r\n                  >\r\n                    <ChevronRight className={cn('w-4 h-4', isDark ? 'text-white' : 'text-gray-600')} />\r\n                  </button>\r\n                </div>\r\n              </div>\r\n\r\n              {/* Weekday Headers */}\r\n              <div className=\"grid grid-cols-7 gap-1 mb-2\">\r\n                {(locale === 'es'\r\n                  ? ['do', 'lu', 'ma', 'mi', 'ju', 'vi', 'sá']\r\n                  : ['su', 'mo', 'tu', 'we', 'th', 'fr', 'sa']\r\n                ).map((day) => (\r\n                  <div\r\n                    key={day}\r\n                    className={cn('w-8 h-8 flex items-center justify-center text-xs', isDark ? 'text-white/30' : 'text-gray-400')}\r\n                  >\r\n                    {day}\r\n                  </div>\r\n                ))}\r\n              </div>\r\n\r\n              {/* Calendar Days */}\r\n              <div className=\"grid grid-cols-7 gap-1\">\r\n                {getCalendarDays().map((d, i) => {\r\n                  const isToday = d.date.toDateString() === new Date().toDateString();\r\n                  const isStartDate = startDateValue?.toDateString() === d.date.toDateString();\r\n                  const isEndDate = endDateValue?.toDateString() === d.date.toDateString();\r\n                  const isSelected = isStartDate || isEndDate;\r\n                  const isInRange = !singleDateMode && startDateValue && endDateValue &&\r\n                    d.date >= startDateValue && d.date <= endDateValue;\r\n\r\n                  return (\r\n                    <button\r\n                      key={i}\r\n                      onClick={() => handleDateSelect(new Date(d.date))}\r\n                      className={cn(\r\n                        'w-8 h-8 rounded-full flex items-center justify-center text-sm transition-colors',\r\n                        !d.isCurrentMonth && (isDark ? 'text-white/20' : 'text-gray-300'),\r\n                        d.isCurrentMonth && (isDark ? 'text-white' : 'text-gray-900'),\r\n                        isToday && 'ring-2 ring-[#00E5CC]',\r\n                        isStartDate && 'bg-[#00E5CC] text-white',\r\n                        isEndDate && !isStartDate && 'bg-[#7C3AED] text-white',\r\n                        isInRange && !isSelected && (isDark ? 'bg-[#7C3AED]/20' : 'bg-purple-100'),\r\n                        !isSelected && (isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100')\r\n                      )}\r\n                    >\r\n                      {d.date.getDate()}\r\n                    </button>\r\n                  );\r\n                })}\r\n              </div>\r\n            </div>\r\n        </div>,\r\n        document.body,\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\n * DateCell - Date picker cell for ListView\n * v1.3.0: Refactored to use DateRangePicker for enhanced UI\n */\n\nimport { DateRangePicker } from './DateRangePicker';\n\ninterface DateCellProps {\n  value?: Date | string;\n  onChange?: (value: Date | undefined) => void;\n  isDark: boolean;\n  locale: string;\n  disabled?: boolean;\n  /** Which field this cell represents: 'start' | 'end' */\n  dateField?: 'start' | 'end';\n  /** Start date (for range display context) */\n  startDate?: Date | string | null;\n  /** End date (for range display context) */\n  endDate?: Date | string | null;\n}\n\nexport function DateCell({\n  value,\n  onChange,\n  isDark,\n  locale,\n  disabled = false,\n  dateField = 'end',\n  startDate,\n  endDate,\n}: DateCellProps) {\n  // Convert value to proper date\n  const dateValue = value ? (value instanceof Date ? value : new Date(value)) : null;\n\n  // Use provided start/end dates or default to the value\n  const effectiveStartDate = dateField === 'start' ? dateValue : (startDate || null);\n  const effectiveEndDate = dateField === 'end' ? dateValue : (endDate || null);\n\n  const handleChange = (newStart: Date | undefined, newEnd: Date | undefined) => {\n    if (!onChange) return;\n\n    // Return the date for the field this cell represents\n    if (dateField === 'start') {\n      onChange(newStart);\n    } else {\n      onChange(newEnd);\n    }\n  };\n\n  return (\n    <DateRangePicker\n      startDate={effectiveStartDate}\n      endDate={effectiveEndDate}\n      onChange={handleChange}\n      singleDateMode={true}\n      singleDateField={dateField}\n      isDark={isDark}\n      locale={locale}\n      disabled={disabled || !onChange}\n      placeholder=\"-\"\n    />\n  );\n}\n","/**\n * useMicroInteractions - Hook for cell-level micro-interactions\n *\n * Features:\n * - Flash green on save (visual feedback)\n * - Slot machine number animation\n * - Delayed checkbox confirmation\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\n/**\n * Flash effect for save confirmation\n * Shows a brief green flash when data is saved\n */\nexport function useSaveFlash(duration = 600) {\n  const [isFlashing, setIsFlashing] = useState(false);\n  const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  const triggerFlash = useCallback(() => {\n    // Clear any existing timeout\n    if (timeoutRef.current) {\n      clearTimeout(timeoutRef.current);\n    }\n\n    setIsFlashing(true);\n    timeoutRef.current = setTimeout(() => {\n      setIsFlashing(false);\n    }, duration);\n  }, [duration]);\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return () => {\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n      }\n    };\n  }, []);\n\n  return { isFlashing, triggerFlash };\n}\n\n/**\n * Slot machine animation for number changes\n * Animates through intermediate values when number changes\n */\nexport function useSlotMachine(\n  value: number | undefined,\n  options: {\n    enabled?: boolean;\n    duration?: number;\n    steps?: number;\n  } = {}\n) {\n  const { enabled = true, duration = 400, steps = 8 } = options;\n  const [displayValue, setDisplayValue] = useState(value);\n  const [isAnimating, setIsAnimating] = useState(false);\n  const previousValueRef = useRef(value);\n  const animationRef = useRef<ReturnType<typeof setTimeout>[]>([]);\n\n  useEffect(() => {\n    // Clear any pending animations\n    animationRef.current.forEach(clearTimeout);\n    animationRef.current = [];\n\n    if (!enabled || value === previousValueRef.current || value === undefined) {\n      setDisplayValue(value);\n      previousValueRef.current = value;\n      return;\n    }\n\n    const startValue = previousValueRef.current ?? 0;\n    const endValue = value;\n    const diff = endValue - startValue;\n    const stepDuration = duration / steps;\n\n    setIsAnimating(true);\n\n    // Animate through intermediate values\n    for (let i = 1; i <= steps; i++) {\n      const timeout = setTimeout(() => {\n        // Ease-out animation\n        const progress = i / steps;\n        const easedProgress = 1 - Math.pow(1 - progress, 3);\n        const intermediateValue = Math.round(startValue + diff * easedProgress);\n        setDisplayValue(intermediateValue);\n\n        if (i === steps) {\n          setIsAnimating(false);\n          setDisplayValue(endValue);\n        }\n      }, stepDuration * i);\n\n      animationRef.current.push(timeout);\n    }\n\n    previousValueRef.current = value;\n\n    return () => {\n      animationRef.current.forEach(clearTimeout);\n      animationRef.current = [];\n    };\n  }, [value, enabled, duration, steps]);\n\n  return { displayValue, isAnimating };\n}\n\n/**\n * Delayed checkbox confirmation\n * Shows intermediate state before committing the change\n */\nexport function useDelayedCheckbox(\n  onChange: ((value: boolean) => void) | undefined,\n  options: {\n    delay?: number;\n    onCancel?: () => void;\n  } = {}\n) {\n  const { delay = 1500, onCancel } = options;\n  const [pendingValue, setPendingValue] = useState<boolean | null>(null);\n  const [progress, setProgress] = useState(0);\n  const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n  const startChange = useCallback((newValue: boolean) => {\n    // Clear any existing timeout\n    if (timeoutRef.current) {\n      clearTimeout(timeoutRef.current);\n    }\n    if (intervalRef.current) {\n      clearInterval(intervalRef.current);\n    }\n\n    setPendingValue(newValue);\n    setProgress(0);\n\n    // Progress animation\n    const startTime = Date.now();\n    intervalRef.current = setInterval(() => {\n      const elapsed = Date.now() - startTime;\n      const newProgress = Math.min((elapsed / delay) * 100, 100);\n      setProgress(newProgress);\n    }, 16); // ~60fps\n\n    // Commit after delay\n    timeoutRef.current = setTimeout(() => {\n      if (intervalRef.current) {\n        clearInterval(intervalRef.current);\n      }\n      onChange?.(newValue);\n      setPendingValue(null);\n      setProgress(0);\n    }, delay);\n  }, [delay, onChange]);\n\n  const cancelChange = useCallback(() => {\n    if (timeoutRef.current) {\n      clearTimeout(timeoutRef.current);\n    }\n    if (intervalRef.current) {\n      clearInterval(intervalRef.current);\n    }\n    setPendingValue(null);\n    setProgress(0);\n    onCancel?.();\n  }, [onCancel]);\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return () => {\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n      }\n      if (intervalRef.current) {\n        clearInterval(intervalRef.current);\n      }\n    };\n  }, []);\n\n  const isPending = pendingValue !== null;\n\n  return {\n    pendingValue,\n    isPending,\n    progress,\n    startChange,\n    cancelChange,\n  };\n}\n\n/**\n * CSS class generator for flash animation\n */\nexport function getFlashClasses(isFlashing: boolean, isDark: boolean): string {\n  if (!isFlashing) return '';\n\n  return isDark\n    ? 'animate-flash-save-dark'\n    : 'animate-flash-save-light';\n}\n\n/**\n * CSS for flash animations (to be added to stylesheets)\n */\nexport const FLASH_ANIMATION_CSS = `\n@keyframes flash-save-dark {\n  0% { background-color: transparent; }\n  25% { background-color: rgba(34, 197, 94, 0.3); }\n  100% { background-color: transparent; }\n}\n\n@keyframes flash-save-light {\n  0% { background-color: transparent; }\n  25% { background-color: rgba(34, 197, 94, 0.2); }\n  100% { background-color: transparent; }\n}\n\n.animate-flash-save-dark {\n  animation: flash-save-dark 0.6s ease-out;\n}\n\n.animate-flash-save-light {\n  animation: flash-save-light 0.6s ease-out;\n}\n`;\n","/**\r\n * ProgressCell - Progress bar cell for ListView\r\n * v1.4.0: Added micro-interactions (slot machine animation, flash on save)\r\n * v2.5.0: Added inline numeric editing — click on percentage to type value\r\n */\r\n\r\nimport { useState, useRef, useEffect, useCallback } from 'react';\r\nimport { cn } from '../../../utils';\r\nimport { useSaveFlash, useSlotMachine } from '../../../hooks/useMicroInteractions';\r\n\r\ninterface ProgressCellProps {\r\n  value: number;\r\n  onChange?: (value: number) => void;\r\n  isDark: boolean;\r\n  disabled?: boolean;\r\n  /** Enable slot machine animation on value change */\r\n  enableSlotMachine?: boolean;\r\n  /** Enable flash green on save */\r\n  enableSaveFlash?: boolean;\r\n}\r\n\r\nexport function ProgressCell({\r\n  value = 0,\r\n  onChange,\r\n  isDark,\r\n  disabled = false,\r\n  enableSlotMachine = true,\r\n  enableSaveFlash = true,\r\n}: ProgressCellProps) {\r\n  const [isEditing, setIsEditing] = useState(false);\r\n  const [editValue, setEditValue] = useState('');\r\n  const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n  // Micro-interactions\r\n  const { isFlashing, triggerFlash } = useSaveFlash();\r\n  const { displayValue, isAnimating } = useSlotMachine(value, {\r\n    enabled: enableSlotMachine,\r\n    duration: 300,\r\n    steps: 6,\r\n  });\r\n\r\n  const handleBarClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n    if (disabled || !onChange) return;\r\n\r\n    e.stopPropagation();\r\n    const rect = e.currentTarget.getBoundingClientRect();\r\n    const x = e.clientX - rect.left;\r\n    const percentage = Math.round((x / rect.width) * 100);\r\n    const clampedValue = Math.max(0, Math.min(100, percentage));\r\n\r\n    if (clampedValue !== value) {\r\n      onChange(clampedValue);\r\n      if (enableSaveFlash) {\r\n        triggerFlash();\r\n      }\r\n    }\r\n  };\r\n\r\n  const handlePercentClick = useCallback((e: React.MouseEvent) => {\r\n    if (disabled || !onChange) return;\r\n    e.stopPropagation();\r\n    setEditValue(String(value));\r\n    setIsEditing(true);\r\n  }, [disabled, onChange, value]);\r\n\r\n  useEffect(() => {\r\n    if (isEditing && inputRef.current) {\r\n      inputRef.current.focus();\r\n      inputRef.current.select();\r\n    }\r\n  }, [isEditing]);\r\n\r\n  const commitEdit = useCallback(() => {\r\n    setIsEditing(false);\r\n    const num = parseInt(editValue, 10);\r\n    if (!isNaN(num) && onChange) {\r\n      const clamped = Math.max(0, Math.min(100, num));\r\n      if (clamped !== value) {\r\n        onChange(clamped);\r\n        if (enableSaveFlash) triggerFlash();\r\n      }\r\n    }\r\n  }, [editValue, onChange, value, enableSaveFlash, triggerFlash]);\r\n\r\n  const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n    if (e.key === 'Enter') commitEdit();\r\n    if (e.key === 'Escape') setIsEditing(false);\r\n  }, [commitEdit]);\r\n\r\n  // Use animated display value for the percentage\r\n  const displayPercent = displayValue ?? value;\r\n\r\n  return (\r\n    <div\r\n      className={cn(\r\n        \"flex items-center gap-2 w-full rounded px-1 py-0.5 transition-[background-color] duration-300\",\r\n        // Flash animation\r\n        isFlashing && (isDark ? 'bg-[#3BF06E]/30' : 'bg-[#3BF06E]/20')\r\n      )}\r\n    >\r\n      {/* v2.7.0 — Hide the empty grey bar when progress is 0 to reduce visual\r\n          saturation. The \"0%\" text (rendered below) with dimmed color already\r\n          communicates the state; the empty bar just adds noise. */}\r\n      {displayPercent > 0 ? (\r\n        <div\r\n          onClick={handleBarClick}\r\n          className={cn(\r\n            'flex-1 h-2 rounded-full overflow-hidden',\r\n            isDark ? 'bg-white/[0.05]' : 'bg-gray-200',\r\n            !disabled && onChange && 'cursor-pointer'\r\n          )}\r\n        >\r\n          <div\r\n            className={cn(\r\n              'h-full rounded-full transition-[width]',\r\n              displayPercent === 100 ? 'bg-[#3BF06E]' : 'bg-[#3B9EFF]',\r\n              isAnimating && 'transition-none'\r\n            )}\r\n            style={{ width: `${displayPercent}%` }}\r\n          />\r\n        </div>\r\n      ) : (\r\n        <div className=\"flex-1\" />\r\n      )}\r\n      {isEditing ? (\r\n        <div className=\"flex items-center gap-0.5\" onClick={e => e.stopPropagation()}>\r\n          <input\r\n            ref={inputRef}\r\n            value={editValue}\r\n            onChange={e => setEditValue(e.target.value.replace(/[^0-9]/g, ''))}\r\n            onBlur={commitEdit}\r\n            onKeyDown={handleKeyDown}\r\n            maxLength={3}\r\n            className={cn(\r\n              'w-8 text-xs text-right tabular-nums font-mono rounded border px-1 py-0 outline-none',\r\n              isDark\r\n                ? 'bg-white/10 border-white/20 text-white focus:border-[#00E5CC]'\r\n                : 'bg-white border-gray-300 text-gray-900 focus:border-[#00E5CC]'\r\n            )}\r\n          />\r\n          <span className={cn('text-xs font-mono', isDark ? 'text-white/40' : 'text-gray-400')}>%</span>\r\n        </div>\r\n      ) : (\r\n        <span\r\n          onClick={handlePercentClick}\r\n          className={cn(\r\n            'text-xs w-8 text-right tabular-nums font-mono rounded px-1',\r\n            // v2.7.0 — dim the \"0%\" label to signal inactive state; brighter for > 0\r\n            displayPercent === 0\r\n              ? (isDark ? 'text-[#6B7280]' : 'text-gray-400')\r\n              : (isDark ? 'text-white/60' : 'text-gray-500'),\r\n            !disabled && onChange && 'cursor-pointer hover:bg-white/[0.08]',\r\n            // Slot machine animation emphasis\r\n            isAnimating && 'font-medium scale-105'\r\n          )}\r\n          title={!disabled && onChange ? 'Click to edit' : undefined}\r\n        >\r\n          {displayPercent}%\r\n        </span>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * TextCell - Editable text cell for ListView\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\nimport { cn } from '../../../utils';\r\n\r\ninterface TextCellProps {\r\n  value?: string;\r\n  onChange?: (value: string) => void;\r\n  isDark: boolean;\r\n  placeholder?: string;\r\n  disabled?: boolean;\r\n}\r\n\r\nexport function TextCell({\r\n  value = '',\r\n  onChange,\r\n  isDark,\r\n  placeholder = '-',\r\n  disabled = false,\r\n}: TextCellProps) {\r\n  const [isEditing, setIsEditing] = useState(false);\r\n  const [editValue, setEditValue] = useState(value);\r\n  const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n  useEffect(() => {\r\n    if (isEditing && inputRef.current) {\r\n      inputRef.current.focus();\r\n      inputRef.current.select();\r\n    }\r\n  }, [isEditing]);\r\n\r\n  useEffect(() => {\r\n    setEditValue(value);\r\n  }, [value]);\r\n\r\n  const handleSave = () => {\r\n    if (editValue !== value) {\r\n      onChange?.(editValue);\r\n    }\r\n    setIsEditing(false);\r\n  };\r\n\r\n  const handleKeyDown = (e: React.KeyboardEvent) => {\r\n    if (e.key === 'Enter') {\r\n      handleSave();\r\n    } else if (e.key === 'Escape') {\r\n      setEditValue(value);\r\n      setIsEditing(false);\r\n    }\r\n  };\r\n\r\n  if (disabled || !onChange) {\r\n    return (\r\n      <span className={cn('text-sm truncate', isDark ? 'text-white/60' : 'text-gray-500')}>\r\n        {value || placeholder}\r\n      </span>\r\n    );\r\n  }\r\n\r\n  if (isEditing) {\r\n    return (\r\n      <input\r\n        ref={inputRef}\r\n        type=\"text\"\r\n        value={editValue}\r\n        onChange={(e) => setEditValue(e.target.value)}\r\n        onBlur={handleSave}\r\n        onKeyDown={handleKeyDown}\r\n        onClick={(e) => e.stopPropagation()}\r\n        className={cn(\r\n          'w-full px-2 py-1 text-sm rounded border outline-none',\r\n          isDark\r\n            ? 'bg-white/[0.03] border-[#00E5CC] text-white'\r\n            : 'bg-white border-[#00E5CC] text-gray-900'\r\n        )}\r\n      />\r\n    );\r\n  }\r\n\r\n  return (\r\n    <button\r\n      onClick={(e) => {\r\n        e.stopPropagation();\r\n        setIsEditing(true);\r\n      }}\r\n      className={cn(\r\n        'text-sm truncate text-left w-full px-2 py-1 rounded transition-colors',\r\n        isDark ? 'text-white/60 hover:bg-white/[0.05]' : 'text-gray-500 hover:bg-gray-100',\r\n        !value && (isDark ? 'text-white/30' : 'text-gray-400')\r\n      )}\r\n    >\r\n      {value || placeholder}\r\n    </button>\r\n  );\r\n}\r\n","/**\r\n * NumberCell - Editable number cell for ListView\r\n * v1.4.0: Added micro-interactions (slot machine, flash on save)\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\nimport { cn } from '../../../utils';\r\nimport { useSaveFlash, useSlotMachine } from '../../../hooks/useMicroInteractions';\r\n\r\ninterface NumberCellProps {\r\n  value?: number;\r\n  onChange?: (value: number) => void;\r\n  isDark: boolean;\r\n  placeholder?: string;\r\n  min?: number;\r\n  max?: number;\r\n  disabled?: boolean;\r\n  /** Enable slot machine animation on value change */\r\n  enableSlotMachine?: boolean;\r\n  /** Enable flash green on save */\r\n  enableSaveFlash?: boolean;\r\n}\r\n\r\nexport function NumberCell({\r\n  value,\r\n  onChange,\r\n  isDark,\r\n  placeholder = '-',\r\n  min,\r\n  max,\r\n  disabled = false,\r\n  enableSlotMachine = true,\r\n  enableSaveFlash = true,\r\n}: NumberCellProps) {\r\n  const [isEditing, setIsEditing] = useState(false);\r\n  const [editValue, setEditValue] = useState(value?.toString() || '');\r\n  const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n  // Micro-interactions\r\n  const { isFlashing, triggerFlash } = useSaveFlash();\r\n  const { displayValue, isAnimating } = useSlotMachine(value, {\r\n    enabled: enableSlotMachine && !isEditing,\r\n  });\r\n\r\n  useEffect(() => {\r\n    if (isEditing && inputRef.current) {\r\n      inputRef.current.focus();\r\n      inputRef.current.select();\r\n    }\r\n  }, [isEditing]);\r\n\r\n  useEffect(() => {\r\n    setEditValue(value?.toString() || '');\r\n  }, [value]);\r\n\r\n  const handleSave = () => {\r\n    const numValue = parseFloat(editValue);\r\n    if (!isNaN(numValue)) {\r\n      let finalValue = numValue;\r\n      if (min !== undefined) finalValue = Math.max(min, finalValue);\r\n      if (max !== undefined) finalValue = Math.min(max, finalValue);\r\n      if (finalValue !== value) {\r\n        onChange?.(finalValue);\r\n        // Trigger flash after save\r\n        if (enableSaveFlash) {\r\n          triggerFlash();\r\n        }\r\n      }\r\n    }\r\n    setIsEditing(false);\r\n  };\r\n\r\n  const handleKeyDown = (e: React.KeyboardEvent) => {\r\n    if (e.key === 'Enter') {\r\n      handleSave();\r\n    } else if (e.key === 'Escape') {\r\n      setEditValue(value?.toString() || '');\r\n      setIsEditing(false);\r\n    }\r\n    // Tab navigation handled by parent\r\n  };\r\n\r\n  if (disabled || !onChange) {\r\n    return (\r\n      <span\r\n        className={cn(\r\n          'text-sm font-mono',\r\n          isDark ? 'text-white/60' : 'text-gray-500',\r\n          isAnimating && 'font-medium'\r\n        )}\r\n      >\r\n        {displayValue !== undefined ? displayValue : placeholder}\r\n      </span>\r\n    );\r\n  }\r\n\r\n  if (isEditing) {\r\n    return (\r\n      <input\r\n        ref={inputRef}\r\n        type=\"number\"\r\n        value={editValue}\r\n        onChange={(e) => setEditValue(e.target.value)}\r\n        onBlur={handleSave}\r\n        onKeyDown={handleKeyDown}\r\n        onClick={(e) => e.stopPropagation()}\r\n        min={min}\r\n        max={max}\r\n        className={cn(\r\n          'w-full px-2 py-1 text-sm rounded border outline-none',\r\n          isDark\r\n            ? 'bg-white/[0.03] border-[#00E5CC] text-white'\r\n            : 'bg-white border-[#00E5CC] text-gray-900'\r\n        )}\r\n      />\r\n    );\r\n  }\r\n\r\n  return (\r\n    <button\r\n      onClick={(e) => {\r\n        e.stopPropagation();\r\n        setIsEditing(true);\r\n      }}\r\n      className={cn(\r\n        'text-sm text-left w-full px-2 py-1 rounded transition-[background-color] duration-300',\r\n        isDark ? 'text-white/60 hover:bg-white/[0.05]' : 'text-gray-500 hover:bg-gray-100',\r\n        displayValue === undefined && (isDark ? 'text-white/30' : 'text-gray-400'),\r\n        // Flash animation\r\n        isFlashing && (isDark ? 'bg-green-500/30' : 'bg-green-500/20'),\r\n        // Slot machine animation\r\n        isAnimating && 'font-medium scale-105'\r\n      )}\r\n    >\r\n      {displayValue !== undefined ? displayValue : placeholder}\r\n    </button>\r\n  );\r\n}\r\n","/**\r\n * DropdownCell - Dropdown/select cell for ListView custom fields\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\n/* El menu se abre hacia donde cabe: en la ultima fila, `top-full` lo sacaba\r\n   fuera de la lista. La medicion vive en el hook — el mismo defecto lo tenian\r\n   nueve desplegables. */\r\nimport { useLadoDelMenu } from '../../../hooks/useLadoDelMenu';\r\nimport { ChevronDown, Check } from 'lucide-react';\r\nimport { cn } from '../../../utils';\r\n\r\ninterface DropdownCellProps {\r\n  value?: string;\r\n  options: string[];\r\n  onChange?: (value: string) => void;\r\n  isDark: boolean;\r\n  placeholder?: string;\r\n  disabled?: boolean;\r\n}\r\n\r\nexport function DropdownCell({\r\n  value,\r\n  options = [],\r\n  onChange,\r\n  isDark,\r\n  placeholder = '-',\r\n  disabled = false,\r\n}: DropdownCellProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const ref = useRef<HTMLDivElement>(null);\r\n  const arriba = useLadoDelMenu(ref, isOpen, 220);\r\n\r\n  useEffect(() => {\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      if (ref.current && !ref.current.contains(e.target as Node)) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n    }\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  if (disabled || !onChange) {\r\n    return (\r\n      <span className={cn('text-sm', isDark ? 'text-white/60' : 'text-gray-500')}>\r\n        {value || placeholder}\r\n      </span>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <div ref={ref} className=\"relative\">\r\n      <button\r\n        onClick={(e) => {\r\n          e.stopPropagation();\r\n          setIsOpen(!isOpen);\r\n        }}\r\n        className={cn(\r\n          'flex items-center gap-2 px-2 py-1 rounded transition-colors min-w-[80px]',\r\n          isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100'\r\n        )}\r\n      >\r\n        <span className={cn(\r\n          'text-sm flex-1 text-left truncate',\r\n          isDark ? 'text-white/60' : 'text-gray-500',\r\n          !value && (isDark ? 'text-white/30' : 'text-gray-400')\r\n        )}>\r\n          {value || placeholder}\r\n        </span>\r\n        <ChevronDown className={cn('w-3 h-3 flex-shrink-0', isDark ? 'text-white/30' : 'text-gray-400')} />\r\n      </button>\r\n\r\n      {isOpen && (\r\n        <div\r\n          className={cn(\r\n            'absolute z-50 left-0 ' + (arriba ? 'bottom-full mb-1 ' : 'top-full mt-1 ') + 'py-1 rounded-lg shadow-lg border min-w-[120px] max-h-48 overflow-y-auto',\r\n            isDark ? 'bg-[#1A1A1A] border-[#222]' : 'bg-white border-gray-200'\r\n          )}\r\n        >\r\n          {options.length === 0 ? (\r\n            <p className={cn('px-3 py-2 text-sm', isDark ? 'text-white/30' : 'text-gray-400')}>\r\n              No options\r\n            </p>\r\n          ) : (\r\n            options.map((option) => (\r\n              <button\r\n                key={option}\r\n                onClick={(e) => {\r\n                  e.stopPropagation();\r\n                  onChange(option);\r\n                  setIsOpen(false);\r\n                }}\r\n                className={cn(\r\n                  'w-full flex items-center justify-between gap-2 px-3 py-2 text-sm transition-colors',\r\n                  isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100',\r\n                  value === option && (isDark ? 'bg-white/[0.03]' : 'bg-gray-50')\r\n                )}\r\n              >\r\n                <span className={isDark ? 'text-white' : 'text-gray-900'}>\r\n                  {option}\r\n                </span>\r\n                {value === option && (\r\n                  <Check className=\"w-4 h-4 text-[#00E5CC]\" />\r\n                )}\r\n              </button>\r\n            ))\r\n          )}\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * CheckboxCell - Checkbox/toggle cell for ListView custom fields\r\n * v1.4.0: Added delayed confirmation (1.5s) with cancel option\r\n */\r\n\r\nimport { Check, X, Loader2 } from 'lucide-react';\r\nimport { cn } from '../../../utils';\r\nimport { useDelayedCheckbox } from '../../../hooks/useMicroInteractions';\r\n\r\ninterface CheckboxCellProps {\r\n  value?: boolean;\r\n  onChange?: (value: boolean) => void;\r\n  isDark: boolean;\r\n  disabled?: boolean;\r\n  /** Enable delayed confirmation (1.5s) */\r\n  enableDelayedConfirm?: boolean;\r\n  /** Delay in ms before committing the change */\r\n  confirmDelay?: number;\r\n}\r\n\r\nexport function CheckboxCell({\r\n  value = false,\r\n  onChange,\r\n  isDark,\r\n  disabled = false,\r\n  enableDelayedConfirm = true,\r\n  confirmDelay = 1500,\r\n}: CheckboxCellProps) {\r\n  const {\r\n    pendingValue,\r\n    isPending,\r\n    progress,\r\n    startChange,\r\n    cancelChange,\r\n  } = useDelayedCheckbox(onChange, { delay: confirmDelay });\r\n\r\n  const handleClick = (e: React.MouseEvent) => {\r\n    e.stopPropagation();\r\n    if (!disabled && onChange) {\r\n      if (enableDelayedConfirm) {\r\n        // If already pending, clicking cancels\r\n        if (isPending) {\r\n          cancelChange();\r\n        } else {\r\n          startChange(!value);\r\n        }\r\n      } else {\r\n        onChange(!value);\r\n      }\r\n    }\r\n  };\r\n\r\n  // Show the pending value while waiting, otherwise show actual value\r\n  const displayValue = isPending ? pendingValue : value;\r\n\r\n  return (\r\n    <div className=\"relative inline-flex items-center gap-1\">\r\n      <button\r\n        onClick={handleClick}\r\n        disabled={disabled || !onChange}\r\n        className={cn(\r\n          'relative w-5 h-5 rounded border-2 flex items-center justify-center transition-[border-color,background-color,box-shadow]',\r\n          displayValue\r\n            ? 'bg-[#00E5CC] border-[#00E5CC]'\r\n            : isDark\r\n              ? 'border-[#333] hover:border-[#6B7280]'\r\n              : 'border-gray-300 hover:border-gray-400',\r\n          (disabled || !onChange) && 'opacity-50 cursor-not-allowed',\r\n          isPending && 'ring-2 ring-offset-1',\r\n          isPending && displayValue && 'ring-green-500/50',\r\n          isPending && !displayValue && 'ring-red-500/50',\r\n          isPending && (isDark ? 'ring-offset-[#050505]' : 'ring-offset-white')\r\n        )}\r\n      >\r\n        {/* Progress ring for pending state */}\r\n        {isPending && (\r\n          <svg\r\n            className=\"absolute inset-0 w-full h-full -rotate-90\"\r\n            viewBox=\"0 0 20 20\"\r\n          >\r\n            <circle\r\n              cx=\"10\"\r\n              cy=\"10\"\r\n              r=\"8\"\r\n              fill=\"none\"\r\n              stroke={displayValue ? '#22C55E' : '#EF4444'}\r\n              strokeWidth=\"2\"\r\n              strokeDasharray={`${(progress / 100) * 50.26} 50.26`}\r\n              className=\"transition-all duration-100\"\r\n            />\r\n          </svg>\r\n        )}\r\n\r\n        {/* Icon */}\r\n        {isPending ? (\r\n          <Loader2 className=\"w-3 h-3 text-white animate-spin\" />\r\n        ) : displayValue ? (\r\n          <Check className=\"w-3 h-3 text-white\" />\r\n        ) : null}\r\n      </button>\r\n\r\n      {/* Cancel button when pending */}\r\n      {isPending && (\r\n        <button\r\n          onClick={(e) => {\r\n            e.stopPropagation();\r\n            cancelChange();\r\n          }}\r\n          className={cn(\r\n            'w-4 h-4 rounded-full flex items-center justify-center transition-colors',\r\n            isDark\r\n              ? 'bg-red-500/20 hover:bg-red-500/40 text-red-400'\r\n              : 'bg-red-100 hover:bg-red-200 text-red-500'\r\n          )}\r\n          title=\"Cancelar\"\r\n        >\r\n          <X className=\"w-3 h-3\" />\r\n        </button>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * MultiSelectCell - Multi-option cell for ListView custom fields\r\n *\r\n * Same shape as DropdownCell, with three differences that matter:\r\n *\r\n *   1. the menu STAYS OPEN when picking, because picking several options one\r\n *      at a time with the menu closing after each is unusable;\r\n *   2. `value` is an array, and `onChange` always receives a NEW array — never\r\n *      the same reference mutated, which React would not see;\r\n *   3. an optional `maxSelectable`: once reached, the unpicked options are\r\n *      disabled rather than hidden, so the limit is visible instead of the\r\n *      list mysteriously shrinking.\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\n/* El menu se abre hacia donde cabe: en la ultima fila, `top-full` lo sacaba\r\n   fuera de la lista. La medicion vive en el hook — el mismo defecto lo tenian\r\n   nueve desplegables. */\r\nimport { useLadoDelMenu } from '../../../hooks/useLadoDelMenu';\r\nimport { ChevronDown, Check } from 'lucide-react';\r\nimport { cn } from '../../../utils';\r\n\r\ninterface MultiSelectCellProps {\r\n  value?: string[];\r\n  options: string[];\r\n  onChange?: (value: string[]) => void;\r\n  isDark: boolean;\r\n  placeholder?: string;\r\n  disabled?: boolean;\r\n  /** Optional cap on how many options can be picked. */\r\n  maxSelectable?: number;\r\n  /** How many chips to show before collapsing into \"+N\". */\r\n  maxVisible?: number;\r\n}\r\n\r\nexport function MultiSelectCell({\r\n  value = [],\r\n  options = [],\r\n  onChange,\r\n  isDark,\r\n  placeholder = '-',\r\n  disabled = false,\r\n  maxSelectable,\r\n  maxVisible = 2,\r\n}: MultiSelectCellProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const ref = useRef<HTMLDivElement>(null);\r\n  const arriba = useLadoDelMenu(ref, isOpen, 220);\r\n\r\n  useEffect(() => {\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      if (ref.current && !ref.current.contains(e.target as Node)) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n    if (isOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n    }\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [isOpen]);\r\n\r\n  const visible = value.slice(0, maxVisible);\r\n  const hidden = value.length - visible.length;\r\n\r\n  const label = value.length === 0\r\n    ? placeholder\r\n    : visible.join(', ') + (hidden > 0 ? ` +${hidden}` : '');\r\n\r\n  if (disabled || !onChange) {\r\n    return (\r\n      <span className={cn('text-sm truncate', isDark ? 'text-white/60' : 'text-gray-500')}>\r\n        {label}\r\n      </span>\r\n    );\r\n  }\r\n\r\n  const toggle = (option: string) => {\r\n    const picked = value.includes(option);\r\n    /*\r\n     * A NEW array every time. Mutating and passing the same reference is the\r\n     * classic way to make a parent's `useMemo`/`memo` skip the update, and the\r\n     * cell would look stuck while the data underneath had already changed.\r\n     */\r\n    const next = picked\r\n      ? value.filter(v => v !== option)\r\n      : [...value, option];\r\n\r\n    /* The cap only blocks ADDING; removing is always allowed. */\r\n    if (!picked && maxSelectable != null && value.length >= maxSelectable) return;\r\n\r\n    onChange(next);\r\n  };\r\n\r\n  const capReached = maxSelectable != null && value.length >= maxSelectable;\r\n\r\n  return (\r\n    <div ref={ref} className=\"relative\">\r\n      <button\r\n        onClick={(e) => {\r\n          e.stopPropagation();\r\n          setIsOpen(!isOpen);\r\n        }}\r\n        className={cn(\r\n          'flex items-center gap-2 px-2 py-1 rounded transition-colors min-w-[80px]',\r\n          isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100'\r\n        )}\r\n      >\r\n        <span className={cn(\r\n          'text-sm flex-1 text-left truncate',\r\n          isDark ? 'text-white/60' : 'text-gray-500',\r\n          value.length === 0 && (isDark ? 'text-white/30' : 'text-gray-400')\r\n        )}>\r\n          {label}\r\n        </span>\r\n        <ChevronDown className={cn('w-3 h-3 flex-shrink-0', isDark ? 'text-white/30' : 'text-gray-400')} />\r\n      </button>\r\n\r\n      {isOpen && (\r\n        <div\r\n          className={cn(\r\n            'absolute z-50 left-0 ' + (arriba ? 'bottom-full mb-1 ' : 'top-full mt-1 ') + 'py-1 rounded-lg shadow-lg border min-w-[140px] max-h-48 overflow-y-auto',\r\n            isDark ? 'bg-[#1A1A1A] border-[#222]' : 'bg-white border-gray-200'\r\n          )}\r\n        >\r\n          {options.length === 0 ? (\r\n            <p className={cn('px-3 py-2 text-sm', isDark ? 'text-white/30' : 'text-gray-400')}>\r\n              No options\r\n            </p>\r\n          ) : (\r\n            options.map((option) => {\r\n              const picked = value.includes(option);\r\n              /* Disabled, not hidden: a list that silently shrinks is worse. */\r\n              const blocked = !picked && capReached;\r\n              return (\r\n                <button\r\n                  key={option}\r\n                  disabled={blocked}\r\n                  onClick={(e) => {\r\n                    e.stopPropagation();\r\n                    toggle(option);\r\n                    /* The menu STAYS OPEN: picking several is the whole point. */\r\n                  }}\r\n                  className={cn(\r\n                    'w-full flex items-center justify-between gap-2 px-3 py-2 text-sm transition-colors',\r\n                    blocked\r\n                      ? 'opacity-40 cursor-not-allowed'\r\n                      : (isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100'),\r\n                    picked && (isDark ? 'bg-white/[0.03]' : 'bg-gray-50')\r\n                  )}\r\n                >\r\n                  <span className={isDark ? 'text-white' : 'text-gray-900'}>\r\n                    {option}\r\n                  </span>\r\n                  {picked && <Check className=\"w-4 h-4 text-[#00E5CC]\" />}\r\n                </button>\r\n              );\r\n            })\r\n          )}\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * FileCell - File custom field cell for ListView\r\n *\r\n * ── WHY THIS IS NOT AN UPLOADER ───────────────────────────────────────────\r\n *\r\n * A table cell is the wrong place to upload a file. Uploading needs a drop\r\n * area, a progress bar and room to report a failure — none of which fits in a\r\n * row that is 32 pixels tall and shares the screen with twelve other columns.\r\n * `AttachmentUploader` already does all of that properly.\r\n *\r\n * So this cell SHOWS what is attached and opens it. Adding a file happens\r\n * where there is room for it: the task panel. `onOpen` lets the host decide\r\n * what \"open\" means — its own drawer, a new tab, a preview.\r\n *\r\n * Deliberately no delete either: removing a file from a cell, with no\r\n * confirmation and no undo, one careless click away from the row below.\r\n */\r\n\r\nimport { Paperclip } from 'lucide-react';\r\nimport { cn } from '../../../utils';\r\n\r\nexport interface FileCellItem {\r\n  id: string;\r\n  name: string;\r\n  url?: string;\r\n}\r\n\r\ninterface FileCellProps {\r\n  /**\r\n   * Accepts both shapes a custom field can hold: a list of files, or a bare\r\n   * URL string for the simple \"one link to a document\" case.\r\n   */\r\n  value?: FileCellItem[] | string;\r\n  isDark: boolean;\r\n  placeholder?: string;\r\n  /** Called with the file the user clicked. Without it the cell is read-only. */\r\n  onOpen?: (file: FileCellItem) => void;\r\n}\r\n\r\nfunction normalize(value: FileCellItem[] | string | undefined): FileCellItem[] {\r\n  if (!value) return [];\r\n  if (typeof value === 'string') {\r\n    /* A bare URL: the last path segment is the closest thing to a name. */\r\n    const name = value.split('/').filter(Boolean).pop() || value;\r\n    return [{ id: value, name, url: value }];\r\n  }\r\n  return value.filter(f => f && f.id);\r\n}\r\n\r\nexport function FileCell({\r\n  value,\r\n  isDark,\r\n  placeholder = '-',\r\n  onOpen,\r\n}: FileCellProps) {\r\n  const files = normalize(value);\r\n\r\n  if (files.length === 0) {\r\n    return (\r\n      <span className={cn('text-sm', isDark ? 'text-white/30' : 'text-gray-400')}>\r\n        {placeholder}\r\n      </span>\r\n    );\r\n  }\r\n\r\n  const first = files[0]!;\r\n  const rest = files.length - 1;\r\n\r\n  /*\r\n   * The count goes in the label rather than showing every file: three columns\r\n   * of chips is how a table stops being readable. The full list lives in the\r\n   * task panel, where there is room for it.\r\n   */\r\n  const label = rest > 0 ? `${first.name} +${rest}` : first.name;\r\n\r\n  if (!onOpen) {\r\n    return (\r\n      <span className={cn(\r\n        'text-sm truncate flex items-center gap-1.5',\r\n        isDark ? 'text-white/60' : 'text-gray-500',\r\n      )}>\r\n        <Paperclip className=\"w-3 h-3 flex-shrink-0\" />\r\n        {label}\r\n      </span>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <button\r\n      onClick={(e) => {\r\n        e.stopPropagation();\r\n        onOpen(first);\r\n      }}\r\n      title={files.map(f => f.name).join('\\n')}\r\n      className={cn(\r\n        'text-sm truncate text-left w-full px-2 py-1 rounded transition-colors flex items-center gap-1.5',\r\n        isDark\r\n          ? 'text-white/60 hover:bg-white/[0.05]'\r\n          : 'text-gray-500 hover:bg-gray-100',\r\n      )}\r\n    >\r\n      <Paperclip className=\"w-3 h-3 flex-shrink-0\" />\r\n      <span className=\"truncate\">{label}</span>\r\n    </button>\r\n  );\r\n}\r\n","/**\n * TagsCell - Tags display cell for ListView\n */\n\nimport { cn } from '../../../utils';\nimport type { TaskTag } from '../../Gantt/types';\n\ninterface TagsCellProps {\n  value?: TaskTag[];\n  isDark: boolean;\n  maxVisible?: number;\n}\n\nexport function TagsCell({\n  value = [],\n  isDark,\n  maxVisible = 2,\n}: TagsCellProps) {\n  if (value.length === 0) {\n    return (\n      <span className={cn('text-sm', isDark ? 'text-white/30' : 'text-gray-400')}>\n        -\n      </span>\n    );\n  }\n\n  const visibleTags = value.slice(0, maxVisible);\n  const remainingCount = value.length - maxVisible;\n\n  return (\n    <div className=\"flex items-center gap-1 flex-wrap\">\n      {visibleTags.map((tag) => (\n        <span\n          key={tag.id}\n          className=\"inline-flex items-center px-2 py-0.5 text-[9px] font-mono uppercase tracking-wide rounded\"\n          style={{\n            backgroundColor: tag.color ? `${tag.color}20` : isDark ? 'rgba(255,255,255,0.05)' : '#F3F4F6',\n            color: tag.color || (isDark ? 'rgba(255,255,255,0.5)' : '#6B7280'),\n          }}\n        >\n          {tag.name}\n        </span>\n      ))}\n      {remainingCount > 0 && (\n        <span\n          className={cn(\n            'inline-flex items-center px-2 py-0.5 text-xs rounded-full',\n            isDark ? 'bg-white/[0.05] text-white/60' : 'bg-gray-100 text-gray-500'\n          )}\n        >\n          +{remainingCount}\n        </span>\n      )}\n    </div>\n  );\n}\n","/**\r\n * TimeCell - Displays time in human-readable format (hours/minutes)\r\n * v0.18.3: Added for time tracking columns (estimatedTime, elapsedTime)\r\n * v1.4.0: Added micro-interactions (flash on save)\r\n *\r\n * Input: time in minutes (number)\r\n * Output: formatted string like \"2h 30m\" or \"45m\"\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\nimport { Clock, DollarSign } from 'lucide-react';\r\nimport { cn } from '../../../utils';\r\nimport { useSaveFlash } from '../../../hooks/useMicroInteractions';\r\n\r\ninterface TimeCellProps {\r\n  /** Time value in minutes */\r\n  value?: number | null;\r\n  /** Called when value changes (in minutes) - enables inline editing */\r\n  onChange?: (value: number | null) => void;\r\n  isDark: boolean;\r\n  locale?: string;\r\n  placeholder?: string;\r\n  disabled?: boolean;\r\n  /** Enable flash green on save */\r\n  enableSaveFlash?: boolean;\r\n  /**\r\n   * Governance v2.0: Blur the value for unauthorized users\r\n   * When true, shows a blurred placeholder instead of the actual value\r\n   */\r\n  isBlurred?: boolean;\r\n  /** Display mode: 'hours' shows Xh Ym, 'financial' shows $X (minutes/60 × hourlyRate) */\r\n  lens?: 'hours' | 'financial';\r\n  /** Rate used to convert hours → dollars when lens='financial' */\r\n  hourlyRate?: number;\r\n  /**\r\n   * v2.5.3: When set AND lens='financial', this canonical dollar figure\r\n   * is displayed instead of `minutes × hourlyRate`. Use it to align\r\n   * per-row cells with authoritative totals from time_logs × rate_at_time.\r\n   */\r\n  financialOverride?: number;\r\n}\r\n\r\n/**\r\n * Format minutes to human-readable time string\r\n * @param minutes - Time in minutes\r\n * @param locale - Locale for formatting ('en' or 'es')\r\n * @returns Formatted string like \"2h 30m\" (compact format for both locales)\r\n */\r\nfunction formatTime(minutes: number | null | undefined, _locale: string = 'en'): string {\r\n  // Handle null, undefined, 0, empty string, or falsy values\r\n  if (minutes === null || minutes === undefined || minutes === 0 || !minutes || Number(minutes) === 0) {\r\n    return '-';\r\n  }\r\n\r\n  const hours = Math.floor(minutes / 60);\r\n  const mins = minutes % 60;\r\n\r\n  // Use compact format for both locales to fit in cells\r\n  if (hours === 0) {\r\n    return `${mins}m`;\r\n  }\r\n  if (mins === 0) {\r\n    return `${hours}h`;\r\n  }\r\n  return `${hours}h ${mins}m`;\r\n}\r\n\r\n/**\r\n * Parse time string to minutes\r\n * Supports formats: \"2h 30m\", \"2h30m\", \"2.5h\", \"150m\", \"150\", \"2:30\"\r\n */\r\nfunction parseTimeToMinutes(input: string): number | null {\r\n  const trimmed = input.trim().toLowerCase();\r\n\r\n  if (!trimmed || trimmed === '-') {\r\n    return null;\r\n  }\r\n\r\n  // Try hours:minutes format (2:30)\r\n  const colonMatch = trimmed.match(/^(\\d+):(\\d+)$/);\r\n  if (colonMatch && colonMatch[1] && colonMatch[2]) {\r\n    const hours = parseInt(colonMatch[1], 10);\r\n    const mins = parseInt(colonMatch[2], 10);\r\n    return hours * 60 + mins;\r\n  }\r\n\r\n  // Try hours and minutes format (2h 30m, 2h30m, 2h 30min)\r\n  const hmMatch = trimmed.match(/^(\\d+\\.?\\d*)\\s*h\\s*(\\d+)?\\s*(m|min)?$/);\r\n  if (hmMatch && hmMatch[1]) {\r\n    const hours = parseFloat(hmMatch[1]);\r\n    const mins = hmMatch[2] ? parseInt(hmMatch[2], 10) : 0;\r\n    return Math.round(hours * 60) + mins;\r\n  }\r\n\r\n  // Try hours only format (2h, 2.5h)\r\n  const hMatch = trimmed.match(/^(\\d+\\.?\\d*)\\s*h$/);\r\n  if (hMatch && hMatch[1]) {\r\n    return Math.round(parseFloat(hMatch[1]) * 60);\r\n  }\r\n\r\n  // Try minutes only format (30m, 30min) - MUST have 'm' or 'min' suffix\r\n  const mMatch = trimmed.match(/^(\\d+)\\s*(m|min)$/);\r\n  if (mMatch && mMatch[1]) {\r\n    return parseInt(mMatch[1], 10);\r\n  }\r\n\r\n  // Plain number (assumes HOURS, not minutes)\r\n  // e.g., \"100\" = 100 hours = 6000 minutes\r\n  const num = parseFloat(trimmed);\r\n  if (!isNaN(num)) {\r\n    return Math.round(num * 60);\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\nexport function TimeCell({\r\n  value,\r\n  onChange,\r\n  isDark,\r\n  locale = 'en',\r\n  placeholder: _placeholder,\r\n  disabled = false,\r\n  enableSaveFlash = true,\r\n  isBlurred = false,\r\n  lens = 'hours',\r\n  hourlyRate = 0,\r\n  financialOverride,\r\n}: TimeCellProps) {\r\n  const [isEditing, setIsEditing] = useState(false);\r\n  const [editValue, setEditValue] = useState('');\r\n  const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n  // Micro-interaction: flash green on save\r\n  const { isFlashing, triggerFlash } = useSaveFlash();\r\n\r\n  // v2.5.3: Financial lens shows dollars. Enabled when consumer supplies a\r\n  // canonical override OR when there's an hourlyRate available for conversion.\r\n  const isFin = lens === 'financial' && (hourlyRate > 0 || financialOverride != null);\r\n  const financialDollars = financialOverride != null\r\n    ? financialOverride\r\n    : (value ? (value / 60) * hourlyRate : 0);\r\n  const formattedValue = isFin && (financialOverride != null ? financialOverride > 0 : value)\r\n    ? `$${Math.round(financialDollars).toLocaleString('en-US')}`\r\n    : formatTime(value, locale);\r\n\r\n  useEffect(() => {\r\n    if (isEditing && inputRef.current) {\r\n      inputRef.current.focus();\r\n      inputRef.current.select();\r\n    }\r\n  }, [isEditing]);\r\n\r\n  useEffect(() => {\r\n    // When entering edit mode, show current value in editable format\r\n    if (value) {\r\n      const hours = Math.floor(value / 60);\r\n      const mins = value % 60;\r\n      if (hours > 0 && mins > 0) {\r\n        setEditValue(`${hours}h ${mins}m`);\r\n      } else if (hours > 0) {\r\n        setEditValue(`${hours}h`);\r\n      } else {\r\n        setEditValue(`${mins}m`);\r\n      }\r\n    } else {\r\n      setEditValue('');\r\n    }\r\n  }, [value, isEditing]);\r\n\r\n  const handleSave = () => {\r\n    const parsedMinutes = parseTimeToMinutes(editValue);\r\n    if (parsedMinutes !== value) {\r\n      onChange?.(parsedMinutes);\r\n      // Trigger flash after save\r\n      if (enableSaveFlash) {\r\n        triggerFlash();\r\n      }\r\n    }\r\n    setIsEditing(false);\r\n  };\r\n\r\n  const handleKeyDown = (e: React.KeyboardEvent) => {\r\n    if (e.key === 'Enter') {\r\n      handleSave();\r\n    } else if (e.key === 'Escape') {\r\n      setIsEditing(false);\r\n    }\r\n  };\r\n\r\n  // Governance v2.0: Blurred mode for unauthorized users\r\n  if (isBlurred) {\r\n    return (\r\n      <div\r\n        className=\"flex items-center gap-1.5\"\r\n        title={locale === 'es' ? 'No tienes permisos para ver este dato' : 'You don\\'t have permission to view this data'}\r\n      >\r\n        <Clock className={cn('w-3.5 h-3.5 flex-shrink-0', isDark ? 'text-white/30' : 'text-gray-400')} />\r\n        <span\r\n          className={cn(\r\n            'text-sm select-none blur-[4px] opacity-60 pointer-events-none',\r\n            isDark ? 'text-white/60' : 'text-gray-500'\r\n          )}\r\n          aria-hidden=\"true\"\r\n        >\r\n          ••••\r\n        </span>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  const ValueIcon = isFin ? DollarSign : Clock;\r\n\r\n  // Read-only mode (no onChange provided)\r\n  if (disabled || !onChange) {\r\n    // Parent tasks with no value: render empty (no dash)\r\n    if (!value || value === 0) return null;\r\n    return (\r\n      <div className=\"flex items-center justify-center gap-1.5\">\r\n        <ValueIcon className={cn('w-3.5 h-3.5 flex-shrink-0', isDark ? 'text-white/30' : 'text-gray-400')} />\r\n        <span className={cn(\r\n          'text-sm font-mono',\r\n          isDark ? 'text-white/60' : 'text-gray-500',\r\n        )}>\r\n          {formattedValue}\r\n        </span>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  // Edit mode\r\n  if (isEditing) {\r\n    return (\r\n      <input\r\n        ref={inputRef}\r\n        type=\"text\"\r\n        value={editValue}\r\n        onChange={(e) => setEditValue(e.target.value)}\r\n        onBlur={handleSave}\r\n        onKeyDown={handleKeyDown}\r\n        onClick={(e) => e.stopPropagation()}\r\n        placeholder={locale === 'es' ? '8 (=8h), 1h 30m' : '8 (=8h), 1h 30m'}\r\n        className={cn(\r\n          'w-full px-2 py-1 text-sm rounded border outline-none',\r\n          isDark\r\n            ? 'bg-white/[0.03] border-[#00E5CC] text-white placeholder:text-white/30'\r\n            : 'bg-white border-[#00E5CC] text-gray-900 placeholder:text-gray-400'\r\n        )}\r\n      />\r\n    );\r\n  }\r\n\r\n  // Display mode (clickable to edit)\r\n  return (\r\n    <button\r\n      onClick={(e) => {\r\n        e.stopPropagation();\r\n        setIsEditing(true);\r\n      }}\r\n      className={cn(\r\n        'flex items-center justify-center gap-1 text-sm w-full px-1.5 py-1 rounded transition-[background-color] duration-300 overflow-hidden',\r\n        isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100',\r\n        value != null && value > 0\r\n          ? (isDark ? 'text-white/60' : 'text-gray-600')\r\n          : (isDark ? 'text-white/30' : 'text-gray-400'),\r\n        // Flash animation\r\n        isFlashing && (isDark ? 'bg-green-500/30' : 'bg-green-500/20')\r\n      )}\r\n    >\r\n      {value != null && value > 0 && (\r\n        <ValueIcon className={cn('w-3 h-3 flex-shrink-0', isDark ? 'text-white/30' : 'text-gray-400')} />\r\n      )}\r\n      <span className=\"truncate font-mono\">{formattedValue}</span>\r\n    </button>\r\n  );\r\n}\r\n","/**\n * ScheduleVarianceCell - Schedule dates + variance badge for Chronos V2.0\n * Shows: \"Oct 24 vs Oct 30\" + badge (-4d Delay / +2d Early / On Track)\n */\n\nimport { cn } from '../../../utils';\n\ninterface ScheduleVarianceCellProps {\n  startDate?: Date;\n  endDate?: Date;\n  scheduleVariance?: number; // days: negative = delay, positive = ahead\n  isDark: boolean;\n  locale?: string;\n  /** Whether the task has any time allocated (estimated or quoted hours) */\n  hasTimeAllocated?: boolean;\n}\n\nexport function ScheduleVarianceCell({\n  startDate,\n  endDate,\n  scheduleVariance,\n  isDark,\n  locale = 'en',\n  hasTimeAllocated = true,\n}: ScheduleVarianceCellProps) {\n  if (!startDate && !endDate) {\n    return (\n      <span className={cn('text-[11px] font-mono', isDark ? 'text-white/30' : 'text-gray-400')}>\n        -\n      </span>\n    );\n  }\n\n  const formatShortDate = (date: Date) => {\n    return date.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', {\n      month: 'short',\n      day: 'numeric',\n    });\n  };\n\n  const getVarianceBadge = () => {\n    if (scheduleVariance === undefined || scheduleVariance === null) return null;\n\n    const isEs = locale === 'es';\n\n    if (scheduleVariance === 0) {\n      // If no hours allocated, show \"Tiempo no asignado\" instead of \"En Tiempo\"\n      if (!hasTimeAllocated) {\n        return (\n          <span className=\"font-mono\" style={{ fontSize: '10px', color: isDark ? 'rgba(255,255,255,0.3)' : '#94A3B8', fontWeight: 500 }}>\n            {isEs ? 'Tiempo no asignado' : 'No time allocated'}\n          </span>\n        );\n      }\n      return (\n        <span className=\"font-mono\" style={{ fontSize: '10px', color: '#10B981', fontWeight: 600 }}>\n          {isEs ? 'En Tiempo' : 'On Track'}\n        </span>\n      );\n    }\n\n    if (scheduleVariance > 0) {\n      return (\n        <span className=\"font-mono\" style={{ fontSize: '10px', color: '#3BF06E', fontWeight: 600 }}>\n          +{scheduleVariance}d {isEs ? 'Adelante' : 'Early'}\n        </span>\n      );\n    }\n\n    return (\n      <span className=\"font-mono\" style={{ fontSize: '10px', color: '#F87171', fontWeight: 600 }}>\n        {scheduleVariance}d {isEs ? 'Atraso' : 'Delay'}\n      </span>\n    );\n  };\n\n  return (\n    <div style={{ display: 'flex', flexDirection: 'column', gap: '2px' }}>\n      <span className={cn('text-[11px] font-mono', isDark ? 'text-white/60' : 'text-gray-500')}>\n        {startDate ? formatShortDate(startDate) : '—'}\n        <span className={isDark ? 'text-white/20 mx-1' : 'text-gray-300 mx-1'}>vs</span>\n        {endDate ? formatShortDate(endDate) : '—'}\n      </span>\n      {getVarianceBadge()}\n    </div>\n  );\n}\n","/**\n * HoursBarCell - Visual hours bar with 3-action menu + inline popovers\n * Chronos V2.0 Interactive Time Manager\n *\n * Shows: Registered / Estimated + progress bar + T. Ofertado (if exists)\n * \"+ Log\" button opens 3-option menu: Registrar, Estimación, T. Ofertado\n */\n\nimport { useState, useRef, useEffect } from 'react';\nimport { Plus, Clock, Target, DollarSign } from 'lucide-react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { cn } from '../../../utils';\nimport { TimeInputPopover } from '../../TimeTracking/TimeInputPopover';\nimport type { Task } from '../../Gantt/types';\n\ntype PopoverMode = 'log' | 'estimate' | 'quoted' | null;\n\ninterface HoursBarCellProps {\n  task: Task;\n  isDark: boolean;\n  locale?: string;\n  onLogTime?: (task: Task, minutes: number | null, note?: string) => void;\n  onEstimateUpdate?: (task: Task, minutes: number | null) => void;\n  onSoldEffortUpdate?: (task: Task, minutes: number | null) => void;\n  /** Show the \"Ofertado: Xh\" line even without edit callback (read-only visibility) */\n  showSoldEffort?: boolean;\n  /** @deprecated Use onLogTime instead */\n  onOpenTimeLog?: (task: Task) => void;\n  /** Display mode: 'hours' shows Xh, 'financial' shows $X (hours × hourlyRate) */\n  lens?: 'hours' | 'financial';\n  /** Rate used to convert hours → dollars when lens='financial' */\n  hourlyRate?: number;\n}\n\nexport function HoursBarCell({\n  task,\n  isDark,\n  locale = 'en',\n  onLogTime,\n  onEstimateUpdate,\n  onSoldEffortUpdate,\n  // showSoldEffort — no longer used (Ofertado line removed, now optional column)\n  onOpenTimeLog,\n  lens = 'hours',\n  hourlyRate = 0,\n}: HoursBarCellProps) {\n  const isEs = locale === 'es';\n  const isFin = lens === 'financial' && hourlyRate > 0;\n  /** Format a value as hours or dollars depending on lens */\n  const fmt = (hours: number) => isFin\n    ? `$${Math.round(hours * hourlyRate).toLocaleString('en-US')}`\n    : `${hours}h`;\n  const [isHovered, setIsHovered] = useState(false);\n  const [menuOpen, setMenuOpen] = useState(false);\n  const [popoverMode, setPopoverMode] = useState<PopoverMode>(null);\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  const spentMinutes = task.timeLoggedMinutes || 0;\n  const allocatedMinutes = task.effortMinutes || 0;\n  const soldMinutes = (task as any).soldEffortMinutes || 0;\n  const spentHours = Math.round((spentMinutes / 60) * 10) / 10;\n  const allocatedHours = Math.round((allocatedMinutes / 60) * 10) / 10;\n\n  const percentage = allocatedMinutes > 0 ? (spentMinutes / allocatedMinutes) * 100 : 0;\n  const overHours = percentage > 100 ? Math.round(((spentMinutes - allocatedMinutes) / 60) * 10) / 10 : 0;\n\n  // Bar color: cyan normal, red if exceeds (spec: simplified 2-tier)\n  const barColor = percentage > 100 ? '#EF4444' : '#00E5CC';\n\n  // Close menu/popover on click outside\n  useEffect(() => {\n    if (!menuOpen && !popoverMode) return;\n    const handleClickOutside = (e: MouseEvent) => {\n      if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n        setMenuOpen(false);\n        setPopoverMode(null);\n      }\n    };\n    document.addEventListener('mousedown', handleClickOutside);\n    return () => document.removeEventListener('mousedown', handleClickOutside);\n  }, [menuOpen, popoverMode]);\n\n  const handleButtonClick = (e: React.MouseEvent) => {\n    e.stopPropagation();\n    // If only onLogTime exists (no estimate/quoted), open log directly\n    if (onLogTime && !onEstimateUpdate && !onSoldEffortUpdate) {\n      setPopoverMode('log');\n      return;\n    }\n    // If has multiple actions, show menu\n    if (onLogTime || onEstimateUpdate || onSoldEffortUpdate) {\n      setMenuOpen(prev => !prev);\n      setPopoverMode(null);\n      return;\n    }\n    // Legacy fallback\n    if (onOpenTimeLog) {\n      onOpenTimeLog(task);\n    }\n  };\n\n  const handleMenuOption = (mode: PopoverMode) => {\n    setMenuOpen(false);\n    setPopoverMode(mode);\n  };\n\n  const handleSave = async (minutes: number | null, note?: string) => {\n    if (popoverMode === 'log' && onLogTime && minutes) {\n      onLogTime(task, minutes, note);\n    } else if (popoverMode === 'estimate' && onEstimateUpdate) {\n      onEstimateUpdate(task, minutes);\n    } else if (popoverMode === 'quoted' && onSoldEffortUpdate) {\n      onSoldEffortUpdate(task, minutes);\n    }\n    setPopoverMode(null);\n  };\n\n  const hasAnyAction = onLogTime || onEstimateUpdate || onSoldEffortUpdate || onOpenTimeLog;\n\n  // Menu items config\n  const menuItems = [\n    { mode: 'log' as const, icon: Clock, label: isEs ? 'Registrar tiempo' : 'Log time', show: !!onLogTime },\n    { mode: 'estimate' as const, icon: Target, label: isEs ? 'Estimación' : 'Estimate', show: !!onEstimateUpdate },\n    { mode: 'quoted' as const, icon: DollarSign, label: isEs ? 'T. Ofertado' : 'Quoted time', show: !!onSoldEffortUpdate },\n  ].filter(item => item.show);\n\n  // Current value for popover (estimate/quoted show current, log starts empty)\n  const currentPopoverValue = popoverMode === 'estimate' ? allocatedMinutes\n    : popoverMode === 'quoted' ? soldMinutes\n    : undefined;\n\n  // ── Empty state ──\n  if (allocatedMinutes === 0 && spentMinutes === 0 && soldMinutes === 0) {\n    return (\n      <div\n        ref={containerRef}\n        className=\"relative flex items-center gap-2\"\n        onClick={(e) => e.stopPropagation()}\n        onMouseEnter={() => setIsHovered(true)}\n        onMouseLeave={() => setIsHovered(false)}\n      >\n        <span className={cn('text-[11px] font-mono', isDark ? 'text-white/30' : 'text-gray-400')}>\n          —\n        </span>\n        {isHovered && hasAnyAction && (\n          <button\n            onClick={handleButtonClick}\n            className=\"flex items-center justify-center w-6 h-6 rounded-md transition-colors\"\n            style={{\n              color: isDark ? 'rgba(255,255,255,0.35)' : '#9CA3AF',\n              backgroundColor: 'transparent',\n            }}\n            onMouseEnter={e => {\n              e.currentTarget.style.color = isDark ? 'rgba(255,255,255,0.8)' : '#374151';\n              e.currentTarget.style.backgroundColor = isDark ? 'rgba(255,255,255,0.06)' : '#F3F4F6';\n            }}\n            onMouseLeave={e => {\n              e.currentTarget.style.color = isDark ? 'rgba(255,255,255,0.35)' : '#9CA3AF';\n              e.currentTarget.style.backgroundColor = 'transparent';\n            }}\n            title={isEs ? '+ Tiempo' : '+ Time'}\n          >\n            <Plus className=\"w-3.5 h-3.5\" />\n          </button>\n        )}\n\n        {/* Menu */}\n        <AnimatePresence>\n          {menuOpen && (\n            <motion.div\n              initial={{ opacity: 0, scale: 0.95, y: -4 }}\n              animate={{ opacity: 1, scale: 1, y: 0 }}\n              exit={{ opacity: 0, scale: 0.95, y: -4 }}\n              transition={{ duration: 0.1 }}\n              className=\"absolute right-0 top-full mt-1 z-50\"\n              style={{\n                background: isDark ? 'rgba(10,10,10,0.95)' : '#FFFFFF',\n                border: isDark ? '1px solid rgba(255,255,255,0.10)' : '1px solid #E5E7EB',\n                borderRadius: 8,\n                boxShadow: isDark ? '0 8px 32px rgba(0,0,0,0.6)' : '0 8px 32px rgba(0,0,0,0.12)',\n                backdropFilter: 'blur(16px)',\n                overflow: 'hidden',\n                minWidth: 160,\n              }}\n            >\n              {menuItems.map(item => (\n                <button\n                  key={item.mode}\n                  onClick={(e) => { e.stopPropagation(); handleMenuOption(item.mode); }}\n                  className=\"w-full flex items-center gap-2 px-3 py-2 text-left transition-colors\"\n                  style={{\n                    fontSize: 11,\n                    fontFamily: \"'JetBrains Mono', monospace\",\n                    color: isDark ? 'rgba(255,255,255,0.7)' : '#374151',\n                    background: 'transparent',\n                    border: 'none',\n                    cursor: 'pointer',\n                  }}\n                  onMouseEnter={(e) => { (e.target as HTMLElement).style.background = isDark ? 'rgba(255,255,255,0.06)' : '#F3F4F6'; }}\n                  onMouseLeave={(e) => { (e.target as HTMLElement).style.background = 'transparent'; }}\n                >\n                  <item.icon style={{ width: 12, height: 12, flexShrink: 0, opacity: 0.5 }} />\n                  {item.label}\n                </button>\n              ))}\n            </motion.div>\n          )}\n        </AnimatePresence>\n\n        {/* Popover */}\n        <AnimatePresence>\n          {popoverMode && (\n            <div className=\"absolute right-0 top-full mt-1 z-50\">\n              <motion.div\n                initial={{ opacity: 0, scale: 0.95, y: -4 }}\n                animate={{ opacity: 1, scale: 1, y: 0 }}\n                exit={{ opacity: 0, scale: 0.95, y: -4 }}\n                transition={{ duration: 0.12 }}\n              >\n                <TimeInputPopover\n                  mode={popoverMode}\n                  locale={locale as 'en' | 'es'}\n                  isDark={isDark}\n                  currentValue={currentPopoverValue || undefined}\n                  onSave={handleSave}\n                  onClose={() => setPopoverMode(null)}\n                />\n              </motion.div>\n            </div>\n          )}\n        </AnimatePresence>\n      </div>\n    );\n  }\n\n  // ── Normal state with data ──\n  return (\n    <div\n      ref={containerRef}\n      className=\"relative flex items-center gap-2 w-full\"\n      onClick={(e) => e.stopPropagation()}\n      onMouseEnter={() => setIsHovered(true)}\n      onMouseLeave={() => setIsHovered(false)}\n    >\n      {/* Chronos card container */}\n      <div\n        className=\"flex flex-col gap-1 flex-1 min-w-0\"\n        style={{\n          padding: '8px 12px',\n          borderRadius: '4px',\n          border: isDark ? '1px solid #333' : '1px solid #E5E7EB',\n          backgroundColor: isDark ? '#1A1A1A' : '#F9FAFB',\n        }}\n      >\n        {/* Main line: Registered / Estimated\n            v2.7.0 — visual noise reduction:\n            - Dim the \"0h\" when no time has been logged yet (signals inactive state)\n            - The \"Excedido\" badge only turns red when over allocated by >10%\n              (prevents \"alarm blindness\" from minor overruns being flagged) */}\n        {(() => {\n          const spentIsZero = spentMinutes === 0;\n          const overRatio = allocatedMinutes > 0 ? spentMinutes / allocatedMinutes : 0;\n          const isSignificantlyOver = overRatio > 1.10;\n          return (\n            <div className=\"flex items-center gap-1.5\">\n              <span\n                className=\"font-mono\"\n                style={{\n                  fontSize: 13,\n                  fontWeight: 700,\n                  color: spentIsZero\n                    ? (isDark ? '#4B5563' : '#9CA3AF')\n                    : (isDark ? '#FFFFFF' : '#111827'),\n                }}\n              >\n                {fmt(spentHours)}\n              </span>\n              {allocatedMinutes > 0 && (\n                <span className=\"font-mono\" style={{ fontSize: 11, color: isDark ? 'rgba(255,255,255,0.3)' : '#9CA3AF' }}>\n                  / {fmt(allocatedHours)}\n                </span>\n              )}\n              {overHours > 0 && (\n                <span\n                  className=\"font-mono px-1.5 py-0.5 rounded\"\n                  style={{\n                    fontSize: 10,\n                    color: isSignificantlyOver ? '#EF4444' : (isDark ? 'rgba(255,255,255,0.5)' : '#6B7280'),\n                    backgroundColor: isSignificantlyOver ? 'rgba(239,68,68,0.15)' : 'transparent',\n                  }}\n                >\n                  +{fmt(overHours)} {isEs ? 'Excedido' : 'Over'}\n                </span>\n              )}\n            </div>\n          );\n        })()}\n\n        {/* Progress bar */}\n        {allocatedMinutes > 0 && (\n          <div className=\"w-full overflow-hidden\" style={{ height: 3, backgroundColor: isDark ? '#333' : '#E5E7EB', borderRadius: 2 }}>\n            <div style={{ height: '100%', width: `${Math.min(percentage, 100)}%`, backgroundColor: barColor, borderRadius: 2, transition: 'width 0.3s' }} />\n          </div>\n        )}\n\n        {/* T. Ofertado line removed — now an optional column (Cambio 2 spec) */}\n      </div>\n\n      {/* + Log button — ghost icon, visible only on row hover */}\n      {hasAnyAction && (\n        <button\n          onClick={handleButtonClick}\n          className=\"flex-shrink-0 flex items-center justify-center w-7 h-7 rounded-md transition-all duration-150\"\n          style={{\n            opacity: isHovered ? 1 : 0,\n            pointerEvents: isHovered ? 'auto' : 'none',\n            color: isDark ? 'rgba(255,255,255,0.35)' : '#9CA3AF',\n            backgroundColor: 'transparent',\n            border: 'none',\n          }}\n          onMouseEnter={e => {\n            e.currentTarget.style.color = isDark ? 'rgba(255,255,255,0.8)' : '#374151';\n            e.currentTarget.style.backgroundColor = isDark ? 'rgba(255,255,255,0.06)' : '#F3F4F6';\n          }}\n          onMouseLeave={e => {\n            e.currentTarget.style.color = isDark ? 'rgba(255,255,255,0.35)' : '#9CA3AF';\n            e.currentTarget.style.backgroundColor = 'transparent';\n          }}\n          title={isEs ? '+ Tiempo' : '+ Time'}\n        >\n          <Plus className=\"w-3.5 h-3.5\" />\n        </button>\n      )}\n\n      {/* 3-option Menu */}\n      <AnimatePresence>\n        {menuOpen && (\n          <motion.div\n            initial={{ opacity: 0, scale: 0.95, y: -4 }}\n            animate={{ opacity: 1, scale: 1, y: 0 }}\n            exit={{ opacity: 0, scale: 0.95, y: -4 }}\n            transition={{ duration: 0.1 }}\n            className=\"absolute right-0 top-full mt-1 z-50\"\n            style={{\n              background: isDark ? 'rgba(10,10,10,0.95)' : '#FFFFFF',\n              border: isDark ? '1px solid rgba(255,255,255,0.10)' : '1px solid #E5E7EB',\n              borderRadius: 8,\n              boxShadow: isDark ? '0 8px 32px rgba(0,0,0,0.6)' : '0 8px 32px rgba(0,0,0,0.12)',\n              backdropFilter: 'blur(16px)',\n              overflow: 'hidden',\n              minWidth: 160,\n            }}\n          >\n            {menuItems.map(item => (\n              <button\n                key={item.mode}\n                onClick={(e) => { e.stopPropagation(); handleMenuOption(item.mode); }}\n                className=\"w-full flex items-center gap-2 px-3 py-2 text-left transition-colors\"\n                style={{\n                  fontSize: 11,\n                  fontFamily: \"'JetBrains Mono', monospace\",\n                  color: isDark ? 'rgba(255,255,255,0.7)' : '#374151',\n                  background: 'transparent',\n                  border: 'none',\n                  cursor: 'pointer',\n                }}\n                onMouseEnter={(e) => { (e.target as HTMLElement).style.background = isDark ? 'rgba(255,255,255,0.06)' : '#F3F4F6'; }}\n                onMouseLeave={(e) => { (e.target as HTMLElement).style.background = 'transparent'; }}\n              >\n                <item.icon style={{ width: 12, height: 12, flexShrink: 0, opacity: 0.5 }} />\n                {item.label}\n              </button>\n            ))}\n          </motion.div>\n        )}\n      </AnimatePresence>\n\n      {/* Time Input Popover (for whichever mode was selected) */}\n      <AnimatePresence>\n        {popoverMode && (\n          <div className=\"absolute right-0 top-full mt-1 z-50\">\n            <motion.div\n              initial={{ opacity: 0, scale: 0.95, y: -4 }}\n              animate={{ opacity: 1, scale: 1, y: 0 }}\n              exit={{ opacity: 0, scale: 0.95, y: -4 }}\n              transition={{ duration: 0.12 }}\n            >\n              <TimeInputPopover\n                mode={popoverMode}\n                locale={locale as 'en' | 'es'}\n                isDark={isDark}\n                currentValue={currentPopoverValue || undefined}\n                onSave={handleSave}\n                onClose={() => setPopoverMode(null)}\n              />\n            </motion.div>\n          </div>\n        )}\n      </AnimatePresence>\n    </div>\n  );\n}\n","/**\n * TeamLoadCell - Fusión de Asignados + Carga Equipo\n * Chronos V2.0 → V3.0\n *\n * Leaf tasks: Avatar 28px + name + load badge (green/cyan/amber/red)\n * Parent tasks: Stacked avatars (max 3 + \"+N\") of unique assignees from children\n * Unassigned: Person icon + \"Sin asignar\" / \"Unassigned\"\n */\n\nimport { User } from 'lucide-react';\nimport { cn } from '../../../utils';\nimport type { Task } from '../../Gantt/types';\n\ninterface TeamLoadCellProps {\n  task: Task;\n  isDark: boolean;\n  locale?: string;\n}\n\n// Collect unique assignees from all descendants\nfunction collectUniqueAssignees(task: Task): Array<{ name: string; avatar?: string; initials?: string; color?: string }> {\n  const map = new Map<string, { name: string; avatar?: string; initials?: string; color?: string }>();\n\n  function walk(t: Task) {\n    if (t.assignees) {\n      for (const a of t.assignees) {\n        if (a.name && !map.has(a.name)) {\n          map.set(a.name, a);\n        }\n      }\n    }\n    if (t.subtasks) {\n      for (const sub of t.subtasks) walk(sub);\n    }\n  }\n\n  walk(task);\n  return Array.from(map.values());\n}\n\n// Badge color by load percentage (spec: 4 tiers)\nfunction getLoadBadgeStyle(pct: number): { bg: string; text: string } {\n  if (pct > 100) return { bg: 'rgba(239,68,68,0.15)', text: '#EF4444' };     // red — overloaded\n  if (pct >= 86) return { bg: 'rgba(245,158,11,0.15)', text: '#F59E0B' };    // amber — near limit\n  if (pct >= 61) return { bg: 'rgba(0,229,204,0.15)', text: '#00E5CC' };     // cyan — healthy busy\n  return { bg: 'rgba(34,197,94,0.15)', text: '#22C55E' };                    // green — normal\n}\n\nfunction Avatar({ assignee, size = 28, isDark }: {\n  assignee: { name: string; avatar?: string; initials?: string; color?: string };\n  size?: number;\n  isDark: boolean;\n}) {\n  const sizeClass = size === 28 ? 'w-7 h-7' : size === 24 ? 'w-6 h-6' : 'w-5 h-5';\n  const fontSize = size === 28 ? 'text-[10px]' : 'text-[9px]';\n\n  if (assignee.avatar) {\n    return (\n      <img\n        src={assignee.avatar}\n        alt={assignee.name}\n        className={cn(sizeClass, \"rounded-full object-cover ring-1 flex-shrink-0\", isDark ? \"ring-white/10\" : \"ring-gray-200\")}\n      />\n    );\n  }\n\n  return (\n    <div\n      className={cn(sizeClass, \"rounded-full flex items-center justify-center font-bold text-white ring-1 flex-shrink-0\", fontSize, isDark ? \"ring-white/10\" : \"ring-gray-200\")}\n      style={{ backgroundColor: assignee.color || '#6B7280' }}\n    >\n      {assignee.initials || assignee.name?.charAt(0)?.toUpperCase() || '?'}\n    </div>\n  );\n}\n\nexport function TeamLoadCell({\n  task,\n  isDark,\n  locale = 'en',\n}: TeamLoadCellProps) {\n  const isEs = locale === 'es';\n  const isParent = !!(task as any).hasChildren;\n  const assignee = task.assignees?.[0];\n  const teamLoad = task.teamLoad;\n\n  // ── Parent task: stacked avatars of unique descendants ──\n  if (isParent) {\n    const uniqueAssignees = collectUniqueAssignees(task);\n    if (uniqueAssignees.length === 0) return null; // empty cell per spec\n\n    const visible = uniqueAssignees.slice(0, 3);\n    const overflow = uniqueAssignees.length - 3;\n\n    return (\n      <div className=\"flex items-center\">\n        <div className=\"flex -space-x-2\">\n          {visible.map((a, i) => (\n            <Avatar key={a.name + i} assignee={a} size={24} isDark={isDark} />\n          ))}\n        </div>\n        {overflow > 0 && (\n          <span\n            className={cn(\n              'ml-1 text-[10px] font-mono',\n              isDark ? 'text-white/40' : 'text-gray-400'\n            )}\n            title={uniqueAssignees.slice(3).map(a => a.name).join(', ')}\n          >\n            +{overflow}\n          </span>\n        )}\n      </div>\n    );\n  }\n\n  // ── Leaf task: no assignee ──\n  if (!assignee) {\n    return (\n      <div className=\"flex items-center gap-2\">\n        <div\n          className={cn(\n            'w-7 h-7 rounded-full flex items-center justify-center flex-shrink-0',\n            isDark ? 'bg-white/5' : 'bg-gray-100'\n          )}\n        >\n          <User className=\"w-3.5 h-3.5\" style={{ color: '#4B5563' }} />\n        </div>\n        <span className={cn('text-[11px]', isDark ? 'text-white/30' : 'text-gray-400')}>\n          {isEs ? 'Sin asignar' : 'Unassigned'}\n        </span>\n      </div>\n    );\n  }\n\n  // ── Leaf task: assigned ──\n  const loadPercent = teamLoad?.percentage ?? 0;\n  const hasLoad = !!teamLoad && loadPercent > 0;\n  const badgeStyle = hasLoad ? getLoadBadgeStyle(loadPercent) : null;\n\n  return (\n    <div className=\"flex flex-col gap-1\">\n      {/* Row 1: Avatar + Name */}\n      <div className=\"flex items-center gap-2\">\n        <Avatar assignee={assignee} size={28} isDark={isDark} />\n        <span\n          className={cn('text-[13px] truncate', isDark ? 'text-white' : 'text-gray-900')}\n          style={{ maxWidth: '100px' }}\n        >\n          {assignee.name}\n        </span>\n      </div>\n\n      {/* Row 2: Load badge — only if teamLoad data exists */}\n      {hasLoad && badgeStyle && (\n        <span\n          className=\"px-1.5 py-0.5 rounded text-[10px] font-mono uppercase tracking-wide w-fit font-semibold\"\n          style={{\n            backgroundColor: badgeStyle.bg,\n            color: badgeStyle.text,\n          }}\n        >\n          {loadPercent}% LOAD\n        </span>\n      )}\n    </div>\n  );\n}\n","/**\n * BlockersCell - Blocker badges for Chronos V2.0\n * Shows: RFI #402 (red), Pending (amber), etc.\n */\n\nimport { cn } from '../../../utils';\n\ninterface Blocker {\n  type: string;\n  id: string;\n  severity: 'critical' | 'warning' | 'info';\n}\n\ninterface BlockersCellProps {\n  blockers?: Blocker[];\n  isDark: boolean;\n  locale?: string;\n}\n\nconst SEVERITY_STYLES = {\n  critical: 'bg-[#FF2D20]/15 text-[#FF2D20]',\n  warning: 'bg-[#FFD60A]/15 text-[#FFD60A]',\n  info: 'bg-[#3B9EFF]/15 text-[#3B9EFF]',\n};\n\nexport function BlockersCell({\n  blockers,\n  isDark,\n  locale = 'en',\n}: BlockersCellProps) {\n  if (!blockers || blockers.length === 0) {\n    return (\n      <span className={cn(\n        'text-[9px] font-mono uppercase tracking-wide',\n        isDark ? 'text-white/20' : 'text-gray-400'\n      )}>\n        {locale === 'es' ? 'Ninguno' : 'None'}\n      </span>\n    );\n  }\n\n  return (\n    <div className=\"flex items-center gap-1 flex-wrap\">\n      {blockers.map((blocker, i) => (\n        <span\n          key={`${blocker.type}-${blocker.id}-${i}`}\n          className={cn(\n            'px-1.5 py-0.5 rounded text-[9px] font-mono uppercase tracking-wide whitespace-nowrap',\n            SEVERITY_STYLES[blocker.severity]\n          )}\n        >\n          {blocker.type} #{blocker.id}\n        </span>\n      ))}\n    </div>\n  );\n}\n","/**\r\n * TableContextMenu - Context menu for ListView\r\n * @version 0.18.0\r\n */\r\n\r\nimport { useState, useEffect, useLayoutEffect, useRef } from 'react';\r\nimport {\r\n  Edit3,\r\n  Copy,\r\n  Trash2,\r\n  CheckCircle2,\r\n  PlayCircle,\r\n  Circle,\r\n  Flag,\r\n  Users,\r\n  EyeOff,\r\n  ArrowUp,\r\n  ArrowDown,\r\n  ChevronRight,\r\n  Clock,\r\n  AlertTriangle,\r\n  Link2,\r\n} from 'lucide-react';\r\nimport { cn } from '../../utils';\r\nimport type { Task } from '../Gantt/types';\r\nimport type { AvailableUser, ContextMenuState } from './types';\r\n\r\n// Local type that matches Task.assignees inline definition (includes avatar)\r\ninterface TaskAssignee {\r\n  name: string;\r\n  avatar?: string;\r\n  initials: string;\r\n  color: string;\r\n}\r\n\r\n// Helper to get initials from name\r\nfunction getInitials(name: string): string {\r\n  return name\r\n    .split(' ')\r\n    .map(n => n[0])\r\n    .join('')\r\n    .toUpperCase()\r\n    .slice(0, 2);\r\n}\r\n\r\n// Helper to get color from name\r\nfunction getAvatarColor(name: string): string {\r\n  const colors = ['blue', 'green', 'purple', 'pink', 'yellow', 'red', 'indigo', 'teal'] as const;\r\n  let hash = 0;\r\n  for (let i = 0; i < name.length; i++) {\r\n    hash = name.charCodeAt(i) + ((hash << 5) - hash);\r\n  }\r\n  return colors[Math.abs(hash) % colors.length] ?? 'blue';\r\n}\r\n\r\ninterface TableContextMenuProps {\r\n  state: ContextMenuState;\r\n  onClose: () => void;\r\n  isDark: boolean;\r\n  locale: string;\r\n  // Task actions\r\n  onTaskEdit?: (task: Task) => void;\r\n  onTaskDuplicate?: (task: Task) => void;\r\n  onTaskDelete?: (taskId: string) => void;\r\n  onTaskUpdate?: (task: Task) => void;\r\n  // Column actions\r\n  onColumnHide?: (columnId: string) => void;\r\n  onColumnSort?: (columnId: string, direction: 'asc' | 'desc') => void;\r\n  // Users for assignment\r\n  availableUsers?: AvailableUser[];\r\n  // v2.1.0: RBAC context menu actions\r\n  onOpenTimeLog?: (task: Task) => void;\r\n  onReportBlocker?: (task: Task) => void;\r\n  onCopyTaskLink?: (task: Task) => void;\r\n  // v2.5.0: Hierarchy actions\r\n  onTaskMove?: (taskId: string, direction: 'up' | 'down') => void;\r\n  onTaskIndent?: (taskId: string) => void;\r\n  onTaskOutdent?: (taskId: string) => void;\r\n}\r\n\r\ninterface MenuItem {\r\n  id: string;\r\n  label: string;\r\n  icon: React.ReactNode;\r\n  onClick?: () => void;\r\n  submenu?: MenuItem[];\r\n  separator?: boolean;\r\n  danger?: boolean;\r\n}\r\n\r\nexport function TableContextMenu({\r\n  state,\r\n  onClose,\r\n  isDark,\r\n  locale,\r\n  onTaskEdit,\r\n  onTaskDuplicate,\r\n  onTaskDelete,\r\n  onTaskUpdate,\r\n  onColumnHide,\r\n  onColumnSort,\r\n  availableUsers = [],\r\n  onOpenTimeLog,\r\n  onReportBlocker,\r\n  onCopyTaskLink,\r\n  onTaskMove,\r\n  onTaskIndent,\r\n  onTaskOutdent,\r\n}: TableContextMenuProps) {\r\n  const menuRef = useRef<HTMLDivElement>(null);\r\n  const t = locale === 'es' ? translations.es : translations.en;\r\n\r\n  // Adjusted position so the menu never overflows the viewport. Starts at the\r\n  // click coords and is corrected (flip up / shift left) after measuring.\r\n  const [pos, setPos] = useState<{ left: number; top: number }>({ left: state.x, top: state.y });\r\n\r\n  useLayoutEffect(() => {\r\n    setPos({ left: state.x, top: state.y }); // reset for the new open\r\n    const el = menuRef.current;\r\n    if (!el) return;\r\n    const rect = el.getBoundingClientRect();\r\n    const margin = 8;\r\n    let left = state.x;\r\n    let top = state.y;\r\n    // Overflow bottom → open upward from the click point.\r\n    if (state.y + rect.height > window.innerHeight - margin) {\r\n      top = Math.max(margin, state.y - rect.height);\r\n    }\r\n    // Overflow right → shift left so it fits.\r\n    if (state.x + rect.width > window.innerWidth - margin) {\r\n      left = Math.max(margin, window.innerWidth - rect.width - margin);\r\n    }\r\n    if (left !== state.x || top !== state.y) setPos({ left, top });\r\n  }, [state.x, state.y, state.isOpen]);\r\n\r\n  // Close on click outside\r\n  useEffect(() => {\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\r\n        onClose();\r\n      }\r\n    };\r\n\r\n    const handleEscape = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape') onClose();\r\n    };\r\n\r\n    document.addEventListener('mousedown', handleClickOutside);\r\n    document.addEventListener('keydown', handleEscape);\r\n    return () => {\r\n      document.removeEventListener('mousedown', handleClickOutside);\r\n      document.removeEventListener('keydown', handleEscape);\r\n    };\r\n  }, [onClose]);\r\n\r\n  if (!state.isOpen) return null;\r\n\r\n  // Build menu items based on context type\r\n  const getTaskMenuItems = (): MenuItem[] => {\r\n    if (!state.task) return [];\r\n\r\n    const items: MenuItem[] = [];\r\n\r\n    // Edit\r\n    if (onTaskEdit) {\r\n      items.push({\r\n        id: 'edit',\r\n        label: t.edit,\r\n        icon: <Edit3 className=\"w-4 h-4\" />,\r\n        onClick: () => {\r\n          onTaskEdit(state.task!);\r\n          onClose();\r\n        },\r\n      });\r\n    }\r\n\r\n    items.push({ id: 'sep1', label: '', icon: null, separator: true });\r\n\r\n    // Change status submenu\r\n    if (onTaskUpdate) {\r\n      items.push({\r\n        id: 'status',\r\n        label: t.changeStatus,\r\n        icon: <CheckCircle2 className=\"w-4 h-4\" />,\r\n        submenu: [\r\n          {\r\n            id: 'status-todo',\r\n            label: t.todo,\r\n            icon: <Circle className=\"w-4 h-4 text-gray-400\" />,\r\n            onClick: () => {\r\n              onTaskUpdate({ ...state.task!, status: 'todo', progress: 0 });\r\n              onClose();\r\n            },\r\n          },\r\n          {\r\n            id: 'status-in-progress',\r\n            label: t.inProgress,\r\n            icon: <PlayCircle className=\"w-4 h-4 text-[#00E5CC]\" />,\r\n            onClick: () => {\r\n              onTaskUpdate({ ...state.task!, status: 'in-progress', progress: state.task!.progress || 50 });\r\n              onClose();\r\n            },\r\n          },\r\n          {\r\n            id: 'status-completed',\r\n            label: t.completed,\r\n            icon: <CheckCircle2 className=\"w-4 h-4 text-green-500\" />,\r\n            onClick: () => {\r\n              onTaskUpdate({ ...state.task!, status: 'completed', progress: 100 });\r\n              onClose();\r\n            },\r\n          },\r\n        ],\r\n      });\r\n\r\n      // Change priority submenu\r\n      items.push({\r\n        id: 'priority',\r\n        label: t.changePriority,\r\n        icon: <Flag className=\"w-4 h-4\" />,\r\n        submenu: [\r\n          {\r\n            id: 'priority-urgent',\r\n            label: t.urgent,\r\n            icon: <div className=\"w-3 h-3 rounded-full bg-red-500\" />,\r\n            onClick: () => {\r\n              onTaskUpdate({ ...state.task!, priority: 'urgent' });\r\n              onClose();\r\n            },\r\n          },\r\n          {\r\n            id: 'priority-high',\r\n            label: t.high,\r\n            icon: <div className=\"w-3 h-3 rounded-full bg-orange-500\" />,\r\n            onClick: () => {\r\n              onTaskUpdate({ ...state.task!, priority: 'high' });\r\n              onClose();\r\n            },\r\n          },\r\n          {\r\n            id: 'priority-medium',\r\n            label: t.medium,\r\n            icon: <div className=\"w-3 h-3 rounded-full bg-yellow-500\" />,\r\n            onClick: () => {\r\n              onTaskUpdate({ ...state.task!, priority: 'medium' });\r\n              onClose();\r\n            },\r\n          },\r\n          {\r\n            id: 'priority-low',\r\n            label: t.low,\r\n            icon: <div className=\"w-3 h-3 rounded-full bg-[#00E5CC]\" />,\r\n            onClick: () => {\r\n              onTaskUpdate({ ...state.task!, priority: 'low' });\r\n              onClose();\r\n            },\r\n          },\r\n        ],\r\n      });\r\n\r\n      // Assign user submenu (if users available)\r\n      if (availableUsers.length > 0) {\r\n        items.push({\r\n          id: 'assign',\r\n          label: t.assignUser,\r\n          icon: <Users className=\"w-4 h-4\" />,\r\n          submenu: availableUsers.slice(0, 5).map((user) => ({\r\n            id: `assign-${user.id}`,\r\n            label: user.name,\r\n            icon: (\r\n              <div\r\n                className=\"w-5 h-5 rounded-full flex items-center justify-center text-[10px] text-white bg-[#00E5CC]\"\r\n              >\r\n                {user.name.charAt(0).toUpperCase()}\r\n              </div>\r\n            ),\r\n            onClick: () => {\r\n              const currentAssignees = state.task!.assignees || [];\r\n              // Check if user is already assigned by name\r\n              const isAlreadyAssigned = currentAssignees.some(a => a.name === user.name);\r\n              const newAssignees: TaskAssignee[] = isAlreadyAssigned\r\n                ? currentAssignees.filter(a => a.name !== user.name)\r\n                : [...currentAssignees, {\r\n                    name: user.name,\r\n                    initials: getInitials(user.name),\r\n                    color: user.color || getAvatarColor(user.name),\r\n                    avatar: user.avatarUrl,\r\n                  }];\r\n              onTaskUpdate({ ...state.task!, assignees: newAssignees });\r\n              onClose();\r\n            },\r\n          })),\r\n        });\r\n      }\r\n    }\r\n\r\n    // v2.1.0: Log Time\r\n    if (onOpenTimeLog) {\r\n      items.push({\r\n        id: 'log-time',\r\n        label: t.logTime,\r\n        icon: <Clock className=\"w-4 h-4\" />,\r\n        onClick: () => {\r\n          onOpenTimeLog(state.task!);\r\n          onClose();\r\n        },\r\n      });\r\n    }\r\n\r\n    // v2.1.0: Report Blocker\r\n    if (onReportBlocker) {\r\n      items.push({\r\n        id: 'report-blocker',\r\n        label: t.reportBlocker,\r\n        icon: <AlertTriangle className=\"w-4 h-4\" />,\r\n        onClick: () => {\r\n          onReportBlocker(state.task!);\r\n          onClose();\r\n        },\r\n      });\r\n    }\r\n\r\n    // v2.1.0: Copy Link\r\n    if (onCopyTaskLink) {\r\n      items.push({\r\n        id: 'copy-link',\r\n        label: t.copyLink,\r\n        icon: <Link2 className=\"w-4 h-4\" />,\r\n        onClick: () => {\r\n          onCopyTaskLink(state.task!);\r\n          onClose();\r\n        },\r\n      });\r\n    }\r\n\r\n    items.push({ id: 'sep2', label: '', icon: null, separator: true });\r\n\r\n    // Duplicate\r\n    if (onTaskDuplicate) {\r\n      items.push({\r\n        id: 'duplicate',\r\n        label: t.duplicate,\r\n        icon: <Copy className=\"w-4 h-4\" />,\r\n        onClick: () => {\r\n          onTaskDuplicate(state.task!);\r\n          onClose();\r\n        },\r\n      });\r\n    }\r\n\r\n    // v2.5.0: Hierarchy actions (move, indent, outdent)\r\n    if (onTaskMove || onTaskIndent || onTaskOutdent) {\r\n      items.push({ id: 'sep3', label: '', icon: null, separator: true });\r\n      if (onTaskMove) {\r\n        items.push({\r\n          id: 'move-up',\r\n          label: t.moveUp || (locale === 'es' ? 'Mover arriba' : 'Move up'),\r\n          icon: <ArrowUp className=\"w-4 h-4\" />,\r\n          onClick: () => { onTaskMove(state.task!.id, 'up'); onClose(); },\r\n        });\r\n        items.push({\r\n          id: 'move-down',\r\n          label: t.moveDown || (locale === 'es' ? 'Mover abajo' : 'Move down'),\r\n          icon: <ArrowDown className=\"w-4 h-4\" />,\r\n          onClick: () => { onTaskMove(state.task!.id, 'down'); onClose(); },\r\n        });\r\n      }\r\n      if (onTaskIndent) {\r\n        items.push({\r\n          id: 'indent',\r\n          label: t.indent || (locale === 'es' ? 'Convertir en subtarea' : 'Make subtask'),\r\n          icon: <ChevronRight className=\"w-4 h-4\" />,\r\n          onClick: () => { onTaskIndent(state.task!.id); onClose(); },\r\n        });\r\n      }\r\n      if (onTaskOutdent) {\r\n        items.push({\r\n          id: 'outdent',\r\n          label: t.outdent || (locale === 'es' ? 'Sacar de subtarea' : 'Remove from parent'),\r\n          icon: <ArrowUp className=\"w-4 h-4 -rotate-90\" />,\r\n          onClick: () => { onTaskOutdent(state.task!.id); onClose(); },\r\n        });\r\n      }\r\n    }\r\n\r\n    // Delete\r\n    if (onTaskDelete) {\r\n      items.push({\r\n        id: 'delete',\r\n        label: t.delete,\r\n        icon: <Trash2 className=\"w-4 h-4\" />,\r\n        danger: true,\r\n        onClick: () => {\r\n          onTaskDelete(state.task!.id);\r\n          onClose();\r\n        },\r\n      });\r\n    }\r\n\r\n    return items;\r\n  };\r\n\r\n  const getHeaderMenuItems = (): MenuItem[] => {\r\n    if (!state.columnId) return [];\r\n\r\n    const items: MenuItem[] = [];\r\n\r\n    // Sort options\r\n    if (onColumnSort) {\r\n      items.push({\r\n        id: 'sort-asc',\r\n        label: t.sortAsc,\r\n        icon: <ArrowUp className=\"w-4 h-4\" />,\r\n        onClick: () => {\r\n          onColumnSort(state.columnId!, 'asc');\r\n          onClose();\r\n        },\r\n      });\r\n      items.push({\r\n        id: 'sort-desc',\r\n        label: t.sortDesc,\r\n        icon: <ArrowDown className=\"w-4 h-4\" />,\r\n        onClick: () => {\r\n          onColumnSort(state.columnId!, 'desc');\r\n          onClose();\r\n        },\r\n      });\r\n    }\r\n\r\n    // Hide column (not for name column)\r\n    if (onColumnHide && state.columnId !== 'name') {\r\n      items.push({ id: 'sep-hide', label: '', icon: null, separator: true });\r\n      items.push({\r\n        id: 'hide',\r\n        label: t.hideColumn,\r\n        icon: <EyeOff className=\"w-4 h-4\" />,\r\n        onClick: () => {\r\n          onColumnHide(state.columnId!);\r\n          onClose();\r\n        },\r\n      });\r\n    }\r\n\r\n    return items;\r\n  };\r\n\r\n  const menuItems = state.type === 'task' ? getTaskMenuItems() : getHeaderMenuItems();\r\n\r\n  // Position from the overflow-corrected coords (see useLayoutEffect above).\r\n  const menuStyle: React.CSSProperties = {\r\n    position: 'fixed',\r\n    left: pos.left,\r\n    top: pos.top,\r\n    zIndex: 9999,\r\n  };\r\n\r\n  return (\r\n    <div\r\n      ref={menuRef}\r\n      style={menuStyle}\r\n      className={cn(\r\n        'py-1 rounded-lg shadow-xl border min-w-[180px]',\r\n        isDark ? 'bg-[#0D0D0D] border-[#222]' : 'bg-white border-gray-200'\r\n      )}\r\n    >\r\n      {menuItems.map((item) => {\r\n        if (item.separator) {\r\n          return (\r\n            <div\r\n              key={item.id}\r\n              className={cn('my-1 h-px', isDark ? 'bg-white/[0.05]' : 'bg-gray-200')}\r\n            />\r\n          );\r\n        }\r\n\r\n        if (item.submenu) {\r\n          return (\r\n            <SubmenuItem\r\n              key={item.id}\r\n              item={item}\r\n              isDark={isDark}\r\n            />\r\n          );\r\n        }\r\n\r\n        return (\r\n          <button\r\n            key={item.id}\r\n            onClick={item.onClick}\r\n            className={cn(\r\n              'w-full flex items-center gap-3 px-3 py-2 text-sm transition-colors',\r\n              isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100',\r\n              item.danger\r\n                ? 'text-red-500 hover:text-red-600'\r\n                : isDark ? 'text-white' : 'text-gray-700'\r\n            )}\r\n          >\r\n            <span className={cn(item.danger ? 'text-red-500' : isDark ? 'text-white/60' : 'text-gray-400')}>\r\n              {item.icon}\r\n            </span>\r\n            {item.label}\r\n          </button>\r\n        );\r\n      })}\r\n    </div>\r\n  );\r\n}\r\n\r\n// Submenu component with hover behavior\r\nfunction SubmenuItem({ item, isDark }: { item: MenuItem; isDark: boolean }) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const timeoutRef = useRef<NodeJS.Timeout>();\r\n\r\n  const handleMouseEnter = () => {\r\n    if (timeoutRef.current) clearTimeout(timeoutRef.current);\r\n    setIsOpen(true);\r\n  };\r\n\r\n  const handleMouseLeave = () => {\r\n    timeoutRef.current = setTimeout(() => setIsOpen(false), 150);\r\n  };\r\n\r\n  return (\r\n    <div\r\n      className=\"relative\"\r\n      onMouseEnter={handleMouseEnter}\r\n      onMouseLeave={handleMouseLeave}\r\n    >\r\n      <button\r\n        className={cn(\r\n          'w-full flex items-center gap-3 px-3 py-2 text-sm transition-colors',\r\n          isDark ? 'hover:bg-white/[0.05] text-white' : 'hover:bg-gray-100 text-gray-700'\r\n        )}\r\n      >\r\n        <span className={isDark ? 'text-white/60' : 'text-gray-400'}>\r\n          {item.icon}\r\n        </span>\r\n        <span className=\"flex-1\">{item.label}</span>\r\n        <ChevronRight className={cn('w-4 h-4', isDark ? 'text-white/30' : 'text-gray-400')} />\r\n      </button>\r\n\r\n      {isOpen && item.submenu && (\r\n        <div\r\n          className={cn(\r\n            'absolute left-full top-0 ml-1 py-1 rounded-lg shadow-xl border min-w-[160px]',\r\n            isDark ? 'bg-[#0D0D0D] border-[#222]' : 'bg-white border-gray-200'\r\n          )}\r\n        >\r\n          {item.submenu.map((subItem) => (\r\n            <button\r\n              key={subItem.id}\r\n              onClick={subItem.onClick}\r\n              className={cn(\r\n                'w-full flex items-center gap-3 px-3 py-2 text-sm transition-colors',\r\n                isDark ? 'hover:bg-white/[0.05] text-white' : 'hover:bg-gray-100 text-gray-700'\r\n              )}\r\n            >\r\n              <span className={isDark ? 'text-white/60' : 'text-gray-400'}>\r\n                {subItem.icon}\r\n              </span>\r\n              {subItem.label}\r\n            </button>\r\n          ))}\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n\r\n// Translations\r\nconst translations = {\r\n  en: {\r\n    edit: 'Edit',\r\n    changeStatus: 'Change status',\r\n    changePriority: 'Change priority',\r\n    assignUser: 'Assign user',\r\n    duplicate: 'Duplicate',\r\n    moveUp: 'Move up',\r\n    moveDown: 'Move down',\r\n    indent: 'Make subtask',\r\n    outdent: 'Remove from parent',\r\n    delete: 'Delete',\r\n    todo: 'To Do',\r\n    inProgress: 'In Progress',\r\n    completed: 'Completed',\r\n    urgent: 'Urgent',\r\n    high: 'High',\r\n    medium: 'Medium',\r\n    low: 'Low',\r\n    sortAsc: 'Sort A → Z',\r\n    sortDesc: 'Sort Z → A',\r\n    hideColumn: 'Hide column',\r\n    logTime: 'Log Time',\r\n    reportBlocker: 'Report Blocker',\r\n    copyLink: 'Copy Link',\r\n  },\r\n  es: {\r\n    edit: 'Editar',\r\n    changeStatus: 'Cambiar estado',\r\n    changePriority: 'Cambiar prioridad',\r\n    assignUser: 'Asignar usuario',\r\n    duplicate: 'Duplicar',\r\n    moveUp: 'Mover arriba',\r\n    moveDown: 'Mover abajo',\r\n    indent: 'Convertir en subtarea',\r\n    outdent: 'Sacar de subtarea',\r\n    delete: 'Eliminar',\r\n    todo: 'Pendiente',\r\n    inProgress: 'En Progreso',\r\n    completed: 'Completado',\r\n    urgent: 'Urgente',\r\n    high: 'Alta',\r\n    medium: 'Media',\r\n    low: 'Baja',\r\n    sortAsc: 'Ordenar A → Z',\r\n    sortDesc: 'Ordenar Z → A',\r\n    hideColumn: 'Ocultar columna',\r\n    logTime: 'Registrar Tiempo',\r\n    reportBlocker: 'Reportar Bloqueante',\r\n    copyLink: 'Copiar Enlace',\r\n  },\r\n};\r\n","/**\r\n * ColumnSelector - Chronos V2 glass panel for column visibility\r\n * @version 2.3.0\r\n */\r\n\r\nimport { useState, useEffect, useRef, useLayoutEffect, useMemo } from 'react';\r\nimport {\r\n  X,\r\n  Search,\r\n  Check,\r\n  Type,\r\n  Hash,\r\n  Calendar,\r\n  ChevronDown,\r\n  CheckSquare,\r\n  CircleDot,\r\n  Flag,\r\n  Users,\r\n  CalendarCheck,\r\n  BarChart,\r\n  Tag,\r\n  Clock,\r\n  Timer,\r\n  FileText,\r\n  CalendarClock,\r\n  BarChart3,\r\n  AlertTriangle,\r\n  Paperclip,\r\n} from 'lucide-react';\r\nimport type { TableColumn, CustomFieldDefinition, ColumnType } from './types';\r\n\r\ninterface ColumnSelectorProps {\r\n  isOpen: boolean;\r\n  onClose: () => void;\r\n  columns: TableColumn[];\r\n  customFields?: CustomFieldDefinition[];\r\n  onColumnsChange: (columns: TableColumn[]) => void;\r\n  /** Callback to open create custom field modal */\r\n  onCreateCustomField?: () => void;\r\n  /**\r\n   * v1.9.27 — las columnas DENSAS: estimado, ejecutado, ofertado y peso.\r\n   *\r\n   * Mesh las esconde POR SIMPLICIDAD, no por confidencialidad: una lista con\r\n   * cuatro columnas de minutos deja de leerse. Ofrecerlas en el selector\r\n   * cuando la Lista no las usa es peor que no tenerlas — la persona las marca\r\n   * y no pasa nada.\r\n   *\r\n   * Por defecto `true` para no cambiar a quien ya lo usaba.\r\n   */\r\n  mostrarColumnasDensas?: boolean;\r\n  isDark: boolean;\r\n  locale: string;\r\n}\r\n\r\n// Icon mapping for column types\r\nconst COLUMN_ICONS: Record<ColumnType, React.ReactNode> = {\r\n  name: <Type className=\"w-4 h-4\" />,\r\n  status: <CircleDot className=\"w-4 h-4\" />,\r\n  priority: <Flag className=\"w-4 h-4\" />,\r\n  assignees: <Users className=\"w-4 h-4\" />,\r\n  startDate: <Calendar className=\"w-4 h-4\" />,\r\n  endDate: <CalendarCheck className=\"w-4 h-4\" />,\r\n  progress: <BarChart className=\"w-4 h-4\" />,\r\n  tags: <Tag className=\"w-4 h-4\" />,\r\n  // v0.18.3: Time tracking columns\r\n  estimatedTime: <Clock className=\"w-4 h-4\" />,\r\n  // v1.1.0: Quoted time column\r\n  quotedTime: <FileText className=\"w-4 h-4\" />,\r\n  elapsedTime: <Timer className=\"w-4 h-4\" />,\r\n  // v1.2.0: Three-tier time tracking columns\r\n  effortMinutes: <Clock className=\"w-4 h-4\" />,\r\n  timeLoggedMinutes: <Timer className=\"w-4 h-4\" />,\r\n  soldEffortMinutes: <FileText className=\"w-4 h-4\" />,\r\n  // v2.0.0: Chronos Interactive Time Manager columns\r\n  scheduleVariance: <CalendarClock className=\"w-4 h-4\" />,\r\n  hoursBar: <BarChart3 className=\"w-4 h-4\" />,\r\n  teamLoad: <Users className=\"w-4 h-4\" />,\r\n  blockers: <AlertTriangle className=\"w-4 h-4\" />,\r\n  weight: <BarChart className=\"w-4 h-4\" />,\r\n  // Custom field types\r\n  text: <Type className=\"w-4 h-4\" />,\r\n  number: <Hash className=\"w-4 h-4\" />,\r\n  date: <Calendar className=\"w-4 h-4\" />,\r\n  dropdown: <ChevronDown className=\"w-4 h-4\" />,\r\n  checkbox: <CheckSquare className=\"w-4 h-4\" />,\r\n  // v1.9.24\r\n  multiselect: <Tag className=\"w-4 h-4\" />,\r\n  person: <Users className=\"w-4 h-4\" />,\r\n  file: <Paperclip className=\"w-4 h-4\" />,\r\n};\r\n\r\n// Standard fields that are always available\r\nconst STANDARD_COLUMNS: ColumnType[] = ['name', 'status', 'priority', 'startDate', 'endDate', 'progress', 'tags', 'effortMinutes', 'timeLoggedMinutes', 'soldEffortMinutes', 'weight'];\r\n\r\nexport function ColumnSelector({\r\n  isOpen,\r\n  onClose,\r\n  columns,\r\n  customFields = [],\r\n  onColumnsChange,\r\n  onCreateCustomField: _onCreateCustomField, // Disabled - custom fields feature not active\r\n  mostrarColumnasDensas = true,\r\n  isDark,\r\n  locale,\r\n}: ColumnSelectorProps) {\r\n  const [search, setSearch] = useState('');\r\n  const [maxHeight, setMaxHeight] = useState<number | null>(null);\r\n  const [fixedPos, setFixedPos] = useState<{ top: number; right: number } | null>(null);\r\n  const panelRef = useRef<HTMLDivElement>(null);\r\n  const t = locale === 'es' ? translations.es : translations.en;\r\n\r\n  // Calculate max height based on panel position in viewport\r\n  useLayoutEffect(() => {\r\n    if (!isOpen || !panelRef.current) return;\r\n\r\n    const updateMaxHeight = () => {\r\n      if (!panelRef.current) return;\r\n      // Position the fixed panel relative to its parent (the + button container)\r\n      const parent = panelRef.current.parentElement;\r\n      if (parent) {\r\n        const parentRect = parent.getBoundingClientRect();\r\n        setFixedPos({ top: parentRect.bottom + 4, right: window.innerWidth - parentRect.right });\r\n      }\r\n      const rect = panelRef.current.getBoundingClientRect();\r\n      const viewportHeight = window.innerHeight;\r\n      const availableHeight = viewportHeight - rect.top - 20;\r\n      setMaxHeight(Math.max(300, availableHeight));\r\n    };\r\n\r\n    // Initial calculation after render\r\n    requestAnimationFrame(updateMaxHeight);\r\n\r\n    // Recalculate on resize\r\n    window.addEventListener('resize', updateMaxHeight);\r\n    return () => window.removeEventListener('resize', updateMaxHeight);\r\n  }, [isOpen]);\r\n\r\n  // Close on click outside (with delay to prevent immediate close)\r\n  useEffect(() => {\r\n    if (!isOpen) return;\r\n\r\n    // Small delay to prevent immediate close from the same click that opened it\r\n    const timeoutId = setTimeout(() => {\r\n      const handleClickOutside = (e: MouseEvent) => {\r\n        if (panelRef.current && !panelRef.current.contains(e.target as Node)) {\r\n          onClose();\r\n        }\r\n      };\r\n\r\n      const handleEscape = (e: KeyboardEvent) => {\r\n        if (e.key === 'Escape') onClose();\r\n      };\r\n\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n      document.addEventListener('keydown', handleEscape);\r\n\r\n      // Store cleanup in ref for effect cleanup\r\n      (panelRef as any)._cleanup = () => {\r\n        document.removeEventListener('mousedown', handleClickOutside);\r\n        document.removeEventListener('keydown', handleEscape);\r\n      };\r\n    }, 100);\r\n\r\n    return () => {\r\n      clearTimeout(timeoutId);\r\n      if ((panelRef as any)._cleanup) {\r\n        (panelRef as any)._cleanup();\r\n      }\r\n    };\r\n  }, [isOpen, onClose]);\r\n\r\n  // Build complete list: STANDARD_COLUMNS + any columns already in config (teamLoad, blockers, etc.)\r\n  // Must be before early return to respect hooks rules\r\n  const allColumnTypes = useMemo(() => {\r\n    const types = new Set<ColumnType>([...STANDARD_COLUMNS]);\r\n    columns.forEach(col => {\r\n      if (col.type && col.type !== 'assignees') types.add(col.type);\r\n    });\r\n    return Array.from(types);\r\n  }, [columns]);\r\n\r\n  if (!isOpen) return null;\r\n\r\n  const getColumnLabel = (type: ColumnType): string => {\r\n    // First check translations, then check the existing column config for its label\r\n    const translated = (t.columns as any)[type];\r\n    if (translated) return translated;\r\n    const existingCol = columns.find(c => c.type === type);\r\n    if (existingCol?.label) return existingCol.label;\r\n    return type;\r\n  };\r\n\r\n  const toggleColumnVisibility = (columnId: string) => {\r\n    // Don't allow hiding the name column\r\n    if (columnId === 'name') return;\r\n\r\n    const newColumns = columns.map((col) =>\r\n      col.id === columnId ? { ...col, visible: !col.visible } : col\r\n    );\r\n    onColumnsChange(newColumns);\r\n  };\r\n\r\n  const addColumn = (type: ColumnType, customFieldId?: string) => {\r\n    // Check if column already exists\r\n    const existingColumn = columns.find(\r\n      (col) => col.type === type && (!customFieldId || col.customFieldId === customFieldId)\r\n    );\r\n\r\n    if (existingColumn) {\r\n      // Just make it visible\r\n      toggleColumnVisibility(existingColumn.id);\r\n      return;\r\n    }\r\n\r\n    // Create new column\r\n    const newColumn: TableColumn = {\r\n      id: customFieldId || type,\r\n      type,\r\n      label: customFieldId\r\n        ? customFields.find((f) => f.id === customFieldId)?.name || type\r\n        : getColumnLabel(type),\r\n      width: 120,\r\n      visible: true,\r\n      sortable: true,\r\n      resizable: true,\r\n      customFieldId,\r\n    };\r\n\r\n    onColumnsChange([...columns, newColumn]);\r\n  };\r\n\r\n  // Filter columns by search (exclude deprecated 'assignees')\r\n  /* v1.9.27 — las densas se esconden con la capacidad apagada. */\r\n  const DENSAS: ColumnType[] = ['effortMinutes', 'timeLoggedMinutes', 'soldEffortMinutes', 'weight'];\r\n\r\n  const filteredStandardColumns = allColumnTypes.filter((type) =>\r\n    type !== 'assignees'\r\n    && (mostrarColumnasDensas || !DENSAS.includes(type))\r\n    && getColumnLabel(type).toLowerCase().includes(search.toLowerCase())\r\n  );\r\n\r\n  const filteredCustomFields = customFields.filter((field) =>\r\n    field.name.toLowerCase().includes(search.toLowerCase())\r\n  );\r\n\r\n  // Chronos accent color\r\n  const accent = isDark ? '#00E5FF' : '#00E5CC';\r\n\r\n  return (\r\n    <div\r\n      ref={panelRef}\r\n      style={{\r\n        ...(maxHeight ? { maxHeight: `${maxHeight}px` } : {}),\r\n        ...(fixedPos ? { top: fixedPos.top, right: fixedPos.right } : {}),\r\n        background: isDark ? '#111114' : '#FFFFFF',\r\n        border: `1px solid ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.08)'}`,\r\n        boxShadow: isDark\r\n          ? '0 8px 32px rgba(0,0,0,0.7)'\r\n          : '0 8px 32px rgba(0,0,0,0.12)',\r\n        zIndex: 99999,\r\n      }}\r\n      className=\"fixed w-64 rounded-xl flex flex-col\"\r\n    >\r\n      {/* Header */}\r\n      <div\r\n        className=\"flex items-center justify-between px-3.5 py-2.5\"\r\n        style={{ borderBottom: `1px solid ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'}` }}\r\n      >\r\n        <span\r\n          style={{\r\n            fontSize: 10,\r\n            fontWeight: 600,\r\n            letterSpacing: '0.08em',\r\n            color: isDark ? 'rgba(255,255,255,0.4)' : 'rgba(0,0,0,0.35)',\r\n            fontFamily: 'JetBrains Mono, monospace',\r\n          }}\r\n        >\r\n          {t.title.toUpperCase()}\r\n        </span>\r\n        <button\r\n          onClick={onClose}\r\n          className=\"w-6 h-6 rounded-md flex items-center justify-center transition-colors\"\r\n          style={{ color: isDark ? 'rgba(255,255,255,0.3)' : 'rgba(0,0,0,0.3)' }}\r\n          onMouseEnter={e => {\r\n            e.currentTarget.style.backgroundColor = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.05)';\r\n            e.currentTarget.style.color = isDark ? 'rgba(255,255,255,0.7)' : 'rgba(0,0,0,0.6)';\r\n          }}\r\n          onMouseLeave={e => {\r\n            e.currentTarget.style.backgroundColor = 'transparent';\r\n            e.currentTarget.style.color = isDark ? 'rgba(255,255,255,0.3)' : 'rgba(0,0,0,0.3)';\r\n          }}\r\n        >\r\n          <X className=\"w-3.5 h-3.5\" />\r\n        </button>\r\n      </div>\r\n\r\n      {/* Search */}\r\n      <div className=\"px-3 py-2\">\r\n        <div className=\"relative\">\r\n          <Search\r\n            className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5\"\r\n            style={{ color: isDark ? 'rgba(255,255,255,0.2)' : 'rgba(0,0,0,0.25)' }}\r\n          />\r\n          <input\r\n            type=\"text\"\r\n            value={search}\r\n            onChange={(e) => setSearch(e.target.value)}\r\n            placeholder={t.searchPlaceholder}\r\n            style={{\r\n              fontSize: 12,\r\n              background: isDark ? 'rgba(255,255,255,0.04)' : 'rgba(0,0,0,0.03)',\r\n              border: `1px solid ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'}`,\r\n              color: isDark ? 'rgba(255,255,255,0.85)' : 'rgba(0,0,0,0.8)',\r\n            }}\r\n            className=\"w-full pl-8 pr-3 py-1.5 rounded-lg outline-none placeholder:opacity-40 transition-colors focus:border-[var(--focus-border)]\"\r\n            ref={(el) => {\r\n              if (el) el.style.setProperty('--focus-border', accent);\r\n            }}\r\n            onFocus={e => {\r\n              e.currentTarget.style.borderColor = accent;\r\n              e.currentTarget.style.background = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.04)';\r\n            }}\r\n            onBlur={e => {\r\n              e.currentTarget.style.borderColor = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)';\r\n              e.currentTarget.style.background = isDark ? 'rgba(255,255,255,0.04)' : 'rgba(0,0,0,0.03)';\r\n            }}\r\n          />\r\n        </div>\r\n      </div>\r\n\r\n      {/* Scrollable content */}\r\n      <div\r\n        className=\"overflow-y-auto flex-1 min-h-0 overscroll-contain px-2 pb-2\"\r\n        onWheel={(e) => e.stopPropagation()}\r\n      >\r\n        {/* Standard Fields */}\r\n        <div className=\"mb-1\">\r\n          <div\r\n            className=\"px-1.5 py-1.5\"\r\n            style={{\r\n              fontSize: 9,\r\n              fontWeight: 600,\r\n              letterSpacing: '0.1em',\r\n              color: isDark ? 'rgba(255,255,255,0.25)' : 'rgba(0,0,0,0.3)',\r\n              fontFamily: 'JetBrains Mono, monospace',\r\n            }}\r\n          >\r\n            {t.standardFields.toUpperCase()}\r\n          </div>\r\n          <div className=\"space-y-px\">\r\n            {filteredStandardColumns.map((type) => {\r\n              const column = columns.find((c) => c.type === type && !c.customFieldId);\r\n              const isVisible = column?.visible ?? false;\r\n              const isName = type === 'name';\r\n\r\n              return (\r\n                <button\r\n                  key={type}\r\n                  onClick={() => {\r\n                    if (isName) return;\r\n                    if (column) {\r\n                      toggleColumnVisibility(column.id);\r\n                    } else {\r\n                      addColumn(type);\r\n                    }\r\n                  }}\r\n                  disabled={isName}\r\n                  className=\"w-full flex items-center gap-2.5 px-2 py-[5px] rounded-md transition-colors\"\r\n                  style={{\r\n                    opacity: isName ? 0.4 : 1,\r\n                    cursor: isName ? 'not-allowed' : 'pointer',\r\n                  }}\r\n                  onMouseEnter={e => {\r\n                    if (!isName) e.currentTarget.style.backgroundColor = isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.04)';\r\n                  }}\r\n                  onMouseLeave={e => {\r\n                    e.currentTarget.style.backgroundColor = 'transparent';\r\n                  }}\r\n                >\r\n                  {/* Checkbox — Chronos style */}\r\n                  <div\r\n                    className=\"w-4 h-4 rounded flex items-center justify-center flex-shrink-0 transition-all\"\r\n                    style={{\r\n                      background: isVisible ? accent : 'transparent',\r\n                      border: isVisible ? `1.5px solid ${accent}` : `1.5px solid ${isDark ? 'rgba(255,255,255,0.15)' : 'rgba(0,0,0,0.15)'}`,\r\n                      boxShadow: isVisible ? `0 0 6px ${accent}40` : 'none',\r\n                    }}\r\n                  >\r\n                    {isVisible && <Check className=\"w-2.5 h-2.5 text-white\" strokeWidth={3} />}\r\n                  </div>\r\n                  {/* Icon */}\r\n                  <span\r\n                    className=\"flex-shrink-0 [&>svg]:w-3.5 [&>svg]:h-3.5\"\r\n                    style={{ color: isVisible ? accent : isDark ? 'rgba(255,255,255,0.3)' : 'rgba(0,0,0,0.3)' }}\r\n                  >\r\n                    {COLUMN_ICONS[type]}\r\n                  </span>\r\n                  {/* Label */}\r\n                  <span\r\n                    className=\"truncate\"\r\n                    style={{\r\n                      fontSize: 12,\r\n                      fontWeight: isVisible ? 500 : 400,\r\n                      color: isVisible\r\n                        ? (isDark ? 'rgba(255,255,255,0.9)' : 'rgba(0,0,0,0.85)')\r\n                        : (isDark ? 'rgba(255,255,255,0.55)' : 'rgba(0,0,0,0.5)'),\r\n                      maxWidth: '160px',\r\n                    }}\r\n                    title={getColumnLabel(type)}\r\n                  >\r\n                    {getColumnLabel(type)}\r\n                  </span>\r\n                </button>\r\n              );\r\n            })}\r\n          </div>\r\n        </div>\r\n\r\n        {/* Custom Fields */}\r\n        {filteredCustomFields.length > 0 && (\r\n          <div className=\"mt-1\">\r\n            <div\r\n              className=\"px-1.5 py-1.5\"\r\n              style={{\r\n                fontSize: 9,\r\n                fontWeight: 600,\r\n                letterSpacing: '0.1em',\r\n                color: isDark ? 'rgba(255,255,255,0.25)' : 'rgba(0,0,0,0.3)',\r\n                fontFamily: 'JetBrains Mono, monospace',\r\n                borderTop: `1px solid ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'}`,\r\n                paddingTop: 8,\r\n                marginTop: 4,\r\n              }}\r\n            >\r\n              {t.customFields.toUpperCase()}\r\n            </div>\r\n            <div className=\"space-y-px\">\r\n              {filteredCustomFields.map((field) => {\r\n                const column = columns.find((c) => c.customFieldId === field.id);\r\n                const isVisible = column?.visible ?? false;\r\n\r\n                return (\r\n                  <button\r\n                    key={field.id}\r\n                    onClick={() => addColumn(field.type as ColumnType, field.id)}\r\n                    className=\"w-full flex items-center gap-2.5 px-2 py-[5px] rounded-md transition-colors\"\r\n                    onMouseEnter={e => {\r\n                      e.currentTarget.style.backgroundColor = isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.04)';\r\n                    }}\r\n                    onMouseLeave={e => {\r\n                      e.currentTarget.style.backgroundColor = 'transparent';\r\n                    }}\r\n                  >\r\n                    <div\r\n                      className=\"w-4 h-4 rounded flex items-center justify-center flex-shrink-0 transition-all\"\r\n                      style={{\r\n                        background: isVisible ? accent : 'transparent',\r\n                        border: isVisible ? `1.5px solid ${accent}` : `1.5px solid ${isDark ? 'rgba(255,255,255,0.15)' : 'rgba(0,0,0,0.15)'}`,\r\n                        boxShadow: isVisible ? `0 0 6px ${accent}40` : 'none',\r\n                      }}\r\n                    >\r\n                      {isVisible && <Check className=\"w-2.5 h-2.5 text-white\" strokeWidth={3} />}\r\n                    </div>\r\n                    <span\r\n                      className=\"flex-shrink-0 [&>svg]:w-3.5 [&>svg]:h-3.5\"\r\n                      style={{ color: isVisible ? accent : isDark ? 'rgba(255,255,255,0.3)' : 'rgba(0,0,0,0.3)' }}\r\n                    >\r\n                      {COLUMN_ICONS[field.type as ColumnType] || <Type className=\"w-4 h-4\" />}\r\n                    </span>\r\n                    <span\r\n                      style={{\r\n                        fontSize: 12,\r\n                        fontWeight: isVisible ? 500 : 400,\r\n                        color: isVisible\r\n                          ? (isDark ? 'rgba(255,255,255,0.9)' : 'rgba(0,0,0,0.85)')\r\n                          : (isDark ? 'rgba(255,255,255,0.55)' : 'rgba(0,0,0,0.5)'),\r\n                      }}\r\n                    >\r\n                      {field.name}\r\n                    </span>\r\n                  </button>\r\n                );\r\n              })}\r\n            </div>\r\n          </div>\r\n        )}\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\n// Translations\r\nconst translations = {\r\n  en: {\r\n    title: 'Columns',\r\n    searchPlaceholder: 'Search fields...',\r\n    standardFields: 'Standard Fields',\r\n    customFields: 'Custom Fields',\r\n    createField: 'Create custom field',\r\n    columns: {\r\n      name: 'Name',\r\n      status: 'Status',\r\n      priority: 'Priority',\r\n      startDate: 'Start Date',\r\n      endDate: 'End Date',\r\n      progress: 'Progress',\r\n      tags: 'Tags',\r\n      estimatedTime: 'Estimated',\r\n      quotedTime: 'Quoted',\r\n      elapsedTime: 'Time Spent',\r\n      // v1.2.0: Three-tier time tracking\r\n      soldEffortMinutes: 'Quoted',\r\n      effortMinutes: 'Estimated',\r\n      timeLoggedMinutes: 'Executed',\r\n      text: 'Text',\r\n      number: 'Number',\r\n      date: 'Date',\r\n      dropdown: 'Dropdown',\r\n      checkbox: 'Checkbox',\r\n      multiselect: 'Multi-select',\r\n      person: 'Person',\r\n      file: 'File',\r\n      weight: 'Weight',\r\n    } as Record<ColumnType, string>,\r\n  },\r\n  es: {\r\n    title: 'Columnas',\r\n    searchPlaceholder: 'Buscar campos...',\r\n    standardFields: 'Campos Estándar',\r\n    customFields: 'Campos Personalizados',\r\n    createField: 'Crear campo personalizado',\r\n    columns: {\r\n      name: 'Nombre',\r\n      status: 'Estado',\r\n      priority: 'Prioridad',\r\n      startDate: 'Fecha Inicio',\r\n      endDate: 'Fecha Fin',\r\n      progress: 'Progreso',\r\n      tags: 'Etiquetas',\r\n      estimatedTime: 'Estimado',\r\n      quotedTime: 'Ofertado',\r\n      elapsedTime: 'Ejecutado',\r\n      // v1.2.0: Three-tier time tracking\r\n      soldEffortMinutes: 'Ofertado',\r\n      effortMinutes: 'Estimado',\r\n      timeLoggedMinutes: 'Ejecutado',\r\n      text: 'Texto',\r\n      number: 'Número',\r\n      date: 'Fecha',\r\n      dropdown: 'Lista',\r\n      checkbox: 'Casilla',\r\n      weight: 'Peso',\r\n    } as Record<ColumnType, string>,\r\n  },\r\n};\r\n","/**\r\n * CreateFieldModal - Modal for creating custom fields\r\n * @version 0.18.0\r\n */\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { X, Type, Hash, Calendar, ChevronDown, CheckSquare, Plus, Trash2 } from 'lucide-react';\r\nimport { cn } from '../../utils';\r\nimport type { CustomFieldDefinition } from './types';\r\n\r\ninterface CreateFieldModalProps {\r\n  isOpen: boolean;\r\n  onClose: () => void;\r\n  onSave: (field: Omit<CustomFieldDefinition, 'id' | 'projectId'>) => void;\r\n  isDark: boolean;\r\n  locale: string;\r\n}\r\n\r\ntype FieldType = CustomFieldDefinition['type'];\r\n\r\nconst FIELD_TYPES: Array<{ type: FieldType; icon: React.ReactNode }> = [\r\n  { type: 'text', icon: <Type className=\"w-5 h-5\" /> },\r\n  { type: 'number', icon: <Hash className=\"w-5 h-5\" /> },\r\n  { type: 'date', icon: <Calendar className=\"w-5 h-5\" /> },\r\n  { type: 'dropdown', icon: <ChevronDown className=\"w-5 h-5\" /> },\r\n  { type: 'checkbox', icon: <CheckSquare className=\"w-5 h-5\" /> },\r\n];\r\n\r\nexport function CreateFieldModal({\r\n  isOpen,\r\n  onClose,\r\n  onSave,\r\n  isDark,\r\n  locale,\r\n}: CreateFieldModalProps) {\r\n  const [name, setName] = useState('');\r\n  const [type, setType] = useState<FieldType>('text');\r\n  const [options, setOptions] = useState<string[]>(['']);\r\n  const t = locale === 'es' ? translations.es : translations.en;\r\n\r\n  // Reset form when modal opens\r\n  useEffect(() => {\r\n    if (isOpen) {\r\n      setName('');\r\n      setType('text');\r\n      setOptions(['']);\r\n    }\r\n  }, [isOpen]);\r\n\r\n  // Handle escape key\r\n  useEffect(() => {\r\n    const handleEscape = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape') onClose();\r\n    };\r\n    if (isOpen) {\r\n      document.addEventListener('keydown', handleEscape);\r\n    }\r\n    return () => document.removeEventListener('keydown', handleEscape);\r\n  }, [isOpen, onClose]);\r\n\r\n  const handleSave = () => {\r\n    if (!name.trim()) return;\r\n\r\n    const field: Omit<CustomFieldDefinition, 'id' | 'projectId'> = {\r\n      name: name.trim(),\r\n      type,\r\n    };\r\n\r\n    if (type === 'dropdown') {\r\n      field.options = options.filter((opt) => opt.trim());\r\n    }\r\n\r\n    onSave(field);\r\n    onClose();\r\n  };\r\n\r\n  const addOption = () => {\r\n    setOptions([...options, '']);\r\n  };\r\n\r\n  const updateOption = (index: number, value: string) => {\r\n    const newOptions = [...options];\r\n    newOptions[index] = value;\r\n    setOptions(newOptions);\r\n  };\r\n\r\n  const removeOption = (index: number) => {\r\n    if (options.length > 1) {\r\n      setOptions(options.filter((_, i) => i !== index));\r\n    }\r\n  };\r\n\r\n  if (!isOpen) return null;\r\n\r\n  return (\r\n    <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\r\n      {/* Backdrop */}\r\n      <div\r\n        className=\"absolute inset-0 bg-black/50\"\r\n        onClick={onClose}\r\n      />\r\n\r\n      {/* Modal */}\r\n      <div\r\n        className={cn(\r\n          'relative w-full max-w-md rounded-xl shadow-2xl border',\r\n          isDark ? 'bg-[#0D0D0D] border-[#222]' : 'bg-white border-gray-200'\r\n        )}\r\n      >\r\n        {/* Header */}\r\n        <div className={cn(\r\n          'flex items-center justify-between px-6 py-4 border-b',\r\n          isDark ? 'border-[#222]' : 'border-gray-200'\r\n        )}>\r\n          <h2 className={cn('text-lg font-semibold', isDark ? 'text-white' : 'text-gray-900')}>\r\n            {t.title}\r\n          </h2>\r\n          <button\r\n            onClick={onClose}\r\n            className={cn('p-1 rounded', isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100')}\r\n          >\r\n            <X className={cn('w-5 h-5', isDark ? 'text-white/60' : 'text-gray-400')} />\r\n          </button>\r\n        </div>\r\n\r\n        {/* Body */}\r\n        <div className=\"p-6 space-y-6\">\r\n          {/* Field Name */}\r\n          <div>\r\n            <label className={cn('block text-sm font-medium mb-2', isDark ? 'text-white' : 'text-gray-900')}>\r\n              {t.fieldName}\r\n            </label>\r\n            <input\r\n              type=\"text\"\r\n              value={name}\r\n              onChange={(e) => setName(e.target.value)}\r\n              placeholder={t.fieldNamePlaceholder}\r\n              className={cn(\r\n                'w-full px-4 py-2.5 rounded-lg border outline-none focus:ring-2 focus:ring-[#00E5CC]/30',\r\n                isDark\r\n                  ? 'bg-white/[0.03] border-[#222] text-white placeholder:text-white/30'\r\n                  : 'bg-gray-50 border-gray-200 text-gray-900 placeholder:text-gray-400'\r\n              )}\r\n              autoFocus\r\n            />\r\n          </div>\r\n\r\n          {/* Field Type */}\r\n          <div>\r\n            <label className={cn('block text-sm font-medium mb-2', isDark ? 'text-white' : 'text-gray-900')}>\r\n              {t.fieldType}\r\n            </label>\r\n            <div className=\"grid grid-cols-5 gap-2\">\r\n              {FIELD_TYPES.map((ft) => (\r\n                <button\r\n                  key={ft.type}\r\n                  onClick={() => setType(ft.type)}\r\n                  className={cn(\r\n                    'flex flex-col items-center gap-1 p-3 rounded-lg border transition-colors',\r\n                    type === ft.type\r\n                      ? 'border-[#00E5CC] bg-[#00E5CC]/10'\r\n                      : isDark\r\n                        ? 'border-[#222] hover:border-white/20'\r\n                        : 'border-gray-200 hover:border-gray-300'\r\n                  )}\r\n                >\r\n                  <span className={type === ft.type ? 'text-[#00E5CC]' : isDark ? 'text-white/60' : 'text-gray-400'}>\r\n                    {ft.icon}\r\n                  </span>\r\n                  <span className={cn(\r\n                    'text-xs',\r\n                    type === ft.type\r\n                      ? 'text-[#00E5CC]'\r\n                      : isDark ? 'text-white/60' : 'text-gray-500'\r\n                  )}>\r\n                    {t.types[ft.type]}\r\n                  </span>\r\n                </button>\r\n              ))}\r\n            </div>\r\n          </div>\r\n\r\n          {/* Dropdown Options */}\r\n          {type === 'dropdown' && (\r\n            <div>\r\n              <label className={cn('block text-sm font-medium mb-2', isDark ? 'text-white' : 'text-gray-900')}>\r\n                {t.options}\r\n              </label>\r\n              <div className=\"space-y-2\">\r\n                {options.map((option, index) => (\r\n                  <div key={index} className=\"flex items-center gap-2\">\r\n                    <input\r\n                      type=\"text\"\r\n                      value={option}\r\n                      onChange={(e) => updateOption(index, e.target.value)}\r\n                      placeholder={`${t.option} ${index + 1}`}\r\n                      className={cn(\r\n                        'flex-1 px-3 py-2 rounded-lg border outline-none focus:ring-2 focus:ring-[#00E5CC]/30',\r\n                        isDark\r\n                          ? 'bg-white/[0.03] border-[#222] text-white placeholder:text-white/30'\r\n                          : 'bg-gray-50 border-gray-200 text-gray-900 placeholder:text-gray-400'\r\n                      )}\r\n                    />\r\n                    {options.length > 1 && (\r\n                      <button\r\n                        onClick={() => removeOption(index)}\r\n                        className={cn(\r\n                          'p-2 rounded-lg transition-colors',\r\n                          isDark ? 'hover:bg-white/[0.05] text-white/60' : 'hover:bg-gray-100 text-gray-400'\r\n                        )}\r\n                      >\r\n                        <Trash2 className=\"w-4 h-4\" />\r\n                      </button>\r\n                    )}\r\n                  </div>\r\n                ))}\r\n                <button\r\n                  onClick={addOption}\r\n                  className={cn(\r\n                    'flex items-center gap-2 px-3 py-2 text-sm rounded-lg transition-colors',\r\n                    isDark\r\n                      ? 'text-[#00E5CC] hover:bg-white/[0.05]'\r\n                      : 'text-[#00C4AE] hover:bg-gray-100'\r\n                  )}\r\n                >\r\n                  <Plus className=\"w-4 h-4\" />\r\n                  {t.addOption}\r\n                </button>\r\n              </div>\r\n            </div>\r\n          )}\r\n        </div>\r\n\r\n        {/* Footer */}\r\n        <div className={cn(\r\n          'flex items-center justify-end gap-3 px-6 py-4 border-t',\r\n          isDark ? 'border-[#222]' : 'border-gray-200'\r\n        )}>\r\n          <button\r\n            onClick={onClose}\r\n            className={cn(\r\n              'px-4 py-2 text-sm font-medium rounded-lg transition-colors',\r\n              isDark\r\n                ? 'text-white/60 hover:bg-white/[0.05]'\r\n                : 'text-gray-600 hover:bg-gray-100'\r\n            )}\r\n          >\r\n            {t.cancel}\r\n          </button>\r\n          <button\r\n            onClick={handleSave}\r\n            disabled={!name.trim()}\r\n            className={cn(\r\n              'px-4 py-2 text-sm font-medium rounded-lg transition-colors',\r\n              'bg-[#00E5CC] text-white hover:bg-[#005FCC]',\r\n              !name.trim() && 'opacity-50 cursor-not-allowed'\r\n            )}\r\n          >\r\n            {t.create}\r\n          </button>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\n// Translations\r\nconst translations = {\r\n  en: {\r\n    title: 'Create Custom Field',\r\n    fieldName: 'Field Name',\r\n    fieldNamePlaceholder: 'Enter field name...',\r\n    fieldType: 'Field Type',\r\n    options: 'Options',\r\n    option: 'Option',\r\n    addOption: 'Add option',\r\n    cancel: 'Cancel',\r\n    create: 'Create Field',\r\n    types: {\r\n      text: 'Text',\r\n      number: 'Number',\r\n      date: 'Date',\r\n      dropdown: 'Dropdown',\r\n      checkbox: 'Checkbox',\r\n    },\r\n  },\r\n  es: {\r\n    title: 'Crear Campo Personalizado',\r\n    fieldName: 'Nombre del Campo',\r\n    fieldNamePlaceholder: 'Ingresa el nombre...',\r\n    fieldType: 'Tipo de Campo',\r\n    options: 'Opciones',\r\n    option: 'Opción',\r\n    addOption: 'Agregar opción',\r\n    cancel: 'Cancelar',\r\n    create: 'Crear Campo',\r\n    types: {\r\n      text: 'Texto',\r\n      number: 'Número',\r\n      date: 'Fecha',\r\n      dropdown: 'Lista',\r\n      checkbox: 'Casilla',\r\n    },\r\n  },\r\n};\r\n","/**\r\n * StatusFilter - Dropdown filter for task status in ListView\r\n * Allows filtering by: All, Completed, In Progress, To Do/Pending\r\n * Also includes \"Hide Completed\" toggle\r\n * @version 0.18.0\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\nimport { Filter, Check, CheckCircle2, PlayCircle, Circle, EyeOff } from 'lucide-react';\r\nimport { cn } from '../../utils';\r\n\r\nexport type StatusFilterValue = 'all' | 'completed' | 'in-progress' | 'todo';\r\n\r\ninterface StatusFilterProps {\r\n  value: StatusFilterValue;\r\n  hideCompleted: boolean;\r\n  onChange: (value: StatusFilterValue) => void;\r\n  onHideCompletedChange: (hide: boolean) => void;\r\n  isDark: boolean;\r\n  locale: string;\r\n}\r\n\r\nconst translations = {\r\n  en: {\r\n    filters: 'Filters',\r\n    filterByStatus: 'FILTER BY STATUS',\r\n    showAll: 'Show All',\r\n    completed: 'Completed',\r\n    inProgress: 'In Progress',\r\n    toDo: 'To Do / Pending',\r\n    hideCompleted: 'Hide Completed Tasks',\r\n  },\r\n  es: {\r\n    filters: 'Filtros',\r\n    filterByStatus: 'FILTRAR POR ESTADO',\r\n    showAll: 'Mostrar Todo',\r\n    completed: 'Completadas',\r\n    inProgress: 'En Progreso',\r\n    toDo: 'Por Hacer / Pendiente',\r\n    hideCompleted: 'Ocultar Tareas Completadas',\r\n  },\r\n};\r\n\r\nexport function StatusFilter({\r\n  value,\r\n  hideCompleted,\r\n  onChange,\r\n  onHideCompletedChange,\r\n  isDark,\r\n  locale,\r\n}: StatusFilterProps) {\r\n  const [isOpen, setIsOpen] = useState(false);\r\n  const dropdownRef = useRef<HTMLDivElement>(null);\r\n  const openedAtRef = useRef<number>(0);\r\n  const t = locale === 'es' ? translations.es : translations.en;\r\n\r\n  // Close on click outside\r\n  useEffect(() => {\r\n    if (!isOpen) return;\r\n\r\n    const handleClickOutside = (e: MouseEvent) => {\r\n      // Ignore clicks within 100ms of opening (to avoid capturing the opening click)\r\n      if (Date.now() - openedAtRef.current < 100) return;\r\n\r\n      if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\r\n        setIsOpen(false);\r\n      }\r\n    };\r\n\r\n    const handleEscape = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape') setIsOpen(false);\r\n    };\r\n\r\n    document.addEventListener('mousedown', handleClickOutside);\r\n    document.addEventListener('keydown', handleEscape);\r\n\r\n    return () => {\r\n      document.removeEventListener('mousedown', handleClickOutside);\r\n      document.removeEventListener('keydown', handleEscape);\r\n    };\r\n  }, [isOpen]);\r\n\r\n  const options: Array<{ value: StatusFilterValue; label: string; icon: React.ReactNode; color: string }> = [\r\n    { value: 'all', label: t.showAll, icon: <div className=\"w-4 h-4 rounded-full border-2 border-[#00E5CC] bg-[#00E5CC]\" />, color: 'text-[#00E5CC]' },\r\n    { value: 'completed', label: t.completed, icon: <CheckCircle2 className=\"w-4 h-4\" />, color: 'text-green-500' },\r\n    { value: 'in-progress', label: t.inProgress, icon: <PlayCircle className=\"w-4 h-4\" />, color: 'text-[#00E5CC]' },\r\n    { value: 'todo', label: t.toDo, icon: <Circle className=\"w-4 h-4\" />, color: 'text-gray-400' },\r\n  ];\r\n\r\n  const hasActiveFilter = value !== 'all' || hideCompleted;\r\n\r\n  return (\r\n    <div ref={dropdownRef} className=\"relative\">\r\n      {/* Filter Button */}\r\n      <button\r\n        onClick={(e) => {\r\n          e.stopPropagation();\r\n          if (!isOpen) {\r\n            openedAtRef.current = Date.now();\r\n          }\r\n          setIsOpen(prev => !prev);\r\n        }}\r\n        className={cn(\r\n          'flex items-center gap-2 px-3 py-1.5 rounded-lg text-[11px] font-medium transition-all border',\r\n          isDark\r\n            ? 'border-[#222] hover:bg-white/[0.05] text-white/70'\r\n            : 'border-gray-200 hover:bg-gray-100 text-gray-700',\r\n          hasActiveFilter && (isDark ? 'bg-[#00E5CC]/20 border-[#00E5CC]/50 text-[#00E5CC]' : 'bg-[#00E5CC]/15 border-[#00E5CC]/15 text-[#00C4AE]'),\r\n          isOpen && (isDark ? 'bg-white/[0.05]' : 'bg-gray-100')\r\n        )}\r\n        style={{ fontFamily: 'Inter, sans-serif' }}\r\n      >\r\n        <Filter className=\"w-4 h-4\" />\r\n        {t.filters}\r\n        {hasActiveFilter && (\r\n          <span className={cn(\r\n            'w-2 h-2 rounded-full',\r\n            isDark ? 'bg-[#00E5CC]' : 'bg-[#00E5CC]'\r\n          )} />\r\n        )}\r\n      </button>\r\n\r\n      {/* Dropdown */}\r\n      {isOpen && (\r\n        <div\r\n          className={cn(\r\n            'absolute left-0 top-full mt-2 w-72 rounded-lg shadow-xl border z-50',\r\n            isDark ? 'bg-[#0D0D0D] border-[#222]' : 'bg-white border-gray-200'\r\n          )}\r\n        >\r\n          {/* Header */}\r\n          <div className={cn(\r\n            'px-4 py-3 border-b',\r\n            isDark ? 'border-[#222]' : 'border-gray-200'\r\n          )}>\r\n            <span className={cn(\r\n              'text-xs font-medium uppercase tracking-wider',\r\n              isDark ? 'text-white/30' : 'text-gray-400'\r\n            )}>\r\n              {t.filterByStatus}\r\n            </span>\r\n          </div>\r\n\r\n          {/* Options */}\r\n          <div className=\"py-2\">\r\n            {options.map((option) => {\r\n              // Don't show checkmark on status options when hideCompleted is active\r\n              const isSelected = value === option.value && !hideCompleted;\r\n\r\n              // Dynamic icon for \"all\" option - solid when selected, outline when not\r\n              const getIcon = () => {\r\n                if (option.value === 'all') {\r\n                  return isSelected\r\n                    ? <div className=\"w-4 h-4 rounded-full border-2 border-[#00E5CC] bg-[#00E5CC]\" />\r\n                    : <div className=\"w-4 h-4 rounded-full border-2 border-gray-400\" />;\r\n                }\r\n                return option.icon;\r\n              };\r\n\r\n              return (\r\n                <button\r\n                  key={option.value}\r\n                  onClick={() => {\r\n                    onChange(option.value);\r\n                    onHideCompletedChange(false);\r\n                    setIsOpen(false);\r\n                  }}\r\n                  className={cn(\r\n                    'w-full flex items-center gap-3 px-4 py-2.5 text-sm transition-colors',\r\n                    isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100',\r\n                    isSelected && (isDark ? 'bg-white/[0.03]' : 'bg-gray-50')\r\n                  )}\r\n                >\r\n                  <span className={cn(isSelected ? option.color : 'text-gray-400', 'flex-shrink-0')}>\r\n                    {getIcon()}\r\n                  </span>\r\n                  <span className={cn(\r\n                    'flex-1 text-left whitespace-nowrap',\r\n                    isDark ? 'text-white' : 'text-gray-900'\r\n                  )}>\r\n                    {option.label}\r\n                  </span>\r\n                  {isSelected && (\r\n                    <Check className={cn('w-4 h-4 flex-shrink-0', isDark ? 'text-[#00E5CC]' : 'text-[#00E5CC]')} />\r\n                  )}\r\n                </button>\r\n              );\r\n            })}\r\n          </div>\r\n\r\n          {/* Separator */}\r\n          <div className={cn(\r\n            'my-2 mx-4 h-px',\r\n            isDark ? 'bg-white/[0.05]' : 'bg-gray-200'\r\n          )} />\r\n\r\n          {/* Hide Completed Toggle */}\r\n          <div className=\"py-1\">\r\n            <button\r\n              onClick={() => {\r\n                const newHideCompleted = !hideCompleted;\r\n                onHideCompletedChange(newHideCompleted);\r\n                if (newHideCompleted) {\r\n                  onChange('all');\r\n                }\r\n                setIsOpen(false);\r\n              }}\r\n              className={cn(\r\n                'w-full flex items-center gap-3 px-4 py-2.5 text-sm transition-colors',\r\n                isDark ? 'hover:bg-white/[0.05]' : 'hover:bg-gray-100',\r\n                hideCompleted && (isDark ? 'bg-white/[0.03]' : 'bg-gray-50')\r\n              )}\r\n            >\r\n              <EyeOff className={cn(\r\n                'w-4 h-4 flex-shrink-0',\r\n                hideCompleted\r\n                  ? (isDark ? 'text-[#00E5CC]' : 'text-[#00E5CC]')\r\n                  : (isDark ? 'text-white/30' : 'text-gray-400')\r\n              )} />\r\n              <span className={cn(\r\n                'flex-1 text-left whitespace-nowrap',\r\n                isDark ? 'text-white' : 'text-gray-900'\r\n              )}>\r\n                {t.hideCompleted}\r\n              </span>\r\n              {hideCompleted && (\r\n                <Check className={cn('w-4 h-4 flex-shrink-0', isDark ? 'text-[#00E5CC]' : 'text-[#00E5CC]')} />\r\n              )}\r\n            </button>\r\n          </div>\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * ProjectHealthSidebar - Right panel for project health metrics\r\n * Chronos V2.0 Interactive Time Manager\r\n */\r\n\r\nimport { cn } from '../../utils';\r\nimport type { ProjectHealthData } from './types';\r\n\r\ninterface ProjectHealthSidebarProps {\r\n  data: ProjectHealthData;\r\n  isDark: boolean;\r\n  locale?: string;\r\n  onClose?: () => void;\r\n  lens?: 'hours' | 'financial';\r\n  onUnassignedTaskClick?: (taskId: string) => void;\r\n}\r\n\r\nfunction fmtMinutes(minutes: number): string {\r\n  if (minutes <= 0) return '0h';\r\n  const h = Math.floor(minutes / 60);\r\n  const m = minutes % 60;\r\n  return m > 0 ? `${h}h ${m}m` : `${h}h`;\r\n}\r\n\r\nfunction fmtCurrency(value: number): string {\r\n  return `$${Math.round(value).toLocaleString('es-CO')}`;\r\n}\r\n\r\nexport function ProjectHealthSidebar({\r\n  data,\r\n  isDark,\r\n  locale = 'en',\r\n  onClose,\r\n  lens = 'hours',\r\n  onUnassignedTaskClick,\r\n}: ProjectHealthSidebarProps) {\r\n  const isEs = locale === 'es';\r\n  const isFinancial = lens === 'financial';\r\n\r\n  return (\r\n    <div className={cn(\r\n      'w-[260px] xl:w-[320px] flex-shrink-0 overflow-y-auto border-l',\r\n      isDark ? 'bg-[#141414] border-[#222]' : 'bg-gray-50 border-gray-200'\r\n    )}>\r\n      {/* Header */}\r\n      <div className={cn('px-5 py-4 border-b flex items-center justify-between', isDark ? 'border-[#222]' : 'border-gray-200')}>\r\n        <h3 className={cn(\r\n          'text-[11px] font-mono uppercase tracking-wider font-bold',\r\n          isDark ? 'text-white/60' : 'text-gray-600'\r\n        )}>\r\n          {isFinancial\r\n            ? (isEs ? 'SALUD FINANCIERA' : 'FINANCIAL HEALTH')\r\n            : (isEs ? 'SALUD DEL PROYECTO' : 'PROJECT HEALTH')}\r\n        </h3>\r\n        {onClose && (\r\n          <button\r\n            onClick={onClose}\r\n            className={cn(\r\n              'p-1 rounded transition-colors',\r\n              isDark ? 'text-white/30 hover:text-white/60 hover:bg-white/[0.05]' : 'text-gray-400 hover:text-gray-600 hover:bg-gray-200'\r\n            )}\r\n            title={isEs ? 'Cerrar panel' : 'Close panel'}\r\n          >\r\n            <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n              <path d=\"M1 1l10 10M11 1L1 11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\r\n            </svg>\r\n          </button>\r\n        )}\r\n      </div>\r\n\r\n      {/* Section: Financial Health — shown when lens='financial' and financial data available */}\r\n      {isFinancial && (data.totalOffered !== undefined || data.totalEstimated !== undefined) && (() => {\r\n        const offered = data.totalOffered ?? 0;\r\n        const estimated = data.totalEstimated ?? 0;\r\n        const executed = data.totalExecuted ?? 0;\r\n        // v2.8.0: Disponible = Contrato − Ejecutado (what the user intuitively\r\n        // expects). Previous version subtracted Estimado, which made the value\r\n        // misleading when estimates were filled out partially or not at all\r\n        // (a project with 0 estimates would show \"Disp = full contract\" even\r\n        // after spending half the budget).\r\n        const margin = offered - executed;\r\n        const marginPct = offered > 0 ? Math.round((margin / offered) * 100) : 0;\r\n        // T6 (spec v4): MARGEN a plan = Ofertado − Estimado. Distinto de\r\n        // \"Disponible\" (Ofertado − Ejecutado, que es caja). Si es 0 ejecutas\r\n        // tal cual lo ofertado; si es negativo, pierdes.\r\n        const planMargin = offered - estimated;\r\n        const planMarginPct = offered > 0 ? Math.round((planMargin / offered) * 100) : 0;\r\n        const consumedPct = offered > 0 ? Math.min(Math.round((executed / offered) * 100), 120) : 0;\r\n        const isOverBudget = executed > offered && offered > 0;\r\n        const barColor = isOverBudget ? '#F87171' : '#00E5CC';\r\n\r\n        return (\r\n          <div className={cn('px-5 py-4 border-b', isDark ? 'border-[#222]' : 'border-gray-200')}>\r\n            <h4 className={cn('text-[11px] font-mono uppercase tracking-wider font-semibold mb-3', isDark ? 'text-white/60' : 'text-gray-600')}>\r\n              {isEs ? 'PRESUPUESTO' : 'BUDGET'}\r\n            </h4>\r\n            <div className=\"space-y-2\">\r\n              <div className=\"flex items-center justify-between\">\r\n                <span className={cn('text-xs', isDark ? 'text-white/60' : 'text-gray-600')}>\r\n                  {isEs ? 'V. Oferta' : 'Offered Value'}\r\n                </span>\r\n                <span className={cn('text-[11px] font-mono font-bold', isDark ? 'text-white/80' : 'text-gray-800')}>\r\n                  {fmtCurrency(offered)}\r\n                </span>\r\n              </div>\r\n              {(() => {\r\n                // v2.9.0 — Estimado: total + always-visible sub-lines for labor /\r\n                // equipment / travel when those committed costs are present, so\r\n                // the user sees how the figure is composed (the table footer only\r\n                // shows labor; this is where the full breakdown lives).\r\n                const estLabor = data.totalEstimatedLabor ?? 0;\r\n                const estEq = data.totalEstimatedEquipment ?? 0;\r\n                const estTr = data.totalEstimatedTravel ?? 0;\r\n                const showEstBreakdown = estEq > 0 || estTr > 0;\r\n                const subLine = (label: string, val: number) => (\r\n                  <div className=\"flex items-center justify-between pl-3\">\r\n                    <span className={cn('text-[10px]', isDark ? 'text-white/40' : 'text-gray-400')}>{label}</span>\r\n                    <span className={cn('text-[10px] font-mono', isDark ? 'text-white/55' : 'text-gray-500')}>{fmtCurrency(val)}</span>\r\n                  </div>\r\n                );\r\n                return (\r\n                  <>\r\n                    <div className=\"flex items-center justify-between\">\r\n                      <span className={cn('text-xs', isDark ? 'text-white/60' : 'text-gray-600')}>\r\n                        {isEs ? 'Estimado' : 'Estimated'}\r\n                      </span>\r\n                      <span className={cn('text-[11px] font-mono font-bold', isDark ? 'text-white/80' : 'text-gray-800')}>\r\n                        {fmtCurrency(estimated)}\r\n                      </span>\r\n                    </div>\r\n                    {showEstBreakdown && (\r\n                      <>\r\n                        {subLine(isEs ? 'Mano de obra' : 'Labor', estLabor)}\r\n                        {estEq > 0 && subLine(isEs ? 'Activos' : 'Equipment', estEq)}\r\n                        {estTr > 0 && subLine(isEs ? 'Viáticos' : 'Travel', estTr)}\r\n                      </>\r\n                    )}\r\n                  </>\r\n                );\r\n              })()}\r\n              {executed > 0 && (() => {\r\n                const exLabor = data.totalExecutedLabor ?? 0;\r\n                const exEq = data.totalExecutedEquipment ?? 0;\r\n                const exTr = data.totalExecutedTravel ?? 0;\r\n                const showExBreakdown = exEq > 0 || exTr > 0;\r\n                const subLine = (label: string, val: number) => (\r\n                  <div className=\"flex items-center justify-between pl-3\">\r\n                    <span className={cn('text-[10px]', isDark ? 'text-white/40' : 'text-gray-400')}>{label}</span>\r\n                    <span className={cn('text-[10px] font-mono', isDark ? 'text-white/55' : 'text-gray-500')}>{fmtCurrency(val)}</span>\r\n                  </div>\r\n                );\r\n                return (\r\n                  <>\r\n                    <div className=\"flex items-center justify-between\">\r\n                      <span className={cn('text-xs', isDark ? 'text-white/60' : 'text-gray-600')}>\r\n                        {isEs ? 'Ejecutado' : 'Executed'}\r\n                      </span>\r\n                      <span className={cn('text-[11px] font-mono font-bold', isOverBudget ? 'text-[#F87171]' : isDark ? 'text-white/80' : 'text-gray-800')}>\r\n                        {fmtCurrency(executed)}\r\n                      </span>\r\n                    </div>\r\n                    {showExBreakdown && (\r\n                      <>\r\n                        {subLine(isEs ? 'Mano de obra' : 'Labor', exLabor)}\r\n                        {exEq > 0 && subLine(isEs ? 'Activos' : 'Equipment', exEq)}\r\n                        {exTr > 0 && subLine(isEs ? 'Viáticos' : 'Travel', exTr)}\r\n                      </>\r\n                    )}\r\n                  </>\r\n                );\r\n              })()}\r\n              {/* Progress bar: offered as 100%, estimated as fill */}\r\n              {offered > 0 && (\r\n                <div className={cn('w-full h-2.5 rounded-full overflow-hidden mt-2', isDark ? 'bg-white/[0.06]' : 'bg-gray-200')}>\r\n                  <div\r\n                    className=\"h-full rounded-full transition-all duration-300\"\r\n                    style={{ width: `${Math.min(consumedPct, 100)}%`, backgroundColor: barColor }}\r\n                  />\r\n                </div>\r\n              )}\r\n              {/* T6: MARGEN (Ofertado − Estimado) — protagonista. Verde ≥0, rojo <0. */}\r\n              {estimated > 0 && (\r\n                <div className={cn(\r\n                  'mt-2 px-3 py-2 rounded-lg text-center font-mono font-bold',\r\n                  planMargin >= 0\r\n                    ? (isDark ? 'bg-[#00E5CC]/10 text-[#00E5CC]' : 'bg-emerald-50 text-emerald-600')\r\n                    : (isDark ? 'bg-[#F87171]/10 text-[#F87171]' : 'bg-red-50 text-red-600')\r\n                )}>\r\n                  <div className=\"text-[9px] uppercase tracking-wider opacity-60 mb-0.5\">{isEs ? 'Margen (Ofertado − Estimado)' : 'Margin (Offered − Estimated)'}</div>\r\n                  <div className=\"text-base\">\r\n                    {planMargin >= 0 ? '+' : ''}{fmtCurrency(planMargin)}\r\n                    {offered > 0 && <span className=\"text-[11px] ml-1 opacity-70\">({planMargin >= 0 ? '+' : ''}{planMarginPct}%)</span>}\r\n                  </div>\r\n                  <div className=\"text-[9px] opacity-50 mt-0.5 font-sans\">{isEs ? '0 = ejecutas tal cual lo ofertado' : '0 = you execute exactly as offered'}</div>\r\n                </div>\r\n              )}\r\n              {/* Disponible (caja: Ofertado − Ejecutado) — secundario, tono menor */}\r\n              <div className={cn(\r\n                'mt-1.5 px-3 py-1.5 rounded-lg text-center font-mono text-[12px]',\r\n                isDark ? 'text-white/50' : 'text-gray-500'\r\n              )}>\r\n                {margin >= 0\r\n                  ? `+${fmtCurrency(margin)} ${isEs ? 'disponible (caja)' : 'available (cash)'}`\r\n                  : `${fmtCurrency(Math.abs(margin))} ${isEs ? 'sobregirado' : 'overdrawn'}`}\r\n                {offered > 0 && (\r\n                  <span className=\"text-[10px] ml-1 opacity-60\">({marginPct}%)</span>\r\n                )}\r\n              </div>\r\n            </div>\r\n          </div>\r\n        );\r\n      })()}\r\n\r\n      {/* Section: Project Hours — always shown when totalHours provided\r\n          v2.7.0 — red saturation fix: \"alarm blindness\" prevention.\r\n          - Bar + text stay red ONLY when spent exceeds allocated by >10%.\r\n          - 0-10% overrun is shown neutral/amber — the gauge colour speaks by itself.\r\n          - Never paint the \"Spent\" value in red alone (the bar communicates it). */}\r\n      {(data.totalHoursSpentMinutes !== undefined || data.totalHoursAllocatedMinutes !== undefined) && (() => {\r\n        const spent = data.totalHoursSpentMinutes ?? 0;\r\n        const allocated = data.totalHoursAllocatedMinutes ?? 0;\r\n        const pct = allocated > 0 ? Math.min(Math.round((spent / allocated) * 100), 100) : 0;\r\n        const overRatio = allocated > 0 ? spent / allocated : 0;\r\n        const isSignificantlyOver = overRatio > 1.10;\r\n        const barColor = isSignificantlyOver ? '#F87171' : pct >= 90 ? '#FFD60A' : '#3BF06E';\r\n        return (\r\n          <div className={cn('px-5 py-4 border-b', isDark ? 'border-[#222]' : 'border-gray-200')}>\r\n            <h4 className={cn('text-[11px] font-mono uppercase tracking-wider font-semibold mb-3', isDark ? 'text-white/60' : 'text-gray-600')}>\r\n              {isEs ? 'HORAS DEL PROYECTO' : 'PROJECT HOURS'}\r\n            </h4>\r\n            <div className=\"space-y-2\">\r\n              <div className=\"flex items-center justify-between\">\r\n                <span className={cn('text-xs', isDark ? 'text-white/60' : 'text-gray-600')}>\r\n                  {isEs ? 'Usado' : 'Spent'}\r\n                </span>\r\n                <span className={cn('text-[11px] font-mono font-bold', isDark ? 'text-white/80' : 'text-gray-800')}>\r\n                  {fmtMinutes(spent)}\r\n                </span>\r\n              </div>\r\n              <div className=\"flex items-center justify-between\">\r\n                <span className={cn('text-xs', isDark ? 'text-white/60' : 'text-gray-600')}>\r\n                  {isEs ? 'Asignado' : 'Allocated'}\r\n                </span>\r\n                <span className={cn('text-[11px] font-mono', isDark ? 'text-white/60' : 'text-gray-600')}>\r\n                  {fmtMinutes(allocated)}\r\n                </span>\r\n              </div>\r\n              {allocated > 0 && (\r\n                <div className={cn('w-full h-1.5 rounded-full overflow-hidden mt-1', isDark ? 'bg-white/[0.06]' : 'bg-gray-200')}>\r\n                  <div\r\n                    className=\"h-full rounded-full transition-all duration-300\"\r\n                    style={{ width: `${pct}%`, backgroundColor: barColor }}\r\n                  />\r\n                </div>\r\n              )}\r\n            </div>\r\n          </div>\r\n        );\r\n      })()}\r\n\r\n      {/* Section: Technical Health — hidden when openRFIs/submittals not provided */}\r\n      {(data.openRFIs !== undefined || data.submittalsApprovalPercent !== undefined) && (\r\n        <div className={cn('px-5 py-4 border-b', isDark ? 'border-[#222]' : 'border-gray-200')}>\r\n          <h4 className={cn(\r\n            'text-[11px] font-mono uppercase tracking-wider font-semibold mb-3',\r\n            isDark ? 'text-white/60' : 'text-gray-600'\r\n          )}>\r\n            {isEs ? 'SALUD TÉCNICA' : 'TECHNICAL HEALTH'}\r\n          </h4>\r\n\r\n          <div className=\"space-y-3\">\r\n            {data.openRFIs !== undefined && (\r\n              <div className=\"flex items-center justify-between\">\r\n                <span className={cn('text-xs', isDark ? 'text-white/60' : 'text-gray-600')}>\r\n                  {isEs ? 'RFIs Abiertos' : 'Open RFIs'}\r\n                </span>\r\n                <span className={cn(\r\n                  'px-2 py-0.5 rounded text-[11px] font-mono font-bold',\r\n                  data.openRFIs > 0\r\n                    ? 'bg-[#F87171]/15 text-[#F87171]'\r\n                    : 'bg-[#3BF06E]/15 text-[#3BF06E]'\r\n                )}>\r\n                  {data.openRFIs}\r\n                </span>\r\n              </div>\r\n            )}\r\n            {data.submittalsApprovalPercent !== undefined && (\r\n              <div className=\"flex items-center justify-between\">\r\n                <span className={cn('text-xs', isDark ? 'text-white/60' : 'text-gray-600')}>\r\n                  {isEs ? 'Aprobación Submittals' : 'Submittals Approval'}\r\n                </span>\r\n                <span className={cn(\r\n                  'text-[11px] font-mono font-bold',\r\n                  data.submittalsApprovalPercent >= 80 ? 'text-[#3BF06E]' : 'text-[#FFD60A]'\r\n                )}>\r\n                  {data.submittalsApprovalPercent}%\r\n                </span>\r\n              </div>\r\n            )}\r\n          </div>\r\n        </div>\r\n      )}\r\n\r\n      {/* Section: Unassigned Tasks Alert — only shown when count > 0 */}\r\n      {data.unassignedCount != null && data.unassignedCount > 0 && (\r\n        <div className={cn('px-5 py-4 border-b', isDark ? 'border-[#222]' : 'border-gray-200')}>\r\n          <h4 className={cn(\r\n            'text-[11px] font-mono uppercase tracking-wider font-semibold mb-3',\r\n            isDark ? 'text-white/60' : 'text-gray-600'\r\n          )}>\r\n            {isEs ? 'TAREAS SIN ASIGNAR' : 'UNASSIGNED TASKS'}\r\n          </h4>\r\n          <div className=\"flex items-center gap-3 mb-3\">\r\n            <div className={cn(\r\n              'flex items-center justify-center w-10 h-10 rounded-lg font-mono text-lg font-bold',\r\n              data.unassignedCount >= 10\r\n                ? 'bg-[#F87171]/15 text-[#F87171]'\r\n                : 'bg-[#FFD60A]/15 text-[#FFD60A]'\r\n            )}>\r\n              {data.unassignedCount}\r\n            </div>\r\n            <div>\r\n              <p className={cn('text-xs font-medium', isDark ? 'text-white/80' : 'text-gray-700')}>\r\n                {data.unassignedCount === 1\r\n                  ? (isEs ? 'tarea pendiente' : 'pending task')\r\n                  : (isEs ? 'tareas pendientes' : 'pending tasks')\r\n                }\r\n              </p>\r\n              <p className={cn('text-[10px]', isDark ? 'text-white/40' : 'text-gray-400')}>\r\n                {isEs ? 'sin recurso asignado' : 'without assigned resource'}\r\n              </p>\r\n            </div>\r\n          </div>\r\n          {/* Task list — scrollable when > 5 items, clickable to navigate */}\r\n          {data.unassignedTasks && data.unassignedTasks.length > 0 && (\r\n            <div className={cn(\r\n              'space-y-1.5 overflow-y-auto scrollbar-slim',\r\n              data.unassignedTasks.length > 5 ? 'max-h-[170px]' : ''\r\n            )}>\r\n              {data.unassignedTasks.map((task) => (\r\n                <button\r\n                  key={task.id}\r\n                  onClick={() => onUnassignedTaskClick?.(task.id)}\r\n                  className={cn(\r\n                    'flex items-center gap-2 px-2.5 py-1.5 rounded-md text-[11px] w-full text-left transition-colors',\r\n                    isDark\r\n                      ? 'bg-white/[0.04] text-white/70 hover:bg-white/[0.08] hover:text-white'\r\n                      : 'bg-gray-50 text-gray-600 hover:bg-gray-100 hover:text-gray-900',\r\n                    onUnassignedTaskClick && 'cursor-pointer'\r\n                  )}\r\n                >\r\n                  <span className={cn(\r\n                    'w-1.5 h-1.5 rounded-full flex-shrink-0',\r\n                    (data.unassignedCount ?? 0) >= 10 ? 'bg-[#F87171]' : 'bg-[#FFD60A]'\r\n                  )} />\r\n                  <span className=\"truncate\">{task.name}</span>\r\n                </button>\r\n              ))}\r\n            </div>\r\n          )}\r\n        </div>\r\n      )}\r\n\r\n      {/* Section: Schedule Variance — hidden when not provided */}\r\n      {data.scheduleVarianceDays !== undefined && (\r\n      <div className={cn('px-5 py-4 border-b', isDark ? 'border-[#222]' : 'border-gray-200')}>\r\n        <h4 className={cn(\r\n          'text-[10px] font-mono uppercase tracking-wider mb-3',\r\n          isDark ? 'text-white/40' : 'text-gray-500'\r\n        )}>\r\n          {isEs ? 'VARIACIÓN DE CRONOGRAMA' : 'SCHEDULE VARIANCE'}\r\n        </h4>\r\n\r\n        {(() => {\r\n          const days = data.scheduleVarianceDays ?? 0;\r\n          const isAhead = days > 0;\r\n          const isBehind = days < 0;\r\n          const label = data.scheduleVarianceLabel || (\r\n            isAhead\r\n              ? `+${days} ${isEs ? 'Días ADELANTE' : 'Days AHEAD'}`\r\n              : isBehind\r\n                ? `${days} ${isEs ? 'Días ATRÁS' : 'Days BEHIND'}`\r\n                : (isEs ? 'EN TIEMPO' : 'ON TRACK')\r\n          );\r\n\r\n          return (\r\n            <div className={cn(\r\n              'px-3 py-2 rounded-lg text-center font-mono text-sm font-bold',\r\n              isAhead && 'bg-[#3BF06E]/15 text-[#3BF06E]',\r\n              isBehind && 'bg-[#F87171]/15 text-[#F87171]',\r\n              !isAhead && !isBehind && 'bg-[#3B9EFF]/15 text-[#3B9EFF]'\r\n            )}>\r\n              {label}\r\n            </div>\r\n          );\r\n        })()}\r\n      </div>\r\n      )}\r\n\r\n      {/* Section: Team Availability */}\r\n      {data.teams && data.teams.length > 0 && (\r\n        <div className=\"px-5 py-4\">\r\n          <h4 className={cn(\r\n            'text-[11px] font-mono uppercase tracking-wider font-semibold mb-3',\r\n            isDark ? 'text-white/60' : 'text-gray-600'\r\n          )}>\r\n            {isEs ? 'DISPONIBILIDAD DEL EQUIPO' : 'TEAM AVAILABILITY'}\r\n          </h4>\r\n\r\n          <div className=\"space-y-3\">\r\n            {data.teams.map((team, i) => {\r\n              const barColor = team.utilizationPercent >= 100\r\n                ? '#F87171'\r\n                : team.utilizationPercent >= 80\r\n                  ? '#FFD60A'\r\n                  : team.color || '#3BF06E';\r\n\r\n              return (\r\n                <div key={`${team.name}-${i}`}>\r\n                  <div className=\"flex items-center justify-between mb-1\">\r\n                    <span className={cn('text-xs', isDark ? 'text-white/60' : 'text-gray-600')}>\r\n                      {team.name}\r\n                    </span>\r\n                    <span className={cn('text-[10px] font-mono', isDark ? 'text-white/40' : 'text-gray-500')}>\r\n                      {team.utilizationPercent}%\r\n                    </span>\r\n                  </div>\r\n                  <div className={cn('w-full h-1.5 rounded-full overflow-hidden', isDark ? 'bg-white/[0.06]' : 'bg-gray-200')}>\r\n                    <div\r\n                      className=\"h-full rounded-full transition-all duration-300\"\r\n                      style={{\r\n                        width: `${Math.min(team.utilizationPercent, 100)}%`,\r\n                        backgroundColor: barColor,\r\n                      }}\r\n                    />\r\n                  </div>\r\n                </div>\r\n              );\r\n            })}\r\n          </div>\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * ListView Component\r\n * Professional list view for task management with dynamic columns\r\n * ClickUp-style features: column customization, context menu, custom fields\r\n * @version 0.18.0\r\n */\r\n\r\nimport { useState, useMemo, useCallback, useRef, useEffect } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport {\r\n  List,\r\n  ChevronDown,\r\n  ChevronRight,\r\n  ArrowUpDown,\r\n  Search,\r\n  Plus,\r\n  FolderOpen,\r\n  Folder,\r\n  PanelRight,\r\n  GripVertical,\r\n  Layers,\r\n  Info,\r\n  AlertCircle,\r\n} from 'lucide-react';\r\nimport type { Task } from '../Gantt/types';\r\nimport type {\r\n  ListViewProps,\r\n  FlattenedTask,\r\n  TableColumn,\r\n  ContextMenuState,\r\n  CustomFieldDefinition,\r\n  CustomFieldValue,\r\n  FillColumn,\r\n} from './types';\r\nimport { mergeListViewTranslations } from './i18n';\r\nimport { cn } from '../../utils';\r\n\r\n// Cell renderers\r\nimport { StatusCell } from './cells/StatusCell';\r\nimport { PriorityCell } from './cells/PriorityCell';\r\nimport { AssigneesCell } from './cells/AssigneesCell';\r\nimport { DateCell } from './cells/DateCell';\r\nimport { ProgressCell } from './cells/ProgressCell';\r\nimport { TextCell } from './cells/TextCell';\r\nimport { NumberCell } from './cells/NumberCell';\r\nimport { DropdownCell } from './cells/DropdownCell';\r\nimport { CheckboxCell } from './cells/CheckboxCell';\r\n// v1.9.24: cells for the custom field types that had none\r\nimport { MultiSelectCell } from './cells/MultiSelectCell';\r\nimport { FileCell } from './cells/FileCell';\r\nimport { TagsCell } from './cells/TagsCell';\r\nimport { TimeCell } from './cells/TimeCell';\r\n// v2.0.0: Chronos Interactive Time Manager cells\r\nimport { ScheduleVarianceCell } from './cells/ScheduleVarianceCell';\r\nimport { HoursBarCell } from './cells/HoursBarCell';\r\nimport { TeamLoadCell } from './cells/TeamLoadCell';\r\nimport { BlockersCell } from './cells/BlockersCell';\r\n\r\n// Components\r\nimport { TableContextMenu } from './TableContextMenu';\r\nimport { ganttUtils } from '../Gantt/ganttUtils';\r\nimport { ColumnSelector } from './ColumnSelector';\r\nimport { CreateFieldModal } from './CreateFieldModal';\r\nimport { StatusFilter, type StatusFilterValue } from './StatusFilter';\r\nimport { ProjectHealthSidebar } from './ProjectHealthSidebar';\r\n\r\ntype SortField = 'name' | 'startDate' | 'endDate' | 'progress' | 'status' | 'priority' | string;\r\ntype SortOrder = 'asc' | 'desc';\r\n\r\n// Default columns when none provided\r\nconst DEFAULT_COLUMNS: TableColumn[] = [\r\n  { id: 'name', type: 'name', label: 'Name', width: 300, visible: true, sortable: true, resizable: true },\r\n  { id: 'status', type: 'status', label: 'Status', width: 140, visible: true, sortable: true, resizable: true },\r\n  { id: 'startDate', type: 'startDate', label: 'Start Date', width: 120, visible: true, sortable: true, resizable: true },\r\n  { id: 'endDate', type: 'endDate', label: 'End Date', width: 120, visible: true, sortable: true, resizable: true },\r\n  { id: 'progress', type: 'progress', label: 'Progress', width: 100, visible: true, sortable: true, resizable: true },\r\n];\r\n\r\n/**\r\n * Flatten hierarchical tasks to flat list with level info.\r\n * `parentPath` accumulates ancestor ids (root → ... → self) so filters can\r\n * preserve hierarchy by matching ancestors when a descendant passes the filter.\r\n */\r\nfunction flattenTasksWithLevel(\r\n  tasks: Task[],\r\n  level = 0,\r\n  ancestorPath: string[] = []\r\n): FlattenedTask[] {\r\n  const result: FlattenedTask[] = [];\r\n\r\n  for (const task of tasks) {\r\n    const path = [...ancestorPath, task.id];\r\n    result.push({\r\n      ...task,\r\n      level,\r\n      hasChildren: (task.subtasks?.length || 0) > 0,\r\n      parentPath: path,\r\n    });\r\n    if (task.subtasks?.length && task.isExpanded !== false) {\r\n      result.push(...flattenTasksWithLevel(task.subtasks, level + 1, path));\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * Calculate average SPI (Schedule Performance Index) for a group task's subtasks\r\n * SPI = progress / expected_progress (based on elapsed time vs duration)\r\n */\r\nfunction calculateGroupSPI(task: Task): number | null {\r\n  const subtasks = task.subtasks;\r\n  if (!subtasks?.length) return null;\r\n\r\n  const now = new Date();\r\n  let totalSPI = 0;\r\n  let count = 0;\r\n\r\n  for (const sub of subtasks) {\r\n    if (!sub.startDate || !sub.endDate) continue;\r\n    const start = sub.startDate.getTime();\r\n    const end = sub.endDate.getTime();\r\n    const duration = end - start;\r\n    if (duration <= 0) continue;\r\n\r\n    const elapsed = Math.max(0, Math.min(now.getTime() - start, duration));\r\n    const expectedProgress = (elapsed / duration) * 100;\r\n    if (expectedProgress <= 0) continue;\r\n\r\n    const spi = (sub.progress || 0) / expectedProgress;\r\n    totalSPI += spi;\r\n    count++;\r\n  }\r\n\r\n  return count > 0 ? totalSPI / count : null;\r\n}\r\n\r\n\r\n/**\r\n * Sum timeLoggedMinutes and effortMinutes recursively across all subtasks of a group.\r\n * Returns { spent, allocated } in minutes.\r\n */\r\nfunction calculateGroupHours(task: Task): { spent: number; allocated: number; quoted: number } {\r\n  if (!task.subtasks?.length) return { spent: 0, allocated: 0, quoted: 0 };\r\n  let spent = 0;\r\n  let allocated = 0;\r\n  let quoted = 0;\r\n  for (const sub of task.subtasks) {\r\n    if (sub.subtasks?.length) {\r\n      // Sub is itself a group — recurse into its children\r\n      const nested = calculateGroupHours(sub);\r\n      // If children have values, use them; otherwise fallback to the group's own values\r\n      spent += nested.spent > 0 ? nested.spent : ((sub as any).timeLoggedMinutes ?? 0);\r\n      allocated += nested.allocated > 0 ? nested.allocated : ((sub as any).effortMinutes ?? 0);\r\n      quoted += nested.quoted > 0 ? nested.quoted : ((sub as any).soldEffortMinutes ?? 0);\r\n    } else {\r\n      // Leaf task — sum directly\r\n      spent += (sub as any).timeLoggedMinutes ?? 0;\r\n      allocated += (sub as any).effortMinutes ?? 0;\r\n      quoted += (sub as any).soldEffortMinutes ?? 0;\r\n    }\r\n  }\r\n  return { spent, allocated, quoted };\r\n}\r\n\r\nfunction formatGroupHours(minutes: number): string {\r\n  if (minutes <= 0) return '0h';\r\n  const h = Math.floor(minutes / 60);\r\n  const m = minutes % 60;\r\n  return m > 0 ? `${h}h ${m}m` : `${h}h`;\r\n}\r\n\r\n/**\r\n * Inline weight cell — click to edit, Enter/blur to save\r\n */\r\nfunction WeightCellInline({ value, onChange, isDark }: { value: number; onChange: (v: number) => void; isDark: boolean }) {\r\n  const [editing, setEditing] = useState(false);\r\n  const [editVal, setEditVal] = useState(String(value || ''));\r\n\r\n  if (editing) {\r\n    return (\r\n      <input\r\n        autoFocus\r\n        type=\"text\"\r\n        inputMode=\"decimal\"\r\n        value={editVal}\r\n        onClick={(e) => e.stopPropagation()}\r\n        onChange={(e) => setEditVal(e.target.value.replace(/[^0-9.]/g, ''))}\r\n        onBlur={() => {\r\n          const parsed = parseFloat(editVal);\r\n          if (!isNaN(parsed) && parsed >= 0 && parsed <= 100) onChange(parsed);\r\n          else if (editVal === '') onChange(0);\r\n          setEditing(false);\r\n        }}\r\n        onKeyDown={(e) => {\r\n          if (e.key === 'Enter') (e.target as HTMLInputElement).blur();\r\n          if (e.key === 'Escape') { setEditVal(String(value || '')); setEditing(false); }\r\n        }}\r\n        className={cn(\r\n          \"w-14 text-xs text-right font-mono px-1 py-0.5 rounded border outline-none\",\r\n          isDark ? \"bg-white/5 border-[#00E5CC]/50 text-white\" : \"bg-gray-50 border-[#00E5CC] text-gray-900\"\r\n        )}\r\n        style={{ fontFamily: 'JetBrains Mono, monospace' }}\r\n      />\r\n    );\r\n  }\r\n\r\n  return (\r\n    <button\r\n      onClick={(e) => { e.stopPropagation(); setEditVal(String(value || '')); setEditing(true); }}\r\n      className={cn(\r\n        \"text-xs font-mono cursor-pointer hover:underline\",\r\n        value > 0 ? (isDark ? \"text-white/80\" : \"text-gray-700\") : (isDark ? \"text-white/30\" : \"text-gray-300\")\r\n      )}\r\n      style={{ fontFamily: 'JetBrains Mono, monospace' }}\r\n    >\r\n      {value > 0 ? `${value}%` : '—'}\r\n    </button>\r\n  );\r\n}\r\n\r\n/**\r\n * Computes weighted progress from a list of leaf tasks.\r\n *\r\n * Two-path priority (matches user mental model: weight wins when declared):\r\n *   1. Manual weight  — used when weight sum ≥ 99 AND ≥95% of leaves carry weight.\r\n *                       This honors a fully-declared weight scheme like 90/10.\r\n *   2. Effort_minutes — peso virtual; used when weight is missing or partially\r\n *                       declared. Each leaf contributes proportional to its hours.\r\n *   3. Simple average — last-resort fallback when neither weight nor effort exists.\r\n *\r\n * Why this order: when the project lead bothered to type weights, the weight\r\n * is intent (e.g. \"this small task is critical, give it 90%\"). Effort-based\r\n * weighting is the right default only when no intent is recorded.\r\n */\r\nfunction computeWeightedProgress(\r\n  leaves: { progress: number; weight: number; effort_minutes?: number }[]\r\n): number {\r\n  if (leaves.length === 0) return 0;\r\n\r\n  // 1. Manual weight path — intent of the project lead wins\r\n  let weightedSum = 0;\r\n  let totalW = 0;\r\n  let weightedCount = 0;\r\n  for (const leaf of leaves) {\r\n    const w = leaf.weight || 0;\r\n    if (w > 0) {\r\n      weightedSum += (leaf.progress || 0) * w;\r\n      totalW += w;\r\n      weightedCount += 1;\r\n    }\r\n  }\r\n  const weightCoverage = weightedCount / leaves.length;\r\n  if (totalW >= 99 && weightCoverage >= 0.95) {\r\n    return Math.round((weightedSum / totalW) * 10) / 10;\r\n  }\r\n\r\n  // 2. Effort-weighted path — peso virtual based on hours\r\n  const totalEffort = leaves.reduce((s, l) => s + (l.effort_minutes || 0), 0);\r\n  if (totalEffort > 0) {\r\n    let num = 0;\r\n    let den = 0;\r\n    for (const leaf of leaves) {\r\n      const w = leaf.effort_minutes || 60;\r\n      num += (leaf.progress || 0) * w;\r\n      den += w;\r\n    }\r\n    return Math.round((num / den) * 10) / 10;\r\n  }\r\n\r\n  // 3. Simple average fallback\r\n  const simpleSum = leaves.reduce((s, l) => s + (l.progress || 0), 0);\r\n  return Math.round((simpleSum / leaves.length) * 10) / 10;\r\n}\r\n\r\n/**\r\n * Collects all leaf tasks (tasks without subtasks) from a tree.\r\n */\r\nfunction collectLeaves(\r\n  list: Task[],\r\n  out: { progress: number; weight: number; effort_minutes?: number }[] = []\r\n): { progress: number; weight: number; effort_minutes?: number }[] {\r\n  for (const t of list) {\r\n    if (t.subtasks && t.subtasks.length > 0) {\r\n      collectLeaves(t.subtasks, out);\r\n    } else {\r\n      out.push({\r\n        progress: t.progress || 0,\r\n        weight: (t as any).weight || 0,\r\n        effort_minutes: (t as any).effort_minutes ?? (t as any).effortMinutes,\r\n      });\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\n/**\r\n * Main ListView Component\r\n */\r\nexport function ListView({\r\n  tasks,\r\n  config = {},\r\n  callbacks = {},\r\n  isLoading = false,\r\n  error,\r\n  className,\r\n  style,\r\n  availableUsers = [],\r\n  customFields = [],\r\n  toolbarRightContent,\r\n  // v1.8.0: column header actions\r\n  onColumnHeaderClick,\r\n  columnsWithFilter,\r\n  filterDotColor = '#00E5CC',\r\n}: ListViewProps) {\r\n  const {\r\n    theme: themeName = 'dark',\r\n    locale = 'en',\r\n    customTranslations,\r\n    showSearch = true,\r\n    showHierarchy = true,\r\n    tableColumns,\r\n  /* v1.9.25 — see types.ts: Mesh hides these entirely. */\r\n  mostrarIndicadoresFinancieros = true,\r\n  /* v1.9.27 — ver types.ts: se esconden por SIMPLICIDAD, no por dinero. */\r\n  mostrarColumnasDensas = true,\r\n    allowColumnCustomization = true,\r\n    allowColumnResize = true,\r\n    enableContextMenu = true,\r\n    // v0.18.0: Create task button\r\n    showCreateTaskButton = false,\r\n    onCreateTask,\r\n    // v0.18.3: Persist filter state\r\n    persistFilter = false,\r\n    // v1.4.9: Governance v2.0 - Financial blur\r\n    financialBlur,\r\n    // v2.0.0: Chronos health sidebar\r\n    healthSidebar,\r\n    // v2.3.0: Financial lens\r\n    lens = 'hours',\r\n    hourlyRate = 0,\r\n    rateMap,\r\n    // v2.3.2: Aggregate child hours into parent hoursBar cell\r\n    aggregateParentHours = false,\r\n    // v2.4.0: Project totals sticky footer\r\n    showProjectTotals = false,\r\n    // v2.5.2: Optional dollar-totals override for the footer\r\n    totalsDollarOverride,\r\n  } = config;\r\n  /** 1.9.38 · filas de una línea y 40 px (ID + título en la misma línea). */\r\n  const compacta = config.rowDensity === 'compact';\r\n\r\n  const t = mergeListViewTranslations(locale, customTranslations);\r\n  const isDark = themeName === 'dark';\r\n\r\n  // v2.6.0: Resolve per-task hourly rate from assignees' rateMap.\r\n  //\r\n  // When a task has 2+ assignees with per-user estimated_minutes (multi-user\r\n  // effort distribution), the effective rate is a MINUTE-WEIGHTED average so\r\n  // that downstream `minutes × rate` callsites reproduce the honest\r\n  //    costo = Σ(userMinutes × userRate)\r\n  // formula. Example: Arcadio (2.7h @ $50) + Yesid (5.3h @ $100) on an 8h task:\r\n  //   weightedRate = (2.7*50 + 5.3*100) / 8 = $83.125\r\n  //   effortMinutes/60 × weightedRate = 8 × 83.125 = $665   (correct)\r\n  //\r\n  // When the task has no distribution, falls back to the previous behaviour\r\n  // (simple average of assignees' rates, or the global hourlyRate).\r\n  const getTaskRate = (task: Task): number => {\r\n    if (!rateMap || !task.assignees || task.assignees.length === 0) return hourlyRate;\r\n\r\n    // Minute-weighted path — only when at least one assignee carries\r\n    // estimatedMinutes > 0 (meaning the SaaS App has distributed the effort).\r\n    let weightedSum = 0;\r\n    let totalWeight = 0;\r\n    for (const a of task.assignees as any[]) {\r\n      const r = a.id ? rateMap[a.id] : undefined;\r\n      if (r == null || r <= 0) continue;\r\n      const m = typeof a.estimatedMinutes === 'number' ? a.estimatedMinutes : 0;\r\n      if (m > 0) {\r\n        weightedSum += r * m;\r\n        totalWeight += m;\r\n      }\r\n    }\r\n    if (totalWeight > 0) return weightedSum / totalWeight;\r\n\r\n    // Simple-average fallback (legacy behaviour for tasks without distribution)\r\n    const rates = task.assignees\r\n      .map((a: any) => a.id ? rateMap[a.id] : undefined)\r\n      .filter((r): r is number => r != null && r > 0);\r\n    if (rates.length === 0) return hourlyRate;\r\n    return rates.reduce((a, b) => a + b, 0) / rates.length;\r\n  };\r\n\r\n  // v2.5.1: Calculate group dollar totals — same logic as projectTotalHours (sumLeaves)\r\n  const calculateGroupDollars = (parentTask: Task): { dollarSpent: number; dollarAllocated: number; dollarQuoted: number } => {\r\n    let dollarSpent = 0, dollarAllocated = 0, dollarQuoted = 0;\r\n    const sumLeaves = (taskList: Task[]) => {\r\n      for (const t of taskList) {\r\n        if (t.subtasks && t.subtasks.length > 0) {\r\n          // Recurse into children first\r\n          const before = { s: dollarSpent, a: dollarAllocated, q: dollarQuoted };\r\n          sumLeaves(t.subtasks);\r\n          const childrenAdded = (dollarSpent - before.s) + (dollarAllocated - before.a) + (dollarQuoted - before.q);\r\n          // If children contributed nothing, use this group's own values as fallback\r\n          if (childrenAdded === 0) {\r\n            const rate = getTaskRate(t);\r\n            dollarSpent += (((t as any).timeLoggedMinutes ?? 0) / 60) * rate;\r\n            dollarAllocated += (((t as any).effortMinutes ?? 0) / 60) * rate;\r\n            dollarQuoted += (((t as any).soldEffortMinutes ?? 0) / 60) * rate;\r\n          }\r\n        } else {\r\n          const rate = getTaskRate(t);\r\n          dollarSpent += (((t as any).timeLoggedMinutes ?? 0) / 60) * rate;\r\n          dollarAllocated += (((t as any).effortMinutes ?? 0) / 60) * rate;\r\n          dollarQuoted += (((t as any).soldEffortMinutes ?? 0) / 60) * rate;\r\n        }\r\n      }\r\n    };\r\n    if (parentTask.subtasks) {\r\n      sumLeaves(parentTask.subtasks);\r\n    }\r\n    return { dollarSpent, dollarAllocated, dollarQuoted };\r\n  };\r\n\r\n  // v0.18.3: Load persisted filter state from localStorage\r\n  const loadPersistedFilter = useCallback(() => {\r\n    if (!persistFilter || typeof window === 'undefined') {\r\n      return { statusFilter: 'all' as StatusFilterValue, hideCompleted: false };\r\n    }\r\n    try {\r\n      const saved = localStorage.getItem(persistFilter);\r\n      if (saved) {\r\n        const parsed = JSON.parse(saved);\r\n        return {\r\n          statusFilter: (parsed.statusFilter || 'all') as StatusFilterValue,\r\n          hideCompleted: parsed.hideCompleted || false,\r\n        };\r\n      }\r\n    } catch (e) {\r\n      console.error('Error loading persisted filter:', e);\r\n    }\r\n    return { statusFilter: 'all' as StatusFilterValue, hideCompleted: false };\r\n  }, [persistFilter]);\r\n\r\n  // Calculate total project hours + dollars from all tasks (flat sum of leaf nodes to avoid double counting)\r\n  const projectTotalHours = useMemo(() => {\r\n    function sumLeaves(taskList: Task[]): { spent: number; allocated: number; quoted: number; dollarSpent: number; dollarAllocated: number; dollarQuoted: number } {\r\n      let spent = 0; let allocated = 0; let quoted = 0;\r\n      let dollarSpent = 0; let dollarAllocated = 0; let dollarQuoted = 0;\r\n      for (const t of taskList) {\r\n        if (t.subtasks && t.subtasks.length > 0) {\r\n          const nested = sumLeaves(t.subtasks);\r\n          const nestedTotal = nested.spent + nested.allocated + nested.quoted;\r\n          if (nestedTotal > 0) {\r\n            spent += nested.spent; allocated += nested.allocated; quoted += nested.quoted;\r\n            dollarSpent += nested.dollarSpent; dollarAllocated += nested.dollarAllocated; dollarQuoted += nested.dollarQuoted;\r\n          } else {\r\n            // Children have no values — fallback to this group's own values\r\n            const tSpent = (t as any).timeLoggedMinutes ?? 0;\r\n            const tAlloc = (t as any).effortMinutes ?? 0;\r\n            const tQuoted = (t as any).soldEffortMinutes ?? 0;\r\n            spent += tSpent; allocated += tAlloc; quoted += tQuoted;\r\n            const rate = getTaskRate(t);\r\n            dollarSpent += (tSpent / 60) * rate;\r\n            dollarAllocated += (tAlloc / 60) * rate;\r\n            dollarQuoted += (tQuoted / 60) * rate;\r\n          }\r\n        } else {\r\n          const tSpent = (t as any).timeLoggedMinutes ?? 0;\r\n          const tAlloc = (t as any).effortMinutes ?? 0;\r\n          const tQuoted = (t as any).soldEffortMinutes ?? 0;\r\n          spent += tSpent; allocated += tAlloc; quoted += tQuoted;\r\n          // Calculate $ using per-task rate (same as cell rendering)\r\n          const rate = getTaskRate(t);\r\n          dollarSpent += (tSpent / 60) * rate;\r\n          dollarAllocated += (tAlloc / 60) * rate;\r\n          dollarQuoted += (tQuoted / 60) * rate;\r\n        }\r\n      }\r\n      return { spent, allocated, quoted, dollarSpent, dollarAllocated, dollarQuoted };\r\n    }\r\n    return sumLeaves(tasks);\r\n  }, [tasks]);\r\n\r\n  // Pre-compute parent→children weight sums (recursive for all levels)\r\n  const parentWeightSums = useMemo(() => {\r\n    const sums = new Map<string, number>();\r\n    function collectWeights(taskList: Task[]): number {\r\n      let total = 0;\r\n      for (const t of taskList) {\r\n        if (t.subtasks && t.subtasks.length > 0) {\r\n          const childSum = collectWeights(t.subtasks);\r\n          sums.set(t.id, childSum);\r\n          total += childSum;\r\n        } else {\r\n          total += (t as any).weight || 0;\r\n        }\r\n      }\r\n      return total;\r\n    }\r\n    collectWeights(tasks);\r\n    return sums;\r\n  }, [tasks]);\r\n\r\n  // Merge project total into healthSidebar data so sidebar can display it\r\n  const healthSidebarWithTotal = useMemo(() => {\r\n    if (!healthSidebar?.enabled || !healthSidebar.data) return healthSidebar;\r\n    return {\r\n      ...healthSidebar,\r\n      data: {\r\n        ...healthSidebar.data,\r\n        totalHoursSpentMinutes: projectTotalHours.spent,\r\n        totalHoursAllocatedMinutes: projectTotalHours.allocated,\r\n      },\r\n    };\r\n  }, [healthSidebar, projectTotalHours]);\r\n\r\n  // State\r\n  const [sidebarOpen, setSidebarOpen] = useState(true);\r\n  const [highlightedTaskId, setHighlightedTaskId] = useState<string | null>(null);\r\n  const [sortField, setSortField] = useState<SortField>('position');\r\n  const [sortOrder, setSortOrder] = useState<SortOrder>('asc');\r\n  const [searchQuery, setSearchQuery] = useState('');\r\n  const [statusFilter, setStatusFilter] = useState<StatusFilterValue>(() => loadPersistedFilter().statusFilter);\r\n  const [hideCompleted, setHideCompleted] = useState(() => loadPersistedFilter().hideCompleted);\r\n  const [columns, setColumns] = useState<TableColumn[]>(tableColumns || DEFAULT_COLUMNS);\r\n  const [showColumnSelector, setShowColumnSelector] = useState(false);\r\n  const [showCreateFieldModal, setShowCreateFieldModal] = useState(false);\r\n  const [contextMenu, setContextMenu] = useState<ContextMenuState>({\r\n    isOpen: false,\r\n    x: 0,\r\n    y: 0,\r\n    type: 'task',\r\n  });\r\n\r\n  // v2.5.0: Row drag & drop (mouse-based, same pattern as Gantt TaskGrid)\r\n  const [rowDragId, setRowDragId] = useState<string | null>(null);\r\n  const [rowDragging, setRowDragging] = useState(false);\r\n  const [rowDropTargetId, setRowDropTargetId] = useState<string | null>(null);\r\n  const [rowDropPosition, setRowDropPosition] = useState<'above' | 'below' | 'child' | null>(null);\r\n  const [rowGhostPos, setRowGhostPos] = useState<{ x: number; y: number } | null>(null);\r\n  const rowDragStartY = useRef(0);\r\n  const rowDraggingRef = useRef(false);\r\n  const canDragRows = !!(callbacks.onTaskMove || callbacks.onTaskReparent);\r\n\r\n  // Drag-fill (Excel-style): drag a value (assignees/date) from one cell down\r\n  // across rows to apply it to all of them. Mirrors the Gantt TaskGrid.\r\n  const [hoveredTaskId, setHoveredTaskId] = useState<string | null>(null);\r\n  const [fillDrag, setFillDrag] = useState<{\r\n    sourceTaskId: string;\r\n    column: FillColumn;\r\n    sourceIndex: number;\r\n    targetIndex: number;\r\n    // v1.9.7: ids de las filas dentro del rango del arrastre. El preview se\r\n    // pinta por ID (no por índice): los group headers de nivel 0 no llevan\r\n    // data-listview-row, así que el índice del DOM y el de displayTasks\r\n    // divergen en proyectos con fases — pintar por índice marcaba filas\r\n    // equivocadas (o ninguna) y aplicaba el relleno a tareas incorrectas.\r\n    rangeIds: Set<string>;\r\n  } | null>(null);\r\n  /*\r\n   * The visible \"Equipo\" column has type 'teamLoad' (it shows the assignee\r\n   * picker on leaf tasks); map it to 'assignees' for drag-fill. Returns the\r\n   * normalized fill column for a column, or null if not fillable.\r\n   *\r\n   * ── v1.9.28 · LAS COLUMNAS DE CAMPO PERSONALIZADO ────────────────────────\r\n   *\r\n   * Hasta 1.9.27 esto sólo conocía tres columnas, así que NINGUNA columna de\r\n   * campo personalizado se dejaba arrastrar — ni siquiera una de tipo fecha,\r\n   * porque no se llama `startDate` ni `endDate`.\r\n   *\r\n   * Un campo personalizado NO es una propiedad de la tarea: su valor vive en\r\n   * `tasks.campos`, y por eso el relleno no puede devolver un nombre de\r\n   * propiedad. Devuelve `{ kind: 'customField', fieldId }` y quien recibe\r\n   * `onBulkFill` decide cómo guardarlo. Si esto devolviera un nombre de\r\n   * propiedad cualquiera, el tirador aparecería, la fila se pintaría y NO SE\r\n   * GUARDARÍA NADA: el fallo mudo de siempre.\r\n   *\r\n   * `file` queda fuera a propósito: copiar un adjunto a veinte tareas es\r\n   * copiar una referencia a un fichero cuyo permiso no se ha comprobado en el\r\n   * destino. No es un olvido.\r\n   */\r\n  const fillColumnFor = (column: TableColumn): FillColumn | null => {\r\n    const colType = column.type as string;\r\n    if (column.customFieldId) {\r\n      return colType === 'file'\r\n        ? null\r\n        : { kind: 'customField', fieldId: column.customFieldId };\r\n    }\r\n    if (colType === 'assignees' || colType === 'teamLoad') return 'assignees';\r\n    if (colType === 'startDate') return 'startDate';\r\n    if (colType === 'endDate') return 'endDate';\r\n    return null;\r\n  };\r\n  /** Igualdad de columna de relleno: los objetos no se comparan con `===`. */\r\n  const mismaColumnaDeRelleno = (a: FillColumn, b: FillColumn): boolean =>\r\n    typeof a === 'string' || typeof b === 'string'\r\n      ? a === b\r\n      : a.fieldId === b.fieldId;\r\n  // Latest display order, read inside the drag-fill mouse handlers (assigned\r\n  // after displayTasks is computed, below).\r\n  const displayTasksRef = useRef<Task[]>([]);\r\n\r\n  const handleRowDragStart = useCallback((taskId: string, e: React.MouseEvent) => {\r\n    if (!canDragRows) return;\r\n    e.preventDefault();\r\n    rowDragStartY.current = e.clientY;\r\n    setRowDragId(taskId);\r\n    rowDraggingRef.current = false;\r\n    setRowDragging(false);\r\n    setRowGhostPos({ x: e.clientX, y: e.clientY });\r\n  }, [canDragRows]);\r\n\r\n  const handleRowDragMove = useCallback((e: MouseEvent) => {\r\n    if (!rowDragId) return;\r\n    const delta = Math.abs(e.clientY - rowDragStartY.current);\r\n    if (delta > 5 && !rowDraggingRef.current) {\r\n      rowDraggingRef.current = true;\r\n      setRowDragging(true);\r\n    }\r\n    setRowGhostPos({ x: e.clientX, y: e.clientY });\r\n    if (!rowDraggingRef.current) return;\r\n\r\n    // Find target row\r\n    const rows = document.querySelectorAll('[data-listview-row]');\r\n    let foundId: string | null = null;\r\n    let pos: 'above' | 'below' | 'child' | null = null;\r\n    rows.forEach((row) => {\r\n      const rect = row.getBoundingClientRect();\r\n      const id = row.getAttribute('data-listview-row');\r\n      if (id && id !== rowDragId && e.clientY >= rect.top && e.clientY <= rect.bottom) {\r\n        foundId = id;\r\n        const relY = e.clientY - rect.top;\r\n        const h = rect.height;\r\n        pos = relY < h * 0.25 ? 'above' : relY > h * 0.75 ? 'below' : 'child';\r\n      }\r\n    });\r\n    setRowDropTargetId(foundId);\r\n    setRowDropPosition(pos);\r\n  }, [rowDragId]);\r\n\r\n  const handleRowDragEnd = useCallback(() => {\r\n    if (rowDraggingRef.current && rowDragId && rowDropTargetId && rowDropPosition) {\r\n      if (rowDropPosition === 'child' && callbacks.onTaskReparent) {\r\n        callbacks.onTaskReparent(rowDragId, rowDropTargetId);\r\n      } else if (rowDropPosition === 'above' || rowDropPosition === 'below') {\r\n        // Find parent of target\r\n        const findParent = (list: Task[], targetId: string, parent: string | null = null): string | null | undefined => {\r\n          for (const t of list) {\r\n            if (t.id === targetId) return parent;\r\n            if (t.subtasks) {\r\n              const found = findParent(t.subtasks, targetId, t.id);\r\n              if (found !== undefined) return found;\r\n            }\r\n          }\r\n          return undefined;\r\n        };\r\n        const draggedParent = findParent(tasks, rowDragId, null);\r\n        const targetParent = findParent(tasks, rowDropTargetId, null);\r\n\r\n        if (callbacks.onTaskReparent) {\r\n          const findSiblings = (list: Task[], parentId: string | null): Task[] => {\r\n            if (parentId === null) return list;\r\n            for (const t of list) {\r\n              if (t.id === parentId) return t.subtasks || [];\r\n              if (t.subtasks) {\r\n                const found = findSiblings(t.subtasks, parentId);\r\n                if (found.length > 0 || t.subtasks.some(s => s.id === parentId)) return found;\r\n              }\r\n            }\r\n            return [];\r\n          };\r\n          const siblings = findSiblings(tasks, targetParent ?? null);\r\n          const targetIdx = siblings.findIndex(t => t.id === rowDropTargetId);\r\n          const sameGroup = draggedParent === targetParent;\r\n          const dragIdx = sameGroup ? siblings.findIndex(t => t.id === rowDragId) : -1;\r\n          let pos = rowDropPosition === 'below' ? targetIdx + 1 : targetIdx;\r\n          if (sameGroup && dragIdx !== -1 && dragIdx < targetIdx) pos -= 1;\r\n          callbacks.onTaskReparent(rowDragId, targetParent ?? null, Math.max(0, pos));\r\n        }\r\n      }\r\n    }\r\n    setRowDragId(null);\r\n    setRowDropTargetId(null);\r\n    setRowDropPosition(null);\r\n    setRowGhostPos(null);\r\n    rowDraggingRef.current = false;\r\n    setRowDragging(false);\r\n  }, [rowDragId, rowDropTargetId, rowDropPosition, tasks, callbacks]);\r\n\r\n  // ── Drag-fill handlers (mirror Gantt TaskGrid) ─────────────────────────────\r\n  const getFillValue = (task: Task, column: FillColumn) => {\r\n    /*\r\n     * v1.9.28: el valor de un campo personalizado NO está en la tarea sino en\r\n     * su documento de campos. `undefined` es legítimo —el campo está vacío— y\r\n     * rellenar con vacío BORRA en el destino, que es lo que Excel hace y lo\r\n     * que el usuario espera al arrastrar una celda vacía.\r\n     */\r\n    if (typeof column !== 'string') {\r\n      /*\r\n       * `customFields` es una LISTA de `{fieldId, value}`, no un objeto\r\n       * indexado por id. La primera versión hizo `customFields[fieldId]` y\r\n       * devolvía `undefined` siempre: el tirador salía, el arrastre corría y\r\n       * rellenaba vacío en todas las filas sin que nada fallara.\r\n       */\r\n      const cfs = (task as Task & { customFields?: CustomFieldValue[] }).customFields;\r\n      return cfs?.find(cf => cf.fieldId === column.fieldId)?.value;\r\n    }\r\n    if (column === 'assignees') return (task as any).assignees;\r\n    if (column === 'startDate') return (task as any).startDate;\r\n    return (task as any).endDate;\r\n  };\r\n\r\n  const handleFillDragStart = (\r\n    e: React.MouseEvent,\r\n    sourceTaskId: string,\r\n    column: FillColumn,\r\n    sourceIndex: number,\r\n  ) => {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n\r\n    // v1.9.7: cursor global durante el arrastre — sin esto el cursor \"parpadea\"\r\n    // o desaparece al pasar sobre celdas con estilos propios.\r\n    document.body.style.cursor = 'crosshair';\r\n    document.body.style.userSelect = 'none';\r\n\r\n    // Ordered ids of the rows currently in the DOM (display order).\r\n    // v1.9.7: TODO el rango se maneja por IDs de fila del DOM, no por índices\r\n    // de displayTasks: los group headers (nivel 0) no llevan data-listview-row,\r\n    // así que ambos espacios de índices divergen en proyectos con fases.\r\n    const rowEls = Array.from(document.querySelectorAll('[data-listview-row]')) as HTMLElement[];\r\n    const rowIds = rowEls.map((r) => r.getAttribute('data-listview-row') || '');\r\n    const sourceRowIndex = Math.max(0, rowIds.indexOf(sourceTaskId));\r\n    const rangeIdsFor = (targetRowIdx: number): string[] =>\r\n      rowIds.slice(sourceRowIndex, targetRowIdx + 1);\r\n\r\n    setFillDrag({\r\n      sourceTaskId,\r\n      column,\r\n      sourceIndex,\r\n      targetIndex: sourceIndex,\r\n      rangeIds: new Set([sourceTaskId]),\r\n    });\r\n\r\n    // v1.9.7: el scroll de la Lista vive en un ancestro (la librería no tiene\r\n    // contenedor propio) — lo detectamos subiendo por el DOM. Fallback: documento.\r\n    const findScrollParent = (el: HTMLElement | null): HTMLElement | null => {\r\n      let node = el?.parentElement ?? null;\r\n      while (node) {\r\n        const style = window.getComputedStyle(node);\r\n        const oy = style.overflowY;\r\n        if ((oy === 'auto' || oy === 'scroll') && node.scrollHeight > node.clientHeight) return node;\r\n        node = node.parentElement;\r\n      }\r\n      const doc = document.scrollingElement as HTMLElement | null;\r\n      return doc && doc.scrollHeight > doc.clientHeight ? doc : null;\r\n    };\r\n    const container = findScrollParent(e.currentTarget as HTMLElement);\r\n\r\n    const rowIndexAt = (clientY: number): number => {\r\n      let idx = sourceRowIndex;\r\n      let matched = false;\r\n      rowEls.forEach((row, i) => {\r\n        const r = row.getBoundingClientRect();\r\n        if (clientY >= r.top && clientY <= r.bottom) {\r\n          idx = i;\r\n          matched = true;\r\n        }\r\n      });\r\n      // v1.9.7: cursor por debajo de la última fila → última fila (antes el\r\n      // índice se quedaba clavado al salir del área de filas).\r\n      const lastRow = rowEls[rowEls.length - 1];\r\n      if (!matched && lastRow) {\r\n        const lastRect = lastRow.getBoundingClientRect();\r\n        if (clientY > lastRect.bottom) idx = rowEls.length - 1;\r\n      }\r\n      if (idx < sourceRowIndex) idx = sourceRowIndex; // fill downward only\r\n      return idx;\r\n    };\r\n\r\n    // v1.9.7: auto-scroll cerca de los bordes — en proyectos grandes el relleno\r\n    // se detenía en la última fila visible. El loop RAF también actualiza el\r\n    // targetIndex mientras desplaza (no llegan mousemove con el mouse quieto).\r\n    let lastClientY = e.clientY;\r\n    let rafId: number | null = null;\r\n\r\n    const stopAutoScroll = () => {\r\n      if (rafId !== null) {\r\n        cancelAnimationFrame(rafId);\r\n        rafId = null;\r\n      }\r\n    };\r\n\r\n    const updateTarget = () => {\r\n      const idx = rowIndexAt(lastClientY);\r\n      const rangeIds = new Set(rangeIdsFor(idx));\r\n      setFillDrag(prev => (prev ? { ...prev, targetIndex: idx, rangeIds } : prev));\r\n    };\r\n\r\n    const maybeAutoScroll = () => {\r\n      stopAutoScroll();\r\n      if (!container) return;\r\n      const sc = container;\r\n      const isDoc = sc === document.scrollingElement;\r\n      const rect = isDoc\r\n        ? { top: 0, bottom: window.innerHeight }\r\n        : sc.getBoundingClientRect();\r\n      const edgeZone = 60;\r\n      const maxSpeed = 12;\r\n      const distFromTop = lastClientY - rect.top;\r\n      const distFromBottom = rect.bottom - lastClientY;\r\n      const maxScroll = sc.scrollHeight - sc.clientHeight;\r\n\r\n      if (distFromBottom < edgeZone && sc.scrollTop < maxScroll) {\r\n        const speed = Math.max(1, Math.round(maxSpeed * (1 - Math.max(0, distFromBottom) / edgeZone)));\r\n        const scroll = () => {\r\n          sc.scrollTop += speed;\r\n          updateTarget();\r\n          if (sc.scrollTop < sc.scrollHeight - sc.clientHeight) {\r\n            rafId = requestAnimationFrame(scroll);\r\n          }\r\n        };\r\n        rafId = requestAnimationFrame(scroll);\r\n      } else if (distFromTop < edgeZone && sc.scrollTop > 0) {\r\n        const speed = Math.max(1, Math.round(maxSpeed * (1 - Math.max(0, distFromTop) / edgeZone)));\r\n        const scroll = () => {\r\n          sc.scrollTop -= speed;\r\n          updateTarget();\r\n          if (sc.scrollTop > 0) {\r\n            rafId = requestAnimationFrame(scroll);\r\n          }\r\n        };\r\n        rafId = requestAnimationFrame(scroll);\r\n      }\r\n    };\r\n\r\n    const onMove = (ev: MouseEvent) => {\r\n      lastClientY = ev.clientY;\r\n      updateTarget();\r\n      maybeAutoScroll();\r\n    };\r\n\r\n    const onUp = (ev: MouseEvent) => {\r\n      window.removeEventListener('mousemove', onMove);\r\n      window.removeEventListener('mouseup', onUp);\r\n      stopAutoScroll();\r\n      document.body.style.cursor = '';\r\n      document.body.style.userSelect = '';\r\n      setFillDrag(null);\r\n      const targetRowIndex = rowIndexAt(ev.clientY);\r\n      // Resolve the source task from the display list to read its value.\r\n      const byId = new Map(displayTasksRef.current.map((t) => [t.id, t]));\r\n      const sourceTask = byId.get(sourceTaskId);\r\n      if (!sourceTask) return;\r\n      const value = getFillValue(sourceTask, column);\r\n      // v1.9.7: los destinos salen de los IDs de fila del DOM (espacio\r\n      // consistente con el preview), no de índices de displayTasks.\r\n      const targetIds: string[] = [];\r\n      for (const id of rangeIdsFor(targetRowIndex)) {\r\n        if (id === sourceTaskId) continue;\r\n        const t = byId.get(id);\r\n        if (!t) continue;\r\n        if ((t as any).subtasks && (t as any).subtasks.length > 0) continue; // skip parents\r\n        targetIds.push(id);\r\n      }\r\n      if (targetIds.length > 0) callbacks.onBulkFill?.(targetIds, column, value);\r\n    };\r\n\r\n    window.addEventListener('mousemove', onMove);\r\n    window.addEventListener('mouseup', onUp);\r\n  };\r\n\r\n  // v1.9.7: el rango se evalúa por ID de tarea (ver nota en el estado fillDrag).\r\n  const isInFillRange = (taskId: string) => {\r\n    if (!fillDrag) return false;\r\n    return fillDrag.rangeIds.has(taskId);\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (rowDragId) {\r\n      document.addEventListener('mousemove', handleRowDragMove);\r\n      document.addEventListener('mouseup', handleRowDragEnd);\r\n      document.body.style.cursor = 'grabbing';\r\n      document.body.style.userSelect = 'none';\r\n      return () => {\r\n        document.removeEventListener('mousemove', handleRowDragMove);\r\n        document.removeEventListener('mouseup', handleRowDragEnd);\r\n        document.body.style.cursor = '';\r\n        document.body.style.userSelect = '';\r\n      };\r\n    }\r\n    return undefined;\r\n  }, [rowDragId, handleRowDragMove, handleRowDragEnd]);\r\n\r\n  // v2.5.0: WBS Level filter (same as Gantt)\r\n  const [wbsLevel, setWbsLevel] = useState<number | 'all'>('all');\r\n  const [wbsDropdownOpen, setWbsDropdownOpen] = useState(false);\r\n  const wbsTriggerRef = useRef<HTMLButtonElement>(null);\r\n  const wbsDropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n  // Calculate max depth from task tree\r\n  const maxWbsDepth = useMemo(() => {\r\n    let max = 0;\r\n    function walk(taskList: Task[], depth: number) {\r\n      for (const t of taskList) {\r\n        if (depth > max) max = depth;\r\n        if (t.subtasks?.length) walk(t.subtasks, depth + 1);\r\n      }\r\n    }\r\n    walk(tasks, 1);\r\n    return max;\r\n  }, [tasks]);\r\n\r\n  // Close WBS dropdown on outside click\r\n  useEffect(() => {\r\n    if (!wbsDropdownOpen) return;\r\n    const handler = (e: MouseEvent) => {\r\n      if (wbsTriggerRef.current?.contains(e.target as Node)) return;\r\n      if (wbsDropdownRef.current?.contains(e.target as Node)) return;\r\n      setWbsDropdownOpen(false);\r\n    };\r\n    document.addEventListener('mousedown', handler);\r\n    return () => document.removeEventListener('mousedown', handler);\r\n  }, [wbsDropdownOpen]);\r\n\r\n  // When wbsLevel changes, trigger expand/collapse via callbacks\r\n  useEffect(() => {\r\n    if (wbsLevel === 'all') {\r\n      // Expand all\r\n      function expandAll(taskList: Task[]) {\r\n        for (const t of taskList) {\r\n          if (t.subtasks?.length) {\r\n            if (t.isExpanded === false) callbacks.onTaskToggleExpand?.(t.id);\r\n            expandAll(t.subtasks);\r\n          }\r\n        }\r\n      }\r\n      expandAll(tasks);\r\n    } else {\r\n      // Expand only up to the selected level, collapse deeper\r\n      function setLevel(taskList: Task[], depth: number) {\r\n        for (const t of taskList) {\r\n          if (t.subtasks?.length) {\r\n            const shouldExpand = depth < (wbsLevel as number);\r\n            const isCurrentlyExpanded = t.isExpanded !== false;\r\n            if (shouldExpand !== isCurrentlyExpanded) {\r\n              callbacks.onTaskToggleExpand?.(t.id);\r\n            }\r\n            setLevel(t.subtasks, depth + 1);\r\n          }\r\n        }\r\n      }\r\n      setLevel(tasks, 1);\r\n    }\r\n  // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [wbsLevel]);\r\n\r\n  // Column resize state\r\n  const [resizingColumn, setResizingColumn] = useState<string | null>(null);\r\n  const [resizeStartX, setResizeStartX] = useState(0);\r\n  const [resizeStartWidth, setResizeStartWidth] = useState(0);\r\n  const tableRef = useRef<HTMLDivElement>(null);\r\n\r\n  // v2.4.0: Column drag-and-drop reorder state\r\n  const [dragColumnId, setDragColumnId] = useState<string | null>(null);\r\n  const [dragOverColumnId, setDragOverColumnId] = useState<string | null>(null);\r\n\r\n  // Sync columns with prop changes — only when signature actually differs,\r\n  // otherwise a parent that echoes the same columns back (via persisted prefs)\r\n  // overwrites in-flight local edits and flickers the header.\r\n  useEffect(() => {\r\n    if (!tableColumns) return;\r\n    setColumns(prev => {\r\n      // Fast structural compare (id/order/visible/width) — avoids resetting when parent\r\n      // re-sends an equivalent snapshot after persistence.\r\n      if (prev.length === tableColumns.length) {\r\n        let identical = true;\r\n        for (let i = 0; i < prev.length; i++) {\r\n          const a = prev[i];\r\n          const b = tableColumns[i];\r\n          if (!a || !b || a.id !== b.id || a.visible !== b.visible || a.width !== b.width || a.label !== b.label) {\r\n            identical = false;\r\n            break;\r\n          }\r\n        }\r\n        if (identical) return prev;\r\n      }\r\n      return tableColumns;\r\n    });\r\n  }, [tableColumns]);\r\n\r\n  // v0.18.3: Persist filter state to localStorage when it changes\r\n  useEffect(() => {\r\n    if (!persistFilter || typeof window === 'undefined') return;\r\n    try {\r\n      localStorage.setItem(persistFilter, JSON.stringify({\r\n        statusFilter,\r\n        hideCompleted,\r\n      }));\r\n    } catch (e) {\r\n      console.error('Error persisting filter state:', e);\r\n    }\r\n  }, [persistFilter, statusFilter, hideCompleted]);\r\n\r\n  // Build expanded tasks set from task.isExpanded props\r\n  const expandedTasks = useMemo(() => {\r\n    const expanded = new Set<string>();\r\n    function collectExpanded(taskList: Task[]) {\r\n      for (const task of taskList) {\r\n        if (task.subtasks?.length) {\r\n          if (task.isExpanded !== false) {\r\n            expanded.add(task.id);\r\n          }\r\n          collectExpanded(task.subtasks);\r\n        }\r\n      }\r\n    }\r\n    collectExpanded(tasks);\r\n    return expanded;\r\n  }, [tasks]);\r\n\r\n  // Get visible columns\r\n  const visibleColumns = useMemo(() => columns.filter(col => col.visible), [columns]);\r\n\r\n  // Toggle task expansion - delegates to parent via callback\r\n  const toggleExpand = useCallback((taskId: string) => {\r\n    callbacks.onTaskToggleExpand?.(taskId);\r\n  }, [callbacks]);\r\n\r\n  // Sort handler\r\n  const handleSort = useCallback((field: SortField) => {\r\n    if (sortField === field) {\r\n      setSortOrder(prev => prev === 'asc' ? 'desc' : 'asc');\r\n    } else {\r\n      setSortField(field);\r\n      setSortOrder('asc');\r\n    }\r\n    callbacks.onSortChange?.({ column: field as any, direction: sortOrder === 'asc' ? 'desc' : 'asc' });\r\n  }, [sortField, sortOrder, callbacks]);\r\n\r\n  // Column management\r\n  const handleColumnsChange = useCallback((newColumns: TableColumn[]) => {\r\n    setColumns(newColumns);\r\n    callbacks.onColumnsChange?.(newColumns);\r\n  }, [callbacks]);\r\n\r\n  const handleColumnHide = useCallback((columnId: string) => {\r\n    const newColumns = columns.map(col =>\r\n      col.id === columnId ? { ...col, visible: false } : col\r\n    );\r\n    handleColumnsChange(newColumns);\r\n  }, [columns, handleColumnsChange]);\r\n\r\n  const handleColumnSort = useCallback((columnId: string, direction: SortOrder) => {\r\n    setSortField(columnId);\r\n    setSortOrder(direction);\r\n  }, []);\r\n\r\n  // Context menu handlers\r\n  const handleContextMenu = useCallback((e: React.MouseEvent, task?: Task, columnId?: string) => {\r\n    if (!enableContextMenu) return;\r\n    e.preventDefault();\r\n    setContextMenu({\r\n      isOpen: true,\r\n      x: e.clientX,\r\n      y: e.clientY,\r\n      type: task ? 'task' : 'header',\r\n      task,\r\n      columnId,\r\n    });\r\n  }, [enableContextMenu]);\r\n\r\n  const closeContextMenu = useCallback(() => {\r\n    setContextMenu(prev => ({ ...prev, isOpen: false }));\r\n  }, []);\r\n\r\n  // Column resize handlers\r\n  const handleResizeStart = useCallback((e: React.MouseEvent, columnId: string) => {\r\n    if (!allowColumnResize) return;\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    const column = columns.find(c => c.id === columnId);\r\n    if (column) {\r\n      setResizingColumn(columnId);\r\n      setResizeStartX(e.clientX);\r\n      setResizeStartWidth(column.width);\r\n    }\r\n  }, [columns, allowColumnResize]);\r\n\r\n  useEffect(() => {\r\n    if (!resizingColumn) return;\r\n\r\n    // Keep latest columns in a local ref so mouseup fires with the freshest state\r\n    let latestColumns = columns;\r\n\r\n    const handleMouseMove = (e: MouseEvent) => {\r\n      const delta = e.clientX - resizeStartX;\r\n      const newWidth = Math.max(50, resizeStartWidth + delta);\r\n      latestColumns = latestColumns.map(col =>\r\n        col.id === resizingColumn ? { ...col, width: newWidth } : col\r\n      );\r\n      setColumns(latestColumns);\r\n    };\r\n\r\n    const handleMouseUp = () => {\r\n      // Emit final columns with updated widths (not the stale closure copy)\r\n      callbacks.onColumnsChange?.(latestColumns);\r\n      setResizingColumn(null);\r\n    };\r\n\r\n    document.addEventListener('mousemove', handleMouseMove);\r\n    document.addEventListener('mouseup', handleMouseUp);\r\n\r\n    return () => {\r\n      document.removeEventListener('mousemove', handleMouseMove);\r\n      document.removeEventListener('mouseup', handleMouseUp);\r\n    };\r\n    // Intentionally omit `columns` from deps — we read the latest via local ref to avoid re-binding listeners\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [resizingColumn, resizeStartX, resizeStartWidth, callbacks]);\r\n\r\n  // v2.4.0: Column drag-and-drop reorder handlers\r\n  const handleColumnDragStart = useCallback((e: React.DragEvent, columnId: string) => {\r\n    // Never allow dragging the name column\r\n    if (columnId === 'name') { e.preventDefault(); return; }\r\n    setDragColumnId(columnId);\r\n    e.dataTransfer.effectAllowed = 'move';\r\n    e.dataTransfer.setData('text/plain', columnId);\r\n    // Make the drag image semi-transparent\r\n    if (e.currentTarget instanceof HTMLElement) {\r\n      e.currentTarget.style.opacity = '0.5';\r\n    }\r\n  }, []);\r\n\r\n  const handleColumnDragEnd = useCallback((e: React.DragEvent) => {\r\n    if (e.currentTarget instanceof HTMLElement) {\r\n      e.currentTarget.style.opacity = '1';\r\n    }\r\n    setDragColumnId(null);\r\n    setDragOverColumnId(null);\r\n  }, []);\r\n\r\n  const handleColumnDragOver = useCallback((e: React.DragEvent, columnId: string) => {\r\n    e.preventDefault();\r\n    // Don't allow dropping on the name column\r\n    if (columnId === 'name') return;\r\n    e.dataTransfer.dropEffect = 'move';\r\n    setDragOverColumnId(columnId);\r\n  }, []);\r\n\r\n  const handleColumnDragLeave = useCallback(() => {\r\n    setDragOverColumnId(null);\r\n  }, []);\r\n\r\n  const handleColumnDrop = useCallback((e: React.DragEvent, targetColumnId: string) => {\r\n    e.preventDefault();\r\n    if (!dragColumnId || dragColumnId === targetColumnId || targetColumnId === 'name') return;\r\n\r\n    const newColumns = [...columns];\r\n    const fromIndex = newColumns.findIndex(c => c.id === dragColumnId);\r\n    const toIndex = newColumns.findIndex(c => c.id === targetColumnId);\r\n    if (fromIndex === -1 || toIndex === -1) return;\r\n\r\n    // Remove from old position and insert at new\r\n    const removed = newColumns.splice(fromIndex, 1);\r\n    if (!removed[0]) return;\r\n    newColumns.splice(toIndex, 0, removed[0]);\r\n\r\n    handleColumnsChange(newColumns);\r\n    setDragColumnId(null);\r\n    setDragOverColumnId(null);\r\n  }, [dragColumnId, columns, handleColumnsChange]);\r\n\r\n  // Custom field creation\r\n  const handleCreateCustomField = useCallback(async (field: Omit<CustomFieldDefinition, 'id' | 'projectId'>) => {\r\n    if (callbacks.onCreateCustomField) {\r\n      const fullField: CustomFieldDefinition = {\r\n        ...field,\r\n        id: `cf_${Date.now()}`,\r\n        projectId: '',\r\n      };\r\n      await callbacks.onCreateCustomField(fullField);\r\n    }\r\n    setShowCreateFieldModal(false);\r\n  }, [callbacks]);\r\n\r\n  // Helper to get task status\r\n  const getTaskStatus = useCallback((task: Task): 'completed' | 'in-progress' | 'todo' => {\r\n    if (task.progress === 100 || task.status === 'completed') return 'completed';\r\n    if ((task.progress && task.progress > 0) || task.status === 'in-progress') return 'in-progress';\r\n    return 'todo';\r\n  }, []);\r\n\r\n  /*\r\n   * 1.9.40 · AGRUPAR POR ESTADO (config.groupBy = 'status').\r\n   *\r\n   * Cada tarea RAÍZ cae en To do · In progress · Completed según su estado, y\r\n   * sus subtareas viajan con ella (dentro del grupo del padre, cada una con su\r\n   * propio chip). Dentro del grupo, por fin ascendente; sin fecha, al final.\r\n   * `displayTasks` sigue siendo SOLO tareas (lo usan el relleno por arrastre y\r\n   * el teclado): las cabeceras se pintan antes del índice donde empieza su grupo.\r\n   */\r\n  const agrupar = config.groupBy === 'status';\r\n  const claveGrupos = config.groupStateKey ? `listview-grupos-plegados:${config.groupStateKey}` : null;\r\n  const [gruposPlegados, setGruposPlegados] = useState<Set<string>>(() => {\r\n    const porDefecto = new Set(config.defaultCollapsedGroups ?? ['completed']);\r\n    if (!claveGrupos) return porDefecto;\r\n    try { const g = localStorage.getItem(claveGrupos); return g ? new Set(JSON.parse(g) as string[]) : porDefecto; } catch { return porDefecto; }\r\n  });\r\n  const alternarGrupo = useCallback((clave: string) => {\r\n    setGruposPlegados(prev => {\r\n      const n = new Set(prev);\r\n      if (n.has(clave)) n.delete(clave); else n.add(clave);\r\n      if (claveGrupos) { try { localStorage.setItem(claveGrupos, JSON.stringify([...n])); } catch { /* sin almacenamiento */ } }\r\n      return n;\r\n    });\r\n  }, [claveGrupos]);\r\n\r\n  /*\r\n   * 1.9.41 · SELECCIÓN MÚLTIPLE (config.selectable). Una casilla por fila,\r\n   * visible al pasar el ratón o si ya hay alguna marcada; Shift+clic marca el\r\n   * RANGO en el orden que se ve. Controlada si la app pasa `selectedIds`; la app\r\n   * decide qué hacer con ella (callbacks.onSelectionChange).\r\n   */\r\n  const seleccionable = !!config.selectable;\r\n  const [seleccionInterna, setSeleccionInterna] = useState<Set<string>>(new Set());\r\n  const seleccion = useMemo(\r\n    () => (config.selectedIds ? new Set(config.selectedIds) : seleccionInterna),\r\n    [config.selectedIds, seleccionInterna],\r\n  );\r\n  const ultimaMarcadaRef = useRef<string | null>(null);\r\n\r\n  // Filter and sort tasks\r\n  const { lista: displayTasks, cabeceras: cabecerasDeGrupo, todas: tareasSinPlegar } = useMemo(() => {\r\n    let flatTasks = flattenTasksWithLevel(tasks);\r\n\r\n    // Filter by search\r\n    if (searchQuery.trim()) {\r\n      const query = searchQuery.toLowerCase();\r\n      flatTasks = flatTasks.filter(task =>\r\n        task.name.toLowerCase().includes(query)\r\n      );\r\n    }\r\n\r\n    // Filter by status — preserve ancestors so hierarchy stays intact.\r\n    // Without this, filtering \"completed\" can hide an intermediate parent\r\n    // while keeping its matching descendants, which the renderer then\r\n    // visually nests under the previous sibling phase (the \"fase 4 dentro\r\n    // de fase 3\" bug).\r\n    /* 1.9.39 · con el botón oculto, lo guardado no filtra: no habría cómo quitarlo. */\r\n    const filtroDeEstadoVisible = config.showStatusFilter !== false;\r\n    if (filtroDeEstadoVisible && statusFilter !== 'all') {\r\n      const matchingIds = new Set(\r\n        flatTasks\r\n          .filter(task => getTaskStatus(task) === statusFilter)\r\n          .flatMap(task => task.parentPath)\r\n      );\r\n      flatTasks = flatTasks.filter(task => matchingIds.has(task.id));\r\n    }\r\n\r\n    // Hide completed tasks — same ancestor-preserving logic\r\n    if (filtroDeEstadoVisible && hideCompleted) {\r\n      const matchingIds = new Set(\r\n        flatTasks\r\n          .filter(task => getTaskStatus(task) !== 'completed')\r\n          .flatMap(task => task.parentPath)\r\n      );\r\n      flatTasks = flatTasks.filter(task => matchingIds.has(task.id));\r\n    }\r\n\r\n    /*\r\n     * 1.9.44 · AGRUPAR POR PERSONA O POR FECHA (Yesid, 2-oct).\r\n     *\r\n     * Aquí no hay jerarquía: cada tarea, padre o hija, va al grupo de su\r\n     * responsable o de su fecha, y la hija lleva delante «Padre ›» en gris.\r\n     * Con varios responsables sale en el grupo de cada uno, pero cuenta UNA vez\r\n     * en el total. La fecha la clasifica la app (config.dueBucket), con su\r\n     * regla de vencida, la del Overview.\r\n     */\r\n    if (config.groupBy === 'assignee' || config.groupBy === 'due') {\r\n      const porPersona = config.groupBy === 'assignee';\r\n      const todas: FlattenedTask[] = [];\r\n      const recorrer = (lista: Task[], nivel: number, camino: string[], padre?: string) => {\r\n        for (const t of lista) {\r\n          const ruta = [...camino, t.id];\r\n          todas.push({ ...t, level: nivel, hasChildren: (t.subtasks?.length || 0) > 0, parentPath: ruta, ...(padre ? { __padre: padre } : {}) } as FlattenedTask);\r\n          if (t.subtasks?.length) recorrer(t.subtasks, nivel + 1, ruta, t.name);\r\n        }\r\n      };\r\n      recorrer(tasks, 0, []);\r\n      const q = searchQuery.trim().toLowerCase();\r\n      const visibles = q ? todas.filter(t => t.name.toLowerCase().includes(q)) : todas;\r\n      const es = locale === 'es';\r\n      const FECHA: Array<[string, string, string]> = [\r\n        ['overdue', 'Vencidas', 'Overdue'], ['today', 'Hoy', 'Today'], ['week', 'Esta semana', 'This week'],\r\n        ['later', 'Más adelante', 'Later'],\r\n        /* Terminadas con fecha pasada: no están vencidas (la regla las excluye) y no son «más adelante». */\r\n        ['past', 'Anteriores', 'Earlier'],\r\n        ['none', 'Sin fecha', 'No date'],\r\n      ];\r\n      const grupos = new Map<string, { titulo: string; filas: FlattenedTask[] }>();\r\n      for (const t of visibles) {\r\n        const claves = porPersona\r\n          ? (() => { const n = (t.assignees ?? []).map(a => a.name).filter(Boolean); return n.length ? n : ['__sin']; })()\r\n          : [config.dueBucket?.(t) ?? 'none'];\r\n        for (const c of claves) {\r\n          const clave = porPersona ? `user:${c}` : `due:${c}`;\r\n          const titulo = porPersona\r\n            ? (c === '__sin' ? (es ? 'Sin responsable' : 'Unassigned') : c)\r\n            : (FECHA.find(f => f[0] === c)?.[es ? 1 : 2] ?? c);\r\n          if (!grupos.has(clave)) grupos.set(clave, { titulo, filas: [] });\r\n          grupos.get(clave)!.filas.push({ ...t, level: 0, hasChildren: false, __claveFila: `${clave}|${t.id}` } as FlattenedTask);\r\n        }\r\n      }\r\n      const orden = porPersona\r\n        ? [...grupos.keys()].sort((a, b) => (a === 'user:__sin' ? 1 : b === 'user:__sin' ? -1 : grupos.get(a)!.titulo.localeCompare(grupos.get(b)!.titulo)))\r\n        : FECHA.map(f => `due:${f[0]}`).filter(k => grupos.has(k));\r\n      const fin = (t: FlattenedTask) => t.endDate ? new Date(t.endDate).getTime() : Infinity;\r\n      const lista: FlattenedTask[] = [];\r\n      const cabeceras = new Map<number, Array<{ clave: string; cuenta: number; plegado: boolean; titulo?: string }>>();\r\n      for (const clave of orden) {\r\n        const g = grupos.get(clave)!;\r\n        const plegado = gruposPlegados.has(clave);\r\n        cabeceras.set(lista.length, [...(cabeceras.get(lista.length) ?? []), { clave, cuenta: g.filas.length, plegado, titulo: g.titulo }]);\r\n        if (!plegado) lista.push(...g.filas.sort((a, b) => fin(a) - fin(b)));\r\n      }\r\n      return { lista, cabeceras, todas: visibles };\r\n    }\r\n\r\n    if (agrupar) {\r\n      const ORDEN = ['todo', 'in-progress', 'completed'] as const;\r\n      const bloques = new Map<string, FlattenedTask[]>();\r\n      const raices: FlattenedTask[] = [];\r\n      for (const t of flatTasks) {\r\n        const raiz = t.parentPath[0] ?? t.id;\r\n        if (t.level === 0) raices.push(t);\r\n        if (!bloques.has(raiz)) bloques.set(raiz, []);\r\n        bloques.get(raiz)!.push(t);\r\n      }\r\n      const fin = (t: FlattenedTask) => t.endDate ? new Date(t.endDate).getTime() : Infinity;\r\n      const lista: FlattenedTask[] = [];\r\n      const cabeceras = new Map<number, Array<{ clave: string; cuenta: number; plegado: boolean; titulo?: string }>>();\r\n      for (const clave of ORDEN) {\r\n        const delGrupo = raices.filter(r => getTaskStatus(r) === clave).sort((a, b) => fin(a) - fin(b));\r\n        const filas = delGrupo.flatMap(r => bloques.get(r.id) ?? [r]);\r\n        const cuenta = filas.filter(f => !f.hasChildren).length;\r\n        if (cuenta === 0 && delGrupo.length === 0) continue;\r\n        const plegado = gruposPlegados.has(clave);\r\n        const en = lista.length;\r\n        cabeceras.set(en, [...(cabeceras.get(en) ?? []), { clave, cuenta, plegado }]);\r\n        if (!plegado) lista.push(...filas);\r\n      }\r\n      return { lista, cabeceras, todas: flatTasks };\r\n    }\r\n\r\n    // Sort\r\n    flatTasks.sort((a, b) => {\r\n      let aVal: string | number, bVal: string | number;\r\n\r\n      switch (sortField) {\r\n        case 'name':\r\n          aVal = a.name.toLowerCase();\r\n          bVal = b.name.toLowerCase();\r\n          break;\r\n        case 'startDate':\r\n          aVal = a.startDate?.getTime() || 0;\r\n          bVal = b.startDate?.getTime() || 0;\r\n          break;\r\n        case 'endDate':\r\n          aVal = a.endDate?.getTime() || 0;\r\n          bVal = b.endDate?.getTime() || 0;\r\n          break;\r\n        case 'progress':\r\n          aVal = a.progress || 0;\r\n          bVal = b.progress || 0;\r\n          break;\r\n        case 'status':\r\n          aVal = a.status || 'todo';\r\n          bVal = b.status || 'todo';\r\n          break;\r\n        case 'priority':\r\n          const priorityOrder = { urgent: 0, high: 1, medium: 2, low: 3, none: 4 };\r\n          aVal = priorityOrder[a.priority as keyof typeof priorityOrder] ?? 4;\r\n          bVal = priorityOrder[b.priority as keyof typeof priorityOrder] ?? 4;\r\n          break;\r\n        case 'position':\r\n          // Position order is already correct from flattenTasksWithLevel (hierarchy preserved).\r\n          // Sorting the flat array by position would mix parent/child levels — skip sort.\r\n          return 0;\r\n        default:\r\n          return 0;\r\n      }\r\n\r\n      if (aVal < bVal) return sortOrder === 'asc' ? -1 : 1;\r\n      if (aVal > bVal) return sortOrder === 'asc' ? 1 : -1;\r\n      return 0;\r\n    });\r\n\r\n    return { lista: flatTasks, cabeceras: new Map<number, Array<{ clave: string; cuenta: number; plegado: boolean; titulo?: string }>>(), todas: flatTasks };\r\n  }, [tasks, searchQuery, statusFilter, hideCompleted, sortField, sortOrder, getTaskStatus, config.showStatusFilter, agrupar, gruposPlegados, config.groupBy, config.dueBucket, locale]);\r\n\r\n  // Keep the latest display order accessible inside the drag-fill mouse handlers.\r\n  displayTasksRef.current = displayTasks;\r\n\r\n  const alternarSeleccion = (id: string, conShift: boolean) => {\r\n    const siguiente = new Set(seleccion);\r\n    const ancla = ultimaMarcadaRef.current;\r\n    const orden = displayTasksRef.current.map(t => t.id);\r\n    if (conShift && ancla && ancla !== id && orden.includes(ancla) && orden.includes(id)) {\r\n      const i1 = orden.indexOf(ancla), i2 = orden.indexOf(id);\r\n      const desde = Math.min(i1, i2), hasta = Math.max(i1, i2);\r\n      const marcar = !seleccion.has(id);\r\n      for (const tid of orden.slice(desde, hasta + 1)) { if (marcar) siguiente.add(tid); else siguiente.delete(tid); }\r\n    } else if (siguiente.has(id)) {\r\n      siguiente.delete(id);\r\n    } else {\r\n      siguiente.add(id);\r\n    }\r\n    ultimaMarcadaRef.current = id;\r\n    if (!config.selectedIds) setSeleccionInterna(siguiente);\r\n    callbacks.onSelectionChange?.([...siguiente]);\r\n  };\r\n  const haySeleccion = seleccion.size > 0;\r\n  const casillaDeFila = (id: string) => (\r\n    <div className=\"w-6 flex-shrink-0 flex items-center justify-center\" onClick={(e) => e.stopPropagation()}>\r\n      <input\r\n        type=\"checkbox\"\r\n        data-casilla-fila={id}\r\n        aria-label={locale === 'es' ? 'Seleccionar tarea' : 'Select task'}\r\n        checked={seleccion.has(id)}\r\n        onChange={() => { /* lo decide onClick, que sabe si va con Shift */ }}\r\n        onClick={(e) => { e.stopPropagation(); alternarSeleccion(id, e.shiftKey); }}\r\n        className={cn('w-3.5 h-3.5 cursor-pointer transition-opacity',\r\n          haySeleccion ? 'opacity-100' : 'opacity-0 group-hover:opacity-100 focus:opacity-100')}\r\n      />\r\n    </div>\r\n  );\r\n\r\n  /* 1.9.40 · la cabecera de cada grupo, delante de la fila donde empieza. */\r\n  const TITULO_GRUPO: Record<string, { es: string; en: string }> = {\r\n    'todo': { es: 'Por hacer', en: 'To do' },\r\n    'in-progress': { es: 'En curso', en: 'In progress' },\r\n    'completed': { es: 'Completadas', en: 'Completed' },\r\n  };\r\n  const conCabecerasDeGrupo = (index: number, fila: React.ReactNode) => {\r\n    const cabs = cabecerasDeGrupo.get(index);\r\n    if (!cabs?.length) return fila;\r\n    const nodos = cabs.map(c => (\r\n      <div\r\n        key={`grupo-${c.clave}`}\r\n        data-grupo-de-estado={c.clave}\r\n        data-plegado={c.plegado ? 'true' : 'false'}\r\n        className={cn('flex items-center gap-2 px-4 h-9 border-b select-none',\r\n          isDark ? 'border-[#222] bg-[#111]' : 'border-gray-200 bg-white')}\r\n      >\r\n        <button\r\n          type=\"button\"\r\n          onClick={() => alternarGrupo(c.clave)}\r\n          aria-expanded={!c.plegado}\r\n          className={cn('inline-flex items-center gap-1.5 text-[12px] font-semibold rounded px-1 -ml-1',\r\n            isDark ? 'text-white/80 hover:bg-white/[0.05]' : 'text-gray-700 hover:bg-gray-100')}\r\n        >\r\n          {c.plegado ? <ChevronRight className=\"w-3.5 h-3.5\" /> : <ChevronDown className=\"w-3.5 h-3.5\" />}\r\n          {c.titulo ?? TITULO_GRUPO[c.clave]?.[locale === 'es' ? 'es' : 'en'] ?? c.clave}\r\n          <span className={cn('font-normal tabular-nums', isDark ? 'text-white/40' : 'text-gray-400')}>{c.cuenta}</span>\r\n        </button>\r\n      </div>\r\n    ));\r\n    return fila ? [...nodos, fila] : nodos;\r\n  };\r\n\r\n  // Render cell based on column type\r\n  const renderCell = useCallback((task: Task, column: TableColumn) => {\r\n    const handleUpdate = (updates: Partial<Task>) => {\r\n      callbacks.onTaskUpdate?.({ ...task, ...updates });\r\n    };\r\n\r\n\r\n    // Helper to get custom field value\r\n    const getCustomFieldValue = <T,>(fieldId: string | undefined): T | undefined => {\r\n      if (!fieldId) return undefined;\r\n      const taskWithFields = task as Task & { customFields?: CustomFieldValue[] };\r\n      return taskWithFields.customFields?.find((cf: CustomFieldValue) => cf.fieldId === fieldId)?.value as T | undefined;\r\n    };\r\n\r\n    // Helper to update custom field value\r\n    const updateCustomField = (fieldId: string | undefined, value: any) => {\r\n      if (!fieldId) return;\r\n      const taskWithFields = task as Task & { customFields?: CustomFieldValue[] };\r\n      const customFields: CustomFieldValue[] = [...(taskWithFields.customFields || [])];\r\n      const idx = customFields.findIndex((cf: CustomFieldValue) => cf.fieldId === fieldId);\r\n      if (idx >= 0) {\r\n        customFields[idx] = { fieldId, value };\r\n      } else {\r\n        customFields.push({ fieldId, value });\r\n      }\r\n      handleUpdate({ customFields } as any);\r\n    };\r\n\r\n    switch (column.type) {\r\n      case 'name':\r\n        return null; // Handled separately with expand/collapse logic\r\n\r\n      case 'status':\r\n        return (\r\n          <StatusCell\r\n            value={task.status || (task.progress === 100 ? 'completed' : task.progress && task.progress > 0 ? 'in-progress' : 'todo')}\r\n            onChange={(status) => {\r\n              const progress = status === 'completed' ? 100 : status === 'in-progress' ? 50 : 0;\r\n              handleUpdate({ status, progress });\r\n            }}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            translations={t.status}\r\n          />\r\n        );\r\n\r\n      case 'priority':\r\n        return (\r\n          <PriorityCell\r\n            value={task.priority}\r\n            onChange={(priority) => handleUpdate({ priority: priority as any })}\r\n            isDark={isDark}\r\n            locale={locale}\r\n          />\r\n        );\r\n\r\n      case 'assignees': {\r\n        const isParent = (task as any).hasChildren;\r\n        // Parent tasks are pure containers — assignees are derived LIVE from children only.\r\n        // Any legacy/stale task.assignees stored on the parent row is ignored to prevent\r\n        // \"ghost\" avatars persisting after children are unassigned.\r\n        let assigneesValue = task.assignees || [];\r\n        if (isParent && task.subtasks?.length) {\r\n          const uniqueMap = new Map<string, typeof assigneesValue[0]>();\r\n          const collectAssignees = (subs: typeof task.subtasks) => {\r\n            (subs || []).forEach(sub => {\r\n              (sub.assignees || []).forEach(a => {\r\n                if (!uniqueMap.has(a.name)) uniqueMap.set(a.name, a);\r\n              });\r\n              if (sub.subtasks?.length) collectAssignees(sub.subtasks);\r\n            });\r\n          };\r\n          collectAssignees(task.subtasks);\r\n          assigneesValue = Array.from(uniqueMap.values());\r\n        } else if (isParent) {\r\n          assigneesValue = [];\r\n        }\r\n        return (\r\n          <AssigneesCell\r\n            value={assigneesValue}\r\n            availableUsers={availableUsers}\r\n            onChange={(assignees) => handleUpdate({ assignees })}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            disabled={isParent}\r\n          />\r\n        );\r\n      }\r\n\r\n      case 'startDate':\r\n        return (\r\n          <DateCell\r\n            value={task.startDate}\r\n            onChange={(startDate) => handleUpdate({ startDate })}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            dateField=\"start\"\r\n            startDate={task.startDate}\r\n            endDate={task.endDate}\r\n          />\r\n        );\r\n\r\n      case 'endDate': {\r\n        const celda = (\r\n          <DateCell\r\n            value={task.endDate}\r\n            onChange={(endDate) => handleUpdate({ endDate })}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            dateField=\"end\"\r\n            startDate={task.startDate}\r\n            endDate={task.endDate}\r\n          />\r\n        );\r\n        /* 1.9.38 · vencida: rojo con icono, con la regla que pasa la app. */\r\n        if (!config.isTaskOverdue?.(task)) return celda;\r\n        return (\r\n          <span data-vencida=\"true\" className=\"inline-flex items-center gap-1\" style={{ color: isDark ? '#FF7A7F' : '#C22F35' }}>\r\n            <AlertCircle className=\"w-3.5 h-3.5 flex-shrink-0\" aria-hidden />\r\n            {celda}\r\n          </span>\r\n        );\r\n      }\r\n\r\n      case 'progress': {\r\n        const isParent = !!(task.subtasks && task.subtasks.length > 0);\r\n        const displayProgress = isParent\r\n          ? computeWeightedProgress(collectLeaves(task.subtasks || []))\r\n          : (task.progress || 0);\r\n        return (\r\n          <ProgressCell\r\n            value={displayProgress}\r\n            onChange={isParent ? undefined : (progress) => {\r\n              const status = progress === 100 ? 'completed' : progress > 0 ? 'in-progress' : 'todo';\r\n              handleUpdate({ progress, status });\r\n            }}\r\n            isDark={isDark}\r\n            disabled={isParent}\r\n          />\r\n        );\r\n      }\r\n\r\n      case 'tags':\r\n        return (\r\n          <TagsCell\r\n            value={task.tags || []}\r\n            isDark={isDark}\r\n          />\r\n        );\r\n\r\n      case 'text':\r\n        return (\r\n          <TextCell\r\n            value={getCustomFieldValue<string>(column.customFieldId) || ''}\r\n            onChange={(value) => updateCustomField(column.customFieldId, value)}\r\n            isDark={isDark}\r\n          />\r\n        );\r\n\r\n      case 'number':\r\n        return (\r\n          <NumberCell\r\n            value={getCustomFieldValue<number>(column.customFieldId) || 0}\r\n            onChange={(value) => updateCustomField(column.customFieldId, value)}\r\n            isDark={isDark}\r\n          />\r\n        );\r\n\r\n      case 'date':\r\n        const dateVal = getCustomFieldValue<Date | string>(column.customFieldId);\r\n        return (\r\n          <DateCell\r\n            value={dateVal ? new Date(dateVal) : undefined}\r\n            onChange={(date) => updateCustomField(column.customFieldId, date)}\r\n            isDark={isDark}\r\n            locale={locale}\r\n          />\r\n        );\r\n\r\n      case 'dropdown':\r\n        return (\r\n          <DropdownCell\r\n            value={getCustomFieldValue<string>(column.customFieldId) || ''}\r\n            options={column.options || []}\r\n            onChange={(value) => updateCustomField(column.customFieldId, value)}\r\n            isDark={isDark}\r\n          />\r\n        );\r\n\r\n      case 'checkbox':\r\n        return (\r\n          <CheckboxCell\r\n            value={getCustomFieldValue<boolean>(column.customFieldId) || false}\r\n            onChange={(checked) => updateCustomField(column.customFieldId, checked)}\r\n            isDark={isDark}\r\n          />\r\n        );\r\n\r\n      // v1.9.24 ── the three custom field types that had no cell ────────────\r\n\r\n      case 'multiselect':\r\n        return (\r\n          <MultiSelectCell\r\n            value={getCustomFieldValue<string[]>(column.customFieldId) || []}\r\n            options={column.options || []}\r\n            onChange={(values) => updateCustomField(column.customFieldId, values)}\r\n            isDark={isDark}\r\n            maxSelectable={column.maxSelectable}\r\n          />\r\n        );\r\n\r\n      /*\r\n       * `person` REUSES AssigneesCell rather than adding a near-identical\r\n       * component: it already resolves the member picker, the avatars and the\r\n       * initials. A second implementation would drift from this one within a\r\n       * release or two.\r\n       *\r\n       * The value is stored as a list of names, which is what AssigneesCell\r\n       * hands back, so what the field holds is what the cell shows.\r\n       */\r\n      case 'person': {\r\n        const stored = getCustomFieldValue<Array<{ name: string; initials?: string; color?: string; avatar?: string }>>(\r\n          column.customFieldId,\r\n        ) || [];\r\n        return (\r\n          <AssigneesCell\r\n            value={stored.map(p => ({\r\n              name: p.name,\r\n              avatar: p.avatar,\r\n              initials: p.initials || (p.name || '?').slice(0, 2).toUpperCase(),\r\n              color: p.color || '#00E5CC',\r\n            }))}\r\n            availableUsers={availableUsers}\r\n            onChange={(people) => updateCustomField(column.customFieldId, people)}\r\n            isDark={isDark}\r\n            locale={locale}\r\n          />\r\n        );\r\n      }\r\n\r\n      case 'file':\r\n        return (\r\n          <FileCell\r\n            value={getCustomFieldValue<any>(column.customFieldId)}\r\n            isDark={isDark}\r\n            onOpen={(f) => {\r\n              /*\r\n               * Opening is the host's call. With no URL there is nothing to\r\n               * open, and a dead click is better than a blank tab.\r\n               */\r\n              if (f.url) window.open(f.url, '_blank', 'noopener,noreferrer');\r\n            }}\r\n          />\r\n        );\r\n\r\n      // v0.18.3: Time tracking columns\r\n      case 'estimatedTime': {\r\n        const isCompleted = task.status === 'completed' || task.progress === 100;\r\n        return (\r\n          <TimeCell\r\n            value={(task as any).estimatedTime}\r\n            onChange={(minutes) => handleUpdate({ estimatedTime: minutes } as any)}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            disabled={isCompleted}\r\n            lens={lens}\r\n            hourlyRate={getTaskRate(task)}\r\n          />\r\n        );\r\n      }\r\n\r\n      // v1.1.0: Quoted time column\r\n      case 'quotedTime': {\r\n        const isCompleted = task.status === 'completed' || task.progress === 100;\r\n        // v1.4.9: Governance v2.0 - Check if this column should be blurred\r\n        const shouldBlurQuoted = financialBlur?.enabled && (\r\n          !financialBlur.columns || financialBlur.columns.includes('quotedTime')\r\n        );\r\n        return (\r\n          <TimeCell\r\n            value={(task as any).quotedTime}\r\n            onChange={(minutes) => handleUpdate({ quotedTime: minutes } as any)}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            disabled={isCompleted}\r\n            isBlurred={shouldBlurQuoted}\r\n            lens={lens}\r\n            hourlyRate={getTaskRate(task)}\r\n          />\r\n        );\r\n      }\r\n\r\n      case 'elapsedTime': {\r\n        const isCompleted = task.status === 'completed' || task.progress === 100;\r\n        // v2.5.3: Same canonical override as timeLoggedMinutes — this is the legacy\r\n        // Ejecutado column exposed via the column selector; it must track real costs\r\n        // (time_logs × rate_at_time) not current rates.\r\n        const canonicalDollars = (task as any).executedDollarsCanonical as number | undefined;\r\n        return (\r\n          <TimeCell\r\n            value={(task as any).elapsedTime}\r\n            onChange={(minutes) => handleUpdate({ elapsedTime: minutes } as any)}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            disabled={isCompleted}\r\n            lens={lens}\r\n            hourlyRate={getTaskRate(task)}\r\n            financialOverride={canonicalDollars}\r\n          />\r\n        );\r\n      }\r\n\r\n      // v1.2.0: New time tracking columns\r\n      case 'effortMinutes': {\r\n        if (aggregateParentHours && task.subtasks && task.subtasks.length > 0) {\r\n          const { allocated } = calculateGroupHours(task);\r\n          // Financial lens for parent: sum $ from children directly\r\n          if (lens === 'financial') {\r\n            const groupDollars = calculateGroupDollars(task);\r\n            const estDollars = Math.round(groupDollars.dollarAllocated);\r\n            const offDollars = Math.round(groupDollars.dollarQuoted);\r\n            const margin = offDollars - estDollars;\r\n            return (\r\n              <div className=\"flex flex-col\">\r\n                {estDollars > 0 ? (\r\n                  <span className={cn('text-sm font-mono', isDark ? 'text-white/60' : 'text-gray-500')}>\r\n                    ${estDollars.toLocaleString('es-CO')}\r\n                  </span>\r\n                ) : null}\r\n                {margin !== 0 && estDollars > 0 && offDollars > 0 && (\r\n                  <span className={cn('text-[9px] font-mono font-bold px-1.5 py-0.5 rounded whitespace-nowrap mt-0.5',\r\n                    margin > 0 ? 'bg-[#064e3b] text-[#10b981] border border-[#065f46]/30' : 'bg-[#451a03] text-[#f59e0b] border border-[#78350f]/30'\r\n                  )}>\r\n                    {margin > 0 ? '+' : ''}{Math.abs(margin) >= 1000 ? `$${(margin/1000).toFixed(1)}K` : `$${margin}`}\r\n                  </span>\r\n                )}\r\n              </div>\r\n            );\r\n          }\r\n          return <TimeCell value={allocated > 0 ? allocated : undefined} isDark={isDark} locale={locale} disabled lens={lens} hourlyRate={hourlyRate} />;\r\n        }\r\n        const isCompleted = task.status === 'completed' || task.progress === 100;\r\n        const estMins = (task as any).effortMinutes || 0;\r\n        const soldMins = (task as any).soldEffortMinutes || 0;\r\n        // Financial lens: show margin badge next to estimated value\r\n        const _taskRate = getTaskRate(task);\r\n        if (lens === 'financial' && _taskRate && estMins > 0 && soldMins > 0) {\r\n          const estDollars = Math.round((estMins / 60) * _taskRate);\r\n          const offDollars = Math.round((soldMins / 60) * _taskRate);\r\n          const margin = offDollars - estDollars;\r\n          return (\r\n            <div className=\"flex flex-col\">\r\n              <TimeCell\r\n                value={estMins}\r\n                onChange={(minutes) => handleUpdate({ effortMinutes: minutes } as any)}\r\n                isDark={isDark}\r\n                locale={locale}\r\n                disabled={isCompleted}\r\n                lens={lens}\r\n                hourlyRate={getTaskRate(task)}\r\n              />\r\n              {margin !== 0 && (\r\n                <span className={cn('text-[9px] font-mono font-bold px-1.5 py-0.5 rounded whitespace-nowrap mt-0.5',\r\n                  margin >= 0 ? 'bg-[#064e3b] text-[#10b981] border border-[#065f46]/30' : 'bg-[#451a03] text-[#f59e0b] border border-[#78350f]/30'\r\n                )}>\r\n                  {margin > 0 ? '+' : ''}{Math.abs(margin) >= 1000 ? `$${(margin/1000).toFixed(1)}K` : `$${margin}`}\r\n                </span>\r\n              )}\r\n            </div>\r\n          );\r\n        }\r\n        return (\r\n          <TimeCell\r\n            value={estMins}\r\n            onChange={(minutes) => handleUpdate({ effortMinutes: minutes } as any)}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            disabled={isCompleted}\r\n            lens={lens}\r\n            hourlyRate={getTaskRate(task)}\r\n          />\r\n        );\r\n      }\r\n\r\n      case 'timeLoggedMinutes': {\r\n        // v2.5.3: Prefer per-task canonical dollars (time_logs × rate_at_time) when\r\n        // the consumer has attached it to the task row. Keeps every row consistent\r\n        // with the Total Proyecto footer and the financial health sidebar.\r\n        const canonicalDollars = (task as any).executedDollarsCanonical as number | undefined;\r\n        if (aggregateParentHours && task.subtasks && task.subtasks.length > 0) {\r\n          const { spent } = calculateGroupHours(task);\r\n          return (\r\n            <TimeCell\r\n              value={spent > 0 ? spent : undefined}\r\n              isDark={isDark}\r\n              locale={locale}\r\n              disabled\r\n              lens={lens}\r\n              hourlyRate={getTaskRate(task)}\r\n              financialOverride={canonicalDollars}\r\n            />\r\n          );\r\n        }\r\n        const isCompleted = task.status === 'completed' || task.progress === 100;\r\n        return (\r\n          <TimeCell\r\n            value={(task as any).timeLoggedMinutes}\r\n            onChange={callbacks.onLogTime ? (minutes) => {\r\n              // Inline time logging - pass minutes directly to callback\r\n              callbacks.onLogTime?.(task, minutes);\r\n            } : undefined}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            placeholder={locale === 'es' ? 'Agregar' : 'Add'}\r\n            disabled={isCompleted}\r\n            lens={lens}\r\n            hourlyRate={getTaskRate(task)}\r\n            financialOverride={canonicalDollars}\r\n          />\r\n        );\r\n      }\r\n\r\n      case 'soldEffortMinutes': {\r\n        if (aggregateParentHours && task.subtasks && task.subtasks.length > 0) {\r\n          const { quoted } = calculateGroupHours(task);\r\n          const shouldBlurSold = financialBlur?.enabled && (!financialBlur.columns || financialBlur.columns.includes('soldEffortMinutes'));\r\n          return <TimeCell value={quoted > 0 ? quoted : undefined} isDark={isDark} locale={locale} disabled isBlurred={shouldBlurSold} lens={lens} hourlyRate={getTaskRate(task)} />;\r\n        }\r\n        const isCompleted = task.status === 'completed' || task.progress === 100;\r\n        // v1.4.9: Governance v2.0 - Check if this column should be blurred\r\n        const shouldBlurSold = financialBlur?.enabled && (\r\n          !financialBlur.columns || financialBlur.columns.includes('soldEffortMinutes')\r\n        );\r\n        return (\r\n          <TimeCell\r\n            value={(task as any).soldEffortMinutes}\r\n            onChange={(minutes) => handleUpdate({ soldEffortMinutes: minutes } as any)}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            disabled={isCompleted}\r\n            isBlurred={shouldBlurSold}\r\n            lens={lens}\r\n            hourlyRate={getTaskRate(task)}\r\n          />\r\n        );\r\n      }\r\n\r\n      // v2.0.0: Chronos Interactive Time Manager columns\r\n      case 'scheduleVariance': {\r\n        const effortMins = (task as any).effortMinutes || 0;\r\n        const soldMins = (task as any).soldEffortMinutes || 0;\r\n        const loggedMins = (task as any).timeLoggedMinutes || 0;\r\n        const hasTime = effortMins > 0 || soldMins > 0 || loggedMins > 0;\r\n        return (\r\n          <ScheduleVarianceCell\r\n            startDate={task.startDate}\r\n            endDate={task.endDate}\r\n            scheduleVariance={task.scheduleVariance}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            hasTimeAllocated={hasTime}\r\n          />\r\n        );\r\n      }\r\n\r\n      case 'hoursBar': {\r\n        // If aggregateParentHours enabled and task has children, show sum of descendants\r\n        if (aggregateParentHours && (task as any).hasChildren) {\r\n          const { spent, allocated, quoted } = calculateGroupHours(task);\r\n          const isOver = spent > allocated && allocated > 0;\r\n          return (\r\n            <span className={cn('text-[11px] font-mono flex items-center gap-1.5', isDark ? 'text-white/50' : 'text-gray-500')}>\r\n              <span className={cn('font-bold', isOver ? 'text-[#FF453A]' : isDark ? 'text-white/80' : 'text-gray-800')}>\r\n                {formatGroupHours(spent)}\r\n              </span>\r\n              {allocated > 0 && (\r\n                <>\r\n                  {' / '}\r\n                  <span className={isDark ? 'text-white/60' : 'text-gray-600'}>\r\n                    {formatGroupHours(allocated)}\r\n                  </span>\r\n                </>\r\n              )}\r\n              {quoted > 0 && (\r\n                <>\r\n                  {' / '}\r\n                  <span className={isDark ? 'text-amber-400/70' : 'text-amber-600'}>\r\n                    {formatGroupHours(quoted)}\r\n                  </span>\r\n                </>\r\n              )}\r\n            </span>\r\n          );\r\n        }\r\n        return (\r\n          <HoursBarCell\r\n            task={task}\r\n            isDark={isDark}\r\n            locale={locale}\r\n            onLogTime={callbacks.onLogTime}\r\n            onEstimateUpdate={callbacks.onEstimateUpdate}\r\n            onSoldEffortUpdate={callbacks.onSoldEffortUpdate}\r\n            showSoldEffort={config.showSoldEffort}\r\n            onOpenTimeLog={callbacks.onOpenTimeLog}\r\n            lens={lens}\r\n            hourlyRate={getTaskRate(task)}\r\n          />\r\n        );\r\n      }\r\n\r\n      case 'teamLoad': {\r\n        const isParent = (task as any).hasChildren || (task.subtasks && task.subtasks.length > 0);\r\n        // Parent tasks: read-only rollup of assignees from children\r\n        if (isParent) {\r\n          return (\r\n            <TeamLoadCell\r\n              task={task}\r\n              isDark={isDark}\r\n              locale={locale}\r\n            />\r\n          );\r\n        }\r\n        // Leaf tasks: editable assignee picker (same as old 'assignees' column)\r\n        return (\r\n          <AssigneesCell\r\n            value={task.assignees || []}\r\n            availableUsers={availableUsers}\r\n            onChange={(assignees) => {\r\n              callbacks.onTaskUpdate?.({ ...task, assignees });\r\n            }}\r\n            isDark={isDark}\r\n            locale={locale}\r\n          />\r\n        );\r\n      }\r\n\r\n      case 'blockers':\r\n        return (\r\n          <BlockersCell\r\n            blockers={task.blockers}\r\n            isDark={isDark}\r\n            locale={locale}\r\n          />\r\n        );\r\n\r\n      case 'weight': {\r\n        // Parent tasks: show sum of children weights (read-only, not editable)\r\n        const parentSum = parentWeightSums.get(task.id);\r\n        if (parentSum !== undefined) {\r\n          return (\r\n            <span className={cn(\"text-xs font-mono\", parentSum > 0 ? (isDark ? \"text-white/50\" : \"text-gray-400\") : (isDark ? \"text-white/30\" : \"text-gray-300\"))}\r\n              style={{ fontFamily: 'JetBrains Mono, monospace' }}>\r\n              {parentSum > 0 ? `${Number(parentSum.toFixed(2))}%` : '—'}\r\n            </span>\r\n          );\r\n        }\r\n        // Leaf tasks: inline editable\r\n        const weightVal = (task as any).weight || 0;\r\n        return (\r\n          <WeightCellInline\r\n            value={weightVal}\r\n            onChange={(v) => handleUpdate({ weight: v } as any)}\r\n            isDark={isDark}\r\n          />\r\n        );\r\n      }\r\n\r\n      default:\r\n        return <span className={cn(\"text-sm\", isDark ? \"text-white/60\" : \"text-gray-500\")}>-</span>;\r\n    }\r\n  }, [callbacks, isDark, locale, availableUsers, t, aggregateParentHours, parentWeightSums]);\r\n\r\n  // Get column label with translations\r\n  const getColumnLabel = useCallback((column: TableColumn): string => {\r\n    const labelMap: Record<string, string> = {\r\n      name: t.columns.name,\r\n      status: t.columns.status,\r\n      priority: t.columns.priority,\r\n      assignees: t.columns.assignees,\r\n      startDate: t.columns.startDate,\r\n      endDate: t.columns.endDate,\r\n      progress: t.columns.progress,\r\n      tags: (t.columns as any).tags || (locale === 'es' ? 'Etiquetas' : 'Tags'),\r\n      // v0.18.3: Time tracking columns\r\n      estimatedTime: (t.columns as any).estimatedTime || (locale === 'es' ? 'Estimado' : 'Estimated'),\r\n      // v1.1.0: Quoted time column\r\n      quotedTime: (t.columns as any).quotedTime || (locale === 'es' ? 'Ofertado' : 'Quoted'),\r\n      elapsedTime: (t.columns as any).elapsedTime || (locale === 'es' ? 'Ejecutado' : 'Executed'),\r\n      // v1.2.0: New time tracking columns — order: Quoted → Estimated → Executed\r\n      soldEffortMinutes: (t.columns as any).soldEffortMinutes || (locale === 'es' ? 'Ofertado' : 'Quoted'),\r\n      effortMinutes: (t.columns as any).effortMinutes || (locale === 'es' ? 'Estimado' : 'Estimated'),\r\n      timeLoggedMinutes: (t.columns as any).timeLoggedMinutes || (locale === 'es' ? 'Ejecutado' : 'Executed'),\r\n      // v2.0.0: Chronos columns\r\n      scheduleVariance: (t.columns as any).scheduleVariance || (locale === 'es' ? 'Prog / Var' : 'Sched / Var'),\r\n      hoursBar: (t.columns as any).hoursBar || (locale === 'es' ? 'Horas (Usado / Asignado)' : 'Hours (Spent / Allocated)'),\r\n      teamLoad: (t.columns as any).teamLoad || (locale === 'es' ? 'Equipo' : 'Team'),\r\n      blockers: (t.columns as any).blockers || (locale === 'es' ? 'Bloqueantes' : 'Blockers'),\r\n      weight: (t.columns as any).weight || (locale === 'es' ? 'Peso' : 'Weight'),\r\n    };\r\n    const label = labelMap[column.type] || column.label;\r\n    // Ensure we always return a string to prevent React error #310\r\n    return typeof label === 'string' ? label : String(label || column.type);\r\n  }, [t, locale]);\r\n\r\n  // v2.1.0: Calculate proportional percentage for each column so they fill available width\r\n  const columnWidthPercent = useMemo(() => {\r\n    const colTotal = visibleColumns.reduce((sum, col) => sum + col.width, 0);\r\n    const addColWidth = allowColumnCustomization ? 48 : 0;\r\n    const fullTotal = colTotal + addColWidth;\r\n    const map: Record<string, string> = {};\r\n    for (const col of visibleColumns) {\r\n      map[col.id] = `${(col.width / fullTotal) * 100}%`;\r\n    }\r\n    return map;\r\n  }, [visibleColumns, allowColumnCustomization]);\r\n\r\n  // Loading state\r\n  if (isLoading) {\r\n    return (\r\n      <div className={cn(\"flex-1 flex items-center justify-center\", isDark ? \"bg-[#0D0D0D]\" : \"bg-white\", className)} style={style}>\r\n        <div className=\"flex flex-col items-center gap-4\">\r\n          <div className=\"w-8 h-8 animate-spin rounded-full border-b-2 border-[#00E5CC]\" />\r\n          <p className={cn(\"text-sm\", isDark ? \"text-white/60\" : \"text-gray-600\")}>\r\n            {t.empty.noTasks}...\r\n          </p>\r\n        </div>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  // Error state\r\n  if (error) {\r\n    return (\r\n      <div className={cn(\"flex-1 flex items-center justify-center\", isDark ? \"bg-[#0D0D0D]\" : \"bg-white\", className)} style={style}>\r\n        <div className=\"flex flex-col items-center gap-4 max-w-md text-center\">\r\n          <div className=\"w-12 h-12 rounded-full bg-red-500/10 flex items-center justify-center\">\r\n            <span className=\"text-red-500 text-2xl\">⚠</span>\r\n          </div>\r\n          <div>\r\n            <h3 className={cn(\"text-lg font-semibold mb-2\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n              Error\r\n            </h3>\r\n            <p className={cn(\"text-sm\", isDark ? \"text-white/60\" : \"text-gray-600\")}>\r\n              {typeof error === 'string' ? error : error.message}\r\n            </p>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  // Empty state\r\n  if (tasks.length === 0) {\r\n    return (\r\n      <div className={cn(\"flex-1 flex items-center justify-center\", isDark ? \"bg-[#0D0D0D]\" : \"bg-white\", className)} style={style}>\r\n        <div className=\"text-center max-w-md\">\r\n          <div className=\"w-16 h-16 mx-auto mb-4 rounded-2xl bg-[#00E5CC]/10 flex items-center justify-center\">\r\n            <List className=\"w-8 h-8 text-[#00E5CC]\" />\r\n          </div>\r\n          <h3 className={cn(\"text-lg font-semibold mb-2\", isDark ? \"text-white\" : \"text-gray-900\")}>\r\n            {t.empty.noTasks}\r\n          </h3>\r\n          <p className={cn(\"text-sm\", isDark ? \"text-white/60\" : \"text-gray-600\")}>\r\n            {t.empty.addFirstTask}\r\n          </p>\r\n        </div>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <div\r\n      ref={tableRef}\r\n      className={cn(\r\n        isDark ? \"bg-[#0D0D0D]\" : \"bg-white\",\r\n        resizingColumn && \"select-none\",\r\n        className\r\n      )}\r\n      style={{\r\n        display: 'flex',\r\n        flexDirection: 'column',\r\n        flex: '1 1 0%',\r\n        width: '100%',\r\n        height: '100%',\r\n        overflow: 'hidden',\r\n        minHeight: 0,\r\n        ...style,\r\n      }}\r\n    >\r\n      {/* Toolbar · 1.9.34: con `config.toolbarContainer`, compacta y en la cabecera de quien la pide */}\r\n      {(() => { const enCabecera = !!config.toolbarContainer; const barra = (\r\n      <div className={enCabecera ? \"flex items-center\" : cn(\"flex-shrink-0 px-6 py-4 border-b\", isDark ? \"border-[#222]\" : \"border-gray-200\")}>\r\n        <div className={enCabecera ? \"flex items-center gap-2\" : \"flex items-center gap-4\"}>\r\n          {/*\r\n            * Task count · 1.9.33 (D-5, Yesid): el mismo número de tareas en\r\n            * todas partes. Un padre con subtareas es un contenedor y no cuenta\r\n            * como tarea: «33 tasks · 3 parent tasks».\r\n            */}\r\n          <div className={cn(\"text-sm whitespace-nowrap\", isDark ? \"text-white/60\" : \"text-gray-600\")} data-cuenta-de-tareas>\r\n            {(() => {\r\n              /* 1.9.40 · plegar un grupo no cambia el número: se cuentan antes de plegar. */\r\n              const padres = tareasSinPlegar.filter(dt => (dt.subtasks?.length ?? 0) > 0).length;\r\n              const hojas = tareasSinPlegar.length - padres;\r\n              const esEs = locale === 'es';\r\n              return (\r\n                <>\r\n                  {hojas} {t.pagination.tasks}\r\n                  {padres > 0 && <> · {padres} {esEs ? (padres === 1 ? 'tarea padre' : 'tareas padre') : (padres === 1 ? 'parent task' : 'parent tasks')}</>}\r\n                </>\r\n              );\r\n            })()}\r\n          </div>\r\n\r\n          {/* Search */}\r\n          {showSearch && !enCabecera && (\r\n            <div className=\"relative flex-1 max-w-md\">\r\n              <Search className={cn(\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4\", isDark ? \"text-white/60\" : \"text-gray-400\")} />\r\n              <input\r\n                type=\"text\"\r\n                value={searchQuery}\r\n                onChange={(e) => setSearchQuery(e.target.value)}\r\n                placeholder={t.toolbar.searchPlaceholder}\r\n                className={cn(\r\n                  \"w-full h-9 pl-10 pr-4 rounded-lg border outline-none focus:ring-2 focus:ring-[#00E5CC]/30\",\r\n                  isDark\r\n                    ? \"bg-white/[0.03] border-[#222] text-white placeholder:text-white/30 font-mono\"\r\n                    : \"bg-gray-100 border-gray-200 text-gray-900 placeholder:text-gray-400\"\r\n                )}\r\n              />\r\n            </div>\r\n          )}\r\n\r\n          {/* Spacer to push right items */}\r\n          {!enCabecera && <div className=\"flex-1\" />}\r\n\r\n          {/* v2.1.0: Custom right toolbar content (e.g., lens toggle) */}\r\n          {toolbarRightContent && (\r\n            <div className=\"flex items-center gap-2\">\r\n              {toolbarRightContent}\r\n            </div>\r\n          )}\r\n\r\n          {/* v2.5.0: WBS Level filter (same as Gantt) */}\r\n          {showHierarchy && maxWbsDepth > 1 && (\r\n            <div className=\"relative\">\r\n              <button\r\n                ref={wbsTriggerRef}\r\n                onClick={() => setWbsDropdownOpen(!wbsDropdownOpen)}\r\n                className={cn(\r\n                  'flex items-center gap-1.5 px-2 py-1.5 rounded-lg border transition-colors text-[11px] font-medium',\r\n                  isDark\r\n                    ? wbsDropdownOpen\r\n                      ? 'bg-[#00E5CC]/10 border-[#00E5CC]/40 text-[#00E5CC]'\r\n                      : 'bg-white/[0.03] border-[#333] text-white/50 hover:text-white/70 hover:bg-white/[0.05]'\r\n                    : wbsDropdownOpen\r\n                      ? 'bg-[#00E5CC]/15 border-[#00E5CC] text-[#00C4AE]'\r\n                      : 'bg-gray-100 border-gray-200 text-gray-500 hover:text-gray-700 hover:bg-gray-200'\r\n                )}\r\n                style={{ fontFamily: \"'JetBrains Mono', monospace\" }}\r\n              >\r\n                <Layers className=\"w-3.5 h-3.5\" />\r\n                {wbsLevel === 'all' ? (locale === 'es' ? 'Todos' : 'All') : `L${wbsLevel}`}\r\n              </button>\r\n              {wbsDropdownOpen && (\r\n                <div\r\n                  ref={wbsDropdownRef}\r\n                  className={cn(\r\n                    'absolute top-full mt-1 right-0 w-24 rounded-lg border overflow-hidden z-50 shadow-lg',\r\n                    isDark\r\n                      ? 'bg-[#1A1A1A] border-[#333]'\r\n                      : 'bg-white border-gray-200'\r\n                  )}\r\n                >\r\n                  {[\r\n                    { value: 'all' as const, label: locale === 'es' ? 'Todos' : 'All' },\r\n                    ...Array.from({ length: Math.min(maxWbsDepth, 5) }, (_, i) => ({\r\n                      value: (i + 1) as number,\r\n                      label: `L${i + 1}`,\r\n                    })),\r\n                  ].map(opt => (\r\n                    <button\r\n                      key={String(opt.value)}\r\n                      onClick={() => { setWbsLevel(opt.value); setWbsDropdownOpen(false); }}\r\n                      className={cn(\r\n                        'w-full px-3 py-2 text-left text-xs transition-colors flex items-center justify-between',\r\n                        isDark\r\n                          ? wbsLevel === opt.value\r\n                            ? 'bg-[#00E5CC]/10 text-[#00E5CC]'\r\n                            : 'text-white/60 hover:bg-white/[0.05] hover:text-white/80'\r\n                          : wbsLevel === opt.value\r\n                            ? 'bg-[#00E5CC]/15 text-[#00C4AE]'\r\n                            : 'text-gray-600 hover:bg-gray-100'\r\n                      )}\r\n                    >\r\n                      <span>{opt.label}</span>\r\n                      {wbsLevel === opt.value && <span className=\"text-[#00E5CC]\">✓</span>}\r\n                    </button>\r\n                  ))}\r\n                </div>\r\n              )}\r\n            </div>\r\n          )}\r\n\r\n          {/* Status Filter - Right side (matching Gantt toolbar position) · 1.9.39: config.showStatusFilter */}\r\n          {config.showStatusFilter !== false && <StatusFilter\r\n            value={statusFilter}\r\n            hideCompleted={hideCompleted}\r\n            onChange={setStatusFilter}\r\n            onHideCompletedChange={setHideCompleted}\r\n            isDark={isDark}\r\n            locale={locale}\r\n          />}\r\n\r\n          {/* v2.3.1: Reopen health sidebar button — visible only when sidebar is enabled and closed */}\r\n          {healthSidebarWithTotal?.enabled && healthSidebarWithTotal.data && !sidebarOpen && (\r\n            <button\r\n              onClick={() => setSidebarOpen(true)}\r\n              className={cn(\r\n                'flex items-center justify-center w-8 h-8 rounded-lg border transition-colors',\r\n                isDark\r\n                  ? 'border-[#333] text-white/40 hover:text-white/70 hover:bg-white/[0.05]'\r\n                  : 'border-gray-200 text-gray-400 hover:text-gray-600 hover:bg-gray-100'\r\n              )}\r\n              title={locale === 'es' ? 'Abrir panel de salud' : 'Open health panel'}\r\n            >\r\n              <PanelRight className=\"w-4 h-4\" />\r\n            </button>\r\n          )}\r\n\r\n          {/* v2.5.0: Custom end content (rendered just before Create Task button) */}\r\n          {config.toolbarEndContent}\r\n\r\n          {/* Create Task Button - v0.18.0: Same style as GanttToolbar */}\r\n          {showCreateTaskButton && onCreateTask && !enCabecera && (\r\n            <motion.button\r\n              onClick={onCreateTask}\r\n              className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg text-xs transition-[transform,box-shadow]\"\r\n              style={{\r\n                background: 'linear-gradient(135deg, #00E5CC 0%, #005FCC 100%)',\r\n                color: '#FFFFFF',\r\n                fontFamily: 'Inter, sans-serif',\r\n                fontWeight: 500,\r\n                boxShadow: '0 2px 8px rgba(0, 123, 255, 0.3)',\r\n              }}\r\n              whileHover={{\r\n                scale: 1.02,\r\n                boxShadow: '0 4px 12px rgba(0, 123, 255, 0.4)',\r\n              }}\r\n              whileTap={{ scale: 0.98 }}\r\n            >\r\n              <Plus className=\"w-4 h-4\" />\r\n              <span>{t.toolbar.newTask}</span>\r\n            </motion.button>\r\n          )}\r\n        </div>\r\n      </div>\r\n      );\r\n      return enCabecera ? createPortal(barra, config.toolbarContainer as HTMLElement) : barra;\r\n      })()}\r\n\r\n      {/* Table + Sidebar Container */}\r\n      <div style={{ display: 'flex', flex: '1 1 0%', overflow: 'hidden', minHeight: 0 }}>\r\n      {/* Table Container */}\r\n      <div style={{ flex: '1 1 0%', overflow: 'auto', minHeight: 0 }}>\r\n        <div style={{ width: '100%' }}>\r\n          {/* List Header */}\r\n          <div\r\n            className={cn(\r\n              \"flex-shrink-0 flex items-center border-b text-[10px] font-bold uppercase tracking-wider sticky top-0 z-10\",\r\n              isDark ? \"border-[#222] bg-[#1A1A1A] font-mono text-white/70\" : \"border-gray-200 bg-gray-50 text-gray-600\"\r\n            )}\r\n          >\r\n            {/* Spacer to align with drag handle in child rows */}\r\n            {seleccionable && <div className=\"w-6 flex-shrink-0\" />}\r\n            {canDragRows && <div className=\"w-5 flex-shrink-0\" />}\r\n            {visibleColumns.map((column) => {\r\n              const isDraggable = column.id !== 'name';\r\n              const isDragOver = dragOverColumnId === column.id && dragColumnId !== column.id;\r\n              return (\r\n              <div\r\n                key={column.id}\r\n                className={cn(\r\n                  \"relative flex items-center gap-2 px-4 py-2 transition-all duration-150 group\",\r\n                  isDark ? \"text-white/60\" : \"text-gray-500\",\r\n                  isDraggable && \"cursor-grab\",\r\n                  column.type !== 'name' && \"justify-center\",\r\n                  dragColumnId === column.id && \"opacity-50\",\r\n                  isDragOver && (isDark\r\n                    ? \"bg-[#00E5CC]/20 border-l-2 border-l-[#00E5CC]\"\r\n                    : \"bg-[#00E5CC]/15 border-l-2 border-l-[#00E5CC]\")\r\n                )}\r\n                style={{ width: columnWidthPercent[column.id], minWidth: column.minWidth }}\r\n                draggable={isDraggable}\r\n                onDragStart={isDraggable ? (e) => handleColumnDragStart(e, column.id) : undefined}\r\n                onDragEnd={isDraggable ? handleColumnDragEnd : undefined}\r\n                onDragOver={isDraggable ? (e) => handleColumnDragOver(e, column.id) : undefined}\r\n                onDragLeave={isDraggable ? handleColumnDragLeave : undefined}\r\n                onDrop={isDraggable ? (e) => handleColumnDrop(e, column.id) : undefined}\r\n                onContextMenu={(e) => handleContextMenu(e, undefined, column.id)}\r\n              >\r\n                {/* v2.4.0: Drag grip indicator for reorderable columns */}\r\n                {isDraggable && (\r\n                  <GripVertical className={cn(\r\n                    \"w-3 h-3 flex-shrink-0 transition-opacity\",\r\n                    isDark ? \"text-white/20 group-hover:text-white/50\" : \"text-gray-300 group-hover:text-gray-500\"\r\n                  )} />\r\n                )}\r\n                {/* v1.8.0: when the consumer wires onColumnHeaderClick, the\r\n                    whole label area becomes the trigger for a unified\r\n                    Sort+Filter+Hide dropdown rendered by the consumer. We\r\n                    pass the bounding rect so the consumer can anchor the\r\n                    popup. Falls back to the legacy sort-on-click behavior\r\n                    when the consumer doesn't opt in. */}\r\n                {onColumnHeaderClick ? (\r\n                  <button\r\n                    draggable={false}\r\n                    onClick={(e) => {\r\n                      const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\r\n                      onColumnHeaderClick(column.id, rect);\r\n                    }}\r\n                    className=\"flex items-center gap-1.5 hover:text-[#00E5CC]\"\r\n                  >\r\n                    {getColumnLabel(column)}\r\n                    {columnsWithFilter?.includes(column.id) && (\r\n                      <span\r\n                        title=\"filtered\"\r\n                        style={{ width: 6, height: 6, borderRadius: '50%', background: filterDotColor, display: 'inline-block', flexShrink: 0 }}\r\n                      />\r\n                    )}\r\n                    {sortField === column.id && (\r\n                      <ArrowUpDown className=\"w-3 h-3 text-[#00E5CC]\" />\r\n                    )}\r\n                  </button>\r\n                ) : column.sortable ? (\r\n                  <button\r\n                    draggable={false}\r\n                    onClick={() => handleSort(column.id)}\r\n                    className=\"flex items-center gap-1 hover:text-[#00E5CC]\"\r\n                  >\r\n                    {getColumnLabel(column)}\r\n                    {columnsWithFilter?.includes(column.id) && (\r\n                      <span\r\n                        title=\"filtered\"\r\n                        style={{ width: 6, height: 6, borderRadius: '50%', background: filterDotColor, display: 'inline-block', flexShrink: 0 }}\r\n                      />\r\n                    )}\r\n                    <ArrowUpDown className={cn(\r\n                      \"w-3 h-3\",\r\n                      sortField === column.id && \"text-[#00E5CC]\"\r\n                    )} />\r\n                  </button>\r\n                ) : (\r\n                  <span draggable={false} className=\"flex items-center gap-1.5\">\r\n                    {getColumnLabel(column)}\r\n                    {columnsWithFilter?.includes(column.id) && (\r\n                      <span\r\n                        title=\"filtered\"\r\n                        style={{ width: 6, height: 6, borderRadius: '50%', background: filterDotColor, display: 'inline-block', flexShrink: 0 }}\r\n                      />\r\n                    )}\r\n                  </span>\r\n                )}\r\n\r\n                {/*\r\n                  * ═══ EL TIRADOR SE VE, Y SE AGARRA MAS FACIL · 08-sep ═════\r\n                  *\r\n                  * Reportado: «poner una pequena linea para ver donde esta la\r\n                  * fila para poder ampliarla o reducirla; como esta toca\r\n                  * buscarla con el mouse».\r\n                  *\r\n                  * Tenia razon y eran DOS problemas en el mismo elemento:\r\n                  *\r\n                  *   NO SE VEIA   el color solo aparecia en `hover`, asi que\r\n                  *                habia que encontrar el sitio A CIEGAS.\r\n                  *   ERA ESTRECHO `w-1` son 4 px. Aunque supieras donde esta,\r\n                  *                acertar cuesta.\r\n                  *\r\n                  * Se separan las dos cosas, que es lo que lo arregla bien:\r\n                  *\r\n                  *   LA ZONA SENSIBLE crece a 9 px (`w-[9px]` con `-mr-1`,\r\n                  *   asi se reparte a los dos lados del borde y no desplaza\r\n                  *   nada). Es invisible: solo es donde se puede agarrar.\r\n                  *\r\n                  *   LA LINEA VISIBLE es un hijo de 1 px, SIEMPRE presente,\r\n                  *   de ALTURA COMPLETA y al 40 %. Primero la puse al 18 % y a\r\n                  *   media altura «para que no compitiera con el contenido»:\r\n                  *   Arcadio lo probo y seguia sin verse. Una linea que hay que\r\n                  *   buscar no resuelve el problema de buscarla.\r\n                  *\r\n                  * Al pasar el raton, esa linea se vuelve del acento y a plena\r\n                  * opacidad: confirma que ahi es. Y mientras se arrastra,\r\n                  * tambien — si no, se pierde la referencia al mover.\r\n                  *\r\n                  * `pointer-events-none` en la linea: quien recibe el raton es\r\n                  * la zona de 9 px, no ella. Sin eso, el gesto se partiria en\r\n                  * dos segun donde cayera el pixel.\r\n                  */}\r\n                {allowColumnResize && column.resizable && (\r\n                  <div\r\n                    className={cn(\r\n                      \"absolute right-0 top-0 bottom-0 w-[9px] -mr-1 cursor-col-resize group\",\r\n                      \"flex items-center justify-center\"\r\n                    )}\r\n                    onMouseDown={(e) => handleResizeStart(e, column.id)}\r\n                  >\r\n                    <div\r\n                      className={cn(\r\n                        \"w-px h-full transition-colors\",\r\n                        \"pointer-events-none\",\r\n                        resizingColumn === column.id\r\n                          ? \"bg-[#00E5CC] w-0.5\"\r\n                          : \"bg-current opacity-40 group-hover:bg-[#00E5CC] group-hover:opacity-100 group-hover:w-0.5\"\r\n                      )}\r\n                    />\r\n                  </div>\r\n                )}\r\n              </div>\r\n              );\r\n            })}\r\n\r\n            {/* Add column button */}\r\n            {allowColumnCustomization && (\r\n              <div className=\"relative flex items-center justify-center w-12 flex-shrink-0\">\r\n                <button\r\n                  onClick={(e) => {\r\n                    e.stopPropagation();\r\n                    setShowColumnSelector(prev => !prev);\r\n                  }}\r\n                  className={cn(\r\n                    \"p-0.5 rounded transition-colors\",\r\n                    isDark\r\n                      ? \"hover:bg-white/[0.05] text-white/60 hover:text-white\"\r\n                      : \"hover:bg-gray-200 text-gray-400 hover:text-gray-600\",\r\n                    showColumnSelector && (isDark ? \"bg-white/[0.05]\" : \"bg-gray-200\")\r\n                  )}\r\n                  title={locale === 'es' ? 'Agregar columna' : 'Add column'}\r\n                >\r\n                  <Plus className=\"w-3 h-3\" />\r\n                </button>\r\n\r\n                {/* Column Selector - positioned relative to button */}\r\n                <ColumnSelector\r\n                  isOpen={showColumnSelector}\r\n                  onClose={() => setShowColumnSelector(false)}\r\n                  columns={columns}\r\n                  customFields={customFields}\r\n                  /* v1.9.27 — la capacidad decide si se ofrecen las densas. */\r\n                  mostrarColumnasDensas={mostrarColumnasDensas}\r\n                  onColumnsChange={handleColumnsChange}\r\n                  onCreateCustomField={() => {\r\n                    setShowColumnSelector(false);\r\n                    setShowCreateFieldModal(true);\r\n                  }}\r\n                  isDark={isDark}\r\n                  locale={locale}\r\n                />\r\n              </div>\r\n            )}\r\n          </div>\r\n\r\n          {/* Task List */}\r\n          <AnimatePresence mode=\"popLayout\">\r\n            {displayTasks.map((task, index) => conCabecerasDeGrupo(index, (() => {\r\n              const isExpanded = expandedTasks.has(task.id);\r\n              // v0.18.3: Limit animation delay to max 200ms for better filter responsiveness\r\n              const animationDelay = Math.min(index * 0.01, 0.2);\r\n              // Chronos V2.0: Group header for parent tasks at level 0\r\n              const isGroupHeader = task.hasChildren && task.level === 0;\r\n              const subtaskCount = task.subtasks?.length || 0;\r\n\r\n              // Chronos V2.0: WBS Group Header Row — uses same column grid as normal rows\r\n              if (isGroupHeader) {\r\n                const { spent, allocated, quoted } = calculateGroupHours(task);\r\n                const spi = calculateGroupSPI(task);\r\n                return (\r\n                  <motion.div\r\n                    key={task.id}\r\n                    data-task-id={task.id}\r\n                    initial={{ opacity: 0 }}\r\n                    animate={{ opacity: 1 }}\r\n                    exit={{ opacity: 0 }}\r\n                    transition={{ duration: 0.15, delay: animationDelay }}\r\n                    className={cn(\r\n                      \"flex items-center border-y cursor-pointer transition-colors duration-500 group\",\r\n                      isDark ? \"border-[#222] bg-[#222]\" : \"border-gray-200 bg-gray-100\",\r\n                      highlightedTaskId === task.id && (isDark ? \"!bg-[#FFD60A]/15\" : \"!bg-yellow-100\")\r\n                    )}\r\n                    onClick={() => callbacks.onTaskClick?.(task)}\r\n                  >\r\n                    {seleccionable && casillaDeFila(task.id)}\r\n                    {/* Spacer to align with drag handle in child rows */}\r\n                    {canDragRows && <div className=\"w-5 flex-shrink-0\" />}\r\n                    {visibleColumns.map((column) => (\r\n                      <div\r\n                        key={column.id}\r\n                        className={cn(\"flex items-center px-4\", compacta ? \"py-1.5 min-h-[40px]\" : \"py-3 min-h-[56px]\", column.type !== 'name' && \"justify-center\")}\r\n                        style={{ width: columnWidthPercent[column.id], minWidth: column.minWidth }}\r\n                      >\r\n                        {column.type === 'name' ? (\r\n                          // Name cell — folder icon + wbs + name + count + SPI + conflicts\r\n                          <div className=\"flex items-start gap-2 min-w-0 w-full\">\r\n                            <button\r\n                              onClick={(e) => { e.stopPropagation(); toggleExpand(task.id); }}\r\n                              className={cn(\"p-0.5 rounded flex-shrink-0 mt-0.5\", isDark ? \"hover:bg-white/[0.05]\" : \"hover:bg-gray-200\")}\r\n                            >\r\n                              {isExpanded\r\n                                ? <ChevronDown className={cn(\"w-4 h-4\", isDark ? \"text-white/40\" : \"text-gray-500\")} />\r\n                                : <ChevronRight className={cn(\"w-4 h-4\", isDark ? \"text-white/40\" : \"text-gray-500\")} />}\r\n                            </button>\r\n                            <span onClick={(e) => { e.stopPropagation(); toggleExpand(task.id); }} className=\"flex-shrink-0 cursor-pointer mt-0.5\">\r\n                              {isExpanded\r\n                                ? <FolderOpen className=\"w-4 h-4\" style={{ color: isDark ? '#FFD60A' : '#B45309' }} />\r\n                                : <Folder className=\"w-4 h-4\" style={{ color: isDark ? '#FFD60A' : '#B45309' }} />}\r\n                            </span>\r\n                            {task.wbsCode && (\r\n                              <span className=\"text-[10px] font-mono flex-shrink-0 mt-1\" style={{ color: isDark ? '#FFD60A' : '#B45309' }}>\r\n                                {task.wbsCode}\r\n                              </span>\r\n                            )}\r\n                            <div className={cn(\"flex min-w-0\", compacta ? \"flex-row items-baseline gap-2\" : \"flex-col\")}>\r\n                              <span className={cn(\"text-[13px] font-bold uppercase tracking-wide\", compacta && \"truncate\", isDark ? \"text-white\" : \"text-gray-900\")} style={{ fontFamily: 'Inter, system-ui, sans-serif' }}>\r\n                                {task.name}\r\n                              </span>\r\n                              <span className={cn(compacta ? \"text-[12px] flex-shrink-0\" : \"text-[10px] font-mono\", isDark ? \"text-white/30\" : \"text-gray-500\")}>\r\n                                ({subtaskCount} {locale === 'es' ? (subtaskCount === 1 ? 'Tarea' : 'Tareas') : (subtaskCount === 1 ? 'Item' : 'Items')})\r\n                              </span>\r\n                              {spi !== null && mostrarIndicadoresFinancieros && (\r\n                                <span className={cn(\"text-[9px] font-mono px-1.5 py-0.5 rounded w-fit mt-0.5\", spi >= 1 ? \"text-[#32D74B] bg-[#32D74B]/10\" : spi >= 0.8 ? \"text-[#FFD60A] bg-[#FFD60A]/10\" : \"text-[#FF453A] bg-[#FF453A]/10\")}>\r\n                                  Avg SPI: {spi.toFixed(2)}\r\n                                </span>\r\n                              )}\r\n                            </div>\r\n                          </div>\r\n                        ) : column.type === 'timeLoggedMinutes' ? (\r\n                          lens === 'financial' ? (() => {\r\n                            // v2.5.3: Prefer canonical rollup (time_logs × rate_at_time)\r\n                            // when consumer attached it to the task. Keeps group header\r\n                            // in sync with the TOTAL PROYECTO footer.\r\n                            const canonicalDollars = (task as any).executedDollarsCanonical as number | undefined;\r\n                            const val = canonicalDollars != null\r\n                              ? Math.round(canonicalDollars)\r\n                              : Math.round(calculateGroupDollars(task).dollarSpent);\r\n                            return val > 0 ? <span className={cn('text-sm font-mono', isDark ? 'text-white/60' : 'text-gray-500')}>${val.toLocaleString('en-US')}</span> : null;\r\n                          })() : <TimeCell value={spent > 0 ? spent : undefined} isDark={isDark} locale={locale} disabled lens={lens} hourlyRate={getTaskRate(task)} />\r\n                        ) : column.type === 'soldEffortMinutes' ? (\r\n                          lens === 'financial' ? (() => {\r\n                            const groupDollars = calculateGroupDollars(task);\r\n                            const val = Math.round(groupDollars.dollarQuoted);\r\n                            return val > 0 ? <span className={cn('text-sm font-mono', isDark ? 'text-white/60' : 'text-gray-500')}>${val.toLocaleString('en-US')}</span> : null;\r\n                          })() : <TimeCell value={quoted > 0 ? quoted : undefined} isDark={isDark} locale={locale} disabled lens={lens} hourlyRate={getTaskRate(task)} />\r\n                        ) : column.type === 'effortMinutes' ? (\r\n                          lens === 'financial' ? (() => {\r\n                            const groupDollars = calculateGroupDollars(task);\r\n                            const estDollars = Math.round(groupDollars.dollarAllocated);\r\n                            const offDollars = Math.round(groupDollars.dollarQuoted);\r\n                            const margin = offDollars - estDollars;\r\n                            return (\r\n                              <div className=\"flex flex-col\">\r\n                                {estDollars > 0 ? (\r\n                                  <span className={cn('text-sm font-mono', isDark ? 'text-white/60' : 'text-gray-500')}>\r\n                                    ${estDollars.toLocaleString('es-CO')}\r\n                                  </span>\r\n                                ) : null}\r\n                                {margin !== 0 && estDollars > 0 && offDollars > 0 && (\r\n                                  <span className={cn('text-[9px] font-mono font-bold px-1.5 py-0.5 rounded whitespace-nowrap mt-0.5',\r\n                                    margin > 0 ? 'bg-[#064e3b] text-[#10b981] border border-[#065f46]/30' : 'bg-[#451a03] text-[#f59e0b] border border-[#78350f]/30'\r\n                                  )}>\r\n                                    {margin > 0 ? '+' : ''}{Math.abs(margin) >= 1000 ? `$${(margin/1000).toFixed(1)}K` : `$${margin}`}\r\n                                  </span>\r\n                                )}\r\n                              </div>\r\n                            );\r\n                          })() : <TimeCell value={allocated > 0 ? allocated : undefined} isDark={isDark} locale={locale} disabled lens={lens} hourlyRate={getTaskRate(task)} />\r\n                        ) : (\r\n                          // v2.4.0: Render remaining column types (scheduleVariance, hoursBar, teamLoad, blockers, etc.)\r\n                          renderCell(task, column)\r\n                        )}\r\n                      </div>\r\n                    ))}\r\n                    {allowColumnCustomization && (\r\n                      <div className=\"w-12 flex-shrink-0\" />\r\n                    )}\r\n                  </motion.div>\r\n                );\r\n              }\r\n\r\n              const isBeingDragged = rowDragId === task.id;\r\n              const isDropTarget = rowDropTargetId === task.id;\r\n              const showDropAbove = isDropTarget && rowDropPosition === 'above';\r\n              const showDropBelow = isDropTarget && rowDropPosition === 'below';\r\n              const showDropChild = isDropTarget && rowDropPosition === 'child';\r\n\r\n              return (\r\n                <motion.div\r\n                  key={(task as { __claveFila?: string }).__claveFila ?? task.id}\r\n                  data-task-id={task.id}\r\n                  data-listview-row={task.id}\r\n                  initial={{ opacity: 0 }}\r\n                  animate={{ opacity: 1 }}\r\n                  exit={{ opacity: 0 }}\r\n                  transition={{ duration: 0.15, delay: animationDelay }}\r\n                  className={cn(\r\n                    \"flex items-center border-b transition-colors relative group\",\r\n                    isDark\r\n                      ? \"border-[#222] hover:bg-white/[0.05]\"\r\n                      : \"border-gray-100 hover:bg-gray-50\",\r\n                    highlightedTaskId === task.id && (isDark ? \"!bg-[#FFD60A]/15\" : \"!bg-yellow-100\"),\r\n                    seleccionable && seleccion.has(task.id) && (isDark ? \"bg-white/[0.06]\" : \"bg-blue-50/60\")\r\n                  )}\r\n                  data-seleccionada={seleccionable && seleccion.has(task.id) ? 'true' : undefined}\r\n                  style={{\r\n                    opacity: isBeingDragged ? 0.4 : 1,\r\n                    backgroundColor: showDropChild ? (isDark ? 'rgba(0, 229, 204,0.08)' : 'rgba(0, 229, 204,0.05)') : undefined,\r\n                    boxShadow: showDropChild ? 'inset 0 0 0 2px #00E5CC' : undefined,\r\n                  }}\r\n                  onClick={() => callbacks.onTaskClick?.(task)}\r\n                  onDoubleClick={() => callbacks.onTaskDoubleClick?.(task)}\r\n                  onContextMenu={(e) => handleContextMenu(e, task)}\r\n                  onMouseEnter={() => setHoveredTaskId(task.id)}\r\n                  onMouseLeave={() => setHoveredTaskId((prev) => (prev === task.id ? null : prev))}\r\n                >\r\n                  {/* Drop indicator ABOVE */}\r\n                  {showDropAbove && (\r\n                    <div style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 2, backgroundColor: '#00E5CC', zIndex: 10 }} />\r\n                  )}\r\n                  {/* Drop indicator BELOW */}\r\n                  {showDropBelow && (\r\n                    <div style={{ position: 'absolute', bottom: 0, left: 0, right: 0, height: 2, backgroundColor: '#00E5CC', zIndex: 10 }} />\r\n                  )}\r\n                  {seleccionable && casillaDeFila(task.id)}\r\n                  {/* Drag handle */}\r\n                  {canDragRows && (\r\n                    <div\r\n                      className=\"flex-shrink-0 flex items-center justify-center w-5 cursor-grab opacity-0 group-hover:opacity-40 hover:!opacity-80 transition-opacity\"\r\n                      onMouseDown={(e) => handleRowDragStart(task.id, e)}\r\n                      style={{ color: isDark ? '#888' : '#999' }}\r\n                    >\r\n                      <GripVertical className=\"w-3 h-3\" />\r\n                    </div>\r\n                  )}\r\n                  {visibleColumns.map((column) => {\r\n                    // Drag-fill: handle + preview for fillable cells.\r\n                    const isParentRow = !!(task.subtasks && task.subtasks.length > 0);\r\n                    const fillCol = fillColumnFor(column);\r\n                    const canFill = !!fillCol && !isParentRow;\r\n                    const showFillHandle = canFill && hoveredTaskId === task.id && !fillDrag;\r\n                    /*\r\n                     * v1.9.28: comparar con `mismaColumnaDeRelleno`, no con\r\n                     * `===`. Las columnas de campo son OBJETOS y dos objetos\r\n                     * iguales nunca son `===`: con `===` el resaltado del\r\n                     * rango no se pintaba jamás en esas columnas.\r\n                     */\r\n                    const cellInFill = !!fillDrag && !!fillCol\r\n                      && mismaColumnaDeRelleno(fillDrag.column, fillCol)\r\n                      && isInFillRange(task.id);\r\n                    return (\r\n                    <div\r\n                      key={column.id}\r\n                      className={cn(\"flex items-center px-4\", compacta ? \"py-1.5 min-h-[40px]\" : \"py-3 min-h-[56px]\", column.type !== 'name' && \"justify-center\")}\r\n                      style={{\r\n                        width: columnWidthPercent[column.id], minWidth: column.minWidth,\r\n                        position: 'relative',\r\n                        backgroundColor: cellInFill ? 'rgba(0, 229, 204, 0.13)' : undefined,\r\n                        boxShadow: cellInFill ? 'inset 0 0 0 1px rgba(0, 229, 204, 0.45)' : undefined,\r\n                      }}\r\n                    >\r\n                      {column.type === 'name' ? (\r\n                        /* Name column with hierarchy — Chronos V2.0 two-line layout */\r\n                        <div className=\"flex items-center gap-2 min-w-0 w-full\">\r\n                          {/* Indentation spacer for hierarchy levels */}\r\n                          {showHierarchy && task.level > 0 && (\r\n                            <div style={{ width: `${task.level * 24}px` }} className=\"flex-shrink-0\" />\r\n                          )}\r\n                          {showHierarchy && task.hasChildren && (\r\n                            <button\r\n                              onClick={(e) => {\r\n                                e.stopPropagation();\r\n                                toggleExpand(task.id);\r\n                              }}\r\n                              className={cn(\"p-0.5 rounded flex-shrink-0\", isDark ? \"hover:bg-white/[0.05]\" : \"hover:bg-gray-200\")}\r\n                            >\r\n                              {isExpanded ? (\r\n                                <ChevronDown className={cn(\"w-4 h-4\", isDark ? \"text-white/60\" : \"text-gray-400\")} />\r\n                              ) : (\r\n                                <ChevronRight className={cn(\"w-4 h-4\", isDark ? \"text-white/60\" : \"text-gray-400\")} />\r\n                              )}\r\n                            </button>\r\n                          )}\r\n                          {showHierarchy && !task.hasChildren && <div className=\"w-5 flex-shrink-0\" />}\r\n\r\n                          {/* Two-line name layout · 1.9.38: en compacta, una sola línea (ID + título + etiqueta) */}\r\n                          <div className={cn(\"flex min-w-0 flex-1\", compacta ? \"flex-row items-center gap-2\" : \"flex-col\")}>\r\n                            {/* Line 1: WBS code + Task code */}\r\n                            {(task.wbsCode || task.taskCode) && (\r\n                              <div className=\"flex items-center gap-1.5\">\r\n                                {task.wbsCode && (\r\n                                  <span className={cn(\"text-[10px] font-mono\", isDark ? \"text-[#00E5CC]\" : \"text-[#00C4AE]\")}>\r\n                                    {task.wbsCode}\r\n                                  </span>\r\n                                )}\r\n                                {task.taskCode && (\r\n                                  <span data-codigo-tarea className={cn(compacta ? \"text-[12px] whitespace-nowrap\" : \"text-[10px] font-mono\", isDark ? \"text-white/40\" : \"text-gray-400\")}\r\n                                    style={compacta && !isDark ? { color: 'var(--pj-texto-3, #646B78)' } : undefined}>\r\n                                    {task.taskCode}\r\n                                  </span>\r\n                                )}\r\n                              </div>\r\n                            )}\r\n                            {/* Line 2: Task name — v2.7.0 stricter typography hierarchy:\r\n                                Parent (phase/folder) rows: 14px / 700 / #FFFFFF (dark) or #111827 (light)\r\n                                Child (task) rows: 13px / 400 / #D1D5DB (dark) or #4B5563 (light)\r\n                                This lets the eye group phases vs tasks at a glance. */}\r\n                            <span className={cn(\r\n                              \"truncate\",\r\n                              task.hasChildren ? \"text-[14px] font-bold\" : \"text-[13px] font-normal\",\r\n                              task.progress === 100\r\n                                ? (config.completedStyle === 'dim'\r\n                                    ? (isDark ? \"text-white/45\" : \"text-gray-400\")\r\n                                    : (isDark ? \"line-through text-white/50\" : \"line-through text-gray-400\"))\r\n                                : task.hasChildren\r\n                                  ? (isDark ? \"text-white\" : \"text-gray-900\")\r\n                                  : (isDark ? \"text-[#D1D5DB]\" : \"text-gray-600\")\r\n                            )}>\r\n                              {(task as { __padre?: string }).__padre && (\r\n                                <span data-prefijo-padre className={isDark ? 'text-white/35' : 'text-gray-400'}>{(task as { __padre?: string }).__padre} › </span>\r\n                              )}\r\n                              {task.name}\r\n                            </span>\r\n                            {/* Line 3: First tag badge */}\r\n                            {task.tags?.[0] && (\r\n                              <span\r\n                                className={cn(\"text-[9px] font-mono uppercase tracking-wide px-1.5 py-0.5 rounded w-fit\", compacta && \"flex-shrink-0\")}\r\n                                style={{\r\n                                  backgroundColor: `${task.tags[0].color}20`,\r\n                                  color: task.tags[0].color,\r\n                                }}\r\n                              >\r\n                                {task.tags[0].name}\r\n                              </span>\r\n                            )}\r\n                          </div>\r\n                        </div>\r\n                      ) : showFillHandle && fillCol ? (\r\n                        /*\r\n                         * v1.9.28 · el tirador se ancla al CONTENIDO, no a la\r\n                         * celda. Antes iba en la esquina de la celda entera\r\n                         * (`right: 2`), y como las celdas van centradas, el\r\n                         * cuadrito aparecía a un dedo de distancia del avatar\r\n                         * — con dos columnas contiguas parecía que un mismo\r\n                         * control tuviera dos puntas. Este envoltorio se ajusta\r\n                         * al contenido (`inline-flex`), así que la esquina del\r\n                         * tirador es la esquina de lo que se arrastra.\r\n                         */\r\n                        <span style={{ position: 'relative', display: 'inline-flex', alignItems: 'center' }}>\r\n                          {renderCell(task, column)}\r\n                          <span\r\n                            title=\"Arrastrá hacia abajo para aplicar a varias tareas\"\r\n                            onMouseDown={(e) => handleFillDragStart(e, task.id, fillCol, index)}\r\n                            style={{\r\n                              position: 'absolute',\r\n                              right: -5,\r\n                              bottom: -3,\r\n                              width: 8,\r\n                              height: 8,\r\n                              borderRadius: 2,\r\n                              background: '#00E5CC',\r\n                              border: '1px solid rgba(0,0,0,0.3)',\r\n                              cursor: 'crosshair',\r\n                              zIndex: 5,\r\n                            }}\r\n                          />\r\n                        </span>\r\n                      ) : (\r\n                        renderCell(task, column)\r\n                      )}\r\n                    </div>\r\n                    );\r\n                  })}\r\n\r\n                  {/* Empty cell for add column button alignment */}\r\n                  {allowColumnCustomization && (\r\n                    <div className=\"w-12 flex-shrink-0\" />\r\n                  )}\r\n                </motion.div>\r\n              );\r\n            })()))}\r\n            {conCabecerasDeGrupo(displayTasks.length, null)}\r\n          </AnimatePresence>\r\n\r\n          {/* v2.4.0: Project Totals Sticky Footer */}\r\n          {showProjectTotals && displayTasks.length > 0 && (() => {\r\n            const { spent, allocated, quoted } = projectTotalHours;\r\n            const varianceMinutes = allocated - spent;\r\n            const isOver = varianceMinutes < 0;\r\n            // v2.8.0: Both labels use a positive sign — \"AHORRADO\" with a\r\n            // leading minus sign read as a loss to users. The semantic is\r\n            // already in the word (EXCEDIDO vs AHORRADO), so the sign should\r\n            // always be positive (the magnitude of the variance).\r\n            const varianceLabel = isOver\r\n              ? `+${formatGroupHours(Math.abs(varianceMinutes))} ${locale === 'es' ? 'EXCEDIDO' : 'OVER'}`\r\n              : `+${formatGroupHours(varianceMinutes)} ${locale === 'es' ? 'AHORRADO' : 'SAVED'}`;\r\n            const isFinancial = lens === 'financial' && hourlyRate > 0;\r\n            // v2.5.2: Prefer consumer-supplied dollar totals when provided (canonical\r\n            // time_logs × rate_at_time figures). Falls back to the internal per-task\r\n            // computation when no override is given.\r\n            const bd = totalsDollarOverride?.breakdown;\r\n            const hasCommittedExtras = !!bd && ((bd.equipment ?? 0) > 0 || (bd.travel ?? 0) > 0);\r\n            const effDollarSpent = bd?.laborSpent != null\r\n              ? bd.laborSpent\r\n              : (totalsDollarOverride?.spent != null ? totalsDollarOverride.spent : projectTotalHours.dollarSpent);\r\n            const effDollarAllocated = bd?.laborAllocated != null\r\n              ? bd.laborAllocated\r\n              : (totalsDollarOverride?.allocated != null ? totalsDollarOverride.allocated : projectTotalHours.dollarAllocated);\r\n            const effDollarQuoted = totalsDollarOverride?.quoted != null\r\n              ? totalsDollarOverride.quoted\r\n              : projectTotalHours.dollarQuoted;\r\n            const formatValue = (mins: number, dollarOverride?: number) => {\r\n              if (isFinancial) {\r\n                const dollars = dollarOverride != null ? dollarOverride : (mins / 60) * hourlyRate;\r\n                return `$${Math.round(dollars).toLocaleString('es-CO')}`;\r\n              }\r\n              return formatGroupHours(mins);\r\n            };\r\n            const varianceDollars = isFinancial ? Math.abs(effDollarAllocated - effDollarSpent) : 0;\r\n            const varianceLabelFinancial = isFinancial\r\n              ? `+$${varianceDollars.toLocaleString('es-CO', { minimumFractionDigits: 0, maximumFractionDigits: 0 })} ${isOver ? (locale === 'es' ? 'EXCEDIDO' : 'OVER') : (locale === 'es' ? 'AHORRADO' : 'SAVED')}`\r\n              : varianceLabel;\r\n\r\n            // Small note under \"TOTAL PROYECTO\" clarifying the footer is labor-only;\r\n            // the full picture (labor + equipment + travel) is in the Financial\r\n            // Health sidebar.\r\n            const totalNote = isFinancial && hasCommittedExtras\r\n              ? (locale === 'es' ? 'solo mano de obra' : 'labor only')\r\n              : undefined;\r\n\r\n            return (\r\n              <div\r\n                className={cn(\r\n                  \"flex items-center sticky bottom-0 z-[5]\",\r\n                  isDark\r\n                    ? \"border-t border-[#2A2A3A]\"\r\n                    : \"border-t border-gray-300\"\r\n                )}\r\n                style={{\r\n                  backgroundColor: isDark ? 'rgba(13, 17, 23, 0.95)' : 'rgba(255, 255, 255, 0.95)',\r\n                  backdropFilter: 'blur(8px)',\r\n                  WebkitBackdropFilter: 'blur(8px)',\r\n                }}\r\n              >\r\n                {/* Spacer to align with drag handle in child rows */}\r\n                {seleccionable && <div className=\"w-6 flex-shrink-0\" />}\r\n                {canDragRows && <div className=\"w-5 flex-shrink-0\" />}\r\n                {visibleColumns.map((column) => (\r\n                  <div\r\n                    key={column.id}\r\n                    className={cn(\r\n                      \"flex items-center px-4 py-3\",\r\n                      column.type !== 'name' && \"justify-center\"\r\n                    )}\r\n                    style={{ width: columnWidthPercent[column.id], minWidth: column.minWidth }}\r\n                  >\r\n                    {column.type === 'name' ? (\r\n                      <div className=\"flex flex-col\">\r\n                        <span\r\n                          className={cn(\r\n                            \"text-[11px] font-black uppercase tracking-widest\",\r\n                            isDark ? \"text-white\" : \"text-gray-900\"\r\n                          )}\r\n                          style={{ fontFamily: 'JetBrains Mono, monospace' }}\r\n                        >\r\n                          {locale === 'es' ? 'TOTAL PROYECTO' : 'TOTAL PROJECT'}\r\n                        </span>\r\n                        {totalNote && (\r\n                          <span\r\n                            className={cn(\r\n                              \"text-[9px] font-mono mt-0.5 flex items-center gap-1\",\r\n                              isDark ? \"text-white/35\" : \"text-gray-400\"\r\n                            )}\r\n                          >\r\n                            <Info className=\"w-2.5 h-2.5\" />\r\n                            {totalNote}\r\n                          </span>\r\n                        )}\r\n                      </div>\r\n                    ) : column.type === 'hoursBar' ? (\r\n                      <div className=\"flex flex-col items-center w-full\">\r\n                        <div className=\"flex items-center gap-2\">\r\n                          <span className={cn(\"text-[12px] font-bold\", isDark ? \"text-white\" : \"text-gray-900\")}\r\n                            style={{ fontFamily: 'JetBrains Mono, monospace' }}>\r\n                            {formatValue(spent, isFinancial ? effDollarSpent : undefined)}\r\n                          </span>\r\n                          <span className={cn(\"text-[11px]\", isDark ? \"text-white/40\" : \"text-gray-400\")}>/</span>\r\n                          <span className={cn(\"text-[11px]\", isDark ? \"text-white/50\" : \"text-gray-500\")}\r\n                            style={{ fontFamily: 'JetBrains Mono, monospace' }}>\r\n                            {formatValue(allocated, isFinancial ? effDollarAllocated : undefined)}\r\n                          </span>\r\n                        </div>\r\n                        {allocated > 0 && (\r\n                          <span className={cn(\r\n                            \"text-[10px] font-semibold mt-0.5 whitespace-nowrap\",\r\n                            isOver ? \"text-[#FF453A]\" : \"text-[#32D74B]\"\r\n                          )} style={{ fontFamily: 'JetBrains Mono, monospace' }}>\r\n                            {isFinancial ? varianceLabelFinancial : varianceLabel}\r\n                          </span>\r\n                        )}\r\n                      </div>\r\n                    ) : column.type === 'soldEffortMinutes' ? (\r\n                      <span className={cn(\"text-[12px] font-bold\", isDark ? \"text-white\" : \"text-gray-900\")}\r\n                        style={{ fontFamily: 'JetBrains Mono, monospace' }}>\r\n                        {quoted > 0 ? formatValue(quoted, isFinancial ? effDollarQuoted : undefined) : '–'}\r\n                      </span>\r\n                    ) : column.type === 'effortMinutes' ? (() => {\r\n                      // Financial lens: show margin in footer (uses canonical totals when overridden)\r\n                      if (isFinancial && quoted > 0 && allocated > 0) {\r\n                        const offTotal = Math.round(effDollarQuoted);\r\n                        const estTotal = Math.round(effDollarAllocated);\r\n                        const margin = offTotal - estTotal;\r\n                        const marginPct = offTotal > 0 ? Math.round((margin / offTotal) * 100) : 0;\r\n                        return (\r\n                          <div className=\"flex flex-col items-center\">\r\n                            <span className={cn(\"text-[12px] font-bold\", isDark ? \"text-white\" : \"text-gray-900\")}\r\n                              style={{ fontFamily: 'JetBrains Mono, monospace' }}>\r\n                              {formatValue(allocated, effDollarAllocated)}\r\n                            </span>\r\n                            <span className={cn('text-[9px] font-mono font-bold px-1.5 py-0.5 rounded whitespace-nowrap mt-0.5',\r\n                              margin >= 0 ? 'bg-[#064e3b] text-[#10b981] border border-[#065f46]/30' : 'bg-[#451a03] text-[#f59e0b] border border-[#78350f]/30'\r\n                            )}>\r\n                              {margin >= 0 ? '+' : ''}{Math.abs(margin) >= 1000 ? `$${(margin/1000).toFixed(1)}K` : `$${margin}`}\r\n                              <span className=\"ml-0.5 opacity-60\">({marginPct}%)</span>\r\n                            </span>\r\n                          </div>\r\n                        );\r\n                      }\r\n                      return (\r\n                        <span className={cn(\"text-[12px] font-bold\", isDark ? \"text-white\" : \"text-gray-900\")}\r\n                          style={{ fontFamily: 'JetBrains Mono, monospace' }}>\r\n                          {allocated > 0 ? formatValue(allocated, isFinancial ? effDollarAllocated : undefined) : '–'}\r\n                        </span>\r\n                      );\r\n                    })() : column.type === 'timeLoggedMinutes' ? (\r\n                      <span className={cn(\"text-[12px] font-bold\", isDark ? \"text-white\" : \"text-gray-900\")}\r\n                        style={{ fontFamily: 'JetBrains Mono, monospace' }}>\r\n                        {spent > 0 ? formatValue(spent, isFinancial ? effDollarSpent : undefined) : '–'}\r\n                      </span>\r\n                    ) : column.type === 'progress' ? (() => {\r\n                      // Consistent with parent rows: weighted if pesos ≥99%, else simple average\r\n                      const weightedPct = computeWeightedProgress(collectLeaves(tasks || []));\r\n                      return (\r\n                        <span className={cn(\"text-[12px] font-bold font-mono\", isDark ? \"text-[#00E5CC]\" : \"text-[#00C4AE]\")}\r\n                          style={{ fontFamily: 'JetBrains Mono, monospace' }}>\r\n                          {weightedPct}%\r\n                        </span>\r\n                      );\r\n                    })() : column.type === 'weight' ? (() => {\r\n                      const allTasks = tasks || [];\r\n                      const flatAll: any[] = [];\r\n                      const flatten = (list: any[]) => { for (const t of list) { flatAll.push(t); if (t.subtasks?.length) flatten(t.subtasks); } };\r\n                      flatten(allTasks);\r\n                      const leafTasks = flatAll.filter((t: any) => !t.subtasks?.length || t.subtasks.length === 0);\r\n                      const totalWeight = leafTasks.reduce((sum: number, t: any) => sum + (t.weight || 0), 0);\r\n                      const isValid = Math.abs(totalWeight - 100) < 0.1;\r\n                      return (\r\n                        <span className={cn(\"text-[12px] font-bold font-mono\", isValid ? (isDark ? \"text-[#22C55E]\" : \"text-green-600\") : \"text-[#EF4444]\")}\r\n                          style={{ fontFamily: 'JetBrains Mono, monospace' }}>\r\n                          {Number(totalWeight.toFixed(1))}%\r\n                        </span>\r\n                      );\r\n                    })() : (\r\n                      <span className={cn(\"text-[11px]\", isDark ? \"text-white/30\" : \"text-gray-300\")}>–</span>\r\n                    )}\r\n                  </div>\r\n                ))}\r\n                {allowColumnCustomization && (\r\n                  <div className=\"w-12 flex-shrink-0\" />\r\n                )}\r\n              </div>\r\n            );\r\n          })()}\r\n\r\n          {/* Empty search state */}\r\n          {displayTasks.length === 0 && searchQuery && (\r\n            <div className=\"flex items-center justify-center py-12\">\r\n              <div className=\"text-center\">\r\n                <List className={cn(\"w-12 h-12 mx-auto mb-4\", isDark ? \"text-white/30\" : \"text-gray-400\")} />\r\n                <p className={cn(isDark ? \"text-white/60\" : \"text-gray-600\")}>\r\n                  {t.empty.noResults}\r\n                </p>\r\n              </div>\r\n            </div>\r\n          )}\r\n        </div>\r\n      </div>\r\n\r\n      {/* v2.0.0: Project Health Sidebar — v2.3.1: toggle open/close */}\r\n      {healthSidebarWithTotal?.enabled && healthSidebarWithTotal.data && sidebarOpen && (\r\n        <ProjectHealthSidebar\r\n          data={healthSidebarWithTotal.data}\r\n          isDark={isDark}\r\n          locale={locale}\r\n          onClose={() => setSidebarOpen(false)}\r\n          lens={config?.lens}\r\n          onUnassignedTaskClick={(taskId) => {\r\n            // Scroll to the task row and highlight it briefly\r\n            const el = document.querySelector(`[data-task-id=\"${taskId}\"]`);\r\n            if (el) {\r\n              el.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n              setHighlightedTaskId(taskId);\r\n              setTimeout(() => setHighlightedTaskId(null), 2000);\r\n            }\r\n          }}\r\n        />\r\n      )}\r\n      </div>\r\n\r\n      {/* Context Menu */}\r\n      <TableContextMenu\r\n        state={contextMenu}\r\n        onClose={closeContextMenu}\r\n        isDark={isDark}\r\n        locale={locale}\r\n        onTaskEdit={callbacks.onTaskEdit}\r\n        onTaskDuplicate={callbacks.onTaskDuplicate}\r\n        onTaskDelete={callbacks.onTaskDelete}\r\n        onTaskUpdate={callbacks.onTaskUpdate}\r\n        onColumnHide={handleColumnHide}\r\n        onColumnSort={handleColumnSort}\r\n        availableUsers={availableUsers}\r\n        onOpenTimeLog={callbacks.onOpenTimeLog}\r\n        onReportBlocker={callbacks.onReportBlocker}\r\n        onCopyTaskLink={callbacks.onCopyTaskLink}\r\n        onTaskMove={callbacks.onTaskMove}\r\n        onTaskIndent={callbacks.onTaskIndent}\r\n        onTaskOutdent={callbacks.onTaskOutdent}\r\n      />\r\n\r\n      {/* v2.5.0: Drag ghost element */}\r\n      {rowDragging && rowGhostPos && rowDragId && createPortal(\r\n        <div\r\n          style={{\r\n            position: 'fixed',\r\n            left: rowGhostPos.x + 12,\r\n            top: rowGhostPos.y - 10,\r\n            zIndex: 99999,\r\n            pointerEvents: 'none',\r\n          }}\r\n        >\r\n          {(() => {\r\n            const flatAll = ganttUtils.flattenTasks(tasks);\r\n            const draggedTask = flatAll.find(t => t.id === rowDragId);\r\n            return draggedTask ? (\r\n              <div\r\n                className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg\"\r\n                style={{\r\n                  backgroundColor: isDark ? 'rgba(10,10,10,0.9)' : 'rgba(255,255,255,0.95)',\r\n                  border: `1px solid ${isDark ? 'rgba(255,255,255,0.1)' : '#e5e7eb'}`,\r\n                  backdropFilter: 'blur(8px)',\r\n                  boxShadow: '0 4px 12px rgba(0,0,0,0.3)',\r\n                }}\r\n              >\r\n                <GripVertical className=\"w-3 h-3\" style={{ color: '#00E5CC' }} />\r\n                <span className=\"text-xs font-medium\" style={{ color: isDark ? '#e6edf3' : '#111827' }}>\r\n                  {draggedTask.name}\r\n                </span>\r\n              </div>\r\n            ) : null;\r\n          })()}\r\n        </div>,\r\n        document.body\r\n      )}\r\n\r\n      {/* Create Field Modal */}\r\n      <CreateFieldModal\r\n        isOpen={showCreateFieldModal}\r\n        onClose={() => setShowCreateFieldModal(false)}\r\n        onSave={handleCreateCustomField}\r\n        isDark={isDark}\r\n        locale={locale}\r\n      />\r\n    </div>\r\n  );\r\n}\r\n\r\nexport default ListView;\r\n","/**\r\n * ListView Component Types\r\n * @version 0.18.0\r\n *\r\n * v0.18.0: Added dynamic columns, custom fields, context menu support\r\n */\r\n\r\nimport type { ReactNode } from 'react';\r\nimport type { Task } from '../Gantt/types';\r\nimport type { User } from '../../types';\r\n\r\n/**\r\n * Sort direction for list columns\r\n */\r\nexport type SortDirection = 'asc' | 'desc';\r\n\r\n/**\r\n * Column types supported in ListView\r\n * - Standard: name, status, priority, assignees, startDate, endDate, progress, tags, estimatedTime, quotedTime, elapsedTime\r\n * - v1.2.0: effortMinutes, timeLoggedMinutes, soldEffortMinutes\r\n * - Custom: text, number, date, dropdown, checkbox\r\n */\r\nexport type ColumnType =\r\n  | 'name'           // Task name (always visible, first column)\r\n  | 'status'         // Todo/In Progress/Completed\r\n  | 'priority'       // Urgent/High/Medium/Low\r\n  | 'assignees'      // Assigned users\r\n  | 'startDate'      // Start date\r\n  | 'endDate'        // End date / Due date\r\n  | 'progress'       // Progress percentage\r\n  | 'tags'           // Task tags/labels\r\n  | 'estimatedTime'  // Estimated time in minutes (v0.18.3)\r\n  | 'quotedTime'     // Quoted time in minutes (v1.1.0)\r\n  | 'elapsedTime'    // Elapsed/spent time in minutes (v0.18.3)\r\n  // v1.2.0: Three-tier time tracking\r\n  | 'effortMinutes'      // Effort estimate in minutes (technical goal)\r\n  | 'timeLoggedMinutes'  // Time logged in minutes (auto-calculated)\r\n  | 'soldEffortMinutes'  // Sold/quoted effort in minutes (client facing)\r\n  // v2.0.0: Chronos Interactive Time Manager columns\r\n  | 'scheduleVariance'    // Schedule dates + variance badge\r\n  | 'hoursBar'            // Visual hours bar (spent/allocated) + Log button\r\n  | 'teamLoad'            // Avatar + team name + load badge\r\n  | 'blockers'            // Blocker badges (RFI, Pending, etc.)\r\n  // v2.1.0: Weight column for weighted progress\r\n  | 'weight'              // Task weight percentage (for weighted project progress)\r\n  // Custom field types\r\n  | 'text'           // Custom text field\r\n  | 'number'         // Custom number field\r\n  | 'date'           // Custom date field\r\n  | 'dropdown'       // Custom dropdown/select\r\n  | 'checkbox'       // Custom checkbox/boolean\r\n  // v1.9.24: the three custom field types that needed a cell of their own\r\n  | 'multiselect'    // Custom multi-option field\r\n  | 'person'         // Custom person field (reuses AssigneesCell)\r\n  | 'file';          // Custom file field (shows and opens; upload lives in the panel)\r\n\r\n/**\r\n * Table column configuration for dynamic columns\r\n */\r\nexport interface TableColumn {\r\n  /** Unique column identifier */\r\n  id: string;\r\n  /** Column type */\r\n  type: ColumnType;\r\n  /** Display label */\r\n  label: string;\r\n  /** Column width in pixels */\r\n  width: number;\r\n  /** Minimum width */\r\n  minWidth?: number;\r\n  /** Maximum width */\r\n  maxWidth?: number;\r\n  /** Is column visible */\r\n  visible: boolean;\r\n  /** Can be sorted */\r\n  sortable?: boolean;\r\n  /** Can be resized */\r\n  resizable?: boolean;\r\n  /** For custom fields - reference to field definition */\r\n  customFieldId?: string;\r\n  /** v1.9.24: for multiselect - cap on how many options can be picked */\r\n  maxSelectable?: number;\r\n  /** For dropdown type - available options */\r\n  options?: string[];\r\n}\r\n\r\n/**\r\n * Custom field definition for user-created fields\r\n */\r\nexport interface CustomFieldDefinition {\r\n  /** Unique field ID */\r\n  id: string;\r\n  /** Field display name */\r\n  name: string;\r\n  /** Field type */\r\n  type: 'text' | 'number' | 'date' | 'dropdown' | 'checkbox';\r\n  /** Options for dropdown type */\r\n  options?: string[];\r\n  /** Default value */\r\n  defaultValue?: string | number | boolean | Date;\r\n  /** Is field required */\r\n  required?: boolean;\r\n  /** Project this field belongs to */\r\n  projectId?: string;\r\n}\r\n\r\n/**\r\n * Custom field value stored on task\r\n */\r\nexport interface CustomFieldValue {\r\n  fieldId: string;\r\n  value: string | number | boolean | Date | null;\r\n}\r\n\r\n/**\r\n * Context menu action types\r\n */\r\nexport type ContextMenuAction =\r\n  | 'edit'\r\n  | 'changeStatus'\r\n  | 'changePriority'\r\n  | 'assignUser'\r\n  | 'duplicate'\r\n  | 'delete'\r\n  | 'sortAsc'\r\n  | 'sortDesc'\r\n  | 'hideColumn'\r\n  | 'moveLeft'\r\n  | 'moveRight';\r\n\r\n/**\r\n * Context menu state\r\n */\r\nexport interface ContextMenuState {\r\n  isOpen: boolean;\r\n  x: number;\r\n  y: number;\r\n  type: 'task' | 'header';\r\n  task?: Task;\r\n  columnId?: string;\r\n}\r\n\r\n/**\r\n * Sortable columns in the list view\r\n * @deprecated Use ColumnType instead\r\n */\r\nexport type ListSortColumn =\r\n  | 'name'\r\n  | 'startDate'\r\n  | 'endDate'\r\n  | 'progress'\r\n  | 'status'\r\n  | 'assignees'\r\n  | 'priority';\r\n\r\n/**\r\n * Sort configuration\r\n */\r\nexport interface ListSort {\r\n  column: ListSortColumn;\r\n  direction: SortDirection;\r\n}\r\n\r\n/**\r\n * Filter configuration for list view\r\n */\r\nexport interface ListFilter {\r\n  search?: string;\r\n  status?: Array<'todo' | 'in-progress' | 'completed'>;\r\n  assignees?: string[];\r\n  dateRange?: {\r\n    start: Date;\r\n    end: Date;\r\n  };\r\n  showCompleted?: boolean;\r\n}\r\n\r\n/**\r\n * Column configuration for list view\r\n */\r\nexport interface ListColumn {\r\n  id: ListSortColumn | 'actions';\r\n  label: string;\r\n  width: number;\r\n  minWidth?: number;\r\n  maxWidth?: number;\r\n  visible: boolean;\r\n  sortable: boolean;\r\n  resizable?: boolean;\r\n}\r\n\r\n/**\r\n * Theme configuration for list view\r\n */\r\nexport interface ListViewTheme {\r\n  // Backgrounds\r\n  bgPrimary: string;\r\n  bgSecondary: string;\r\n  bgHover: string;\r\n  bgSelected: string;\r\n  bgAlternate: string;\r\n\r\n  // Borders\r\n  border: string;\r\n  borderLight: string;\r\n\r\n  // Text\r\n  textPrimary: string;\r\n  textSecondary: string;\r\n  textMuted: string;\r\n\r\n  // Accent colors\r\n  accent: string;\r\n  accentHover: string;\r\n  accentLight: string;\r\n\r\n  // Status colors\r\n  statusTodo: string;\r\n  statusInProgress: string;\r\n  statusCompleted: string;\r\n\r\n  // Interactive\r\n  focusRing: string;\r\n  checkboxBg: string;\r\n  checkboxChecked: string;\r\n\r\n  // Chronos V2.0 extended tokens\r\n  bgGroupHeader: string;\r\n  headerBg: string;\r\n  neonRed: string;\r\n  neonGreen: string;\r\n  neonAmber: string;\r\n  neonBlue: string;\r\n}\r\n\r\n/**\r\n * Permissions for list view operations\r\n */\r\nexport interface ListViewPermissions {\r\n  canCreateTask?: boolean;\r\n  /** v1.4.10: When true, user can only create subtasks (not root-level tasks) */\r\n  canCreateSubtaskOnly?: boolean;\r\n  canUpdateTask?: boolean;\r\n  canDeleteTask?: boolean;\r\n  canBulkSelect?: boolean;\r\n  canExport?: boolean;\r\n  canSort?: boolean;\r\n  canFilter?: boolean;\r\n  canReorder?: boolean;\r\n}\r\n\r\n/**\r\n * v2.0.0: Project Health data for sidebar panel\r\n */\r\nexport interface ProjectHealthData {\r\n  openRFIs?: number;\r\n  submittalsApprovalPercent?: number;\r\n  scheduleVarianceDays?: number;\r\n  scheduleVarianceLabel?: string;\r\n  teams?: Array<{ name: string; color: string; utilizationPercent: number }>;\r\n  /** Total hours for the whole project (spent / allocated in minutes) */\r\n  totalHoursSpentMinutes?: number;\r\n  totalHoursAllocatedMinutes?: number;\r\n  /** Count of tasks with no assignees and progress < 100% */\r\n  unassignedCount?: number;\r\n  /** Unassigned tasks (id + name for detail display + click-to-scroll in sidebar) */\r\n  unassignedTasks?: Array<{ id: string; name: string }>;\r\n  /** Financial data — shown when lens='financial' */\r\n  totalOffered?: number;       // Total $ ofertado (sum of sold_effort × offered_rate)\r\n  totalEstimated?: number;     // v2.6.0: Total $ estimado = labor + equipment + travel\r\n  /** v2.6.0 — Labor-only portion of the estimated cost (for breakdown tooltip) */\r\n  totalEstimatedLabor?: number;\r\n  /** v2.6.0 — Equipment portion of the estimated cost (for breakdown tooltip) */\r\n  totalEstimatedEquipment?: number;\r\n  /** v2.6.0 — Travel/per-diem portion of the estimated cost (for breakdown tooltip) */\r\n  totalEstimatedTravel?: number;\r\n  totalExecuted?: number;      // Total $ ejecutado (sum of logged × rate_at_time)\r\n  /** v2.6.0 — Labor-only portion of the executed cost (for breakdown tooltip) */\r\n  totalExecutedLabor?: number;\r\n  /** v2.6.0 — Equipment portion of the executed cost (for breakdown tooltip) */\r\n  totalExecutedEquipment?: number;\r\n  /** v2.6.0 — Travel/per-diem portion of the executed cost (for breakdown tooltip) */\r\n  totalExecutedTravel?: number;\r\n  offeredRate?: number;        // $/hora ofertada del proyecto\r\n}\r\n\r\n/**\r\n * ListView configuration\r\n */\r\nexport interface ListViewConfig {\r\n  /**\r\n   * v1.9.25 — Hide financial indicators entirely, not just blur them.\r\n   *\r\n   * Mesh (the simplified product) must not show ANY financial term: not a\r\n   * budget, not a margin, and not an SPI badge either. Blurring is not enough\r\n   * — the label «Avg SPI» IS the problem, whatever the number reads.\r\n   *\r\n   * Defaults to true so existing consumers keep the badge they have.\r\n   */\r\n  mostrarIndicadoresFinancieros?: boolean;\r\n\r\n  /**\r\n   * v1.9.27 — ¿se OFRECEN las columnas densas en el selector?\r\n   *\r\n   * Estimado, ejecutado, ofertado y peso. Va aparte de\r\n   * `mostrarIndicadoresFinancieros` A PROPOSITO: son DOS MOTIVOS DISTINTOS.\r\n   * Lo financiero se esconde por CONFIDENCIALIDAD; estas por SIMPLICIDAD —una\r\n   * lista con cuatro columnas de minutos deja de leerse—. Un cliente podria\r\n   * querer una cosa sin la otra.\r\n   *\r\n   * Por defecto `true`: no cambia a quien ya lo usaba.\r\n   */\r\n  mostrarColumnasDensas?: boolean;\r\n\r\n  /** Theme: 'dark' | 'light' | 'neutral' */\r\n  theme?: 'dark' | 'light' | 'neutral';\r\n  /** Locale for i18n */\r\n  locale?: 'en' | 'es' | string;\r\n  /** Custom translations */\r\n  customTranslations?: Partial<ListViewTranslations>;\r\n  /** Enable row selection */\r\n  enableSelection?: boolean;\r\n  /** Enable multi-select with checkboxes */\r\n  enableMultiSelect?: boolean;\r\n  /** Show search bar */\r\n  showSearch?: boolean;\r\n  /** Show filters */\r\n  showFilters?: boolean;\r\n  /** Show hierarchy indentation */\r\n  showHierarchy?: boolean;\r\n  /** Columns to display (legacy) */\r\n  columns?: ListColumn[];\r\n  /** Row height in pixels */\r\n  rowHeight?: number;\r\n  /** Available users for filtering */\r\n  availableUsers?: User[];\r\n  /** Permissions */\r\n  permissions?: ListViewPermissions;\r\n  /** Enable virtual scrolling for large lists */\r\n  enableVirtualization?: boolean;\r\n  /** Items per page (0 = no pagination) */\r\n  pageSize?: number;\r\n\r\n  // v0.18.0: New column customization options\r\n  /** Dynamic table columns configuration */\r\n  tableColumns?: TableColumn[];\r\n  /** Allow user to add/remove/reorder columns via \"+\" button */\r\n  allowColumnCustomization?: boolean;\r\n  /** Allow user to resize columns by dragging */\r\n  allowColumnResize?: boolean;\r\n  /** Enable context menu on right-click */\r\n  enableContextMenu?: boolean;\r\n\r\n  // v0.18.0: Create task button (same as Gantt and Calendar)\r\n  /** Show create task button in toolbar */\r\n  showCreateTaskButton?: boolean;\r\n  /** Callback when create task button is clicked */\r\n  onCreateTask?: () => void;\r\n\r\n  // v0.18.3: Persist filter state in localStorage\r\n  /** LocalStorage key for persisting filter state, or false to disable */\r\n  persistFilter?: string | false;\r\n\r\n  // v2.0.0: Chronos project health sidebar\r\n  /** Configuration for project health sidebar panel */\r\n  healthSidebar?: { enabled: boolean; data: ProjectHealthData };\r\n  /** Aggregate child hours into parent row hoursBar cell (default: false) */\r\n  aggregateParentHours?: boolean;\r\n\r\n  // v1.4.9: Governance v2.0 - Financial data blur\r\n  /**\r\n   * Configuration for blurring financial data based on user permissions\r\n   * When enabled, financial columns (soldEffortMinutes, quotedTime) will be blurred\r\n   */\r\n  financialBlur?: {\r\n    /** Whether to blur financial time columns */\r\n    enabled: boolean;\r\n    /** Specific columns to blur (defaults to ['soldEffortMinutes', 'quotedTime'] if not specified) */\r\n    columns?: Array<'soldEffortMinutes' | 'quotedTime' | 'quotedTimeMinutes'>;\r\n  };\r\n\r\n  // v2.2.1: Show \"Ofertado: Xh\" line in HoursBarCell for users who can view but not edit financials\r\n  /** When true, shows the sold effort line in HoursBarCell even without onSoldEffortUpdate callback */\r\n  showSoldEffort?: boolean;\r\n\r\n  // v2.3.0: Financial lens — show dollar values instead of hours\r\n  /** Display mode: 'hours' shows time values, 'financial' converts to dollars (hours × hourlyRate) */\r\n  lens?: 'hours' | 'financial';\r\n  /** Hourly rate for converting hours → dollars when lens='financial' (fallback when rateMap has no match) */\r\n  hourlyRate?: number;\r\n  /** Per-user hourly rate map (userId → rate). When provided, uses the task assignee's rate instead of the global hourlyRate */\r\n  rateMap?: Record<string, number>;\r\n\r\n  // v2.4.0: Project totals sticky footer row\r\n  /** Show a sticky \"TOTAL PROJECT\" row at the bottom of the list */\r\n  showProjectTotals?: boolean;\r\n\r\n  /**\r\n   * v2.5.2: Canonical dollar totals override for the TOTAL PROJECT footer.\r\n   * When provided, replaces the internally-computed dollar totals (which\r\n   * multiply task.timeLoggedMinutes by current assignee rates) with the\r\n   * consumer's authoritative figures — typically sourced from time_logs ×\r\n   * rate_at_time. Lets the footer stay in sync with the Portfolio view\r\n   * and the financial health sidebar, which use frozen per-log rates.\r\n   * Hours totals (spent/allocated/quoted in minutes) remain computed\r\n   * internally from the rendered task tree.\r\n   */\r\n  totalsDollarOverride?: {\r\n    spent?: number;\r\n    allocated?: number;\r\n    quoted?: number;\r\n    /**\r\n     * Optional breakdown of the override totals into their components so the\r\n     * footer can surface a tooltip explaining why the TOTAL differs from the\r\n     * sum of the visible phase rows (which only count labor).\r\n     * - labor: Σ(task minutes × rate) — the portion the phase rows show\r\n     * - equipment / travel: committed project-level costs not tied to tasks\r\n     */\r\n    breakdown?: {\r\n      laborSpent?: number;\r\n      laborAllocated?: number;\r\n      equipment?: number;\r\n      travel?: number;\r\n    };\r\n  };\r\n\r\n  /** v2.5.0: Render content just before the Create Task button (e.g., share/export dropdown) */\r\n  toolbarEndContent?: ReactNode;\r\n  /**\r\n   * 1.9.34 · Pinta la barra de herramientas DENTRO de este elemento (por\r\n   * portal) y en versión compacta: sin buscador (lo hace el de la app) ni\r\n   * botón de crear. Para cabeceras de una sola fila.\r\n   */\r\n  toolbarContainer?: HTMLElement | null;\r\n  /**\r\n   * 1.9.38 · la app decide qué es «vencida» (su zona, su regla de terminada).\r\n   * Con ella, la fecha de fin vencida sale en rojo con icono y la celda lleva\r\n   * `data-vencida`. Sin ella, nada cambia.\r\n   */\r\n  isTaskOverdue?: (task: Task) => boolean;\r\n  /** 1.9.38 · cómo se ve una completada: 'strike' (tachada, por defecto) o 'dim' (atenuada, sin tachar). */\r\n  completedStyle?: 'strike' | 'dim';\r\n  /** 1.9.38 · 'compact': filas de una línea y 40 px; 'comfortable' (por defecto) las de dos líneas y 56 px. */\r\n  rowDensity?: 'comfortable' | 'compact';\r\n  /**\r\n   * 1.9.39 · `false` quita el botón «Filters» (estado / ocultar completadas) de\r\n   * la barra, para la app que tiene su propio sistema de filtros. Por defecto se pinta.\r\n   */\r\n  showStatusFilter?: boolean;\r\n  /**\r\n   * 1.9.40 · 'status' agrupa las tareas raíz en To do · In progress · Completed\r\n   * (las subtareas van con su padre); dentro, por fin ascendente. Por defecto, sin agrupar.\r\n   */\r\n  groupBy?: 'none' | 'status' | 'assignee' | 'due';\r\n  /**\r\n   * 1.9.44 · con groupBy 'due', a qué grupo va cada tarea. La regla la pone la app\r\n   * (la de vencida del Overview). Sin ella, todas caen en 'none' (Sin fecha).\r\n   */\r\n  dueBucket?: (task: Task) => 'overdue' | 'today' | 'week' | 'later' | 'past' | 'none';\r\n  /** 1.9.40 · grupos plegados al empezar (por defecto ['completed']). */\r\n  defaultCollapsedGroups?: string[];\r\n  /** 1.9.40 · si se da, qué grupos están plegados se recuerda en localStorage con esta clave. */\r\n  groupStateKey?: string;\r\n  /** 1.9.41 · una casilla por fila y Shift+clic para un rango; avisa con callbacks.onSelectionChange. */\r\n  selectable?: boolean;\r\n  /** 1.9.41 · selección controlada por la app (p. ej. para vaciarla tras una acción en masa). */\r\n  selectedIds?: string[];\r\n}\r\n\r\n/**\r\n * ListView translations\r\n */\r\nexport interface ListViewTranslations {\r\n  // Column headers\r\n  columns: {\r\n    name: string;\r\n    startDate: string;\r\n    endDate: string;\r\n    progress: string;\r\n    status: string;\r\n    assignees: string;\r\n    priority: string;\r\n    actions: string;\r\n    // v0.18.3: Time tracking columns\r\n    estimatedTime?: string;\r\n    // v1.1.0: Quoted time column\r\n    quotedTime?: string;\r\n    elapsedTime?: string;\r\n    tags?: string;\r\n    // v2.0.0: Chronos columns\r\n    scheduleVariance?: string;\r\n    hoursBar?: string;\r\n    teamLoad?: string;\r\n    blockers?: string;\r\n    weight?: string;\r\n  };\r\n\r\n  // Toolbar\r\n  toolbar: {\r\n    search: string;\r\n    searchPlaceholder: string;\r\n    filter: string;\r\n    clearFilters: string;\r\n    export: string;\r\n    columns: string;\r\n    newTask: string;\r\n  };\r\n\r\n  // Filters\r\n  filters: {\r\n    status: string;\r\n    assignees: string;\r\n    dateRange: string;\r\n    showCompleted: string;\r\n    all: string;\r\n    none: string;\r\n  };\r\n\r\n  // Status labels\r\n  status: {\r\n    todo: string;\r\n    inProgress: string;\r\n    completed: string;\r\n  };\r\n\r\n  // Actions\r\n  actions: {\r\n    edit: string;\r\n    delete: string;\r\n    duplicate: string;\r\n    viewDetails: string;\r\n  };\r\n\r\n  // Empty states\r\n  empty: {\r\n    noTasks: string;\r\n    noResults: string;\r\n    addFirstTask: string;\r\n  };\r\n\r\n  // Pagination\r\n  pagination: {\r\n    showing: string;\r\n    of: string;\r\n    tasks: string;\r\n    previous: string;\r\n    next: string;\r\n  };\r\n\r\n  // Bulk actions\r\n  bulk: {\r\n    selected: string;\r\n    delete: string;\r\n    move: string;\r\n    assignTo: string;\r\n  };\r\n}\r\n\r\n/**\r\n * Callback functions for ListView\r\n */\r\nexport interface ListViewCallbacks {\r\n  /** Task click handler */\r\n  onTaskClick?: (task: Task) => void;\r\n  /** Task double-click handler */\r\n  onTaskDoubleClick?: (task: Task) => void;\r\n  /** Task update handler */\r\n  onTaskUpdate?: (task: Task) => void;\r\n  /** Task delete handler */\r\n  onTaskDelete?: (taskId: string) => void;\r\n  /** Task create handler */\r\n  onTaskCreate?: (parentId?: string) => void;\r\n  /** Bulk delete handler */\r\n  onBulkDelete?: (taskIds: string[]) => void;\r\n  /** Sort change handler */\r\n  onSortChange?: (sort: ListSort) => void;\r\n  /** Filter change handler */\r\n  onFilterChange?: (filter: ListFilter) => void;\r\n  /** Selection change handler */\r\n  onSelectionChange?: (selectedIds: string[]) => void;\r\n  /** Row expand/collapse handler */\r\n  onTaskToggleExpand?: (taskId: string) => void;\r\n  /** Export handler */\r\n  onExport?: (format: 'csv' | 'json' | 'excel') => void;\r\n\r\n  // v0.18.0: New callbacks for column customization and context menu\r\n  /** Columns configuration changed (visibility, order, width) */\r\n  onColumnsChange?: (columns: TableColumn[]) => void;\r\n  /** Task edit requested (from context menu) */\r\n  onTaskEdit?: (task: Task) => void;\r\n  /** Task duplicate requested (from context menu) */\r\n  onTaskDuplicate?: (task: Task) => void;\r\n  /** v2.5.0: Move task up in hierarchy */\r\n  onTaskMove?: (taskId: string, direction: 'up' | 'down') => void;\r\n  /** v2.5.0: Indent task (make it a subtask of the task above) */\r\n  onTaskIndent?: (taskId: string) => void;\r\n  /** v2.5.0: Outdent task (move it up one hierarchy level) */\r\n  onTaskOutdent?: (taskId: string) => void;\r\n  /** v2.5.0: Reparent task (drag & drop to make subtask or reorder) */\r\n  onTaskReparent?: (taskId: string, newParentId: string | null, position?: number) => void;\r\n  /** Create custom field */\r\n  onCreateCustomField?: (field: CustomFieldDefinition) => Promise<void>;\r\n\r\n  // v1.3.0: Time logging callback for timeLoggedMinutes column (inline edit)\r\n  /** Handler for inline time logging - receives task, minutes, and optional note */\r\n  onLogTime?: (task: Task, minutes: number | null, note?: string) => void;\r\n\r\n  // v2.0.0: Chronos Time Manager callback\r\n  /** Handler for opening time log modal from HoursBar cell */\r\n  onOpenTimeLog?: (task: Task) => void;\r\n\r\n  // v2.2.0: Inline estimate & quoted effort editing from HoursBar 3-option menu\r\n  /** Handler for updating task effort estimate (minutes) */\r\n  onEstimateUpdate?: (task: Task, minutes: number | null) => void;\r\n  /** Handler for updating task sold/quoted effort (minutes) */\r\n  onSoldEffortUpdate?: (task: Task, minutes: number | null) => void;\r\n\r\n  // v2.1.0: RBAC context menu actions\r\n  /** Handler for reporting a blocker on a task */\r\n  onReportBlocker?: (task: Task) => void;\r\n  /** Handler for copying task link to clipboard */\r\n  onCopyTaskLink?: (task: Task) => void;\r\n  /** Drag-fill (Excel-style): a value dragged from one cell was applied to\r\n   *  many tasks at once.\r\n   *\r\n   *  `column` is either a built-in task property name or, since v1.9.28, a\r\n   *  `{ kind: 'customField', fieldId }` descriptor. The two are NOT\r\n   *  interchangeable: a built-in one names a property of the task, while a\r\n   *  custom field's value lives outside the task (in the host's own store), so\r\n   *  the host must persist it by its own route. Handlers written before 1.9.28\r\n   *  only knew the string form — check `typeof column === 'string'` before\r\n   *  treating it as a property name. */\r\n  onBulkFill?: (\r\n    taskIds: string[],\r\n    column: FillColumn,\r\n    value: any,\r\n  ) => void;\r\n}\r\n\r\n/**\r\n * Qué columna se está rellenando en un arrastre (v1.9.28).\r\n *\r\n * Las de la izquierda son propiedades de la tarea; la de la derecha NO lo es\r\n * — el valor de un campo personalizado vive fuera del objeto `Task`, así que\r\n * el anfitrión tiene que guardarlo por su propia ruta.\r\n */\r\nexport type FillColumn =\r\n  | 'assignees'\r\n  | 'startDate'\r\n  | 'endDate'\r\n  | { kind: 'customField'; fieldId: string };\r\n\r\n/**\r\n * Available user for assignment\r\n */\r\nexport interface AvailableUser {\r\n  id: string;\r\n  name: string;\r\n  email?: string;\r\n  avatarUrl?: string;\r\n  color?: string;\r\n  /** v1.4.0: Workload indicator for Smart Dropdown */\r\n  workload?: UserWorkload;\r\n}\r\n\r\n/**\r\n * v1.4.0: User workload indicator for Smart Dropdown\r\n * Shows user capacity in the assignment dropdown\r\n */\r\nexport interface UserWorkload {\r\n  /** Total hours assigned this week */\r\n  assignedHoursThisWeek: number;\r\n  /** Total hours capacity per week (typically 40) */\r\n  weeklyCapacity: number;\r\n  /** Number of active tasks assigned */\r\n  activeTasks: number;\r\n  /** Workload level for visual indicator */\r\n  level: 'light' | 'moderate' | 'heavy' | 'overloaded';\r\n}\r\n\r\n/**\r\n * Main ListView props\r\n */\r\nexport interface ListViewProps {\r\n  /** Tasks to display */\r\n  tasks: Task[];\r\n  /** Configuration */\r\n  config?: ListViewConfig;\r\n  /** Callbacks */\r\n  callbacks?: ListViewCallbacks;\r\n  /** Loading state */\r\n  isLoading?: boolean;\r\n  /** Error state */\r\n  error?: Error | string;\r\n  /** Custom CSS class */\r\n  className?: string;\r\n  /** Inline styles */\r\n  style?: React.CSSProperties;\r\n\r\n  // v0.18.0: New props for column customization\r\n  /** Available users for assignment in context menu */\r\n  availableUsers?: AvailableUser[];\r\n  /** Custom fields defined for this project */\r\n  customFields?: CustomFieldDefinition[];\r\n\r\n  // v2.1.0: Toolbar customization\r\n  /** Render custom content on the right side of toolbar (before create button) */\r\n  toolbarRightContent?: ReactNode;\r\n  /** v2.5.0: Render content just before the Create Task button (e.g., share/export dropdown) */\r\n  toolbarEndContent?: ReactNode;\r\n  /**\r\n   * 1.9.34 · Pinta la barra de herramientas DENTRO de este elemento (por\r\n   * portal) y en versión compacta: sin buscador (lo hace el de la app) ni\r\n   * botón de crear. Para cabeceras de una sola fila.\r\n   */\r\n  toolbarContainer?: HTMLElement | null;\r\n\r\n  // v1.8.0: Column header actions (Linear/Airtable pattern)\r\n  /**\r\n   * Fires when the user clicks anywhere on a column header. The consumer\r\n   * renders its own dropdown (Sort + Filter + Hide) anchored to `anchorRect`.\r\n   * If unset, the header keeps the legacy behavior (click on the sort icon\r\n   * cycles asc/desc/clear).\r\n   */\r\n  onColumnHeaderClick?: (columnId: string, anchorRect: DOMRect) => void;\r\n  /**\r\n   * IDs of columns that currently have an active filter applied. Each one\r\n   * gets a small accent dot rendered next to its label.\r\n   */\r\n  columnsWithFilter?: string[];\r\n  /**\r\n   * Color (hex / CSS) of the dot rendered for filtered columns. Defaults\r\n   * to the brand cyan #00E5CC so consumers don't have to think about it.\r\n   */\r\n  filterDotColor?: string;\r\n}\r\n\r\n/**\r\n * Flattened task with hierarchy info\r\n */\r\nexport interface FlattenedTask extends Task {\r\n  level: number;\r\n  hasChildren: boolean;\r\n  parentPath: string[];\r\n}\r\n\r\n/**\r\n * Default columns configuration\r\n * Used when no tableColumns are provided\r\n */\r\nexport const DEFAULT_TABLE_COLUMNS: TableColumn[] = [\r\n  { id: 'name', type: 'name', label: 'Name', width: 300, visible: true, sortable: true, resizable: true },\r\n  { id: 'status', type: 'status', label: 'Status', width: 140, visible: true, sortable: true, resizable: true },\r\n  { id: 'priority', type: 'priority', label: 'Priority', width: 100, visible: false, sortable: true, resizable: true },\r\n  // v2.5.0: 'assignees' removed — redundant with 'teamLoad' (Equipo)\r\n  { id: 'startDate', type: 'startDate', label: 'Start Date', width: 120, visible: true, sortable: true, resizable: true },\r\n  { id: 'endDate', type: 'endDate', label: 'End Date', width: 120, visible: true, sortable: true, resizable: true },\r\n  { id: 'progress', type: 'progress', label: 'Progress', width: 100, visible: true, sortable: true, resizable: true },\r\n  { id: 'tags', type: 'tags', label: 'Tags', width: 150, visible: false, sortable: false, resizable: true },\r\n  // v1.2.0: Three-tier time tracking columns — order: Quoted → Estimated → Executed\r\n  { id: 'soldEffortMinutes', type: 'soldEffortMinutes', label: 'Quoted', width: 100, visible: false, sortable: true, resizable: true },\r\n  { id: 'effortMinutes', type: 'effortMinutes', label: 'Estimated', width: 100, visible: false, sortable: true, resizable: true },\r\n  { id: 'timeLoggedMinutes', type: 'timeLoggedMinutes', label: 'Executed', width: 100, visible: false, sortable: true, resizable: true },\r\n  // v2.0.0: Chronos Interactive Time Manager columns\r\n  { id: 'scheduleVariance', type: 'scheduleVariance', label: 'Sched / Var', width: 180, visible: false, sortable: true, resizable: true },\r\n  { id: 'hoursBar', type: 'hoursBar', label: 'Hours', width: 200, visible: false, sortable: true, resizable: true },\r\n  { id: 'teamLoad', type: 'teamLoad', label: 'Team Load', width: 160, visible: false, sortable: true, resizable: true },\r\n  { id: 'blockers', type: 'blockers', label: 'Blockers', width: 150, visible: false, sortable: false, resizable: true },\r\n  // v2.1.0: Weight column\r\n  { id: 'weight', type: 'weight', label: 'Weight', width: 80, visible: false, sortable: true, resizable: true },\r\n];\r\n\r\n/**\r\n * Standard field definitions (non-custom)\r\n * Used in column selector to show available fields\r\n */\r\nexport const STANDARD_FIELDS: Array<{ type: ColumnType; labelKey: string; icon: string }> = [\r\n  { type: 'name', labelKey: 'columns.name', icon: 'Type' },\r\n  { type: 'status', labelKey: 'columns.status', icon: 'CircleDot' },\r\n  { type: 'priority', labelKey: 'columns.priority', icon: 'Flag' },\r\n  { type: 'assignees', labelKey: 'columns.assignees', icon: 'Users' },\r\n  { type: 'startDate', labelKey: 'columns.startDate', icon: 'Calendar' },\r\n  { type: 'endDate', labelKey: 'columns.endDate', icon: 'CalendarCheck' },\r\n  { type: 'progress', labelKey: 'columns.progress', icon: 'BarChart' },\r\n  { type: 'tags', labelKey: 'columns.tags', icon: 'Tag' },\r\n  // v1.2.0: Three-tier time tracking fields (replaces old estimatedTime/quotedTime/elapsedTime)\r\n  { type: 'effortMinutes', labelKey: 'columns.effortMinutes', icon: 'Clock' },\r\n  { type: 'timeLoggedMinutes', labelKey: 'columns.timeLoggedMinutes', icon: 'Timer' },\r\n  { type: 'soldEffortMinutes', labelKey: 'columns.soldEffortMinutes', icon: 'FileText' },\r\n  // v2.0.0: Chronos Interactive Time Manager fields\r\n  { type: 'scheduleVariance', labelKey: 'columns.scheduleVariance', icon: 'CalendarClock' },\r\n  { type: 'hoursBar', labelKey: 'columns.hoursBar', icon: 'BarChart3' },\r\n  { type: 'teamLoad', labelKey: 'columns.teamLoad', icon: 'Users' },\r\n  { type: 'blockers', labelKey: 'columns.blockers', icon: 'AlertTriangle' },\r\n  // v2.1.0: Weight\r\n  { type: 'weight', labelKey: 'columns.weight', icon: 'Scale' },\r\n];\r\n\r\n/**\r\n * Custom field type definitions\r\n * Used in \"Create Field\" modal\r\n */\r\nexport const CUSTOM_FIELD_TYPES: Array<{ type: CustomFieldDefinition['type']; labelKey: string; icon: string }> = [\r\n  { type: 'text', labelKey: 'customFields.text', icon: 'Type' },\r\n  { type: 'number', labelKey: 'customFields.number', icon: 'Hash' },\r\n  { type: 'date', labelKey: 'customFields.date', icon: 'Calendar' },\r\n  { type: 'dropdown', labelKey: 'customFields.dropdown', icon: 'ChevronDown' },\r\n  { type: 'checkbox', labelKey: 'customFields.checkbox', icon: 'CheckSquare' },\r\n];\r\n","/**\r\n * ListView Themes\r\n * @version 2.0.0 — Chronos V2.0 visual language\r\n */\r\n\r\nimport type { ListViewTheme } from './types';\r\n\r\n/**\r\n * Dark theme for ListView — Chronos V2.0\r\n */\r\nexport const darkTheme: ListViewTheme = {\r\n  // Backgrounds\r\n  bgPrimary: '#0D0D0D',\r\n  bgSecondary: '#141414',\r\n  bgHover: 'rgba(255,255,255,0.05)',\r\n  bgSelected: '#0D131E',\r\n  bgAlternate: '#141414',\r\n\r\n  // Borders\r\n  border: '#222222',\r\n  borderLight: '#1A1A1A',\r\n\r\n  // Text\r\n  textPrimary: 'rgba(255,255,255,0.9)',\r\n  textSecondary: 'rgba(255,255,255,0.6)',\r\n  textMuted: 'rgba(255,255,255,0.3)',\r\n\r\n  // Accent colors\r\n  accent: '#00E5CC',\r\n  accentHover: '#2979FF',\r\n  accentLight: 'rgba(0,123,255,0.15)',\r\n\r\n  // Status colors\r\n  statusTodo: 'rgba(255,255,255,0.4)',\r\n  statusInProgress: '#00E5CC',\r\n  statusCompleted: '#34D399',\r\n\r\n  // Interactive\r\n  focusRing: '#00E5CC',\r\n  checkboxBg: '#1A1A1A',\r\n  checkboxChecked: '#00E5CC',\r\n\r\n  // Chronos V2.0 extended tokens\r\n  bgGroupHeader: '#222222',\r\n  headerBg: '#1A1A1A',\r\n  neonRed: '#FF2D20',\r\n  neonGreen: '#3BF06E',\r\n  neonAmber: '#FFD60A',\r\n  neonBlue: '#3B9EFF',\r\n};\r\n\r\n/**\r\n * Light theme for ListView\r\n */\r\nexport const lightTheme: ListViewTheme = {\r\n  // Backgrounds\r\n  bgPrimary: '#ffffff',\r\n  bgSecondary: '#f6f8fa',\r\n  bgHover: '#f3f4f6',\r\n  bgSelected: '#dbeafe',\r\n  bgAlternate: '#f9fafb',\r\n\r\n  // Borders\r\n  border: '#d0d7de',\r\n  borderLight: '#e5e7eb',\r\n\r\n  // Text\r\n  textPrimary: '#24292f',\r\n  textSecondary: '#57606a',\r\n  textMuted: '#8b949e',\r\n\r\n  // Accent colors\r\n  accent: '#0969da',\r\n  accentHover: '#0550ae',\r\n  accentLight: '#dbeafe',\r\n\r\n  // Status colors\r\n  statusTodo: '#8b949e',\r\n  statusInProgress: '#bf8700',\r\n  statusCompleted: '#1a7f37',\r\n\r\n  // Interactive\r\n  focusRing: '#0969da',\r\n  checkboxBg: '#ffffff',\r\n  checkboxChecked: '#0969da',\r\n\r\n  // Chronos V2.0 extended tokens\r\n  bgGroupHeader: '#F3F4F6',\r\n  headerBg: '#F9FAFB',\r\n  neonRed: '#DC2626',\r\n  neonGreen: '#16A34A',\r\n  neonAmber: '#D97706',\r\n  neonBlue: '#00E5CC',\r\n};\r\n\r\n/**\r\n * Neutral theme for ListView\r\n */\r\nexport const neutralTheme: ListViewTheme = {\r\n  // Backgrounds\r\n  bgPrimary: '#1a1a2e',\r\n  bgSecondary: '#16213e',\r\n  bgHover: '#1f3460',\r\n  bgSelected: '#0f4c7520',\r\n  bgAlternate: '#1a1a2e80',\r\n\r\n  // Borders\r\n  border: '#2a3f5f',\r\n  borderLight: '#1f3460',\r\n\r\n  // Text\r\n  textPrimary: '#e4e6eb',\r\n  textSecondary: '#a8b2c1',\r\n  textMuted: '#6b7280',\r\n\r\n  // Accent colors\r\n  accent: '#6366f1',\r\n  accentHover: '#818cf8',\r\n  accentLight: '#6366f120',\r\n\r\n  // Status colors\r\n  statusTodo: '#9ca3af',\r\n  statusInProgress: '#fbbf24',\r\n  statusCompleted: '#34d399',\r\n\r\n  // Interactive\r\n  focusRing: '#6366f1',\r\n  checkboxBg: '#1f3460',\r\n  checkboxChecked: '#6366f1',\r\n\r\n  // Chronos V2.0 extended tokens\r\n  bgGroupHeader: '#1f3460',\r\n  headerBg: '#16213e',\r\n  neonRed: '#EF4444',\r\n  neonGreen: '#34D399',\r\n  neonAmber: '#FBBF24',\r\n  neonBlue: '#6366F1',\r\n};\r\n\r\n/**\r\n * All available themes\r\n */\r\nexport const listViewThemes = {\r\n  dark: darkTheme,\r\n  light: lightTheme,\r\n  neutral: neutralTheme,\r\n} as const;\r\n\r\nexport type ListViewThemeName = keyof typeof listViewThemes;\r\n\r\n/**\r\n * Get theme by name\r\n */\r\nexport function getListViewTheme(themeName: ListViewThemeName): ListViewTheme {\r\n  return listViewThemes[themeName] || listViewThemes.dark;\r\n}\r\n","/**\r\n * Motor de layout del Calendario (Asakaa Pulse) — Sprint 1.\r\n *\r\n * Convierte tareas reales (del Gantt) en barras posicionadas por semana, y los\r\n * elementos de día (hitos/desembolsos/vencimientos/externos/ausencias) en chips,\r\n * empaquetándolos en \"lanes\" sin solaparse — fiel a layoutWeek del diseño de\r\n * referencia (cal-data.js). Solo lectura.\r\n *\r\n * El calendario usa un \"serial\" de día: índice continuo dentro del mes visible\r\n * (1..N), con lunes = columna 0. Esto permite posicionar barras que cruzan\r\n * semanas con muescas de continuación.\r\n */\r\n\r\nexport type DayItemType = 'hito' | 'desembolso' | 'deadline' | 'ext' | 'aus';\r\n\r\nexport interface CalTask {\r\n  uid: string;           // ID REAL (UUID interno) — para drag, simulación, drawer\r\n  id: string;            // ID VISIBLE (TK-xxx / wbs; vacío si solo hay UUID) — solo para mostrar\r\n  name: string;\r\n  projectId: string;     // para color por proyecto\r\n  /**\r\n   * v1.9.25 — color propio del evento, que gana sobre el del proyecto.\r\n   *\r\n   * P1 §6.4: «un campo de selección puede elegirse para colorear los\r\n   * eventos». Hasta ahora el calendario solo coloreaba por proyecto, así que\r\n   * esa regla no se podía cumplir sin tocar la librería.\r\n   */\r\n  color?: string;\r\n  startSerial: number;   // día-serial de inicio dentro del mes visible\r\n  endSerial: number;     // día-serial de fin\r\n  hrs: number;\r\n  cost: string;          // formateado, ej. \"$1.9k\"\r\n  critical: boolean;     // ruta crítica (CPM)\r\n  who?: string;          // iniciales del responsable\r\n  realStart: Date;\r\n  realEnd: Date;\r\n  /** fase = tarea-padre RAÍZ del WBS (para el filtro \"Fase\"). uid de la raíz;\r\n   *  si la tarea es de primer nivel, su propia fase es ella misma. */\r\n  phaseId?: string;\r\n  phaseName?: string;\r\n  /** 1.9.42 · estado para los chips del modo vencimiento. */\r\n  done?: boolean;\r\n  overdue?: boolean;\r\n  milestone?: boolean;\r\n  /** 1.9.42 · tarea padre (contenedor): el modo vencimiento no la pinta. */\r\n  container?: boolean;\r\n}\r\n\r\nexport interface DayItem {\r\n  serial: number;\r\n  type: DayItemType;\r\n  label: string;\r\n}\r\n\r\nexport interface LaidBar {\r\n  t: CalTask;\r\n  s: number;   // serial visible recortado al rango de la semana\r\n  e: number;\r\n  lane: number;\r\n  contL: boolean;  // continúa de la semana anterior\r\n  contR: boolean;  // continúa a la semana siguiente\r\n}\r\n\r\nexport interface LaidChip {\r\n  it: DayItem;\r\n  day: number;\r\n  lane: number;\r\n}\r\n\r\nexport interface LaidMore {\r\n  day: number;\r\n  lane: number;\r\n  count: number;\r\n  items: DayItem[];\r\n}\r\n\r\nexport interface WeekLayout {\r\n  bars: LaidBar[];\r\n  chips: LaidChip[];\r\n  more: LaidMore[];\r\n  laneCount: number;\r\n}\r\n\r\n/**\r\n * Empaqueta barras y chips de una semana [ws, we] en lanes.\r\n * Reproduce el algoritmo del diseño de referencia (cal-data.js layoutWeek).\r\n */\r\nexport function layoutWeek(\r\n  tasks: CalTask[],\r\n  items: DayItem[],\r\n  ws: number,\r\n  we: number,\r\n  maxSlots = 5,\r\n): WeekLayout {\r\n  const lanes: Array<Array<[number, number]>> = [];\r\n  const bars: LaidBar[] = [];\r\n\r\n  const segs = tasks\r\n    .filter((t) => t.endSerial >= ws && t.startSerial <= we)\r\n    .sort((a, b) => a.startSerial - b.startSerial || b.endSerial - a.endSerial);\r\n\r\n  for (const t of segs) {\r\n    const s = Math.max(t.startSerial, ws);\r\n    const e = Math.min(t.endSerial, we);\r\n    let lane = 0;\r\n    while ((lanes[lane] || []).some(([ls, le]) => !(e < ls || s > le))) lane++;\r\n    (lanes[lane] = lanes[lane] || []).push([s, e]);\r\n    bars.push({ t, s, e, lane, contL: t.startSerial < ws, contR: t.endSerial > we });\r\n  }\r\n\r\n  // Qué lanes ocupa cada columna (día), para colocar chips en huecos.\r\n  const colOcc: Record<number, Set<number>> = {};\r\n  for (let d = ws; d <= we; d++) colOcc[d] = new Set();\r\n  bars.forEach((b) => { for (let d = b.s; d <= b.e; d++) colOcc[d]!.add(b.lane); });\r\n\r\n  const chips: LaidChip[] = [];\r\n  const more: LaidMore[] = [];\r\n  const byDay: Record<number, DayItem[]> = {};\r\n  items\r\n    .filter((it) => it.serial >= ws && it.serial <= we)\r\n    .forEach((it) => { (byDay[it.serial] = byDay[it.serial] || []).push(it); });\r\n\r\n  Object.keys(byDay).forEach((k) => {\r\n    const d = +k;\r\n    const list = byDay[d]!;\r\n    const free: number[] = [];\r\n    for (let l = 0; l < maxSlots; l++) if (!colOcc[d]!.has(l)) free.push(l);\r\n    if (list.length <= free.length) {\r\n      list.forEach((it, i) => chips.push({ it, day: d, lane: free[i]! }));\r\n    } else {\r\n      const shown = Math.max(free.length - 1, 0);\r\n      list.slice(0, shown).forEach((it, i) => chips.push({ it, day: d, lane: free[i]! }));\r\n      more.push({\r\n        day: d,\r\n        lane: free[shown] != null ? free[shown]! : maxSlots - 1,\r\n        count: list.length - shown,\r\n        items: list.slice(shown),\r\n      });\r\n    }\r\n  });\r\n\r\n  let laneCount = lanes.length;\r\n  chips.forEach((c) => { laneCount = Math.max(laneCount, c.lane + 1); });\r\n  more.forEach((m) => { laneCount = Math.max(laneCount, m.lane + 1); });\r\n  return { bars, chips, more, laneCount: Math.max(laneCount, 1) };\r\n}\r\n\r\n// ── Helpers de fecha/serial para el mes visible ──────────────────────────────\r\n\r\nconst DOW_ES = ['LUN', 'MAR', 'MIÉ', 'JUE', 'VIE', 'SÁB', 'DOM'];\r\nconst DOW_EN = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'];\r\n\r\nexport function dowLabels(locale: 'es' | 'en'): string[] {\r\n  return locale === 'es' ? DOW_ES : DOW_EN;\r\n}\r\n\r\n/** Lunes (0) .. domingo (6) para una fecha. */\r\nexport function mondayIndex(d: Date): number {\r\n  return (d.getDay() + 6) % 7;\r\n}\r\n\r\nexport interface MonthGrid {\r\n  /** Fecha del primer día visible (puede ser de mes anterior, siempre lunes). */\r\n  gridStart: Date;\r\n  /** Semanas como rangos de serial [ws, we], 6 semanas máximo. */\r\n  weeks: Array<{ ws: number; we: number }>;\r\n  /** serial → Date */\r\n  serialToDate: (serial: number) => Date;\r\n  /** Date → serial dentro de la grid (o null si fuera). */\r\n  dateToSerial: (d: Date) => number;\r\n  /** serial del primer día del mes objetivo (para detectar \"out\"). */\r\n  monthStartSerial: number;\r\n  monthEndSerial: number;\r\n}\r\n\r\n/**\r\n * Construye la grilla de un mes: empieza el lunes de la semana del día 1, cubre\r\n * 6 semanas (estándar de calendarios mensuales), serial continuo desde 1.\r\n */\r\nexport function buildMonthGrid(year: number, month: number): MonthGrid {\r\n  const first = new Date(year, month, 1);\r\n  const offset = mondayIndex(first); // cuántos días de relleno antes del día 1\r\n  const gridStart = new Date(year, month, 1 - offset);\r\n  const weeks: Array<{ ws: number; we: number }> = [];\r\n  for (let w = 0; w < 6; w++) {\r\n    weeks.push({ ws: w * 7 + 1, we: w * 7 + 7 });\r\n  }\r\n  const serialToDate = (serial: number): Date => {\r\n    const d = new Date(gridStart);\r\n    d.setDate(gridStart.getDate() + (serial - 1));\r\n    return d;\r\n  };\r\n  const dateToSerial = (d: Date): number => {\r\n    const ms = d.getTime() - gridStart.getTime();\r\n    return Math.floor(ms / 86400000) + 1;\r\n  };\r\n  const monthStartSerial = dateToSerial(first);\r\n  const lastDay = new Date(year, month + 1, 0);\r\n  const monthEndSerial = dateToSerial(lastDay);\r\n  return { gridStart, weeks, serialToDate, dateToSerial, monthStartSerial, monthEndSerial };\r\n}\r\n\r\nexport function isWeekendSerial(grid: MonthGrid, serial: number): boolean {\r\n  return mondayIndex(grid.serialToDate(serial)) >= 5;\r\n}\r\n\r\n/**\r\n * 1.9.42 · MODO VENCIMIENTO DEL MES: «qué vence cada día».\r\n *\r\n * Cada tarea (no contenedora) es un chip de UN día en su fecha de fin. Por día\r\n * caben `maxSlots` filas; si hay más, la última es «+N more» con el resto.\r\n * Las barras de varios días quedan para la Semana.\r\n */\r\nexport function layoutDueWeek(\r\n  tasks: CalTask[],\r\n  items: DayItem[],\r\n  ws: number,\r\n  we: number,\r\n  maxSlots: number,\r\n): WeekLayout {\r\n  const bars: LaidBar[] = [];\r\n  const chips: LaidChip[] = [];\r\n  const more: LaidMore[] = [];\r\n  const slots = Math.max(1, maxSlots);\r\n  let laneCount = 0;\r\n  for (let d = ws; d <= we; d++) {\r\n    const delDia = tasks\r\n      .filter((t) => !t.container && t.endSerial === d)\r\n      .sort((a, b) => Number(!!a.done) - Number(!!b.done) || a.name.localeCompare(b.name));\r\n    const itemsDia = items.filter((it) => it.serial === d);\r\n    const total = delDia.length + itemsDia.length;\r\n    if (total === 0) continue;\r\n    /* «+N more» va en la fila del número del día (enCabecera): todas las filas son chips. */\r\n    const caben = Math.min(total, slots);\r\n    let lane = 0;\r\n    for (const t of delDia.slice(0, caben)) {\r\n      bars.push({ t, s: d, e: d, lane: lane++, contL: false, contR: false });\r\n    }\r\n    for (const it of itemsDia.slice(0, Math.max(0, caben - Math.min(delDia.length, caben)))) {\r\n      chips.push({ it, day: d, lane: lane++ });\r\n    }\r\n    if (total > caben) {\r\n      const restoItems = itemsDia.slice(Math.max(0, caben - Math.min(delDia.length, caben)));\r\n      more.push({ day: d, lane: -1, count: total - caben, items: restoItems });\r\n    }\r\n    laneCount = Math.max(laneCount, lane);\r\n  }\r\n  return { bars, chips, more, laneCount: Math.max(laneCount, 1) };\r\n}\r\n","/**\r\n * Mapeo de datos reales del Gantt → estructuras del Calendario (Sprint 1).\r\n *\r\n * Toma las tareas reales (LibXAITask) que ya carga ProjectCalendar y las\r\n * proyecta sobre la grilla del mes visible como barras (CalTask). NO inventa\r\n * datos: hitos/desembolsos/externos/ausencias solo aparecen si hay fuente real\r\n * (en S1 derivamos \"vencimientos\" de tareas que terminan en el mes; el resto\r\n * llega cuando existan sus entidades — S2/S3).\r\n */\r\nimport type { Task as LibXAITask } from '../Gantt/types';\r\nimport type { CalTask, DayItem, MonthGrid } from './calendarLayout';\r\n\r\n/** Aplana el árbol llevando la FASE (tarea-padre raíz) de cada tarea, para el\r\n *  filtro \"Fase\". La raíz es su propia fase. */\r\nfunction flatten(tasks: LibXAITask[]): Array<{ t: LibXAITask; phaseId: string; phaseName: string }> {\r\n  const out: Array<{ t: LibXAITask; phaseId: string; phaseName: string }> = [];\r\n  const walk = (list: LibXAITask[], phaseId: string, phaseName: string) => {\r\n    for (const t of list) {\r\n      // si estamos en el nivel raíz, la fase es la tarea misma.\r\n      const pId = phaseId || t.id;\r\n      const pName = phaseName || t.name;\r\n      out.push({ t, phaseId: pId, phaseName: pName });\r\n      if (t.subtasks?.length) walk(t.subtasks, pId, pName);\r\n    }\r\n  };\r\n  walk(tasks, '', '');\r\n  return out;\r\n}\r\n\r\nfunction toDate(v: Date | string | undefined | null): Date | null {\r\n  if (!v) return null;\r\n  const d = v instanceof Date ? v : new Date(v);\r\n  return isNaN(d.getTime()) ? null : d;\r\n}\r\n\r\n/** \"$1.9k\" / \"$475\" — formato compacto coherente con el resto de Asakaa. */\r\nfunction fmtCost(amount: number): string {\r\n  if (amount >= 1000) return `$${(amount / 1000).toFixed(1).replace(/\\.0$/, '')}k`;\r\n  return `$${Math.round(amount)}`;\r\n}\r\n\r\nexport interface BuildOpts {\r\n  tasks: LibXAITask[];\r\n  grid: MonthGrid;\r\n  /** projectId → color (CSS). En vista de un proyecto, un solo color. */\r\n  projectColor: (projectId: string) => string;\r\n  /** tarifa media para estimar costo cuando no hay costo explícito. */\r\n  hourlyRate: number;\r\n  /** id de proyecto de las tareas (el calendario es por proyecto en S1). */\r\n  projectId: string;\r\n}\r\n\r\nexport interface BuiltCalendar {\r\n  calTasks: CalTask[];\r\n  dayItems: DayItem[];\r\n  /** ¿el mes visible tiene algo que mostrar? (para estado vacío C13) */\r\n  isEmpty: boolean;\r\n}\r\n\r\n/**\r\n * Construye las barras (y items derivados) para el mes visible de la grilla.\r\n * Recorta tareas a la ventana de la grilla; las que no intersectan se omiten.\r\n */\r\nexport function buildCalendar(opts: BuildOpts): BuiltCalendar {\r\n  const { tasks, grid, projectColor, hourlyRate, projectId } = opts;\r\n  const flat = flatten(tasks);\r\n  const gridEndSerial = 6 * 7; // 6 semanas\r\n\r\n  const calTasks: CalTask[] = [];\r\n  for (const { t, phaseId, phaseName } of flat) {\r\n    const start = toDate(t.startDate);\r\n    const end = toDate(t.endDate);\r\n    if (!start || !end) continue;\r\n\r\n    const sSerial = grid.dateToSerial(start);\r\n    const eSerial = grid.dateToSerial(end);\r\n    // Omite tareas totalmente fuera de la ventana visible.\r\n    if (eSerial < 1 || sSerial > gridEndSerial) continue;\r\n\r\n    const mins = (t as { effortMinutes?: number | null }).effortMinutes ?? 0;\r\n    const hrs = Math.round((mins / 60) * 10) / 10;\r\n    const explicitCost = (t as { costAtCompletion?: number | null }).costAtCompletion;\r\n    const cost = explicitCost != null ? fmtCost(explicitCost) : fmtCost(hrs * hourlyRate);\r\n    const assignee = t.assignees?.[0];\r\n    const who = assignee?.initials || (assignee?.name ? initials(assignee.name) : undefined);\r\n\r\n    // ID visible: usar wbsCode/displayId si existe (legible, ej. \"1.2\"); si solo\r\n    // hay el UUID interno, dejarlo vacío (S1 no muestra UUIDs crudos en la barra\r\n    // — los IDs cortos por proyecto son la feature C11 de Sprint 3).\r\n    const shortId = (t as { displayId?: string }).displayId\r\n      || (t as { wbsCode?: string }).wbsCode\r\n      || '';\r\n    const visibleId = isUuid(shortId || t.id) ? '' : (shortId || t.id);\r\n\r\n    calTasks.push({\r\n      uid: t.id,            // UUID real para lógica (drag/simulación/drawer)\r\n      id: visibleId,        // solo para mostrar (vacío si es UUID)\r\n      name: t.name,\r\n      projectId,\r\n      /*\r\n       * v1.9.26 — P1 §6.4: «un campo de seleccion puede elegirse para colorear\r\n       * los eventos».\r\n       *\r\n       * La app decide el color y lo pone en la tarea; aqui solo se propaga.\r\n       * `undefined` cuando no lo manda, y entonces manda el del proyecto —el\r\n       * comportamiento de siempre—.\r\n       */\r\n      color: (t as { color?: string }).color,\r\n      startSerial: Math.max(sSerial, 1),\r\n      endSerial: Math.min(eSerial, gridEndSerial),\r\n      hrs,\r\n      cost,\r\n      critical: !!t.isCriticalPath,\r\n      who,\r\n      realStart: start,\r\n      realEnd: end,\r\n      phaseId,\r\n      phaseName,\r\n      /* 1.9.42 · para los chips del modo vencimiento. */\r\n      done: t.progress === 100 || (t as { status?: string }).status === 'completed',\r\n      overdue: !(t.progress === 100 || (t as { status?: string }).status === 'completed') && (() => {\r\n        const hoy = new Date(); hoy.setHours(0, 0, 0, 0);\r\n        const fin = new Date(end); fin.setHours(0, 0, 0, 0);\r\n        return fin < hoy;\r\n      })(),\r\n      milestone: !!(t as { isMilestone?: boolean }).isMilestone,\r\n      container: !!(t.subtasks && t.subtasks.length > 0),\r\n    });\r\n  }\r\n  // color por proyecto se aplica en el render; aquí solo dejamos el projectId.\r\n  void projectColor;\r\n\r\n  // S1: sin entidades de hito/desembolso/externo/ausencia → dayItems vacío.\r\n  // (Se poblará en S2/S3 cuando existan esas fuentes; el render ya los soporta.)\r\n  const dayItems: DayItem[] = [];\r\n\r\n  return {\r\n    calTasks,\r\n    dayItems,\r\n    isEmpty: calTasks.length === 0 && dayItems.length === 0,\r\n  };\r\n}\r\n\r\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\r\nfunction isUuid(s: string): boolean { return UUID_RE.test(s) || /^task-\\d+/.test(s); }\r\n\r\nfunction initials(name: string): string {\r\n  const parts = name.trim().split(/\\s+/);\r\n  if (parts.length >= 2) return (parts[0]![0]! + parts[parts.length - 1]![0]!).toUpperCase();\r\n  return name.slice(0, 2).toUpperCase();\r\n}\r\n\r\nconst MONTHS_ES = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];\r\nconst MONTHS_EN = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n\r\nexport function monthLabel(year: number, month: number, locale: 'es' | 'en'): string {\r\n  return `${(locale === 'es' ? MONTHS_ES : MONTHS_EN)[month]} ${year}`;\r\n}\r\n","/**\r\n * Calendario (Asakaa Pulse) — componentes de presentación puros (Sprint 1, solo lectura).\r\n *\r\n * Traducción a TSX de cal-components.jsx, fiel al diseño aprobado. Sin estado,\r\n * sin drag/resize: solo pintan barras de tarea, chips de día, \"+N más\" y la\r\n * leyenda usando las clases .cal-* de calendar.css y el motor de calendarLayout.ts.\r\n *\r\n * El color de cada proyecto NO se inventa: se recibe vía la prop `projects`\r\n * (mapa projectId → color CSS) y se inyecta en la barra como variable `--proj`.\r\n */\r\n\r\nimport type React from 'react';\r\nimport type { CSSProperties } from 'react';\r\nimport type { DayItemType, LaidBar, LaidChip, LaidMore } from './calendarLayout';\r\nimport { dowLabels } from './calendarLayout';\r\n\r\nconst DEFAULT_SLOT_H = 26;\r\n\r\n/** Variable CSS personalizada para el color del proyecto. */\r\ntype ProjVars = CSSProperties & { '--proj'?: string };\r\n\r\n/** Modo del valor mostrado en el extremo de la barra. */\r\nexport type MoneyMode = '$' | 'Hrs';\r\n\r\nexport interface CalProject {\r\n  id: string;\r\n  name: string;\r\n  color: string;\r\n}\r\n\r\n/** Mapa projectId → color (resuelto desde la lista de proyectos). */\r\nexport type ProjectColors = Record<string, string>;\r\n\r\nconst CHIP_ICON: Record<DayItemType, string> = {\r\n  hito: '◆',\r\n  desembolso: '◆',\r\n  deadline: '⚑',\r\n  ext: '○',\r\n  aus: '⊘',\r\n};\r\n\r\n/* ---------- Encabezado días de la semana ---------- */\r\nexport interface CalDowProps {\r\n  locale: 'es' | 'en';\r\n}\r\n\r\nexport function CalDow({ locale }: CalDowProps): React.ReactElement {\r\n  const labels = dowLabels(locale);\r\n  return (\r\n    <div className=\"cal-dow\">\r\n      {labels.map((d, i) => (\r\n        <div key={d} className={i >= 5 ? 'wknd' : ''}>\r\n          {d}\r\n        </div>\r\n      ))}\r\n    </div>\r\n  );\r\n}\r\n\r\n/* ---------- Barra de tarea ---------- */\r\nexport interface CalBarProps {\r\n  bar: LaidBar;\r\n  /** Serial de inicio de la semana, para posicionar left dentro de la celda. */\r\n  ws: number;\r\n  money: MoneyMode;\r\n  /** Color del proyecto de esta barra (resuelto fuera). */\r\n  projColor?: string;\r\n  slotH?: number;\r\n  /** 1.9.42 · chip de vencimiento (neutro, con ✓ / alerta / bandera). */\r\n  due?: boolean;\r\n  /** 1.9.42 · `false` nunca pinta horas ni coste en la barra. */\r\n  showValues?: boolean;\r\n}\r\n\r\nexport function CalBar({ bar, ws, money, projColor, slotH = DEFAULT_SLOT_H, due = false, showValues = true }: CalBarProps): React.ReactElement {\r\n  const { t } = bar;\r\n  const col = bar.s - ws;\r\n  const span = bar.e - bar.s + 1;\r\n  const cls =\r\n    'cal-bar' +\r\n    (t.critical ? ' cpm' : '') +\r\n    (bar.contL ? ' cont-l' : '') +\r\n    (bar.contR ? ' cont-r' : '') +\r\n    (due ? ' due' : '') +\r\n    (due && t.done ? ' done' : '') +\r\n    (due && t.overdue ? ' overdue' : '') +\r\n    (due && t.milestone ? ' hito' : '');\r\n  const val = money === '$' ? t.cost : `${t.hrs}h`;\r\n  /* 1.9.42 · «0h» no dice nada: las horas solo si hay. */\r\n  const conValor = showValues && (money === '$' || t.hrs > 0);\r\n  const style: ProjVars = {\r\n    /*\r\n     * v1.9.26 — P1 §6.4: «un campo de seleccion puede elegirse para colorear\r\n     * los eventos».\r\n     *\r\n     * El color de LA TAREA gana sobre el del proyecto. Si la app no lo manda\r\n     * —que es lo normal— se cae al de siempre, asi que ningun consumidor\r\n     * existente cambia.\r\n     *\r\n     * v1.9.32 — el color vive en LA TAREA (`bar.t.color`, lo copia\r\n     * calendarData), no en la barra: leer solo `bar.color` lo perdía siempre\r\n     * y el selector «Color de los eventos» no pintaba nada. La Agenda ya leía t.\r\n     */\r\n    '--proj': (bar as { color?: string }).color ?? (t as { color?: string }).color ?? projColor,\r\n    left: `calc(${col}/7*100% + 3px)`,\r\n    width: `calc(${span}/7*100% - 6px)`,\r\n    top: `${bar.lane * slotH}px`,\r\n  };\r\n  return (\r\n    <div className={cls} style={style}>\r\n      {t.critical && span >= 3 ? <span className=\"cpm-tag\">CPM</span> : null}\r\n      {due && t.done ? <span className=\"ico\" aria-hidden>✓</span> : null}\r\n      {due && t.overdue ? (\r\n        <svg className=\"ico\" width=\"11\" height=\"11\" viewBox=\"0 0 12 12\" aria-hidden>\r\n          <circle cx=\"6\" cy=\"6\" r=\"5.25\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\r\n          <line x1=\"6\" y1=\"3.4\" x2=\"6\" y2=\"6.6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n          <circle cx=\"6\" cy=\"8.6\" r=\"0.8\" fill=\"currentColor\" />\r\n        </svg>\r\n      ) : null}\r\n      {due && t.milestone ? (\r\n        <svg className=\"ico\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" aria-hidden fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n          <path d=\"M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z\" /><line x1=\"4\" y1=\"22\" x2=\"4\" y2=\"15\" />\r\n        </svg>\r\n      ) : null}\r\n      {t.id ? <span className=\"tk\">{t.id}</span> : null}\r\n      <span className=\"nom\">{t.name}</span>\r\n      {span >= 3 && conValor ? <span className=\"val\">{val}</span> : null}\r\n      {due && t.overdue ? <span className=\"sr-only\">Overdue</span> : null}\r\n    </div>\r\n  );\r\n}\r\n\r\n/* ---------- Chip de un día (hito / desembolso / vencimiento / externo / ausencia) ---------- */\r\nexport interface CalChipProps {\r\n  chip: LaidChip;\r\n  ws: number;\r\n  slotH?: number;\r\n}\r\n\r\nexport function CalChip({ chip, ws, slotH = DEFAULT_SLOT_H }: CalChipProps): React.ReactElement {\r\n  const col = chip.day - ws;\r\n  const cls = `cal-chip ${chip.it.type}`;\r\n  const style: CSSProperties = {\r\n    left: `calc(${col}/7*100% + 3px)`,\r\n    width: 'calc(1/7*100% - 6px)',\r\n    top: `${chip.lane * slotH}px`,\r\n  };\r\n  return (\r\n    <div className={cls} style={style}>\r\n      <span className=\"ico\">{CHIP_ICON[chip.it.type]}</span>\r\n      <span className=\"lbl2\">{chip.it.label}</span>\r\n    </div>\r\n  );\r\n}\r\n\r\n/* ---------- \"+N más\" (abre popover con todos los items del día) ---------- */\r\nexport interface CalMoreChipProps {\r\n  more: LaidMore;\r\n  ws: number;\r\n  slotH?: number;\r\n  onClick?: (more: LaidMore) => void;\r\n  /** 1.9.42 · en la fila del número del día, a la derecha (no gasta una fila de chips). */\r\n  enCabecera?: boolean;\r\n  locale?: 'es' | 'en';\r\n}\r\n\r\nexport function CalMoreChip({ more, ws, slotH = DEFAULT_SLOT_H, onClick, enCabecera = false, locale = 'es' }: CalMoreChipProps): React.ReactElement {\r\n  const col = more.day - ws;\r\n  const style: CSSProperties = enCabecera\r\n    ? { left: `calc(${col + 1}/7*100% - 4px)`, top: '-25px', transform: 'translateX(-100%)' }\r\n    : { left: `calc(${col}/7*100% + 3px)`, top: `${more.lane * slotH}px` };\r\n  return (\r\n    <div\r\n      className={enCabecera ? 'cal-more en-cabecera' : 'cal-more'}\r\n      style={style}\r\n      role={onClick ? 'button' : undefined}\r\n      tabIndex={onClick ? 0 : undefined}\r\n      onClick={onClick ? () => onClick(more) : undefined}\r\n    >\r\n      +{more.count} {locale === 'en' ? 'more' : 'más'}\r\n    </div>\r\n  );\r\n}\r\n\r\n/* ---------- Leyenda al pie ---------- */\r\nexport interface CalLegendProps {\r\n  projects: CalProject[];\r\n  locale?: 'es' | 'en';\r\n}\r\n\r\nexport function CalLegend({ projects, locale = 'es' }: CalLegendProps): React.ReactElement {\r\n  const en = locale === 'en';\r\n  return (\r\n    <div className=\"cal-legend\">\r\n      {projects.map((p) => (\r\n        <span key={p.id || p.name}>\r\n          <span className=\"dot\" style={{ background: p.color }} />\r\n          {p.id ? `${p.id} ` : ''}{p.name}\r\n        </span>\r\n      ))}\r\n      <span>\r\n        <i style={{ color: 'var(--cyan)' }}>▣</i> {en ? 'Critical path' : 'Ruta crítica'}\r\n      </span>\r\n      <span>\r\n        <i style={{ color: 'var(--cyan)' }}>◆</i> {en ? 'Milestone' : 'Hito'}\r\n      </span>\r\n      <span>\r\n        <i style={{ color: 'var(--red)' }}>⚑</i> {en ? 'Due date' : 'Vencimiento'}\r\n      </span>\r\n      <span>\r\n        <i style={{ color: 'var(--txt2)' }}>○</i> {en ? 'External event' : 'Evento externo'}\r\n      </span>\r\n      <span>\r\n        <i style={{ color: 'var(--orange)' }}>⊘</i> {en ? 'Absence' : 'Ausencia'}\r\n      </span>\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * Calendario Asakaa Pulse — Chrome (barra superior + toolbar + panel de capas).\r\n * Sprint 1, solo lectura. Traducción TSX de CalTopBar + CalToolbar + CalLayersPop\r\n * (cal-components.jsx). Usa las clases .cal-* de calendar.css tal cual.\r\n *\r\n * Todo el texto en español. Componentes totalmente controlados por props\r\n * (sin estado interno salvo lo trivial).\r\n */\r\nimport { useEffect, useRef, useState } from 'react';\r\n\r\nexport type CalView = 'mes' | 'semana' | 'lookahead' | 'agenda';\r\nexport type CalMoney = 'hrs' | '$';\r\nexport type CalLayerId = 'tareas' | 'cpm' | 'hitos' | 'ext' | 'festivos' | 'aus';\r\n\r\n/* ---------- Top bar (header del tablero) ---------- */\r\nexport interface CalTopBarProps {\r\n  view: CalView;\r\n  onViewChange: (view: CalView) => void;\r\n  money: CalMoney;\r\n  onMoneyChange: (money: CalMoney) => void;\r\n  /**\r\n   * ═══ EL PAR «Hrs / $» SE PUEDE QUITAR ENTERO ════════════════════════════\r\n   *\r\n   * REQ-07 §2.7: en el producto sin finanzas el «$» es un resto financiero.\r\n   *\r\n   * Y se quita EL PAR COMPLETO, no solo el «$»: como dice Yesid, «un\r\n   * conmutador de una sola opcion no es un conmutador — si solo queda HRS,\r\n   * deja de ser un control y pasa a ser una etiqueta, que tampoco hace\r\n   * falta».\r\n   *\r\n   * Por defecto se muestra: quien no pase nada se comporta como siempre.\r\n   */\r\n  mostrarConmutadorDeDinero?: boolean;\r\n  /** Etiqueta del proyecto seleccionado (sin dropdown funcional en S1). */\r\n  projectLabel: string;\r\n  locale?: string;\r\n  /** 1.9.34 · dentro de la cabecera de quien la pide: solo las vistas (y Hrs/$); sin selector de proyecto. */\r\n  enCabecera?: boolean;\r\n  /** 1.9.34 · vistas que no se ofrecen (p. ej. 'lookahead' sin planificación de obra). */\r\n  hiddenViews?: CalView[];\r\n}\r\n\r\n/* 1.9.33 · las etiquetas siguen el `locale` (salían en español con la interfaz en inglés). */\r\nconst VISTAS: { id: CalView; es: string; en: string; key: string }[] = [\r\n  { id: 'mes', es: 'Mes', en: 'Month', key: 'M' },\r\n  { id: 'semana', es: 'Semana', en: 'Week', key: 'W' },\r\n  { id: 'lookahead', es: 'Lookahead', en: 'Lookahead', key: '2' },\r\n  { id: 'agenda', es: 'Agenda', en: 'Agenda', key: 'A' },\r\n];\r\n\r\nexport function CalTopBar({\r\n  view,\r\n  onViewChange,\r\n  money,\r\n  onMoneyChange,\r\n  mostrarConmutadorDeDinero,\r\n  projectLabel,\r\n  locale = 'es',\r\n  enCabecera = false,\r\n  hiddenViews = [],\r\n}: CalTopBarProps) {\r\n  const en = locale === 'en';\r\n  const vistas = VISTAS.filter((v) => !hiddenViews.includes(v.id));\r\n  if (enCabecera) {\r\n    return (\r\n      <>\r\n        <div className=\"cal-seg\">\r\n          {vistas.map((v) => (\r\n            <button\r\n              type=\"button\"\r\n              key={v.id}\r\n              className={view === v.id ? 'on' : ''}\r\n              onClick={() => onViewChange(v.id)}\r\n              title={`${en ? v.en : v.es} (${v.key})`}\r\n            >\r\n              {en ? v.en : v.es}\r\n            </button>\r\n          ))}\r\n        </div>\r\n        {mostrarConmutadorDeDinero !== false && (\r\n          <div className=\"cal-seg\">\r\n            <button type=\"button\" className={money === '$' ? '' : 'on'} onClick={() => onMoneyChange('hrs')}>Hrs</button>\r\n            <button type=\"button\" className={money === '$' ? 'on' : ''} onClick={() => onMoneyChange('$')}>$</button>\r\n          </div>\r\n        )}\r\n      </>\r\n    );\r\n  }\r\n  return (\r\n    // El logo/marca \"Asakaa Pulse\" se omite aquí: ya está en el header global y\r\n    // en el selector de workspace — sería redundante repetirlo en el calendario.\r\n    <div className=\"cal-topbar\">\r\n      <div className=\"cal-projsel\">\r\n        {projectLabel}\r\n        <span className=\"caret\">▾</span>\r\n      </div>\r\n      <div className=\"cal-spacer\" />\r\n      <div className=\"cal-seg\">\r\n        {vistas.map((v) => (\r\n          <button\r\n            type=\"button\"\r\n            key={v.id}\r\n            className={view === v.id ? 'on' : ''}\r\n            onClick={() => onViewChange(v.id)}\r\n          >\r\n            {en ? v.en : v.es}\r\n            <span className=\"key\">{v.key}</span>\r\n          </button>\r\n        ))}\r\n      </div>\r\n      {mostrarConmutadorDeDinero !== false && (\r\n        <div className=\"cal-seg\">\r\n          <button\r\n            type=\"button\"\r\n            className={money === '$' ? '' : 'on'}\r\n            onClick={() => onMoneyChange('hrs')}\r\n          >\r\n            Hrs\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            className={money === '$' ? 'on' : ''}\r\n            onClick={() => onMoneyChange('$')}\r\n          >\r\n            $\r\n          </button>\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n\r\n/* ---------- Toolbar: nav del periodo + filtros persistentes ---------- */\r\nexport interface PhaseOption { id: string; name: string }\r\n\r\nexport interface CalToolbarProps {\r\n  monthLabel: string;\r\n  onPrev: () => void;\r\n  onNext: () => void;\r\n  onToday: () => void;\r\n  layersOpen: boolean;\r\n  onToggleLayers: () => void;\r\n  /** Capas apagadas (para el contador del botón). */\r\n  layersOff: string[];\r\n  /** Fases (tareas-padre raíz) disponibles para filtrar. */\r\n  phases?: PhaseOption[];\r\n  /** fase seleccionada ('all' = todas). */\r\n  phaseFilter?: string;\r\n  onPhaseChange?: (id: string) => void;\r\n  locale?: 'es' | 'en';\r\n  /** Chips de responsables u otros controles que se inyectan en la toolbar. */\r\n  children?: React.ReactNode;\r\n}\r\n\r\nexport function CalToolbar({\r\n  monthLabel,\r\n  onPrev,\r\n  onNext,\r\n  onToday,\r\n  layersOpen,\r\n  onToggleLayers,\r\n  layersOff,\r\n  phases,\r\n  phaseFilter = 'all',\r\n  onPhaseChange,\r\n  locale = 'es',\r\n  children,\r\n}: CalToolbarProps) {\r\n  const offCount = layersOff ? layersOff.length : 0;\r\n  const [phaseOpen, setPhaseOpen] = useState(false);\r\n  const phaseRef = useRef<HTMLDivElement>(null);\r\n  const es = locale === 'es';\r\n\r\n  useEffect(() => {\r\n    if (!phaseOpen) return;\r\n    const onDown = (e: MouseEvent) => {\r\n      if (phaseRef.current && !phaseRef.current.contains(e.target as Node)) setPhaseOpen(false);\r\n    };\r\n    document.addEventListener('mousedown', onDown);\r\n    return () => document.removeEventListener('mousedown', onDown);\r\n  }, [phaseOpen]);\r\n\r\n  const selectedName = phaseFilter === 'all'\r\n    ? (es ? 'Todas' : 'All')\r\n    : (phases?.find((p) => p.id === phaseFilter)?.name ?? (es ? 'Todas' : 'All'));\r\n\r\n  return (\r\n    <div className=\"cal-toolbar\">\r\n      <div className=\"cal-nav-arrows\">\r\n        <button type=\"button\" onClick={onPrev} aria-label=\"Periodo anterior\">‹</button>\r\n        <button type=\"button\" onClick={onNext} aria-label=\"Periodo siguiente\">›</button>\r\n      </div>\r\n      <div className=\"cal-month-label\">{monthLabel}</div>\r\n      <button type=\"button\" className=\"cal-hoy\" onClick={onToday}>{es ? 'Hoy' : 'Today'}</button>\r\n      <div className=\"cal-vsep\" />\r\n\r\n      {/* Filtro de Fase (tarea-padre raíz). Solo si hay fases que filtrar. */}\r\n      {phases && phases.length > 0 && onPhaseChange ? (\r\n        <div className=\"relative\" ref={phaseRef} style={{ position: 'relative' }}>\r\n          <button\r\n            type=\"button\"\r\n            className=\"cal-ftog\"\r\n            onClick={() => setPhaseOpen((o) => !o)}\r\n            style={phaseFilter !== 'all' ? { borderColor: 'var(--cyan)', color: 'var(--cyan)' } : undefined}\r\n          >\r\n            <b>{es ? 'Fase' : 'Phase'}</b> {selectedName} ▾\r\n          </button>\r\n          {phaseOpen ? (\r\n            <div\r\n              className=\"cal-pop\"\r\n              style={{ position: 'absolute', top: '36px', left: 0, zIndex: 40, width: 240, maxHeight: 320, overflowY: 'auto' }}\r\n            >\r\n              <button\r\n                type=\"button\"\r\n                className=\"cal-layer-row\"\r\n                style={{ width: '100%', textAlign: 'left', background: 'transparent', border: 0, cursor: 'pointer', color: phaseFilter === 'all' ? 'var(--cyan)' : 'var(--txt)' }}\r\n                onClick={() => { onPhaseChange('all'); setPhaseOpen(false); }}\r\n              >\r\n                <span className=\"nm\">{es ? 'Todas las fases' : 'All phases'}</span>\r\n              </button>\r\n              {phases.map((p) => (\r\n                <button\r\n                  key={p.id}\r\n                  type=\"button\"\r\n                  className=\"cal-layer-row\"\r\n                  style={{ width: '100%', textAlign: 'left', background: 'transparent', border: 0, cursor: 'pointer', color: phaseFilter === p.id ? 'var(--cyan)' : 'var(--txt)' }}\r\n                  onClick={() => { onPhaseChange(p.id); setPhaseOpen(false); }}\r\n                >\r\n                  <span className=\"nm\" style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{p.name}</span>\r\n                </button>\r\n              ))}\r\n            </div>\r\n          ) : null}\r\n        </div>\r\n      ) : null}\r\n\r\n      {children}\r\n      <div className=\"cal-toolbar-right\">\r\n        <button\r\n          type=\"button\"\r\n          className={'cal-layers-btn' + (layersOpen ? ' open' : '')}\r\n          onClick={onToggleLayers}\r\n        >\r\n          ◧ {es ? 'Capas' : 'Layers'} <span className=\"n\">{6 - offCount}/6</span>\r\n        </button>\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\n/* ---------- Panel de capas ---------- */\r\nexport interface CalLayersPopProps {\r\n  /** IDs de capas apagadas. */\r\n  off: string[];\r\n  onToggle: (layerId: CalLayerId) => void;\r\n}\r\n\r\nconst LAYERS: { id: CalLayerId; nm: string; sub: string; sw: string }[] = [\r\n  { id: 'tareas', nm: 'Tareas', sub: 'Barras del Gantt', sw: 'var(--p26011)' },\r\n  { id: 'cpm', nm: 'Ruta crítica', sub: 'CPM · borde cian', sw: 'var(--cyan)' },\r\n  { id: 'hitos', nm: 'Milestones', sub: 'Rombo cian', sw: 'var(--cyan)' },\r\n  { id: 'ext', nm: 'Eventos externos', sub: 'Google / Outlook · lectura', sw: 'var(--subtle)' },\r\n  { id: 'festivos', nm: 'Festivos', sub: 'Calendario Colombia', sw: 'var(--subtle)' },\r\n  { id: 'aus', nm: 'Ausencias del equipo', sub: 'Vacaciones · permisos', sw: 'var(--orange)' },\r\n];\r\n\r\nexport function CalLayersPop({ off, onToggle }: CalLayersPopProps) {\r\n  const offList = off || [];\r\n  return (\r\n    <div\r\n      className=\"cal-pop cal-layers-pop\"\r\n      style={{ position: 'absolute', top: '42px', right: '20px', zIndex: 30 }}\r\n    >\r\n      {LAYERS.map((l) => {\r\n        const isOff = offList.includes(l.id);\r\n        return (\r\n          <div\r\n            key={l.id}\r\n            className={'cal-layer-row' + (isOff ? ' off' : '')}\r\n            onClick={() => onToggle(l.id)}\r\n          >\r\n            <span className=\"sw\" style={{ background: l.sw, opacity: isOff ? 0.3 : 1 }} />\r\n            <div>\r\n              <div className=\"nm\">{l.nm}</div>\r\n              <div className=\"sub\">{l.sub}</div>\r\n            </div>\r\n            <span className={'cal-switch' + (isOff ? '' : ' on')} />\r\n          </div>\r\n        );\r\n      })}\r\n    </div>\r\n  );\r\n}\r\n","/* ============================================================\r\n   ASAKAA PULSE · Calendario — popovers de solo lectura (Sprint 1)\r\n   Fiel al diseño de referencia (cal-components.jsx / cal-screens.jsx).\r\n   Usa las clases .cal-* de calendar.css. Sin drag, sin CPM (eso es S3).\r\n   ============================================================ */\r\nimport React, { useEffect, useRef } from 'react';\r\nimport type { DayItem, DayItemType } from './calendarLayout';\r\n\r\n/** Icono por tipo de elemento de día (C2). */\r\nconst CHIP_ICON: Record<DayItemType, string> = {\r\n  hito: '◆',\r\n  desembolso: '◆',\r\n  deadline: '⚑',\r\n  ext: '○',\r\n  aus: '⊘',\r\n};\r\n\r\n/** Color del icono/swatch por tipo, vía variables del tema. */\r\nconst TYPE_COLOR: Record<DayItemType, string> = {\r\n  hito: 'var(--cyan)',\r\n  desembolso: 'var(--cyan)',\r\n  deadline: 'var(--red)',\r\n  ext: 'var(--txt2)',\r\n  aus: 'var(--orange)',\r\n};\r\n\r\n// ── CalMorePopover ───────────────────────────────────────────────────────────\r\n\r\n/** Una barra de tarea que cae en el día (opcional, además de los DayItem). */\r\nexport interface MoreTaskRow {\r\n  /** color del proyecto (CSS var o hex) para el swatch cuadrado. */\r\n  swatch: string;\r\n  /** ID visible de la tarea (TK-xxx). */\r\n  taskId: string;\r\n  label: string;\r\n  /** valor del extremo: horas o coste según toggle. */\r\n  value: string;\r\n  critical?: boolean;\r\n}\r\n\r\nexport interface CalMorePopoverProps {\r\n  /** Etiqueta legible del día, ej. \"Mar 16 jun\". */\r\n  dayLabel: string;\r\n  /** Todos los elementos de día (tipados) que caen ese día. */\r\n  items: DayItem[];\r\n  /** Barras de tareas que también caen ese día (opcional). */\r\n  tasks?: MoreTaskRow[];\r\n  /** Valor mostrado por item (opcional): serial/tipo → string ya formateado. */\r\n  itemValue?: (it: DayItem) => string;\r\n  onClose: () => void;\r\n  style?: React.CSSProperties;\r\n  locale?: 'es' | 'en';\r\n}\r\n\r\n/**\r\n * Popover \"+N más\": lista de TODOS los elementos del día, tipados.\r\n * Cabecera \"{dayLabel} · {n} elementos\". Cierra al click fuera (onClose).\r\n */\r\nexport function CalMorePopover({\r\n  dayLabel,\r\n  items,\r\n  tasks = [],\r\n  itemValue,\r\n  onClose,\r\n  style,\r\n  locale = 'es',\r\n}: CalMorePopoverProps) {\r\n  const en = locale === 'en';\r\n  const ref = useRef<HTMLDivElement>(null);\r\n\r\n  useEffect(() => {\r\n    function onDocPointer(e: MouseEvent) {\r\n      if (ref.current && !ref.current.contains(e.target as Node)) onClose();\r\n    }\r\n    function onKey(e: KeyboardEvent) {\r\n      if (e.key === 'Escape') onClose();\r\n    }\r\n    document.addEventListener('mousedown', onDocPointer);\r\n    document.addEventListener('keydown', onKey);\r\n    return () => {\r\n      document.removeEventListener('mousedown', onDocPointer);\r\n      document.removeEventListener('keydown', onKey);\r\n    };\r\n  }, [onClose]);\r\n\r\n  const total = tasks.length + items.length;\r\n  const defaultItemValue = (it: DayItem): string => {\r\n    switch (it.type) {\r\n      case 'hito':\r\n        return en ? 'Milestone' : 'Hito';\r\n      case 'desembolso':\r\n        return en ? 'Disb.' : 'Desemb.';\r\n      case 'deadline':\r\n        return en ? 'Due' : 'Vence';\r\n      case 'aus':\r\n        return en ? 'Absence' : 'Ausencia';\r\n      case 'ext':\r\n      default:\r\n        return '';\r\n    }\r\n  };\r\n  const valueOf = itemValue || defaultItemValue;\r\n\r\n  return (\r\n    <div\r\n      ref={ref}\r\n      className=\"cal-pop\"\r\n      style={{ position: 'absolute', width: '320px', zIndex: 30, ...style }}\r\n      role=\"dialog\"\r\n      aria-label={`${dayLabel} · ${total} ${en ? 'items' : 'elementos'}`}\r\n    >\r\n      <div className=\"cal-pop-head\">\r\n        <div className=\"sup\">\r\n          {dayLabel} · {total} {en ? (total === 1 ? 'item' : 'items') : (total === 1 ? 'elemento' : 'elementos')}\r\n        </div>\r\n      </div>\r\n      <div className=\"cal-pop-list\">\r\n        {tasks.map((r, i) => (\r\n          <div key={`t${i}`} className=\"cal-pop-item\">\r\n            <span className=\"sw\" style={{ background: r.swatch }} />\r\n            {r.taskId ? <span className=\"tk\">{r.taskId}</span> : null}\r\n            <span\r\n              style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\r\n            >\r\n              {r.label}\r\n            </span>\r\n            {r.critical ? (\r\n              <span\r\n                style={{\r\n                  fontFamily: 'var(--mono)',\r\n                  fontSize: '8px',\r\n                  letterSpacing: '0.1em',\r\n                  color: '#031',\r\n                  background: 'var(--cyan)',\r\n                  borderRadius: '3px',\r\n                  padding: '1.5px 3.5px',\r\n                  fontWeight: 700,\r\n                }}\r\n              >\r\n                CPM\r\n              </span>\r\n            ) : null}\r\n            <span className=\"v\">{r.value}</span>\r\n          </div>\r\n        ))}\r\n        {items.map((it, i) => (\r\n          <div key={`i${i}`} className=\"cal-pop-item\">\r\n            <span className=\"ico\" style={{ color: TYPE_COLOR[it.type] }}>\r\n              {CHIP_ICON[it.type]}\r\n            </span>\r\n            <span\r\n              style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\r\n            >\r\n              {it.label}\r\n            </span>\r\n            <span className=\"v\">{valueOf(it)}</span>\r\n          </div>\r\n        ))}\r\n        <div className=\"cal-scrollbar\" />\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\n// ── CalEmptyState ────────────────────────────────────────────────────────────\r\n\r\nexport interface UpcomingMilestone {\r\n  type: 'hito' | 'deadline';\r\n  label: string;\r\n  /** fecha ya formateada, ej. \"14 oct\". */\r\n  date: string;\r\n}\r\n\r\nexport interface CalEmptyStateProps {\r\n  /** Etiqueta del mes visible, ej. \"Junio 2026\". */\r\n  monthLabel: string;\r\n  /**\r\n   * 1.9.44 · Yesid, 2-oct: el calendario abre SIEMPRE en el mes de hoy; si ese mes\r\n   * no tiene tareas, se ofrece ir al de la primera: «Ir a la primera (marzo) →».\r\n   */\r\n  irAPrimera?: { mes: string; onClick: () => void };\r\n  upcomingMilestones?: UpcomingMilestone[];\r\n  locale?: 'es' | 'en';\r\n  /**\r\n   * Crear la primera tarea. Sin esto el estado vacio solo describe; con esto\r\n   * ofrece la salida, que es lo que pide REQ-07 §2.5: «el mensaje debe decir\r\n   * que hacer y ofrecer hacerlo».\r\n   *\r\n   * Opcional a proposito: quien no lo pase mantiene el estado de solo lectura.\r\n   */\r\n  onCreateTask?: () => void;\r\n}\r\n\r\nconst EMPTY_COPY = {\r\n  es: {\r\n    title: 'Sin tareas programadas este mes',\r\n    upcoming: 'Próximos hitos',\r\n    /*\r\n     * REQ-07 §2.5. El texto anterior decia «arrastra tareas del BACKLOG o\r\n     * crealas en el GANTT» y «el plan CPM proyectara aqui...».\r\n     *\r\n     * Yesid: «no hay un backlog visible en ninguna parte, y 'el plan CPM' no\r\n     * significa nada para quien usa la herramienta».\r\n     *\r\n     * Lo nuevo nombra lo que el usuario SI ve —el mes— y ofrece la accion.\r\n     */\r\n    body: 'Las tareas con fecha en este mes aparecerán aquí.',\r\n    crear: 'Crear una tarea',\r\n  },\r\n  en: {\r\n    title: 'No tasks scheduled this month',\r\n    upcoming: 'Upcoming milestones',\r\n    body: 'Tasks with dates in this month will show up here.',\r\n    crear: 'Create a task',\r\n  },\r\n};\r\n\r\n/**\r\n * Estado vacío premium (C13): glifo ◇◇◇, título guía, y tarjeta \"Próximos\r\n * hitos\" si hay upcomingMilestones. Solo lectura.\r\n */\r\nexport function CalEmptyState({\r\n  monthLabel,\r\n  upcomingMilestones = [],\r\n  locale = 'es',\r\n  onCreateTask,\r\n  irAPrimera,\r\n}: CalEmptyStateProps) {\r\n  const copy = EMPTY_COPY[locale] || EMPTY_COPY.es;\r\n\r\n  return (\r\n    <div className=\"cal-empty\">\r\n      <div className=\"glyph\">◇ ◇ ◇</div>\r\n      <h3>{copy.title}</h3>\r\n      <p>\r\n        {copy.body}\r\n        <br />\r\n        <b>{monthLabel}</b>\r\n      </p>\r\n      {irAPrimera ? (\r\n        <button type=\"button\" data-ir-a-primera className=\"cal-empty-crear\" onClick={irAPrimera.onClick}>\r\n          {locale === 'en' ? `Go to the first (${irAPrimera.mes}) →` : `Ir a la primera (${irAPrimera.mes}) →`}\r\n        </button>\r\n      ) : null}\r\n      {onCreateTask ? (\r\n        <button type=\"button\" className=\"cal-empty-crear\" onClick={onCreateTask}>\r\n          {copy.crear}\r\n        </button>\r\n      ) : null}\r\n      {upcomingMilestones.length > 0 ? (\r\n        <div className=\"cal-empty-hitos\">\r\n          <div className=\"hd\">{copy.upcoming}</div>\r\n          {upcomingMilestones.map((m, i) => (\r\n            <div key={i} className=\"cal-empty-hito\">\r\n              <span className={'ic ' + (m.type === 'deadline' ? 'rd' : 'cy')}>\r\n                {m.type === 'deadline' ? '⚑' : '◆'}\r\n              </span>\r\n              {m.label}\r\n              <span className=\"d\">{m.date}</span>\r\n            </div>\r\n          ))}\r\n        </div>\r\n      ) : null}\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * Calendario (Asakaa Pulse) — Sprint 2, franja de Capacidad (C7).\r\n *\r\n * Solo lectura. Pinta, bajo cada semana de la grilla, una celda por día con\r\n * \"{asignadas}h / {capacidad}h\" + barra (verde <90%, ámbar 90-100%, roja >100%),\r\n * y al hacer click abre un popover con el desglose por persona.\r\n *\r\n * Una sola fuente de verdad: TODOS los números salen de los `TeamMember` de\r\n * useTeamCapacity (member.dailyEstimated). Nada se inventa. Sáb/Dom/festivos\r\n * no admiten registro de horas → \"—\" y se omiten de la agregación.\r\n *\r\n * Clases .cal-* definidas en calendar.css:\r\n *   .cal-cap-row / .cal-cap-cell (.ok|.warn|.over|.off|.sel) / .cal-cap-track / .cal-cap-fill\r\n *   .cal-pop / .cal-pop-head / .cal-person-row (.over) / .cal-person-track / .cal-person-fill\r\n */\r\n\r\nimport { useEffect, useRef } from 'react';\r\nimport type { CSSProperties } from 'react';\r\nexport interface DailyLog { date: string; hours: number }\r\nexport interface TeamMember { userId: string; name: string; weeklyCapacity?: number; dailyEstimated: DailyLog[] }\r\n\r\n// ─── Tipos ───\r\n\r\n/** Día tal como lo entrega la grilla del calendario para esta semana. */\r\nexport interface CapDay {\r\n  serial: number;\r\n  date: Date;\r\n  isWeekend: boolean;\r\n  isHoliday: boolean;\r\n}\r\n\r\n/** Carga agregada de un día: horas asignadas vs. capacidad-techo del equipo. */\r\nexport interface DayCapacity {\r\n  assigned: number;\r\n  capacity: number;\r\n  perPerson: PersonLoad[];\r\n}\r\n\r\n/** Carga de una persona en un día concreto. */\r\nexport interface PersonLoad {\r\n  name: string;\r\n  initials: string;\r\n  color: string;\r\n  hours: number;\r\n  capacity: number;\r\n}\r\n\r\n// ─── Helpers internos ───\r\n\r\n/** 'YYYY-MM-DD' en calendario local (NO UTC) — debe casar con las claves de dailyEstimated. */\r\nfunction toLocalISO(d: Date): string {\r\n  return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\r\n}\r\n\r\n/** Iniciales (máx. 2) a partir del nombre — fallback consistente con el avatar del equipo. */\r\nfunction initialsOf(name: string): string {\r\n  const parts = name.trim().split(/\\s+/).filter(Boolean);\r\n  if (parts.length === 0) return '?';\r\n  if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase();\r\n  return (parts[0]![0]! + parts[parts.length - 1]![0]!).toUpperCase();\r\n}\r\n\r\n/** Paleta determinista por persona (mismo color para el mismo userId entre renders). */\r\nconst PERSON_COLORS = ['#00E5CC', '#8B5CF6', '#F97316', '#22C55E', '#EF4444', '#EC4899', '#F59E0B', '#3B82F6'];\r\nfunction colorForIndex(i: number): string {\r\n  return PERSON_COLORS[i % PERSON_COLORS.length]!;\r\n}\r\n\r\n/** Nivel visual de una celda a partir del % de uso. */\r\nfunction levelClass(pct: number): 'ok' | 'warn' | 'over' {\r\n  if (pct > 1) return 'over';\r\n  if (pct >= 0.9) return 'warn';\r\n  return 'ok';\r\n}\r\n\r\nconst NBSP = ' ';\r\n\r\n/** Redondea a 1 decimal y limpia el \".0\" para mostrar (12.0 → \"12\", 12.5 → \"12.5\"). */\r\nfunction fmtH(h: number): string {\r\n  const r = Math.round(h * 10) / 10;\r\n  return Number.isInteger(r) ? String(r) : r.toFixed(1);\r\n}\r\n\r\n// ─── Helper export: agregación por día ───\r\n\r\n/**\r\n * Agrega `dailyEstimated` de todos los `members` por fecha, SOLO en días\r\n * hábiles no festivos. La capacidad-techo de cada persona ese día es\r\n * `dailyCapacityHours`; la del equipo es nº de personas × dailyCapacityHours.\r\n * Devuelve un Map fecha('YYYY-MM-DD') → {assigned, capacity, perPerson}.\r\n *\r\n * @param members TeamMember[] de useTeamCapacity (member.dailyEstimated: DailyLog[]).\r\n * @param days    días de la semana visible (de la grilla del calendario).\r\n * @param dailyCapacityHours techo de horas por persona/día hábil (de timesheetSettings).\r\n */\r\nexport function buildCapacityByDay(\r\n  members: TeamMember[],\r\n  days: CapDay[],\r\n  dailyCapacityHours: number,\r\n): Map<string, DayCapacity> {\r\n  const out = new Map<string, DayCapacity>();\r\n\r\n  // Solo agregamos los días hábiles no festivos de la semana visible.\r\n  const workKeys = new Set<string>();\r\n  for (const d of days) {\r\n    if (d.isWeekend || d.isHoliday) continue;\r\n    workKeys.add(toLocalISO(d.date));\r\n  }\r\n  if (workKeys.size === 0) return out;\r\n\r\n  // color/iniciales deterministas por persona (índice estable dentro del equipo)\r\n  const metaByUser = new Map<string, { color: string; initials: string }>();\r\n  members.forEach((m, idx) => {\r\n    metaByUser.set(m.userId, { color: colorForIndex(idx), initials: initialsOf(m.name) });\r\n  });\r\n\r\n  // fecha → userId → horas asignadas (suma de dailyEstimated de esa persona ese día)\r\n  const byDateUser = new Map<string, Map<string, number>>();\r\n  for (const m of members) {\r\n    for (const log of (m.dailyEstimated as DailyLog[])) {\r\n      if (!log.date || !workKeys.has(log.date)) continue;\r\n      if (!byDateUser.has(log.date)) byDateUser.set(log.date, new Map());\r\n      const userMap = byDateUser.get(log.date)!;\r\n      userMap.set(m.userId, (userMap.get(m.userId) ?? 0) + (log.hours || 0));\r\n    }\r\n  }\r\n\r\n  for (const key of workKeys) {\r\n    const userMap = byDateUser.get(key) ?? new Map<string, number>();\r\n    const perPerson: PersonLoad[] = members.map((m) => {\r\n      const meta = metaByUser.get(m.userId)!;\r\n      return {\r\n        name: m.name,\r\n        initials: meta.initials,\r\n        color: meta.color,\r\n        hours: Math.round((userMap.get(m.userId) ?? 0) * 100) / 100,\r\n        capacity: dailyCapacityHours,\r\n      };\r\n    });\r\n    const assigned = perPerson.reduce((s, p) => s + p.hours, 0);\r\n    out.set(key, {\r\n      assigned: Math.round(assigned * 100) / 100,\r\n      capacity: dailyCapacityHours * members.length,\r\n      perPerson,\r\n    });\r\n  }\r\n\r\n  return out;\r\n}\r\n\r\n// ─── CalCapRow ───\r\n\r\n/**\r\n * Fila de capacidad bajo una semana: una celda por día. Sáb/Dom/festivo → \"—\".\r\n * Click en un día con datos dispara `onSelectDay` para abrir el desglose.\r\n */\r\nexport function CalCapRow({\r\n  days,\r\n  capByDay,\r\n  selectedKey,\r\n  onSelectDay,\r\n}: {\r\n  days: CapDay[];\r\n  capByDay: Map<string, DayCapacity>;\r\n  selectedKey?: string | null;\r\n  onSelectDay?: (key: string, dayLabel: string, anchor: HTMLElement) => void;\r\n}) {\r\n  return (\r\n    <div className=\"cal-cap-row\">\r\n      {days.map((d) => {\r\n        const key = toLocalISO(d.date);\r\n        const off = d.isWeekend || d.isHoliday;\r\n        const cap = off ? undefined : capByDay.get(key);\r\n        const hasData = !!cap && cap.capacity > 0;\r\n        const pct = hasData ? cap!.assigned / cap!.capacity : 0;\r\n        const lvl = off ? 'off' : levelClass(pct);\r\n        const cls = 'cal-cap-cell ' + lvl + (selectedKey === key ? ' sel' : '');\r\n\r\n        const dayLabel = d.date.toLocaleDateString('es', { weekday: 'short', day: 'numeric', month: 'short' });\r\n\r\n        return (\r\n          <div\r\n            key={d.serial}\r\n            className={cls}\r\n            role={hasData && onSelectDay ? 'button' : undefined}\r\n            tabIndex={hasData && onSelectDay ? 0 : undefined}\r\n            title={off ? undefined : dayLabel}\r\n            onClick={(e) => {\r\n              if (!hasData || !onSelectDay) return;\r\n              onSelectDay(key, dayLabel, e.currentTarget);\r\n            }}\r\n            onKeyDown={(e) => {\r\n              if (!hasData || !onSelectDay) return;\r\n              if (e.key === 'Enter' || e.key === ' ') {\r\n                e.preventDefault();\r\n                onSelectDay(key, dayLabel, e.currentTarget);\r\n              }\r\n            }}\r\n          >\r\n            <div className=\"nums\">\r\n              {off || !hasData ? (\r\n                <span>{off ? '—' : `0h${NBSP}/${NBSP}—`}</span>\r\n              ) : (\r\n                <>\r\n                  <b>{fmtH(cap!.assigned)}h</b>\r\n                  <span>/{NBSP}{fmtH(cap!.capacity)}h</span>\r\n                </>\r\n              )}\r\n            </div>\r\n            <div className=\"cal-cap-track\">\r\n              {hasData ? (\r\n                <div className=\"cal-cap-fill\" style={{ width: Math.min(pct * 100, 100) + '%' }} />\r\n              ) : null}\r\n            </div>\r\n          </div>\r\n        );\r\n      })}\r\n    </div>\r\n  );\r\n}\r\n\r\n// ─── CalBreakdownPopover ───\r\n\r\n/**\r\n * Popover de desglose por persona de un día. Lista cada persona con su barra\r\n * (roja si sus horas exceden su capacidad). Cierra con click fuera + Escape.\r\n */\r\nexport function CalBreakdownPopover({\r\n  dayLabel,\r\n  perPerson,\r\n  onClose,\r\n  style,\r\n}: {\r\n  dayLabel: string;\r\n  perPerson: PersonLoad[];\r\n  onClose: () => void;\r\n  style?: CSSProperties;\r\n}) {\r\n  const ref = useRef<HTMLDivElement>(null);\r\n\r\n  useEffect(() => {\r\n    const onKey = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape') onClose();\r\n    };\r\n    const onDown = (e: MouseEvent) => {\r\n      if (ref.current && !ref.current.contains(e.target as Node)) onClose();\r\n    };\r\n    document.addEventListener('keydown', onKey);\r\n    document.addEventListener('mousedown', onDown);\r\n    return () => {\r\n      document.removeEventListener('keydown', onKey);\r\n      document.removeEventListener('mousedown', onDown);\r\n    };\r\n  }, [onClose]);\r\n\r\n  const assigned = perPerson.reduce((s, p) => s + p.hours, 0);\r\n  const capacity = perPerson.reduce((s, p) => s + p.capacity, 0);\r\n  const over = capacity > 0 && assigned > capacity;\r\n  const delta = Math.round((assigned - capacity) * 10) / 10;\r\n\r\n  return (\r\n    <div\r\n      ref={ref}\r\n      className=\"cal-pop\"\r\n      role=\"dialog\"\r\n      style={{ position: 'absolute', width: '276px', zIndex: 30, ...style }}\r\n    >\r\n      <div className=\"cal-pop-head\">\r\n        <div className=\"sup\">Capacidad · {dayLabel}</div>\r\n        <div className=\"tit\" style={over ? { color: 'var(--red)' } : undefined}>\r\n          {fmtH(assigned)}h asignadas / {fmtH(capacity)}h\r\n        </div>\r\n        {over ? (\r\n          <div className=\"rng\"><b>+{fmtH(delta)}h sobre capacidad</b></div>\r\n        ) : (\r\n          <div className=\"rng\">{perPerson.length} {perPerson.length === 1 ? 'persona' : 'personas'}</div>\r\n        )}\r\n      </div>\r\n      <div>\r\n        {perPerson.map((p) => {\r\n          const pOver = p.capacity > 0 && p.hours > p.capacity;\r\n          const denom = p.capacity > 0 ? p.capacity : 1;\r\n          return (\r\n            <div key={p.name} className={pOver ? 'cal-person-row over' : 'cal-person-row'}>\r\n              <span className=\"pava\" style={{ background: p.color }}>{p.initials}</span>\r\n              <span className=\"nm\" title={p.name}>{p.name}</span>\r\n              <div className=\"cal-person-track\">\r\n                <div\r\n                  className=\"cal-person-fill\"\r\n                  style={{ width: Math.min((p.hours / denom) * 100, 100) + '%' }}\r\n                />\r\n              </div>\r\n              <span className=\"hrs\">{fmtH(p.hours)}h / {fmtH(p.capacity)}h</span>\r\n            </div>\r\n          );\r\n        })}\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * Calendario (Asakaa Pulse) — vistas Semana y Lookahead (Sprint 2, SOLO LECTURA).\r\n *\r\n * Reemplaza el placeholder \"Vista en construcción\" de CalendarView para los\r\n * modos 'semana' (1 semana) y 'lookahead' (2 semanas desde hoy). Cada semana se\r\n * pinta con el mismo lenguaje del Mes (WeekBg + CalBar/CalChip/CalMoreChip) pero\r\n * con filas más altas (slotH 28, height ~182px como ScreenLookahead del diseño)\r\n * y, debajo de cada una, la franja de capacidad real del equipo (CalCapRow).\r\n *\r\n * No duplica el motor de datos: recibe las tareas/ítems ya proyectados por\r\n * calendarData/calendarLayout y las filas de capacidad (capRows) ya derivadas de\r\n * useTeamCapacity por el contenedor. Sin drag/resize: pura proyección.\r\n */\r\n\r\nimport { useMemo } from 'react';\r\nimport type { CSSProperties } from 'react';\r\nimport {\r\n  layoutWeek, isWeekendSerial,\r\n  type MonthGrid, type CalTask, type DayItem,\r\n} from './calendarLayout';\r\nimport { CalBar, CalChip, CalMoreChip, type MoneyMode } from './CalendarParts';\r\nimport { CalCapRow, type CapDay, type DayCapacity } from './CalendarCapacity';\r\n\r\nconst WEEK_SLOT_H = 28;\r\nconst WEEK_ROW_H = 182;\r\n\r\n/** Rango de una semana en serial de la grilla [ws, we]. */\r\nexport interface WeekRange { ws: number; we: number }\r\n\r\n/** Capacidad por semana: índice de semana → { días + mapa de carga por día }. */\r\nexport interface WeekCap { days: CapDay[]; capByDay: Map<string, DayCapacity> }\r\nexport type CapRowsByWeek = Record<number, WeekCap>;\r\n\r\nexport interface WeekGridViewProps {\r\n  grid: MonthGrid;\r\n  /** 1 semana (Semana) o 2 (Lookahead). */\r\n  weeks: WeekRange[];\r\n  tasks: CalTask[];\r\n  items: DayItem[];\r\n  money: MoneyMode;\r\n  projColor: string;\r\n  todaySerial: number;\r\n  locale: 'es' | 'en';\r\n  /** capRows[wi] = celdas de capacidad de la semana wi (alineadas a [ws..we]). */\r\n  capRows?: CapRowsByWeek;\r\n  /** nº de personas en la capacidad del equipo (para el footer). */\r\n  teamSize?: number;\r\n  onTaskOpen?: (taskId: string) => void;\r\n  onMore: (day: number, items: DayItem[], tasksOfDay: CalTask[]) => void;\r\n  /** click en una celda de capacidad → abre desglose por persona. */\r\n  onCapDay?: (key: string, dayLabel: string, anchor: HTMLElement) => void;\r\n}\r\n\r\nexport function WeekGridView({\r\n  grid, weeks, tasks, items, money, projColor, todaySerial, locale,\r\n  capRows, teamSize, onTaskOpen, onMore, onCapDay,\r\n}: WeekGridViewProps): React.ReactElement {\r\n  const isEs = locale === 'es';\r\n  return (\r\n    <div className=\"cal-grid-zone\" style={{ position: 'relative' }}>\r\n      <div className=\"cal-weeks\" style={{ flex: 'none' }}>\r\n        {weeks.map((w, wi) => (\r\n          <div key={w.ws} style={{ display: 'contents' }}>\r\n            <WeekRowTall\r\n              grid={grid}\r\n              ws={w.ws}\r\n              we={w.we}\r\n              tasks={tasks}\r\n              items={items}\r\n              money={money}\r\n              projColor={projColor}\r\n              todaySerial={todaySerial}\r\n              onTaskOpen={onTaskOpen}\r\n              onMore={onMore}\r\n            />\r\n            {capRows && capRows[wi] ? (\r\n              <CalCapRow days={capRows[wi].days} capByDay={capRows[wi].capByDay} onSelectDay={onCapDay} />\r\n            ) : null}\r\n          </div>\r\n        ))}\r\n      </div>\r\n\r\n      <div className=\"cal-cap-label\">\r\n        <span>\r\n          {isEs ? 'Capacidad del equipo' : 'Team capacity'}\r\n          {teamSize != null\r\n            ? ` · ${teamSize} ${isEs ? (teamSize === 1 ? 'persona' : 'personas') : (teamSize === 1 ? 'person' : 'people')}`\r\n            : ''}\r\n        </span>\r\n        <span>\r\n          {isEs\r\n            ? 'Click en un día abre el desglose por persona'\r\n            : 'Click a day to open the per-person breakdown'}\r\n        </span>\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\n// ── Una semana de altura aumentada (Semana / Lookahead) ──────────────────────\r\ninterface WeekRowTallProps {\r\n  grid: MonthGrid;\r\n  ws: number; we: number;\r\n  tasks: CalTask[];\r\n  items: DayItem[];\r\n  money: MoneyMode;\r\n  projColor: string;\r\n  todaySerial: number;\r\n  onTaskOpen?: (taskId: string) => void;\r\n  onMore: (day: number, items: DayItem[], tasksOfDay: CalTask[]) => void;\r\n}\r\n\r\nfunction WeekRowTall({\r\n  grid, ws, we, tasks, items, money, projColor, todaySerial, onTaskOpen, onMore,\r\n}: WeekRowTallProps): React.ReactElement {\r\n  const lay = useMemo(() => layoutWeek(tasks, items, ws, we), [tasks, items, ws, we]);\r\n  const deadlineDays = useMemo(\r\n    () => new Set(items.filter((i) => i.type === 'deadline').map((i) => i.serial)),\r\n    [items],\r\n  );\r\n\r\n  const days: number[] = [];\r\n  for (let d = ws; d <= we; d++) days.push(d);\r\n\r\n  const style: CSSProperties = { height: `${WEEK_ROW_H}px`, flex: 'none' };\r\n\r\n  return (\r\n    <div className=\"cal-week\" style={style}>\r\n      <div className=\"cal-week-bg\">\r\n        {days.map((d) => {\r\n          const date = grid.serialToDate(d);\r\n          const inMonth = d >= grid.monthStartSerial && d <= grid.monthEndSerial;\r\n          let cls = 'cal-day';\r\n          if (isWeekendSerial(grid, d)) cls += ' wknd';\r\n          if (!inMonth) cls += ' out';\r\n          if (d === todaySerial) cls += ' today';\r\n          if (deadlineDays.has(d)) cls += ' deadline-day';\r\n          return (\r\n            <div key={d} className={cls}>\r\n              <span className=\"cal-day-num\">{date.getDate()}</span>\r\n            </div>\r\n          );\r\n        })}\r\n      </div>\r\n      <div className=\"cal-items\">\r\n        {lay.bars.map((b, i) => (\r\n          <div\r\n            key={`b${i}`}\r\n            onClick={() => onTaskOpen?.(b.t.uid)}\r\n            style={{ cursor: onTaskOpen ? 'pointer' : 'default', display: 'contents' }}\r\n          >\r\n            <CalBar bar={b} ws={ws} money={money} projColor={projColor} slotH={WEEK_SLOT_H} />\r\n          </div>\r\n        ))}\r\n        {lay.chips.map((c, i) => (\r\n          <CalChip key={`c${i}`} chip={c} ws={ws} slotH={WEEK_SLOT_H} />\r\n        ))}\r\n        {lay.more.map((m, i) => (\r\n          <CalMoreChip\r\n            key={`m${i}`}\r\n            more={m}\r\n            ws={ws}\r\n            slotH={WEEK_SLOT_H}\r\n            onClick={() => onMore(\r\n              m.day,\r\n              m.items,\r\n              tasks.filter((t) => t.startSerial <= m.day && t.endSerial >= m.day),\r\n            )}\r\n          />\r\n        ))}\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * Calendario (Asakaa Pulse) — Backlog · Sin fecha (C8) + rail colapsado. Sprint 2.\r\n *\r\n * SOLO LECTURA: la lista y el rail funcionan, pero el drag-drop con commit a la\r\n * tarea real es Sprint 3 (aquí solo el click abre el drawer). No inventa datos:\r\n * el backlog son las tareas REALES del proyecto que no tienen fecha de inicio o\r\n * de fin asignada (las \"sin fecha\"). Si no hay ninguna, estado vacío sutil.\r\n *\r\n * Usa las clases .cal-side / .cal-card / .cal-rail de calendar.css.\r\n */\r\n\r\nimport type React from 'react';\r\nimport type { Task as GanttTask } from '../Gantt/types';\r\nimport type { MoneyMode } from './CalendarParts';\r\n\r\n/** Ficha de backlog ya proyectada (datos reales, no del modelo del diseño). */\r\nexport interface BacklogItem {\r\n  /** UUID real de la tarea (para abrir el drawer). */\r\n  taskId: string;\r\n  /** ID visible legible (wbsCode/displayId); '' si solo hay UUID. */\r\n  id: string;\r\n  name: string;\r\n  hrs: number;\r\n  cost: string;\r\n  /** iniciales del responsable, si hay. */\r\n  who?: string;\r\n  /** color del proyecto (CSS) para el punto. */\r\n  projColor?: string;\r\n}\r\n\r\n/* ============================================================\r\n   buildBacklog — tareas reales SIN fecha → fichas de backlog\r\n   ============================================================ */\r\n\r\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\r\nfunction isUuid(s: string): boolean {\r\n  return UUID_RE.test(s) || /^task-\\d+/.test(s);\r\n}\r\n\r\nfunction initials(name: string): string {\r\n  const parts = name.trim().split(/\\s+/);\r\n  if (parts.length >= 2) return (parts[0]![0]! + parts[parts.length - 1]![0]!).toUpperCase();\r\n  return name.slice(0, 2).toUpperCase();\r\n}\r\n\r\n/** \"$1.9k\" / \"$475\" — formato compacto coherente con el resto del calendario. */\r\nfunction fmtCost(amount: number): string {\r\n  if (amount >= 1000) return `$${(amount / 1000).toFixed(1).replace(/\\.0$/, '')}k`;\r\n  return `$${Math.round(amount)}`;\r\n}\r\n\r\nfunction flatten(tasks: GanttTask[]): GanttTask[] {\r\n  const out: GanttTask[] = [];\r\n  const walk = (list: GanttTask[]) => {\r\n    for (const t of list) {\r\n      out.push(t);\r\n      if (t.subtasks?.length) walk(t.subtasks);\r\n    }\r\n  };\r\n  walk(tasks);\r\n  return out;\r\n}\r\n\r\n/**\r\n * Filtra las tareas que NO tienen fecha de inicio o de fin (backlog \"sin fecha\")\r\n * y las mapea a fichas. Aplana subtareas. No inventa nada: si la tarea tiene\r\n * ambas fechas, no es backlog y se omite.\r\n */\r\nexport function buildBacklog(tasks: GanttTask[], hourlyRate: number): BacklogItem[] {\r\n  const flat = flatten(tasks);\r\n  const items: BacklogItem[] = [];\r\n  for (const t of flat) {\r\n    if (t.startDate && t.endDate) continue; // tiene fecha → no es backlog\r\n\r\n    const mins = (t as { effortMinutes?: number | null }).effortMinutes ?? 0;\r\n    const hrs = Math.round((mins / 60) * 10) / 10;\r\n    const explicitCost = (t as { costAtCompletion?: number | null }).costAtCompletion;\r\n    const cost = explicitCost != null ? fmtCost(explicitCost) : fmtCost(hrs * hourlyRate);\r\n    const assignee = t.assignees?.[0];\r\n    const who = assignee?.initials || (assignee?.name ? initials(assignee.name) : undefined);\r\n\r\n    const shortId =\r\n      (t as { displayId?: string }).displayId || (t as { wbsCode?: string }).wbsCode || '';\r\n    const visibleId = isUuid(shortId || t.id) ? '' : shortId || t.id;\r\n\r\n    items.push({\r\n      taskId: t.id,\r\n      id: visibleId,\r\n      name: t.name,\r\n      hrs,\r\n      cost,\r\n      who,\r\n      projColor: (t as { color?: string }).color,\r\n    });\r\n  }\r\n  return items;\r\n}\r\n\r\n/* ============================================================\r\n   CalBacklogPanel — panel lateral derecho (C8), solo lectura\r\n   ============================================================ */\r\n\r\nexport interface CalBacklogPanelProps {\r\n  items: BacklogItem[];\r\n  /** abre el drawer de la tarea (taskId real). */\r\n  onItemClick: (taskId: string) => void;\r\n  /** colapsa el panel → rail. */\r\n  onCollapse: () => void;\r\n  money: MoneyMode;\r\n  /** color por defecto del proyecto (vista de un solo proyecto). */\r\n  projColor?: string;\r\n  locale?: 'es' | 'en';\r\n}\r\n\r\nexport function CalBacklogPanel({\r\n  items,\r\n  onItemClick,\r\n  onCollapse,\r\n  money,\r\n  projColor,\r\n  locale = 'es',\r\n}: CalBacklogPanelProps): React.ReactElement {\r\n  const en = locale === 'en';\r\n  return (\r\n    <div className=\"cal-side\">\r\n      <div className=\"cal-side-head\">\r\n        <span className=\"t\">⚡ Backlog · {en ? 'No date' : 'Sin fecha'}</span>\r\n        <button type=\"button\" className=\"cal-pcollapse\" onClick={onCollapse} title={en ? 'Collapse panel' : 'Colapsar panel'}>\r\n          ⟩\r\n        </button>\r\n      </div>\r\n      <div className=\"cal-side-sec\">\r\n        <span>{en ? 'Drag onto the calendar' : 'Arrastra al calendario'}</span>\r\n        <span>{items.length}</span>\r\n      </div>\r\n\r\n      {items.length === 0 ? (\r\n        <div\r\n          style={{\r\n            padding: '24px 16px',\r\n            fontFamily: 'var(--mono)',\r\n            fontSize: '10px',\r\n            letterSpacing: '0.08em',\r\n            color: 'var(--subtle)',\r\n            textAlign: 'center',\r\n          }}\r\n        >\r\n          Sin tareas en backlog\r\n        </div>\r\n      ) : (\r\n        items.map((b) => {\r\n          const val = money === '$' ? b.cost : `${b.hrs}h`;\r\n          return (\r\n            <div\r\n              key={b.taskId}\r\n              className=\"cal-card\"\r\n              role=\"button\"\r\n              tabIndex={0}\r\n              onClick={() => onItemClick(b.taskId)}\r\n              onKeyDown={(e) => {\r\n                if (e.key === 'Enter' || e.key === ' ') {\r\n                  e.preventDefault();\r\n                  onItemClick(b.taskId);\r\n                }\r\n              }}\r\n            >\r\n              <div className=\"row1\">\r\n                {b.id ? <span className=\"tk\">{b.id}</span> : null}\r\n                <span className=\"pdot\" style={{ background: b.projColor || projColor }} />\r\n              </div>\r\n              <div className=\"nom\">{b.name}</div>\r\n              <div className=\"meta\">\r\n                <span>\r\n                  <b>{b.hrs}h</b> est\r\n                </span>\r\n                <span>{val}</span>\r\n                {b.who ? <span className=\"cal-ava\">{b.who}</span> : null}\r\n              </div>\r\n            </div>\r\n          );\r\n        })\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n\r\n/* ============================================================\r\n   CalPulseRail — rail colapsado (42px) con texto vertical\r\n   ============================================================ */\r\n\r\nexport interface CalPulseRailProps {\r\n  locale?: 'es' | 'en';\r\n  /** expande el rail → panel. */\r\n  onExpand: () => void;\r\n}\r\n\r\nexport function CalPulseRail({ onExpand, locale = 'es' }: CalPulseRailProps): React.ReactElement {\r\n  const en = locale === 'en';\r\n  return (\r\n    <div\r\n      className=\"cal-rail\"\r\n      role=\"button\"\r\n      tabIndex={0}\r\n      onClick={onExpand}\r\n      onKeyDown={(e) => {\r\n        if (e.key === 'Enter' || e.key === ' ') {\r\n          e.preventDefault();\r\n          onExpand();\r\n        }\r\n      }}\r\n      title={en ? 'Expand backlog' : 'Expandir backlog'}\r\n    >\r\n      <span className=\"pc\">⟨</span>\r\n      <span className=\"dot\" />\r\n      <span className=\"vtxt\">Backlog · {en ? 'Status' : 'Estado'}</span>\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * Popover de impacto CPM (Calendario, Sprint 3, regla C5).\r\n *\r\n * Se muestra al soltar una tarea movida/redimensionada. Presenta el resultado\r\n * de simulateReschedule (sin commit): fechas antes→después, sucesoras movidas,\r\n * impacto en fin de proyecto, y si está en ruta crítica. Confirmar dispara el\r\n * commit real (updateTask del Gantt); Cancelar revierte sin efectos.\r\n */\r\nimport { useEffect, useRef } from 'react';\r\nimport type { CSSProperties } from 'react';\r\nimport type { RescheduleSimulation } from './calendarReschedule';\r\n\r\ninterface Props {\r\n  taskName: string;\r\n  taskId: string;\r\n  sim: RescheduleSimulation;\r\n  busy?: boolean;\r\n  locale: 'es' | 'en';\r\n  onConfirm: () => void;\r\n  onCancel: () => void;\r\n  style?: CSSProperties;\r\n}\r\n\r\nfunction fmt(d: Date, locale: 'es' | 'en'): string {\r\n  return d.toLocaleDateString(locale === 'es' ? 'es-CO' : 'en-US', { day: 'numeric', month: 'short' });\r\n}\r\n\r\nexport function CalendarReschedulePopover({ taskName, taskId, sim, busy, locale, onConfirm, onCancel, style }: Props) {\r\n  const ref = useRef<HTMLDivElement>(null);\r\n  const es = locale === 'es';\r\n\r\n  useEffect(() => {\r\n    const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onCancel(); };\r\n    document.addEventListener('keydown', onKey);\r\n    return () => document.removeEventListener('keydown', onKey);\r\n  }, [onCancel]);\r\n\r\n  const critical = sim.wasCritical;\r\n  const delta = sim.projectEndDeltaDays;\r\n  const deltaLabel = delta > 0\r\n    ? `+${delta} ${es ? (delta === 1 ? 'día' : 'días') : (delta === 1 ? 'day' : 'days')} · ${fmt(sim.oldProjectEnd, locale)} → ${fmt(sim.newProjectEnd, locale)}`\r\n    : `+0 ${es ? 'días' : 'days'}${sim.slackDays > 0 ? ` · ${es ? 'holgura' : 'slack'} ${sim.slackDays}${es ? 'd' : 'd'}` : ''}`;\r\n\r\n  const confirmLabel = delta > 0\r\n    ? (es ? `Confirmar +${delta} ${delta === 1 ? 'día' : 'días'}` : `Confirm +${delta} ${delta === 1 ? 'day' : 'days'}`)\r\n    : (es ? 'Confirmar movimiento' : 'Confirm move');\r\n\r\n  return (\r\n    <div ref={ref} className=\"cal-pop\" style={{ width: '324px', zIndex: 60, ...style }} role=\"dialog\">\r\n      <div className=\"cal-pop-head\">\r\n        <div className=\"sup\">{es ? 'Confirmar movimiento' : 'Confirm move'}</div>\r\n        <div className=\"tit\">{taskId ? `${taskId} · ` : ''}{taskName}</div>\r\n        <div className=\"rng\">\r\n          {fmt(sim.oldStart, locale)} – {fmt(sim.oldEnd, locale)} → <b>{fmt(sim.newStart, locale)} – {fmt(sim.newEnd, locale)}</b>\r\n        </div>\r\n      </div>\r\n\r\n      {critical ? (\r\n        <div className=\"cal-pop-warn\">⚠ {es ? 'Esta tarea está en ruta crítica' : 'This task is on the critical path'}</div>\r\n      ) : null}\r\n\r\n      <div className=\"cal-impact\">\r\n        <div className=\"cal-impact-row\">\r\n          <span className=\"k\">{es ? 'Tareas sucesoras movidas' : 'Successor tasks moved'}</span>\r\n          <span className=\"v\">\r\n            {sim.movedSuccessors.length === 0\r\n              ? (es ? 'Ninguna' : 'None')\r\n              : `${sim.movedSuccessors.length}${sim.movedSuccessors.length <= 2 ? ' · ' + sim.movedSuccessors.map((s) => s.name).join(', ') : ''}`}\r\n          </span>\r\n        </div>\r\n        <div className=\"cal-impact-row\">\r\n          <span className=\"k\">{es ? 'Fin de proyecto' : 'Project end'}</span>\r\n          <span className={delta > 0 ? 'v bad' : 'v good'}>{deltaLabel}</span>\r\n        </div>\r\n        <div className=\"cal-impact-row\">\r\n          <span className=\"k\">{es ? 'Ruta crítica' : 'Critical path'}</span>\r\n          <span className=\"v\">\r\n            {sim.stillCritical\r\n              ? (es ? 'Sigue en CPM' : 'Stays critical')\r\n              : sim.wasCritical\r\n                ? (es ? 'Sale de CPM' : 'Leaves critical')\r\n                : (es ? `No entra · holgura ${sim.slackDays}d` : `Not critical · slack ${sim.slackDays}d`)}\r\n          </span>\r\n        </div>\r\n      </div>\r\n\r\n      <div className=\"cal-pop-actions\">\r\n        <button type=\"button\" className=\"cal-btn\" onClick={onCancel} disabled={busy}>\r\n          {es ? 'Cancelar' : 'Cancel'}\r\n        </button>\r\n        <button\r\n          type=\"button\"\r\n          className={critical || delta > 0 ? 'cal-btn danger' : 'cal-btn primary'}\r\n          onClick={onConfirm}\r\n          disabled={busy}\r\n        >\r\n          {busy ? (es ? 'Guardando…' : 'Saving…') : confirmLabel}\r\n        </button>\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * Vista Agenda (Calendario, Sprint 3) — lista cronológica de lo que toca\r\n * ejecutar, agrupada por día. Solo lectura. Complementa Mes/Semana/Lookahead\r\n * con una lectura lineal (útil cuando hay muchas tareas o pantallas angostas).\r\n */\r\nimport { useMemo } from 'react';\r\nimport type { CalTask, DayItem, MonthGrid } from './calendarLayout';\r\nimport type { MoneyMode } from './CalendarParts';\r\n\r\nconst CHIP_ICON: Record<string, string> = { hito: '◆', desembolso: '◆', deadline: '⚑', ext: '○', aus: '⊘' };\r\n\r\ninterface AgendaRow {\r\n  serial: number;\r\n  date: Date;\r\n  tasks: CalTask[];\r\n  items: DayItem[];\r\n}\r\n\r\ninterface Props {\r\n  grid: MonthGrid;\r\n  tasks: CalTask[];\r\n  items: DayItem[];\r\n  money: MoneyMode;\r\n  projColor: string;\r\n  todaySerial: number;\r\n  locale: 'es' | 'en';\r\n  onTaskOpen?: (taskId: string) => void;\r\n}\r\n\r\nexport function CalendarAgenda({ grid, tasks, items, money, projColor, todaySerial, locale, onTaskOpen }: Props) {\r\n  const es = locale === 'es';\r\n\r\n  // Agrupa por día: una tarea aparece en el día en que ARRANCA (su startSerial),\r\n  // dentro de la ventana visible del mes. Los items en su propio serial.\r\n  const rows = useMemo<AgendaRow[]>(() => {\r\n    const byDay = new Map<number, AgendaRow>();\r\n    const ensure = (serial: number): AgendaRow => {\r\n      if (!byDay.has(serial)) byDay.set(serial, { serial, date: grid.serialToDate(serial), tasks: [], items: [] });\r\n      return byDay.get(serial)!;\r\n    };\r\n    for (const t of tasks) {\r\n      if (t.startSerial >= 1 && t.startSerial <= 42) ensure(t.startSerial).tasks.push(t);\r\n    }\r\n    for (const it of items) {\r\n      if (it.serial >= 1 && it.serial <= 42) ensure(it.serial).items.push(it);\r\n    }\r\n    return [...byDay.values()]\r\n      .filter((r) => r.tasks.length || r.items.length)\r\n      .sort((a, b) => a.serial - b.serial);\r\n  }, [tasks, items, grid]);\r\n\r\n  if (rows.length === 0) {\r\n    return (\r\n      <div className=\"cal-empty\" style={{ position: 'static', padding: '60px 24px' }}>\r\n        <div className=\"glyph\">◇ ◇ ◇</div>\r\n        <h3>{es ? 'Nada programado este mes' : 'Nothing scheduled this month'}</h3>\r\n        <p>{es ? 'Cambia de mes con las flechas o crea tareas en el Gantt.' : 'Change month with the arrows or create tasks in the Gantt.'}</p>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  const fmtDay = (d: Date) => d.toLocaleDateString(es ? 'es-CO' : 'en-US', { weekday: 'long', day: 'numeric', month: 'short' });\r\n\r\n  return (\r\n    // maxHeight por viewport: garantiza el scroll aunque la cadena flex del\r\n    // contenedor no propague una altura acotada (la topbar+toolbar+legend del\r\n    // calendario ocupan ~150px; el resto es la zona scrolleable).\r\n    <div className=\"cal-agenda\" style={{ overflowY: 'auto', flex: 1, minHeight: 0, padding: '8px 0', maxHeight: 'calc(100vh - 150px)' }}>\r\n      {rows.map((r) => (\r\n        <div key={r.serial} className=\"cal-agenda-day\">\r\n          <div className=\"cal-agenda-date\" style={{\r\n            fontFamily: 'var(--mono)', fontSize: '10px', letterSpacing: '0.1em', textTransform: 'uppercase',\r\n            color: r.serial === todaySerial ? 'var(--cyan)' : 'var(--txt2)', padding: '12px 20px 6px',\r\n          }}>\r\n            {fmtDay(r.date)}{r.serial === todaySerial ? ` · ${es ? 'HOY' : 'TODAY'}` : ''}\r\n          </div>\r\n          {r.tasks.map((t) => (\r\n            <button\r\n              key={t.uid}\r\n              type=\"button\"\r\n              onClick={() => onTaskOpen?.(t.uid)}\r\n              className=\"cal-agenda-item\"\r\n              style={{\r\n                display: 'flex', alignItems: 'center', gap: '10px', width: '100%', textAlign: 'left',\r\n                padding: '8px 20px', background: 'transparent', border: 'none', cursor: 'pointer',\r\n                color: 'var(--txt)', fontSize: '12.5px',\r\n              }}\r\n            >\r\n              <span style={{ width: 8, height: 8, borderRadius: 2, background: (t as { color?: string }).color ?? projColor, flex: 'none' }} />\r\n              {t.critical ? <span style={{ fontFamily: 'var(--mono)', fontSize: 8, letterSpacing: '0.1em', color: '#031', background: 'var(--cyan)', borderRadius: 3, padding: '1.5px 3.5px', fontWeight: 700 }}>CPM</span> : null}\r\n              {t.id ? <span style={{ fontFamily: 'var(--mono)', fontSize: 9, color: 'var(--txt2)' }}>{t.id}</span> : null}\r\n              <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{t.name}</span>\r\n              <span style={{ fontFamily: 'var(--mono)', fontSize: 10, color: 'var(--txt2)' }}>{money === '$' ? t.cost : `${t.hrs}h`}</span>\r\n            </button>\r\n          ))}\r\n          {r.items.map((it, i) => (\r\n            <div\r\n              key={`it${i}`}\r\n              className=\"cal-agenda-item\"\r\n              style={{ display: 'flex', alignItems: 'center', gap: '10px', padding: '8px 20px', fontSize: '12.5px', color: 'var(--txt2)' }}\r\n            >\r\n              <span style={{ width: 8, textAlign: 'center', flex: 'none' }}>{CHIP_ICON[it.type] ?? '·'}</span>\r\n              <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{it.label}</span>\r\n            </div>\r\n          ))}\r\n        </div>\r\n      ))}\r\n    </div>\r\n  );\r\n}\r\n","/**\r\n * Simulación de reprogramación con CPM (Calendario, Sprint 3, regla C5).\r\n *\r\n * Dado un movimiento de fechas de UNA tarea, calcula —sobre una copia en\r\n * memoria, SIN persistir— la consecuencia: qué sucesoras se desplazan, cuánto\r\n * cambia el fin de proyecto, y si la tarea es/sigue en ruta crítica.\r\n *\r\n * Reutiliza el modelo de dependencias del Gantt (task.dependencies). NO duplica\r\n * el commit: confirmar usa el endpoint real (updateTask) — esto es solo el\r\n * \"forward pass\" en simulación para mostrar el popover de impacto.\r\n */\r\nimport type { Task as LibXAITask } from '../Gantt/types';\r\n\r\nexport interface RescheduleSimulation {\r\n  taskId: string;\r\n  oldStart: Date;\r\n  oldEnd: Date;\r\n  newStart: Date;\r\n  newEnd: Date;\r\n  /** sucesoras que se mueven por respetar dependencias (id + nombre + nuevas fechas). */\r\n  movedSuccessors: Array<{ id: string; name: string; newStart: Date; newEnd: Date }>;\r\n  /** delta del fin de proyecto en días (>0 lo retrasa, 0 = absorbido por holgura). */\r\n  projectEndDeltaDays: number;\r\n  oldProjectEnd: Date;\r\n  newProjectEnd: Date;\r\n  /** ¿la tarea movida estaba en ruta crítica antes del movimiento? */\r\n  wasCritical: boolean;\r\n  /** ¿sigue en ruta crítica tras el movimiento? */\r\n  stillCritical: boolean;\r\n  /** holgura (días) de la tarea antes del movimiento (informativo). */\r\n  slackDays: number;\r\n}\r\n\r\nconst DAY = 86400000;\r\n\r\nfunction flatten(tasks: LibXAITask[]): LibXAITask[] {\r\n  const out: LibXAITask[] = [];\r\n  const walk = (l: LibXAITask[]) => l.forEach((t) => { out.push(t); if (t.subtasks?.length) walk(t.subtasks); });\r\n  walk(tasks);\r\n  return out;\r\n}\r\n\r\nfunction depIds(t: LibXAITask): string[] {\r\n  const d = t.dependencies as unknown;\r\n  if (!Array.isArray(d)) return [];\r\n  // soporta string[] (legacy) y Dependency[] ({ id }).\r\n  return d.map((x) => (typeof x === 'string' ? x : (x as { id?: string })?.id)).filter((x): x is string => !!x);\r\n}\r\n\r\nfunction durationDays(t: LibXAITask): number {\r\n  const s = t.startDate ? new Date(t.startDate) : null;\r\n  const e = t.endDate ? new Date(t.endDate) : null;\r\n  if (!s || !e) return 1;\r\n  return Math.max(1, Math.round((e.getTime() - s.getTime()) / DAY));\r\n}\r\n\r\n/** earliestFinish (en ms epoch) de cada tarea dado un mapa de fechas de inicio. */\r\nfunction computeSchedule(\r\n  flat: LibXAITask[],\r\n  startOverride: Map<string, number>, // taskId → start ms\r\n): { finish: Map<string, number>; start: Map<string, number>; projectEnd: number } {\r\n  const byId = new Map(flat.map((t) => [t.id, t]));\r\n  const succ = new Map<string, string[]>();\r\n  for (const t of flat) for (const dep of depIds(t)) {\r\n    if (!succ.has(dep)) succ.set(dep, []);\r\n    succ.get(dep)!.push(t.id);\r\n  }\r\n\r\n  const startMs = new Map<string, number>();\r\n  const finishMs = new Map<string, number>();\r\n  const visiting = new Set<string>();\r\n\r\n  const resolve = (id: string): number => {\r\n    if (finishMs.has(id)) return finishMs.get(id)!;\r\n    if (visiting.has(id)) return finishMs.get(id) ?? 0; // corta ciclos\r\n    visiting.add(id);\r\n    const t = byId.get(id);\r\n    if (!t) { visiting.delete(id); return 0; }\r\n\r\n    const deps = depIds(t).filter((d) => byId.has(d));\r\n    // inicio = max(fin de dependencias) o el override / la fecha propia.\r\n    let earliestStart = startOverride.has(id)\r\n      ? startOverride.get(id)!\r\n      : (t.startDate ? new Date(t.startDate).getTime() : 0);\r\n    for (const d of deps) {\r\n      const depFinish = resolve(d);\r\n      // una sucesora arranca, como muy pronto, cuando termina su dependencia.\r\n      if (depFinish > earliestStart) earliestStart = depFinish;\r\n    }\r\n    const dur = durationDays(t) * DAY;\r\n    startMs.set(id, earliestStart);\r\n    finishMs.set(id, earliestStart + dur);\r\n    visiting.delete(id);\r\n    return finishMs.get(id)!;\r\n  };\r\n\r\n  for (const t of flat) resolve(t.id);\r\n  let projectEnd = 0;\r\n  finishMs.forEach((f) => { if (f > projectEnd) projectEnd = f; });\r\n  return { finish: finishMs, start: startMs, projectEnd };\r\n}\r\n\r\n/** ¿La tarea está en ruta crítica? (slack 0 = está sobre el camino más largo). */\r\nfunction criticalSet(flat: LibXAITask[], finish: Map<string, number>, projectEnd: number): Set<string> {\r\n  const byId = new Map(flat.map((t) => [t.id, t]));\r\n  const succ = new Map<string, string[]>();\r\n  for (const t of flat) for (const dep of depIds(t)) {\r\n    if (!succ.has(dep)) succ.set(dep, []);\r\n    succ.get(dep)!.push(t.id);\r\n  }\r\n  // latestFinish hacia atrás desde projectEnd.\r\n  const latestFinish = new Map<string, number>();\r\n  const order = [...flat].sort((a, b) => (finish.get(b.id) ?? 0) - (finish.get(a.id) ?? 0));\r\n  for (const t of order) {\r\n    const s = succ.get(t.id) ?? [];\r\n    if (s.length === 0) latestFinish.set(t.id, projectEnd);\r\n    else {\r\n      let minLS = Infinity;\r\n      for (const sid of s) {\r\n        const lf = latestFinish.get(sid);\r\n        const sd = byId.get(sid);\r\n        if (lf != null && sd) minLS = Math.min(minLS, lf - durationDays(sd) * DAY);\r\n      }\r\n      latestFinish.set(t.id, minLS === Infinity ? projectEnd : minLS);\r\n    }\r\n  }\r\n  const crit = new Set<string>();\r\n  for (const t of flat) {\r\n    const slack = (latestFinish.get(t.id) ?? 0) - (finish.get(t.id) ?? 0);\r\n    if (Math.abs(slack) < DAY / 2 && depIds(t).length + (succ.get(t.id)?.length ?? 0) > 0) crit.add(t.id);\r\n  }\r\n  return crit;\r\n}\r\n\r\n/**\r\n * Simula mover una tarea a [newStart, newEnd]. Devuelve el impacto SIN persistir.\r\n */\r\nexport function simulateReschedule(\r\n  tasks: LibXAITask[],\r\n  taskId: string,\r\n  newStart: Date,\r\n  newEnd: Date,\r\n): RescheduleSimulation | null {\r\n  const flat = flatten(tasks);\r\n  const moved = flat.find((t) => t.id === taskId);\r\n  if (!moved || !moved.startDate || !moved.endDate) return null;\r\n\r\n  const oldStart = new Date(moved.startDate);\r\n  const oldEnd = new Date(moved.endDate);\r\n\r\n  // Estado ANTES.\r\n  const before = computeSchedule(flat, new Map());\r\n  const critBefore = criticalSet(flat, before.finish, before.projectEnd);\r\n\r\n  // Estado DESPUÉS: la duración nueva la fija newEnd-newStart; recomputamos\r\n  // forzando el inicio de la tarea movida (las sucesoras se recolocan solas).\r\n  const flatAfter = flat.map((t) => t.id === taskId\r\n    ? { ...t, startDate: newStart, endDate: newEnd }\r\n    : t);\r\n  const after = computeSchedule(flatAfter, new Map([[taskId, newStart.getTime()]]));\r\n  const critAfter = criticalSet(flatAfter, after.finish, after.projectEnd);\r\n\r\n  // Sucesoras que cambiaron de fecha.\r\n  const byIdAfter = new Map(flatAfter.map((t) => [t.id, t]));\r\n  const movedSuccessors: RescheduleSimulation['movedSuccessors'] = [];\r\n  for (const t of flat) {\r\n    if (t.id === taskId) continue;\r\n    const bStart = before.start.get(t.id);\r\n    const aStart = after.start.get(t.id);\r\n    if (bStart != null && aStart != null && Math.abs(aStart - bStart) >= DAY / 2) {\r\n      const dur = durationDays(byIdAfter.get(t.id)!) * DAY;\r\n      movedSuccessors.push({\r\n        id: t.id,\r\n        name: t.name,\r\n        newStart: new Date(aStart),\r\n        newEnd: new Date(aStart + dur),\r\n      });\r\n    }\r\n  }\r\n\r\n  const projectEndDeltaDays = Math.round((after.projectEnd - before.projectEnd) / DAY);\r\n  const slackDays = (() => {\r\n    // holgura de la tarea movida antes del cambio.\r\n    const crit = critBefore.has(taskId);\r\n    return crit ? 0 : Math.max(0, Math.round((before.projectEnd - (before.finish.get(taskId) ?? 0)) / DAY));\r\n  })();\r\n\r\n  return {\r\n    taskId,\r\n    oldStart, oldEnd, newStart, newEnd,\r\n    movedSuccessors,\r\n    projectEndDeltaDays,\r\n    oldProjectEnd: new Date(before.projectEnd),\r\n    newProjectEnd: new Date(after.projectEnd),\r\n    wasCritical: critBefore.has(taskId),\r\n    stillCritical: critAfter.has(taskId),\r\n    slackDays,\r\n  };\r\n}\r\n","import { createPortal } from 'react-dom';\r\n/**\r\n * CalendarView — rediseño del Calendario (Asakaa Pulse, Sprint 1, SOLO LECTURA).\r\n *\r\n * Reemplaza el CalendarBoard plano por la proyección operativa del plan: barras\r\n * de tareas con color por proyecto, ruta crítica (CPM) con glow, festivos/fines\r\n * de semana sombreados, \"+N más\" sin recorte mudo, capas conmutables, filtros,\r\n * toggle $/Hrs y estado vacío premium. Las vistas Semana/Lookahead/Agenda y la\r\n * reprogramación con CPM llegan en S2/S3 (el chrome ya las ofrece).\r\n *\r\n * Consume las tareas reales que ProjectCalendar ya carga — no duplica el motor\r\n * de datos del Gantt (regla de la spec).\r\n */\r\nimport { useEffect, useMemo, useRef, useState } from 'react';\r\nimport type { Task as LibXAITask } from '../Gantt/types';\r\nimport {\r\n  buildMonthGrid, layoutWeek, layoutDueWeek, isWeekendSerial,\r\n  type CalTask, type DayItem,\r\n} from './calendarLayout';\r\nimport { buildCalendar, monthLabel } from './calendarData';\r\nimport { CalDow, CalBar, CalChip, CalMoreChip, CalLegend, type MoneyMode } from './CalendarParts';\r\nimport { CalTopBar, CalToolbar, CalLayersPop, type CalView, type CalLayerId } from './CalendarChrome';\r\nimport { CalMorePopover, CalEmptyState } from './CalendarPopovers';\r\nimport { WeekGridView, type CapRowsByWeek } from './CalendarWeekViews';\r\nimport { CalBreakdownPopover, buildCapacityByDay, type CapDay, type DayCapacity, type PersonLoad } from './CalendarCapacity';\r\nimport { CalBacklogPanel, CalPulseRail, buildBacklog } from './CalendarBacklog';\r\nimport { CalendarReschedulePopover } from './CalendarReschedulePopover';\r\nimport { CalendarAgenda } from './CalendarAgenda';\r\nimport { simulateReschedule, type RescheduleSimulation } from './calendarReschedule';\r\nimport type { TeamMember } from './CalendarCapacity';\r\n\r\n/** 'YYYY-MM-DD' en calendario local (no UTC). */\r\nfunction toLocalISODate(d: Date): string {\r\n  return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\r\n}\r\n\r\nconst WEEK_MIN_H = 132; // alto mínimo por semana (5 slots × 26 + cabecera)\r\nconst SLOT_H = 26;\r\n/** 1.9.42 · el modo vencimiento usa chips más bajos para que a 639 px quepan 2 por día. */\r\nconst SLOT_H_DUE = 20;\r\n\r\ninterface Props {\r\n  /** 1.9.34 · las vistas (Month/Week/Agenda) se pintan dentro de este elemento: cabeceras de una fila. */\r\n  toolbarContainer?: HTMLElement | null;\r\n  /** 1.9.34 · vistas que no se ofrecen en el selector (p. ej. ['lookahead']). */\r\n  hiddenViews?: CalView[];\r\n  tasks: LibXAITask[];\r\n  projectName: string;\r\n  projectId: string;\r\n  projectColor?: string;\r\n  workspaceId?: string;\r\n  locale: 'es' | 'en';\r\n  /** 'light' aplica la paleta clara; cualquier otro = oscuro. */\r\n  themeMode?: 'dark' | 'light';\r\n  hourlyRate: number;\r\n  /**\r\n   * ═══ EL FILTRO DE FASES ═════════════════════════════════════════════════\r\n   *\r\n   * Divar, 27-ago (punto 17 de la lista de Juan): en el producto simplificado\r\n   * no va.\r\n   *\r\n   * Las «fases» son las tareas-padre raíz, y filtrar por ellas tiene sentido\r\n   * en un proyecto de obra con estructura WBS. En uno de tareas simples es un\r\n   * desplegable que casi siempre está vacío.\r\n   *\r\n   * Por defecto SÍ se muestra: quien no pase nada se comporta como siempre.\r\n   */\r\n  mostrarFiltroDeFases?: boolean;\r\n  /** REQ-07 §2.7 · el par «Hrs / $» del calendario. Ver `CalendarChrome`. */\r\n  mostrarConmutadorDeDinero?: boolean;\r\n  /**\r\n   * REQ-07 §2.5: crear la primera tarea desde el estado vacio del mes.\r\n   * Sin esto el mensaje describe pero no ofrece salida.\r\n   */\r\n  onCreateTask?: () => void;\r\n  /** money compartido con Gantt/Lista (lens global). */\r\n  money: MoneyMode;\r\n  onMoneyChange: (m: MoneyMode) => void;\r\n  /** abrir el drawer global de tarea. */\r\n  onTaskOpen?: (taskId: string) => void;\r\n  /** contenido extra a la derecha de la topbar (historial, etc.). */\r\n  rightContent?: React.ReactNode;\r\n  /** S3 (C5): ¿el usuario puede reprogramar? Si no, el calendario es solo lectura. */\r\n  canReschedule?: boolean;\r\n  /** S3 (C5): commit del movimiento (la tarea + sus sucesoras). Devuelve éxito. */\r\n  onReschedule?: (changes: Array<{ id: string; startDate: Date; endDate: Date }>) => Promise<boolean>;\r\n  // ── Datos resueltos por el consumidor (la librería es agnóstica de Supabase) ──\r\n  /** miembros con su carga diaria (de useTeamCapacity en el SaaS). */\r\n  members?: TeamMember[];\r\n  /** festivos del workspace como 'YYYY-MM-DD' (de useHolidays en el SaaS). */\r\n  holidayDates?: string[];\r\n  /** jornada del workspace (de timesheetSettings) — capacidad diaria por persona. */\r\n  timesheetSettings?: { hoursPerDay?: Record<string, number> };\r\n  /** se llama cuando cambia el rango visible (mes) para que el consumidor\r\n   *  recargue la capacidad de ese rango. */\r\n  onVisibleRangeChange?: (range: { start: string; end: string }) => void;\r\n  /**\r\n   * 1.9.42 · 'due': el Mes responde «qué vence cada día» — un chip por tarea en\r\n   * su fecha de fin, tantos como quepan y «+N more»; la rejilla llena el alto sin\r\n   * scroll. 'span' (por defecto): las barras de siempre.\r\n   */\r\n  monthMode?: 'span' | 'due';\r\n  /**\r\n   * 1.9.44 · abrir SIEMPRE en el mes de hoy (Yesid, 2-oct). Sin esto se mantiene\r\n   * REQ-07 §2.5: si el mes actual no tiene tareas, abrir en el de la primera.\r\n   */\r\n  openOnToday?: boolean;\r\n  /** 1.9.42 · `false`: ni horas ni coste en las barras. */\r\n  showValues?: boolean;\r\n}\r\n\r\n// Color por defecto si el proyecto no define uno (paleta del diseño).\r\nconst DEFAULT_PROJECT_COLOR = '#5B7FD4';\r\n\r\nexport function CalendarView({\r\n  tasks, projectName, projectId, projectColor, locale, themeMode, hourlyRate, money, onMoneyChange, onTaskOpen, toolbarContainer, hiddenViews,\r\n  mostrarFiltroDeFases,\r\n  mostrarConmutadorDeDinero,\r\n  onCreateTask,\r\n  canReschedule, onReschedule,\r\n  members = [], holidayDates = [], timesheetSettings, onVisibleRangeChange,\r\n  monthMode = 'span', showValues = true, openOnToday = false,\r\n}: Props) {\r\n  /* 1.9.42 · en modo vencimiento, cuántos chips caben por día según el alto real. */\r\n  const semanasRef = useRef<HTMLDivElement>(null);\r\n  const [altoSemanas, setAltoSemanas] = useState(0);\r\n  useEffect(() => {\r\n    if (monthMode !== 'due') return;\r\n    const el = semanasRef.current;\r\n    if (!el || typeof ResizeObserver === 'undefined') return;\r\n    const ro = new ResizeObserver(() => setAltoSemanas(el.clientHeight));\r\n    ro.observe(el);\r\n    setAltoSemanas(el.clientHeight);\r\n    return () => ro.disconnect();\r\n  });\r\n  const [view, setView] = useState<CalView>('mes');\r\n  /**\r\n   * REQ-07 §2.5 · el mes en el que abre el calendario.\r\n   *\r\n   * Antes abria SIEMPRE en el mes de hoy. Yesid: «el calendario de un proyecto\r\n   * que empieza el mes siguiente abre en ese mes, no en el actual: hoy muestra\r\n   * agosto para un proyecto que arranca en septiembre».\r\n   *\r\n   * Regla: si hay alguna tarea en el mes actual, se queda en el mes actual —lo\r\n   * que el usuario espera y lo que ya funcionaba—. Si no hay ninguna, abre en\r\n   * el mes de la tarea mas temprana. Un proyecto SIN tareas se queda en hoy:\r\n   * no hay nada mejor a lo que ir.\r\n   *\r\n   * Solo el arranque: navegar con ‹ › despues manda, porque `useState` con\r\n   * funcion solo la ejecuta en el primer render.\r\n   */\r\n  const [cursor, setCursor] = useState(() => {\r\n    const n = new Date();\r\n    const hoy = { y: n.getFullYear(), m: n.getMonth() };\r\n    if (openOnToday) return hoy;\r\n    const fechas = (tasks ?? [])\r\n      .map(t => t.startDate ? new Date(t.startDate) : null)\r\n      .filter((d): d is Date => !!d && !isNaN(d.getTime()));\r\n    if (fechas.length === 0) return hoy;\r\n    const hayEsteMes = (tasks ?? []).some(t => {\r\n      const ini = t.startDate ? new Date(t.startDate) : null;\r\n      const fin = t.endDate ? new Date(t.endDate) : ini;\r\n      if (!ini || isNaN(ini.getTime())) return false;\r\n      const desde = new Date(hoy.y, hoy.m, 1);\r\n      const hasta = new Date(hoy.y, hoy.m + 1, 0, 23, 59, 59);\r\n      return ini <= hasta && (fin ?? ini) >= desde;\r\n    });\r\n    if (hayEsteMes) return hoy;\r\n    const primera = fechas.reduce((a, b) => (a < b ? a : b));\r\n    return { y: primera.getFullYear(), m: primera.getMonth() };\r\n  });\r\n  const [layersOpen, setLayersOpen] = useState(false);\r\n  const [layersOff, setLayersOff] = useState<CalLayerId[]>([]);\r\n  const [phaseFilter, setPhaseFilter] = useState('all');\r\n  const [morePopover, setMorePopover] = useState<{ day: number; items: DayItem[]; tasks: CalTask[] } | null>(null);\r\n  const [breakdown, setBreakdown] = useState<{ dayLabel: string; perPerson: PersonLoad[]; anchor: DOMRect } | null>(null);\r\n  const [backlogOpen, setBacklogOpen] = useState(false);\r\n  // S3 (C5): reprogramación. pending = simulación pendiente de confirmar.\r\n  const [reschedule, setReschedule] = useState<{\r\n    uid: string; taskId: string; taskName: string; sim: RescheduleSimulation; anchor: DOMRect;\r\n  } | null>(null);\r\n  const [rescheduleBusy, setRescheduleBusy] = useState(false);\r\n\r\n  const grid = useMemo(() => buildMonthGrid(cursor.y, cursor.m), [cursor.y, cursor.m]);\r\n  const projColor = projectColor || DEFAULT_PROJECT_COLOR;\r\n\r\n  // Festivos (los pasa el consumidor) como Set de serial visible para sombrear.\r\n  const holidaySerials = useMemo(() => {\r\n    const set = new Set<number>();\r\n    for (const iso of holidayDates) {\r\n      const d = new Date(`${iso}T12:00:00`);\r\n      const s = grid.dateToSerial(d);\r\n      if (s >= 1 && s <= 42) set.add(s);\r\n    }\r\n    return set;\r\n  }, [holidayDates, grid]);\r\n\r\n  // Avisa al consumidor del rango visible para que recargue la capacidad.\r\n  useEffect(() => {\r\n    onVisibleRangeChange?.({\r\n      start: toLocalISODate(grid.serialToDate(1)),\r\n      end: toLocalISODate(grid.serialToDate(42)),\r\n    });\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [cursor.y, cursor.m]);\r\n\r\n  const teamSize = members.length;\r\n  // Capacidad-techo de UNA persona por día hábil, desde timesheetSettings\r\n  // (fuente: jornada del workspace). buildCapacityByDay la multiplica por el nº\r\n  // de personas. OJO: NO usar members.weeklyCapacity — el hook lo escala al\r\n  // rango de fechas (×nº de semanas), no es por día.\r\n  const perPersonDailyCapacity = useMemo(() => {\r\n    const hpd = (timesheetSettings as unknown as { hoursPerDay?: Record<string, number> } | undefined)?.hoursPerDay;\r\n    if (!hpd) return 8; // fallback jornada estándar\r\n    const wd = [hpd.monday, hpd.tuesday, hpd.wednesday, hpd.thursday, hpd.friday]\r\n      .map((x) => x || 0).filter((x) => x > 0);\r\n    return wd.length ? Math.round((wd.reduce((a, b) => a + b, 0) / wd.length) * 10) / 10 : 8;\r\n  }, [timesheetSettings]);\r\n\r\n  const built = useMemo(\r\n    () => buildCalendar({ tasks, grid, projectColor: () => projColor, hourlyRate, projectId }),\r\n    [tasks, grid, projColor, hourlyRate, projectId],\r\n  );\r\n\r\n  // Fases disponibles (tareas-padre raíz) para el filtro de la toolbar.\r\n  const phases = useMemo(() => {\r\n    /* Sin filtro, no se derivan: la barra solo lo pinta si recibe fases. */\r\n    if (mostrarFiltroDeFases === false) return [];\r\n    const map = new Map<string, string>();\r\n    for (const t of built.calTasks) {\r\n      if (t.phaseId && t.phaseName) map.set(t.phaseId, t.phaseName);\r\n    }\r\n    return [...map.entries()].map(([id, name]) => ({ id, name })).sort((a, b) => a.name.localeCompare(b.name));\r\n  }, [built.calTasks, mostrarFiltroDeFases]);\r\n\r\n  // Capas apagadas + filtro de fase determinan qué se muestra.\r\n  const showTasks = !layersOff.includes('tareas');\r\n  const showCpm = !layersOff.includes('cpm');\r\n  const visibleTasks = useMemo(() => {\r\n    let list = showTasks ? built.calTasks : [];\r\n    if (phaseFilter !== 'all') list = list.filter((t) => t.phaseId === phaseFilter);\r\n    if (!showCpm) list = list.map((t) => (t.critical ? { ...t, critical: false } : t));\r\n    return list;\r\n  }, [built.calTasks, showTasks, showCpm, phaseFilter]);\r\n\r\n  const visibleItems = useMemo(() => {\r\n    const offTypes = new Set<string>();\r\n    if (layersOff.includes('hitos')) { offTypes.add('hito'); offTypes.add('desembolso'); }\r\n    if (layersOff.includes('ext')) offTypes.add('ext');\r\n    if (layersOff.includes('aus')) offTypes.add('aus');\r\n    return built.dayItems.filter((i) => !offTypes.has(i.type));\r\n  }, [built.dayItems, layersOff]);\r\n\r\n  const showFestivos = !layersOff.includes('festivos');\r\n  const today = new Date();\r\n  const todaySerial = grid.dateToSerial(new Date(today.getFullYear(), today.getMonth(), today.getDate()));\r\n\r\n  const toggleLayer = (id: CalLayerId) =>\r\n    setLayersOff((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]));\r\n\r\n  const goPrev = () => setCursor((c) => { const d = new Date(c.y, c.m - 1, 1); return { y: d.getFullYear(), m: d.getMonth() }; });\r\n  const goNext = () => setCursor((c) => { const d = new Date(c.y, c.m + 1, 1); return { y: d.getFullYear(), m: d.getMonth() }; });\r\n  const goToday = () => { const n = new Date(); setCursor({ y: n.getFullYear(), m: n.getMonth() }); };\r\n  /* 1.9.44 · la fecha más temprana de las tareas, para «Ir a la primera». */\r\n  const primeraTarea = useMemo(() => {\r\n    const fechas = (tasks ?? [])\r\n      .flatMap((t) => [t.startDate, t.endDate])\r\n      .map((d) => (d ? new Date(d) : null))\r\n      .filter((d): d is Date => !!d && !isNaN(d.getTime()));\r\n    return fechas.length ? fechas.reduce((a, b) => (a < b ? a : b)) : null;\r\n  }, [tasks]);\r\n\r\n  // S3 (C5): al soltar una barra movida `deltaDays` días → simula y pide confirmar.\r\n  const beginReschedule = (uid: string, deltaDays: number, anchor: DOMRect) => {\r\n    if (!canReschedule || deltaDays === 0) return;\r\n    const ct = built.calTasks.find((t) => t.uid === uid);\r\n    if (!ct) return;\r\n    const ms = deltaDays * 86400000;\r\n    const newStart = new Date(ct.realStart.getTime() + ms);\r\n    const newEnd = new Date(ct.realEnd.getTime() + ms);\r\n    const sim = simulateReschedule(tasks, uid, newStart, newEnd);\r\n    if (!sim) return;\r\n    setReschedule({ uid, taskId: ct.id, taskName: ct.name, sim, anchor });\r\n  };\r\n\r\n  const confirmReschedule = async () => {\r\n    if (!reschedule || !onReschedule) return;\r\n    setRescheduleBusy(true);\r\n    const changes = [\r\n      { id: reschedule.uid, startDate: reschedule.sim.newStart, endDate: reschedule.sim.newEnd },\r\n      ...reschedule.sim.movedSuccessors.map((s) => ({ id: s.id, startDate: s.newStart, endDate: s.newEnd })),\r\n    ];\r\n    const ok = await onReschedule(changes);\r\n    setRescheduleBusy(false);\r\n    if (ok) setReschedule(null);\r\n  };\r\n\r\n  const mLabel = monthLabel(cursor.y, cursor.m, locale);\r\n  // id vacío en la leyenda: el código corto por proyecto (C11) es de S3; por\r\n  // ahora solo el nombre, nunca el UUID.\r\n  const projects = [{ id: '', name: projectName, color: projColor }];\r\n\r\n  // Backlog: tareas reales sin fecha (C8). Solo lista en S2 (drag → S3).\r\n  const backlog = useMemo(() => buildBacklog(tasks, hourlyRate), [tasks, hourlyRate]);\r\n\r\n  // ── Vistas Semana / Lookahead: rangos de semana + capacidad por día ──\r\n  // Semana: la semana de la grilla que contiene HOY (o la primera). Lookahead: 2.\r\n  const weekRanges = useMemo(() => {\r\n    if (view === 'lookahead') {\r\n      // 2 semanas desde la que contiene hoy.\r\n      const startW = grid.weeks.find((w) => todaySerial >= w.ws && todaySerial <= w.we) ?? grid.weeks[0]!;\r\n      const idx = grid.weeks.indexOf(startW);\r\n      return grid.weeks.slice(idx, idx + 2);\r\n    }\r\n    if (view === 'semana') {\r\n      const w = grid.weeks.find((x) => todaySerial >= x.ws && todaySerial <= x.we) ?? grid.weeks[0]!;\r\n      return [w];\r\n    }\r\n    return [];\r\n  }, [view, grid.weeks, todaySerial]);\r\n\r\n  // Capacidad por semana (CapDay[] + Map) para las franjas de Semana/Lookahead.\r\n  const capRows: CapRowsByWeek = useMemo(() => {\r\n    const out: CapRowsByWeek = {};\r\n    weekRanges.forEach((w, wi) => {\r\n      const days: CapDay[] = [];\r\n      for (let d = w.ws; d <= w.we; d++) {\r\n        days.push({\r\n          serial: d,\r\n          date: grid.serialToDate(d),\r\n          isWeekend: isWeekendSerial(grid, d),\r\n          isHoliday: holidaySerials.has(d),\r\n        });\r\n      }\r\n      const capByDay: Map<string, DayCapacity> = buildCapacityByDay(members, days, perPersonDailyCapacity);\r\n      out[wi] = { days, capByDay };\r\n    });\r\n    return out;\r\n  }, [weekRanges, grid, holidaySerials, members, perPersonDailyCapacity]);\r\n\r\n  const isWeekView = view === 'semana' || view === 'lookahead';\r\n  const isAgenda = view === 'agenda';\r\n\r\n  return (\r\n    <div className={`cal-app${themeMode === 'light' ? ' cal-light' : ''}`}>\r\n      {/* 1.9.34 · con `toolbarContainer`, las vistas suben a la cabecera de quien la pide (con las variables de .cal-app). */}\r\n      {toolbarContainer ? createPortal(\r\n        <div className={`cal-app cal-en-cabecera${themeMode === 'light' ? ' cal-light' : ''}`}>\r\n          <CalTopBar\r\n            enCabecera\r\n            hiddenViews={hiddenViews}\r\n            view={view}\r\n            onViewChange={setView}\r\n            money={money === '$' ? '$' : 'hrs'}\r\n            mostrarConmutadorDeDinero={mostrarConmutadorDeDinero}\r\n            onMoneyChange={(m) => onMoneyChange(m === '$' ? '$' : 'Hrs')}\r\n            projectLabel={projectName}\r\n            locale={locale}\r\n          />\r\n        </div>,\r\n        toolbarContainer,\r\n      ) : (\r\n      <CalTopBar\r\n        view={view}\r\n        onViewChange={setView}\r\n        money={money === '$' ? '$' : 'hrs'}\r\n        mostrarConmutadorDeDinero={mostrarConmutadorDeDinero}\r\n        onMoneyChange={(m) => onMoneyChange(m === '$' ? '$' : 'Hrs')}\r\n        projectLabel={projectName}\r\n        locale={locale}\r\n        hiddenViews={hiddenViews}\r\n      />\r\n      )}\r\n      <CalToolbar\r\n        monthLabel={mLabel}\r\n        onPrev={goPrev}\r\n        onNext={goNext}\r\n        onToday={goToday}\r\n        layersOpen={layersOpen}\r\n        onToggleLayers={() => setLayersOpen((o) => !o)}\r\n        layersOff={layersOff}\r\n        phases={phases}\r\n        phaseFilter={phaseFilter}\r\n        onPhaseChange={setPhaseFilter}\r\n        locale={locale}\r\n      >\r\n        {layersOpen ? <CalLayersPop off={layersOff} onToggle={toggleLayer} /> : null}\r\n      </CalToolbar>\r\n\r\n      <div className=\"cal-body\">\r\n        <div className=\"cal-grid-zone\" style={{ position: 'relative', overflow: isAgenda ? 'hidden' : undefined }}>\r\n          {isAgenda ? (\r\n            <CalendarAgenda\r\n              grid={grid}\r\n              tasks={visibleTasks}\r\n              items={visibleItems}\r\n              money={money}\r\n              projColor={projColor}\r\n              todaySerial={todaySerial}\r\n              locale={locale}\r\n              onTaskOpen={onTaskOpen}\r\n            />\r\n          ) : isWeekView ? (\r\n            <>\r\n              <CalDow locale={locale} />\r\n              <WeekGridView\r\n                grid={grid}\r\n                weeks={weekRanges}\r\n                tasks={visibleTasks}\r\n                items={visibleItems}\r\n                money={money}\r\n                projColor={projColor}\r\n                todaySerial={todaySerial}\r\n                locale={locale}\r\n                capRows={capRows}\r\n                teamSize={teamSize}\r\n                onTaskOpen={onTaskOpen}\r\n                onMore={(day, items, tasksOfDay) => setMorePopover({ day, items, tasks: tasksOfDay })}\r\n                onCapDay={(key, dayLabel, anchor) => {\r\n                  // localizar el día y su desglose por persona.\r\n                  for (const wi of Object.keys(capRows)) {\r\n                    const cap = capRows[+wi]!.capByDay.get(key);\r\n                    if (cap) { setBreakdown({ dayLabel, perPerson: cap.perPerson, anchor: anchor.getBoundingClientRect() }); break; }\r\n                  }\r\n                }}\r\n              />\r\n            </>\r\n          ) : built.isEmpty ? (\r\n            <>\r\n              <CalDow locale={locale} />\r\n              <div className=\"cal-weeks\">\r\n                {grid.weeks.map((w) => (\r\n                  /* 1.9.42 · sin su `.cal-week` el fondo (absoluto) se montaba sobre las cabeceras. */\r\n                  <div key={w.ws} className=\"cal-week\" style={{ minHeight: monthMode === 'due' ? 0 : `${WEEK_MIN_H}px` }}>\r\n                    <WeekBg grid={grid} ws={w.ws} we={w.we} todaySerial={todaySerial}\r\n                      showFestivos={showFestivos} holidaySerials={holidaySerials} locale={locale} deadlineDays={new Set()} />\r\n                  </div>\r\n                ))}\r\n              </div>\r\n              <CalEmptyState\r\n                monthLabel={mLabel}\r\n                locale={locale}\r\n                onCreateTask={onCreateTask}\r\n                irAPrimera={primeraTarea ? {\r\n                  mes: primeraTarea.toLocaleDateString(locale === 'en' ? 'en' : 'es', { month: 'long', year: primeraTarea.getFullYear() !== new Date().getFullYear() ? 'numeric' : undefined }),\r\n                  onClick: () => setCursor({ y: primeraTarea.getFullYear(), m: primeraTarea.getMonth() }),\r\n                } : undefined}\r\n              />\r\n            </>\r\n          ) : (\r\n            <>\r\n              <CalDow locale={locale} />\r\n              <div className=\"cal-weeks\" ref={semanasRef} style={monthMode === 'due' ? { minHeight: 0, overflow: 'hidden' } : undefined}>\r\n                {grid.weeks.map((w) => (\r\n                  <WeekRow\r\n                    due={monthMode === 'due'}\r\n                    slots={altoSemanas > 0 ? Math.max(1, Math.floor((altoSemanas / grid.weeks.length - 26) / SLOT_H_DUE)) : 2}\r\n                    showValues={showValues}\r\n                    key={w.ws}\r\n                    grid={grid}\r\n                    ws={w.ws}\r\n                    we={w.we}\r\n                    tasks={visibleTasks}\r\n                    items={visibleItems}\r\n                    money={money}\r\n                    projColor={projColor}\r\n                    todaySerial={todaySerial}\r\n                    showFestivos={showFestivos}\r\n                    holidaySerials={holidaySerials}\r\n                    locale={locale}\r\n                    onTaskOpen={onTaskOpen}\r\n                    onMore={(day, items, tasksOfDay) => setMorePopover({ day, items, tasks: tasksOfDay })}\r\n                    canReschedule={canReschedule}\r\n                    onDragReschedule={beginReschedule}\r\n                    pendingGhost={reschedule ? { uid: reschedule.uid, days: Math.round((reschedule.sim.newStart.getTime() - reschedule.sim.oldStart.getTime()) / 86400000) } : null}\r\n                  />\r\n                ))}\r\n              </div>\r\n            </>\r\n          )}\r\n\r\n          {morePopover ? (\r\n            <CalMorePopover\r\n              dayLabel={`${grid.serialToDate(morePopover.day).getDate()}`}\r\n              items={morePopover.items}\r\n              tasks={morePopover.tasks.map((t) => ({ swatch: projColor, taskId: t.id, label: t.name, critical: t.critical, value: money === '$' ? t.cost : `${t.hrs}h` }))}\r\n              onClose={() => setMorePopover(null)}\r\n              style={{ position: 'absolute', top: '80px', left: '50%', transform: 'translateX(-50%)', zIndex: 40 }}\r\n              locale={locale === 'en' ? 'en' : 'es'}\r\n            />\r\n          ) : null}\r\n\r\n          {breakdown ? (\r\n            <CalBreakdownPopover\r\n              dayLabel={breakdown.dayLabel}\r\n              perPerson={breakdown.perPerson}\r\n              onClose={() => setBreakdown(null)}\r\n              style={{ position: 'fixed', top: `${breakdown.anchor.top - 8}px`, left: `${breakdown.anchor.left}px`, transform: 'translateY(-100%)', zIndex: 50 }}\r\n            />\r\n          ) : null}\r\n\r\n          {reschedule ? (\r\n            <CalendarReschedulePopover\r\n              taskName={reschedule.taskName}\r\n              taskId={reschedule.sim.taskId}\r\n              sim={reschedule.sim}\r\n              busy={rescheduleBusy}\r\n              locale={locale}\r\n              onConfirm={confirmReschedule}\r\n              onCancel={() => setReschedule(null)}\r\n              style={{ position: 'fixed', top: `${reschedule.anchor.top + 12}px`, left: `${Math.min(reschedule.anchor.left, window.innerWidth - 340)}px`, zIndex: 60 }}\r\n            />\r\n          ) : null}\r\n        </div>\r\n\r\n        {/* Panel Backlog \"Sin fecha\" (C8) — lista en S2, drag en S3. */}\r\n        {backlogOpen ? (\r\n          <CalBacklogPanel\r\n            items={backlog}\r\n            money={money}\r\n            projColor={projColor}\r\n            onItemClick={(id) => onTaskOpen?.(id)}\r\n            onCollapse={() => setBacklogOpen(false)}\r\n            locale={locale === 'en' ? 'en' : 'es'}\r\n          />\r\n        ) : (\r\n          <CalPulseRail onExpand={() => setBacklogOpen(true)} locale={locale === 'en' ? 'en' : 'es'} />\r\n        )}\r\n      </div>\r\n\r\n      <CalLegend projects={projects} locale={locale === 'en' ? 'en' : 'es'} />\r\n    </div>\r\n  );\r\n}\r\n\r\n// ── Fondo de una semana (celdas: festivo/finde/hoy/fuera-de-mes) ─────────────\r\ninterface WeekBgProps {\r\n  grid: ReturnType<typeof buildMonthGrid>;\r\n  ws: number; we: number;\r\n  todaySerial: number;\r\n  showFestivos: boolean;\r\n  holidaySerials: Set<number>;\r\n  locale: 'es' | 'en';\r\n  deadlineDays: Set<number>;\r\n}\r\nfunction WeekBg({ grid, ws, we, todaySerial, showFestivos, holidaySerials, deadlineDays }: WeekBgProps) {\r\n  const days: number[] = [];\r\n  for (let d = ws; d <= we; d++) days.push(d);\r\n  return (\r\n    <div className=\"cal-week-bg\">\r\n      {days.map((d) => {\r\n        const date = grid.serialToDate(d);\r\n        const inMonth = d >= grid.monthStartSerial && d <= grid.monthEndSerial;\r\n        const isHoliday = showFestivos && holidaySerials.has(d);\r\n        let cls = 'cal-day';\r\n        if (isWeekendSerial(grid, d)) cls += ' wknd';\r\n        if (isHoliday) cls += ' festivo';\r\n        if (!inMonth) cls += ' out';\r\n        if (d === todaySerial) cls += ' today';\r\n        if (deadlineDays.has(d)) cls += ' deadline-day';\r\n        return (\r\n          <div key={d} className={cls}>\r\n            <span className=\"cal-day-num\">{date.getDate()}</span>\r\n            {isHoliday ? <span className=\"cal-day-tag\">Festivo</span> : null}\r\n          </div>\r\n        );\r\n      })}\r\n    </div>\r\n  );\r\n}\r\n\r\n// ── Una semana con barras + chips + \"+N más\" ─────────────────────────────────\r\ninterface WeekRowProps {\r\n  grid: ReturnType<typeof buildMonthGrid>;\r\n  ws: number; we: number;\r\n  tasks: CalTask[];\r\n  items: DayItem[];\r\n  money: MoneyMode;\r\n  projColor: string;\r\n  todaySerial: number;\r\n  showFestivos: boolean;\r\n  holidaySerials: Set<number>;\r\n  locale: 'es' | 'en';\r\n  onTaskOpen?: (taskId: string) => void;\r\n  onMore: (day: number, items: DayItem[], tasksOfDay: CalTask[]) => void;\r\n  canReschedule?: boolean;\r\n  /** soltar una barra movida `deltaDays` columnas → abre confirmación CPM. */\r\n  onDragReschedule?: (taskId: string, deltaDays: number, anchor: DOMRect) => void;\r\n  /** tarea con reprogramación pendiente de confirmar: se queda como fantasma\r\n   *  en la posición destino (no vuelve al origen hasta confirmar/cancelar). */\r\n  pendingGhost?: { uid: string; days: number } | null;\r\n  /** 1.9.42 · modo vencimiento: chips de un día y `slots` filas como mucho. */\r\n  due?: boolean;\r\n  slots?: number;\r\n  showValues?: boolean;\r\n}\r\nfunction WeekRow({ grid, ws, we, tasks, items, money, projColor, todaySerial, showFestivos, holidaySerials, locale, onTaskOpen, onMore, canReschedule, onDragReschedule, pendingGhost, due = false, slots = 2, showValues = true }: WeekRowProps) {\r\n  const lay = useMemo(\r\n    () => (due ? layoutDueWeek(tasks, items, ws, we, slots) : layoutWeek(tasks, items, ws, we)),\r\n    [tasks, items, ws, we, due, slots],\r\n  );\r\n  const deadlineDays = useMemo(() => new Set(items.filter((i) => i.type === 'deadline').map((i) => i.serial)), [items]);\r\n  const minH = due ? 0 : Math.max(WEEK_MIN_H, lay.laneCount * SLOT_H + 36);\r\n  const rowRef = useRef<HTMLDivElement>(null);\r\n  const [dragOffset, setDragOffset] = useState<{ id: string; days: number } | null>(null);\r\n\r\n  // Drag de una barra: arrastrar horizontalmente la mueve en pasos de 1 día\r\n  // (ancho de columna = anchoFila/7). Al soltar, si se movió, dispara la\r\n  // confirmación CPM. Si no se movió (click puro), abre el drawer.\r\n  const onBarPointerDown = (e: React.PointerEvent, taskId: string) => {\r\n    if (!canReschedule || !onDragReschedule) { onTaskOpen?.(taskId); return; }\r\n    e.preventDefault();\r\n    const row = rowRef.current;\r\n    if (!row) return;\r\n    const colW = row.getBoundingClientRect().width / 7;\r\n    const startX = e.clientX;\r\n    let lastDays = 0;\r\n    const move = (ev: PointerEvent) => {\r\n      const days = Math.round((ev.clientX - startX) / colW);\r\n      lastDays = days;\r\n      setDragOffset({ id: taskId, days });\r\n    };\r\n    const up = (ev: PointerEvent) => {\r\n      window.removeEventListener('pointermove', move);\r\n      window.removeEventListener('pointerup', up);\r\n      setDragOffset(null);\r\n      if (lastDays === 0) { onTaskOpen?.(taskId); return; }\r\n      const anchor = new DOMRect(ev.clientX, ev.clientY, 0, 0);\r\n      onDragReschedule(taskId, lastDays, anchor);\r\n    };\r\n    window.addEventListener('pointermove', move);\r\n    window.addEventListener('pointerup', up);\r\n  };\r\n\r\n  return (\r\n    <div ref={rowRef} className=\"cal-week\" style={{ minHeight: `${minH}px` }}>\r\n      <WeekBg grid={grid} ws={ws} we={we} todaySerial={todaySerial} showFestivos={showFestivos} holidaySerials={holidaySerials} locale={locale} deadlineDays={deadlineDays} />\r\n      <div className=\"cal-items\">\r\n        {lay.bars.map((b, i) => {\r\n          // Offset visual: durante el drag activo, o mientras hay confirmación\r\n          // pendiente para esta tarea (queda como fantasma en el destino).\r\n          const dragDays = dragOffset?.id === b.t.uid ? dragOffset.days : null;\r\n          const ghostDays = pendingGhost?.uid === b.t.uid ? pendingGhost.days : null;\r\n          const off = dragDays ?? ghostDays ?? 0;\r\n          const isGhost = dragDays == null && ghostDays != null;\r\n          const shifted = off !== 0 ? { ...b, s: b.s + off, e: b.e + off } : b;\r\n          return (\r\n            <div\r\n              key={`b${i}`}\r\n              onPointerDown={(e) => onBarPointerDown(e, b.t.uid)}\r\n              style={{ cursor: canReschedule ? 'grab' : (onTaskOpen ? 'pointer' : 'default'), display: 'contents', opacity: isGhost ? 0.6 : 1 }}\r\n            >\r\n              <CalBar bar={shifted} ws={ws} money={money} projColor={projColor} slotH={due ? SLOT_H_DUE : SLOT_H} due={due} showValues={showValues} />\r\n            </div>\r\n          );\r\n        })}\r\n        {lay.chips.map((c, i) => (\r\n          <CalChip key={`c${i}`} chip={c} ws={ws} slotH={SLOT_H} />\r\n        ))}\r\n        {lay.more.map((m, i) => (\r\n          <CalMoreChip\r\n            key={`m${i}`}\r\n            more={m}\r\n            ws={ws}\r\n            slotH={due ? SLOT_H_DUE : SLOT_H}\r\n            enCabecera={due}\r\n            locale={locale}\r\n            onClick={() => onMore(\r\n              m.day,\r\n              m.items,\r\n              due\r\n                ? tasks.filter((t) => !t.container && t.endSerial === m.day)\r\n                : tasks.filter((t) => t.startSerial <= m.day && t.endSerial >= m.day),\r\n            )}\r\n          />\r\n        ))}\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n","/**\n * CardStack Component\n * Visual grouping of related cards with expand/collapse\n * @module components/CardStack\n */\n\nimport { useState, useMemo } from 'react'\nimport type { Card } from '../../types'\nimport type { CardStack as CardStackType } from '../../types/card-stack'\nimport { cn } from '../../utils'\nimport './card-stack.css'\n\nexport interface CardStackProps {\n  /** Stack configuration */\n  stack: CardStackType\n  /** All cards in the board */\n  cards: Card[]\n  /** Card render function */\n  renderCard?: (card: Card) => React.ReactNode\n  /** Click handler for individual cards */\n  onCardClick?: (card: Card) => void\n  /** Expand/collapse handler */\n  onToggleExpand?: (stackId: string) => void\n  /** Unstack handler (remove card from stack) */\n  onUnstack?: (stackId: string, cardId: string) => void\n  /** Delete entire stack handler */\n  onDeleteStack?: (stackId: string) => void\n  /** Custom className */\n  className?: string\n}\n\n/**\n * CardStack - Collapsible group of related cards\n */\nexport function CardStack({\n  stack,\n  cards,\n  renderCard,\n  onCardClick,\n  onToggleExpand,\n  onUnstack,\n  onDeleteStack,\n  className,\n}: CardStackProps) {\n  const [isHovered, setIsHovered] = useState(false)\n\n  // Get cards in this stack\n  const stackCards = useMemo(() => {\n    return cards.filter((card) => stack.cardIds.includes(card.id))\n  }, [cards, stack.cardIds])\n\n  // Calculate stack statistics\n  const stats = useMemo(() => {\n    const totalCards = stackCards.length\n    const uniqueAssignees = new Set(\n      stackCards.flatMap((c) => c.assignedUserIds || [])\n    ).size\n    const priorities = stackCards.map((c) => c.priority).filter(Boolean)\n    const labels = new Set(stackCards.flatMap((c) => c.labels || [])).size\n\n    return {\n      totalCards,\n      uniqueAssignees,\n      priorities,\n      labels,\n    }\n  }, [stackCards])\n\n  const handleToggle = () => {\n    onToggleExpand?.(stack.id)\n  }\n\n  return (\n    <div\n      className={cn('card-stack', !stack.isExpanded && 'card-stack-collapsed', className)}\n      onMouseEnter={() => setIsHovered(true)}\n      onMouseLeave={() => setIsHovered(false)}\n      style={{\n        '--stack-color': stack.color || 'var(--color-accent-primary)',\n      } as React.CSSProperties}\n    >\n      {/* Stack Header */}\n      <div className=\"card-stack-header\" onClick={handleToggle}>\n        <div className=\"card-stack-header-left\">\n          {/* Expand/Collapse Icon */}\n          <button className=\"card-stack-toggle\" aria-label={stack.isExpanded ? 'Collapse' : 'Expand'}>\n            <svg\n              width=\"16\"\n              height=\"16\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              strokeWidth=\"2\"\n              strokeLinecap=\"round\"\n              strokeLinejoin=\"round\"\n              className={cn('card-stack-chevron', stack.isExpanded && 'expanded')}\n            >\n              <polyline points=\"6 9 12 15 18 9\" />\n            </svg>\n          </button>\n\n          {/* Stack Title */}\n          <h3 className=\"card-stack-title\">{stack.title}</h3>\n\n          {/* Stack Badge */}\n          <div className=\"card-stack-badge\">{stats.totalCards}</div>\n\n          {/* Strategy Badge */}\n          <div className=\"card-stack-strategy\">\n            {stack.strategy === 'ai-similarity' && '✨ AI'}\n            {stack.strategy === 'manual' && '👤 Manual'}\n            {stack.strategy === 'labels' && '🏷️ Labels'}\n            {stack.strategy === 'assignee' && '👥 Assignee'}\n            {stack.strategy === 'priority' && '🎯 Priority'}\n            {stack.strategy === 'epic' && '📚 Epic'}\n          </div>\n        </div>\n\n        {/* Stack Actions */}\n        {isHovered && (\n          <div className=\"card-stack-actions\">\n            <button\n              className=\"card-stack-action\"\n              onClick={(e) => {\n                e.stopPropagation()\n                onDeleteStack?.(stack.id)\n              }}\n              aria-label=\"Delete stack\"\n            >\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n                <polyline points=\"3 6 5 6 21 6\" />\n                <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n              </svg>\n            </button>\n          </div>\n        )}\n      </div>\n\n      {/* Stack Summary (when collapsed) */}\n      {!stack.isExpanded && (\n        <div className=\"card-stack-summary\">\n          <div className=\"card-stack-summary-item\">\n            <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n              <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\" />\n              <circle cx=\"12\" cy=\"7\" r=\"4\" />\n            </svg>\n            <span>{stats.uniqueAssignees} assignees</span>\n          </div>\n          {stats.labels > 0 && (\n            <div className=\"card-stack-summary-item\">\n              <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n                <path d=\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\" />\n                <line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\" />\n              </svg>\n              <span>{stats.labels} labels</span>\n            </div>\n          )}\n          {stack.confidence && (\n            <div className=\"card-stack-summary-item\">\n              <span className=\"card-stack-confidence\">{Math.round(stack.confidence * 100)}% match</span>\n            </div>\n          )}\n        </div>\n      )}\n\n      {/* Stack Content (when expanded) */}\n      {stack.isExpanded && (\n        <div className=\"card-stack-content\">\n          {stackCards.length === 0 ? (\n            <div className=\"card-stack-empty\">\n              <p>No cards in this stack</p>\n              <span>Drag cards here or delete this stack</span>\n            </div>\n          ) : (\n            <div className=\"card-stack-cards\">\n              {stackCards.map((card) => (\n                <div key={card.id} className=\"card-stack-card-wrapper\">\n                  {renderCard ? (\n                    <div onClick={() => onCardClick?.(card)}>{renderCard(card)}</div>\n                  ) : (\n                    <div className=\"card-stack-default-card\" onClick={() => onCardClick?.(card)}>\n                      <h4>{card.title}</h4>\n                      {card.description && <p>{card.description.substring(0, 100)}...</p>}\n                    </div>\n                  )}\n                  {/* Unstack button */}\n                  <button\n                    className=\"card-stack-unstack-btn\"\n                    onClick={(e) => {\n                      e.stopPropagation()\n                      onUnstack?.(stack.id, card.id)\n                    }}\n                    aria-label=\"Remove from stack\"\n                  >\n                    <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n                      <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n                      <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n                    </svg>\n                  </button>\n                </div>\n              ))}\n            </div>\n          )}\n        </div>\n      )}\n    </div>\n  )\n}\n","/**\r\n * Card History & Time Travel Types\r\n * Tracks all changes to cards with full reproducibility\r\n * @module types/card-history\r\n */\r\n\r\nimport type { Card } from './index'\r\n\r\n/**\r\n * Types of events that can occur in a card's history\r\n */\r\nexport type CardHistoryEventType =\r\n  | 'created'\r\n  | 'status_changed'\r\n  | 'assignee_changed'\r\n  | 'priority_changed'\r\n  | 'moved'\r\n  | 'title_updated'\r\n  | 'description_updated'\r\n  | 'dates_changed'\r\n  | 'labels_changed'\r\n  | 'dependency_added'\r\n  | 'dependency_removed'\r\n  | 'comment_added'\r\n  | 'archived'\r\n  | 'restored'\r\n\r\n/**\r\n * Represents a single change in a card's history\r\n */\r\nexport interface CardHistoryEvent {\r\n  /** Unique event ID */\r\n  id: string\r\n  /** Card this event belongs to */\r\n  cardId: string\r\n  /** When the event occurred */\r\n  timestamp: Date\r\n  /** Type of change */\r\n  type: CardHistoryEventType\r\n  /** User who made the change */\r\n  userId: string\r\n  /** User display name (for UI) */\r\n  userName?: string\r\n  /** User avatar URL (for UI) */\r\n  userAvatar?: string\r\n  /** Detailed changes (before/after) */\r\n  changes: Record<string, { from: any; to: any }>\r\n  /** Additional context */\r\n  metadata?: {\r\n    /** Column names for moves */\r\n    fromColumn?: string\r\n    toColumn?: string\r\n    /** Comment text for comment events */\r\n    commentText?: string\r\n    /** Reason for change */\r\n    reason?: string\r\n    /** Related card IDs */\r\n    relatedCards?: string[]\r\n  }\r\n}\r\n\r\n/**\r\n * Filter configuration for history events\r\n */\r\nexport interface HistoryFilter {\r\n  /** Filter by event types */\r\n  types?: CardHistoryEventType[]\r\n  /** Filter by users */\r\n  users?: string[]\r\n  /** Filter by date range */\r\n  dateRange?: {\r\n    start: Date\r\n    end: Date\r\n  }\r\n  /** Search in change descriptions */\r\n  searchTerm?: string\r\n}\r\n\r\n/**\r\n * State for the replay/time-travel feature\r\n */\r\nexport interface ReplayState {\r\n  /** Current position in history (0 = oldest, length-1 = newest) */\r\n  currentIndex: number\r\n  /** Is replay actively playing */\r\n  isPlaying: boolean\r\n  /** Playback speed (1 = normal, 2 = 2x, etc.) */\r\n  speed: number\r\n  /** Card state at current index */\r\n  cardState: Card\r\n  /** Total number of events */\r\n  totalEvents: number\r\n  /** Can go back */\r\n  canGoBack: boolean\r\n  /** Can go forward */\r\n  canGoForward: boolean\r\n}\r\n\r\n/**\r\n * Configuration for history tracking\r\n */\r\nexport interface HistoryConfig {\r\n  /** Enable automatic history tracking */\r\n  enabled: boolean\r\n  /** Maximum events to store per card */\r\n  maxEventsPerCard: number\r\n  /** Auto-save interval in milliseconds */\r\n  autoSaveInterval: number\r\n  /** Store history in localStorage */\r\n  persistToStorage: boolean\r\n  /** Storage key prefix */\r\n  storagePrefix: string\r\n}\r\n\r\n/**\r\n * Timeline visualization configuration\r\n */\r\nexport interface TimelineConfig {\r\n  /** Show event icons */\r\n  showIcons: boolean\r\n  /** Show user avatars */\r\n  showAvatars: boolean\r\n  /** Group events by day */\r\n  groupByDay: boolean\r\n  /** Show relative times (e.g. \"2 hours ago\") */\r\n  useRelativeTime: boolean\r\n  /** Compact mode (less spacing) */\r\n  compact: boolean\r\n}\r\n\r\n/**\r\n * Snapshot of a card at a specific point in time\r\n */\r\nexport interface CardSnapshot {\r\n  /** When this snapshot was taken */\r\n  timestamp: Date\r\n  /** Complete card state */\r\n  cardState: Card\r\n  /** Event that triggered this snapshot */\r\n  eventId: string\r\n  /** Index in history */\r\n  index: number\r\n}\r\n\r\n/**\r\n * Statistics about a card's history\r\n */\r\nexport interface HistoryStats {\r\n  /** Total events */\r\n  totalEvents: number\r\n  /** Events by type */\r\n  eventsByType: Record<CardHistoryEventType, number>\r\n  /** Events by user */\r\n  eventsByUser: Record<string, number>\r\n  /** First event timestamp */\r\n  firstEvent?: Date\r\n  /** Last event timestamp */\r\n  lastEvent?: Date\r\n  /** Most active day */\r\n  mostActiveDay?: Date\r\n  /** Average events per day */\r\n  avgEventsPerDay: number\r\n  /** Time in each column (in milliseconds) */\r\n  timeInColumns: Record<string, number>\r\n}\r\n\r\n/**\r\n * Default history configuration\r\n */\r\nexport const DEFAULT_HISTORY_CONFIG: HistoryConfig = {\r\n  enabled: true,\r\n  maxEventsPerCard: 1000,\r\n  autoSaveInterval: 5000,\r\n  persistToStorage: true,\r\n  storagePrefix: 'asakaa-history',\r\n}\r\n\r\n/**\r\n * Default timeline configuration\r\n */\r\nexport const DEFAULT_TIMELINE_CONFIG: TimelineConfig = {\r\n  showIcons: true,\r\n  showAvatars: true,\r\n  groupByDay: true,\r\n  useRelativeTime: true,\r\n  compact: false,\r\n}\r\n\r\n/**\r\n * Helper to create a history event\r\n */\r\nexport function createHistoryEvent(\r\n  cardId: string,\r\n  type: CardHistoryEventType,\r\n  userId: string,\r\n  changes: Record<string, { from: any; to: any }>,\r\n  metadata?: CardHistoryEvent['metadata']\r\n): CardHistoryEvent {\r\n  return {\r\n    id: `${cardId}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n    cardId,\r\n    timestamp: new Date(),\r\n    type,\r\n    userId,\r\n    changes,\r\n    metadata,\r\n  }\r\n}\r\n\r\n/**\r\n * Helper to format event description for UI\r\n */\r\nexport function formatEventDescription(event: CardHistoryEvent): string {\r\n  switch (event.type) {\r\n    case 'created':\r\n      return `Created card`\r\n    case 'status_changed':\r\n      return `Changed status from \"${event.changes.status?.from}\" to \"${event.changes.status?.to}\"`\r\n    case 'assignee_changed':\r\n      return `Changed assignee`\r\n    case 'priority_changed':\r\n      return `Changed priority from ${event.changes.priority?.from} to ${event.changes.priority?.to}`\r\n    case 'moved':\r\n      return `Moved from ${event.metadata?.fromColumn || 'unknown'} to ${event.metadata?.toColumn || 'unknown'}`\r\n    case 'title_updated':\r\n      return `Updated title`\r\n    case 'description_updated':\r\n      return `Updated description`\r\n    case 'dates_changed':\r\n      return `Changed dates`\r\n    case 'labels_changed':\r\n      return `Updated labels`\r\n    case 'dependency_added':\r\n      return `Added dependency`\r\n    case 'dependency_removed':\r\n      return `Removed dependency`\r\n    case 'comment_added':\r\n      return `Added comment`\r\n    case 'archived':\r\n      return `Archived card`\r\n    case 'restored':\r\n      return `Restored card`\r\n    default:\r\n      return `Updated card`\r\n  }\r\n}\r\n\r\n/**\r\n * Helper to get icon for event type\r\n */\r\nexport function getEventIcon(type: CardHistoryEventType): string {\r\n  const icons: Record<CardHistoryEventType, string> = {\r\n    created: '✨',\r\n    status_changed: '🔄',\r\n    assignee_changed: '👤',\r\n    priority_changed: '🎯',\r\n    moved: '➡️',\r\n    title_updated: '✏️',\r\n    description_updated: '📝',\r\n    dates_changed: '📅',\r\n    labels_changed: '🏷️',\r\n    dependency_added: '🔗',\r\n    dependency_removed: '⛓️‍💥',\r\n    comment_added: '💬',\r\n    archived: '📦',\r\n    restored: '♻️',\r\n  }\r\n  return icons[type] || '📌'\r\n}\r\n\r\n/**\r\n * Helper to get color for event type\r\n */\r\nexport function getEventColor(type: CardHistoryEventType): string {\r\n  const colors: Record<CardHistoryEventType, string> = {\r\n    created: '#10b981',\r\n    status_changed: '#00E5CC',\r\n    assignee_changed: '#8b5cf6',\r\n    priority_changed: '#f59e0b',\r\n    moved: '#00E5CC',\r\n    title_updated: '#6366f1',\r\n    description_updated: '#6366f1',\r\n    dates_changed: '#ec4899',\r\n    labels_changed: '#00E5CC',\r\n    dependency_added: '#a855f7',\r\n    dependency_removed: '#ef4444',\r\n    comment_added: '#84cc16',\r\n    archived: '#6b7280',\r\n    restored: '#10b981',\r\n  }\r\n  return colors[type] || '#6b7280'\r\n}\r\n","/**\n * CardHistoryTimeline Component\n * Interactive timeline visualization of card history\n * @module components/CardHistory\n */\n\nimport { useState, useMemo, useRef, useEffect } from 'react'\nimport type {\n  CardHistoryEvent,\n  HistoryFilter,\n  TimelineConfig,\n  CardHistoryEventType,\n} from '../../types/card-history'\nimport {\n  DEFAULT_TIMELINE_CONFIG,\n  formatEventDescription,\n  getEventIcon,\n  getEventColor,\n} from '../../types/card-history'\nimport { cn } from '../../utils'\n\nexport interface CardHistoryTimelineProps {\n  /** History events to display */\n  events: CardHistoryEvent[]\n  /** Current filter */\n  filter: HistoryFilter\n  /** Update filter */\n  onFilterChange: (filter: HistoryFilter) => void\n  /** Clear filter */\n  onClearFilter: () => void\n  /** Click on event */\n  onEventClick?: (event: CardHistoryEvent) => void\n  /** Selected event ID */\n  selectedEventId?: string\n  /** Timeline configuration */\n  config?: Partial<TimelineConfig>\n  /** Custom className */\n  className?: string\n}\n\n/**\n * Timeline component showing card history\n */\nexport function CardHistoryTimeline({\n  events,\n  filter,\n  onFilterChange,\n  onClearFilter,\n  onEventClick,\n  selectedEventId,\n  config: customConfig,\n  className,\n}: CardHistoryTimelineProps) {\n  const config = useMemo(\n    () => ({ ...DEFAULT_TIMELINE_CONFIG, ...customConfig }),\n    [customConfig]\n  )\n\n  const [expandedEvents, setExpandedEvents] = useState<Set<string>>(new Set())\n  const timelineRef = useRef<HTMLDivElement>(null)\n\n  // Group events by day if configured\n  const groupedEvents = useMemo(() => {\n    if (!config.groupByDay) {\n      return [{ date: null, events }]\n    }\n\n    const groups = new Map<string, CardHistoryEvent[]>()\n    events.forEach((event) => {\n      const dateKey = event.timestamp.toISOString().split('T')[0]!\n      const group = groups.get(dateKey)\n      if (!group) {\n        groups.set(dateKey, [event])\n      } else {\n        group.push(event)\n      }\n    })\n\n    return Array.from(groups.entries())\n      .sort((a, b) => b[0].localeCompare(a[0]))\n      .map(([dateStr, events]) => ({\n        date: new Date(dateStr),\n        events: events.sort(\n          (a, b) => b.timestamp.getTime() - a.timestamp.getTime()\n        ),\n      }))\n  }, [events, config.groupByDay])\n\n  // Get unique users and event types for filter\n  const { uniqueUsers, uniqueTypes } = useMemo(() => {\n    const users = new Set<string>()\n    const types = new Set<CardHistoryEventType>()\n    events.forEach((event) => {\n      users.add(event.userId)\n      types.add(event.type)\n    })\n    return {\n      uniqueUsers: Array.from(users),\n      uniqueTypes: Array.from(types),\n    }\n  }, [events])\n\n  // Toggle event expansion\n  const toggleEvent = (eventId: string) => {\n    setExpandedEvents((prev) => {\n      const next = new Set(prev)\n      if (next.has(eventId)) {\n        next.delete(eventId)\n      } else {\n        next.add(eventId)\n      }\n      return next\n    })\n  }\n\n  // Format relative time\n  const formatRelativeTime = (date: Date): string => {\n    const now = new Date()\n    const diffMs = now.getTime() - date.getTime()\n    const diffMins = Math.floor(diffMs / 60000)\n    const diffHours = Math.floor(diffMs / 3600000)\n    const diffDays = Math.floor(diffMs / 86400000)\n\n    if (diffMins < 1) return 'just now'\n    if (diffMins < 60) return `${diffMins}m ago`\n    if (diffHours < 24) return `${diffHours}h ago`\n    if (diffDays < 7) return `${diffDays}d ago`\n    return date.toLocaleDateString()\n  }\n\n  // Active filter count\n  const activeFilterCount = useMemo(() => {\n    let count = 0\n    if (filter.types && filter.types.length > 0) count++\n    if (filter.users && filter.users.length > 0) count++\n    if (filter.dateRange) count++\n    if (filter.searchTerm) count++\n    return count\n  }, [filter])\n\n  // Scroll to selected event\n  useEffect(() => {\n    if (selectedEventId && timelineRef.current) {\n      const element = timelineRef.current.querySelector(\n        `[data-event-id=\"${selectedEventId}\"]`\n      )\n      if (element) {\n        element.scrollIntoView({ behavior: 'smooth', block: 'center' })\n      }\n    }\n  }, [selectedEventId])\n\n  if (events.length === 0) {\n    return (\n      <div className={cn('history-timeline-empty', className)}>\n        <div className=\"history-timeline-empty-icon\">📜</div>\n        <p className=\"history-timeline-empty-text\">No history events yet</p>\n        <p className=\"history-timeline-empty-subtext\">\n          Changes to this card will appear here\n        </p>\n      </div>\n    )\n  }\n\n  return (\n    <div className={cn('history-timeline', config.compact && 'compact', className)}>\n      {/* Filter Bar */}\n      <div className=\"history-timeline-filters\">\n        <div className=\"history-timeline-filter-group\">\n          {/* Event Type Filter */}\n          <select\n            className=\"history-timeline-filter-select\"\n            value={filter.types?.[0] || ''}\n            onChange={(e) => {\n              const value = e.target.value\n              onFilterChange({\n                ...filter,\n                types: value ? [value as CardHistoryEventType] : undefined,\n              })\n            }}\n          >\n            <option value=\"\">All Events</option>\n            {uniqueTypes.map((type) => (\n              <option key={type} value={type}>\n                {getEventIcon(type)} {type.replace('_', ' ')}\n              </option>\n            ))}\n          </select>\n\n          {/* User Filter */}\n          {uniqueUsers.length > 1 && (\n            <select\n              className=\"history-timeline-filter-select\"\n              value={filter.users?.[0] || ''}\n              onChange={(e) => {\n                const value = e.target.value\n                onFilterChange({\n                  ...filter,\n                  users: value ? [value] : undefined,\n                })\n              }}\n            >\n              <option value=\"\">All Users</option>\n              {uniqueUsers.map((userId) => (\n                <option key={userId} value={userId}>\n                  {userId}\n                </option>\n              ))}\n            </select>\n          )}\n\n          {/* Search */}\n          <input\n            type=\"text\"\n            className=\"history-timeline-filter-search\"\n            placeholder=\"Search history...\"\n            value={filter.searchTerm || ''}\n            onChange={(e) =>\n              onFilterChange({ ...filter, searchTerm: e.target.value })\n            }\n          />\n        </div>\n\n        {/* Clear Filter */}\n        {activeFilterCount > 0 && (\n          <button\n            className=\"history-timeline-filter-clear\"\n            onClick={onClearFilter}\n          >\n            Clear filters ({activeFilterCount})\n          </button>\n        )}\n      </div>\n\n      {/* Timeline */}\n      <div className=\"history-timeline-container\" ref={timelineRef}>\n        {groupedEvents.map((group) => (\n          <div key={group.date?.toISOString() || 'all'} className=\"history-timeline-group\">\n            {/* Day Header */}\n            {config.groupByDay && group.date && (\n              <div className=\"history-timeline-day-header\">\n                <span className=\"history-timeline-day-date\">\n                  {group.date.toLocaleDateString('en-US', {\n                    month: 'short',\n                    day: 'numeric',\n                    year: 'numeric',\n                  })}\n                </span>\n                <span className=\"history-timeline-day-count\">\n                  {group.events.length} events\n                </span>\n              </div>\n            )}\n\n            {/* Events */}\n            <div className=\"history-timeline-events\">\n              {group.events.map((event, eventIndex) => {\n                const isExpanded = expandedEvents.has(event.id)\n                const isSelected = selectedEventId === event.id\n                const eventColor = getEventColor(event.type)\n\n                return (\n                  <div\n                    key={event.id}\n                    data-event-id={event.id}\n                    className={cn(\n                      'history-timeline-event',\n                      isExpanded && 'expanded',\n                      isSelected && 'selected'\n                    )}\n                    onClick={() => onEventClick?.(event)}\n                  >\n                    {/* Timeline Line */}\n                    <div className=\"history-timeline-line\">\n                      {/* Event Dot */}\n                      <div\n                        className=\"history-timeline-dot\"\n                        style={{ backgroundColor: eventColor }}\n                      >\n                        {config.showIcons && (\n                          <span className=\"history-timeline-dot-icon\">\n                            {getEventIcon(event.type)}\n                          </span>\n                        )}\n                      </div>\n\n                      {/* Connecting Line */}\n                      {eventIndex < group.events.length - 1 && (\n                        <div\n                          className=\"history-timeline-connector\"\n                          style={{ borderColor: eventColor }}\n                        />\n                      )}\n                    </div>\n\n                    {/* Event Content */}\n                    <div className=\"history-timeline-event-content\">\n                      {/* Header */}\n                      <div className=\"history-timeline-event-header\">\n                        <div className=\"history-timeline-event-header-left\">\n                          {/* User Avatar */}\n                          {config.showAvatars && event.userAvatar && (\n                            <img\n                              src={event.userAvatar}\n                              alt={event.userName || event.userId}\n                              className=\"history-timeline-event-avatar\"\n                            />\n                          )}\n\n                          {/* Description */}\n                          <div className=\"history-timeline-event-description\">\n                            <span className=\"history-timeline-event-user\">\n                              {event.userName || event.userId}\n                            </span>\n                            <span className=\"history-timeline-event-action\">\n                              {formatEventDescription(event)}\n                            </span>\n                          </div>\n                        </div>\n\n                        {/* Time */}\n                        <div className=\"history-timeline-event-time\">\n                          {config.useRelativeTime\n                            ? formatRelativeTime(event.timestamp)\n                            : event.timestamp.toLocaleString()}\n                        </div>\n                      </div>\n\n                      {/* Changes Preview */}\n                      {Object.keys(event.changes).length > 0 && (\n                        <button\n                          className=\"history-timeline-event-toggle\"\n                          onClick={(e) => {\n                            e.stopPropagation()\n                            toggleEvent(event.id)\n                          }}\n                        >\n                          {isExpanded ? '▼' : '▶'} Show changes\n                        </button>\n                      )}\n\n                      {/* Expanded Changes */}\n                      {isExpanded && (\n                        <div className=\"history-timeline-event-changes\">\n                          {Object.entries(event.changes).map(([key, change]) => (\n                            <div key={key} className=\"history-timeline-event-change\">\n                              <span className=\"history-timeline-event-change-key\">\n                                {key}:\n                              </span>\n                              <div className=\"history-timeline-event-change-values\">\n                                <span className=\"history-timeline-event-change-from\">\n                                  {JSON.stringify(change.from)}\n                                </span>\n                                <span className=\"history-timeline-event-change-arrow\">\n                                  →\n                                </span>\n                                <span className=\"history-timeline-event-change-to\">\n                                  {JSON.stringify(change.to)}\n                                </span>\n                              </div>\n                            </div>\n                          ))}\n\n                          {/* Metadata */}\n                          {event.metadata && Object.keys(event.metadata).length > 0 && (\n                            <div className=\"history-timeline-event-metadata\">\n                              <div className=\"history-timeline-event-metadata-title\">\n                                Additional Info:\n                              </div>\n                              {Object.entries(event.metadata).map(([key, value]) => (\n                                <div key={key} className=\"history-timeline-event-metadata-item\">\n                                  <span className=\"history-timeline-event-metadata-key\">\n                                    {key}:\n                                  </span>\n                                  <span className=\"history-timeline-event-metadata-value\">\n                                    {JSON.stringify(value)}\n                                  </span>\n                                </div>\n                              ))}\n                            </div>\n                          )}\n                        </div>\n                      )}\n                    </div>\n                  </div>\n                )\n              })}\n            </div>\n          </div>\n        ))}\n      </div>\n    </div>\n  )\n}\n","/**\n * CardHistoryReplay Component\n * Video-player-style controls for replaying card history\n * @module components/CardHistory\n */\n\nimport { useMemo } from 'react'\nimport type { ReplayState, CardHistoryEvent } from '../../types/card-history'\nimport { getEventIcon, formatEventDescription } from '../../types/card-history'\nimport { cn } from '../../utils'\n\nexport interface CardHistoryReplayProps {\n  /** Current replay state */\n  replayState: ReplayState | null\n  /** All history events */\n  events: CardHistoryEvent[]\n  /** Start replay */\n  onStartReplay: () => void\n  /** Stop replay */\n  onStopReplay: () => void\n  /** Toggle play/pause */\n  onTogglePlayback: () => void\n  /** Go to previous event */\n  onPrevious: () => void\n  /** Go to next event */\n  onNext: () => void\n  /** Go to specific event */\n  onGoToEvent: (index: number) => void\n  /** Change playback speed */\n  onSpeedChange: (speed: number) => void\n  /** Custom className */\n  className?: string\n}\n\n/**\n * Replay controls for time-travel functionality\n */\nexport function CardHistoryReplay({\n  replayState,\n  events,\n  onStartReplay,\n  onStopReplay,\n  onTogglePlayback,\n  onPrevious,\n  onNext,\n  onGoToEvent,\n  onSpeedChange,\n  className,\n}: CardHistoryReplayProps) {\n  // Available playback speeds\n  const speeds = [0.5, 1, 1.5, 2, 3]\n\n  // Current event\n  const currentEvent = useMemo(() => {\n    if (!replayState || events.length === 0) return null\n    return events[replayState.currentIndex]\n  }, [replayState, events])\n\n  // Progress percentage\n  const progress = useMemo(() => {\n    if (!replayState || replayState.totalEvents === 0) return 0\n    return (replayState.currentIndex / (replayState.totalEvents - 1)) * 100\n  }, [replayState])\n\n  // If no events, show empty state\n  if (events.length === 0) {\n    return (\n      <div className={cn('history-replay-empty', className)}>\n        <div className=\"history-replay-empty-icon\">⏳</div>\n        <p className=\"history-replay-empty-text\">No history to replay</p>\n      </div>\n    )\n  }\n\n  // If not in replay mode, show start button\n  if (!replayState) {\n    return (\n      <div className={cn('history-replay-start', className)}>\n        <button className=\"history-replay-start-button\" onClick={onStartReplay}>\n          <svg\n            className=\"history-replay-start-icon\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth=\"2\"\n          >\n            <polygon points=\"5 3 19 12 5 21 5 3\" />\n          </svg>\n          <span>Start Time Travel</span>\n        </button>\n        <p className=\"history-replay-start-hint\">\n          Replay {events.length} events from this card's history\n        </p>\n      </div>\n    )\n  }\n\n  return (\n    <div className={cn('history-replay', className)}>\n      {/* Current Event Display */}\n      <div className=\"history-replay-current-event\">\n        <div className=\"history-replay-event-icon\">\n          {currentEvent && getEventIcon(currentEvent.type)}\n        </div>\n        <div className=\"history-replay-event-info\">\n          <div className=\"history-replay-event-description\">\n            {currentEvent && formatEventDescription(currentEvent)}\n          </div>\n          <div className=\"history-replay-event-meta\">\n            <span className=\"history-replay-event-index\">\n              Event {replayState.currentIndex + 1} of {replayState.totalEvents}\n            </span>\n            <span className=\"history-replay-event-time\">\n              {currentEvent && currentEvent.timestamp.toLocaleString()}\n            </span>\n          </div>\n        </div>\n      </div>\n\n      {/* Progress Bar */}\n      <div className=\"history-replay-progress-container\">\n        <input\n          type=\"range\"\n          className=\"history-replay-progress-slider\"\n          min=\"0\"\n          max={replayState.totalEvents - 1}\n          value={replayState.currentIndex}\n          onChange={(e) => onGoToEvent(parseInt(e.target.value))}\n        />\n        <div\n          className=\"history-replay-progress-fill\"\n          style={{ width: `${progress}%` }}\n        />\n        {/* Event markers on timeline */}\n        <div className=\"history-replay-progress-markers\">\n          {events.map((event, index) => (\n            <div\n              key={event.id}\n              className={cn(\n                'history-replay-progress-marker',\n                index === replayState.currentIndex && 'active'\n              )}\n              style={{\n                left: `${(index / (replayState.totalEvents - 1)) * 100}%`,\n              }}\n              onClick={() => onGoToEvent(index)}\n              title={formatEventDescription(event)}\n            />\n          ))}\n        </div>\n      </div>\n\n      {/* Playback Controls */}\n      <div className=\"history-replay-controls\">\n        {/* Previous Button */}\n        <button\n          className=\"history-replay-control-btn\"\n          onClick={onPrevious}\n          disabled={!replayState.canGoBack}\n          title=\"Previous event (←)\"\n        >\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n            <polygon points=\"19 20 9 12 19 4 19 20\" />\n            <line x1=\"5\" y1=\"19\" x2=\"5\" y2=\"5\" />\n          </svg>\n        </button>\n\n        {/* Play/Pause Button */}\n        <button\n          className=\"history-replay-control-btn history-replay-control-play\"\n          onClick={onTogglePlayback}\n          title={replayState.isPlaying ? 'Pause (Space)' : 'Play (Space)'}\n        >\n          {replayState.isPlaying ? (\n            <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n              <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" />\n              <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" />\n            </svg>\n          ) : (\n            <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n              <polygon points=\"5 3 19 12 5 21 5 3\" />\n            </svg>\n          )}\n        </button>\n\n        {/* Next Button */}\n        <button\n          className=\"history-replay-control-btn\"\n          onClick={onNext}\n          disabled={!replayState.canGoForward}\n          title=\"Next event (→)\"\n        >\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n            <polygon points=\"5 4 15 12 5 20 5 4\" />\n            <line x1=\"19\" y1=\"5\" x2=\"19\" y2=\"19\" />\n          </svg>\n        </button>\n\n        {/* Speed Control */}\n        <div className=\"history-replay-speed\">\n          <label className=\"history-replay-speed-label\">Speed:</label>\n          <div className=\"history-replay-speed-buttons\">\n            {speeds.map((speed) => (\n              <button\n                key={speed}\n                className={cn(\n                  'history-replay-speed-btn',\n                  replayState.speed === speed && 'active'\n                )}\n                onClick={() => onSpeedChange(speed)}\n              >\n                {speed}x\n              </button>\n            ))}\n          </div>\n        </div>\n\n        {/* Stop Button */}\n        <button\n          className=\"history-replay-control-btn history-replay-stop\"\n          onClick={onStopReplay}\n          title=\"Stop replay (Esc)\"\n        >\n          <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n            <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" />\n          </svg>\n        </button>\n      </div>\n\n      {/* Keyboard Shortcuts Hint */}\n      <div className=\"history-replay-shortcuts\">\n        <span className=\"history-replay-shortcut\">\n          <kbd>Space</kbd> Play/Pause\n        </span>\n        <span className=\"history-replay-shortcut\">\n          <kbd>←</kbd> Previous\n        </span>\n        <span className=\"history-replay-shortcut\">\n          <kbd>→</kbd> Next\n        </span>\n        <span className=\"history-replay-shortcut\">\n          <kbd>Esc</kbd> Stop\n        </span>\n      </div>\n\n      {/* Card State Preview */}\n      <div className=\"history-replay-card-preview\">\n        <div className=\"history-replay-card-preview-header\">\n          <span className=\"history-replay-card-preview-title\">\n            Card State at This Point\n          </span>\n          <span className=\"history-replay-card-preview-time\">\n            {currentEvent && currentEvent.timestamp.toLocaleDateString()}\n          </span>\n        </div>\n        <div className=\"history-replay-card-preview-content\">\n          <div className=\"history-replay-card-preview-field\">\n            <span className=\"history-replay-card-preview-label\">Title:</span>\n            <span className=\"history-replay-card-preview-value\">\n              {replayState.cardState.title}\n            </span>\n          </div>\n          {replayState.cardState.description && (\n            <div className=\"history-replay-card-preview-field\">\n              <span className=\"history-replay-card-preview-label\">Description:</span>\n              <span className=\"history-replay-card-preview-value\">\n                {replayState.cardState.description}\n              </span>\n            </div>\n          )}\n          <div className=\"history-replay-card-preview-field\">\n            <span className=\"history-replay-card-preview-label\">Priority:</span>\n            <span className=\"history-replay-card-preview-value\">\n              {replayState.cardState.priority || 'None'}\n            </span>\n          </div>\n          {replayState.cardState.labels && replayState.cardState.labels.length > 0 && (\n            <div className=\"history-replay-card-preview-field\">\n              <span className=\"history-replay-card-preview-label\">Labels:</span>\n              <div className=\"history-replay-card-preview-labels\">\n                {replayState.cardState.labels.map((label) => (\n                  <span key={label} className=\"history-replay-card-preview-label-tag\">\n                    {label}\n                  </span>\n                ))}\n              </div>\n            </div>\n          )}\n        </div>\n      </div>\n    </div>\n  )\n}\n","/**\r\n * Card Relationships & Graph Types\r\n * Force-directed graph visualization for card dependencies and relationships\r\n * @module types/card-relationships\r\n */\r\n\r\nimport type { Card } from './index'\r\n\r\n/**\r\n * Types of relationships between cards\r\n */\r\nexport type RelationshipType =\r\n  | 'blocks'        // This card blocks another card\r\n  | 'blocked_by'    // This card is blocked by another card\r\n  | 'depends_on'    // This card depends on another card\r\n  | 'required_by'   // This card is required by another card\r\n  | 'relates_to'    // General relationship\r\n  | 'duplicates'    // This card duplicates another card\r\n  | 'parent_of'     // Parent-child relationship\r\n  | 'child_of'      // Child-parent relationship\r\n  | 'similar_to'    // AI-detected similarity\r\n\r\n/**\r\n * Represents a relationship between two cards\r\n */\r\nexport interface CardRelationship {\r\n  /** Unique relationship ID */\r\n  id: string\r\n  /** Source card ID */\r\n  sourceId: string\r\n  /** Target card ID */\r\n  targetId: string\r\n  /** Type of relationship */\r\n  type: RelationshipType\r\n  /** Relationship strength (0-1, for AI-detected relationships) */\r\n  strength?: number\r\n  /** When relationship was created */\r\n  createdAt: Date\r\n  /** User who created the relationship */\r\n  createdBy?: string\r\n  /** Additional metadata */\r\n  metadata?: {\r\n    /** Reason for relationship */\r\n    reason?: string\r\n    /** Is this relationship auto-detected */\r\n    autoDetected?: boolean\r\n    /** Confidence score for auto-detected relationships */\r\n    confidence?: number\r\n  }\r\n}\r\n\r\n/**\r\n * Node in the relationship graph\r\n */\r\nexport interface GraphNode {\r\n  /** Card ID */\r\n  id: string\r\n  /** Card reference */\r\n  card: Card\r\n  /** X position (calculated by force simulation) */\r\n  x?: number\r\n  /** Y position (calculated by force simulation) */\r\n  y?: number\r\n  /** X velocity (for force simulation) */\r\n  vx?: number\r\n  /** Y velocity (for force simulation) */\r\n  vy?: number\r\n  /** Fixed position (prevent movement) */\r\n  fx?: number | null\r\n  /** Fixed position (prevent movement) */\r\n  fy?: number | null\r\n  /** Node degree (number of connections) */\r\n  degree?: number\r\n  /** Is this node on the critical path */\r\n  onCriticalPath?: boolean\r\n  /** Cluster ID (for grouping) */\r\n  clusterId?: string\r\n}\r\n\r\n/**\r\n * Edge in the relationship graph\r\n */\r\nexport interface GraphEdge {\r\n  /** Relationship ID */\r\n  id: string\r\n  /** Source node ID */\r\n  source: string | GraphNode\r\n  /** Target node ID */\r\n  target: string | GraphNode\r\n  /** Relationship type */\r\n  type: RelationshipType\r\n  /** Edge strength (for styling) */\r\n  strength?: number\r\n  /** Is this edge on the critical path */\r\n  onCriticalPath?: boolean\r\n}\r\n\r\n/**\r\n * Graph layout algorithms\r\n */\r\nexport type GraphLayout =\r\n  | 'force'        // Force-directed layout (D3 force simulation)\r\n  | 'hierarchical' // Top-down hierarchical layout\r\n  | 'circular'     // Circular layout\r\n  | 'radial'       // Radial layout from center node\r\n  | 'grid'         // Grid layout\r\n\r\n/**\r\n * Graph visualization configuration\r\n */\r\nexport interface GraphConfig {\r\n  /** Layout algorithm */\r\n  layout: GraphLayout\r\n  /** Width of the graph container */\r\n  width: number\r\n  /** Height of the graph container */\r\n  height: number\r\n  /** Enable node dragging */\r\n  enableDragging: boolean\r\n  /** Enable zoom and pan */\r\n  enableZoom: boolean\r\n  /** Show node labels */\r\n  showLabels: boolean\r\n  /** Show edge labels */\r\n  showEdgeLabels: boolean\r\n  /** Highlight critical path */\r\n  highlightCriticalPath: boolean\r\n  /** Node size */\r\n  nodeSize: number\r\n  /** Edge width */\r\n  edgeWidth: number\r\n  /** Animation duration */\r\n  animationDuration: number\r\n  /** Force simulation strength */\r\n  forceStrength: number\r\n  /** Link distance */\r\n  linkDistance: number\r\n  /** Charge strength (repulsion) */\r\n  chargeStrength: number\r\n  /** Center force strength */\r\n  centerForce: number\r\n  /** Color scheme */\r\n  colorScheme: 'status' | 'priority' | 'assignee' | 'cluster'\r\n}\r\n\r\n/**\r\n * Graph filters\r\n */\r\nexport interface GraphFilter {\r\n  /** Filter by relationship types */\r\n  types?: RelationshipType[]\r\n  /** Filter by card IDs */\r\n  cardIds?: string[]\r\n  /** Filter by columns */\r\n  columnIds?: string[]\r\n  /** Minimum relationship strength */\r\n  minStrength?: number\r\n  /** Show only critical path */\r\n  criticalPathOnly?: boolean\r\n  /** Maximum depth from selected node */\r\n  maxDepth?: number\r\n}\r\n\r\n/**\r\n * Critical path analysis result\r\n */\r\nexport interface CriticalPath {\r\n  /** Cards on the critical path */\r\n  cardIds: string[]\r\n  /** Relationships on the critical path */\r\n  relationshipIds: string[]\r\n  /** Total estimated time */\r\n  totalDuration: number\r\n  /** Bottleneck cards */\r\n  bottlenecks: string[]\r\n}\r\n\r\n/**\r\n * Graph statistics\r\n */\r\nexport interface GraphStats {\r\n  /** Total nodes */\r\n  totalNodes: number\r\n  /** Total edges */\r\n  totalEdges: number\r\n  /** Average degree */\r\n  averageDegree: number\r\n  /** Density (0-1) */\r\n  density: number\r\n  /** Number of clusters */\r\n  clusters: number\r\n  /** Isolated nodes (no connections) */\r\n  isolatedNodes: string[]\r\n  /** Hub nodes (most connections) */\r\n  hubNodes: Array<{ cardId: string; degree: number }>\r\n  /** Most common relationship type */\r\n  mostCommonRelationType: RelationshipType\r\n}\r\n\r\n/**\r\n * Graph interaction event\r\n */\r\nexport interface GraphInteraction {\r\n  /** Event type */\r\n  type: 'node-click' | 'node-hover' | 'edge-click' | 'edge-hover' | 'canvas-click'\r\n  /** Selected node */\r\n  node?: GraphNode\r\n  /** Selected edge */\r\n  edge?: GraphEdge\r\n  /** Mouse position */\r\n  position?: { x: number; y: number }\r\n}\r\n\r\n/**\r\n * Default graph configuration\r\n */\r\nexport const DEFAULT_GRAPH_CONFIG: GraphConfig = {\r\n  layout: 'force',\r\n  width: 1200,\r\n  height: 800,\r\n  enableDragging: true,\r\n  enableZoom: true,\r\n  showLabels: true,\r\n  showEdgeLabels: false,\r\n  highlightCriticalPath: true,\r\n  nodeSize: 40,\r\n  edgeWidth: 2,\r\n  animationDuration: 300,\r\n  forceStrength: 0.5,\r\n  linkDistance: 150,\r\n  chargeStrength: -300,\r\n  centerForce: 0.1,\r\n  colorScheme: 'status',\r\n}\r\n\r\n/**\r\n * Helper to create a relationship\r\n */\r\nexport function createRelationship(\r\n  sourceId: string,\r\n  targetId: string,\r\n  type: RelationshipType,\r\n  metadata?: CardRelationship['metadata']\r\n): CardRelationship {\r\n  return {\r\n    id: `${sourceId}-${targetId}-${type}-${Date.now()}`,\r\n    sourceId,\r\n    targetId,\r\n    type,\r\n    createdAt: new Date(),\r\n    metadata,\r\n  }\r\n}\r\n\r\n/**\r\n * Helper to get relationship color\r\n */\r\nexport function getRelationshipColor(type: RelationshipType): string {\r\n  const colors: Record<RelationshipType, string> = {\r\n    blocks: '#ef4444',\r\n    blocked_by: '#dc2626',\r\n    depends_on: '#f59e0b',\r\n    required_by: '#d97706',\r\n    relates_to: '#6b7280',\r\n    duplicates: '#8b5cf6',\r\n    parent_of: '#00E5CC',\r\n    child_of: '#00C4AE',\r\n    similar_to: '#10b981',\r\n  }\r\n  return colors[type] || '#6b7280'\r\n}\r\n\r\n/**\r\n * Helper to get relationship label\r\n */\r\nexport function getRelationshipLabel(type: RelationshipType): string {\r\n  const labels: Record<RelationshipType, string> = {\r\n    blocks: 'Blocks',\r\n    blocked_by: 'Blocked by',\r\n    depends_on: 'Depends on',\r\n    required_by: 'Required by',\r\n    relates_to: 'Relates to',\r\n    duplicates: 'Duplicates',\r\n    parent_of: 'Parent of',\r\n    child_of: 'Child of',\r\n    similar_to: 'Similar to',\r\n  }\r\n  return labels[type] || type\r\n}\r\n\r\n/**\r\n * Helper to get relationship icon\r\n */\r\nexport function getRelationshipIcon(type: RelationshipType): string {\r\n  const icons: Record<RelationshipType, string> = {\r\n    blocks: '🚫',\r\n    blocked_by: '⛔',\r\n    depends_on: '🔗',\r\n    required_by: '📌',\r\n    relates_to: '🔄',\r\n    duplicates: '📋',\r\n    parent_of: '📂',\r\n    child_of: '📄',\r\n    similar_to: '🔍',\r\n  }\r\n  return icons[type] || '🔗'\r\n}\r\n\r\n/**\r\n * Helper to check if relationship is directional\r\n */\r\nexport function isDirectionalRelationship(type: RelationshipType): boolean {\r\n  return [\r\n    'blocks',\r\n    'blocked_by',\r\n    'depends_on',\r\n    'required_by',\r\n    'parent_of',\r\n    'child_of',\r\n  ].includes(type)\r\n}\r\n\r\n/**\r\n * Helper to get inverse relationship type\r\n */\r\nexport function getInverseRelationship(type: RelationshipType): RelationshipType | null {\r\n  const inverses: Partial<Record<RelationshipType, RelationshipType>> = {\r\n    blocks: 'blocked_by',\r\n    blocked_by: 'blocks',\r\n    depends_on: 'required_by',\r\n    required_by: 'depends_on',\r\n    parent_of: 'child_of',\r\n    child_of: 'parent_of',\r\n  }\r\n  return inverses[type] || null\r\n}\r\n\r\n/**\r\n * Calculate graph statistics\r\n */\r\nexport function calculateGraphStats(\r\n  nodes: GraphNode[],\r\n  edges: GraphEdge[]\r\n): GraphStats {\r\n  const totalNodes = nodes.length\r\n  const totalEdges = edges.length\r\n\r\n  // Calculate degrees\r\n  const degrees = new Map<string, number>()\r\n  edges.forEach((edge) => {\r\n    const sourceId = typeof edge.source === 'string' ? edge.source : edge.source.id\r\n    const targetId = typeof edge.target === 'string' ? edge.target : edge.target.id\r\n    degrees.set(sourceId, (degrees.get(sourceId) || 0) + 1)\r\n    degrees.set(targetId, (degrees.get(targetId) || 0) + 1)\r\n  })\r\n\r\n  const averageDegree = totalNodes > 0 ? Array.from(degrees.values()).reduce((a, b) => a + b, 0) / totalNodes : 0\r\n  const maxPossibleEdges = (totalNodes * (totalNodes - 1)) / 2\r\n  const density = maxPossibleEdges > 0 ? totalEdges / maxPossibleEdges : 0\r\n\r\n  // Find isolated nodes\r\n  const isolatedNodes = nodes\r\n    .filter((node) => !degrees.has(node.id))\r\n    .map((node) => node.id)\r\n\r\n  // Find hub nodes (top 5 most connected)\r\n  const hubNodes = Array.from(degrees.entries())\r\n    .map(([cardId, degree]) => ({ cardId, degree }))\r\n    .sort((a, b) => b.degree - a.degree)\r\n    .slice(0, 5)\r\n\r\n  // Most common relationship type\r\n  const typeCounts = new Map<RelationshipType, number>()\r\n  edges.forEach((edge) => {\r\n    typeCounts.set(edge.type, (typeCounts.get(edge.type) || 0) + 1)\r\n  })\r\n  const mostCommonRelationType = Array.from(typeCounts.entries()).sort((a, b) => b[1] - a[1])[0]?.[0] || 'relates_to'\r\n\r\n  return {\r\n    totalNodes,\r\n    totalEdges,\r\n    averageDegree,\r\n    density,\r\n    clusters: 0, // Would need clustering algorithm\r\n    isolatedNodes,\r\n    hubNodes,\r\n    mostCommonRelationType,\r\n  }\r\n}\r\n\r\n/**\r\n * Find critical path using topological sort and longest path\r\n */\r\nexport function findCriticalPath(\r\n  _cards: Card[],\r\n  relationships: CardRelationship[]\r\n): CriticalPath {\r\n  // Simple critical path: cards with most dependencies\r\n  const dependencyCounts = new Map<string, number>()\r\n\r\n  relationships.forEach((rel) => {\r\n    if (rel.type === 'blocks' || rel.type === 'depends_on') {\r\n      dependencyCounts.set(rel.targetId, (dependencyCounts.get(rel.targetId) || 0) + 1)\r\n    }\r\n  })\r\n\r\n  const sortedCards = Array.from(dependencyCounts.entries())\r\n    .sort((a, b) => b[1] - a[1])\r\n    .slice(0, 5)\r\n    .map((entry) => entry[0])\r\n\r\n  const criticalRelationships = relationships\r\n    .filter((rel) =>\r\n      sortedCards.includes(rel.sourceId) || sortedCards.includes(rel.targetId)\r\n    )\r\n    .map((rel) => rel.id)\r\n\r\n  return {\r\n    cardIds: sortedCards,\r\n    relationshipIds: criticalRelationships,\r\n    totalDuration: sortedCards.length * 5, // Estimate 5 days per card\r\n    bottlenecks: sortedCards.slice(0, 2),\r\n  }\r\n}\r\n","/**\r\n * CardRelationshipsGraph Component\r\n * Interactive force-directed graph visualization of card relationships\r\n * @module components/CardRelationships\r\n */\r\n\r\nimport { useRef, useEffect, useState, useCallback } from 'react'\r\nimport type {\r\n  GraphNode,\r\n  GraphEdge,\r\n  GraphConfig,\r\n  GraphFilter,\r\n  CriticalPath,\r\n  GraphStats,\r\n  GraphInteraction,\r\n} from '../../types/card-relationships'\r\nimport {\r\n  getRelationshipColor,\r\n  getRelationshipLabel,\r\n  getRelationshipIcon,\r\n  isDirectionalRelationship,\r\n} from '../../types/card-relationships'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface CardRelationshipsGraphProps {\r\n  /** Graph nodes */\r\n  nodes: GraphNode[]\r\n  /** Graph edges */\r\n  edges: GraphEdge[]\r\n  /** Graph configuration */\r\n  config: GraphConfig\r\n  /** Current filter */\r\n  filter: GraphFilter\r\n  /** Update filter */\r\n  onFilterChange: (filter: GraphFilter) => void\r\n  /** Critical path */\r\n  criticalPath: CriticalPath | null\r\n  /** Graph statistics */\r\n  stats: GraphStats\r\n  /** Interaction callback */\r\n  onInteraction?: (interaction: GraphInteraction) => void\r\n  /** Custom className */\r\n  className?: string\r\n}\r\n\r\n/**\r\n * Simple force simulation (without D3.js dependency)\r\n */\r\ninterface SimulationNode extends GraphNode {\r\n  x: number\r\n  y: number\r\n  vx: number\r\n  vy: number\r\n}\r\n\r\nfunction runForceSimulation(\r\n  nodes: GraphNode[],\r\n  edges: GraphEdge[],\r\n  width: number,\r\n  height: number,\r\n  config: GraphConfig,\r\n  iterations: number = 100\r\n): SimulationNode[] {\r\n  // Initialize positions\r\n  const simNodes: SimulationNode[] = nodes.map((node) => ({\r\n    ...node,\r\n    x: node.x ?? width / 2 + Math.random() * 100 - 50,\r\n    y: node.y ?? height / 2 + Math.random() * 100 - 50,\r\n    vx: 0,\r\n    vy: 0,\r\n  }))\r\n\r\n  const nodeMap = new Map(simNodes.map((n) => [n.id, n]))\r\n\r\n  // Run simulation\r\n  for (let iter = 0; iter < iterations; iter++) {\r\n    const alpha = 1 - iter / iterations // Decay factor\r\n\r\n    // Apply forces\r\n    simNodes.forEach((node) => {\r\n      // Center force\r\n      const centerX = width / 2\r\n      const centerY = height / 2\r\n      node.vx += (centerX - node.x) * config.centerForce * alpha\r\n      node.vy += (centerY - node.y) * config.centerForce * alpha\r\n\r\n      // Repulsion force (charge)\r\n      simNodes.forEach((other) => {\r\n        if (node.id === other.id) return\r\n        const dx = node.x - other.x\r\n        const dy = node.y - other.y\r\n        const distance = Math.sqrt(dx * dx + dy * dy) || 1\r\n        const force = (config.chargeStrength * alpha) / (distance * distance)\r\n        node.vx += (dx / distance) * force\r\n        node.vy += (dy / distance) * force\r\n      })\r\n    })\r\n\r\n    // Link forces\r\n    edges.forEach((edge) => {\r\n      const source = nodeMap.get(\r\n        typeof edge.source === 'string' ? edge.source : edge.source.id\r\n      )\r\n      const target = nodeMap.get(\r\n        typeof edge.target === 'string' ? edge.target : edge.target.id\r\n      )\r\n      if (!source || !target) return\r\n\r\n      const dx = target.x - source.x\r\n      const dy = target.y - source.y\r\n      const distance = Math.sqrt(dx * dx + dy * dy) || 1\r\n      const force =\r\n        ((distance - config.linkDistance) / distance) * config.forceStrength * alpha\r\n\r\n      source.vx += dx * force\r\n      source.vy += dy * force\r\n      target.vx -= dx * force\r\n      target.vy -= dy * force\r\n    })\r\n\r\n    // Update positions\r\n    simNodes.forEach((node) => {\r\n      if (node.fx !== null && node.fx !== undefined) {\r\n        node.x = node.fx\r\n        node.vx = 0\r\n      } else {\r\n        node.x += node.vx\r\n      }\r\n\r\n      if (node.fy !== null && node.fy !== undefined) {\r\n        node.y = node.fy\r\n        node.vy = 0\r\n      } else {\r\n        node.y += node.vy\r\n      }\r\n\r\n      // Keep nodes in bounds\r\n      node.x = Math.max(config.nodeSize, Math.min(width - config.nodeSize, node.x))\r\n      node.y = Math.max(config.nodeSize, Math.min(height - config.nodeSize, node.y))\r\n\r\n      // Apply damping\r\n      node.vx *= 0.9\r\n      node.vy *= 0.9\r\n    })\r\n  }\r\n\r\n  return simNodes\r\n}\r\n\r\n/**\r\n * Graph visualization component\r\n */\r\nexport function CardRelationshipsGraph({\r\n  nodes,\r\n  edges,\r\n  config,\r\n  filter: _filter,\r\n  onFilterChange: _onFilterChange,\r\n  criticalPath,\r\n  stats,\r\n  onInteraction,\r\n  className,\r\n}: CardRelationshipsGraphProps) {\r\n  const svgRef = useRef<SVGSVGElement>(null)\r\n  const [simulatedNodes, setSimulatedNodes] = useState<SimulationNode[]>([])\r\n  const [draggingNode, setDraggingNode] = useState<string | null>(null)\r\n  const [hoveredNode, setHoveredNode] = useState<string | null>(null)\r\n  const [hoveredEdge, setHoveredEdge] = useState<string | null>(null)\r\n  const [zoom, setZoom] = useState(1)\r\n  const [pan, setPan] = useState({ x: 0, y: 0 })\r\n\r\n  // Run force simulation when nodes/edges change\r\n  useEffect(() => {\r\n    if (nodes.length === 0) return\r\n\r\n    const simulated = runForceSimulation(\r\n      nodes,\r\n      edges,\r\n      config.width,\r\n      config.height,\r\n      config,\r\n      150\r\n    )\r\n    setSimulatedNodes(simulated)\r\n  }, [nodes, edges, config])\r\n\r\n  // Handle node drag\r\n  const handleNodeMouseDown = useCallback(\r\n    (nodeId: string, e: React.MouseEvent) => {\r\n      if (!config.enableDragging) return\r\n      e.stopPropagation()\r\n      setDraggingNode(nodeId)\r\n    },\r\n    [config.enableDragging]\r\n  )\r\n\r\n  const handleMouseMove = useCallback(\r\n    (e: React.MouseEvent<SVGSVGElement>) => {\r\n      if (!draggingNode || !svgRef.current) return\r\n\r\n      const svg = svgRef.current\r\n      const rect = svg.getBoundingClientRect()\r\n      const x = (e.clientX - rect.left - pan.x) / zoom\r\n      const y = (e.clientY - rect.top - pan.y) / zoom\r\n\r\n      setSimulatedNodes((prev) =>\r\n        prev.map((node) =>\r\n          node.id === draggingNode ? { ...node, x, y, fx: x, fy: y } : node\r\n        )\r\n      )\r\n    },\r\n    [draggingNode, zoom, pan]\r\n  )\r\n\r\n  const handleMouseUp = useCallback(() => {\r\n    setDraggingNode(null)\r\n  }, [])\r\n\r\n  // Handle node click\r\n  const handleNodeClick = useCallback(\r\n    (node: SimulationNode, e: React.MouseEvent) => {\r\n      e.stopPropagation()\r\n      onInteraction?.({\r\n        type: 'node-click',\r\n        node,\r\n        position: { x: e.clientX, y: e.clientY },\r\n      })\r\n    },\r\n    [onInteraction]\r\n  )\r\n\r\n  // Handle edge click\r\n  const handleEdgeClick = useCallback(\r\n    (edge: GraphEdge, e: React.MouseEvent) => {\r\n      e.stopPropagation()\r\n      onInteraction?.({\r\n        type: 'edge-click',\r\n        edge,\r\n        position: { x: e.clientX, y: e.clientY },\r\n      })\r\n    },\r\n    [onInteraction]\r\n  )\r\n\r\n  // Get node position\r\n  const getNodePosition = useCallback(\r\n    (nodeId: string): { x: number; y: number } => {\r\n      const node = simulatedNodes.find((n) => n.id === nodeId)\r\n      return node ? { x: node.x, y: node.y } : { x: 0, y: 0 }\r\n    },\r\n    [simulatedNodes]\r\n  )\r\n\r\n  // Get node color based on color scheme\r\n  const getNodeColor = useCallback(\r\n    (node: SimulationNode): string => {\r\n      if (node.onCriticalPath) return '#ef4444'\r\n\r\n      switch (config.colorScheme) {\r\n        case 'status':\r\n          return node.card.columnId === 'done' ? '#10b981' : '#00E5CC'\r\n        case 'priority':\r\n          const priority = node.card.priority\r\n          if (priority === 'URGENT') return '#ef4444' // urgent\r\n          if (priority === 'HIGH') return '#f59e0b' // high\r\n          if (priority === 'MEDIUM') return '#00E5CC' // medium\r\n          return '#6b7280' // low or none\r\n        case 'assignee':\r\n          return node.card.assigneeId ? '#8b5cf6' : '#6b7280'\r\n        default:\r\n          return '#00E5CC'\r\n      }\r\n    },\r\n    [config.colorScheme]\r\n  )\r\n\r\n  if (nodes.length === 0) {\r\n    return (\r\n      <div className={cn('relationships-graph-empty', className)}>\r\n        <div className=\"relationships-graph-empty-icon\">🔗</div>\r\n        <p className=\"relationships-graph-empty-text\">No relationships to display</p>\r\n        <p className=\"relationships-graph-empty-subtext\">\r\n          Add relationships between cards to see the graph\r\n        </p>\r\n      </div>\r\n    )\r\n  }\r\n\r\n  return (\r\n    <div className={cn('relationships-graph', className)}>\r\n      {/* Controls */}\r\n      <div className=\"relationships-graph-controls\">\r\n        <div className=\"relationships-graph-stats\">\r\n          <span className=\"relationships-graph-stat\">\r\n            <span className=\"relationships-graph-stat-value\">{stats.totalNodes}</span>\r\n            <span className=\"relationships-graph-stat-label\">Cards</span>\r\n          </span>\r\n          <span className=\"relationships-graph-stat\">\r\n            <span className=\"relationships-graph-stat-value\">{stats.totalEdges}</span>\r\n            <span className=\"relationships-graph-stat-label\">Relations</span>\r\n          </span>\r\n          {criticalPath && (\r\n            <span className=\"relationships-graph-stat relationships-graph-stat-critical\">\r\n              <span className=\"relationships-graph-stat-value\">\r\n                {criticalPath.cardIds.length}\r\n              </span>\r\n              <span className=\"relationships-graph-stat-label\">Critical Path</span>\r\n            </span>\r\n          )}\r\n        </div>\r\n\r\n        {/* Zoom controls */}\r\n        {config.enableZoom && (\r\n          <div className=\"relationships-graph-zoom-controls\">\r\n            <button\r\n              className=\"relationships-graph-zoom-btn\"\r\n              onClick={() => setZoom((z) => Math.min(z + 0.2, 3))}\r\n            >\r\n              +\r\n            </button>\r\n            <span className=\"relationships-graph-zoom-value\">{Math.round(zoom * 100)}%</span>\r\n            <button\r\n              className=\"relationships-graph-zoom-btn\"\r\n              onClick={() => setZoom((z) => Math.max(z - 0.2, 0.5))}\r\n            >\r\n              −\r\n            </button>\r\n            <button\r\n              className=\"relationships-graph-zoom-btn\"\r\n              onClick={() => {\r\n                setZoom(1)\r\n                setPan({ x: 0, y: 0 })\r\n              }}\r\n            >\r\n              Reset\r\n            </button>\r\n          </div>\r\n        )}\r\n      </div>\r\n\r\n      {/* Legend */}\r\n      <div className=\"relationships-graph-legend\">\r\n        {Array.from(new Set(edges.map((e) => e.type))).map((type) => (\r\n          <div key={type} className=\"relationships-graph-legend-item\">\r\n            <div\r\n              className=\"relationships-graph-legend-color\"\r\n              style={{ background: getRelationshipColor(type) }}\r\n            />\r\n            <span className=\"relationships-graph-legend-label\">\r\n              {getRelationshipIcon(type)} {getRelationshipLabel(type)}\r\n            </span>\r\n          </div>\r\n        ))}\r\n      </div>\r\n\r\n      {/* SVG Canvas */}\r\n      <svg\r\n        ref={svgRef}\r\n        className=\"relationships-graph-canvas\"\r\n        width={config.width}\r\n        height={config.height}\r\n        onMouseMove={handleMouseMove}\r\n        onMouseUp={handleMouseUp}\r\n        onMouseLeave={handleMouseUp}\r\n      >\r\n        <g transform={`translate(${pan.x}, ${pan.y}) scale(${zoom})`}>\r\n          {/* Edges */}\r\n          <g className=\"relationships-graph-edges\">\r\n            {edges.map((edge) => {\r\n              const sourcePos = getNodePosition(\r\n                typeof edge.source === 'string' ? edge.source : edge.source.id\r\n              )\r\n              const targetPos = getNodePosition(\r\n                typeof edge.target === 'string' ? edge.target : edge.target.id\r\n              )\r\n\r\n              const isDirectional = isDirectionalRelationship(edge.type)\r\n              const isHovered = hoveredEdge === edge.id\r\n              const isCritical = edge.onCriticalPath\r\n\r\n              return (\r\n                <g\r\n                  key={edge.id}\r\n                  className={cn(\r\n                    'relationships-graph-edge',\r\n                    isHovered && 'hovered',\r\n                    isCritical && 'critical'\r\n                  )}\r\n                  onMouseEnter={() => setHoveredEdge(edge.id)}\r\n                  onMouseLeave={() => setHoveredEdge(null)}\r\n                  onClick={(e) => handleEdgeClick(edge, e)}\r\n                >\r\n                  <line\r\n                    x1={sourcePos.x}\r\n                    y1={sourcePos.y}\r\n                    x2={targetPos.x}\r\n                    y2={targetPos.y}\r\n                    stroke={getRelationshipColor(edge.type)}\r\n                    strokeWidth={isCritical ? config.edgeWidth * 2 : config.edgeWidth}\r\n                    strokeOpacity={isHovered ? 1 : 0.6}\r\n                    markerEnd={isDirectional ? 'url(#arrowhead)' : undefined}\r\n                  />\r\n                  {config.showEdgeLabels && isHovered && (\r\n                    <text\r\n                      x={(sourcePos.x + targetPos.x) / 2}\r\n                      y={(sourcePos.y + targetPos.y) / 2}\r\n                      className=\"relationships-graph-edge-label\"\r\n                      textAnchor=\"middle\"\r\n                    >\r\n                      {getRelationshipLabel(edge.type)}\r\n                    </text>\r\n                  )}\r\n                </g>\r\n              )\r\n            })}\r\n          </g>\r\n\r\n          {/* Nodes */}\r\n          <g className=\"relationships-graph-nodes\">\r\n            {simulatedNodes.map((node) => {\r\n              const isHovered = hoveredNode === node.id\r\n              const isCritical = node.onCriticalPath\r\n\r\n              return (\r\n                <g\r\n                  key={node.id}\r\n                  className={cn(\r\n                    'relationships-graph-node',\r\n                    isHovered && 'hovered',\r\n                    isCritical && 'critical'\r\n                  )}\r\n                  transform={`translate(${node.x}, ${node.y})`}\r\n                  onMouseDown={(e) => handleNodeMouseDown(node.id, e)}\r\n                  onMouseEnter={() => setHoveredNode(node.id)}\r\n                  onMouseLeave={() => setHoveredNode(null)}\r\n                  onClick={(e) => handleNodeClick(node, e)}\r\n                >\r\n                  <circle\r\n                    r={isCritical ? config.nodeSize * 1.2 : config.nodeSize}\r\n                    fill={getNodeColor(node)}\r\n                    stroke={isCritical ? '#fbbf24' : '#ffffff'}\r\n                    strokeWidth={isCritical ? 3 : 2}\r\n                    opacity={isHovered ? 1 : 0.9}\r\n                  />\r\n                  {config.showLabels && (\r\n                    <text\r\n                      y={config.nodeSize + 20}\r\n                      className=\"relationships-graph-node-label\"\r\n                      textAnchor=\"middle\"\r\n                    >\r\n                      {node.card.title.length > 20\r\n                        ? node.card.title.substring(0, 20) + '...'\r\n                        : node.card.title}\r\n                    </text>\r\n                  )}\r\n                </g>\r\n              )\r\n            })}\r\n          </g>\r\n        </g>\r\n\r\n        {/* Arrow marker for directional edges */}\r\n        <defs>\r\n          <marker\r\n            id=\"arrowhead\"\r\n            markerWidth=\"10\"\r\n            markerHeight=\"10\"\r\n            refX=\"9\"\r\n            refY=\"3\"\r\n            orient=\"auto\"\r\n            markerUnits=\"strokeWidth\"\r\n          >\r\n            <path d=\"M0,0 L0,6 L9,3 z\" fill=\"#6b7280\" />\r\n          </marker>\r\n        </defs>\r\n      </svg>\r\n    </div>\r\n  )\r\n}\r\n","/**\r\n * Generate Plan Modal\r\n * AI-powered project plan generation\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport { Portal } from '../Portal'\r\nimport type { GeneratedPlan } from '../../types'\r\n\r\nexport interface GeneratePlanModalProps {\r\n  /** Is modal open */\r\n  isOpen: boolean\r\n  /** Close handler */\r\n  onClose: () => void\r\n  /** Plan generated callback */\r\n  onPlanGenerated: (plan: GeneratedPlan) => void\r\n  /** Generate plan function (from useAI hook) */\r\n  onGeneratePlan: (prompt: string) => Promise<GeneratedPlan>\r\n  /** Is AI loading */\r\n  isLoading?: boolean\r\n}\r\n\r\nexport function GeneratePlanModal({\r\n  isOpen,\r\n  onClose,\r\n  onPlanGenerated,\r\n  onGeneratePlan,\r\n  isLoading: externalLoading,\r\n}: GeneratePlanModalProps) {\r\n  const [prompt, setPrompt] = useState('')\r\n  const [isGenerating, setIsGenerating] = useState(false)\r\n  const [error, setError] = useState<string | null>(null)\r\n  const [generatedPlan, setGeneratedPlan] = useState<GeneratedPlan | null>(null)\r\n  const inputRef = useRef<HTMLTextAreaElement>(null)\r\n\r\n  const isLoading = isGenerating || externalLoading\r\n\r\n  // Focus input when modal opens\r\n  useEffect(() => {\r\n    if (isOpen && inputRef.current) {\r\n      inputRef.current.focus()\r\n    }\r\n  }, [isOpen])\r\n\r\n  // Close on escape\r\n  useEffect(() => {\r\n    const handleEscape = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape' && !isLoading) {\r\n        handleClose()\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('keydown', handleEscape)\r\n      return () => document.removeEventListener('keydown', handleEscape)\r\n    }\r\n    return undefined\r\n  }, [isOpen, isLoading])\r\n\r\n  const handleClose = () => {\r\n    if (!isLoading) {\r\n      setPrompt('')\r\n      setError(null)\r\n      setGeneratedPlan(null)\r\n      onClose()\r\n    }\r\n  }\r\n\r\n  const handleGenerate = async () => {\r\n    if (!prompt.trim() || isLoading) return\r\n\r\n    setIsGenerating(true)\r\n    setError(null)\r\n    setGeneratedPlan(null)\r\n\r\n    try {\r\n      const plan = await onGeneratePlan(prompt.trim())\r\n      setGeneratedPlan(plan)\r\n    } catch (err) {\r\n      setError(err instanceof Error ? err.message : 'Failed to generate plan')\r\n    } finally {\r\n      setIsGenerating(false)\r\n    }\r\n  }\r\n\r\n  const handleApplyPlan = () => {\r\n    if (generatedPlan) {\r\n      onPlanGenerated(generatedPlan)\r\n      handleClose()\r\n    }\r\n  }\r\n\r\n  if (!isOpen) return null\r\n\r\n  return (\r\n    <Portal>\r\n      {/* Backdrop */}\r\n      <div\r\n        className=\"fixed inset-0 bg-black/60 backdrop-blur-sm z-[100000]\"\r\n        onClick={handleClose}\r\n      />\r\n\r\n      {/* Modal */}\r\n      <div className=\"fixed inset-0 flex items-center justify-center z-[100001] p-4\">\r\n        <div\r\n          className=\"w-full max-w-2xl rounded-2xl shadow-2xl border max-h-[90vh] overflow-hidden flex flex-col\"\r\n          style={{\r\n            background: 'linear-gradient(135deg, #1f1f1f 0%, #1a1a1a 100%)',\r\n            borderColor: 'rgba(255, 255, 255, 0.15)',\r\n            boxShadow: '0 20px 60px rgba(0, 0, 0, 0.8), 0 0 0 1px rgba(255, 255, 255, 0.1)',\r\n          }}\r\n          onClick={(e) => e.stopPropagation()}\r\n        >\r\n          {/* Header */}\r\n          <div className=\"px-6 py-4 border-b border-white/10 flex items-center justify-between\">\r\n            <div>\r\n              <h2 className=\"text-xl font-bold text-white flex items-center gap-2\">\r\n                <svg\r\n                  width=\"24\"\r\n                  height=\"24\"\r\n                  viewBox=\"0 0 24 24\"\r\n                  fill=\"none\"\r\n                  xmlns=\"http://www.w3.org/2000/svg\"\r\n                  className=\"text-[#00E5CC]\"\r\n                >\r\n                  <path\r\n                    d=\"M12 2L2 7L12 12L22 7L12 2Z\"\r\n                    stroke=\"currentColor\"\r\n                    strokeWidth=\"2\"\r\n                    strokeLinecap=\"round\"\r\n                    strokeLinejoin=\"round\"\r\n                  />\r\n                  <path\r\n                    d=\"M2 17L12 22L22 17\"\r\n                    stroke=\"currentColor\"\r\n                    strokeWidth=\"2\"\r\n                    strokeLinecap=\"round\"\r\n                    strokeLinejoin=\"round\"\r\n                  />\r\n                  <path\r\n                    d=\"M2 12L12 17L22 12\"\r\n                    stroke=\"currentColor\"\r\n                    strokeWidth=\"2\"\r\n                    strokeLinecap=\"round\"\r\n                    strokeLinejoin=\"round\"\r\n                  />\r\n                </svg>\r\n                Generate Project Plan with AI\r\n              </h2>\r\n              <p className=\"text-sm text-white/60 mt-1\">\r\n                Describe your project and let AI create a complete Kanban board\r\n              </p>\r\n            </div>\r\n            <button\r\n              onClick={handleClose}\r\n              disabled={isLoading}\r\n              className=\"text-white/60 hover:text-white transition-colors disabled:opacity-50\"\r\n            >\r\n              <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                <path\r\n                  d=\"M18 6L6 18M6 6L18 18\"\r\n                  stroke=\"currentColor\"\r\n                  strokeWidth=\"2\"\r\n                  strokeLinecap=\"round\"\r\n                />\r\n              </svg>\r\n            </button>\r\n          </div>\r\n\r\n          {/* Content */}\r\n          <div className=\"flex-1 overflow-y-auto p-6 space-y-4\">\r\n            {!generatedPlan ? (\r\n              <>\r\n                {/* Input */}\r\n                <div>\r\n                  <label className=\"block text-sm font-semibold text-white/90 mb-2\">\r\n                    Project Description\r\n                  </label>\r\n                  <textarea\r\n                    ref={inputRef}\r\n                    value={prompt}\r\n                    onChange={(e) => setPrompt(e.target.value)}\r\n                    placeholder=\"Example: Build a mobile app for tracking fitness goals with user authentication, workout logging, progress charts, and social features...\"\r\n                    className=\"w-full h-32 px-4 py-3 rounded-lg text-sm bg-white/5 border border-white/20 text-white placeholder-white/40 outline-none focus:border-[#00E5CC]/50 transition-all resize-none\"\r\n                    disabled={isLoading}\r\n                  />\r\n                  <p className=\"text-xs text-white/50 mt-2\">\r\n                    Be as specific as possible. Include features, technologies, and any special requirements.\r\n                  </p>\r\n                </div>\r\n\r\n                {/* Error */}\r\n                {error && (\r\n                  <div className=\"p-4 rounded-lg bg-red-500/10 border border-red-500/30 text-red-400 text-sm\">\r\n                    {error}\r\n                  </div>\r\n                )}\r\n\r\n                {/* Examples */}\r\n                <div className=\"border-t border-white/10 pt-4\">\r\n                  <p className=\"text-xs font-semibold text-white/70 uppercase tracking-wider mb-3\">\r\n                    Example Prompts\r\n                  </p>\r\n                  <div className=\"space-y-2\">\r\n                    {[\r\n                      'Build an e-commerce platform with product catalog, shopping cart, payment integration, and order tracking',\r\n                      'Create a task management app with team collaboration, real-time updates, file attachments, and notifications',\r\n                      'Develop a blog platform with markdown editor, SEO optimization, comments system, and analytics dashboard',\r\n                    ].map((example, i) => (\r\n                      <button\r\n                        key={i}\r\n                        onClick={() => setPrompt(example)}\r\n                        disabled={isLoading}\r\n                        className=\"w-full text-left px-3 py-2 rounded-lg text-xs text-white/70 hover:text-white hover:bg-white/5 transition-all border border-white/10 hover:border-white/20 disabled:opacity-50\"\r\n                      >\r\n                        {example}\r\n                      </button>\r\n                    ))}\r\n                  </div>\r\n                </div>\r\n              </>\r\n            ) : (\r\n              <>\r\n                {/* Generated Plan Preview */}\r\n                <div className=\"space-y-4\">\r\n                  <div className=\"flex items-center gap-2 text-green-400\">\r\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                      <path\r\n                        d=\"M4 10L8 14L16 6\"\r\n                        stroke=\"currentColor\"\r\n                        strokeWidth=\"2\"\r\n                        strokeLinecap=\"round\"\r\n                        strokeLinejoin=\"round\"\r\n                      />\r\n                    </svg>\r\n                    <span className=\"font-semibold\">Plan Generated Successfully!</span>\r\n                  </div>\r\n\r\n                  {/* Explanation */}\r\n                  {generatedPlan.explanation && (\r\n                    <div className=\"p-4 rounded-lg bg-[#00E5CC]/10 border border-[#00E5CC]/30\">\r\n                      <p className=\"text-sm text-white/90\">{generatedPlan.explanation}</p>\r\n                    </div>\r\n                  )}\r\n\r\n                  {/* Columns */}\r\n                  <div>\r\n                    <h3 className=\"text-sm font-semibold text-white/90 mb-2\">\r\n                      Columns ({generatedPlan.columns.length})\r\n                    </h3>\r\n                    <div className=\"flex gap-2 flex-wrap\">\r\n                      {generatedPlan.columns.map((col, i) => (\r\n                        <div\r\n                          key={i}\r\n                          className=\"px-3 py-1.5 rounded-lg bg-white/5 border border-white/20 text-sm text-white/80\"\r\n                        >\r\n                          {col.title}\r\n                        </div>\r\n                      ))}\r\n                    </div>\r\n                  </div>\r\n\r\n                  {/* Cards */}\r\n                  <div>\r\n                    <h3 className=\"text-sm font-semibold text-white/90 mb-2\">\r\n                      Tasks ({generatedPlan.cards.length})\r\n                    </h3>\r\n                    <div className=\"space-y-2 max-h-64 overflow-y-auto\">\r\n                      {generatedPlan.cards.slice(0, 10).map((card, i) => (\r\n                        <div\r\n                          key={i}\r\n                          className=\"p-3 rounded-lg bg-white/5 border border-white/10\"\r\n                        >\r\n                          <div className=\"flex items-start justify-between gap-2\">\r\n                            <div className=\"flex-1\">\r\n                              <p className=\"text-sm font-medium text-white/90\">{card.title}</p>\r\n                              {card.description && (\r\n                                <p className=\"text-xs text-white/60 mt-1 line-clamp-2\">\r\n                                  {card.description}\r\n                                </p>\r\n                              )}\r\n                            </div>\r\n                            {card.priority && (\r\n                              <span\r\n                                className={`px-2 py-0.5 rounded text-xs font-semibold ${\r\n                                  card.priority === 'URGENT'\r\n                                    ? 'bg-red-500/20 text-red-400'\r\n                                    : card.priority === 'HIGH'\r\n                                    ? 'bg-orange-500/20 text-orange-400'\r\n                                    : card.priority === 'MEDIUM'\r\n                                    ? 'bg-yellow-500/20 text-yellow-400'\r\n                                    : 'bg-[#00E5CC]/20 text-[#00E5CC]'\r\n                                }`}\r\n                              >\r\n                                {card.priority}\r\n                              </span>\r\n                            )}\r\n                          </div>\r\n                        </div>\r\n                      ))}\r\n                      {generatedPlan.cards.length > 10 && (\r\n                        <p className=\"text-xs text-white/50 text-center py-2\">\r\n                          +{generatedPlan.cards.length - 10} more tasks...\r\n                        </p>\r\n                      )}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </>\r\n            )}\r\n          </div>\r\n\r\n          {/* Footer */}\r\n          <div className=\"px-6 py-4 border-t border-white/10 flex items-center justify-between\">\r\n            <div>\r\n              {isLoading && (\r\n                <div className=\"flex items-center gap-2 text-[#00E5CC] text-sm\">\r\n                  <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\">\r\n                    <circle\r\n                      className=\"opacity-25\"\r\n                      cx=\"12\"\r\n                      cy=\"12\"\r\n                      r=\"10\"\r\n                      stroke=\"currentColor\"\r\n                      strokeWidth=\"4\"\r\n                      fill=\"none\"\r\n                    />\r\n                    <path\r\n                      className=\"opacity-75\"\r\n                      fill=\"currentColor\"\r\n                      d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n                    />\r\n                  </svg>\r\n                  <span>Generating with AI...</span>\r\n                </div>\r\n              )}\r\n            </div>\r\n            <div className=\"flex items-center gap-3\">\r\n              <button\r\n                onClick={handleClose}\r\n                disabled={isLoading}\r\n                className=\"px-4 py-2 rounded-lg text-sm font-semibold transition-all hover:bg-white/10 text-white/80 disabled:opacity-50\"\r\n              >\r\n                Cancel\r\n              </button>\r\n              {!generatedPlan ? (\r\n                <button\r\n                  onClick={handleGenerate}\r\n                  disabled={!prompt.trim() || isLoading}\r\n                  className=\"px-6 py-2 rounded-lg text-sm font-semibold transition-all disabled:opacity-50\"\r\n                  style={{\r\n                    background: 'linear-gradient(135deg, #00E5CC 0%, #00E5CC 100%)',\r\n                    color: '#ffffff',\r\n                  }}\r\n                >\r\n                  {isLoading ? 'Generating...' : 'Generate Plan'}\r\n                </button>\r\n              ) : (\r\n                <button\r\n                  onClick={handleApplyPlan}\r\n                  className=\"px-6 py-2 rounded-lg text-sm font-semibold transition-all\"\r\n                  style={{\r\n                    background: 'linear-gradient(135deg, #10B981 0%, #059669 100%)',\r\n                    color: '#ffffff',\r\n                  }}\r\n                >\r\n                  Apply Plan to Board\r\n                </button>\r\n              )}\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </Portal>\r\n  )\r\n}\r\n","/**\n * AI Configuration\n * Central configuration for AI providers and models\n */\n\nexport interface AIConfig {\n  /** Provider (OpenAI or Anthropic) */\n  provider: 'openai' | 'anthropic'\n  /** API Key */\n  apiKey: string\n  /** Model to use */\n  model: string\n  /** Base URL (optional) */\n  baseURL?: string\n  /** Max tokens per request */\n  maxTokens?: number\n  /** Temperature (0-2) */\n  temperature?: number\n}\n\n/**\n * Supported AI Models\n */\nexport const AI_MODELS = {\n  // OpenAI Models\n  'gpt-4-turbo': {\n    provider: 'openai' as const,\n    name: 'GPT-4 Turbo',\n    contextWindow: 128000,\n    costPer1kInput: 0.01,\n    costPer1kOutput: 0.03,\n    supportsVision: true,\n    supportsJSON: true,\n  },\n  'gpt-4': {\n    provider: 'openai' as const,\n    name: 'GPT-4',\n    contextWindow: 8192,\n    costPer1kInput: 0.03,\n    costPer1kOutput: 0.06,\n    supportsVision: false,\n    supportsJSON: true,\n  },\n  'gpt-3.5-turbo': {\n    provider: 'openai' as const,\n    name: 'GPT-3.5 Turbo',\n    contextWindow: 16385,\n    costPer1kInput: 0.0005,\n    costPer1kOutput: 0.0015,\n    supportsVision: false,\n    supportsJSON: true,\n  },\n\n  // Anthropic Models\n  'claude-3-5-sonnet-20241022': {\n    provider: 'anthropic' as const,\n    name: 'Claude 3.5 Sonnet',\n    contextWindow: 200000,\n    costPer1kInput: 0.003,\n    costPer1kOutput: 0.015,\n    supportsVision: true,\n    supportsJSON: true,\n  },\n  'claude-3-opus-20240229': {\n    provider: 'anthropic' as const,\n    name: 'Claude 3 Opus',\n    contextWindow: 200000,\n    costPer1kInput: 0.015,\n    costPer1kOutput: 0.075,\n    supportsVision: true,\n    supportsJSON: true,\n  },\n  'claude-3-haiku-20240307': {\n    provider: 'anthropic' as const,\n    name: 'Claude 3 Haiku',\n    contextWindow: 200000,\n    costPer1kInput: 0.00025,\n    costPer1kOutput: 0.00125,\n    supportsVision: true,\n    supportsJSON: true,\n  },\n} as const\n\nexport type AIModelKey = keyof typeof AI_MODELS\n\n/**\n * Default AI Configuration\n */\nexport const DEFAULT_AI_CONFIG: Partial<AIConfig> = {\n  model: 'claude-3-5-sonnet-20241022',\n  maxTokens: 4096,\n  temperature: 0.7,\n}\n\n/**\n * Rate Limits by Plan\n */\nexport const RATE_LIMITS = {\n  hobby: {\n    requestsPerMonth: 50,\n    maxConcurrent: 1,\n    maxTokensPerRequest: 4096,\n  },\n  pro: {\n    requestsPerMonth: 500,\n    maxConcurrent: 3,\n    maxTokensPerRequest: 8192,\n  },\n  enterprise: {\n    requestsPerMonth: 2000,\n    maxConcurrent: 10,\n    maxTokensPerRequest: 16384,\n  },\n} as const\n\n/**\n * Feature Flags for AI\n */\nexport const AI_FEATURES = {\n  generatePlan: {\n    enabled: true,\n    minPlanTier: 'hobby' as const,\n    estimatedTokens: 2000,\n  },\n  predictRisks: {\n    enabled: true,\n    minPlanTier: 'pro' as const,\n    estimatedTokens: 1500,\n  },\n  suggestAssignee: {\n    enabled: true,\n    minPlanTier: 'hobby' as const,\n    estimatedTokens: 800,\n  },\n  generateReport: {\n    enabled: true,\n    minPlanTier: 'enterprise' as const,\n    estimatedTokens: 3000,\n  },\n  generateSubtasks: {\n    enabled: true,\n    minPlanTier: 'hobby' as const,\n    estimatedTokens: 1000,\n  },\n} as const\n","/**\n * AI Cost Tracking\n * Calculate and track AI API usage costs\n */\n\nimport { AI_MODELS, type AIModelKey } from './config'\n\nexport interface AIOperation {\n  id: string\n  feature: 'generatePlan' | 'predictRisks' | 'suggestAssignee' | 'generateSubtasks' | 'estimateEffort'\n  model: AIModelKey\n  inputTokens: number\n  outputTokens: number\n  cost: number\n  duration: number\n  timestamp: Date\n  success: boolean\n  error?: string\n}\n\nexport interface UsageStats {\n  totalOperations: number\n  totalCost: number\n  totalInputTokens: number\n  totalOutputTokens: number\n  operationsByFeature: Record<string, number>\n  costsByFeature: Record<string, number>\n  averageDuration: number\n  successRate: number\n}\n\n/**\n * Calculate cost for an AI operation\n */\nexport function calculateCost(\n  model: AIModelKey,\n  inputTokens: number,\n  outputTokens: number\n): number {\n  const modelInfo = AI_MODELS[model]\n  if (!modelInfo) {\n    throw new Error(`Unknown model: ${model}`)\n  }\n\n  const inputCost = (inputTokens / 1000) * modelInfo.costPer1kInput\n  const outputCost = (outputTokens / 1000) * modelInfo.costPer1kOutput\n\n  return inputCost + outputCost\n}\n\n/**\n * Format cost as USD string\n */\nexport function formatCost(cost: number): string {\n  return `$${cost.toFixed(4)}`\n}\n\n/**\n * AI Usage Tracker\n * In-memory tracking of AI operations\n * In production, this would persist to a database\n */\nexport class AIUsageTracker {\n  private operations: AIOperation[] = []\n  private listeners: Array<(operation: AIOperation) => void> = []\n\n  /**\n   * Record a new AI operation\n   */\n  record(operation: Omit<AIOperation, 'id' | 'timestamp' | 'cost'>): AIOperation {\n    const cost = calculateCost(operation.model, operation.inputTokens, operation.outputTokens)\n\n    const fullOperation: AIOperation = {\n      ...operation,\n      id: `op_${Date.now()}_${Math.random().toString(36).substring(7)}`,\n      timestamp: new Date(),\n      cost,\n    }\n\n    this.operations.push(fullOperation)\n\n    // Notify listeners\n    this.listeners.forEach((listener) => listener(fullOperation))\n\n    // Keep only last 1000 operations in memory\n    if (this.operations.length > 1000) {\n      this.operations = this.operations.slice(-1000)\n    }\n\n    return fullOperation\n  }\n\n  /**\n   * Get usage statistics\n   */\n  getStats(timeRange?: { start: Date; end: Date }): UsageStats {\n    let operations = this.operations\n\n    // Filter by time range if provided\n    if (timeRange) {\n      operations = operations.filter(\n        (op) => op.timestamp >= timeRange.start && op.timestamp <= timeRange.end\n      )\n    }\n\n    const totalOperations = operations.length\n    const totalCost = operations.reduce((sum, op) => sum + op.cost, 0)\n    const totalInputTokens = operations.reduce((sum, op) => sum + op.inputTokens, 0)\n    const totalOutputTokens = operations.reduce((sum, op) => sum + op.outputTokens, 0)\n    const successfulOps = operations.filter((op) => op.success)\n    const totalDuration = operations.reduce((sum, op) => sum + op.duration, 0)\n\n    // Operations by feature\n    const operationsByFeature: Record<string, number> = {}\n    const costsByFeature: Record<string, number> = {}\n\n    operations.forEach((op) => {\n      operationsByFeature[op.feature] = (operationsByFeature[op.feature] || 0) + 1\n      costsByFeature[op.feature] = (costsByFeature[op.feature] || 0) + op.cost\n    })\n\n    return {\n      totalOperations,\n      totalCost,\n      totalInputTokens,\n      totalOutputTokens,\n      operationsByFeature,\n      costsByFeature,\n      averageDuration: totalOperations > 0 ? totalDuration / totalOperations : 0,\n      successRate: totalOperations > 0 ? successfulOps.length / totalOperations : 0,\n    }\n  }\n\n  /**\n   * Get recent operations\n   */\n  getRecentOperations(limit = 10): AIOperation[] {\n    return this.operations.slice(-limit).reverse()\n  }\n\n  /**\n   * Check if usage is within limits\n   */\n  checkLimit(planTier: 'hobby' | 'pro' | 'enterprise', period: 'month' | 'day' = 'month'): {\n    used: number\n    limit: number\n    remaining: number\n    percentUsed: number\n    isExceeded: boolean\n  } {\n    const limits = {\n      hobby: { month: 50, day: 5 },\n      pro: { month: 500, day: 50 },\n      enterprise: { month: 2000, day: 200 },\n    }\n\n    const limit = limits[planTier][period]\n\n    // Calculate operations in the period\n    const now = new Date()\n    const start = new Date()\n    if (period === 'month') {\n      start.setMonth(now.getMonth() - 1)\n    } else {\n      start.setDate(now.getDate() - 1)\n    }\n\n    const periodOperations = this.operations.filter((op) => op.timestamp >= start).length\n\n    const remaining = Math.max(0, limit - periodOperations)\n    const percentUsed = (periodOperations / limit) * 100\n\n    return {\n      used: periodOperations,\n      limit,\n      remaining,\n      percentUsed,\n      isExceeded: periodOperations >= limit,\n    }\n  }\n\n  /**\n   * Subscribe to operation events\n   */\n  subscribe(listener: (operation: AIOperation) => void): () => void {\n    this.listeners.push(listener)\n\n    // Return unsubscribe function\n    return () => {\n      const index = this.listeners.indexOf(listener)\n      if (index > -1) {\n        this.listeners.splice(index, 1)\n      }\n    }\n  }\n\n  /**\n   * Clear all tracked operations\n   */\n  clear(): void {\n    this.operations = []\n  }\n\n  /**\n   * Export operations as JSON\n   */\n  export(): string {\n    return JSON.stringify(this.operations, null, 2)\n  }\n}\n\n/**\n * Global usage tracker instance\n */\nexport const aiUsageTracker = new AIUsageTracker()\n\n/**\n * Estimate cost for a feature before execution\n */\nexport function estimateFeatureCost(\n  feature: AIOperation['feature'],\n  model: AIModelKey = 'claude-3-5-sonnet-20241022'\n): { estimatedCost: string; estimatedTokens: number } {\n  // Rough estimates based on typical usage\n  const tokenEstimates = {\n    generatePlan: 2500,\n    predictRisks: 1800,\n    suggestAssignee: 1000,\n    generateSubtasks: 1200,\n    estimateEffort: 800,\n  }\n\n  const tokens = tokenEstimates[feature]\n  // Assume 60/40 split between input/output\n  const inputTokens = Math.floor(tokens * 0.6)\n  const outputTokens = Math.floor(tokens * 0.4)\n\n  const cost = calculateCost(model, inputTokens, outputTokens)\n\n  return {\n    estimatedCost: formatCost(cost),\n    estimatedTokens: tokens,\n  }\n}\n","/**\r\n * AI Usage Dashboard\r\n * Display AI usage statistics and costs\r\n */\r\n\r\nimport { useState, useEffect } from 'react'\r\nimport { aiUsageTracker, formatCost, type UsageStats } from '../../lib/ai/costs'\r\nimport { Portal } from '../Portal'\r\n\r\nexport interface AIUsageDashboardProps {\r\n  /** Is dashboard open */\r\n  isOpen: boolean\r\n  /** Close handler */\r\n  onClose: () => void\r\n  /** Current plan tier */\r\n  planTier?: 'hobby' | 'pro' | 'enterprise'\r\n}\r\n\r\nexport function AIUsageDashboard({\r\n  isOpen,\r\n  onClose,\r\n  planTier = 'hobby',\r\n}: AIUsageDashboardProps) {\r\n  const [stats, setStats] = useState<UsageStats>(aiUsageTracker.getStats())\r\n  const [limit, setLimit] = useState(aiUsageTracker.checkLimit(planTier))\r\n\r\n  // Update stats every second when open\r\n  useEffect(() => {\r\n    if (!isOpen) return\r\n\r\n    const interval = setInterval(() => {\r\n      setStats(aiUsageTracker.getStats())\r\n      setLimit(aiUsageTracker.checkLimit(planTier))\r\n    }, 1000)\r\n\r\n    return () => clearInterval(interval)\r\n  }, [isOpen, planTier])\r\n\r\n  // Close on escape\r\n  useEffect(() => {\r\n    const handleEscape = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape') {\r\n        onClose()\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('keydown', handleEscape)\r\n      return () => document.removeEventListener('keydown', handleEscape)\r\n    }\r\n    return undefined\r\n  }, [isOpen, onClose])\r\n\r\n  if (!isOpen) return null\r\n\r\n  const recentOps = aiUsageTracker.getRecentOperations(5)\r\n\r\n  return (\r\n    <Portal>\r\n      {/* Backdrop */}\r\n      <div\r\n        className=\"fixed inset-0 bg-black/60 backdrop-blur-sm z-[100000]\"\r\n        onClick={onClose}\r\n      />\r\n\r\n      {/* Dashboard */}\r\n      <div className=\"fixed inset-0 flex items-center justify-center z-[100001] p-4\">\r\n        <div\r\n          className=\"w-full max-w-3xl rounded-2xl shadow-2xl border max-h-[90vh] overflow-hidden flex flex-col\"\r\n          style={{\r\n            background: 'linear-gradient(135deg, #1f1f1f 0%, #1a1a1a 100%)',\r\n            borderColor: 'rgba(255, 255, 255, 0.15)',\r\n            boxShadow: '0 20px 60px rgba(0, 0, 0, 0.8), 0 0 0 1px rgba(255, 255, 255, 0.1)',\r\n          }}\r\n          onClick={(e) => e.stopPropagation()}\r\n        >\r\n          {/* Header */}\r\n          <div className=\"px-6 py-4 border-b border-white/10 flex items-center justify-between\">\r\n            <div>\r\n              <h2 className=\"text-xl font-bold text-white\">AI Usage Dashboard</h2>\r\n              <p className=\"text-sm text-white/60 mt-1\">\r\n                Monitor your AI consumption and costs\r\n              </p>\r\n            </div>\r\n            <button\r\n              onClick={onClose}\r\n              className=\"text-white/60 hover:text-white transition-colors\"\r\n            >\r\n              <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                <path\r\n                  d=\"M18 6L6 18M6 6L18 18\"\r\n                  stroke=\"currentColor\"\r\n                  strokeWidth=\"2\"\r\n                  strokeLinecap=\"round\"\r\n                />\r\n              </svg>\r\n            </button>\r\n          </div>\r\n\r\n          {/* Content */}\r\n          <div className=\"flex-1 overflow-y-auto p-6 space-y-6\">\r\n            {/* Usage Limit */}\r\n            <div className=\"p-4 rounded-xl bg-gradient-to-r from-[#00E5CC]/10 to-purple-500/10 border border-[#00E5CC]/30\">\r\n              <div className=\"flex items-center justify-between mb-2\">\r\n                <span className=\"text-sm font-semibold text-white/90\">\r\n                  Monthly Usage ({planTier.toUpperCase()})\r\n                </span>\r\n                <span className=\"text-sm font-bold text-white\">\r\n                  {limit.used} / {limit.limit}\r\n                </span>\r\n              </div>\r\n              <div className=\"w-full h-2 bg-white/10 rounded-full overflow-hidden\">\r\n                <div\r\n                  className=\"h-full transition-all\"\r\n                  style={{\r\n                    width: `${Math.min(100, limit.percentUsed)}%`,\r\n                    background:\r\n                      limit.percentUsed > 90\r\n                        ? '#EF4444'\r\n                        : limit.percentUsed > 70\r\n                        ? '#F59E0B'\r\n                        : '#10B981',\r\n                  }}\r\n                />\r\n              </div>\r\n              <p className=\"text-xs text-white/60 mt-2\">\r\n                {limit.remaining} operations remaining this month\r\n              </p>\r\n            </div>\r\n\r\n            {/* Stats Grid */}\r\n            <div className=\"grid grid-cols-2 gap-4\">\r\n              {/* Total Cost */}\r\n              <div className=\"p-4 rounded-lg bg-white/5 border border-white/10\">\r\n                <p className=\"text-xs font-semibold text-white/60 uppercase tracking-wider\">\r\n                  Total Cost\r\n                </p>\r\n                <p className=\"text-2xl font-bold text-green-400 mt-1\">\r\n                  {formatCost(stats.totalCost)}\r\n                </p>\r\n              </div>\r\n\r\n              {/* Total Operations */}\r\n              <div className=\"p-4 rounded-lg bg-white/5 border border-white/10\">\r\n                <p className=\"text-xs font-semibold text-white/60 uppercase tracking-wider\">\r\n                  Operations\r\n                </p>\r\n                <p className=\"text-2xl font-bold text-[#00E5CC] mt-1\">\r\n                  {stats.totalOperations}\r\n                </p>\r\n              </div>\r\n\r\n              {/* Total Tokens */}\r\n              <div className=\"p-4 rounded-lg bg-white/5 border border-white/10\">\r\n                <p className=\"text-xs font-semibold text-white/60 uppercase tracking-wider\">\r\n                  Tokens Used\r\n                </p>\r\n                <p className=\"text-2xl font-bold text-purple-400 mt-1\">\r\n                  {(stats.totalInputTokens + stats.totalOutputTokens).toLocaleString()}\r\n                </p>\r\n                <p className=\"text-xs text-white/50 mt-1\">\r\n                  {stats.totalInputTokens.toLocaleString()} in /{' '}\r\n                  {stats.totalOutputTokens.toLocaleString()} out\r\n                </p>\r\n              </div>\r\n\r\n              {/* Success Rate */}\r\n              <div className=\"p-4 rounded-lg bg-white/5 border border-white/10\">\r\n                <p className=\"text-xs font-semibold text-white/60 uppercase tracking-wider\">\r\n                  Success Rate\r\n                </p>\r\n                <p className=\"text-2xl font-bold text-green-400 mt-1\">\r\n                  {(stats.successRate * 100).toFixed(1)}%\r\n                </p>\r\n                <p className=\"text-xs text-white/50 mt-1\">\r\n                  Avg: {stats.averageDuration.toFixed(0)}ms\r\n                </p>\r\n              </div>\r\n            </div>\r\n\r\n            {/* Operations by Feature */}\r\n            <div>\r\n              <h3 className=\"text-sm font-semibold text-white/90 mb-3\">Usage by Feature</h3>\r\n              <div className=\"space-y-2\">\r\n                {Object.entries(stats.operationsByFeature).map(([feature, count]) => {\r\n                  const cost = stats.costsByFeature[feature] || 0\r\n                  const percent =\r\n                    stats.totalOperations > 0\r\n                      ? (count / stats.totalOperations) * 100\r\n                      : 0\r\n\r\n                  return (\r\n                    <div key={feature} className=\"p-3 rounded-lg bg-white/5 border border-white/10\">\r\n                      <div className=\"flex items-center justify-between mb-2\">\r\n                        <span className=\"text-sm font-medium text-white/90 capitalize\">\r\n                          {feature.replace(/([A-Z])/g, ' $1').trim()}\r\n                        </span>\r\n                        <div className=\"flex items-center gap-3\">\r\n                          <span className=\"text-xs text-white/60\">{count} ops</span>\r\n                          <span className=\"text-xs font-semibold text-green-400\">\r\n                            {formatCost(cost)}\r\n                          </span>\r\n                        </div>\r\n                      </div>\r\n                      <div className=\"w-full h-1.5 bg-white/10 rounded-full overflow-hidden\">\r\n                        <div\r\n                          className=\"h-full bg-[#00E5CC]\"\r\n                          style={{ width: `${percent}%` }}\r\n                        />\r\n                      </div>\r\n                    </div>\r\n                  )\r\n                })}\r\n              </div>\r\n            </div>\r\n\r\n            {/* Recent Operations */}\r\n            <div>\r\n              <h3 className=\"text-sm font-semibold text-white/90 mb-3\">Recent Operations</h3>\r\n              {recentOps.length === 0 ? (\r\n                <p className=\"text-sm text-white/50 text-center py-8\">\r\n                  No operations yet. Start using AI features!\r\n                </p>\r\n              ) : (\r\n                <div className=\"space-y-2\">\r\n                  {recentOps.map((op) => (\r\n                    <div\r\n                      key={op.id}\r\n                      className=\"p-3 rounded-lg bg-white/5 border border-white/10 flex items-center justify-between\"\r\n                    >\r\n                      <div>\r\n                        <p className=\"text-sm font-medium text-white/90 capitalize\">\r\n                          {op.feature.replace(/([A-Z])/g, ' $1').trim()}\r\n                        </p>\r\n                        <p className=\"text-xs text-white/50 mt-0.5\">\r\n                          {new Date(op.timestamp).toLocaleTimeString()} •{' '}\r\n                          {op.duration}ms\r\n                        </p>\r\n                      </div>\r\n                      <div className=\"flex items-center gap-3\">\r\n                        <span className=\"text-xs text-white/60\">\r\n                          {op.inputTokens + op.outputTokens} tokens\r\n                        </span>\r\n                        <span className=\"text-xs font-semibold text-green-400\">\r\n                          {formatCost(op.cost)}\r\n                        </span>\r\n                        <div\r\n                          className={`w-2 h-2 rounded-full ${\r\n                            op.success ? 'bg-green-400' : 'bg-red-400'\r\n                          }`}\r\n                        />\r\n                      </div>\r\n                    </div>\r\n                  ))}\r\n                </div>\r\n              )}\r\n            </div>\r\n          </div>\r\n\r\n          {/* Footer */}\r\n          <div className=\"px-6 py-4 border-t border-white/10 flex items-center justify-between\">\r\n            <p className=\"text-xs text-white/50\">\r\n              Costs are estimates. Actual API charges may vary.\r\n            </p>\r\n            <button\r\n              onClick={onClose}\r\n              className=\"px-4 py-2 rounded-lg text-sm font-semibold transition-all hover:bg-white/10 text-white/80\"\r\n            >\r\n              Close\r\n            </button>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </Portal>\r\n  )\r\n}\r\n","/**\r\n * Generate Gantt Tasks Dialog\r\n * AI-powered Gantt task generation with cost control\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport { Portal } from '../Portal'\r\n\r\nexport interface GanttTask {\r\n  id: string\r\n  name: string\r\n  start: string\r\n  end: string\r\n  duration: number\r\n  progress: number\r\n  dependencies: string[]\r\n  type: string\r\n  priority: 'high' | 'medium' | 'low'\r\n}\r\n\r\nexport interface GeneratedTasksResponse {\r\n  tasks: {\r\n    tasks: GanttTask[]\r\n  }\r\n  from_cache: boolean\r\n  tokens_used: number\r\n  mock_mode?: boolean\r\n  similarity?: number\r\n  tokens_saved?: number\r\n}\r\n\r\nexport interface GenerateGanttTasksDialogProps {\r\n  /** Is dialog open */\r\n  isOpen: boolean\r\n  /** Close handler */\r\n  onClose: () => void\r\n  /** Tasks generated callback */\r\n  onTasksGenerated: (tasks: GanttTask[]) => void\r\n  /** Generate tasks function (calls Supabase Edge Function) */\r\n  onGenerateTasks: (params: {\r\n    prompt: string\r\n    projectName?: string\r\n    startDate?: string\r\n    endDate?: string\r\n  }) => Promise<GeneratedTasksResponse>\r\n  /** Is AI loading */\r\n  isLoading?: boolean\r\n  /** Project ID (optional) */\r\n  projectId?: string\r\n  /** Project name (optional) */\r\n  projectName?: string\r\n}\r\n\r\nexport function GenerateGanttTasksDialog({\r\n  isOpen,\r\n  onClose,\r\n  onTasksGenerated,\r\n  onGenerateTasks,\r\n  isLoading: externalLoading,\r\n  projectName,\r\n}: GenerateGanttTasksDialogProps) {\r\n  const [prompt, setPrompt] = useState('')\r\n  const [startDate, setStartDate] = useState('')\r\n  const [endDate, setEndDate] = useState('')\r\n  const [isGenerating, setIsGenerating] = useState(false)\r\n  const [error, setError] = useState<string | null>(null)\r\n  const [generatedTasks, setGeneratedTasks] = useState<GanttTask[] | null>(null)\r\n  const [responseMetadata, setResponseMetadata] = useState<{\r\n    from_cache: boolean\r\n    tokens_used: number\r\n    mock_mode?: boolean\r\n    similarity?: number\r\n    tokens_saved?: number\r\n  } | null>(null)\r\n  const inputRef = useRef<HTMLTextAreaElement>(null)\r\n\r\n  const isLoading = isGenerating || externalLoading\r\n\r\n  // Focus input when dialog opens\r\n  useEffect(() => {\r\n    if (isOpen && inputRef.current) {\r\n      inputRef.current.focus()\r\n    }\r\n  }, [isOpen])\r\n\r\n  // Close on escape\r\n  useEffect(() => {\r\n    const handleEscape = (e: KeyboardEvent) => {\r\n      if (e.key === 'Escape' && !isLoading) {\r\n        handleClose()\r\n      }\r\n    }\r\n\r\n    if (isOpen) {\r\n      document.addEventListener('keydown', handleEscape)\r\n      return () => document.removeEventListener('keydown', handleEscape)\r\n    }\r\n    return undefined\r\n  }, [isOpen, isLoading])\r\n\r\n  const handleClose = () => {\r\n    if (!isLoading) {\r\n      setPrompt('')\r\n      setStartDate('')\r\n      setEndDate('')\r\n      setError(null)\r\n      setGeneratedTasks(null)\r\n      setResponseMetadata(null)\r\n      onClose()\r\n    }\r\n  }\r\n\r\n  const handleGenerate = async () => {\r\n    if (!prompt.trim() || isLoading) return\r\n\r\n    setIsGenerating(true)\r\n    setError(null)\r\n    setGeneratedTasks(null)\r\n    setResponseMetadata(null)\r\n\r\n    try {\r\n      const response = await onGenerateTasks({\r\n        prompt: prompt.trim(),\r\n        projectName: projectName || 'Mi Proyecto',\r\n        startDate: startDate || undefined,\r\n        endDate: endDate || undefined,\r\n      })\r\n\r\n      setGeneratedTasks(response.tasks.tasks)\r\n      setResponseMetadata({\r\n        from_cache: response.from_cache,\r\n        tokens_used: response.tokens_used,\r\n        mock_mode: response.mock_mode,\r\n        similarity: response.similarity,\r\n        tokens_saved: response.tokens_saved,\r\n      })\r\n    } catch (err) {\r\n      setError(err instanceof Error ? err.message : 'Failed to generate tasks')\r\n    } finally {\r\n      setIsGenerating(false)\r\n    }\r\n  }\r\n\r\n  const handleApplyTasks = () => {\r\n    if (generatedTasks) {\r\n      onTasksGenerated(generatedTasks)\r\n      handleClose()\r\n    }\r\n  }\r\n\r\n  if (!isOpen) return null\r\n\r\n  const similarity = responseMetadata?.similarity\r\n    ? ((responseMetadata.similarity || 0) * 100).toFixed(0)\r\n    : '0'\r\n\r\n  return (\r\n    <Portal>\r\n      {/* Backdrop */}\r\n      <div\r\n        className=\"fixed inset-0 bg-black/60 backdrop-blur-sm z-[100000]\"\r\n        onClick={handleClose}\r\n      />\r\n\r\n      {/* Dialog */}\r\n      <div className=\"fixed inset-0 flex items-center justify-center z-[100001] p-4\">\r\n        <div\r\n          className=\"w-full max-w-3xl rounded-2xl shadow-2xl border max-h-[90vh] overflow-hidden flex flex-col\"\r\n          style={{\r\n            background: 'linear-gradient(135deg, #1f1f1f 0%, #1a1a1a 100%)',\r\n            borderColor: 'rgba(255, 255, 255, 0.15)',\r\n            boxShadow: '0 20px 60px rgba(0, 0, 0, 0.8), 0 0 0 1px rgba(255, 255, 255, 0.1)',\r\n          }}\r\n          onClick={(e) => e.stopPropagation()}\r\n        >\r\n          {/* Header */}\r\n          <div className=\"px-6 py-4 border-b border-white/10 flex items-center justify-between\">\r\n            <div>\r\n              <h2 className=\"text-xl font-bold text-white flex items-center gap-2\">\r\n                <svg\r\n                  width=\"24\"\r\n                  height=\"24\"\r\n                  viewBox=\"0 0 24 24\"\r\n                  fill=\"none\"\r\n                  xmlns=\"http://www.w3.org/2000/svg\"\r\n                  className=\"text-[#00E5CC]\"\r\n                >\r\n                  <rect x=\"3\" y=\"4\" width=\"18\" height=\"2\" rx=\"1\" fill=\"currentColor\" />\r\n                  <rect x=\"3\" y=\"9\" width=\"18\" height=\"2\" rx=\"1\" fill=\"currentColor\" />\r\n                  <rect x=\"3\" y=\"14\" width=\"18\" height=\"2\" rx=\"1\" fill=\"currentColor\" />\r\n                  <rect x=\"3\" y=\"19\" width=\"18\" height=\"2\" rx=\"1\" fill=\"currentColor\" />\r\n                </svg>\r\n                Generate Gantt Tasks with AI\r\n              </h2>\r\n              <p className=\"text-sm text-white/60 mt-1\">\r\n                Describe your project and let AI create a complete task timeline\r\n              </p>\r\n            </div>\r\n            <button\r\n              onClick={handleClose}\r\n              disabled={isLoading}\r\n              className=\"text-white/60 hover:text-white transition-colors disabled:opacity-50\"\r\n            >\r\n              <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                <path\r\n                  d=\"M18 6L6 18M6 6L18 18\"\r\n                  stroke=\"currentColor\"\r\n                  strokeWidth=\"2\"\r\n                  strokeLinecap=\"round\"\r\n                />\r\n              </svg>\r\n            </button>\r\n          </div>\r\n\r\n          {/* Content */}\r\n          <div className=\"flex-1 overflow-y-auto p-6 space-y-4\">\r\n            {!generatedTasks ? (\r\n              <>\r\n                {/* Input Form */}\r\n                <div>\r\n                  <label className=\"block text-sm font-semibold text-white/90 mb-2\">\r\n                    Project Description *\r\n                  </label>\r\n                  <textarea\r\n                    ref={inputRef}\r\n                    value={prompt}\r\n                    onChange={(e) => setPrompt(e.target.value)}\r\n                    placeholder=\"Example: Build a mobile app for tracking fitness goals with user authentication, workout logging, progress charts, and social features...\"\r\n                    className=\"w-full h-32 px-4 py-3 rounded-lg text-sm bg-white/5 border border-white/20 text-white placeholder-white/40 outline-none focus:border-[#00E5CC]/50 transition-all resize-none\"\r\n                    disabled={isLoading}\r\n                  />\r\n                  <p className=\"text-xs text-white/50 mt-2\">\r\n                    Be as specific as possible. Include features, technologies, and any special\r\n                    requirements.\r\n                  </p>\r\n                </div>\r\n\r\n                {/* Date Inputs */}\r\n                <div className=\"grid grid-cols-2 gap-4\">\r\n                  <div>\r\n                    <label className=\"block text-sm font-semibold text-white/90 mb-2\">\r\n                      Start Date (Optional)\r\n                    </label>\r\n                    <input\r\n                      type=\"date\"\r\n                      value={startDate}\r\n                      onChange={(e) => setStartDate(e.target.value)}\r\n                      className=\"w-full px-4 py-2 rounded-lg text-sm bg-white/5 border border-white/20 text-white outline-none focus:border-[#00E5CC]/50 transition-all\"\r\n                      disabled={isLoading}\r\n                    />\r\n                  </div>\r\n                  <div>\r\n                    <label className=\"block text-sm font-semibold text-white/90 mb-2\">\r\n                      End Date (Optional)\r\n                    </label>\r\n                    <input\r\n                      type=\"date\"\r\n                      value={endDate}\r\n                      onChange={(e) => setEndDate(e.target.value)}\r\n                      className=\"w-full px-4 py-2 rounded-lg text-sm bg-white/5 border border-white/20 text-white outline-none focus:border-[#00E5CC]/50 transition-all\"\r\n                      disabled={isLoading}\r\n                    />\r\n                  </div>\r\n                </div>\r\n\r\n                {/* Error */}\r\n                {error && (\r\n                  <div className=\"p-4 rounded-lg bg-red-500/10 border border-red-500/30 text-red-400 text-sm\">\r\n                    {error}\r\n                  </div>\r\n                )}\r\n\r\n                {/* Examples */}\r\n                <div className=\"border-t border-white/10 pt-4\">\r\n                  <p className=\"text-xs font-semibold text-white/70 uppercase tracking-wider mb-3\">\r\n                    Example Prompts\r\n                  </p>\r\n                  <div className=\"space-y-2\">\r\n                    {[\r\n                      'Build an e-commerce platform with product catalog, shopping cart, payment integration, and order tracking',\r\n                      'Create a task management app with team collaboration, real-time updates, file attachments, and notifications',\r\n                      'Develop a blog platform with markdown editor, SEO optimization, comments system, and analytics dashboard',\r\n                    ].map((example, i) => (\r\n                      <button\r\n                        key={i}\r\n                        onClick={() => setPrompt(example)}\r\n                        disabled={isLoading}\r\n                        className=\"w-full text-left px-3 py-2 rounded-lg text-xs text-white/70 hover:text-white hover:bg-white/5 transition-all border border-white/10 hover:border-white/20 disabled:opacity-50\"\r\n                      >\r\n                        {example}\r\n                      </button>\r\n                    ))}\r\n                  </div>\r\n                </div>\r\n              </>\r\n            ) : (\r\n              <>\r\n                {/* Generated Tasks Preview */}\r\n                <div className=\"space-y-4\">\r\n                  <div className=\"flex items-center gap-2 text-green-400\">\r\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                      <path\r\n                        d=\"M4 10L8 14L16 6\"\r\n                        stroke=\"currentColor\"\r\n                        strokeWidth=\"2\"\r\n                        strokeLinecap=\"round\"\r\n                        strokeLinejoin=\"round\"\r\n                      />\r\n                    </svg>\r\n                    <span className=\"font-semibold\">Tasks Generated Successfully!</span>\r\n                  </div>\r\n\r\n                  {/* Metadata Badges */}\r\n                  <div className=\"flex flex-wrap gap-2\">\r\n                    {responseMetadata?.mock_mode && (\r\n                      <span className=\"px-2 py-1 rounded-lg text-xs font-semibold bg-yellow-500/20 text-yellow-400 border border-yellow-500/30\">\r\n                        Mock Mode\r\n                      </span>\r\n                    )}\r\n                    {responseMetadata?.from_cache ? (\r\n                      <span className=\"px-2 py-1 rounded-lg text-xs font-semibold bg-[#00E5CC]/20 text-[#00E5CC] border border-[#00E5CC]/30\">\r\n                        From Cache ({similarity}% similar)\r\n                      </span>\r\n                    ) : (\r\n                      <span className=\"px-2 py-1 rounded-lg text-xs font-semibold bg-green-500/20 text-green-400 border border-green-500/30\">\r\n                        AI Generated\r\n                      </span>\r\n                    )}\r\n                    <span className=\"px-2 py-1 rounded-lg text-xs font-semibold bg-purple-500/20 text-purple-400 border border-purple-500/30\">\r\n                      {responseMetadata?.tokens_used || 0} tokens\r\n                    </span>\r\n                    {responseMetadata?.tokens_saved && (\r\n                      <span className=\"px-2 py-1 rounded-lg text-xs font-semibold bg-indigo-500/20 text-indigo-400 border border-indigo-500/30\">\r\n                        {responseMetadata.tokens_saved} tokens saved\r\n                      </span>\r\n                    )}\r\n                    <span className=\"px-2 py-1 rounded-lg text-xs font-semibold bg-pink-500/20 text-pink-400 border border-pink-500/30\">\r\n                      {generatedTasks.length} tasks\r\n                    </span>\r\n                  </div>\r\n\r\n                  {/* Tasks List */}\r\n                  <div className=\"space-y-2 max-h-96 overflow-y-auto\">\r\n                    {generatedTasks.map((task, i) => (\r\n                      <div\r\n                        key={task.id}\r\n                        className=\"p-3 rounded-lg bg-white/5 border border-white/10 hover:bg-white/10 transition-colors\"\r\n                      >\r\n                        <div className=\"flex items-start justify-between gap-2\">\r\n                          <div className=\"flex-1\">\r\n                            <div className=\"flex items-center gap-2 mb-1\">\r\n                              <span className=\"text-xs text-white/50\">#{i + 1}</span>\r\n                              <p className=\"text-sm font-medium text-white/90\">{task.name}</p>\r\n                            </div>\r\n                            <div className=\"flex items-center gap-3 text-xs text-white/60\">\r\n                              <span className=\"flex items-center gap-1\">\r\n                                <svg\r\n                                  width=\"12\"\r\n                                  height=\"12\"\r\n                                  viewBox=\"0 0 12 12\"\r\n                                  fill=\"none\"\r\n                                  className=\"text-white/40\"\r\n                                >\r\n                                  <rect\r\n                                    x=\"1\"\r\n                                    y=\"2\"\r\n                                    width=\"10\"\r\n                                    height=\"8\"\r\n                                    rx=\"1\"\r\n                                    stroke=\"currentColor\"\r\n                                  />\r\n                                  <path d=\"M1 4h10\" stroke=\"currentColor\" />\r\n                                </svg>\r\n                                {task.start} → {task.end}\r\n                              </span>\r\n                              <span>{task.duration} days</span>\r\n                              {task.dependencies.length > 0 && (\r\n                                <span className=\"text-[#00E5CC]\">\r\n                                  Depends: {task.dependencies.join(', ')}\r\n                                </span>\r\n                              )}\r\n                            </div>\r\n                          </div>\r\n                          <span\r\n                            className={`px-2 py-0.5 rounded text-xs font-semibold ${\r\n                              task.priority === 'high'\r\n                                ? 'bg-red-500/20 text-red-400'\r\n                                : task.priority === 'medium'\r\n                                ? 'bg-yellow-500/20 text-yellow-400'\r\n                                : 'bg-[#00E5CC]/20 text-[#00E5CC]'\r\n                            }`}\r\n                          >\r\n                            {task.priority}\r\n                          </span>\r\n                        </div>\r\n                      </div>\r\n                    ))}\r\n                  </div>\r\n                </div>\r\n              </>\r\n            )}\r\n          </div>\r\n\r\n          {/* Footer */}\r\n          <div className=\"px-6 py-4 border-t border-white/10 flex items-center justify-between\">\r\n            <div>\r\n              {isLoading && (\r\n                <div className=\"flex items-center gap-2 text-[#00E5CC] text-sm\">\r\n                  <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\">\r\n                    <circle\r\n                      className=\"opacity-25\"\r\n                      cx=\"12\"\r\n                      cy=\"12\"\r\n                      r=\"10\"\r\n                      stroke=\"currentColor\"\r\n                      strokeWidth=\"4\"\r\n                      fill=\"none\"\r\n                    />\r\n                    <path\r\n                      className=\"opacity-75\"\r\n                      fill=\"currentColor\"\r\n                      d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n                    />\r\n                  </svg>\r\n                  <span>Generating with AI...</span>\r\n                </div>\r\n              )}\r\n            </div>\r\n            <div className=\"flex items-center gap-3\">\r\n              <button\r\n                onClick={handleClose}\r\n                disabled={isLoading}\r\n                className=\"px-4 py-2 rounded-lg text-sm font-semibold transition-all hover:bg-white/10 text-white/80 disabled:opacity-50\"\r\n              >\r\n                Cancel\r\n              </button>\r\n              {!generatedTasks ? (\r\n                <button\r\n                  onClick={handleGenerate}\r\n                  disabled={!prompt.trim() || isLoading}\r\n                  className=\"px-6 py-2 rounded-lg text-sm font-semibold transition-all disabled:opacity-50\"\r\n                  style={{\r\n                    background: 'linear-gradient(135deg, #00E5CC 0%, #00E5CC 100%)',\r\n                    color: '#ffffff',\r\n                  }}\r\n                >\r\n                  {isLoading ? 'Generating...' : 'Generate Tasks'}\r\n                </button>\r\n              ) : (\r\n                <button\r\n                  onClick={handleApplyTasks}\r\n                  className=\"px-6 py-2 rounded-lg text-sm font-semibold transition-all\"\r\n                  style={{\r\n                    background: 'linear-gradient(135deg, #10B981 0%, #059669 100%)',\r\n                    color: '#ffffff',\r\n                  }}\r\n                >\r\n                  Apply Tasks to Gantt\r\n                </button>\r\n              )}\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </Portal>\r\n  )\r\n}\r\n","/**\n * useKanbanState Hook\n * Optional hook for managing board state locally\n * Consumers can use this or manage state themselves\n * @module hooks/useKanbanState\n */\n\nimport { useState, useCallback } from 'react'\nimport { retryWithBackoff } from '../utils/retry'\nimport type { Board, BoardCallbacks, Card, Column } from '../types'\n\nexport interface UseKanbanStateOptions {\n  /** Initial board state */\n  initialBoard: Board\n  /** Persist changes (e.g., to localStorage, API) */\n  onPersist?: (board: Board) => void | Promise<void>\n  /** Enable optimistic updates (default: true) */\n  optimistic?: boolean\n}\n\nexport interface UseKanbanStateReturn {\n  /** Current board state */\n  board: Board\n  /** Callbacks for the KanbanBoard component */\n  callbacks: BoardCallbacks\n  /** Direct state setters (advanced usage) */\n  setBoard: React.Dispatch<React.SetStateAction<Board>>\n  /** Helper functions */\n  helpers: {\n    addCard: (card: Omit<Card, 'id'>) => string\n    addColumn: (column: Omit<Column, 'id' | 'cardIds'>) => string\n    deleteCard: (cardId: string) => void\n    deleteColumn: (columnId: string) => void\n    clearBoard: () => void\n  }\n}\n\n/**\n * Hook for managing Kanban board state\n *\n * @example\n * ```tsx\n * const { board, callbacks } = useKanbanState({\n *   initialBoard: myBoard,\n *   onPersist: async (board) => {\n *     await api.updateBoard(board)\n *   }\n * })\n *\n * return <KanbanBoard board={board} callbacks={callbacks} />\n * ```\n */\nexport function useKanbanState({\n  initialBoard,\n  onPersist,\n}: UseKanbanStateOptions): UseKanbanStateReturn {\n  const [board, setBoard] = useState<Board>(initialBoard)\n\n  // Persist helper with retry logic\n  const persistBoard = useCallback(\n    (updatedBoard: Board) => {\n      if (onPersist) {\n        // Use retry logic for resilient persistence\n        retryWithBackoff(\n          () => Promise.resolve(onPersist(updatedBoard)),\n          {\n            maxAttempts: 3,\n            initialDelay: 1000,\n            onRetry: (error, attempt, delay) => {\n              console.warn(\n                `Retry attempt ${attempt} after ${delay}ms: ${error.message}`\n              )\n            },\n          }\n        ).then((result) => {\n          if (!result.success) {\n            console.error(\n              `Failed to persist board after ${result.attempts} attempts:`,\n              result.error\n            )\n            // TODO: Implement rollback or user notification\n          }\n        })\n      }\n    },\n    [onPersist]\n  )\n\n  // Move card to new position/column\n  const handleCardMove = useCallback(\n    async (cardId: string, targetColumnId: string, position: number) => {\n      setBoard((prev) => {\n        const card = prev.cards.find((c) => c.id === cardId)\n        if (!card) return prev\n\n        const sourceColumnId = card.columnId\n\n        // Update card\n        const updatedCard = {\n          ...card,\n          columnId: targetColumnId,\n          position,\n        }\n\n        // Update cards array\n        const updatedCards = prev.cards.map((c) =>\n          c.id === cardId ? updatedCard : c\n        )\n\n        // Update columns' cardIds\n        const updatedColumns = prev.columns.map((col) => {\n          if (col.id === sourceColumnId) {\n            // Remove from source column\n            return {\n              ...col,\n              cardIds: col.cardIds.filter((id) => id !== cardId),\n            }\n          } else if (col.id === targetColumnId) {\n            // Add to target column (maintain sort order)\n            const targetCards = updatedCards\n              .filter((c) => c.columnId === targetColumnId)\n              .sort((a, b) => a.position - b.position)\n            return {\n              ...col,\n              cardIds: targetCards.map((c) => c.id),\n            }\n          }\n          return col\n        })\n\n        const updatedBoard = {\n          ...prev,\n          cards: updatedCards,\n          columns: updatedColumns,\n        }\n\n        persistBoard(updatedBoard)\n        return updatedBoard\n      })\n    },\n    [persistBoard]\n  )\n\n  // Update card properties\n  const handleCardUpdate = useCallback(\n    async (cardId: string, updates: Partial<Card>) => {\n      setBoard((prev) => {\n        const updatedCards = prev.cards.map((card) =>\n          card.id === cardId ? { ...card, ...updates } : card\n        )\n\n        const updatedBoard = {\n          ...prev,\n          cards: updatedCards,\n        }\n\n        persistBoard(updatedBoard)\n        return updatedBoard\n      })\n    },\n    [persistBoard]\n  )\n\n  // Create new card\n  const handleCardCreate = useCallback(\n    async (card: Omit<Card, 'id'>) => {\n      const newCardId = `card-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n\n      setBoard((prev) => {\n        const newCard: Card = {\n          ...card,\n          id: newCardId,\n        }\n\n        // Add to column's cardIds\n        const updatedColumns = prev.columns.map((col) =>\n          col.id === card.columnId\n            ? { ...col, cardIds: [...col.cardIds, newCardId] }\n            : col\n        )\n\n        const updatedBoard = {\n          ...prev,\n          cards: [...prev.cards, newCard],\n          columns: updatedColumns,\n        }\n\n        persistBoard(updatedBoard)\n        return updatedBoard\n      })\n    },\n    [persistBoard]\n  )\n\n  // Delete card\n  const handleCardDelete = useCallback(\n    async (cardId: string) => {\n      setBoard((prev) => {\n        const card = prev.cards.find((c) => c.id === cardId)\n        if (!card) return prev\n\n        // Remove from cards\n        const updatedCards = prev.cards.filter((c) => c.id !== cardId)\n\n        // Remove from column's cardIds\n        const updatedColumns = prev.columns.map((col) =>\n          col.id === card.columnId\n            ? { ...col, cardIds: col.cardIds.filter((id) => id !== cardId) }\n            : col\n        )\n\n        const updatedBoard = {\n          ...prev,\n          cards: updatedCards,\n          columns: updatedColumns,\n        }\n\n        persistBoard(updatedBoard)\n        return updatedBoard\n      })\n    },\n    [persistBoard]\n  )\n\n  // Create new column\n  const handleColumnCreate = useCallback(\n    async (column: Omit<Column, 'id' | 'cardIds'>) => {\n      const newColumnId = `col-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n\n      setBoard((prev) => {\n        const newColumn: Column = {\n          ...column,\n          id: newColumnId,\n          cardIds: [],\n        }\n\n        const updatedBoard = {\n          ...prev,\n          columns: [...prev.columns, newColumn],\n        }\n\n        persistBoard(updatedBoard)\n        return updatedBoard\n      })\n    },\n    [persistBoard]\n  )\n\n  // Update column\n  const handleColumnUpdate = useCallback(\n    async (columnId: string, updates: Partial<Column>) => {\n      setBoard((prev) => {\n        const updatedColumns = prev.columns.map((col) =>\n          col.id === columnId ? { ...col, ...updates } : col\n        )\n\n        const updatedBoard = {\n          ...prev,\n          columns: updatedColumns,\n        }\n\n        persistBoard(updatedBoard)\n        return updatedBoard\n      })\n    },\n    [persistBoard]\n  )\n\n  // Delete column\n  const handleColumnDelete = useCallback(\n    async (columnId: string) => {\n      setBoard((prev) => {\n        // Remove all cards in this column\n        const updatedCards = prev.cards.filter((c) => c.columnId !== columnId)\n        const updatedColumns = prev.columns.filter((col) => col.id !== columnId)\n\n        const updatedBoard = {\n          ...prev,\n          cards: updatedCards,\n          columns: updatedColumns,\n        }\n\n        persistBoard(updatedBoard)\n        return updatedBoard\n      })\n    },\n    [persistBoard]\n  )\n\n  // Helper function to add card (convenience)\n  const addCard = useCallback(\n    (card: Omit<Card, 'id'>): string => {\n      const newCardId = `card-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n      handleCardCreate(card)\n      return newCardId\n    },\n    [handleCardCreate]\n  )\n\n  // Helper function to add column (convenience)\n  const addColumn = useCallback(\n    (column: Omit<Column, 'id' | 'cardIds'>): string => {\n      const newColumnId = `col-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n      handleColumnCreate(column)\n      return newColumnId\n    },\n    [handleColumnCreate]\n  )\n\n  // Helper function to clear board (for AI-generated plans)\n  const clearBoard = useCallback(() => {\n    setBoard((prev) => {\n      const updatedBoard = {\n        ...prev,\n        cards: [],\n        columns: [],\n      }\n\n      persistBoard(updatedBoard)\n      return updatedBoard\n    })\n  }, [persistBoard])\n\n  const callbacks: BoardCallbacks = {\n    onCardMove: handleCardMove,\n    onCardUpdate: handleCardUpdate,\n    onCardCreate: handleCardCreate,\n    onCardDelete: handleCardDelete,\n    onColumnCreate: handleColumnCreate,\n    onColumnUpdate: handleColumnUpdate,\n    onColumnDelete: handleColumnDelete,\n  }\n\n  return {\n    board,\n    callbacks,\n    setBoard,\n    helpers: {\n      addCard,\n      addColumn,\n      deleteCard: handleCardDelete,\n      deleteColumn: handleColumnDelete,\n      clearBoard,\n    },\n  }\n}\n","import { useMemo } from 'react'\nimport { useKanbanState } from './useKanbanState'\nimport type { Board, BoardCallbacks, User, KanbanBoardProps } from '../types'\n\nexport interface UseBoardOptions {\n  initialData: Board\n  availableUsers?: User[]\n  onSave?: (board: Board) => void | Promise<void>\n  saveDelay?: number\n}\n\nexport interface UseBoardReturn {\n  props: Pick<KanbanBoardProps, 'board' | 'callbacks' | 'availableUsers'>\n  board: Board\n  callbacks: BoardCallbacks\n  utils: {\n    addCard: (columnId: string, title: string, data?: Partial<any>) => void\n    addColumn: (title: string, position?: number) => void\n    reset: () => void\n  }\n}\n\n/**\n * Simplified hook for Kanban board state management\n *\n * @example\n * ```tsx\n * import { KanbanBoard, useBoard } from '@libxai/board'\n *\n * function App() {\n *   const board = useBoard({\n *     initialData: myData,\n *     onSave: (board) => localStorage.setItem('board', JSON.stringify(board))\n *   })\n *\n *   return <KanbanBoard {...board.props} />\n * }\n * ```\n */\nexport function useBoard({\n  initialData,\n  availableUsers = [],\n  onSave,\n}: UseBoardOptions): UseBoardReturn {\n  const { board, callbacks, helpers } = useKanbanState({\n    initialBoard: initialData,\n    onPersist: onSave,\n  })\n\n  const utils = useMemo(\n    () => ({\n      addCard: (columnId: string, title: string, data: Partial<any> = {}) => {\n        helpers.addCard({\n          title,\n          columnId,\n          position: board.cards.filter((c) => c.columnId === columnId).length,\n          ...data,\n        })\n      },\n      addColumn: (title: string, position?: number) => {\n        // Calculate next position based on highest existing position + 1000\n        const maxPosition = board.columns.length > 0\n          ? Math.max(...board.columns.map(col => col.position))\n          : 0\n\n        helpers.addColumn({\n          title,\n          position: position ?? (maxPosition + 1000),\n        })\n      },\n      reset: helpers.clearBoard,\n    }),\n    [board.cards, board.columns, helpers]\n  )\n\n  const props = useMemo(\n    () => ({\n      board,\n      callbacks,\n      availableUsers,\n    }),\n    [board, callbacks, availableUsers]\n  )\n\n  return {\n    props,\n    board,\n    callbacks,\n    utils,\n  }\n}\n","import { useState, useMemo, useCallback } from 'react'\nimport type { Card, Priority } from '../types'\n\nexport type DateFilter = 'all' | 'overdue' | 'today' | 'this-week' | 'custom'\nexport type SortBy = 'created' | 'priority' | 'dueDate' | 'title' | 'estimate' | 'none'\nexport type SortOrder = 'asc' | 'desc'\n\nexport interface FilterState {\n  dateFilter: DateFilter\n  dateRange?: { start: Date; end: Date }\n  priorities: Priority[]\n  assignees: string[]\n  labels: string[]\n  columns: string[]\n  search: string\n}\n\nexport interface SortState {\n  by: SortBy\n  order: SortOrder\n}\n\nexport interface UseFiltersOptions {\n  initialFilters?: Partial<FilterState>\n  initialSort?: Partial<SortState>\n  currentUserId?: string\n}\n\nexport interface UseFiltersReturn {\n  filters: FilterState\n  sort: SortState\n  setFilters: (filters: Partial<FilterState>) => void\n  setSort: (sort: Partial<SortState>) => void\n  resetFilters: () => void\n  filterMyTasks: () => void\n  filterOverdue: () => void\n  filterHighPriority: () => void\n  applyFilters: (cards: Card[]) => Card[]\n  hasActiveFilters: boolean\n}\n\nconst DEFAULT_FILTERS: FilterState = {\n  dateFilter: 'all',\n  priorities: [],\n  assignees: [],\n  labels: [],\n  columns: [],\n  search: '',\n}\n\nconst DEFAULT_SORT: SortState = {\n  by: 'none',\n  order: 'asc',\n}\n\n/**\n * Hook for filtering and sorting board cards\n *\n * @example\n * ```tsx\n * const { filters, setFilters, applyFilters, filterMyTasks } = useFilters({\n *   currentUserId: 'user-1'\n * })\n *\n * const filteredCards = applyFilters(board.cards)\n * ```\n */\nexport function useFilters({\n  initialFilters = {},\n  initialSort = {},\n  currentUserId,\n}: UseFiltersOptions = {}): UseFiltersReturn {\n  const [filters, setFiltersState] = useState<FilterState>({\n    ...DEFAULT_FILTERS,\n    ...initialFilters,\n  })\n\n  const [sort, setSortState] = useState<SortState>({\n    ...DEFAULT_SORT,\n    ...initialSort,\n  })\n\n  const setFilters = useCallback((newFilters: Partial<FilterState>) => {\n    setFiltersState((prev) => ({ ...prev, ...newFilters }))\n  }, [])\n\n  const setSort = useCallback((newSort: Partial<SortState>) => {\n    setSortState((prev) => ({ ...prev, ...newSort }))\n  }, [])\n\n  const resetFilters = useCallback(() => {\n    setFiltersState(DEFAULT_FILTERS)\n    setSortState(DEFAULT_SORT)\n  }, [])\n\n  const filterMyTasks = useCallback(() => {\n    if (!currentUserId) return\n    // Reset all filters before applying \"My Tasks\"\n    setFiltersState({\n      ...DEFAULT_FILTERS,\n      assignees: [currentUserId]\n    })\n  }, [currentUserId])\n\n  const filterOverdue = useCallback(() => {\n    // Reset all filters before applying \"Overdue\"\n    setFiltersState({\n      ...DEFAULT_FILTERS,\n      dateFilter: 'overdue'\n    })\n  }, [])\n\n  const filterHighPriority = useCallback(() => {\n    // Reset all filters before applying \"High Priority\"\n    setFiltersState({\n      ...DEFAULT_FILTERS,\n      priorities: ['HIGH', 'URGENT']\n    })\n  }, [])\n\n  const hasActiveFilters = useMemo(() => {\n    return (\n      filters.dateFilter !== 'all' ||\n      filters.priorities.length > 0 ||\n      filters.assignees.length > 0 ||\n      filters.labels.length > 0 ||\n      filters.columns.length > 0 ||\n      filters.search !== '' ||\n      sort.by !== 'none'\n    )\n  }, [filters, sort])\n\n  const applyFilters = useCallback(\n    (cards: Card[]): Card[] => {\n      let filtered = [...cards]\n\n      if (filters.search) {\n        const query = filters.search.toLowerCase()\n        filtered = filtered.filter(\n          (card) =>\n            card.title.toLowerCase().includes(query) ||\n            card.description?.toLowerCase().includes(query)\n        )\n      }\n\n      if (filters.dateFilter !== 'all') {\n        const now = new Date()\n\n        // Get today's date string in local timezone (YYYY-MM-DD format)\n        // This matches what the date input produces when user selects a date\n        const year = now.getFullYear()\n        const month = String(now.getMonth() + 1).padStart(2, '0')\n        const day = String(now.getDate()).padStart(2, '0')\n        const todayString = `${year}-${month}-${day}`\n\n        filtered = filtered.filter((card) => {\n          if (!card.endDate && !card.dueDate) return false\n\n          const dueDate = card.endDate || card.dueDate\n          if (!dueDate) return false\n\n          // Convert date to YYYY-MM-DD string for comparison\n          let dueDateString: string\n          if (typeof dueDate === 'string') {\n            // Already a string, extract YYYY-MM-DD part\n            const parts = dueDate.split('T')\n            dueDateString = parts[0] || dueDate\n          } else {\n            // Date object - convert to YYYY-MM-DD in UTC (how date inputs store dates)\n            const y = dueDate.getUTCFullYear()\n            const m = String(dueDate.getUTCMonth() + 1).padStart(2, '0')\n            const d = String(dueDate.getUTCDate()).padStart(2, '0')\n            dueDateString = `${y}-${m}-${d}`\n          }\n\n          switch (filters.dateFilter) {\n            case 'overdue':\n              return dueDateString < todayString\n            case 'today':\n              return dueDateString === todayString\n            case 'this-week':\n              // This week means from today until 7 days from now\n              const todayDate = new Date(todayString + 'T00:00:00')\n              const cardDueDate = new Date(dueDateString + 'T00:00:00')\n              const weekFromNow = new Date(todayDate)\n              weekFromNow.setDate(weekFromNow.getDate() + 7)\n              return cardDueDate >= todayDate && cardDueDate <= weekFromNow\n            case 'custom':\n              if (filters.dateRange) {\n                const due = typeof dueDate === 'string' ? new Date(dueDate) : dueDate\n                return (\n                  due >= filters.dateRange.start && due <= filters.dateRange.end\n                )\n              }\n              return true\n            default:\n              return true\n          }\n        })\n      }\n\n      if (filters.priorities.length > 0) {\n        filtered = filtered.filter(\n          (card) => card.priority && filters.priorities.includes(card.priority)\n        )\n      }\n\n      if (filters.assignees.length > 0) {\n        filtered = filtered.filter((card) => {\n          const cardAssignees = card.assignedUserIds || (card.assigneeId ? [card.assigneeId] : [])\n          return cardAssignees.some((id) => filters.assignees.includes(id))\n        })\n      }\n\n      if (filters.labels.length > 0) {\n        filtered = filtered.filter((card) => {\n          return (\n            card.labels &&\n            card.labels.some((label) => filters.labels.includes(label))\n          )\n        })\n      }\n\n      if (filters.columns.length > 0) {\n        filtered = filtered.filter((card) =>\n          filters.columns.includes(card.columnId)\n        )\n      }\n\n      if (sort.by !== 'none') {\n        filtered.sort((a, b) => {\n          let comparison = 0\n\n          switch (sort.by) {\n            case 'created':\n              const aCreated = a.createdAt ? new Date(a.createdAt).getTime() : 0\n              const bCreated = b.createdAt ? new Date(b.createdAt).getTime() : 0\n              comparison = aCreated - bCreated\n              break\n\n            case 'priority':\n              const priorityOrder = { URGENT: 4, HIGH: 3, MEDIUM: 2, LOW: 1 }\n              const aPriority = priorityOrder[a.priority || 'LOW']\n              const bPriority = priorityOrder[b.priority || 'LOW']\n              comparison = aPriority - bPriority\n              break\n\n            case 'dueDate':\n              const aDue = a.endDate || a.dueDate\n              const bDue = b.endDate || b.dueDate\n              if (!aDue) return 1\n              if (!bDue) return -1\n              const aTime = typeof aDue === 'string' ? new Date(aDue).getTime() : aDue.getTime()\n              const bTime = typeof bDue === 'string' ? new Date(bDue).getTime() : bDue.getTime()\n              comparison = aTime - bTime\n              break\n\n            case 'title':\n              comparison = a.title.localeCompare(b.title)\n              break\n\n            case 'estimate':\n              const aEst = a.estimatedTime || 0\n              const bEst = b.estimatedTime || 0\n              comparison = aEst - bEst\n              break\n\n            default:\n              comparison = 0\n          }\n\n          return sort.order === 'asc' ? comparison : -comparison\n        })\n      }\n\n      return filtered\n    },\n    [filters, sort]\n  )\n\n  return {\n    filters,\n    sort,\n    setFilters,\n    setSort,\n    resetFilters,\n    filterMyTasks,\n    filterOverdue,\n    filterHighPriority,\n    applyFilters,\n    hasActiveFilters,\n  }\n}\n","/**\n * useAI Hook\n * Optional AI features using Vercel AI SDK\n * Requires 'ai' package to be installed\n * @module hooks/useAI\n */\n\nimport { useCallback, useState } from 'react'\nimport type {\n  AICallbacks,\n  Board,\n  Card,\n  GeneratedPlan,\n  AssigneeSuggestion,\n  Insight,\n} from '../types'\n\nexport interface UseAIOptions {\n  /** API key for AI provider */\n  apiKey?: string\n  /** Model to use */\n  model?: 'gpt-4' | 'gpt-4-turbo' | 'claude-3-5-sonnet' | string\n  /** Custom API endpoint */\n  endpoint?: string\n  /** Base URL */\n  baseURL?: string\n}\n\nexport interface UseAIReturn extends AICallbacks {\n  /** Is AI available (SDK installed + API key provided) */\n  isAvailable: boolean\n  /** Is AI currently processing */\n  isLoading: boolean\n  /** Last error */\n  error: Error | null\n}\n\n// Try to import AI SDK (optional peer dependency)\nlet generateObject: any\nlet generateText: any\n\nif (typeof window !== 'undefined') {\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-var-requires\n    const aiSDK = require('ai')\n    generateObject = aiSDK.generateObject\n    generateText = aiSDK.generateText\n  } catch {\n    // AI SDK not installed\n  }\n}\n\n/**\n * Hook for AI features\n *\n * @example\n * ```tsx\n * const ai = useAI({\n *   apiKey: process.env.OPENAI_API_KEY,\n *   model: 'gpt-4-turbo'\n * })\n *\n * if (ai.isAvailable) {\n *   const plan = await ai.onGeneratePlan('Build a todo app')\n * }\n * ```\n */\nexport function useAI(options: UseAIOptions = {}): UseAIReturn {\n  const [isLoading, setIsLoading] = useState(false)\n  const [error, setError] = useState<Error | null>(null)\n\n  const isAvailable = Boolean(\n    generateObject && generateText && options.apiKey\n  )\n\n  // Generate plan from prompt\n  const onGeneratePlan = useCallback(\n    async (prompt: string): Promise<GeneratedPlan> => {\n      if (!isAvailable) {\n        throw new Error(\n          'AI features require the \"ai\" package and an API key. Install with: npm install ai'\n        )\n      }\n\n      setIsLoading(true)\n      setError(null)\n\n      try {\n        // This is a placeholder - actual implementation would use generateObject\n        // with proper schema definition using Zod\n        console.log('Generating plan for:', prompt)\n\n        // Example structure (would use real AI SDK)\n        const result: GeneratedPlan = {\n          columns: [\n            {\n              title: 'To Do',\n              position: 1000,\n              cardIds: [],\n            },\n            {\n              title: 'In Progress',\n              position: 2000,\n              cardIds: [],\n            },\n            {\n              title: 'Done',\n              position: 3000,\n              cardIds: [],\n            },\n          ],\n          cards: [\n            {\n              title: 'Generated task from AI',\n              description: `Based on: ${prompt}`,\n              position: 1000,\n              columnId: 'temp-col-1',\n            },\n          ],\n          explanation: 'This is a sample plan. Real implementation would use AI SDK.',\n        }\n\n        return result\n      } catch (err) {\n        const error =\n          err instanceof Error ? err : new Error('Failed to generate plan')\n        setError(error)\n        throw error\n      } finally {\n        setIsLoading(false)\n      }\n    },\n    [isAvailable]\n  )\n\n  // Suggest assignee for card\n  const onSuggestAssignee = useCallback(\n    async (card: Card): Promise<AssigneeSuggestion> => {\n      if (!isAvailable) {\n        throw new Error('AI features not available')\n      }\n\n      setIsLoading(true)\n      setError(null)\n\n      try {\n        // Placeholder implementation\n        console.log('Suggesting assignee for:', card.title)\n\n        return {\n          userId: 'user-123',\n          confidence: 0.85,\n          reasoning: 'Based on past performance and expertise',\n        }\n      } catch (err) {\n        const error =\n          err instanceof Error ? err : new Error('Failed to suggest assignee')\n        setError(error)\n        throw error\n      } finally {\n        setIsLoading(false)\n      }\n    },\n    [isAvailable]\n  )\n\n  // Predict risks\n  const onPredictRisks = useCallback(\n    async (_boardState: Board): Promise<Insight[]> => {\n      if (!isAvailable) {\n        throw new Error('AI features not available')\n      }\n\n      setIsLoading(true)\n      setError(null)\n\n      try {\n        console.log('Analyzing board for risks...')\n\n        // Placeholder insights\n        const insights: Insight[] = [\n          {\n            type: 'RISK_OVERLOAD',\n            severity: 'HIGH',\n            title: 'Column overload detected',\n            description: 'Too many cards in \"In Progress\"',\n            confidence: 0.9,\n            suggestedAction: 'Consider moving some cards back to \"To Do\"',\n          },\n        ]\n\n        return insights\n      } catch (err) {\n        const error =\n          err instanceof Error ? err : new Error('Failed to predict risks')\n        setError(error)\n        throw error\n      } finally {\n        setIsLoading(false)\n      }\n    },\n    [isAvailable]\n  )\n\n  // Generate subtasks\n  const onGenerateSubtasks = useCallback(\n    async (card: Card): Promise<Omit<Card, 'id'>[]> => {\n      if (!isAvailable) {\n        throw new Error('AI features not available')\n      }\n\n      setIsLoading(true)\n      setError(null)\n\n      try {\n        console.log('Generating subtasks for:', card.title)\n\n        return [\n          {\n            title: `Subtask 1 for: ${card.title}`,\n            position: card.position + 0.1,\n            columnId: card.columnId,\n          },\n          {\n            title: `Subtask 2 for: ${card.title}`,\n            position: card.position + 0.2,\n            columnId: card.columnId,\n          },\n        ]\n      } catch (err) {\n        const error =\n          err instanceof Error ? err : new Error('Failed to generate subtasks')\n        setError(error)\n        throw error\n      } finally {\n        setIsLoading(false)\n      }\n    },\n    [isAvailable]\n  )\n\n  // Estimate effort\n  const onEstimateEffort = useCallback(\n    async (\n      card: Card\n    ): Promise<{ hours: number; confidence: number }> => {\n      if (!isAvailable) {\n        throw new Error('AI features not available')\n      }\n\n      setIsLoading(true)\n      setError(null)\n\n      try {\n        console.log('Estimating effort for:', card.title)\n\n        return {\n          hours: 8,\n          confidence: 0.75,\n        }\n      } catch (err) {\n        const error =\n          err instanceof Error ? err : new Error('Failed to estimate effort')\n        setError(error)\n        throw error\n      } finally {\n        setIsLoading(false)\n      }\n    },\n    [isAvailable]\n  )\n\n  return {\n    onGeneratePlan,\n    onSuggestAssignee,\n    onPredictRisks,\n    onGenerateSubtasks,\n    onEstimateEffort,\n    isAvailable,\n    isLoading,\n    error,\n  }\n}\n","/**\n * useSelectionState - React hook for selection state management\n * @module hooks/useSelectionState\n *\n * Replacement for Jotai's useAtom(selectionStateAtom)\n */\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { selectionStore, type SelectionState } from '@libxai/core'\n\n/**\n * Hook return type\n */\nexport type UseSelectionStateReturn = [\n  state: SelectionState,\n  setState: (state: SelectionState) => void\n]\n\n/**\n * React hook for selection state\n *\n * Drop-in replacement for `useAtom(selectionStateAtom)`\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const [selectionState, setSelectionState] = useSelectionState()\n *\n *   const handleSelect = (cardId: string) => {\n *     setSelectionState({\n *       selectedCardIds: [cardId],\n *       lastSelectedCardId: cardId,\n *     })\n *   }\n *\n *   return (\n *     <div>\n *       {selectionState.selectedCardIds.length} cards selected\n *     </div>\n *   )\n * }\n * ```\n */\nexport function useSelectionState(): UseSelectionStateReturn {\n  const [state, setState] = useState<SelectionState>(() => selectionStore.getState())\n\n  useEffect(() => {\n    // Subscribe to store changes\n    const unsubscribe = selectionStore.subscribe((newState) => {\n      setState(newState)\n    })\n\n    return unsubscribe\n  }, [])\n\n  const setSelectionState = useCallback((newState: SelectionState) => {\n    selectionStore.setState(newState)\n  }, [])\n\n  return [state, setSelectionState]\n}\n","/**\n * Multi-select hook for bulk operations\n * Supports keyboard modifiers (Cmd/Ctrl, Shift) for selection\n * @module hooks/useMultiSelect\n */\n\nimport { useCallback } from 'react'\nimport { useSelectionState } from './useSelectionState'\nimport type { Card } from '../types'\n\nexport interface UseMultiSelectReturn {\n  /** Selected card IDs */\n  selectedCardIds: string[]\n  /** Last selected card ID */\n  lastSelectedCardId: string | null\n  /** Check if a card is selected */\n  isCardSelected: (cardId: string) => boolean\n  /** Select a card */\n  selectCard: (cardId: string, event?: React.MouseEvent) => void\n  /** Deselect a card */\n  deselectCard: (cardId: string) => void\n  /** Clear all selections */\n  clearSelection: () => void\n  /** Select all cards */\n  selectAll: () => void\n  /** Toggle card selection */\n  toggleCard: (cardId: string) => void\n  /** Get selected cards */\n  getSelectedCards: () => Card[]\n}\n\nexport interface UseMultiSelectOptions {\n  /** Board cards (required for range selection and selectAll) */\n  cards: Card[]\n}\n\n/**\n * Hook for multi-select functionality\n *\n * @param options - Configuration options\n */\nexport function useMultiSelect(options: UseMultiSelectOptions): UseMultiSelectReturn {\n  const { cards } = options\n  const [selectionState, setSelectionState] = useSelectionState()\n\n  const isCardSelected = useCallback(\n    (cardId: string) => {\n      return selectionState.selectedCardIds.includes(cardId)\n    },\n    [selectionState.selectedCardIds]\n  )\n\n  const selectCard = useCallback(\n    (cardId: string, event?: React.MouseEvent) => {\n      if (!event) {\n        // Simple selection without modifiers\n        setSelectionState({\n          selectedCardIds: [cardId],\n          lastSelectedCardId: cardId,\n        })\n        return\n      }\n\n      const isCtrlOrCmd = event.ctrlKey || event.metaKey\n      const isShift = event.shiftKey\n\n      if (isCtrlOrCmd) {\n        // Cmd/Ctrl+Click: Toggle card selection\n        if (selectionState.selectedCardIds.includes(cardId)) {\n          setSelectionState({\n            selectedCardIds: selectionState.selectedCardIds.filter((id) => id !== cardId),\n            lastSelectedCardId: selectionState.lastSelectedCardId,\n          })\n        } else {\n          setSelectionState({\n            selectedCardIds: [...selectionState.selectedCardIds, cardId],\n            lastSelectedCardId: cardId,\n          })\n        }\n      } else if (isShift && selectionState.lastSelectedCardId) {\n        // Shift+Click: Range selection within same column\n        const card = cards.find((c) => c.id === cardId)\n        const lastCard = cards.find((c) => c.id === selectionState.lastSelectedCardId)\n\n        if (card && lastCard && card.columnId === lastCard.columnId) {\n          // Get all cards in the column\n          const columnCards = cards\n            .filter((c) => c.columnId === card.columnId)\n            .sort((a, b) => a.position - b.position)\n\n          const startIndex = columnCards.findIndex((c) => c.id === selectionState.lastSelectedCardId)\n          const endIndex = columnCards.findIndex((c) => c.id === cardId)\n\n          const [minIndex, maxIndex] = startIndex < endIndex\n            ? [startIndex, endIndex]\n            : [endIndex, startIndex]\n\n          const rangeCardIds = columnCards\n            .slice(minIndex, maxIndex + 1)\n            .map((c) => c.id)\n\n          // Merge with existing selection\n          const newSelection = Array.from(\n            new Set([...selectionState.selectedCardIds, ...rangeCardIds])\n          )\n\n          setSelectionState({\n            selectedCardIds: newSelection,\n            lastSelectedCardId: cardId,\n          })\n        } else {\n          // Different column or no last selection - treat as regular selection\n          setSelectionState({\n            selectedCardIds: [cardId],\n            lastSelectedCardId: cardId,\n          })\n        }\n      } else {\n        // Regular click: Replace selection\n        setSelectionState({\n          selectedCardIds: [cardId],\n          lastSelectedCardId: cardId,\n        })\n      }\n    },\n    [cards, selectionState, setSelectionState]\n  )\n\n  const deselectCard = useCallback(\n    (cardId: string) => {\n      setSelectionState({\n        selectedCardIds: selectionState.selectedCardIds.filter((id) => id !== cardId),\n        lastSelectedCardId: selectionState.lastSelectedCardId,\n      })\n    },\n    [selectionState, setSelectionState]\n  )\n\n  const clearSelection = useCallback(() => {\n    setSelectionState({\n      selectedCardIds: [],\n      lastSelectedCardId: null,\n    })\n  }, [setSelectionState])\n\n  const selectAll = useCallback(() => {\n    setSelectionState({\n      selectedCardIds: cards.map((card) => card.id),\n      lastSelectedCardId: cards[cards.length - 1]?.id || null,\n    })\n  }, [cards, setSelectionState])\n\n  const toggleCard = useCallback(\n    (cardId: string) => {\n      if (selectionState.selectedCardIds.includes(cardId)) {\n        deselectCard(cardId)\n      } else {\n        setSelectionState({\n          selectedCardIds: [...selectionState.selectedCardIds, cardId],\n          lastSelectedCardId: cardId,\n        })\n      }\n    },\n    [selectionState, deselectCard, setSelectionState]\n  )\n\n  const getSelectedCards = useCallback(() => {\n    return cards.filter((card) =>\n      selectionState.selectedCardIds.includes(card.id)\n    )\n  }, [cards, selectionState.selectedCardIds])\n\n  return {\n    selectedCardIds: selectionState.selectedCardIds,\n    lastSelectedCardId: selectionState.lastSelectedCardId,\n    isCardSelected,\n    selectCard,\n    deselectCard,\n    clearSelection,\n    selectAll,\n    toggleCard,\n    getSelectedCards,\n  }\n}\n","/**\n * Card Stack Types\n * Smart grouping of related cards within columns\n * @module types/card-stack\n */\n\nexport type StackingStrategy = 'manual' | 'ai-similarity' | 'labels' | 'assignee' | 'priority' | 'epic'\n\nexport interface CardStack {\n  /** Unique stack identifier */\n  id: string\n  /** Display title for the stack */\n  title: string\n  /** Cards contained in this stack */\n  cardIds: string[]\n  /** Column this stack belongs to */\n  columnId: string\n  /** How this stack was created */\n  strategy: StackingStrategy\n  /** Visual color for the stack */\n  color?: string\n  /** Whether stack is expanded or collapsed */\n  isExpanded: boolean\n  /** Position within the column */\n  position: number\n  /** Timestamp when stack was created */\n  createdAt: Date\n  /** AI confidence score (0-1) for auto-stacked groups */\n  confidence?: number\n}\n\nexport interface StackingConfig {\n  /** Enable automatic AI-powered stacking */\n  enableAutoStacking: boolean\n  /** Minimum confidence threshold for auto-stacking (0-1) */\n  autoStackConfidenceThreshold: number\n  /** Minimum cards required to form a stack */\n  minCardsPerStack: number\n  /** Enable manual drag-to-stack */\n  enableManualStacking: boolean\n  /** Show stack summaries (card count, assignees, etc.) */\n  showStackSummaries: boolean\n  /** Animation duration in ms */\n  animationDuration: number\n}\n\nexport interface StackSuggestion {\n  /** Suggested stack configuration */\n  stack: Omit<CardStack, 'id' | 'createdAt' | 'isExpanded' | 'position'>\n  /** Reason for suggestion */\n  reason: string\n  /** Confidence score (0-1) */\n  confidence: number\n}\n\nexport const DEFAULT_STACKING_CONFIG: StackingConfig = {\n  enableAutoStacking: true,\n  autoStackConfidenceThreshold: 0.7,\n  minCardsPerStack: 2,\n  enableManualStacking: true,\n  showStackSummaries: true,\n  animationDuration: 200,\n}\n","/**\r\n * useCardStacking Hook\r\n * Manages card stack state and AI-powered grouping suggestions\r\n * @module hooks/useCardStacking\r\n */\r\n\r\nimport { useState, useCallback, useMemo, useEffect } from 'react'\r\nimport type { Card } from '../types'\r\nimport type { CardStack, StackingConfig, StackSuggestion, StackingStrategy } from '../types/card-stack'\r\nimport { DEFAULT_STACKING_CONFIG } from '../types/card-stack'\r\n\r\nexport interface UseCardStackingOptions {\r\n  /** Board cards */\r\n  cards: Card[]\r\n  /** Configuration */\r\n  config?: Partial<StackingConfig>\r\n  /** AI service for similarity detection (optional) */\r\n  aiService?: {\r\n    findSimilar: (card: Card, candidates: Card[]) => Promise<{ card: Card; similarity: number }[]>\r\n  }\r\n}\r\n\r\nexport interface UseCardStackingResult {\r\n  /** All card stacks */\r\n  stacks: CardStack[]\r\n  /** Create a new stack */\r\n  createStack: (\r\n    title: string,\r\n    cardIds: string[],\r\n    columnId: string,\r\n    strategy: StackingStrategy,\r\n    color?: string\r\n  ) => void\r\n  /** Delete a stack */\r\n  deleteStack: (stackId: string) => void\r\n  /** Toggle stack expand/collapse */\r\n  toggleStack: (stackId: string) => void\r\n  /** Add card to stack */\r\n  addToStack: (stackId: string, cardId: string) => void\r\n  /** Remove card from stack */\r\n  removeFromStack: (stackId: string, cardId: string) => void\r\n  /** Get stacks for a specific column */\r\n  getStacksForColumn: (columnId: string) => CardStack[]\r\n  /** Get AI-powered stack suggestions */\r\n  getSuggestions: (columnId: string) => Promise<StackSuggestion[]>\r\n  /** Apply a suggestion */\r\n  applySuggestion: (suggestion: StackSuggestion) => void\r\n  /** Configuration */\r\n  config: StackingConfig\r\n}\r\n\r\n/**\r\n * Hook for managing card stacking\r\n */\r\nexport function useCardStacking(options: UseCardStackingOptions): UseCardStackingResult {\r\n  const { cards, config: userConfig, aiService } = options\r\n\r\n  // Merge config with defaults\r\n  const config = useMemo<StackingConfig>(\r\n    () => ({\r\n      ...DEFAULT_STACKING_CONFIG,\r\n      ...userConfig,\r\n    }),\r\n    [userConfig]\r\n  )\r\n\r\n  // Stack state\r\n  const [stacks, setStacks] = useState<CardStack[]>([])\r\n\r\n  // Create stack\r\n  const createStack = useCallback(\r\n    (title: string, cardIds: string[], columnId: string, strategy: StackingStrategy, color?: string) => {\r\n      if (cardIds.length < config.minCardsPerStack) {\r\n        console.warn(`Cannot create stack: minimum ${config.minCardsPerStack} cards required`)\r\n        return\r\n      }\r\n\r\n      const newStack: CardStack = {\r\n        id: `stack-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n        title,\r\n        cardIds,\r\n        columnId,\r\n        strategy,\r\n        color,\r\n        isExpanded: true,\r\n        position: stacks.filter((s) => s.columnId === columnId).length,\r\n        createdAt: new Date(),\r\n      }\r\n\r\n      setStacks((prev) => [...prev, newStack])\r\n    },\r\n    [config.minCardsPerStack, stacks]\r\n  )\r\n\r\n  // Delete stack\r\n  const deleteStack = useCallback((stackId: string) => {\r\n    setStacks((prev) => prev.filter((s) => s.id !== stackId))\r\n  }, [])\r\n\r\n  // Toggle expand/collapse\r\n  const toggleStack = useCallback((stackId: string) => {\r\n    setStacks((prev) =>\r\n      prev.map((s) => (s.id === stackId ? { ...s, isExpanded: !s.isExpanded } : s))\r\n    )\r\n  }, [])\r\n\r\n  // Add card to stack\r\n  const addToStack = useCallback((stackId: string, cardId: string) => {\r\n    setStacks((prev) =>\r\n      prev.map((s) => {\r\n        if (s.id === stackId && !s.cardIds.includes(cardId)) {\r\n          return { ...s, cardIds: [...s.cardIds, cardId] }\r\n        }\r\n        return s\r\n      })\r\n    )\r\n  }, [])\r\n\r\n  // Remove card from stack\r\n  const removeFromStack = useCallback(\r\n    (stackId: string, cardId: string) => {\r\n      setStacks((prev) =>\r\n        prev\r\n          .map((s) => {\r\n            if (s.id === stackId) {\r\n              const newCardIds = s.cardIds.filter((id) => id !== cardId)\r\n              // If stack has too few cards, delete it\r\n              if (newCardIds.length < config.minCardsPerStack) {\r\n                return null\r\n              }\r\n              return { ...s, cardIds: newCardIds }\r\n            }\r\n            return s\r\n          })\r\n          .filter((s): s is CardStack => s !== null)\r\n      )\r\n    },\r\n    [config.minCardsPerStack]\r\n  )\r\n\r\n  // Get stacks for column\r\n  const getStacksForColumn = useCallback(\r\n    (columnId: string) => {\r\n      return stacks.filter((s) => s.columnId === columnId).sort((a, b) => a.position - b.position)\r\n    },\r\n    [stacks]\r\n  )\r\n\r\n  // Generate AI suggestions\r\n  const getSuggestions = useCallback(\r\n    async (columnId: string): Promise<StackSuggestion[]> => {\r\n      const columnCards = cards.filter((c) => c.columnId === columnId)\r\n\r\n      if (columnCards.length < config.minCardsPerStack * 2) {\r\n        return []\r\n      }\r\n\r\n      const suggestions: StackSuggestion[] = []\r\n\r\n      // 1. Group by labels\r\n      const byLabels = new Map<string, Card[]>()\r\n      columnCards.forEach((card) => {\r\n        if (card.labels && card.labels.length > 0) {\r\n          card.labels.forEach((label) => {\r\n            if (!byLabels.has(label)) {\r\n              byLabels.set(label, [])\r\n            }\r\n            byLabels.get(label)!.push(card)\r\n          })\r\n        }\r\n      })\r\n\r\n      byLabels.forEach((cards, label) => {\r\n        if (cards.length >= config.minCardsPerStack) {\r\n          suggestions.push({\r\n            stack: {\r\n              title: `📌 ${label}`,\r\n              cardIds: cards.map((c) => c.id),\r\n              columnId,\r\n              strategy: 'labels',\r\n              color: '#00E5CC',\r\n            },\r\n            reason: `${cards.length} cards with label \"${label}\"`,\r\n            confidence: 0.85,\r\n          })\r\n        }\r\n      })\r\n\r\n      // 2. Group by assignee\r\n      const byAssignee = new Map<string, Card[]>()\r\n      columnCards.forEach((card) => {\r\n        if (card.assignedUserIds && card.assignedUserIds.length > 0) {\r\n          card.assignedUserIds.forEach((userId) => {\r\n            if (!byAssignee.has(userId)) {\r\n              byAssignee.set(userId, [])\r\n            }\r\n            byAssignee.get(userId)!.push(card)\r\n          })\r\n        }\r\n      })\r\n\r\n      byAssignee.forEach((cards, userId) => {\r\n        if (cards.length >= config.minCardsPerStack) {\r\n          suggestions.push({\r\n            stack: {\r\n              title: `👤 Assigned to user-${userId.slice(-4)}`,\r\n              cardIds: cards.map((c) => c.id),\r\n              columnId,\r\n              strategy: 'assignee',\r\n              color: '#8b5cf6',\r\n            },\r\n            reason: `${cards.length} cards assigned to the same user`,\r\n            confidence: 0.8,\r\n          })\r\n        }\r\n      })\r\n\r\n      // 3. Group by priority\r\n      const byPriority = new Map<string, Card[]>()\r\n      columnCards.forEach((card) => {\r\n        if (card.priority) {\r\n          if (!byPriority.has(card.priority)) {\r\n            byPriority.set(card.priority, [])\r\n          }\r\n          byPriority.get(card.priority)!.push(card)\r\n        }\r\n      })\r\n\r\n      byPriority.forEach((cards, priority) => {\r\n        if (cards.length >= config.minCardsPerStack) {\r\n          const priorityEmoji = {\r\n            low: '🟢',\r\n            medium: '🟡',\r\n            high: '🔴',\r\n            urgent: '🚨',\r\n          }[priority.toLowerCase()] || '⚪'\r\n\r\n          suggestions.push({\r\n            stack: {\r\n              title: `${priorityEmoji} ${priority} Priority`,\r\n              cardIds: cards.map((c) => c.id),\r\n              columnId,\r\n              strategy: 'priority',\r\n              color: priority === 'high' || priority === 'urgent' ? '#ef4444' : '#10b981',\r\n            },\r\n            reason: `${cards.length} cards with ${priority} priority`,\r\n            confidence: 0.75,\r\n          })\r\n        }\r\n      })\r\n\r\n      // 4. AI-powered similarity (if available)\r\n      if (aiService && config.enableAutoStacking) {\r\n        // Find similar cards using AI\r\n        for (const card of columnCards) {\r\n          const similar = await aiService.findSimilar(card, columnCards)\r\n          const highSimilarity = similar.filter(\r\n            (s) => s.similarity >= config.autoStackConfidenceThreshold\r\n          )\r\n\r\n          if (highSimilarity.length >= config.minCardsPerStack - 1) {\r\n            const cardIds = [card.id, ...highSimilarity.map((s) => s.card.id)]\r\n            const avgConfidence =\r\n              highSimilarity.reduce((sum, s) => sum + s.similarity, 0) / highSimilarity.length\r\n\r\n            suggestions.push({\r\n              stack: {\r\n                title: `✨ Similar to \"${card.title.substring(0, 30)}${card.title.length > 30 ? '...' : ''}\"`,\r\n                cardIds,\r\n                columnId,\r\n                strategy: 'ai-similarity',\r\n                color: '#f59e0b',\r\n              },\r\n              reason: `AI detected ${highSimilarity.length + 1} similar tasks`,\r\n              confidence: avgConfidence,\r\n            })\r\n          }\r\n        }\r\n      }\r\n\r\n      // Filter by confidence threshold and remove duplicates\r\n      return suggestions\r\n        .filter((s) => s.confidence >= config.autoStackConfidenceThreshold)\r\n        .sort((a, b) => b.confidence - a.confidence)\r\n        .slice(0, 5) // Top 5 suggestions\r\n    },\r\n    [cards, config, aiService]\r\n  )\r\n\r\n  // Apply suggestion\r\n  const applySuggestion = useCallback(\r\n    (suggestion: StackSuggestion) => {\r\n      createStack(\r\n        suggestion.stack.title,\r\n        suggestion.stack.cardIds,\r\n        suggestion.stack.columnId,\r\n        suggestion.stack.strategy,\r\n        suggestion.stack.color\r\n      )\r\n    },\r\n    [createStack]\r\n  )\r\n\r\n  // Auto-stack on mount if enabled\r\n  useEffect(() => {\r\n    if (config.enableAutoStacking && stacks.length === 0) {\r\n      // Auto-stack each column\r\n      const columnIds = new Set(cards.map((c) => c.columnId))\r\n      columnIds.forEach(async (columnId) => {\r\n        const suggestions = await getSuggestions(columnId)\r\n        // Auto-apply highest confidence suggestion\r\n        const topSuggestion = suggestions[0]\r\n        if (suggestions.length > 0 && topSuggestion && topSuggestion.confidence >= 0.9) {\r\n          applySuggestion(topSuggestion)\r\n        }\r\n      })\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []) // Only on mount\r\n\r\n  return {\r\n    stacks,\r\n    createStack,\r\n    deleteStack,\r\n    toggleStack,\r\n    addToStack,\r\n    removeFromStack,\r\n    getStacksForColumn,\r\n    getSuggestions,\r\n    applySuggestion,\r\n    config,\r\n  }\r\n}\r\n","/**\n * BoardProvider - React Context Provider for BoardStore\n * @module adapters/react\n */\n\nimport React, { createContext, useContext, useEffect, useRef } from 'react'\nimport { BoardStore, type BoardState, type CardData, type ColumnData, type BoardData } from '@libxai/core'\n\n/**\n * Board Context\n */\ninterface BoardContextValue {\n  store: BoardStore\n}\n\nconst BoardContext = createContext<BoardContextValue | null>(null)\n\n/**\n * Board Provider Props\n */\nexport interface BoardProviderProps {\n  children: React.ReactNode\n  initialData?: {\n    board?: BoardData\n    columns?: ColumnData[]\n    cards?: CardData[]\n  }\n  onStateChange?: (state: BoardState) => void\n}\n\n/**\n * BoardProvider component\n *\n * Wraps your app with BoardStore context\n *\n * @example\n * ```tsx\n * <BoardProvider initialData={{ columns: [], cards: [] }}>\n *   <Board />\n * </BoardProvider>\n * ```\n */\nexport function BoardProvider({ children, initialData, onStateChange }: BoardProviderProps) {\n  // Create store only once\n  const storeRef = useRef<BoardStore>()\n\n  if (!storeRef.current) {\n    // Initialize store\n    const columnsMap = new Map()\n    const cardsMap = new Map()\n\n    // Load initial columns\n    initialData?.columns?.forEach(colData => {\n      const { Column } = require('@libxai/core')\n      columnsMap.set(colData.id, new Column(colData))\n    })\n\n    // Load initial cards\n    initialData?.cards?.forEach(cardData => {\n      const { Card } = require('@libxai/core')\n      cardsMap.set(cardData.id, new Card(cardData))\n    })\n\n    // Load initial board\n    let board = null\n    if (initialData?.board) {\n      const { Board } = require('@libxai/core')\n      board = new Board(initialData.board)\n    }\n\n    storeRef.current = new BoardStore({\n      board,\n      columns: columnsMap,\n      cards: cardsMap,\n    })\n  }\n\n  const store = storeRef.current\n\n  // Subscribe to state changes\n  useEffect(() => {\n    if (!onStateChange) return\n\n    return store.subscribeAll((_event) => {\n      onStateChange(store.getState())\n    })\n  }, [store, onStateChange])\n\n  return (\n    <BoardContext.Provider value={{ store }}>\n      {children}\n    </BoardContext.Provider>\n  )\n}\n\n/**\n * Hook to access BoardStore from context\n *\n * @throws Error if used outside BoardProvider\n */\nexport function useBoardStore(): BoardStore {\n  const context = useContext(BoardContext)\n\n  if (!context) {\n    throw new Error('useBoardStore must be used within BoardProvider')\n  }\n\n  return context.store\n}\n","/**\n * useBoard - Main hook for board operations\n * @module adapters/react\n */\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { useBoardStore } from './BoardProvider'\nimport type { Board, Column, Card, CardData, ColumnData } from '@libxai/core'\n\n/**\n * Return type for useBoard hook\n */\nexport interface UseBoardReturn {\n  // State\n  board: Board | null\n  columns: Column[]\n  cards: Card[]\n\n  // Board operations\n  updateBoard: (changes: Partial<Omit<import('@libxai/core').BoardData, 'id' | 'createdAt'>>) => void\n\n  // Column operations\n  addColumn: (columnData: Omit<ColumnData, 'createdAt' | 'updatedAt'>) => void\n  updateColumn: (columnId: string, changes: Partial<Omit<ColumnData, 'id' | 'createdAt'>>) => void\n  deleteColumn: (columnId: string) => void\n  getColumn: (columnId: string) => Column | undefined\n\n  // Card operations\n  addCard: (cardData: Omit<CardData, 'createdAt' | 'updatedAt'>) => void\n  updateCard: (cardId: string, changes: Partial<Omit<CardData, 'id' | 'createdAt'>>) => void\n  deleteCard: (cardId: string) => void\n  moveCard: (cardId: string, toColumnId: string, newPosition: number) => void\n  getCard: (cardId: string) => Card | undefined\n  getCardsByColumn: (columnId: string) => Card[]\n}\n\n/**\n * Main hook for board operations\n *\n * Provides reactive state and methods for managing board, columns, and cards\n *\n * @example\n * ```tsx\n * function MyBoard() {\n *   const { board, columns, cards, addCard, moveCard } = useBoard()\n *\n *   return (\n *     <div>\n *       {columns.map(column => (\n *         <div key={column.id}>\n *           <h2>{column.title}</h2>\n *           {cards\n *             .filter(card => card.columnId === column.id)\n *             .map(card => (\n *               <div key={card.id}>{card.title}</div>\n *             ))}\n *         </div>\n *       ))}\n *     </div>\n *   )\n * }\n * ```\n */\nexport function useBoard(): UseBoardReturn {\n  const store = useBoardStore()\n\n  // Reactive state\n  const [board, setBoard] = useState<Board | null>(store.getBoard())\n  const [columns, setColumns] = useState<Column[]>(store.getAllColumns())\n  const [cards, setCards] = useState<Card[]>(store.getAllCards())\n\n  // Subscribe to store changes\n  useEffect(() => {\n    const unsubscribe = store.subscribeAll(() => {\n      setBoard(store.getBoard())\n      setColumns(store.getAllColumns())\n      setCards(store.getAllCards())\n    })\n\n    return unsubscribe\n  }, [store])\n\n  // Board operations\n  const updateBoard = useCallback(\n    (changes: Partial<Omit<import('@libxai/core').BoardData, 'id' | 'createdAt'>>) => {\n      store.updateBoard(changes)\n    },\n    [store]\n  )\n\n  // Column operations\n  const addColumn = useCallback(\n    (columnData: Omit<ColumnData, 'createdAt' | 'updatedAt'>) => {\n      store.addColumn(columnData)\n    },\n    [store]\n  )\n\n  const updateColumn = useCallback(\n    (columnId: string, changes: Partial<Omit<ColumnData, 'id' | 'createdAt'>>) => {\n      store.updateColumn(columnId, changes)\n    },\n    [store]\n  )\n\n  const deleteColumn = useCallback(\n    (columnId: string) => {\n      store.deleteColumn(columnId)\n    },\n    [store]\n  )\n\n  const getColumn = useCallback(\n    (columnId: string) => {\n      return store.getColumn(columnId)\n    },\n    [store]\n  )\n\n  // Card operations\n  const addCard = useCallback(\n    (cardData: Omit<CardData, 'createdAt' | 'updatedAt'>) => {\n      store.addCard(cardData)\n    },\n    [store]\n  )\n\n  const updateCard = useCallback(\n    (cardId: string, changes: Partial<Omit<CardData, 'id' | 'createdAt'>>) => {\n      store.updateCard(cardId, changes)\n    },\n    [store]\n  )\n\n  const deleteCard = useCallback(\n    (cardId: string) => {\n      store.deleteCard(cardId)\n    },\n    [store]\n  )\n\n  const moveCard = useCallback(\n    (cardId: string, toColumnId: string, newPosition: number) => {\n      store.moveCard(cardId, toColumnId, newPosition)\n    },\n    [store]\n  )\n\n  const getCard = useCallback(\n    (cardId: string) => {\n      return store.getCard(cardId)\n    },\n    [store]\n  )\n\n  const getCardsByColumn = useCallback(\n    (columnId: string) => {\n      return store.getCardsByColumn(columnId)\n    },\n    [store]\n  )\n\n  return {\n    // State\n    board,\n    columns,\n    cards,\n\n    // Board operations\n    updateBoard,\n\n    // Column operations\n    addColumn,\n    updateColumn,\n    deleteColumn,\n    getColumn,\n\n    // Card operations\n    addCard,\n    updateCard,\n    deleteCard,\n    moveCard,\n    getCard,\n    getCardsByColumn,\n  }\n}\n","/**\n * useFilteredCards - Hook for filtering cards with memoization\n * @module adapters/react\n */\n\nimport { useMemo } from 'react'\nimport { useBoard } from './useBoard'\nimport type { Card, Priority, CardStatus } from '@libxai/core'\n\n/**\n * Filter options for cards\n */\nexport interface CardFilters {\n  searchQuery?: string\n  priorities?: Priority[]\n  statuses?: CardStatus[]\n  assignedUserIds?: string[]\n  labels?: string[]\n  columnIds?: string[]\n  isOverdue?: boolean\n}\n\n/**\n * Hook for filtered and sorted cards\n *\n * Automatically memoizes results for performance\n *\n * @param filters - Filter criteria\n * @returns Filtered cards array\n *\n * @example\n * ```tsx\n * function CardList() {\n *   const filteredCards = useFilteredCards({\n *     priorities: ['HIGH', 'URGENT'],\n *     isOverdue: true\n *   })\n *\n *   return <div>{filteredCards.length} urgent overdue tasks</div>\n * }\n * ```\n */\nexport function useFilteredCards(filters?: CardFilters): Card[] {\n  const { cards } = useBoard()\n\n  return useMemo(() => {\n    if (!filters) return cards\n\n    return cards.filter(card => {\n      // Search query (title + description)\n      if (filters.searchQuery) {\n        const query = filters.searchQuery.toLowerCase()\n        const matchesTitle = card.title.toLowerCase().includes(query)\n        const matchesDesc = card.description?.toLowerCase().includes(query)\n        if (!matchesTitle && !matchesDesc) return false\n      }\n\n      // Priority filter\n      if (filters.priorities && filters.priorities.length > 0) {\n        if (!card.priority || !filters.priorities.includes(card.priority)) {\n          return false\n        }\n      }\n\n      // Status filter\n      if (filters.statuses && filters.statuses.length > 0) {\n        if (!card.status || !filters.statuses.includes(card.status)) {\n          return false\n        }\n      }\n\n      // Assigned users filter\n      if (filters.assignedUserIds && filters.assignedUserIds.length > 0) {\n        const hasAssignedUser = filters.assignedUserIds.some(userId =>\n          card.isAssignedTo(userId)\n        )\n        if (!hasAssignedUser) return false\n      }\n\n      // Labels filter\n      if (filters.labels && filters.labels.length > 0) {\n        const hasLabel = filters.labels.some(label => card.hasLabel(label))\n        if (!hasLabel) return false\n      }\n\n      // Column filter\n      if (filters.columnIds && filters.columnIds.length > 0) {\n        if (!filters.columnIds.includes(card.columnId)) {\n          return false\n        }\n      }\n\n      // Overdue filter\n      if (filters.isOverdue !== undefined) {\n        if (filters.isOverdue !== card.isOverdue()) {\n          return false\n        }\n      }\n\n      return true\n    })\n  }, [cards, filters])\n}\n\n/**\n * Hook for sorted cards\n *\n * @param sortBy - Sort field\n * @param sortOrder - Sort order ('asc' | 'desc')\n * @returns Sorted cards array\n */\nexport function useSortedCards(\n  sortBy: 'title' | 'priority' | 'createdAt' | 'updatedAt' | 'position' = 'position',\n  sortOrder: 'asc' | 'desc' = 'asc'\n): Card[] {\n  const { cards } = useBoard()\n\n  return useMemo(() => {\n    const sorted = [...cards].sort((a, b) => {\n      let comparison = 0\n\n      switch (sortBy) {\n        case 'title':\n          comparison = a.title.localeCompare(b.title)\n          break\n        case 'priority': {\n          const priorityOrder = { URGENT: 4, HIGH: 3, MEDIUM: 2, LOW: 1 }\n          const aPriority = a.priority ? priorityOrder[a.priority] : 0\n          const bPriority = b.priority ? priorityOrder[b.priority] : 0\n          comparison = aPriority - bPriority\n          break\n        }\n        case 'createdAt':\n          comparison = a.createdAt.getTime() - b.createdAt.getTime()\n          break\n        case 'updatedAt':\n          comparison = a.updatedAt.getTime() - b.updatedAt.getTime()\n          break\n        case 'position':\n          comparison = a.position - b.position\n          break\n      }\n\n      return sortOrder === 'asc' ? comparison : -comparison\n    })\n\n    return sorted\n  }, [cards, sortBy, sortOrder])\n}\n","/**\n * Plugin Manager Implementation\n * Manages plugin lifecycle and execution\n * @module plugins/PluginManager\n */\n\nimport type { Plugin, PluginContext, IPluginManager } from './types'\nimport { logger } from '../utils/logger'\n\nexport class PluginManager implements IPluginManager {\n  private plugins: Map<string, Plugin> = new Map()\n  private enabled: Set<string> = new Set()\n  private config: Map<string, Record<string, any>> = new Map()\n  private context: PluginContext | null = null\n  private pluginLogger = logger.child('PluginManager')\n\n  /**\n   * Set plugin context (board state, callbacks, etc.)\n   */\n  setContext(context: PluginContext): void {\n    this.context = context\n  }\n\n  /**\n   * Register a plugin\n   */\n  register(plugin: Plugin): void {\n    // Validate plugin\n    if (!plugin.id || !plugin.name || !plugin.version) {\n      throw new Error('Plugin must have id, name, and version')\n    }\n\n    if (this.plugins.has(plugin.id)) {\n      this.pluginLogger.warn(`Plugin ${plugin.id} is already registered, overwriting...`)\n    }\n\n    // Check dependencies\n    if (plugin.dependencies) {\n      for (const depId of plugin.dependencies) {\n        if (!this.plugins.has(depId)) {\n          throw new Error(`Plugin ${plugin.id} depends on ${depId} which is not registered`)\n        }\n      }\n    }\n\n    // Store plugin\n    this.plugins.set(plugin.id, plugin)\n\n    // Set default config\n    if (plugin.defaultConfig) {\n      this.config.set(plugin.id, { ...plugin.defaultConfig })\n    }\n\n    // Enable by default\n    this.enabled.add(plugin.id)\n\n    this.pluginLogger.info(`Plugin registered: ${plugin.name} v${plugin.version}`)\n\n    // Call onInit hook\n    if (plugin.onInit && this.context) {\n      Promise.resolve(plugin.onInit(this.context)).catch((error) => {\n        this.pluginLogger.error(`Failed to initialize plugin ${plugin.id}`, error, {\n          plugin: plugin.id,\n        })\n      })\n    }\n  }\n\n  /**\n   * Unregister a plugin\n   */\n  unregister(pluginId: string): void {\n    const plugin = this.plugins.get(pluginId)\n\n    if (!plugin) {\n      this.pluginLogger.warn(`Plugin ${pluginId} is not registered`)\n      return\n    }\n\n    // Call onDestroy hook\n    if (plugin.onDestroy) {\n      Promise.resolve(plugin.onDestroy()).catch((error) => {\n        this.pluginLogger.error(`Failed to destroy plugin ${pluginId}`, error)\n      })\n    }\n\n    this.plugins.delete(pluginId)\n    this.enabled.delete(pluginId)\n    this.config.delete(pluginId)\n\n    this.pluginLogger.info(`Plugin unregistered: ${plugin.name}`)\n  }\n\n  /**\n   * Get registered plugin\n   */\n  getPlugin(pluginId: string): Plugin | undefined {\n    return this.plugins.get(pluginId)\n  }\n\n  /**\n   * Get all registered plugins\n   */\n  getPlugins(): Plugin[] {\n    return Array.from(this.plugins.values())\n  }\n\n  /**\n   * Check if plugin is registered\n   */\n  hasPlugin(pluginId: string): boolean {\n    return this.plugins.has(pluginId)\n  }\n\n  /**\n   * Enable/disable plugin\n   */\n  setEnabled(pluginId: string, enabled: boolean): void {\n    if (!this.plugins.has(pluginId)) {\n      throw new Error(`Plugin ${pluginId} is not registered`)\n    }\n\n    if (enabled) {\n      this.enabled.add(pluginId)\n      this.pluginLogger.info(`Plugin enabled: ${pluginId}`)\n    } else {\n      this.enabled.delete(pluginId)\n      this.pluginLogger.info(`Plugin disabled: ${pluginId}`)\n    }\n  }\n\n  /**\n   * Check if plugin is enabled\n   */\n  isEnabled(pluginId: string): boolean {\n    return this.enabled.has(pluginId)\n  }\n\n  /**\n   * Get plugin config\n   */\n  getConfig<T = any>(pluginId: string, key: string): T | undefined {\n    const config = this.config.get(pluginId)\n    return config?.[key] as T | undefined\n  }\n\n  /**\n   * Set plugin config\n   */\n  setConfig(pluginId: string, key: string, value: any): void {\n    if (!this.config.has(pluginId)) {\n      this.config.set(pluginId, {})\n    }\n\n    const config = this.config.get(pluginId)!\n    config[key] = value\n\n    this.pluginLogger.debug(`Plugin config set: ${pluginId}.${key}`, { value })\n  }\n\n  /**\n   * Execute plugin hooks\n   */\n  async executeHook<T = any>(\n    hookName: keyof Plugin,\n    args: any[],\n    defaultValue?: T\n  ): Promise<T | undefined> {\n    let result: T | undefined = defaultValue\n\n    for (const plugin of this.plugins.values()) {\n      if (!this.enabled.has(plugin.id)) {\n        continue\n      }\n\n      const hook = plugin[hookName] as any\n\n      if (typeof hook === 'function') {\n        try {\n          const hookResult = await Promise.resolve(hook.apply(plugin, args))\n\n          // For transform hooks, use the result as input for next plugin\n          if (hookResult !== undefined) {\n            result = hookResult\n            args[0] = hookResult // Update first argument for next plugin\n          }\n        } catch (error) {\n          this.pluginLogger.error(`Plugin hook failed: ${plugin.id}.${hookName}`, error as Error, {\n            plugin: plugin.id,\n            hook: hookName,\n          })\n        }\n      }\n    }\n\n    return result\n  }\n\n  /**\n   * Execute plugin hooks in parallel\n   */\n  async executeHookParallel(hookName: keyof Plugin, args: any[]): Promise<void> {\n    const promises: Promise<any>[] = []\n\n    for (const plugin of this.plugins.values()) {\n      if (!this.enabled.has(plugin.id)) {\n        continue\n      }\n\n      const hook = plugin[hookName] as any\n\n      if (typeof hook === 'function') {\n        promises.push(\n          Promise.resolve(hook.apply(plugin, args)).catch((error) => {\n            this.pluginLogger.error(`Plugin hook failed: ${plugin.id}.${hookName}`, error as Error, {\n              plugin: plugin.id,\n              hook: hookName,\n            })\n          })\n        )\n      }\n    }\n\n    await Promise.all(promises)\n  }\n}\n\n/**\n * Global plugin manager instance\n */\nexport const pluginManager = new PluginManager()\n","/**\n * VirtualList - Virtual scrolling component for large lists\n * @module components/VirtualList\n */\n\nimport React, { useRef } from 'react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\n\nexport interface VirtualListProps<T> {\n  /** Array of items to render */\n  items: T[]\n  /** Height of the scrollable container in pixels */\n  height: number | string\n  /** Estimated size of each item in pixels */\n  estimateSize: number\n  /** Render function for each item */\n  renderItem: (item: T, index: number) => React.ReactNode\n  /** Optional className for the container */\n  className?: string\n  /** Overscan count (number of items to render outside viewport) */\n  overscan?: number\n  /** Enable horizontal scrolling instead of vertical */\n  horizontal?: boolean\n  /** Optional gap between items in pixels */\n  gap?: number\n  /** Optional key extractor function */\n  getItemKey?: (item: T, index: number) => string | number\n}\n\n/**\n * VirtualList component for efficient rendering of large lists\n *\n * Uses @tanstack/react-virtual for windowing/virtualization\n *\n * @example\n * ```tsx\n * <VirtualList\n *   items={cards}\n *   height={600}\n *   estimateSize={100}\n *   renderItem={(card) => <CardComponent card={card} />}\n *   getItemKey={(card) => card.id}\n * />\n * ```\n */\nexport function VirtualList<T>({\n  items,\n  height,\n  estimateSize,\n  renderItem,\n  className = '',\n  overscan = 5,\n  horizontal = false,\n  gap = 0,\n  getItemKey,\n}: VirtualListProps<T>) {\n  const parentRef = useRef<HTMLDivElement>(null)\n\n  const virtualizer = useVirtualizer({\n    count: items.length,\n    getScrollElement: () => parentRef.current,\n    estimateSize: () => estimateSize,\n    overscan,\n    horizontal,\n    gap,\n  })\n\n  const virtualItems = virtualizer.getVirtualItems()\n\n  const containerStyle: React.CSSProperties = {\n    height: typeof height === 'number' ? `${height}px` : height,\n    width: '100%',\n    overflow: 'auto',\n    position: 'relative',\n  }\n\n  const innerStyle: React.CSSProperties = horizontal\n    ? {\n        width: `${virtualizer.getTotalSize()}px`,\n        height: '100%',\n        position: 'relative',\n      }\n    : {\n        height: `${virtualizer.getTotalSize()}px`,\n        width: '100%',\n        position: 'relative',\n      }\n\n  return (\n    <div ref={parentRef} style={containerStyle} className={className}>\n      <div style={innerStyle}>\n        {virtualItems.map((virtualItem) => {\n          const item = items[virtualItem.index]\n          if (!item) return null\n          const key = getItemKey ? getItemKey(item, virtualItem.index) : virtualItem.index\n\n          const itemStyle: React.CSSProperties = {\n            position: 'absolute',\n            top: horizontal ? 0 : virtualItem.start,\n            left: horizontal ? virtualItem.start : 0,\n            width: horizontal ? virtualItem.size : '100%',\n            height: horizontal ? '100%' : virtualItem.size,\n          }\n\n          return (\n            <div key={key} style={itemStyle} data-index={virtualItem.index}>\n              {renderItem(item, virtualItem.index)}\n            </div>\n          )\n        })}\n      </div>\n    </div>\n  )\n}\n\n/**\n * Hook to access virtualizer instance for advanced use cases\n */\nexport function useVirtualList<T>(options: {\n  items: T[]\n  scrollElement: HTMLElement | null\n  estimateSize: number\n  overscan?: number\n  horizontal?: boolean\n  gap?: number\n}) {\n  return useVirtualizer({\n    count: options.items.length,\n    getScrollElement: () => options.scrollElement,\n    estimateSize: () => options.estimateSize,\n    overscan: options.overscan ?? 5,\n    horizontal: options.horizontal ?? false,\n    gap: options.gap ?? 0,\n  })\n}\n","/**\n * VirtualGrid - 2D virtual scrolling component for grid layouts\n * @module components/VirtualGrid\n */\n\nimport React, { useRef } from 'react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\n\nexport interface VirtualGridProps<T> {\n  /** Array of items to render */\n  items: T[]\n  /** Height of the scrollable container in pixels */\n  height: number | string\n  /** Width of the scrollable container in pixels */\n  width?: number | string\n  /** Estimated width of each column in pixels */\n  estimateColumnWidth: number\n  /** Render function for each column */\n  renderColumn: (item: T, index: number) => React.ReactNode\n  /** Optional className for the container */\n  className?: string\n  /** Overscan count (number of columns to render outside viewport) */\n  overscan?: number\n  /** Optional gap between columns in pixels */\n  gap?: number\n  /** Optional key extractor function */\n  getItemKey?: (item: T, index: number) => string | number\n  /** Enable horizontal scrolling only */\n  horizontal?: boolean\n}\n\n/**\n * VirtualGrid component for efficient rendering of large horizontal lists/grids\n *\n * Optimized for Kanban boards with many columns\n *\n * @example\n * ```tsx\n * <VirtualGrid\n *   items={columns}\n *   height=\"100%\"\n *   estimateColumnWidth={320}\n *   renderColumn={(column) => <ColumnComponent column={column} />}\n *   getItemKey={(column) => column.id}\n * />\n * ```\n */\nexport function VirtualGrid<T>({\n  items,\n  height,\n  width = '100%',\n  estimateColumnWidth,\n  renderColumn,\n  className = '',\n  overscan = 3,\n  gap = 16,\n  getItemKey,\n  horizontal = true,\n}: VirtualGridProps<T>) {\n  const parentRef = useRef<HTMLDivElement>(null)\n\n  const columnVirtualizer = useVirtualizer({\n    horizontal,\n    count: items.length,\n    getScrollElement: () => parentRef.current,\n    estimateSize: () => estimateColumnWidth,\n    overscan,\n    gap,\n  })\n\n  const virtualColumns = columnVirtualizer.getVirtualItems()\n\n  const containerStyle: React.CSSProperties = {\n    height: typeof height === 'number' ? `${height}px` : height,\n    width: typeof width === 'number' ? `${width}px` : width,\n    overflow: 'auto',\n    position: 'relative',\n  }\n\n  const innerStyle: React.CSSProperties = {\n    width: `${columnVirtualizer.getTotalSize()}px`,\n    height: '100%',\n    position: 'relative',\n  }\n\n  return (\n    <div ref={parentRef} style={containerStyle} className={className}>\n      <div style={innerStyle}>\n        {virtualColumns.map((virtualColumn) => {\n          const item = items[virtualColumn.index]\n          if (!item) return null\n          const key = getItemKey ? getItemKey(item, virtualColumn.index) : virtualColumn.index\n\n          const columnStyle: React.CSSProperties = {\n            position: 'absolute',\n            top: 0,\n            left: virtualColumn.start,\n            width: virtualColumn.size,\n            height: '100%',\n          }\n\n          return (\n            <div key={key} style={columnStyle} data-index={virtualColumn.index}>\n              {renderColumn(item, virtualColumn.index)}\n            </div>\n          )\n        })}\n      </div>\n    </div>\n  )\n}\n\n/**\n * Hook for advanced 2D virtualization with both rows and columns\n */\nexport function useVirtualGrid<T>(options: {\n  items: T[]\n  scrollElement: HTMLElement | null\n  estimateColumnWidth: number\n  estimateRowHeight?: number\n  overscan?: number\n  gap?: number\n}) {\n  const columnVirtualizer = useVirtualizer({\n    horizontal: true,\n    count: options.items.length,\n    getScrollElement: () => options.scrollElement,\n    estimateSize: () => options.estimateColumnWidth,\n    overscan: options.overscan ?? 3,\n    gap: options.gap ?? 0,\n  })\n\n  return {\n    columnVirtualizer,\n    virtualColumns: columnVirtualizer.getVirtualItems(),\n    totalWidth: columnVirtualizer.getTotalSize(),\n  }\n}\n\n/**\n * Utility to determine if grid should use virtualization\n */\nexport function shouldVirtualizeGrid(columnCount: number, threshold = 10): boolean {\n  return columnCount > threshold\n}\n","/**\n * Design Tokens - Centralized design system tokens\n * @module tokens/design-tokens\n */\n\n/**\n * Spacing tokens (in pixels)\n */\nexport const spacing = {\n  none: 0,\n  xs: 4,\n  sm: 8,\n  md: 12,\n  lg: 16,\n  xl: 20,\n  '2xl': 24,\n  '3xl': 32,\n  '4xl': 40,\n  '5xl': 48,\n  '6xl': 64,\n} as const\n\n/**\n * Border radius tokens (in pixels)\n */\nexport const borderRadius = {\n  none: 0,\n  sm: 4,\n  md: 8,\n  lg: 12,\n  xl: 16,\n  '2xl': 20,\n  full: 9999,\n} as const\n\n/**\n * Font size tokens (in pixels)\n */\nexport const fontSize = {\n  xs: 12,\n  sm: 14,\n  base: 16,\n  lg: 18,\n  xl: 20,\n  '2xl': 24,\n  '3xl': 30,\n  '4xl': 36,\n  '5xl': 48,\n} as const\n\n/**\n * Font weight tokens\n */\nexport const fontWeight = {\n  light: 300,\n  normal: 400,\n  medium: 500,\n  semibold: 600,\n  bold: 700,\n  extrabold: 800,\n} as const\n\n/**\n * Line height tokens\n */\nexport const lineHeight = {\n  none: 1,\n  tight: 1.25,\n  snug: 1.375,\n  normal: 1.5,\n  relaxed: 1.625,\n  loose: 2,\n} as const\n\n/**\n * Z-index layers\n */\nexport const zIndex = {\n  base: 0,\n  dropdown: 1000,\n  sticky: 1020,\n  fixed: 1030,\n  modalBackdrop: 1040,\n  modal: 1050,\n  popover: 1060,\n  tooltip: 1070,\n} as const\n\n/**\n * Transition durations (in milliseconds)\n */\nexport const duration = {\n  instant: 0,\n  fastest: 75,\n  faster: 100,\n  fast: 150,\n  normal: 200,\n  slow: 300,\n  slower: 400,\n  slowest: 500,\n} as const\n\n/**\n * Transition timing functions\n */\nexport const easing = {\n  linear: 'linear',\n  ease: 'ease',\n  easeIn: 'ease-in',\n  easeOut: 'ease-out',\n  easeInOut: 'ease-in-out',\n  // Custom cubic-bezier\n  smooth: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\n  sharp: 'cubic-bezier(0.4, 0.0, 0.6, 1)',\n  bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n} as const\n\n/**\n * Shadow tokens\n */\nexport const shadows = {\n  none: 'none',\n  sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n  base: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',\n  md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n  lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n  xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',\n  '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n  inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',\n} as const\n\n/**\n * Opacity tokens\n */\nexport const opacity = {\n  0: 0,\n  5: 0.05,\n  10: 0.1,\n  20: 0.2,\n  30: 0.3,\n  40: 0.4,\n  50: 0.5,\n  60: 0.6,\n  70: 0.7,\n  80: 0.8,\n  90: 0.9,\n  100: 1,\n} as const\n\n/**\n * Kanban-specific tokens\n */\nexport const kanban = {\n  column: {\n    width: 320,\n    minWidth: 280,\n    maxWidth: 400,\n    gap: 16,\n    padding: 12,\n    headerHeight: 48,\n  },\n  card: {\n    minHeight: 80,\n    maxHeight: 400,\n    padding: 12,\n    gap: 8,\n  },\n  board: {\n    padding: 16,\n    gap: 16,\n  },\n} as const\n\n/**\n * Gantt-specific tokens\n */\nexport const gantt = {\n  timeline: {\n    headerHeight: 60,\n    rowHeight: 44,\n    minRowHeight: 32,\n    maxRowHeight: 80,\n    taskPadding: 4,\n    gridLineWidth: 1,\n  },\n  task: {\n    height: 28,\n    minHeight: 20,\n    maxHeight: 40,\n    borderRadius: 4,\n    padding: 6,\n  },\n  dependency: {\n    lineWidth: 2,\n    arrowSize: 8,\n  },\n  scale: {\n    day: {\n      columnWidth: 40,\n      minColumnWidth: 30,\n      maxColumnWidth: 60,\n    },\n    week: {\n      columnWidth: 80,\n      minColumnWidth: 60,\n      maxColumnWidth: 120,\n    },\n    month: {\n      columnWidth: 120,\n      minColumnWidth: 80,\n      maxColumnWidth: 200,\n    },\n    quarter: {\n      columnWidth: 200,\n      minColumnWidth: 150,\n      maxColumnWidth: 300,\n    },\n  },\n  milestone: {\n    size: 16,\n    rotation: 45, // degrees\n  },\n} as const\n\n/**\n * Combined design tokens\n */\nexport const designTokens = {\n  spacing,\n  borderRadius,\n  fontSize,\n  fontWeight,\n  lineHeight,\n  zIndex,\n  duration,\n  easing,\n  shadows,\n  opacity,\n  kanban,\n  gantt,\n} as const\n\n/**\n * Type helpers\n */\nexport type SpacingToken = keyof typeof spacing\nexport type BorderRadiusToken = keyof typeof borderRadius\nexport type FontSizeToken = keyof typeof fontSize\nexport type FontWeightToken = keyof typeof fontWeight\nexport type LineHeightToken = keyof typeof lineHeight\nexport type ZIndexToken = keyof typeof zIndex\nexport type DurationToken = keyof typeof duration\nexport type EasingToken = keyof typeof easing\nexport type ShadowToken = keyof typeof shadows\nexport type OpacityToken = keyof typeof opacity\n\n/**\n * Design token value types\n */\nexport type DesignTokens = typeof designTokens\nexport type TokenValue = string | number\n\n/**\n * Utility to get token value with fallback\n */\nexport function getToken<T extends TokenValue>(\n  tokens: Record<string, T>,\n  key: string,\n  fallback: T\n): T {\n  return tokens[key] ?? fallback\n}\n","/**\r\n * CSS Custom Properties Generator\r\n * Generates CSS variables from design tokens\r\n * @module tokens/css-generator\r\n */\r\n\r\nimport { designTokens } from './design-tokens'\r\nimport type { TokenValue } from './design-tokens'\r\n\r\n/**\r\n * Convert a nested object to flat CSS custom properties\r\n */\r\nfunction flattenTokens(\r\n  obj: Record<string, unknown>,\r\n  prefix = '',\r\n  result: Record<string, TokenValue> = {}\r\n): Record<string, TokenValue> {\r\n  for (const [key, value] of Object.entries(obj)) {\r\n    const newKey = prefix ? `${prefix}-${key}` : key\r\n\r\n    if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n      flattenTokens(value as Record<string, unknown>, newKey, result)\r\n    } else if (typeof value === 'string' || typeof value === 'number') {\r\n      result[newKey] = value\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n/**\r\n * Format token value for CSS\r\n */\r\nfunction formatCSSValue(value: TokenValue): string {\r\n  if (typeof value === 'number') {\r\n    // Check if it's likely a pixel value\r\n    if (value > 0 && value < 1000) {\r\n      return `${value}px`\r\n    }\r\n    return value.toString()\r\n  }\r\n  return value\r\n}\r\n\r\n/**\r\n * Generate CSS custom properties from design tokens\r\n */\r\nexport function generateCSSVariables(prefix = 'asakaa'): string {\r\n  const flatTokens = flattenTokens(designTokens)\r\n  const cssVars: string[] = []\r\n\r\n  for (const [key, value] of Object.entries(flatTokens)) {\r\n    const varName = `--${prefix}-${key}`\r\n    const varValue = formatCSSValue(value)\r\n    cssVars.push(`  ${varName}: ${varValue};`)\r\n  }\r\n\r\n  return `:root {\\n${cssVars.join('\\n')}\\n}`\r\n}\r\n\r\n/**\r\n * Generate CSS custom properties for a specific theme\r\n */\r\nexport interface ThemeColors {\r\n  // Background colors\r\n  background: {\r\n    primary: string\r\n    secondary: string\r\n    tertiary: string\r\n    card: string\r\n    hover: string\r\n    active: string\r\n  }\r\n  // Text colors\r\n  text: {\r\n    primary: string\r\n    secondary: string\r\n    tertiary: string\r\n    disabled: string\r\n    inverse: string\r\n  }\r\n  // Border colors\r\n  border: {\r\n    default: string\r\n    hover: string\r\n    focus: string\r\n    active: string\r\n  }\r\n  // Status colors\r\n  status: {\r\n    success: string\r\n    warning: string\r\n    error: string\r\n    info: string\r\n  }\r\n  // Priority colors\r\n  priority: {\r\n    low: string\r\n    medium: string\r\n    high: string\r\n    urgent: string\r\n  }\r\n  // Interactive colors\r\n  interactive: {\r\n    primary: string\r\n    primaryHover: string\r\n    primaryActive: string\r\n    secondary: string\r\n    secondaryHover: string\r\n    secondaryActive: string\r\n  }\r\n  // Gantt-specific colors\r\n  gantt: {\r\n    gridLine: string\r\n    todayLine: string\r\n    taskBackground: string\r\n    taskBorder: string\r\n    criticalPath: string\r\n    milestone: string\r\n    dependency: string\r\n    weekend: string\r\n  }\r\n}\r\n\r\n/**\r\n * Generate theme CSS variables\r\n */\r\nexport function generateThemeVariables(\r\n  theme: ThemeColors,\r\n  prefix = 'asakaa'\r\n): string {\r\n  const cssVars: string[] = []\r\n\r\n  // Flatten theme colors\r\n  const flatColors = flattenTokens(theme as unknown as Record<string, unknown>)\r\n\r\n  for (const [key, value] of Object.entries(flatColors)) {\r\n    const varName = `--${prefix}-color-${key}`\r\n    cssVars.push(`  ${varName}: ${value};`)\r\n  }\r\n\r\n  return `:root {\\n${cssVars.join('\\n')}\\n}`\r\n}\r\n\r\n/**\r\n * Dark theme colors\r\n */\r\nexport const darkTheme: ThemeColors = {\r\n  background: {\r\n    primary: '#1a1a1a',\r\n    secondary: '#2a2a2a',\r\n    tertiary: '#3a3a3a',\r\n    card: '#2d2d2d',\r\n    hover: '#353535',\r\n    active: '#404040',\r\n  },\r\n  text: {\r\n    primary: '#ffffff',\r\n    secondary: '#b0b0b0',\r\n    tertiary: '#808080',\r\n    disabled: '#606060',\r\n    inverse: '#1a1a1a',\r\n  },\r\n  border: {\r\n    default: '#404040',\r\n    hover: '#505050',\r\n    focus: '#0ea5e9',\r\n    active: '#0284c7',\r\n  },\r\n  status: {\r\n    success: '#22c55e',\r\n    warning: '#f59e0b',\r\n    error: '#ef4444',\r\n    info: '#00E5CC',\r\n  },\r\n  priority: {\r\n    low: '#6b7280',\r\n    medium: '#00E5CC',\r\n    high: '#f59e0b',\r\n    urgent: '#ef4444',\r\n  },\r\n  interactive: {\r\n    primary: '#0ea5e9',\r\n    primaryHover: '#0284c7',\r\n    primaryActive: '#0369a1',\r\n    secondary: '#6b7280',\r\n    secondaryHover: '#4b5563',\r\n    secondaryActive: '#374151',\r\n  },\r\n  gantt: {\r\n    gridLine: '#404040',\r\n    todayLine: '#0ea5e9',\r\n    taskBackground: '#00E5CC',\r\n    taskBorder: '#00C4AE',\r\n    criticalPath: '#ef4444',\r\n    milestone: '#00E5CC',\r\n    dependency: '#6b7280',\r\n    weekend: '#2a2a2a',\r\n  },\r\n}\r\n\r\n/**\r\n * Light theme colors\r\n */\r\nexport const lightTheme: ThemeColors = {\r\n  background: {\r\n    primary: '#ffffff',\r\n    secondary: '#f9fafb',\r\n    tertiary: '#f3f4f6',\r\n    card: '#ffffff',\r\n    hover: '#f3f4f6',\r\n    active: '#e5e7eb',\r\n  },\r\n  text: {\r\n    primary: '#111827',\r\n    secondary: '#6b7280',\r\n    tertiary: '#9ca3af',\r\n    disabled: '#d1d5db',\r\n    inverse: '#ffffff',\r\n  },\r\n  border: {\r\n    default: '#e5e7eb',\r\n    hover: '#d1d5db',\r\n    focus: '#0ea5e9',\r\n    active: '#0284c7',\r\n  },\r\n  status: {\r\n    success: '#16a34a',\r\n    warning: '#d97706',\r\n    error: '#dc2626',\r\n    info: '#00C4AE',\r\n  },\r\n  priority: {\r\n    low: '#9ca3af',\r\n    medium: '#00E5CC',\r\n    high: '#f59e0b',\r\n    urgent: '#ef4444',\r\n  },\r\n  interactive: {\r\n    primary: '#0ea5e9',\r\n    primaryHover: '#0284c7',\r\n    primaryActive: '#0369a1',\r\n    secondary: '#6b7280',\r\n    secondaryHover: '#4b5563',\r\n    secondaryActive: '#374151',\r\n  },\r\n  gantt: {\r\n    gridLine: '#e5e7eb',\r\n    todayLine: '#0ea5e9',\r\n    taskBackground: '#00E5CC',\r\n    taskBorder: '#00C4AE',\r\n    criticalPath: '#ef4444',\r\n    milestone: '#00E5CC',\r\n    dependency: '#6b7280',\r\n    weekend: '#f9fafb',\r\n  },\r\n}\r\n\r\n/**\r\n * Neutral theme colors\r\n */\r\nexport const neutralTheme: ThemeColors = {\r\n  background: {\r\n    primary: '#18181b',\r\n    secondary: '#27272a',\r\n    tertiary: '#3f3f46',\r\n    card: '#27272a',\r\n    hover: '#3f3f46',\r\n    active: '#52525b',\r\n  },\r\n  text: {\r\n    primary: '#fafafa',\r\n    secondary: '#a1a1aa',\r\n    tertiary: '#71717a',\r\n    disabled: '#52525b',\r\n    inverse: '#18181b',\r\n  },\r\n  border: {\r\n    default: '#3f3f46',\r\n    hover: '#52525b',\r\n    focus: '#0ea5e9',\r\n    active: '#0284c7',\r\n  },\r\n  status: {\r\n    success: '#22c55e',\r\n    warning: '#f59e0b',\r\n    error: '#ef4444',\r\n    info: '#00E5CC',\r\n  },\r\n  priority: {\r\n    low: '#71717a',\r\n    medium: '#00E5CC',\r\n    high: '#f59e0b',\r\n    urgent: '#ef4444',\r\n  },\r\n  interactive: {\r\n    primary: '#0ea5e9',\r\n    primaryHover: '#0284c7',\r\n    primaryActive: '#0369a1',\r\n    secondary: '#71717a',\r\n    secondaryHover: '#52525b',\r\n    secondaryActive: '#3f3f46',\r\n  },\r\n  gantt: {\r\n    gridLine: '#3f3f46',\r\n    todayLine: '#0ea5e9',\r\n    taskBackground: '#00E5CC',\r\n    taskBorder: '#00C4AE',\r\n    criticalPath: '#ef4444',\r\n    milestone: '#00E5CC',\r\n    dependency: '#71717a',\r\n    weekend: '#27272a',\r\n  },\r\n}\r\n\r\n/**\r\n * Generate complete CSS with all tokens and theme\r\n */\r\nexport function generateCompleteCSS(\r\n  theme: ThemeColors = darkTheme,\r\n  prefix = 'asakaa'\r\n): string {\r\n  const tokenVars = generateCSSVariables(prefix)\r\n  const themeVars = generateThemeVariables(theme, prefix)\r\n\r\n  return `${tokenVars}\\n\\n${themeVars}`\r\n}\r\n\r\n/**\r\n * Export CSS to file content\r\n */\r\nexport function exportTokensToCSS(): string {\r\n  return `/**\r\n * ASAKAA Design Tokens\r\n * Auto-generated from design-tokens.ts\r\n * Do not edit this file directly\r\n */\r\n\r\n${generateCompleteCSS(darkTheme)}\r\n\r\n/* Light theme */\r\n[data-theme=\"light\"] {\r\n${generateThemeVariables(lightTheme, 'asakaa')\r\n  .split('\\n')\r\n  .slice(1, -1)\r\n  .join('\\n')}\r\n}\r\n\r\n/* Neutral theme */\r\n[data-theme=\"neutral\"] {\r\n${generateThemeVariables(neutralTheme, 'asakaa')\r\n  .split('\\n')\r\n  .slice(1, -1)\r\n  .join('\\n')}\r\n}\r\n`\r\n}\r\n","/**\n * Theme Switcher Component\n * ASAKAA v0.5.0\n */\n\nimport { useTheme } from './ThemeProvider'\nimport type { ThemeName } from './types'\nimport './theme-switcher.css'\n\nexport interface ThemeSwitcherProps {\n  /** Show labels for each theme */\n  showLabels?: boolean\n  /** Compact mode (icon-only) */\n  compact?: boolean\n  /** Custom class name */\n  className?: string\n}\n\n// Theme Icon Components with explicit SVG\nconst ThemeIcon = ({ theme }: { theme: ThemeName }) => {\n  switch (theme) {\n    case 'dark':\n      return (\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n          <path d=\"M13.5 8.5C13.5 11.2614 11.2614 13.5 8.5 13.5C5.73858 13.5 3.5 11.2614 3.5 8.5C3.5 5.73858 5.73858 3.5 8.5 3.5C8.66667 3.5 8.83074 3.50926 8.99199 3.52734C8.10635 4.35233 7.5 5.53318 7.5 6.85C7.5 9.33579 9.49421 11.33 11.98 11.33C12.5933 11.33 13.1751 11.2075 13.7069 10.9844C13.5698 11.8951 13.2042 12.7349 12.6674 13.4367\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n        </svg>\n      )\n    case 'light':\n      return (\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n          <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n          <path d=\"M8 1V2M8 14V15M15 8H14M2 8H1M12.5 12.5L11.8 11.8M4.2 4.2L3.5 3.5M12.5 3.5L11.8 4.2M4.2 11.8L3.5 12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n        </svg>\n      )\n    case 'neutral':\n      return (\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n          <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n          <path d=\"M5 8L8 8L8 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n        </svg>\n      )\n  }\n}\n\nexport function ThemeSwitcher({ showLabels = true, compact = false, className = '' }: ThemeSwitcherProps) {\n  const { theme: currentTheme, setTheme, themes } = useTheme()\n\n  return (\n    <div className={`theme-switcher ${compact ? 'theme-switcher--compact' : ''} ${className}`}>\n      {Object.entries(themes).map(([key, themeData]) => {\n        const themeName = key as ThemeName\n        const isActive = themeName === currentTheme\n\n        return (\n          <button\n            key={themeName}\n            onClick={() => setTheme(themeName)}\n            className={`theme-switcher__button ${isActive ? 'theme-switcher__button--active' : ''}`}\n            aria-label={`Switch to ${themeData.displayName} theme`}\n            aria-pressed={isActive}\n            title={themeData.displayName}\n          >\n            <span className=\"theme-switcher__icon\" aria-hidden=\"true\">\n              <ThemeIcon theme={themeName} />\n            </span>\n            {showLabels && !compact && <span className=\"theme-switcher__label\">{themeData.displayName}</span>}\n          </button>\n        )\n      })}\n    </div>\n  )\n}\n"]}