@libxai/board 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +67 -0
- package/dist/index.cjs +79 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +2 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +4378 -0
- package/dist/index.d.ts +4378 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +9102 -0
- package/package.json +134 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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/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","../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../../../node_modules/@floating-ui/react/dist/floating-ui.react.utils.mjs","../../../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../../../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs","../../../node_modules/@floating-ui/react/dist/floating-ui.react.mjs","../src/hooks/useClickOutside.ts","../src/hooks/useKeyboardNav.ts","../src/components/Dropdown/Dropdown.tsx","../src/components/Card/PrioritySelectorV2.tsx","../src/components/Card/DateRangePickerV2.tsx","../src/components/Card/UserAssignmentSelectorV2.tsx","../src/components/Card/DependenciesSelectorV2.tsx","../src/components/Column/ColumnMenu.tsx","../src/components/Column/Column.tsx","../src/components/Column/EditableColumnTitle.tsx","../src/hooks/useDragState.ts","../src/components/Board/Board.tsx","../src/components/ErrorBoundary/ErrorBoundary.tsx","../src/components/CommandPalette/CommandPalette.tsx","../src/components/Attachments/AttachmentUploader.tsx","../src/components/CardDetailModal/CardDetailModal.tsx","../src/components/CardDetailModal/CardDetailModalV2.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/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/Card/StatusSelector.tsx","../src/components/Gantt/TaskGrid.tsx","../src/components/Gantt/hooks/useDragState.ts","../src/components/Gantt/TaskBar.tsx","../src/components/Gantt/DependencyLine.tsx","../src/components/Gantt/Milestone.tsx","../src/components/Gantt/Timeline.tsx","../src/components/Gantt/useUndoRedo.ts","../src/components/Gantt/useGanttUndoRedoKeys.ts","../src/components/Gantt/ganttUtils.ts","../src/components/Gantt/defaultTemplates.ts","../src/components/Gantt/GanttBoard.tsx","../src/components/Gantt/TaskFormModal.tsx","../src/components/Gantt/adapters.ts","../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","Portal","children","container","mounted","setMounted","useState","useEffect","target","createPortal","PRIORITY_CONFIG","CLEAR_COLOR","PriorityIcon","color","jsxs","jsx","PrioritySelector","priority","onChange","className","isOpen","setIsOpen","menuPosition","setMenuPosition","menuRef","useRef","buttonRef","rect","handleClickOutside","handleEscape","e","handleSelect","newPriority","currentConfig","flagColor","key","config","QUICK_OPTIONS","DateRangePicker","startDate","endDate","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","DependenciesSelector","currentCardId","dependencies","availableTasks","hasDependencies","setHasDependencies","handleToggleDependency","taskId","newDeps","id","handleToggleHasDependencies","newValue","filteredTasks","task","linkColor","Fragment","isDependency","Card","memo","render","onClick","isSelected","disableDrag","onUpdate","allCards","attributes","listeners","setNodeRef","transition","isDragging","useSortable","style","users","d","label","prevProps","nextProps","hasWindow","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","invalidOverflowDisplayValues","isOverflowElement","overflow","overflowX","overflowY","display","getComputedStyle","tableElements","isTableElement","topLayerSelectors","isTopLayer","selector","transformProperties","willChangeValues","containValues","isContainingBlock","elementOrCss","webkit","isWebKit","css","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","lastTraversableNodeNames","getNodeScroll","getNearestOverflowAncestor","parentNode","getOverflowAncestors","list","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","min","max","floor","createCoords","v","oppositeSideMap","oppositeAlignmentMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","yAxisSides","getSideAxis","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","lrPlacement","rlPlacement","tbPlacement","btPlacement","getSideList","side","isStart","getOppositeAxisPlacements","flipAlignment","direction","expandPaddingObject","padding","getPaddingObject","rectToClientRect","width","height","isClient","noop","useLayoutEffect","SafeReact","React","useInsertionEffect","useSafeInsertionEffect","useEffectEvent","callback","ref","wa","_len","_key","computeCoordsFromPlacement","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","name","nextX","nextY","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","offset","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","resetPlacement","a","b","_overflowsData$filter2","currentSideAxis","acc","originSides","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","size","_state$middlewareData","_state$middlewareData2","apply","heightSide","widthSide","maximumClippingHeight","maximumClippingWidth","overflowAvailableHeight","overflowAvailableWidth","noShift","availableHeight","availableWidth","xMin","xMax","yMin","yMax","nextDimensions","getCssDimensions","hasOffset","offsetWidth","offsetHeight","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","left","top","getWindowScrollBarX","leftScroll","getHTMLOffset","documentElement","scroll","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","topLayer","offsets","isOffsetParentAnElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","html","body","SCROLLBAR_MAX","getViewportRect","visualViewport","visualViewportBased","windowScrollbarX","bodyStyles","bodyMarginInline","clippingStableScrollbarWidth","absoluteOrFixed","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","el","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getDimensions","getRectRelativeToOffsetParent","setLeftRTLScrollbarOffset","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","rectsAreEqual","observeMove","onMove","io","timeoutId","root","cleanup","_io","refresh","skip","elementRectForRootMargin","insetTop","insetRight","insetBottom","insetLeft","isFirstUpdate","handleObserve","entries","ratio","autoUpdate","update","ancestorScroll","ancestorResize","elementResize","layoutShift","animationFrame","referenceEl","ancestors","cleanupIo","reobserveFrame","resizeObserver","firstEntry","_resizeObserver","frameId","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","mergedOptions","platformWithCache","deepEqual","keys","getDPR","roundByDPR","dpr","useLatestRef","tt","useFloating","externalReference","externalFloating","whileElementsMounted","open","setData","latestMiddleware","setLatestMiddleware","_reference","_setReference","_floating","_setFloating","setReference","referenceRef","setFloating","floatingRef","floatingEl","dataRef","hasWhileElementsMounted","whileElementsMountedRef","platformRef","openRef","fullData","isMountedRef","refs","floatingStyles","initialStyles","arrow$1","isRef","deps","serverHandoffComplete","genId","useFloatingId","setId","useReactId","useId","devMessageSet","warn","_devMessageSet","messages","_devMessageSet2","_devMessageSet3","_len2","_key2","_devMessageSet4","FloatingArrow","props","tipRadius","strokeWidth","staticOffset","stroke","restStyle","clipPathId","setIsRTL","isVerticalSide","computedStaticOffset","computedStrokeWidth","halfStrokeWidth","svgX","svgY","isCustomShape","yOffsetProp","xOffsetProp","arrowX","arrowY","dValue","rotation","t","createEventEmitter","map","_map$get","listener","_map$get2","FloatingNodeContext","FloatingTreeContext","useFloatingParentNodeId","_React$useContext","useFloatingTree","useFloatingRootContext","onOpenChangeProp","elementsProp","floatingId","events","nested","optionDomReference","positionReference","setPositionReference","onOpenChange","reason","nodeId","internalRootContext","rootContext","computedElements","_domReference","setDomReference","_setPositionReference","domReference","domReferenceRef","tree","position","computedPositionReference","useClickOutside","handler","useKeyboardNav","onSelect","onEscape","loop","containerRef","activeIndex","setActiveIndex","activeItem","handleKeyDown","useCallback","prev","getItemProps","Dropdown","trigger","controlledIsOpen","offsetDistance","maxHeight","minWidth","maxWidth","showArrow","triggerClassName","disableClickOutside","disableKeyboardNav","onSelectItem","onOpen","onClose","animationDuration","zIndex","internalIsOpen","setInternalIsOpen","newIsOpen","wasOpen","toggle","close","triggerRef","dropdownRef","arrowRef","renderTrigger","renderChildren","animationStyle","CLEAR_COLOR_DARK","CheckIcon","isDark","priorities","item","isActive","tempStartDate","setTempStartDate","tempEndDate","setTempEndDate","startStr","handleApply","ColumnMenu","onRename","isRenaming","setIsRenaming","newTitle","setNewTitle","inputRef","handleRenameClick","handleRenameSubmit","trimmedTitle","handleRenameKeyDown","Column","renderColumn","renderCard","renderHeader","renderEmptyState","onCardClick","onCardUpdate","enableVirtualization","cardHeight","isCollapsed","onToggleCollapse","onColumnRename","isOver","useDroppable","parentRef","useVirtualization","virtualizer","useVirtualizer","wipStatus","percentage","isOverWipLimit","getWipBadgeClasses","SortableContext","verticalListSortingStrategy","virtualItem","EditableColumnTitle","title","onSave","isEditing","setIsEditing","editValue","setEditValue","handleSave","trimmed","useDragState","setState","dragStore","newState","setDragState","KanbanBoard","callbacks","renderProps","isLoading","dragState","handleCardUpdate","cardId","updates","handleColumnRename","columnId","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","cardsByColumn","useMemo","handleDragStart","active","c","handleDragOver","over","targetColumnId","handleDragEnd","activeCard","targetPosition","targetColumnCards","overCard","overIndex","targetColumn","handleCardClick","LoadingSkeleton","DndContext","closestCorners","DragOverlay","columnCount","KanbanViewAdapter","BaseViewAdapter","createRoot","cell","createKanbanView","ErrorBoundary","Component","errorInfo","onError","handlerError","hasError","fallback","withErrorBoundary","errorBoundaryProps","WrappedComponent","CommandPalette","onCreateCard","onNavigateToCard","onSearch","onChangePriority","onAssignUser","onGeneratePlan","onPredictRisks","onOpenAIUsage","shortcut","search","setSearch","page","setPage","selectedColumn","setSelectedColumn","selectedCard","setSelectedCard","handleClose","handleSelectCommand","handleCreateCard","Command","formatFileSize","bytes","k","sizes","getFileIcon","type","isImage","AttachmentUploader","attachments","onUpload","onDelete","maxSizeMB","allowedTypes","maxFiles","setIsDragging","isUploading","setIsUploading","setError","fileInputRef","validateFiles","files","valid","handleUpload","err","handleDragEnter","handleDragLeave","handleDrop","handleFileInputChange","handleClick","handleDelete","attachmentId","attachment","CardDetailModal","comments","activities","aiInsights","onAddComment","onDeleteComment","onUploadAttachments","onDeleteAttachment","onSuggestAssignee","onGenerateSubtasks","onEstimateEffort","currentUserId","activeTab","setActiveTab","editedCard","setEditedCard","newComment","setNewComment","aiLoading","setAiLoading","aiSuggestions","setAiSuggestions","handleAddComment","handleSuggestAssignee","suggestions","handleGenerateSubtasks","subtasks","handleEstimateEffort","effort","currentCard","selected","dep","depId","comment","author","activity","suggestion","subtask","insight","PRIORITY_OPTIONS","STATUS_OPTIONS","CardDetailModalV2","_onDelete","_onDeleteComment","currentUser","_onAIGenerateDescription","_onAICreateSubtasks","_onAIFindSimilar","availableColumns","availableLabels","localCard","setLocalCard","isEditingDescription","setIsEditingDescription","setSubtasks","isAddingSubtask","setIsAddingSubtask","newSubtaskTitle","setNewSubtaskTitle","commentText","setCommentText","activityFilter","setActivityFilter","showStatusMenu","setShowStatusMenu","showPriorityMenu","setShowPriorityMenu","showAssigneeMenu","setShowAssigneeMenu","showLabelMenu","setShowLabelMenu","showDatePicker","setShowDatePicker","showTimePicker","setShowTimePicker","titleRef","descriptionRef","commentRef","statusMenuRef","priorityMenuRef","assigneeMenuRef","labelMenuRef","datePickerRef","isTyping","isMod","handleTitleChange","updated","handleTitleKeyDown","handleDescriptionBlur","handleStatusChange","handlePriorityChange","handleToggleAssignee","userId","currentAssignees","newAssignees","handleToggleLabel","currentLabels","newLabels","l","handleDateChange","newDate","handleTimeChange","hours","handleAddSubtask","newSubtask","handleToggleSubtask","st","handleDeleteSubtask","handleSendComment","handleCommentKeyDown","renderMarkdown","text","ReactMarkdown","remarkGfm","rehypeSanitize","filteredActivity","displayCard","completedSubtasksCount","s","CustomTooltip","payload","VelocityChart","showAverage","showPlanned","dataWithAverage","point","sum","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","Line","BurnDownChart","totalTasks","useArea","total","currentRemaining","idealRemaining","progress","isOnTrack","AreaChart","Area","PRIORITY_COLORS","DEFAULT_COLORS","renderPieLabel","cx","cy","midAngle","innerRadius","outerRadius","percent","radius","DistributionCharts","showPercentages","dataWithTotal","colors","PieChart","Pie","Cell","legendEntry","BarChart","Bar","BulkOperationsToolbar","selectedCards","onClearSelection","columns","showMoveMenu","setShowMoveMenu","showUserMenu","setShowUserMenu","cardIds","handleUpdatePriority","handleMove","handleAssignUsers","userIds","handleAddLabels","labels","existingLabels","allLabels","generateSwimlanes","groupBy","laneMap","groupValue","laneId","laneTitle","laneColor","laneIcon","assignedUserIds","SwimlaneBoardView","swimlaneConfig","collapsedLanes","setCollapsedLanes","swimlanes","toggleLaneCollapse","next","lane","laneCards","laneBoard","GROUP_BY_OPTIONS","GroupBySelector","currentOption","opt","DEFAULT_SHORTCUTS","matchesShortcut","modifiers","ctrlMatch","shiftMatch","altMatch","metaMatch","useKeyboardShortcuts","shortcuts","preventDefault","shortcutsRef","enabledRef","registerShortcut","unregisterShortcut","customEvent","formatKey","formatModifiers","isMac","getShortcutDisplay","groupShortcuts","groups","KeyboardShortcutsHelp","isMounted","setIsMounted","category","categoryShortcuts","DEFAULT_TEMPLATES","CardTemplateSelector","templates","onSelectTemplate","template","groupedTemplates","categoryTemplates","ExportImportModal","onImport","boardElementRef","selectedFormat","setSelectedFormat","importResult","setImportResult","handleExport","handleFileSelect","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","darkTheme","lightTheme","neutralTheme","themes","defaultTheme","ThemeContext","createContext","STORAGE_KEY","ThemeProvider","initialTheme","storageKey","theme","setThemeState","stored","setTheme","newTheme","currentTheme","camelToKebab","themeKey","cssVar","useTheme","useContext","str","ThemeModal","themeData","deriveThemeFromCSS","themeName","styles","getVar","varName","SegmentedControl","motion","GanttToolbar","timeScale","onTimeScaleChange","zoom","onZoomChange","onThemeChange","rowDensity","onRowDensityChange","showThemeSelector","timeScaleOptions","Calendar","themeOptions","Moon","Sun","Palette","densityOptions","AlignJustify","val","ZoomOut","ZoomIn","ColumnManager","onToggleColumn","Plus","AnimatePresence","Check","ContextMenu","items","ChevronRight","MenuIcons","Edit3","Trash2","Minus","Link2","BarChart3","ArrowUpDown","ArrowUp","ArrowDown","EyeOff","Eye","Settings","Scissors","useGanttKeyboard","tasks","selectedTaskIds","onTaskSelect","onTaskCreate","onTaskDelete","onTaskDuplicate","onTaskMove","onTaskIndent","onTaskOutdent","onTaskRename","onTaskToggleExpand","onOpenTaskModal","enableKeyboard","isEditingRef","editing","flattenTasks","traverse","getFirstSelectedTask","flatTasks","handleNavigation","multiSelect","selectedTask","currentIndex","nextTask","ctrlOrCmd","selectedIds","useGanttSelection","setSelectedTaskIds","lastSelectedId","setLastSelectedId","selectTask","toggleTaskSelection","selectTaskRange","flatTaskIds","lastIndex","rangeIds","handleTaskClick","handleKeyboardSelection","clearSelection","isTaskSelected","parentId","findParentTask","childId","found","indentTasks","taskIds","firstTaskId","taskIndex","targetParent","removeTasks","ids","removed","addAsChildren","idsSet","filtered","outdentTasks","parent","grandparent","removeFromParent","insertAfterTask","afterId","moveTasks","moveInArray","newIndex","deleteTasks","filterTasks","duplicateTasks","duplicateTask","original","copy","duplicateSubtasks","createTask","afterTaskId","newTask","insertTask","insertIndex","renameTask","newName","toggleTaskExpansion","createSubtask","parentTaskId","addSubtask","STATUS_CONFIG","StatusIcon","icon","StatusSelector","newStatus","statusColor","TaskGrid","ROW_HEIGHT","_templates","onTaskClick","onTaskDblClick","onTaskContextMenu","onTaskToggle","_scrollTop","onTaskUpdate","onMultiTaskDelete","onCreateSubtask","hoveredTaskId","setHoveredTaskId","showKeyboardHelp","setShowKeyboardHelp","editingTaskId","setEditingTaskId","editingTaskName","setEditingTaskName","keyboardHelpRef","editInputRef","contextMenu","setContextMenu","handleSelectionClick","handleRenameStart","HEADER_HEIGHT","getDuration","handleRenameSave","handleRenameCancel","handleCreateSubtaskClick","renderCellContent","isHovered","ChevronDown","taskAssignedUsers","getHeaderContextMenuItems","getTaskContextMenuItems","newProgress","visibleColumns","Keyboard","initialX","initialWidth","dragMode","setDragMode","dragOffset","setDragOffset","ghostX","setGhostX","ghostWidth","setGhostWidth","connectionLine","setConnectionLine","activeZone","setActiveZone","draggedSegmentIndex","setDraggedSegmentIndex","draggedSegmentStartX","setDraggedSegmentStartX","segmentDragOffsetX","setSegmentDragOffsetX","hoveredSegmentIndex","setHoveredSegmentIndex","setIsHovered","TaskBar","dayWidth","onDoubleClick","onContextMenu","onDateChange","onDependencyCreate","allTaskPositions","svgRef","isResizing","isConnecting","resetDragState","borderRadius","isOverdue","isAtRisk","isNeutralTheme","RESIZE_ZONE","barWidth","isSmallBar","isVerySmallBar","formatDate","snapToDay","pixelX","pixelToDate","findTaskAtPoint","pointX","pointY","taskPos","handleMouseDown","mode","segmentX","svgElement","svgPoint","effectiveX","actualMode","relativeX","handleMouseMove","targetTaskId","rawNewX","snappedX","segmentOffset","rawNewStart","snappedStart","newWidth","rawNewEnd","handleMouseUp","taskDuration","newStartDate","newEndDate","isValid","dayOffset","updatedSegments","seg","idx","newSegStart","newSegEnd","allDates","newTaskStart","newTaskEnd","handleGlobalMouseMove","handleGlobalMouseUp","displayX","displayWidth","tooltipContent","tooltipText","customClass","segment","segmentStartX","segmentWidth","isThisSegmentDragging","isThisSegmentHovered","displaySegmentX","labelText","truncated","DependencyLine","x1","y1","x2","y2","dx","dy","midX","path","arrowSize","angle","arrowX2","arrowY2","lineColor","Milestone","Timeline","onTaskDateChange","onDependencyDelete","totalDays","timelineWidth","getWeekNumber","dayNum","yearStart","isWeekend","handleTimelineClick","clickedDate","getTaskPosition","taskStart","taskEnd","rangeStart","daysFromStart","taskPositions","weekNum","todayX","isWeekendDay","hasTaskBar","toIndex","depTask","fromIndex","fromPos","toPos","isContainer","useUndoRedo","initialState","maxHistorySize","history","setHistory","isApplyingHistory","newStateOrUpdater","addToHistory","currentHistory","resolvedNewState","newPast","undo","previous","redo","newFuture","clearHistory","useGanttUndoRedoKeys","canUndo","canRedo","ctrlKey","ganttUtils","durationDays","diffMs","dayOfWeek","workingDays","daysAdded","fromTaskId","toTaskId","dependencyMap","buildMap","taskList","existingDeps","visited","recStack","hasCycle","flatten","parents","currentId","json","parsed","flat","dateString","tasksWithDates","task1","task2","ascending","diff","newId","autoTable","XLSX","worksheet","columnWidths","workbook","earlyDates","calculateEarlyDates","es","depEF","ef","projectEnd","lateDates","calculateLateDates","successors","lf","successor","succLS","ls","criticalPath","early","late","slack","dependents","daysToEnd","earliestDepStart","changedTaskId","changedTask","updatedTasks","dependent","updateTaskRec","splitDate","gapDays","firstSegmentEnd","secondSegmentStart","segments","tasksList","defaultTemplates","assigneeNames","classes","mergeTemplates","userTemplates","getRowHeight","density","GanttBoard","forwardRef","onTasksChange","initialTimeScale","initialRowDensity","onProgressChange","onBeforeTaskAdd","onAfterTaskAdd","onBeforeTaskUpdate","onAfterTaskUpdate","onBeforeTaskDelete","onAfterTaskDelete","globalTheme","setCurrentTheme","setTimeScale","setRowDensity","setZoom","scrollTop","setScrollTop","setIsResizing","gridWidthOverride","setGridWidthOverride","handleThemeChange","localTasks","setLocalTasks","setColumns","calculatedGridWidth","gridWidth","gridScrollRef","timelineScrollRef","ganttContainerRef","mergedTemplates","tasksWithCriticalPath","criticalPathIds","markCritical","rowHeight","useImperativeHandle","addToParent","remove","expand","collapse","expandAll","collapseAll","imported","handleToggleColumn","handleTaskToggle","handleTaskUpdate","oldProgress","updateTask","updatedTask","handleTaskDelete","deleteTask","handleTaskIndent","handleTaskOutdent","handleTaskMove","handleMultiTaskDelete","handleTaskDuplicate","handleTaskCreate","handleTaskRename","handleCreateSubtask","handleTaskDateChange","newStart","newEnd","updateTaskDates","handleTaskContextMenu","handleSplitTask","wouldCreateCircularDependency","handleDependencyCreate","fromTask","updateTaskDependencies","handleDependencyDelete","dependencyId","removeTaskDependency","minDate","maxDate","gridScroll","timelineScroll","disableSync","handleGridScroll","handleTimelineScroll","startTime","endTime","midTime","TaskFormModal","onSubmit","themeColors","inputStyle","labelStyle","formData","setFormData","setErrors","validate","newErrors","handleSubmit","handleChange","field","X","AlertCircle","CheckCircle2","Clock","MilestoneIcon","Users","n","mapCardStatusToTaskStatus","mapTaskStatusToCardStatus","cardToGanttTask","assignees","parseDate","isMilestone","ganttTaskToCardUpdate","assignee","cardsToGanttTasks","CardStack","stack","onToggleExpand","onUnstack","onDeleteStack","stackCards","stats","totalCards","uniqueAssignees","handleToggle","DEFAULT_TIMELINE_CONFIG","formatEventDescription","getEventIcon","getEventColor","CardHistoryTimeline","filter","onFilterChange","onClearFilter","onEventClick","selectedEventId","customConfig","expandedEvents","setExpandedEvents","timelineRef","groupedEvents","dateKey","group","uniqueUsers","uniqueTypes","types","toggleEvent","eventId","formatRelativeTime","diffMins","diffHours","diffDays","activeFilterCount","eventIndex","isExpanded","eventColor","change","CardHistoryReplay","replayState","onStartReplay","onStopReplay","onTogglePlayback","onPrevious","onNext","onGoToEvent","onSpeedChange","speeds","currentEvent","speed","getRelationshipColor","getRelationshipLabel","getRelationshipIcon","isDirectionalRelationship","runForceSimulation","nodes","edges","iterations","simNodes","nodeMap","iter","alpha","centerX","centerY","other","distance","force","edge","source","CardRelationshipsGraph","_filter","_onFilterChange","onInteraction","simulatedNodes","setSimulatedNodes","draggingNode","setDraggingNode","hoveredNode","setHoveredNode","hoveredEdge","setHoveredEdge","pan","setPan","simulated","handleNodeMouseDown","handleNodeClick","handleEdgeClick","getNodePosition","getNodeColor","z","sourcePos","targetPos","isDirectional","isCritical","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","cost","AIUsageTracker","operation","fullOperation","timeRange","operations","op","totalOperations","totalCost","totalInputTokens","totalOutputTokens","successfulOps","totalDuration","operationsByFeature","costsByFeature","limit","planTier","period","periodOperations","remaining","percentUsed","aiUsageTracker","AIUsageDashboard","setStats","setLimit","interval","recentOps","feature","GenerateGanttTasksDialog","onTasksGenerated","onGenerateTasks","projectName","setStartDate","setEndDate","generatedTasks","setGeneratedTasks","responseMetadata","setResponseMetadata","response","handleApplyTasks","similarity","useKanbanState","initialBoard","onPersist","setBoard","persistBoard","updatedBoard","handleCardMove","sourceColumnId","updatedCard","updatedCards","updatedColumns","targetCards","handleCardCreate","newCardId","newCard","handleCardDelete","handleColumnCreate","newColumnId","newColumn","handleColumnUpdate","handleColumnDelete","addCard","addColumn","clearBoard","useBoard","initialData","helpers","utils","maxPosition","DEFAULT_FILTERS","DEFAULT_SORT","useFilters","initialFilters","initialSort","setFiltersState","setSortState","setFilters","newFilters","setSort","newSort","resetFilters","filterMyTasks","filterOverdue","filterHighPriority","applyFilters","query","todayString","dueDate","dueDateString","m","todayDate","cardDueDate","weekFromNow","due","comparison","aCreated","bCreated","priorityOrder","aPriority","bPriority","aDue","bDue","aTime","bTime","aEst","bEst","generateObject","generateText","aiSDK","useAI","setIsLoading","isAvailable","_boardState","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","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","changes","columnData","updateColumn","deleteColumn","getColumn","updateCard","deleteCard","moveCard","toColumnId","newPosition","getCard","getCardsByColumn","useFilteredCards","matchesTitle","matchesDesc","useSortedCards","sortBy","sortOrder","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","fontSize","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.js","sourcesContent":["/**\r\n * KanbanViewAdapter - ViewAdapter implementation for Kanban board\r\n * @module views/KanbanViewAdapter\r\n *\r\n * Implements the ViewAdapter interface from @libxai/core to enable\r\n * the Kanban board to work with AsakaaRuntime and ViewRegistry.\r\n */\r\n\r\nimport { createRoot, type Root } from 'react-dom/client'\r\nimport { BaseViewAdapter, type ViewBoardData, type ViewOptions, type ExportFormat } from '@libxai/core'\r\nimport { KanbanBoard } from '../components/Board'\r\nimport type { KanbanBoardProps } from '../types'\r\nimport type { Card, Column } from '../types'\r\n\r\n/**\r\n * Kanban view configuration\r\n */\r\nexport interface KanbanViewConfig {\r\n /**\r\n * Board callbacks\r\n */\r\n callbacks?: KanbanBoardProps['callbacks']\r\n\r\n /**\r\n * Card click handler\r\n */\r\n onCardClick?: KanbanBoardProps['onCardClick']\r\n\r\n /**\r\n * Custom render props\r\n */\r\n renderProps?: KanbanBoardProps['renderProps']\r\n\r\n /**\r\n * Board configuration\r\n */\r\n config?: KanbanBoardProps['config']\r\n\r\n /**\r\n * Available users for assignment\r\n */\r\n availableUsers?: KanbanBoardProps['availableUsers']\r\n\r\n /**\r\n * Custom class name\r\n */\r\n className?: string\r\n\r\n /**\r\n * Custom inline styles (React.CSSProperties)\r\n */\r\n style?: React.CSSProperties\r\n\r\n /**\r\n * View options\r\n */\r\n viewOptions?: ViewOptions\r\n}\r\n\r\n/**\r\n * KanbanViewAdapter\r\n *\r\n * React-based ViewAdapter implementation that wraps the KanbanBoard component.\r\n * This allows the Kanban board to be used as a view in the ViewRegistry and\r\n * work seamlessly with AsakaaRuntime.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { KanbanViewAdapter } from '@libxai/board'\r\n * import { ViewRegistry } from '@libxai/core'\r\n *\r\n * const registry = new ViewRegistry()\r\n * const kanbanView = new KanbanViewAdapter({\r\n * callbacks: {\r\n * onCardMove: (cardId, columnId) => { ... },\r\n * onCardUpdate: (cardId, updates) => { ... }\r\n * }\r\n * })\r\n *\r\n * registry.register(kanbanView)\r\n * await registry.activate('kanban', container, data)\r\n * ```\r\n */\r\nexport class KanbanViewAdapter extends BaseViewAdapter<ViewBoardData> {\r\n readonly id = 'kanban'\r\n readonly name = 'Kanban Board'\r\n readonly version = '1.0.0'\r\n readonly description = ''\r\n readonly icon = ''\r\n readonly supportedExports: ExportFormat[] = ['json', 'csv', 'pdf', 'png']\r\n\r\n private root: Root | null = null\r\n private kanbanConfig: KanbanViewConfig\r\n\r\n constructor(config: KanbanViewConfig = {}) {\r\n super()\r\n\r\n // Set description and icon after construction\r\n ;(this as any).description = 'Interactive Kanban board with drag & drop, filters, and real-time updates'\r\n ;(this as any).icon = '📋'\r\n\r\n this.kanbanConfig = config\r\n this.options = {\r\n animations: config.viewOptions?.animations ?? true,\r\n virtualScrolling: config.viewOptions?.virtualScrolling ?? false,\r\n theme: config.viewOptions?.theme ?? 'dark',\r\n readonly: config.viewOptions?.readonly ?? false,\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // LIFECYCLE\r\n // ========================================================================\r\n\r\n /**\r\n * Mount the Kanban view\r\n *\r\n * @param container - DOM element to mount into\r\n * @param data - Initial board data\r\n */\r\n mount(container: HTMLElement, data: ViewBoardData): void {\r\n if (this.isMounted()) {\r\n console.warn('[KanbanViewAdapter] Already mounted, unmounting first')\r\n this.unmount()\r\n }\r\n\r\n // Store references\r\n this.container = container\r\n this.data = data\r\n\r\n // Create React root\r\n this.root = createRoot(container)\r\n\r\n // Render Kanban board\r\n this.render()\r\n\r\n // Emit mounted event\r\n this.emit('view:mounted', { viewId: this.id, timestamp: Date.now() })\r\n }\r\n\r\n /**\r\n * Unmount the Kanban view\r\n */\r\n unmount(): void {\r\n if (!this.isMounted()) {\r\n return\r\n }\r\n\r\n // Emit unmounted event BEFORE cleanup\r\n this.emit('view:unmounted', { viewId: this.id, timestamp: Date.now() })\r\n\r\n // Unmount React\r\n if (this.root) {\r\n this.root.unmount()\r\n this.root = null\r\n }\r\n\r\n // Clear references\r\n if (this.container) {\r\n this.container.innerHTML = ''\r\n this.container = null\r\n }\r\n\r\n this.data = null\r\n }\r\n\r\n /**\r\n * Update the view with new data\r\n *\r\n * @param data - New board data\r\n */\r\n update(data: ViewBoardData): void {\r\n if (!this.isMounted()) {\r\n console.warn('[KanbanViewAdapter] Not mounted, cannot update')\r\n return\r\n }\r\n\r\n this.data = data\r\n this.render()\r\n\r\n this.emit('view:updated', { viewId: this.id, data })\r\n }\r\n\r\n /**\r\n * Configure the view\r\n *\r\n * @param options - View options\r\n */\r\n configure(options: ViewOptions): void {\r\n this.options = { ...this.options, ...options }\r\n\r\n // Re-render if mounted\r\n if (this.isMounted()) {\r\n this.render()\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // EXPORT\r\n // ========================================================================\r\n\r\n /**\r\n * Export the view to a specific format\r\n *\r\n * @param format - Export format\r\n * @returns Promise resolving to exported data\r\n */\r\n async export(format: 'json' | 'csv' | 'pdf' | 'png'): Promise<string | Blob> {\r\n if (!this.data) {\r\n throw new Error('No data to export')\r\n }\r\n\r\n switch (format) {\r\n case 'json':\r\n return JSON.stringify(this.data, null, 2)\r\n\r\n case 'csv':\r\n return this.exportToCSV()\r\n\r\n case 'pdf':\r\n return this.exportToPDF()\r\n\r\n case 'png':\r\n return this.exportToPNG()\r\n\r\n default:\r\n throw new Error(`Unsupported export format: ${format}`)\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // PRIVATE METHODS\r\n // ========================================================================\r\n\r\n /**\r\n * Render the Kanban board\r\n */\r\n private render(): void {\r\n if (!this.root || !this.data) {\r\n return\r\n }\r\n\r\n // Convert ViewBoardData to KanbanBoard props format\r\n const board = {\r\n id: this.data.board?.id || 'board-1',\r\n title: this.data.board?.title || 'Untitled Board',\r\n columns: this.data.columns,\r\n cards: this.data.cards,\r\n }\r\n\r\n // Render React component\r\n this.root.render(\r\n <KanbanBoard\r\n board={board}\r\n callbacks={this.kanbanConfig.callbacks || {}}\r\n onCardClick={this.kanbanConfig.onCardClick}\r\n renderProps={this.kanbanConfig.renderProps}\r\n config={this.kanbanConfig.config}\r\n availableUsers={this.kanbanConfig.availableUsers}\r\n className={this.kanbanConfig.className}\r\n style={this.kanbanConfig.style}\r\n />\r\n )\r\n }\r\n\r\n /**\r\n * Export board data to CSV format\r\n */\r\n private exportToCSV(): string {\r\n if (!this.data) return ''\r\n\r\n const rows: string[][] = [\r\n ['Card ID', 'Title', 'Column', 'Description', 'Labels', 'Assignees', 'Due Date', 'Position'],\r\n ]\r\n\r\n this.data.cards.forEach((card: Card) => {\r\n const column = this.data!.columns.find((col: Column) => col.id === card.columnId)\r\n rows.push([\r\n card.id,\r\n card.title,\r\n column?.title || '',\r\n card.description || '',\r\n card.labels?.join(', ') || '',\r\n card.assignedUserIds?.join(', ') || card.assigneeId || '',\r\n card.dueDate?.toString() || '',\r\n card.position.toString(),\r\n ])\r\n })\r\n\r\n return rows.map((row) => row.map((cell) => `\"${cell}\"`).join(',')).join('\\n')\r\n }\r\n\r\n /**\r\n * Export board to PDF\r\n * Uses the PDF export functionality from the Board component\r\n */\r\n private async exportToPDF(): Promise<Blob> {\r\n // TODO: Integrate with PDF export from CardDetailModal/PDFExport\r\n // For now, return a simple PDF placeholder\r\n throw new Error('PDF export not yet implemented in ViewAdapter')\r\n }\r\n\r\n /**\r\n * Export board to PNG image\r\n * Uses html2canvas to capture the board\r\n */\r\n private async exportToPNG(): Promise<Blob> {\r\n if (!this.container) {\r\n throw new Error('View not mounted')\r\n }\r\n\r\n // Dynamic import to avoid bundling if not used\r\n const html2canvas = await import('html2canvas')\r\n\r\n const canvas = await html2canvas.default(this.container, {\r\n backgroundColor: this.options.theme === 'dark' ? '#1a1a1a' : '#ffffff',\r\n scale: 2, // Higher resolution\r\n })\r\n\r\n return new Promise((resolve, reject) => {\r\n canvas.toBlob((blob) => {\r\n if (blob) {\r\n resolve(blob)\r\n } else {\r\n reject(new Error('Failed to create PNG blob'))\r\n }\r\n }, 'image/png')\r\n })\r\n }\r\n}\r\n\r\n// ========================================================================\r\n// FACTORY FUNCTION\r\n// ========================================================================\r\n\r\n/**\r\n * Create a new Kanban view adapter\r\n *\r\n * @param config - View configuration\r\n * @returns KanbanViewAdapter instance\r\n *\r\n * @example\r\n * ```typescript\r\n * const kanbanView = createKanbanView({\r\n * callbacks: {\r\n * onCardMove: (cardId, columnId) => console.log('Card moved'),\r\n * },\r\n * theme: 'dark',\r\n * })\r\n * ```\r\n */\r\nexport function createKanbanView(config: KanbanViewConfig = {}): KanbanViewAdapter {\r\n return new KanbanViewAdapter(config)\r\n}\r\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-blue-500') // => 'text-blue-500' if condition is true\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n","/**\r\n * Lexicographic positioning utilities\r\n * Uses fractional indexing for efficient reordering without touching all items\r\n * @module utils/positioning\r\n */\r\n\r\n/**\r\n * Calculate position between two items\r\n * Uses lexicographic ordering (fractional indexing)\r\n *\r\n * @param before - Position of item before (or null if first)\r\n * @param after - Position of item after (or null if last)\r\n * @returns New position value\r\n *\r\n * @example\r\n * calculatePosition(null, 1000) // => 500 (before first item)\r\n * calculatePosition(1000, 2000) // => 1500 (between two items)\r\n * calculatePosition(1000, null) // => 2000 (after last item)\r\n */\r\nexport function calculatePosition(\r\n before: number | null,\r\n after: number | null\r\n): number {\r\n // First item\r\n if (before === null && after === null) {\r\n return 1000\r\n }\r\n\r\n // Insert at beginning\r\n if (before === null && after !== null) {\r\n return after / 2\r\n }\r\n\r\n // Insert at end\r\n if (before !== null && after === null) {\r\n return before + 1000\r\n }\r\n\r\n // Insert between\r\n if (before !== null && after !== null) {\r\n return (before + after) / 2\r\n }\r\n\r\n return 1000\r\n}\r\n\r\n/**\r\n * Generate initial positions for an array of items\r\n * Spaces them 1000 apart for room to insert\r\n *\r\n * @param count - Number of items\r\n * @returns Array of position values\r\n */\r\nexport function generateInitialPositions(count: number): number[] {\r\n return Array.from({ length: count }, (_, i) => (i + 1) * 1000)\r\n}\r\n\r\n/**\r\n * Rebalance positions when they get too close\r\n * Call this periodically to maintain clean spacing\r\n *\r\n * @param positions - Current positions (sorted)\r\n * @returns Rebalanced positions\r\n */\r\nexport function rebalancePositions(positions: number[]): number[] {\r\n if (positions.length === 0) return []\r\n if (positions.length === 1) return [1000]\r\n\r\n const sorted = [...positions].sort((a, b) => a - b)\r\n return sorted.map((_, i) => (i + 1) * 1000)\r\n}\r\n\r\n/**\r\n * Check if positions need rebalancing\r\n * Returns true if any two positions are < 1 apart\r\n */\r\nexport function needsRebalancing(positions: number[]): boolean {\r\n const sorted = [...positions].sort((a, b) => a - b)\r\n\r\n for (let i = 0; i < sorted.length - 1; i++) {\r\n if (sorted[i + 1]! - sorted[i]! < 1) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * Find position for dropping a card\r\n *\r\n * @param columnCards - Cards in target column (sorted by position)\r\n * @param dropIndex - Index where card is dropped\r\n * @returns New position value\r\n */\r\nexport function calculateDropPosition(\r\n columnCards: { position: number }[],\r\n dropIndex: number\r\n): number {\r\n // Empty column\r\n if (columnCards.length === 0) {\r\n return 1000\r\n }\r\n\r\n // Drop at beginning\r\n if (dropIndex === 0) {\r\n return calculatePosition(null, columnCards[0]!.position)\r\n }\r\n\r\n // Drop at end\r\n if (dropIndex >= columnCards.length) {\r\n return calculatePosition(\r\n columnCards[columnCards.length - 1]!.position,\r\n null\r\n )\r\n }\r\n\r\n // Drop between items\r\n return calculatePosition(\r\n columnCards[dropIndex - 1]!.position,\r\n columnCards[dropIndex]!.position\r\n )\r\n}\r\n","/**\r\n * Performance utilities\r\n * @module utils/performance\r\n */\r\n\r\nimport { useEffect, useRef } from 'react'\r\n\r\n/**\r\n * Debounce function calls\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n wait: number\r\n): (...args: Parameters<T>) => void {\r\n let timeout: ReturnType<typeof setTimeout> | null = null\r\n\r\n return function executedFunction(...args: Parameters<T>) {\r\n const later = () => {\r\n timeout = null\r\n func(...args)\r\n }\r\n\r\n if (timeout) {\r\n clearTimeout(timeout)\r\n }\r\n timeout = setTimeout(later, wait)\r\n }\r\n}\r\n\r\n/**\r\n * Throttle function calls\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n func: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle: boolean\r\n let lastResult: ReturnType<T>\r\n\r\n return function executedFunction(...args: Parameters<T>) {\r\n if (!inThrottle) {\r\n inThrottle = true\r\n setTimeout(() => (inThrottle = false), limit)\r\n lastResult = func(...args)\r\n }\r\n return lastResult\r\n }\r\n}\r\n\r\n/**\r\n * Custom hook for measuring render performance\r\n * Only active in development\r\n */\r\nexport function useRenderPerformance(componentName: string) {\r\n const renderCount = useRef(0)\r\n const lastRenderTime = useRef<number>(0)\r\n\r\n if (process.env.NODE_ENV === 'development') {\r\n const start = performance.now()\r\n\r\n useEffect(() => {\r\n const end = performance.now()\r\n renderCount.current++\r\n const renderTime = end - start\r\n\r\n if (renderTime > 16) {\r\n // > 1 frame at 60fps\r\n console.warn(\r\n `[Performance] ${componentName} render #${renderCount.current} took ${renderTime.toFixed(2)}ms`\r\n )\r\n }\r\n\r\n lastRenderTime.current = renderTime\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * Check if virtualization should be enabled\r\n */\r\nexport function shouldVirtualize(itemCount: number, threshold = 100): boolean {\r\n return itemCount > threshold\r\n}\r\n\r\n/**\r\n * Request idle callback wrapper with fallback\r\n */\r\nexport const requestIdleCallback =\r\n typeof window !== 'undefined' && 'requestIdleCallback' in window\r\n ? window.requestIdleCallback\r\n : (cb: IdleRequestCallback) => setTimeout(cb, 1)\r\n\r\n/**\r\n * Cancel idle callback wrapper with fallback\r\n */\r\nexport const cancelIdleCallback =\r\n typeof window !== 'undefined' && 'cancelIdleCallback' in window\r\n ? window.cancelIdleCallback\r\n : (id: number) => clearTimeout(id)\r\n\r\n/**\r\n * Memoization helper for expensive computations\r\n */\r\nexport function memoize<T extends (...args: any[]) => any>(fn: T): T {\r\n const cache = new Map<string, ReturnType<T>>()\r\n\r\n return ((...args: Parameters<T>) => {\r\n const key = JSON.stringify(args)\r\n if (cache.has(key)) {\r\n return cache.get(key)!\r\n }\r\n const result = fn(...args)\r\n cache.set(key, result)\r\n return result\r\n }) as T\r\n}\r\n","/**\r\n * Retry utilities with exponential backoff\r\n * For resilient API calls and persistence operations\r\n * @module utils/retry\r\n */\r\n\r\nexport interface RetryOptions {\r\n /** Maximum number of retry attempts (default: 3) */\r\n maxAttempts?: number\r\n /** Initial delay in ms (default: 1000) */\r\n initialDelay?: number\r\n /** Multiplier for exponential backoff (default: 2) */\r\n backoffMultiplier?: number\r\n /** Maximum delay in ms (default: 10000) */\r\n maxDelay?: number\r\n /** Function to determine if error should be retried */\r\n shouldRetry?: (error: Error, attempt: number) => boolean\r\n /** Callback when retry is attempted */\r\n onRetry?: (error: Error, attempt: number, delay: number) => void\r\n}\r\n\r\nexport interface RetryResult<T> {\r\n data?: T\r\n error?: Error\r\n attempts: number\r\n success: boolean\r\n}\r\n\r\n/**\r\n * Default retry logic - retries on network errors\r\n */\r\nconst defaultShouldRetry = (error: Error): boolean => {\r\n // Retry on network errors\r\n if (error.message.includes('network') || error.message.includes('fetch')) {\r\n return true\r\n }\r\n\r\n // Retry on specific error codes\r\n if ('status' in error) {\r\n const status = (error as any).status\r\n // Retry on server errors (5xx) and rate limiting (429)\r\n return status >= 500 || status === 429\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * Calculate delay with exponential backoff\r\n */\r\nfunction calculateDelay(\r\n attempt: number,\r\n initialDelay: number,\r\n backoffMultiplier: number,\r\n maxDelay: number\r\n): number {\r\n const delay = initialDelay * Math.pow(backoffMultiplier, attempt - 1)\r\n // Add jitter (random variation) to prevent thundering herd\r\n const jitter = delay * 0.2 * Math.random()\r\n return Math.min(delay + jitter, maxDelay)\r\n}\r\n\r\n/**\r\n * Retry a function with exponential backoff\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await retryWithBackoff(\r\n * () => api.updateBoard(board),\r\n * {\r\n * maxAttempts: 3,\r\n * onRetry: (error, attempt) => {\r\n * console.log(`Retry attempt ${attempt}: ${error.message}`)\r\n * }\r\n * }\r\n * )\r\n * ```\r\n */\r\nexport async function retryWithBackoff<T>(\r\n fn: () => Promise<T>,\r\n options: RetryOptions = {}\r\n): Promise<RetryResult<T>> {\r\n const {\r\n maxAttempts = 3,\r\n initialDelay = 1000,\r\n backoffMultiplier = 2,\r\n maxDelay = 10000,\r\n shouldRetry = defaultShouldRetry,\r\n onRetry,\r\n } = options\r\n\r\n let lastError: Error | undefined\r\n let attempts = 0\r\n\r\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\r\n attempts = attempt\r\n\r\n try {\r\n const data = await fn()\r\n return {\r\n data,\r\n attempts,\r\n success: true,\r\n }\r\n } catch (error) {\r\n lastError = error as Error\r\n\r\n // Check if we should retry\r\n const isLastAttempt = attempt === maxAttempts\r\n if (isLastAttempt || !shouldRetry(lastError, attempt)) {\r\n return {\r\n error: lastError,\r\n attempts,\r\n success: false,\r\n }\r\n }\r\n\r\n // Calculate delay for next attempt\r\n const delay = calculateDelay(attempt, initialDelay, backoffMultiplier, maxDelay)\r\n\r\n // Call retry callback\r\n if (onRetry) {\r\n try {\r\n onRetry(lastError, attempt, delay)\r\n } catch (callbackError) {\r\n console.error('Error in retry callback:', callbackError)\r\n }\r\n }\r\n\r\n // Wait before retrying\r\n await new Promise((resolve) => setTimeout(resolve, delay))\r\n }\r\n }\r\n\r\n // This should never be reached, but TypeScript doesn't know that\r\n return {\r\n error: lastError || new Error('Unknown error'),\r\n attempts,\r\n success: false,\r\n }\r\n}\r\n\r\n/**\r\n * Retry a function synchronously (for non-async operations)\r\n * No backoff, just immediate retries\r\n */\r\nexport function retrySyncOperation<T>(\r\n fn: () => T,\r\n maxAttempts: number = 3\r\n): { data?: T; error?: Error; success: boolean } {\r\n let lastError: Error | undefined\r\n\r\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\r\n try {\r\n const data = fn()\r\n return { data, success: true }\r\n } catch (error) {\r\n lastError = error as Error\r\n\r\n if (attempt === maxAttempts) {\r\n return { error: lastError, success: false }\r\n }\r\n }\r\n }\r\n\r\n return { error: lastError || new Error('Unknown error'), success: false }\r\n}\r\n\r\n/**\r\n * Create a retry wrapper function\r\n * Returns a function that automatically retries on failure\r\n *\r\n * @example\r\n * ```ts\r\n * const saveBoard = createRetryWrapper(\r\n * api.saveBoard,\r\n * { maxAttempts: 3 }\r\n * )\r\n *\r\n * const result = await saveBoard(boardData)\r\n * ```\r\n */\r\nexport function createRetryWrapper<TArgs extends any[], TReturn>(\r\n fn: (...args: TArgs) => Promise<TReturn>,\r\n options: RetryOptions = {}\r\n): (...args: TArgs) => Promise<RetryResult<TReturn>> {\r\n return async (...args: TArgs) => {\r\n return retryWithBackoff(() => fn(...args), options)\r\n }\r\n}\r\n\r\n/**\r\n * Retry with circuit breaker pattern\r\n * Stops retrying if too many failures occur\r\n */\r\nexport class CircuitBreaker {\r\n private failures: number = 0\r\n private lastFailureTime: number = 0\r\n private isOpen: boolean = false\r\n\r\n constructor(\r\n private threshold: number = 5,\r\n private resetTimeout: number = 60000 // 1 minute\r\n ) {}\r\n\r\n async execute<T>(fn: () => Promise<T>): Promise<T> {\r\n // Check if circuit is open\r\n if (this.isOpen) {\r\n const timeSinceLastFailure = Date.now() - this.lastFailureTime\r\n\r\n // Try to close circuit after reset timeout\r\n if (timeSinceLastFailure >= this.resetTimeout) {\r\n this.reset()\r\n } else {\r\n throw new Error('Circuit breaker is open - too many failures')\r\n }\r\n }\r\n\r\n try {\r\n const result = await fn()\r\n this.onSuccess()\r\n return result\r\n } catch (error) {\r\n this.onFailure()\r\n throw error\r\n }\r\n }\r\n\r\n private onSuccess(): void {\r\n this.failures = 0\r\n this.isOpen = false\r\n }\r\n\r\n private onFailure(): void {\r\n this.failures++\r\n this.lastFailureTime = Date.now()\r\n\r\n if (this.failures >= this.threshold) {\r\n this.isOpen = true\r\n }\r\n }\r\n\r\n private reset(): void {\r\n this.failures = 0\r\n this.isOpen = false\r\n }\r\n\r\n getStatus(): { failures: number; isOpen: boolean } {\r\n return {\r\n failures: this.failures,\r\n isOpen: this.isOpen,\r\n }\r\n }\r\n}\r\n","/**\r\n * Structured Logger for ASAKAA\r\n * Lightweight, browser-compatible logging system\r\n * @module utils/logger\r\n */\r\n\r\nexport enum LogLevel {\r\n DEBUG = 0,\r\n INFO = 1,\r\n WARN = 2,\r\n ERROR = 3,\r\n NONE = 4,\r\n}\r\n\r\nexport interface LogContext {\r\n [key: string]: any\r\n}\r\n\r\nexport interface LogEntry {\r\n timestamp: string\r\n level: string\r\n message: string\r\n context?: LogContext\r\n component?: string\r\n action?: string\r\n duration?: number\r\n error?: {\r\n message: string\r\n stack?: string\r\n name: string\r\n }\r\n}\r\n\r\nexport interface LoggerOptions {\r\n /** Minimum log level (default: INFO in production, DEBUG in development) */\r\n minLevel?: LogLevel\r\n /** Enable/disable logging (default: true) */\r\n enabled?: boolean\r\n /** Custom log handler for sending logs to external service */\r\n onLog?: (entry: LogEntry) => void\r\n /** Enable performance timing (default: true) */\r\n enableTiming?: boolean\r\n /** Component name prefix */\r\n componentName?: string\r\n}\r\n\r\n/**\r\n * Structured Logger Class\r\n *\r\n * @example\r\n * ```ts\r\n * const logger = new Logger({ componentName: 'KanbanBoard' })\r\n *\r\n * logger.info('Board loaded', { boardId: 'abc-123', cardCount: 42 })\r\n * logger.warn('Slow operation detected', { duration: 1500 })\r\n * logger.error('Failed to save', { error: err })\r\n *\r\n * // With timing\r\n * const timer = logger.startTimer('drag-operation')\r\n * // ... do work\r\n * timer.end({ cardId: 'card-1' })\r\n * ```\r\n */\r\nexport class Logger {\r\n private options: Required<LoggerOptions>\r\n private static globalOptions: Partial<LoggerOptions> = {}\r\n\r\n constructor(options: LoggerOptions = {}) {\r\n const isDev = process.env.NODE_ENV === 'development'\r\n\r\n this.options = {\r\n minLevel: options.minLevel ?? (isDev ? LogLevel.DEBUG : LogLevel.INFO),\r\n enabled: options.enabled ?? true,\r\n onLog: options.onLog ?? this.defaultLogHandler,\r\n enableTiming: options.enableTiming ?? true,\r\n componentName: options.componentName ?? 'ASAKAA',\r\n ...Logger.globalOptions,\r\n }\r\n }\r\n\r\n /**\r\n * Set global logger configuration\r\n * Applies to all logger instances\r\n */\r\n static configure(options: Partial<LoggerOptions>): void {\r\n Logger.globalOptions = { ...Logger.globalOptions, ...options }\r\n }\r\n\r\n /**\r\n * Create child logger with component name\r\n */\r\n child(componentName: string): Logger {\r\n return new Logger({\r\n ...this.options,\r\n componentName: `${this.options.componentName}:${componentName}`,\r\n })\r\n }\r\n\r\n /**\r\n * Log debug message\r\n */\r\n debug(message: string, context?: LogContext): void {\r\n this.log(LogLevel.DEBUG, message, context)\r\n }\r\n\r\n /**\r\n * Log info message\r\n */\r\n info(message: string, context?: LogContext): void {\r\n this.log(LogLevel.INFO, message, context)\r\n }\r\n\r\n /**\r\n * Log warning message\r\n */\r\n warn(message: string, context?: LogContext): void {\r\n this.log(LogLevel.WARN, message, context)\r\n }\r\n\r\n /**\r\n * Log error message\r\n */\r\n error(message: string, error?: Error, context?: LogContext): void {\r\n this.log(LogLevel.ERROR, message, {\r\n ...context,\r\n error: error\r\n ? {\r\n message: error.message,\r\n stack: error.stack,\r\n name: error.name,\r\n }\r\n : undefined,\r\n })\r\n }\r\n\r\n /**\r\n * Start a timer for performance tracking\r\n */\r\n startTimer(action: string): Timer {\r\n if (!this.options.enableTiming) {\r\n return new Timer(() => {}, false)\r\n }\r\n\r\n return new Timer(\r\n (duration: number, context?: LogContext) => {\r\n this.log(LogLevel.DEBUG, `${action} completed`, {\r\n ...context,\r\n action,\r\n duration,\r\n })\r\n },\r\n true\r\n )\r\n }\r\n\r\n /**\r\n * Core logging method\r\n */\r\n private log(level: LogLevel, message: string, context?: LogContext): void {\r\n if (!this.options.enabled || level < this.options.minLevel) {\r\n return\r\n }\r\n\r\n const entry: LogEntry = {\r\n timestamp: new Date().toISOString(),\r\n level: LogLevel[level],\r\n message,\r\n component: this.options.componentName,\r\n ...context,\r\n }\r\n\r\n this.options.onLog(entry)\r\n }\r\n\r\n /**\r\n * Default log handler (console)\r\n */\r\n private defaultLogHandler = (entry: LogEntry): void => {\r\n const { timestamp, level, message, component, ...rest } = entry\r\n\r\n const prefix = `[${timestamp}] [${level}] [${component}]`\r\n const hasContext = Object.keys(rest).length > 0\r\n\r\n switch (level) {\r\n case 'DEBUG':\r\n console.debug(prefix, message, hasContext ? rest : '')\r\n break\r\n case 'INFO':\r\n console.info(prefix, message, hasContext ? rest : '')\r\n break\r\n case 'WARN':\r\n console.warn(prefix, message, hasContext ? rest : '')\r\n break\r\n case 'ERROR':\r\n console.error(prefix, message, hasContext ? rest : '')\r\n if (entry.error?.stack) {\r\n console.error(entry.error.stack)\r\n }\r\n break\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Timer for performance tracking\r\n */\r\nclass Timer {\r\n private startTime: number\r\n\r\n constructor(\r\n private onEnd: (duration: number, context?: LogContext) => void,\r\n private enabled: boolean\r\n ) {\r\n this.startTime = enabled ? performance.now() : 0\r\n }\r\n\r\n /**\r\n * End timer and log duration\r\n */\r\n end(context?: LogContext): number {\r\n if (!this.enabled) {\r\n return 0\r\n }\r\n\r\n const duration = Math.round(performance.now() - this.startTime)\r\n this.onEnd(duration, context)\r\n return duration\r\n }\r\n\r\n /**\r\n * Get elapsed time without ending timer\r\n */\r\n elapsed(): number {\r\n if (!this.enabled) {\r\n return 0\r\n }\r\n return Math.round(performance.now() - this.startTime)\r\n }\r\n}\r\n\r\n/**\r\n * Global logger instance\r\n */\r\nexport const logger = new Logger()\r\n\r\n/**\r\n * Create a scoped logger for a component\r\n */\r\nexport function createLogger(componentName: string, options?: LoggerOptions): Logger {\r\n return new Logger({\r\n ...options,\r\n componentName,\r\n })\r\n}\r\n","import { jsPDF } from 'jspdf'\r\nimport html2canvas from 'html2canvas'\r\nimport type { Board, ExportOptions, ExportFormat } from '../types'\r\n\r\nexport function exportToJSON(board: Board, _options?: ExportOptions): string {\r\n const data = {\r\n board: {\r\n id: board.id,\r\n title: board.title,\r\n metadata: board.metadata,\r\n exportedAt: new Date().toISOString(),\r\n },\r\n columns: board.columns,\r\n cards: board.cards,\r\n options: _options,\r\n }\r\n\r\n return JSON.stringify(data, null, 2)\r\n}\r\n\r\nexport function exportToCSV(board: Board, _options?: ExportOptions): string {\r\n const headers = [\r\n 'Card ID',\r\n 'Title',\r\n 'Description',\r\n 'Column',\r\n 'Priority',\r\n 'Labels',\r\n 'Assigned Users',\r\n 'Start Date',\r\n 'End Date',\r\n 'Created At',\r\n 'Updated At',\r\n ]\r\n\r\n const rows = board.cards.map((card) => {\r\n const column = board.columns.find((col) => col.id === card.columnId)\r\n\r\n return [\r\n card.id,\r\n escapeCSV(card.title),\r\n escapeCSV(card.description || ''),\r\n escapeCSV(column?.title || ''),\r\n card.priority || '',\r\n (card.labels || []).join(';'),\r\n (card.assignedUserIds || []).join(';'),\r\n card.startDate || '',\r\n card.endDate || '',\r\n card.createdAt || '',\r\n card.updatedAt || '',\r\n ]\r\n })\r\n\r\n const csvContent = [\r\n headers.join(','),\r\n ...rows.map((row) => row.join(',')),\r\n ].join('\\n')\r\n\r\n return csvContent\r\n}\r\n\r\nexport async function exportToPDF(\r\n board: Board,\r\n boardElement?: HTMLElement,\r\n _options?: ExportOptions\r\n): Promise<jsPDF> {\r\n // Try to find board element automatically if not provided\r\n let element = boardElement\r\n\r\n if (!element) {\r\n // Look for the board element in the DOM\r\n const boardEl = document.querySelector<HTMLElement>('.asakaa-board')\r\n if (boardEl) {\r\n element = boardEl.parentElement || boardEl\r\n }\r\n }\r\n\r\n // If board element is available, capture it visually\r\n if (element) {\r\n try {\r\n const canvas = await html2canvas(element, {\r\n backgroundColor: '#0a0a0a',\r\n scale: 1.5, // Balance between quality and performance\r\n logging: false,\r\n useCORS: true,\r\n allowTaint: true,\r\n windowWidth: element.scrollWidth,\r\n windowHeight: element.scrollHeight,\r\n })\r\n\r\n const imgData = canvas.toDataURL('image/png')\r\n\r\n // Calculate dimensions for landscape PDF\r\n const pdfWidth = 297 // A4 landscape width in mm\r\n const pdfHeight = 210 // A4 landscape height in mm\r\n const imgAspect = canvas.width / canvas.height\r\n\r\n let imgWidth = pdfWidth - 20 // margins\r\n let imgHeight = imgWidth / imgAspect\r\n\r\n // If image is too tall, scale to fit height\r\n if (imgHeight > pdfHeight - 20) {\r\n imgHeight = pdfHeight - 20\r\n imgWidth = imgHeight * imgAspect\r\n }\r\n\r\n const doc = new jsPDF({\r\n orientation: 'landscape',\r\n unit: 'mm',\r\n format: 'a4',\r\n })\r\n\r\n // Add title\r\n doc.setFontSize(16)\r\n doc.setTextColor(255, 255, 255)\r\n doc.setFillColor(10, 10, 10)\r\n doc.rect(0, 0, pdfWidth, 15, 'F')\r\n doc.text(board.title || 'Kanban Board', 10, 10)\r\n\r\n // Add board image\r\n const xOffset = (pdfWidth - imgWidth) / 2\r\n doc.addImage(imgData, 'PNG', xOffset, 20, imgWidth, imgHeight)\r\n\r\n return doc\r\n } catch (error) {\r\n console.error('Error capturing board:', error)\r\n // Fall back to text-based export\r\n }\r\n }\r\n\r\n // Fallback: Text-based PDF export\r\n const doc = new jsPDF()\r\n let yPosition = 20\r\n\r\n doc.setFontSize(20)\r\n doc.text(board.title || 'Kanban Board', 20, yPosition)\r\n yPosition += 10\r\n\r\n doc.setFontSize(10)\r\n doc.setTextColor(128, 128, 128)\r\n doc.text(`Exported on ${new Date().toLocaleString()}`, 20, yPosition)\r\n yPosition += 15\r\n\r\n doc.setTextColor(0, 0, 0)\r\n\r\n board.columns.forEach((column) => {\r\n const columnCards = board.cards.filter((card) => card.columnId === column.id)\r\n\r\n if (yPosition > 250) {\r\n doc.addPage()\r\n yPosition = 20\r\n }\r\n\r\n doc.setFontSize(16)\r\n doc.setFont('helvetica', 'bold')\r\n doc.text(column.title, 20, yPosition)\r\n yPosition += 8\r\n\r\n if (columnCards.length === 0) {\r\n doc.setFontSize(10)\r\n doc.setFont('helvetica', 'italic')\r\n doc.setTextColor(128, 128, 128)\r\n doc.text('No cards in this column', 20, yPosition)\r\n doc.setTextColor(0, 0, 0)\r\n yPosition += 10\r\n } else {\r\n columnCards.forEach((card) => {\r\n if (yPosition > 260) {\r\n doc.addPage()\r\n yPosition = 20\r\n }\r\n\r\n doc.setFontSize(12)\r\n doc.setFont('helvetica', 'bold')\r\n doc.text(card.title, 25, yPosition)\r\n yPosition += 6\r\n\r\n if (card.description) {\r\n doc.setFontSize(9)\r\n doc.setFont('helvetica', 'normal')\r\n const lines = doc.splitTextToSize(card.description, 160)\r\n doc.text(lines, 25, yPosition)\r\n yPosition += lines.length * 5\r\n }\r\n\r\n const metadata: string[] = []\r\n if (card.priority) metadata.push(`Priority: ${card.priority}`)\r\n if (card.labels && card.labels.length > 0) {\r\n metadata.push(`Labels: ${card.labels.join(', ')}`)\r\n }\r\n if (card.assignedUserIds && card.assignedUserIds.length > 0) {\r\n metadata.push(`Assigned: ${card.assignedUserIds.length} user(s)`)\r\n }\r\n if (card.startDate || card.endDate) {\r\n const dates = []\r\n if (card.startDate) dates.push(`Start: ${card.startDate}`)\r\n if (card.endDate) dates.push(`End: ${card.endDate}`)\r\n metadata.push(dates.join(' → '))\r\n }\r\n\r\n if (metadata.length > 0) {\r\n doc.setFontSize(8)\r\n doc.setTextColor(100, 100, 100)\r\n doc.text(metadata.join(' • '), 25, yPosition)\r\n doc.setTextColor(0, 0, 0)\r\n yPosition += 5\r\n }\r\n\r\n yPosition += 5\r\n })\r\n }\r\n\r\n yPosition += 5\r\n })\r\n\r\n return doc\r\n}\r\n\r\nfunction escapeCSV(value: string): string {\r\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\r\n return `\"${value.replace(/\"/g, '\"\"')}\"`\r\n }\r\n return value\r\n}\r\n\r\nexport async function exportBoard(\r\n board: Board,\r\n format: ExportFormat,\r\n boardElement?: HTMLElement,\r\n options?: ExportOptions\r\n): Promise<string | jsPDF> {\r\n switch (format) {\r\n case 'json':\r\n return exportToJSON(board, options)\r\n case 'csv':\r\n return exportToCSV(board, options)\r\n case 'pdf':\r\n return await exportToPDF(board, boardElement, options)\r\n default:\r\n throw new Error(`Unsupported export format: ${format}`)\r\n }\r\n}\r\n\r\nexport function downloadExport(\r\n content: string | jsPDF,\r\n format: ExportFormat,\r\n filename?: string\r\n): void {\r\n const defaultFilename = `board-export-${new Date().getTime()}`\r\n\r\n // Check if content is a jsPDF object by checking for the save method\r\n if (format === 'pdf' && typeof content === 'object' && content !== null && 'save' in content) {\r\n const finalFilename = filename || `${defaultFilename}.pdf`\r\n ;(content as jsPDF).save(finalFilename)\r\n return\r\n }\r\n\r\n if (typeof content !== 'string') {\r\n throw new Error('Invalid content type for non-PDF export')\r\n }\r\n\r\n const extensions: Record<ExportFormat, string> = {\r\n json: 'json',\r\n csv: 'csv',\r\n pdf: 'pdf',\r\n }\r\n\r\n const finalFilename = filename || `${defaultFilename}.${extensions[format]}`\r\n\r\n const mimeTypes: Record<ExportFormat, string> = {\r\n json: 'application/json',\r\n csv: 'text/csv',\r\n pdf: 'application/pdf',\r\n }\r\n\r\n const blob = new Blob([content], { type: mimeTypes[format] })\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = finalFilename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n}\r\n","/**\r\n * Import utility functions\r\n * @module utils/import\r\n */\r\n\r\nimport type { Board, Card, Column, ImportResult } from '../types'\r\n\r\n/**\r\n * Import board from JSON format\r\n */\r\nexport function importFromJSON(jsonString: string): ImportResult {\r\n try {\r\n const data = JSON.parse(jsonString)\r\n\r\n if (!data.board || !data.columns || !data.cards) {\r\n return {\r\n success: false,\r\n errors: ['Invalid JSON format: missing required fields (board, columns, cards)'],\r\n }\r\n }\r\n\r\n const board: Board = {\r\n id: data.board.id,\r\n title: data.board.title,\r\n columns: data.columns,\r\n cards: data.cards,\r\n metadata: data.board.metadata,\r\n }\r\n\r\n return {\r\n success: true,\r\n cardsImported: board.cards.length,\r\n columnsImported: board.columns.length,\r\n }\r\n } catch (error) {\r\n return {\r\n success: false,\r\n errors: [`Failed to parse JSON: ${error instanceof Error ? error.message : 'Unknown error'}`],\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Import board from CSV format\r\n */\r\nexport function importFromCSV(csvString: string): ImportResult {\r\n try {\r\n const lines = csvString.trim().split('\\n')\r\n\r\n if (lines.length < 1 || !lines[0]) {\r\n return {\r\n success: false,\r\n errors: ['CSV file is empty or invalid'],\r\n }\r\n }\r\n\r\n const headers = parseCSVLine(lines[0])\r\n const cards: Card[] = []\r\n const columnsMap = new Map<string, Column>()\r\n const errors: string[] = []\r\n\r\n for (let i = 1; i < lines.length; i++) {\r\n try {\r\n const values = parseCSVLine(lines[i] || '')\r\n\r\n if (values.length > headers.length) {\r\n errors.push(`Line ${i + 1}: Too many columns`)\r\n continue\r\n }\r\n\r\n // If missing more than 3 columns, likely a malformed row\r\n const missingColumns = headers.length - values.length\r\n if (missingColumns > 3) {\r\n errors.push(`Line ${i + 1}: Column count mismatch (expected ${headers.length}, got ${values.length})`)\r\n continue\r\n }\r\n\r\n // Pad trailing empty columns\r\n while (values.length < headers.length) {\r\n values.push('')\r\n }\r\n\r\n const cardData: Record<string, string> = {}\r\n headers.forEach((header, index) => {\r\n cardData[header] = values[index] || ''\r\n })\r\n\r\n // Create column if it doesn't exist\r\n const columnTitle = cardData['Column'] || 'Unnamed'\r\n if (!columnsMap.has(columnTitle)) {\r\n columnsMap.set(columnTitle, {\r\n id: `col-${columnsMap.size + 1}`,\r\n title: columnTitle,\r\n position: columnsMap.size + 1,\r\n cardIds: [],\r\n })\r\n }\r\n\r\n const column = columnsMap.get(columnTitle)!\r\n\r\n const card: Card = {\r\n id: cardData['Card ID'] || `card-${i}`,\r\n title: cardData['Title'] || 'Untitled',\r\n description: cardData['Description'] ? cardData['Description'] : undefined,\r\n columnId: column.id,\r\n position: column.cardIds.length + 1,\r\n priority: (cardData['Priority'] as any) || undefined,\r\n labels: cardData['Labels'] ? cardData['Labels'].split(';').filter(Boolean) : undefined,\r\n assignedUserIds: cardData['Assigned Users']\r\n ? cardData['Assigned Users'].split(';').filter(Boolean)\r\n : undefined,\r\n startDate: cardData['Start Date'] ? (cardData['Start Date'] as any) : undefined,\r\n endDate: cardData['End Date'] ? (cardData['End Date'] as any) : undefined,\r\n createdAt: cardData['Created At'] ? (cardData['Created At'] as any) : undefined,\r\n updatedAt: cardData['Updated At'] ? (cardData['Updated At'] as any) : undefined,\r\n }\r\n\r\n cards.push(card)\r\n column.cardIds.push(card.id)\r\n } catch (error) {\r\n errors.push(\r\n `Line ${i + 1}: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n )\r\n }\r\n }\r\n\r\n if (cards.length === 0) {\r\n return {\r\n success: false,\r\n errors: ['No valid cards found in CSV', ...errors],\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n cardsImported: cards.length,\r\n columnsImported: columnsMap.size,\r\n errors: errors.length > 0 ? errors : undefined,\r\n }\r\n } catch (error) {\r\n return {\r\n success: false,\r\n errors: [`Failed to parse CSV: ${error instanceof Error ? error.message : 'Unknown error'}`],\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Parse a CSV line with proper quote handling\r\n */\r\nfunction parseCSVLine(line: string): string[] {\r\n const result: string[] = []\r\n let current = ''\r\n let inQuotes = false\r\n\r\n for (let i = 0; i < line.length; i++) {\r\n const char = line[i]\r\n const nextChar = line[i + 1]\r\n\r\n if (char === '\"' && inQuotes && nextChar === '\"') {\r\n current += '\"'\r\n i++ // Skip next quote\r\n } else if (char === '\"') {\r\n inQuotes = !inQuotes\r\n } else if (char === ',' && !inQuotes) {\r\n result.push(current)\r\n current = ''\r\n } else {\r\n current += char\r\n }\r\n }\r\n\r\n result.push(current)\r\n return result\r\n}\r\n\r\n/**\r\n * Main import function\r\n */\r\nexport function importBoard(content: string, format: 'json' | 'csv'): ImportResult {\r\n switch (format) {\r\n case 'json':\r\n return importFromJSON(content)\r\n case 'csv':\r\n return importFromCSV(content)\r\n default:\r\n return {\r\n success: false,\r\n errors: [`Unsupported import format: ${format}`],\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Read file content\r\n */\r\nexport function readFile(file: File): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onload = (event) => {\r\n if (event.target?.result) {\r\n resolve(event.target.result as string)\r\n } else {\r\n reject(new Error('Failed to read file'))\r\n }\r\n }\r\n reader.onerror = () => reject(new Error('Failed to read file'))\r\n reader.readAsText(file)\r\n })\r\n}\r\n","/**\r\n * Portal Component\r\n * Renders children outside the parent DOM hierarchy\r\n * Solves z-index stacking context issues\r\n */\r\n\r\nimport { useEffect, useState, type ReactNode } from 'react'\r\nimport { createPortal } from 'react-dom'\r\n\r\nexport interface PortalProps {\r\n children: ReactNode\r\n /** Element to portal into (defaults to document.body) */\r\n container?: HTMLElement\r\n}\r\n\r\n/**\r\n * Portal component that renders children at the root level\r\n * Perfect for modals, tooltips, dropdowns that need to escape stacking context\r\n */\r\nexport function Portal({ children, container }: PortalProps) {\r\n const [mounted, setMounted] = useState(false)\r\n\r\n useEffect(() => {\r\n setMounted(true)\r\n return () => setMounted(false)\r\n }, [])\r\n\r\n if (!mounted) {\r\n return null\r\n }\r\n\r\n const target = container || (typeof document !== 'undefined' ? document.body : null)\r\n\r\n if (!target) {\r\n return null\r\n }\r\n\r\n return createPortal(children, target)\r\n}\r\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: '#E74C3C' },\r\n HIGH: { label: 'High', color: '#E67E22' },\r\n MEDIUM: { label: 'Normal', color: '#F1C40F' },\r\n LOW: { label: 'Low', color: '#2ECC71' },\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 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 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={() => setIsOpen(!isOpen)}\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 {isOpen && (\r\n <Portal>\r\n <div\r\n ref={menuRef}\r\n className=\"priority-selector-menu\"\r\n style={{\r\n position: 'absolute',\r\n top: `${menuPosition.top}px`,\r\n left: `${menuPosition.left}px`,\r\n zIndex: 99999,\r\n minWidth: '160px',\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=\"#3B82F6\" 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=\"#3B82F6\" 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","/**\r\n * Date Range Picker Component\r\n * Quick selection buttons + interactive calendar\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport { Portal } from '../Portal'\r\n\r\nexport interface DateRangePickerProps {\r\n startDate?: string\r\n endDate?: string\r\n onChange: (startDate?: string, endDate?: string) => void\r\n className?: string\r\n}\r\n\r\nconst QUICK_OPTIONS = [\r\n { label: 'Today', days: 0 },\r\n { label: 'Tomorrow', days: 1 },\r\n { label: 'Next Week', days: 7 },\r\n { label: '2 Weeks', days: 14 },\r\n { label: '4 Weeks', days: 28 },\r\n { label: '8 Weeks', days: 56 },\r\n]\r\n\r\nexport function DateRangePicker({\r\n startDate,\r\n endDate,\r\n onChange,\r\n className,\r\n}: DateRangePickerProps) {\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 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 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') {\r\n setIsOpen(false)\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 handleQuickSelect = (days: number) => {\r\n const now = new Date()\r\n\r\n // Format date as YYYY-MM-DD in LOCAL timezone (not UTC)\r\n // This prevents timezone offset issues where selecting \"Today\" assigns tomorrow's date\r\n const formatLocalDate = (date: Date) => {\r\n const year = date.getFullYear()\r\n const month = String(date.getMonth() + 1).padStart(2, '0')\r\n const day = String(date.getDate()).padStart(2, '0')\r\n return `${year}-${month}-${day}`\r\n }\r\n\r\n const todayStr = formatLocalDate(now)\r\n\r\n const endDate = new Date(now)\r\n endDate.setDate(endDate.getDate() + days)\r\n const endStr = formatLocalDate(endDate)\r\n\r\n onChange(todayStr, endStr)\r\n setIsOpen(false)\r\n }\r\n\r\n const formatDateRange = () => {\r\n if (!startDate || !endDate) return 'Set date'\r\n\r\n // Parse dates as local timezone to avoid UTC conversion issues\r\n const parseLocalDate = (dateStr: string | Date) => {\r\n if (dateStr instanceof Date) return dateStr\r\n // Handle invalid date strings\r\n if (typeof dateStr !== 'string' || !dateStr.match(/^\\d{4}-\\d{2}-\\d{2}$/)) {\r\n return null\r\n }\r\n const parts = dateStr.split('-').map(Number)\r\n if (parts.length !== 3 || parts.some(p => isNaN(p))) {\r\n return null\r\n }\r\n const year = parts[0]\r\n const month = parts[1]\r\n const day = parts[2]\r\n if (year === undefined || month === undefined || day === undefined) {\r\n return null\r\n }\r\n return new Date(year, month - 1, day)\r\n }\r\n\r\n const start = parseLocalDate(startDate)\r\n const end = parseLocalDate(endDate)\r\n\r\n // Return 'Set date' if parsing failed\r\n if (!start || !end || isNaN(start.getTime()) || isNaN(end.getTime())) {\r\n return 'Set date'\r\n }\r\n\r\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\n return `${monthNames[start.getMonth()]} ${start.getDate()} – ${monthNames[end.getMonth()]} ${end.getDate()}`\r\n }\r\n\r\n const hasDateSet = startDate && endDate\r\n\r\n // Check if date is overdue\r\n const isOverdue = () => {\r\n if (!endDate) return false\r\n const end = typeof endDate === 'string' ? new Date(endDate) : endDate\r\n const today = new Date()\r\n today.setHours(0, 0, 0, 0)\r\n return end < today\r\n }\r\n\r\n const overdue = isOverdue()\r\n\r\n return (\r\n <div className={`relative ${className || ''}`}>\r\n {/* Date button - plain text with color only if overdue */}\r\n <button\r\n ref={buttonRef}\r\n onClick={() => setIsOpen(!isOpen)}\r\n className={`flex items-center gap-1.5 px-2 py-1 rounded-md text-xs transition-all hover:bg-white/5 ${\r\n overdue ? 'asakaa-date-overdue' : 'asakaa-date'\r\n }`}\r\n title={hasDateSet ? `${formatDateRange()}` : 'Set date range'}\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <rect\r\n x=\"2\"\r\n y=\"3\"\r\n width=\"12\"\r\n height=\"11\"\r\n rx=\"2\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.5\"\r\n />\r\n <path d=\"M2 6H14\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\r\n <path d=\"M5 2V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M11 2V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n </svg>\r\n {startDate && endDate && (\r\n <span className=\"whitespace-nowrap\">{formatDateRange()}</span>\r\n )}\r\n </button>\r\n\r\n {/* Date picker menu - Using Portal to escape stacking context */}\r\n {isOpen && (\r\n <Portal>\r\n <div\r\n ref={menuRef}\r\n className=\"date-picker-menu absolute rounded-xl shadow-2xl border min-w-[320px]\"\r\n style={{\r\n top: `${menuPosition.top}px`,\r\n left: `${menuPosition.left}px`,\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 {/* Quick selection */}\r\n <div className=\"p-4 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 block mb-3\" style={{ color: 'var(--modal-v2-text-secondary, rgba(255, 255, 255, 0.8))' }}>\r\n Quick Select\r\n </span>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n {QUICK_OPTIONS.map((option) => (\r\n <button\r\n key={option.label}\r\n onClick={() => handleQuickSelect(option.days)}\r\n className=\"px-3 py-2.5 rounded-lg text-xs font-semibold transition-all active:scale-95 border\"\r\n style={{\r\n color: 'var(--modal-v2-text-primary, #60a5fa)',\r\n borderColor: 'var(--modal-v2-border, rgba(96, 165, 250, 0.3))',\r\n background: 'var(--modal-v2-bg-secondary, rgba(96, 165, 250, 0.08))',\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.background = 'var(--modal-v2-bg-tertiary, rgba(96, 165, 250, 0.15))'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.background = 'var(--modal-v2-bg-secondary, rgba(96, 165, 250, 0.08))'\r\n }}\r\n >\r\n {option.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Manual date inputs */}\r\n <div className=\"p-4\">\r\n <span className=\"text-xs font-bold uppercase tracking-wider block mb-3\" style={{ color: 'var(--modal-v2-text-secondary, rgba(255, 255, 255, 0.8))' }}>\r\n Custom Range\r\n </span>\r\n <div className=\"space-y-3\">\r\n <input\r\n type=\"date\"\r\n value={startDate || ''}\r\n onChange={(e) => onChange(e.target.value, endDate)}\r\n className=\"w-full px-3 py-2.5 rounded-lg text-sm border focus: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 />\r\n <input\r\n type=\"date\"\r\n value={endDate || ''}\r\n onChange={(e) => onChange(startDate, e.target.value)}\r\n className=\"w-full px-3 py-2.5 rounded-lg text-sm border focus: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 />\r\n </div>\r\n\r\n {/* Clear button */}\r\n {(startDate || endDate) && (\r\n <button\r\n onClick={() => {\r\n onChange(undefined, undefined)\r\n setIsOpen(false)\r\n }}\r\n className=\"mt-4 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 Dates\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </Portal>\r\n )}\r\n </div>\r\n )\r\n}\r\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 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 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={() => setIsOpen(!isOpen)}\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 {isOpen && (\r\n <Portal>\r\n <div\r\n ref={menuRef}\r\n className=\"user-selector-menu absolute rounded-xl shadow-2xl border min-w-[300px]\"\r\n style={{\r\n top: `${menuPosition.top}px`,\r\n left: `${menuPosition.left}px`,\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\" 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 */}\r\n {isAssigned && (\r\n <span className=\"text-lg\" style={{ color: '#3b82f6' }}>✓</span>\r\n )}\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\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}\r\n\r\nexport function DependenciesSelector({\r\n currentCardId,\r\n dependencies = [],\r\n availableTasks,\r\n onChange,\r\n className,\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 menuRef = useRef<HTMLDivElement>(null)\r\n const buttonRef = useRef<HTMLButtonElement>(null)\r\n\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 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\r\n if (isDependency) {\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 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 ? '#3B82F6' : '#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={() => setIsOpen(!isOpen)}\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 {isOpen && (\r\n <Portal>\r\n <div\r\n ref={menuRef}\r\n className=\"dependencies-selector-menu absolute rounded-xl shadow-2xl border min-w-[300px]\"\r\n style={{\r\n top: `${menuPosition.top}px`,\r\n left: `${menuPosition.left}px`,\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-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 ? '#3b82f6' : 'transparent',\r\n borderColor: hasDependencies ? '#3b82f6' : '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 ? '#3b82f6' : 'transparent',\r\n borderColor: isDependency ? '#3b82f6' : '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 // Default card rendering\r\n return (\r\n <div\r\n ref={setNodeRef}\r\n style={style}\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 {/* Title */}\r\n <h3 className=\"asakaa-card-title mb-2\">{card.title}</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 </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.startDate === nextProps.card.startDate &&\r\n prevProps.card.endDate === nextProps.card.endDate &&\r\n prevProps.isSelected === nextProps.isSelected &&\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 )\r\n }\r\n)\r\n\r\nCard.displayName = 'Card'\r\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nconst invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display);\n}\nconst tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);\nfunction isTableElement(element) {\n return tableElements.has(getNodeName(element));\n}\nconst topLayerSelectors = [':popover-open', ':modal'];\nfunction isTopLayer(element) {\n return topLayerSelectors.some(selector => {\n try {\n return element.matches(selector);\n } catch (_e) {\n return false;\n }\n });\n}\nconst transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];\nconst willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];\nconst containValues = ['paint', 'layout', 'strict', 'content'];\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nconst lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);\nfunction isLastTraversableNode(node) {\n return lastTraversableNodeNames.has(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nconst yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);\nfunction getSideAxis(placement) {\n return yAxisSides.has(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { isShadowRoot, isHTMLElement } from '@floating-ui/utils/dom';\nimport * as React from 'react';\nimport { useLayoutEffect } from 'react';\nimport { floor } from '@floating-ui/utils';\nimport { tabbable } from 'tabbable';\n\n// Avoid Chrome DevTools blue warning.\nfunction getPlatform() {\n const uaData = navigator.userAgentData;\n if (uaData != null && uaData.platform) {\n return uaData.platform;\n }\n return navigator.platform;\n}\nfunction getUserAgent() {\n const uaData = navigator.userAgentData;\n if (uaData && Array.isArray(uaData.brands)) {\n return uaData.brands.map(_ref => {\n let {\n brand,\n version\n } = _ref;\n return brand + \"/\" + version;\n }).join(' ');\n }\n return navigator.userAgent;\n}\nfunction isSafari() {\n // Chrome DevTools does not complain about navigator.vendor\n return /apple/i.test(navigator.vendor);\n}\nfunction isAndroid() {\n const re = /android/i;\n return re.test(getPlatform()) || re.test(getUserAgent());\n}\nfunction isMac() {\n return getPlatform().toLowerCase().startsWith('mac') && !navigator.maxTouchPoints;\n}\nfunction isJSDOM() {\n return getUserAgent().includes('jsdom/');\n}\n\nconst FOCUSABLE_ATTRIBUTE = 'data-floating-ui-focusable';\nconst TYPEABLE_SELECTOR = \"input:not([type='hidden']):not([disabled]),\" + \"[contenteditable]:not([contenteditable='false']),textarea:not([disabled])\";\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\n\nfunction activeElement(doc) {\n let activeElement = doc.activeElement;\n while (((_activeElement = activeElement) == null || (_activeElement = _activeElement.shadowRoot) == null ? void 0 : _activeElement.activeElement) != null) {\n var _activeElement;\n activeElement = activeElement.shadowRoot.activeElement;\n }\n return activeElement;\n}\nfunction contains(parent, child) {\n if (!parent || !child) {\n return false;\n }\n const rootNode = child.getRootNode == null ? void 0 : child.getRootNode();\n\n // First, attempt with faster native method\n if (parent.contains(child)) {\n return true;\n }\n\n // then fallback to custom implementation with Shadow DOM support\n if (rootNode && isShadowRoot(rootNode)) {\n let next = child;\n while (next) {\n if (parent === next) {\n return true;\n }\n // @ts-ignore\n next = next.parentNode || next.host;\n }\n }\n\n // Give up, the result is false\n return false;\n}\nfunction getTarget(event) {\n if ('composedPath' in event) {\n return event.composedPath()[0];\n }\n\n // TS thinks `event` is of type never as it assumes all browsers support\n // `composedPath()`, but browsers without shadow DOM don't.\n return event.target;\n}\nfunction isEventTargetWithin(event, node) {\n if (node == null) {\n return false;\n }\n if ('composedPath' in event) {\n return event.composedPath().includes(node);\n }\n\n // TS thinks `event` is of type never as it assumes all browsers support composedPath, but browsers without shadow dom don't\n const e = event;\n return e.target != null && node.contains(e.target);\n}\nfunction isRootElement(element) {\n return element.matches('html,body');\n}\nfunction getDocument(node) {\n return (node == null ? void 0 : node.ownerDocument) || document;\n}\nfunction isTypeableElement(element) {\n return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);\n}\nfunction isTypeableCombobox(element) {\n if (!element) return false;\n return element.getAttribute('role') === 'combobox' && isTypeableElement(element);\n}\nfunction matchesFocusVisible(element) {\n // We don't want to block focus from working with `visibleOnly`\n // (JSDOM doesn't match `:focus-visible` when the element has `:focus`)\n if (!element || isJSDOM()) return true;\n try {\n return element.matches(':focus-visible');\n } catch (_e) {\n return true;\n }\n}\nfunction getFloatingFocusElement(floatingElement) {\n if (!floatingElement) {\n return null;\n }\n // Try to find the element that has `{...getFloatingProps()}` spread on it.\n // This indicates the floating element is acting as a positioning wrapper, and\n // so focus should be managed on the child element with the event handlers and\n // aria props.\n return floatingElement.hasAttribute(FOCUSABLE_ATTRIBUTE) ? floatingElement : floatingElement.querySelector(\"[\" + FOCUSABLE_ATTRIBUTE + \"]\") || floatingElement;\n}\n\nfunction getNodeChildren(nodes, id, onlyOpenChildren) {\n if (onlyOpenChildren === void 0) {\n onlyOpenChildren = true;\n }\n const directChildren = nodes.filter(node => {\n var _node$context;\n return node.parentId === id && (!onlyOpenChildren || ((_node$context = node.context) == null ? void 0 : _node$context.open));\n });\n return directChildren.flatMap(child => [child, ...getNodeChildren(nodes, child.id, onlyOpenChildren)]);\n}\nfunction getDeepestNode(nodes, id) {\n let deepestNodeId;\n let maxDepth = -1;\n function findDeepest(nodeId, depth) {\n if (depth > maxDepth) {\n deepestNodeId = nodeId;\n maxDepth = depth;\n }\n const children = getNodeChildren(nodes, nodeId);\n children.forEach(child => {\n findDeepest(child.id, depth + 1);\n });\n }\n findDeepest(id, 0);\n return nodes.find(node => node.id === deepestNodeId);\n}\nfunction getNodeAncestors(nodes, id) {\n var _nodes$find;\n let allAncestors = [];\n let currentParentId = (_nodes$find = nodes.find(node => node.id === id)) == null ? void 0 : _nodes$find.parentId;\n while (currentParentId) {\n const currentNode = nodes.find(node => node.id === currentParentId);\n currentParentId = currentNode == null ? void 0 : currentNode.parentId;\n if (currentNode) {\n allAncestors = allAncestors.concat(currentNode);\n }\n }\n return allAncestors;\n}\n\nfunction stopEvent(event) {\n event.preventDefault();\n event.stopPropagation();\n}\nfunction isReactEvent(event) {\n return 'nativeEvent' in event;\n}\n\n// License: https://github.com/adobe/react-spectrum/blob/b35d5c02fe900badccd0cf1a8f23bb593419f238/packages/@react-aria/utils/src/isVirtualEvent.ts\nfunction isVirtualClick(event) {\n // FIXME: Firefox is now emitting a deprecation warning for `mozInputSource`.\n // Try to find a workaround for this. `react-aria` source still has the check.\n if (event.mozInputSource === 0 && event.isTrusted) {\n return true;\n }\n if (isAndroid() && event.pointerType) {\n return event.type === 'click' && event.buttons === 1;\n }\n return event.detail === 0 && !event.pointerType;\n}\nfunction isVirtualPointerEvent(event) {\n if (isJSDOM()) return false;\n return !isAndroid() && event.width === 0 && event.height === 0 || isAndroid() && event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'mouse' ||\n // iOS VoiceOver returns 0.333• for width/height.\n event.width < 1 && event.height < 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'touch';\n}\nfunction isMouseLikePointerType(pointerType, strict) {\n // On some Linux machines with Chromium, mouse inputs return a `pointerType`\n // of \"pen\": https://github.com/floating-ui/floating-ui/issues/2015\n const values = ['mouse', 'pen'];\n if (!strict) {\n values.push('', undefined);\n }\n return values.includes(pointerType);\n}\n\nvar isClient = typeof document !== 'undefined';\n\nvar noop = function noop() {};\nvar index = isClient ? useLayoutEffect : noop;\n\n// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379\nconst SafeReact = {\n ...React\n};\n\nfunction useLatestRef(value) {\n const ref = React.useRef(value);\n index(() => {\n ref.current = value;\n });\n return ref;\n}\nconst useInsertionEffect = SafeReact.useInsertionEffect;\nconst useSafeInsertionEffect = useInsertionEffect || (fn => fn());\nfunction useEffectEvent(callback) {\n const ref = React.useRef(() => {\n if (process.env.NODE_ENV !== \"production\") {\n throw new Error('Cannot call an event handler while rendering.');\n }\n });\n useSafeInsertionEffect(() => {\n ref.current = callback;\n });\n return React.useCallback(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return ref.current == null ? void 0 : ref.current(...args);\n }, []);\n}\n\nfunction isDifferentGridRow(index, cols, prevRow) {\n return Math.floor(index / cols) !== prevRow;\n}\nfunction isIndexOutOfListBounds(listRef, index) {\n return index < 0 || index >= listRef.current.length;\n}\nfunction getMinListIndex(listRef, disabledIndices) {\n return findNonDisabledListIndex(listRef, {\n disabledIndices\n });\n}\nfunction getMaxListIndex(listRef, disabledIndices) {\n return findNonDisabledListIndex(listRef, {\n decrement: true,\n startingIndex: listRef.current.length,\n disabledIndices\n });\n}\nfunction findNonDisabledListIndex(listRef, _temp) {\n let {\n startingIndex = -1,\n decrement = false,\n disabledIndices,\n amount = 1\n } = _temp === void 0 ? {} : _temp;\n let index = startingIndex;\n do {\n index += decrement ? -amount : amount;\n } while (index >= 0 && index <= listRef.current.length - 1 && isListIndexDisabled(listRef, index, disabledIndices));\n return index;\n}\nfunction getGridNavigatedIndex(listRef, _ref) {\n let {\n event,\n orientation,\n loop,\n rtl,\n cols,\n disabledIndices,\n minIndex,\n maxIndex,\n prevIndex,\n stopEvent: stop = false\n } = _ref;\n let nextIndex = prevIndex;\n if (event.key === ARROW_UP) {\n stop && stopEvent(event);\n if (prevIndex === -1) {\n nextIndex = maxIndex;\n } else {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: nextIndex,\n amount: cols,\n decrement: true,\n disabledIndices\n });\n if (loop && (prevIndex - cols < minIndex || nextIndex < 0)) {\n const col = prevIndex % cols;\n const maxCol = maxIndex % cols;\n const offset = maxIndex - (maxCol - col);\n if (maxCol === col) {\n nextIndex = maxIndex;\n } else {\n nextIndex = maxCol > col ? offset : offset - cols;\n }\n }\n }\n if (isIndexOutOfListBounds(listRef, nextIndex)) {\n nextIndex = prevIndex;\n }\n }\n if (event.key === ARROW_DOWN) {\n stop && stopEvent(event);\n if (prevIndex === -1) {\n nextIndex = minIndex;\n } else {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex,\n amount: cols,\n disabledIndices\n });\n if (loop && prevIndex + cols > maxIndex) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex % cols - cols,\n amount: cols,\n disabledIndices\n });\n }\n }\n if (isIndexOutOfListBounds(listRef, nextIndex)) {\n nextIndex = prevIndex;\n }\n }\n\n // Remains on the same row/column.\n if (orientation === 'both') {\n const prevRow = floor(prevIndex / cols);\n if (event.key === (rtl ? ARROW_LEFT : ARROW_RIGHT)) {\n stop && stopEvent(event);\n if (prevIndex % cols !== cols - 1) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex,\n disabledIndices\n });\n if (loop && isDifferentGridRow(nextIndex, cols, prevRow)) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex - prevIndex % cols - 1,\n disabledIndices\n });\n }\n } else if (loop) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex - prevIndex % cols - 1,\n disabledIndices\n });\n }\n if (isDifferentGridRow(nextIndex, cols, prevRow)) {\n nextIndex = prevIndex;\n }\n }\n if (event.key === (rtl ? ARROW_RIGHT : ARROW_LEFT)) {\n stop && stopEvent(event);\n if (prevIndex % cols !== 0) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex,\n decrement: true,\n disabledIndices\n });\n if (loop && isDifferentGridRow(nextIndex, cols, prevRow)) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex + (cols - prevIndex % cols),\n decrement: true,\n disabledIndices\n });\n }\n } else if (loop) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex + (cols - prevIndex % cols),\n decrement: true,\n disabledIndices\n });\n }\n if (isDifferentGridRow(nextIndex, cols, prevRow)) {\n nextIndex = prevIndex;\n }\n }\n const lastRow = floor(maxIndex / cols) === prevRow;\n if (isIndexOutOfListBounds(listRef, nextIndex)) {\n if (loop && lastRow) {\n nextIndex = event.key === (rtl ? ARROW_RIGHT : ARROW_LEFT) ? maxIndex : findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex - prevIndex % cols - 1,\n disabledIndices\n });\n } else {\n nextIndex = prevIndex;\n }\n }\n }\n return nextIndex;\n}\n\n/** For each cell index, gets the item index that occupies that cell */\nfunction createGridCellMap(sizes, cols, dense) {\n const cellMap = [];\n let startIndex = 0;\n sizes.forEach((_ref2, index) => {\n let {\n width,\n height\n } = _ref2;\n if (width > cols) {\n if (process.env.NODE_ENV !== \"production\") {\n throw new Error(\"[Floating UI]: Invalid grid - item width at index \" + index + \" is greater than grid columns\");\n }\n }\n let itemPlaced = false;\n if (dense) {\n startIndex = 0;\n }\n while (!itemPlaced) {\n const targetCells = [];\n for (let i = 0; i < width; i++) {\n for (let j = 0; j < height; j++) {\n targetCells.push(startIndex + i + j * cols);\n }\n }\n if (startIndex % cols + width <= cols && targetCells.every(cell => cellMap[cell] == null)) {\n targetCells.forEach(cell => {\n cellMap[cell] = index;\n });\n itemPlaced = true;\n } else {\n startIndex++;\n }\n }\n });\n\n // convert into a non-sparse array\n return [...cellMap];\n}\n\n/** Gets cell index of an item's corner or -1 when index is -1. */\nfunction getGridCellIndexOfCorner(index, sizes, cellMap, cols, corner) {\n if (index === -1) return -1;\n const firstCellIndex = cellMap.indexOf(index);\n const sizeItem = sizes[index];\n switch (corner) {\n case 'tl':\n return firstCellIndex;\n case 'tr':\n if (!sizeItem) {\n return firstCellIndex;\n }\n return firstCellIndex + sizeItem.width - 1;\n case 'bl':\n if (!sizeItem) {\n return firstCellIndex;\n }\n return firstCellIndex + (sizeItem.height - 1) * cols;\n case 'br':\n return cellMap.lastIndexOf(index);\n }\n}\n\n/** Gets all cell indices that correspond to the specified indices */\nfunction getGridCellIndices(indices, cellMap) {\n return cellMap.flatMap((index, cellIndex) => indices.includes(index) ? [cellIndex] : []);\n}\nfunction isListIndexDisabled(listRef, index, disabledIndices) {\n if (typeof disabledIndices === 'function') {\n return disabledIndices(index);\n } else if (disabledIndices) {\n return disabledIndices.includes(index);\n }\n const element = listRef.current[index];\n return element == null || element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true';\n}\n\nconst getTabbableOptions = () => ({\n getShadowRoot: true,\n displayCheck:\n // JSDOM does not support the `tabbable` library. To solve this we can\n // check if `ResizeObserver` is a real function (not polyfilled), which\n // determines if the current environment is JSDOM-like.\n typeof ResizeObserver === 'function' && ResizeObserver.toString().includes('[native code]') ? 'full' : 'none'\n});\nfunction getTabbableIn(container, dir) {\n const list = tabbable(container, getTabbableOptions());\n const len = list.length;\n if (len === 0) return;\n const active = activeElement(getDocument(container));\n const index = list.indexOf(active);\n const nextIndex = index === -1 ? dir === 1 ? 0 : len - 1 : index + dir;\n return list[nextIndex];\n}\nfunction getNextTabbable(referenceElement) {\n return getTabbableIn(getDocument(referenceElement).body, 1) || referenceElement;\n}\nfunction getPreviousTabbable(referenceElement) {\n return getTabbableIn(getDocument(referenceElement).body, -1) || referenceElement;\n}\nfunction isOutsideEvent(event, container) {\n const containerElement = container || event.currentTarget;\n const relatedTarget = event.relatedTarget;\n return !relatedTarget || !contains(containerElement, relatedTarget);\n}\nfunction disableFocusInside(container) {\n const tabbableElements = tabbable(container, getTabbableOptions());\n tabbableElements.forEach(element => {\n element.dataset.tabindex = element.getAttribute('tabindex') || '';\n element.setAttribute('tabindex', '-1');\n });\n}\nfunction enableFocusInside(container) {\n const elements = container.querySelectorAll('[data-tabindex]');\n elements.forEach(element => {\n const tabindex = element.dataset.tabindex;\n delete element.dataset.tabindex;\n if (tabindex) {\n element.setAttribute('tabindex', tabindex);\n } else {\n element.removeAttribute('tabindex');\n }\n });\n}\n\nexport { activeElement, contains, createGridCellMap, disableFocusInside, enableFocusInside, findNonDisabledListIndex, getDeepestNode, getDocument, getFloatingFocusElement, getGridCellIndexOfCorner, getGridCellIndices, getGridNavigatedIndex, getMaxListIndex, getMinListIndex, getNextTabbable, getNodeAncestors, getNodeChildren, getPlatform, getPreviousTabbable, getTabbableOptions, getTarget, getUserAgent, isAndroid, isDifferentGridRow, isEventTargetWithin, isIndexOutOfListBounds, isJSDOM, isListIndexDisabled, isMac, isMouseLikePointerType, isOutsideEvent, isReactEvent, isRootElement, isSafari, isTypeableCombobox, isTypeableElement, isVirtualClick, isVirtualPointerEvent, matchesFocusVisible, stopEvent, useEffectEvent, useLatestRef, index as useModernLayoutEffect };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = originSides.has(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = originSides.has(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle$1(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle$1(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll) {\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle$1(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n const windowScrollbarX = getWindowScrollBarX(html);\n // <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n // visual width of the <html> but this is not considered in the size\n // of `html.clientWidth`.\n if (windowScrollbarX <= 0) {\n const doc = html.ownerDocument;\n const body = doc.body;\n const bodyStyles = getComputedStyle(body);\n const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n width -= clippingStableScrollbarWidth;\n }\n } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n // If the <body> scrollbar is on the left, the width needs to be extended\n // by the scrollbar amount so there isn't extra space on the right.\n width += windowScrollbarX;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nconst absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle$1(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle$1(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (_e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import { computePosition, arrow as arrow$2, autoPlacement as autoPlacement$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1 } from '@floating-ui/dom';\nexport { autoUpdate, computePosition, detectOverflow, getOverflowAncestors, platform } from '@floating-ui/dom';\nimport * as React from 'react';\nimport { useLayoutEffect } from 'react';\nimport * as ReactDOM from 'react-dom';\n\nvar isClient = typeof document !== 'undefined';\n\nvar noop = function noop() {};\nvar index = isClient ? useLayoutEffect : noop;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (typeof a === 'function' && a.toString() === b.toString()) {\n return true;\n }\n let length;\n let i;\n let keys;\n if (a && b && typeof a === 'object') {\n if (Array.isArray(a)) {\n length = a.length;\n if (length !== b.length) return false;\n for (i = length; i-- !== 0;) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) {\n return false;\n }\n for (i = length; i-- !== 0;) {\n if (!{}.hasOwnProperty.call(b, keys[i])) {\n return false;\n }\n }\n for (i = length; i-- !== 0;) {\n const key = keys[i];\n if (key === '_owner' && a.$$typeof) {\n continue;\n }\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n return a !== a && b !== b;\n}\n\nfunction getDPR(element) {\n if (typeof window === 'undefined') {\n return 1;\n }\n const win = element.ownerDocument.defaultView || window;\n return win.devicePixelRatio || 1;\n}\n\nfunction roundByDPR(element, value) {\n const dpr = getDPR(element);\n return Math.round(value * dpr) / dpr;\n}\n\nfunction useLatestRef(value) {\n const ref = React.useRef(value);\n index(() => {\n ref.current = value;\n });\n return ref;\n}\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n if (options === void 0) {\n options = {};\n }\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform,\n elements: {\n reference: externalReference,\n floating: externalFloating\n } = {},\n transform = true,\n whileElementsMounted,\n open\n } = options;\n const [data, setData] = React.useState({\n x: 0,\n y: 0,\n strategy,\n placement,\n middlewareData: {},\n isPositioned: false\n });\n const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);\n if (!deepEqual(latestMiddleware, middleware)) {\n setLatestMiddleware(middleware);\n }\n const [_reference, _setReference] = React.useState(null);\n const [_floating, _setFloating] = React.useState(null);\n const setReference = React.useCallback(node => {\n if (node !== referenceRef.current) {\n referenceRef.current = node;\n _setReference(node);\n }\n }, []);\n const setFloating = React.useCallback(node => {\n if (node !== floatingRef.current) {\n floatingRef.current = node;\n _setFloating(node);\n }\n }, []);\n const referenceEl = externalReference || _reference;\n const floatingEl = externalFloating || _floating;\n const referenceRef = React.useRef(null);\n const floatingRef = React.useRef(null);\n const dataRef = React.useRef(data);\n const hasWhileElementsMounted = whileElementsMounted != null;\n const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n const platformRef = useLatestRef(platform);\n const openRef = useLatestRef(open);\n const update = React.useCallback(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n const config = {\n placement,\n strategy,\n middleware: latestMiddleware\n };\n if (platformRef.current) {\n config.platform = platformRef.current;\n }\n computePosition(referenceRef.current, floatingRef.current, config).then(data => {\n const fullData = {\n ...data,\n // The floating element's position may be recomputed while it's closed\n // but still mounted (such as when transitioning out). To ensure\n // `isPositioned` will be `false` initially on the next open, avoid\n // setting it to `true` when `open === false` (must be specified).\n isPositioned: openRef.current !== false\n };\n if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n dataRef.current = fullData;\n ReactDOM.flushSync(() => {\n setData(fullData);\n });\n }\n });\n }, [latestMiddleware, placement, strategy, platformRef, openRef]);\n index(() => {\n if (open === false && dataRef.current.isPositioned) {\n dataRef.current.isPositioned = false;\n setData(data => ({\n ...data,\n isPositioned: false\n }));\n }\n }, [open]);\n const isMountedRef = React.useRef(false);\n index(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n index(() => {\n if (referenceEl) referenceRef.current = referenceEl;\n if (floatingEl) floatingRef.current = floatingEl;\n if (referenceEl && floatingEl) {\n if (whileElementsMountedRef.current) {\n return whileElementsMountedRef.current(referenceEl, floatingEl, update);\n }\n update();\n }\n }, [referenceEl, floatingEl, update, whileElementsMountedRef, hasWhileElementsMounted]);\n const refs = React.useMemo(() => ({\n reference: referenceRef,\n floating: floatingRef,\n setReference,\n setFloating\n }), [setReference, setFloating]);\n const elements = React.useMemo(() => ({\n reference: referenceEl,\n floating: floatingEl\n }), [referenceEl, floatingEl]);\n const floatingStyles = React.useMemo(() => {\n const initialStyles = {\n position: strategy,\n left: 0,\n top: 0\n };\n if (!elements.floating) {\n return initialStyles;\n }\n const x = roundByDPR(elements.floating, data.x);\n const y = roundByDPR(elements.floating, data.y);\n if (transform) {\n return {\n ...initialStyles,\n transform: \"translate(\" + x + \"px, \" + y + \"px)\",\n ...(getDPR(elements.floating) >= 1.5 && {\n willChange: 'transform'\n })\n };\n }\n return {\n position: strategy,\n left: x,\n top: y\n };\n }, [strategy, transform, elements.floating, data.x, data.y]);\n return React.useMemo(() => ({\n ...data,\n update,\n refs,\n elements,\n floatingStyles\n }), [data, update, refs, elements, floatingStyles]);\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow$1 = options => {\n function isRef(value) {\n return {}.hasOwnProperty.call(value, 'current');\n }\n return {\n name: 'arrow',\n options,\n fn(state) {\n const {\n element,\n padding\n } = typeof options === 'function' ? options(state) : options;\n if (element && isRef(element)) {\n if (element.current != null) {\n return arrow$2({\n element: element.current,\n padding\n }).fn(state);\n }\n return {};\n }\n if (element) {\n return arrow$2({\n element,\n padding\n }).fn(state);\n }\n return {};\n }\n };\n};\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = (options, deps) => ({\n ...offset$1(options),\n options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = (options, deps) => ({\n ...shift$1(options),\n options: [options, deps]\n});\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = (options, deps) => ({\n ...limitShift$1(options),\n options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = (options, deps) => ({\n ...flip$1(options),\n options: [options, deps]\n});\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = (options, deps) => ({\n ...size$1(options),\n options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = (options, deps) => ({\n ...autoPlacement$1(options),\n options: [options, deps]\n});\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = (options, deps) => ({\n ...hide$1(options),\n options: [options, deps]\n});\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = (options, deps) => ({\n ...inline$1(options),\n options: [options, deps]\n});\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = (options, deps) => ({\n ...arrow$1(options),\n options: [options, deps]\n});\n\nexport { arrow, autoPlacement, flip, hide, inline, limitShift, offset, shift, size, useFloating };\n","import * as React from 'react';\nimport { useModernLayoutEffect, useEffectEvent, getMinListIndex, getMaxListIndex, createGridCellMap, isListIndexDisabled, getGridNavigatedIndex, getGridCellIndexOfCorner, getGridCellIndices, findNonDisabledListIndex, isIndexOutOfListBounds, useLatestRef, getDocument as getDocument$1, isMouseLikePointerType, contains as contains$1, isSafari, enableFocusInside, isOutsideEvent, getPreviousTabbable, getNextTabbable, disableFocusInside, isTypeableCombobox, getFloatingFocusElement, getTabbableOptions, getNodeAncestors, activeElement, getNodeChildren as getNodeChildren$1, stopEvent, getTarget as getTarget$1, isVirtualClick, isVirtualPointerEvent, getPlatform, isTypeableElement, isReactEvent, isRootElement, isEventTargetWithin, matchesFocusVisible, isMac, getDeepestNode, getUserAgent } from '@floating-ui/react/utils';\nimport { jsx, jsxs, Fragment } from 'react/jsx-runtime';\nimport { getComputedStyle, isElement, isShadowRoot, getNodeName, isNode, isHTMLElement, getWindow, isLastTraversableNode, getParentNode, isWebKit } from '@floating-ui/utils/dom';\nimport { tabbable, isTabbable, focusable } from 'tabbable';\nimport * as ReactDOM from 'react-dom';\nimport { getOverflowAncestors, useFloating as useFloating$1, offset, detectOverflow } from '@floating-ui/react-dom';\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/react-dom';\nimport { evaluate, max, round, min } from '@floating-ui/utils';\n\n/**\n * Merges an array of refs into a single memoized callback ref or `null`.\n * @see https://floating-ui.com/docs/react-utils#usemergerefs\n */\nfunction useMergeRefs(refs) {\n const cleanupRef = React.useRef(undefined);\n const refEffect = React.useCallback(instance => {\n const cleanups = refs.map(ref => {\n if (ref == null) {\n return;\n }\n if (typeof ref === 'function') {\n const refCallback = ref;\n const refCleanup = refCallback(instance);\n return typeof refCleanup === 'function' ? refCleanup : () => {\n refCallback(null);\n };\n }\n ref.current = instance;\n return () => {\n ref.current = null;\n };\n });\n return () => {\n cleanups.forEach(refCleanup => refCleanup == null ? void 0 : refCleanup());\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n return React.useMemo(() => {\n if (refs.every(ref => ref == null)) {\n return null;\n }\n return value => {\n if (cleanupRef.current) {\n cleanupRef.current();\n cleanupRef.current = undefined;\n }\n if (value != null) {\n cleanupRef.current = refEffect(value);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n}\n\nfunction sortByDocumentPosition(a, b) {\n const position = a.compareDocumentPosition(b);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING || position & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {\n return 1;\n }\n return 0;\n}\nconst FloatingListContext = /*#__PURE__*/React.createContext({\n register: () => {},\n unregister: () => {},\n map: /*#__PURE__*/new Map(),\n elementsRef: {\n current: []\n }\n});\n/**\n * Provides context for a list of items within the floating element.\n * @see https://floating-ui.com/docs/FloatingList\n */\nfunction FloatingList(props) {\n const {\n children,\n elementsRef,\n labelsRef\n } = props;\n const [nodes, setNodes] = React.useState(() => new Set());\n const register = React.useCallback(node => {\n setNodes(prevSet => new Set(prevSet).add(node));\n }, []);\n const unregister = React.useCallback(node => {\n setNodes(prevSet => {\n const set = new Set(prevSet);\n set.delete(node);\n return set;\n });\n }, []);\n const map = React.useMemo(() => {\n const newMap = new Map();\n const sortedNodes = Array.from(nodes.keys()).sort(sortByDocumentPosition);\n sortedNodes.forEach((node, index) => {\n newMap.set(node, index);\n });\n return newMap;\n }, [nodes]);\n return /*#__PURE__*/jsx(FloatingListContext.Provider, {\n value: React.useMemo(() => ({\n register,\n unregister,\n map,\n elementsRef,\n labelsRef\n }), [register, unregister, map, elementsRef, labelsRef]),\n children: children\n });\n}\n/**\n * Used to register a list item and its index (DOM position) in the\n * `FloatingList`.\n * @see https://floating-ui.com/docs/FloatingList#uselistitem\n */\nfunction useListItem(props) {\n if (props === void 0) {\n props = {};\n }\n const {\n label\n } = props;\n const {\n register,\n unregister,\n map,\n elementsRef,\n labelsRef\n } = React.useContext(FloatingListContext);\n const [index, setIndex] = React.useState(null);\n const componentRef = React.useRef(null);\n const ref = React.useCallback(node => {\n componentRef.current = node;\n if (index !== null) {\n elementsRef.current[index] = node;\n if (labelsRef) {\n var _node$textContent;\n const isLabelDefined = label !== undefined;\n labelsRef.current[index] = isLabelDefined ? label : (_node$textContent = node == null ? void 0 : node.textContent) != null ? _node$textContent : null;\n }\n }\n }, [index, elementsRef, labelsRef, label]);\n useModernLayoutEffect(() => {\n const node = componentRef.current;\n if (node) {\n register(node);\n return () => {\n unregister(node);\n };\n }\n }, [register, unregister]);\n useModernLayoutEffect(() => {\n const index = componentRef.current ? map.get(componentRef.current) : null;\n if (index != null) {\n setIndex(index);\n }\n }, [map]);\n return React.useMemo(() => ({\n ref,\n index: index == null ? -1 : index\n }), [index, ref]);\n}\n\nconst FOCUSABLE_ATTRIBUTE = 'data-floating-ui-focusable';\nconst ACTIVE_KEY = 'active';\nconst SELECTED_KEY = 'selected';\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\n\nfunction renderJsx(render, computedProps) {\n if (typeof render === 'function') {\n return render(computedProps);\n }\n if (render) {\n return /*#__PURE__*/React.cloneElement(render, computedProps);\n }\n return /*#__PURE__*/jsx(\"div\", {\n ...computedProps\n });\n}\nconst CompositeContext = /*#__PURE__*/React.createContext({\n activeIndex: 0,\n onNavigate: () => {}\n});\nconst horizontalKeys = [ARROW_LEFT, ARROW_RIGHT];\nconst verticalKeys = [ARROW_UP, ARROW_DOWN];\nconst allKeys = [...horizontalKeys, ...verticalKeys];\n\n/**\n * Creates a single tab stop whose items are navigated by arrow keys, which\n * provides list navigation outside of floating element contexts.\n *\n * This is useful to enable navigation of a list of items that aren’t part of a\n * floating element. A menubar is an example of a composite, with each reference\n * element being an item.\n * @see https://floating-ui.com/docs/Composite\n */\nconst Composite = /*#__PURE__*/React.forwardRef(function Composite(props, forwardedRef) {\n const {\n render,\n orientation = 'both',\n loop = true,\n rtl = false,\n cols = 1,\n disabledIndices,\n activeIndex: externalActiveIndex,\n onNavigate: externalSetActiveIndex,\n itemSizes,\n dense = false,\n ...domProps\n } = props;\n const [internalActiveIndex, internalSetActiveIndex] = React.useState(0);\n const activeIndex = externalActiveIndex != null ? externalActiveIndex : internalActiveIndex;\n const onNavigate = useEffectEvent(externalSetActiveIndex != null ? externalSetActiveIndex : internalSetActiveIndex);\n const elementsRef = React.useRef([]);\n const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n const contextValue = React.useMemo(() => ({\n activeIndex,\n onNavigate\n }), [activeIndex, onNavigate]);\n const isGrid = cols > 1;\n function handleKeyDown(event) {\n if (!allKeys.includes(event.key)) return;\n let nextIndex = activeIndex;\n const minIndex = getMinListIndex(elementsRef, disabledIndices);\n const maxIndex = getMaxListIndex(elementsRef, disabledIndices);\n const horizontalEndKey = rtl ? ARROW_LEFT : ARROW_RIGHT;\n const horizontalStartKey = rtl ? ARROW_RIGHT : ARROW_LEFT;\n if (isGrid) {\n const sizes = itemSizes || Array.from({\n length: elementsRef.current.length\n }, () => ({\n width: 1,\n height: 1\n }));\n // To calculate movements on the grid, we use hypothetical cell indices\n // as if every item was 1x1, then convert back to real indices.\n const cellMap = createGridCellMap(sizes, cols, dense);\n const minGridIndex = cellMap.findIndex(index => index != null && !isListIndexDisabled(elementsRef, index, disabledIndices));\n // last enabled index\n const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isListIndexDisabled(elementsRef, index, disabledIndices) ? cellIndex : foundIndex, -1);\n const maybeNextIndex = cellMap[getGridNavigatedIndex({\n current: cellMap.map(itemIndex => itemIndex ? elementsRef.current[itemIndex] : null)\n }, {\n event,\n orientation,\n loop,\n rtl,\n cols,\n // treat undefined (empty grid spaces) as disabled indices so we\n // don't end up in them\n disabledIndices: getGridCellIndices([...((typeof disabledIndices !== 'function' ? disabledIndices : null) || elementsRef.current.map((_, index) => isListIndexDisabled(elementsRef, index, disabledIndices) ? index : undefined)), undefined], cellMap),\n minIndex: minGridIndex,\n maxIndex: maxGridIndex,\n prevIndex: getGridCellIndexOfCorner(activeIndex > maxIndex ? minIndex : activeIndex, sizes, cellMap, cols,\n // use a corner matching the edge closest to the direction we're\n // moving in so we don't end up in the same item. Prefer\n // top/left over bottom/right.\n event.key === ARROW_DOWN ? 'bl' : event.key === horizontalEndKey ? 'tr' : 'tl')\n })];\n if (maybeNextIndex != null) {\n nextIndex = maybeNextIndex;\n }\n }\n const toEndKeys = {\n horizontal: [horizontalEndKey],\n vertical: [ARROW_DOWN],\n both: [horizontalEndKey, ARROW_DOWN]\n }[orientation];\n const toStartKeys = {\n horizontal: [horizontalStartKey],\n vertical: [ARROW_UP],\n both: [horizontalStartKey, ARROW_UP]\n }[orientation];\n const preventedKeys = isGrid ? allKeys : {\n horizontal: horizontalKeys,\n vertical: verticalKeys,\n both: allKeys\n }[orientation];\n if (nextIndex === activeIndex && [...toEndKeys, ...toStartKeys].includes(event.key)) {\n if (loop && nextIndex === maxIndex && toEndKeys.includes(event.key)) {\n nextIndex = minIndex;\n } else if (loop && nextIndex === minIndex && toStartKeys.includes(event.key)) {\n nextIndex = maxIndex;\n } else {\n nextIndex = findNonDisabledListIndex(elementsRef, {\n startingIndex: nextIndex,\n decrement: toStartKeys.includes(event.key),\n disabledIndices\n });\n }\n }\n if (nextIndex !== activeIndex && !isIndexOutOfListBounds(elementsRef, nextIndex)) {\n var _elementsRef$current$;\n event.stopPropagation();\n if (preventedKeys.includes(event.key)) {\n event.preventDefault();\n }\n onNavigate(nextIndex);\n (_elementsRef$current$ = elementsRef.current[nextIndex]) == null || _elementsRef$current$.focus();\n }\n }\n const computedProps = {\n ...domProps,\n ...renderElementProps,\n ref: forwardedRef,\n 'aria-orientation': orientation === 'both' ? undefined : orientation,\n onKeyDown(e) {\n domProps.onKeyDown == null || domProps.onKeyDown(e);\n renderElementProps.onKeyDown == null || renderElementProps.onKeyDown(e);\n handleKeyDown(e);\n }\n };\n return /*#__PURE__*/jsx(CompositeContext.Provider, {\n value: contextValue,\n children: /*#__PURE__*/jsx(FloatingList, {\n elementsRef: elementsRef,\n children: renderJsx(render, computedProps)\n })\n });\n});\n/**\n * @see https://floating-ui.com/docs/Composite\n */\nconst CompositeItem = /*#__PURE__*/React.forwardRef(function CompositeItem(props, forwardedRef) {\n const {\n render,\n ...domProps\n } = props;\n const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n const {\n activeIndex,\n onNavigate\n } = React.useContext(CompositeContext);\n const {\n ref,\n index\n } = useListItem();\n const mergedRef = useMergeRefs([ref, forwardedRef, renderElementProps.ref]);\n const isActive = activeIndex === index;\n const computedProps = {\n ...domProps,\n ...renderElementProps,\n ref: mergedRef,\n tabIndex: isActive ? 0 : -1,\n 'data-active': isActive ? '' : undefined,\n onFocus(e) {\n domProps.onFocus == null || domProps.onFocus(e);\n renderElementProps.onFocus == null || renderElementProps.onFocus(e);\n onNavigate(index);\n }\n };\n return renderJsx(render, computedProps);\n});\n\n// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379\nconst SafeReact = {\n ...React\n};\n\nlet serverHandoffComplete = false;\nlet count = 0;\nconst genId = () => // Ensure the id is unique with multiple independent versions of Floating UI\n// on <React 18\n\"floating-ui-\" + Math.random().toString(36).slice(2, 6) + count++;\nfunction useFloatingId() {\n const [id, setId] = React.useState(() => serverHandoffComplete ? genId() : undefined);\n useModernLayoutEffect(() => {\n if (id == null) {\n setId(genId());\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n React.useEffect(() => {\n serverHandoffComplete = true;\n }, []);\n return id;\n}\nconst useReactId = SafeReact.useId;\n\n/**\n * Uses React 18's built-in `useId()` when available, or falls back to a\n * slightly less performant (requiring a double render) implementation for\n * earlier React versions.\n * @see https://floating-ui.com/docs/react-utils#useid\n */\nconst useId = useReactId || useFloatingId;\n\nlet devMessageSet;\nif (process.env.NODE_ENV !== \"production\") {\n devMessageSet = /*#__PURE__*/new Set();\n}\nfunction warn() {\n var _devMessageSet;\n for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {\n messages[_key] = arguments[_key];\n }\n const message = \"Floating UI: \" + messages.join(' ');\n if (!((_devMessageSet = devMessageSet) != null && _devMessageSet.has(message))) {\n var _devMessageSet2;\n (_devMessageSet2 = devMessageSet) == null || _devMessageSet2.add(message);\n console.warn(message);\n }\n}\nfunction error() {\n var _devMessageSet3;\n for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n messages[_key2] = arguments[_key2];\n }\n const message = \"Floating UI: \" + messages.join(' ');\n if (!((_devMessageSet3 = devMessageSet) != null && _devMessageSet3.has(message))) {\n var _devMessageSet4;\n (_devMessageSet4 = devMessageSet) == null || _devMessageSet4.add(message);\n console.error(message);\n }\n}\n\n/**\n * Renders a pointing arrow triangle.\n * @see https://floating-ui.com/docs/FloatingArrow\n */\nconst FloatingArrow = /*#__PURE__*/React.forwardRef(function FloatingArrow(props, ref) {\n const {\n context: {\n placement,\n elements: {\n floating\n },\n middlewareData: {\n arrow,\n shift\n }\n },\n width = 14,\n height = 7,\n tipRadius = 0,\n strokeWidth = 0,\n staticOffset,\n stroke,\n d,\n style: {\n transform,\n ...restStyle\n } = {},\n ...rest\n } = props;\n if (process.env.NODE_ENV !== \"production\") {\n if (!ref) {\n warn('The `ref` prop is required for `FloatingArrow`.');\n }\n }\n const clipPathId = useId();\n const [isRTL, setIsRTL] = React.useState(false);\n\n // https://github.com/floating-ui/floating-ui/issues/2932\n useModernLayoutEffect(() => {\n if (!floating) return;\n const isRTL = getComputedStyle(floating).direction === 'rtl';\n if (isRTL) {\n setIsRTL(true);\n }\n }, [floating]);\n if (!floating) {\n return null;\n }\n const [side, alignment] = placement.split('-');\n const isVerticalSide = side === 'top' || side === 'bottom';\n let computedStaticOffset = staticOffset;\n if (isVerticalSide && shift != null && shift.x || !isVerticalSide && shift != null && shift.y) {\n computedStaticOffset = null;\n }\n\n // Strokes must be double the border width, this ensures the stroke's width\n // works as you'd expect.\n const computedStrokeWidth = strokeWidth * 2;\n const halfStrokeWidth = computedStrokeWidth / 2;\n const svgX = width / 2 * (tipRadius / -8 + 1);\n const svgY = height / 2 * tipRadius / 4;\n const isCustomShape = !!d;\n const yOffsetProp = computedStaticOffset && alignment === 'end' ? 'bottom' : 'top';\n let xOffsetProp = computedStaticOffset && alignment === 'end' ? 'right' : 'left';\n if (computedStaticOffset && isRTL) {\n xOffsetProp = alignment === 'end' ? 'left' : 'right';\n }\n const arrowX = (arrow == null ? void 0 : arrow.x) != null ? computedStaticOffset || arrow.x : '';\n const arrowY = (arrow == null ? void 0 : arrow.y) != null ? computedStaticOffset || arrow.y : '';\n const dValue = d || 'M0,0' + (\" H\" + width) + (\" L\" + (width - svgX) + \",\" + (height - svgY)) + (\" Q\" + width / 2 + \",\" + height + \" \" + svgX + \",\" + (height - svgY)) + ' Z';\n const rotation = {\n top: isCustomShape ? 'rotate(180deg)' : '',\n left: isCustomShape ? 'rotate(90deg)' : 'rotate(-90deg)',\n bottom: isCustomShape ? '' : 'rotate(180deg)',\n right: isCustomShape ? 'rotate(-90deg)' : 'rotate(90deg)'\n }[side];\n return /*#__PURE__*/jsxs(\"svg\", {\n ...rest,\n \"aria-hidden\": true,\n ref: ref,\n width: isCustomShape ? width : width + computedStrokeWidth,\n height: width,\n viewBox: \"0 0 \" + width + \" \" + (height > width ? height : width),\n style: {\n position: 'absolute',\n pointerEvents: 'none',\n [xOffsetProp]: arrowX,\n [yOffsetProp]: arrowY,\n [side]: isVerticalSide || isCustomShape ? '100%' : \"calc(100% - \" + computedStrokeWidth / 2 + \"px)\",\n transform: [rotation, transform].filter(t => !!t).join(' '),\n ...restStyle\n },\n children: [computedStrokeWidth > 0 && /*#__PURE__*/jsx(\"path\", {\n clipPath: \"url(#\" + clipPathId + \")\",\n fill: \"none\",\n stroke: stroke\n // Account for the stroke on the fill path rendered below.\n ,\n strokeWidth: computedStrokeWidth + (d ? 0 : 1),\n d: dValue\n }), /*#__PURE__*/jsx(\"path\", {\n stroke: computedStrokeWidth && !d ? rest.fill : 'none',\n d: dValue\n }), /*#__PURE__*/jsx(\"clipPath\", {\n id: clipPathId,\n children: /*#__PURE__*/jsx(\"rect\", {\n x: -halfStrokeWidth,\n y: halfStrokeWidth * (isCustomShape ? -1 : 1),\n width: width + computedStrokeWidth,\n height: width\n })\n })]\n });\n});\n\nfunction createEventEmitter() {\n const map = new Map();\n return {\n emit(event, data) {\n var _map$get;\n (_map$get = map.get(event)) == null || _map$get.forEach(listener => listener(data));\n },\n on(event, listener) {\n if (!map.has(event)) {\n map.set(event, new Set());\n }\n map.get(event).add(listener);\n },\n off(event, listener) {\n var _map$get2;\n (_map$get2 = map.get(event)) == null || _map$get2.delete(listener);\n }\n };\n}\n\nconst FloatingNodeContext = /*#__PURE__*/React.createContext(null);\nconst FloatingTreeContext = /*#__PURE__*/React.createContext(null);\n\n/**\n * Returns the parent node id for nested floating elements, if available.\n * Returns `null` for top-level floating elements.\n */\nconst useFloatingParentNodeId = () => {\n var _React$useContext;\n return ((_React$useContext = React.useContext(FloatingNodeContext)) == null ? void 0 : _React$useContext.id) || null;\n};\n\n/**\n * Returns the nearest floating tree context, if available.\n */\nconst useFloatingTree = () => React.useContext(FloatingTreeContext);\n\n/**\n * Registers a node into the `FloatingTree`, returning its id.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction useFloatingNodeId(customParentId) {\n const id = useId();\n const tree = useFloatingTree();\n const reactParentId = useFloatingParentNodeId();\n const parentId = customParentId || reactParentId;\n useModernLayoutEffect(() => {\n if (!id) return;\n const node = {\n id,\n parentId\n };\n tree == null || tree.addNode(node);\n return () => {\n tree == null || tree.removeNode(node);\n };\n }, [tree, id, parentId]);\n return id;\n}\n/**\n * Provides parent node context for nested floating elements.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingNode(props) {\n const {\n children,\n id\n } = props;\n const parentId = useFloatingParentNodeId();\n return /*#__PURE__*/jsx(FloatingNodeContext.Provider, {\n value: React.useMemo(() => ({\n id,\n parentId\n }), [id, parentId]),\n children: children\n });\n}\n/**\n * Provides context for nested floating elements when they are not children of\n * each other on the DOM.\n * This is not necessary in all cases, except when there must be explicit communication between parent and child floating elements. It is necessary for:\n * - The `bubbles` option in the `useDismiss()` Hook\n * - Nested virtual list navigation\n * - Nested floating elements that each open on hover\n * - Custom communication between parent and child floating elements\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingTree(props) {\n const {\n children\n } = props;\n const nodesRef = React.useRef([]);\n const addNode = React.useCallback(node => {\n nodesRef.current = [...nodesRef.current, node];\n }, []);\n const removeNode = React.useCallback(node => {\n nodesRef.current = nodesRef.current.filter(n => n !== node);\n }, []);\n const [events] = React.useState(() => createEventEmitter());\n return /*#__PURE__*/jsx(FloatingTreeContext.Provider, {\n value: React.useMemo(() => ({\n nodesRef,\n addNode,\n removeNode,\n events\n }), [addNode, removeNode, events]),\n children: children\n });\n}\n\nfunction createAttribute(name) {\n return \"data-floating-ui-\" + name;\n}\n\nfunction clearTimeoutIfSet(timeoutRef) {\n if (timeoutRef.current !== -1) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = -1;\n }\n}\n\nconst safePolygonIdentifier = /*#__PURE__*/createAttribute('safe-polygon');\nfunction getDelay(value, prop, pointerType) {\n if (pointerType && !isMouseLikePointerType(pointerType)) {\n return 0;\n }\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'function') {\n const result = value();\n if (typeof result === 'number') {\n return result;\n }\n return result == null ? void 0 : result[prop];\n }\n return value == null ? void 0 : value[prop];\n}\nfunction getRestMs(value) {\n if (typeof value === 'function') {\n return value();\n }\n return value;\n}\n/**\n * Opens the floating element while hovering over the reference element, like\n * CSS `:hover`.\n * @see https://floating-ui.com/docs/useHover\n */\nfunction useHover(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n onOpenChange,\n dataRef,\n events,\n elements\n } = context;\n const {\n enabled = true,\n delay = 0,\n handleClose = null,\n mouseOnly = false,\n restMs = 0,\n move = true\n } = props;\n const tree = useFloatingTree();\n const parentId = useFloatingParentNodeId();\n const handleCloseRef = useLatestRef(handleClose);\n const delayRef = useLatestRef(delay);\n const openRef = useLatestRef(open);\n const restMsRef = useLatestRef(restMs);\n const pointerTypeRef = React.useRef();\n const timeoutRef = React.useRef(-1);\n const handlerRef = React.useRef();\n const restTimeoutRef = React.useRef(-1);\n const blockMouseMoveRef = React.useRef(true);\n const performedPointerEventsMutationRef = React.useRef(false);\n const unbindMouseMoveRef = React.useRef(() => {});\n const restTimeoutPendingRef = React.useRef(false);\n const isHoverOpen = useEffectEvent(() => {\n var _dataRef$current$open;\n const type = (_dataRef$current$open = dataRef.current.openEvent) == null ? void 0 : _dataRef$current$open.type;\n return (type == null ? void 0 : type.includes('mouse')) && type !== 'mousedown';\n });\n\n // When closing before opening, clear the delay timeouts to cancel it\n // from showing.\n React.useEffect(() => {\n if (!enabled) return;\n function onOpenChange(_ref) {\n let {\n open\n } = _ref;\n if (!open) {\n clearTimeoutIfSet(timeoutRef);\n clearTimeoutIfSet(restTimeoutRef);\n blockMouseMoveRef.current = true;\n restTimeoutPendingRef.current = false;\n }\n }\n events.on('openchange', onOpenChange);\n return () => {\n events.off('openchange', onOpenChange);\n };\n }, [enabled, events]);\n React.useEffect(() => {\n if (!enabled) return;\n if (!handleCloseRef.current) return;\n if (!open) return;\n function onLeave(event) {\n if (isHoverOpen()) {\n onOpenChange(false, event, 'hover');\n }\n }\n const html = getDocument$1(elements.floating).documentElement;\n html.addEventListener('mouseleave', onLeave);\n return () => {\n html.removeEventListener('mouseleave', onLeave);\n };\n }, [elements.floating, open, onOpenChange, enabled, handleCloseRef, isHoverOpen]);\n const closeWithDelay = React.useCallback(function (event, runElseBranch, reason) {\n if (runElseBranch === void 0) {\n runElseBranch = true;\n }\n if (reason === void 0) {\n reason = 'hover';\n }\n const closeDelay = getDelay(delayRef.current, 'close', pointerTypeRef.current);\n if (closeDelay && !handlerRef.current) {\n clearTimeoutIfSet(timeoutRef);\n timeoutRef.current = window.setTimeout(() => onOpenChange(false, event, reason), closeDelay);\n } else if (runElseBranch) {\n clearTimeoutIfSet(timeoutRef);\n onOpenChange(false, event, reason);\n }\n }, [delayRef, onOpenChange]);\n const cleanupMouseMoveHandler = useEffectEvent(() => {\n unbindMouseMoveRef.current();\n handlerRef.current = undefined;\n });\n const clearPointerEvents = useEffectEvent(() => {\n if (performedPointerEventsMutationRef.current) {\n const body = getDocument$1(elements.floating).body;\n body.style.pointerEvents = '';\n body.removeAttribute(safePolygonIdentifier);\n performedPointerEventsMutationRef.current = false;\n }\n });\n const isClickLikeOpenEvent = useEffectEvent(() => {\n return dataRef.current.openEvent ? ['click', 'mousedown'].includes(dataRef.current.openEvent.type) : false;\n });\n\n // Registering the mouse events on the reference directly to bypass React's\n // delegation system. If the cursor was on a disabled element and then entered\n // the reference (no gap), `mouseenter` doesn't fire in the delegation system.\n React.useEffect(() => {\n if (!enabled) return;\n function onReferenceMouseEnter(event) {\n clearTimeoutIfSet(timeoutRef);\n blockMouseMoveRef.current = false;\n if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current) || getRestMs(restMsRef.current) > 0 && !getDelay(delayRef.current, 'open')) {\n return;\n }\n const openDelay = getDelay(delayRef.current, 'open', pointerTypeRef.current);\n if (openDelay) {\n timeoutRef.current = window.setTimeout(() => {\n if (!openRef.current) {\n onOpenChange(true, event, 'hover');\n }\n }, openDelay);\n } else if (!open) {\n onOpenChange(true, event, 'hover');\n }\n }\n function onReferenceMouseLeave(event) {\n if (isClickLikeOpenEvent()) {\n clearPointerEvents();\n return;\n }\n unbindMouseMoveRef.current();\n const doc = getDocument$1(elements.floating);\n clearTimeoutIfSet(restTimeoutRef);\n restTimeoutPendingRef.current = false;\n if (handleCloseRef.current && dataRef.current.floatingContext) {\n // Prevent clearing `onScrollMouseLeave` timeout.\n if (!open) {\n clearTimeoutIfSet(timeoutRef);\n }\n handlerRef.current = handleCloseRef.current({\n ...dataRef.current.floatingContext,\n tree,\n x: event.clientX,\n y: event.clientY,\n onClose() {\n clearPointerEvents();\n cleanupMouseMoveHandler();\n if (!isClickLikeOpenEvent()) {\n closeWithDelay(event, true, 'safe-polygon');\n }\n }\n });\n const handler = handlerRef.current;\n doc.addEventListener('mousemove', handler);\n unbindMouseMoveRef.current = () => {\n doc.removeEventListener('mousemove', handler);\n };\n return;\n }\n\n // Allow interactivity without `safePolygon` on touch devices. With a\n // pointer, a short close delay is an alternative, so it should work\n // consistently.\n const shouldClose = pointerTypeRef.current === 'touch' ? !contains$1(elements.floating, event.relatedTarget) : true;\n if (shouldClose) {\n closeWithDelay(event);\n }\n }\n\n // Ensure the floating element closes after scrolling even if the pointer\n // did not move.\n // https://github.com/floating-ui/floating-ui/discussions/1692\n function onScrollMouseLeave(event) {\n if (isClickLikeOpenEvent()) return;\n if (!dataRef.current.floatingContext) return;\n handleCloseRef.current == null || handleCloseRef.current({\n ...dataRef.current.floatingContext,\n tree,\n x: event.clientX,\n y: event.clientY,\n onClose() {\n clearPointerEvents();\n cleanupMouseMoveHandler();\n if (!isClickLikeOpenEvent()) {\n closeWithDelay(event);\n }\n }\n })(event);\n }\n function onFloatingMouseEnter() {\n clearTimeoutIfSet(timeoutRef);\n }\n function onFloatingMouseLeave(event) {\n if (!isClickLikeOpenEvent()) {\n closeWithDelay(event, false);\n }\n }\n if (isElement(elements.domReference)) {\n const reference = elements.domReference;\n const floating = elements.floating;\n if (open) {\n reference.addEventListener('mouseleave', onScrollMouseLeave);\n }\n if (move) {\n reference.addEventListener('mousemove', onReferenceMouseEnter, {\n once: true\n });\n }\n reference.addEventListener('mouseenter', onReferenceMouseEnter);\n reference.addEventListener('mouseleave', onReferenceMouseLeave);\n if (floating) {\n floating.addEventListener('mouseleave', onScrollMouseLeave);\n floating.addEventListener('mouseenter', onFloatingMouseEnter);\n floating.addEventListener('mouseleave', onFloatingMouseLeave);\n }\n return () => {\n if (open) {\n reference.removeEventListener('mouseleave', onScrollMouseLeave);\n }\n if (move) {\n reference.removeEventListener('mousemove', onReferenceMouseEnter);\n }\n reference.removeEventListener('mouseenter', onReferenceMouseEnter);\n reference.removeEventListener('mouseleave', onReferenceMouseLeave);\n if (floating) {\n floating.removeEventListener('mouseleave', onScrollMouseLeave);\n floating.removeEventListener('mouseenter', onFloatingMouseEnter);\n floating.removeEventListener('mouseleave', onFloatingMouseLeave);\n }\n };\n }\n }, [elements, enabled, context, mouseOnly, move, closeWithDelay, cleanupMouseMoveHandler, clearPointerEvents, onOpenChange, open, openRef, tree, delayRef, handleCloseRef, dataRef, isClickLikeOpenEvent, restMsRef]);\n\n // Block pointer-events of every element other than the reference and floating\n // while the floating element is open and has a `handleClose` handler. Also\n // handles nested floating elements.\n // https://github.com/floating-ui/floating-ui/issues/1722\n useModernLayoutEffect(() => {\n var _handleCloseRef$curre;\n if (!enabled) return;\n if (open && (_handleCloseRef$curre = handleCloseRef.current) != null && (_handleCloseRef$curre = _handleCloseRef$curre.__options) != null && _handleCloseRef$curre.blockPointerEvents && isHoverOpen()) {\n performedPointerEventsMutationRef.current = true;\n const floatingEl = elements.floating;\n if (isElement(elements.domReference) && floatingEl) {\n var _tree$nodesRef$curren;\n const body = getDocument$1(elements.floating).body;\n body.setAttribute(safePolygonIdentifier, '');\n const ref = elements.domReference;\n const parentFloating = tree == null || (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.context) == null ? void 0 : _tree$nodesRef$curren.elements.floating;\n if (parentFloating) {\n parentFloating.style.pointerEvents = '';\n }\n body.style.pointerEvents = 'none';\n ref.style.pointerEvents = 'auto';\n floatingEl.style.pointerEvents = 'auto';\n return () => {\n body.style.pointerEvents = '';\n ref.style.pointerEvents = '';\n floatingEl.style.pointerEvents = '';\n };\n }\n }\n }, [enabled, open, parentId, elements, tree, handleCloseRef, isHoverOpen]);\n useModernLayoutEffect(() => {\n if (!open) {\n pointerTypeRef.current = undefined;\n restTimeoutPendingRef.current = false;\n cleanupMouseMoveHandler();\n clearPointerEvents();\n }\n }, [open, cleanupMouseMoveHandler, clearPointerEvents]);\n React.useEffect(() => {\n return () => {\n cleanupMouseMoveHandler();\n clearTimeoutIfSet(timeoutRef);\n clearTimeoutIfSet(restTimeoutRef);\n clearPointerEvents();\n };\n }, [enabled, elements.domReference, cleanupMouseMoveHandler, clearPointerEvents]);\n const reference = React.useMemo(() => {\n function setPointerRef(event) {\n pointerTypeRef.current = event.pointerType;\n }\n return {\n onPointerDown: setPointerRef,\n onPointerEnter: setPointerRef,\n onMouseMove(event) {\n const {\n nativeEvent\n } = event;\n function handleMouseMove() {\n if (!blockMouseMoveRef.current && !openRef.current) {\n onOpenChange(true, nativeEvent, 'hover');\n }\n }\n if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current)) {\n return;\n }\n if (open || getRestMs(restMsRef.current) === 0) {\n return;\n }\n\n // Ignore insignificant movements to account for tremors.\n if (restTimeoutPendingRef.current && event.movementX ** 2 + event.movementY ** 2 < 2) {\n return;\n }\n clearTimeoutIfSet(restTimeoutRef);\n if (pointerTypeRef.current === 'touch') {\n handleMouseMove();\n } else {\n restTimeoutPendingRef.current = true;\n restTimeoutRef.current = window.setTimeout(handleMouseMove, getRestMs(restMsRef.current));\n }\n }\n };\n }, [mouseOnly, onOpenChange, open, openRef, restMsRef]);\n return React.useMemo(() => enabled ? {\n reference\n } : {}, [enabled, reference]);\n}\n\nconst NOOP = () => {};\nconst FloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n delay: 0,\n initialDelay: 0,\n timeoutMs: 0,\n currentId: null,\n setCurrentId: NOOP,\n setState: NOOP,\n isInstantPhase: false\n});\n\n/**\n * @deprecated\n * Use the return value of `useDelayGroup()` instead.\n */\nconst useDelayGroupContext = () => React.useContext(FloatingDelayGroupContext);\n/**\n * Provides context for a group of floating elements that should share a\n * `delay`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction FloatingDelayGroup(props) {\n const {\n children,\n delay,\n timeoutMs = 0\n } = props;\n const [state, setState] = React.useReducer((prev, next) => ({\n ...prev,\n ...next\n }), {\n delay,\n timeoutMs,\n initialDelay: delay,\n currentId: null,\n isInstantPhase: false\n });\n const initialCurrentIdRef = React.useRef(null);\n const setCurrentId = React.useCallback(currentId => {\n setState({\n currentId\n });\n }, []);\n useModernLayoutEffect(() => {\n if (state.currentId) {\n if (initialCurrentIdRef.current === null) {\n initialCurrentIdRef.current = state.currentId;\n } else if (!state.isInstantPhase) {\n setState({\n isInstantPhase: true\n });\n }\n } else {\n if (state.isInstantPhase) {\n setState({\n isInstantPhase: false\n });\n }\n initialCurrentIdRef.current = null;\n }\n }, [state.currentId, state.isInstantPhase]);\n return /*#__PURE__*/jsx(FloatingDelayGroupContext.Provider, {\n value: React.useMemo(() => ({\n ...state,\n setState,\n setCurrentId\n }), [state, setCurrentId]),\n children: children\n });\n}\n/**\n * Enables grouping when called inside a component that's a child of a\n * `FloatingDelayGroup`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction useDelayGroup(context, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n open,\n onOpenChange,\n floatingId\n } = context;\n const {\n id: optionId,\n enabled = true\n } = options;\n const id = optionId != null ? optionId : floatingId;\n const groupContext = useDelayGroupContext();\n const {\n currentId,\n setCurrentId,\n initialDelay,\n setState,\n timeoutMs\n } = groupContext;\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (!currentId) return;\n setState({\n delay: {\n open: 1,\n close: getDelay(initialDelay, 'close')\n }\n });\n if (currentId !== id) {\n onOpenChange(false);\n }\n }, [enabled, id, onOpenChange, setState, currentId, initialDelay]);\n useModernLayoutEffect(() => {\n function unset() {\n onOpenChange(false);\n setState({\n delay: initialDelay,\n currentId: null\n });\n }\n if (!enabled) return;\n if (!currentId) return;\n if (!open && currentId === id) {\n if (timeoutMs) {\n const timeout = window.setTimeout(unset, timeoutMs);\n return () => {\n clearTimeout(timeout);\n };\n }\n unset();\n }\n }, [enabled, open, setState, currentId, id, onOpenChange, initialDelay, timeoutMs]);\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (setCurrentId === NOOP || !open) return;\n setCurrentId(id);\n }, [enabled, open, setCurrentId, id]);\n return groupContext;\n}\n\nconst NextFloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n hasProvider: false,\n timeoutMs: 0,\n delayRef: {\n current: 0\n },\n initialDelayRef: {\n current: 0\n },\n timeoutIdRef: {\n current: -1\n },\n currentIdRef: {\n current: null\n },\n currentContextRef: {\n current: null\n }\n});\n/**\n * Experimental next version of `FloatingDelayGroup` to become the default\n * in the future. This component is not yet stable.\n * Provides context for a group of floating elements that should share a\n * `delay`. Unlike `FloatingDelayGroup`, `useNextDelayGroup` with this\n * component does not cause a re-render of unrelated consumers of the\n * context when the delay changes.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction NextFloatingDelayGroup(props) {\n const {\n children,\n delay,\n timeoutMs = 0\n } = props;\n const delayRef = React.useRef(delay);\n const initialDelayRef = React.useRef(delay);\n const currentIdRef = React.useRef(null);\n const currentContextRef = React.useRef(null);\n const timeoutIdRef = React.useRef(-1);\n return /*#__PURE__*/jsx(NextFloatingDelayGroupContext.Provider, {\n value: React.useMemo(() => ({\n hasProvider: true,\n delayRef,\n initialDelayRef,\n currentIdRef,\n timeoutMs,\n currentContextRef,\n timeoutIdRef\n }), [timeoutMs]),\n children: children\n });\n}\n/**\n * Enables grouping when called inside a component that's a child of a\n * `NextFloatingDelayGroup`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction useNextDelayGroup(context, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n open,\n onOpenChange,\n floatingId\n } = context;\n const {\n enabled = true\n } = options;\n const groupContext = React.useContext(NextFloatingDelayGroupContext);\n const {\n currentIdRef,\n delayRef,\n timeoutMs,\n initialDelayRef,\n currentContextRef,\n hasProvider,\n timeoutIdRef\n } = groupContext;\n const [isInstantPhase, setIsInstantPhase] = React.useState(false);\n useModernLayoutEffect(() => {\n function unset() {\n var _currentContextRef$cu;\n setIsInstantPhase(false);\n (_currentContextRef$cu = currentContextRef.current) == null || _currentContextRef$cu.setIsInstantPhase(false);\n currentIdRef.current = null;\n currentContextRef.current = null;\n delayRef.current = initialDelayRef.current;\n }\n if (!enabled) return;\n if (!currentIdRef.current) return;\n if (!open && currentIdRef.current === floatingId) {\n setIsInstantPhase(false);\n if (timeoutMs) {\n timeoutIdRef.current = window.setTimeout(unset, timeoutMs);\n return () => {\n clearTimeout(timeoutIdRef.current);\n };\n }\n unset();\n }\n }, [enabled, open, floatingId, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeoutIdRef]);\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (!open) return;\n const prevContext = currentContextRef.current;\n const prevId = currentIdRef.current;\n currentContextRef.current = {\n onOpenChange,\n setIsInstantPhase\n };\n currentIdRef.current = floatingId;\n delayRef.current = {\n open: 0,\n close: getDelay(initialDelayRef.current, 'close')\n };\n if (prevId !== null && prevId !== floatingId) {\n clearTimeoutIfSet(timeoutIdRef);\n setIsInstantPhase(true);\n prevContext == null || prevContext.setIsInstantPhase(true);\n prevContext == null || prevContext.onOpenChange(false);\n } else {\n setIsInstantPhase(false);\n prevContext == null || prevContext.setIsInstantPhase(false);\n }\n }, [enabled, open, floatingId, onOpenChange, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeoutIdRef]);\n useModernLayoutEffect(() => {\n return () => {\n currentContextRef.current = null;\n };\n }, [currentContextRef]);\n return React.useMemo(() => ({\n hasProvider,\n delayRef,\n isInstantPhase\n }), [hasProvider, delayRef, isInstantPhase]);\n}\n\nlet rafId = 0;\nfunction enqueueFocus(el, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n preventScroll = false,\n cancelPrevious = true,\n sync = false\n } = options;\n cancelPrevious && cancelAnimationFrame(rafId);\n const exec = () => el == null ? void 0 : el.focus({\n preventScroll\n });\n if (sync) {\n exec();\n } else {\n rafId = requestAnimationFrame(exec);\n }\n}\n\nfunction contains(parent, child) {\n if (!parent || !child) {\n return false;\n }\n const rootNode = child.getRootNode == null ? void 0 : child.getRootNode();\n\n // First, attempt with faster native method\n if (parent.contains(child)) {\n return true;\n }\n\n // then fallback to custom implementation with Shadow DOM support\n if (rootNode && isShadowRoot(rootNode)) {\n let next = child;\n while (next) {\n if (parent === next) {\n return true;\n }\n // @ts-ignore\n next = next.parentNode || next.host;\n }\n }\n\n // Give up, the result is false\n return false;\n}\nfunction getTarget(event) {\n if ('composedPath' in event) {\n return event.composedPath()[0];\n }\n\n // TS thinks `event` is of type never as it assumes all browsers support\n // `composedPath()`, but browsers without shadow DOM don't.\n return event.target;\n}\nfunction getDocument(node) {\n return (node == null ? void 0 : node.ownerDocument) || document;\n}\n\n// Modified to add conditional `aria-hidden` support:\n// https://github.com/theKashey/aria-hidden/blob/9220c8f4a4fd35f63bee5510a9f41a37264382d4/src/index.ts\nconst counters = {\n inert: /*#__PURE__*/new WeakMap(),\n 'aria-hidden': /*#__PURE__*/new WeakMap(),\n none: /*#__PURE__*/new WeakMap()\n};\nfunction getCounterMap(control) {\n if (control === 'inert') return counters.inert;\n if (control === 'aria-hidden') return counters['aria-hidden'];\n return counters.none;\n}\nlet uncontrolledElementsSet = /*#__PURE__*/new WeakSet();\nlet markerMap = {};\nlet lockCount$1 = 0;\nconst supportsInert = () => typeof HTMLElement !== 'undefined' && 'inert' in HTMLElement.prototype;\nconst unwrapHost = node => node && (node.host || unwrapHost(node.parentNode));\nconst correctElements = (parent, targets) => targets.map(target => {\n if (parent.contains(target)) {\n return target;\n }\n const correctedTarget = unwrapHost(target);\n if (parent.contains(correctedTarget)) {\n return correctedTarget;\n }\n return null;\n}).filter(x => x != null);\nfunction applyAttributeToOthers(uncorrectedAvoidElements, body, ariaHidden, inert) {\n const markerName = 'data-floating-ui-inert';\n const controlAttribute = inert ? 'inert' : ariaHidden ? 'aria-hidden' : null;\n const avoidElements = correctElements(body, uncorrectedAvoidElements);\n const elementsToKeep = new Set();\n const elementsToStop = new Set(avoidElements);\n const hiddenElements = [];\n if (!markerMap[markerName]) {\n markerMap[markerName] = new WeakMap();\n }\n const markerCounter = markerMap[markerName];\n avoidElements.forEach(keep);\n deep(body);\n elementsToKeep.clear();\n function keep(el) {\n if (!el || elementsToKeep.has(el)) {\n return;\n }\n elementsToKeep.add(el);\n el.parentNode && keep(el.parentNode);\n }\n function deep(parent) {\n if (!parent || elementsToStop.has(parent)) {\n return;\n }\n [].forEach.call(parent.children, node => {\n if (getNodeName(node) === 'script') return;\n if (elementsToKeep.has(node)) {\n deep(node);\n } else {\n const attr = controlAttribute ? node.getAttribute(controlAttribute) : null;\n const alreadyHidden = attr !== null && attr !== 'false';\n const counterMap = getCounterMap(controlAttribute);\n const counterValue = (counterMap.get(node) || 0) + 1;\n const markerValue = (markerCounter.get(node) || 0) + 1;\n counterMap.set(node, counterValue);\n markerCounter.set(node, markerValue);\n hiddenElements.push(node);\n if (counterValue === 1 && alreadyHidden) {\n uncontrolledElementsSet.add(node);\n }\n if (markerValue === 1) {\n node.setAttribute(markerName, '');\n }\n if (!alreadyHidden && controlAttribute) {\n node.setAttribute(controlAttribute, controlAttribute === 'inert' ? '' : 'true');\n }\n }\n });\n }\n lockCount$1++;\n return () => {\n hiddenElements.forEach(element => {\n const counterMap = getCounterMap(controlAttribute);\n const currentCounterValue = counterMap.get(element) || 0;\n const counterValue = currentCounterValue - 1;\n const markerValue = (markerCounter.get(element) || 0) - 1;\n counterMap.set(element, counterValue);\n markerCounter.set(element, markerValue);\n if (!counterValue) {\n if (!uncontrolledElementsSet.has(element) && controlAttribute) {\n element.removeAttribute(controlAttribute);\n }\n uncontrolledElementsSet.delete(element);\n }\n if (!markerValue) {\n element.removeAttribute(markerName);\n }\n });\n lockCount$1--;\n if (!lockCount$1) {\n counters.inert = new WeakMap();\n counters['aria-hidden'] = new WeakMap();\n counters.none = new WeakMap();\n uncontrolledElementsSet = new WeakSet();\n markerMap = {};\n }\n };\n}\nfunction markOthers(avoidElements, ariaHidden, inert) {\n if (ariaHidden === void 0) {\n ariaHidden = false;\n }\n if (inert === void 0) {\n inert = false;\n }\n const body = getDocument(avoidElements[0]).body;\n return applyAttributeToOthers(avoidElements.concat(Array.from(body.querySelectorAll('[aria-live],[role=\"status\"],output'))), body, ariaHidden, inert);\n}\n\nconst HIDDEN_STYLES = {\n border: 0,\n clip: 'rect(0 0 0 0)',\n height: '1px',\n margin: '-1px',\n overflow: 'hidden',\n padding: 0,\n position: 'fixed',\n whiteSpace: 'nowrap',\n width: '1px',\n top: 0,\n left: 0\n};\nconst FocusGuard = /*#__PURE__*/React.forwardRef(function FocusGuard(props, ref) {\n const [role, setRole] = React.useState();\n useModernLayoutEffect(() => {\n if (isSafari()) {\n // Unlike other screen readers such as NVDA and JAWS, the virtual cursor\n // on VoiceOver does trigger the onFocus event, so we can use the focus\n // trap element. On Safari, only buttons trigger the onFocus event.\n // NB: \"group\" role in the Sandbox no longer appears to work, must be a\n // button role.\n setRole('button');\n }\n }, []);\n const restProps = {\n ref,\n tabIndex: 0,\n // Role is only for VoiceOver\n role,\n 'aria-hidden': role ? undefined : true,\n [createAttribute('focus-guard')]: '',\n style: HIDDEN_STYLES\n };\n return /*#__PURE__*/jsx(\"span\", {\n ...props,\n ...restProps\n });\n});\n\nconst PortalContext = /*#__PURE__*/React.createContext(null);\nconst attr = /*#__PURE__*/createAttribute('portal');\n/**\n * @see https://floating-ui.com/docs/FloatingPortal#usefloatingportalnode\n */\nfunction useFloatingPortalNode(props) {\n if (props === void 0) {\n props = {};\n }\n const {\n id,\n root\n } = props;\n const uniqueId = useId();\n const portalContext = usePortalContext();\n const [portalNode, setPortalNode] = React.useState(null);\n const portalNodeRef = React.useRef(null);\n useModernLayoutEffect(() => {\n return () => {\n portalNode == null || portalNode.remove();\n // Allow the subsequent layout effects to create a new node on updates.\n // The portal node will still be cleaned up on unmount.\n // https://github.com/floating-ui/floating-ui/issues/2454\n queueMicrotask(() => {\n portalNodeRef.current = null;\n });\n };\n }, [portalNode]);\n useModernLayoutEffect(() => {\n // Wait for the uniqueId to be generated before creating the portal node in\n // React <18 (using `useFloatingId` instead of the native `useId`).\n // https://github.com/floating-ui/floating-ui/issues/2778\n if (!uniqueId) return;\n if (portalNodeRef.current) return;\n const existingIdRoot = id ? document.getElementById(id) : null;\n if (!existingIdRoot) return;\n const subRoot = document.createElement('div');\n subRoot.id = uniqueId;\n subRoot.setAttribute(attr, '');\n existingIdRoot.appendChild(subRoot);\n portalNodeRef.current = subRoot;\n setPortalNode(subRoot);\n }, [id, uniqueId]);\n useModernLayoutEffect(() => {\n // Wait for the root to exist before creating the portal node. The root must\n // be stored in state, not a ref, for this to work reactively.\n if (root === null) return;\n if (!uniqueId) return;\n if (portalNodeRef.current) return;\n let container = root || (portalContext == null ? void 0 : portalContext.portalNode);\n if (container && !isNode(container)) container = container.current;\n container = container || document.body;\n let idWrapper = null;\n if (id) {\n idWrapper = document.createElement('div');\n idWrapper.id = id;\n container.appendChild(idWrapper);\n }\n const subRoot = document.createElement('div');\n subRoot.id = uniqueId;\n subRoot.setAttribute(attr, '');\n container = idWrapper || container;\n container.appendChild(subRoot);\n portalNodeRef.current = subRoot;\n setPortalNode(subRoot);\n }, [id, root, uniqueId, portalContext]);\n return portalNode;\n}\n/**\n * Portals the floating element into a given container element — by default,\n * outside of the app root and into the body.\n * This is necessary to ensure the floating element can appear outside any\n * potential parent containers that cause clipping (such as `overflow: hidden`),\n * while retaining its location in the React tree.\n * @see https://floating-ui.com/docs/FloatingPortal\n */\nfunction FloatingPortal(props) {\n const {\n children,\n id,\n root,\n preserveTabOrder = true\n } = props;\n const portalNode = useFloatingPortalNode({\n id,\n root\n });\n const [focusManagerState, setFocusManagerState] = React.useState(null);\n const beforeOutsideRef = React.useRef(null);\n const afterOutsideRef = React.useRef(null);\n const beforeInsideRef = React.useRef(null);\n const afterInsideRef = React.useRef(null);\n const modal = focusManagerState == null ? void 0 : focusManagerState.modal;\n const open = focusManagerState == null ? void 0 : focusManagerState.open;\n const shouldRenderGuards =\n // The FocusManager and therefore floating element are currently open/\n // rendered.\n !!focusManagerState &&\n // Guards are only for non-modal focus management.\n !focusManagerState.modal &&\n // Don't render if unmount is transitioning.\n focusManagerState.open && preserveTabOrder && !!(root || portalNode);\n\n // https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/TabbablePortal.tsx\n React.useEffect(() => {\n if (!portalNode || !preserveTabOrder || modal) {\n return;\n }\n\n // Make sure elements inside the portal element are tabbable only when the\n // portal has already been focused, either by tabbing into a focus trap\n // element outside or using the mouse.\n function onFocus(event) {\n if (portalNode && isOutsideEvent(event)) {\n const focusing = event.type === 'focusin';\n const manageFocus = focusing ? enableFocusInside : disableFocusInside;\n manageFocus(portalNode);\n }\n }\n // Listen to the event on the capture phase so they run before the focus\n // trap elements onFocus prop is called.\n portalNode.addEventListener('focusin', onFocus, true);\n portalNode.addEventListener('focusout', onFocus, true);\n return () => {\n portalNode.removeEventListener('focusin', onFocus, true);\n portalNode.removeEventListener('focusout', onFocus, true);\n };\n }, [portalNode, preserveTabOrder, modal]);\n React.useEffect(() => {\n if (!portalNode) return;\n if (open) return;\n enableFocusInside(portalNode);\n }, [open, portalNode]);\n return /*#__PURE__*/jsxs(PortalContext.Provider, {\n value: React.useMemo(() => ({\n preserveTabOrder,\n beforeOutsideRef,\n afterOutsideRef,\n beforeInsideRef,\n afterInsideRef,\n portalNode,\n setFocusManagerState\n }), [preserveTabOrder, portalNode]),\n children: [shouldRenderGuards && portalNode && /*#__PURE__*/jsx(FocusGuard, {\n \"data-type\": \"outside\",\n ref: beforeOutsideRef,\n onFocus: event => {\n if (isOutsideEvent(event, portalNode)) {\n var _beforeInsideRef$curr;\n (_beforeInsideRef$curr = beforeInsideRef.current) == null || _beforeInsideRef$curr.focus();\n } else {\n const domReference = focusManagerState ? focusManagerState.domReference : null;\n const prevTabbable = getPreviousTabbable(domReference);\n prevTabbable == null || prevTabbable.focus();\n }\n }\n }), shouldRenderGuards && portalNode && /*#__PURE__*/jsx(\"span\", {\n \"aria-owns\": portalNode.id,\n style: HIDDEN_STYLES\n }), portalNode && /*#__PURE__*/ReactDOM.createPortal(children, portalNode), shouldRenderGuards && portalNode && /*#__PURE__*/jsx(FocusGuard, {\n \"data-type\": \"outside\",\n ref: afterOutsideRef,\n onFocus: event => {\n if (isOutsideEvent(event, portalNode)) {\n var _afterInsideRef$curre;\n (_afterInsideRef$curre = afterInsideRef.current) == null || _afterInsideRef$curre.focus();\n } else {\n const domReference = focusManagerState ? focusManagerState.domReference : null;\n const nextTabbable = getNextTabbable(domReference);\n nextTabbable == null || nextTabbable.focus();\n (focusManagerState == null ? void 0 : focusManagerState.closeOnFocusOut) && (focusManagerState == null ? void 0 : focusManagerState.onOpenChange(false, event.nativeEvent, 'focus-out'));\n }\n }\n })]\n });\n}\nconst usePortalContext = () => React.useContext(PortalContext);\n\nfunction useLiteMergeRefs(refs) {\n return React.useMemo(() => {\n return value => {\n refs.forEach(ref => {\n if (ref) {\n ref.current = value;\n }\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n}\n\nconst LIST_LIMIT = 20;\nlet previouslyFocusedElements = [];\nfunction clearDisconnectedPreviouslyFocusedElements() {\n previouslyFocusedElements = previouslyFocusedElements.filter(el => el.isConnected);\n}\nfunction addPreviouslyFocusedElement(element) {\n clearDisconnectedPreviouslyFocusedElements();\n if (element && getNodeName(element) !== 'body') {\n previouslyFocusedElements.push(element);\n if (previouslyFocusedElements.length > LIST_LIMIT) {\n previouslyFocusedElements = previouslyFocusedElements.slice(-20);\n }\n }\n}\nfunction getPreviouslyFocusedElement() {\n clearDisconnectedPreviouslyFocusedElements();\n return previouslyFocusedElements[previouslyFocusedElements.length - 1];\n}\nfunction getFirstTabbableElement(container) {\n const tabbableOptions = getTabbableOptions();\n if (isTabbable(container, tabbableOptions)) {\n return container;\n }\n return tabbable(container, tabbableOptions)[0] || container;\n}\nfunction handleTabIndex(floatingFocusElement, orderRef) {\n var _floatingFocusElement;\n if (!orderRef.current.includes('floating') && !((_floatingFocusElement = floatingFocusElement.getAttribute('role')) != null && _floatingFocusElement.includes('dialog'))) {\n return;\n }\n const options = getTabbableOptions();\n const focusableElements = focusable(floatingFocusElement, options);\n const tabbableContent = focusableElements.filter(element => {\n const dataTabIndex = element.getAttribute('data-tabindex') || '';\n return isTabbable(element, options) || element.hasAttribute('data-tabindex') && !dataTabIndex.startsWith('-');\n });\n const tabIndex = floatingFocusElement.getAttribute('tabindex');\n if (orderRef.current.includes('floating') || tabbableContent.length === 0) {\n if (tabIndex !== '0') {\n floatingFocusElement.setAttribute('tabindex', '0');\n }\n } else if (tabIndex !== '-1' || floatingFocusElement.hasAttribute('data-tabindex') && floatingFocusElement.getAttribute('data-tabindex') !== '-1') {\n floatingFocusElement.setAttribute('tabindex', '-1');\n floatingFocusElement.setAttribute('data-tabindex', '-1');\n }\n}\nconst VisuallyHiddenDismiss = /*#__PURE__*/React.forwardRef(function VisuallyHiddenDismiss(props, ref) {\n return /*#__PURE__*/jsx(\"button\", {\n ...props,\n type: \"button\",\n ref: ref,\n tabIndex: -1,\n style: HIDDEN_STYLES\n });\n});\n/**\n * Provides focus management for the floating element.\n * @see https://floating-ui.com/docs/FloatingFocusManager\n */\nfunction FloatingFocusManager(props) {\n const {\n context,\n children,\n disabled = false,\n order = ['content'],\n guards: _guards = true,\n initialFocus = 0,\n returnFocus = true,\n restoreFocus = false,\n modal = true,\n visuallyHiddenDismiss = false,\n closeOnFocusOut = true,\n outsideElementsInert = false,\n getInsideElements: _getInsideElements = () => []\n } = props;\n const {\n open,\n onOpenChange,\n events,\n dataRef,\n elements: {\n domReference,\n floating\n }\n } = context;\n const getNodeId = useEffectEvent(() => {\n var _dataRef$current$floa;\n return (_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.nodeId;\n });\n const getInsideElements = useEffectEvent(_getInsideElements);\n const ignoreInitialFocus = typeof initialFocus === 'number' && initialFocus < 0;\n // If the reference is a combobox and is typeable (e.g. input/textarea),\n // there are different focus semantics. The guards should not be rendered, but\n // aria-hidden should be applied to all nodes still. Further, the visually\n // hidden dismiss button should only appear at the end of the list, not the\n // start.\n const isUntrappedTypeableCombobox = isTypeableCombobox(domReference) && ignoreInitialFocus;\n\n // Force the guards to be rendered if the `inert` attribute is not supported.\n const inertSupported = supportsInert();\n const guards = inertSupported ? _guards : true;\n const useInert = !guards || inertSupported && outsideElementsInert;\n const orderRef = useLatestRef(order);\n const initialFocusRef = useLatestRef(initialFocus);\n const returnFocusRef = useLatestRef(returnFocus);\n const tree = useFloatingTree();\n const portalContext = usePortalContext();\n const startDismissButtonRef = React.useRef(null);\n const endDismissButtonRef = React.useRef(null);\n const preventReturnFocusRef = React.useRef(false);\n const isPointerDownRef = React.useRef(false);\n const tabbableIndexRef = React.useRef(-1);\n const blurTimeoutRef = React.useRef(-1);\n const isInsidePortal = portalContext != null;\n const floatingFocusElement = getFloatingFocusElement(floating);\n const getTabbableContent = useEffectEvent(function (container) {\n if (container === void 0) {\n container = floatingFocusElement;\n }\n return container ? tabbable(container, getTabbableOptions()) : [];\n });\n const getTabbableElements = useEffectEvent(container => {\n const content = getTabbableContent(container);\n return orderRef.current.map(type => {\n if (domReference && type === 'reference') {\n return domReference;\n }\n if (floatingFocusElement && type === 'floating') {\n return floatingFocusElement;\n }\n return content;\n }).filter(Boolean).flat();\n });\n React.useEffect(() => {\n if (disabled) return;\n if (!modal) return;\n function onKeyDown(event) {\n if (event.key === 'Tab') {\n // The focus guards have nothing to focus, so we need to stop the event.\n if (contains$1(floatingFocusElement, activeElement(getDocument$1(floatingFocusElement))) && getTabbableContent().length === 0 && !isUntrappedTypeableCombobox) {\n stopEvent(event);\n }\n const els = getTabbableElements();\n const target = getTarget$1(event);\n if (orderRef.current[0] === 'reference' && target === domReference) {\n stopEvent(event);\n if (event.shiftKey) {\n enqueueFocus(els[els.length - 1]);\n } else {\n enqueueFocus(els[1]);\n }\n }\n if (orderRef.current[1] === 'floating' && target === floatingFocusElement && event.shiftKey) {\n stopEvent(event);\n enqueueFocus(els[0]);\n }\n }\n }\n const doc = getDocument$1(floatingFocusElement);\n doc.addEventListener('keydown', onKeyDown);\n return () => {\n doc.removeEventListener('keydown', onKeyDown);\n };\n }, [disabled, domReference, floatingFocusElement, modal, orderRef, isUntrappedTypeableCombobox, getTabbableContent, getTabbableElements]);\n React.useEffect(() => {\n if (disabled) return;\n if (!floating) return;\n function handleFocusIn(event) {\n const target = getTarget$1(event);\n const tabbableContent = getTabbableContent();\n const tabbableIndex = tabbableContent.indexOf(target);\n if (tabbableIndex !== -1) {\n tabbableIndexRef.current = tabbableIndex;\n }\n }\n floating.addEventListener('focusin', handleFocusIn);\n return () => {\n floating.removeEventListener('focusin', handleFocusIn);\n };\n }, [disabled, floating, getTabbableContent]);\n React.useEffect(() => {\n if (disabled) return;\n if (!closeOnFocusOut) return;\n\n // In Safari, buttons lose focus when pressing them.\n function handlePointerDown() {\n isPointerDownRef.current = true;\n setTimeout(() => {\n isPointerDownRef.current = false;\n });\n }\n function handleFocusOutside(event) {\n const relatedTarget = event.relatedTarget;\n const currentTarget = event.currentTarget;\n const target = getTarget$1(event);\n queueMicrotask(() => {\n const nodeId = getNodeId();\n const movedToUnrelatedNode = !(contains$1(domReference, relatedTarget) || contains$1(floating, relatedTarget) || contains$1(relatedTarget, floating) || contains$1(portalContext == null ? void 0 : portalContext.portalNode, relatedTarget) || relatedTarget != null && relatedTarget.hasAttribute(createAttribute('focus-guard')) || tree && (getNodeChildren$1(tree.nodesRef.current, nodeId).find(node => {\n var _node$context, _node$context2;\n return contains$1((_node$context = node.context) == null ? void 0 : _node$context.elements.floating, relatedTarget) || contains$1((_node$context2 = node.context) == null ? void 0 : _node$context2.elements.domReference, relatedTarget);\n }) || getNodeAncestors(tree.nodesRef.current, nodeId).find(node => {\n var _node$context3, _node$context4, _node$context5;\n return [(_node$context3 = node.context) == null ? void 0 : _node$context3.elements.floating, getFloatingFocusElement((_node$context4 = node.context) == null ? void 0 : _node$context4.elements.floating)].includes(relatedTarget) || ((_node$context5 = node.context) == null ? void 0 : _node$context5.elements.domReference) === relatedTarget;\n })));\n if (currentTarget === domReference && floatingFocusElement) {\n handleTabIndex(floatingFocusElement, orderRef);\n }\n\n // Restore focus to the previous tabbable element index to prevent\n // focus from being lost outside the floating tree.\n if (restoreFocus && currentTarget !== domReference && !(target != null && target.isConnected) && activeElement(getDocument$1(floatingFocusElement)) === getDocument$1(floatingFocusElement).body) {\n // Let `FloatingPortal` effect knows that focus is still inside the\n // floating tree.\n if (isHTMLElement(floatingFocusElement)) {\n floatingFocusElement.focus();\n }\n const prevTabbableIndex = tabbableIndexRef.current;\n const tabbableContent = getTabbableContent();\n const nodeToFocus = tabbableContent[prevTabbableIndex] || tabbableContent[tabbableContent.length - 1] || floatingFocusElement;\n if (isHTMLElement(nodeToFocus)) {\n nodeToFocus.focus();\n }\n }\n\n // https://github.com/floating-ui/floating-ui/issues/3060\n if (dataRef.current.insideReactTree) {\n dataRef.current.insideReactTree = false;\n return;\n }\n\n // Focus did not move inside the floating tree, and there are no tabbable\n // portal guards to handle closing.\n if ((isUntrappedTypeableCombobox ? true : !modal) && relatedTarget && movedToUnrelatedNode && !isPointerDownRef.current &&\n // Fix React 18 Strict Mode returnFocus due to double rendering.\n relatedTarget !== getPreviouslyFocusedElement()) {\n preventReturnFocusRef.current = true;\n onOpenChange(false, event, 'focus-out');\n }\n });\n }\n const shouldHandleBlurCapture = Boolean(!tree && portalContext);\n function markInsideReactTree() {\n clearTimeoutIfSet(blurTimeoutRef);\n dataRef.current.insideReactTree = true;\n blurTimeoutRef.current = window.setTimeout(() => {\n dataRef.current.insideReactTree = false;\n });\n }\n if (floating && isHTMLElement(domReference)) {\n domReference.addEventListener('focusout', handleFocusOutside);\n domReference.addEventListener('pointerdown', handlePointerDown);\n floating.addEventListener('focusout', handleFocusOutside);\n if (shouldHandleBlurCapture) {\n floating.addEventListener('focusout', markInsideReactTree, true);\n }\n return () => {\n domReference.removeEventListener('focusout', handleFocusOutside);\n domReference.removeEventListener('pointerdown', handlePointerDown);\n floating.removeEventListener('focusout', handleFocusOutside);\n if (shouldHandleBlurCapture) {\n floating.removeEventListener('focusout', markInsideReactTree, true);\n }\n };\n }\n }, [disabled, domReference, floating, floatingFocusElement, modal, tree, portalContext, onOpenChange, closeOnFocusOut, restoreFocus, getTabbableContent, isUntrappedTypeableCombobox, getNodeId, orderRef, dataRef]);\n const beforeGuardRef = React.useRef(null);\n const afterGuardRef = React.useRef(null);\n const mergedBeforeGuardRef = useLiteMergeRefs([beforeGuardRef, portalContext == null ? void 0 : portalContext.beforeInsideRef]);\n const mergedAfterGuardRef = useLiteMergeRefs([afterGuardRef, portalContext == null ? void 0 : portalContext.afterInsideRef]);\n React.useEffect(() => {\n var _portalContext$portal, _ancestors$find;\n if (disabled) return;\n if (!floating) return;\n\n // Don't hide portals nested within the parent portal.\n const portalNodes = Array.from((portalContext == null || (_portalContext$portal = portalContext.portalNode) == null ? void 0 : _portalContext$portal.querySelectorAll(\"[\" + createAttribute('portal') + \"]\")) || []);\n const ancestors = tree ? getNodeAncestors(tree.nodesRef.current, getNodeId()) : [];\n const rootAncestorComboboxDomReference = (_ancestors$find = ancestors.find(node => {\n var _node$context6;\n return isTypeableCombobox(((_node$context6 = node.context) == null ? void 0 : _node$context6.elements.domReference) || null);\n })) == null || (_ancestors$find = _ancestors$find.context) == null ? void 0 : _ancestors$find.elements.domReference;\n const insideElements = [floating, rootAncestorComboboxDomReference, ...portalNodes, ...getInsideElements(), startDismissButtonRef.current, endDismissButtonRef.current, beforeGuardRef.current, afterGuardRef.current, portalContext == null ? void 0 : portalContext.beforeOutsideRef.current, portalContext == null ? void 0 : portalContext.afterOutsideRef.current, orderRef.current.includes('reference') || isUntrappedTypeableCombobox ? domReference : null].filter(x => x != null);\n const cleanup = modal || isUntrappedTypeableCombobox ? markOthers(insideElements, !useInert, useInert) : markOthers(insideElements);\n return () => {\n cleanup();\n };\n }, [disabled, domReference, floating, modal, orderRef, portalContext, isUntrappedTypeableCombobox, guards, useInert, tree, getNodeId, getInsideElements]);\n useModernLayoutEffect(() => {\n if (disabled || !isHTMLElement(floatingFocusElement)) return;\n const doc = getDocument$1(floatingFocusElement);\n const previouslyFocusedElement = activeElement(doc);\n\n // Wait for any layout effect state setters to execute to set `tabIndex`.\n queueMicrotask(() => {\n const focusableElements = getTabbableElements(floatingFocusElement);\n const initialFocusValue = initialFocusRef.current;\n const elToFocus = (typeof initialFocusValue === 'number' ? focusableElements[initialFocusValue] : initialFocusValue.current) || floatingFocusElement;\n const focusAlreadyInsideFloatingEl = contains$1(floatingFocusElement, previouslyFocusedElement);\n if (!ignoreInitialFocus && !focusAlreadyInsideFloatingEl && open) {\n enqueueFocus(elToFocus, {\n preventScroll: elToFocus === floatingFocusElement\n });\n }\n });\n }, [disabled, open, floatingFocusElement, ignoreInitialFocus, getTabbableElements, initialFocusRef]);\n useModernLayoutEffect(() => {\n if (disabled || !floatingFocusElement) return;\n const doc = getDocument$1(floatingFocusElement);\n const previouslyFocusedElement = activeElement(doc);\n addPreviouslyFocusedElement(previouslyFocusedElement);\n\n // Dismissing via outside press should always ignore `returnFocus` to\n // prevent unwanted scrolling.\n function onOpenChange(_ref) {\n let {\n reason,\n event,\n nested\n } = _ref;\n if (['hover', 'safe-polygon'].includes(reason) && event.type === 'mouseleave') {\n preventReturnFocusRef.current = true;\n }\n if (reason !== 'outside-press') return;\n if (nested) {\n preventReturnFocusRef.current = false;\n } else if (isVirtualClick(event) || isVirtualPointerEvent(event)) {\n preventReturnFocusRef.current = false;\n } else {\n let isPreventScrollSupported = false;\n document.createElement('div').focus({\n get preventScroll() {\n isPreventScrollSupported = true;\n return false;\n }\n });\n if (isPreventScrollSupported) {\n preventReturnFocusRef.current = false;\n } else {\n preventReturnFocusRef.current = true;\n }\n }\n }\n events.on('openchange', onOpenChange);\n const fallbackEl = doc.createElement('span');\n fallbackEl.setAttribute('tabindex', '-1');\n fallbackEl.setAttribute('aria-hidden', 'true');\n Object.assign(fallbackEl.style, HIDDEN_STYLES);\n if (isInsidePortal && domReference) {\n domReference.insertAdjacentElement('afterend', fallbackEl);\n }\n function getReturnElement() {\n if (typeof returnFocusRef.current === 'boolean') {\n const el = domReference || getPreviouslyFocusedElement();\n return el && el.isConnected ? el : fallbackEl;\n }\n return returnFocusRef.current.current || fallbackEl;\n }\n return () => {\n events.off('openchange', onOpenChange);\n const activeEl = activeElement(doc);\n const isFocusInsideFloatingTree = contains$1(floating, activeEl) || tree && getNodeChildren$1(tree.nodesRef.current, getNodeId(), false).some(node => {\n var _node$context7;\n return contains$1((_node$context7 = node.context) == null ? void 0 : _node$context7.elements.floating, activeEl);\n });\n const returnElement = getReturnElement();\n queueMicrotask(() => {\n // This is `returnElement`, if it's tabbable, or its first tabbable child.\n const tabbableReturnElement = getFirstTabbableElement(returnElement);\n if (\n // eslint-disable-next-line react-hooks/exhaustive-deps\n returnFocusRef.current && !preventReturnFocusRef.current && isHTMLElement(tabbableReturnElement) && (\n // If the focus moved somewhere else after mount, avoid returning focus\n // since it likely entered a different element which should be\n // respected: https://github.com/floating-ui/floating-ui/issues/2607\n tabbableReturnElement !== activeEl && activeEl !== doc.body ? isFocusInsideFloatingTree : true)) {\n tabbableReturnElement.focus({\n preventScroll: true\n });\n }\n fallbackEl.remove();\n });\n };\n }, [disabled, floating, floatingFocusElement, returnFocusRef, dataRef, events, tree, isInsidePortal, domReference, getNodeId]);\n React.useEffect(() => {\n // The `returnFocus` cleanup behavior is inside a microtask; ensure we\n // wait for it to complete before resetting the flag.\n queueMicrotask(() => {\n preventReturnFocusRef.current = false;\n });\n return () => {\n queueMicrotask(clearDisconnectedPreviouslyFocusedElements);\n };\n }, [disabled]);\n\n // Synchronize the `context` & `modal` value to the FloatingPortal context.\n // It will decide whether or not it needs to render its own guards.\n useModernLayoutEffect(() => {\n if (disabled) return;\n if (!portalContext) return;\n portalContext.setFocusManagerState({\n modal,\n closeOnFocusOut,\n open,\n onOpenChange,\n domReference\n });\n return () => {\n portalContext.setFocusManagerState(null);\n };\n }, [disabled, portalContext, modal, open, onOpenChange, closeOnFocusOut, domReference]);\n useModernLayoutEffect(() => {\n if (disabled) return;\n if (!floatingFocusElement) return;\n handleTabIndex(floatingFocusElement, orderRef);\n }, [disabled, floatingFocusElement, orderRef]);\n function renderDismissButton(location) {\n if (disabled || !visuallyHiddenDismiss || !modal) {\n return null;\n }\n return /*#__PURE__*/jsx(VisuallyHiddenDismiss, {\n ref: location === 'start' ? startDismissButtonRef : endDismissButtonRef,\n onClick: event => onOpenChange(false, event.nativeEvent),\n children: typeof visuallyHiddenDismiss === 'string' ? visuallyHiddenDismiss : 'Dismiss'\n });\n }\n const shouldRenderGuards = !disabled && guards && (modal ? !isUntrappedTypeableCombobox : true) && (isInsidePortal || modal);\n return /*#__PURE__*/jsxs(Fragment, {\n children: [shouldRenderGuards && /*#__PURE__*/jsx(FocusGuard, {\n \"data-type\": \"inside\",\n ref: mergedBeforeGuardRef,\n onFocus: event => {\n if (modal) {\n const els = getTabbableElements();\n enqueueFocus(order[0] === 'reference' ? els[0] : els[els.length - 1]);\n } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n preventReturnFocusRef.current = false;\n if (isOutsideEvent(event, portalContext.portalNode)) {\n const nextTabbable = getNextTabbable(domReference);\n nextTabbable == null || nextTabbable.focus();\n } else {\n var _portalContext$before;\n (_portalContext$before = portalContext.beforeOutsideRef.current) == null || _portalContext$before.focus();\n }\n }\n }\n }), !isUntrappedTypeableCombobox && renderDismissButton('start'), children, renderDismissButton('end'), shouldRenderGuards && /*#__PURE__*/jsx(FocusGuard, {\n \"data-type\": \"inside\",\n ref: mergedAfterGuardRef,\n onFocus: event => {\n if (modal) {\n enqueueFocus(getTabbableElements()[0]);\n } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n if (closeOnFocusOut) {\n preventReturnFocusRef.current = true;\n }\n if (isOutsideEvent(event, portalContext.portalNode)) {\n const prevTabbable = getPreviousTabbable(domReference);\n prevTabbable == null || prevTabbable.focus();\n } else {\n var _portalContext$afterO;\n (_portalContext$afterO = portalContext.afterOutsideRef.current) == null || _portalContext$afterO.focus();\n }\n }\n }\n })]\n });\n}\n\nlet lockCount = 0;\nconst scrollbarProperty = '--floating-ui-scrollbar-width';\nfunction enableScrollLock() {\n const platform = getPlatform();\n const isIOS = /iP(hone|ad|od)|iOS/.test(platform) ||\n // iPads can claim to be MacIntel\n platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n const bodyStyle = document.body.style;\n // RTL <body> scrollbar\n const scrollbarX = Math.round(document.documentElement.getBoundingClientRect().left) + document.documentElement.scrollLeft;\n const paddingProp = scrollbarX ? 'paddingLeft' : 'paddingRight';\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n const scrollX = bodyStyle.left ? parseFloat(bodyStyle.left) : window.scrollX;\n const scrollY = bodyStyle.top ? parseFloat(bodyStyle.top) : window.scrollY;\n bodyStyle.overflow = 'hidden';\n bodyStyle.setProperty(scrollbarProperty, scrollbarWidth + \"px\");\n if (scrollbarWidth) {\n bodyStyle[paddingProp] = scrollbarWidth + \"px\";\n }\n\n // Only iOS doesn't respect `overflow: hidden` on document.body, and this\n // technique has fewer side effects.\n if (isIOS) {\n var _window$visualViewpor, _window$visualViewpor2;\n // iOS 12 does not support `visualViewport`.\n const offsetLeft = ((_window$visualViewpor = window.visualViewport) == null ? void 0 : _window$visualViewpor.offsetLeft) || 0;\n const offsetTop = ((_window$visualViewpor2 = window.visualViewport) == null ? void 0 : _window$visualViewpor2.offsetTop) || 0;\n Object.assign(bodyStyle, {\n position: 'fixed',\n top: -(scrollY - Math.floor(offsetTop)) + \"px\",\n left: -(scrollX - Math.floor(offsetLeft)) + \"px\",\n right: '0'\n });\n }\n return () => {\n Object.assign(bodyStyle, {\n overflow: '',\n [paddingProp]: ''\n });\n bodyStyle.removeProperty(scrollbarProperty);\n if (isIOS) {\n Object.assign(bodyStyle, {\n position: '',\n top: '',\n left: '',\n right: ''\n });\n window.scrollTo(scrollX, scrollY);\n }\n };\n}\nlet cleanup = () => {};\n\n/**\n * Provides base styling for a fixed overlay element to dim content or block\n * pointer events behind a floating element.\n * It's a regular `<div>`, so it can be styled via any CSS solution you prefer.\n * @see https://floating-ui.com/docs/FloatingOverlay\n */\nconst FloatingOverlay = /*#__PURE__*/React.forwardRef(function FloatingOverlay(props, ref) {\n const {\n lockScroll = false,\n ...rest\n } = props;\n useModernLayoutEffect(() => {\n if (!lockScroll) return;\n lockCount++;\n if (lockCount === 1) {\n cleanup = enableScrollLock();\n }\n return () => {\n lockCount--;\n if (lockCount === 0) {\n cleanup();\n }\n };\n }, [lockScroll]);\n return /*#__PURE__*/jsx(\"div\", {\n ref: ref,\n ...rest,\n style: {\n position: 'fixed',\n overflow: 'auto',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...rest.style\n }\n });\n});\n\nfunction isButtonTarget(event) {\n return isHTMLElement(event.target) && event.target.tagName === 'BUTTON';\n}\nfunction isAnchorTarget(event) {\n return isHTMLElement(event.target) && event.target.tagName === 'A';\n}\nfunction isSpaceIgnored(element) {\n return isTypeableElement(element);\n}\n/**\n * Opens or closes the floating element when clicking the reference element.\n * @see https://floating-ui.com/docs/useClick\n */\nfunction useClick(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n onOpenChange,\n dataRef,\n elements: {\n domReference\n }\n } = context;\n const {\n enabled = true,\n event: eventOption = 'click',\n toggle = true,\n ignoreMouse = false,\n keyboardHandlers = true,\n stickIfOpen = true\n } = props;\n const pointerTypeRef = React.useRef();\n const didKeyDownRef = React.useRef(false);\n const reference = React.useMemo(() => ({\n onPointerDown(event) {\n pointerTypeRef.current = event.pointerType;\n },\n onMouseDown(event) {\n const pointerType = pointerTypeRef.current;\n\n // Ignore all buttons except for the \"main\" button.\n // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n if (event.button !== 0) return;\n if (eventOption === 'click') return;\n if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n if (open && toggle && (dataRef.current.openEvent && stickIfOpen ? dataRef.current.openEvent.type === 'mousedown' : true)) {\n onOpenChange(false, event.nativeEvent, 'click');\n } else {\n // Prevent stealing focus from the floating element\n event.preventDefault();\n onOpenChange(true, event.nativeEvent, 'click');\n }\n },\n onClick(event) {\n const pointerType = pointerTypeRef.current;\n if (eventOption === 'mousedown' && pointerTypeRef.current) {\n pointerTypeRef.current = undefined;\n return;\n }\n if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n if (open && toggle && (dataRef.current.openEvent && stickIfOpen ? dataRef.current.openEvent.type === 'click' : true)) {\n onOpenChange(false, event.nativeEvent, 'click');\n } else {\n onOpenChange(true, event.nativeEvent, 'click');\n }\n },\n onKeyDown(event) {\n pointerTypeRef.current = undefined;\n if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event)) {\n return;\n }\n if (event.key === ' ' && !isSpaceIgnored(domReference)) {\n // Prevent scrolling\n event.preventDefault();\n didKeyDownRef.current = true;\n }\n if (isAnchorTarget(event)) {\n return;\n }\n if (event.key === 'Enter') {\n if (open && toggle) {\n onOpenChange(false, event.nativeEvent, 'click');\n } else {\n onOpenChange(true, event.nativeEvent, 'click');\n }\n }\n },\n onKeyUp(event) {\n if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event) || isSpaceIgnored(domReference)) {\n return;\n }\n if (event.key === ' ' && didKeyDownRef.current) {\n didKeyDownRef.current = false;\n if (open && toggle) {\n onOpenChange(false, event.nativeEvent, 'click');\n } else {\n onOpenChange(true, event.nativeEvent, 'click');\n }\n }\n }\n }), [dataRef, domReference, eventOption, ignoreMouse, keyboardHandlers, onOpenChange, open, stickIfOpen, toggle]);\n return React.useMemo(() => enabled ? {\n reference\n } : {}, [enabled, reference]);\n}\n\nfunction createVirtualElement(domElement, data) {\n let offsetX = null;\n let offsetY = null;\n let isAutoUpdateEvent = false;\n return {\n contextElement: domElement || undefined,\n getBoundingClientRect() {\n var _data$dataRef$current;\n const domRect = (domElement == null ? void 0 : domElement.getBoundingClientRect()) || {\n width: 0,\n height: 0,\n x: 0,\n y: 0\n };\n const isXAxis = data.axis === 'x' || data.axis === 'both';\n const isYAxis = data.axis === 'y' || data.axis === 'both';\n const canTrackCursorOnAutoUpdate = ['mouseenter', 'mousemove'].includes(((_data$dataRef$current = data.dataRef.current.openEvent) == null ? void 0 : _data$dataRef$current.type) || '') && data.pointerType !== 'touch';\n let width = domRect.width;\n let height = domRect.height;\n let x = domRect.x;\n let y = domRect.y;\n if (offsetX == null && data.x && isXAxis) {\n offsetX = domRect.x - data.x;\n }\n if (offsetY == null && data.y && isYAxis) {\n offsetY = domRect.y - data.y;\n }\n x -= offsetX || 0;\n y -= offsetY || 0;\n width = 0;\n height = 0;\n if (!isAutoUpdateEvent || canTrackCursorOnAutoUpdate) {\n width = data.axis === 'y' ? domRect.width : 0;\n height = data.axis === 'x' ? domRect.height : 0;\n x = isXAxis && data.x != null ? data.x : x;\n y = isYAxis && data.y != null ? data.y : y;\n } else if (isAutoUpdateEvent && !canTrackCursorOnAutoUpdate) {\n height = data.axis === 'x' ? domRect.height : height;\n width = data.axis === 'y' ? domRect.width : width;\n }\n isAutoUpdateEvent = true;\n return {\n width,\n height,\n x,\n y,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x\n };\n }\n };\n}\nfunction isMouseBasedEvent(event) {\n return event != null && event.clientX != null;\n}\n/**\n * Positions the floating element relative to a client point (in the viewport),\n * such as the mouse position. By default, it follows the mouse cursor.\n * @see https://floating-ui.com/docs/useClientPoint\n */\nfunction useClientPoint(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n dataRef,\n elements: {\n floating,\n domReference\n },\n refs\n } = context;\n const {\n enabled = true,\n axis = 'both',\n x = null,\n y = null\n } = props;\n const initialRef = React.useRef(false);\n const cleanupListenerRef = React.useRef(null);\n const [pointerType, setPointerType] = React.useState();\n const [reactive, setReactive] = React.useState([]);\n const setReference = useEffectEvent((x, y) => {\n if (initialRef.current) return;\n\n // Prevent setting if the open event was not a mouse-like one\n // (e.g. focus to open, then hover over the reference element).\n // Only apply if the event exists.\n if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) {\n return;\n }\n refs.setPositionReference(createVirtualElement(domReference, {\n x,\n y,\n axis,\n dataRef,\n pointerType\n }));\n });\n const handleReferenceEnterOrMove = useEffectEvent(event => {\n if (x != null || y != null) return;\n if (!open) {\n setReference(event.clientX, event.clientY);\n } else if (!cleanupListenerRef.current) {\n // If there's no cleanup, there's no listener, but we want to ensure\n // we add the listener if the cursor landed on the floating element and\n // then back on the reference (i.e. it's interactive).\n setReactive([]);\n }\n });\n\n // If the pointer is a mouse-like pointer, we want to continue following the\n // mouse even if the floating element is transitioning out. On touch\n // devices, this is undesirable because the floating element will move to\n // the dismissal touch point.\n const openCheck = isMouseLikePointerType(pointerType) ? floating : open;\n const addListener = React.useCallback(() => {\n // Explicitly specified `x`/`y` coordinates shouldn't add a listener.\n if (!openCheck || !enabled || x != null || y != null) return;\n const win = getWindow(floating);\n function handleMouseMove(event) {\n const target = getTarget$1(event);\n if (!contains$1(floating, target)) {\n setReference(event.clientX, event.clientY);\n } else {\n win.removeEventListener('mousemove', handleMouseMove);\n cleanupListenerRef.current = null;\n }\n }\n if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) {\n win.addEventListener('mousemove', handleMouseMove);\n const cleanup = () => {\n win.removeEventListener('mousemove', handleMouseMove);\n cleanupListenerRef.current = null;\n };\n cleanupListenerRef.current = cleanup;\n return cleanup;\n }\n refs.setPositionReference(domReference);\n }, [openCheck, enabled, x, y, floating, dataRef, refs, domReference, setReference]);\n React.useEffect(() => {\n return addListener();\n }, [addListener, reactive]);\n React.useEffect(() => {\n if (enabled && !floating) {\n initialRef.current = false;\n }\n }, [enabled, floating]);\n React.useEffect(() => {\n if (!enabled && open) {\n initialRef.current = true;\n }\n }, [enabled, open]);\n useModernLayoutEffect(() => {\n if (enabled && (x != null || y != null)) {\n initialRef.current = false;\n setReference(x, y);\n }\n }, [enabled, x, y, setReference]);\n const reference = React.useMemo(() => {\n function setPointerTypeRef(_ref) {\n let {\n pointerType\n } = _ref;\n setPointerType(pointerType);\n }\n return {\n onPointerDown: setPointerTypeRef,\n onPointerEnter: setPointerTypeRef,\n onMouseMove: handleReferenceEnterOrMove,\n onMouseEnter: handleReferenceEnterOrMove\n };\n }, [handleReferenceEnterOrMove]);\n return React.useMemo(() => enabled ? {\n reference\n } : {}, [enabled, reference]);\n}\n\nconst bubbleHandlerKeys = {\n pointerdown: 'onPointerDown',\n mousedown: 'onMouseDown',\n click: 'onClick'\n};\nconst captureHandlerKeys = {\n pointerdown: 'onPointerDownCapture',\n mousedown: 'onMouseDownCapture',\n click: 'onClickCapture'\n};\nconst normalizeProp = normalizable => {\n var _normalizable$escapeK, _normalizable$outside;\n return {\n escapeKey: typeof normalizable === 'boolean' ? normalizable : (_normalizable$escapeK = normalizable == null ? void 0 : normalizable.escapeKey) != null ? _normalizable$escapeK : false,\n outsidePress: typeof normalizable === 'boolean' ? normalizable : (_normalizable$outside = normalizable == null ? void 0 : normalizable.outsidePress) != null ? _normalizable$outside : true\n };\n};\n/**\n * Closes the floating element when a dismissal is requested — by default, when\n * the user presses the `escape` key or outside of the floating element.\n * @see https://floating-ui.com/docs/useDismiss\n */\nfunction useDismiss(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n onOpenChange,\n elements,\n dataRef\n } = context;\n const {\n enabled = true,\n escapeKey = true,\n outsidePress: unstable_outsidePress = true,\n outsidePressEvent = 'pointerdown',\n referencePress = false,\n referencePressEvent = 'pointerdown',\n ancestorScroll = false,\n bubbles,\n capture\n } = props;\n const tree = useFloatingTree();\n const outsidePressFn = useEffectEvent(typeof unstable_outsidePress === 'function' ? unstable_outsidePress : () => false);\n const outsidePress = typeof unstable_outsidePress === 'function' ? outsidePressFn : unstable_outsidePress;\n const endedOrStartedInsideRef = React.useRef(false);\n const {\n escapeKey: escapeKeyBubbles,\n outsidePress: outsidePressBubbles\n } = normalizeProp(bubbles);\n const {\n escapeKey: escapeKeyCapture,\n outsidePress: outsidePressCapture\n } = normalizeProp(capture);\n const isComposingRef = React.useRef(false);\n const closeOnEscapeKeyDown = useEffectEvent(event => {\n var _dataRef$current$floa;\n if (!open || !enabled || !escapeKey || event.key !== 'Escape') {\n return;\n }\n\n // Wait until IME is settled. Pressing `Escape` while composing should\n // close the compose menu, but not the floating element.\n if (isComposingRef.current) {\n return;\n }\n const nodeId = (_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.nodeId;\n const children = tree ? getNodeChildren$1(tree.nodesRef.current, nodeId) : [];\n if (!escapeKeyBubbles) {\n event.stopPropagation();\n if (children.length > 0) {\n let shouldDismiss = true;\n children.forEach(child => {\n var _child$context;\n if ((_child$context = child.context) != null && _child$context.open && !child.context.dataRef.current.__escapeKeyBubbles) {\n shouldDismiss = false;\n return;\n }\n });\n if (!shouldDismiss) {\n return;\n }\n }\n }\n onOpenChange(false, isReactEvent(event) ? event.nativeEvent : event, 'escape-key');\n });\n const closeOnEscapeKeyDownCapture = useEffectEvent(event => {\n var _getTarget2;\n const callback = () => {\n var _getTarget;\n closeOnEscapeKeyDown(event);\n (_getTarget = getTarget$1(event)) == null || _getTarget.removeEventListener('keydown', callback);\n };\n (_getTarget2 = getTarget$1(event)) == null || _getTarget2.addEventListener('keydown', callback);\n });\n const closeOnPressOutside = useEffectEvent(event => {\n var _dataRef$current$floa2;\n // Given developers can stop the propagation of the synthetic event,\n // we can only be confident with a positive value.\n const insideReactTree = dataRef.current.insideReactTree;\n dataRef.current.insideReactTree = false;\n\n // When click outside is lazy (`click` event), handle dragging.\n // Don't close if:\n // - The click started inside the floating element.\n // - The click ended inside the floating element.\n const endedOrStartedInside = endedOrStartedInsideRef.current;\n endedOrStartedInsideRef.current = false;\n if (outsidePressEvent === 'click' && endedOrStartedInside) {\n return;\n }\n if (insideReactTree) {\n return;\n }\n if (typeof outsidePress === 'function' && !outsidePress(event)) {\n return;\n }\n const target = getTarget$1(event);\n const inertSelector = \"[\" + createAttribute('inert') + \"]\";\n const markers = getDocument$1(elements.floating).querySelectorAll(inertSelector);\n let targetRootAncestor = isElement(target) ? target : null;\n while (targetRootAncestor && !isLastTraversableNode(targetRootAncestor)) {\n const nextParent = getParentNode(targetRootAncestor);\n if (isLastTraversableNode(nextParent) || !isElement(nextParent)) {\n break;\n }\n targetRootAncestor = nextParent;\n }\n\n // Check if the click occurred on a third-party element injected after the\n // floating element rendered.\n if (markers.length && isElement(target) && !isRootElement(target) &&\n // Clicked on a direct ancestor (e.g. FloatingOverlay).\n !contains$1(target, elements.floating) &&\n // If the target root element contains none of the markers, then the\n // element was injected after the floating element rendered.\n Array.from(markers).every(marker => !contains$1(targetRootAncestor, marker))) {\n return;\n }\n\n // Check if the click occurred on the scrollbar\n if (isHTMLElement(target) && floating) {\n const lastTraversableNode = isLastTraversableNode(target);\n const style = getComputedStyle(target);\n const scrollRe = /auto|scroll/;\n const isScrollableX = lastTraversableNode || scrollRe.test(style.overflowX);\n const isScrollableY = lastTraversableNode || scrollRe.test(style.overflowY);\n const canScrollX = isScrollableX && target.clientWidth > 0 && target.scrollWidth > target.clientWidth;\n const canScrollY = isScrollableY && target.clientHeight > 0 && target.scrollHeight > target.clientHeight;\n const isRTL = style.direction === 'rtl';\n\n // Check click position relative to scrollbar.\n // In some browsers it is possible to change the <body> (or window)\n // scrollbar to the left side, but is very rare and is difficult to\n // check for. Plus, for modal dialogs with backdrops, it is more\n // important that the backdrop is checked but not so much the window.\n const pressedVerticalScrollbar = canScrollY && (isRTL ? event.offsetX <= target.offsetWidth - target.clientWidth : event.offsetX > target.clientWidth);\n const pressedHorizontalScrollbar = canScrollX && event.offsetY > target.clientHeight;\n if (pressedVerticalScrollbar || pressedHorizontalScrollbar) {\n return;\n }\n }\n const nodeId = (_dataRef$current$floa2 = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa2.nodeId;\n const targetIsInsideChildren = tree && getNodeChildren$1(tree.nodesRef.current, nodeId).some(node => {\n var _node$context;\n return isEventTargetWithin(event, (_node$context = node.context) == null ? void 0 : _node$context.elements.floating);\n });\n if (isEventTargetWithin(event, elements.floating) || isEventTargetWithin(event, elements.domReference) || targetIsInsideChildren) {\n return;\n }\n const children = tree ? getNodeChildren$1(tree.nodesRef.current, nodeId) : [];\n if (children.length > 0) {\n let shouldDismiss = true;\n children.forEach(child => {\n var _child$context2;\n if ((_child$context2 = child.context) != null && _child$context2.open && !child.context.dataRef.current.__outsidePressBubbles) {\n shouldDismiss = false;\n return;\n }\n });\n if (!shouldDismiss) {\n return;\n }\n }\n onOpenChange(false, event, 'outside-press');\n });\n const closeOnPressOutsideCapture = useEffectEvent(event => {\n var _getTarget4;\n const callback = () => {\n var _getTarget3;\n closeOnPressOutside(event);\n (_getTarget3 = getTarget$1(event)) == null || _getTarget3.removeEventListener(outsidePressEvent, callback);\n };\n (_getTarget4 = getTarget$1(event)) == null || _getTarget4.addEventListener(outsidePressEvent, callback);\n });\n React.useEffect(() => {\n if (!open || !enabled) {\n return;\n }\n dataRef.current.__escapeKeyBubbles = escapeKeyBubbles;\n dataRef.current.__outsidePressBubbles = outsidePressBubbles;\n let compositionTimeout = -1;\n function onScroll(event) {\n onOpenChange(false, event, 'ancestor-scroll');\n }\n function handleCompositionStart() {\n window.clearTimeout(compositionTimeout);\n isComposingRef.current = true;\n }\n function handleCompositionEnd() {\n // Safari fires `compositionend` before `keydown`, so we need to wait\n // until the next tick to set `isComposing` to `false`.\n // https://bugs.webkit.org/show_bug.cgi?id=165004\n compositionTimeout = window.setTimeout(() => {\n isComposingRef.current = false;\n },\n // 0ms or 1ms don't work in Safari. 5ms appears to consistently work.\n // Only apply to WebKit for the test to remain 0ms.\n isWebKit() ? 5 : 0);\n }\n const doc = getDocument$1(elements.floating);\n if (escapeKey) {\n doc.addEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n doc.addEventListener('compositionstart', handleCompositionStart);\n doc.addEventListener('compositionend', handleCompositionEnd);\n }\n outsidePress && doc.addEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n let ancestors = [];\n if (ancestorScroll) {\n if (isElement(elements.domReference)) {\n ancestors = getOverflowAncestors(elements.domReference);\n }\n if (isElement(elements.floating)) {\n ancestors = ancestors.concat(getOverflowAncestors(elements.floating));\n }\n if (!isElement(elements.reference) && elements.reference && elements.reference.contextElement) {\n ancestors = ancestors.concat(getOverflowAncestors(elements.reference.contextElement));\n }\n }\n\n // Ignore the visual viewport for scrolling dismissal (allow pinch-zoom)\n ancestors = ancestors.filter(ancestor => {\n var _doc$defaultView;\n return ancestor !== ((_doc$defaultView = doc.defaultView) == null ? void 0 : _doc$defaultView.visualViewport);\n });\n ancestors.forEach(ancestor => {\n ancestor.addEventListener('scroll', onScroll, {\n passive: true\n });\n });\n return () => {\n if (escapeKey) {\n doc.removeEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n doc.removeEventListener('compositionstart', handleCompositionStart);\n doc.removeEventListener('compositionend', handleCompositionEnd);\n }\n outsidePress && doc.removeEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n ancestors.forEach(ancestor => {\n ancestor.removeEventListener('scroll', onScroll);\n });\n window.clearTimeout(compositionTimeout);\n };\n }, [dataRef, elements, escapeKey, outsidePress, outsidePressEvent, open, onOpenChange, ancestorScroll, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, escapeKeyCapture, closeOnEscapeKeyDownCapture, closeOnPressOutside, outsidePressCapture, closeOnPressOutsideCapture]);\n React.useEffect(() => {\n dataRef.current.insideReactTree = false;\n }, [dataRef, outsidePress, outsidePressEvent]);\n const reference = React.useMemo(() => ({\n onKeyDown: closeOnEscapeKeyDown,\n ...(referencePress && {\n [bubbleHandlerKeys[referencePressEvent]]: event => {\n onOpenChange(false, event.nativeEvent, 'reference-press');\n },\n ...(referencePressEvent !== 'click' && {\n onClick(event) {\n onOpenChange(false, event.nativeEvent, 'reference-press');\n }\n })\n })\n }), [closeOnEscapeKeyDown, onOpenChange, referencePress, referencePressEvent]);\n const floating = React.useMemo(() => ({\n onKeyDown: closeOnEscapeKeyDown,\n onMouseDown() {\n endedOrStartedInsideRef.current = true;\n },\n onMouseUp() {\n endedOrStartedInsideRef.current = true;\n },\n [captureHandlerKeys[outsidePressEvent]]: () => {\n dataRef.current.insideReactTree = true;\n }\n }), [closeOnEscapeKeyDown, outsidePressEvent, dataRef]);\n return React.useMemo(() => enabled ? {\n reference,\n floating\n } : {}, [enabled, reference, floating]);\n}\n\nfunction useFloatingRootContext(options) {\n const {\n open = false,\n onOpenChange: onOpenChangeProp,\n elements: elementsProp\n } = options;\n const floatingId = useId();\n const dataRef = React.useRef({});\n const [events] = React.useState(() => createEventEmitter());\n const nested = useFloatingParentNodeId() != null;\n if (process.env.NODE_ENV !== \"production\") {\n const optionDomReference = elementsProp.reference;\n if (optionDomReference && !isElement(optionDomReference)) {\n error('Cannot pass a virtual element to the `elements.reference` option,', 'as it must be a real DOM element. Use `refs.setPositionReference()`', 'instead.');\n }\n }\n const [positionReference, setPositionReference] = React.useState(elementsProp.reference);\n const onOpenChange = useEffectEvent((open, event, reason) => {\n dataRef.current.openEvent = open ? event : undefined;\n events.emit('openchange', {\n open,\n event,\n reason,\n nested\n });\n onOpenChangeProp == null || onOpenChangeProp(open, event, reason);\n });\n const refs = React.useMemo(() => ({\n setPositionReference\n }), []);\n const elements = React.useMemo(() => ({\n reference: positionReference || elementsProp.reference || null,\n floating: elementsProp.floating || null,\n domReference: elementsProp.reference\n }), [positionReference, elementsProp.reference, elementsProp.floating]);\n return React.useMemo(() => ({\n dataRef,\n open,\n onOpenChange,\n elements,\n events,\n floatingId,\n refs\n }), [open, onOpenChange, elements, events, floatingId, refs]);\n}\n\n/**\n * Provides data to position a floating element and context to add interactions.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n if (options === void 0) {\n options = {};\n }\n const {\n nodeId\n } = options;\n const internalRootContext = useFloatingRootContext({\n ...options,\n elements: {\n reference: null,\n floating: null,\n ...options.elements\n }\n });\n const rootContext = options.rootContext || internalRootContext;\n const computedElements = rootContext.elements;\n const [_domReference, setDomReference] = React.useState(null);\n const [positionReference, _setPositionReference] = React.useState(null);\n const optionDomReference = computedElements == null ? void 0 : computedElements.domReference;\n const domReference = optionDomReference || _domReference;\n const domReferenceRef = React.useRef(null);\n const tree = useFloatingTree();\n useModernLayoutEffect(() => {\n if (domReference) {\n domReferenceRef.current = domReference;\n }\n }, [domReference]);\n const position = useFloating$1({\n ...options,\n elements: {\n ...computedElements,\n ...(positionReference && {\n reference: positionReference\n })\n }\n });\n const setPositionReference = React.useCallback(node => {\n const computedPositionReference = isElement(node) ? {\n getBoundingClientRect: () => node.getBoundingClientRect(),\n getClientRects: () => node.getClientRects(),\n contextElement: node\n } : node;\n // Store the positionReference in state if the DOM reference is specified externally via the\n // `elements.reference` option. This ensures that it won't be overridden on future renders.\n _setPositionReference(computedPositionReference);\n position.refs.setReference(computedPositionReference);\n }, [position.refs]);\n const setReference = React.useCallback(node => {\n if (isElement(node) || node === null) {\n domReferenceRef.current = node;\n setDomReference(node);\n }\n\n // Backwards-compatibility for passing a virtual element to `reference`\n // after it has set the DOM reference.\n if (isElement(position.refs.reference.current) || position.refs.reference.current === null ||\n // Don't allow setting virtual elements using the old technique back to\n // `null` to support `positionReference` + an unstable `reference`\n // callback ref.\n node !== null && !isElement(node)) {\n position.refs.setReference(node);\n }\n }, [position.refs]);\n const refs = React.useMemo(() => ({\n ...position.refs,\n setReference,\n setPositionReference,\n domReference: domReferenceRef\n }), [position.refs, setReference, setPositionReference]);\n const elements = React.useMemo(() => ({\n ...position.elements,\n domReference: domReference\n }), [position.elements, domReference]);\n const context = React.useMemo(() => ({\n ...position,\n ...rootContext,\n refs,\n elements,\n nodeId\n }), [position, refs, elements, nodeId, rootContext]);\n useModernLayoutEffect(() => {\n rootContext.dataRef.current.floatingContext = context;\n const node = tree == null ? void 0 : tree.nodesRef.current.find(node => node.id === nodeId);\n if (node) {\n node.context = context;\n }\n });\n return React.useMemo(() => ({\n ...position,\n context,\n refs,\n elements\n }), [position, refs, elements, context]);\n}\n\nfunction isMacSafari() {\n return isMac() && isSafari();\n}\n/**\n * Opens the floating element while the reference element has focus, like CSS\n * `:focus`.\n * @see https://floating-ui.com/docs/useFocus\n */\nfunction useFocus(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n onOpenChange,\n events,\n dataRef,\n elements\n } = context;\n const {\n enabled = true,\n visibleOnly = true\n } = props;\n const blockFocusRef = React.useRef(false);\n const timeoutRef = React.useRef(-1);\n const keyboardModalityRef = React.useRef(true);\n React.useEffect(() => {\n if (!enabled) return;\n const win = getWindow(elements.domReference);\n\n // If the reference was focused and the user left the tab/window, and the\n // floating element was not open, the focus should be blocked when they\n // return to the tab/window.\n function onBlur() {\n if (!open && isHTMLElement(elements.domReference) && elements.domReference === activeElement(getDocument$1(elements.domReference))) {\n blockFocusRef.current = true;\n }\n }\n function onKeyDown() {\n keyboardModalityRef.current = true;\n }\n function onPointerDown() {\n keyboardModalityRef.current = false;\n }\n win.addEventListener('blur', onBlur);\n if (isMacSafari()) {\n win.addEventListener('keydown', onKeyDown, true);\n win.addEventListener('pointerdown', onPointerDown, true);\n }\n return () => {\n win.removeEventListener('blur', onBlur);\n if (isMacSafari()) {\n win.removeEventListener('keydown', onKeyDown, true);\n win.removeEventListener('pointerdown', onPointerDown, true);\n }\n };\n }, [elements.domReference, open, enabled]);\n React.useEffect(() => {\n if (!enabled) return;\n function onOpenChange(_ref) {\n let {\n reason\n } = _ref;\n if (reason === 'reference-press' || reason === 'escape-key') {\n blockFocusRef.current = true;\n }\n }\n events.on('openchange', onOpenChange);\n return () => {\n events.off('openchange', onOpenChange);\n };\n }, [events, enabled]);\n React.useEffect(() => {\n return () => {\n clearTimeoutIfSet(timeoutRef);\n };\n }, []);\n const reference = React.useMemo(() => ({\n onMouseLeave() {\n blockFocusRef.current = false;\n },\n onFocus(event) {\n if (blockFocusRef.current) return;\n const target = getTarget$1(event.nativeEvent);\n if (visibleOnly && isElement(target)) {\n // Safari fails to match `:focus-visible` if focus was initially\n // outside the document.\n if (isMacSafari() && !event.relatedTarget) {\n if (!keyboardModalityRef.current && !isTypeableElement(target)) {\n return;\n }\n } else if (!matchesFocusVisible(target)) {\n return;\n }\n }\n onOpenChange(true, event.nativeEvent, 'focus');\n },\n onBlur(event) {\n blockFocusRef.current = false;\n const relatedTarget = event.relatedTarget;\n const nativeEvent = event.nativeEvent;\n\n // Hit the non-modal focus management portal guard. Focus will be\n // moved into the floating element immediately after.\n const movedToFocusGuard = isElement(relatedTarget) && relatedTarget.hasAttribute(createAttribute('focus-guard')) && relatedTarget.getAttribute('data-type') === 'outside';\n\n // Wait for the window blur listener to fire.\n timeoutRef.current = window.setTimeout(() => {\n var _dataRef$current$floa;\n const activeEl = activeElement(elements.domReference ? elements.domReference.ownerDocument : document);\n\n // Focus left the page, keep it open.\n if (!relatedTarget && activeEl === elements.domReference) return;\n\n // When focusing the reference element (e.g. regular click), then\n // clicking into the floating element, prevent it from hiding.\n // Note: it must be focusable, e.g. `tabindex=\"-1\"`.\n // We can not rely on relatedTarget to point to the correct element\n // as it will only point to the shadow host of the newly focused element\n // and not the element that actually has received focus if it is located\n // inside a shadow root.\n if (contains$1((_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.refs.floating.current, activeEl) || contains$1(elements.domReference, activeEl) || movedToFocusGuard) {\n return;\n }\n onOpenChange(false, nativeEvent, 'focus');\n });\n }\n }), [dataRef, elements.domReference, onOpenChange, visibleOnly]);\n return React.useMemo(() => enabled ? {\n reference\n } : {}, [enabled, reference]);\n}\n\nfunction mergeProps(userProps, propsList, elementKey) {\n const map = new Map();\n const isItem = elementKey === 'item';\n let domUserProps = userProps;\n if (isItem && userProps) {\n const {\n [ACTIVE_KEY]: _,\n [SELECTED_KEY]: __,\n ...validProps\n } = userProps;\n domUserProps = validProps;\n }\n return {\n ...(elementKey === 'floating' && {\n tabIndex: -1,\n [FOCUSABLE_ATTRIBUTE]: ''\n }),\n ...domUserProps,\n ...propsList.map(value => {\n const propsOrGetProps = value ? value[elementKey] : null;\n if (typeof propsOrGetProps === 'function') {\n return userProps ? propsOrGetProps(userProps) : null;\n }\n return propsOrGetProps;\n }).concat(userProps).reduce((acc, props) => {\n if (!props) {\n return acc;\n }\n Object.entries(props).forEach(_ref => {\n let [key, value] = _ref;\n if (isItem && [ACTIVE_KEY, SELECTED_KEY].includes(key)) {\n return;\n }\n if (key.indexOf('on') === 0) {\n if (!map.has(key)) {\n map.set(key, []);\n }\n if (typeof value === 'function') {\n var _map$get;\n (_map$get = map.get(key)) == null || _map$get.push(value);\n acc[key] = function () {\n var _map$get2;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return (_map$get2 = map.get(key)) == null ? void 0 : _map$get2.map(fn => fn(...args)).find(val => val !== undefined);\n };\n }\n } else {\n acc[key] = value;\n }\n });\n return acc;\n }, {})\n };\n}\n/**\n * Merges an array of interaction hooks' props into prop getters, allowing\n * event handler functions to be composed together without overwriting one\n * another.\n * @see https://floating-ui.com/docs/useInteractions\n */\nfunction useInteractions(propsList) {\n if (propsList === void 0) {\n propsList = [];\n }\n const referenceDeps = propsList.map(key => key == null ? void 0 : key.reference);\n const floatingDeps = propsList.map(key => key == null ? void 0 : key.floating);\n const itemDeps = propsList.map(key => key == null ? void 0 : key.item);\n const getReferenceProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'reference'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n referenceDeps);\n const getFloatingProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'floating'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n floatingDeps);\n const getItemProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'item'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n itemDeps);\n return React.useMemo(() => ({\n getReferenceProps,\n getFloatingProps,\n getItemProps\n }), [getReferenceProps, getFloatingProps, getItemProps]);\n}\n\nconst ESCAPE = 'Escape';\nfunction doSwitch(orientation, vertical, horizontal) {\n switch (orientation) {\n case 'vertical':\n return vertical;\n case 'horizontal':\n return horizontal;\n default:\n return vertical || horizontal;\n }\n}\nfunction isMainOrientationKey(key, orientation) {\n const vertical = key === ARROW_UP || key === ARROW_DOWN;\n const horizontal = key === ARROW_LEFT || key === ARROW_RIGHT;\n return doSwitch(orientation, vertical, horizontal);\n}\nfunction isMainOrientationToEndKey(key, orientation, rtl) {\n const vertical = key === ARROW_DOWN;\n const horizontal = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n return doSwitch(orientation, vertical, horizontal) || key === 'Enter' || key === ' ' || key === '';\n}\nfunction isCrossOrientationOpenKey(key, orientation, rtl) {\n const vertical = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n const horizontal = key === ARROW_DOWN;\n return doSwitch(orientation, vertical, horizontal);\n}\nfunction isCrossOrientationCloseKey(key, orientation, rtl, cols) {\n const vertical = rtl ? key === ARROW_RIGHT : key === ARROW_LEFT;\n const horizontal = key === ARROW_UP;\n if (orientation === 'both' || orientation === 'horizontal' && cols && cols > 1) {\n return key === ESCAPE;\n }\n return doSwitch(orientation, vertical, horizontal);\n}\n/**\n * Adds arrow key-based navigation of a list of items, either using real DOM\n * focus or virtual focus.\n * @see https://floating-ui.com/docs/useListNavigation\n */\nfunction useListNavigation(context, props) {\n const {\n open,\n onOpenChange,\n elements,\n floatingId\n } = context;\n const {\n listRef,\n activeIndex,\n onNavigate: unstable_onNavigate = () => {},\n enabled = true,\n selectedIndex = null,\n allowEscape = false,\n loop = false,\n nested = false,\n rtl = false,\n virtual = false,\n focusItemOnOpen = 'auto',\n focusItemOnHover = true,\n openOnArrowKeyDown = true,\n disabledIndices = undefined,\n orientation = 'vertical',\n parentOrientation,\n cols = 1,\n scrollItemIntoView = true,\n virtualItemRef,\n itemSizes,\n dense = false\n } = props;\n if (process.env.NODE_ENV !== \"production\") {\n if (allowEscape) {\n if (!loop) {\n warn('`useListNavigation` looping must be enabled to allow escaping.');\n }\n if (!virtual) {\n warn('`useListNavigation` must be virtual to allow escaping.');\n }\n }\n if (orientation === 'vertical' && cols > 1) {\n warn('In grid list navigation mode (`cols` > 1), the `orientation` should', 'be either \"horizontal\" or \"both\".');\n }\n }\n const floatingFocusElement = getFloatingFocusElement(elements.floating);\n const floatingFocusElementRef = useLatestRef(floatingFocusElement);\n const parentId = useFloatingParentNodeId();\n const tree = useFloatingTree();\n useModernLayoutEffect(() => {\n context.dataRef.current.orientation = orientation;\n }, [context, orientation]);\n const onNavigate = useEffectEvent(() => {\n unstable_onNavigate(indexRef.current === -1 ? null : indexRef.current);\n });\n const typeableComboboxReference = isTypeableCombobox(elements.domReference);\n const focusItemOnOpenRef = React.useRef(focusItemOnOpen);\n const indexRef = React.useRef(selectedIndex != null ? selectedIndex : -1);\n const keyRef = React.useRef(null);\n const isPointerModalityRef = React.useRef(true);\n const previousOnNavigateRef = React.useRef(onNavigate);\n const previousMountedRef = React.useRef(!!elements.floating);\n const previousOpenRef = React.useRef(open);\n const forceSyncFocusRef = React.useRef(false);\n const forceScrollIntoViewRef = React.useRef(false);\n const disabledIndicesRef = useLatestRef(disabledIndices);\n const latestOpenRef = useLatestRef(open);\n const scrollItemIntoViewRef = useLatestRef(scrollItemIntoView);\n const selectedIndexRef = useLatestRef(selectedIndex);\n const [activeId, setActiveId] = React.useState();\n const [virtualId, setVirtualId] = React.useState();\n const focusItem = useEffectEvent(() => {\n function runFocus(item) {\n if (virtual) {\n var _item$id;\n if ((_item$id = item.id) != null && _item$id.endsWith('-fui-option')) {\n item.id = floatingId + \"-\" + Math.random().toString(16).slice(2, 10);\n }\n setActiveId(item.id);\n tree == null || tree.events.emit('virtualfocus', item);\n if (virtualItemRef) {\n virtualItemRef.current = item;\n }\n } else {\n enqueueFocus(item, {\n sync: forceSyncFocusRef.current,\n preventScroll: true\n });\n }\n }\n const initialItem = listRef.current[indexRef.current];\n const forceScrollIntoView = forceScrollIntoViewRef.current;\n if (initialItem) {\n runFocus(initialItem);\n }\n const scheduler = forceSyncFocusRef.current ? v => v() : requestAnimationFrame;\n scheduler(() => {\n const waitedItem = listRef.current[indexRef.current] || initialItem;\n if (!waitedItem) return;\n if (!initialItem) {\n runFocus(waitedItem);\n }\n const scrollIntoViewOptions = scrollItemIntoViewRef.current;\n const shouldScrollIntoView = scrollIntoViewOptions && item && (forceScrollIntoView || !isPointerModalityRef.current);\n if (shouldScrollIntoView) {\n // JSDOM doesn't support `.scrollIntoView()` but it's widely supported\n // by all browsers.\n waitedItem.scrollIntoView == null || waitedItem.scrollIntoView(typeof scrollIntoViewOptions === 'boolean' ? {\n block: 'nearest',\n inline: 'nearest'\n } : scrollIntoViewOptions);\n }\n });\n });\n\n // Sync `selectedIndex` to be the `activeIndex` upon opening the floating\n // element. Also, reset `activeIndex` upon closing the floating element.\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (open && elements.floating) {\n if (focusItemOnOpenRef.current && selectedIndex != null) {\n // Regardless of the pointer modality, we want to ensure the selected\n // item comes into view when the floating element is opened.\n forceScrollIntoViewRef.current = true;\n indexRef.current = selectedIndex;\n onNavigate();\n }\n } else if (previousMountedRef.current) {\n // Since the user can specify `onNavigate` conditionally\n // (onNavigate: open ? setActiveIndex : setSelectedIndex),\n // we store and call the previous function.\n indexRef.current = -1;\n previousOnNavigateRef.current();\n }\n }, [enabled, open, elements.floating, selectedIndex, onNavigate]);\n\n // Sync `activeIndex` to be the focused item while the floating element is\n // open.\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (!open) return;\n if (!elements.floating) return;\n if (activeIndex == null) {\n forceSyncFocusRef.current = false;\n if (selectedIndexRef.current != null) {\n return;\n }\n\n // Reset while the floating element was open (e.g. the list changed).\n if (previousMountedRef.current) {\n indexRef.current = -1;\n focusItem();\n }\n\n // Initial sync.\n if ((!previousOpenRef.current || !previousMountedRef.current) && focusItemOnOpenRef.current && (keyRef.current != null || focusItemOnOpenRef.current === true && keyRef.current == null)) {\n let runs = 0;\n const waitForListPopulated = () => {\n if (listRef.current[0] == null) {\n // Avoid letting the browser paint if possible on the first try,\n // otherwise use rAF. Don't try more than twice, since something\n // is wrong otherwise.\n if (runs < 2) {\n const scheduler = runs ? requestAnimationFrame : queueMicrotask;\n scheduler(waitForListPopulated);\n }\n runs++;\n } else {\n indexRef.current = keyRef.current == null || isMainOrientationToEndKey(keyRef.current, orientation, rtl) || nested ? getMinListIndex(listRef, disabledIndicesRef.current) : getMaxListIndex(listRef, disabledIndicesRef.current);\n keyRef.current = null;\n onNavigate();\n }\n };\n waitForListPopulated();\n }\n } else if (!isIndexOutOfListBounds(listRef, activeIndex)) {\n indexRef.current = activeIndex;\n focusItem();\n forceScrollIntoViewRef.current = false;\n }\n }, [enabled, open, elements.floating, activeIndex, selectedIndexRef, nested, listRef, orientation, rtl, onNavigate, focusItem, disabledIndicesRef]);\n\n // Ensure the parent floating element has focus when a nested child closes\n // to allow arrow key navigation to work after the pointer leaves the child.\n useModernLayoutEffect(() => {\n var _nodes$find;\n if (!enabled || elements.floating || !tree || virtual || !previousMountedRef.current) {\n return;\n }\n const nodes = tree.nodesRef.current;\n const parent = (_nodes$find = nodes.find(node => node.id === parentId)) == null || (_nodes$find = _nodes$find.context) == null ? void 0 : _nodes$find.elements.floating;\n const activeEl = activeElement(getDocument$1(elements.floating));\n const treeContainsActiveEl = nodes.some(node => node.context && contains$1(node.context.elements.floating, activeEl));\n if (parent && !treeContainsActiveEl && isPointerModalityRef.current) {\n parent.focus({\n preventScroll: true\n });\n }\n }, [enabled, elements.floating, tree, parentId, virtual]);\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (!tree) return;\n if (!virtual) return;\n if (parentId) return;\n function handleVirtualFocus(item) {\n setVirtualId(item.id);\n if (virtualItemRef) {\n virtualItemRef.current = item;\n }\n }\n tree.events.on('virtualfocus', handleVirtualFocus);\n return () => {\n tree.events.off('virtualfocus', handleVirtualFocus);\n };\n }, [enabled, tree, virtual, parentId, virtualItemRef]);\n useModernLayoutEffect(() => {\n previousOnNavigateRef.current = onNavigate;\n previousOpenRef.current = open;\n previousMountedRef.current = !!elements.floating;\n });\n useModernLayoutEffect(() => {\n if (!open) {\n keyRef.current = null;\n focusItemOnOpenRef.current = focusItemOnOpen;\n }\n }, [open, focusItemOnOpen]);\n const hasActiveIndex = activeIndex != null;\n const item = React.useMemo(() => {\n function syncCurrentTarget(currentTarget) {\n if (!latestOpenRef.current) return;\n const index = listRef.current.indexOf(currentTarget);\n if (index !== -1 && indexRef.current !== index) {\n indexRef.current = index;\n onNavigate();\n }\n }\n const props = {\n onFocus(_ref) {\n let {\n currentTarget\n } = _ref;\n forceSyncFocusRef.current = true;\n syncCurrentTarget(currentTarget);\n },\n onClick: _ref2 => {\n let {\n currentTarget\n } = _ref2;\n return currentTarget.focus({\n preventScroll: true\n });\n },\n // Safari\n onMouseMove(_ref3) {\n let {\n currentTarget\n } = _ref3;\n forceSyncFocusRef.current = true;\n forceScrollIntoViewRef.current = false;\n if (focusItemOnHover) {\n syncCurrentTarget(currentTarget);\n }\n },\n onPointerLeave(_ref4) {\n let {\n pointerType\n } = _ref4;\n if (!isPointerModalityRef.current || pointerType === 'touch') {\n return;\n }\n forceSyncFocusRef.current = true;\n if (!focusItemOnHover) {\n return;\n }\n indexRef.current = -1;\n onNavigate();\n if (!virtual) {\n var _floatingFocusElement;\n (_floatingFocusElement = floatingFocusElementRef.current) == null || _floatingFocusElement.focus({\n preventScroll: true\n });\n }\n }\n };\n return props;\n }, [latestOpenRef, floatingFocusElementRef, focusItemOnHover, listRef, onNavigate, virtual]);\n const getParentOrientation = React.useCallback(() => {\n var _tree$nodesRef$curren;\n return parentOrientation != null ? parentOrientation : tree == null || (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.context) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.dataRef) == null ? void 0 : _tree$nodesRef$curren.current.orientation;\n }, [parentId, tree, parentOrientation]);\n const commonOnKeyDown = useEffectEvent(event => {\n isPointerModalityRef.current = false;\n forceSyncFocusRef.current = true;\n\n // When composing a character, Chrome fires ArrowDown twice. Firefox/Safari\n // don't appear to suffer from this. `event.isComposing` is avoided due to\n // Safari not supporting it properly (although it's not needed in the first\n // place for Safari, just avoiding any possible issues).\n if (event.which === 229) {\n return;\n }\n\n // If the floating element is animating out, ignore navigation. Otherwise,\n // the `activeIndex` gets set to 0 despite not being open so the next time\n // the user ArrowDowns, the first item won't be focused.\n if (!latestOpenRef.current && event.currentTarget === floatingFocusElementRef.current) {\n return;\n }\n if (nested && isCrossOrientationCloseKey(event.key, orientation, rtl, cols)) {\n // If the nested list's close key is also the parent navigation key,\n // let the parent navigate. Otherwise, stop propagating the event.\n if (!isMainOrientationKey(event.key, getParentOrientation())) {\n stopEvent(event);\n }\n onOpenChange(false, event.nativeEvent, 'list-navigation');\n if (isHTMLElement(elements.domReference)) {\n if (virtual) {\n tree == null || tree.events.emit('virtualfocus', elements.domReference);\n } else {\n elements.domReference.focus();\n }\n }\n return;\n }\n const currentIndex = indexRef.current;\n const minIndex = getMinListIndex(listRef, disabledIndices);\n const maxIndex = getMaxListIndex(listRef, disabledIndices);\n if (!typeableComboboxReference) {\n if (event.key === 'Home') {\n stopEvent(event);\n indexRef.current = minIndex;\n onNavigate();\n }\n if (event.key === 'End') {\n stopEvent(event);\n indexRef.current = maxIndex;\n onNavigate();\n }\n }\n\n // Grid navigation.\n if (cols > 1) {\n const sizes = itemSizes || Array.from({\n length: listRef.current.length\n }, () => ({\n width: 1,\n height: 1\n }));\n // To calculate movements on the grid, we use hypothetical cell indices\n // as if every item was 1x1, then convert back to real indices.\n const cellMap = createGridCellMap(sizes, cols, dense);\n const minGridIndex = cellMap.findIndex(index => index != null && !isListIndexDisabled(listRef, index, disabledIndices));\n // last enabled index\n const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isListIndexDisabled(listRef, index, disabledIndices) ? cellIndex : foundIndex, -1);\n const index = cellMap[getGridNavigatedIndex({\n current: cellMap.map(itemIndex => itemIndex != null ? listRef.current[itemIndex] : null)\n }, {\n event,\n orientation,\n loop,\n rtl,\n cols,\n // treat undefined (empty grid spaces) as disabled indices so we\n // don't end up in them\n disabledIndices: getGridCellIndices([...((typeof disabledIndices !== 'function' ? disabledIndices : null) || listRef.current.map((_, index) => isListIndexDisabled(listRef, index, disabledIndices) ? index : undefined)), undefined], cellMap),\n minIndex: minGridIndex,\n maxIndex: maxGridIndex,\n prevIndex: getGridCellIndexOfCorner(indexRef.current > maxIndex ? minIndex : indexRef.current, sizes, cellMap, cols,\n // use a corner matching the edge closest to the direction\n // we're moving in so we don't end up in the same item. Prefer\n // top/left over bottom/right.\n event.key === ARROW_DOWN ? 'bl' : event.key === (rtl ? ARROW_LEFT : ARROW_RIGHT) ? 'tr' : 'tl'),\n stopEvent: true\n })];\n if (index != null) {\n indexRef.current = index;\n onNavigate();\n }\n if (orientation === 'both') {\n return;\n }\n }\n if (isMainOrientationKey(event.key, orientation)) {\n stopEvent(event);\n\n // Reset the index if no item is focused.\n if (open && !virtual && activeElement(event.currentTarget.ownerDocument) === event.currentTarget) {\n indexRef.current = isMainOrientationToEndKey(event.key, orientation, rtl) ? minIndex : maxIndex;\n onNavigate();\n return;\n }\n if (isMainOrientationToEndKey(event.key, orientation, rtl)) {\n if (loop) {\n indexRef.current = currentIndex >= maxIndex ? allowEscape && currentIndex !== listRef.current.length ? -1 : minIndex : findNonDisabledListIndex(listRef, {\n startingIndex: currentIndex,\n disabledIndices\n });\n } else {\n indexRef.current = Math.min(maxIndex, findNonDisabledListIndex(listRef, {\n startingIndex: currentIndex,\n disabledIndices\n }));\n }\n } else {\n if (loop) {\n indexRef.current = currentIndex <= minIndex ? allowEscape && currentIndex !== -1 ? listRef.current.length : maxIndex : findNonDisabledListIndex(listRef, {\n startingIndex: currentIndex,\n decrement: true,\n disabledIndices\n });\n } else {\n indexRef.current = Math.max(minIndex, findNonDisabledListIndex(listRef, {\n startingIndex: currentIndex,\n decrement: true,\n disabledIndices\n }));\n }\n }\n if (isIndexOutOfListBounds(listRef, indexRef.current)) {\n indexRef.current = -1;\n }\n onNavigate();\n }\n });\n const ariaActiveDescendantProp = React.useMemo(() => {\n return virtual && open && hasActiveIndex && {\n 'aria-activedescendant': virtualId || activeId\n };\n }, [virtual, open, hasActiveIndex, virtualId, activeId]);\n const floating = React.useMemo(() => {\n return {\n 'aria-orientation': orientation === 'both' ? undefined : orientation,\n ...(!typeableComboboxReference ? ariaActiveDescendantProp : {}),\n onKeyDown: commonOnKeyDown,\n onPointerMove() {\n isPointerModalityRef.current = true;\n }\n };\n }, [ariaActiveDescendantProp, commonOnKeyDown, orientation, typeableComboboxReference]);\n const reference = React.useMemo(() => {\n function checkVirtualMouse(event) {\n if (focusItemOnOpen === 'auto' && isVirtualClick(event.nativeEvent)) {\n focusItemOnOpenRef.current = true;\n }\n }\n function checkVirtualPointer(event) {\n // `pointerdown` fires first, reset the state then perform the checks.\n focusItemOnOpenRef.current = focusItemOnOpen;\n if (focusItemOnOpen === 'auto' && isVirtualPointerEvent(event.nativeEvent)) {\n focusItemOnOpenRef.current = true;\n }\n }\n return {\n ...ariaActiveDescendantProp,\n onKeyDown(event) {\n isPointerModalityRef.current = false;\n const isArrowKey = event.key.startsWith('Arrow');\n const isHomeOrEndKey = ['Home', 'End'].includes(event.key);\n const isMoveKey = isArrowKey || isHomeOrEndKey;\n const isCrossOpenKey = isCrossOrientationOpenKey(event.key, orientation, rtl);\n const isCrossCloseKey = isCrossOrientationCloseKey(event.key, orientation, rtl, cols);\n const isParentCrossOpenKey = isCrossOrientationOpenKey(event.key, getParentOrientation(), rtl);\n const isMainKey = isMainOrientationKey(event.key, orientation);\n const isNavigationKey = (nested ? isParentCrossOpenKey : isMainKey) || event.key === 'Enter' || event.key.trim() === '';\n if (virtual && open) {\n const rootNode = tree == null ? void 0 : tree.nodesRef.current.find(node => node.parentId == null);\n const deepestNode = tree && rootNode ? getDeepestNode(tree.nodesRef.current, rootNode.id) : null;\n if (isMoveKey && deepestNode && virtualItemRef) {\n const eventObject = new KeyboardEvent('keydown', {\n key: event.key,\n bubbles: true\n });\n if (isCrossOpenKey || isCrossCloseKey) {\n var _deepestNode$context, _deepestNode$context2;\n const isCurrentTarget = ((_deepestNode$context = deepestNode.context) == null ? void 0 : _deepestNode$context.elements.domReference) === event.currentTarget;\n const dispatchItem = isCrossCloseKey && !isCurrentTarget ? (_deepestNode$context2 = deepestNode.context) == null ? void 0 : _deepestNode$context2.elements.domReference : isCrossOpenKey ? listRef.current.find(item => (item == null ? void 0 : item.id) === activeId) : null;\n if (dispatchItem) {\n stopEvent(event);\n dispatchItem.dispatchEvent(eventObject);\n setVirtualId(undefined);\n }\n }\n if ((isMainKey || isHomeOrEndKey) && deepestNode.context) {\n if (deepestNode.context.open && deepestNode.parentId && event.currentTarget !== deepestNode.context.elements.domReference) {\n var _deepestNode$context$;\n stopEvent(event);\n (_deepestNode$context$ = deepestNode.context.elements.domReference) == null || _deepestNode$context$.dispatchEvent(eventObject);\n return;\n }\n }\n }\n return commonOnKeyDown(event);\n }\n // If a floating element should not open on arrow key down, avoid\n // setting `activeIndex` while it's closed.\n if (!open && !openOnArrowKeyDown && isArrowKey) {\n return;\n }\n if (isNavigationKey) {\n const isParentMainKey = isMainOrientationKey(event.key, getParentOrientation());\n keyRef.current = nested && isParentMainKey ? null : event.key;\n }\n if (nested) {\n if (isParentCrossOpenKey) {\n stopEvent(event);\n if (open) {\n indexRef.current = getMinListIndex(listRef, disabledIndicesRef.current);\n onNavigate();\n } else {\n onOpenChange(true, event.nativeEvent, 'list-navigation');\n }\n }\n return;\n }\n if (isMainKey) {\n if (selectedIndex != null) {\n indexRef.current = selectedIndex;\n }\n stopEvent(event);\n if (!open && openOnArrowKeyDown) {\n onOpenChange(true, event.nativeEvent, 'list-navigation');\n } else {\n commonOnKeyDown(event);\n }\n if (open) {\n onNavigate();\n }\n }\n },\n onFocus() {\n if (open && !virtual) {\n indexRef.current = -1;\n onNavigate();\n }\n },\n onPointerDown: checkVirtualPointer,\n onPointerEnter: checkVirtualPointer,\n onMouseDown: checkVirtualMouse,\n onClick: checkVirtualMouse\n };\n }, [activeId, ariaActiveDescendantProp, cols, commonOnKeyDown, disabledIndicesRef, focusItemOnOpen, listRef, nested, onNavigate, onOpenChange, open, openOnArrowKeyDown, orientation, getParentOrientation, rtl, selectedIndex, tree, virtual, virtualItemRef]);\n return React.useMemo(() => enabled ? {\n reference,\n floating,\n item\n } : {}, [enabled, reference, floating, item]);\n}\n\nconst componentRoleToAriaRoleMap = /*#__PURE__*/new Map([['select', 'listbox'], ['combobox', 'listbox'], ['label', false]]);\n\n/**\n * Adds base screen reader props to the reference and floating elements for a\n * given floating element `role`.\n * @see https://floating-ui.com/docs/useRole\n */\nfunction useRole(context, props) {\n var _elements$domReferenc, _componentRoleToAriaR;\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n elements,\n floatingId: defaultFloatingId\n } = context;\n const {\n enabled = true,\n role = 'dialog'\n } = props;\n const defaultReferenceId = useId();\n const referenceId = ((_elements$domReferenc = elements.domReference) == null ? void 0 : _elements$domReferenc.id) || defaultReferenceId;\n const floatingId = React.useMemo(() => {\n var _getFloatingFocusElem;\n return ((_getFloatingFocusElem = getFloatingFocusElement(elements.floating)) == null ? void 0 : _getFloatingFocusElem.id) || defaultFloatingId;\n }, [elements.floating, defaultFloatingId]);\n const ariaRole = (_componentRoleToAriaR = componentRoleToAriaRoleMap.get(role)) != null ? _componentRoleToAriaR : role;\n const parentId = useFloatingParentNodeId();\n const isNested = parentId != null;\n const reference = React.useMemo(() => {\n if (ariaRole === 'tooltip' || role === 'label') {\n return {\n [\"aria-\" + (role === 'label' ? 'labelledby' : 'describedby')]: open ? floatingId : undefined\n };\n }\n return {\n 'aria-expanded': open ? 'true' : 'false',\n 'aria-haspopup': ariaRole === 'alertdialog' ? 'dialog' : ariaRole,\n 'aria-controls': open ? floatingId : undefined,\n ...(ariaRole === 'listbox' && {\n role: 'combobox'\n }),\n ...(ariaRole === 'menu' && {\n id: referenceId\n }),\n ...(ariaRole === 'menu' && isNested && {\n role: 'menuitem'\n }),\n ...(role === 'select' && {\n 'aria-autocomplete': 'none'\n }),\n ...(role === 'combobox' && {\n 'aria-autocomplete': 'list'\n })\n };\n }, [ariaRole, floatingId, isNested, open, referenceId, role]);\n const floating = React.useMemo(() => {\n const floatingProps = {\n id: floatingId,\n ...(ariaRole && {\n role: ariaRole\n })\n };\n if (ariaRole === 'tooltip' || role === 'label') {\n return floatingProps;\n }\n return {\n ...floatingProps,\n ...(ariaRole === 'menu' && {\n 'aria-labelledby': referenceId\n })\n };\n }, [ariaRole, floatingId, referenceId, role]);\n const item = React.useCallback(_ref => {\n let {\n active,\n selected\n } = _ref;\n const commonProps = {\n role: 'option',\n ...(active && {\n id: floatingId + \"-fui-option\"\n })\n };\n\n // For `menu`, we are unable to tell if the item is a `menuitemradio`\n // or `menuitemcheckbox`. For backwards-compatibility reasons, also\n // avoid defaulting to `menuitem` as it may overwrite custom role props.\n switch (role) {\n case 'select':\n case 'combobox':\n return {\n ...commonProps,\n 'aria-selected': selected\n };\n }\n return {};\n }, [floatingId, role]);\n return React.useMemo(() => enabled ? {\n reference,\n floating,\n item\n } : {}, [enabled, reference, floating, item]);\n}\n\n// Converts a JS style key like `backgroundColor` to a CSS transition-property\n// like `background-color`.\nconst camelCaseToKebabCase = str => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\nfunction execWithArgsOrReturn(valueOrFn, args) {\n return typeof valueOrFn === 'function' ? valueOrFn(args) : valueOrFn;\n}\nfunction useDelayUnmount(open, durationMs) {\n const [isMounted, setIsMounted] = React.useState(open);\n if (open && !isMounted) {\n setIsMounted(true);\n }\n React.useEffect(() => {\n if (!open && isMounted) {\n const timeout = setTimeout(() => setIsMounted(false), durationMs);\n return () => clearTimeout(timeout);\n }\n }, [open, isMounted, durationMs]);\n return isMounted;\n}\n/**\n * Provides a status string to apply CSS transitions to a floating element,\n * correctly handling placement-aware transitions.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstatus\n */\nfunction useTransitionStatus(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n elements: {\n floating\n }\n } = context;\n const {\n duration = 250\n } = props;\n const isNumberDuration = typeof duration === 'number';\n const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n const [status, setStatus] = React.useState('unmounted');\n const isMounted = useDelayUnmount(open, closeDuration);\n if (!isMounted && status === 'close') {\n setStatus('unmounted');\n }\n useModernLayoutEffect(() => {\n if (!floating) return;\n if (open) {\n setStatus('initial');\n const frame = requestAnimationFrame(() => {\n // Ensure it opens before paint. With `FloatingDelayGroup`,\n // this avoids a flicker when moving between floating elements\n // to ensure one is always open with no missing frames.\n ReactDOM.flushSync(() => {\n setStatus('open');\n });\n });\n return () => {\n cancelAnimationFrame(frame);\n };\n }\n setStatus('close');\n }, [open, floating]);\n return {\n isMounted,\n status\n };\n}\n/**\n * Provides styles to apply CSS transitions to a floating element, correctly\n * handling placement-aware transitions. Wrapper around `useTransitionStatus`.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstyles\n */\nfunction useTransitionStyles(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n initial: unstable_initial = {\n opacity: 0\n },\n open: unstable_open,\n close: unstable_close,\n common: unstable_common,\n duration = 250\n } = props;\n const placement = context.placement;\n const side = placement.split('-')[0];\n const fnArgs = React.useMemo(() => ({\n side,\n placement\n }), [side, placement]);\n const isNumberDuration = typeof duration === 'number';\n const openDuration = (isNumberDuration ? duration : duration.open) || 0;\n const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n const [styles, setStyles] = React.useState(() => ({\n ...execWithArgsOrReturn(unstable_common, fnArgs),\n ...execWithArgsOrReturn(unstable_initial, fnArgs)\n }));\n const {\n isMounted,\n status\n } = useTransitionStatus(context, {\n duration\n });\n const initialRef = useLatestRef(unstable_initial);\n const openRef = useLatestRef(unstable_open);\n const closeRef = useLatestRef(unstable_close);\n const commonRef = useLatestRef(unstable_common);\n useModernLayoutEffect(() => {\n const initialStyles = execWithArgsOrReturn(initialRef.current, fnArgs);\n const closeStyles = execWithArgsOrReturn(closeRef.current, fnArgs);\n const commonStyles = execWithArgsOrReturn(commonRef.current, fnArgs);\n const openStyles = execWithArgsOrReturn(openRef.current, fnArgs) || Object.keys(initialStyles).reduce((acc, key) => {\n acc[key] = '';\n return acc;\n }, {});\n if (status === 'initial') {\n setStyles(styles => ({\n transitionProperty: styles.transitionProperty,\n ...commonStyles,\n ...initialStyles\n }));\n }\n if (status === 'open') {\n setStyles({\n transitionProperty: Object.keys(openStyles).map(camelCaseToKebabCase).join(','),\n transitionDuration: openDuration + \"ms\",\n ...commonStyles,\n ...openStyles\n });\n }\n if (status === 'close') {\n const styles = closeStyles || initialStyles;\n setStyles({\n transitionProperty: Object.keys(styles).map(camelCaseToKebabCase).join(','),\n transitionDuration: closeDuration + \"ms\",\n ...commonStyles,\n ...styles\n });\n }\n }, [closeDuration, closeRef, initialRef, openRef, commonRef, openDuration, status, fnArgs]);\n return {\n isMounted,\n styles\n };\n}\n\n/**\n * Provides a matching callback that can be used to focus an item as the user\n * types, often used in tandem with `useListNavigation()`.\n * @see https://floating-ui.com/docs/useTypeahead\n */\nfunction useTypeahead(context, props) {\n var _ref;\n const {\n open,\n dataRef\n } = context;\n const {\n listRef,\n activeIndex,\n onMatch: unstable_onMatch,\n onTypingChange: unstable_onTypingChange,\n enabled = true,\n findMatch = null,\n resetMs = 750,\n ignoreKeys = [],\n selectedIndex = null\n } = props;\n const timeoutIdRef = React.useRef(-1);\n const stringRef = React.useRef('');\n const prevIndexRef = React.useRef((_ref = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref : -1);\n const matchIndexRef = React.useRef(null);\n const onMatch = useEffectEvent(unstable_onMatch);\n const onTypingChange = useEffectEvent(unstable_onTypingChange);\n const findMatchRef = useLatestRef(findMatch);\n const ignoreKeysRef = useLatestRef(ignoreKeys);\n useModernLayoutEffect(() => {\n if (open) {\n clearTimeoutIfSet(timeoutIdRef);\n matchIndexRef.current = null;\n stringRef.current = '';\n }\n }, [open]);\n useModernLayoutEffect(() => {\n // Sync arrow key navigation but not typeahead navigation.\n if (open && stringRef.current === '') {\n var _ref2;\n prevIndexRef.current = (_ref2 = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref2 : -1;\n }\n }, [open, selectedIndex, activeIndex]);\n const setTypingChange = useEffectEvent(value => {\n if (value) {\n if (!dataRef.current.typing) {\n dataRef.current.typing = value;\n onTypingChange(value);\n }\n } else {\n if (dataRef.current.typing) {\n dataRef.current.typing = value;\n onTypingChange(value);\n }\n }\n });\n const onKeyDown = useEffectEvent(event => {\n function getMatchingIndex(list, orderedList, string) {\n const str = findMatchRef.current ? findMatchRef.current(orderedList, string) : orderedList.find(text => (text == null ? void 0 : text.toLocaleLowerCase().indexOf(string.toLocaleLowerCase())) === 0);\n return str ? list.indexOf(str) : -1;\n }\n const listContent = listRef.current;\n if (stringRef.current.length > 0 && stringRef.current[0] !== ' ') {\n if (getMatchingIndex(listContent, listContent, stringRef.current) === -1) {\n setTypingChange(false);\n } else if (event.key === ' ') {\n stopEvent(event);\n }\n }\n if (listContent == null || ignoreKeysRef.current.includes(event.key) ||\n // Character key.\n event.key.length !== 1 ||\n // Modifier key.\n event.ctrlKey || event.metaKey || event.altKey) {\n return;\n }\n if (open && event.key !== ' ') {\n stopEvent(event);\n setTypingChange(true);\n }\n\n // Bail out if the list contains a word like \"llama\" or \"aaron\". TODO:\n // allow it in this case, too.\n const allowRapidSuccessionOfFirstLetter = listContent.every(text => {\n var _text$, _text$2;\n return text ? ((_text$ = text[0]) == null ? void 0 : _text$.toLocaleLowerCase()) !== ((_text$2 = text[1]) == null ? void 0 : _text$2.toLocaleLowerCase()) : true;\n });\n\n // Allows the user to cycle through items that start with the same letter\n // in rapid succession.\n if (allowRapidSuccessionOfFirstLetter && stringRef.current === event.key) {\n stringRef.current = '';\n prevIndexRef.current = matchIndexRef.current;\n }\n stringRef.current += event.key;\n clearTimeoutIfSet(timeoutIdRef);\n timeoutIdRef.current = window.setTimeout(() => {\n stringRef.current = '';\n prevIndexRef.current = matchIndexRef.current;\n setTypingChange(false);\n }, resetMs);\n const prevIndex = prevIndexRef.current;\n const index = getMatchingIndex(listContent, [...listContent.slice((prevIndex || 0) + 1), ...listContent.slice(0, (prevIndex || 0) + 1)], stringRef.current);\n if (index !== -1) {\n onMatch(index);\n matchIndexRef.current = index;\n } else if (event.key !== ' ') {\n stringRef.current = '';\n setTypingChange(false);\n }\n });\n const reference = React.useMemo(() => ({\n onKeyDown\n }), [onKeyDown]);\n const floating = React.useMemo(() => {\n return {\n onKeyDown,\n onKeyUp(event) {\n if (event.key === ' ') {\n setTypingChange(false);\n }\n }\n };\n }, [onKeyDown, setTypingChange]);\n return React.useMemo(() => enabled ? {\n reference,\n floating\n } : {}, [enabled, reference, floating]);\n}\n\nfunction getArgsWithCustomFloatingHeight(state, height) {\n return {\n ...state,\n rects: {\n ...state.rects,\n floating: {\n ...state.rects.floating,\n height\n }\n }\n };\n}\n/**\n * Positions the floating element such that an inner element inside of it is\n * anchored to the reference element.\n * @see https://floating-ui.com/docs/inner\n * @deprecated\n */\nconst inner = props => ({\n name: 'inner',\n options: props,\n async fn(state) {\n const {\n listRef,\n overflowRef,\n onFallbackChange,\n offset: innerOffset = 0,\n index = 0,\n minItemsVisible = 4,\n referenceOverflowThreshold = 0,\n scrollRef,\n ...detectOverflowOptions\n } = evaluate(props, state);\n const {\n rects,\n elements: {\n floating\n }\n } = state;\n const item = listRef.current[index];\n const scrollEl = (scrollRef == null ? void 0 : scrollRef.current) || floating;\n\n // Valid combinations:\n // 1. Floating element is the scrollRef and has a border (default)\n // 2. Floating element is not the scrollRef, floating element has a border\n // 3. Floating element is not the scrollRef, scrollRef has a border\n // Floating > {...getFloatingProps()} wrapper > scrollRef > items is not\n // allowed as VoiceOver doesn't work.\n const clientTop = floating.clientTop || scrollEl.clientTop;\n const floatingIsBordered = floating.clientTop !== 0;\n const scrollElIsBordered = scrollEl.clientTop !== 0;\n const floatingIsScrollEl = floating === scrollEl;\n if (process.env.NODE_ENV !== \"production\") {\n if (!state.placement.startsWith('bottom')) {\n warn('`placement` side must be \"bottom\" when using the `inner`', 'middleware.');\n }\n }\n if (!item) {\n return {};\n }\n const nextArgs = {\n ...state,\n ...(await offset(-item.offsetTop - floating.clientTop - rects.reference.height / 2 - item.offsetHeight / 2 - innerOffset).fn(state))\n };\n const overflow = await detectOverflow(getArgsWithCustomFloatingHeight(nextArgs, scrollEl.scrollHeight + clientTop + floating.clientTop), detectOverflowOptions);\n const refOverflow = await detectOverflow(nextArgs, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const diffY = max(0, overflow.top);\n const nextY = nextArgs.y + diffY;\n const isScrollable = scrollEl.scrollHeight > scrollEl.clientHeight;\n const rounder = isScrollable ? v => v : round;\n const maxHeight = rounder(max(0, scrollEl.scrollHeight + (floatingIsBordered && floatingIsScrollEl || scrollElIsBordered ? clientTop * 2 : 0) - diffY - max(0, overflow.bottom)));\n scrollEl.style.maxHeight = maxHeight + \"px\";\n scrollEl.scrollTop = diffY;\n\n // There is not enough space, fallback to standard anchored positioning\n if (onFallbackChange) {\n const shouldFallback = scrollEl.offsetHeight < item.offsetHeight * min(minItemsVisible, listRef.current.length) - 1 || refOverflow.top >= -referenceOverflowThreshold || refOverflow.bottom >= -referenceOverflowThreshold;\n ReactDOM.flushSync(() => onFallbackChange(shouldFallback));\n }\n if (overflowRef) {\n overflowRef.current = await detectOverflow(getArgsWithCustomFloatingHeight({\n ...nextArgs,\n y: nextY\n }, scrollEl.offsetHeight + clientTop + floating.clientTop), detectOverflowOptions);\n }\n return {\n y: nextY\n };\n }\n});\n/**\n * Changes the `inner` middleware's `offset` upon a `wheel` event to\n * expand the floating element's height, revealing more list items.\n * @see https://floating-ui.com/docs/inner\n * @deprecated\n */\nfunction useInnerOffset(context, props) {\n const {\n open,\n elements\n } = context;\n const {\n enabled = true,\n overflowRef,\n scrollRef,\n onChange: unstable_onChange\n } = props;\n const onChange = useEffectEvent(unstable_onChange);\n const controlledScrollingRef = React.useRef(false);\n const prevScrollTopRef = React.useRef(null);\n const initialOverflowRef = React.useRef(null);\n React.useEffect(() => {\n if (!enabled) return;\n function onWheel(e) {\n if (e.ctrlKey || !el || overflowRef.current == null) {\n return;\n }\n const dY = e.deltaY;\n const isAtTop = overflowRef.current.top >= -0.5;\n const isAtBottom = overflowRef.current.bottom >= -0.5;\n const remainingScroll = el.scrollHeight - el.clientHeight;\n const sign = dY < 0 ? -1 : 1;\n const method = dY < 0 ? 'max' : 'min';\n if (el.scrollHeight <= el.clientHeight) {\n return;\n }\n if (!isAtTop && dY > 0 || !isAtBottom && dY < 0) {\n e.preventDefault();\n ReactDOM.flushSync(() => {\n onChange(d => d + Math[method](dY, remainingScroll * sign));\n });\n } else if (/firefox/i.test(getUserAgent())) {\n // Needed to propagate scrolling during momentum scrolling phase once\n // it gets limited by the boundary. UX improvement, not critical.\n el.scrollTop += dY;\n }\n }\n const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n if (open && el) {\n el.addEventListener('wheel', onWheel);\n\n // Wait for the position to be ready.\n requestAnimationFrame(() => {\n prevScrollTopRef.current = el.scrollTop;\n if (overflowRef.current != null) {\n initialOverflowRef.current = {\n ...overflowRef.current\n };\n }\n });\n return () => {\n prevScrollTopRef.current = null;\n initialOverflowRef.current = null;\n el.removeEventListener('wheel', onWheel);\n };\n }\n }, [enabled, open, elements.floating, overflowRef, scrollRef, onChange]);\n const floating = React.useMemo(() => ({\n onKeyDown() {\n controlledScrollingRef.current = true;\n },\n onWheel() {\n controlledScrollingRef.current = false;\n },\n onPointerMove() {\n controlledScrollingRef.current = false;\n },\n onScroll() {\n const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n if (!overflowRef.current || !el || !controlledScrollingRef.current) {\n return;\n }\n if (prevScrollTopRef.current !== null) {\n const scrollDiff = el.scrollTop - prevScrollTopRef.current;\n if (overflowRef.current.bottom < -0.5 && scrollDiff < -1 || overflowRef.current.top < -0.5 && scrollDiff > 1) {\n ReactDOM.flushSync(() => onChange(d => d + scrollDiff));\n }\n }\n\n // [Firefox] Wait for the height change to have been applied.\n requestAnimationFrame(() => {\n prevScrollTopRef.current = el.scrollTop;\n });\n }\n }), [elements.floating, onChange, overflowRef, scrollRef]);\n return React.useMemo(() => enabled ? {\n floating\n } : {}, [enabled, floating]);\n}\n\nfunction getNodeChildren(nodes, id, onlyOpenChildren) {\n if (onlyOpenChildren === void 0) {\n onlyOpenChildren = true;\n }\n const directChildren = nodes.filter(node => {\n var _node$context;\n return node.parentId === id && (!onlyOpenChildren || ((_node$context = node.context) == null ? void 0 : _node$context.open));\n });\n return directChildren.flatMap(child => [child, ...getNodeChildren(nodes, child.id, onlyOpenChildren)]);\n}\n\nfunction isPointInPolygon(point, polygon) {\n const [x, y] = point;\n let isInside = false;\n const length = polygon.length;\n for (let i = 0, j = length - 1; i < length; j = i++) {\n const [xi, yi] = polygon[i] || [0, 0];\n const [xj, yj] = polygon[j] || [0, 0];\n const intersect = yi >= y !== yj >= y && x <= (xj - xi) * (y - yi) / (yj - yi) + xi;\n if (intersect) {\n isInside = !isInside;\n }\n }\n return isInside;\n}\nfunction isInside(point, rect) {\n return point[0] >= rect.x && point[0] <= rect.x + rect.width && point[1] >= rect.y && point[1] <= rect.y + rect.height;\n}\n/**\n * Generates a safe polygon area that the user can traverse without closing the\n * floating element once leaving the reference element.\n * @see https://floating-ui.com/docs/useHover#safepolygon\n */\nfunction safePolygon(options) {\n if (options === void 0) {\n options = {};\n }\n const {\n buffer = 0.5,\n blockPointerEvents = false,\n requireIntent = true\n } = options;\n const timeoutRef = {\n current: -1\n };\n let hasLanded = false;\n let lastX = null;\n let lastY = null;\n let lastCursorTime = typeof performance !== 'undefined' ? performance.now() : 0;\n function getCursorSpeed(x, y) {\n const currentTime = performance.now();\n const elapsedTime = currentTime - lastCursorTime;\n if (lastX === null || lastY === null || elapsedTime === 0) {\n lastX = x;\n lastY = y;\n lastCursorTime = currentTime;\n return null;\n }\n const deltaX = x - lastX;\n const deltaY = y - lastY;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n const speed = distance / elapsedTime; // px / ms\n\n lastX = x;\n lastY = y;\n lastCursorTime = currentTime;\n return speed;\n }\n const fn = _ref => {\n let {\n x,\n y,\n placement,\n elements,\n onClose,\n nodeId,\n tree\n } = _ref;\n return function onMouseMove(event) {\n function close() {\n clearTimeoutIfSet(timeoutRef);\n onClose();\n }\n clearTimeoutIfSet(timeoutRef);\n if (!elements.domReference || !elements.floating || placement == null || x == null || y == null) {\n return;\n }\n const {\n clientX,\n clientY\n } = event;\n const clientPoint = [clientX, clientY];\n const target = getTarget(event);\n const isLeave = event.type === 'mouseleave';\n const isOverFloatingEl = contains(elements.floating, target);\n const isOverReferenceEl = contains(elements.domReference, target);\n const refRect = elements.domReference.getBoundingClientRect();\n const rect = elements.floating.getBoundingClientRect();\n const side = placement.split('-')[0];\n const cursorLeaveFromRight = x > rect.right - rect.width / 2;\n const cursorLeaveFromBottom = y > rect.bottom - rect.height / 2;\n const isOverReferenceRect = isInside(clientPoint, refRect);\n const isFloatingWider = rect.width > refRect.width;\n const isFloatingTaller = rect.height > refRect.height;\n const left = (isFloatingWider ? refRect : rect).left;\n const right = (isFloatingWider ? refRect : rect).right;\n const top = (isFloatingTaller ? refRect : rect).top;\n const bottom = (isFloatingTaller ? refRect : rect).bottom;\n if (isOverFloatingEl) {\n hasLanded = true;\n if (!isLeave) {\n return;\n }\n }\n if (isOverReferenceEl) {\n hasLanded = false;\n }\n if (isOverReferenceEl && !isLeave) {\n hasLanded = true;\n return;\n }\n\n // Prevent overlapping floating element from being stuck in an open-close\n // loop: https://github.com/floating-ui/floating-ui/issues/1910\n if (isLeave && isElement(event.relatedTarget) && contains(elements.floating, event.relatedTarget)) {\n return;\n }\n\n // If any nested child is open, abort.\n if (tree && getNodeChildren(tree.nodesRef.current, nodeId).length) {\n return;\n }\n\n // If the pointer is leaving from the opposite side, the \"buffer\" logic\n // creates a point where the floating element remains open, but should be\n // ignored.\n // A constant of 1 handles floating point rounding errors.\n if (side === 'top' && y >= refRect.bottom - 1 || side === 'bottom' && y <= refRect.top + 1 || side === 'left' && x >= refRect.right - 1 || side === 'right' && x <= refRect.left + 1) {\n return close();\n }\n\n // Ignore when the cursor is within the rectangular trough between the\n // two elements. Since the triangle is created from the cursor point,\n // which can start beyond the ref element's edge, traversing back and\n // forth from the ref to the floating element can cause it to close. This\n // ensures it always remains open in that case.\n let rectPoly = [];\n switch (side) {\n case 'top':\n rectPoly = [[left, refRect.top + 1], [left, rect.bottom - 1], [right, rect.bottom - 1], [right, refRect.top + 1]];\n break;\n case 'bottom':\n rectPoly = [[left, rect.top + 1], [left, refRect.bottom - 1], [right, refRect.bottom - 1], [right, rect.top + 1]];\n break;\n case 'left':\n rectPoly = [[rect.right - 1, bottom], [rect.right - 1, top], [refRect.left + 1, top], [refRect.left + 1, bottom]];\n break;\n case 'right':\n rectPoly = [[refRect.right - 1, bottom], [refRect.right - 1, top], [rect.left + 1, top], [rect.left + 1, bottom]];\n break;\n }\n function getPolygon(_ref2) {\n let [x, y] = _ref2;\n switch (side) {\n case 'top':\n {\n const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.bottom - buffer : isFloatingWider ? rect.bottom - buffer : rect.top], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.bottom - buffer : rect.top : rect.bottom - buffer]];\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n case 'bottom':\n {\n const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.top + buffer : isFloatingWider ? rect.top + buffer : rect.bottom], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.top + buffer : rect.bottom : rect.top + buffer]];\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n case 'left':\n {\n const cursorPointOne = [x + buffer + 1, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const cursorPointTwo = [x + buffer + 1, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const commonPoints = [[cursorLeaveFromBottom ? rect.right - buffer : isFloatingTaller ? rect.right - buffer : rect.left, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.right - buffer : rect.left : rect.right - buffer, rect.bottom]];\n return [...commonPoints, cursorPointOne, cursorPointTwo];\n }\n case 'right':\n {\n const cursorPointOne = [x - buffer, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const cursorPointTwo = [x - buffer, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const commonPoints = [[cursorLeaveFromBottom ? rect.left + buffer : isFloatingTaller ? rect.left + buffer : rect.right, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.left + buffer : rect.right : rect.left + buffer, rect.bottom]];\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n }\n }\n if (isPointInPolygon([clientX, clientY], rectPoly)) {\n return;\n }\n if (hasLanded && !isOverReferenceRect) {\n return close();\n }\n if (!isLeave && requireIntent) {\n const cursorSpeed = getCursorSpeed(event.clientX, event.clientY);\n const cursorSpeedThreshold = 0.1;\n if (cursorSpeed !== null && cursorSpeed < cursorSpeedThreshold) {\n return close();\n }\n }\n if (!isPointInPolygon([clientX, clientY], getPolygon([x, y]))) {\n close();\n } else if (!hasLanded && requireIntent) {\n timeoutRef.current = window.setTimeout(close, 40);\n }\n };\n };\n fn.__options = {\n blockPointerEvents\n };\n return fn;\n}\n\nexport { Composite, CompositeItem, FloatingArrow, FloatingDelayGroup, FloatingFocusManager, FloatingList, FloatingNode, FloatingOverlay, FloatingPortal, FloatingTree, NextFloatingDelayGroup, inner, safePolygon, useClick, useClientPoint, useDelayGroup, useDelayGroupContext, useDismiss, useFloating, useFloatingNodeId, useFloatingParentNodeId, useFloatingPortalNode, useFloatingRootContext, useFloatingTree, useFocus, useHover, useId, useInnerOffset, useInteractions, useListItem, useListNavigation, useMergeRefs, useNextDelayGroup, useRole, useTransitionStatus, useTransitionStyles, useTypeahead };\n","/**\r\n * useClickOutside Hook\r\n * Detects clicks outside of a specified element\r\n * @module hooks/useClickOutside\r\n */\r\n\r\nimport { useEffect, RefObject } from 'react'\r\n\r\n/**\r\n * Hook to detect clicks outside of specified elements\r\n * @param refs - Array of refs or single ref to monitor\r\n * @param handler - Callback when click outside is detected\r\n * @param enabled - Whether the hook is enabled (default: true)\r\n */\r\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\r\n refs: RefObject<T> | RefObject<T>[],\r\n handler: (event: MouseEvent | TouchEvent) => void,\r\n enabled = true\r\n): void {\r\n useEffect(() => {\r\n if (!enabled) return\r\n\r\n const listener = (event: MouseEvent | TouchEvent) => {\r\n const refsArray = Array.isArray(refs) ? refs : [refs]\r\n\r\n // Check if click is inside any of the refs\r\n const isInside = refsArray.some((ref) => {\r\n const el = ref.current\r\n if (!el) return false\r\n\r\n const target = event.target as Node\r\n return el === target || el.contains(target)\r\n })\r\n\r\n if (!isInside) {\r\n handler(event)\r\n }\r\n }\r\n\r\n // Add listeners with a small delay to avoid immediate triggering\r\n const timeoutId = setTimeout(() => {\r\n document.addEventListener('mousedown', listener)\r\n document.addEventListener('touchstart', listener)\r\n }, 0)\r\n\r\n return () => {\r\n clearTimeout(timeoutId)\r\n document.removeEventListener('mousedown', listener)\r\n document.removeEventListener('touchstart', listener)\r\n }\r\n }, [refs, handler, enabled])\r\n}\r\n","/**\r\n * useKeyboardNav Hook\r\n * Provides keyboard navigation for dropdown menus and lists\r\n * @module hooks/useKeyboardNav\r\n */\r\n\r\nimport { useEffect, useState, useCallback, RefObject } from 'react'\r\n\r\nexport interface UseKeyboardNavOptions {\r\n /** Total number of items */\r\n itemCount: number\r\n /** Callback when an item is selected */\r\n onSelect?: (index: number) => void\r\n /** Callback when escape is pressed */\r\n onEscape?: () => void\r\n /** Whether the navigation is enabled */\r\n enabled?: boolean\r\n /** Whether to loop around when reaching the end */\r\n loop?: boolean\r\n /** Container ref for scrolling into view */\r\n containerRef?: RefObject<HTMLElement>\r\n}\r\n\r\nexport interface UseKeyboardNavReturn {\r\n /** Current active index */\r\n activeIndex: number\r\n /** Set the active index */\r\n setActiveIndex: (index: number) => void\r\n /** Handle keydown event */\r\n handleKeyDown: (event: React.KeyboardEvent) => void\r\n /** Get props for an item at index */\r\n getItemProps: (index: number) => {\r\n 'data-active': boolean\r\n 'data-index': number\r\n role: string\r\n tabIndex: number\r\n }\r\n}\r\n\r\n/**\r\n * Hook for keyboard navigation in dropdown menus\r\n */\r\nexport function useKeyboardNav({\r\n itemCount,\r\n onSelect,\r\n onEscape,\r\n enabled = true,\r\n loop = true,\r\n containerRef,\r\n}: UseKeyboardNavOptions): UseKeyboardNavReturn {\r\n const [activeIndex, setActiveIndex] = useState(-1)\r\n\r\n // Scroll item into view when active index changes\r\n useEffect(() => {\r\n if (!enabled || activeIndex === -1 || !containerRef?.current) return\r\n\r\n const container = containerRef.current\r\n const activeItem = container.querySelector(`[data-index=\"${activeIndex}\"]`) as HTMLElement\r\n\r\n if (activeItem) {\r\n activeItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' })\r\n }\r\n }, [activeIndex, enabled, containerRef])\r\n\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n if (!enabled) return\r\n\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault()\r\n setActiveIndex((prev) => {\r\n if (prev === -1) return 0\r\n if (prev === itemCount - 1) return loop ? 0 : prev\r\n return prev + 1\r\n })\r\n break\r\n\r\n case 'ArrowUp':\r\n event.preventDefault()\r\n setActiveIndex((prev) => {\r\n if (prev === -1) return itemCount - 1\r\n if (prev === 0) return loop ? itemCount - 1 : prev\r\n return prev - 1\r\n })\r\n break\r\n\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault()\r\n if (activeIndex !== -1 && onSelect) {\r\n onSelect(activeIndex)\r\n }\r\n break\r\n\r\n case 'Escape':\r\n event.preventDefault()\r\n if (onEscape) {\r\n onEscape()\r\n }\r\n break\r\n\r\n case 'Home':\r\n event.preventDefault()\r\n setActiveIndex(0)\r\n break\r\n\r\n case 'End':\r\n event.preventDefault()\r\n setActiveIndex(itemCount - 1)\r\n break\r\n\r\n default:\r\n break\r\n }\r\n },\r\n [enabled, activeIndex, itemCount, loop, onSelect, onEscape]\r\n )\r\n\r\n const getItemProps = useCallback(\r\n (index: number) => ({\r\n 'data-active': index === activeIndex,\r\n 'data-index': index,\r\n role: 'option',\r\n tabIndex: -1,\r\n }),\r\n [activeIndex]\r\n )\r\n\r\n return {\r\n activeIndex,\r\n setActiveIndex,\r\n handleKeyDown,\r\n getItemProps,\r\n }\r\n}\r\n","/**\r\n * Dropdown Component\r\n * Base dropdown with Floating UI for intelligent positioning\r\n * Theme-aware, accessible, and performant\r\n * @module components/Dropdown\r\n */\r\n\r\nimport { useRef, useState, useCallback, ReactNode, CSSProperties } from 'react'\r\nimport {\r\n useFloating,\r\n autoUpdate,\r\n offset,\r\n flip,\r\n shift,\r\n size,\r\n arrow,\r\n FloatingArrow,\r\n Placement,\r\n} from '@floating-ui/react'\r\nimport { Portal } from '../Portal'\r\nimport { useClickOutside } from '../../hooks/useClickOutside'\r\nimport { useKeyboardNav } from '../../hooks/useKeyboardNav'\r\nimport './dropdown.css'\r\n\r\nexport interface DropdownProps {\r\n /** Trigger element (button, input, etc.) */\r\n trigger: ReactNode | ((props: { isOpen: boolean; toggle: () => void }) => ReactNode)\r\n\r\n /** Dropdown content */\r\n children: ReactNode | ((props: {\r\n activeIndex: number\r\n setActiveIndex: (index: number) => void\r\n close: () => void\r\n }) => ReactNode)\r\n\r\n /** Controlled open state */\r\n isOpen?: boolean\r\n\r\n /** Callback when open state changes */\r\n onOpenChange?: (isOpen: boolean) => void\r\n\r\n /** Placement preference */\r\n placement?: Placement\r\n\r\n /** Offset from trigger (px) */\r\n offsetDistance?: number\r\n\r\n /** Max height for dropdown content (px) */\r\n maxHeight?: number\r\n\r\n /** Min width (defaults to trigger width) */\r\n minWidth?: number | 'trigger'\r\n\r\n /** Max width */\r\n maxWidth?: number\r\n\r\n /** Show arrow pointing to trigger */\r\n showArrow?: boolean\r\n\r\n /** Custom className for dropdown content */\r\n className?: string\r\n\r\n /** Custom className for trigger wrapper */\r\n triggerClassName?: string\r\n\r\n /** Disable click outside to close */\r\n disableClickOutside?: boolean\r\n\r\n /** Disable keyboard navigation */\r\n disableKeyboardNav?: boolean\r\n\r\n /** Number of items for keyboard navigation */\r\n itemCount?: number\r\n\r\n /** Callback when item is selected via keyboard */\r\n onSelectItem?: (index: number) => void\r\n\r\n /** Callback when dropdown opens */\r\n onOpen?: () => void\r\n\r\n /** Callback when dropdown closes */\r\n onClose?: () => void\r\n\r\n /** Animation duration (ms) */\r\n animationDuration?: number\r\n\r\n /** Z-index for dropdown */\r\n zIndex?: number\r\n}\r\n\r\n/**\r\n * Base Dropdown component with intelligent positioning\r\n * Uses Floating UI for automatic positioning and collision detection\r\n */\r\nexport function Dropdown({\r\n trigger,\r\n children,\r\n isOpen: controlledIsOpen,\r\n onOpenChange,\r\n placement = 'bottom-start',\r\n offsetDistance = 8,\r\n maxHeight = 320,\r\n minWidth = 'trigger',\r\n maxWidth,\r\n showArrow = false,\r\n className = '',\r\n triggerClassName = '',\r\n disableClickOutside = false,\r\n disableKeyboardNav = false,\r\n itemCount = 0,\r\n onSelectItem,\r\n onOpen,\r\n onClose,\r\n animationDuration = 200,\r\n zIndex = 1000,\r\n}: DropdownProps) {\r\n // Internal state for uncontrolled mode\r\n const [internalIsOpen, setInternalIsOpen] = useState(false)\r\n\r\n // Use controlled or uncontrolled state\r\n const isOpen = controlledIsOpen !== undefined ? controlledIsOpen : internalIsOpen\r\n\r\n const setIsOpen = useCallback(\r\n (newIsOpen: boolean) => {\r\n const wasOpen = isOpen\r\n if (controlledIsOpen === undefined) {\r\n setInternalIsOpen(newIsOpen)\r\n }\r\n onOpenChange?.(newIsOpen)\r\n\r\n // Call lifecycle callbacks\r\n if (newIsOpen && !wasOpen) {\r\n onOpen?.()\r\n } else if (!newIsOpen && wasOpen) {\r\n onClose?.()\r\n }\r\n },\r\n [controlledIsOpen, onOpenChange, onOpen, onClose, isOpen]\r\n )\r\n\r\n const toggle = useCallback(() => {\r\n setIsOpen(!isOpen)\r\n }, [isOpen, setIsOpen])\r\n\r\n const close = useCallback(() => {\r\n setIsOpen(false)\r\n }, [setIsOpen])\r\n\r\n // Refs\r\n const triggerRef = useRef<HTMLDivElement>(null)\r\n const dropdownRef = useRef<HTMLDivElement>(null)\r\n const arrowRef = useRef<SVGSVGElement>(null)\r\n\r\n // Floating UI setup\r\n const { refs, floatingStyles, context } = useFloating({\r\n open: isOpen,\r\n onOpenChange: setIsOpen,\r\n placement,\r\n middleware: [\r\n offset(offsetDistance),\r\n flip({ padding: 8 }),\r\n shift({ padding: 8 }),\r\n size({\r\n apply({ rects, elements }) {\r\n Object.assign(elements.floating.style, {\r\n minWidth:\r\n minWidth === 'trigger' ? `${rects.reference.width}px` : minWidth ? `${minWidth}px` : undefined,\r\n maxWidth: maxWidth ? `${maxWidth}px` : undefined,\r\n maxHeight: `${maxHeight}px`,\r\n })\r\n },\r\n padding: 8,\r\n }),\r\n showArrow ? arrow({ element: arrowRef }) : null,\r\n ].filter(Boolean),\r\n whileElementsMounted: autoUpdate,\r\n })\r\n\r\n // Click outside to close\r\n useClickOutside(\r\n [triggerRef, dropdownRef],\r\n close,\r\n isOpen && !disableClickOutside\r\n )\r\n\r\n // Keyboard navigation\r\n const { activeIndex, setActiveIndex, handleKeyDown } = useKeyboardNav({\r\n itemCount,\r\n onSelect: onSelectItem,\r\n onEscape: close,\r\n enabled: isOpen && !disableKeyboardNav,\r\n loop: true,\r\n containerRef: dropdownRef,\r\n })\r\n\r\n // Render trigger\r\n const renderTrigger = () => {\r\n if (typeof trigger === 'function') {\r\n return trigger({ isOpen, toggle })\r\n }\r\n return trigger\r\n }\r\n\r\n // Render children\r\n const renderChildren = () => {\r\n if (typeof children === 'function') {\r\n return children({ activeIndex, setActiveIndex, close })\r\n }\r\n return children\r\n }\r\n\r\n // Animation styles\r\n const animationStyle: CSSProperties = {\r\n transition: `opacity ${animationDuration}ms ease-in-out, transform ${animationDuration}ms ease-in-out`,\r\n opacity: isOpen ? 1 : 0,\r\n transform: isOpen ? 'scale(1)' : 'scale(0.95)',\r\n pointerEvents: isOpen ? 'auto' : 'none',\r\n }\r\n\r\n return (\r\n <>\r\n {/* Trigger */}\r\n <div\r\n ref={triggerRef}\r\n className={`dropdown-trigger ${triggerClassName}`}\r\n onClick={toggle}\r\n >\r\n {renderTrigger()}\r\n </div>\r\n\r\n {/* Dropdown Content */}\r\n <Portal>\r\n <div\r\n ref={refs.setFloating}\r\n style={{\r\n ...floatingStyles,\r\n zIndex,\r\n ...animationStyle,\r\n }}\r\n className={`dropdown-content ${className}`}\r\n role=\"menu\"\r\n aria-orientation=\"vertical\"\r\n onKeyDown={handleKeyDown}\r\n >\r\n <div ref={dropdownRef} className=\"dropdown-inner\">\r\n {renderChildren()}\r\n </div>\r\n\r\n {/* Arrow */}\r\n {showArrow && (\r\n <FloatingArrow\r\n ref={arrowRef}\r\n context={context}\r\n className=\"dropdown-arrow\"\r\n />\r\n )}\r\n </div>\r\n </Portal>\r\n </>\r\n )\r\n}\r\n\r\n// Export helper for creating dropdown items with keyboard nav props\r\nexport function createDropdownItem(props: ReturnType<typeof useKeyboardNav>['getItemProps'], content: ReactNode) {\r\n return (\r\n <div {...props} className=\"dropdown-item\">\r\n {content}\r\n </div>\r\n )\r\n}\r\n","/**\r\n * Priority Selector Component V2\r\n * Using new Dropdown system with Floating UI for perfect positioning\r\n * Theme-aware and accessible\r\n */\r\n\r\nimport { Dropdown } from '../Dropdown'\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: '#E74C3C', darkColor: '#ff6b6b' },\r\n HIGH: { label: 'High', color: '#E67E22', darkColor: '#ffa94d' },\r\n MEDIUM: { label: 'Normal', color: '#F1C40F', darkColor: '#ffd43b' },\r\n LOW: { label: 'Low', color: '#2ECC71', darkColor: '#51cf66' },\r\n} as const\r\n\r\nconst CLEAR_COLOR = '#BDC3C7'\r\nconst CLEAR_COLOR_DARK = '#868e96'\r\n\r\n// Priority Icon Component\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\n// Check Icon\r\nconst CheckIcon = () => (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M13.5 4.5L6 12L2.5 8.5\"\r\n stroke=\"var(--asakaa-color-interactive-primary, #1976d2)\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n)\r\n\r\nexport function PrioritySelector({ priority, onChange, className }: PrioritySelectorProps) {\r\n const currentConfig = priority ? PRIORITY_CONFIG[priority] : null\r\n\r\n // Use theme-aware color\r\n const isDark = document.documentElement.getAttribute('data-theme') === 'dark'\r\n const flagColor = currentConfig ? (isDark ? currentConfig.darkColor : currentConfig.color) : (isDark ? CLEAR_COLOR_DARK : CLEAR_COLOR)\r\n\r\n const handleSelect = (newPriority?: Priority) => {\r\n onChange(newPriority)\r\n }\r\n\r\n const priorities = Object.entries(PRIORITY_CONFIG) as [Priority, typeof PRIORITY_CONFIG[Priority]][]\r\n\r\n return (\r\n <Dropdown\r\n trigger={({ isOpen }) => (\r\n <button\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 ${className || ''}`}\r\n style={{\r\n background: priority ? `${flagColor}10` : 'transparent',\r\n boxShadow: priority ? `0 0 0 2px ${flagColor}30 inset` : 'none',\r\n transform: isOpen ? 'scale(1.1)' : 'scale(1)',\r\n }}\r\n title={currentConfig?.label || 'Set priority'}\r\n aria-label=\"Select priority\"\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"menu\"\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 placement=\"bottom-start\"\r\n minWidth={180}\r\n maxHeight={280}\r\n itemCount={priorities.length + 1}\r\n onSelectItem={(index) => {\r\n const item = priorities[index]\r\n if (item) {\r\n handleSelect(item[0])\r\n } else {\r\n handleSelect(undefined)\r\n }\r\n }}\r\n >\r\n {({ activeIndex, close }) => (\r\n <div className=\"priority-dropdown\">\r\n {/* Header */}\r\n <div className=\"dropdown-section-header\">Priority</div>\r\n\r\n {/* Priority Options */}\r\n <div className=\"dropdown-section\">\r\n {priorities.map(([key, config], index) => {\r\n const color = isDark ? config.darkColor : config.color\r\n const isActive = activeIndex === index\r\n const isSelected = priority === key\r\n\r\n return (\r\n <button\r\n key={key}\r\n onClick={() => {\r\n handleSelect(key)\r\n close()\r\n }}\r\n className=\"dropdown-item\"\r\n data-active={isActive}\r\n data-index={index}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n style={{\r\n color: isActive ? color : 'inherit',\r\n fontWeight: isSelected ? 600 : 400,\r\n }}\r\n >\r\n <PriorityIcon color={color} />\r\n <span>{config.label}</span>\r\n {isSelected && <CheckIcon />}\r\n </button>\r\n )\r\n })}\r\n\r\n {/* Clear Option */}\r\n <div style={{ borderTop: '1px solid var(--asakaa-color-border-default, #e0e0e0)', marginTop: '4px', paddingTop: '4px' }}>\r\n <button\r\n onClick={() => {\r\n handleSelect(undefined)\r\n close()\r\n }}\r\n className=\"dropdown-item\"\r\n data-active={activeIndex === priorities.length}\r\n data-index={priorities.length}\r\n role=\"option\"\r\n aria-selected={!priority}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <circle\r\n cx=\"8\"\r\n cy=\"8\"\r\n r=\"6\"\r\n stroke=\"var(--asakaa-color-text-tertiary, #9e9e9e)\"\r\n strokeWidth=\"1.5\"\r\n strokeDasharray=\"2 2\"\r\n opacity=\"0.6\"\r\n />\r\n </svg>\r\n <span>Clear</span>\r\n {!priority && <CheckIcon />}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </Dropdown>\r\n )\r\n}\r\n","/**\r\n * Date Range Picker V2\r\n * Quick selection buttons + interactive calendar\r\n * Uses world-class Dropdown system for perfect positioning\r\n */\r\n\r\nimport { useState } from 'react'\r\nimport { Dropdown } from '../Dropdown'\r\n\r\nexport interface DateRangePickerProps {\r\n startDate?: string\r\n endDate?: string\r\n onChange: (startDate?: string, endDate?: string) => void\r\n className?: string\r\n}\r\n\r\nconst QUICK_OPTIONS = [\r\n { label: 'Today', days: 0 },\r\n { label: 'Tomorrow', days: 1 },\r\n { label: 'Next Week', days: 7 },\r\n { label: '2 Weeks', days: 14 },\r\n { label: '4 Weeks', days: 28 },\r\n { label: '8 Weeks', days: 56 },\r\n]\r\n\r\nexport function DateRangePicker({\r\n startDate,\r\n endDate,\r\n onChange,\r\n className,\r\n}: DateRangePickerProps) {\r\n const [tempStartDate, setTempStartDate] = useState<string>(startDate || '')\r\n const [tempEndDate, setTempEndDate] = useState<string>(endDate || '')\r\n\r\n const handleQuickSelect = (days: number, close: () => void) => {\r\n const today = new Date()\r\n const end = new Date(today)\r\n end.setDate(end.getDate() + days)\r\n\r\n const startStr = today.toISOString().split('T')[0] || ''\r\n const endStr = end.toISOString().split('T')[0] || ''\r\n\r\n setTempStartDate(startStr)\r\n setTempEndDate(endStr)\r\n onChange(startStr, endStr)\r\n close()\r\n }\r\n\r\n const handleApply = (close: () => void) => {\r\n onChange(tempStartDate || undefined, tempEndDate || undefined)\r\n close()\r\n }\r\n\r\n const formatDateRange = () => {\r\n if (!startDate || !endDate) return 'Set date'\r\n\r\n // Parse dates as local timezone to avoid UTC conversion issues\r\n const parseLocalDate = (dateStr: string | Date) => {\r\n if (dateStr instanceof Date) return dateStr\r\n // Handle invalid date strings\r\n if (typeof dateStr !== 'string' || !dateStr.match(/^\\d{4}-\\d{2}-\\d{2}$/)) {\r\n return null\r\n }\r\n const parts = dateStr.split('-').map(Number)\r\n if (parts.length !== 3 || parts.some(p => isNaN(p))) {\r\n return null\r\n }\r\n const year = parts[0]\r\n const month = parts[1]\r\n const day = parts[2]\r\n if (year === undefined || month === undefined || day === undefined) {\r\n return null\r\n }\r\n return new Date(year, month - 1, day)\r\n }\r\n\r\n const start = parseLocalDate(startDate)\r\n const end = parseLocalDate(endDate)\r\n\r\n // Return 'Set date' if parsing failed\r\n if (!start || !end || isNaN(start.getTime()) || isNaN(end.getTime())) {\r\n return 'Set date'\r\n }\r\n\r\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\n return `${monthNames[start.getMonth()]} ${start.getDate()} – ${monthNames[end.getMonth()]} ${end.getDate()}`\r\n }\r\n\r\n const hasDateSet = startDate && endDate\r\n\r\n // Check if date is overdue\r\n const isOverdue = () => {\r\n if (!endDate) return false\r\n const end = typeof endDate === 'string' ? new Date(endDate) : endDate\r\n const today = new Date()\r\n today.setHours(0, 0, 0, 0)\r\n return end < today\r\n }\r\n\r\n const overdue = isOverdue()\r\n\r\n return (\r\n <Dropdown\r\n trigger={({ isOpen }) => (\r\n <button\r\n className={`flex items-center gap-1.5 px-2 py-1 rounded-md text-xs transition-all hover:bg-white/5 ${\r\n overdue ? 'asakaa-date-overdue' : 'asakaa-date'\r\n } ${className || ''}`}\r\n style={{\r\n transform: isOpen ? 'scale(1.05)' : 'scale(1)',\r\n }}\r\n title={hasDateSet ? `${formatDateRange()}` : 'Set date range'}\r\n aria-label=\"Select date range\"\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"menu\"\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <rect\r\n x=\"2\"\r\n y=\"3\"\r\n width=\"12\"\r\n height=\"11\"\r\n rx=\"2\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.5\"\r\n />\r\n <path d=\"M2 6H14\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\r\n <path d=\"M5 2V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M11 2V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n </svg>\r\n {startDate && endDate && (\r\n <span className=\"whitespace-nowrap\">{formatDateRange()}</span>\r\n )}\r\n </button>\r\n )}\r\n placement=\"bottom-start\"\r\n minWidth={320}\r\n maxHeight={480}\r\n itemCount={QUICK_OPTIONS.length}\r\n onOpen={() => {\r\n setTempStartDate(startDate || '')\r\n setTempEndDate(endDate || '')\r\n }}\r\n >\r\n {({ activeIndex, close }) => (\r\n <div className=\"date-range-picker-dropdown\">\r\n {/* Quick selection */}\r\n <div className=\"dropdown-button-wrapper\">\r\n <div className=\"dropdown-section-header\" style={{ marginBottom: '12px' }}>\r\n Quick Select\r\n </div>\r\n <div className=\"dropdown-quick-grid\">\r\n {QUICK_OPTIONS.map((option, index) => (\r\n <button\r\n key={option.label}\r\n onClick={() => handleQuickSelect(option.days, close)}\r\n className=\"dropdown-quick-button\"\r\n data-active={activeIndex === index}\r\n data-index={index}\r\n role=\"option\"\r\n >\r\n {option.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Manual date inputs */}\r\n <div className=\"dropdown-button-wrapper\">\r\n <div className=\"dropdown-section-header\" style={{ marginBottom: '12px' }}>\r\n Custom Range\r\n </div>\r\n <div className=\"dropdown-form-actions\">\r\n <div className=\"dropdown-form-group\">\r\n <label className=\"dropdown-label\">\r\n Start Date\r\n </label>\r\n <input\r\n type=\"date\"\r\n value={tempStartDate}\r\n onChange={(e) => setTempStartDate(e.target.value)}\r\n className=\"dropdown-input\"\r\n />\r\n </div>\r\n <div className=\"dropdown-form-group\">\r\n <label className=\"dropdown-label\">\r\n End Date\r\n </label>\r\n <input\r\n type=\"date\"\r\n value={tempEndDate}\r\n onChange={(e) => setTempEndDate(e.target.value)}\r\n className=\"dropdown-input\"\r\n />\r\n </div>\r\n\r\n {/* Apply button */}\r\n <button\r\n onClick={() => handleApply(close)}\r\n className=\"dropdown-primary-button\"\r\n >\r\n Apply\r\n </button>\r\n\r\n {/* Clear button */}\r\n {(startDate || endDate) && (\r\n <button\r\n onClick={() => {\r\n setTempStartDate('')\r\n setTempEndDate('')\r\n onChange(undefined, undefined)\r\n close()\r\n }}\r\n className=\"dropdown-danger-button\"\r\n >\r\n Clear Dates\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </Dropdown>\r\n )\r\n}\r\n","/**\r\n * User Assignment Selector V2\r\n * Multi-select user assignment with avatar display\r\n * Uses world-class Dropdown system for perfect positioning\r\n */\r\n\r\nimport { useState } from 'react'\r\nimport { Dropdown } from '../Dropdown'\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 [searchQuery, setSearchQuery] = useState('')\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 <Dropdown\r\n trigger={({ isOpen }) => (\r\n <button\r\n className={`dropdown-avatar-trigger ${className || ''}`}\r\n style={{\r\n transform: isOpen ? 'scale(1.05)' : 'scale(1)',\r\n }}\r\n title={assignedUsers.length > 0 ? `${assignedUsers.length} assigned` : 'Assign users'}\r\n aria-label=\"Assign users\"\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"menu\"\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 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=\"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 dropdown-avatar-overflow\">\r\n +{overflowCount}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"dropdown-avatar-empty-trigger\">\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 placement=\"bottom-start\"\r\n minWidth={300}\r\n maxHeight={350}\r\n itemCount={filteredUsers.length}\r\n onSelectItem={(index) => {\r\n const user = filteredUsers[index]\r\n if (user) {\r\n handleToggleUser(user)\r\n }\r\n }}\r\n onClose={() => setSearchQuery('')}\r\n >\r\n {({ activeIndex, close }) => (\r\n <div>\r\n {/* Header */}\r\n <div className=\"dropdown-section-header\">Assign Users</div>\r\n\r\n {/* Search input */}\r\n <div className=\"dropdown-search-wrapper\">\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=\"dropdown-search-input\"\r\n autoFocus\r\n />\r\n </div>\r\n\r\n {/* User list */}\r\n <div className=\"dropdown-list\">\r\n {filteredUsers.length === 0 ? (\r\n <div className=\"dropdown-empty\">\r\n No users found\r\n </div>\r\n ) : (\r\n filteredUsers.map((user, index) => {\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={() => {\r\n handleToggleUser(user)\r\n }}\r\n className=\"dropdown-item\"\r\n data-active={activeIndex === index}\r\n data-index={index}\r\n role=\"option\"\r\n aria-selected={isAssigned}\r\n >\r\n {/* Avatar */}\r\n <div\r\n style={{\r\n width: '28px',\r\n height: '28px',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '11px',\r\n fontWeight: 700,\r\n flexShrink: 0,\r\n backgroundColor: user.color,\r\n color: '#fff',\r\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\r\n }}\r\n >\r\n {user.avatar ? (\r\n <img\r\n src={user.avatar}\r\n alt={user.name}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n borderRadius: '50%',\r\n objectFit: 'cover',\r\n }}\r\n />\r\n ) : (\r\n user.initials\r\n )}\r\n </div>\r\n\r\n {/* Name */}\r\n <span style={{ flex: 1, fontWeight: 600 }}>\r\n {user.name}\r\n </span>\r\n\r\n {/* Checkmark */}\r\n {isAssigned && (\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 18 18\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M4 9L7.5 12.5L14 6\"\r\n stroke=\"var(--asakaa-color-interactive-primary)\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n )}\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=\"dropdown-button-wrapper\">\r\n <button\r\n onClick={() => {\r\n onChange([])\r\n close()\r\n }}\r\n className=\"dropdown-danger-button\"\r\n >\r\n Clear All\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </Dropdown>\r\n )\r\n}\r\n","/**\r\n * Dependencies Selector V2\r\n * Select task dependencies with link icon\r\n * Uses world-class Dropdown system for perfect positioning\r\n */\r\n\r\nimport { useState } from 'react'\r\nimport { Dropdown } from '../Dropdown'\r\nimport type { Card } from '../../types'\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}\r\n\r\nexport function DependenciesSelector({\r\n currentCardId,\r\n dependencies = [],\r\n availableTasks,\r\n onChange,\r\n className,\r\n}: DependenciesSelectorProps) {\r\n const [searchQuery, setSearchQuery] = useState('')\r\n const [hasDependencies, setHasDependencies] = useState(dependencies.length > 0)\r\n\r\n const handleToggleDependency = (taskId: string) => {\r\n const isDependency = dependencies.includes(taskId)\r\n\r\n if (isDependency) {\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 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 ? '#3B82F6' : '#BDC3C7'\r\n\r\n return (\r\n <Dropdown\r\n trigger={({ isOpen }) => (\r\n <button\r\n className={`flex items-center gap-1 px-2 py-1 rounded transition-all hover:bg-white/5 ${className || ''}`}\r\n style={{\r\n transform: isOpen ? 'scale(1.05)' : 'scale(1)',\r\n }}\r\n title={\r\n dependencies.length > 0\r\n ? `${dependencies.length} dependencies`\r\n : 'Add dependencies'\r\n }\r\n aria-label=\"Select dependencies\"\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"menu\"\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 placement=\"bottom-start\"\r\n minWidth={300}\r\n maxHeight={350}\r\n itemCount={hasDependencies ? filteredTasks.length : 0}\r\n onSelectItem={(index) => {\r\n const task = filteredTasks[index]\r\n if (task) {\r\n handleToggleDependency(task.id)\r\n }\r\n }}\r\n onClose={() => setSearchQuery('')}\r\n onOpen={() => setHasDependencies(dependencies.length > 0)}\r\n >\r\n {({ activeIndex, close }) => (\r\n <div className=\"dependencies-dropdown\">\r\n {/* Header */}\r\n <div className=\"dropdown-section-header\">Task Dependencies</div>\r\n\r\n {/* Has dependencies checkbox */}\r\n <div className=\"dropdown-button-wrapper\" style={{ borderBottom: '1px solid var(--asakaa-color-border-subtle)' }}>\r\n <label\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n cursor: 'pointer',\r\n }}\r\n onClick={handleToggleHasDependencies}\r\n >\r\n <div\r\n style={{\r\n width: '16px',\r\n height: '16px',\r\n borderRadius: '4px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n transition: 'all 0.15s',\r\n border: hasDependencies\r\n ? '2px solid var(--asakaa-color-interactive-primary)'\r\n : '2px solid var(--asakaa-color-border-default)',\r\n background: hasDependencies\r\n ? 'var(--asakaa-color-interactive-primary)'\r\n : 'transparent',\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 style={{\r\n fontSize: '13px',\r\n fontWeight: 600,\r\n color: 'var(--asakaa-color-text-primary)'\r\n }}>\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=\"dropdown-search-wrapper\">\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=\"dropdown-search-input\"\r\n autoFocus\r\n />\r\n </div>\r\n\r\n {/* Task list */}\r\n <div className=\"dropdown-list\">\r\n {filteredTasks.length === 0 ? (\r\n <div className=\"dropdown-empty\">\r\n No tasks found\r\n </div>\r\n ) : (\r\n filteredTasks.map((task, index) => {\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=\"dropdown-item\"\r\n data-active={activeIndex === index}\r\n data-index={index}\r\n role=\"option\"\r\n aria-selected={isDependency}\r\n >\r\n {/* Checkbox */}\r\n <div\r\n style={{\r\n width: '16px',\r\n height: '16px',\r\n borderRadius: '4px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flexShrink: 0,\r\n marginTop: '2px',\r\n transition: 'all 0.15s',\r\n border: isDependency\r\n ? '2px solid var(--asakaa-color-interactive-primary)'\r\n : '2px solid var(--asakaa-color-border-default)',\r\n background: isDependency\r\n ? 'var(--asakaa-color-interactive-primary)'\r\n : 'transparent',\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 style={{ flex: 1, textAlign: 'left' }}>\r\n <div style={{\r\n fontWeight: 600,\r\n color: 'var(--asakaa-color-text-primary)'\r\n }}>\r\n {task.title}\r\n </div>\r\n <div style={{\r\n fontSize: '11px',\r\n marginTop: '2px',\r\n color: 'var(--asakaa-color-text-secondary)'\r\n }}>\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=\"dropdown-button-wrapper\">\r\n <button\r\n onClick={() => {\r\n onChange([])\r\n setHasDependencies(false)\r\n close()\r\n }}\r\n className=\"dropdown-danger-button\"\r\n >\r\n Clear All Dependencies\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </Dropdown>\r\n )\r\n}\r\n","/**\r\n * Column Menu Component\r\n * Three-dot menu for column actions (rename, etc.)\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport { Portal } from '../Portal'\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 /** Custom className */\r\n className?: string\r\n}\r\n\r\nexport function ColumnMenu({\r\n columnTitle,\r\n onRename,\r\n className,\r\n}: ColumnMenuProps) {\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=\"Column options\"\r\n aria-label=\"Column menu\"\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 Rename Column\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-blue-500/50 transition-all\"\r\n placeholder=\"Column name\"\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\">Rename</span>\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 * Column Component\r\n * Vertical column containing cards\r\n * @module components/Column\r\n */\r\n\r\nimport { memo, useRef } from 'react'\r\nimport { useDroppable } from '@dnd-kit/core'\r\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'\r\nimport { useVirtualizer } from '@tanstack/react-virtual'\r\nimport type { Column as ColumnType, Card as CardType } from '../../types'\r\nimport type { User } from '../Card/UserAssignmentSelector'\r\nimport { Card } from '../Card'\r\nimport { ColumnMenu } from './ColumnMenu'\r\nimport { cn, shouldVirtualize } from '../../utils'\r\n\r\nexport interface ColumnProps {\r\n /** Column data */\r\n column: ColumnType\r\n /** Cards in this column */\r\n cards: CardType[]\r\n /** Custom column renderer */\r\n renderColumn?: (column: ColumnType, cards: CardType[]) => React.ReactNode\r\n /** Custom card renderer */\r\n renderCard?: (card: CardType) => React.ReactNode\r\n /** Custom header renderer */\r\n renderHeader?: (column: ColumnType, cardCount: number) => React.ReactNode\r\n /** Custom empty state */\r\n renderEmptyState?: (column: ColumnType) => React.ReactNode\r\n /** Card click handler */\r\n onCardClick?: (card: CardType) => void\r\n /** Card update handler */\r\n onCardUpdate?: (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 /** Enable virtualization */\r\n enableVirtualization?: boolean\r\n /** Estimated card height for virtualization */\r\n cardHeight?: number\r\n /** Is column collapsed */\r\n isCollapsed?: boolean\r\n /** Toggle collapse */\r\n onToggleCollapse?: () => void\r\n /** Column rename handler */\r\n onColumnRename?: (columnId: string, newTitle: string) => void\r\n /** Custom className */\r\n className?: string\r\n}\r\n\r\n/**\r\n * Column Component\r\n * Uses virtualization for large lists automatically\r\n */\r\nexport const Column = memo<ColumnProps>(\r\n ({\r\n column,\r\n cards,\r\n renderColumn,\r\n renderCard,\r\n renderHeader,\r\n renderEmptyState,\r\n onCardClick,\r\n onCardUpdate,\r\n availableUsers,\r\n allCards,\r\n enableVirtualization,\r\n cardHeight = 120,\r\n isCollapsed,\r\n onToggleCollapse,\r\n onColumnRename,\r\n className,\r\n }) => {\r\n const { setNodeRef, isOver } = useDroppable({\r\n id: column.id,\r\n data: {\r\n type: 'column',\r\n column,\r\n },\r\n })\r\n\r\n const parentRef = useRef<HTMLDivElement>(null)\r\n\r\n // Auto-enable virtualization for large lists\r\n const useVirtualization =\r\n enableVirtualization ?? shouldVirtualize(cards.length)\r\n\r\n // Setup virtualizer\r\n const virtualizer = useVirtualizer({\r\n count: cards.length,\r\n getScrollElement: () => parentRef.current,\r\n estimateSize: () => cardHeight,\r\n enabled: useVirtualization,\r\n })\r\n\r\n // Custom column renderer\r\n if (renderColumn) {\r\n return (\r\n <div ref={setNodeRef} className={className}>\r\n {renderColumn(column, cards)}\r\n </div>\r\n )\r\n }\r\n\r\n // Calculate WIP limit status\r\n const getWipLimitStatus = () => {\r\n if (!column.wipLimit) return { state: 'none', percentage: 0 }\r\n\r\n const percentage = (cards.length / column.wipLimit) * 100\r\n\r\n if (cards.length > column.wipLimit) {\r\n return { state: 'exceeded', percentage }\r\n } else if (percentage >= 80) {\r\n return { state: 'warning', percentage }\r\n } else if (percentage >= 60) {\r\n return { state: 'approaching', percentage }\r\n } else {\r\n return { state: 'ok', percentage }\r\n }\r\n }\r\n\r\n const wipStatus = getWipLimitStatus()\r\n const isOverWipLimit = wipStatus.state === 'exceeded'\r\n\r\n // WIP limit badge styling - simplified without color backgrounds\r\n const getWipBadgeClasses = () => {\r\n // All WIP limits use the same base class for consistent, subtle display\r\n return 'asakaa-column-count'\r\n }\r\n\r\n return (\r\n <div\r\n ref={setNodeRef}\r\n className={cn(\r\n 'asakaa-column',\r\n isOver && 'ring-2 ring-asakaa-accent-blue',\r\n isOverWipLimit && 'ring-2 ring-asakaa-accent-red',\r\n className\r\n )}\r\n >\r\n {/* Header */}\r\n {renderHeader ? (\r\n renderHeader(column, cards.length)\r\n ) : (\r\n <div className=\"asakaa-column-header group\">\r\n <h2 className=\"asakaa-column-title\">{column.title}</h2>\r\n <div className=\"flex items-center gap-2\">\r\n <span className={cn(getWipBadgeClasses())}>\r\n {cards.length}\r\n {column.wipLimit && ` / ${column.wipLimit}`}\r\n </span>\r\n {/* WIP limit status indicator */}\r\n {column.wipLimit && wipStatus.state !== 'none' && (\r\n <span\r\n className=\"text-xs font-medium flex items-center\"\r\n title={`${wipStatus.percentage.toFixed(0)}% capacity${\r\n column.wipLimitType === 'hard'\r\n ? ' (Hard limit - blocks new cards)'\r\n : ' (Soft limit - shows warning)'\r\n }`}\r\n >\r\n {wipStatus.state === 'exceeded' && (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <circle cx=\"8\" cy=\"8\" r=\"7\" fill=\"#EF4444\" opacity=\"0.9\" />\r\n <path d=\"M5 5L11 11M11 5L5 11\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" />\r\n </svg>\r\n )}\r\n {wipStatus.state === 'warning' && (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 1L15 14H1L8 1Z\" fill=\"#F59E0B\" opacity=\"0.9\" />\r\n <path d=\"M8 6V9M8 11V11.5\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n </svg>\r\n )}\r\n {wipStatus.state === 'approaching' && (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 1L10 7H14L10 10L12 16L8 12L4 16L6 10L2 7H6L8 1Z\" fill=\"#FB923C\" opacity=\"0.9\" />\r\n </svg>\r\n )}\r\n {wipStatus.state === 'ok' && (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <circle cx=\"8\" cy=\"8\" r=\"7\" fill=\"#10B981\" opacity=\"0.9\" />\r\n <path d=\"M5 8L7 10L11 6\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n )}\r\n </span>\r\n )}\r\n {onColumnRename && (\r\n <ColumnMenu\r\n columnTitle={column.title}\r\n onRename={(newTitle) => onColumnRename(column.id, newTitle)}\r\n />\r\n )}\r\n {onToggleCollapse && (\r\n <button\r\n onClick={onToggleCollapse}\r\n className=\"text-asakaa-text-tertiary hover:text-asakaa-text-primary\"\r\n aria-label={isCollapsed ? 'Expand column' : 'Collapse column'}\r\n >\r\n {isCollapsed ? '▶' : '▼'}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Cards */}\r\n {!isCollapsed && (\r\n <div\r\n ref={parentRef}\r\n className=\"asakaa-column-cards\"\r\n style={{\r\n maxHeight: useVirtualization ? '600px' : undefined,\r\n }}\r\n >\r\n <SortableContext\r\n items={cards.map((card) => card.id)}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n {cards.length === 0 ? (\r\n // Empty state\r\n renderEmptyState ? (\r\n renderEmptyState(column)\r\n ) : (\r\n <div className=\"asakaa-drop-zone asakaa-empty\">\r\n <p>Drop cards here</p>\r\n </div>\r\n )\r\n ) : useVirtualization ? (\r\n // Virtualized list\r\n <div\r\n style={{\r\n height: `${virtualizer.getTotalSize()}px`,\r\n position: 'relative',\r\n }}\r\n >\r\n {virtualizer.getVirtualItems().map((virtualItem) => {\r\n const card = cards[virtualItem.index]\r\n if (!card) return null\r\n\r\n return (\r\n <div\r\n key={card.id}\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n transform: `translateY(${virtualItem.start}px)`,\r\n }}\r\n >\r\n <Card\r\n card={card}\r\n render={renderCard}\r\n onClick={onCardClick}\r\n onUpdate={onCardUpdate}\r\n availableUsers={availableUsers}\r\n allCards={allCards}\r\n />\r\n </div>\r\n )\r\n })}\r\n </div>\r\n ) : (\r\n // Regular list\r\n cards.map((card) => (\r\n <Card\r\n key={card.id}\r\n card={card}\r\n render={renderCard}\r\n onClick={onCardClick}\r\n onUpdate={onCardUpdate}\r\n availableUsers={availableUsers}\r\n allCards={allCards}\r\n />\r\n ))\r\n )}\r\n </SortableContext>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n // Memoization removed to allow card property updates to trigger re-renders\r\n // The individual Card components are still memoized for performance\r\n)\r\n\r\nColumn.displayName = 'Column'\r\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-blue-500',\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 * useDragState - React hook for drag state management\r\n * @module hooks/useDragState\r\n *\r\n * Replacement for Jotai's useAtom(dragStateAtom)\r\n */\r\n\r\nimport { useState, useEffect, useCallback } from 'react'\r\nimport { dragStore, type DragState } from '@libxai/core'\r\n\r\n/**\r\n * Hook return type\r\n */\r\nexport type UseDragStateReturn = [\r\n state: DragState,\r\n setState: (state: DragState) => void\r\n]\r\n\r\n/**\r\n * React hook for drag state\r\n *\r\n * Drop-in replacement for `useAtom(dragStateAtom)`\r\n *\r\n * @example\r\n * ```tsx\r\n * function MyComponent() {\r\n * const [dragState, setDragState] = useDragState()\r\n *\r\n * const handleDragStart = () => {\r\n * setDragState({\r\n * isDragging: true,\r\n * draggedCardId: 'card-1',\r\n * sourceColumnId: 'col-1',\r\n * targetColumnId: 'col-1',\r\n * })\r\n * }\r\n *\r\n * return <div>{dragState.isDragging ? 'Dragging...' : 'Idle'}</div>\r\n * }\r\n * ```\r\n */\r\nexport function useDragState(): UseDragStateReturn {\r\n const [state, setState] = useState<DragState>(() => dragStore.getState())\r\n\r\n useEffect(() => {\r\n // Subscribe to store changes\r\n const unsubscribe = dragStore.subscribe((newState) => {\r\n setState(newState)\r\n })\r\n\r\n return unsubscribe\r\n }, [])\r\n\r\n const setDragState = useCallback((newState: DragState) => {\r\n dragStore.setState(newState)\r\n }, [])\r\n\r\n return [state, setDragState]\r\n}\r\n","import { useCallback, useMemo } 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 } from '../../types'\r\nimport { Column } from '../Column'\r\nimport { Card } from '../Card'\r\nimport { cn, calculateDropPosition } from '../../utils'\r\nimport { useDragState } from '../../hooks/useDragState'\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}: KanbanBoardProps & { children?: React.ReactNode }) {\r\n const [dragState, setDragState] = useDragState()\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 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 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 const handleCardClick = useCallback(\r\n (card: typeof board.cards[0]) => {\r\n onCardClick?.(card)\r\n },\r\n [onCardClick]\r\n )\r\n\r\n if (isLoading) {\r\n return (\r\n <div className={cn('asakaa-board', 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', 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 <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 className={cn('asakaa-board', className)} style={style}>\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 return (\r\n <Column\r\n key={column.id}\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 onCardClick={handleCardClick}\r\n onCardUpdate={handleCardUpdate}\r\n onColumnRename={handleColumnRename}\r\n availableUsers={availableUsers}\r\n allCards={board.cards}\r\n enableVirtualization={config?.enableVirtualization}\r\n cardHeight={config?.cardHeight}\r\n />\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}\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","/**\r\n * Error Boundary Component\r\n * Catches errors in child components and provides fallback UI\r\n * @module components/ErrorBoundary\r\n */\r\n\r\nimport React, { Component, ErrorInfo, ReactNode } from 'react'\r\n\r\nexport interface ErrorBoundaryProps {\r\n /** Child components to wrap */\r\n children: ReactNode\r\n /** Custom fallback UI (receives error and reset callback) */\r\n fallback?: (error: Error, reset: () => void) => ReactNode\r\n /** Callback when error is caught */\r\n onError?: (error: Error, errorInfo: ErrorInfo) => void\r\n /** Component identifier for error tracking */\r\n componentName?: string\r\n}\r\n\r\ninterface ErrorBoundaryState {\r\n hasError: boolean\r\n error: Error | null\r\n errorInfo: ErrorInfo | null\r\n}\r\n\r\n/**\r\n * Error Boundary for catching React errors\r\n *\r\n * @example\r\n * ```tsx\r\n * <ErrorBoundary\r\n * onError={(error) => console.error(error)}\r\n * componentName=\"KanbanBoard\"\r\n * >\r\n * <KanbanBoard {...props} />\r\n * </ErrorBoundary>\r\n * ```\r\n */\r\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props)\r\n this.state = {\r\n hasError: false,\r\n error: null,\r\n errorInfo: null,\r\n }\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\r\n return {\r\n hasError: true,\r\n error,\r\n }\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\r\n const { onError, componentName } = this.props\r\n\r\n // Log error to console in development\r\n if (process.env.NODE_ENV === 'development') {\r\n console.error(`Error in ${componentName || 'Component'}:`, error)\r\n console.error('Error Info:', errorInfo)\r\n }\r\n\r\n // Update state with error info\r\n this.setState({\r\n errorInfo,\r\n })\r\n\r\n // Call custom error handler\r\n if (onError) {\r\n try {\r\n onError(error, errorInfo)\r\n } catch (handlerError) {\r\n console.error('Error in error handler:', handlerError)\r\n }\r\n }\r\n }\r\n\r\n resetError = (): void => {\r\n this.setState({\r\n hasError: false,\r\n error: null,\r\n errorInfo: null,\r\n })\r\n }\r\n\r\n render(): ReactNode {\r\n const { hasError, error } = this.state\r\n const { children, fallback, componentName } = this.props\r\n\r\n if (hasError && error) {\r\n // Use custom fallback if provided\r\n if (fallback) {\r\n return fallback(error, this.resetError)\r\n }\r\n\r\n // Default fallback UI\r\n return (\r\n <div\r\n className=\"p-6 rounded-lg border\"\r\n style={{\r\n background: 'linear-gradient(135deg, #2d1b1b 0%, #1a1a1a 100%)',\r\n borderColor: 'rgba(239, 68, 68, 0.3)',\r\n }}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n {/* Error icon */}\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=\"flex-shrink-0\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"#EF4444\" strokeWidth=\"2\" />\r\n <path d=\"M12 8V12\" stroke=\"#EF4444\" strokeWidth=\"2\" strokeLinecap=\"round\" />\r\n <circle cx=\"12\" cy=\"16\" r=\"1\" fill=\"#EF4444\" />\r\n </svg>\r\n\r\n <div className=\"flex-1\">\r\n <h3 className=\"text-lg font-semibold text-red-400 mb-1\">\r\n {componentName ? `Error in ${componentName}` : 'Something went wrong'}\r\n </h3>\r\n <p className=\"text-sm text-white/70 mb-3\">\r\n {error.message || 'An unexpected error occurred'}\r\n </p>\r\n\r\n {process.env.NODE_ENV === 'development' && (\r\n <details className=\"mb-3\">\r\n <summary className=\"text-xs text-white/50 cursor-pointer hover:text-white/70 mb-2\">\r\n Error Details (Development Only)\r\n </summary>\r\n <pre className=\"text-xs text-white/60 bg-black/30 p-3 rounded overflow-auto max-h-48\">\r\n {error.stack}\r\n </pre>\r\n </details>\r\n )}\r\n\r\n <button\r\n onClick={this.resetError}\r\n className=\"px-4 py-2 rounded-lg text-sm font-medium transition-all hover:bg-red-600/20 border border-red-500/30\"\r\n style={{ color: '#EF4444' }}\r\n >\r\n Try Again\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n return children\r\n }\r\n}\r\n\r\n/**\r\n * Hook-based error boundary wrapper\r\n * Use this for functional components\r\n */\r\nexport function withErrorBoundary<P extends object>(\r\n Component: React.ComponentType<P>,\r\n errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>\r\n) {\r\n const WrappedComponent = (props: P) => (\r\n <ErrorBoundary {...errorBoundaryProps}>\r\n <Component {...props} />\r\n </ErrorBoundary>\r\n )\r\n\r\n WrappedComponent.displayName = `withErrorBoundary(${Component.displayName || Component.name || 'Component'})`\r\n\r\n return WrappedComponent\r\n}\r\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 ? '#3B82F6'\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 ? '#3B82F6'\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","/**\r\n * AttachmentUploader Component\r\n * Drag & drop file uploader with preview\r\n */\r\n\r\nimport { useState, useCallback, useRef } from 'react'\r\nimport type { Attachment } from '../../types'\r\nimport './attachments.css'\r\n\r\nexport interface AttachmentUploaderProps {\r\n /** Card ID for attachments */\r\n cardId: string\r\n /** Existing attachments */\r\n attachments?: Attachment[]\r\n /** Callback when files are uploaded */\r\n onUpload?: (files: File[]) => Promise<void> | void\r\n /** Callback when attachment is deleted */\r\n onDelete?: (attachmentId: string) => void\r\n /** Current user ID */\r\n currentUserId?: string\r\n /** Max file size in MB */\r\n maxSizeMB?: number\r\n /** Allowed file types (MIME types) */\r\n allowedTypes?: string[]\r\n /** Max number of files */\r\n maxFiles?: number\r\n}\r\n\r\n/**\r\n * Format file size to human readable string\r\n */\r\nfunction formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 Bytes'\r\n const k = 1024\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i]\r\n}\r\n\r\n/**\r\n * Get file icon based on MIME type\r\n */\r\nfunction getFileIcon(type: string): string {\r\n if (type.startsWith('image/')) return '🖼️'\r\n if (type.startsWith('video/')) return '🎥'\r\n if (type.startsWith('audio/')) return '🎵'\r\n if (type.includes('pdf')) return '📄'\r\n if (type.includes('word') || type.includes('document')) return '📝'\r\n if (type.includes('sheet') || type.includes('excel')) return '📊'\r\n if (type.includes('presentation') || type.includes('powerpoint')) return '📽️'\r\n if (type.includes('zip') || type.includes('rar') || type.includes('compressed')) return '🗜️'\r\n if (type.includes('text')) return '📃'\r\n return '📎'\r\n}\r\n\r\n/**\r\n * Check if file is an image\r\n */\r\nfunction isImage(type: string): boolean {\r\n return type.startsWith('image/')\r\n}\r\n\r\nexport function AttachmentUploader({\r\n attachments = [],\r\n onUpload,\r\n onDelete,\r\n maxSizeMB = 10,\r\n allowedTypes,\r\n maxFiles = 10,\r\n}: AttachmentUploaderProps) {\r\n const [isDragging, setIsDragging] = useState(false)\r\n const [isUploading, setIsUploading] = useState(false)\r\n const [error, setError] = useState<string | null>(null)\r\n const fileInputRef = useRef<HTMLInputElement>(null)\r\n\r\n // Handle file validation\r\n const validateFiles = useCallback(\r\n (files: File[]): { valid: File[]; errors: string[] } => {\r\n const valid: File[] = []\r\n const errors: string[] = []\r\n\r\n // Check max files\r\n if (attachments.length + files.length > maxFiles) {\r\n errors.push(`Maximum ${maxFiles} files allowed`)\r\n return { valid, errors }\r\n }\r\n\r\n files.forEach((file) => {\r\n // Check file size\r\n const sizeMB = file.size / (1024 * 1024)\r\n if (sizeMB > maxSizeMB) {\r\n errors.push(`${file.name} is too large (max ${maxSizeMB}MB)`)\r\n return\r\n }\r\n\r\n // Check file type\r\n if (allowedTypes && !allowedTypes.some((type) => file.type.match(type))) {\r\n errors.push(`${file.name} has invalid file type`)\r\n return\r\n }\r\n\r\n valid.push(file)\r\n })\r\n\r\n return { valid, errors }\r\n },\r\n [attachments.length, maxFiles, maxSizeMB, allowedTypes]\r\n )\r\n\r\n // Handle file upload\r\n const handleUpload = useCallback(\r\n async (files: File[]) => {\r\n const { valid, errors } = validateFiles(files)\r\n\r\n if (errors.length > 0) {\r\n setError(errors.join(', '))\r\n setTimeout(() => setError(null), 5000)\r\n return\r\n }\r\n\r\n if (valid.length === 0) return\r\n\r\n setIsUploading(true)\r\n setError(null)\r\n\r\n try {\r\n await onUpload?.(valid)\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Upload failed')\r\n setTimeout(() => setError(null), 5000)\r\n } finally {\r\n setIsUploading(false)\r\n }\r\n },\r\n [validateFiles, onUpload]\r\n )\r\n\r\n // Handle drag events\r\n const handleDragEnter = useCallback((e: React.DragEvent) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n setIsDragging(true)\r\n }, [])\r\n\r\n const handleDragLeave = useCallback((e: React.DragEvent) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n setIsDragging(false)\r\n }, [])\r\n\r\n const handleDragOver = useCallback((e: React.DragEvent) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }, [])\r\n\r\n const handleDrop = useCallback(\r\n (e: React.DragEvent) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n setIsDragging(false)\r\n\r\n const files = Array.from(e.dataTransfer.files)\r\n handleUpload(files)\r\n },\r\n [handleUpload]\r\n )\r\n\r\n // Handle file input change\r\n const handleFileInputChange = useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files ? Array.from(e.target.files) : []\r\n handleUpload(files)\r\n // Reset input\r\n if (fileInputRef.current) {\r\n fileInputRef.current.value = ''\r\n }\r\n },\r\n [handleUpload]\r\n )\r\n\r\n // Handle click to open file dialog\r\n const handleClick = useCallback(() => {\r\n fileInputRef.current?.click()\r\n }, [])\r\n\r\n // Handle delete\r\n const handleDelete = useCallback(\r\n (attachmentId: string) => {\r\n if (confirm('Are you sure you want to delete this attachment?')) {\r\n onDelete?.(attachmentId)\r\n }\r\n },\r\n [onDelete]\r\n )\r\n\r\n return (\r\n <div className=\"attachment-uploader\">\r\n {/* Drop zone */}\r\n <div\r\n className={`attachment-dropzone ${isDragging ? 'dragging' : ''} ${isUploading ? 'uploading' : ''}`}\r\n onDragEnter={handleDragEnter}\r\n onDragLeave={handleDragLeave}\r\n onDragOver={handleDragOver}\r\n onDrop={handleDrop}\r\n onClick={handleClick}\r\n >\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n multiple\r\n onChange={handleFileInputChange}\r\n style={{ display: 'none' }}\r\n accept={allowedTypes?.join(',')}\r\n />\r\n\r\n <div className=\"attachment-dropzone-content\">\r\n {isUploading ? (\r\n <>\r\n <div className=\"attachment-spinner\" />\r\n <p className=\"attachment-dropzone-text\">Uploading...</p>\r\n </>\r\n ) : (\r\n <>\r\n <svg\r\n width=\"48\"\r\n height=\"48\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"attachment-dropzone-icon\"\r\n >\r\n <path\r\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\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <path\r\n d=\"M17 8L12 3L7 8\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <path\r\n d=\"M12 3V15\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n <p className=\"attachment-dropzone-text\">\r\n {isDragging ? 'Drop files here' : 'Drag & drop files here'}\r\n </p>\r\n <p className=\"attachment-dropzone-subtext\">or click to browse</p>\r\n <p className=\"attachment-dropzone-info\">\r\n Max {maxSizeMB}MB • {attachments.length}/{maxFiles} files\r\n </p>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Error message */}\r\n {error && (\r\n <div className=\"attachment-error\">\r\n <span className=\"attachment-error-icon\">⚠️</span>\r\n <span className=\"attachment-error-text\">{error}</span>\r\n </div>\r\n )}\r\n\r\n {/* Attachment list */}\r\n {attachments.length > 0 && (\r\n <div className=\"attachment-list\">\r\n {attachments.map((attachment) => (\r\n <div key={attachment.id} className=\"attachment-item\">\r\n <div className=\"attachment-preview\">\r\n {isImage(attachment.type) && attachment.url ? (\r\n <img\r\n src={attachment.thumbnailUrl || attachment.url}\r\n alt={attachment.name}\r\n className=\"attachment-thumbnail\"\r\n />\r\n ) : (\r\n <div className=\"attachment-icon\">{getFileIcon(attachment.type)}</div>\r\n )}\r\n </div>\r\n\r\n <div className=\"attachment-info\">\r\n <a\r\n href={attachment.url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"attachment-name\"\r\n title={attachment.name}\r\n >\r\n {attachment.name}\r\n </a>\r\n <div className=\"attachment-meta\">\r\n <span className=\"attachment-size\">{formatFileSize(attachment.size)}</span>\r\n <span className=\"attachment-separator\">•</span>\r\n <span className=\"attachment-date\">\r\n {new Date(attachment.uploadedAt).toLocaleDateString()}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <button\r\n onClick={() => handleDelete(attachment.id)}\r\n className=\"attachment-delete\"\r\n title=\"Delete attachment\"\r\n type=\"button\"\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 xmlns=\"http://www.w3.org/2000/svg\"\r\n >\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 strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","/**\r\n * CardDetailModal - Premium full-featured card detail modal\r\n * Features: Details tab, Comments, Activity log, AI suggestions\r\n */\r\n\r\nimport { useState, useCallback } from 'react'\r\nimport { Portal } from '../Portal'\r\nimport { AttachmentUploader } from '../Attachments'\r\nimport type { Card, User, Comment, Activity, Insight, AssigneeSuggestion, Attachment } from '../../types'\r\nimport './card-detail-modal.css'\r\n\r\nexport interface CardDetailModalProps {\r\n /** Card to display */\r\n card: Card | null\r\n\r\n /** Whether modal is open */\r\n isOpen: boolean\r\n\r\n /** Close callback */\r\n onClose: () => void\r\n\r\n /** Update card callback */\r\n onUpdate?: (cardId: string, updates: Partial<Card>) => void\r\n\r\n /** Delete card callback */\r\n onDelete?: (cardId: string) => void\r\n\r\n /** Available users for assignment */\r\n availableUsers?: User[]\r\n\r\n /** Comments for this card */\r\n comments?: Comment[]\r\n\r\n /** Activity log for this card */\r\n activities?: Activity[]\r\n\r\n /** AI insights for this card */\r\n aiInsights?: Insight[]\r\n\r\n /** Attachments for this card */\r\n attachments?: Attachment[]\r\n\r\n /** Add comment callback */\r\n onAddComment?: (cardId: string, content: string) => void\r\n\r\n /** Delete comment callback */\r\n onDeleteComment?: (commentId: string) => void\r\n\r\n /** Upload attachments callback */\r\n onUploadAttachments?: (cardId: string, files: File[]) => Promise<void> | void\r\n\r\n /** Delete attachment callback */\r\n onDeleteAttachment?: (attachmentId: string) => void\r\n\r\n /** Current user ID */\r\n currentUserId?: string\r\n\r\n /** AI: Suggest assignee */\r\n onSuggestAssignee?: (card: Card) => Promise<AssigneeSuggestion[]>\r\n\r\n /** AI: Generate subtasks */\r\n onGenerateSubtasks?: (card: Card) => Promise<Omit<Card, 'id'>[]>\r\n\r\n /** AI: Estimate effort */\r\n onEstimateEffort?: (card: Card) => Promise<{ hours: number; confidence: number }>\r\n}\r\n\r\ntype TabType = 'details' | 'comments' | 'activity' | 'attachments' | 'ai'\r\n\r\nexport function CardDetailModal({\r\n card,\r\n isOpen,\r\n onClose,\r\n onUpdate,\r\n onDelete,\r\n availableUsers = [],\r\n comments = [],\r\n activities = [],\r\n aiInsights = [],\r\n attachments = [],\r\n onAddComment,\r\n onDeleteComment,\r\n onUploadAttachments,\r\n onDeleteAttachment,\r\n onSuggestAssignee,\r\n onGenerateSubtasks,\r\n onEstimateEffort,\r\n currentUserId = 'user-1',\r\n}: CardDetailModalProps) {\r\n const [activeTab, setActiveTab] = useState<TabType>('details')\r\n const [isEditing, setIsEditing] = useState(false)\r\n const [editedCard, setEditedCard] = useState<Partial<Card>>({})\r\n const [newComment, setNewComment] = useState('')\r\n const [aiLoading, setAiLoading] = useState(false)\r\n const [aiSuggestions, setAiSuggestions] = useState<{\r\n assignees?: AssigneeSuggestion[]\r\n subtasks?: Omit<Card, 'id'>[]\r\n effort?: { hours: number; confidence: number }\r\n }>({})\r\n\r\n if (!isOpen || !card) return null\r\n\r\n const handleClose = useCallback(() => {\r\n setIsEditing(false)\r\n setEditedCard({})\r\n setActiveTab('details')\r\n setNewComment('')\r\n setAiSuggestions({})\r\n onClose()\r\n }, [onClose])\r\n\r\n const handleSave = useCallback(() => {\r\n if (onUpdate && Object.keys(editedCard).length > 0) {\r\n onUpdate(card.id, editedCard)\r\n setEditedCard({})\r\n setIsEditing(false)\r\n }\r\n }, [card.id, editedCard, onUpdate])\r\n\r\n const handleDelete = useCallback(() => {\r\n if (\r\n onDelete &&\r\n window.confirm('Are you sure you want to delete this card?')\r\n ) {\r\n onDelete(card.id)\r\n handleClose()\r\n }\r\n }, [card.id, onDelete, handleClose])\r\n\r\n const handleAddComment = useCallback(() => {\r\n if (onAddComment && newComment.trim()) {\r\n onAddComment(card.id, newComment.trim())\r\n setNewComment('')\r\n }\r\n }, [card.id, newComment, onAddComment])\r\n\r\n const handleSuggestAssignee = useCallback(async () => {\r\n if (!onSuggestAssignee) return\r\n setAiLoading(true)\r\n try {\r\n const suggestions = await onSuggestAssignee(card)\r\n setAiSuggestions((prev) => ({ ...prev, assignees: suggestions }))\r\n } catch (error) {\r\n console.error('Failed to suggest assignee:', error)\r\n } finally {\r\n setAiLoading(false)\r\n }\r\n }, [card, onSuggestAssignee])\r\n\r\n const handleGenerateSubtasks = useCallback(async () => {\r\n if (!onGenerateSubtasks) return\r\n setAiLoading(true)\r\n try {\r\n const subtasks = await onGenerateSubtasks(card)\r\n setAiSuggestions((prev) => ({ ...prev, subtasks }))\r\n } catch (error) {\r\n console.error('Failed to generate subtasks:', error)\r\n } finally {\r\n setAiLoading(false)\r\n }\r\n }, [card, onGenerateSubtasks])\r\n\r\n const handleEstimateEffort = useCallback(async () => {\r\n if (!onEstimateEffort) return\r\n setAiLoading(true)\r\n try {\r\n const effort = await onEstimateEffort(card)\r\n setAiSuggestions((prev) => ({ ...prev, effort }))\r\n } catch (error) {\r\n console.error('Failed to estimate effort:', error)\r\n } finally {\r\n setAiLoading(false)\r\n }\r\n }, [card, onEstimateEffort])\r\n\r\n const currentCard = { ...card, ...editedCard }\r\n\r\n const assignedUsers = availableUsers.filter((user) =>\r\n currentCard.assignedUserIds?.includes(user.id)\r\n )\r\n\r\n return (\r\n <Portal>\r\n <div className=\"card-detail-overlay\" onClick={handleClose}>\r\n <div\r\n className=\"card-detail-modal\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {/* Header */}\r\n <div className=\"card-detail-header\">\r\n <div className=\"card-detail-header-left\">\r\n <div\r\n className=\"card-detail-priority-dot\"\r\n style={{\r\n background:\r\n currentCard.priority === 'URGENT'\r\n ? '#EF4444'\r\n : currentCard.priority === 'HIGH'\r\n ? '#F59E0B'\r\n : currentCard.priority === 'MEDIUM'\r\n ? '#3B82F6'\r\n : '#6B7280',\r\n }}\r\n />\r\n {isEditing ? (\r\n <input\r\n type=\"text\"\r\n value={editedCard.title ?? currentCard.title}\r\n onChange={(e) =>\r\n setEditedCard({ ...editedCard, title: e.target.value })\r\n }\r\n className=\"card-detail-title-input\"\r\n placeholder=\"Card title\"\r\n />\r\n ) : (\r\n <h2 className=\"card-detail-title\">{currentCard.title}</h2>\r\n )}\r\n </div>\r\n\r\n <div className=\"card-detail-header-actions\">\r\n {isEditing ? (\r\n <>\r\n <button\r\n onClick={handleSave}\r\n className=\"card-detail-btn card-detail-btn-primary\"\r\n >\r\n Save\r\n </button>\r\n <button\r\n onClick={() => {\r\n setIsEditing(false)\r\n setEditedCard({})\r\n }}\r\n className=\"card-detail-btn\"\r\n >\r\n Cancel\r\n </button>\r\n </>\r\n ) : (\r\n <button\r\n onClick={() => setIsEditing(true)}\r\n className=\"card-detail-btn\"\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=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" />\r\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" />\r\n </svg>\r\n Edit\r\n </button>\r\n )}\r\n\r\n <button onClick={handleDelete} className=\"card-detail-btn card-detail-btn-danger\">\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 <polyline points=\"3 6 5 6 21 6\" />\r\n <path d=\"M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2\" />\r\n </svg>\r\n Delete\r\n </button>\r\n\r\n <button onClick={handleClose} className=\"card-detail-btn-close\">\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 >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"card-detail-tabs\">\r\n <button\r\n onClick={() => setActiveTab('details')}\r\n className={`card-detail-tab ${activeTab === 'details' ? 'active' : ''}`}\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=\"M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z\" />\r\n <polyline points=\"14 2 14 8 20 8\" />\r\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\r\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\r\n <polyline points=\"10 9 9 9 8 9\" />\r\n </svg>\r\n Details\r\n </button>\r\n\r\n <button\r\n onClick={() => setActiveTab('comments')}\r\n className={`card-detail-tab ${activeTab === 'comments' ? 'active' : ''}`}\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=\"M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z\" />\r\n </svg>\r\n Comments\r\n {comments.length > 0 && (\r\n <span className=\"card-detail-tab-badge\">{comments.length}</span>\r\n )}\r\n </button>\r\n\r\n <button\r\n onClick={() => setActiveTab('activity')}\r\n className={`card-detail-tab ${activeTab === 'activity' ? 'active' : ''}`}\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 <polyline points=\"22 12 18 12 15 21 9 3 6 12 2 12\" />\r\n </svg>\r\n Activity\r\n {activities.length > 0 && (\r\n <span className=\"card-detail-tab-badge\">{activities.length}</span>\r\n )}\r\n </button>\r\n\r\n <button\r\n onClick={() => setActiveTab('attachments')}\r\n className={`card-detail-tab ${activeTab === 'attachments' ? 'active' : ''}`}\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=\"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 Attachments\r\n {attachments.length > 0 && (\r\n <span className=\"card-detail-tab-badge\">{attachments.length}</span>\r\n )}\r\n </button>\r\n\r\n <button\r\n onClick={() => setActiveTab('ai')}\r\n className={`card-detail-tab ${activeTab === 'ai' ? 'active' : ''}`}\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 AI Insights\r\n <span className=\"card-detail-tab-badge card-detail-tab-badge-ai\">\r\n AI\r\n </span>\r\n </button>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"card-detail-content\">\r\n {/* DETAILS TAB */}\r\n {activeTab === 'details' && (\r\n <div className=\"card-detail-details\">\r\n {/* Description */}\r\n <div className=\"card-detail-section\">\r\n <label className=\"card-detail-label\">Description</label>\r\n {isEditing ? (\r\n <textarea\r\n value={editedCard.description ?? currentCard.description ?? ''}\r\n onChange={(e) =>\r\n setEditedCard({ ...editedCard, description: e.target.value })\r\n }\r\n className=\"card-detail-textarea\"\r\n placeholder=\"Add a description...\"\r\n rows={4}\r\n />\r\n ) : (\r\n <p className=\"card-detail-text\">\r\n {currentCard.description || 'No description'}\r\n </p>\r\n )}\r\n </div>\r\n\r\n {/* Assignees */}\r\n <div className=\"card-detail-section\">\r\n <label className=\"card-detail-label\">Assigned To</label>\r\n {isEditing ? (\r\n <select\r\n multiple\r\n value={editedCard.assignedUserIds ?? currentCard.assignedUserIds ?? []}\r\n onChange={(e) => {\r\n const selected = Array.from(e.target.selectedOptions, (option) => option.value)\r\n setEditedCard({\r\n ...editedCard,\r\n assignedUserIds: selected,\r\n })\r\n }}\r\n className=\"card-detail-textarea\"\r\n style={{ height: '120px', padding: '8px 12px' }}\r\n >\r\n {availableUsers.map((user) => (\r\n <option key={user.id} value={user.id}>\r\n {user.name}\r\n </option>\r\n ))}\r\n </select>\r\n ) : (\r\n <div className=\"card-detail-users\">\r\n {assignedUsers.length > 0 ? (\r\n assignedUsers.map((user) => (\r\n <div key={user.id} className=\"card-detail-user\">\r\n <div\r\n className=\"card-detail-user-avatar\"\r\n style={{ background: user.color }}\r\n >\r\n {user.initials}\r\n </div>\r\n <span>{user.name}</span>\r\n </div>\r\n ))\r\n ) : (\r\n <span className=\"card-detail-empty\">Unassigned</span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Priority */}\r\n <div className=\"card-detail-section\">\r\n <label className=\"card-detail-label\">Priority</label>\r\n {isEditing ? (\r\n <select\r\n value={editedCard.priority ?? currentCard.priority ?? ''}\r\n onChange={(e) =>\r\n setEditedCard({\r\n ...editedCard,\r\n priority: (e.target.value || undefined) as any,\r\n })\r\n }\r\n className=\"card-detail-textarea\"\r\n style={{ height: 'auto', padding: '8px 12px' }}\r\n >\r\n <option value=\"\">None</option>\r\n <option value=\"LOW\">LOW</option>\r\n <option value=\"MEDIUM\">MEDIUM</option>\r\n <option value=\"HIGH\">HIGH</option>\r\n <option value=\"URGENT\">URGENT</option>\r\n </select>\r\n ) : (\r\n <div className=\"card-detail-priority\">\r\n <div\r\n className=\"card-detail-priority-dot\"\r\n style={{\r\n background:\r\n currentCard.priority === 'URGENT'\r\n ? '#EF4444'\r\n : currentCard.priority === 'HIGH'\r\n ? '#F59E0B'\r\n : currentCard.priority === 'MEDIUM'\r\n ? '#3B82F6'\r\n : '#6B7280',\r\n }}\r\n />\r\n <span>{currentCard.priority || 'None'}</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Labels */}\r\n <div className=\"card-detail-section\">\r\n <label className=\"card-detail-label\">Labels</label>\r\n <div className=\"card-detail-labels\">\r\n {currentCard.labels && currentCard.labels.length > 0 ? (\r\n currentCard.labels.map((label) => (\r\n <span key={label} className=\"card-detail-label-tag\">\r\n {label}\r\n </span>\r\n ))\r\n ) : (\r\n <span className=\"card-detail-empty\">No labels</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Dates */}\r\n <div className=\"card-detail-section-row\">\r\n <div className=\"card-detail-section\">\r\n <label className=\"card-detail-label\">Start Date</label>\r\n {isEditing ? (\r\n <input\r\n type=\"date\"\r\n value={\r\n editedCard.startDate\r\n ? new Date(editedCard.startDate).toISOString().split('T')[0]\r\n : currentCard.startDate\r\n ? new Date(currentCard.startDate).toISOString().split('T')[0]\r\n : ''\r\n }\r\n onChange={(e) =>\r\n setEditedCard({\r\n ...editedCard,\r\n startDate: e.target.value || undefined,\r\n })\r\n }\r\n className=\"card-detail-textarea\"\r\n style={{ height: 'auto', padding: '8px 12px' }}\r\n />\r\n ) : (\r\n <span className=\"card-detail-text\">\r\n {currentCard.startDate\r\n ? new Date(currentCard.startDate).toLocaleDateString()\r\n : 'Not set'}\r\n </span>\r\n )}\r\n </div>\r\n\r\n <div className=\"card-detail-section\">\r\n <label className=\"card-detail-label\">End Date</label>\r\n {isEditing ? (\r\n <input\r\n type=\"date\"\r\n value={\r\n editedCard.endDate\r\n ? new Date(editedCard.endDate).toISOString().split('T')[0]\r\n : currentCard.endDate\r\n ? new Date(currentCard.endDate).toISOString().split('T')[0]\r\n : ''\r\n }\r\n onChange={(e) =>\r\n setEditedCard({\r\n ...editedCard,\r\n endDate: e.target.value || undefined,\r\n })\r\n }\r\n className=\"card-detail-textarea\"\r\n style={{ height: 'auto', padding: '8px 12px' }}\r\n />\r\n ) : (\r\n <span className=\"card-detail-text\">\r\n {currentCard.endDate\r\n ? new Date(currentCard.endDate).toLocaleDateString()\r\n : 'Not set'}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Estimated Time */}\r\n <div className=\"card-detail-section\">\r\n <label className=\"card-detail-label\">Estimated Hours</label>\r\n {isEditing ? (\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n step=\"0.5\"\r\n value={editedCard.estimatedTime ?? currentCard.estimatedTime ?? ''}\r\n onChange={(e) =>\r\n setEditedCard({\r\n ...editedCard,\r\n estimatedTime: e.target.value ? parseFloat(e.target.value) : undefined,\r\n })\r\n }\r\n className=\"card-detail-textarea\"\r\n style={{ height: 'auto', padding: '8px 12px' }}\r\n placeholder=\"Enter hours\"\r\n />\r\n ) : (\r\n <span className=\"card-detail-text\">\r\n {currentCard.estimatedTime || 'Not estimated'}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Dependencies */}\r\n <div className=\"card-detail-section\">\r\n <label className=\"card-detail-label\">Dependencies</label>\r\n <div className=\"card-detail-dependencies\">\r\n {currentCard.dependencies && currentCard.dependencies.length > 0 ? (\r\n currentCard.dependencies.map((dep) => {\r\n const depId = typeof dep === 'string' ? dep : dep.taskId\r\n return (\r\n <span key={depId} className=\"card-detail-dependency\">\r\n Card #{depId.slice(-4)}\r\n </span>\r\n )\r\n })\r\n ) : (\r\n <span className=\"card-detail-empty\">No dependencies</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Metadata */}\r\n <div className=\"card-detail-section\">\r\n <label className=\"card-detail-label\">Created</label>\r\n <span className=\"card-detail-text\">\r\n {currentCard.createdAt\r\n ? new Date(currentCard.createdAt).toLocaleString()\r\n : 'Unknown'}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* COMMENTS TAB */}\r\n {activeTab === 'comments' && (\r\n <div className=\"card-detail-comments\">\r\n {/* New Comment */}\r\n <div className=\"card-detail-comment-form\">\r\n <textarea\r\n value={newComment}\r\n onChange={(e) => setNewComment(e.target.value)}\r\n className=\"card-detail-comment-textarea\"\r\n placeholder=\"Write a comment...\"\r\n rows={3}\r\n />\r\n <button\r\n onClick={handleAddComment}\r\n disabled={!newComment.trim()}\r\n className=\"card-detail-btn card-detail-btn-primary\"\r\n >\r\n Add Comment\r\n </button>\r\n </div>\r\n\r\n {/* Comments List */}\r\n <div className=\"card-detail-comments-list\">\r\n {comments.length > 0 ? (\r\n comments.map((comment) => {\r\n const author = availableUsers.find((u) => u.id === comment.authorId)\r\n return (\r\n <div key={comment.id} className=\"card-detail-comment\">\r\n <div className=\"card-detail-comment-header\">\r\n <div className=\"card-detail-comment-author\">\r\n {author && (\r\n <div\r\n className=\"card-detail-user-avatar\"\r\n style={{ background: author.color }}\r\n >\r\n {author.initials}\r\n </div>\r\n )}\r\n <div>\r\n <div className=\"card-detail-comment-author-name\">\r\n {author?.name || 'Unknown'}\r\n </div>\r\n <div className=\"card-detail-comment-time\">\r\n {new Date(comment.createdAt).toLocaleString()}\r\n </div>\r\n </div>\r\n </div>\r\n {onDeleteComment && (\r\n <button\r\n onClick={() => onDeleteComment(comment.id)}\r\n className=\"card-detail-comment-delete\"\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n >\r\n <polyline points=\"3 6 5 6 21 6\" />\r\n <path d=\"M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2\" />\r\n </svg>\r\n </button>\r\n )}\r\n </div>\r\n <p className=\"card-detail-comment-content\">{comment.content}</p>\r\n </div>\r\n )\r\n })\r\n ) : (\r\n <div className=\"card-detail-empty-state\">\r\n <svg\r\n width=\"48\"\r\n height=\"48\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.5\"\r\n >\r\n <path d=\"M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z\" />\r\n </svg>\r\n <p>No comments yet</p>\r\n <span>Be the first to comment</span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ACTIVITY TAB */}\r\n {activeTab === 'activity' && (\r\n <div className=\"card-detail-activity\">\r\n {activities.length > 0 ? (\r\n <div className=\"card-detail-activity-list\">\r\n {activities.map((activity) => {\r\n const user = availableUsers.find((u) => u.id === activity.userId)\r\n return (\r\n <div key={activity.id} className=\"card-detail-activity-item\">\r\n <div className=\"card-detail-activity-icon\">\r\n {activity.type.includes('CREATED') && '➕'}\r\n {activity.type.includes('UPDATED') && '✏️'}\r\n {activity.type.includes('MOVED') && '➡️'}\r\n {activity.type.includes('DELETED') && '🗑️'}\r\n {activity.type.includes('COMMENT') && '💬'}\r\n {activity.type.includes('ASSIGNED') && '👤'}\r\n {activity.type.includes('PRIORITY') && '🎯'}\r\n {activity.type.includes('LABEL') && '🏷️'}\r\n {activity.type.includes('ATTACHMENT') && '📎'}\r\n </div>\r\n <div className=\"card-detail-activity-content\">\r\n <div className=\"card-detail-activity-text\">\r\n <strong>{user?.name || 'Unknown'}</strong>{' '}\r\n {activity.type.replace(/_/g, ' ').toLowerCase()}\r\n {activity.newValue && (\r\n <span className=\"card-detail-activity-value\">\r\n {' '}\r\n to <strong>{activity.newValue}</strong>\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"card-detail-activity-time\">\r\n {new Date(activity.timestamp).toLocaleString()}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n })}\r\n </div>\r\n ) : (\r\n <div className=\"card-detail-empty-state\">\r\n <svg\r\n width=\"48\"\r\n height=\"48\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.5\"\r\n >\r\n <polyline points=\"22 12 18 12 15 21 9 3 6 12 2 12\" />\r\n </svg>\r\n <p>No activity yet</p>\r\n <span>Activity will appear here</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* ATTACHMENTS TAB */}\r\n {activeTab === 'attachments' && (\r\n <div className=\"card-detail-attachments\">\r\n <AttachmentUploader\r\n cardId={card.id}\r\n attachments={attachments}\r\n onUpload={onUploadAttachments ? (files) => onUploadAttachments(card.id, files) : undefined}\r\n onDelete={onDeleteAttachment}\r\n currentUserId={currentUserId}\r\n maxSizeMB={10}\r\n maxFiles={20}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* AI TAB */}\r\n {activeTab === 'ai' && (\r\n <div className=\"card-detail-ai\">\r\n {/* AI Actions */}\r\n <div className=\"card-detail-ai-actions\">\r\n <h3 className=\"card-detail-ai-heading\">AI-Powered Suggestions</h3>\r\n\r\n <button\r\n onClick={handleSuggestAssignee}\r\n disabled={aiLoading || !onSuggestAssignee}\r\n className=\"card-detail-ai-btn\"\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=\"M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2\" />\r\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\r\n </svg>\r\n Suggest Best Assignee\r\n </button>\r\n\r\n <button\r\n onClick={handleGenerateSubtasks}\r\n disabled={aiLoading || !onGenerateSubtasks}\r\n className=\"card-detail-ai-btn\"\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=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\r\n <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\r\n <line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\" />\r\n <line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\" />\r\n <line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\" />\r\n </svg>\r\n Generate Subtasks\r\n </button>\r\n\r\n <button\r\n onClick={handleEstimateEffort}\r\n disabled={aiLoading || !onEstimateEffort}\r\n className=\"card-detail-ai-btn\"\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 6 12 12 16 14\" />\r\n </svg>\r\n Estimate Effort\r\n </button>\r\n </div>\r\n\r\n {/* AI Suggestions Results */}\r\n {aiSuggestions.assignees && (\r\n <div className=\"card-detail-ai-results\">\r\n <h4>Assignee Suggestions</h4>\r\n {aiSuggestions.assignees.map((suggestion, index) => {\r\n const user = availableUsers.find((u) => u.id === suggestion.userId)\r\n return (\r\n <div key={index} className=\"card-detail-ai-suggestion\">\r\n {user && (\r\n <div\r\n className=\"card-detail-user-avatar\"\r\n style={{ background: user.color }}\r\n >\r\n {user.initials}\r\n </div>\r\n )}\r\n <div>\r\n <div className=\"card-detail-ai-suggestion-name\">\r\n {user?.name}\r\n </div>\r\n <div className=\"card-detail-ai-suggestion-reason\">\r\n {suggestion.reasoning}\r\n </div>\r\n <div className=\"card-detail-ai-suggestion-confidence\">\r\n Confidence: {(suggestion.confidence * 100).toFixed(0)}%\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n })}\r\n </div>\r\n )}\r\n\r\n {aiSuggestions.subtasks && (\r\n <div className=\"card-detail-ai-results\">\r\n <h4>Suggested Subtasks</h4>\r\n {aiSuggestions.subtasks.map((subtask, index) => (\r\n <div key={index} className=\"card-detail-ai-subtask\">\r\n <div className=\"card-detail-ai-subtask-title\">\r\n {subtask.title}\r\n </div>\r\n {subtask.description && (\r\n <div className=\"card-detail-ai-subtask-desc\">\r\n {subtask.description}\r\n </div>\r\n )}\r\n {subtask.estimatedTime && (\r\n <div className=\"card-detail-ai-subtask-time\">\r\n Est: {subtask.estimatedTime}h\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {aiSuggestions.effort && (\r\n <div className=\"card-detail-ai-results\">\r\n <h4>Effort Estimate</h4>\r\n <div className=\"card-detail-ai-effort\">\r\n <div className=\"card-detail-ai-effort-hours\">\r\n {aiSuggestions.effort.hours} hours\r\n </div>\r\n <div className=\"card-detail-ai-effort-confidence\">\r\n Confidence: {(aiSuggestions.effort.confidence * 100).toFixed(0)}%\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* AI Insights */}\r\n {aiInsights.length > 0 && (\r\n <div className=\"card-detail-ai-insights\">\r\n <h4>AI Insights</h4>\r\n {aiInsights.map((insight) => (\r\n <div\r\n key={insight.id}\r\n className={`card-detail-ai-insight card-detail-ai-insight-${insight.severity.toLowerCase()}`}\r\n >\r\n <div className=\"card-detail-ai-insight-header\">\r\n <span className=\"card-detail-ai-insight-title\">\r\n {insight.title}\r\n </span>\r\n <span className=\"card-detail-ai-insight-severity\">\r\n {insight.severity}\r\n </span>\r\n </div>\r\n <p className=\"card-detail-ai-insight-desc\">\r\n {insight.description}\r\n </p>\r\n {insight.suggestedAction && (\r\n <div className=\"card-detail-ai-insight-action\">\r\n 💡 {insight.suggestedAction}\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {!aiSuggestions.assignees &&\r\n !aiSuggestions.subtasks &&\r\n !aiSuggestions.effort &&\r\n aiInsights.length === 0 && (\r\n <div className=\"card-detail-empty-state\">\r\n <svg\r\n width=\"48\"\r\n height=\"48\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.5\"\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 <p>AI Suggestions</p>\r\n <span>Click a button above to get AI-powered insights</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </Portal>\r\n )\r\n}\r\n","/**\r\n * CardDetailModal V2.0 - Premium task detail view\r\n *\r\n * Design Philosophy:\r\n * - Speed above all: <100ms open time\r\n * - Keyboard-first interaction\r\n * - Single vertical flow (no sidebars)\r\n * - Instant inline editing\r\n * - Zero friction UX\r\n *\r\n * ALL PHASES IMPLEMENTED:\r\n * ✅ Phase 1: Modal + Header + Metadata (COMPLETE)\r\n * ✅ Phase 2: Status & Priority selectors (COMPLETE)\r\n * ✅ Phase 3: Assignees & Labels selectors (COMPLETE)\r\n * ✅ Phase 4: Date picker & Time input (COMPLETE)\r\n * ✅ Phase 5: Markdown renderer (COMPLETE)\r\n * ✅ Phase 6: Animations & Accessibility polish (COMPLETE)\r\n */\r\n\r\nimport { useState, useCallback, useEffect, useRef } from 'react'\r\nimport ReactMarkdown from 'react-markdown'\r\nimport remarkGfm from 'remark-gfm'\r\nimport rehypeSanitize from 'rehype-sanitize'\r\nimport { Portal } from '../Portal'\r\nimport type { Card, User, Comment, Activity } from '../../types'\r\nimport './card-detail-modal-v2.css'\r\n\r\nexport interface CardDetailModalV2Props {\r\n /** Card to display */\r\n card: Card | null\r\n\r\n /** Whether modal is open */\r\n isOpen: boolean\r\n\r\n /** Close callback */\r\n onClose: () => void\r\n\r\n /** Update card callback */\r\n onUpdate?: (cardId: string, updates: Partial<Card>) => void\r\n\r\n /** Delete card callback */\r\n onDelete?: (cardId: string) => void\r\n\r\n /** Available users for assignment */\r\n availableUsers?: User[]\r\n\r\n /** Comments for this card */\r\n comments?: Comment[]\r\n\r\n /** Activity log for this card */\r\n activities?: Activity[]\r\n\r\n /** Add comment callback */\r\n onAddComment?: (cardId: string, content: string) => void\r\n\r\n /** Delete comment callback */\r\n onDeleteComment?: (commentId: string) => void\r\n\r\n /** Current user */\r\n currentUser?: User\r\n\r\n /** AI: Generate description */\r\n onAIGenerateDescription?: (card: Card) => Promise<string>\r\n\r\n /** AI: Create subtasks */\r\n onAICreateSubtasks?: (card: Card) => Promise<string[]>\r\n\r\n /** AI: Find similar tasks */\r\n onAIFindSimilar?: (card: Card) => Promise<Card[]>\r\n\r\n /** Available columns for status */\r\n availableColumns?: Array<{ id: string; title: string }>\r\n\r\n /** Available labels */\r\n availableLabels?: string[]\r\n}\r\n\r\ninterface Subtask {\r\n id: string\r\n title: string\r\n completed: boolean\r\n}\r\n\r\nconst PRIORITY_OPTIONS = ['LOW', 'MEDIUM', 'HIGH', 'URGENT'] as const\r\nconst STATUS_OPTIONS = ['todo', 'in-progress', 'review', 'done'] as const\r\n\r\nexport function CardDetailModalV2({\r\n card,\r\n isOpen,\r\n onClose,\r\n onUpdate,\r\n onDelete: _onDelete,\r\n availableUsers = [],\r\n comments = [],\r\n activities = [],\r\n onAddComment,\r\n onDeleteComment: _onDeleteComment,\r\n currentUser,\r\n onAIGenerateDescription: _onAIGenerateDescription,\r\n onAICreateSubtasks: _onAICreateSubtasks,\r\n onAIFindSimilar: _onAIFindSimilar,\r\n availableColumns = [],\r\n availableLabels = [],\r\n}: CardDetailModalV2Props) {\r\n // Local state - Initialize immediately from card prop to avoid render delay\r\n const [localCard, setLocalCard] = useState<Card | null>(card)\r\n\r\n const [isEditingDescription, setIsEditingDescription] = useState(false)\r\n const [subtasks, setSubtasks] = useState<Subtask[]>([])\r\n const [isAddingSubtask, setIsAddingSubtask] = useState(false)\r\n const [newSubtaskTitle, setNewSubtaskTitle] = useState('')\r\n const [commentText, setCommentText] = useState('')\r\n const [activityFilter, setActivityFilter] = useState<'all' | 'comments' | 'history'>('all')\r\n\r\n // Popover states\r\n const [showStatusMenu, setShowStatusMenu] = useState(false)\r\n const [showPriorityMenu, setShowPriorityMenu] = useState(false)\r\n const [showAssigneeMenu, setShowAssigneeMenu] = useState(false)\r\n const [showLabelMenu, setShowLabelMenu] = useState(false)\r\n const [showDatePicker, setShowDatePicker] = useState(false)\r\n const [showTimePicker, setShowTimePicker] = useState(false)\r\n\r\n // Refs\r\n const titleRef = useRef<HTMLHeadingElement>(null)\r\n const descriptionRef = useRef<HTMLTextAreaElement>(null)\r\n const commentRef = useRef<HTMLTextAreaElement>(null)\r\n const statusMenuRef = useRef<HTMLDivElement>(null)\r\n const priorityMenuRef = useRef<HTMLDivElement>(null)\r\n const assigneeMenuRef = useRef<HTMLDivElement>(null)\r\n const labelMenuRef = useRef<HTMLDivElement>(null)\r\n const datePickerRef = useRef<HTMLInputElement>(null)\r\n\r\n // Update local card when prop changes - THIS IS THE FIX!\r\n // Initialize local card immediately when card prop is available\r\n useEffect(() => {\r\n if (card && !localCard) {\r\n setLocalCard({ ...card })\r\n } else if (card && localCard && card.id !== localCard.id) {\r\n setLocalCard({ ...card })\r\n }\r\n }, [card, localCard])\r\n\r\n // Close popovers when clicking outside\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n const target = e.target as HTMLElement\r\n\r\n if (statusMenuRef.current && !statusMenuRef.current.contains(target)) {\r\n setShowStatusMenu(false)\r\n }\r\n if (priorityMenuRef.current && !priorityMenuRef.current.contains(target)) {\r\n setShowPriorityMenu(false)\r\n }\r\n if (assigneeMenuRef.current && !assigneeMenuRef.current.contains(target)) {\r\n setShowAssigneeMenu(false)\r\n }\r\n if (labelMenuRef.current && !labelMenuRef.current.contains(target)) {\r\n setShowLabelMenu(false)\r\n }\r\n }\r\n\r\n if (showStatusMenu || showPriorityMenu || showAssigneeMenu || showLabelMenu) {\r\n document.addEventListener('mousedown', handleClickOutside)\r\n return () => document.removeEventListener('mousedown', handleClickOutside)\r\n }\r\n\r\n return undefined\r\n }, [showStatusMenu, showPriorityMenu, showAssigneeMenu, showLabelMenu])\r\n\r\n // Keyboard shortcuts\r\n useEffect(() => {\r\n if (!isOpen) return\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n // Check if user is typing in an input/textarea\r\n const target = e.target as HTMLElement\r\n const isTyping =\r\n target.tagName === 'INPUT' ||\r\n target.tagName === 'TEXTAREA' ||\r\n target.isContentEditable\r\n\r\n // ESC - Close modal or menus\r\n if (e.key === 'Escape') {\r\n e.preventDefault()\r\n if (showStatusMenu || showPriorityMenu || showAssigneeMenu || showLabelMenu || showDatePicker || showTimePicker) {\r\n setShowStatusMenu(false)\r\n setShowPriorityMenu(false)\r\n setShowAssigneeMenu(false)\r\n setShowLabelMenu(false)\r\n setShowDatePicker(false)\r\n setShowTimePicker(false)\r\n } else if (!isTyping) {\r\n onClose()\r\n }\r\n return\r\n }\r\n\r\n // Ignore shortcuts if typing\r\n if (isTyping && e.key !== 'Escape') return\r\n\r\n const isMod = e.metaKey || e.ctrlKey\r\n\r\n // Single key shortcuts\r\n switch (e.key.toLowerCase()) {\r\n case 's':\r\n e.preventDefault()\r\n setShowStatusMenu(true)\r\n break\r\n case 'a':\r\n e.preventDefault()\r\n setShowAssigneeMenu(true)\r\n break\r\n case 'p':\r\n e.preventDefault()\r\n setShowPriorityMenu(true)\r\n break\r\n case 'l':\r\n e.preventDefault()\r\n setShowLabelMenu(true)\r\n break\r\n case 'd':\r\n if (!isMod) {\r\n e.preventDefault()\r\n setShowDatePicker(true)\r\n setTimeout(() => datePickerRef.current?.focus(), 0)\r\n }\r\n break\r\n case 'e':\r\n if (!isMod) {\r\n e.preventDefault()\r\n setShowTimePicker(true)\r\n }\r\n break\r\n case 'i':\r\n e.preventDefault()\r\n setIsEditingDescription(true)\r\n setTimeout(() => descriptionRef.current?.focus(), 0)\r\n break\r\n case 't':\r\n e.preventDefault()\r\n setIsAddingSubtask(true)\r\n break\r\n case 'c':\r\n e.preventDefault()\r\n commentRef.current?.focus()\r\n break\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', handleKeyDown)\r\n return () => window.removeEventListener('keydown', handleKeyDown)\r\n }, [isOpen, onClose, showStatusMenu, showPriorityMenu, showAssigneeMenu, showLabelMenu, showDatePicker, showTimePicker])\r\n\r\n\r\n // Handlers\r\n const handleTitleChange = useCallback(\r\n (e: React.FormEvent<HTMLHeadingElement>) => {\r\n const newTitle = e.currentTarget.textContent?.trim() || ''\r\n if (localCard && newTitle !== localCard.title) {\r\n const updated = { ...localCard, title: newTitle }\r\n setLocalCard(updated)\r\n onUpdate?.(localCard.id, { title: newTitle })\r\n }\r\n },\r\n [localCard, onUpdate]\r\n )\r\n\r\n const handleTitleKeyDown = useCallback(\r\n (e: React.KeyboardEvent<HTMLHeadingElement>) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault()\r\n e.currentTarget.blur()\r\n }\r\n if (e.key === 'Escape') {\r\n e.preventDefault()\r\n e.currentTarget.textContent = localCard?.title || ''\r\n e.currentTarget.blur()\r\n }\r\n },\r\n [localCard]\r\n )\r\n\r\n // Note: handleDescriptionChange removed - now handled inline in MarkdownEditor\r\n\r\n const handleDescriptionBlur = useCallback(() => {\r\n if (localCard && card && localCard.description !== card.description) {\r\n onUpdate?.(localCard.id, { description: localCard.description })\r\n }\r\n setIsEditingDescription(false)\r\n }, [localCard, card, onUpdate])\r\n\r\n const handleStatusChange = useCallback(\r\n (status: string) => {\r\n if (localCard) {\r\n const updated = { ...localCard, columnId: status }\r\n setLocalCard(updated)\r\n onUpdate?.(localCard.id, { columnId: status })\r\n setShowStatusMenu(false)\r\n }\r\n },\r\n [localCard, onUpdate]\r\n )\r\n\r\n const handlePriorityChange = useCallback(\r\n (priority: string) => {\r\n if (localCard) {\r\n const updated = { ...localCard, priority: priority as any }\r\n setLocalCard(updated)\r\n onUpdate?.(localCard.id, { priority: priority as any })\r\n setShowPriorityMenu(false)\r\n }\r\n },\r\n [localCard, onUpdate]\r\n )\r\n\r\n const handleToggleAssignee = useCallback(\r\n (userId: string) => {\r\n if (localCard) {\r\n const currentAssignees = localCard.assignedUserIds || []\r\n const newAssignees = currentAssignees.includes(userId)\r\n ? currentAssignees.filter((id) => id !== userId)\r\n : [...currentAssignees, userId]\r\n\r\n const updated = { ...localCard, assignedUserIds: newAssignees }\r\n setLocalCard(updated)\r\n onUpdate?.(localCard.id, { assignedUserIds: newAssignees })\r\n }\r\n },\r\n [localCard, onUpdate]\r\n )\r\n\r\n const handleToggleLabel = useCallback(\r\n (label: string) => {\r\n if (localCard) {\r\n const currentLabels = localCard.labels || []\r\n const newLabels = currentLabels.includes(label)\r\n ? currentLabels.filter((l) => l !== label)\r\n : [...currentLabels, label]\r\n\r\n const updated = { ...localCard, labels: newLabels }\r\n setLocalCard(updated)\r\n onUpdate?.(localCard.id, { labels: newLabels })\r\n }\r\n },\r\n [localCard, onUpdate]\r\n )\r\n\r\n const handleDateChange = useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (localCard) {\r\n const newDate = e.target.value\r\n const updated = { ...localCard, endDate: newDate }\r\n setLocalCard(updated)\r\n onUpdate?.(localCard.id, { endDate: newDate })\r\n setShowDatePicker(false)\r\n }\r\n },\r\n [localCard, onUpdate]\r\n )\r\n\r\n const handleTimeChange = useCallback(\r\n (hours: string) => {\r\n if (localCard) {\r\n const updated = { ...localCard, estimatedTime: parseFloat(hours) || 0 }\r\n setLocalCard(updated)\r\n onUpdate?.(localCard.id, { estimatedTime: parseFloat(hours) || 0 })\r\n }\r\n },\r\n [localCard, onUpdate]\r\n )\r\n\r\n const handleAddSubtask = useCallback(() => {\r\n if (newSubtaskTitle.trim()) {\r\n const newSubtask: Subtask = {\r\n id: `subtask-${Date.now()}`,\r\n title: newSubtaskTitle.trim(),\r\n completed: false,\r\n }\r\n setSubtasks([...subtasks, newSubtask])\r\n setNewSubtaskTitle('')\r\n setIsAddingSubtask(false)\r\n }\r\n }, [newSubtaskTitle, subtasks])\r\n\r\n const handleToggleSubtask = useCallback(\r\n (id: string) => {\r\n setSubtasks(\r\n subtasks.map((st) => (st.id === id ? { ...st, completed: !st.completed } : st))\r\n )\r\n },\r\n [subtasks]\r\n )\r\n\r\n const handleDeleteSubtask = useCallback(\r\n (id: string) => {\r\n setSubtasks(subtasks.filter((st) => st.id !== id))\r\n },\r\n [subtasks]\r\n )\r\n\r\n const handleSendComment = useCallback(() => {\r\n if (commentText.trim() && localCard && onAddComment) {\r\n onAddComment(localCard.id, commentText.trim())\r\n setCommentText('')\r\n }\r\n }, [commentText, localCard, onAddComment])\r\n\r\n const handleCommentKeyDown = useCallback(\r\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\r\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\r\n e.preventDefault()\r\n handleSendComment()\r\n }\r\n },\r\n [handleSendComment]\r\n )\r\n\r\n // Enhanced markdown renderer with GFM support\r\n const renderMarkdown = (text: string) => {\r\n return (\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeSanitize]}\r\n components={{\r\n a: ({ node, ...props }) => <a {...props} target=\"_blank\" rel=\"noopener noreferrer\" />,\r\n }}\r\n >\r\n {text}\r\n </ReactMarkdown>\r\n )\r\n }\r\n\r\n // Filter activities\r\n const filteredActivity = activities.filter((activity) => {\r\n if (activityFilter === 'comments') {\r\n return activity.type.includes('COMMENT')\r\n }\r\n if (activityFilter === 'history') {\r\n return !activity.type.includes('COMMENT')\r\n }\r\n return true\r\n })\r\n\r\n // CRITICAL FIX: Use card prop directly for early return check\r\n // Using localCard causes race condition with Portal mount + useEffect timing\r\n if (!isOpen || !card) {\r\n return null\r\n }\r\n\r\n // Use localCard if available (for live edits), fallback to card prop\r\n const displayCard = localCard || card\r\n\r\n const assignedUsers = availableUsers.filter((user) =>\r\n displayCard.assignedUserIds?.includes(user.id)\r\n )\r\n\r\n const completedSubtasksCount = subtasks.filter((st) => st.completed).length\r\n\r\n return (\r\n <Portal>\r\n <div\r\n className=\"modal-v2-backdrop\"\r\n onClick={onClose}\r\n style={{\r\n position: 'fixed',\r\n inset: '0',\r\n zIndex: 9999,\r\n background: 'rgba(0, 0, 0, 0.7)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n >\r\n <div\r\n className=\"modal-v2-container\"\r\n onClick={(e) => e.stopPropagation()}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"modal-title\"\r\n >\r\n {/* HEADER */}\r\n <header className=\"modal-v2-header\">\r\n <h1\r\n id=\"modal-title\"\r\n ref={titleRef}\r\n className=\"modal-v2-title\"\r\n contentEditable\r\n suppressContentEditableWarning\r\n onBlur={handleTitleChange}\r\n onKeyDown={handleTitleKeyDown}\r\n >\r\n {displayCard.title}\r\n </h1>\r\n\r\n <p className=\"modal-v2-ai-prompt\">\r\n <span className=\"modal-v2-ai-icon\">✨</span>\r\n Ask AI to write a description, create subtasks, or find similar tasks\r\n </p>\r\n\r\n <button className=\"modal-v2-close\" onClick={onClose} aria-label=\"Close\">\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 >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n </header>\r\n\r\n {/* COVER IMAGE */}\r\n {displayCard.coverImage && (\r\n <div className=\"modal-v2-cover\">\r\n <img\r\n src={displayCard.coverImage}\r\n alt={`Cover for ${displayCard.title}`}\r\n className=\"w-full max-h-96 object-cover\"\r\n onError={(e) => {\r\n e.currentTarget.style.display = 'none'\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* METADATA GRID */}\r\n <section className=\"modal-v2-metadata\">\r\n {/* STATUS FIELD */}\r\n <div className=\"modal-v2-field-wrapper\" ref={statusMenuRef}>\r\n <button\r\n className=\"modal-v2-field\"\r\n onClick={() => setShowStatusMenu(!showStatusMenu)}\r\n >\r\n <div className=\"modal-v2-field-label\">\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 <path d=\"M12 6v6l4 2\" />\r\n </svg>\r\n <span>Status</span>\r\n <kbd className=\"modal-v2-shortcut\">S</kbd>\r\n </div>\r\n <div className=\"modal-v2-field-value\">{displayCard.columnId || 'No status'}</div>\r\n </button>\r\n {showStatusMenu && (\r\n <div className=\"modal-v2-popover\">\r\n {(availableColumns.length > 0 ? availableColumns : STATUS_OPTIONS.map(s => ({ id: s, title: s }))).map((col) => (\r\n <button\r\n key={col.id}\r\n className={`modal-v2-popover-item ${\r\n displayCard.columnId === col.id ? 'active' : ''\r\n }`}\r\n onClick={() => handleStatusChange(col.id)}\r\n >\r\n {col.title}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* ASSIGNEES FIELD */}\r\n <div className=\"modal-v2-field-wrapper\" ref={assigneeMenuRef}>\r\n <button\r\n className=\"modal-v2-field\"\r\n onClick={() => setShowAssigneeMenu(!showAssigneeMenu)}\r\n >\r\n <div className=\"modal-v2-field-label\">\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=\"M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2\" />\r\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\r\n </svg>\r\n <span>Assignees</span>\r\n <kbd className=\"modal-v2-shortcut\">A</kbd>\r\n </div>\r\n <div className=\"modal-v2-field-value\">\r\n {assignedUsers.length > 0 ? (\r\n <div className=\"modal-v2-avatars\">\r\n {assignedUsers.map((user) => (\r\n <div\r\n key={user.id}\r\n className=\"modal-v2-avatar\"\r\n style={{ background: user.color }}\r\n title={user.name}\r\n >\r\n {user.initials}\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <span className=\"modal-v2-empty\">Empty</span>\r\n )}\r\n </div>\r\n </button>\r\n {showAssigneeMenu && (\r\n <div className=\"modal-v2-popover\">\r\n {availableUsers.map((user) => (\r\n <button\r\n key={user.id}\r\n className={`modal-v2-popover-item ${\r\n displayCard.assignedUserIds?.includes(user.id) ? 'active' : ''\r\n }`}\r\n onClick={() => handleToggleAssignee(user.id)}\r\n >\r\n <div\r\n className=\"modal-v2-avatar-small\"\r\n style={{ background: user.color }}\r\n >\r\n {user.initials}\r\n </div>\r\n {user.name}\r\n {displayCard.assignedUserIds?.includes(user.id) && (\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={{ marginLeft: 'auto' }}\r\n >\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* PRIORITY FIELD */}\r\n <div className=\"modal-v2-field-wrapper\" ref={priorityMenuRef}>\r\n <button\r\n className=\"modal-v2-field\"\r\n onClick={() => setShowPriorityMenu(!showPriorityMenu)}\r\n >\r\n <div className=\"modal-v2-field-label\">\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>Priority</span>\r\n <kbd className=\"modal-v2-shortcut\">P</kbd>\r\n </div>\r\n <div className=\"modal-v2-field-value\">\r\n {displayCard.priority || 'None'}\r\n </div>\r\n </button>\r\n {showPriorityMenu && (\r\n <div className=\"modal-v2-popover\">\r\n {PRIORITY_OPTIONS.map((priority) => (\r\n <button\r\n key={priority}\r\n className={`modal-v2-popover-item priority-${priority.toLowerCase()} ${\r\n displayCard.priority === priority ? 'active' : ''\r\n }`}\r\n onClick={() => handlePriorityChange(priority)}\r\n >\r\n {priority}\r\n </button>\r\n ))}\r\n <button\r\n className=\"modal-v2-popover-item\"\r\n onClick={() => handlePriorityChange('')}\r\n >\r\n None\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* LABELS FIELD */}\r\n <div className=\"modal-v2-field-wrapper\" ref={labelMenuRef}>\r\n <button\r\n className=\"modal-v2-field\"\r\n onClick={() => setShowLabelMenu(!showLabelMenu)}\r\n >\r\n <div className=\"modal-v2-field-label\">\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=\"M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z\" />\r\n <line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\" />\r\n </svg>\r\n <span>Labels</span>\r\n <kbd className=\"modal-v2-shortcut\">L</kbd>\r\n </div>\r\n <div className=\"modal-v2-field-value\">\r\n {displayCard.labels && displayCard.labels.length > 0 ? (\r\n <span>{displayCard.labels.join(', ')}</span>\r\n ) : (\r\n <span className=\"modal-v2-empty\">Empty</span>\r\n )}\r\n </div>\r\n </button>\r\n {showLabelMenu && (\r\n <div className=\"modal-v2-popover\">\r\n {(availableLabels.length > 0 ? availableLabels : ['Bug', 'Feature', 'Enhancement', 'Documentation']).map((label) => (\r\n <button\r\n key={label}\r\n className={`modal-v2-popover-item ${\r\n displayCard.labels?.includes(label) ? 'active' : ''\r\n }`}\r\n onClick={() => handleToggleLabel(label)}\r\n >\r\n {label}\r\n {displayCard.labels?.includes(label) && (\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={{ marginLeft: 'auto' }}\r\n >\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* DUE DATE FIELD */}\r\n <button\r\n className=\"modal-v2-field\"\r\n onClick={() => {\r\n setShowDatePicker(!showDatePicker)\r\n setTimeout(() => datePickerRef.current?.showPicker?.(), 0)\r\n }}\r\n >\r\n <div className=\"modal-v2-field-label\">\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=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\r\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\r\n </svg>\r\n <span>Due Date</span>\r\n <kbd className=\"modal-v2-shortcut\">D</kbd>\r\n </div>\r\n <div className=\"modal-v2-field-value\">\r\n {displayCard.endDate\r\n ? new Date(displayCard.endDate).toLocaleDateString()\r\n : 'Not set'}\r\n </div>\r\n <input\r\n ref={datePickerRef}\r\n type=\"date\"\r\n value={\r\n typeof displayCard.endDate === 'string'\r\n ? displayCard.endDate.split('T')[0]\r\n : displayCard.endDate\r\n ? (() => {\r\n // Convert Date to YYYY-MM-DD using UTC to avoid timezone shifts\r\n const d = new Date(displayCard.endDate)\r\n const year = d.getUTCFullYear()\r\n const month = String(d.getUTCMonth() + 1).padStart(2, '0')\r\n const day = String(d.getUTCDate()).padStart(2, '0')\r\n return `${year}-${month}-${day}`\r\n })()\r\n : ''\r\n }\r\n onChange={handleDateChange}\r\n style={{ position: 'absolute', opacity: 0, pointerEvents: 'none' }}\r\n />\r\n </button>\r\n\r\n {/* ESTIMATED TIME FIELD */}\r\n <div className=\"modal-v2-field-wrapper\">\r\n <button\r\n className=\"modal-v2-field\"\r\n onClick={() => setShowTimePicker(!showTimePicker)}\r\n >\r\n <div className=\"modal-v2-field-label\">\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 6 12 12 16 14\" />\r\n </svg>\r\n <span>Estimated Time</span>\r\n <kbd className=\"modal-v2-shortcut\">E</kbd>\r\n </div>\r\n <div className=\"modal-v2-field-value\">\r\n {displayCard.estimatedTime ? `${displayCard.estimatedTime}h` : 'Not set'}\r\n </div>\r\n </button>\r\n {showTimePicker && (\r\n <div className=\"modal-v2-popover\">\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n step=\"0.5\"\r\n placeholder=\"Hours\"\r\n value={displayCard.estimatedTime || ''}\r\n onChange={(e) => handleTimeChange(e.target.value)}\r\n className=\"modal-v2-time-input\"\r\n autoFocus\r\n onBlur={() => setShowTimePicker(false)}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </section>\r\n\r\n {/* DESCRIPTION */}\r\n <section className=\"modal-v2-section\">\r\n <div className=\"modal-v2-section-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 >\r\n <path d=\"M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z\" />\r\n <polyline points=\"14 2 14 8 20 8\" />\r\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\r\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\r\n <polyline points=\"10 9 9 9 8 9\" />\r\n </svg>\r\n <h2>Description</h2>\r\n <button className=\"modal-v2-ai-button\">\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 AI Assist\r\n </button>\r\n </div>\r\n\r\n {isEditingDescription ? (\r\n <textarea\r\n className=\"modal-v2-textarea\"\r\n value={displayCard.description || ''}\r\n onChange={(e) => {\r\n if (localCard) {\r\n const updated: Card = { ...localCard, description: e.target.value }\r\n setLocalCard(updated)\r\n }\r\n }}\r\n onBlur={handleDescriptionBlur}\r\n placeholder=\"Add a detailed description...\"\r\n autoFocus\r\n />\r\n ) : (\r\n <div className=\"modal-v2-content\" onClick={() => setIsEditingDescription(true)}>\r\n {displayCard.description ? (\r\n <div className=\"modal-v2-markdown\">{renderMarkdown(displayCard.description)}</div>\r\n ) : (\r\n <p className=\"modal-v2-placeholder\">\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=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" />\r\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" />\r\n </svg>\r\n Add description...\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n </section>\r\n\r\n {/* SUBTASKS */}\r\n <section className=\"modal-v2-section\">\r\n <div className=\"modal-v2-section-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 >\r\n <path d=\"M9 11l3 3L22 4\" />\r\n <path d=\"M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11\" />\r\n </svg>\r\n <h2>Subtasks</h2>\r\n {subtasks.length > 0 && (\r\n <span className=\"modal-v2-count\">\r\n {completedSubtasksCount}/{subtasks.length}\r\n </span>\r\n )}\r\n <button className=\"modal-v2-add-button\" onClick={() => setIsAddingSubtask(true)}>\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=\"5\" x2=\"12\" y2=\"19\" />\r\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\r\n </svg>\r\n Add\r\n </button>\r\n </div>\r\n\r\n <div className=\"modal-v2-subtasks\">\r\n {subtasks.map((subtask) => (\r\n <div\r\n key={subtask.id}\r\n className={`modal-v2-subtask ${subtask.completed ? 'completed' : ''}`}\r\n >\r\n <button\r\n className=\"modal-v2-subtask-checkbox\"\r\n onClick={() => handleToggleSubtask(subtask.id)}\r\n >\r\n {subtask.completed ? (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path\r\n d=\"M9 12l2 2 4-4\"\r\n stroke=\"white\"\r\n strokeWidth=\"2\"\r\n fill=\"none\"\r\n />\r\n </svg>\r\n ) : (\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\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 </svg>\r\n )}\r\n </button>\r\n <span className=\"modal-v2-subtask-title\">{subtask.title}</span>\r\n <button\r\n className=\"modal-v2-subtask-delete\"\r\n onClick={() => handleDeleteSubtask(subtask.id)}\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n >\r\n <polyline points=\"3 6 5 6 21 6\" />\r\n <path d=\"M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2\" />\r\n </svg>\r\n </button>\r\n </div>\r\n ))}\r\n\r\n {isAddingSubtask && (\r\n <div className=\"modal-v2-subtask-input-row\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"Subtask title...\"\r\n value={newSubtaskTitle}\r\n onChange={(e) => setNewSubtaskTitle(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') handleAddSubtask()\r\n if (e.key === 'Escape') {\r\n setIsAddingSubtask(false)\r\n setNewSubtaskTitle('')\r\n }\r\n }}\r\n onBlur={handleAddSubtask}\r\n autoFocus\r\n className=\"modal-v2-subtask-input\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </section>\r\n\r\n {/* ACTIVITY & COMMENTS */}\r\n <section className=\"modal-v2-section\">\r\n <div className=\"modal-v2-section-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 >\r\n <path d=\"M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z\" />\r\n </svg>\r\n <h2>Activity</h2>\r\n <div className=\"modal-v2-filters\">\r\n <button\r\n className={`modal-v2-filter ${activityFilter === 'all' ? 'active' : ''}`}\r\n onClick={() => setActivityFilter('all')}\r\n >\r\n All\r\n </button>\r\n <button\r\n className={`modal-v2-filter ${activityFilter === 'comments' ? 'active' : ''}`}\r\n onClick={() => setActivityFilter('comments')}\r\n >\r\n Comments\r\n </button>\r\n <button\r\n className={`modal-v2-filter ${activityFilter === 'history' ? 'active' : ''}`}\r\n onClick={() => setActivityFilter('history')}\r\n >\r\n History\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Comment Input */}\r\n <div className=\"modal-v2-comment-input\">\r\n {currentUser && (\r\n <div className=\"modal-v2-avatar\" style={{ background: currentUser.color }}>\r\n {currentUser.initials}\r\n </div>\r\n )}\r\n <div className=\"modal-v2-comment-wrapper\">\r\n <textarea\r\n ref={commentRef}\r\n className=\"modal-v2-comment-textarea\"\r\n placeholder=\"Write a comment...\"\r\n value={commentText}\r\n onChange={(e) => setCommentText(e.target.value)}\r\n onKeyDown={handleCommentKeyDown}\r\n rows={1}\r\n />\r\n <div className=\"modal-v2-comment-toolbar\">\r\n <div className=\"modal-v2-toolbar-left\">\r\n <button className=\"modal-v2-toolbar-button\" title=\"Attach file\">\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=\"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 </button>\r\n <button className=\"modal-v2-toolbar-button\" title=\"Mention user\">\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=\"4\" />\r\n <path d=\"M16 8v5a3 3 0 006 0v-1a10 10 0 10-3.92 7.94\" />\r\n </svg>\r\n </button>\r\n <button className=\"modal-v2-toolbar-button\" title=\"Add emoji\">\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 <path d=\"M8 14s1.5 2 4 2 4-2 4-2\" />\r\n <line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\" />\r\n <line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <button\r\n className=\"modal-v2-send-button\"\r\n onClick={handleSendComment}\r\n disabled={!commentText.trim()}\r\n >\r\n Send\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Activity Timeline */}\r\n <div className=\"modal-v2-timeline\">\r\n {filteredActivity.map((activity) => {\r\n const user = availableUsers.find((u) => u.id === activity.userId)\r\n const isComment = activity.type.includes('COMMENT')\r\n\r\n if (isComment) {\r\n const comment = comments.find((c) => c.id === activity.metadata?.commentId)\r\n if (!comment) return null\r\n\r\n return (\r\n <div key={activity.id} className=\"modal-v2-activity-item comment-item\">\r\n {user && (\r\n <div className=\"modal-v2-avatar\" style={{ background: user.color }}>\r\n {user.initials}\r\n </div>\r\n )}\r\n <div className=\"modal-v2-activity-content\">\r\n <div className=\"modal-v2-activity-header\">\r\n <span className=\"modal-v2-activity-user\">\r\n {user?.name || 'Unknown'}\r\n </span>\r\n <span className=\"modal-v2-activity-time\">\r\n {new Date(activity.timestamp).toLocaleString()}\r\n </span>\r\n </div>\r\n <div className=\"modal-v2-comment-body\">{comment.content}</div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n // History item\r\n return (\r\n <div key={activity.id} className=\"modal-v2-activity-item history-item\">\r\n <div className=\"modal-v2-history-icon\">\r\n {activity.type.includes('CREATED') && '➕'}\r\n {activity.type.includes('UPDATED') && '✏️'}\r\n {activity.type.includes('MOVED') && '➡️'}\r\n {activity.type.includes('DELETED') && '🗑️'}\r\n {activity.type.includes('ASSIGNED') && '👤'}\r\n {activity.type.includes('PRIORITY') && '🎯'}\r\n {activity.type.includes('LABEL') && '🏷️'}\r\n </div>\r\n <div className=\"modal-v2-activity-content\">\r\n <div className=\"modal-v2-history-text\">\r\n <span className=\"modal-v2-activity-user\">\r\n {user?.name || 'Unknown'}\r\n </span>{' '}\r\n {activity.type.replace(/_/g, ' ').toLowerCase()}\r\n {activity.newValue && (\r\n <>\r\n {' to '}\r\n <strong>{activity.newValue}</strong>\r\n </>\r\n )}\r\n </div>\r\n <span className=\"modal-v2-activity-time\">\r\n {new Date(activity.timestamp).toLocaleString()}\r\n </span>\r\n </div>\r\n </div>\r\n )\r\n })}\r\n\r\n {filteredActivity.length === 0 && (\r\n <div className=\"modal-v2-empty\">\r\n <p>No activity yet</p>\r\n <span>Activity will appear here</span>\r\n </div>\r\n )}\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n </Portal>\r\n )\r\n}\r\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=\"#3B82F6\"\r\n strokeWidth={2}\r\n strokeDasharray=\"5 5\"\r\n name=\"Planned\"\r\n dot={{ fill: '#3B82F6', 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: '#3B82F6' }}>\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","/**\r\n * BurnDownChart Component\r\n * Shows remaining work over time compared to ideal burndown\r\n */\r\n\r\nimport { AreaChart, Area, LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'\r\nimport './charts.css'\r\n\r\nexport interface BurnDownDataPoint {\r\n /** Day/Date label */\r\n day: string\r\n /** Remaining tasks */\r\n remaining: number\r\n /** Ideal burndown line */\r\n ideal: number\r\n}\r\n\r\nexport interface BurnDownChartProps {\r\n /** Burndown data points */\r\n data: BurnDownDataPoint[]\r\n /** Chart title */\r\n title?: string\r\n /** Chart height in pixels */\r\n height?: number\r\n /** Total tasks at start */\r\n totalTasks?: number\r\n /** Use area chart instead of line */\r\n useArea?: boolean\r\n}\r\n\r\n/**\r\n * Custom tooltip for burndown 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.day}</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> tasks\r\n </p>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport function BurnDownChart({\r\n data,\r\n title = 'Sprint Burndown',\r\n height = 300,\r\n totalTasks,\r\n useArea = false,\r\n}: BurnDownChartProps) {\r\n // Calculate total tasks if not provided\r\n const total = totalTasks ?? (data[0]?.ideal || data[0]?.remaining || 0)\r\n\r\n // Calculate stats\r\n const currentRemaining = data[data.length - 1]?.remaining || 0\r\n const idealRemaining = data[data.length - 1]?.ideal || 0\r\n const progress = total > 0 ? ((total - currentRemaining) / total) * 100 : 0\r\n const isOnTrack = currentRemaining <= idealRemaining\r\n\r\n const ChartComponent = useArea ? AreaChart : LineChart\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 <ChartComponent\r\n data={data}\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=\"day\"\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 {useArea ? (\r\n <>\r\n {/* Ideal burndown area */}\r\n <Area\r\n type=\"monotone\"\r\n dataKey=\"ideal\"\r\n stroke=\"#F59E0B\"\r\n fill=\"rgba(245, 158, 11, 0.2)\"\r\n strokeWidth={2}\r\n strokeDasharray=\"5 5\"\r\n name=\"Ideal\"\r\n />\r\n {/* Actual burndown area */}\r\n <Area\r\n type=\"monotone\"\r\n dataKey=\"remaining\"\r\n stroke={isOnTrack ? '#10B981' : '#EF4444'}\r\n fill={isOnTrack ? 'rgba(16, 185, 129, 0.2)' : 'rgba(239, 68, 68, 0.2)'}\r\n strokeWidth={3}\r\n name=\"Remaining\"\r\n />\r\n </>\r\n ) : (\r\n <>\r\n {/* Ideal burndown line */}\r\n <Line\r\n type=\"linear\"\r\n dataKey=\"ideal\"\r\n stroke=\"#F59E0B\"\r\n strokeWidth={2}\r\n strokeDasharray=\"5 5\"\r\n name=\"Ideal\"\r\n dot={{ fill: '#F59E0B', r: 4 }}\r\n />\r\n {/* Actual burndown line */}\r\n <Line\r\n type=\"monotone\"\r\n dataKey=\"remaining\"\r\n stroke={isOnTrack ? '#10B981' : '#EF4444'}\r\n strokeWidth={3}\r\n name=\"Remaining\"\r\n dot={{ fill: isOnTrack ? '#10B981' : '#EF4444', r: 5 }}\r\n activeDot={{ r: 7 }}\r\n />\r\n </>\r\n )}\r\n </ChartComponent>\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\">Progress</span>\r\n <span\r\n className=\"chart-stat-value\"\r\n style={{ color: progress >= 50 ? '#10B981' : '#F59E0B' }}\r\n >\r\n {progress.toFixed(0)}%\r\n </span>\r\n </div>\r\n <div className=\"chart-stat\">\r\n <span className=\"chart-stat-label\">Remaining</span>\r\n <span\r\n className=\"chart-stat-value\"\r\n style={{ color: isOnTrack ? '#10B981' : '#EF4444' }}\r\n >\r\n {currentRemaining}\r\n </span>\r\n </div>\r\n <div className=\"chart-stat\">\r\n <span className=\"chart-stat-label\">Status</span>\r\n <span\r\n className=\"chart-stat-badge\"\r\n style={{\r\n background: isOnTrack\r\n ? 'rgba(16, 185, 129, 0.15)'\r\n : 'rgba(239, 68, 68, 0.15)',\r\n color: isOnTrack ? '#10B981' : '#EF4444',\r\n }}\r\n >\r\n {isOnTrack ? '✓ On Track' : '⚠ Behind'}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\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: '#3B82F6',\r\n LOW: '#10B981',\r\n}\r\n\r\n// Default colors for common categories\r\nconst DEFAULT_COLORS = ['#3B82F6', '#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: '#3B82F6' }}>\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","/**\r\n * Bulk Operations Toolbar\r\n * Floating toolbar for performing bulk actions on selected cards\r\n * @module components/BulkOperations\r\n */\r\n\r\nimport { memo, useState } from 'react'\r\nimport type { Card, Priority, BulkOperationsCallbacks } from '../../types'\r\nimport type { User } from '../Card/UserAssignmentSelector'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface BulkOperationsToolbarProps {\r\n /** Selected cards */\r\n selectedCards: Card[]\r\n /** Available users for assignment */\r\n availableUsers?: User[]\r\n /** Callback when selection is cleared */\r\n onClearSelection: () => void\r\n /** Bulk operations callbacks */\r\n callbacks: BulkOperationsCallbacks\r\n /** Available columns for move operation */\r\n columns?: Array<{ id: string; title: string }>\r\n /** Available labels */\r\n availableLabels?: string[]\r\n}\r\n\r\n/**\r\n * Bulk Operations Toolbar Component\r\n */\r\nexport const BulkOperationsToolbar = memo<BulkOperationsToolbarProps>(\r\n ({\r\n selectedCards,\r\n availableUsers = [],\r\n onClearSelection,\r\n callbacks,\r\n columns = [],\r\n availableLabels = [],\r\n }) => {\r\n const [showPriorityMenu, setShowPriorityMenu] = useState(false)\r\n const [showMoveMenu, setShowMoveMenu] = useState(false)\r\n const [showUserMenu, setShowUserMenu] = useState(false)\r\n const [showLabelMenu, setShowLabelMenu] = useState(false)\r\n\r\n if (selectedCards.length === 0) return null\r\n\r\n const cardIds = selectedCards.map((card) => card.id)\r\n\r\n const handleUpdatePriority = (priority: Priority) => {\r\n callbacks.onBulkUpdate?.(cardIds, { priority })\r\n setShowPriorityMenu(false)\r\n }\r\n\r\n const handleMove = (columnId: string) => {\r\n callbacks.onBulkMove?.(cardIds, columnId)\r\n setShowMoveMenu(false)\r\n onClearSelection()\r\n }\r\n\r\n const handleAssignUsers = (userIds: string[]) => {\r\n callbacks.onBulkUpdate?.(cardIds, { assignedUserIds: userIds })\r\n setShowUserMenu(false)\r\n }\r\n\r\n const handleAddLabels = (labels: string[]) => {\r\n // Get existing labels from all selected cards\r\n const existingLabels = new Set<string>()\r\n selectedCards.forEach((card) => {\r\n card.labels?.forEach((label) => existingLabels.add(label))\r\n })\r\n\r\n // Merge with new labels\r\n const allLabels = Array.from(new Set([...existingLabels, ...labels]))\r\n\r\n callbacks.onBulkUpdate?.(cardIds, { labels: allLabels })\r\n setShowLabelMenu(false)\r\n }\r\n\r\n const handleDelete = () => {\r\n if (confirm(`Delete ${selectedCards.length} card(s)? This cannot be undone.`)) {\r\n callbacks.onBulkDelete?.(cardIds)\r\n onClearSelection()\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"asakaa-bulk-toolbar\">\r\n <div className=\"asakaa-bulk-toolbar-content\">\r\n {/* Selection count */}\r\n <div className=\"asakaa-bulk-toolbar-count\">\r\n {selectedCards.length} card{selectedCards.length !== 1 ? 's' : ''} selected\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"asakaa-bulk-toolbar-actions\">\r\n {/* Priority */}\r\n <div className=\"relative\">\r\n <button\r\n className=\"asakaa-bulk-toolbar-button\"\r\n onClick={() => setShowPriorityMenu(!showPriorityMenu)}\r\n title=\"Update priority\"\r\n >\r\n <span className=\"text-sm\">Priority</span>\r\n </button>\r\n {showPriorityMenu && (\r\n <div className=\"asakaa-bulk-menu\">\r\n {(['LOW', 'MEDIUM', 'HIGH', 'URGENT'] as Priority[]).map((priority) => (\r\n <button\r\n key={priority}\r\n className=\"asakaa-bulk-menu-item\"\r\n onClick={() => handleUpdatePriority(priority)}\r\n >\r\n <span\r\n className={cn(\r\n 'asakaa-priority-dot',\r\n priority === 'LOW' && 'bg-asakaa-priority-low',\r\n priority === 'MEDIUM' && 'bg-asakaa-priority-medium',\r\n priority === 'HIGH' && 'bg-asakaa-priority-high',\r\n priority === 'URGENT' && 'bg-asakaa-priority-urgent'\r\n )}\r\n />\r\n {priority}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Move to column */}\r\n {columns.length > 0 && (\r\n <div className=\"relative\">\r\n <button\r\n className=\"asakaa-bulk-toolbar-button\"\r\n onClick={() => setShowMoveMenu(!showMoveMenu)}\r\n title=\"Move to column\"\r\n >\r\n <span className=\"text-sm\">Move</span>\r\n </button>\r\n {showMoveMenu && (\r\n <div className=\"asakaa-bulk-menu\">\r\n {columns.map((column) => (\r\n <button\r\n key={column.id}\r\n className=\"asakaa-bulk-menu-item\"\r\n onClick={() => handleMove(column.id)}\r\n >\r\n {column.title}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Assign users */}\r\n {availableUsers.length > 0 && (\r\n <div className=\"relative\">\r\n <button\r\n className=\"asakaa-bulk-toolbar-button\"\r\n onClick={() => setShowUserMenu(!showUserMenu)}\r\n title=\"Assign users\"\r\n >\r\n <span className=\"text-sm\">Assign</span>\r\n </button>\r\n {showUserMenu && (\r\n <div className=\"asakaa-bulk-menu\">\r\n {availableUsers.map((user) => (\r\n <button\r\n key={user.id}\r\n className=\"asakaa-bulk-menu-item\"\r\n onClick={() => handleAssignUsers([user.id])}\r\n >\r\n <div\r\n className=\"w-5 h-5 rounded-full flex items-center justify-center text-xs font-medium\"\r\n style={{ backgroundColor: user.color }}\r\n >\r\n {user.initials}\r\n </div>\r\n {user.name}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Add labels */}\r\n {availableLabels.length > 0 && (\r\n <div className=\"relative\">\r\n <button\r\n className=\"asakaa-bulk-toolbar-button\"\r\n onClick={() => setShowLabelMenu(!showLabelMenu)}\r\n title=\"Add labels\"\r\n >\r\n <span className=\"text-sm\">Labels</span>\r\n </button>\r\n {showLabelMenu && (\r\n <div className=\"asakaa-bulk-menu\">\r\n {availableLabels.map((label) => (\r\n <button\r\n key={label}\r\n className=\"asakaa-bulk-menu-item\"\r\n onClick={() => handleAddLabels([label])}\r\n >\r\n {label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Delete */}\r\n <button\r\n className=\"asakaa-bulk-toolbar-button asakaa-bulk-toolbar-button-danger\"\r\n onClick={handleDelete}\r\n title=\"Delete selected cards\"\r\n >\r\n <span className=\"text-sm\">Delete</span>\r\n </button>\r\n\r\n {/* Clear selection */}\r\n <button\r\n className=\"asakaa-bulk-toolbar-button\"\r\n onClick={onClearSelection}\r\n title=\"Clear selection\"\r\n >\r\n <span className=\"text-sm\">✕</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nBulkOperationsToolbar.displayName = 'BulkOperationsToolbar'\r\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 {\r\n Board,\r\n Card,\r\n Column,\r\n GroupByOption,\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\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}: SwimlaneBoardViewProps) {\r\n const [collapsedLanes, setCollapsedLanes] = useState<Set<string>>(new Set())\r\n\r\n // Generate swimlanes\r\n const swimlanes = useMemo(() => {\r\n return generateSwimlanes(\r\n board.cards,\r\n swimlaneConfig.groupBy,\r\n availableUsers\r\n )\r\n }, [board.cards, swimlaneConfig.groupBy, availableUsers])\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 // If no grouping, render standard board\r\n if (swimlaneConfig.groupBy === 'none' || swimlanes.length === 0) {\r\n return (\r\n <KanbanBoard\r\n board={board}\r\n callbacks={callbacks}\r\n availableUsers={availableUsers}\r\n className={className}\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 */}\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 {/* Swimlane Content */}\r\n {!isCollapsed && (\r\n <div className=\"asakaa-swimlane-content p-4\">\r\n <KanbanBoard\r\n board={laneBoard}\r\n callbacks={callbacks}\r\n availableUsers={availableUsers}\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-blue-400 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","/**\r\n * useKeyboardShortcuts Hook\r\n * Global keyboard shortcuts system for board navigation and actions\r\n * @module hooks/keyboard\r\n */\r\n\r\nimport { useEffect, useCallback, useRef } from 'react'\r\nimport type { KeyboardShortcut, KeyboardAction } from '../../types'\r\n\r\nexport interface UseKeyboardShortcutsOptions {\r\n /** Shortcuts configuration */\r\n shortcuts?: KeyboardShortcut[]\r\n /** Enable/disable shortcuts */\r\n enabled?: boolean\r\n /** Prevent default browser behavior */\r\n preventDefault?: boolean\r\n}\r\n\r\nexport interface UseKeyboardShortcutsReturn {\r\n /** Register a keyboard shortcut dynamically */\r\n registerShortcut: (shortcut: KeyboardShortcut) => void\r\n /** Unregister a keyboard shortcut */\r\n unregisterShortcut: (action: KeyboardAction) => void\r\n /** Check if shortcuts are enabled */\r\n isEnabled: boolean\r\n}\r\n\r\n/**\r\n * Default keyboard shortcuts for Kanban board\r\n */\r\nexport const DEFAULT_SHORTCUTS: KeyboardShortcut[] = [\r\n {\r\n keys: 'ArrowUp',\r\n action: 'navigate_up',\r\n description: 'Navigate to card above',\r\n },\r\n {\r\n keys: 'ArrowDown',\r\n action: 'navigate_down',\r\n description: 'Navigate to card below',\r\n },\r\n {\r\n keys: 'ArrowLeft',\r\n action: 'navigate_left',\r\n description: 'Navigate to previous column',\r\n },\r\n {\r\n keys: 'ArrowRight',\r\n action: 'navigate_right',\r\n description: 'Navigate to next column',\r\n },\r\n {\r\n keys: 'Enter',\r\n action: 'open_card',\r\n description: 'Open selected card',\r\n },\r\n {\r\n keys: 'Escape',\r\n action: 'close_modal',\r\n description: 'Close modal or dialog',\r\n },\r\n {\r\n keys: 'Delete',\r\n action: 'delete_card',\r\n description: 'Delete selected card',\r\n modifiers: { shift: true },\r\n },\r\n {\r\n keys: 'n',\r\n action: 'new_card',\r\n description: 'Create new card',\r\n modifiers: { ctrl: true },\r\n },\r\n {\r\n keys: 'k',\r\n action: 'search',\r\n description: 'Open search/command palette',\r\n modifiers: { ctrl: true },\r\n },\r\n {\r\n keys: 's',\r\n action: 'save',\r\n description: 'Save changes',\r\n modifiers: { ctrl: true },\r\n },\r\n {\r\n keys: 'z',\r\n action: 'undo',\r\n description: 'Undo last action',\r\n modifiers: { ctrl: true },\r\n },\r\n {\r\n keys: 'y',\r\n action: 'redo',\r\n description: 'Redo last undone action',\r\n modifiers: { ctrl: true },\r\n },\r\n {\r\n keys: 'a',\r\n action: 'select_all',\r\n description: 'Select all cards',\r\n modifiers: { ctrl: true },\r\n },\r\n {\r\n keys: 'Escape',\r\n action: 'deselect_all',\r\n description: 'Deselect all cards',\r\n },\r\n {\r\n keys: '?',\r\n action: 'show_shortcuts',\r\n description: 'Show keyboard shortcuts help',\r\n modifiers: { shift: true },\r\n },\r\n]\r\n\r\n/**\r\n * Check if keyboard event matches shortcut\r\n */\r\nfunction matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\r\n const keys = Array.isArray(shortcut.keys) ? shortcut.keys : [shortcut.keys]\r\n const keyMatches = keys.some((key) => event.key === key || event.code === key)\r\n\r\n if (!keyMatches) return false\r\n\r\n const modifiers = shortcut.modifiers || {}\r\n const ctrlMatch = modifiers.ctrl ? (event.ctrlKey || event.metaKey) : !event.ctrlKey && !event.metaKey\r\n const shiftMatch = modifiers.shift ? event.shiftKey : !event.shiftKey\r\n const altMatch = modifiers.alt ? event.altKey : !event.altKey\r\n const metaMatch = modifiers.meta ? event.metaKey : true // Don't enforce meta unless specified\r\n\r\n return ctrlMatch && shiftMatch && altMatch && metaMatch\r\n}\r\n\r\n/**\r\n * useKeyboardShortcuts Hook\r\n *\r\n * @example\r\n * ```tsx\r\n * const { registerShortcut } = useKeyboardShortcuts({\r\n * shortcuts: DEFAULT_SHORTCUTS,\r\n * enabled: true,\r\n * preventDefault: true,\r\n * })\r\n *\r\n * // Listen for keyboard actions\r\n * useEffect(() => {\r\n * const handleKeyboardAction = (event: CustomEvent<KeyboardAction>) => {\r\n * console.log('Action triggered:', event.detail)\r\n * }\r\n *\r\n * window.addEventListener('keyboard-action', handleKeyboardAction)\r\n * return () => window.removeEventListener('keyboard-action', handleKeyboardAction)\r\n * }, [])\r\n * ```\r\n */\r\nexport function useKeyboardShortcuts(\r\n options: UseKeyboardShortcutsOptions = {}\r\n): UseKeyboardShortcutsReturn {\r\n const {\r\n shortcuts = DEFAULT_SHORTCUTS,\r\n enabled = true,\r\n preventDefault = true,\r\n } = options\r\n\r\n const shortcutsRef = useRef<KeyboardShortcut[]>(shortcuts)\r\n const enabledRef = useRef(enabled)\r\n\r\n // Update refs when options change\r\n useEffect(() => {\r\n shortcutsRef.current = shortcuts\r\n enabledRef.current = enabled\r\n }, [shortcuts, enabled])\r\n\r\n // Register a new shortcut dynamically\r\n const registerShortcut = useCallback((shortcut: KeyboardShortcut) => {\r\n shortcutsRef.current = [...shortcutsRef.current, shortcut]\r\n }, [])\r\n\r\n // Unregister a shortcut\r\n const unregisterShortcut = useCallback((action: KeyboardAction) => {\r\n shortcutsRef.current = shortcutsRef.current.filter((s) => s.action !== action)\r\n }, [])\r\n\r\n // Handle keyboard events\r\n useEffect(() => {\r\n function handleKeyDown(event: KeyboardEvent): void {\r\n if (!enabledRef.current) return\r\n\r\n // Don't trigger shortcuts when typing in inputs, textareas, or contenteditable\r\n const target = event.target as HTMLElement\r\n if (\r\n target.tagName === 'INPUT' ||\r\n target.tagName === 'TEXTAREA' ||\r\n target.isContentEditable\r\n ) {\r\n // Allow Escape and Ctrl+shortcuts even in inputs\r\n if (event.key !== 'Escape' && !event.ctrlKey && !event.metaKey) {\r\n return\r\n }\r\n }\r\n\r\n // Check each shortcut\r\n for (const shortcut of shortcutsRef.current) {\r\n if (matchesShortcut(event, shortcut)) {\r\n if (preventDefault) {\r\n event.preventDefault()\r\n }\r\n\r\n // Dispatch custom event with action\r\n const customEvent = new CustomEvent('keyboard-action', {\r\n detail: shortcut.action,\r\n bubbles: true,\r\n cancelable: true,\r\n })\r\n window.dispatchEvent(customEvent)\r\n\r\n break // Only trigger first matching shortcut\r\n }\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', handleKeyDown)\r\n return () => window.removeEventListener('keydown', handleKeyDown)\r\n }, [preventDefault])\r\n\r\n return {\r\n registerShortcut,\r\n unregisterShortcut,\r\n isEnabled: enabled,\r\n }\r\n}\r\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 bg-black/60 backdrop-blur-sm\"\r\n onClick={onClose}\r\n />\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-3xl w-full mx-4 max-h-[80vh] overflow-hidden\">\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 Keyboard Shortcuts\r\n </h2>\r\n <p className=\"text-sm text-white/60 mt-1\">\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=\"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 {/* 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 text-white/90 mb-4 flex items-center gap-2\">\r\n <span className=\"w-1 h-5 bg-blue-500 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 bg-white/5 hover:bg-white/10 transition-colors\"\r\n >\r\n <span className=\"text-sm text-white/80\">\r\n {shortcut.description}\r\n </span>\r\n <kbd className=\"px-3 py-1.5 bg-gradient-to-br from-gray-700 to-gray-800 border border-white/20 rounded-md text-xs font-mono text-white/90 shadow-lg whitespace-nowrap\">\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-white/10 bg-white/5\">\r\n <p className=\"text-xs text-white/50 text-center\">\r\n Press <kbd className=\"px-2 py-0.5 bg-white/10 rounded 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","/**\r\n * CardTemplateSelector Component\r\n * Dropdown to select and apply card templates\r\n * @module components/Templates\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport type { CardTemplate } from '../../types'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface CardTemplateSelectorProps {\r\n /** Available templates */\r\n templates: CardTemplate[]\r\n /** Template selection handler */\r\n onSelectTemplate: (template: CardTemplate) => void\r\n /** Custom className */\r\n className?: string\r\n}\r\n\r\n/**\r\n * Default card templates\r\n */\r\nexport const DEFAULT_TEMPLATES: CardTemplate[] = [\r\n {\r\n id: 'bug-report',\r\n name: 'Bug Report',\r\n description: 'Report a bug or issue',\r\n icon: '🐛',\r\n category: 'Development',\r\n template: {\r\n title: '[BUG] ',\r\n description: '**Steps to reproduce:**\\n1. \\n\\n**Expected behavior:**\\n\\n**Actual behavior:**\\n\\n**Screenshots:**',\r\n priority: 'HIGH',\r\n labels: ['bug'],\r\n },\r\n },\r\n {\r\n id: 'feature-request',\r\n name: 'Feature Request',\r\n description: 'Propose a new feature',\r\n icon: '✨',\r\n category: 'Development',\r\n template: {\r\n title: '[FEATURE] ',\r\n description: '**Problem:**\\n\\n**Proposed solution:**\\n\\n**Alternatives considered:**\\n\\n**Additional context:**',\r\n priority: 'MEDIUM',\r\n labels: ['feature', 'enhancement'],\r\n },\r\n },\r\n {\r\n id: 'task',\r\n name: 'Task',\r\n description: 'General task or to-do',\r\n icon: '📝',\r\n category: 'General',\r\n template: {\r\n title: '',\r\n description: '**Objective:**\\n\\n**Acceptance criteria:**\\n- [ ] \\n\\n**Notes:**',\r\n priority: 'MEDIUM',\r\n },\r\n },\r\n {\r\n id: 'research',\r\n name: 'Research',\r\n description: 'Investigation or research task',\r\n icon: '🔬',\r\n category: 'General',\r\n template: {\r\n title: '[RESEARCH] ',\r\n description: '**Goal:**\\n\\n**Questions to answer:**\\n- \\n\\n**Resources:**\\n- \\n\\n**Findings:**',\r\n priority: 'LOW',\r\n labels: ['research'],\r\n },\r\n },\r\n {\r\n id: 'documentation',\r\n name: 'Documentation',\r\n description: 'Documentation task',\r\n icon: '📚',\r\n category: 'Documentation',\r\n template: {\r\n title: '[DOCS] ',\r\n description: '**What needs to be documented:**\\n\\n**Target audience:**\\n\\n**Key points:**\\n- ',\r\n priority: 'LOW',\r\n labels: ['documentation'],\r\n },\r\n },\r\n {\r\n id: 'meeting',\r\n name: 'Meeting',\r\n description: 'Meeting or discussion',\r\n icon: '💬',\r\n category: 'Communication',\r\n template: {\r\n title: 'Meeting: ',\r\n description: '**Date & Time:**\\n\\n**Participants:**\\n- \\n\\n**Agenda:**\\n1. \\n\\n**Action items:**\\n- [ ] ',\r\n priority: 'MEDIUM',\r\n labels: ['meeting'],\r\n },\r\n },\r\n]\r\n\r\n/**\r\n * CardTemplateSelector Component\r\n */\r\nexport function CardTemplateSelector({\r\n templates,\r\n onSelectTemplate,\r\n className,\r\n}: CardTemplateSelectorProps) {\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 // 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 = (template: CardTemplate) => {\r\n onSelectTemplate(template)\r\n setIsOpen(false)\r\n }\r\n\r\n // Group templates by category\r\n const groupedTemplates = templates.reduce((acc, template) => {\r\n const category = template.category || 'Other'\r\n if (!acc[category]) {\r\n acc[category] = []\r\n }\r\n acc[category].push(template)\r\n return acc\r\n }, {} as Record<string, CardTemplate[]>)\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 border transition-all text-sm font-medium shadow-lg\"\r\n style={{\r\n backgroundColor: 'var(--theme-bg-secondary)',\r\n borderColor: 'var(--theme-border-primary)',\r\n color: 'var(--theme-text-primary)',\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\r\n e.currentTarget.style.borderColor = 'var(--theme-border-secondary)'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-secondary)'\r\n e.currentTarget.style.borderColor = 'var(--theme-border-primary)'\r\n }}\r\n title=\"Create from template\"\r\n >\r\n <span className=\"text-base leading-none\">📋</span>\r\n <span>Templates</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-[320px] max-w-[400px] rounded-xl backdrop-blur-xl border shadow-2xl z-50 overflow-hidden max-h-[500px] overflow-y-auto\"\r\n style={{\r\n backgroundColor: 'var(--theme-bg-primary)',\r\n borderColor: 'var(--theme-border-primary)',\r\n }}\r\n >\r\n <div\r\n className=\"px-4 py-3 border-b sticky top-0 backdrop-blur-sm\"\r\n style={{\r\n borderColor: 'var(--theme-border-primary)',\r\n backgroundColor: 'var(--theme-bg-secondary)',\r\n }}\r\n >\r\n <span\r\n className=\"text-sm font-bold uppercase tracking-wider\"\r\n style={{ color: 'var(--theme-text-primary)' }}\r\n >\r\n Card Templates\r\n </span>\r\n <p\r\n className=\"text-xs mt-0.5\"\r\n style={{ color: 'var(--theme-text-tertiary)' }}\r\n >\r\n Quick start with pre-configured cards\r\n </p>\r\n </div>\r\n\r\n {Object.entries(groupedTemplates).map(([category, categoryTemplates]) => (\r\n <div key={category} className=\"py-2\">\r\n <div className=\"px-4 py-2\">\r\n <h4\r\n className=\"text-xs font-semibold uppercase tracking-wider\"\r\n style={{ color: 'var(--theme-text-secondary)' }}\r\n >\r\n {category}\r\n </h4>\r\n </div>\r\n <div>\r\n {categoryTemplates.map((template) => (\r\n <button\r\n key={template.id}\r\n onClick={() => handleSelect(template)}\r\n className=\"w-full px-4 py-3 flex items-start gap-3 text-left transition-all active:scale-[0.98]\"\r\n style={{ color: 'var(--theme-text-primary)' }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent'\r\n }}\r\n >\r\n <span className=\"text-2xl leading-none mt-0.5\">\r\n {template.icon}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <div\r\n className=\"font-semibold text-sm\"\r\n style={{ color: 'var(--theme-text-primary)' }}\r\n >\r\n {template.name}\r\n </div>\r\n {template.description && (\r\n <p\r\n className=\"text-xs mt-0.5\"\r\n style={{ color: 'var(--theme-text-tertiary)' }}\r\n >\r\n {template.description}\r\n </p>\r\n )}\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n\r\n {templates.length === 0 && (\r\n <div\r\n className=\"px-4 py-8 text-center\"\r\n style={{ color: 'var(--theme-text-tertiary)' }}\r\n >\r\n <p className=\"text-sm\">No templates available</p>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\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-blue-500'\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-blue-500'\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-blue-500 bg-blue-500/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-blue-600 to-blue-700 hover:from-blue-500 hover:to-blue-600 text-white font-semibold rounded-lg transition-all shadow-lg shadow-blue-500/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'\r\nimport type { Priority, User } from '../../types'\r\nimport type { FilterState, SortState, SortBy } from '../../hooks/useFilters'\r\nimport type { GroupByOption } from '../../types'\r\nimport './filter-bar.css'\r\n\r\nexport interface FilterBarProps {\r\n filters: FilterState\r\n sort: SortState\r\n onFiltersChange: (filters: Partial<FilterState>) => void\r\n onSortChange: (sort: Partial<SortState>) => void\r\n onReset: () => void\r\n onFilterMyTasks?: () => void\r\n onFilterOverdue?: () => void\r\n onFilterHighPriority?: () => void\r\n availableUsers?: User[]\r\n availableLabels?: string[]\r\n availableColumns?: Array<{ id: string; title: string }>\r\n showQuickFilters?: boolean\r\n compact?: boolean\r\n groupBy?: GroupByOption\r\n onGroupByChange?: (value: GroupByOption) => void\r\n}\r\n\r\nconst PRIORITY_OPTIONS: Priority[] = ['URGENT', 'HIGH', 'MEDIUM', 'LOW']\r\n\r\nconst SORT_OPTIONS: Array<{ value: SortBy; label: string }> = [\r\n { value: 'none', label: 'None' },\r\n { value: 'created', label: 'Date Created' },\r\n { value: 'priority', label: 'Priority' },\r\n { value: 'dueDate', label: 'Due Date' },\r\n { value: 'title', label: 'Title' },\r\n { value: 'estimate', label: 'Estimate' },\r\n]\r\n\r\nconst GROUPBY_OPTIONS: Array<{ value: GroupByOption; label: string }> = [\r\n { value: 'none', label: 'No Grouping' },\r\n { value: 'priority', label: 'By Priority' },\r\n { value: 'assignee', label: 'By Assignee' },\r\n { value: 'label', label: 'By Label' },\r\n]\r\n\r\nexport function FilterBar({\r\n filters,\r\n sort,\r\n onFiltersChange,\r\n onSortChange,\r\n onReset,\r\n onFilterMyTasks,\r\n onFilterOverdue,\r\n onFilterHighPriority,\r\n availableUsers = [],\r\n availableLabels = [],\r\n availableColumns: _availableColumns = [],\r\n showQuickFilters = true,\r\n compact = false,\r\n groupBy = 'none',\r\n onGroupByChange,\r\n}: FilterBarProps) {\r\n const [isCollapsed, setIsCollapsed] = useState(true)\r\n\r\n const handleSearchChange = useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement>) => {\r\n onFiltersChange({ search: e.target.value })\r\n },\r\n [onFiltersChange]\r\n )\r\n\r\n const handleDateFilterChange = useCallback(\r\n (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n onFiltersChange({ dateFilter: e.target.value as any })\r\n },\r\n [onFiltersChange]\r\n )\r\n\r\n const handleSortChange = useCallback(\r\n (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n onSortChange({ by: e.target.value as SortBy })\r\n },\r\n [onSortChange]\r\n )\r\n\r\n const handleSortOrderToggle = useCallback(() => {\r\n onSortChange({ order: sort.order === 'asc' ? 'desc' : 'asc' })\r\n }, [sort.order, onSortChange])\r\n\r\n const hasActiveFilters =\r\n filters.search ||\r\n filters.dateFilter !== 'all' ||\r\n filters.priorities.length > 0 ||\r\n filters.assignees.length > 0 ||\r\n filters.labels.length > 0 ||\r\n sort.by !== 'none'\r\n\r\n return (\r\n <div\r\n className={`filter-bar ${compact ? 'filter-bar--compact' : ''} ${isCollapsed ? 'filter-bar--collapsed' : ''}`}\r\n >\r\n <div\r\n className=\"filter-bar__header\"\r\n onClick={() => setIsCollapsed(!isCollapsed)}\r\n style={{\r\n cursor: 'pointer',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n marginBottom: isCollapsed ? '0' : '12px',\r\n padding: '4px 6px',\r\n borderRadius: '6px',\r\n transition: 'all 0.2s ease',\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent'\r\n }}\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n style={{\r\n transform: isCollapsed ? 'rotate(-90deg)' : 'rotate(0deg)',\r\n transition: 'transform 0.2s',\r\n color: 'var(--theme-text-secondary)',\r\n }}\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n <span className=\"filter-bar__label\" style={{ fontWeight: 500, fontSize: '0.875rem', color: 'var(--theme-text-primary)' }}>\r\n Filters & Grouping\r\n </span>\r\n {hasActiveFilters && (\r\n <span\r\n style={{\r\n color: 'var(--theme-accent-primary)',\r\n fontSize: '0.75rem',\r\n fontWeight: 600,\r\n }}\r\n >\r\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)\r\n </span>\r\n )}\r\n </div>\r\n\r\n {!isCollapsed && (\r\n <div className=\"filter-bar__content\">\r\n {showQuickFilters && (\r\n <div className=\"filter-bar__quick\" style={{ marginBottom: '12px' }}>\r\n <span className=\"filter-bar__label\">Quick:</span>\r\n {onFilterMyTasks && (\r\n <button\r\n onClick={onFilterMyTasks}\r\n className=\"filter-bar__quick-btn\"\r\n title=\"Show only my tasks\"\r\n >\r\n My Tasks\r\n </button>\r\n )}\r\n {onFilterOverdue && (\r\n <button\r\n onClick={onFilterOverdue}\r\n className=\"filter-bar__quick-btn\"\r\n title=\"Show overdue tasks\"\r\n >\r\n Overdue\r\n </button>\r\n )}\r\n {onFilterHighPriority && (\r\n <button\r\n onClick={onFilterHighPriority}\r\n className=\"filter-bar__quick-btn\"\r\n title=\"Show high priority tasks\"\r\n >\r\n High Priority\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div className=\"filter-bar__main\">\r\n <div className=\"filter-bar__field\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search tasks...\"\r\n value={filters.search}\r\n onChange={handleSearchChange}\r\n className=\"filter-bar__search\"\r\n />\r\n </div>\r\n\r\n <div className=\"filter-bar__field\">\r\n <select\r\n value={filters.dateFilter}\r\n onChange={handleDateFilterChange}\r\n className=\"filter-bar__select\"\r\n >\r\n <option value=\"all\">All Dates</option>\r\n <option value=\"overdue\">Overdue</option>\r\n <option value=\"today\">Today</option>\r\n <option value=\"this-week\">This Week</option>\r\n </select>\r\n </div>\r\n\r\n <div className=\"filter-bar__field\">\r\n <select\r\n value={filters.priorities[0] || 'all'}\r\n onChange={(e) => {\r\n const value = e.target.value\r\n onFiltersChange({\r\n priorities: value === 'all' ? [] : [value as Priority],\r\n })\r\n }}\r\n className=\"filter-bar__select\"\r\n >\r\n <option value=\"all\">All Priorities</option>\r\n {PRIORITY_OPTIONS.map((priority) => (\r\n <option key={priority} value={priority}>\r\n {priority}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {availableUsers.length > 0 && (\r\n <div className=\"filter-bar__field\">\r\n <select\r\n value={filters.assignees[0] || 'all'}\r\n onChange={(e) => {\r\n const value = e.target.value\r\n onFiltersChange({\r\n assignees: value === 'all' ? [] : [value],\r\n })\r\n }}\r\n className=\"filter-bar__select\"\r\n >\r\n <option value=\"all\">All Assignees</option>\r\n {availableUsers.map((user) => (\r\n <option key={user.id} value={user.id}>\r\n {user.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n\r\n {availableLabels.length > 0 && (\r\n <div className=\"filter-bar__field\">\r\n <select\r\n value={filters.labels[0] || 'all'}\r\n onChange={(e) => {\r\n const value = e.target.value\r\n onFiltersChange({\r\n labels: value === 'all' ? [] : [value],\r\n })\r\n }}\r\n className=\"filter-bar__select\"\r\n >\r\n <option value=\"all\">All Labels</option>\r\n {availableLabels.map((label) => (\r\n <option key={label} value={label}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n\r\n <div className=\"filter-bar__field filter-bar__sort\">\r\n <span className=\"filter-bar__label\" style={{ color: 'var(--theme-text-secondary)' }}>Sort:</span>\r\n <select\r\n value={sort.by}\r\n onChange={handleSortChange}\r\n className=\"filter-bar__select filter-bar__select--sm\"\r\n >\r\n {SORT_OPTIONS.map((option) => (\r\n <option key={option.value} value={option.value}>\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n {sort.by !== 'none' && (\r\n <button\r\n onClick={handleSortOrderToggle}\r\n className=\"filter-bar__sort-toggle\"\r\n title={`Sort ${sort.order === 'asc' ? 'descending' : 'ascending'}`}\r\n >\r\n {sort.order === 'asc' ? '↑' : '↓'}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {onGroupByChange && (\r\n <div className=\"filter-bar__field\">\r\n <select\r\n value={groupBy}\r\n onChange={(e) => onGroupByChange(e.target.value as GroupByOption)}\r\n className=\"filter-bar__select\"\r\n style={{\r\n fontWeight: 500,\r\n borderWidth: '2px',\r\n }}\r\n >\r\n {GROUPBY_OPTIONS.map((option) => (\r\n <option key={option.value} value={option.value}>\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n\r\n {hasActiveFilters && (\r\n <button\r\n onClick={onReset}\r\n className=\"filter-bar__reset\"\r\n title=\"Clear all filters\"\r\n >\r\n Clear\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","import { useState, useRef, useEffect } from 'react'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface ConfigMenuProps {\r\n onOpenExport: () => void\r\n onOpenThemes: () => void\r\n onOpenShortcuts: () => void\r\n className?: string\r\n // v0.8.1: Gantt-specific exports\r\n viewMode?: 'kanban' | 'gantt'\r\n onExportGanttPDF?: () => Promise<void>\r\n onExportGanttExcel?: () => Promise<void>\r\n onExportGanttPNG?: () => Promise<void>\r\n onExportGanttCSV?: () => void\r\n}\r\n\r\nexport function ConfigMenu({\r\n onOpenExport,\r\n onOpenThemes,\r\n onOpenShortcuts,\r\n className,\r\n viewMode = 'kanban',\r\n onExportGanttPDF,\r\n onExportGanttExcel,\r\n onExportGanttPNG,\r\n onExportGanttCSV,\r\n}: ConfigMenuProps) {\r\n const [isOpen, setIsOpen] = useState(false)\r\n const menuRef = useRef<HTMLDivElement>(null)\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (menuRef.current && !menuRef.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\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside)\r\n }\r\n }, [isOpen])\r\n\r\n const handleItemClick = (action: () => void) => {\r\n action()\r\n setIsOpen(false)\r\n }\r\n\r\n return (\r\n <div className={cn('relative', className)} ref={menuRef}>\r\n <button\r\n onClick={() => setIsOpen(!isOpen)}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium transition-all border\"\r\n style={{\r\n backgroundColor: 'var(--theme-bg-secondary)',\r\n borderColor: 'var(--theme-border-primary)',\r\n color: 'var(--theme-text-secondary)'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\r\n e.currentTarget.style.color = 'var(--theme-text-primary)'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-secondary)'\r\n e.currentTarget.style.color = 'var(--theme-text-secondary)'\r\n }}\r\n aria-label=\"Configuration Menu\"\r\n aria-expanded={isOpen}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\r\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\" />\r\n </svg>\r\n <span>Config</span>\r\n </button>\r\n\r\n {isOpen && (\r\n <div\r\n className=\"absolute right-0 mt-2 w-48 rounded-lg border shadow-lg overflow-hidden z-50\"\r\n style={{\r\n backgroundColor: 'var(--theme-bg-secondary)',\r\n borderColor: 'var(--theme-border-primary)',\r\n }}\r\n >\r\n {/* v0.8.1: Show different export options based on view mode */}\r\n {viewMode === 'kanban' ? (\r\n <button\r\n onClick={() => handleItemClick(onOpenExport)}\r\n className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\r\n style={{ color: 'var(--theme-text-primary)' }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent'\r\n }}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3\" />\r\n </svg>\r\n Export\r\n </button>\r\n ) : (\r\n <>\r\n <button\r\n onClick={() => handleItemClick(async () => await onExportGanttPDF?.())}\r\n className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\r\n style={{ color: 'var(--theme-text-primary)' }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent'\r\n }}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\r\n <polyline points=\"14 2 14 8 20 8\" />\r\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\r\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\r\n <polyline points=\"10 9 9 9 8 9\" />\r\n </svg>\r\n Export PDF\r\n </button>\r\n <button\r\n onClick={() => handleItemClick(async () => await onExportGanttExcel?.())}\r\n className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\r\n style={{ color: 'var(--theme-text-primary)' }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent'\r\n }}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\r\n <polyline points=\"14 2 14 8 20 8\" />\r\n <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"12\" />\r\n <line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\" />\r\n </svg>\r\n Export Excel\r\n </button>\r\n <button\r\n onClick={() => handleItemClick(async () => await onExportGanttPNG?.())}\r\n className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\r\n style={{ color: 'var(--theme-text-primary)' }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent'\r\n }}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\r\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\r\n <polyline points=\"21 15 16 10 5 21\" />\r\n </svg>\r\n Export PNG\r\n </button>\r\n <button\r\n onClick={() => handleItemClick(() => onExportGanttCSV?.())}\r\n className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\r\n style={{ color: 'var(--theme-text-primary)' }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent'\r\n }}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\r\n <polyline points=\"14 2 14 8 20 8\" />\r\n <line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\" />\r\n <line x1=\"8\" y1=\"17\" x2=\"16\" y2=\"17\" />\r\n </svg>\r\n Export CSV\r\n </button>\r\n </>\r\n )}\r\n\r\n <button\r\n onClick={() => handleItemClick(onOpenThemes)}\r\n className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\r\n style={{ color: 'var(--theme-text-primary)' }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent'\r\n }}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\r\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\" />\r\n </svg>\r\n Themes\r\n </button>\r\n\r\n <button\r\n onClick={() => handleItemClick(onOpenShortcuts)}\r\n className=\"w-full px-4 py-3 text-left text-sm font-medium transition-colors flex items-center gap-3\"\r\n style={{ color: 'var(--theme-text-primary)' }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = 'var(--theme-bg-tertiary)'\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent'\r\n }}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\r\n <path d=\"M6 8h.01M10 8h.01M14 8h.01M18 8h.01M8 12h.01M12 12h.01M16 12h.01M7 16h10\" />\r\n </svg>\r\n Shortcuts\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\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: '#3B82F6',\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: '#2563EB',\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","/**\r\n * Theme Provider\r\n * ASAKAA v0.5.0\r\n */\r\n\r\nimport { createContext, useContext, useEffect, useState, useCallback, type ReactNode } from 'react'\r\nimport type { ThemeName, ThemeContextValue } from './types'\r\nimport { themes, defaultTheme } from './themes'\r\n\r\nexport const ThemeContext = createContext<ThemeContextValue | undefined>(undefined)\r\n\r\nconst STORAGE_KEY = 'asakaa-theme'\r\n\r\nexport interface ThemeProviderProps {\r\n children: ReactNode\r\n defaultTheme?: ThemeName\r\n storageKey?: string\r\n}\r\n\r\nexport function ThemeProvider({\r\n children,\r\n defaultTheme: initialTheme = defaultTheme,\r\n storageKey = STORAGE_KEY,\r\n}: ThemeProviderProps) {\r\n const [theme, setThemeState] = useState<ThemeName>(() => {\r\n // Try to load from localStorage\r\n if (typeof window !== 'undefined') {\r\n const stored = localStorage.getItem(storageKey)\r\n if (stored && (stored === 'dark' || stored === 'light' || stored === 'neutral')) {\r\n return stored as ThemeName\r\n }\r\n }\r\n return initialTheme\r\n })\r\n\r\n const setTheme = useCallback(\r\n (newTheme: ThemeName) => {\r\n setThemeState(newTheme)\r\n if (typeof window !== 'undefined') {\r\n localStorage.setItem(storageKey, newTheme)\r\n }\r\n },\r\n [storageKey]\r\n )\r\n\r\n // Apply theme to document\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return\r\n\r\n const root = document.documentElement\r\n const currentTheme = themes[theme]\r\n\r\n // DUAL SYSTEM: Generate BOTH --theme-* AND --asakaa-color-* variables\r\n // This ensures compatibility during migration from old to new system\r\n\r\n // 1. Generate --theme-* variables (legacy compatibility)\r\n Object.entries(currentTheme.colors).forEach(([key, value]) => {\r\n if (value) {\r\n root.style.setProperty(`--theme-${camelToKebab(key)}`, value)\r\n }\r\n })\r\n\r\n // 2. Generate --asakaa-color-* variables (new system - following tokens.css naming)\r\n const colorMap: Record<string, string> = {\r\n // Background\r\n bgPrimary: '--asakaa-color-background-primary',\r\n bgSecondary: '--asakaa-color-background-secondary',\r\n bgTertiary: '--asakaa-color-background-tertiary',\r\n bgCard: '--asakaa-color-background-card',\r\n bgHover: '--asakaa-color-background-hover',\r\n bgActive: '--asakaa-color-background-active',\r\n bgInput: '--asakaa-color-background-input',\r\n\r\n // Text\r\n textPrimary: '--asakaa-color-text-primary',\r\n textSecondary: '--asakaa-color-text-secondary',\r\n textTertiary: '--asakaa-color-text-tertiary',\r\n textDisabled: '--asakaa-color-text-disabled',\r\n textInverse: '--asakaa-color-text-inverse',\r\n\r\n // Border\r\n borderPrimary: '--asakaa-color-border-primary',\r\n borderSecondary: '--asakaa-color-border-secondary',\r\n borderDefault: '--asakaa-color-border-default',\r\n borderHover: '--asakaa-color-border-hover',\r\n borderSubtle: '--asakaa-color-border-subtle',\r\n\r\n // Interactive\r\n accentPrimary: '--asakaa-color-accent-primary',\r\n accentHover: '--asakaa-color-accent-hover',\r\n interactivePrimary: '--asakaa-color-interactive-primary',\r\n interactivePrimaryHover: '--asakaa-color-interactive-primaryHover',\r\n interactivePrimaryBorder: '--asakaa-color-interactive-primaryBorder',\r\n interactivePrimaryBackground: '--asakaa-color-interactive-primaryBackground',\r\n interactivePrimaryBackgroundHover: '--asakaa-color-interactive-primaryBackgroundHover',\r\n\r\n // Status & Danger\r\n success: '--asakaa-color-status-success',\r\n warning: '--asakaa-color-status-warning',\r\n error: '--asakaa-color-status-error',\r\n info: '--asakaa-color-status-info',\r\n danger: '--asakaa-color-danger',\r\n dangerBorder: '--asakaa-color-danger-border',\r\n dangerBackground: '--asakaa-color-danger-background',\r\n dangerBackgroundHover: '--asakaa-color-danger-backgroundHover',\r\n }\r\n\r\n Object.entries(colorMap).forEach(([themeKey, cssVar]) => {\r\n const value = currentTheme.colors[themeKey as keyof typeof currentTheme.colors]\r\n if (value) {\r\n root.style.setProperty(cssVar, value)\r\n }\r\n })\r\n\r\n // 3. Set data-theme attribute for CSS selectors\r\n root.setAttribute('data-theme', theme)\r\n\r\n // 4. Set class for backward compatibility\r\n root.classList.remove('theme-dark', 'theme-light', 'theme-neutral')\r\n root.classList.add(`theme-${theme}`)\r\n }, [theme])\r\n\r\n const value: ThemeContextValue = {\r\n theme,\r\n setTheme,\r\n themes,\r\n }\r\n\r\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\r\n}\r\n\r\n/**\r\n * Hook to access theme context\r\n */\r\nexport function useTheme() {\r\n const context = useContext(ThemeContext)\r\n if (!context) {\r\n throw new Error('useTheme must be used within ThemeProvider')\r\n }\r\n return context\r\n}\r\n\r\n/**\r\n * Utility: Convert camelCase to kebab-case\r\n */\r\nfunction camelToKebab(str: string): string {\r\n return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()\r\n}\r\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-blue-500 bg-blue-500/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\r\n bgPrimary: '#1A1D21',\r\n bgSecondary: '#23272E',\r\n bgGrid: '#1E2228',\r\n bgWeekend: 'rgba(139, 92, 246, 0.03)',\r\n\r\n // Borders\r\n border: '#2D3139',\r\n borderLight: '#26292F',\r\n\r\n // Text\r\n textPrimary: '#F5F5F7',\r\n textSecondary: '#B4B9C5',\r\n textTertiary: '#7C8394',\r\n\r\n // Accent & Interactive\r\n accent: '#8B5CF6',\r\n accentHover: '#9D72F8',\r\n accentLight: 'rgba(139, 92, 246, 0.12)',\r\n\r\n // Task Elements - More vibrant colors like ClickUp\r\n taskBarPrimary: '#8B5CF6',\r\n taskBarProgress: '#7C3AED',\r\n taskBarHandle: '#FFFFFF',\r\n\r\n // Dependencies & Critical Path\r\n dependency: 'rgba(180, 185, 197, 0.25)',\r\n dependencyHover: 'rgba(180, 185, 197, 0.45)',\r\n criticalPath: '#EF4444',\r\n criticalPathLight: 'rgba(239, 68, 68, 0.12)',\r\n\r\n // Special Elements\r\n today: '#EF4444',\r\n todayLight: 'rgba(239, 68, 68, 0.08)',\r\n milestone: '#F59E0B',\r\n milestoneLight: 'rgba(245, 158, 11, 0.1)',\r\n\r\n // Status Colors\r\n statusTodo: '#7C8394',\r\n statusInProgress: '#8B5CF6',\r\n statusCompleted: '#10B981',\r\n\r\n // Hover & Focus States\r\n hoverBg: 'rgba(255, 255, 255, 0.05)',\r\n focusRing: '#8B5CF6',\r\n },\r\n \r\n light: {\r\n // Backgrounds\r\n bgPrimary: '#FFFFFF',\r\n bgSecondary: '#F9FAFB',\r\n bgGrid: '#FCFCFD',\r\n bgWeekend: 'rgba(37, 99, 235, 0.03)',\r\n\r\n // Borders\r\n border: '#E5E7EB',\r\n borderLight: '#F0F1F3',\r\n\r\n // Text\r\n textPrimary: '#111827',\r\n textSecondary: '#4B5563',\r\n textTertiary: '#9CA3AF',\r\n\r\n // Accent & Interactive\r\n accent: '#2563EB',\r\n accentHover: '#1D4ED8',\r\n accentLight: 'rgba(37, 99, 235, 0.08)',\r\n\r\n // Task Elements\r\n taskBarPrimary: '#2563EB',\r\n taskBarProgress: '#1E40AF',\r\n taskBarHandle: '#FFFFFF',\r\n\r\n // Dependencies & Critical Path\r\n dependency: 'rgba(75, 85, 99, 0.2)',\r\n dependencyHover: 'rgba(75, 85, 99, 0.4)',\r\n criticalPath: '#DC2626',\r\n criticalPathLight: 'rgba(220, 38, 38, 0.1)',\r\n\r\n // Special Elements - \"Today\" uses accent color (blue) instead of red\r\n today: '#2563EB', // Accent blue - reserved red for overdue/at-risk states\r\n todayLight: 'rgba(37, 99, 235, 0.08)',\r\n milestone: '#F59E0B',\r\n milestoneLight: 'rgba(245, 158, 11, 0.08)',\r\n \r\n // Status Colors\r\n statusTodo: '#9CA3AF',\r\n statusInProgress: '#2563EB',\r\n statusCompleted: '#059669',\r\n \r\n // Hover & Focus States\r\n hoverBg: 'rgba(0, 0, 0, 0.03)',\r\n focusRing: '#2563EB',\r\n },\r\n \r\n neutral: {\r\n // Backgrounds\r\n bgPrimary: '#FAFAF9',\r\n bgSecondary: '#F5F5F4',\r\n bgGrid: '#FEFEFE',\r\n bgWeekend: 'rgba(41, 37, 36, 0.025)',\r\n\r\n // Borders\r\n border: '#E7E5E4',\r\n borderLight: '#F0EFEE',\r\n\r\n // Text\r\n textPrimary: '#1C1917',\r\n textSecondary: '#57534E',\r\n textTertiary: '#A8A29E',\r\n\r\n // Accent & Interactive\r\n accent: '#292524',\r\n accentHover: '#44403C',\r\n accentLight: 'rgba(41, 37, 36, 0.06)',\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 dependency: 'rgba(87, 83, 78, 0.2)',\r\n dependencyHover: 'rgba(87, 83, 78, 0.35)',\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 - Zen mode: PURE monochrome, NO color\r\n today: '#1C1917', // Black - maintains monochrome philosophy\r\n todayLight: 'rgba(28, 25, 23, 0.04)',\r\n milestone: '#57534E', // Medium gray - no yellow\r\n milestoneLight: 'rgba(87, 83, 78, 0.06)',\r\n \r\n // Status Colors\r\n statusTodo: '#A8A29E',\r\n statusInProgress: '#292524',\r\n statusCompleted: '#15803D',\r\n \r\n // Hover & Focus States\r\n hoverBg: 'rgba(0, 0, 0, 0.025)',\r\n focusRing: '#292524',\r\n },\r\n};","import { GanttTheme } from './types';\r\nimport { themes } from './themes';\r\n\r\n/**\r\n * Deriva un objeto GanttTheme desde las variables CSS del ThemeProvider global.\r\n * Si no hay ThemeProvider, retorna el theme especificado o 'dark' por defecto.\r\n *\r\n * @param themeName - Nombre del tema ('dark' | 'light' | 'neutral')\r\n * @returns GanttTheme object con colores derivados de CSS variables\r\n */\r\nexport function deriveThemeFromCSS(themeName: 'dark' | 'light' | 'neutral' = 'dark'): GanttTheme {\r\n // Si estamos en SSR, retornar theme estático\r\n if (typeof window === 'undefined' || typeof getComputedStyle === 'undefined') {\r\n return themes[themeName] || themes.dark;\r\n }\r\n\r\n // Obtener valores computados de variables CSS\r\n const root = document.documentElement;\r\n const styles = getComputedStyle(root);\r\n\r\n // Helper para obtener variable CSS con fallback\r\n const getVar = (varName: string, fallback: string): string => {\r\n const value = styles.getPropertyValue(varName).trim();\r\n return value || fallback;\r\n };\r\n\r\n // Derivar theme desde variables CSS (sistema --theme-*)\r\n const derivedTheme: GanttTheme = {\r\n // Backgrounds\r\n bgPrimary: getVar('--theme-bg-primary', themes[themeName].bgPrimary),\r\n bgSecondary: getVar('--theme-bg-secondary', themes[themeName].bgSecondary),\r\n bgGrid: getVar('--theme-bg-card', themes[themeName].bgGrid),\r\n bgWeekend: getVar('--theme-bg-hover', themes[themeName].bgWeekend),\r\n\r\n // Borders\r\n border: getVar('--theme-border-primary', themes[themeName].border),\r\n borderLight: getVar('--theme-border-subtle', themes[themeName].borderLight),\r\n\r\n // Text\r\n textPrimary: getVar('--theme-text-primary', themes[themeName].textPrimary),\r\n textSecondary: getVar('--theme-text-secondary', themes[themeName].textSecondary),\r\n textTertiary: getVar('--theme-text-tertiary', themes[themeName].textTertiary),\r\n\r\n // Accent & Interactive\r\n accent: getVar('--theme-accent-primary', themes[themeName].accent),\r\n accentHover: getVar('--theme-accent-hover', themes[themeName].accentHover),\r\n accentLight: getVar('--theme-accent-primary', themes[themeName].accentLight), // usaremos opacity\r\n\r\n // Task Elements\r\n taskBarPrimary: getVar('--theme-accent-primary', themes[themeName].taskBarPrimary),\r\n taskBarProgress: getVar('--theme-accent-hover', themes[themeName].taskBarProgress),\r\n taskBarHandle: getVar('--theme-text-inverse', themes[themeName].taskBarHandle || '#FFFFFF'),\r\n\r\n // Dependencies & Critical Path\r\n dependency: getVar('--theme-border-secondary', themes[themeName].dependency),\r\n dependencyHover: getVar('--theme-border-secondary', themes[themeName].dependencyHover),\r\n criticalPath: getVar('--theme-error', themes[themeName].criticalPath),\r\n criticalPathLight: getVar('--theme-error', themes[themeName].criticalPathLight),\r\n\r\n // Special Elements - Theme-specific today indicator\r\n // Light: uses accent (blue), Neutral: uses text primary (black), Dark: custom\r\n today: themeName === 'light'\r\n ? getVar('--theme-accent-primary', themes[themeName].today)\r\n : themeName === 'neutral'\r\n ? getVar('--theme-text-primary', themes[themeName].today)\r\n : getVar('--theme-error', themes[themeName].today),\r\n todayLight: themeName === 'light'\r\n ? getVar('--theme-accent-primary', themes[themeName].todayLight)\r\n : themeName === 'neutral'\r\n ? getVar('--theme-text-primary', themes[themeName].todayLight)\r\n : getVar('--theme-error', themes[themeName].todayLight),\r\n milestone: getVar('--theme-warning', themes[themeName].milestone),\r\n milestoneLight: getVar('--theme-warning', themes[themeName].milestoneLight),\r\n\r\n // Status Colors\r\n statusTodo: getVar('--theme-text-tertiary', themes[themeName].statusTodo),\r\n statusInProgress: getVar('--theme-accent-primary', themes[themeName].statusInProgress),\r\n statusCompleted: getVar('--theme-success', themes[themeName].statusCompleted),\r\n\r\n // Hover & Focus States\r\n hoverBg: getVar('--theme-bg-hover', themes[themeName].hoverBg),\r\n focusRing: getVar('--theme-accent-primary', themes[themeName].focusRing),\r\n };\r\n\r\n return derivedTheme;\r\n}\r\n","import { Calendar, ZoomIn, ZoomOut, Sun, Moon, Palette, AlignJustify } from 'lucide-react';\r\nimport { TimeScale, Theme, RowDensity } from './types';\r\nimport { motion } from 'framer-motion';\r\n\r\ninterface GanttToolbarProps {\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}\r\n\r\n// Segmented Control Component\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}\r\n\r\nfunction SegmentedControl({ options, value, onChange, theme }: 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-xs 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=\"activeSegment\"\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\nexport function GanttToolbar({\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 = true,\r\n}: GanttToolbarProps) {\r\n const timeScaleOptions = [\r\n { value: 'day', label: 'Day', icon: <Calendar className=\"w-3.5 h-3.5\" /> },\r\n { value: 'week', label: 'Week', icon: <Calendar className=\"w-3.5 h-3.5\" /> },\r\n { value: 'month', label: 'Month', icon: <Calendar className=\"w-3.5 h-3.5\" /> },\r\n ];\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 const densityOptions = [\r\n { value: 'compact', label: 'Compact', icon: <AlignJustify className=\"w-3.5 h-3.5\" /> },\r\n { value: 'comfortable', label: 'Comfortable', icon: <AlignJustify className=\"w-3.5 h-3.5\" /> },\r\n { value: 'spacious', label: 'Spacious', icon: <AlignJustify className=\"w-3.5 h-3.5\" /> },\r\n ];\r\n\r\n return (\r\n <div\r\n className=\"h-14 px-6 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 Controls */}\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"flex items-center gap-2\">\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 }}\r\n >\r\n View\r\n </span>\r\n <SegmentedControl\r\n options={timeScaleOptions}\r\n value={timeScale}\r\n onChange={(val) => onTimeScaleChange(val as TimeScale)}\r\n theme={theme}\r\n />\r\n </div>\r\n\r\n {/* Divider */}\r\n <div\r\n className=\"w-px h-6\"\r\n style={{ backgroundColor: theme.borderLight }}\r\n />\r\n\r\n {/* Zoom Controls */}\r\n <div className=\"flex items-center gap-2\">\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 }}\r\n >\r\n Zoom\r\n </span>\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: theme.bgSecondary,\r\n border: `1px solid ${theme.borderLight}`,\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\" style={{ color: theme.textSecondary }} />\r\n </motion.button>\r\n\r\n <div\r\n className=\"px-3 py-1 rounded-md text-xs tabular-nums min-w-[50px] text-center\"\r\n style={{\r\n backgroundColor: theme.bgSecondary,\r\n border: `1px solid ${theme.borderLight}`,\r\n color: theme.textPrimary,\r\n fontFamily: 'Inter, sans-serif',\r\n fontWeight: 600,\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: theme.bgSecondary,\r\n border: `1px solid ${theme.borderLight}`,\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\" style={{ color: theme.textSecondary }} />\r\n </motion.button>\r\n </div>\r\n </div>\r\n\r\n {/* Divider */}\r\n <div\r\n className=\"w-px h-6\"\r\n style={{ backgroundColor: theme.borderLight }}\r\n />\r\n\r\n {/* Row Density Controls */}\r\n <div className=\"flex items-center gap-2\">\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 }}\r\n >\r\n Density\r\n </span>\r\n <SegmentedControl\r\n options={densityOptions}\r\n value={rowDensity}\r\n onChange={(val) => onRowDensityChange(val as RowDensity)}\r\n theme={theme}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Right Section - Theme Selector (optional) */}\r\n {showThemeSelector && (\r\n <div className=\"flex items-center gap-2\">\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 }}\r\n >\r\n Theme\r\n </span>\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 </div>\r\n )}\r\n </div>\r\n );\r\n}","import { useState, useRef, useEffect } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { Plus, Check } from 'lucide-react';\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 [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 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 <Plus 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 } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport {\r\n Plus,\r\n Minus,\r\n Edit3,\r\n Trash2,\r\n Link2,\r\n BarChart3,\r\n ArrowUpDown,\r\n ArrowUp,\r\n ArrowDown,\r\n ChevronRight,\r\n Eye,\r\n EyeOff,\r\n Settings,\r\n Scissors, // v0.8.0: For Split task\r\n} from 'lucide-react';\r\n\r\nexport interface ContextMenuItem {\r\n id: string;\r\n label: string;\r\n icon?: React.ReactNode;\r\n onClick: () => void;\r\n separator?: boolean;\r\n disabled?: boolean;\r\n submenu?: ContextMenuItem[];\r\n}\r\n\r\ninterface ContextMenuProps {\r\n isOpen: boolean;\r\n x: number;\r\n y: number;\r\n items: ContextMenuItem[];\r\n onClose: () => void;\r\n theme: any;\r\n}\r\n\r\nexport function ContextMenu({ isOpen, x, y, items, onClose, theme }: ContextMenuProps) {\r\n const menuRef = useRef<HTMLDivElement>(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 onClose();\r\n }\r\n };\r\n\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n onClose();\r\n }\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, onClose]);\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <AnimatePresence>\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, ease: [0.4, 0, 0.2, 1] }}\r\n className=\"fixed z-[9999] min-w-[200px] rounded-lg shadow-xl\"\r\n style={{\r\n left: `${x}px`,\r\n top: `${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 {items.map((item) => (\r\n <div key={item.id}>\r\n {item.separator && (\r\n <div\r\n className=\"my-1 h-px\"\r\n style={{ backgroundColor: theme.borderLight }}\r\n />\r\n )}\r\n <button\r\n onClick={() => {\r\n if (!item.disabled) {\r\n item.onClick();\r\n onClose();\r\n }\r\n }}\r\n disabled={item.disabled}\r\n className=\"w-full px-3 py-2 text-left flex items-center gap-2 transition-colors text-sm\"\r\n style={{\r\n color: item.disabled ? theme.textTertiary : theme.textPrimary,\r\n backgroundColor: 'transparent',\r\n fontFamily: 'Inter, sans-serif',\r\n cursor: item.disabled ? 'not-allowed' : 'pointer',\r\n opacity: item.disabled ? 0.5 : 1,\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!item.disabled) {\r\n e.currentTarget.style.backgroundColor = theme.hoverBg;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n {item.icon && (\r\n <span style={{ color: theme.textSecondary }}>\r\n {item.icon}\r\n </span>\r\n )}\r\n <span className=\"flex-1\">{item.label}</span>\r\n {item.submenu && (\r\n <ChevronRight className=\"w-3.5 h-3.5\" style={{ color: theme.textTertiary }} />\r\n )}\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n </motion.div>\r\n </AnimatePresence>\r\n );\r\n}\r\n\r\n// Icon components for menu items\r\nexport const MenuIcons = {\r\n Edit: <Edit3 className=\"w-4 h-4\" />,\r\n Delete: <Trash2 className=\"w-4 h-4\" />,\r\n Add: <Plus className=\"w-4 h-4\" />,\r\n Remove: <Minus className=\"w-4 h-4\" />,\r\n Link: <Link2 className=\"w-4 h-4\" />,\r\n Progress: <BarChart3 className=\"w-4 h-4\" />,\r\n Sort: <ArrowUpDown className=\"w-4 h-4\" />,\r\n SortAsc: <ArrowUp className=\"w-4 h-4\" />,\r\n SortDesc: <ArrowDown className=\"w-4 h-4\" />,\r\n Hide: <EyeOff className=\"w-4 h-4\" />,\r\n Show: <Eye className=\"w-4 h-4\" />,\r\n Settings: <Settings className=\"w-4 h-4\" />,\r\n Split: <Scissors className=\"w-4 h-4\" />, // v0.8.0: Split task\r\n};\r\n","import { useEffect, useCallback, useRef } from 'react';\r\nimport { Task } from './types';\r\n\r\ninterface UseGanttKeyboardProps {\r\n tasks: Task[];\r\n selectedTaskIds: Set<string>;\r\n onTaskSelect: (taskId: string, multiSelect?: boolean) => void;\r\n onTaskCreate: (afterTaskId: string, direction: 'above' | 'below') => void;\r\n onTaskDelete: (taskIds: string[]) => void;\r\n onTaskDuplicate: (taskIds: string[]) => void;\r\n onTaskMove: (taskIds: string[], direction: 'up' | 'down') => void;\r\n onTaskIndent: (taskIds: string[]) => void;\r\n onTaskOutdent: (taskIds: string[]) => void;\r\n onTaskRename: (taskId: string) => void;\r\n onTaskToggleExpand: (taskId: string) => void;\r\n onOpenTaskModal: (taskId: string) => void;\r\n enableKeyboard?: boolean;\r\n}\r\n\r\nexport function useGanttKeyboard({\r\n tasks,\r\n selectedTaskIds,\r\n onTaskSelect,\r\n onTaskCreate,\r\n onTaskDelete,\r\n onTaskDuplicate,\r\n onTaskMove,\r\n onTaskIndent,\r\n onTaskOutdent,\r\n onTaskRename,\r\n onTaskToggleExpand,\r\n onOpenTaskModal,\r\n enableKeyboard = true,\r\n}: UseGanttKeyboardProps) {\r\n const isEditingRef = useRef(false);\r\n\r\n // Set editing state from outside\r\n const setIsEditing = useCallback((editing: boolean) => {\r\n isEditingRef.current = editing;\r\n }, []);\r\n\r\n // Flatten tasks for navigation\r\n const flattenTasks = useCallback((tasks: Task[]): Task[] => {\r\n const result: Task[] = [];\r\n const traverse = (tasks: Task[]) => {\r\n for (const task of tasks) {\r\n result.push(task);\r\n if (task.subtasks && task.subtasks.length > 0 && task.isExpanded) {\r\n traverse(task.subtasks);\r\n }\r\n }\r\n };\r\n traverse(tasks);\r\n return result;\r\n }, []);\r\n\r\n // Get first selected task\r\n const getFirstSelectedTask = useCallback(() => {\r\n const flatTasks = flattenTasks(tasks);\r\n for (const task of flatTasks) {\r\n if (selectedTaskIds.has(task.id)) {\r\n return task;\r\n }\r\n }\r\n return null;\r\n }, [tasks, selectedTaskIds, flattenTasks]);\r\n\r\n // Navigate with arrow keys\r\n const handleNavigation = useCallback(\r\n (direction: 'up' | 'down', multiSelect: boolean) => {\r\n const flatTasks = flattenTasks(tasks);\r\n if (flatTasks.length === 0) return;\r\n\r\n const selectedTask = getFirstSelectedTask();\r\n if (!selectedTask) {\r\n // No selection, select first task\r\n onTaskSelect(flatTasks[0].id, false);\r\n return;\r\n }\r\n\r\n const currentIndex = flatTasks.findIndex((t) => t.id === selectedTask.id);\r\n if (currentIndex === -1) return;\r\n\r\n const nextIndex = direction === 'up' ? currentIndex - 1 : currentIndex + 1;\r\n if (nextIndex < 0 || nextIndex >= flatTasks.length) return;\r\n\r\n const nextTask = flatTasks[nextIndex];\r\n onTaskSelect(nextTask.id, multiSelect);\r\n },\r\n [tasks, getFirstSelectedTask, flattenTasks, onTaskSelect]\r\n );\r\n\r\n // Handle keyboard shortcuts\r\n const handleKeyDown = useCallback(\r\n (e: KeyboardEvent) => {\r\n // Ignore if keyboard is disabled\r\n if (!enableKeyboard) return;\r\n\r\n // Ignore if user is typing in an input/textarea\r\n const target = e.target as HTMLElement;\r\n const isInputField =\r\n target.tagName === 'INPUT' ||\r\n target.tagName === 'TEXTAREA' ||\r\n target.isContentEditable ||\r\n isEditingRef.current;\r\n\r\n if (isInputField) {\r\n // Only allow Escape to cancel editing\r\n if (e.key === 'Escape') {\r\n target.blur();\r\n isEditingRef.current = false;\r\n }\r\n return;\r\n }\r\n\r\n const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\r\n const ctrlOrCmd = isMac ? e.metaKey : e.ctrlKey;\r\n const selectedIds = Array.from(selectedTaskIds);\r\n const selectedTask = getFirstSelectedTask();\r\n\r\n // Navigation: Arrow Up/Down\r\n if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n handleNavigation('up', e.shiftKey);\r\n return;\r\n }\r\n if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n handleNavigation('down', e.shiftKey);\r\n return;\r\n }\r\n\r\n // Expand/Collapse: Arrow Right/Left\r\n if (selectedTask && (e.key === 'ArrowRight' || e.key === 'ArrowLeft')) {\r\n if (selectedTask.subtasks && selectedTask.subtasks.length > 0) {\r\n e.preventDefault();\r\n if (e.key === 'ArrowRight' && !selectedTask.isExpanded) {\r\n onTaskToggleExpand(selectedTask.id);\r\n } else if (e.key === 'ArrowLeft' && selectedTask.isExpanded) {\r\n onTaskToggleExpand(selectedTask.id);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // Move: Alt + Arrow Up/Down\r\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\r\n if (selectedIds.length > 0) {\r\n e.preventDefault();\r\n onTaskMove(selectedIds, e.key === 'ArrowUp' ? 'up' : 'down');\r\n }\r\n return;\r\n }\r\n\r\n // Indent: Tab\r\n if (e.key === 'Tab' && !e.shiftKey) {\r\n if (selectedIds.length > 0) {\r\n e.preventDefault();\r\n onTaskIndent(selectedIds);\r\n }\r\n return;\r\n }\r\n\r\n // Outdent: Shift + Tab\r\n if (e.key === 'Tab' && e.shiftKey) {\r\n if (selectedIds.length > 0) {\r\n e.preventDefault();\r\n onTaskOutdent(selectedIds);\r\n }\r\n return;\r\n }\r\n\r\n // Create below: Enter\r\n if (e.key === 'Enter' && !e.shiftKey && !ctrlOrCmd) {\r\n if (selectedTask) {\r\n e.preventDefault();\r\n onTaskCreate(selectedTask.id, 'below');\r\n }\r\n return;\r\n }\r\n\r\n // Create above: Shift + Enter\r\n if (e.key === 'Enter' && e.shiftKey && !ctrlOrCmd) {\r\n if (selectedTask) {\r\n e.preventDefault();\r\n onTaskCreate(selectedTask.id, 'above');\r\n }\r\n return;\r\n }\r\n\r\n // Open modal: Ctrl/Cmd + Enter\r\n if (e.key === 'Enter' && ctrlOrCmd) {\r\n if (selectedTask) {\r\n e.preventDefault();\r\n onOpenTaskModal(selectedTask.id);\r\n }\r\n return;\r\n }\r\n\r\n // Rename: F2\r\n if (e.key === 'F2') {\r\n if (selectedTask) {\r\n e.preventDefault();\r\n onTaskRename(selectedTask.id);\r\n }\r\n return;\r\n }\r\n\r\n // Delete: Delete or Cmd/Ctrl + Backspace\r\n if (e.key === 'Delete' || (e.key === 'Backspace' && ctrlOrCmd)) {\r\n if (selectedIds.length > 0) {\r\n e.preventDefault();\r\n onTaskDelete(selectedIds);\r\n }\r\n return;\r\n }\r\n\r\n // Duplicate: Ctrl/Cmd + D\r\n if (e.key === 'd' && ctrlOrCmd && !e.shiftKey) {\r\n if (selectedIds.length > 0) {\r\n e.preventDefault();\r\n onTaskDuplicate(selectedIds);\r\n }\r\n return;\r\n }\r\n },\r\n [\r\n enableKeyboard,\r\n selectedTaskIds,\r\n getFirstSelectedTask,\r\n handleNavigation,\r\n onTaskCreate,\r\n onTaskDelete,\r\n onTaskDuplicate,\r\n onTaskMove,\r\n onTaskIndent,\r\n onTaskOutdent,\r\n onTaskRename,\r\n onTaskToggleExpand,\r\n onOpenTaskModal,\r\n ]\r\n );\r\n\r\n // Register keyboard event listener\r\n useEffect(() => {\r\n if (!enableKeyboard) return;\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, [enableKeyboard, handleKeyDown]);\r\n\r\n return { setIsEditing };\r\n}\r\n","import { useState, useCallback } from 'react';\r\n\r\nexport function useGanttSelection() {\r\n const [selectedTaskIds, setSelectedTaskIds] = useState<Set<string>>(new Set());\r\n const [lastSelectedId, setLastSelectedId] = useState<string | null>(null);\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 * 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 for (let i = 0; i < tasks.length; i++) {\r\n const task = { ...tasks[i], parentId, level, 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 return addAsChildren(filtered, targetParent.id, removed);\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 return 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 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 */\r\nexport function duplicateTasks(tasks: Task[], taskIds: string[]): Task[] {\r\n const result = [...tasks];\r\n\r\n for (const taskId of taskIds) {\r\n const duplicateTask = (tasks: Task[]): 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 && duplicateTask(task.subtasks)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n const original = tasks[index];\r\n const copy = {\r\n ...original,\r\n id: `${original.id}-copy-${Date.now()}`,\r\n name: `${original.name} (Copy)`,\r\n subtasks: original.subtasks ? duplicateSubtasks(original.subtasks) : undefined,\r\n };\r\n\r\n tasks.splice(index + 1, 0, copy);\r\n return true;\r\n };\r\n\r\n const duplicateSubtasks = (subtasks: Task[]): Task[] => {\r\n return subtasks.map((task) => ({\r\n ...task,\r\n id: `${task.id}-copy-${Date.now()}`,\r\n subtasks: task.subtasks ? duplicateSubtasks(task.subtasks) : undefined,\r\n }));\r\n };\r\n\r\n duplicateTask(result);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Create a new task\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 newTask: Task = {\r\n id: `task-${Date.now()}`,\r\n name: 'New Task',\r\n progress: 0,\r\n status: 'todo',\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 */\r\nexport function createSubtask(\r\n tasks: Task[],\r\n parentTaskId: string\r\n): { tasks: Task[]; newTask: Task } {\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 };\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 * Status Selector Component\r\n * Reusable status selector for both Card and Gantt\r\n * Follows the same pattern as PrioritySelector\r\n */\r\n\r\nimport { useState, useRef, useEffect } from 'react'\r\nimport { Portal } from '../Portal'\r\n\r\nexport type TaskStatus = 'todo' | 'in-progress' | 'completed'\r\n\r\nexport interface StatusSelectorProps {\r\n status?: TaskStatus\r\n onChange: (status: TaskStatus) => void\r\n className?: string\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}: 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 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 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: TaskStatus) => {\r\n onChange(newStatus)\r\n setIsOpen(false)\r\n }\r\n\r\n const currentConfig = STATUS_CONFIG[status]\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={() => setIsOpen(!isOpen)}\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 {isOpen && (\r\n <Portal>\r\n <div\r\n ref={menuRef}\r\n className=\"status-selector-menu\"\r\n style={{\r\n position: 'absolute',\r\n top: `${menuPosition.top}px`,\r\n left: `${menuPosition.left}px`,\r\n zIndex: 99999,\r\n minWidth: '180px',\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 {(Object.entries(STATUS_CONFIG) as [TaskStatus, typeof STATUS_CONFIG[TaskStatus]][]).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-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: 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 <StatusIcon icon={config.icon} color={config.color} />\r\n <span className=\"font-semibold\">{config.label}</span>\r\n {status === 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=\"#3B82F6\" 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","import { useState, useEffect, useRef } from 'react';\r\nimport { ChevronDown, ChevronRight, Keyboard, Plus, Edit3 } from 'lucide-react';\r\nimport { Task, GanttColumn, ColumnType, GanttTemplates } from './types';\r\nimport { motion } from 'framer-motion';\r\nimport { ColumnManager } from './ColumnManager';\r\nimport { ContextMenu, ContextMenuItem, MenuIcons } from './ContextMenu';\r\nimport { useGanttKeyboard } from './useGanttKeyboard';\r\nimport { useGanttSelection } from './useGanttSelection';\r\nimport { flattenTasks as flattenTasksUtil } from './hierarchyUtils';\r\nimport { DateRangePicker } from '../Card/DateRangePicker';\r\nimport { UserAssignmentSelector } from '../Card/UserAssignmentSelector';\r\nimport { StatusSelector } from '../Card/StatusSelector';\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 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 onTaskUpdate?: (taskId: string, updates: Partial<Task>) => void;\r\n onTaskDelete?: (taskId: string) => 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 onCreateSubtask?: (parentTaskId: string) => void;\r\n onOpenTaskModal?: (task: Task) => void;\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 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 onTaskUpdate,\r\n onTaskDelete,\r\n onTaskIndent,\r\n onTaskOutdent,\r\n onTaskMove,\r\n onMultiTaskDelete,\r\n onTaskDuplicate,\r\n onTaskCreate,\r\n onTaskRename,\r\n onCreateSubtask,\r\n onOpenTaskModal,\r\n}: TaskGridProps) {\r\n const [hoveredTaskId, setHoveredTaskId] = useState<string | null>(null);\r\n const [showKeyboardHelp, setShowKeyboardHelp] = useState(false);\r\n const [editingTaskId, setEditingTaskId] = useState<string | null>(null);\r\n const [editingTaskName, setEditingTaskName] = useState('');\r\n const keyboardHelpRef = useRef<HTMLDivElement>(null);\r\n const editInputRef = useRef<HTMLInputElement>(null);\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 // 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\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 // Multi-selection hook\r\n const {\r\n selectedTaskIds,\r\n handleTaskClick: handleSelectionClick,\r\n isTaskSelected,\r\n } = useGanttSelection();\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 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): Array<{ task: Task; level: number }> => {\r\n const result: Array<{ task: Task; level: number }> = [];\r\n \r\n for (const task of tasks) {\r\n result.push({ task, level });\r\n if (task.subtasks && task.subtasks.length > 0 && task.isExpanded) {\r\n result.push(...flattenTasks(task.subtasks, level + 1));\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\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 // Render cell content based on column type\r\n const renderCellContent = (column: GanttColumn, task: Task, level: number) => {\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 * 24}px` }}>\r\n {/* Expand/Collapse Button */}\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\r\n {/* Type Icon: Milestone (diamond), Task (circle), or Subtask (small filled dot) */}\r\n <div className=\"flex-shrink-0\" style={{ opacity: level === 0 ? 0.7 : level === 1 ? 0.6 : 0.5 }}>\r\n {task.isMilestone ? (\r\n // Diamond icon for milestones\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path\r\n d=\"M7 1L12 7L7 13L2 7L7 1Z\"\r\n stroke={theme.accent}\r\n strokeWidth=\"1.5\"\r\n fill=\"none\"\r\n />\r\n </svg>\r\n ) : level >= 2 ? (\r\n // Small filled circle for subtasks (level 2+)\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <circle\r\n cx=\"7\"\r\n cy=\"7\"\r\n r=\"2.5\"\r\n fill={theme.textTertiary}\r\n opacity=\"0.5\"\r\n />\r\n </svg>\r\n ) : level === 1 ? (\r\n // Regular circle for tasks (level 1)\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <circle\r\n cx=\"7\"\r\n cy=\"7\"\r\n r=\"5\"\r\n stroke={theme.textTertiary}\r\n strokeWidth=\"1.5\"\r\n fill=\"none\"\r\n />\r\n </svg>\r\n ) : (\r\n // Larger circle with thicker stroke for parent tasks (level 0)\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <circle\r\n cx=\"7\"\r\n cy=\"7\"\r\n r=\"5\"\r\n stroke={theme.textSecondary}\r\n strokeWidth=\"2\"\r\n fill=\"none\"\r\n />\r\n </svg>\r\n )}\r\n </div>\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=\"truncate flex-1\"\r\n style={{\r\n color: theme.textPrimary,\r\n fontFamily: 'Inter, sans-serif',\r\n fontSize: level === 0 ? '14px' : level === 1 ? '13px' : '12px',\r\n // World-class hierarchy: Containers (with subtasks) have more weight\r\n fontWeight: task.isMilestone\r\n ? 600 // Milestones: Semibold (most important)\r\n : (task.subtasks && task.subtasks.length > 0)\r\n ? 500 // Containers: Medium (guide the eye)\r\n : 400, // Regular tasks: Normal\r\n opacity: level === 0 ? 1 : level === 1 ? 0.95 : 0.88,\r\n }}\r\n >\r\n {task.name}\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 return (\r\n <div onClick={(e) => e.stopPropagation()}>\r\n <DateRangePicker\r\n startDate={\r\n task.startDate\r\n ? typeof task.startDate === 'string'\r\n ? task.startDate\r\n : task.startDate.toISOString().split('T')[0]\r\n : undefined\r\n }\r\n endDate={\r\n task.endDate\r\n ? typeof task.endDate === 'string'\r\n ? task.endDate\r\n : task.endDate.toISOString().split('T')[0]\r\n : undefined\r\n }\r\n onChange={(startDate, endDate) => {\r\n onTaskUpdate?.(task.id, {\r\n startDate: startDate ? new Date(startDate) : undefined,\r\n endDate: endDate ? new Date(endDate) : undefined\r\n });\r\n }}\r\n />\r\n </div>\r\n );\r\n \r\n case 'duration':\r\n return (\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 );\r\n \r\n case 'assignees':\r\n const taskAssignedUsers: User[] = availableUsers.filter(user =>\r\n task.assignees?.some(a => a.name === user.name || a.initials === user.initials)\r\n );\r\n return (\r\n <div onClick={(e) => e.stopPropagation()}>\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 name: u.name,\r\n initials: u.initials,\r\n color: u.color\r\n }));\r\n onTaskUpdate?.(task.id, {\r\n assignees: newAssignees.length > 0 ? newAssignees : undefined\r\n });\r\n }}\r\n />\r\n </div>\r\n );\r\n \r\n case 'status':\r\n return (\r\n <div onClick={(e) => e.stopPropagation()}>\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 gap-2\">\r\n <div className=\"flex-1 h-1.5 rounded-full overflow-hidden\" 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 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 // Context menu items for task row\r\n const getTaskContextMenuItems = (task: Task): ContextMenuItem[] => {\r\n return [\r\n {\r\n id: 'edit',\r\n label: 'Edit Task',\r\n icon: MenuIcons.Edit,\r\n onClick: () => {\r\n // Implement edit dialog in parent component if needed\r\n },\r\n },\r\n {\r\n id: 'addSubtask',\r\n label: 'Add Subtask',\r\n icon: MenuIcons.Add,\r\n onClick: () => {\r\n // Implement subtask creation in parent component if needed\r\n },\r\n },\r\n {\r\n id: 'addDependency',\r\n label: 'Add Dependency',\r\n icon: MenuIcons.Link,\r\n onClick: () => {\r\n // Implement dependency picker in parent component if needed\r\n },\r\n },\r\n { id: 'sep1', label: '', onClick: () => {}, separator: true },\r\n {\r\n id: 'markComplete',\r\n label: task.status === 'completed' ? 'Mark Incomplete' : 'Mark Complete',\r\n icon: MenuIcons.Progress,\r\n onClick: () => {\r\n const newStatus = task.status === 'completed' ? 'in-progress' : 'completed';\r\n const newProgress = task.status === 'completed' ? task.progress : 100;\r\n onTaskUpdate?.(task.id, { status: newStatus, progress: newProgress });\r\n },\r\n },\r\n {\r\n id: 'setInProgress',\r\n label: 'Set In Progress',\r\n icon: MenuIcons.Progress,\r\n onClick: () => {\r\n onTaskUpdate?.(task.id, { status: 'in-progress' });\r\n },\r\n disabled: task.status === 'in-progress',\r\n },\r\n { id: 'sep2', label: '', onClick: () => {}, separator: true },\r\n {\r\n id: 'delete',\r\n label: 'Delete Task',\r\n icon: MenuIcons.Delete,\r\n onClick: () => {\r\n if (window.confirm(`Delete task \"${task.name}\"?`)) {\r\n onTaskDelete?.(task.id);\r\n }\r\n },\r\n },\r\n ];\r\n };\r\n\r\n const visibleColumns = columns.filter(col => col.visible);\r\n\r\n return (\r\n <div\r\n className=\"h-full overflow-auto\"\r\n style={{\r\n backgroundColor: theme.bgPrimary,\r\n borderRight: `1px solid ${theme.border}`,\r\n }}\r\n >\r\n {/* Header */}\r\n <div\r\n className=\"sticky top-0 z-10 flex items-center border-b\"\r\n style={{\r\n backgroundColor: theme.bgGrid,\r\n borderColor: theme.border,\r\n height: `${HEADER_HEIGHT}px`,\r\n }}\r\n >\r\n {visibleColumns.map((column) => (\r\n <div\r\n key={column.id}\r\n className=\"flex items-center px-4 border-r cursor-pointer hover:bg-opacity-50 transition-colors relative\"\r\n style={{\r\n width: `${column.width}px`,\r\n borderColor: theme.borderLight,\r\n height: '100%',\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 }}\r\n >\r\n {column.label}\r\n </span>\r\n </div>\r\n ))}\r\n \r\n {/* Add Column Button */}\r\n <div className=\"px-3 flex items-center gap-2 h-full\">\r\n <ColumnManager\r\n columns={columns}\r\n onToggleColumn={onToggleColumn}\r\n theme={theme}\r\n />\r\n\r\n {/* Keyboard Shortcuts Button */}\r\n <button\r\n onClick={() => setShowKeyboardHelp(!showKeyboardHelp)}\r\n className=\"p-1.5 rounded hover:bg-opacity-10 transition-colors relative group\"\r\n style={{ color: theme.textTertiary }}\r\n title=\"Keyboard shortcuts\"\r\n >\r\n <Keyboard className=\"w-4 h-4\" />\r\n\r\n {/* 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 }}>\r\n Keyboard Shortcuts\r\n </h3>\r\n <button\r\n onClick={() => setShowKeyboardHelp(false)}\r\n className=\"text-xs px-2 py-1 rounded hover:bg-opacity-10\"\r\n style={{ color: theme.textTertiary }}\r\n >\r\n Close\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-3 text-xs\">\r\n {/* Navigation */}\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\">\r\n <span style={{ color: theme.textTertiary }}>Move focus up/down</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>↑ / ↓</kbd>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span style={{ color: theme.textTertiary }}>Select range</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Shift + ↑ / ↓</kbd>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span style={{ color: theme.textTertiary }}>Toggle selection</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Cmd/Ctrl + Click</kbd>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Hierarchy */}\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\">\r\n <span style={{ color: theme.textTertiary }}>Indent task</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Tab</kbd>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span style={{ color: theme.textTertiary }}>Outdent task</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Shift + Tab</kbd>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span style={{ color: theme.textTertiary }}>Expand/Collapse</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>→ / ←</kbd>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Editing */}\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\">\r\n <span style={{ color: theme.textTertiary }}>Create task below</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Enter</kbd>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span style={{ color: theme.textTertiary }}>Create task above</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Shift + Enter</kbd>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span style={{ color: theme.textTertiary }}>Open task modal</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Cmd/Ctrl + Enter</kbd>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span style={{ color: theme.textTertiary }}>Rename task</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>F2</kbd>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\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\">\r\n <span style={{ color: theme.textTertiary }}>Move task up/down</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Alt + ↑ / ↓</kbd>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span style={{ color: theme.textTertiary }}>Delete task</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Delete</kbd>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span style={{ color: theme.textTertiary }}>Duplicate task</span>\r\n <kbd className=\"px-2 py-0.5 rounded font-mono text-xs\" style={{ backgroundColor: theme.bgGrid, color: theme.textPrimary }}>Cmd/Ctrl + D</kbd>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Task Rows */}\r\n {flatTasks.map(({ task, level }, index) => {\r\n const isSelected = isTaskSelected(task.id);\r\n\r\n return (\r\n <motion.div\r\n key={task.id}\r\n className=\"flex items-center border-b cursor-pointer group\"\r\n style={{\r\n height: `${ROW_HEIGHT}px`,\r\n borderTop: `1px solid ${isSelected ? theme.accent : theme.borderLight}`,\r\n borderRight: `1px solid ${isSelected ? theme.accent : theme.borderLight}`,\r\n borderBottom: `1px solid ${isSelected ? theme.accent : theme.borderLight}`,\r\n borderLeft: isSelected ? `3px solid ${theme.accent}` : '3px solid transparent',\r\n backgroundColor: isSelected\r\n ? theme.accentLight\r\n : (index % 2 === 0 ? theme.bgPrimary : theme.bgGrid),\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\r\n // Also trigger the regular click handler\r\n onTaskClick?.(task);\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 {visibleColumns.map((column) => (\r\n <div\r\n key={`${task.id}-${column.id}`}\r\n className=\"px-4 border-r flex items-center\"\r\n style={{\r\n width: `${column.width}px`,\r\n borderColor: hoveredTaskId === task.id ? theme.border : theme.borderLight,\r\n height: '100%',\r\n }}\r\n >\r\n {renderCellContent(column, task, column.id === 'name' ? level : 0)}\r\n </div>\r\n ))}\r\n </motion.div>\r\n );\r\n })}\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 </div>\r\n );\r\n}\r\n","/**\r\n * useDragState - Centralized drag state management\r\n * Manages all drag-related state in one place\r\n *\r\n * @version 0.8.1\r\n */\r\n\r\nimport { useState } from 'react';\r\n\r\nexport type DragMode = 'none' | 'move' | 'resize-start' | 'resize-end' | 'connect';\r\nexport type ActiveZone = 'move' | 'resize-start' | 'resize-end' | null;\r\n\r\nexport interface DragState {\r\n // Drag mode\r\n dragMode: DragMode;\r\n setDragMode: (mode: DragMode) => void;\r\n\r\n // Drag offset (distance from click to element origin)\r\n dragOffset: number;\r\n setDragOffset: (offset: number) => void;\r\n\r\n // Ghost position (visual feedback during drag)\r\n ghostX: number;\r\n setGhostX: (x: number) => void;\r\n ghostWidth: number;\r\n setGhostWidth: (width: number) => void;\r\n\r\n // Connection line\r\n connectionLine: { x: number; y: number } | null;\r\n setConnectionLine: (line: { x: number; y: number } | null) => void;\r\n\r\n // Hovered task (for dependency creation)\r\n hoveredTaskId: string | null;\r\n setHoveredTaskId: (id: string | null) => void;\r\n\r\n // Active zone (for visual feedback)\r\n activeZone: ActiveZone;\r\n setActiveZone: (zone: ActiveZone) => void;\r\n\r\n // Split task specific state\r\n draggedSegmentIndex: number | null;\r\n setDraggedSegmentIndex: (index: number | null) => void;\r\n draggedSegmentStartX: number;\r\n setDraggedSegmentStartX: (x: number) => void;\r\n segmentDragOffsetX: number;\r\n setSegmentDragOffsetX: (offset: number) => void;\r\n\r\n // Hover state\r\n hoveredSegmentIndex: number | null;\r\n setHoveredSegmentIndex: (index: number | null) => void;\r\n isHovered: boolean;\r\n setIsHovered: (hovered: boolean) => void;\r\n\r\n // Computed state\r\n isDragging: boolean;\r\n isResizing: boolean;\r\n isConnecting: boolean;\r\n\r\n // Reset all drag state\r\n resetDragState: (x: number, width: number) => void;\r\n}\r\n\r\nexport function useDragState(initialX: number, initialWidth: number): DragState {\r\n const [dragMode, setDragMode] = useState<DragMode>('none');\r\n const [dragOffset, setDragOffset] = useState(0);\r\n const [ghostX, setGhostX] = useState(initialX);\r\n const [ghostWidth, setGhostWidth] = useState(initialWidth);\r\n const [connectionLine, setConnectionLine] = useState<{ x: number; y: number } | null>(null);\r\n const [hoveredTaskId, setHoveredTaskId] = useState<string | null>(null);\r\n const [activeZone, setActiveZone] = useState<ActiveZone>(null);\r\n\r\n // Split task state\r\n const [draggedSegmentIndex, setDraggedSegmentIndex] = useState<number | null>(null);\r\n const [draggedSegmentStartX, setDraggedSegmentStartX] = useState(0);\r\n const [segmentDragOffsetX, setSegmentDragOffsetX] = useState(0);\r\n const [hoveredSegmentIndex, setHoveredSegmentIndex] = useState<number | null>(null);\r\n const [isHovered, setIsHovered] = useState(false);\r\n\r\n // Computed state\r\n const isDragging = dragMode !== 'none';\r\n const isResizing = dragMode === 'resize-start' || dragMode === 'resize-end';\r\n const isConnecting = dragMode === 'connect';\r\n\r\n // Reset all state to initial values\r\n const resetDragState = (x: number, width: number) => {\r\n setDragMode('none');\r\n setConnectionLine(null);\r\n setHoveredTaskId(null);\r\n setGhostX(x);\r\n setGhostWidth(width);\r\n setSegmentDragOffsetX(0);\r\n setDraggedSegmentIndex(null);\r\n setDraggedSegmentStartX(0);\r\n };\r\n\r\n return {\r\n dragMode,\r\n setDragMode,\r\n dragOffset,\r\n setDragOffset,\r\n ghostX,\r\n setGhostX,\r\n ghostWidth,\r\n setGhostWidth,\r\n connectionLine,\r\n setConnectionLine,\r\n hoveredTaskId,\r\n setHoveredTaskId,\r\n activeZone,\r\n setActiveZone,\r\n draggedSegmentIndex,\r\n setDraggedSegmentIndex,\r\n draggedSegmentStartX,\r\n setDraggedSegmentStartX,\r\n segmentDragOffsetX,\r\n setSegmentDragOffsetX,\r\n hoveredSegmentIndex,\r\n setHoveredSegmentIndex,\r\n isHovered,\r\n setIsHovered,\r\n isDragging,\r\n isResizing,\r\n isConnecting,\r\n resetDragState,\r\n };\r\n}\r\n","import { useRef, useCallback, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Task, GanttTemplates } from './types';\nimport { TaskPosition } from './Timeline';\nimport { useDragState } from './hooks/useDragState';\n\ninterface TaskBarProps {\n task: Task;\n x: number;\n y: number;\n width: number;\n theme: any;\n dayWidth: number;\n startDate: Date;\n templates: Required<GanttTemplates>; // v0.8.0\n onClick?: (task: Task) => void;\n onDoubleClick?: (task: Task) => void; // v0.8.0\n onContextMenu?: (task: Task, event: React.MouseEvent) => void; // v0.8.0\n onDateChange?: (task: Task, newStart: Date, newEnd: Date) => void;\n onDependencyCreate?: (fromTask: Task, toTaskId: string) => void;\n allTaskPositions?: TaskPosition[];\n}\n\ntype DragMode = 'none' | 'move' | 'resize-start' | 'resize-end' | 'connect';\n\nexport function TaskBar({\n task,\n x,\n y,\n width,\n theme,\n dayWidth,\n startDate,\n templates,\n onClick,\n onDoubleClick, // v0.8.0\n onContextMenu, // v0.8.0\n onDateChange,\n onDependencyCreate,\n allTaskPositions = []\n}: TaskBarProps) {\n // v0.8.1: Centralized drag state management for better modularity\n const dragState = useDragState(x, width);\n const svgRef = useRef<SVGGElement>(null);\n\n // Destructure for easier access (keeps existing code readable)\n const {\n dragMode, setDragMode,\n dragOffset, setDragOffset,\n ghostX, setGhostX,\n ghostWidth, setGhostWidth,\n connectionLine, setConnectionLine,\n hoveredTaskId, setHoveredTaskId,\n activeZone, setActiveZone,\n draggedSegmentIndex, setDraggedSegmentIndex,\n draggedSegmentStartX, setDraggedSegmentStartX,\n segmentDragOffsetX, setSegmentDragOffsetX,\n hoveredSegmentIndex, setHoveredSegmentIndex,\n isHovered, setIsHovered,\n isDragging, isResizing, isConnecting,\n resetDragState\n } = dragState;\n\n const height = 32;\n const borderRadius = 8;\n\n // Detect task states for neutral theme visualization\n const isOverdue = task.endDate && task.endDate < new Date() && task.progress < 100;\n const isAtRisk = task.isCriticalPath; // Critical path tasks are \"at risk\"\n const isNeutralTheme = theme.name === 'neutral' || theme.today === '#1C1917'; // Detect neutral theme\n\n // Dynamic resize zones based on bar width for better UX\n const getResizeZone = (barWidth: number): number => {\n if (barWidth >= 80) return 20; // Large bars: 20px zones\n if (barWidth >= 60) return 15; // Medium bars: 15px zones\n if (barWidth >= 50) return 12; // Small bars: 12px zones\n return 10; // Very small bars: 10px zones\n };\n\n const RESIZE_ZONE = getResizeZone(width);\n const isSmallBar = width < 50; // Flag for special handling\n const isVerySmallBar = width < 40; // Flag for ultra-small bars (simplified UX)\n\n // Format date for tooltip\n const formatDate = (date: Date) => {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n };\n\n // Calculate duration\n const getDuration = () => {\n const days = Math.ceil((task.endDate!.getTime() - task.startDate!.getTime()) / (1000 * 60 * 60 * 24));\n return `${days} day${days !== 1 ? 's' : ''}`;\n };\n\n // Snap position to nearest day\n const snapToDay = (pixelX: number): number => {\n const dayOffset = Math.round(pixelX / dayWidth) * dayWidth;\n return dayOffset;\n };\n\n // Convert pixel position to date\n const pixelToDate = (pixelX: number): Date => {\n const days = Math.round(pixelX / dayWidth);\n const newDate = new Date(startDate);\n newDate.setDate(newDate.getDate() + days);\n return newDate;\n };\n\n // Check if point is inside a task's bounding box\n const findTaskAtPoint = (pointX: number, pointY: number): string | null => {\n for (const taskPos of allTaskPositions) {\n // Skip current task\n if (taskPos.id === task.id) continue;\n\n // Check if point is within task bounds (with some padding for easier targeting)\n const padding = 5;\n if (\n pointX >= taskPos.x - padding &&\n pointX <= taskPos.x + taskPos.width + padding &&\n pointY >= taskPos.y - padding &&\n pointY <= taskPos.y + taskPos.height + padding\n ) {\n return taskPos.id;\n }\n }\n return null;\n };\n\n // TODO: Implement dynamic cursor styling based on mouse position\n // Determine cursor based on position\n // const getCursorStyle = (mouseX: number): string => {\n // if (dragMode !== 'none') {\n // if (dragMode === 'connect') return 'crosshair';\n // if (dragMode === 'resize-start' || dragMode === 'resize-end') return 'ew-resize';\n // if (dragMode === 'move') return 'grabbing';\n // }\n // const relativeX = mouseX - x;\n // // Resize zones at edges\n // if (relativeX <= RESIZE_ZONE) return 'ew-resize';\n // if (relativeX >= width - RESIZE_ZONE) return 'ew-resize';\n // // Move zone in the middle\n // return 'grab';\n // };\n\n // Handle mouse down for dragging\n // v0.8.1: Added segmentX parameter for split tasks - allows segments to calculate their own offset\n const handleMouseDown = useCallback((e: React.MouseEvent, mode?: DragMode, segmentX?: number) => {\n e.preventDefault();\n e.stopPropagation();\n\n const svgElement = svgRef.current?.ownerSVGElement;\n if (!svgElement) return;\n\n const point = svgElement.createSVGPoint();\n point.x = e.clientX;\n point.y = e.clientY;\n const svgPoint = point.matrixTransform(svgElement.getScreenCTM()?.inverse());\n\n // v0.8.1: Use segment position if provided (for split tasks), otherwise use global x\n const effectiveX = segmentX !== undefined ? segmentX : x;\n\n // Determine mode based on click position if not specified\n let actualMode = mode;\n if (!actualMode) {\n const relativeX = svgPoint.x - effectiveX;\n\n // Keyboard modifiers for forced modes\n if (e.shiftKey) {\n // SHIFT: Connection mode\n actualMode = 'connect';\n setConnectionLine({ x: x + width, y: y + height / 2 });\n } else if (e.ctrlKey || e.metaKey) {\n // CTRL/CMD: Force MOVE (useful for small bars)\n actualMode = 'move';\n } else if (e.altKey) {\n // ALT: Force RESIZE based on which half of bar is clicked\n actualMode = relativeX < width / 2 ? 'resize-start' : 'resize-end';\n }\n // Auto-detection based on position (adaptive based on bar size)\n else if (isVerySmallBar) {\n // Very small bars (<40px): Simple split - left half = move, right half = resize\n if (relativeX < width / 2) {\n actualMode = 'move';\n } else {\n actualMode = 'resize-end'; // Always resize from end for consistency\n }\n } else if (isSmallBar) {\n // Small bars (40-50px): Only resize if clicking very close to edges\n if (relativeX <= RESIZE_ZONE / 2) {\n actualMode = 'resize-start';\n } else if (relativeX >= width - RESIZE_ZONE / 2) {\n actualMode = 'resize-end';\n } else {\n actualMode = 'move'; // Default to move for small bars\n }\n } else {\n // Normal bars: Standard zone detection\n if (relativeX <= RESIZE_ZONE) {\n actualMode = 'resize-start';\n } else if (relativeX >= width - RESIZE_ZONE) {\n actualMode = 'resize-end';\n } else {\n actualMode = 'move';\n }\n }\n }\n\n setDragMode(actualMode);\n setIsHovered(false); // Hide all tooltips when dragging starts\n setActiveZone(null); // Clear active zone\n\n if (actualMode === 'move') {\n // v0.8.1: Use effectiveX (segment position for split tasks, global x otherwise)\n setDragOffset(svgPoint.x - effectiveX);\n } else if (actualMode === 'connect') {\n setConnectionLine({ x: x + width, y: y + height / 2 });\n } else {\n setDragOffset(0);\n }\n\n setGhostX(effectiveX);\n setGhostWidth(width);\n }, [x, width, y, height]);\n\n // Handle mouse move for dragging\n const handleMouseMove = useCallback((e: MouseEvent) => {\n if (dragMode === 'none') return;\n\n const svgElement = svgRef.current?.ownerSVGElement;\n if (!svgElement) return;\n\n const point = svgElement.createSVGPoint();\n point.x = e.clientX;\n point.y = e.clientY;\n const svgPoint = point.matrixTransform(svgElement.getScreenCTM()?.inverse());\n\n if (dragMode === 'connect') {\n // Update connection line end point\n setConnectionLine({ x: svgPoint.x, y: svgPoint.y });\n\n // Check if hovering over another task\n const targetTaskId = findTaskAtPoint(svgPoint.x, svgPoint.y);\n setHoveredTaskId(targetTaskId);\n } else if (dragMode === 'move') {\n // Move entire bar (or all segments if split task)\n const rawNewX = svgPoint.x - dragOffset;\n const snappedX = snapToDay(rawNewX);\n setGhostX(snappedX);\n setGhostWidth(width);\n\n // v0.8.1: For split tasks, calculate offset relative to the DRAGGED SEGMENT position\n if (task.segments && task.segments.length > 0 && draggedSegmentIndex !== null) {\n const segmentOffset = snappedX - draggedSegmentStartX; // Use saved segment position\n setSegmentDragOffsetX(segmentOffset);\n }\n } else if (dragMode === 'resize-start') {\n // Resize from start\n const rawNewStart = svgPoint.x;\n const snappedStart = snapToDay(rawNewStart);\n const newWidth = (x + width) - snappedStart;\n\n // Prevent negative or too small width (minimum 1 day)\n if (newWidth >= dayWidth) {\n setGhostX(snappedStart);\n setGhostWidth(newWidth);\n }\n } else if (dragMode === 'resize-end') {\n // Resize from end\n const rawNewEnd = svgPoint.x;\n const snappedEnd = snapToDay(rawNewEnd);\n const newWidth = snappedEnd - x;\n\n // Prevent negative or too small width (minimum 1 day)\n if (newWidth >= dayWidth) {\n setGhostWidth(newWidth);\n }\n }\n }, [dragMode, x, width, dayWidth, dragOffset, task, snapToDay, draggedSegmentIndex, draggedSegmentStartX, findTaskAtPoint, setHoveredTaskId, setConnectionLine, setGhostX, setGhostWidth, setSegmentDragOffsetX]);\n\n // Handle mouse up to finish dragging\n const handleMouseUp = useCallback(() => {\n if (dragMode === 'none') return;\n\n if (dragMode === 'connect') {\n // Create dependency if hovering over a valid task\n if (hoveredTaskId && onDependencyCreate) {\n onDependencyCreate(task, hoveredTaskId);\n }\n setConnectionLine(null);\n setHoveredTaskId(null);\n } else {\n const taskDuration = task.endDate!.getTime() - task.startDate!.getTime();\n let newStartDate: Date;\n let newEndDate: Date;\n let isValid = true;\n\n if (dragMode === 'move') {\n // Calculate new dates maintaining duration\n newStartDate = pixelToDate(ghostX);\n newEndDate = new Date(newStartDate.getTime() + taskDuration);\n\n // v0.8.1: Bryntum-style - Update ONLY the dragged segment (independent movement)\n if (task.segments && task.segments.length > 0 && draggedSegmentIndex !== null) {\n const dayOffset = Math.round(segmentDragOffsetX / dayWidth);\n const updatedSegments = task.segments.map((seg, idx) => {\n // Only update the segment that was dragged\n if (idx === draggedSegmentIndex) {\n const newSegStart = new Date(seg.startDate);\n const newSegEnd = new Date(seg.endDate);\n newSegStart.setDate(newSegStart.getDate() + dayOffset);\n newSegEnd.setDate(newSegEnd.getDate() + dayOffset);\n return { startDate: newSegStart, endDate: newSegEnd };\n }\n // Keep other segments unchanged\n return seg;\n });\n\n // Calculate new overall task dates (from all segments)\n const allDates = updatedSegments.flatMap(s => [s.startDate, s.endDate]);\n const newTaskStart = new Date(Math.min(...allDates.map(d => d.getTime())));\n const newTaskEnd = new Date(Math.max(...allDates.map(d => d.getTime())));\n\n // Update task with new segments\n onDateChange?.({ ...task, segments: updatedSegments }, newTaskStart, newTaskEnd);\n // v0.8.1: Use centralized reset function from useDragState hook\n resetDragState(x, width);\n return; // Exit early since we handled the update\n }\n } else if (dragMode === 'resize-start') {\n // Change start date, keep end date\n newStartDate = pixelToDate(ghostX);\n newEndDate = task.endDate!;\n\n // Validate: start date must be before end date\n if (newStartDate >= newEndDate) {\n console.warn('Invalid date range: start date must be before end date');\n isValid = false;\n }\n } else if (dragMode === 'resize-end') {\n // Change end date, keep start date\n newStartDate = task.startDate!;\n newEndDate = pixelToDate(ghostX + ghostWidth);\n\n // Validate: end date must be after start date\n if (newEndDate <= newStartDate) {\n console.warn('Invalid date range: end date must be after start date');\n isValid = false;\n }\n } else {\n // Shouldn't reach here, but handle gracefully\n isValid = false;\n }\n\n // Only update if valid\n if (isValid && newStartDate! && newEndDate!) {\n // Additional validation: minimum task duration of 1 day\n const minDuration = 24 * 60 * 60 * 1000; // 1 day in milliseconds\n if (newEndDate.getTime() - newStartDate.getTime() < minDuration) {\n console.warn('Invalid date range: task must be at least 1 day long');\n // Reset to original dates by not calling onDateChange\n } else {\n onDateChange?.(task, newStartDate, newEndDate);\n }\n }\n }\n\n // v0.8.1: Use centralized reset function from useDragState hook\n resetDragState(x, width);\n }, [dragMode, ghostX, ghostWidth, task, onDateChange, hoveredTaskId, onDependencyCreate, x, width, dayWidth, pixelToDate, segmentDragOffsetX, draggedSegmentIndex, resetDragState]);\n\n // Setup global mouse listeners for smooth dragging\n useEffect(() => {\n if (dragMode === 'none') return;\n\n const handleGlobalMouseMove = (e: MouseEvent) => {\n handleMouseMove(e);\n };\n\n const handleGlobalMouseUp = () => {\n handleMouseUp();\n };\n\n window.addEventListener('mousemove', handleGlobalMouseMove);\n window.addEventListener('mouseup', handleGlobalMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleGlobalMouseMove);\n window.removeEventListener('mouseup', handleGlobalMouseUp);\n };\n }, [dragMode, handleMouseMove, handleMouseUp]);\n\n // v0.8.1: isDragging, isResizing, isConnecting now provided by useDragState hook\n const displayX = isDragging && !isConnecting ? ghostX : x;\n const displayWidth = isDragging && !isConnecting ? ghostWidth : width;\n\n // v0.8.0: Generate tooltip and custom class using templates\n const tooltipContent = templates.taskTooltip(task);\n const tooltipText = typeof tooltipContent === 'string' ? tooltipContent : '';\n const customClass = templates.taskClass(task);\n\n return (\n <g\n ref={svgRef}\n onMouseEnter={() => !isDragging && setIsHovered(true)}\n onMouseLeave={() => {\n if (!isDragging) {\n setIsHovered(false);\n setActiveZone(null);\n }\n }}\n onClick={() => !isDragging && onClick?.(task)}\n onDoubleClick={(e) => {\n // v0.8.0: Double-click event\n if (!isDragging) {\n e.stopPropagation();\n onDoubleClick?.(task);\n }\n }}\n onContextMenu={(e) => {\n // v0.8.0: Context menu event\n e.preventDefault();\n onContextMenu?.(task, e as any);\n }}\n >\n {/* v0.8.0: Tooltip using taskTooltip template */}\n {tooltipText && <title dangerouslySetInnerHTML={{ __html: tooltipText }} />}\n {/* Zone Indicators with hover feedback - v0.8.1: Disabled for split tasks (segments are independent) */}\n {isHovered && !isDragging && !isSmallBar && !task.segments && (\n <>\n {/* Left resize zone with subtle highlight on hover */}\n <rect\n x={x}\n y={y}\n width={RESIZE_ZONE}\n height={height}\n fill={activeZone === 'resize-start' ? theme.accent : 'transparent'}\n opacity={activeZone === 'resize-start' ? 0.15 : 0}\n style={{ cursor: 'ew-resize', pointerEvents: 'all' }}\n onMouseEnter={() => setActiveZone('resize-start')}\n onMouseDown={(e) => handleMouseDown(e as any, 'resize-start')}\n />\n {/* Center move zone */}\n <rect\n x={x + RESIZE_ZONE}\n y={y}\n width={width - RESIZE_ZONE * 2}\n height={height}\n fill={activeZone === 'move' ? theme.accent : 'transparent'}\n opacity={activeZone === 'move' ? 0.1 : 0}\n style={{ cursor: 'grab', pointerEvents: 'all' }}\n onMouseEnter={() => setActiveZone('move')}\n onMouseDown={(e) => handleMouseDown(e as any, 'move')}\n />\n {/* Right resize zone with subtle highlight on hover */}\n <rect\n x={x + width - RESIZE_ZONE}\n y={y}\n width={RESIZE_ZONE}\n height={height}\n fill={activeZone === 'resize-end' ? theme.accent : 'transparent'}\n opacity={activeZone === 'resize-end' ? 0.15 : 0}\n style={{ cursor: 'ew-resize', pointerEvents: 'all' }}\n onMouseEnter={() => setActiveZone('resize-end')}\n onMouseDown={(e) => handleMouseDown(e as any, 'resize-end')}\n />\n </>\n )}\n\n {/* Simplified zones for very small bars (split in half) */}\n {isHovered && !isDragging && isVerySmallBar && (\n <>\n {/* Left half - MOVE zone */}\n <rect\n x={x}\n y={y}\n width={width / 2}\n height={height}\n fill={activeZone === 'move' ? theme.accent : 'transparent'}\n opacity={activeZone === 'move' ? 0.2 : 0}\n style={{ cursor: 'grab', pointerEvents: 'all' }}\n onMouseEnter={() => setActiveZone('move')}\n onMouseDown={(e) => handleMouseDown(e as any, 'move')}\n />\n {/* Right half - RESIZE zone */}\n <rect\n x={x + width / 2}\n y={y}\n width={width / 2}\n height={height}\n fill={activeZone === 'resize-end' ? theme.accent : 'transparent'}\n opacity={activeZone === 'resize-end' ? 0.2 : 0}\n style={{ cursor: 'ew-resize', pointerEvents: 'all' }}\n onMouseEnter={() => setActiveZone('resize-end')}\n onMouseDown={(e) => handleMouseDown(e as any, 'resize-end')}\n />\n {/* Visual divider line at center */}\n {isHovered && (\n <motion.line\n x1={x + width / 2}\n y1={y + 4}\n x2={x + width / 2}\n y2={y + height - 4}\n stroke={theme.textTertiary}\n strokeWidth={1}\n strokeDasharray=\"2 2\"\n opacity={0.3}\n initial={{ opacity: 0 }}\n animate={{ opacity: 0.3 }}\n transition={{ duration: 0.2 }}\n style={{ pointerEvents: 'none' }}\n />\n )}\n </>\n )}\n\n {/* Ghost/Preview Bar (shown while dragging) */}\n {/* v0.8.1: Hide ghost bar for split tasks - segments handle their own visualization */}\n {isDragging && !isConnecting && !task.segments && (\n <motion.rect\n x={ghostX}\n y={y}\n width={ghostWidth}\n height={height}\n rx={borderRadius}\n fill={task.isCriticalPath ? '#DC2626' : theme.taskBarPrimary}\n opacity={0.3}\n stroke={task.isCriticalPath ? '#EF4444' : theme.accent}\n strokeWidth={2}\n strokeDasharray=\"4 4\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 0.5 }}\n transition={{ duration: 0.15 }}\n style={{ pointerEvents: 'none' }}\n />\n )}\n\n {/* Main Task Bar - Background (light for contrast with progress) - v0.8.0: With custom class */}\n {/* v0.8.1: Hide main bar when task has segments (split task) */}\n {!task.segments && (\n <motion.rect\n x={displayX}\n y={y}\n width={displayWidth}\n height={height}\n rx={borderRadius}\n fill={task.isCriticalPath ? '#DC2626' : theme.taskBarPrimary}\n data-task-class={customClass}\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{\n opacity: isDragging && !isConnecting ? 0.15 : isHovered ? 0.25 : 0.2, // Much lighter background\n scale: isHovered && !isDragging ? 1.02 : 1,\n }}\n transition={{\n duration: 0.2,\n ease: [0.4, 0, 0.2, 1],\n }}\n onMouseDown={(e) => handleMouseDown(e as any)}\n style={{\n cursor: isDragging ? (isConnecting ? 'crosshair' : isResizing ? 'ew-resize' : 'grabbing') : 'grab',\n pointerEvents: 'all'\n }}\n />\n )}\n\n {/* Progress Fill - Solid color for instant visual scanning */}\n {/* Eye processes shape/color faster than text */}\n {!task.segments && (\n <rect\n x={displayX}\n y={y}\n width={displayWidth * (task.progress / 100)}\n height={height}\n rx={borderRadius}\n fill={theme.taskBarProgress}\n opacity={1}\n style={{ pointerEvents: 'none' }}\n />\n )}\n\n {/* v0.8.1: Render segments if task is split (has gaps) - Bryntum-style independent segments */}\n {task.segments && task.segments.map((segment, idx) => {\n const segmentStartX = ((segment.startDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24)) * dayWidth;\n const segmentEndX = ((segment.endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24)) * dayWidth;\n const segmentWidth = segmentEndX - segmentStartX + dayWidth;\n\n // v0.8.1: Only apply drag offset to the specific segment being dragged\n const isThisSegmentDragging = isDragging && dragMode === 'move' && draggedSegmentIndex === idx;\n const isThisSegmentHovered = hoveredSegmentIndex === idx;\n const displaySegmentX = isThisSegmentDragging ? segmentStartX + segmentDragOffsetX : segmentStartX;\n\n return (\n <g\n key={`segment-${idx}`}\n onMouseEnter={() => !isDragging && setHoveredSegmentIndex(idx)}\n onMouseLeave={() => !isDragging && setHoveredSegmentIndex(null)}\n >\n {/* Segment background - interactive */}\n <motion.rect\n x={displaySegmentX}\n y={y}\n width={segmentWidth}\n height={height}\n rx={borderRadius}\n fill={task.isCriticalPath ? '#DC2626' : theme.taskBarPrimary}\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{\n opacity: isThisSegmentDragging ? 0.6 : isThisSegmentHovered ? 0.9 : 0.8,\n scale: isThisSegmentHovered && !isDragging ? 1.02 : 1,\n }}\n transition={{\n duration: 0.2,\n ease: [0.4, 0, 0.2, 1],\n }}\n onMouseDown={(e) => {\n // v0.8.1: Capture which segment is being dragged and pass its position\n e.stopPropagation();\n setDraggedSegmentIndex(idx);\n setDraggedSegmentStartX(segmentStartX); // Save original position for offset calculation\n handleMouseDown(e as any, undefined, segmentStartX);\n }}\n style={{\n cursor: isDragging ? (isConnecting ? 'crosshair' : isResizing ? 'ew-resize' : 'grabbing') : 'grab',\n pointerEvents: 'all'\n }}\n />\n {/* Segment progress */}\n <rect\n x={displaySegmentX}\n y={y}\n width={segmentWidth * (task.progress / 100)}\n height={height}\n rx={borderRadius}\n fill={theme.taskBarProgress}\n opacity={1}\n style={{ pointerEvents: 'none' }}\n />\n </g>\n );\n })}\n\n {/* Neutral Theme: State visualization without color */}\n {/* v0.8.1: Hide state visualization for split tasks (shown on segments instead) */}\n {isNeutralTheme && (isOverdue || isAtRisk) && !task.segments && (\n <>\n {/* At Risk: Dotted border */}\n {isAtRisk && !isOverdue && (\n <rect\n x={displayX}\n y={y}\n width={displayWidth}\n height={height}\n rx={borderRadius}\n fill=\"none\"\n stroke={theme.border}\n strokeWidth={2}\n strokeDasharray=\"4 4\"\n opacity={0.8}\n style={{ pointerEvents: 'none' }}\n />\n )}\n\n {/* Overdue: Diagonal stripes pattern */}\n {isOverdue && (\n <rect\n x={displayX}\n y={y}\n width={displayWidth}\n height={height}\n rx={borderRadius}\n fill=\"url(#diagonal-stripes)\"\n opacity={0.3}\n style={{ pointerEvents: 'none' }}\n />\n )}\n </>\n )}\n\n {/* Task Name Text - v0.8.0: Using taskLabel template */}\n {/* v0.8.1: Hide text for split tasks to avoid blocking segment clicks */}\n {displayWidth > 60 && !task.segments && (() => {\n const label = templates.taskLabel(task);\n const labelText = typeof label === 'string' ? label : task.name;\n const truncated = labelText.length > Math.floor(displayWidth / 8)\n ? `${labelText.substring(0, Math.floor(displayWidth / 8))}...`\n : labelText;\n\n return (\n <text\n x={displayX + 12}\n y={y + height / 2}\n dominantBaseline=\"middle\"\n fill=\"#FFFFFF\"\n fontSize=\"13\"\n fontWeight=\"500\"\n fontFamily=\"Inter, sans-serif\"\n style={{ pointerEvents: 'none', userSelect: 'none' }}\n >\n {truncated}\n </text>\n );\n })()}\n\n {/* Progress Percentage */}\n {/* v0.8.1: Hide progress text for split tasks to avoid blocking segment clicks */}\n {displayWidth > 100 && task.progress > 0 && task.progress < 100 && !isDragging && !task.segments && (\n <text\n x={displayX + displayWidth - 12}\n y={y + height / 2}\n dominantBaseline=\"middle\"\n textAnchor=\"end\"\n fill=\"rgba(255, 255, 255, 0.9)\"\n fontSize=\"11\"\n fontWeight=\"600\"\n fontFamily=\"Inter, sans-serif\"\n style={{ pointerEvents: 'none', userSelect: 'none' }}\n >\n {task.progress}%\n </text>\n )}\n\n {/* Status Indicator Badge */}\n {/* v0.8.1: Hide status badge for split tasks to avoid blocking segment clicks */}\n {task.status && displayWidth > 80 && !isDragging && !task.segments && (\n <g style={{ pointerEvents: 'none' }}>\n {task.status === 'completed' && (\n <circle\n cx={displayX + displayWidth - 8}\n cy={y + 8}\n r={4}\n fill={theme.statusCompleted}\n stroke=\"#FFFFFF\"\n strokeWidth={1.5}\n />\n )}\n {task.status === 'in-progress' && (\n <circle\n cx={displayX + displayWidth - 8}\n cy={y + 8}\n r={4}\n fill={theme.statusInProgress}\n stroke=\"#FFFFFF\"\n strokeWidth={1.5}\n opacity={0.8}\n />\n )}\n </g>\n )}\n\n {/* Enhanced Resize Handles (larger, easier to grab) */}\n {/* v0.8.1: Hide resize handles for split tasks */}\n {(isHovered || isResizing) && !isConnecting && !task.segments && (\n <>\n {/* Start Handle - Adaptive positioning for small bars */}\n <g style={{ pointerEvents: 'all' }}>\n {/* Invisible larger hit area */}\n <rect\n x={isSmallBar ? displayX - 15 : displayX - 10}\n y={y - 5}\n width={isSmallBar ? 25 : 20}\n height={height + 10}\n fill=\"transparent\"\n onMouseDown={(e) => handleMouseDown(e as any, 'resize-start')}\n style={{ cursor: 'ew-resize' }}\n />\n {/* Visual indicator - positioned outside for small bars */}\n <motion.rect\n x={isSmallBar ? displayX - 8 : displayX - 3}\n y={y + 6}\n width={isSmallBar ? 8 : 6}\n height={isSmallBar ? height - 12 : height - 16}\n rx={3}\n fill={dragMode === 'resize-start' ? theme.accent : theme.taskBarHandle}\n stroke={theme.taskBarPrimary}\n strokeWidth={1.5}\n initial={{ opacity: 0, scale: 0 }}\n animate={{\n opacity: 1,\n scale: dragMode === 'resize-start' ? 1.2 : 1\n }}\n transition={{\n duration: 0.2,\n type: 'spring',\n stiffness: 400,\n damping: 25,\n }}\n style={{ pointerEvents: 'none' }}\n />\n </g>\n\n {/* End Handle - Adaptive positioning for small bars */}\n <g style={{ pointerEvents: 'all' }}>\n {/* Invisible larger hit area */}\n <rect\n x={isSmallBar ? displayX + displayWidth - 10 : displayX + displayWidth - 10}\n y={y - 5}\n width={isSmallBar ? 25 : 20}\n height={height + 10}\n fill=\"transparent\"\n onMouseDown={(e) => handleMouseDown(e as any, 'resize-end')}\n style={{ cursor: 'ew-resize' }}\n />\n {/* Visual indicator - positioned outside for small bars */}\n <motion.rect\n x={isSmallBar ? displayX + displayWidth : displayX + displayWidth - 3}\n y={y + 6}\n width={isSmallBar ? 8 : 6}\n height={isSmallBar ? height - 12 : height - 16}\n rx={3}\n fill={dragMode === 'resize-end' ? theme.accent : theme.taskBarHandle}\n stroke={theme.taskBarPrimary}\n strokeWidth={1.5}\n initial={{ opacity: 0, scale: 0 }}\n animate={{\n opacity: 1,\n scale: dragMode === 'resize-end' ? 1.2 : 1\n }}\n transition={{\n duration: 0.2,\n type: 'spring',\n stiffness: 400,\n damping: 25,\n }}\n style={{ pointerEvents: 'none' }}\n />\n </g>\n </>\n )}\n\n {/* Connection Handle (right side, Shift+Click) - v0.8.1: Disabled for split tasks (segments are independent) */}\n <AnimatePresence>\n {isHovered && !isDragging && !task.segments && (\n <motion.g\n style={{ pointerEvents: 'all' }}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n <motion.circle\n cx={x + width + 8}\n cy={y + height / 2}\n r={6}\n fill={theme.accent}\n stroke=\"#FFFFFF\"\n strokeWidth={2}\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n transition={{\n duration: 0.2,\n type: 'spring',\n stiffness: 400,\n damping: 25,\n }}\n onMouseDown={(e) => {\n e.stopPropagation();\n handleMouseDown(e as any, 'connect');\n }}\n style={{ cursor: 'crosshair' }}\n />\n {/* Tooltip hint */}\n <text\n x={x + width + 20}\n y={y + height / 2}\n dominantBaseline=\"middle\"\n fill={theme.textTertiary}\n fontSize=\"10\"\n fontFamily=\"Inter, sans-serif\"\n style={{ pointerEvents: 'none', userSelect: 'none' }}\n >\n Link\n </text>\n </motion.g>\n )}\n </AnimatePresence>\n\n {/* Connection Line (while connecting) */}\n {isConnecting && connectionLine && (\n <g style={{ pointerEvents: 'none' }}>\n <motion.line\n x1={x + width}\n y1={y + height / 2}\n x2={connectionLine.x}\n y2={connectionLine.y}\n stroke={hoveredTaskId ? theme.statusCompleted : theme.accent}\n strokeWidth={hoveredTaskId ? 3 : 2}\n strokeDasharray=\"6 4\"\n initial={{ opacity: 0 }}\n animate={{ opacity: hoveredTaskId ? 1 : 0.8 }}\n transition={{ duration: 0.15 }}\n />\n <motion.circle\n cx={connectionLine.x}\n cy={connectionLine.y}\n r={hoveredTaskId ? 8 : 6}\n fill={hoveredTaskId ? theme.statusCompleted : theme.accent}\n stroke=\"#FFFFFF\"\n strokeWidth={2}\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n transition={{ duration: 0.15 }}\n />\n {/* Hover indicator text */}\n {hoveredTaskId && (\n <motion.text\n x={connectionLine.x + 15}\n y={connectionLine.y}\n dominantBaseline=\"middle\"\n fill={theme.statusCompleted}\n fontSize=\"11\"\n fontWeight=\"600\"\n fontFamily=\"Inter, sans-serif\"\n initial={{ opacity: 0, x: connectionLine.x + 10 }}\n animate={{ opacity: 1, x: connectionLine.x + 15 }}\n transition={{ duration: 0.2 }}\n >\n Connect\n </motion.text>\n )}\n </g>\n )}\n\n {/* Hover Glow Effect - v0.8.1: Disabled for split tasks (segments are independent) */}\n {(isHovered || isDragging) && !isConnecting && !task.segments && (\n <motion.rect\n x={displayX - 2}\n y={y - 2}\n width={displayWidth + 4}\n height={height + 4}\n rx={borderRadius + 2}\n fill=\"none\"\n stroke={isDragging ? theme.accent : theme.taskBarPrimary}\n strokeWidth={2}\n opacity={isDragging ? 0.6 : 0.4}\n initial={{ opacity: 0 }}\n animate={{ opacity: isDragging ? 0.6 : 0.4 }}\n transition={{ duration: 0.2 }}\n style={{ pointerEvents: 'none' }}\n />\n )}\n\n {/* Vertical Snap Guides (shown while resizing) */}\n {isResizing && (\n <>\n <line\n x1={ghostX}\n y1={0}\n x2={ghostX}\n y2={1000}\n stroke={theme.accent}\n strokeWidth={1}\n strokeDasharray=\"4 4\"\n opacity={0.3}\n style={{ pointerEvents: 'none' }}\n />\n <line\n x1={ghostX + ghostWidth}\n y1={0}\n x2={ghostX + ghostWidth}\n y2={1000}\n stroke={theme.accent}\n strokeWidth={1}\n strokeDasharray=\"4 4\"\n opacity={0.3}\n style={{ pointerEvents: 'none' }}\n />\n </>\n )}\n\n {/* Enhanced Detailed Tooltip (shown on hover, hidden while dragging) - v0.8.1: Disabled for split tasks (segments are independent) */}\n <AnimatePresence>\n {isHovered && !isDragging && !task.segments && (\n <motion.g\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.2 }}\n style={{ pointerEvents: 'none' }}\n >\n {/* Tooltip Background */}\n <rect\n x={displayX + displayWidth / 2 - 120}\n y={y - 95}\n width={240}\n height={82}\n rx={8}\n fill={theme.bgSecondary}\n stroke={theme.border}\n strokeWidth={1}\n filter=\"drop-shadow(0 4px 12px rgba(0, 0, 0, 0.15))\"\n />\n\n {/* Tooltip Arrow */}\n <path\n d={`M ${displayX + displayWidth / 2 - 6} ${y - 13} L ${displayX + displayWidth / 2} ${y - 3} L ${displayX + displayWidth / 2 + 6} ${y - 13}`}\n fill={theme.bgSecondary}\n stroke={theme.border}\n strokeWidth={1}\n />\n\n {/* Task Name */}\n <text\n x={displayX + displayWidth / 2}\n y={y - 73}\n textAnchor=\"middle\"\n fill={theme.textPrimary}\n fontSize=\"13\"\n fontWeight=\"600\"\n fontFamily=\"Inter, sans-serif\"\n >\n {task.name.length > 28 ? `${task.name.substring(0, 28)}...` : task.name}\n </text>\n\n {/* Dates */}\n <text\n x={displayX + displayWidth / 2 - 110}\n y={y - 55}\n fill={theme.textTertiary}\n fontSize=\"11\"\n fontFamily=\"Inter, sans-serif\"\n >\n Start:\n </text>\n <text\n x={displayX + displayWidth / 2 - 70}\n y={y - 55}\n fill={theme.textSecondary}\n fontSize=\"11\"\n fontWeight=\"500\"\n fontFamily=\"Inter, sans-serif\"\n >\n {formatDate(task.startDate!)}\n </text>\n\n <text\n x={displayX + displayWidth / 2 - 110}\n y={y - 40}\n fill={theme.textTertiary}\n fontSize=\"11\"\n fontFamily=\"Inter, sans-serif\"\n >\n End:\n </text>\n <text\n x={displayX + displayWidth / 2 - 70}\n y={y - 40}\n fill={theme.textSecondary}\n fontSize=\"11\"\n fontWeight=\"500\"\n fontFamily=\"Inter, sans-serif\"\n >\n {formatDate(task.endDate!)}\n </text>\n\n {/* Duration */}\n <text\n x={displayX + displayWidth / 2 + 10}\n y={y - 55}\n fill={theme.textTertiary}\n fontSize=\"11\"\n fontFamily=\"Inter, sans-serif\"\n >\n Duration:\n </text>\n <text\n x={displayX + displayWidth / 2 + 65}\n y={y - 55}\n fill={theme.textSecondary}\n fontSize=\"11\"\n fontWeight=\"500\"\n fontFamily=\"Inter, sans-serif\"\n >\n {getDuration()}\n </text>\n\n {/* Progress */}\n <text\n x={displayX + displayWidth / 2 + 10}\n y={y - 40}\n fill={theme.textTertiary}\n fontSize=\"11\"\n fontFamily=\"Inter, sans-serif\"\n >\n Progress:\n </text>\n <text\n x={displayX + displayWidth / 2 + 65}\n y={y - 40}\n fill={theme.textSecondary}\n fontSize=\"11\"\n fontWeight=\"500\"\n fontFamily=\"Inter, sans-serif\"\n >\n {task.progress}%\n </text>\n\n {/* Assignees */}\n {task.assignees && task.assignees.length > 0 && (\n <>\n <text\n x={displayX + displayWidth / 2 - 110}\n y={y - 25}\n fill={theme.textTertiary}\n fontSize=\"11\"\n fontFamily=\"Inter, sans-serif\"\n >\n Assignees:\n </text>\n <text\n x={displayX + displayWidth / 2 - 50}\n y={y - 25}\n fill={theme.textSecondary}\n fontSize=\"11\"\n fontWeight=\"500\"\n fontFamily=\"Inter, sans-serif\"\n >\n {task.assignees.map(a => a.name).join(', ').substring(0, 30)}\n {task.assignees.map(a => a.name).join(', ').length > 30 ? '...' : ''}\n </text>\n </>\n )}\n\n {/* Interaction Hints - Adaptive for bar size */}\n <text\n x={displayX + displayWidth / 2}\n y={y - 18}\n textAnchor=\"middle\"\n fill={theme.textTertiary}\n fontSize=\"9\"\n fontFamily=\"Inter, sans-serif\"\n style={{ opacity: 0.7 }}\n >\n {isVerySmallBar\n ? 'Left: move • Right: resize'\n : isSmallBar\n ? 'Drag to move • Hold ALT + drag edge to resize'\n : 'Drag edges to resize • Drag center to move • Click ⚫ to link'\n }\n </text>\n </motion.g>\n )}\n </AnimatePresence>\n </g>\n );\n}\n","import { useState } from 'react';\r\nimport { motion } from 'framer-motion';\r\n\r\ninterface DependencyLineProps {\r\n x1: number;\r\n y1: number;\r\n x2: number;\r\n y2: number;\r\n theme: any;\r\n onDelete?: () => void;\r\n}\r\n\r\nexport function DependencyLine({ x1, y1, x2, y2, theme, onDelete }: DependencyLineProps) {\r\n const [isHovered, setIsHovered] = useState(false);\r\n\r\n // Calculate control points for smooth Bézier curve\r\n const dx = x2 - x1;\r\n const dy = y2 - y1;\r\n const midX = x1 + dx / 2;\r\n \r\n // Create elegant S-curve path\r\n const path = `M ${x1} ${y1} C ${midX} ${y1}, ${midX} ${y2}, ${x2} ${y2}`;\r\n\r\n // Arrow marker at the end\r\n const arrowSize = 6;\r\n const angle = Math.atan2(dy, dx);\r\n const arrowX = x2 - arrowSize * Math.cos(angle - Math.PI / 6);\r\n const arrowY = y2 - arrowSize * Math.sin(angle - Math.PI / 6);\r\n const arrowX2 = x2 - arrowSize * Math.cos(angle + Math.PI / 6);\r\n const arrowY2 = y2 - arrowSize * Math.sin(angle + Math.PI / 6);\r\n\r\n // Dependencies are always gray - critical path only affects TASK BARS, not dependency lines\r\n const lineColor = theme.dependency;\r\n\r\n return (\r\n <g\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => setIsHovered(false)}\r\n >\r\n {/* Invisible wider path for easier hover detection */}\r\n <path\r\n d={path}\r\n fill=\"none\"\r\n stroke=\"transparent\"\r\n strokeWidth={20}\r\n strokeLinecap=\"round\"\r\n style={{ cursor: 'pointer' }}\r\n />\r\n\r\n {/* Main dependency line */}\r\n <motion.path\r\n d={path}\r\n fill=\"none\"\r\n stroke={lineColor}\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n initial={{ pathLength: 0, opacity: 0 }}\r\n animate={{\r\n pathLength: 1,\r\n opacity: isHovered ? 1 : 0.6,\r\n strokeWidth: isHovered ? 2.5 : 2,\r\n }}\r\n transition={{\r\n pathLength: { duration: 0.5, ease: 'easeInOut' },\r\n opacity: { duration: 0.2 },\r\n strokeWidth: { duration: 0.2 },\r\n }}\r\n />\r\n\r\n {/* Arrow head */}\r\n <motion.path\r\n d={`M ${x2} ${y2} L ${arrowX} ${arrowY} M ${x2} ${y2} L ${arrowX2} ${arrowY2}`}\r\n fill=\"none\"\r\n stroke={lineColor}\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n initial={{ opacity: 0, scale: 0.8 }}\r\n animate={{\r\n opacity: isHovered ? 1 : 0.6,\r\n scale: isHovered ? 1.1 : 1,\r\n strokeWidth: isHovered ? 2.5 : 2,\r\n }}\r\n transition={{ duration: 0.2 }}\r\n />\r\n\r\n {/* Endpoint dot */}\r\n <motion.circle\r\n cx={x2}\r\n cy={y2}\r\n r={3}\r\n fill={lineColor}\r\n initial={{ scale: 0 }}\r\n animate={{\r\n scale: isHovered ? 1.33 : 1,\r\n }}\r\n transition={{\r\n scale: { delay: 0.3, duration: 0.2 },\r\n }}\r\n />\r\n\r\n {/* Delete button (appears on hover) */}\r\n {isHovered && onDelete && (\r\n <motion.g\r\n initial={{ opacity: 0, scale: 0 }}\r\n animate={{ opacity: 1, scale: 1 }}\r\n transition={{ duration: 0.2 }}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDelete();\r\n }}\r\n style={{ cursor: 'pointer' }}\r\n >\r\n {/* Position delete button at midpoint of the line */}\r\n <circle\r\n cx={midX}\r\n cy={(y1 + y2) / 2}\r\n r={10}\r\n fill={theme.bgSecondary}\r\n stroke={theme.error || '#ef4444'}\r\n strokeWidth={2}\r\n />\r\n {/* X icon */}\r\n <line\r\n x1={midX - 4}\r\n y1={(y1 + y2) / 2 - 4}\r\n x2={midX + 4}\r\n y2={(y1 + y2) / 2 + 4}\r\n stroke={theme.error || '#ef4444'}\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n />\r\n <line\r\n x1={midX + 4}\r\n y1={(y1 + y2) / 2 - 4}\r\n x2={midX - 4}\r\n y2={(y1 + y2) / 2 + 4}\r\n stroke={theme.error || '#ef4444'}\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n />\r\n </motion.g>\r\n )}\r\n </g>\r\n );\r\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 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 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 { useMemo, useCallback } from 'react';\r\nimport { TimeScale, Task, GanttTemplates } from './types';\r\nimport { TaskBar } from './TaskBar';\r\nimport { DependencyLine } from './DependencyLine';\r\nimport { Milestone } from './Milestone';\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 templates: Required<GanttTemplates>; // v0.8.0\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}\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 templates,\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}: TimelineProps) {\r\n const HEADER_HEIGHT = 48; // Must match TaskGrid's HEADER_HEIGHT for alignment\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 // 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 // Call the date change handler to create the task bar\r\n onTaskDateChange?.(task, clickedDate, endDate);\r\n }, [pixelToDate, onTaskDateChange]);\r\n\r\n // Flatten tasks for rendering\r\n const flattenTasks = (tasks: Task[], result: Task[] = []): Task[] => {\r\n for (const task of tasks) {\r\n result.push(task);\r\n if (task.subtasks && task.subtasks.length > 0 && task.isExpanded) {\r\n flattenTasks(task.subtasks, result);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n const flatTasks = flattenTasks(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 const duration = (taskEnd - taskStart) / (1000 * 60 * 60 * 24);\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 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 = HEADER_HEIGHT + actualIndex * ROW_HEIGHT + 12;\r\n return {\r\n id: task.id,\r\n x,\r\n y,\r\n width,\r\n height: 32, // TaskBar height\r\n };\r\n });\r\n }, [flatTasks, getTaskPosition]);\r\n\r\n // Generate timeline headers\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('en-US', { 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: `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('en-US', { 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]);\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 return (\r\n <div\r\n className=\"flex-1 overflow-auto\"\r\n data-gantt-chart\r\n style={{ backgroundColor: theme.bgPrimary }}\r\n >\r\n <svg\r\n width={Math.max(timelineWidth, 1000)}\r\n height={Math.max(flatTasks.length * ROW_HEIGHT + HEADER_HEIGHT, 600)}\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 </defs>\r\n\r\n {/* Full SVG Background */}\r\n <rect\r\n x={0}\r\n y={0}\r\n width={Math.max(timelineWidth, 1000)}\r\n height={Math.max(flatTasks.length * ROW_HEIGHT + HEADER_HEIGHT, 600)}\r\n fill={theme.bgPrimary}\r\n />\r\n\r\n {/* Header Background */}\r\n <rect\r\n x={0}\r\n y={0}\r\n width={timelineWidth}\r\n height={HEADER_HEIGHT}\r\n fill={theme.bgGrid}\r\n />\r\n\r\n {/* Grid Lines and Weekend Backgrounds */}\r\n {headers.map((header, index) => {\r\n const nextX = headers[index + 1]?.x || timelineWidth;\r\n const isWeekendDay = isWeekend(header.date);\r\n\r\n return (\r\n <g key={index}>\r\n {/* Weekend background - subtle highlight */}\r\n {isWeekendDay && (\r\n <rect\r\n x={header.x}\r\n y={HEADER_HEIGHT}\r\n width={nextX - header.x}\r\n height={flatTasks.length * ROW_HEIGHT}\r\n fill={theme.bgWeekend}\r\n opacity={0.6}\r\n />\r\n )}\r\n\r\n {/* Grid line */}\r\n <line\r\n x1={header.x}\r\n y1={HEADER_HEIGHT}\r\n x2={header.x}\r\n y2={flatTasks.length * ROW_HEIGHT + HEADER_HEIGHT}\r\n stroke={theme.border}\r\n strokeWidth={1}\r\n opacity={0.1}\r\n />\r\n\r\n {/* Header text */}\r\n <text\r\n x={header.x + 8}\r\n y={HEADER_HEIGHT / 2}\r\n fill={theme.textTertiary}\r\n fontSize=\"11\"\r\n fontFamily=\"Inter, sans-serif\"\r\n dominantBaseline=\"middle\"\r\n >\r\n {header.label}\r\n </text>\r\n </g>\r\n );\r\n })}\r\n\r\n {/* Today Line - Solid, prominent indicator */}\r\n {todayX >= 0 && todayX <= timelineWidth && (\r\n <g>\r\n {/* Solid line - more prominent */}\r\n <line\r\n x1={todayX}\r\n y1={HEADER_HEIGHT}\r\n x2={todayX}\r\n y2={flatTasks.length * ROW_HEIGHT + HEADER_HEIGHT}\r\n stroke={theme.today}\r\n strokeWidth={2}\r\n opacity={1}\r\n />\r\n <circle cx={todayX} cy={HEADER_HEIGHT - 10} r={6} fill={theme.today} opacity={1} />\r\n </g>\r\n )}\r\n\r\n {/* Row Backgrounds with 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 {/* Background stripe - alternating rows for better readability */}\r\n <rect\r\n key={`row-${task.id}`}\r\n x={0}\r\n y={HEADER_HEIGHT + index * ROW_HEIGHT}\r\n width={timelineWidth}\r\n height={ROW_HEIGHT}\r\n fill={index % 2 === 0 ? 'transparent' : theme.bgSecondary}\r\n opacity={1}\r\n style={{ pointerEvents: 'none' }}\r\n />\r\n\r\n {/* Clickable area for tasks without dates */}\r\n {!hasTaskBar && (\r\n <>\r\n <rect\r\n key={`clickable-${task.id}`}\r\n x={0}\r\n y={HEADER_HEIGHT + 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 onMouseEnter={(e) => {\r\n e.currentTarget.setAttribute('fill', theme.accentLight);\r\n e.currentTarget.setAttribute('opacity', '0.5');\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.setAttribute('fill', 'transparent');\r\n e.currentTarget.setAttribute('opacity', '1');\r\n }}\r\n />\r\n {/* Placeholder text for empty tasks */}\r\n <text\r\n key={`placeholder-${task.id}`}\r\n x={todayX > 0 ? todayX : 100}\r\n y={HEADER_HEIGHT + 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 Click to set dates...\r\n </text>\r\n </>\r\n )}\r\n </g>\r\n );\r\n })}\r\n\r\n {/* Dependencies */}\r\n {flatTasks.map((task, toIndex) => {\r\n if (!task.dependencies || task.dependencies.length === 0) return null;\r\n // Skip if task doesn't have dates\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 // Skip if dependency task doesn't have dates\r\n if (!depTask.startDate || !depTask.endDate) return null;\r\n\r\n const fromIndex = flatTasks.findIndex((t) => t.id === depId);\r\n const fromPos = getTaskPosition(depTask);\r\n const toPos = getTaskPosition(task);\r\n\r\n return (\r\n <DependencyLine\r\n key={`dep-${depId}-${task.id}`}\r\n x1={fromPos.x + fromPos.width}\r\n y1={HEADER_HEIGHT + fromIndex * ROW_HEIGHT + ROW_HEIGHT / 2}\r\n x2={toPos.x}\r\n y2={HEADER_HEIGHT + toIndex * ROW_HEIGHT + ROW_HEIGHT / 2}\r\n theme={theme}\r\n onDelete={() => onDependencyDelete?.(task.id, depId)}\r\n />\r\n );\r\n });\r\n })}\r\n\r\n {/* Tasks */}\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 = HEADER_HEIGHT + index * ROW_HEIGHT + 12;\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 + 16}\r\n theme={theme}\r\n onClick={onTaskClick}\r\n />\r\n );\r\n }\r\n\r\n if (isContainer) {\r\n // Render container as bracket bar\r\n return (\r\n <g key={task.id} onClick={() => onTaskClick?.(task)} style={{ cursor: 'pointer' }}>\r\n {/* Top bracket line */}\r\n <line\r\n x1={x}\r\n y1={y}\r\n x2={x + width}\r\n y2={y}\r\n stroke={theme.borderLight}\r\n strokeWidth={2}\r\n opacity={0.6}\r\n />\r\n {/* Left vertical */}\r\n <line\r\n x1={x}\r\n y1={y}\r\n x2={x}\r\n y2={y + 32}\r\n stroke={theme.borderLight}\r\n strokeWidth={2}\r\n opacity={0.6}\r\n />\r\n {/* Right vertical */}\r\n <line\r\n x1={x + width}\r\n y1={y}\r\n x2={x + width}\r\n y2={y + 32}\r\n stroke={theme.borderLight}\r\n strokeWidth={2}\r\n opacity={0.6}\r\n />\r\n {/* Bottom bracket line */}\r\n <line\r\n x1={x}\r\n y1={y + 32}\r\n x2={x + width}\r\n y2={y + 32}\r\n stroke={theme.borderLight}\r\n strokeWidth={2}\r\n opacity={0.6}\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 />\r\n );\r\n })}\r\n </svg>\r\n </div>\r\n );\r\n}","import { useState, useCallback, useRef } from 'react';\r\n\r\ninterface HistoryState<T> {\r\n past: T[];\r\n present: T;\r\n future: T[];\r\n}\r\n\r\ninterface UseUndoRedoResult<T> {\r\n state: T;\r\n setState: (newStateOrUpdater: T | ((prev: T) => T), addToHistory?: boolean) => void;\r\n undo: () => void;\r\n redo: () => void;\r\n canUndo: boolean;\r\n canRedo: boolean;\r\n clearHistory: () => void;\r\n}\r\n\r\n/**\r\n * Custom hook for undo/redo functionality\r\n * @param initialState - Initial state value\r\n * @param maxHistorySize - Maximum number of history entries (default: 50)\r\n */\r\nexport function useUndoRedo<T>(\r\n initialState: T,\r\n maxHistorySize: number = 50\r\n): UseUndoRedoResult<T> {\r\n const [history, setHistory] = useState<HistoryState<T>>({\r\n past: [],\r\n present: initialState,\r\n future: [],\r\n });\r\n\r\n // Track if we're currently applying undo/redo to avoid infinite loops\r\n const isApplyingHistory = useRef(false);\r\n\r\n const setState = useCallback(\r\n (newStateOrUpdater: T | ((prev: T) => T), addToHistory: boolean = true) => {\r\n setHistory((currentHistory) => {\r\n // Resolve the new state (handle both direct values and updater functions)\r\n const resolvedNewState =\r\n typeof newStateOrUpdater === 'function'\r\n ? (newStateOrUpdater as (prev: T) => T)(currentHistory.present)\r\n : newStateOrUpdater;\r\n\r\n if (isApplyingHistory.current) {\r\n // If we're applying history, just update present without adding to history\r\n return {\r\n ...currentHistory,\r\n present: resolvedNewState,\r\n };\r\n }\r\n\r\n if (!addToHistory) {\r\n // Direct state update without history\r\n return {\r\n ...currentHistory,\r\n present: resolvedNewState,\r\n };\r\n }\r\n\r\n const newPast = [...currentHistory.past, currentHistory.present];\r\n\r\n // Limit history size\r\n if (newPast.length > maxHistorySize) {\r\n newPast.shift();\r\n }\r\n\r\n return {\r\n past: newPast,\r\n present: resolvedNewState,\r\n future: [], // Clear future when making a new change\r\n };\r\n });\r\n },\r\n [maxHistorySize]\r\n );\r\n\r\n const undo = useCallback(() => {\r\n setHistory((currentHistory) => {\r\n if (currentHistory.past.length === 0) {\r\n return currentHistory;\r\n }\r\n\r\n const previous = currentHistory.past[currentHistory.past.length - 1];\r\n const newPast = currentHistory.past.slice(0, currentHistory.past.length - 1);\r\n\r\n isApplyingHistory.current = true;\r\n setTimeout(() => {\r\n isApplyingHistory.current = false;\r\n }, 0);\r\n\r\n return {\r\n past: newPast,\r\n present: previous,\r\n future: [currentHistory.present, ...currentHistory.future],\r\n };\r\n });\r\n }, []);\r\n\r\n const redo = useCallback(() => {\r\n setHistory((currentHistory) => {\r\n if (currentHistory.future.length === 0) {\r\n return currentHistory;\r\n }\r\n\r\n const next = currentHistory.future[0];\r\n const newFuture = currentHistory.future.slice(1);\r\n\r\n isApplyingHistory.current = true;\r\n setTimeout(() => {\r\n isApplyingHistory.current = false;\r\n }, 0);\r\n\r\n return {\r\n past: [...currentHistory.past, currentHistory.present],\r\n present: next,\r\n future: newFuture,\r\n };\r\n });\r\n }, []);\r\n\r\n const clearHistory = useCallback(() => {\r\n setHistory((currentHistory) => ({\r\n past: [],\r\n present: currentHistory.present,\r\n future: [],\r\n }));\r\n }, []);\r\n\r\n return {\r\n state: history.present,\r\n setState,\r\n undo,\r\n redo,\r\n canUndo: history.past.length > 0,\r\n canRedo: history.future.length > 0,\r\n clearHistory,\r\n };\r\n}\r\n","import { useEffect } from 'react';\r\n\r\ninterface UseGanttUndoRedoKeysOptions {\r\n undo: () => void;\r\n redo: () => void;\r\n canUndo: boolean;\r\n canRedo: boolean;\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * Hook to handle keyboard shortcuts for undo/redo\r\n * Ctrl+Z / Cmd+Z for undo\r\n * Ctrl+Y / Cmd+Shift+Z for redo\r\n */\r\nexport function useGanttUndoRedoKeys({\r\n undo,\r\n redo,\r\n canUndo,\r\n canRedo,\r\n enabled = true,\r\n}: UseGanttUndoRedoKeysOptions) {\r\n useEffect(() => {\r\n if (!enabled) return;\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\r\n const ctrlKey = isMac ? e.metaKey : e.ctrlKey;\r\n\r\n // Undo: Ctrl+Z (Windows/Linux) or Cmd+Z (Mac)\r\n if (ctrlKey && e.key === 'z' && !e.shiftKey && canUndo) {\r\n e.preventDefault();\r\n undo();\r\n return;\r\n }\r\n\r\n // Redo: Ctrl+Y (Windows/Linux) or Cmd+Shift+Z (Mac)\r\n if (canRedo) {\r\n if (!isMac && ctrlKey && e.key === 'y') {\r\n e.preventDefault();\r\n redo();\r\n return;\r\n }\r\n if (isMac && ctrlKey && e.shiftKey && e.key === 'z') {\r\n e.preventDefault();\r\n redo();\r\n return;\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, [undo, redo, canUndo, canRedo, enabled]);\r\n}\r\n","import { Task, TaskSegment } from './types';\r\n\r\n/**\r\n * Public utility functions for Gantt operations\r\n * Similar to DHTMLX gantt.* utility methods\r\n */\r\nexport const ganttUtils = {\r\n /**\r\n * Calculate end date based on start date and duration in days\r\n * @param start - Start date\r\n * @param durationDays - Duration in days\r\n * @returns End date\r\n */\r\n calculateEndDate: (start: Date, durationDays: number): Date => {\r\n const end = new Date(start);\r\n end.setDate(end.getDate() + durationDays);\r\n return end;\r\n },\r\n\r\n /**\r\n * Calculate duration in days between two dates\r\n * @param start - Start date\r\n * @param end - End date\r\n * @returns Duration in days (rounded up)\r\n */\r\n calculateDuration: (start: Date, end: Date): number => {\r\n const diffMs = end.getTime() - start.getTime();\r\n return Math.ceil(diffMs / (1000 * 60 * 60 * 24));\r\n },\r\n\r\n /**\r\n * Calculate working days between two dates (excluding weekends)\r\n * @param start - Start date\r\n * @param end - End date\r\n * @returns Number of working days\r\n */\r\n calculateWorkingDays: (start: Date, end: Date): number => {\r\n let count = 0;\r\n const current = new Date(start);\r\n\r\n while (current <= end) {\r\n const dayOfWeek = current.getDay();\r\n if (dayOfWeek !== 0 && dayOfWeek !== 6) { // Not Sunday (0) or Saturday (6)\r\n count++;\r\n }\r\n current.setDate(current.getDate() + 1);\r\n }\r\n\r\n return count;\r\n },\r\n\r\n /**\r\n * Add working days to a date (excluding weekends)\r\n * @param start - Start date\r\n * @param workingDays - Number of working days to add\r\n * @returns End date\r\n */\r\n addWorkingDays: (start: Date, workingDays: number): Date => {\r\n const result = new Date(start);\r\n let daysAdded = 0;\r\n\r\n while (daysAdded < workingDays) {\r\n result.setDate(result.getDate() + 1);\r\n const dayOfWeek = result.getDay();\r\n if (dayOfWeek !== 0 && dayOfWeek !== 6) {\r\n daysAdded++;\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n /**\r\n * Check if a date is a weekend\r\n * @param date - Date to check\r\n * @returns True if weekend\r\n */\r\n isWeekend: (date: Date): boolean => {\r\n const dayOfWeek = date.getDay();\r\n return dayOfWeek === 0 || dayOfWeek === 6;\r\n },\r\n\r\n /**\r\n * Validate if creating a dependency would create a circular reference\r\n * Uses Depth-First Search (DFS) algorithm\r\n * @param tasks - All tasks\r\n * @param fromTaskId - Source task ID\r\n * @param toTaskId - Target task ID\r\n * @returns True if would create circular dependency\r\n */\r\n validateDependencies: (tasks: Task[], fromTaskId: string, toTaskId: string): 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 /**\r\n * Flatten nested tasks into a single array\r\n * @param tasks - Tasks with potential subtasks\r\n * @returns Flat array of all tasks\r\n */\r\n flattenTasks: (tasks: Task[]): Task[] => {\r\n const result: Task[] = [];\r\n\r\n const flatten = (taskList: Task[]) => {\r\n taskList.forEach(task => {\r\n result.push(task);\r\n if (task.subtasks && task.subtasks.length > 0) {\r\n flatten(task.subtasks);\r\n }\r\n });\r\n };\r\n\r\n flatten(tasks);\r\n return result;\r\n },\r\n\r\n /**\r\n * Find a task by ID in nested structure\r\n * @param tasks - Tasks to search\r\n * @param taskId - ID to find\r\n * @returns Task if found, undefined otherwise\r\n */\r\n findTaskById: (tasks: Task[], taskId: string): Task | undefined => {\r\n for (const task of tasks) {\r\n if (task.id === taskId) {\r\n return task;\r\n }\r\n if (task.subtasks) {\r\n const found = ganttUtils.findTaskById(task.subtasks, taskId);\r\n if (found) return found;\r\n }\r\n }\r\n return undefined;\r\n },\r\n\r\n /**\r\n * Get all parent tasks recursively\r\n * @param tasks - All tasks\r\n * @param taskId - Child task ID\r\n * @returns Array of parent tasks\r\n */\r\n getParentTasks: (tasks: Task[], taskId: string): Task[] => {\r\n const parents: Task[] = [];\r\n const task = ganttUtils.findTaskById(tasks, taskId);\r\n\r\n if (!task || !task.parentId) return parents;\r\n\r\n let currentId: string | undefined = task.parentId;\r\n while (currentId) {\r\n const parent = ganttUtils.findTaskById(tasks, currentId);\r\n if (parent) {\r\n parents.unshift(parent);\r\n currentId = parent.parentId;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return parents;\r\n },\r\n\r\n /**\r\n * Export tasks to JSON string\r\n * @param tasks - Tasks to export\r\n * @returns JSON string\r\n */\r\n exportToJSON: (tasks: Task[]): string => {\r\n return JSON.stringify(tasks, null, 2);\r\n },\r\n\r\n /**\r\n * Import tasks from JSON string\r\n * @param json - JSON string\r\n * @returns Parsed tasks\r\n */\r\n importFromJSON: (json: string): Task[] => {\r\n try {\r\n const parsed = JSON.parse(json);\r\n\r\n // Validate it's an array\r\n if (!Array.isArray(parsed)) {\r\n throw new Error('Invalid JSON: expected an array of tasks');\r\n }\r\n\r\n // Basic validation of task structure\r\n parsed.forEach((task, index) => {\r\n if (!task.id || !task.name) {\r\n throw new Error(`Invalid task at index ${index}: missing required fields (id, name)`);\r\n }\r\n });\r\n\r\n return parsed;\r\n } catch (error) {\r\n throw new Error(`Failed to import tasks: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n },\r\n\r\n /**\r\n * Export tasks to CSV format\r\n * @param tasks - Tasks to export\r\n * @returns CSV string\r\n */\r\n exportToCSV: (tasks: Task[]): string => {\r\n const flat = ganttUtils.flattenTasks(tasks);\r\n\r\n // CSV Headers\r\n const headers = ['ID', 'Name', 'Start Date', 'End Date', 'Progress', 'Status', 'Dependencies'];\r\n const rows: string[] = [headers.join(',')];\r\n\r\n // CSV Data\r\n flat.forEach(task => {\r\n const row = [\r\n task.id,\r\n `\"${task.name.replace(/\"/g, '\"\"')}\"`, // Escape quotes in name\r\n task.startDate ? task.startDate.toISOString().split('T')[0] : '',\r\n task.endDate ? task.endDate.toISOString().split('T')[0] : '',\r\n task.progress.toString(),\r\n task.status || '',\r\n task.dependencies?.join(';') || '',\r\n ];\r\n rows.push(row.join(','));\r\n });\r\n\r\n return rows.join('\\n');\r\n },\r\n\r\n /**\r\n * Format date to string (YYYY-MM-DD)\r\n * @param date - Date to format\r\n * @returns Formatted string\r\n */\r\n formatDate: (date: Date): string => {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n },\r\n\r\n /**\r\n * Parse date from string (YYYY-MM-DD)\r\n * @param dateString - Date string\r\n * @returns Parsed Date\r\n */\r\n parseDate: (dateString: string): Date => {\r\n return new Date(dateString);\r\n },\r\n\r\n /**\r\n * Get date range for a task\r\n * @param task - Task to get range for\r\n * @returns Object with start and end dates, or null if no dates\r\n */\r\n getTaskDateRange: (task: Task): { start: Date; end: Date } | null => {\r\n if (!task.startDate || !task.endDate) return null;\r\n return {\r\n start: task.startDate,\r\n end: task.endDate,\r\n };\r\n },\r\n\r\n /**\r\n * Get the earliest start date from tasks\r\n * @param tasks - Tasks to search\r\n * @returns Earliest date or null\r\n */\r\n getEarliestStartDate: (tasks: Task[]): Date | null => {\r\n const flat = ganttUtils.flattenTasks(tasks);\r\n const tasksWithDates = flat.filter(t => t.startDate);\r\n\r\n if (tasksWithDates.length === 0) return null;\r\n\r\n return new Date(Math.min(...tasksWithDates.map(t => t.startDate!.getTime())));\r\n },\r\n\r\n /**\r\n * Get the latest end date from tasks\r\n * @param tasks - Tasks to search\r\n * @returns Latest date or null\r\n */\r\n getLatestEndDate: (tasks: Task[]): Date | null => {\r\n const flat = ganttUtils.flattenTasks(tasks);\r\n const tasksWithDates = flat.filter(t => t.endDate);\r\n\r\n if (tasksWithDates.length === 0) return null;\r\n\r\n return new Date(Math.max(...tasksWithDates.map(t => t.endDate!.getTime())));\r\n },\r\n\r\n /**\r\n * Check if two tasks overlap in time\r\n * @param task1 - First task\r\n * @param task2 - Second task\r\n * @returns True if tasks overlap\r\n */\r\n tasksOverlap: (task1: Task, task2: Task): boolean => {\r\n if (!task1.startDate || !task1.endDate || !task2.startDate || !task2.endDate) {\r\n return false;\r\n }\r\n\r\n return task1.startDate <= task2.endDate && task2.startDate <= task1.endDate;\r\n },\r\n\r\n /**\r\n * Get all tasks that depend on a given task (children in dependency tree)\r\n * @param tasks - All tasks\r\n * @param taskId - Task ID to find dependents for\r\n * @returns Array of tasks that depend on this task\r\n */\r\n getDependentTasks: (tasks: Task[], taskId: string): Task[] => {\r\n const flat = ganttUtils.flattenTasks(tasks);\r\n return flat.filter(task =>\r\n task.dependencies && task.dependencies.includes(taskId)\r\n );\r\n },\r\n\r\n /**\r\n * Get all tasks that a given task depends on (parents in dependency tree)\r\n * @param tasks - All tasks\r\n * @param taskId - Task ID to find dependencies for\r\n * @returns Array of tasks this task depends on\r\n */\r\n getDependencyTasks: (tasks: Task[], taskId: string): Task[] => {\r\n const task = ganttUtils.findTaskById(tasks, taskId);\r\n if (!task || !task.dependencies) return [];\r\n\r\n const flat = ganttUtils.flattenTasks(tasks);\r\n return flat.filter(t => task.dependencies!.includes(t.id));\r\n },\r\n\r\n /**\r\n * Filter tasks by status\r\n * @param tasks - Tasks to filter\r\n * @param status - Status to filter by\r\n * @returns Filtered tasks\r\n */\r\n filterByStatus: (tasks: Task[], status: 'todo' | 'in-progress' | 'completed'): Task[] => {\r\n return ganttUtils.flattenTasks(tasks).filter(t => t.status === status);\r\n },\r\n\r\n /**\r\n * Filter tasks by date range\r\n * @param tasks - Tasks to filter\r\n * @param startDate - Range start\r\n * @param endDate - Range end\r\n * @returns Tasks that fall within the date range\r\n */\r\n filterByDateRange: (tasks: Task[], startDate: Date, endDate: Date): Task[] => {\r\n return ganttUtils.flattenTasks(tasks).filter(task => {\r\n if (!task.startDate || !task.endDate) return false;\r\n return task.startDate <= endDate && task.endDate >= startDate;\r\n });\r\n },\r\n\r\n /**\r\n * Sort tasks by start date\r\n * @param tasks - Tasks to sort\r\n * @param ascending - Sort ascending (default) or descending\r\n * @returns Sorted tasks\r\n */\r\n sortByStartDate: (tasks: Task[], ascending = true): Task[] => {\r\n return [...tasks].sort((a, b) => {\r\n if (!a.startDate || !b.startDate) return 0;\r\n const diff = a.startDate.getTime() - b.startDate.getTime();\r\n return ascending ? diff : -diff;\r\n });\r\n },\r\n\r\n /**\r\n * Sort tasks by end date\r\n * @param tasks - Tasks to sort\r\n * @param ascending - Sort ascending (default) or descending\r\n * @returns Sorted tasks\r\n */\r\n sortByEndDate: (tasks: Task[], ascending = true): Task[] => {\r\n return [...tasks].sort((a, b) => {\r\n if (!a.endDate || !b.endDate) return 0;\r\n const diff = a.endDate.getTime() - b.endDate.getTime();\r\n return ascending ? diff : -diff;\r\n });\r\n },\r\n\r\n /**\r\n * Sort tasks by progress\r\n * @param tasks - Tasks to sort\r\n * @param ascending - Sort ascending (default) or descending\r\n * @returns Sorted tasks\r\n */\r\n sortByProgress: (tasks: Task[], ascending = true): Task[] => {\r\n return [...tasks].sort((a, b) => {\r\n const diff = a.progress - b.progress;\r\n return ascending ? diff : -diff;\r\n });\r\n },\r\n\r\n /**\r\n * Calculate total progress across all tasks\r\n * @param tasks - Tasks to calculate\r\n * @returns Average progress percentage\r\n */\r\n calculateTotalProgress: (tasks: Task[]): number => {\r\n const flat = ganttUtils.flattenTasks(tasks);\r\n if (flat.length === 0) return 0;\r\n\r\n const total = flat.reduce((sum, task) => sum + task.progress, 0);\r\n return Math.round(total / flat.length);\r\n },\r\n\r\n /**\r\n * Get task by path (array of indices in nested structure)\r\n * @param tasks - Root tasks\r\n * @param path - Array of indices [0, 2, 1] means tasks[0].subtasks[2].subtasks[1]\r\n * @returns Task at path or undefined\r\n */\r\n getTaskByPath: (tasks: Task[], path: number[]): Task | undefined => {\r\n let current: Task[] = tasks;\r\n let task: Task | undefined;\r\n\r\n for (let i = 0; i < path.length; i++) {\r\n const index = path[i];\r\n if (!current || index === undefined || index >= current.length) return undefined;\r\n\r\n task = current[index];\r\n if (!task) return undefined;\r\n\r\n if (i < path.length - 1) {\r\n current = task.subtasks || [];\r\n }\r\n }\r\n\r\n return task;\r\n },\r\n\r\n /**\r\n * Clone a task deeply (including subtasks)\r\n * @param task - Task to clone\r\n * @param newId - Optional new ID for the clone\r\n * @returns Cloned task\r\n */\r\n cloneTask: (task: Task, newId?: string): Task => {\r\n return {\r\n ...task,\r\n id: newId || `${task.id}-copy`,\r\n subtasks: task.subtasks?.map(st => ganttUtils.cloneTask(st)),\r\n };\r\n },\r\n\r\n /**\r\n * Export tasks to PDF format\r\n * @param tasks - Tasks to export\r\n * @param filename - Optional filename (default: 'gantt-chart.pdf')\r\n * @returns Promise<void>\r\n */\r\n exportToPDF: async (tasks: Task[], filename = 'gantt-chart.pdf'): Promise<void> => {\r\n try {\r\n // v0.8.1: Validation\r\n console.log('[PDF Export] Starting export...');\r\n console.log('[PDF Export] Tasks count:', tasks?.length || 0);\r\n\r\n if (!tasks || tasks.length === 0) {\r\n console.warn('[PDF Export] No tasks provided');\r\n alert('No tasks available to export to PDF');\r\n return;\r\n }\r\n\r\n // v0.8.1: FIXED - Use correct jspdf-autotable v5.0 API\r\n // Breaking change in v5.0: autoTable is now imported as a function, not auto-applied to jsPDF\r\n const { jsPDF } = await import('jspdf');\r\n const { default: autoTable } = await import('jspdf-autotable');\r\n console.log('[PDF Export] Modules loaded');\r\n\r\n const doc = new jsPDF();\r\n const flat = ganttUtils.flattenTasks(tasks);\r\n\r\n console.log('[PDF Export] Flattened tasks count:', flat.length);\r\n\r\n if (flat.length === 0) {\r\n console.warn('[PDF Export] No tasks after flattening');\r\n alert('No tasks found to export');\r\n return;\r\n }\r\n\r\n // Title\r\n doc.setFontSize(16);\r\n doc.text('Gantt Chart - Task List', 14, 20);\r\n\r\n // Table data\r\n const headers = [['Task Name', 'Start Date', 'End Date', 'Duration', 'Progress', 'Status']];\r\n const data = flat.map(task => {\r\n const duration = task.startDate && task.endDate\r\n ? ganttUtils.calculateDuration(task.startDate, task.endDate)\r\n : 0;\r\n\r\n return [\r\n task.name,\r\n task.startDate ? ganttUtils.formatDate(task.startDate) : 'N/A',\r\n task.endDate ? ganttUtils.formatDate(task.endDate) : 'N/A',\r\n duration > 0 ? `${duration} days` : 'N/A',\r\n `${task.progress}%`,\r\n task.status || 'N/A',\r\n ];\r\n });\r\n\r\n // v0.8.1: Use autoTable function (v5.0 API) instead of doc.autoTable() (old API)\r\n console.log('[PDF Export] Generating table with autoTable function...');\r\n autoTable(doc, {\r\n head: headers,\r\n body: data,\r\n startY: 30,\r\n styles: {\r\n fontSize: 9,\r\n cellPadding: 3,\r\n },\r\n headStyles: {\r\n fillColor: [66, 139, 202],\r\n textColor: 255,\r\n fontStyle: 'bold',\r\n },\r\n alternateRowStyles: {\r\n fillColor: [245, 245, 245],\r\n },\r\n columnStyles: {\r\n 0: { cellWidth: 60 }, // Task Name\r\n 1: { cellWidth: 30 }, // Start Date\r\n 2: { cellWidth: 30 }, // End Date\r\n 3: { cellWidth: 25 }, // Duration\r\n 4: { cellWidth: 20 }, // Progress\r\n 5: { cellWidth: 25 }, // Status\r\n },\r\n });\r\n console.log('[PDF Export] Table generated successfully');\r\n\r\n // Save the PDF\r\n console.log('[PDF Export] Saving PDF:', filename);\r\n doc.save(filename);\r\n console.log('[PDF Export] PDF saved successfully');\r\n } catch (error) {\r\n console.error('Error exporting to PDF:', error);\r\n throw error;\r\n }\r\n },\r\n\r\n /**\r\n * Export tasks to Excel format\r\n * @param tasks - Tasks to export\r\n * @param filename - Optional filename (default: 'gantt-chart.xlsx')\r\n * @returns Promise<void>\r\n */\r\n exportToExcel: async (tasks: Task[], filename = 'gantt-chart.xlsx'): Promise<void> => {\r\n const XLSX = await import('xlsx');\r\n const flat = ganttUtils.flattenTasks(tasks);\r\n\r\n // Prepare data\r\n const data = flat.map(task => {\r\n const duration = task.startDate && task.endDate\r\n ? ganttUtils.calculateDuration(task.startDate, task.endDate)\r\n : 0;\r\n\r\n return {\r\n 'Task ID': task.id,\r\n 'Task Name': task.name,\r\n 'Start Date': task.startDate ? ganttUtils.formatDate(task.startDate) : '',\r\n 'End Date': task.endDate ? ganttUtils.formatDate(task.endDate) : '',\r\n 'Duration (days)': duration > 0 ? duration : '',\r\n 'Progress (%)': task.progress,\r\n 'Status': task.status || '',\r\n 'Assignees': task.assignees?.map(a => a.name).join(', ') || '',\r\n 'Dependencies': task.dependencies?.join(', ') || '',\r\n 'Is Milestone': task.isMilestone ? 'Yes' : 'No',\r\n 'Parent ID': task.parentId || '',\r\n 'Level': task.level || 0,\r\n };\r\n });\r\n\r\n // Create worksheet\r\n const worksheet = XLSX.utils.json_to_sheet(data);\r\n\r\n // Set column widths\r\n const columnWidths = [\r\n { wch: 15 }, // Task ID\r\n { wch: 40 }, // Task Name\r\n { wch: 12 }, // Start Date\r\n { wch: 12 }, // End Date\r\n { wch: 15 }, // Duration\r\n { wch: 12 }, // Progress\r\n { wch: 15 }, // Status\r\n { wch: 30 }, // Assignees\r\n { wch: 20 }, // Dependencies\r\n { wch: 12 }, // Is Milestone\r\n { wch: 15 }, // Parent ID\r\n { wch: 8 }, // Level\r\n ];\r\n worksheet['!cols'] = columnWidths;\r\n\r\n // Create workbook\r\n const workbook = XLSX.utils.book_new();\r\n XLSX.utils.book_append_sheet(workbook, worksheet, 'Gantt Tasks');\r\n\r\n // Save the file\r\n XLSX.writeFile(workbook, filename);\r\n },\r\n\r\n /**\r\n * Calculate Critical Path Method (CPM) - identifies tasks with zero slack\r\n * @param tasks - All tasks\r\n * @returns Array of task IDs on the critical path\r\n */\r\n calculateCriticalPath: (tasks: Task[]): string[] => {\r\n const flat = ganttUtils.flattenTasks(tasks);\r\n const tasksWithDates = flat.filter(t => t.startDate && t.endDate);\r\n\r\n if (tasksWithDates.length === 0) return [];\r\n\r\n // Step 1: Calculate Early Start (ES) and Early Finish (EF) - Forward Pass\r\n const earlyDates = new Map<string, { es: number; ef: number }>();\r\n\r\n const calculateEarlyDates = (task: Task): void => {\r\n if (earlyDates.has(task.id)) return;\r\n\r\n const duration = task.startDate && task.endDate\r\n ? ganttUtils.calculateDuration(task.startDate, task.endDate)\r\n : 0;\r\n\r\n let es = 0;\r\n\r\n // If task has dependencies, ES = max(EF of all predecessors)\r\n if (task.dependencies && task.dependencies.length > 0) {\r\n for (const depId of task.dependencies) {\r\n const depTask = flat.find(t => t.id === depId);\r\n if (depTask) {\r\n calculateEarlyDates(depTask);\r\n const depEF = earlyDates.get(depId)?.ef || 0;\r\n es = Math.max(es, depEF);\r\n }\r\n }\r\n }\r\n\r\n const ef = es + duration;\r\n earlyDates.set(task.id, { es, ef });\r\n };\r\n\r\n tasksWithDates.forEach(calculateEarlyDates);\r\n\r\n // Step 2: Find project end date (max EF)\r\n const projectEnd = Math.max(...Array.from(earlyDates.values()).map(d => d.ef));\r\n\r\n // Step 3: Calculate Late Start (LS) and Late Finish (LF) - Backward Pass\r\n const lateDates = new Map<string, { ls: number; lf: number }>();\r\n\r\n const calculateLateDates = (task: Task): void => {\r\n if (lateDates.has(task.id)) return;\r\n\r\n const duration = task.startDate && task.endDate\r\n ? ganttUtils.calculateDuration(task.startDate, task.endDate)\r\n : 0;\r\n\r\n // Find all tasks that depend on this task\r\n const successors = flat.filter(t =>\r\n t.dependencies && t.dependencies.includes(task.id)\r\n );\r\n\r\n let lf = projectEnd;\r\n\r\n // If task has successors, LF = min(LS of all successors)\r\n if (successors.length > 0) {\r\n for (const successor of successors) {\r\n calculateLateDates(successor);\r\n const succLS = lateDates.get(successor.id)?.ls || 0;\r\n lf = Math.min(lf, succLS);\r\n }\r\n }\r\n\r\n const ls = lf - duration;\r\n lateDates.set(task.id, { ls, lf });\r\n };\r\n\r\n tasksWithDates.forEach(calculateLateDates);\r\n\r\n // Step 4: Calculate Slack (Float) = LS - ES = LF - EF\r\n // Tasks with slack = 0 are on the critical path\r\n const criticalPath: string[] = [];\r\n\r\n for (const task of tasksWithDates) {\r\n const early = earlyDates.get(task.id);\r\n const late = lateDates.get(task.id);\r\n\r\n if (early && late) {\r\n const slack = late.ls - early.es;\r\n if (Math.abs(slack) < 0.01) { // Float point comparison\r\n criticalPath.push(task.id);\r\n }\r\n }\r\n }\r\n\r\n return criticalPath;\r\n },\r\n\r\n /**\r\n * Calculate slack (float) time for a task\r\n * @param tasks - All tasks\r\n * @param taskId - Task ID to calculate slack for\r\n * @returns Slack in days, or null if cannot be calculated\r\n */\r\n calculateSlack: (tasks: Task[], taskId: string): number | null => {\r\n const task = ganttUtils.findTaskById(tasks, taskId);\r\n if (!task || !task.startDate || !task.endDate) return null;\r\n\r\n const criticalPath = ganttUtils.calculateCriticalPath(tasks);\r\n\r\n // If on critical path, slack is 0\r\n if (criticalPath.includes(taskId)) return 0;\r\n\r\n // Otherwise calculate slack using CPM algorithm\r\n // This is simplified - in production would use full CPM\r\n // For now, we approximate: slack = time until next dependent task\r\n const dependents = ganttUtils.getDependentTasks(tasks, taskId);\r\n\r\n if (dependents.length === 0) {\r\n // No dependents = float until project end\r\n const projectEnd = ganttUtils.getLatestEndDate(tasks);\r\n if (!projectEnd) return null;\r\n\r\n const daysToEnd = ganttUtils.calculateDuration(task.endDate, projectEnd);\r\n return Math.max(0, daysToEnd);\r\n }\r\n\r\n // Find earliest dependent\r\n const earliestDepStart = dependents\r\n .filter(d => d.startDate)\r\n .map(d => d.startDate!.getTime())\r\n .sort((a, b) => a - b)[0];\r\n\r\n if (!earliestDepStart) return null;\r\n\r\n const slack = ganttUtils.calculateDuration(\r\n task.endDate,\r\n new Date(earliestDepStart)\r\n );\r\n\r\n return Math.max(0, slack);\r\n },\r\n\r\n /**\r\n * Check if a task is on the critical path\r\n * @param tasks - All tasks\r\n * @param taskId - Task ID to check\r\n * @returns True if task is on critical path\r\n */\r\n isOnCriticalPath: (tasks: Task[], taskId: string): boolean => {\r\n const criticalPath = ganttUtils.calculateCriticalPath(tasks);\r\n return criticalPath.includes(taskId);\r\n },\r\n\r\n /**\r\n * Auto-schedule dependent tasks when a task changes\r\n * @param tasks - All tasks\r\n * @param changedTaskId - Task that was changed\r\n * @returns Updated tasks with rescheduled dependencies\r\n */\r\n autoScheduleDependents: (tasks: Task[], changedTaskId: string): Task[] => {\r\n const changedTask = ganttUtils.findTaskById(tasks, changedTaskId);\r\n if (!changedTask || !changedTask.endDate) return tasks;\r\n\r\n const dependents = ganttUtils.getDependentTasks(tasks, changedTaskId);\r\n if (dependents.length === 0) return tasks;\r\n\r\n let updatedTasks = [...tasks];\r\n\r\n // For each dependent, shift start date to be after the changed task\r\n for (const dependent of dependents) {\r\n if (!dependent.startDate || !dependent.endDate) continue;\r\n\r\n // Calculate duration of dependent task\r\n const duration = ganttUtils.calculateDuration(dependent.startDate, dependent.endDate);\r\n\r\n // New start date = changed task end date + 1 day\r\n const newStartDate = new Date(changedTask.endDate);\r\n newStartDate.setDate(newStartDate.getDate() + 1);\r\n\r\n // Calculate new end date based on duration\r\n const newEndDate = ganttUtils.calculateEndDate(newStartDate, duration);\r\n\r\n // Update the task recursively in nested structure\r\n const updateTaskRec = (tasks: Task[]): Task[] => {\r\n return tasks.map(t => {\r\n if (t.id === dependent.id) {\r\n return { ...t, startDate: newStartDate, endDate: newEndDate };\r\n }\r\n if (t.subtasks) {\r\n return { ...t, subtasks: updateTaskRec(t.subtasks) };\r\n }\r\n return t;\r\n });\r\n };\r\n\r\n updatedTasks = updateTaskRec(updatedTasks);\r\n\r\n // Recursively update dependents of this task\r\n updatedTasks = ganttUtils.autoScheduleDependents(updatedTasks, dependent.id);\r\n }\r\n\r\n return updatedTasks;\r\n },\r\n\r\n /**\r\n * 🚀 KILLER FEATURE #3: Split a task (create GAP in the middle, like Bryntum/DHTMLX)\r\n * Same task, but work is paused for some days then continues\r\n * Example: Jan 1-10 → Split at Jan 5 with 3 day gap → Jan 1-4 [GAP] Jan 8-13\r\n * @param tasks - All tasks\r\n * @param taskId - Task to split\r\n * @param splitDate - Date where gap starts\r\n * @param gapDays - Number of days to pause (default: 3)\r\n * @returns Updated tasks with split segments\r\n */\r\n splitTask: (tasks: Task[], taskId: string, splitDate: Date, gapDays = 3): Task[] => {\r\n const task = ganttUtils.findTaskById(tasks, taskId);\r\n if (!task || !task.startDate || !task.endDate) return tasks;\r\n\r\n // Validate split date is within task range\r\n if (splitDate <= task.startDate || splitDate >= task.endDate) {\r\n console.warn('Split date must be between task start and end dates');\r\n return tasks;\r\n }\r\n\r\n // Calculate the split point (end of first segment)\r\n const firstSegmentEnd = new Date(splitDate);\r\n firstSegmentEnd.setDate(firstSegmentEnd.getDate() - 1); // Day before split\r\n\r\n // Calculate second segment start (after gap)\r\n const secondSegmentStart = new Date(splitDate);\r\n secondSegmentStart.setDate(secondSegmentStart.getDate() + gapDays);\r\n\r\n // Calculate new end date (original end + gap days to preserve work duration)\r\n const newEndDate = new Date(task.endDate);\r\n newEndDate.setDate(newEndDate.getDate() + gapDays);\r\n\r\n // Create segments array\r\n const segments: TaskSegment[] = [\r\n {\r\n startDate: new Date(task.startDate),\r\n endDate: firstSegmentEnd,\r\n },\r\n {\r\n startDate: secondSegmentStart,\r\n endDate: newEndDate,\r\n },\r\n ];\r\n\r\n // Update task with segments\r\n const updateTaskRec = (tasksList: Task[]): Task[] => {\r\n return tasksList.map(t => {\r\n if (t.id === task.id) {\r\n return {\r\n ...t,\r\n endDate: newEndDate, // Overall end date extends\r\n segments, // Add segments to show gaps\r\n };\r\n }\r\n if (t.subtasks) {\r\n return { ...t, subtasks: updateTaskRec(t.subtasks) };\r\n }\r\n return t;\r\n });\r\n };\r\n\r\n return updateTaskRec(tasks);\r\n },\r\n};\r\n","import { Task, GanttTemplates } from './types';\r\nimport { ganttUtils } from './ganttUtils';\r\n\r\n/**\r\n * Default templates for Gantt rendering\r\n * Users can override these with custom templates\r\n */\r\nexport const defaultTemplates: Required<GanttTemplates> = {\r\n taskTooltip: (task: Task) => {\r\n const lines: string[] = [\r\n `<strong>${task.name}</strong>`,\r\n ];\r\n\r\n if (task.startDate && task.endDate) {\r\n lines.push(\r\n `${ganttUtils.formatDate(task.startDate)} - ${ganttUtils.formatDate(task.endDate)}`\r\n );\r\n const duration = ganttUtils.calculateDuration(task.startDate, task.endDate);\r\n lines.push(`Duration: ${duration} days`);\r\n }\r\n\r\n if (task.progress !== undefined) {\r\n lines.push(`Progress: ${task.progress}%`);\r\n }\r\n\r\n if (task.status) {\r\n lines.push(`Status: ${task.status}`);\r\n }\r\n\r\n if (task.assignees && task.assignees.length > 0) {\r\n const assigneeNames = task.assignees.map(a => a.name).join(', ');\r\n lines.push(`Assigned: ${assigneeNames}`);\r\n }\r\n\r\n if (task.dependencies && task.dependencies.length > 0) {\r\n lines.push(`Dependencies: ${task.dependencies.length}`);\r\n }\r\n\r\n return lines.join('<br/>');\r\n },\r\n\r\n taskLabel: (task: Task) => {\r\n return task.name;\r\n },\r\n\r\n gridCell: (task: Task, column, value) => {\r\n // Return default value as-is\r\n return value;\r\n },\r\n\r\n taskClass: (task: Task) => {\r\n const classes: string[] = [];\r\n\r\n if (task.isCriticalPath) {\r\n classes.push('critical-path');\r\n }\r\n\r\n if (task.status === 'completed') {\r\n classes.push('completed');\r\n } else if (task.status === 'in-progress') {\r\n classes.push('in-progress');\r\n } else if (task.status === 'todo') {\r\n classes.push('todo');\r\n }\r\n\r\n if (task.isMilestone) {\r\n classes.push('milestone');\r\n }\r\n\r\n return classes.join(' ');\r\n },\r\n\r\n milestoneContent: (task: Task) => {\r\n return `◆ ${task.name}`;\r\n },\r\n\r\n dateFormat: (date: Date) => {\r\n return ganttUtils.formatDate(date);\r\n },\r\n\r\n durationFormat: (days: number) => {\r\n if (days === 1) return '1 day';\r\n return `${days} days`;\r\n },\r\n\r\n progressFormat: (progress: number) => {\r\n return `${progress}%`;\r\n },\r\n};\r\n\r\n/**\r\n * Merge user templates with defaults\r\n */\r\nexport function mergeTemplates(\r\n userTemplates?: Partial<GanttTemplates>\r\n): Required<GanttTemplates> {\r\n return {\r\n ...defaultTemplates,\r\n ...userTemplates,\r\n };\r\n}\r\n","import { useState, useRef, useEffect, useCallback, useMemo, useContext, forwardRef, useImperativeHandle } from 'react';\r\nimport { Task, TimeScale, Theme, GanttConfig, GanttColumn, ColumnType, RowDensity } 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 { motion } from 'framer-motion';\r\nimport { useUndoRedo } from './useUndoRedo';\r\nimport { useGanttUndoRedoKeys } from './useGanttUndoRedoKeys';\r\nimport { ThemeContext } from '../../theme/ThemeProvider';\r\nimport { GanttBoardRef } from './GanttBoardRef';\r\nimport { ganttUtils } from './ganttUtils';\r\nimport { mergeTemplates } from './defaultTemplates';\r\nimport html2canvas from 'html2canvas';\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} 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// Utility function to get row height based on density\r\nconst getRowHeight = (density: RowDensity): number => {\r\n switch (density) {\r\n case 'compact':\r\n return 40;\r\n case 'comfortable':\r\n return 48;\r\n case 'spacious':\r\n return 56;\r\n default:\r\n return 48;\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 availableUsers = [],\r\n templates,\r\n // UI events\r\n onThemeChange, // v0.9.0\r\n // Basic events\r\n onTaskClick,\r\n onTaskDblClick, // v0.8.0\r\n onTaskContextMenu, // v0.8.0\r\n onTaskUpdate,\r\n onProgressChange, // v0.8.0\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 } = 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 const [timeScale, setTimeScale] = useState<TimeScale>(initialTimeScale);\r\n const [rowDensity, setRowDensity] = useState<RowDensity>(initialRowDensity);\r\n const [zoom, setZoom] = useState(1);\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 // Sync with global theme changes\r\n useEffect(() => {\r\n if (globalTheme && globalTheme !== currentTheme) {\r\n setCurrentTheme(globalTheme);\r\n }\r\n }, [globalTheme]);\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 // Sync local tasks with parent when they change\r\n useEffect(() => {\r\n if (onTasksChange) {\r\n onTasksChange(localTasks);\r\n }\r\n }, [localTasks, onTasksChange]);\r\n\r\n // Column configuration - Default: Only show task name\r\n const [columns, setColumns] = useState<GanttColumn[]>([\r\n { id: 'name', label: 'Task Name', width: 240, visible: true, sortable: true },\r\n { id: 'startDate', label: 'Start Date', width: 110, visible: false, sortable: true },\r\n { id: 'endDate', label: 'End Date', width: 110, visible: false, sortable: true },\r\n { id: 'duration', label: 'Duration', width: 80, visible: false, sortable: true },\r\n { id: 'assignees', label: 'Assignees', width: 120, visible: false, sortable: false },\r\n { id: 'status', label: 'Status', width: 80, visible: false, sortable: true },\r\n { id: 'progress', label: '% Complete', width: 120, visible: false, sortable: true },\r\n ]);\r\n\r\n // Calculate grid width based on visible columns (memoized)\r\n const calculatedGridWidth = useMemo(() =>\r\n columns\r\n .filter(col => col.visible)\r\n .reduce((sum, col) => sum + col.width, 0) + 60, // +60 for add button and padding\r\n [columns]\r\n );\r\n\r\n const gridWidth = gridWidthOverride || calculatedGridWidth;\r\n\r\n const gridScrollRef = useRef<HTMLDivElement>(null);\r\n const timelineScrollRef = useRef<HTMLDivElement>(null);\r\n const ganttContainerRef = useRef<HTMLDivElement>(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 // 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 // This is BETTER than DHTMLX - we recalculate CPM automatically on every change\r\n const tasksWithCriticalPath = useMemo(() => {\r\n const criticalPathIds = ganttUtils.calculateCriticalPath(localTasks);\r\n\r\n const markCritical = (tasks: Task[]): Task[] => {\r\n return tasks.map(task => ({\r\n ...task,\r\n isCriticalPath: criticalPathIds.includes(task.id),\r\n subtasks: task.subtasks ? markCritical(task.subtasks) : undefined,\r\n }));\r\n };\r\n\r\n return markCritical(localTasks);\r\n }, [localTasks]);\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 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 setLocalTasks((prev) => duplicateTasks(prev, [id]));\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) => indentTasks(prev, [taskId]));\r\n },\r\n\r\n outdentTask: (taskId: string) => {\r\n setLocalTasks((prev) => 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: (parentId: string) => {\r\n setLocalTasks((prev) => {\r\n const { tasks } = createSubtask(prev, parentId);\r\n return tasks;\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\r\n console.log(`Highlighting task ${id} for ${duration}ms`);\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 // ==================== 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 exportToPNG: async () => {\r\n if (!ganttContainerRef.current) {\r\n throw new Error('Gantt container not found');\r\n }\r\n\r\n const canvas = await html2canvas(ganttContainerRef.current, {\r\n backgroundColor: theme.bgPrimary,\r\n scale: 2, // Higher quality\r\n });\r\n\r\n return new Promise<Blob>((resolve, reject) => {\r\n canvas.toBlob((blob) => {\r\n if (blob) {\r\n resolve(blob);\r\n } else {\r\n reject(new Error('Failed to create blob from canvas'));\r\n }\r\n }, 'image/png');\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);\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 }), [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 // Handle task toggle (memoized)\r\n const handleTaskToggle = useCallback((taskId: string) => {\r\n setLocalTasks((prev) => toggleTaskExpansion(prev, taskId));\r\n config.onTaskToggleExpand?.(taskId);\r\n }, [config]);\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 setLocalTasks(updateTask(localTasks));\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 // Handle task deletion (memoized)\r\n const handleTaskDelete = useCallback((taskId: string) => {\r\n // v0.8.0: Before event (cancelable)\r\n if (onBeforeTaskDelete) {\r\n const shouldContinue = onBeforeTaskDelete(taskId);\r\n if (shouldContinue === false) {\r\n return; // Cancel the deletion\r\n }\r\n }\r\n\r\n const deleteTask = (tasks: Task[]): Task[] => {\r\n return tasks.filter(task => {\r\n if (task.id === taskId) return false;\r\n if (task.subtasks) {\r\n task.subtasks = deleteTask(task.subtasks);\r\n }\r\n return true;\r\n });\r\n };\r\n setLocalTasks(deleteTask(localTasks));\r\n\r\n // v0.8.0: After event\r\n onAfterTaskDelete?.(taskId);\r\n }, [localTasks, onBeforeTaskDelete, onAfterTaskDelete]);\r\n\r\n // Hierarchy handlers\r\n const handleTaskIndent = useCallback((taskIds: string[]) => {\r\n if (taskIds.length === 0) return;\r\n setLocalTasks((prev) => 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 setLocalTasks((prev) => outdentTasks(prev, taskIds));\r\n config.onTaskOutdent?.(taskIds[0]!);\r\n }, [config]);\r\n\r\n const handleTaskMove = useCallback((taskIds: string[], direction: 'up' | 'down') => {\r\n if (taskIds.length === 0) return;\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((taskIds: string[]) => {\r\n setLocalTasks((prev) => deleteTasks(prev, taskIds));\r\n taskIds.forEach(id => config.onTaskDelete?.(id));\r\n }, [config]);\r\n\r\n const handleTaskDuplicate = useCallback((taskIds: string[]) => {\r\n setLocalTasks((prev) => duplicateTasks(prev, taskIds));\r\n taskIds.forEach(id => config.onTaskDuplicate?.(id));\r\n }, [config]);\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 setLocalTasks((prev) => {\r\n const { tasks } = createSubtask(prev, parentTaskId);\r\n config.onTaskCreate?.(parentTaskId, 0);\r\n return tasks;\r\n });\r\n }, [config]);\r\n\r\n // 🚀 KILLER FEATURE #2: Handle task date changes WITH auto-scheduling\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 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 updatedTasks = ganttUtils.autoScheduleDependents(updatedTasks, task.id);\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 onTaskUpdate?.(updatedTask);\r\n }, [localTasks, onTaskUpdate]);\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 // 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 const handleDependencyCreate = useCallback((fromTask: Task, toTaskId: string) => {\r\n // Check for circular dependency\r\n if (wouldCreateCircularDependency(fromTask.id, toTaskId, localTasks)) {\r\n // Show error feedback - you could integrate a toast notification here\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 // Avoid duplicate 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 setLocalTasks(updateTaskDependencies(localTasks));\r\n onDependencyCreate?.(fromTask.id, toTaskId);\r\n }, [localTasks, 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 setLocalTasks(removeTaskDependency(localTasks));\r\n onDependencyDelete?.(taskId, dependencyId);\r\n }, [localTasks, 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 // 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 // Handle separator resize\r\n const handleMouseDown = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n setIsResizing(true);\r\n };\r\n\r\n // Synchronized scrolling and resizing\r\n useEffect(() => {\r\n const gridScroll = gridScrollRef.current;\r\n const timelineScroll = timelineScrollRef.current;\r\n\r\n if (!gridScroll || !timelineScroll) return;\r\n\r\n // v0.9.1: Respect disableScrollSync config to prevent auto-scroll during drag\r\n const disableSync = config.disableScrollSync || false;\r\n\r\n const handleGridScroll = () => {\r\n if (disableSync) {\r\n // Only update scroll position state, don't sync to timeline\r\n setScrollTop(gridScroll.scrollTop);\r\n return;\r\n }\r\n if (timelineScroll.scrollTop !== gridScroll.scrollTop) {\r\n timelineScroll.scrollTop = gridScroll.scrollTop;\r\n }\r\n setScrollTop(gridScroll.scrollTop);\r\n };\r\n\r\n const handleTimelineScroll = () => {\r\n if (disableSync) {\r\n // Only update scroll position state, don't sync to grid\r\n setScrollTop(timelineScroll.scrollTop);\r\n return;\r\n }\r\n if (gridScroll.scrollTop !== timelineScroll.scrollTop) {\r\n gridScroll.scrollTop = timelineScroll.scrollTop;\r\n }\r\n setScrollTop(timelineScroll.scrollTop);\r\n };\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (isResizing) {\r\n const newWidth = e.clientX;\r\n if (newWidth > 300 && newWidth < window.innerWidth - 400) {\r\n setGridWidthOverride(newWidth);\r\n }\r\n }\r\n };\r\n\r\n const handleMouseUp = () => {\r\n setIsResizing(false);\r\n };\r\n\r\n gridScroll.addEventListener('scroll', handleGridScroll);\r\n timelineScroll.addEventListener('scroll', handleTimelineScroll);\r\n document.addEventListener('mousemove', handleMouseMove);\r\n document.addEventListener('mouseup', handleMouseUp);\r\n\r\n return () => {\r\n gridScroll.removeEventListener('scroll', handleGridScroll);\r\n timelineScroll.removeEventListener('scroll', handleTimelineScroll);\r\n document.removeEventListener('mousemove', handleMouseMove);\r\n document.removeEventListener('mouseup', handleMouseUp);\r\n };\r\n }, [isResizing, config.disableScrollSync]);\r\n\r\n return (\r\n <div\r\n ref={ganttContainerRef}\r\n className=\"flex flex-col h-screen overflow-hidden\"\r\n style={{\r\n backgroundColor: theme.bgPrimary,\r\n fontFamily: 'Inter, sans-serif',\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 */}\r\n <GanttToolbar\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 />\r\n\r\n {/* Main Content */}\r\n <div className=\"flex-1 flex overflow-hidden\">\r\n {/* Task Grid */}\r\n <div\r\n ref={gridScrollRef}\r\n style={{\r\n width: gridWidth,\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 <TaskGrid\r\n tasks={tasksWithCriticalPath}\r\n theme={theme}\r\n rowHeight={rowHeight}\r\n availableUsers={availableUsers}\r\n templates={mergedTemplates}\r\n onTaskClick={onTaskClick}\r\n onTaskDblClick={onTaskDblClick} // v0.8.0\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 onTaskUpdate={handleTaskUpdate}\r\n onTaskDelete={handleTaskDelete}\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 />\r\n </div>\r\n\r\n {/* Separator - Resizable */}\r\n <div\r\n className=\"relative flex-shrink-0 cursor-col-resize group\"\r\n style={{\r\n width: 8,\r\n backgroundColor: isResizing ? theme.accent : theme.border,\r\n transition: 'background-color 0.2s',\r\n }}\r\n onMouseDown={handleMouseDown}\r\n >\r\n <motion.div\r\n className=\"absolute inset-y-0 left-1/2 -translate-x-1/2\"\r\n style={{\r\n width: 2,\r\n backgroundColor: theme.accent,\r\n }}\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: isResizing ? 1 : 0 }}\r\n whileHover={{ opacity: 1 }}\r\n />\r\n </div>\r\n\r\n {/* Timeline */}\r\n <div\r\n ref={timelineScrollRef}\r\n className=\"flex-1 overflow-hidden\"\r\n style={{\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={tasksWithCriticalPath}\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 templates={mergedTemplates}\r\n onTaskClick={onTaskClick}\r\n onTaskDblClick={onTaskDblClick} // v0.8.0\r\n onTaskContextMenu={handleTaskContextMenu} // v0.8.0: Now uses our handler for Split feature\r\n onTaskDateChange={handleTaskDateChange}\r\n onDependencyCreate={handleDependencyCreate}\r\n onDependencyDelete={handleDependencyDelete}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* v0.8.0: Context Menu for Split task feature */}\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 {\r\n id: 'split',\r\n label: 'Split Task',\r\n icon: MenuIcons.Split,\r\n onClick: () => {\r\n if (!contextMenu.task?.startDate || !contextMenu.task?.endDate) {\r\n console.warn('Cannot split task without dates');\r\n return;\r\n }\r\n\r\n // Calculate midpoint date for split\r\n const startTime = contextMenu.task.startDate.getTime();\r\n const endTime = contextMenu.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(contextMenu.task, splitDate);\r\n },\r\n disabled: !contextMenu.task?.startDate || !contextMenu.task?.endDate,\r\n },\r\n ]}\r\n />\r\n )}\r\n </div>\r\n );\r\n})","/**\n * Task Form Modal - Complete CRUD for Gantt Tasks\n * Full-featured task creation/editing with user assignment, dates, dependencies, etc.\n * Similar to DHTMLX Gantt lightbox\n */\n\nimport { useState, useEffect } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n X,\n Calendar,\n Users,\n Link2,\n CheckCircle2,\n Clock,\n AlertCircle,\n Milestone as MilestoneIcon,\n} from 'lucide-react'\nimport { Task, Theme } from './types'\nimport { themes } from './themes'\n\nexport interface TaskFormData {\n name: string\n startDate?: Date\n endDate?: Date\n progress: number\n status: 'todo' | 'in-progress' | 'completed'\n isMilestone: boolean\n assignees?: Array<{ name: string; avatar?: string; initials: string; color: string }>\n dependencies?: string[]\n}\n\nexport interface TaskFormModalProps {\n /** Is modal open */\n isOpen: boolean\n /** Close handler */\n onClose: () => void\n /** Task to edit (undefined for create mode) */\n task?: Task\n /** Available tasks for dependencies */\n availableTasks?: Task[]\n /** Available users for assignment */\n availableUsers?: Array<{ id: string; name: string; avatar?: string }>\n /** Submit handler */\n onSubmit: (data: TaskFormData) => void | Promise<void>\n /** Is submitting */\n isLoading?: boolean\n /** Mode: create or edit */\n mode?: 'create' | 'edit'\n /** Theme: dark, light, or neutral (zen) */\n theme?: Theme\n}\n\nexport function TaskFormModal({\n isOpen,\n onClose,\n task,\n availableTasks = [],\n availableUsers = [],\n onSubmit,\n isLoading = false,\n mode = task ? 'edit' : 'create',\n theme = 'dark',\n}: TaskFormModalProps) {\n // Get theme colors (with fallback to dark theme)\n const themeColors = (themes[theme] || themes.dark)!\n\n // Common styles\n const inputStyle = {\n backgroundColor: themeColors.bgSecondary,\n border: `1px solid ${themeColors.borderLight}`,\n color: themeColors.textPrimary,\n }\n\n const labelStyle = {\n color: themeColors.textSecondary,\n }\n\n const [formData, setFormData] = useState<TaskFormData>({\n name: '',\n progress: 0,\n status: 'todo',\n isMilestone: false,\n assignees: [],\n dependencies: [],\n })\n\n const [errors, setErrors] = useState<Record<string, string>>({})\n\n // Initialize form with task data (edit mode)\n useEffect(() => {\n if (task) {\n setFormData({\n name: task.name,\n startDate: task.startDate,\n endDate: task.endDate,\n progress: task.progress,\n status: task.status || 'todo',\n isMilestone: task.isMilestone || false,\n assignees: task.assignees || [],\n dependencies: task.dependencies || [],\n })\n } else {\n // Reset for create mode\n setFormData({\n name: '',\n progress: 0,\n status: 'todo',\n isMilestone: false,\n assignees: [],\n dependencies: [],\n })\n }\n }, [task, isOpen])\n\n const validate = (): boolean => {\n const newErrors: Record<string, string> = {}\n\n if (!formData.name.trim()) {\n newErrors.name = 'El nombre es requerido'\n }\n\n if (formData.startDate && formData.endDate && formData.startDate > formData.endDate) {\n newErrors.endDate = 'La fecha de fin debe ser posterior a la de inicio'\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n\n if (!validate()) return\n\n try {\n await onSubmit(formData)\n onClose()\n } catch (error) {\n console.error('Error submitting task:', error)\n }\n }\n\n const handleChange = (field: keyof TaskFormData, value: any) => {\n setFormData((prev) => ({ ...prev, [field]: value }))\n // Clear error when user starts typing\n if (errors[field]) {\n setErrors((prev) => {\n const newErrors = { ...prev }\n delete newErrors[field]\n return newErrors\n })\n }\n }\n\n return (\n <AnimatePresence>\n {isOpen && (\n <>\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 bg-black/50 z-50\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <motion.div\n initial={{ opacity: 0, scale: 0.95, y: 20 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: 20 }}\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 pointer-events-none\"\n >\n <div\n className=\"w-full max-w-2xl rounded-xl shadow-2xl pointer-events-auto overflow-hidden\"\n style={{\n backgroundColor: themeColors.bgPrimary,\n border: `1px solid ${themeColors.border}`,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n className=\"flex items-center justify-between px-6 py-4\"\n style={{ borderBottom: `1px solid ${themeColors.border}` }}\n >\n <h2 className=\"text-lg font-semibold\" style={{ color: themeColors.textPrimary }}>\n {mode === 'create' ? 'Crear Nueva Tarea' : 'Editar Tarea'}\n </h2>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg transition-colors\"\n style={{\n color: themeColors.textSecondary,\n }}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = themeColors.hoverBg)}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\n disabled={isLoading}\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit} className=\"p-6 space-y-6 max-h-[calc(100vh-200px)] overflow-y-auto\">\n {/* Task Name */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" style={labelStyle}>\n Nombre de la Tarea *\n </label>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => handleChange('name', e.target.value)}\n className=\"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent\"\n style={inputStyle}\n onFocus={(e) => (e.currentTarget.style.borderColor = themeColors.accent)}\n onBlur={(e) => (e.currentTarget.style.borderColor = themeColors.borderLight)}\n placeholder=\"Ej: Diseñar mockups de la aplicación\"\n disabled={isLoading}\n />\n {errors.name && (\n <p className=\"mt-1 text-sm text-red-400 flex items-center gap-1\">\n <AlertCircle className=\"w-4 h-4\" />\n {errors.name}\n </p>\n )}\n </div>\n\n {/* Dates Row */}\n <div className=\"grid grid-cols-2 gap-4\">\n {/* Start Date */}\n <div>\n <label className=\"block text-sm font-medium mb-2 flex items-center gap-2\" style={labelStyle}>\n <Calendar className=\"w-4 h-4\" />\n Fecha de Inicio\n </label>\n <input\n type=\"date\"\n value={formData.startDate ? formData.startDate.toISOString().split('T')[0] : ''}\n onChange={(e) => handleChange('startDate', e.target.value ? new Date(e.target.value) : undefined)}\n className=\"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent\"\n style={inputStyle}\n disabled={isLoading || formData.isMilestone}\n />\n </div>\n\n {/* End Date */}\n <div>\n <label className=\"block text-sm font-medium mb-2 flex items-center gap-2\" style={labelStyle}>\n <Calendar className=\"w-4 h-4\" />\n Fecha de Fin\n </label>\n <input\n type=\"date\"\n value={formData.endDate ? formData.endDate.toISOString().split('T')[0] : ''}\n onChange={(e) => handleChange('endDate', e.target.value ? new Date(e.target.value) : undefined)}\n className=\"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent\"\n style={inputStyle}\n disabled={isLoading || formData.isMilestone}\n />\n {errors.endDate && (\n <p className=\"mt-1 text-sm text-red-400 flex items-center gap-1\">\n <AlertCircle className=\"w-4 h-4\" />\n {errors.endDate}\n </p>\n )}\n </div>\n </div>\n\n {/* Status */}\n <div>\n <label className=\"block text-sm font-medium mb-2 flex items-center gap-2\" style={labelStyle}>\n <CheckCircle2 className=\"w-4 h-4\" />\n Estado\n </label>\n <select\n value={formData.status}\n onChange={(e) => handleChange('status', e.target.value)}\n className=\"w-full px-4 py-2.5 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent\"\n style={inputStyle}\n disabled={isLoading}\n >\n <option value=\"todo\">Por Hacer</option>\n <option value=\"in-progress\">En Progreso</option>\n <option value=\"completed\">Completada</option>\n </select>\n </div>\n\n {/* Progress */}\n <div>\n <label className=\"block text-sm font-medium mb-2 flex items-center justify-between\" style={labelStyle}>\n <span className=\"flex items-center gap-2\">\n <Clock className=\"w-4 h-4\" />\n Progreso\n </span>\n <span className=\"font-semibold\" style={{ color: themeColors.accent }}>{formData.progress}%</span>\n </label>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n step=\"5\"\n value={formData.progress}\n onChange={(e) => handleChange('progress', parseInt(e.target.value))}\n className=\"w-full h-2 rounded-lg appearance-none cursor-pointer\"\n style={{\n backgroundColor: themeColors.bgSecondary,\n accentColor: themeColors.accent,\n }}\n disabled={isLoading}\n />\n <div className=\"flex justify-between text-xs mt-1\" style={{ color: themeColors.textTertiary }}>\n <span>0%</span>\n <span>25%</span>\n <span>50%</span>\n <span>75%</span>\n <span>100%</span>\n </div>\n </div>\n\n {/* Milestone Checkbox */}\n <div\n className=\"flex items-center gap-3 p-4 rounded-lg\"\n style={{\n backgroundColor: themeColors.bgSecondary,\n border: `1px solid ${themeColors.borderLight}`,\n }}\n >\n <input\n type=\"checkbox\"\n id=\"isMilestone\"\n checked={formData.isMilestone}\n onChange={(e) => handleChange('isMilestone', e.target.checked)}\n className=\"w-4 h-4 rounded focus:ring-2\"\n style={{\n accentColor: themeColors.accent,\n }}\n disabled={isLoading}\n />\n <label htmlFor=\"isMilestone\" className=\"flex items-center gap-2 text-sm cursor-pointer\" style={{ color: themeColors.textPrimary }}>\n <MilestoneIcon className=\"w-4 h-4 text-yellow-500\" />\n Marcar como Hito (Milestone)\n </label>\n </div>\n\n {/* Assignees */}\n {availableUsers.length > 0 && (\n <div>\n <label className=\"block text-sm font-medium mb-2 flex items-center gap-2\" style={labelStyle}>\n <Users className=\"w-4 h-4\" />\n Asignar a\n </label>\n <div\n className=\"space-y-2 max-h-32 overflow-y-auto p-3 rounded-lg\"\n style={{\n backgroundColor: themeColors.bgSecondary,\n border: `1px solid ${themeColors.borderLight}`,\n }}\n >\n {availableUsers.map((user) => (\n <label\n key={user.id}\n className=\"flex items-center gap-3 cursor-pointer p-2 rounded\"\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = themeColors.hoverBg)}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\n >\n <input\n type=\"checkbox\"\n checked={formData.assignees?.some((a) => a.name === user.name)}\n onChange={(e) => {\n const newAssignees = e.target.checked\n ? [\n ...(formData.assignees || []),\n {\n name: user.name,\n avatar: user.avatar,\n initials: user.name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2),\n color: themeColors.accent,\n },\n ]\n : (formData.assignees || []).filter((a) => a.name !== user.name)\n handleChange('assignees', newAssignees)\n }}\n className=\"w-4 h-4 rounded\"\n style={{\n accentColor: themeColors.accent,\n }}\n disabled={isLoading}\n />\n <div className=\"flex items-center gap-2\">\n <div\n className=\"w-6 h-6 rounded-full flex items-center justify-center text-xs text-white font-semibold\"\n style={{ backgroundColor: themeColors.accent }}\n >\n {user.name.charAt(0).toUpperCase()}\n </div>\n <span className=\"text-sm\" style={{ color: themeColors.textPrimary }}>{user.name}</span>\n </div>\n </label>\n ))}\n </div>\n </div>\n )}\n\n {/* Dependencies */}\n {availableTasks.length > 0 && (\n <div>\n <label className=\"block text-sm font-medium mb-2 flex items-center gap-2\" style={labelStyle}>\n <Link2 className=\"w-4 h-4\" />\n Dependencias\n </label>\n <div\n className=\"space-y-2 max-h-32 overflow-y-auto p-3 rounded-lg\"\n style={{\n backgroundColor: themeColors.bgSecondary,\n border: `1px solid ${themeColors.borderLight}`,\n }}\n >\n {availableTasks\n .filter((t) => t.id !== task?.id)\n .map((t) => (\n <label\n key={t.id}\n className=\"flex items-center gap-3 cursor-pointer p-2 rounded\"\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = themeColors.hoverBg)}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'transparent')}\n >\n <input\n type=\"checkbox\"\n checked={formData.dependencies?.includes(t.id)}\n onChange={(e) => {\n const newDeps = e.target.checked\n ? [...(formData.dependencies || []), t.id]\n : (formData.dependencies || []).filter((id) => id !== t.id)\n handleChange('dependencies', newDeps)\n }}\n className=\"w-4 h-4 rounded\"\n style={{\n accentColor: themeColors.accent,\n }}\n disabled={isLoading}\n />\n <span className=\"text-sm\" style={{ color: themeColors.textPrimary }}>{t.name}</span>\n </label>\n ))}\n </div>\n </div>\n )}\n </form>\n\n {/* Footer */}\n <div\n className=\"flex items-center justify-end gap-3 px-6 py-4\"\n style={{\n borderTop: `1px solid ${themeColors.border}`,\n backgroundColor: themeColors.bgPrimary,\n }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n className=\"px-4 py-2 text-sm font-medium rounded-lg transition-colors\"\n style={{ color: themeColors.textSecondary }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = themeColors.textPrimary\n e.currentTarget.style.backgroundColor = themeColors.hoverBg\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = themeColors.textSecondary\n e.currentTarget.style.backgroundColor = 'transparent'\n }}\n disabled={isLoading}\n >\n Cancelar\n </button>\n <button\n onClick={handleSubmit}\n disabled={isLoading}\n className=\"px-4 py-2 text-sm font-medium rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2\"\n style={{\n backgroundColor: themeColors.accent,\n color: '#FFFFFF',\n }}\n onMouseEnter={(e) => !isLoading && (e.currentTarget.style.backgroundColor = themeColors.accentHover)}\n onMouseLeave={(e) => !isLoading && (e.currentTarget.style.backgroundColor = themeColors.accent)}\n >\n {isLoading ? (\n <>\n <div className=\"w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin\" />\n Guardando...\n </>\n ) : (\n <>\n <CheckCircle2 className=\"w-4 h-4\" />\n {mode === 'create' ? 'Crear Tarea' : 'Guardar Cambios'}\n </>\n )}\n </button>\n </div>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n )\n}\n","/**\r\n * Type adapters for converting between ASAKAA Card types and Gantt Task types\r\n * @module Gantt/adapters\r\n */\r\n\r\nimport type { Card } from '../../types'\r\nimport type { Task, Assignee } from './types'\r\n\r\n/**\r\n * Maps ASAKAA CardStatus to Gantt task status\r\n */\r\nfunction mapCardStatusToTaskStatus(\r\n status?: string\r\n): 'todo' | 'in-progress' | 'completed' | undefined {\r\n if (!status) return undefined\r\n\r\n switch (status.toUpperCase()) {\r\n case 'TODO':\r\n case 'BLOCKED':\r\n return 'todo'\r\n case 'IN_PROGRESS':\r\n case 'REVIEW':\r\n return 'in-progress'\r\n case 'DONE':\r\n return 'completed'\r\n default:\r\n return 'todo'\r\n }\r\n}\r\n\r\n/**\r\n * Maps Gantt task status to ASAKAA CardStatus\r\n */\r\nfunction mapTaskStatusToCardStatus(\r\n status?: 'todo' | 'in-progress' | 'completed'\r\n): 'TODO' | 'IN_PROGRESS' | 'DONE' {\r\n switch (status) {\r\n case 'todo':\r\n return 'TODO'\r\n case 'in-progress':\r\n return 'IN_PROGRESS'\r\n case 'completed':\r\n return 'DONE'\r\n default:\r\n return 'TODO'\r\n }\r\n}\r\n\r\n/**\r\n * Converts an ASAKAA Card to a Gantt Task\r\n *\r\n * @param card - ASAKAA Card object\r\n * @param allCards - All cards in the board (for resolving subtasks)\r\n * @param users - Available users for assignee mapping\r\n * @returns Gantt Task object\r\n */\r\nexport function cardToGanttTask(\r\n card: Card,\r\n allCards: Card[] = [],\r\n users: Array<{ id: string; name: string; initials: string; color: string }> = []\r\n): Task {\r\n // Map assignees\r\n const assignees: Assignee[] | undefined = card.assignedUserIds\r\n ?.map((userId) => {\r\n const user = users.find((u) => u.id === userId)\r\n if (!user) return null\r\n return {\r\n name: user.name,\r\n initials: user.initials,\r\n color: user.color,\r\n }\r\n })\r\n .filter((a): a is Assignee => a !== null)\r\n\r\n // Find subtasks (cards that reference this card as parent)\r\n const subtasks: Task[] | undefined = allCards\r\n .filter((c) => c.metadata?.parentCardId === card.id)\r\n .map((c) => cardToGanttTask(c, allCards, users))\r\n\r\n // Extract dependency IDs\r\n let dependencies: string[] | undefined\r\n if (card.dependencies) {\r\n if (typeof card.dependencies[0] === 'string') {\r\n // Legacy format: string[]\r\n dependencies = card.dependencies as string[]\r\n } else {\r\n // New format: Dependency[] - only use finish-to-start\r\n dependencies = (card.dependencies as any[])\r\n .filter((dep) => dep.type === 'finish-to-start')\r\n .map((dep) => dep.taskId)\r\n }\r\n }\r\n\r\n // Parse dates (handle both Date and string) - allow undefined for tasks without dates\r\n const parseDate = (date: Date | string | undefined): Date | undefined => {\r\n if (!date) return undefined\r\n return typeof date === 'string' ? new Date(date) : date\r\n }\r\n\r\n const startDate = parseDate(card.startDate)\r\n const endDate = parseDate(card.endDate)\r\n\r\n // Determine if this is a milestone (0 or 1 day duration, or explicitly marked)\r\n const isMilestone = card.metadata?.isMilestone === true ||\r\n (startDate && endDate && Math.abs(endDate.getTime() - startDate.getTime()) <= 86400000)\r\n\r\n return {\r\n id: card.id,\r\n name: card.title,\r\n startDate,\r\n endDate,\r\n progress: card.progress || 0,\r\n status: mapCardStatusToTaskStatus(card.metadata?.status as string),\r\n assignees: assignees?.length ? assignees : undefined,\r\n dependencies: dependencies?.length ? dependencies : undefined,\r\n subtasks: subtasks?.length ? subtasks : undefined,\r\n isExpanded: card.metadata?.isExpanded === true,\r\n isMilestone,\r\n isCriticalPath: card.metadata?.isCriticalPath === true,\r\n }\r\n}\r\n\r\n/**\r\n * Converts a Gantt Task back to an ASAKAA Card (partial update)\r\n * Note: This only returns the fields that Gantt can modify\r\n *\r\n * @param task - Gantt Task object\r\n * @param users - Available users for reverse mapping assignees to userIds\r\n * @returns Partial Card update object\r\n */\r\nexport function ganttTaskToCardUpdate(\r\n task: Task,\r\n users: Array<{ id: string; name: string; initials: string; color: string }> = []\r\n): Partial<Card> {\r\n // Convert assignees back to userIds\r\n let assignedUserIds: string[] | undefined\r\n if (task.assignees && task.assignees.length > 0) {\r\n assignedUserIds = task.assignees\r\n .map((assignee) => {\r\n // Find user by name or initials\r\n const user = users.find(\r\n (u) => u.name === assignee.name || u.initials === assignee.initials\r\n )\r\n return user?.id\r\n })\r\n .filter((id): id is string => id !== undefined)\r\n }\r\n\r\n return {\r\n id: task.id,\r\n title: task.name,\r\n startDate: task.startDate,\r\n endDate: task.endDate,\r\n progress: task.progress,\r\n assignedUserIds: assignedUserIds?.length ? assignedUserIds : undefined,\r\n metadata: {\r\n status: mapTaskStatusToCardStatus(task.status),\r\n isExpanded: task.isExpanded,\r\n isMilestone: task.isMilestone,\r\n isCriticalPath: task.isCriticalPath,\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Converts an array of Cards to an array of Gantt Tasks\r\n *\r\n * @param cards - Array of ASAKAA Card objects\r\n * @param users - Available users for assignee mapping\r\n * @returns Array of Gantt Task objects\r\n */\r\nexport function cardsToGanttTasks(\r\n cards: Card[],\r\n users: Array<{ id: string; name: string; initials: string; color: string }> = []\r\n): Task[] {\r\n // Filter out cards that are subtasks (have parentCardId)\r\n const topLevelCards = cards.filter((c) => !c.metadata?.parentCardId)\r\n\r\n return topLevelCards.map((card) => cardToGanttTask(card, cards, users))\r\n}\r\n","/**\r\n * CardStack Component\r\n * Visual grouping of related cards with expand/collapse\r\n * @module components/CardStack\r\n */\r\n\r\nimport { useState, useMemo } from 'react'\r\nimport type { Card } from '../../types'\r\nimport type { CardStack as CardStackType } from '../../types/card-stack'\r\nimport { cn } from '../../utils'\r\nimport './card-stack.css'\r\n\r\nexport interface CardStackProps {\r\n /** Stack configuration */\r\n stack: CardStackType\r\n /** All cards in the board */\r\n cards: Card[]\r\n /** Card render function */\r\n renderCard?: (card: Card) => React.ReactNode\r\n /** Click handler for individual cards */\r\n onCardClick?: (card: Card) => void\r\n /** Expand/collapse handler */\r\n onToggleExpand?: (stackId: string) => void\r\n /** Unstack handler (remove card from stack) */\r\n onUnstack?: (stackId: string, cardId: string) => void\r\n /** Delete entire stack handler */\r\n onDeleteStack?: (stackId: string) => void\r\n /** Custom className */\r\n className?: string\r\n}\r\n\r\n/**\r\n * CardStack - Collapsible group of related cards\r\n */\r\nexport function CardStack({\r\n stack,\r\n cards,\r\n renderCard,\r\n onCardClick,\r\n onToggleExpand,\r\n onUnstack,\r\n onDeleteStack,\r\n className,\r\n}: CardStackProps) {\r\n const [isHovered, setIsHovered] = useState(false)\r\n\r\n // Get cards in this stack\r\n const stackCards = useMemo(() => {\r\n return cards.filter((card) => stack.cardIds.includes(card.id))\r\n }, [cards, stack.cardIds])\r\n\r\n // Calculate stack statistics\r\n const stats = useMemo(() => {\r\n const totalCards = stackCards.length\r\n const uniqueAssignees = new Set(\r\n stackCards.flatMap((c) => c.assignedUserIds || [])\r\n ).size\r\n const priorities = stackCards.map((c) => c.priority).filter(Boolean)\r\n const labels = new Set(stackCards.flatMap((c) => c.labels || [])).size\r\n\r\n return {\r\n totalCards,\r\n uniqueAssignees,\r\n priorities,\r\n labels,\r\n }\r\n }, [stackCards])\r\n\r\n const handleToggle = () => {\r\n onToggleExpand?.(stack.id)\r\n }\r\n\r\n return (\r\n <div\r\n className={cn('card-stack', !stack.isExpanded && 'card-stack-collapsed', className)}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => setIsHovered(false)}\r\n style={{\r\n '--stack-color': stack.color || 'var(--color-accent-primary)',\r\n } as React.CSSProperties}\r\n >\r\n {/* Stack Header */}\r\n <div className=\"card-stack-header\" onClick={handleToggle}>\r\n <div className=\"card-stack-header-left\">\r\n {/* Expand/Collapse Icon */}\r\n <button className=\"card-stack-toggle\" aria-label={stack.isExpanded ? 'Collapse' : 'Expand'}>\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 strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={cn('card-stack-chevron', stack.isExpanded && 'expanded')}\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Stack Title */}\r\n <h3 className=\"card-stack-title\">{stack.title}</h3>\r\n\r\n {/* Stack Badge */}\r\n <div className=\"card-stack-badge\">{stats.totalCards}</div>\r\n\r\n {/* Strategy Badge */}\r\n <div className=\"card-stack-strategy\">\r\n {stack.strategy === 'ai-similarity' && '✨ AI'}\r\n {stack.strategy === 'manual' && '👤 Manual'}\r\n {stack.strategy === 'labels' && '🏷️ Labels'}\r\n {stack.strategy === 'assignee' && '👥 Assignee'}\r\n {stack.strategy === 'priority' && '🎯 Priority'}\r\n {stack.strategy === 'epic' && '📚 Epic'}\r\n </div>\r\n </div>\r\n\r\n {/* Stack Actions */}\r\n {isHovered && (\r\n <div className=\"card-stack-actions\">\r\n <button\r\n className=\"card-stack-action\"\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n onDeleteStack?.(stack.id)\r\n }}\r\n aria-label=\"Delete stack\"\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <polyline points=\"3 6 5 6 21 6\" />\r\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\" />\r\n </svg>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Stack Summary (when collapsed) */}\r\n {!stack.isExpanded && (\r\n <div className=\"card-stack-summary\">\r\n <div className=\"card-stack-summary-item\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\" />\r\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\r\n </svg>\r\n <span>{stats.uniqueAssignees} assignees</span>\r\n </div>\r\n {stats.labels > 0 && (\r\n <div className=\"card-stack-summary-item\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\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\" />\r\n <line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\" />\r\n </svg>\r\n <span>{stats.labels} labels</span>\r\n </div>\r\n )}\r\n {stack.confidence && (\r\n <div className=\"card-stack-summary-item\">\r\n <span className=\"card-stack-confidence\">{Math.round(stack.confidence * 100)}% match</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Stack Content (when expanded) */}\r\n {stack.isExpanded && (\r\n <div className=\"card-stack-content\">\r\n {stackCards.length === 0 ? (\r\n <div className=\"card-stack-empty\">\r\n <p>No cards in this stack</p>\r\n <span>Drag cards here or delete this stack</span>\r\n </div>\r\n ) : (\r\n <div className=\"card-stack-cards\">\r\n {stackCards.map((card) => (\r\n <div key={card.id} className=\"card-stack-card-wrapper\">\r\n {renderCard ? (\r\n <div onClick={() => onCardClick?.(card)}>{renderCard(card)}</div>\r\n ) : (\r\n <div className=\"card-stack-default-card\" onClick={() => onCardClick?.(card)}>\r\n <h4>{card.title}</h4>\r\n {card.description && <p>{card.description.substring(0, 100)}...</p>}\r\n </div>\r\n )}\r\n {/* Unstack button */}\r\n <button\r\n className=\"card-stack-unstack-btn\"\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n onUnstack?.(stack.id, card.id)\r\n }}\r\n aria-label=\"Remove from stack\"\r\n >\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\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: '#3b82f6',\r\n assignee_changed: '#8b5cf6',\r\n priority_changed: '#f59e0b',\r\n moved: '#06b6d4',\r\n title_updated: '#6366f1',\r\n description_updated: '#6366f1',\r\n dates_changed: '#ec4899',\r\n labels_changed: '#14b8a6',\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","/**\r\n * CardHistoryTimeline Component\r\n * Interactive timeline visualization of card history\r\n * @module components/CardHistory\r\n */\r\n\r\nimport { useState, useMemo, useRef, useEffect } from 'react'\r\nimport type {\r\n CardHistoryEvent,\r\n HistoryFilter,\r\n TimelineConfig,\r\n CardHistoryEventType,\r\n} from '../../types/card-history'\r\nimport {\r\n DEFAULT_TIMELINE_CONFIG,\r\n formatEventDescription,\r\n getEventIcon,\r\n getEventColor,\r\n} from '../../types/card-history'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface CardHistoryTimelineProps {\r\n /** History events to display */\r\n events: CardHistoryEvent[]\r\n /** Current filter */\r\n filter: HistoryFilter\r\n /** Update filter */\r\n onFilterChange: (filter: HistoryFilter) => void\r\n /** Clear filter */\r\n onClearFilter: () => void\r\n /** Click on event */\r\n onEventClick?: (event: CardHistoryEvent) => void\r\n /** Selected event ID */\r\n selectedEventId?: string\r\n /** Timeline configuration */\r\n config?: Partial<TimelineConfig>\r\n /** Custom className */\r\n className?: string\r\n}\r\n\r\n/**\r\n * Timeline component showing card history\r\n */\r\nexport function CardHistoryTimeline({\r\n events,\r\n filter,\r\n onFilterChange,\r\n onClearFilter,\r\n onEventClick,\r\n selectedEventId,\r\n config: customConfig,\r\n className,\r\n}: CardHistoryTimelineProps) {\r\n const config = useMemo(\r\n () => ({ ...DEFAULT_TIMELINE_CONFIG, ...customConfig }),\r\n [customConfig]\r\n )\r\n\r\n const [expandedEvents, setExpandedEvents] = useState<Set<string>>(new Set())\r\n const timelineRef = useRef<HTMLDivElement>(null)\r\n\r\n // Group events by day if configured\r\n const groupedEvents = useMemo(() => {\r\n if (!config.groupByDay) {\r\n return [{ date: null, events }]\r\n }\r\n\r\n const groups = new Map<string, CardHistoryEvent[]>()\r\n events.forEach((event) => {\r\n const dateKey = event.timestamp.toISOString().split('T')[0]!\r\n const group = groups.get(dateKey)\r\n if (!group) {\r\n groups.set(dateKey, [event])\r\n } else {\r\n group.push(event)\r\n }\r\n })\r\n\r\n return Array.from(groups.entries())\r\n .sort((a, b) => b[0].localeCompare(a[0]))\r\n .map(([dateStr, events]) => ({\r\n date: new Date(dateStr),\r\n events: events.sort(\r\n (a, b) => b.timestamp.getTime() - a.timestamp.getTime()\r\n ),\r\n }))\r\n }, [events, config.groupByDay])\r\n\r\n // Get unique users and event types for filter\r\n const { uniqueUsers, uniqueTypes } = useMemo(() => {\r\n const users = new Set<string>()\r\n const types = new Set<CardHistoryEventType>()\r\n events.forEach((event) => {\r\n users.add(event.userId)\r\n types.add(event.type)\r\n })\r\n return {\r\n uniqueUsers: Array.from(users),\r\n uniqueTypes: Array.from(types),\r\n }\r\n }, [events])\r\n\r\n // Toggle event expansion\r\n const toggleEvent = (eventId: string) => {\r\n setExpandedEvents((prev) => {\r\n const next = new Set(prev)\r\n if (next.has(eventId)) {\r\n next.delete(eventId)\r\n } else {\r\n next.add(eventId)\r\n }\r\n return next\r\n })\r\n }\r\n\r\n // Format relative time\r\n const formatRelativeTime = (date: Date): string => {\r\n const now = new Date()\r\n const diffMs = now.getTime() - date.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 'just now'\r\n if (diffMins < 60) return `${diffMins}m ago`\r\n if (diffHours < 24) return `${diffHours}h ago`\r\n if (diffDays < 7) return `${diffDays}d ago`\r\n return date.toLocaleDateString()\r\n }\r\n\r\n // Active filter count\r\n const activeFilterCount = useMemo(() => {\r\n let count = 0\r\n if (filter.types && filter.types.length > 0) count++\r\n if (filter.users && filter.users.length > 0) count++\r\n if (filter.dateRange) count++\r\n if (filter.searchTerm) count++\r\n return count\r\n }, [filter])\r\n\r\n // Scroll to selected event\r\n useEffect(() => {\r\n if (selectedEventId && timelineRef.current) {\r\n const element = timelineRef.current.querySelector(\r\n `[data-event-id=\"${selectedEventId}\"]`\r\n )\r\n if (element) {\r\n element.scrollIntoView({ behavior: 'smooth', block: 'center' })\r\n }\r\n }\r\n }, [selectedEventId])\r\n\r\n if (events.length === 0) {\r\n return (\r\n <div className={cn('history-timeline-empty', className)}>\r\n <div className=\"history-timeline-empty-icon\">📜</div>\r\n <p className=\"history-timeline-empty-text\">No history events yet</p>\r\n <p className=\"history-timeline-empty-subtext\">\r\n Changes to this card will appear here\r\n </p>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className={cn('history-timeline', config.compact && 'compact', className)}>\r\n {/* Filter Bar */}\r\n <div className=\"history-timeline-filters\">\r\n <div className=\"history-timeline-filter-group\">\r\n {/* Event Type Filter */}\r\n <select\r\n className=\"history-timeline-filter-select\"\r\n value={filter.types?.[0] || ''}\r\n onChange={(e) => {\r\n const value = e.target.value\r\n onFilterChange({\r\n ...filter,\r\n types: value ? [value as CardHistoryEventType] : undefined,\r\n })\r\n }}\r\n >\r\n <option value=\"\">All Events</option>\r\n {uniqueTypes.map((type) => (\r\n <option key={type} value={type}>\r\n {getEventIcon(type)} {type.replace('_', ' ')}\r\n </option>\r\n ))}\r\n </select>\r\n\r\n {/* User Filter */}\r\n {uniqueUsers.length > 1 && (\r\n <select\r\n className=\"history-timeline-filter-select\"\r\n value={filter.users?.[0] || ''}\r\n onChange={(e) => {\r\n const value = e.target.value\r\n onFilterChange({\r\n ...filter,\r\n users: value ? [value] : undefined,\r\n })\r\n }}\r\n >\r\n <option value=\"\">All Users</option>\r\n {uniqueUsers.map((userId) => (\r\n <option key={userId} value={userId}>\r\n {userId}\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n\r\n {/* Search */}\r\n <input\r\n type=\"text\"\r\n className=\"history-timeline-filter-search\"\r\n placeholder=\"Search history...\"\r\n value={filter.searchTerm || ''}\r\n onChange={(e) =>\r\n onFilterChange({ ...filter, searchTerm: e.target.value })\r\n }\r\n />\r\n </div>\r\n\r\n {/* Clear Filter */}\r\n {activeFilterCount > 0 && (\r\n <button\r\n className=\"history-timeline-filter-clear\"\r\n onClick={onClearFilter}\r\n >\r\n Clear filters ({activeFilterCount})\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Timeline */}\r\n <div className=\"history-timeline-container\" ref={timelineRef}>\r\n {groupedEvents.map((group) => (\r\n <div key={group.date?.toISOString() || 'all'} className=\"history-timeline-group\">\r\n {/* Day Header */}\r\n {config.groupByDay && group.date && (\r\n <div className=\"history-timeline-day-header\">\r\n <span className=\"history-timeline-day-date\">\r\n {group.date.toLocaleDateString('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric',\r\n })}\r\n </span>\r\n <span className=\"history-timeline-day-count\">\r\n {group.events.length} events\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* Events */}\r\n <div className=\"history-timeline-events\">\r\n {group.events.map((event, eventIndex) => {\r\n const isExpanded = expandedEvents.has(event.id)\r\n const isSelected = selectedEventId === event.id\r\n const eventColor = getEventColor(event.type)\r\n\r\n return (\r\n <div\r\n key={event.id}\r\n data-event-id={event.id}\r\n className={cn(\r\n 'history-timeline-event',\r\n isExpanded && 'expanded',\r\n isSelected && 'selected'\r\n )}\r\n onClick={() => onEventClick?.(event)}\r\n >\r\n {/* Timeline Line */}\r\n <div className=\"history-timeline-line\">\r\n {/* Event Dot */}\r\n <div\r\n className=\"history-timeline-dot\"\r\n style={{ backgroundColor: eventColor }}\r\n >\r\n {config.showIcons && (\r\n <span className=\"history-timeline-dot-icon\">\r\n {getEventIcon(event.type)}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Connecting Line */}\r\n {eventIndex < group.events.length - 1 && (\r\n <div\r\n className=\"history-timeline-connector\"\r\n style={{ borderColor: eventColor }}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Event Content */}\r\n <div className=\"history-timeline-event-content\">\r\n {/* Header */}\r\n <div className=\"history-timeline-event-header\">\r\n <div className=\"history-timeline-event-header-left\">\r\n {/* User Avatar */}\r\n {config.showAvatars && event.userAvatar && (\r\n <img\r\n src={event.userAvatar}\r\n alt={event.userName || event.userId}\r\n className=\"history-timeline-event-avatar\"\r\n />\r\n )}\r\n\r\n {/* Description */}\r\n <div className=\"history-timeline-event-description\">\r\n <span className=\"history-timeline-event-user\">\r\n {event.userName || event.userId}\r\n </span>\r\n <span className=\"history-timeline-event-action\">\r\n {formatEventDescription(event)}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Time */}\r\n <div className=\"history-timeline-event-time\">\r\n {config.useRelativeTime\r\n ? formatRelativeTime(event.timestamp)\r\n : event.timestamp.toLocaleString()}\r\n </div>\r\n </div>\r\n\r\n {/* Changes Preview */}\r\n {Object.keys(event.changes).length > 0 && (\r\n <button\r\n className=\"history-timeline-event-toggle\"\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n toggleEvent(event.id)\r\n }}\r\n >\r\n {isExpanded ? '▼' : '▶'} Show changes\r\n </button>\r\n )}\r\n\r\n {/* Expanded Changes */}\r\n {isExpanded && (\r\n <div className=\"history-timeline-event-changes\">\r\n {Object.entries(event.changes).map(([key, change]) => (\r\n <div key={key} className=\"history-timeline-event-change\">\r\n <span className=\"history-timeline-event-change-key\">\r\n {key}:\r\n </span>\r\n <div className=\"history-timeline-event-change-values\">\r\n <span className=\"history-timeline-event-change-from\">\r\n {JSON.stringify(change.from)}\r\n </span>\r\n <span className=\"history-timeline-event-change-arrow\">\r\n →\r\n </span>\r\n <span className=\"history-timeline-event-change-to\">\r\n {JSON.stringify(change.to)}\r\n </span>\r\n </div>\r\n </div>\r\n ))}\r\n\r\n {/* Metadata */}\r\n {event.metadata && Object.keys(event.metadata).length > 0 && (\r\n <div className=\"history-timeline-event-metadata\">\r\n <div className=\"history-timeline-event-metadata-title\">\r\n Additional Info:\r\n </div>\r\n {Object.entries(event.metadata).map(([key, value]) => (\r\n <div key={key} className=\"history-timeline-event-metadata-item\">\r\n <span className=\"history-timeline-event-metadata-key\">\r\n {key}:\r\n </span>\r\n <span className=\"history-timeline-event-metadata-value\">\r\n {JSON.stringify(value)}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n )}\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 </div>\r\n </div>\r\n )\r\n}\r\n","/**\r\n * CardHistoryReplay Component\r\n * Video-player-style controls for replaying card history\r\n * @module components/CardHistory\r\n */\r\n\r\nimport { useMemo } from 'react'\r\nimport type { ReplayState, CardHistoryEvent } from '../../types/card-history'\r\nimport { getEventIcon, formatEventDescription } from '../../types/card-history'\r\nimport { cn } from '../../utils'\r\n\r\nexport interface CardHistoryReplayProps {\r\n /** Current replay state */\r\n replayState: ReplayState | null\r\n /** All history events */\r\n events: CardHistoryEvent[]\r\n /** Start replay */\r\n onStartReplay: () => void\r\n /** Stop replay */\r\n onStopReplay: () => void\r\n /** Toggle play/pause */\r\n onTogglePlayback: () => void\r\n /** Go to previous event */\r\n onPrevious: () => void\r\n /** Go to next event */\r\n onNext: () => void\r\n /** Go to specific event */\r\n onGoToEvent: (index: number) => void\r\n /** Change playback speed */\r\n onSpeedChange: (speed: number) => void\r\n /** Custom className */\r\n className?: string\r\n}\r\n\r\n/**\r\n * Replay controls for time-travel functionality\r\n */\r\nexport function CardHistoryReplay({\r\n replayState,\r\n events,\r\n onStartReplay,\r\n onStopReplay,\r\n onTogglePlayback,\r\n onPrevious,\r\n onNext,\r\n onGoToEvent,\r\n onSpeedChange,\r\n className,\r\n}: CardHistoryReplayProps) {\r\n // Available playback speeds\r\n const speeds = [0.5, 1, 1.5, 2, 3]\r\n\r\n // Current event\r\n const currentEvent = useMemo(() => {\r\n if (!replayState || events.length === 0) return null\r\n return events[replayState.currentIndex]\r\n }, [replayState, events])\r\n\r\n // Progress percentage\r\n const progress = useMemo(() => {\r\n if (!replayState || replayState.totalEvents === 0) return 0\r\n return (replayState.currentIndex / (replayState.totalEvents - 1)) * 100\r\n }, [replayState])\r\n\r\n // If no events, show empty state\r\n if (events.length === 0) {\r\n return (\r\n <div className={cn('history-replay-empty', className)}>\r\n <div className=\"history-replay-empty-icon\">⏳</div>\r\n <p className=\"history-replay-empty-text\">No history to replay</p>\r\n </div>\r\n )\r\n }\r\n\r\n // If not in replay mode, show start button\r\n if (!replayState) {\r\n return (\r\n <div className={cn('history-replay-start', className)}>\r\n <button className=\"history-replay-start-button\" onClick={onStartReplay}>\r\n <svg\r\n className=\"history-replay-start-icon\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n >\r\n <polygon points=\"5 3 19 12 5 21 5 3\" />\r\n </svg>\r\n <span>Start Time Travel</span>\r\n </button>\r\n <p className=\"history-replay-start-hint\">\r\n Replay {events.length} events from this card's history\r\n </p>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className={cn('history-replay', className)}>\r\n {/* Current Event Display */}\r\n <div className=\"history-replay-current-event\">\r\n <div className=\"history-replay-event-icon\">\r\n {currentEvent && getEventIcon(currentEvent.type)}\r\n </div>\r\n <div className=\"history-replay-event-info\">\r\n <div className=\"history-replay-event-description\">\r\n {currentEvent && formatEventDescription(currentEvent)}\r\n </div>\r\n <div className=\"history-replay-event-meta\">\r\n <span className=\"history-replay-event-index\">\r\n Event {replayState.currentIndex + 1} of {replayState.totalEvents}\r\n </span>\r\n <span className=\"history-replay-event-time\">\r\n {currentEvent && currentEvent.timestamp.toLocaleString()}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Progress Bar */}\r\n <div className=\"history-replay-progress-container\">\r\n <input\r\n type=\"range\"\r\n className=\"history-replay-progress-slider\"\r\n min=\"0\"\r\n max={replayState.totalEvents - 1}\r\n value={replayState.currentIndex}\r\n onChange={(e) => onGoToEvent(parseInt(e.target.value))}\r\n />\r\n <div\r\n className=\"history-replay-progress-fill\"\r\n style={{ width: `${progress}%` }}\r\n />\r\n {/* Event markers on timeline */}\r\n <div className=\"history-replay-progress-markers\">\r\n {events.map((event, index) => (\r\n <div\r\n key={event.id}\r\n className={cn(\r\n 'history-replay-progress-marker',\r\n index === replayState.currentIndex && 'active'\r\n )}\r\n style={{\r\n left: `${(index / (replayState.totalEvents - 1)) * 100}%`,\r\n }}\r\n onClick={() => onGoToEvent(index)}\r\n title={formatEventDescription(event)}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Playback Controls */}\r\n <div className=\"history-replay-controls\">\r\n {/* Previous Button */}\r\n <button\r\n className=\"history-replay-control-btn\"\r\n onClick={onPrevious}\r\n disabled={!replayState.canGoBack}\r\n title=\"Previous event (←)\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <polygon points=\"19 20 9 12 19 4 19 20\" />\r\n <line x1=\"5\" y1=\"19\" x2=\"5\" y2=\"5\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Play/Pause Button */}\r\n <button\r\n className=\"history-replay-control-btn history-replay-control-play\"\r\n onClick={onTogglePlayback}\r\n title={replayState.isPlaying ? 'Pause (Space)' : 'Play (Space)'}\r\n >\r\n {replayState.isPlaying ? (\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" />\r\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" />\r\n </svg>\r\n ) : (\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <polygon points=\"5 3 19 12 5 21 5 3\" />\r\n </svg>\r\n )}\r\n </button>\r\n\r\n {/* Next Button */}\r\n <button\r\n className=\"history-replay-control-btn\"\r\n onClick={onNext}\r\n disabled={!replayState.canGoForward}\r\n title=\"Next event (→)\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <polygon points=\"5 4 15 12 5 20 5 4\" />\r\n <line x1=\"19\" y1=\"5\" x2=\"19\" y2=\"19\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Speed Control */}\r\n <div className=\"history-replay-speed\">\r\n <label className=\"history-replay-speed-label\">Speed:</label>\r\n <div className=\"history-replay-speed-buttons\">\r\n {speeds.map((speed) => (\r\n <button\r\n key={speed}\r\n className={cn(\r\n 'history-replay-speed-btn',\r\n replayState.speed === speed && 'active'\r\n )}\r\n onClick={() => onSpeedChange(speed)}\r\n >\r\n {speed}x\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Stop Button */}\r\n <button\r\n className=\"history-replay-control-btn history-replay-stop\"\r\n onClick={onStopReplay}\r\n title=\"Stop replay (Esc)\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n {/* Keyboard Shortcuts Hint */}\r\n <div className=\"history-replay-shortcuts\">\r\n <span className=\"history-replay-shortcut\">\r\n <kbd>Space</kbd> Play/Pause\r\n </span>\r\n <span className=\"history-replay-shortcut\">\r\n <kbd>←</kbd> Previous\r\n </span>\r\n <span className=\"history-replay-shortcut\">\r\n <kbd>→</kbd> Next\r\n </span>\r\n <span className=\"history-replay-shortcut\">\r\n <kbd>Esc</kbd> Stop\r\n </span>\r\n </div>\r\n\r\n {/* Card State Preview */}\r\n <div className=\"history-replay-card-preview\">\r\n <div className=\"history-replay-card-preview-header\">\r\n <span className=\"history-replay-card-preview-title\">\r\n Card State at This Point\r\n </span>\r\n <span className=\"history-replay-card-preview-time\">\r\n {currentEvent && currentEvent.timestamp.toLocaleDateString()}\r\n </span>\r\n </div>\r\n <div className=\"history-replay-card-preview-content\">\r\n <div className=\"history-replay-card-preview-field\">\r\n <span className=\"history-replay-card-preview-label\">Title:</span>\r\n <span className=\"history-replay-card-preview-value\">\r\n {replayState.cardState.title}\r\n </span>\r\n </div>\r\n {replayState.cardState.description && (\r\n <div className=\"history-replay-card-preview-field\">\r\n <span className=\"history-replay-card-preview-label\">Description:</span>\r\n <span className=\"history-replay-card-preview-value\">\r\n {replayState.cardState.description}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"history-replay-card-preview-field\">\r\n <span className=\"history-replay-card-preview-label\">Priority:</span>\r\n <span className=\"history-replay-card-preview-value\">\r\n {replayState.cardState.priority || 'None'}\r\n </span>\r\n </div>\r\n {replayState.cardState.labels && replayState.cardState.labels.length > 0 && (\r\n <div className=\"history-replay-card-preview-field\">\r\n <span className=\"history-replay-card-preview-label\">Labels:</span>\r\n <div className=\"history-replay-card-preview-labels\">\r\n {replayState.cardState.labels.map((label) => (\r\n <span key={label} className=\"history-replay-card-preview-label-tag\">\r\n {label}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\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: '#3b82f6',\r\n child_of: '#2563eb',\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' : '#3b82f6'\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 '#3b82f6' // 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 '#3b82f6'\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-blue-400\"\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-blue-500/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-blue-500/10 border border-blue-500/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-blue-500/20 text-blue-400'\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-blue-400 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, #3B82F6 0%, #2563EB 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","/**\r\n * AI Configuration\r\n * Central configuration for AI providers and models\r\n */\r\n\r\nexport interface AIConfig {\r\n /** Provider (OpenAI or Anthropic) */\r\n provider: 'openai' | 'anthropic'\r\n /** API Key */\r\n apiKey: string\r\n /** Model to use */\r\n model: string\r\n /** Base URL (optional) */\r\n baseURL?: string\r\n /** Max tokens per request */\r\n maxTokens?: number\r\n /** Temperature (0-2) */\r\n temperature?: number\r\n}\r\n\r\n/**\r\n * Supported AI Models\r\n */\r\nexport const AI_MODELS = {\r\n // OpenAI Models\r\n 'gpt-4-turbo': {\r\n provider: 'openai' as const,\r\n name: 'GPT-4 Turbo',\r\n contextWindow: 128000,\r\n costPer1kInput: 0.01,\r\n costPer1kOutput: 0.03,\r\n supportsVision: true,\r\n supportsJSON: true,\r\n },\r\n 'gpt-4': {\r\n provider: 'openai' as const,\r\n name: 'GPT-4',\r\n contextWindow: 8192,\r\n costPer1kInput: 0.03,\r\n costPer1kOutput: 0.06,\r\n supportsVision: false,\r\n supportsJSON: true,\r\n },\r\n 'gpt-3.5-turbo': {\r\n provider: 'openai' as const,\r\n name: 'GPT-3.5 Turbo',\r\n contextWindow: 16385,\r\n costPer1kInput: 0.0005,\r\n costPer1kOutput: 0.0015,\r\n supportsVision: false,\r\n supportsJSON: true,\r\n },\r\n\r\n // Anthropic Models\r\n 'claude-3-5-sonnet-20241022': {\r\n provider: 'anthropic' as const,\r\n name: 'Claude 3.5 Sonnet',\r\n contextWindow: 200000,\r\n costPer1kInput: 0.003,\r\n costPer1kOutput: 0.015,\r\n supportsVision: true,\r\n supportsJSON: true,\r\n },\r\n 'claude-3-opus-20240229': {\r\n provider: 'anthropic' as const,\r\n name: 'Claude 3 Opus',\r\n contextWindow: 200000,\r\n costPer1kInput: 0.015,\r\n costPer1kOutput: 0.075,\r\n supportsVision: true,\r\n supportsJSON: true,\r\n },\r\n 'claude-3-haiku-20240307': {\r\n provider: 'anthropic' as const,\r\n name: 'Claude 3 Haiku',\r\n contextWindow: 200000,\r\n costPer1kInput: 0.00025,\r\n costPer1kOutput: 0.00125,\r\n supportsVision: true,\r\n supportsJSON: true,\r\n },\r\n} as const\r\n\r\nexport type AIModelKey = keyof typeof AI_MODELS\r\n\r\n/**\r\n * Default AI Configuration\r\n */\r\nexport const DEFAULT_AI_CONFIG: Partial<AIConfig> = {\r\n model: 'claude-3-5-sonnet-20241022',\r\n maxTokens: 4096,\r\n temperature: 0.7,\r\n}\r\n\r\n/**\r\n * Rate Limits by Plan\r\n */\r\nexport const RATE_LIMITS = {\r\n hobby: {\r\n requestsPerMonth: 50,\r\n maxConcurrent: 1,\r\n maxTokensPerRequest: 4096,\r\n },\r\n pro: {\r\n requestsPerMonth: 500,\r\n maxConcurrent: 3,\r\n maxTokensPerRequest: 8192,\r\n },\r\n enterprise: {\r\n requestsPerMonth: 2000,\r\n maxConcurrent: 10,\r\n maxTokensPerRequest: 16384,\r\n },\r\n} as const\r\n\r\n/**\r\n * Feature Flags for AI\r\n */\r\nexport const AI_FEATURES = {\r\n generatePlan: {\r\n enabled: true,\r\n minPlanTier: 'hobby' as const,\r\n estimatedTokens: 2000,\r\n },\r\n predictRisks: {\r\n enabled: true,\r\n minPlanTier: 'pro' as const,\r\n estimatedTokens: 1500,\r\n },\r\n suggestAssignee: {\r\n enabled: true,\r\n minPlanTier: 'hobby' as const,\r\n estimatedTokens: 800,\r\n },\r\n generateReport: {\r\n enabled: true,\r\n minPlanTier: 'enterprise' as const,\r\n estimatedTokens: 3000,\r\n },\r\n generateSubtasks: {\r\n enabled: true,\r\n minPlanTier: 'hobby' as const,\r\n estimatedTokens: 1000,\r\n },\r\n} as const\r\n","/**\r\n * AI Cost Tracking\r\n * Calculate and track AI API usage costs\r\n */\r\n\r\nimport { AI_MODELS, type AIModelKey } from './config'\r\n\r\nexport interface AIOperation {\r\n id: string\r\n feature: 'generatePlan' | 'predictRisks' | 'suggestAssignee' | 'generateSubtasks' | 'estimateEffort'\r\n model: AIModelKey\r\n inputTokens: number\r\n outputTokens: number\r\n cost: number\r\n duration: number\r\n timestamp: Date\r\n success: boolean\r\n error?: string\r\n}\r\n\r\nexport interface UsageStats {\r\n totalOperations: number\r\n totalCost: number\r\n totalInputTokens: number\r\n totalOutputTokens: number\r\n operationsByFeature: Record<string, number>\r\n costsByFeature: Record<string, number>\r\n averageDuration: number\r\n successRate: number\r\n}\r\n\r\n/**\r\n * Calculate cost for an AI operation\r\n */\r\nexport function calculateCost(\r\n model: AIModelKey,\r\n inputTokens: number,\r\n outputTokens: number\r\n): number {\r\n const modelInfo = AI_MODELS[model]\r\n if (!modelInfo) {\r\n throw new Error(`Unknown model: ${model}`)\r\n }\r\n\r\n const inputCost = (inputTokens / 1000) * modelInfo.costPer1kInput\r\n const outputCost = (outputTokens / 1000) * modelInfo.costPer1kOutput\r\n\r\n return inputCost + outputCost\r\n}\r\n\r\n/**\r\n * Format cost as USD string\r\n */\r\nexport function formatCost(cost: number): string {\r\n return `$${cost.toFixed(4)}`\r\n}\r\n\r\n/**\r\n * AI Usage Tracker\r\n * In-memory tracking of AI operations\r\n * In production, this would persist to a database\r\n */\r\nexport class AIUsageTracker {\r\n private operations: AIOperation[] = []\r\n private listeners: Array<(operation: AIOperation) => void> = []\r\n\r\n /**\r\n * Record a new AI operation\r\n */\r\n record(operation: Omit<AIOperation, 'id' | 'timestamp' | 'cost'>): AIOperation {\r\n const cost = calculateCost(operation.model, operation.inputTokens, operation.outputTokens)\r\n\r\n const fullOperation: AIOperation = {\r\n ...operation,\r\n id: `op_${Date.now()}_${Math.random().toString(36).substring(7)}`,\r\n timestamp: new Date(),\r\n cost,\r\n }\r\n\r\n this.operations.push(fullOperation)\r\n\r\n // Notify listeners\r\n this.listeners.forEach((listener) => listener(fullOperation))\r\n\r\n // Keep only last 1000 operations in memory\r\n if (this.operations.length > 1000) {\r\n this.operations = this.operations.slice(-1000)\r\n }\r\n\r\n return fullOperation\r\n }\r\n\r\n /**\r\n * Get usage statistics\r\n */\r\n getStats(timeRange?: { start: Date; end: Date }): UsageStats {\r\n let operations = this.operations\r\n\r\n // Filter by time range if provided\r\n if (timeRange) {\r\n operations = operations.filter(\r\n (op) => op.timestamp >= timeRange.start && op.timestamp <= timeRange.end\r\n )\r\n }\r\n\r\n const totalOperations = operations.length\r\n const totalCost = operations.reduce((sum, op) => sum + op.cost, 0)\r\n const totalInputTokens = operations.reduce((sum, op) => sum + op.inputTokens, 0)\r\n const totalOutputTokens = operations.reduce((sum, op) => sum + op.outputTokens, 0)\r\n const successfulOps = operations.filter((op) => op.success)\r\n const totalDuration = operations.reduce((sum, op) => sum + op.duration, 0)\r\n\r\n // Operations by feature\r\n const operationsByFeature: Record<string, number> = {}\r\n const costsByFeature: Record<string, number> = {}\r\n\r\n operations.forEach((op) => {\r\n operationsByFeature[op.feature] = (operationsByFeature[op.feature] || 0) + 1\r\n costsByFeature[op.feature] = (costsByFeature[op.feature] || 0) + op.cost\r\n })\r\n\r\n return {\r\n totalOperations,\r\n totalCost,\r\n totalInputTokens,\r\n totalOutputTokens,\r\n operationsByFeature,\r\n costsByFeature,\r\n averageDuration: totalOperations > 0 ? totalDuration / totalOperations : 0,\r\n successRate: totalOperations > 0 ? successfulOps.length / totalOperations : 0,\r\n }\r\n }\r\n\r\n /**\r\n * Get recent operations\r\n */\r\n getRecentOperations(limit = 10): AIOperation[] {\r\n return this.operations.slice(-limit).reverse()\r\n }\r\n\r\n /**\r\n * Check if usage is within limits\r\n */\r\n checkLimit(planTier: 'hobby' | 'pro' | 'enterprise', period: 'month' | 'day' = 'month'): {\r\n used: number\r\n limit: number\r\n remaining: number\r\n percentUsed: number\r\n isExceeded: boolean\r\n } {\r\n const limits = {\r\n hobby: { month: 50, day: 5 },\r\n pro: { month: 500, day: 50 },\r\n enterprise: { month: 2000, day: 200 },\r\n }\r\n\r\n const limit = limits[planTier][period]\r\n\r\n // Calculate operations in the period\r\n const now = new Date()\r\n const start = new Date()\r\n if (period === 'month') {\r\n start.setMonth(now.getMonth() - 1)\r\n } else {\r\n start.setDate(now.getDate() - 1)\r\n }\r\n\r\n const periodOperations = this.operations.filter((op) => op.timestamp >= start).length\r\n\r\n const remaining = Math.max(0, limit - periodOperations)\r\n const percentUsed = (periodOperations / limit) * 100\r\n\r\n return {\r\n used: periodOperations,\r\n limit,\r\n remaining,\r\n percentUsed,\r\n isExceeded: periodOperations >= limit,\r\n }\r\n }\r\n\r\n /**\r\n * Subscribe to operation events\r\n */\r\n subscribe(listener: (operation: AIOperation) => void): () => void {\r\n this.listeners.push(listener)\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n const index = this.listeners.indexOf(listener)\r\n if (index > -1) {\r\n this.listeners.splice(index, 1)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear all tracked operations\r\n */\r\n clear(): void {\r\n this.operations = []\r\n }\r\n\r\n /**\r\n * Export operations as JSON\r\n */\r\n export(): string {\r\n return JSON.stringify(this.operations, null, 2)\r\n }\r\n}\r\n\r\n/**\r\n * Global usage tracker instance\r\n */\r\nexport const aiUsageTracker = new AIUsageTracker()\r\n\r\n/**\r\n * Estimate cost for a feature before execution\r\n */\r\nexport function estimateFeatureCost(\r\n feature: AIOperation['feature'],\r\n model: AIModelKey = 'claude-3-5-sonnet-20241022'\r\n): { estimatedCost: string; estimatedTokens: number } {\r\n // Rough estimates based on typical usage\r\n const tokenEstimates = {\r\n generatePlan: 2500,\r\n predictRisks: 1800,\r\n suggestAssignee: 1000,\r\n generateSubtasks: 1200,\r\n estimateEffort: 800,\r\n }\r\n\r\n const tokens = tokenEstimates[feature]\r\n // Assume 60/40 split between input/output\r\n const inputTokens = Math.floor(tokens * 0.6)\r\n const outputTokens = Math.floor(tokens * 0.4)\r\n\r\n const cost = calculateCost(model, inputTokens, outputTokens)\r\n\r\n return {\r\n estimatedCost: formatCost(cost),\r\n estimatedTokens: tokens,\r\n }\r\n}\r\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-blue-500/10 to-purple-500/10 border border-blue-500/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-blue-400 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-blue-500\"\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","/**\n * Generate Gantt Tasks Dialog\n * AI-powered Gantt task generation with cost control\n */\n\nimport { useState, useRef, useEffect } from 'react'\nimport { Portal } from '../Portal'\n\nexport interface GanttTask {\n id: string\n name: string\n start: string\n end: string\n duration: number\n progress: number\n dependencies: string[]\n type: string\n priority: 'high' | 'medium' | 'low'\n}\n\nexport interface GeneratedTasksResponse {\n tasks: {\n tasks: GanttTask[]\n }\n from_cache: boolean\n tokens_used: number\n mock_mode?: boolean\n similarity?: number\n tokens_saved?: number\n}\n\nexport interface GenerateGanttTasksDialogProps {\n /** Is dialog open */\n isOpen: boolean\n /** Close handler */\n onClose: () => void\n /** Tasks generated callback */\n onTasksGenerated: (tasks: GanttTask[]) => void\n /** Generate tasks function (calls Supabase Edge Function) */\n onGenerateTasks: (params: {\n prompt: string\n projectName?: string\n startDate?: string\n endDate?: string\n }) => Promise<GeneratedTasksResponse>\n /** Is AI loading */\n isLoading?: boolean\n /** Project ID (optional) */\n projectId?: string\n /** Project name (optional) */\n projectName?: string\n}\n\nexport function GenerateGanttTasksDialog({\n isOpen,\n onClose,\n onTasksGenerated,\n onGenerateTasks,\n isLoading: externalLoading,\n projectName,\n}: GenerateGanttTasksDialogProps) {\n const [prompt, setPrompt] = useState('')\n const [startDate, setStartDate] = useState('')\n const [endDate, setEndDate] = useState('')\n const [isGenerating, setIsGenerating] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [generatedTasks, setGeneratedTasks] = useState<GanttTask[] | null>(null)\n const [responseMetadata, setResponseMetadata] = useState<{\n from_cache: boolean\n tokens_used: number\n mock_mode?: boolean\n similarity?: number\n tokens_saved?: number\n } | null>(null)\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const isLoading = isGenerating || externalLoading\n\n // Focus input when dialog opens\n useEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus()\n }\n }, [isOpen])\n\n // Close on escape\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !isLoading) {\n handleClose()\n }\n }\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }\n return undefined\n }, [isOpen, isLoading])\n\n const handleClose = () => {\n if (!isLoading) {\n setPrompt('')\n setStartDate('')\n setEndDate('')\n setError(null)\n setGeneratedTasks(null)\n setResponseMetadata(null)\n onClose()\n }\n }\n\n const handleGenerate = async () => {\n if (!prompt.trim() || isLoading) return\n\n setIsGenerating(true)\n setError(null)\n setGeneratedTasks(null)\n setResponseMetadata(null)\n\n try {\n const response = await onGenerateTasks({\n prompt: prompt.trim(),\n projectName: projectName || 'Mi Proyecto',\n startDate: startDate || undefined,\n endDate: endDate || undefined,\n })\n\n setGeneratedTasks(response.tasks.tasks)\n setResponseMetadata({\n from_cache: response.from_cache,\n tokens_used: response.tokens_used,\n mock_mode: response.mock_mode,\n similarity: response.similarity,\n tokens_saved: response.tokens_saved,\n })\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to generate tasks')\n } finally {\n setIsGenerating(false)\n }\n }\n\n const handleApplyTasks = () => {\n if (generatedTasks) {\n onTasksGenerated(generatedTasks)\n handleClose()\n }\n }\n\n if (!isOpen) return null\n\n const similarity = responseMetadata?.similarity\n ? ((responseMetadata.similarity || 0) * 100).toFixed(0)\n : '0'\n\n return (\n <Portal>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-black/60 backdrop-blur-sm z-[100000]\"\n onClick={handleClose}\n />\n\n {/* Dialog */}\n <div className=\"fixed inset-0 flex items-center justify-center z-[100001] p-4\">\n <div\n className=\"w-full max-w-3xl rounded-2xl shadow-2xl border max-h-[90vh] overflow-hidden flex flex-col\"\n style={{\n background: 'linear-gradient(135deg, #1f1f1f 0%, #1a1a1a 100%)',\n borderColor: 'rgba(255, 255, 255, 0.15)',\n boxShadow: '0 20px 60px rgba(0, 0, 0, 0.8), 0 0 0 1px rgba(255, 255, 255, 0.1)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"px-6 py-4 border-b border-white/10 flex items-center justify-between\">\n <div>\n <h2 className=\"text-xl font-bold text-white flex items-center gap-2\">\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=\"text-blue-400\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"2\" rx=\"1\" fill=\"currentColor\" />\n <rect x=\"3\" y=\"9\" width=\"18\" height=\"2\" rx=\"1\" fill=\"currentColor\" />\n <rect x=\"3\" y=\"14\" width=\"18\" height=\"2\" rx=\"1\" fill=\"currentColor\" />\n <rect x=\"3\" y=\"19\" width=\"18\" height=\"2\" rx=\"1\" fill=\"currentColor\" />\n </svg>\n Generate Gantt Tasks with AI\n </h2>\n <p className=\"text-sm text-white/60 mt-1\">\n Describe your project and let AI create a complete task timeline\n </p>\n </div>\n <button\n onClick={handleClose}\n disabled={isLoading}\n className=\"text-white/60 hover:text-white transition-colors disabled:opacity-50\"\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-6 space-y-4\">\n {!generatedTasks ? (\n <>\n {/* Input Form */}\n <div>\n <label className=\"block text-sm font-semibold text-white/90 mb-2\">\n Project Description *\n </label>\n <textarea\n ref={inputRef}\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n placeholder=\"Example: Build a mobile app for tracking fitness goals with user authentication, workout logging, progress charts, and social features...\"\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-blue-500/50 transition-all resize-none\"\n disabled={isLoading}\n />\n <p className=\"text-xs text-white/50 mt-2\">\n Be as specific as possible. Include features, technologies, and any special\n requirements.\n </p>\n </div>\n\n {/* Date Inputs */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-semibold text-white/90 mb-2\">\n Start Date (Optional)\n </label>\n <input\n type=\"date\"\n value={startDate}\n onChange={(e) => setStartDate(e.target.value)}\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-blue-500/50 transition-all\"\n disabled={isLoading}\n />\n </div>\n <div>\n <label className=\"block text-sm font-semibold text-white/90 mb-2\">\n End Date (Optional)\n </label>\n <input\n type=\"date\"\n value={endDate}\n onChange={(e) => setEndDate(e.target.value)}\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-blue-500/50 transition-all\"\n disabled={isLoading}\n />\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"p-4 rounded-lg bg-red-500/10 border border-red-500/30 text-red-400 text-sm\">\n {error}\n </div>\n )}\n\n {/* Examples */}\n <div className=\"border-t border-white/10 pt-4\">\n <p className=\"text-xs font-semibold text-white/70 uppercase tracking-wider mb-3\">\n Example Prompts\n </p>\n <div className=\"space-y-2\">\n {[\n 'Build an e-commerce platform with product catalog, shopping cart, payment integration, and order tracking',\n 'Create a task management app with team collaboration, real-time updates, file attachments, and notifications',\n 'Develop a blog platform with markdown editor, SEO optimization, comments system, and analytics dashboard',\n ].map((example, i) => (\n <button\n key={i}\n onClick={() => setPrompt(example)}\n disabled={isLoading}\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\"\n >\n {example}\n </button>\n ))}\n </div>\n </div>\n </>\n ) : (\n <>\n {/* Generated Tasks Preview */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-green-400\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M4 10L8 14L16 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"font-semibold\">Tasks Generated Successfully!</span>\n </div>\n\n {/* Metadata Badges */}\n <div className=\"flex flex-wrap gap-2\">\n {responseMetadata?.mock_mode && (\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\">\n Mock Mode\n </span>\n )}\n {responseMetadata?.from_cache ? (\n <span className=\"px-2 py-1 rounded-lg text-xs font-semibold bg-blue-500/20 text-blue-400 border border-blue-500/30\">\n From Cache ({similarity}% similar)\n </span>\n ) : (\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\">\n AI Generated\n </span>\n )}\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\">\n {responseMetadata?.tokens_used || 0} tokens\n </span>\n {responseMetadata?.tokens_saved && (\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\">\n {responseMetadata.tokens_saved} tokens saved\n </span>\n )}\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\">\n {generatedTasks.length} tasks\n </span>\n </div>\n\n {/* Tasks List */}\n <div className=\"space-y-2 max-h-96 overflow-y-auto\">\n {generatedTasks.map((task, i) => (\n <div\n key={task.id}\n className=\"p-3 rounded-lg bg-white/5 border border-white/10 hover:bg-white/10 transition-colors\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"text-xs text-white/50\">#{i + 1}</span>\n <p className=\"text-sm font-medium text-white/90\">{task.name}</p>\n </div>\n <div className=\"flex items-center gap-3 text-xs text-white/60\">\n <span className=\"flex items-center gap-1\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n className=\"text-white/40\"\n >\n <rect\n x=\"1\"\n y=\"2\"\n width=\"10\"\n height=\"8\"\n rx=\"1\"\n stroke=\"currentColor\"\n />\n <path d=\"M1 4h10\" stroke=\"currentColor\" />\n </svg>\n {task.start} → {task.end}\n </span>\n <span>{task.duration} days</span>\n {task.dependencies.length > 0 && (\n <span className=\"text-blue-400\">\n Depends: {task.dependencies.join(', ')}\n </span>\n )}\n </div>\n </div>\n <span\n className={`px-2 py-0.5 rounded text-xs font-semibold ${\n task.priority === 'high'\n ? 'bg-red-500/20 text-red-400'\n : task.priority === 'medium'\n ? 'bg-yellow-500/20 text-yellow-400'\n : 'bg-blue-500/20 text-blue-400'\n }`}\n >\n {task.priority}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-4 border-t border-white/10 flex items-center justify-between\">\n <div>\n {isLoading && (\n <div className=\"flex items-center gap-2 text-blue-400 text-sm\">\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\">\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n fill=\"none\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\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\"\n />\n </svg>\n <span>Generating with AI...</span>\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-3\">\n <button\n onClick={handleClose}\n disabled={isLoading}\n className=\"px-4 py-2 rounded-lg text-sm font-semibold transition-all hover:bg-white/10 text-white/80 disabled:opacity-50\"\n >\n Cancel\n </button>\n {!generatedTasks ? (\n <button\n onClick={handleGenerate}\n disabled={!prompt.trim() || isLoading}\n className=\"px-6 py-2 rounded-lg text-sm font-semibold transition-all disabled:opacity-50\"\n style={{\n background: 'linear-gradient(135deg, #3B82F6 0%, #2563EB 100%)',\n color: '#ffffff',\n }}\n >\n {isLoading ? 'Generating...' : 'Generate Tasks'}\n </button>\n ) : (\n <button\n onClick={handleApplyTasks}\n className=\"px-6 py-2 rounded-lg text-sm font-semibold transition-all\"\n style={{\n background: 'linear-gradient(135deg, #10B981 0%, #059669 100%)',\n color: '#ffffff',\n }}\n >\n Apply Tasks to Gantt\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n </Portal>\n )\n}\n","/**\r\n * useKanbanState Hook\r\n * Optional hook for managing board state locally\r\n * Consumers can use this or manage state themselves\r\n * @module hooks/useKanbanState\r\n */\r\n\r\nimport { useState, useCallback } from 'react'\r\nimport { retryWithBackoff } from '../utils/retry'\r\nimport type { Board, BoardCallbacks, Card, Column } from '../types'\r\n\r\nexport interface UseKanbanStateOptions {\r\n /** Initial board state */\r\n initialBoard: Board\r\n /** Persist changes (e.g., to localStorage, API) */\r\n onPersist?: (board: Board) => void | Promise<void>\r\n /** Enable optimistic updates (default: true) */\r\n optimistic?: boolean\r\n}\r\n\r\nexport interface UseKanbanStateReturn {\r\n /** Current board state */\r\n board: Board\r\n /** Callbacks for the KanbanBoard component */\r\n callbacks: BoardCallbacks\r\n /** Direct state setters (advanced usage) */\r\n setBoard: React.Dispatch<React.SetStateAction<Board>>\r\n /** Helper functions */\r\n helpers: {\r\n addCard: (card: Omit<Card, 'id'>) => string\r\n addColumn: (column: Omit<Column, 'id' | 'cardIds'>) => string\r\n deleteCard: (cardId: string) => void\r\n deleteColumn: (columnId: string) => void\r\n clearBoard: () => void\r\n }\r\n}\r\n\r\n/**\r\n * Hook for managing Kanban board state\r\n *\r\n * @example\r\n * ```tsx\r\n * const { board, callbacks } = useKanbanState({\r\n * initialBoard: myBoard,\r\n * onPersist: async (board) => {\r\n * await api.updateBoard(board)\r\n * }\r\n * })\r\n *\r\n * return <KanbanBoard board={board} callbacks={callbacks} />\r\n * ```\r\n */\r\nexport function useKanbanState({\r\n initialBoard,\r\n onPersist,\r\n}: UseKanbanStateOptions): UseKanbanStateReturn {\r\n const [board, setBoard] = useState<Board>(initialBoard)\r\n\r\n // Persist helper with retry logic\r\n const persistBoard = useCallback(\r\n (updatedBoard: Board) => {\r\n if (onPersist) {\r\n // Use retry logic for resilient persistence\r\n retryWithBackoff(\r\n () => Promise.resolve(onPersist(updatedBoard)),\r\n {\r\n maxAttempts: 3,\r\n initialDelay: 1000,\r\n onRetry: (error, attempt, delay) => {\r\n console.warn(\r\n `Retry attempt ${attempt} after ${delay}ms: ${error.message}`\r\n )\r\n },\r\n }\r\n ).then((result) => {\r\n if (!result.success) {\r\n console.error(\r\n `Failed to persist board after ${result.attempts} attempts:`,\r\n result.error\r\n )\r\n // TODO: Implement rollback or user notification\r\n }\r\n })\r\n }\r\n },\r\n [onPersist]\r\n )\r\n\r\n // Move card to new position/column\r\n const handleCardMove = useCallback(\r\n async (cardId: string, targetColumnId: string, position: number) => {\r\n setBoard((prev) => {\r\n const card = prev.cards.find((c) => c.id === cardId)\r\n if (!card) return prev\r\n\r\n const sourceColumnId = card.columnId\r\n\r\n // Update card\r\n const updatedCard = {\r\n ...card,\r\n columnId: targetColumnId,\r\n position,\r\n }\r\n\r\n // Update cards array\r\n const updatedCards = prev.cards.map((c) =>\r\n c.id === cardId ? updatedCard : c\r\n )\r\n\r\n // Update columns' cardIds\r\n const updatedColumns = prev.columns.map((col) => {\r\n if (col.id === sourceColumnId) {\r\n // Remove from source column\r\n return {\r\n ...col,\r\n cardIds: col.cardIds.filter((id) => id !== cardId),\r\n }\r\n } else if (col.id === targetColumnId) {\r\n // Add to target column (maintain sort order)\r\n const targetCards = updatedCards\r\n .filter((c) => c.columnId === targetColumnId)\r\n .sort((a, b) => a.position - b.position)\r\n return {\r\n ...col,\r\n cardIds: targetCards.map((c) => c.id),\r\n }\r\n }\r\n return col\r\n })\r\n\r\n const updatedBoard = {\r\n ...prev,\r\n cards: updatedCards,\r\n columns: updatedColumns,\r\n }\r\n\r\n persistBoard(updatedBoard)\r\n return updatedBoard\r\n })\r\n },\r\n [persistBoard]\r\n )\r\n\r\n // Update card properties\r\n const handleCardUpdate = useCallback(\r\n async (cardId: string, updates: Partial<Card>) => {\r\n setBoard((prev) => {\r\n const updatedCards = prev.cards.map((card) =>\r\n card.id === cardId ? { ...card, ...updates } : card\r\n )\r\n\r\n const updatedBoard = {\r\n ...prev,\r\n cards: updatedCards,\r\n }\r\n\r\n persistBoard(updatedBoard)\r\n return updatedBoard\r\n })\r\n },\r\n [persistBoard]\r\n )\r\n\r\n // Create new card\r\n const handleCardCreate = useCallback(\r\n async (card: Omit<Card, 'id'>) => {\r\n const newCardId = `card-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\r\n\r\n setBoard((prev) => {\r\n const newCard: Card = {\r\n ...card,\r\n id: newCardId,\r\n }\r\n\r\n // Add to column's cardIds\r\n const updatedColumns = prev.columns.map((col) =>\r\n col.id === card.columnId\r\n ? { ...col, cardIds: [...col.cardIds, newCardId] }\r\n : col\r\n )\r\n\r\n const updatedBoard = {\r\n ...prev,\r\n cards: [...prev.cards, newCard],\r\n columns: updatedColumns,\r\n }\r\n\r\n persistBoard(updatedBoard)\r\n return updatedBoard\r\n })\r\n },\r\n [persistBoard]\r\n )\r\n\r\n // Delete card\r\n const handleCardDelete = useCallback(\r\n async (cardId: string) => {\r\n setBoard((prev) => {\r\n const card = prev.cards.find((c) => c.id === cardId)\r\n if (!card) return prev\r\n\r\n // Remove from cards\r\n const updatedCards = prev.cards.filter((c) => c.id !== cardId)\r\n\r\n // Remove from column's cardIds\r\n const updatedColumns = prev.columns.map((col) =>\r\n col.id === card.columnId\r\n ? { ...col, cardIds: col.cardIds.filter((id) => id !== cardId) }\r\n : col\r\n )\r\n\r\n const updatedBoard = {\r\n ...prev,\r\n cards: updatedCards,\r\n columns: updatedColumns,\r\n }\r\n\r\n persistBoard(updatedBoard)\r\n return updatedBoard\r\n })\r\n },\r\n [persistBoard]\r\n )\r\n\r\n // Create new column\r\n const handleColumnCreate = useCallback(\r\n async (column: Omit<Column, 'id' | 'cardIds'>) => {\r\n const newColumnId = `col-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\r\n\r\n setBoard((prev) => {\r\n const newColumn: Column = {\r\n ...column,\r\n id: newColumnId,\r\n cardIds: [],\r\n }\r\n\r\n const updatedBoard = {\r\n ...prev,\r\n columns: [...prev.columns, newColumn],\r\n }\r\n\r\n persistBoard(updatedBoard)\r\n return updatedBoard\r\n })\r\n },\r\n [persistBoard]\r\n )\r\n\r\n // Update column\r\n const handleColumnUpdate = useCallback(\r\n async (columnId: string, updates: Partial<Column>) => {\r\n setBoard((prev) => {\r\n const updatedColumns = prev.columns.map((col) =>\r\n col.id === columnId ? { ...col, ...updates } : col\r\n )\r\n\r\n const updatedBoard = {\r\n ...prev,\r\n columns: updatedColumns,\r\n }\r\n\r\n persistBoard(updatedBoard)\r\n return updatedBoard\r\n })\r\n },\r\n [persistBoard]\r\n )\r\n\r\n // Delete column\r\n const handleColumnDelete = useCallback(\r\n async (columnId: string) => {\r\n setBoard((prev) => {\r\n // Remove all cards in this column\r\n const updatedCards = prev.cards.filter((c) => c.columnId !== columnId)\r\n const updatedColumns = prev.columns.filter((col) => col.id !== columnId)\r\n\r\n const updatedBoard = {\r\n ...prev,\r\n cards: updatedCards,\r\n columns: updatedColumns,\r\n }\r\n\r\n persistBoard(updatedBoard)\r\n return updatedBoard\r\n })\r\n },\r\n [persistBoard]\r\n )\r\n\r\n // Helper function to add card (convenience)\r\n const addCard = useCallback(\r\n (card: Omit<Card, 'id'>): string => {\r\n const newCardId = `card-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\r\n handleCardCreate(card)\r\n return newCardId\r\n },\r\n [handleCardCreate]\r\n )\r\n\r\n // Helper function to add column (convenience)\r\n const addColumn = useCallback(\r\n (column: Omit<Column, 'id' | 'cardIds'>): string => {\r\n const newColumnId = `col-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\r\n handleColumnCreate(column)\r\n return newColumnId\r\n },\r\n [handleColumnCreate]\r\n )\r\n\r\n // Helper function to clear board (for AI-generated plans)\r\n const clearBoard = useCallback(() => {\r\n setBoard((prev) => {\r\n const updatedBoard = {\r\n ...prev,\r\n cards: [],\r\n columns: [],\r\n }\r\n\r\n persistBoard(updatedBoard)\r\n return updatedBoard\r\n })\r\n }, [persistBoard])\r\n\r\n const callbacks: BoardCallbacks = {\r\n onCardMove: handleCardMove,\r\n onCardUpdate: handleCardUpdate,\r\n onCardCreate: handleCardCreate,\r\n onCardDelete: handleCardDelete,\r\n onColumnCreate: handleColumnCreate,\r\n onColumnUpdate: handleColumnUpdate,\r\n onColumnDelete: handleColumnDelete,\r\n }\r\n\r\n return {\r\n board,\r\n callbacks,\r\n setBoard,\r\n helpers: {\r\n addCard,\r\n addColumn,\r\n deleteCard: handleCardDelete,\r\n deleteColumn: handleColumnDelete,\r\n clearBoard,\r\n },\r\n }\r\n}\r\n","import { useMemo } from 'react'\r\nimport { useKanbanState } from './useKanbanState'\r\nimport type { Board, BoardCallbacks, User, KanbanBoardProps } from '../types'\r\n\r\nexport interface UseBoardOptions {\r\n initialData: Board\r\n availableUsers?: User[]\r\n onSave?: (board: Board) => void | Promise<void>\r\n saveDelay?: number\r\n}\r\n\r\nexport interface UseBoardReturn {\r\n props: Pick<KanbanBoardProps, 'board' | 'callbacks' | 'availableUsers'>\r\n board: Board\r\n callbacks: BoardCallbacks\r\n utils: {\r\n addCard: (columnId: string, title: string, data?: Partial<any>) => void\r\n addColumn: (title: string, position?: number) => void\r\n reset: () => void\r\n }\r\n}\r\n\r\n/**\r\n * Simplified hook for Kanban board state management\r\n *\r\n * @example\r\n * ```tsx\r\n * import { KanbanBoard, useBoard } from '@libxai/board'\r\n *\r\n * function App() {\r\n * const board = useBoard({\r\n * initialData: myData,\r\n * onSave: (board) => localStorage.setItem('board', JSON.stringify(board))\r\n * })\r\n *\r\n * return <KanbanBoard {...board.props} />\r\n * }\r\n * ```\r\n */\r\nexport function useBoard({\r\n initialData,\r\n availableUsers = [],\r\n onSave,\r\n}: UseBoardOptions): UseBoardReturn {\r\n const { board, callbacks, helpers } = useKanbanState({\r\n initialBoard: initialData,\r\n onPersist: onSave,\r\n })\r\n\r\n const utils = useMemo(\r\n () => ({\r\n addCard: (columnId: string, title: string, data: Partial<any> = {}) => {\r\n helpers.addCard({\r\n title,\r\n columnId,\r\n position: board.cards.filter((c) => c.columnId === columnId).length,\r\n ...data,\r\n })\r\n },\r\n addColumn: (title: string, position?: number) => {\r\n // Calculate next position based on highest existing position + 1000\r\n const maxPosition = board.columns.length > 0\r\n ? Math.max(...board.columns.map(col => col.position))\r\n : 0\r\n\r\n helpers.addColumn({\r\n title,\r\n position: position ?? (maxPosition + 1000),\r\n })\r\n },\r\n reset: helpers.clearBoard,\r\n }),\r\n [board.cards, board.columns, helpers]\r\n )\r\n\r\n const props = useMemo(\r\n () => ({\r\n board,\r\n callbacks,\r\n availableUsers,\r\n }),\r\n [board, callbacks, availableUsers]\r\n )\r\n\r\n return {\r\n props,\r\n board,\r\n callbacks,\r\n utils,\r\n }\r\n}\r\n","import { useState, useMemo, useCallback } from 'react'\r\nimport type { Card, Priority } from '../types'\r\n\r\nexport type DateFilter = 'all' | 'overdue' | 'today' | 'this-week' | 'custom'\r\nexport type SortBy = 'created' | 'priority' | 'dueDate' | 'title' | 'estimate' | 'none'\r\nexport type SortOrder = 'asc' | 'desc'\r\n\r\nexport interface FilterState {\r\n dateFilter: DateFilter\r\n dateRange?: { start: Date; end: Date }\r\n priorities: Priority[]\r\n assignees: string[]\r\n labels: string[]\r\n columns: string[]\r\n search: string\r\n}\r\n\r\nexport interface SortState {\r\n by: SortBy\r\n order: SortOrder\r\n}\r\n\r\nexport interface UseFiltersOptions {\r\n initialFilters?: Partial<FilterState>\r\n initialSort?: Partial<SortState>\r\n currentUserId?: string\r\n}\r\n\r\nexport interface UseFiltersReturn {\r\n filters: FilterState\r\n sort: SortState\r\n setFilters: (filters: Partial<FilterState>) => void\r\n setSort: (sort: Partial<SortState>) => void\r\n resetFilters: () => void\r\n filterMyTasks: () => void\r\n filterOverdue: () => void\r\n filterHighPriority: () => void\r\n applyFilters: (cards: Card[]) => Card[]\r\n hasActiveFilters: boolean\r\n}\r\n\r\nconst DEFAULT_FILTERS: FilterState = {\r\n dateFilter: 'all',\r\n priorities: [],\r\n assignees: [],\r\n labels: [],\r\n columns: [],\r\n search: '',\r\n}\r\n\r\nconst DEFAULT_SORT: SortState = {\r\n by: 'none',\r\n order: 'asc',\r\n}\r\n\r\n/**\r\n * Hook for filtering and sorting board cards\r\n *\r\n * @example\r\n * ```tsx\r\n * const { filters, setFilters, applyFilters, filterMyTasks } = useFilters({\r\n * currentUserId: 'user-1'\r\n * })\r\n *\r\n * const filteredCards = applyFilters(board.cards)\r\n * ```\r\n */\r\nexport function useFilters({\r\n initialFilters = {},\r\n initialSort = {},\r\n currentUserId,\r\n}: UseFiltersOptions = {}): UseFiltersReturn {\r\n const [filters, setFiltersState] = useState<FilterState>({\r\n ...DEFAULT_FILTERS,\r\n ...initialFilters,\r\n })\r\n\r\n const [sort, setSortState] = useState<SortState>({\r\n ...DEFAULT_SORT,\r\n ...initialSort,\r\n })\r\n\r\n const setFilters = useCallback((newFilters: Partial<FilterState>) => {\r\n setFiltersState((prev) => ({ ...prev, ...newFilters }))\r\n }, [])\r\n\r\n const setSort = useCallback((newSort: Partial<SortState>) => {\r\n setSortState((prev) => ({ ...prev, ...newSort }))\r\n }, [])\r\n\r\n const resetFilters = useCallback(() => {\r\n setFiltersState(DEFAULT_FILTERS)\r\n setSortState(DEFAULT_SORT)\r\n }, [])\r\n\r\n const filterMyTasks = useCallback(() => {\r\n if (!currentUserId) return\r\n // Reset all filters before applying \"My Tasks\"\r\n setFiltersState({\r\n ...DEFAULT_FILTERS,\r\n assignees: [currentUserId]\r\n })\r\n }, [currentUserId])\r\n\r\n const filterOverdue = useCallback(() => {\r\n // Reset all filters before applying \"Overdue\"\r\n setFiltersState({\r\n ...DEFAULT_FILTERS,\r\n dateFilter: 'overdue'\r\n })\r\n }, [])\r\n\r\n const filterHighPriority = useCallback(() => {\r\n // Reset all filters before applying \"High Priority\"\r\n setFiltersState({\r\n ...DEFAULT_FILTERS,\r\n priorities: ['HIGH', 'URGENT']\r\n })\r\n }, [])\r\n\r\n const hasActiveFilters = useMemo(() => {\r\n return (\r\n filters.dateFilter !== 'all' ||\r\n filters.priorities.length > 0 ||\r\n filters.assignees.length > 0 ||\r\n filters.labels.length > 0 ||\r\n filters.columns.length > 0 ||\r\n filters.search !== '' ||\r\n sort.by !== 'none'\r\n )\r\n }, [filters, sort])\r\n\r\n const applyFilters = useCallback(\r\n (cards: Card[]): Card[] => {\r\n let filtered = [...cards]\r\n\r\n if (filters.search) {\r\n const query = filters.search.toLowerCase()\r\n filtered = filtered.filter(\r\n (card) =>\r\n card.title.toLowerCase().includes(query) ||\r\n card.description?.toLowerCase().includes(query)\r\n )\r\n }\r\n\r\n if (filters.dateFilter !== 'all') {\r\n const now = new Date()\r\n\r\n // Get today's date string in local timezone (YYYY-MM-DD format)\r\n // This matches what the date input produces when user selects a date\r\n const year = now.getFullYear()\r\n const month = String(now.getMonth() + 1).padStart(2, '0')\r\n const day = String(now.getDate()).padStart(2, '0')\r\n const todayString = `${year}-${month}-${day}`\r\n\r\n filtered = filtered.filter((card) => {\r\n if (!card.endDate && !card.dueDate) return false\r\n\r\n const dueDate = card.endDate || card.dueDate\r\n if (!dueDate) return false\r\n\r\n // Convert date to YYYY-MM-DD string for comparison\r\n let dueDateString: string\r\n if (typeof dueDate === 'string') {\r\n // Already a string, extract YYYY-MM-DD part\r\n const parts = dueDate.split('T')\r\n dueDateString = parts[0] || dueDate\r\n } else {\r\n // Date object - convert to YYYY-MM-DD in UTC (how date inputs store dates)\r\n const y = dueDate.getUTCFullYear()\r\n const m = String(dueDate.getUTCMonth() + 1).padStart(2, '0')\r\n const d = String(dueDate.getUTCDate()).padStart(2, '0')\r\n dueDateString = `${y}-${m}-${d}`\r\n }\r\n\r\n switch (filters.dateFilter) {\r\n case 'overdue':\r\n return dueDateString < todayString\r\n case 'today':\r\n return dueDateString === todayString\r\n case 'this-week':\r\n // This week means from today until 7 days from now\r\n const todayDate = new Date(todayString + 'T00:00:00')\r\n const cardDueDate = new Date(dueDateString + 'T00:00:00')\r\n const weekFromNow = new Date(todayDate)\r\n weekFromNow.setDate(weekFromNow.getDate() + 7)\r\n return cardDueDate >= todayDate && cardDueDate <= weekFromNow\r\n case 'custom':\r\n if (filters.dateRange) {\r\n const due = typeof dueDate === 'string' ? new Date(dueDate) : dueDate\r\n return (\r\n due >= filters.dateRange.start && due <= filters.dateRange.end\r\n )\r\n }\r\n return true\r\n default:\r\n return true\r\n }\r\n })\r\n }\r\n\r\n if (filters.priorities.length > 0) {\r\n filtered = filtered.filter(\r\n (card) => card.priority && filters.priorities.includes(card.priority)\r\n )\r\n }\r\n\r\n if (filters.assignees.length > 0) {\r\n filtered = filtered.filter((card) => {\r\n const cardAssignees = card.assignedUserIds || (card.assigneeId ? [card.assigneeId] : [])\r\n return cardAssignees.some((id) => filters.assignees.includes(id))\r\n })\r\n }\r\n\r\n if (filters.labels.length > 0) {\r\n filtered = filtered.filter((card) => {\r\n return (\r\n card.labels &&\r\n card.labels.some((label) => filters.labels.includes(label))\r\n )\r\n })\r\n }\r\n\r\n if (filters.columns.length > 0) {\r\n filtered = filtered.filter((card) =>\r\n filters.columns.includes(card.columnId)\r\n )\r\n }\r\n\r\n if (sort.by !== 'none') {\r\n filtered.sort((a, b) => {\r\n let comparison = 0\r\n\r\n switch (sort.by) {\r\n case 'created':\r\n const aCreated = a.createdAt ? new Date(a.createdAt).getTime() : 0\r\n const bCreated = b.createdAt ? new Date(b.createdAt).getTime() : 0\r\n comparison = aCreated - bCreated\r\n break\r\n\r\n case 'priority':\r\n const priorityOrder = { URGENT: 4, HIGH: 3, MEDIUM: 2, LOW: 1 }\r\n const aPriority = priorityOrder[a.priority || 'LOW']\r\n const bPriority = priorityOrder[b.priority || 'LOW']\r\n comparison = aPriority - bPriority\r\n break\r\n\r\n case 'dueDate':\r\n const aDue = a.endDate || a.dueDate\r\n const bDue = b.endDate || b.dueDate\r\n if (!aDue) return 1\r\n if (!bDue) return -1\r\n const aTime = typeof aDue === 'string' ? new Date(aDue).getTime() : aDue.getTime()\r\n const bTime = typeof bDue === 'string' ? new Date(bDue).getTime() : bDue.getTime()\r\n comparison = aTime - bTime\r\n break\r\n\r\n case 'title':\r\n comparison = a.title.localeCompare(b.title)\r\n break\r\n\r\n case 'estimate':\r\n const aEst = a.estimatedTime || 0\r\n const bEst = b.estimatedTime || 0\r\n comparison = aEst - bEst\r\n break\r\n\r\n default:\r\n comparison = 0\r\n }\r\n\r\n return sort.order === 'asc' ? comparison : -comparison\r\n })\r\n }\r\n\r\n return filtered\r\n },\r\n [filters, sort]\r\n )\r\n\r\n return {\r\n filters,\r\n sort,\r\n setFilters,\r\n setSort,\r\n resetFilters,\r\n filterMyTasks,\r\n filterOverdue,\r\n filterHighPriority,\r\n applyFilters,\r\n hasActiveFilters,\r\n }\r\n}\r\n","/**\r\n * useAI Hook\r\n * Optional AI features using Vercel AI SDK\r\n * Requires 'ai' package to be installed\r\n * @module hooks/useAI\r\n */\r\n\r\nimport { useCallback, useState } from 'react'\r\nimport type {\r\n AICallbacks,\r\n Board,\r\n Card,\r\n GeneratedPlan,\r\n AssigneeSuggestion,\r\n Insight,\r\n} from '../types'\r\n\r\nexport interface UseAIOptions {\r\n /** API key for AI provider */\r\n apiKey?: string\r\n /** Model to use */\r\n model?: 'gpt-4' | 'gpt-4-turbo' | 'claude-3-5-sonnet' | string\r\n /** Custom API endpoint */\r\n endpoint?: string\r\n /** Base URL */\r\n baseURL?: string\r\n}\r\n\r\nexport interface UseAIReturn extends AICallbacks {\r\n /** Is AI available (SDK installed + API key provided) */\r\n isAvailable: boolean\r\n /** Is AI currently processing */\r\n isLoading: boolean\r\n /** Last error */\r\n error: Error | null\r\n}\r\n\r\n// Try to import AI SDK (optional peer dependency)\r\nlet generateObject: any\r\nlet generateText: any\r\n\r\nif (typeof window !== 'undefined') {\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const aiSDK = require('ai')\r\n generateObject = aiSDK.generateObject\r\n generateText = aiSDK.generateText\r\n } catch {\r\n // AI SDK not installed\r\n }\r\n}\r\n\r\n/**\r\n * Hook for AI features\r\n *\r\n * @example\r\n * ```tsx\r\n * const ai = useAI({\r\n * apiKey: process.env.OPENAI_API_KEY,\r\n * model: 'gpt-4-turbo'\r\n * })\r\n *\r\n * if (ai.isAvailable) {\r\n * const plan = await ai.onGeneratePlan('Build a todo app')\r\n * }\r\n * ```\r\n */\r\nexport function useAI(options: UseAIOptions = {}): UseAIReturn {\r\n const [isLoading, setIsLoading] = useState(false)\r\n const [error, setError] = useState<Error | null>(null)\r\n\r\n const isAvailable = Boolean(\r\n generateObject && generateText && options.apiKey\r\n )\r\n\r\n // Generate plan from prompt\r\n const onGeneratePlan = useCallback(\r\n async (prompt: string): Promise<GeneratedPlan> => {\r\n if (!isAvailable) {\r\n throw new Error(\r\n 'AI features require the \"ai\" package and an API key. Install with: npm install ai'\r\n )\r\n }\r\n\r\n setIsLoading(true)\r\n setError(null)\r\n\r\n try {\r\n // This is a placeholder - actual implementation would use generateObject\r\n // with proper schema definition using Zod\r\n console.log('Generating plan for:', prompt)\r\n\r\n // Example structure (would use real AI SDK)\r\n const result: GeneratedPlan = {\r\n columns: [\r\n {\r\n title: 'To Do',\r\n position: 1000,\r\n cardIds: [],\r\n },\r\n {\r\n title: 'In Progress',\r\n position: 2000,\r\n cardIds: [],\r\n },\r\n {\r\n title: 'Done',\r\n position: 3000,\r\n cardIds: [],\r\n },\r\n ],\r\n cards: [\r\n {\r\n title: 'Generated task from AI',\r\n description: `Based on: ${prompt}`,\r\n position: 1000,\r\n columnId: 'temp-col-1',\r\n },\r\n ],\r\n explanation: 'This is a sample plan. Real implementation would use AI SDK.',\r\n }\r\n\r\n return result\r\n } catch (err) {\r\n const error =\r\n err instanceof Error ? err : new Error('Failed to generate plan')\r\n setError(error)\r\n throw error\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n },\r\n [isAvailable]\r\n )\r\n\r\n // Suggest assignee for card\r\n const onSuggestAssignee = useCallback(\r\n async (card: Card): Promise<AssigneeSuggestion> => {\r\n if (!isAvailable) {\r\n throw new Error('AI features not available')\r\n }\r\n\r\n setIsLoading(true)\r\n setError(null)\r\n\r\n try {\r\n // Placeholder implementation\r\n console.log('Suggesting assignee for:', card.title)\r\n\r\n return {\r\n userId: 'user-123',\r\n confidence: 0.85,\r\n reasoning: 'Based on past performance and expertise',\r\n }\r\n } catch (err) {\r\n const error =\r\n err instanceof Error ? err : new Error('Failed to suggest assignee')\r\n setError(error)\r\n throw error\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n },\r\n [isAvailable]\r\n )\r\n\r\n // Predict risks\r\n const onPredictRisks = useCallback(\r\n async (_boardState: Board): Promise<Insight[]> => {\r\n if (!isAvailable) {\r\n throw new Error('AI features not available')\r\n }\r\n\r\n setIsLoading(true)\r\n setError(null)\r\n\r\n try {\r\n console.log('Analyzing board for risks...')\r\n\r\n // Placeholder insights\r\n const insights: Insight[] = [\r\n {\r\n type: 'RISK_OVERLOAD',\r\n severity: 'HIGH',\r\n title: 'Column overload detected',\r\n description: 'Too many cards in \"In Progress\"',\r\n confidence: 0.9,\r\n suggestedAction: 'Consider moving some cards back to \"To Do\"',\r\n },\r\n ]\r\n\r\n return insights\r\n } catch (err) {\r\n const error =\r\n err instanceof Error ? err : new Error('Failed to predict risks')\r\n setError(error)\r\n throw error\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n },\r\n [isAvailable]\r\n )\r\n\r\n // Generate subtasks\r\n const onGenerateSubtasks = useCallback(\r\n async (card: Card): Promise<Omit<Card, 'id'>[]> => {\r\n if (!isAvailable) {\r\n throw new Error('AI features not available')\r\n }\r\n\r\n setIsLoading(true)\r\n setError(null)\r\n\r\n try {\r\n console.log('Generating subtasks for:', card.title)\r\n\r\n return [\r\n {\r\n title: `Subtask 1 for: ${card.title}`,\r\n position: card.position + 0.1,\r\n columnId: card.columnId,\r\n },\r\n {\r\n title: `Subtask 2 for: ${card.title}`,\r\n position: card.position + 0.2,\r\n columnId: card.columnId,\r\n },\r\n ]\r\n } catch (err) {\r\n const error =\r\n err instanceof Error ? err : new Error('Failed to generate subtasks')\r\n setError(error)\r\n throw error\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n },\r\n [isAvailable]\r\n )\r\n\r\n // Estimate effort\r\n const onEstimateEffort = useCallback(\r\n async (\r\n card: Card\r\n ): Promise<{ hours: number; confidence: number }> => {\r\n if (!isAvailable) {\r\n throw new Error('AI features not available')\r\n }\r\n\r\n setIsLoading(true)\r\n setError(null)\r\n\r\n try {\r\n console.log('Estimating effort for:', card.title)\r\n\r\n return {\r\n hours: 8,\r\n confidence: 0.75,\r\n }\r\n } catch (err) {\r\n const error =\r\n err instanceof Error ? err : new Error('Failed to estimate effort')\r\n setError(error)\r\n throw error\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n },\r\n [isAvailable]\r\n )\r\n\r\n return {\r\n onGeneratePlan,\r\n onSuggestAssignee,\r\n onPredictRisks,\r\n onGenerateSubtasks,\r\n onEstimateEffort,\r\n isAvailable,\r\n isLoading,\r\n error,\r\n }\r\n}\r\n","/**\r\n * useSelectionState - React hook for selection state management\r\n * @module hooks/useSelectionState\r\n *\r\n * Replacement for Jotai's useAtom(selectionStateAtom)\r\n */\r\n\r\nimport { useState, useEffect, useCallback } from 'react'\r\nimport { selectionStore, type SelectionState } from '@libxai/core'\r\n\r\n/**\r\n * Hook return type\r\n */\r\nexport type UseSelectionStateReturn = [\r\n state: SelectionState,\r\n setState: (state: SelectionState) => void\r\n]\r\n\r\n/**\r\n * React hook for selection state\r\n *\r\n * Drop-in replacement for `useAtom(selectionStateAtom)`\r\n *\r\n * @example\r\n * ```tsx\r\n * function MyComponent() {\r\n * const [selectionState, setSelectionState] = useSelectionState()\r\n *\r\n * const handleSelect = (cardId: string) => {\r\n * setSelectionState({\r\n * selectedCardIds: [cardId],\r\n * lastSelectedCardId: cardId,\r\n * })\r\n * }\r\n *\r\n * return (\r\n * <div>\r\n * {selectionState.selectedCardIds.length} cards selected\r\n * </div>\r\n * )\r\n * }\r\n * ```\r\n */\r\nexport function useSelectionState(): UseSelectionStateReturn {\r\n const [state, setState] = useState<SelectionState>(() => selectionStore.getState())\r\n\r\n useEffect(() => {\r\n // Subscribe to store changes\r\n const unsubscribe = selectionStore.subscribe((newState) => {\r\n setState(newState)\r\n })\r\n\r\n return unsubscribe\r\n }, [])\r\n\r\n const setSelectionState = useCallback((newState: SelectionState) => {\r\n selectionStore.setState(newState)\r\n }, [])\r\n\r\n return [state, setSelectionState]\r\n}\r\n","/**\r\n * Multi-select hook for bulk operations\r\n * Supports keyboard modifiers (Cmd/Ctrl, Shift) for selection\r\n * @module hooks/useMultiSelect\r\n */\r\n\r\nimport { useCallback } from 'react'\r\nimport { useSelectionState } from './useSelectionState'\r\nimport type { Card } from '../types'\r\n\r\nexport interface UseMultiSelectReturn {\r\n /** Selected card IDs */\r\n selectedCardIds: string[]\r\n /** Last selected card ID */\r\n lastSelectedCardId: string | null\r\n /** Check if a card is selected */\r\n isCardSelected: (cardId: string) => boolean\r\n /** Select a card */\r\n selectCard: (cardId: string, event?: React.MouseEvent) => void\r\n /** Deselect a card */\r\n deselectCard: (cardId: string) => void\r\n /** Clear all selections */\r\n clearSelection: () => void\r\n /** Select all cards */\r\n selectAll: () => void\r\n /** Toggle card selection */\r\n toggleCard: (cardId: string) => void\r\n /** Get selected cards */\r\n getSelectedCards: () => Card[]\r\n}\r\n\r\nexport interface UseMultiSelectOptions {\r\n /** Board cards (required for range selection and selectAll) */\r\n cards: Card[]\r\n}\r\n\r\n/**\r\n * Hook for multi-select functionality\r\n *\r\n * @param options - Configuration options\r\n */\r\nexport function useMultiSelect(options: UseMultiSelectOptions): UseMultiSelectReturn {\r\n const { cards } = options\r\n const [selectionState, setSelectionState] = useSelectionState()\r\n\r\n const isCardSelected = useCallback(\r\n (cardId: string) => {\r\n return selectionState.selectedCardIds.includes(cardId)\r\n },\r\n [selectionState.selectedCardIds]\r\n )\r\n\r\n const selectCard = useCallback(\r\n (cardId: string, event?: React.MouseEvent) => {\r\n if (!event) {\r\n // Simple selection without modifiers\r\n setSelectionState({\r\n selectedCardIds: [cardId],\r\n lastSelectedCardId: cardId,\r\n })\r\n return\r\n }\r\n\r\n const isCtrlOrCmd = event.ctrlKey || event.metaKey\r\n const isShift = event.shiftKey\r\n\r\n if (isCtrlOrCmd) {\r\n // Cmd/Ctrl+Click: Toggle card selection\r\n if (selectionState.selectedCardIds.includes(cardId)) {\r\n setSelectionState({\r\n selectedCardIds: selectionState.selectedCardIds.filter((id) => id !== cardId),\r\n lastSelectedCardId: selectionState.lastSelectedCardId,\r\n })\r\n } else {\r\n setSelectionState({\r\n selectedCardIds: [...selectionState.selectedCardIds, cardId],\r\n lastSelectedCardId: cardId,\r\n })\r\n }\r\n } else if (isShift && selectionState.lastSelectedCardId) {\r\n // Shift+Click: Range selection within same column\r\n const card = cards.find((c) => c.id === cardId)\r\n const lastCard = cards.find((c) => c.id === selectionState.lastSelectedCardId)\r\n\r\n if (card && lastCard && card.columnId === lastCard.columnId) {\r\n // Get all cards in the column\r\n const columnCards = cards\r\n .filter((c) => c.columnId === card.columnId)\r\n .sort((a, b) => a.position - b.position)\r\n\r\n const startIndex = columnCards.findIndex((c) => c.id === selectionState.lastSelectedCardId)\r\n const endIndex = columnCards.findIndex((c) => c.id === cardId)\r\n\r\n const [minIndex, maxIndex] = startIndex < endIndex\r\n ? [startIndex, endIndex]\r\n : [endIndex, startIndex]\r\n\r\n const rangeCardIds = columnCards\r\n .slice(minIndex, maxIndex + 1)\r\n .map((c) => c.id)\r\n\r\n // Merge with existing selection\r\n const newSelection = Array.from(\r\n new Set([...selectionState.selectedCardIds, ...rangeCardIds])\r\n )\r\n\r\n setSelectionState({\r\n selectedCardIds: newSelection,\r\n lastSelectedCardId: cardId,\r\n })\r\n } else {\r\n // Different column or no last selection - treat as regular selection\r\n setSelectionState({\r\n selectedCardIds: [cardId],\r\n lastSelectedCardId: cardId,\r\n })\r\n }\r\n } else {\r\n // Regular click: Replace selection\r\n setSelectionState({\r\n selectedCardIds: [cardId],\r\n lastSelectedCardId: cardId,\r\n })\r\n }\r\n },\r\n [cards, selectionState, setSelectionState]\r\n )\r\n\r\n const deselectCard = useCallback(\r\n (cardId: string) => {\r\n setSelectionState({\r\n selectedCardIds: selectionState.selectedCardIds.filter((id) => id !== cardId),\r\n lastSelectedCardId: selectionState.lastSelectedCardId,\r\n })\r\n },\r\n [selectionState, setSelectionState]\r\n )\r\n\r\n const clearSelection = useCallback(() => {\r\n setSelectionState({\r\n selectedCardIds: [],\r\n lastSelectedCardId: null,\r\n })\r\n }, [setSelectionState])\r\n\r\n const selectAll = useCallback(() => {\r\n setSelectionState({\r\n selectedCardIds: cards.map((card) => card.id),\r\n lastSelectedCardId: cards[cards.length - 1]?.id || null,\r\n })\r\n }, [cards, setSelectionState])\r\n\r\n const toggleCard = useCallback(\r\n (cardId: string) => {\r\n if (selectionState.selectedCardIds.includes(cardId)) {\r\n deselectCard(cardId)\r\n } else {\r\n setSelectionState({\r\n selectedCardIds: [...selectionState.selectedCardIds, cardId],\r\n lastSelectedCardId: cardId,\r\n })\r\n }\r\n },\r\n [selectionState, deselectCard, setSelectionState]\r\n )\r\n\r\n const getSelectedCards = useCallback(() => {\r\n return cards.filter((card) =>\r\n selectionState.selectedCardIds.includes(card.id)\r\n )\r\n }, [cards, selectionState.selectedCardIds])\r\n\r\n return {\r\n selectedCardIds: selectionState.selectedCardIds,\r\n lastSelectedCardId: selectionState.lastSelectedCardId,\r\n isCardSelected,\r\n selectCard,\r\n deselectCard,\r\n clearSelection,\r\n selectAll,\r\n toggleCard,\r\n getSelectedCards,\r\n }\r\n}\r\n","/**\r\n * Card Stack Types\r\n * Smart grouping of related cards within columns\r\n * @module types/card-stack\r\n */\r\n\r\nexport type StackingStrategy = 'manual' | 'ai-similarity' | 'labels' | 'assignee' | 'priority' | 'epic'\r\n\r\nexport interface CardStack {\r\n /** Unique stack identifier */\r\n id: string\r\n /** Display title for the stack */\r\n title: string\r\n /** Cards contained in this stack */\r\n cardIds: string[]\r\n /** Column this stack belongs to */\r\n columnId: string\r\n /** How this stack was created */\r\n strategy: StackingStrategy\r\n /** Visual color for the stack */\r\n color?: string\r\n /** Whether stack is expanded or collapsed */\r\n isExpanded: boolean\r\n /** Position within the column */\r\n position: number\r\n /** Timestamp when stack was created */\r\n createdAt: Date\r\n /** AI confidence score (0-1) for auto-stacked groups */\r\n confidence?: number\r\n}\r\n\r\nexport interface StackingConfig {\r\n /** Enable automatic AI-powered stacking */\r\n enableAutoStacking: boolean\r\n /** Minimum confidence threshold for auto-stacking (0-1) */\r\n autoStackConfidenceThreshold: number\r\n /** Minimum cards required to form a stack */\r\n minCardsPerStack: number\r\n /** Enable manual drag-to-stack */\r\n enableManualStacking: boolean\r\n /** Show stack summaries (card count, assignees, etc.) */\r\n showStackSummaries: boolean\r\n /** Animation duration in ms */\r\n animationDuration: number\r\n}\r\n\r\nexport interface StackSuggestion {\r\n /** Suggested stack configuration */\r\n stack: Omit<CardStack, 'id' | 'createdAt' | 'isExpanded' | 'position'>\r\n /** Reason for suggestion */\r\n reason: string\r\n /** Confidence score (0-1) */\r\n confidence: number\r\n}\r\n\r\nexport const DEFAULT_STACKING_CONFIG: StackingConfig = {\r\n enableAutoStacking: true,\r\n autoStackConfidenceThreshold: 0.7,\r\n minCardsPerStack: 2,\r\n enableManualStacking: true,\r\n showStackSummaries: true,\r\n animationDuration: 200,\r\n}\r\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: '#3b82f6',\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","/**\r\n * BoardProvider - React Context Provider for BoardStore\r\n * @module adapters/react\r\n */\r\n\r\nimport React, { createContext, useContext, useEffect, useRef } from 'react'\r\nimport { BoardStore, type BoardState, type CardData, type ColumnData, type BoardData } from '@libxai/core'\r\n\r\n/**\r\n * Board Context\r\n */\r\ninterface BoardContextValue {\r\n store: BoardStore\r\n}\r\n\r\nconst BoardContext = createContext<BoardContextValue | null>(null)\r\n\r\n/**\r\n * Board Provider Props\r\n */\r\nexport interface BoardProviderProps {\r\n children: React.ReactNode\r\n initialData?: {\r\n board?: BoardData\r\n columns?: ColumnData[]\r\n cards?: CardData[]\r\n }\r\n onStateChange?: (state: BoardState) => void\r\n}\r\n\r\n/**\r\n * BoardProvider component\r\n *\r\n * Wraps your app with BoardStore context\r\n *\r\n * @example\r\n * ```tsx\r\n * <BoardProvider initialData={{ columns: [], cards: [] }}>\r\n * <Board />\r\n * </BoardProvider>\r\n * ```\r\n */\r\nexport function BoardProvider({ children, initialData, onStateChange }: BoardProviderProps) {\r\n // Create store only once\r\n const storeRef = useRef<BoardStore>()\r\n\r\n if (!storeRef.current) {\r\n // Initialize store\r\n const columnsMap = new Map()\r\n const cardsMap = new Map()\r\n\r\n // Load initial columns\r\n initialData?.columns?.forEach(colData => {\r\n const { Column } = require('@libxai/core')\r\n columnsMap.set(colData.id, new Column(colData))\r\n })\r\n\r\n // Load initial cards\r\n initialData?.cards?.forEach(cardData => {\r\n const { Card } = require('@libxai/core')\r\n cardsMap.set(cardData.id, new Card(cardData))\r\n })\r\n\r\n // Load initial board\r\n let board = null\r\n if (initialData?.board) {\r\n const { Board } = require('@libxai/core')\r\n board = new Board(initialData.board)\r\n }\r\n\r\n storeRef.current = new BoardStore({\r\n board,\r\n columns: columnsMap,\r\n cards: cardsMap,\r\n })\r\n }\r\n\r\n const store = storeRef.current\r\n\r\n // Subscribe to state changes\r\n useEffect(() => {\r\n if (!onStateChange) return\r\n\r\n return store.subscribeAll((_event) => {\r\n onStateChange(store.getState())\r\n })\r\n }, [store, onStateChange])\r\n\r\n return (\r\n <BoardContext.Provider value={{ store }}>\r\n {children}\r\n </BoardContext.Provider>\r\n )\r\n}\r\n\r\n/**\r\n * Hook to access BoardStore from context\r\n *\r\n * @throws Error if used outside BoardProvider\r\n */\r\nexport function useBoardStore(): BoardStore {\r\n const context = useContext(BoardContext)\r\n\r\n if (!context) {\r\n throw new Error('useBoardStore must be used within BoardProvider')\r\n }\r\n\r\n return context.store\r\n}\r\n","/**\r\n * useBoard - Main hook for board operations\r\n * @module adapters/react\r\n */\r\n\r\nimport { useState, useEffect, useCallback } from 'react'\r\nimport { useBoardStore } from './BoardProvider'\r\nimport type { Board, Column, Card, CardData, ColumnData } from '@libxai/core'\r\n\r\n/**\r\n * Return type for useBoard hook\r\n */\r\nexport interface UseBoardReturn {\r\n // State\r\n board: Board | null\r\n columns: Column[]\r\n cards: Card[]\r\n\r\n // Board operations\r\n updateBoard: (changes: Partial<Omit<import('@libxai/core').BoardData, 'id' | 'createdAt'>>) => void\r\n\r\n // Column operations\r\n addColumn: (columnData: Omit<ColumnData, 'createdAt' | 'updatedAt'>) => void\r\n updateColumn: (columnId: string, changes: Partial<Omit<ColumnData, 'id' | 'createdAt'>>) => void\r\n deleteColumn: (columnId: string) => void\r\n getColumn: (columnId: string) => Column | undefined\r\n\r\n // Card operations\r\n addCard: (cardData: Omit<CardData, 'createdAt' | 'updatedAt'>) => void\r\n updateCard: (cardId: string, changes: Partial<Omit<CardData, 'id' | 'createdAt'>>) => void\r\n deleteCard: (cardId: string) => void\r\n moveCard: (cardId: string, toColumnId: string, newPosition: number) => void\r\n getCard: (cardId: string) => Card | undefined\r\n getCardsByColumn: (columnId: string) => Card[]\r\n}\r\n\r\n/**\r\n * Main hook for board operations\r\n *\r\n * Provides reactive state and methods for managing board, columns, and cards\r\n *\r\n * @example\r\n * ```tsx\r\n * function MyBoard() {\r\n * const { board, columns, cards, addCard, moveCard } = useBoard()\r\n *\r\n * return (\r\n * <div>\r\n * {columns.map(column => (\r\n * <div key={column.id}>\r\n * <h2>{column.title}</h2>\r\n * {cards\r\n * .filter(card => card.columnId === column.id)\r\n * .map(card => (\r\n * <div key={card.id}>{card.title}</div>\r\n * ))}\r\n * </div>\r\n * ))}\r\n * </div>\r\n * )\r\n * }\r\n * ```\r\n */\r\nexport function useBoard(): UseBoardReturn {\r\n const store = useBoardStore()\r\n\r\n // Reactive state\r\n const [board, setBoard] = useState<Board | null>(store.getBoard())\r\n const [columns, setColumns] = useState<Column[]>(store.getAllColumns())\r\n const [cards, setCards] = useState<Card[]>(store.getAllCards())\r\n\r\n // Subscribe to store changes\r\n useEffect(() => {\r\n const unsubscribe = store.subscribeAll(() => {\r\n setBoard(store.getBoard())\r\n setColumns(store.getAllColumns())\r\n setCards(store.getAllCards())\r\n })\r\n\r\n return unsubscribe\r\n }, [store])\r\n\r\n // Board operations\r\n const updateBoard = useCallback(\r\n (changes: Partial<Omit<import('@libxai/core').BoardData, 'id' | 'createdAt'>>) => {\r\n store.updateBoard(changes)\r\n },\r\n [store]\r\n )\r\n\r\n // Column operations\r\n const addColumn = useCallback(\r\n (columnData: Omit<ColumnData, 'createdAt' | 'updatedAt'>) => {\r\n store.addColumn(columnData)\r\n },\r\n [store]\r\n )\r\n\r\n const updateColumn = useCallback(\r\n (columnId: string, changes: Partial<Omit<ColumnData, 'id' | 'createdAt'>>) => {\r\n store.updateColumn(columnId, changes)\r\n },\r\n [store]\r\n )\r\n\r\n const deleteColumn = useCallback(\r\n (columnId: string) => {\r\n store.deleteColumn(columnId)\r\n },\r\n [store]\r\n )\r\n\r\n const getColumn = useCallback(\r\n (columnId: string) => {\r\n return store.getColumn(columnId)\r\n },\r\n [store]\r\n )\r\n\r\n // Card operations\r\n const addCard = useCallback(\r\n (cardData: Omit<CardData, 'createdAt' | 'updatedAt'>) => {\r\n store.addCard(cardData)\r\n },\r\n [store]\r\n )\r\n\r\n const updateCard = useCallback(\r\n (cardId: string, changes: Partial<Omit<CardData, 'id' | 'createdAt'>>) => {\r\n store.updateCard(cardId, changes)\r\n },\r\n [store]\r\n )\r\n\r\n const deleteCard = useCallback(\r\n (cardId: string) => {\r\n store.deleteCard(cardId)\r\n },\r\n [store]\r\n )\r\n\r\n const moveCard = useCallback(\r\n (cardId: string, toColumnId: string, newPosition: number) => {\r\n store.moveCard(cardId, toColumnId, newPosition)\r\n },\r\n [store]\r\n )\r\n\r\n const getCard = useCallback(\r\n (cardId: string) => {\r\n return store.getCard(cardId)\r\n },\r\n [store]\r\n )\r\n\r\n const getCardsByColumn = useCallback(\r\n (columnId: string) => {\r\n return store.getCardsByColumn(columnId)\r\n },\r\n [store]\r\n )\r\n\r\n return {\r\n // State\r\n board,\r\n columns,\r\n cards,\r\n\r\n // Board operations\r\n updateBoard,\r\n\r\n // Column operations\r\n addColumn,\r\n updateColumn,\r\n deleteColumn,\r\n getColumn,\r\n\r\n // Card operations\r\n addCard,\r\n updateCard,\r\n deleteCard,\r\n moveCard,\r\n getCard,\r\n getCardsByColumn,\r\n }\r\n}\r\n","/**\r\n * useFilteredCards - Hook for filtering cards with memoization\r\n * @module adapters/react\r\n */\r\n\r\nimport { useMemo } from 'react'\r\nimport { useBoard } from './useBoard'\r\nimport type { Card, Priority, CardStatus } from '@libxai/core'\r\n\r\n/**\r\n * Filter options for cards\r\n */\r\nexport interface CardFilters {\r\n searchQuery?: string\r\n priorities?: Priority[]\r\n statuses?: CardStatus[]\r\n assignedUserIds?: string[]\r\n labels?: string[]\r\n columnIds?: string[]\r\n isOverdue?: boolean\r\n}\r\n\r\n/**\r\n * Hook for filtered and sorted cards\r\n *\r\n * Automatically memoizes results for performance\r\n *\r\n * @param filters - Filter criteria\r\n * @returns Filtered cards array\r\n *\r\n * @example\r\n * ```tsx\r\n * function CardList() {\r\n * const filteredCards = useFilteredCards({\r\n * priorities: ['HIGH', 'URGENT'],\r\n * isOverdue: true\r\n * })\r\n *\r\n * return <div>{filteredCards.length} urgent overdue tasks</div>\r\n * }\r\n * ```\r\n */\r\nexport function useFilteredCards(filters?: CardFilters): Card[] {\r\n const { cards } = useBoard()\r\n\r\n return useMemo(() => {\r\n if (!filters) return cards\r\n\r\n return cards.filter(card => {\r\n // Search query (title + description)\r\n if (filters.searchQuery) {\r\n const query = filters.searchQuery.toLowerCase()\r\n const matchesTitle = card.title.toLowerCase().includes(query)\r\n const matchesDesc = card.description?.toLowerCase().includes(query)\r\n if (!matchesTitle && !matchesDesc) return false\r\n }\r\n\r\n // Priority filter\r\n if (filters.priorities && filters.priorities.length > 0) {\r\n if (!card.priority || !filters.priorities.includes(card.priority)) {\r\n return false\r\n }\r\n }\r\n\r\n // Status filter\r\n if (filters.statuses && filters.statuses.length > 0) {\r\n if (!card.status || !filters.statuses.includes(card.status)) {\r\n return false\r\n }\r\n }\r\n\r\n // Assigned users filter\r\n if (filters.assignedUserIds && filters.assignedUserIds.length > 0) {\r\n const hasAssignedUser = filters.assignedUserIds.some(userId =>\r\n card.isAssignedTo(userId)\r\n )\r\n if (!hasAssignedUser) return false\r\n }\r\n\r\n // Labels filter\r\n if (filters.labels && filters.labels.length > 0) {\r\n const hasLabel = filters.labels.some(label => card.hasLabel(label))\r\n if (!hasLabel) return false\r\n }\r\n\r\n // Column filter\r\n if (filters.columnIds && filters.columnIds.length > 0) {\r\n if (!filters.columnIds.includes(card.columnId)) {\r\n return false\r\n }\r\n }\r\n\r\n // Overdue filter\r\n if (filters.isOverdue !== undefined) {\r\n if (filters.isOverdue !== card.isOverdue()) {\r\n return false\r\n }\r\n }\r\n\r\n return true\r\n })\r\n }, [cards, filters])\r\n}\r\n\r\n/**\r\n * Hook for sorted cards\r\n *\r\n * @param sortBy - Sort field\r\n * @param sortOrder - Sort order ('asc' | 'desc')\r\n * @returns Sorted cards array\r\n */\r\nexport function useSortedCards(\r\n sortBy: 'title' | 'priority' | 'createdAt' | 'updatedAt' | 'position' = 'position',\r\n sortOrder: 'asc' | 'desc' = 'asc'\r\n): Card[] {\r\n const { cards } = useBoard()\r\n\r\n return useMemo(() => {\r\n const sorted = [...cards].sort((a, b) => {\r\n let comparison = 0\r\n\r\n switch (sortBy) {\r\n case 'title':\r\n comparison = a.title.localeCompare(b.title)\r\n break\r\n case 'priority': {\r\n const priorityOrder = { URGENT: 4, HIGH: 3, MEDIUM: 2, LOW: 1 }\r\n const aPriority = a.priority ? priorityOrder[a.priority] : 0\r\n const bPriority = b.priority ? priorityOrder[b.priority] : 0\r\n comparison = aPriority - bPriority\r\n break\r\n }\r\n case 'createdAt':\r\n comparison = a.createdAt.getTime() - b.createdAt.getTime()\r\n break\r\n case 'updatedAt':\r\n comparison = a.updatedAt.getTime() - b.updatedAt.getTime()\r\n break\r\n case 'position':\r\n comparison = a.position - b.position\r\n break\r\n }\r\n\r\n return sortOrder === 'asc' ? comparison : -comparison\r\n })\r\n\r\n return sorted\r\n }, [cards, sortBy, sortOrder])\r\n}\r\n","/**\r\n * Plugin Manager Implementation\r\n * Manages plugin lifecycle and execution\r\n * @module plugins/PluginManager\r\n */\r\n\r\nimport type { Plugin, PluginContext, IPluginManager } from './types'\r\nimport { logger } from '../utils/logger'\r\n\r\nexport class PluginManager implements IPluginManager {\r\n private plugins: Map<string, Plugin> = new Map()\r\n private enabled: Set<string> = new Set()\r\n private config: Map<string, Record<string, any>> = new Map()\r\n private context: PluginContext | null = null\r\n private pluginLogger = logger.child('PluginManager')\r\n\r\n /**\r\n * Set plugin context (board state, callbacks, etc.)\r\n */\r\n setContext(context: PluginContext): void {\r\n this.context = context\r\n }\r\n\r\n /**\r\n * Register a plugin\r\n */\r\n register(plugin: Plugin): void {\r\n // Validate plugin\r\n if (!plugin.id || !plugin.name || !plugin.version) {\r\n throw new Error('Plugin must have id, name, and version')\r\n }\r\n\r\n if (this.plugins.has(plugin.id)) {\r\n this.pluginLogger.warn(`Plugin ${plugin.id} is already registered, overwriting...`)\r\n }\r\n\r\n // Check dependencies\r\n if (plugin.dependencies) {\r\n for (const depId of plugin.dependencies) {\r\n if (!this.plugins.has(depId)) {\r\n throw new Error(`Plugin ${plugin.id} depends on ${depId} which is not registered`)\r\n }\r\n }\r\n }\r\n\r\n // Store plugin\r\n this.plugins.set(plugin.id, plugin)\r\n\r\n // Set default config\r\n if (plugin.defaultConfig) {\r\n this.config.set(plugin.id, { ...plugin.defaultConfig })\r\n }\r\n\r\n // Enable by default\r\n this.enabled.add(plugin.id)\r\n\r\n this.pluginLogger.info(`Plugin registered: ${plugin.name} v${plugin.version}`)\r\n\r\n // Call onInit hook\r\n if (plugin.onInit && this.context) {\r\n Promise.resolve(plugin.onInit(this.context)).catch((error) => {\r\n this.pluginLogger.error(`Failed to initialize plugin ${plugin.id}`, error, {\r\n plugin: plugin.id,\r\n })\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * Unregister a plugin\r\n */\r\n unregister(pluginId: string): void {\r\n const plugin = this.plugins.get(pluginId)\r\n\r\n if (!plugin) {\r\n this.pluginLogger.warn(`Plugin ${pluginId} is not registered`)\r\n return\r\n }\r\n\r\n // Call onDestroy hook\r\n if (plugin.onDestroy) {\r\n Promise.resolve(plugin.onDestroy()).catch((error) => {\r\n this.pluginLogger.error(`Failed to destroy plugin ${pluginId}`, error)\r\n })\r\n }\r\n\r\n this.plugins.delete(pluginId)\r\n this.enabled.delete(pluginId)\r\n this.config.delete(pluginId)\r\n\r\n this.pluginLogger.info(`Plugin unregistered: ${plugin.name}`)\r\n }\r\n\r\n /**\r\n * Get registered plugin\r\n */\r\n getPlugin(pluginId: string): Plugin | undefined {\r\n return this.plugins.get(pluginId)\r\n }\r\n\r\n /**\r\n * Get all registered plugins\r\n */\r\n getPlugins(): Plugin[] {\r\n return Array.from(this.plugins.values())\r\n }\r\n\r\n /**\r\n * Check if plugin is registered\r\n */\r\n hasPlugin(pluginId: string): boolean {\r\n return this.plugins.has(pluginId)\r\n }\r\n\r\n /**\r\n * Enable/disable plugin\r\n */\r\n setEnabled(pluginId: string, enabled: boolean): void {\r\n if (!this.plugins.has(pluginId)) {\r\n throw new Error(`Plugin ${pluginId} is not registered`)\r\n }\r\n\r\n if (enabled) {\r\n this.enabled.add(pluginId)\r\n this.pluginLogger.info(`Plugin enabled: ${pluginId}`)\r\n } else {\r\n this.enabled.delete(pluginId)\r\n this.pluginLogger.info(`Plugin disabled: ${pluginId}`)\r\n }\r\n }\r\n\r\n /**\r\n * Check if plugin is enabled\r\n */\r\n isEnabled(pluginId: string): boolean {\r\n return this.enabled.has(pluginId)\r\n }\r\n\r\n /**\r\n * Get plugin config\r\n */\r\n getConfig<T = any>(pluginId: string, key: string): T | undefined {\r\n const config = this.config.get(pluginId)\r\n return config?.[key] as T | undefined\r\n }\r\n\r\n /**\r\n * Set plugin config\r\n */\r\n setConfig(pluginId: string, key: string, value: any): void {\r\n if (!this.config.has(pluginId)) {\r\n this.config.set(pluginId, {})\r\n }\r\n\r\n const config = this.config.get(pluginId)!\r\n config[key] = value\r\n\r\n this.pluginLogger.debug(`Plugin config set: ${pluginId}.${key}`, { value })\r\n }\r\n\r\n /**\r\n * Execute plugin hooks\r\n */\r\n async executeHook<T = any>(\r\n hookName: keyof Plugin,\r\n args: any[],\r\n defaultValue?: T\r\n ): Promise<T | undefined> {\r\n let result: T | undefined = defaultValue\r\n\r\n for (const plugin of this.plugins.values()) {\r\n if (!this.enabled.has(plugin.id)) {\r\n continue\r\n }\r\n\r\n const hook = plugin[hookName] as any\r\n\r\n if (typeof hook === 'function') {\r\n try {\r\n const hookResult = await Promise.resolve(hook.apply(plugin, args))\r\n\r\n // For transform hooks, use the result as input for next plugin\r\n if (hookResult !== undefined) {\r\n result = hookResult\r\n args[0] = hookResult // Update first argument for next plugin\r\n }\r\n } catch (error) {\r\n this.pluginLogger.error(`Plugin hook failed: ${plugin.id}.${hookName}`, error as Error, {\r\n plugin: plugin.id,\r\n hook: hookName,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * Execute plugin hooks in parallel\r\n */\r\n async executeHookParallel(hookName: keyof Plugin, args: any[]): Promise<void> {\r\n const promises: Promise<any>[] = []\r\n\r\n for (const plugin of this.plugins.values()) {\r\n if (!this.enabled.has(plugin.id)) {\r\n continue\r\n }\r\n\r\n const hook = plugin[hookName] as any\r\n\r\n if (typeof hook === 'function') {\r\n promises.push(\r\n Promise.resolve(hook.apply(plugin, args)).catch((error) => {\r\n this.pluginLogger.error(`Plugin hook failed: ${plugin.id}.${hookName}`, error as Error, {\r\n plugin: plugin.id,\r\n hook: hookName,\r\n })\r\n })\r\n )\r\n }\r\n }\r\n\r\n await Promise.all(promises)\r\n }\r\n}\r\n\r\n/**\r\n * Global plugin manager instance\r\n */\r\nexport const pluginManager = new PluginManager()\r\n","/**\r\n * VirtualList - Virtual scrolling component for large lists\r\n * @module components/VirtualList\r\n */\r\n\r\nimport React, { useRef } from 'react'\r\nimport { useVirtualizer } from '@tanstack/react-virtual'\r\n\r\nexport interface VirtualListProps<T> {\r\n /** Array of items to render */\r\n items: T[]\r\n /** Height of the scrollable container in pixels */\r\n height: number | string\r\n /** Estimated size of each item in pixels */\r\n estimateSize: number\r\n /** Render function for each item */\r\n renderItem: (item: T, index: number) => React.ReactNode\r\n /** Optional className for the container */\r\n className?: string\r\n /** Overscan count (number of items to render outside viewport) */\r\n overscan?: number\r\n /** Enable horizontal scrolling instead of vertical */\r\n horizontal?: boolean\r\n /** Optional gap between items in pixels */\r\n gap?: number\r\n /** Optional key extractor function */\r\n getItemKey?: (item: T, index: number) => string | number\r\n}\r\n\r\n/**\r\n * VirtualList component for efficient rendering of large lists\r\n *\r\n * Uses @tanstack/react-virtual for windowing/virtualization\r\n *\r\n * @example\r\n * ```tsx\r\n * <VirtualList\r\n * items={cards}\r\n * height={600}\r\n * estimateSize={100}\r\n * renderItem={(card) => <CardComponent card={card} />}\r\n * getItemKey={(card) => card.id}\r\n * />\r\n * ```\r\n */\r\nexport function VirtualList<T>({\r\n items,\r\n height,\r\n estimateSize,\r\n renderItem,\r\n className = '',\r\n overscan = 5,\r\n horizontal = false,\r\n gap = 0,\r\n getItemKey,\r\n}: VirtualListProps<T>) {\r\n const parentRef = useRef<HTMLDivElement>(null)\r\n\r\n const virtualizer = useVirtualizer({\r\n count: items.length,\r\n getScrollElement: () => parentRef.current,\r\n estimateSize: () => estimateSize,\r\n overscan,\r\n horizontal,\r\n gap,\r\n })\r\n\r\n const virtualItems = virtualizer.getVirtualItems()\r\n\r\n const containerStyle: React.CSSProperties = {\r\n height: typeof height === 'number' ? `${height}px` : height,\r\n width: '100%',\r\n overflow: 'auto',\r\n position: 'relative',\r\n }\r\n\r\n const innerStyle: React.CSSProperties = horizontal\r\n ? {\r\n width: `${virtualizer.getTotalSize()}px`,\r\n height: '100%',\r\n position: 'relative',\r\n }\r\n : {\r\n height: `${virtualizer.getTotalSize()}px`,\r\n width: '100%',\r\n position: 'relative',\r\n }\r\n\r\n return (\r\n <div ref={parentRef} style={containerStyle} className={className}>\r\n <div style={innerStyle}>\r\n {virtualItems.map((virtualItem) => {\r\n const item = items[virtualItem.index]\r\n if (!item) return null\r\n const key = getItemKey ? getItemKey(item, virtualItem.index) : virtualItem.index\r\n\r\n const itemStyle: React.CSSProperties = {\r\n position: 'absolute',\r\n top: horizontal ? 0 : virtualItem.start,\r\n left: horizontal ? virtualItem.start : 0,\r\n width: horizontal ? virtualItem.size : '100%',\r\n height: horizontal ? '100%' : virtualItem.size,\r\n }\r\n\r\n return (\r\n <div key={key} style={itemStyle} data-index={virtualItem.index}>\r\n {renderItem(item, virtualItem.index)}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/**\r\n * Hook to access virtualizer instance for advanced use cases\r\n */\r\nexport function useVirtualList<T>(options: {\r\n items: T[]\r\n scrollElement: HTMLElement | null\r\n estimateSize: number\r\n overscan?: number\r\n horizontal?: boolean\r\n gap?: number\r\n}) {\r\n return useVirtualizer({\r\n count: options.items.length,\r\n getScrollElement: () => options.scrollElement,\r\n estimateSize: () => options.estimateSize,\r\n overscan: options.overscan ?? 5,\r\n horizontal: options.horizontal ?? false,\r\n gap: options.gap ?? 0,\r\n })\r\n}\r\n","/**\r\n * VirtualGrid - 2D virtual scrolling component for grid layouts\r\n * @module components/VirtualGrid\r\n */\r\n\r\nimport React, { useRef } from 'react'\r\nimport { useVirtualizer } from '@tanstack/react-virtual'\r\n\r\nexport interface VirtualGridProps<T> {\r\n /** Array of items to render */\r\n items: T[]\r\n /** Height of the scrollable container in pixels */\r\n height: number | string\r\n /** Width of the scrollable container in pixels */\r\n width?: number | string\r\n /** Estimated width of each column in pixels */\r\n estimateColumnWidth: number\r\n /** Render function for each column */\r\n renderColumn: (item: T, index: number) => React.ReactNode\r\n /** Optional className for the container */\r\n className?: string\r\n /** Overscan count (number of columns to render outside viewport) */\r\n overscan?: number\r\n /** Optional gap between columns in pixels */\r\n gap?: number\r\n /** Optional key extractor function */\r\n getItemKey?: (item: T, index: number) => string | number\r\n /** Enable horizontal scrolling only */\r\n horizontal?: boolean\r\n}\r\n\r\n/**\r\n * VirtualGrid component for efficient rendering of large horizontal lists/grids\r\n *\r\n * Optimized for Kanban boards with many columns\r\n *\r\n * @example\r\n * ```tsx\r\n * <VirtualGrid\r\n * items={columns}\r\n * height=\"100%\"\r\n * estimateColumnWidth={320}\r\n * renderColumn={(column) => <ColumnComponent column={column} />}\r\n * getItemKey={(column) => column.id}\r\n * />\r\n * ```\r\n */\r\nexport function VirtualGrid<T>({\r\n items,\r\n height,\r\n width = '100%',\r\n estimateColumnWidth,\r\n renderColumn,\r\n className = '',\r\n overscan = 3,\r\n gap = 16,\r\n getItemKey,\r\n horizontal = true,\r\n}: VirtualGridProps<T>) {\r\n const parentRef = useRef<HTMLDivElement>(null)\r\n\r\n const columnVirtualizer = useVirtualizer({\r\n horizontal,\r\n count: items.length,\r\n getScrollElement: () => parentRef.current,\r\n estimateSize: () => estimateColumnWidth,\r\n overscan,\r\n gap,\r\n })\r\n\r\n const virtualColumns = columnVirtualizer.getVirtualItems()\r\n\r\n const containerStyle: React.CSSProperties = {\r\n height: typeof height === 'number' ? `${height}px` : height,\r\n width: typeof width === 'number' ? `${width}px` : width,\r\n overflow: 'auto',\r\n position: 'relative',\r\n }\r\n\r\n const innerStyle: React.CSSProperties = {\r\n width: `${columnVirtualizer.getTotalSize()}px`,\r\n height: '100%',\r\n position: 'relative',\r\n }\r\n\r\n return (\r\n <div ref={parentRef} style={containerStyle} className={className}>\r\n <div style={innerStyle}>\r\n {virtualColumns.map((virtualColumn) => {\r\n const item = items[virtualColumn.index]\r\n if (!item) return null\r\n const key = getItemKey ? getItemKey(item, virtualColumn.index) : virtualColumn.index\r\n\r\n const columnStyle: React.CSSProperties = {\r\n position: 'absolute',\r\n top: 0,\r\n left: virtualColumn.start,\r\n width: virtualColumn.size,\r\n height: '100%',\r\n }\r\n\r\n return (\r\n <div key={key} style={columnStyle} data-index={virtualColumn.index}>\r\n {renderColumn(item, virtualColumn.index)}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/**\r\n * Hook for advanced 2D virtualization with both rows and columns\r\n */\r\nexport function useVirtualGrid<T>(options: {\r\n items: T[]\r\n scrollElement: HTMLElement | null\r\n estimateColumnWidth: number\r\n estimateRowHeight?: number\r\n overscan?: number\r\n gap?: number\r\n}) {\r\n const columnVirtualizer = useVirtualizer({\r\n horizontal: true,\r\n count: options.items.length,\r\n getScrollElement: () => options.scrollElement,\r\n estimateSize: () => options.estimateColumnWidth,\r\n overscan: options.overscan ?? 3,\r\n gap: options.gap ?? 0,\r\n })\r\n\r\n return {\r\n columnVirtualizer,\r\n virtualColumns: columnVirtualizer.getVirtualItems(),\r\n totalWidth: columnVirtualizer.getTotalSize(),\r\n }\r\n}\r\n\r\n/**\r\n * Utility to determine if grid should use virtualization\r\n */\r\nexport function shouldVirtualizeGrid(columnCount: number, threshold = 10): boolean {\r\n return columnCount > threshold\r\n}\r\n","/**\r\n * Design Tokens - Centralized design system tokens\r\n * @module tokens/design-tokens\r\n */\r\n\r\n/**\r\n * Spacing tokens (in pixels)\r\n */\r\nexport const spacing = {\r\n none: 0,\r\n xs: 4,\r\n sm: 8,\r\n md: 12,\r\n lg: 16,\r\n xl: 20,\r\n '2xl': 24,\r\n '3xl': 32,\r\n '4xl': 40,\r\n '5xl': 48,\r\n '6xl': 64,\r\n} as const\r\n\r\n/**\r\n * Border radius tokens (in pixels)\r\n */\r\nexport const borderRadius = {\r\n none: 0,\r\n sm: 4,\r\n md: 8,\r\n lg: 12,\r\n xl: 16,\r\n '2xl': 20,\r\n full: 9999,\r\n} as const\r\n\r\n/**\r\n * Font size tokens (in pixels)\r\n */\r\nexport const fontSize = {\r\n xs: 12,\r\n sm: 14,\r\n base: 16,\r\n lg: 18,\r\n xl: 20,\r\n '2xl': 24,\r\n '3xl': 30,\r\n '4xl': 36,\r\n '5xl': 48,\r\n} as const\r\n\r\n/**\r\n * Font weight tokens\r\n */\r\nexport const fontWeight = {\r\n light: 300,\r\n normal: 400,\r\n medium: 500,\r\n semibold: 600,\r\n bold: 700,\r\n extrabold: 800,\r\n} as const\r\n\r\n/**\r\n * Line height tokens\r\n */\r\nexport const lineHeight = {\r\n none: 1,\r\n tight: 1.25,\r\n snug: 1.375,\r\n normal: 1.5,\r\n relaxed: 1.625,\r\n loose: 2,\r\n} as const\r\n\r\n/**\r\n * Z-index layers\r\n */\r\nexport const zIndex = {\r\n base: 0,\r\n dropdown: 1000,\r\n sticky: 1020,\r\n fixed: 1030,\r\n modalBackdrop: 1040,\r\n modal: 1050,\r\n popover: 1060,\r\n tooltip: 1070,\r\n} as const\r\n\r\n/**\r\n * Transition durations (in milliseconds)\r\n */\r\nexport const duration = {\r\n instant: 0,\r\n fastest: 75,\r\n faster: 100,\r\n fast: 150,\r\n normal: 200,\r\n slow: 300,\r\n slower: 400,\r\n slowest: 500,\r\n} as const\r\n\r\n/**\r\n * Transition timing functions\r\n */\r\nexport const easing = {\r\n linear: 'linear',\r\n ease: 'ease',\r\n easeIn: 'ease-in',\r\n easeOut: 'ease-out',\r\n easeInOut: 'ease-in-out',\r\n // Custom cubic-bezier\r\n smooth: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\r\n sharp: 'cubic-bezier(0.4, 0.0, 0.6, 1)',\r\n bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\r\n} as const\r\n\r\n/**\r\n * Shadow tokens\r\n */\r\nexport const shadows = {\r\n none: 'none',\r\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\r\n base: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',\r\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\r\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\r\n xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',\r\n '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\r\n inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',\r\n} as const\r\n\r\n/**\r\n * Opacity tokens\r\n */\r\nexport const opacity = {\r\n 0: 0,\r\n 5: 0.05,\r\n 10: 0.1,\r\n 20: 0.2,\r\n 30: 0.3,\r\n 40: 0.4,\r\n 50: 0.5,\r\n 60: 0.6,\r\n 70: 0.7,\r\n 80: 0.8,\r\n 90: 0.9,\r\n 100: 1,\r\n} as const\r\n\r\n/**\r\n * Kanban-specific tokens\r\n */\r\nexport const kanban = {\r\n column: {\r\n width: 320,\r\n minWidth: 280,\r\n maxWidth: 400,\r\n gap: 16,\r\n padding: 12,\r\n headerHeight: 48,\r\n },\r\n card: {\r\n minHeight: 80,\r\n maxHeight: 400,\r\n padding: 12,\r\n gap: 8,\r\n },\r\n board: {\r\n padding: 16,\r\n gap: 16,\r\n },\r\n} as const\r\n\r\n/**\r\n * Gantt-specific tokens\r\n */\r\nexport const gantt = {\r\n timeline: {\r\n headerHeight: 60,\r\n rowHeight: 44,\r\n minRowHeight: 32,\r\n maxRowHeight: 80,\r\n taskPadding: 4,\r\n gridLineWidth: 1,\r\n },\r\n task: {\r\n height: 28,\r\n minHeight: 20,\r\n maxHeight: 40,\r\n borderRadius: 4,\r\n padding: 6,\r\n },\r\n dependency: {\r\n lineWidth: 2,\r\n arrowSize: 8,\r\n },\r\n scale: {\r\n day: {\r\n columnWidth: 40,\r\n minColumnWidth: 30,\r\n maxColumnWidth: 60,\r\n },\r\n week: {\r\n columnWidth: 80,\r\n minColumnWidth: 60,\r\n maxColumnWidth: 120,\r\n },\r\n month: {\r\n columnWidth: 120,\r\n minColumnWidth: 80,\r\n maxColumnWidth: 200,\r\n },\r\n quarter: {\r\n columnWidth: 200,\r\n minColumnWidth: 150,\r\n maxColumnWidth: 300,\r\n },\r\n },\r\n milestone: {\r\n size: 16,\r\n rotation: 45, // degrees\r\n },\r\n} as const\r\n\r\n/**\r\n * Combined design tokens\r\n */\r\nexport const designTokens = {\r\n spacing,\r\n borderRadius,\r\n fontSize,\r\n fontWeight,\r\n lineHeight,\r\n zIndex,\r\n duration,\r\n easing,\r\n shadows,\r\n opacity,\r\n kanban,\r\n gantt,\r\n} as const\r\n\r\n/**\r\n * Type helpers\r\n */\r\nexport type SpacingToken = keyof typeof spacing\r\nexport type BorderRadiusToken = keyof typeof borderRadius\r\nexport type FontSizeToken = keyof typeof fontSize\r\nexport type FontWeightToken = keyof typeof fontWeight\r\nexport type LineHeightToken = keyof typeof lineHeight\r\nexport type ZIndexToken = keyof typeof zIndex\r\nexport type DurationToken = keyof typeof duration\r\nexport type EasingToken = keyof typeof easing\r\nexport type ShadowToken = keyof typeof shadows\r\nexport type OpacityToken = keyof typeof opacity\r\n\r\n/**\r\n * Design token value types\r\n */\r\nexport type DesignTokens = typeof designTokens\r\nexport type TokenValue = string | number\r\n\r\n/**\r\n * Utility to get token value with fallback\r\n */\r\nexport function getToken<T extends TokenValue>(\r\n tokens: Record<string, T>,\r\n key: string,\r\n fallback: T\r\n): T {\r\n return tokens[key] ?? fallback\r\n}\r\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: '#3b82f6',\r\n },\r\n priority: {\r\n low: '#6b7280',\r\n medium: '#3b82f6',\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: '#3b82f6',\r\n taskBorder: '#2563eb',\r\n criticalPath: '#ef4444',\r\n milestone: '#8b5cf6',\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: '#2563eb',\r\n },\r\n priority: {\r\n low: '#9ca3af',\r\n medium: '#3b82f6',\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: '#3b82f6',\r\n taskBorder: '#2563eb',\r\n criticalPath: '#ef4444',\r\n milestone: '#8b5cf6',\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: '#3b82f6',\r\n },\r\n priority: {\r\n low: '#71717a',\r\n medium: '#3b82f6',\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: '#3b82f6',\r\n taskBorder: '#2563eb',\r\n criticalPath: '#ef4444',\r\n milestone: '#8b5cf6',\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","/**\r\n * Theme Switcher Component\r\n * ASAKAA v0.5.0\r\n */\r\n\r\nimport { useTheme } from './ThemeProvider'\r\nimport type { ThemeName } from './types'\r\nimport './theme-switcher.css'\r\n\r\nexport interface ThemeSwitcherProps {\r\n /** Show labels for each theme */\r\n showLabels?: boolean\r\n /** Compact mode (icon-only) */\r\n compact?: boolean\r\n /** Custom class name */\r\n className?: string\r\n}\r\n\r\n// Theme Icon Components with explicit SVG\r\nconst ThemeIcon = ({ theme }: { theme: ThemeName }) => {\r\n switch (theme) {\r\n case 'dark':\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 <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\"/>\r\n </svg>\r\n )\r\n case 'light':\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=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\r\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\"/>\r\n </svg>\r\n )\r\n case 'neutral':\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=\"currentColor\" strokeWidth=\"1.5\"/>\r\n <path d=\"M5 8L8 8L8 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\r\n </svg>\r\n )\r\n }\r\n}\r\n\r\nexport function ThemeSwitcher({ showLabels = true, compact = false, className = '' }: ThemeSwitcherProps) {\r\n const { theme: currentTheme, setTheme, themes } = useTheme()\r\n\r\n return (\r\n <div className={`theme-switcher ${compact ? 'theme-switcher--compact' : ''} ${className}`}>\r\n {Object.entries(themes).map(([key, themeData]) => {\r\n const themeName = key as ThemeName\r\n const isActive = themeName === currentTheme\r\n\r\n return (\r\n <button\r\n key={themeName}\r\n onClick={() => setTheme(themeName)}\r\n className={`theme-switcher__button ${isActive ? 'theme-switcher__button--active' : ''}`}\r\n aria-label={`Switch to ${themeData.displayName} theme`}\r\n aria-pressed={isActive}\r\n title={themeData.displayName}\r\n >\r\n <span className=\"theme-switcher__icon\" aria-hidden=\"true\">\r\n <ThemeIcon theme={themeName} />\r\n </span>\r\n {showLabels && !compact && <span className=\"theme-switcher__label\">{themeData.displayName}</span>}\r\n </button>\r\n )\r\n })}\r\n </div>\r\n )\r\n}\r\n"]}
|