@etus/ui 0.4.0-beta.11 → 0.4.0-beta.12

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.
Files changed (88) hide show
  1. package/dist/{chunk-7B577M5O.js → chunk-2YSZPUQZ.js} +3 -3
  2. package/dist/{chunk-7B577M5O.js.map → chunk-2YSZPUQZ.js.map} +1 -1
  3. package/dist/{chunk-IHW6IJE5.js → chunk-3NLWCX2F.js} +3 -3
  4. package/dist/{chunk-IHW6IJE5.js.map → chunk-3NLWCX2F.js.map} +1 -1
  5. package/dist/{chunk-WOOBWQHY.js → chunk-3NSIUZGP.js} +3 -3
  6. package/dist/{chunk-WOOBWQHY.js.map → chunk-3NSIUZGP.js.map} +1 -1
  7. package/dist/{chunk-Y6ZXHHUS.js → chunk-3W7FXRO5.js} +3 -3
  8. package/dist/{chunk-Y6ZXHHUS.js.map → chunk-3W7FXRO5.js.map} +1 -1
  9. package/dist/{chunk-2TAFX4RZ.js → chunk-7GCTZEMK.js} +3 -3
  10. package/dist/{chunk-2TAFX4RZ.js.map → chunk-7GCTZEMK.js.map} +1 -1
  11. package/dist/{chunk-6TBA37U7.js → chunk-7TF5PVEU.js} +6 -6
  12. package/dist/chunk-7TF5PVEU.js.map +1 -0
  13. package/dist/{chunk-HANDVWJA.js → chunk-BS5XDYOE.js} +3 -3
  14. package/dist/{chunk-HANDVWJA.js.map → chunk-BS5XDYOE.js.map} +1 -1
  15. package/dist/{chunk-DQ43X75Q.js → chunk-EYSTEGV5.js} +4 -4
  16. package/dist/{chunk-DQ43X75Q.js.map → chunk-EYSTEGV5.js.map} +1 -1
  17. package/dist/{chunk-7SPMPMXE.js → chunk-GGUWEAYD.js} +3 -3
  18. package/dist/{chunk-7SPMPMXE.js.map → chunk-GGUWEAYD.js.map} +1 -1
  19. package/dist/{chunk-RRORYKXT.js → chunk-LLI3JFJL.js} +4 -4
  20. package/dist/{chunk-RRORYKXT.js.map → chunk-LLI3JFJL.js.map} +1 -1
  21. package/dist/{chunk-RN4WIA4D.js → chunk-OBRJXVWO.js} +3 -3
  22. package/dist/{chunk-RN4WIA4D.js.map → chunk-OBRJXVWO.js.map} +1 -1
  23. package/dist/{chunk-36LMNJKG.js → chunk-P27ERD6W.js} +4 -4
  24. package/dist/{chunk-36LMNJKG.js.map → chunk-P27ERD6W.js.map} +1 -1
  25. package/dist/{chunk-FBFP6LWC.js → chunk-P7D6S6GX.js} +3 -3
  26. package/dist/{chunk-FBFP6LWC.js.map → chunk-P7D6S6GX.js.map} +1 -1
  27. package/dist/{chunk-K3QIPEIV.js → chunk-R3HUGCGR.js} +3 -3
  28. package/dist/{chunk-K3QIPEIV.js.map → chunk-R3HUGCGR.js.map} +1 -1
  29. package/dist/{chunk-42RY5GAT.js → chunk-SUU3HNOX.js} +3 -3
  30. package/dist/{chunk-42RY5GAT.js.map → chunk-SUU3HNOX.js.map} +1 -1
  31. package/dist/{chunk-WDPGJHLV.js → chunk-SXPBKGLT.js} +3 -3
  32. package/dist/{chunk-WDPGJHLV.js.map → chunk-SXPBKGLT.js.map} +1 -1
  33. package/dist/{chunk-VNAC3RM2.js → chunk-T6XRYT6Q.js} +3 -3
  34. package/dist/{chunk-VNAC3RM2.js.map → chunk-T6XRYT6Q.js.map} +1 -1
  35. package/dist/{chunk-R52QIEJZ.js → chunk-UYC7M3FM.js} +3 -3
  36. package/dist/{chunk-R52QIEJZ.js.map → chunk-UYC7M3FM.js.map} +1 -1
  37. package/dist/{chunk-KO3R4JFH.js → chunk-VLDAHAG6.js} +3 -3
  38. package/dist/{chunk-KO3R4JFH.js.map → chunk-VLDAHAG6.js.map} +1 -1
  39. package/dist/{chunk-OWLYSN7L.js → chunk-W7S7GPU5.js} +3 -3
  40. package/dist/{chunk-OWLYSN7L.js.map → chunk-W7S7GPU5.js.map} +1 -1
  41. package/dist/{chunk-Z2RO42XL.js → chunk-WXBC3D2N.js} +4 -4
  42. package/dist/{chunk-Z2RO42XL.js.map → chunk-WXBC3D2N.js.map} +1 -1
  43. package/dist/{chunk-DCUFQJYP.js → chunk-Y4RKKQMB.js} +14 -5
  44. package/dist/chunk-Y4RKKQMB.js.map +1 -0
  45. package/dist/{chunk-ZUNG2RTQ.js → chunk-YUHPTV2A.js} +3 -3
  46. package/dist/{chunk-ZUNG2RTQ.js.map → chunk-YUHPTV2A.js.map} +1 -1
  47. package/dist/{chunk-Z46KLLW2.js → chunk-ZP4HYVDG.js} +3 -3
  48. package/dist/{chunk-Z46KLLW2.js.map → chunk-ZP4HYVDG.js.map} +1 -1
  49. package/dist/components/advanced/Calendar/index.js +2 -2
  50. package/dist/components/advanced/EventCalendar/index.js +2 -2
  51. package/dist/components/advanced/FilterBuilder/index.js +2 -2
  52. package/dist/components/advanced/index.js +5 -5
  53. package/dist/components/data-display/Carousel/index.js +2 -2
  54. package/dist/components/data-display/DashboardFilterbar/index.js +3 -3
  55. package/dist/components/data-display/DataTable/FilterBuilder/index.js +2 -2
  56. package/dist/components/data-display/DataTable/index.js +3 -3
  57. package/dist/components/data-display/ImageGallery/index.js +3 -3
  58. package/dist/components/data-display/index.js +13 -13
  59. package/dist/components/feedback/AlertDialog/index.js +2 -2
  60. package/dist/components/feedback/ConfirmModal/index.js +3 -3
  61. package/dist/components/feedback/index.js +5 -5
  62. package/dist/components/forms/DatePicker/index.js +3 -3
  63. package/dist/components/forms/DateRangePicker/index.js +3 -3
  64. package/dist/components/forms/InputGroup/index.js +2 -2
  65. package/dist/components/forms/index.js +9 -9
  66. package/dist/components/index.js +47 -47
  67. package/dist/components/navigation/MobileSidebar/index.js +1 -1
  68. package/dist/components/navigation/Pagination/index.js +2 -2
  69. package/dist/components/navigation/Sidebar/index.js +2 -2
  70. package/dist/components/navigation/index.js +6 -6
  71. package/dist/components/primitives/Button/index.js +1 -1
  72. package/dist/components/primitives/ConfirmButton/index.js +3 -3
  73. package/dist/components/primitives/Tag/index.js +1 -1
  74. package/dist/components/primitives/index.js +9 -9
  75. package/dist/components/workflow/ApprovalFlow/index.js +2 -2
  76. package/dist/components/workflow/CommentSystem/index.js +2 -2
  77. package/dist/components/workflow/Dashboard/index.js +2 -2
  78. package/dist/components/workflow/DashboardBuilder/index.js +2 -2
  79. package/dist/components/workflow/KanbanBoard/index.js +2 -2
  80. package/dist/components/workflow/ReportGenerator/index.js +2 -2
  81. package/dist/components/workflow/Wizard/index.js +2 -2
  82. package/dist/components/workflow/index.js +9 -9
  83. package/dist/index.d.ts +5 -2
  84. package/dist/index.js +47 -47
  85. package/dist/styles.css +65 -28
  86. package/package.json +2 -2
  87. package/dist/chunk-6TBA37U7.js.map +0 -1
  88. package/dist/chunk-DCUFQJYP.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/ConfirmButton/ConfirmButton.tsx"],"names":[],"mappings":"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","file":"chunk-RRORYKXT.js","sourcesContent":["\"use client\"\n\nimport type { ConfirmButtonProps } from \"./ConfirmButton.types\"\n\nimport { LoaderCircle } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"../../feedback/AlertDialog\"\nimport { buttonVariants } from \"../Button\"\n\n/**\n * ConfirmButton - A button that requires confirmation before executing an action\n *\n * Combines a Button trigger with an AlertDialog for confirmation.\n * Supports typing validation for critical actions.\n *\n * @example\n * ```tsx\n * <ConfirmButton\n * variant=\"destructive\"\n * confirmTitle=\"Delete item?\"\n * confirmDescription=\"This action cannot be undone.\"\n * onConfirm={() => handleDelete()}\n * >\n * Delete\n * </ConfirmButton>\n * ```\n */\nfunction ConfirmButton({\n // Trigger button props\n className,\n variant,\n size,\n leftIcon,\n rightIcon,\n disabled,\n children,\n\n // Dialog configuration\n confirmTitle = \"Confirm action\",\n confirmDescription,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n confirmVariant = \"default\",\n\n // Typing validation\n requireTyping,\n typingPlaceholder,\n typingLabel,\n caseSensitive = true,\n\n // States\n loading = false,\n open: controlledOpen,\n onOpenChange: controlledOnOpenChange,\n\n // Callbacks\n onConfirm,\n onCancel,\n\n ...props\n}: ConfirmButtonProps) {\n // Internal open state (uncontrolled mode)\n const [internalOpen, setInternalOpen] = React.useState(false)\n\n // Typing input value\n const [typingValue, setTypingValue] = React.useState(\"\")\n\n // Internal loading state for async onConfirm\n const [isConfirming, setIsConfirming] = React.useState(false)\n\n // Prevent double confirmation\n const confirmingRef = React.useRef(false)\n\n // Determine if controlled or uncontrolled\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? controlledOpen : internalOpen\n const setOpen = React.useCallback(\n (value: boolean) => {\n if (isControlled) {\n controlledOnOpenChange?.(value)\n } else {\n setInternalOpen(value)\n }\n },\n [isControlled, controlledOnOpenChange]\n )\n\n // Track previous open state to reset typing during render (avoids useEffect anti-pattern)\n const prevOpenRef = React.useRef(open)\n if (prevOpenRef.current !== open) {\n prevOpenRef.current = open\n if (!open) {\n setTypingValue(\"\")\n confirmingRef.current = false\n }\n }\n\n // Check if typing matches requirement\n const typingMatches = React.useMemo(() => {\n if (!requireTyping) return true\n\n if (caseSensitive) {\n return typingValue === requireTyping\n }\n return typingValue.toLowerCase() === requireTyping.toLowerCase()\n }, [requireTyping, typingValue, caseSensitive])\n\n // Combined loading state\n const isLoading = loading || isConfirming\n\n // Confirm button should be disabled when loading or typing doesn't match\n const confirmDisabled = isLoading || !typingMatches\n\n // Track if cancel was triggered by button click\n const cancelTriggeredRef = React.useRef(false)\n\n // Handle dialog open change\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n // Don't allow closing while confirming\n if (isConfirming && !newOpen) return\n\n setOpen(newOpen)\n\n // Only call onCancel if dialog is closing and cancel wasn't already triggered\n if (!newOpen && !cancelTriggeredRef.current) {\n onCancel?.()\n }\n\n // Reset the flag after processing\n cancelTriggeredRef.current = false\n },\n [setOpen, onCancel, isConfirming]\n )\n\n // Handle cancel button click\n const handleCancel = React.useCallback(() => {\n cancelTriggeredRef.current = true\n onCancel?.()\n setOpen(false)\n }, [setOpen, onCancel])\n\n // Handle confirm button click\n const handleConfirm = React.useCallback(\n async (event: React.MouseEvent) => {\n // Prevent default AlertDialog behavior (auto-close)\n event.preventDefault()\n\n // Prevent double confirmation\n if (confirmingRef.current) return\n confirmingRef.current = true\n\n setIsConfirming(true)\n\n try {\n await onConfirm()\n // Close dialog on success\n setOpen(false)\n } catch {\n // Keep dialog open on error, allow retry\n confirmingRef.current = false\n // Error is not rethrown - caller should handle errors in onConfirm\n } finally {\n setIsConfirming(false)\n }\n },\n [onConfirm, setOpen]\n )\n\n // Render trigger button content\n const renderTriggerContent = () => (\n <>\n {leftIcon && (\n <span aria-hidden=\"true\" data-slot=\"left-icon\">\n {leftIcon}\n </span>\n )}\n {children}\n {rightIcon && (\n <span aria-hidden=\"true\" data-slot=\"right-icon\">\n {rightIcon}\n </span>\n )}\n </>\n )\n\n return (\n <AlertDialog open={open} onOpenChange={handleOpenChange}>\n <AlertDialogTrigger asChild>\n <button\n aria-disabled={disabled ?? undefined}\n className={cn(buttonVariants({ variant, size, className }))}\n data-slot=\"confirm-button\"\n disabled={disabled}\n type=\"button\"\n {...props}\n >\n {renderTriggerContent()}\n </button>\n </AlertDialogTrigger>\n\n <AlertDialogContent data-slot=\"confirm-dialog\">\n <AlertDialogHeader data-slot=\"confirm-dialog-header\">\n <AlertDialogTitle data-slot=\"confirm-dialog-title\">\n {confirmTitle}\n </AlertDialogTitle>\n {confirmDescription ? (\n <AlertDialogDescription data-slot=\"confirm-dialog-description\">\n {confirmDescription}\n </AlertDialogDescription>\n ) : (\n <AlertDialogDescription className=\"sr-only\">\n Confirm or cancel this action.\n </AlertDialogDescription>\n )}\n </AlertDialogHeader>\n\n {requireTyping && (\n <div className=\"space-y-2\" data-slot=\"confirm-dialog-content\">\n {typingLabel && (\n <label\n className=\"text-sm font-medium text-foreground\"\n htmlFor=\"confirm-typing-input\"\n >\n {typingLabel}\n </label>\n )}\n <input\n aria-describedby={\n !typingMatches ? \"confirm-typing-error\" : undefined\n }\n autoComplete=\"off\"\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n data-slot=\"confirm-dialog-input\"\n id=\"confirm-typing-input\"\n placeholder={typingPlaceholder ?? requireTyping}\n type=\"text\"\n value={typingValue}\n onChange={(e) => { setTypingValue(e.target.value); }}\n />\n {typingValue && !typingMatches && (\n <p\n aria-live=\"polite\"\n className=\"text-sm text-destructive\"\n id=\"confirm-typing-error\"\n >\n The text you entered does not match.\n </p>\n )}\n </div>\n )}\n\n <AlertDialogFooter data-slot=\"confirm-dialog-footer\">\n <AlertDialogCancel\n data-slot=\"confirm-dialog-cancel\"\n disabled={isLoading}\n onClick={handleCancel}\n >\n {cancelLabel}\n </AlertDialogCancel>\n <AlertDialogAction\n className={cn(\n confirmVariant === \"destructive\" &&\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40\"\n )}\n aria-busy={isLoading || undefined}\n aria-disabled={confirmDisabled || undefined}\n data-slot=\"confirm-dialog-confirm\"\n disabled={confirmDisabled}\n onClick={(e) => { void handleConfirm(e); }}\n >\n {isLoading && (\n <LoaderCircle\n aria-hidden=\"true\"\n className=\"size-4 animate-spin\"\n />\n )}\n {confirmLabel}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )\n}\n\nexport { ConfirmButton }\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/ConfirmButton/ConfirmButton.tsx"],"names":[],"mappings":"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","file":"chunk-LLI3JFJL.js","sourcesContent":["\"use client\"\n\nimport type { ConfirmButtonProps } from \"./ConfirmButton.types\"\n\nimport { LoaderCircle } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"../../feedback/AlertDialog\"\nimport { buttonVariants } from \"../Button\"\n\n/**\n * ConfirmButton - A button that requires confirmation before executing an action\n *\n * Combines a Button trigger with an AlertDialog for confirmation.\n * Supports typing validation for critical actions.\n *\n * @example\n * ```tsx\n * <ConfirmButton\n * variant=\"destructive\"\n * confirmTitle=\"Delete item?\"\n * confirmDescription=\"This action cannot be undone.\"\n * onConfirm={() => handleDelete()}\n * >\n * Delete\n * </ConfirmButton>\n * ```\n */\nfunction ConfirmButton({\n // Trigger button props\n className,\n variant,\n size,\n leftIcon,\n rightIcon,\n disabled,\n children,\n\n // Dialog configuration\n confirmTitle = \"Confirm action\",\n confirmDescription,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n confirmVariant = \"default\",\n\n // Typing validation\n requireTyping,\n typingPlaceholder,\n typingLabel,\n caseSensitive = true,\n\n // States\n loading = false,\n open: controlledOpen,\n onOpenChange: controlledOnOpenChange,\n\n // Callbacks\n onConfirm,\n onCancel,\n\n ...props\n}: ConfirmButtonProps) {\n // Internal open state (uncontrolled mode)\n const [internalOpen, setInternalOpen] = React.useState(false)\n\n // Typing input value\n const [typingValue, setTypingValue] = React.useState(\"\")\n\n // Internal loading state for async onConfirm\n const [isConfirming, setIsConfirming] = React.useState(false)\n\n // Prevent double confirmation\n const confirmingRef = React.useRef(false)\n\n // Determine if controlled or uncontrolled\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? controlledOpen : internalOpen\n const setOpen = React.useCallback(\n (value: boolean) => {\n if (isControlled) {\n controlledOnOpenChange?.(value)\n } else {\n setInternalOpen(value)\n }\n },\n [isControlled, controlledOnOpenChange]\n )\n\n // Track previous open state to reset typing during render (avoids useEffect anti-pattern)\n const prevOpenRef = React.useRef(open)\n if (prevOpenRef.current !== open) {\n prevOpenRef.current = open\n if (!open) {\n setTypingValue(\"\")\n confirmingRef.current = false\n }\n }\n\n // Check if typing matches requirement\n const typingMatches = React.useMemo(() => {\n if (!requireTyping) return true\n\n if (caseSensitive) {\n return typingValue === requireTyping\n }\n return typingValue.toLowerCase() === requireTyping.toLowerCase()\n }, [requireTyping, typingValue, caseSensitive])\n\n // Combined loading state\n const isLoading = loading || isConfirming\n\n // Confirm button should be disabled when loading or typing doesn't match\n const confirmDisabled = isLoading || !typingMatches\n\n // Track if cancel was triggered by button click\n const cancelTriggeredRef = React.useRef(false)\n\n // Handle dialog open change\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n // Don't allow closing while confirming\n if (isConfirming && !newOpen) return\n\n setOpen(newOpen)\n\n // Only call onCancel if dialog is closing and cancel wasn't already triggered\n if (!newOpen && !cancelTriggeredRef.current) {\n onCancel?.()\n }\n\n // Reset the flag after processing\n cancelTriggeredRef.current = false\n },\n [setOpen, onCancel, isConfirming]\n )\n\n // Handle cancel button click\n const handleCancel = React.useCallback(() => {\n cancelTriggeredRef.current = true\n onCancel?.()\n setOpen(false)\n }, [setOpen, onCancel])\n\n // Handle confirm button click\n const handleConfirm = React.useCallback(\n async (event: React.MouseEvent) => {\n // Prevent default AlertDialog behavior (auto-close)\n event.preventDefault()\n\n // Prevent double confirmation\n if (confirmingRef.current) return\n confirmingRef.current = true\n\n setIsConfirming(true)\n\n try {\n await onConfirm()\n // Close dialog on success\n setOpen(false)\n } catch {\n // Keep dialog open on error, allow retry\n confirmingRef.current = false\n // Error is not rethrown - caller should handle errors in onConfirm\n } finally {\n setIsConfirming(false)\n }\n },\n [onConfirm, setOpen]\n )\n\n // Render trigger button content\n const renderTriggerContent = () => (\n <>\n {leftIcon && (\n <span aria-hidden=\"true\" data-slot=\"left-icon\">\n {leftIcon}\n </span>\n )}\n {children}\n {rightIcon && (\n <span aria-hidden=\"true\" data-slot=\"right-icon\">\n {rightIcon}\n </span>\n )}\n </>\n )\n\n return (\n <AlertDialog open={open} onOpenChange={handleOpenChange}>\n <AlertDialogTrigger asChild>\n <button\n aria-disabled={disabled ?? undefined}\n className={cn(buttonVariants({ variant, size, className }))}\n data-slot=\"confirm-button\"\n disabled={disabled}\n type=\"button\"\n {...props}\n >\n {renderTriggerContent()}\n </button>\n </AlertDialogTrigger>\n\n <AlertDialogContent data-slot=\"confirm-dialog\">\n <AlertDialogHeader data-slot=\"confirm-dialog-header\">\n <AlertDialogTitle data-slot=\"confirm-dialog-title\">\n {confirmTitle}\n </AlertDialogTitle>\n {confirmDescription ? (\n <AlertDialogDescription data-slot=\"confirm-dialog-description\">\n {confirmDescription}\n </AlertDialogDescription>\n ) : (\n <AlertDialogDescription className=\"sr-only\">\n Confirm or cancel this action.\n </AlertDialogDescription>\n )}\n </AlertDialogHeader>\n\n {requireTyping && (\n <div className=\"space-y-2\" data-slot=\"confirm-dialog-content\">\n {typingLabel && (\n <label\n className=\"text-sm font-medium text-foreground\"\n htmlFor=\"confirm-typing-input\"\n >\n {typingLabel}\n </label>\n )}\n <input\n aria-describedby={\n !typingMatches ? \"confirm-typing-error\" : undefined\n }\n autoComplete=\"off\"\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n data-slot=\"confirm-dialog-input\"\n id=\"confirm-typing-input\"\n placeholder={typingPlaceholder ?? requireTyping}\n type=\"text\"\n value={typingValue}\n onChange={(e) => { setTypingValue(e.target.value); }}\n />\n {typingValue && !typingMatches && (\n <p\n aria-live=\"polite\"\n className=\"text-sm text-destructive\"\n id=\"confirm-typing-error\"\n >\n The text you entered does not match.\n </p>\n )}\n </div>\n )}\n\n <AlertDialogFooter data-slot=\"confirm-dialog-footer\">\n <AlertDialogCancel\n data-slot=\"confirm-dialog-cancel\"\n disabled={isLoading}\n onClick={handleCancel}\n >\n {cancelLabel}\n </AlertDialogCancel>\n <AlertDialogAction\n className={cn(\n confirmVariant === \"destructive\" &&\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40\"\n )}\n aria-busy={isLoading || undefined}\n aria-disabled={confirmDisabled || undefined}\n data-slot=\"confirm-dialog-confirm\"\n disabled={confirmDisabled}\n onClick={(e) => { void handleConfirm(e); }}\n >\n {isLoading && (\n <LoaderCircle\n aria-hidden=\"true\"\n className=\"size-4 animate-spin\"\n />\n )}\n {confirmLabel}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )\n}\n\nexport { ConfirmButton }\n"]}
@@ -1,6 +1,6 @@
1
1
  import { DndContext, DragOverlay, Droppable, SortableItem, DragHandle } from './chunk-BIUVOZQG.js';
2
2
  import { Avatar, AvatarImage, AvatarFallback } from './chunk-3BBOSSDG.js';
3
- import { Button } from './chunk-6TBA37U7.js';
3
+ import { Button } from './chunk-7TF5PVEU.js';
4
4
  import { Badge } from './chunk-4GVOOXYD.js';
5
5
  import { cn } from './chunk-HRNDJU7D.js';
6
6
  import { SortableContext, horizontalListSortingStrategy, verticalListSortingStrategy } from '@dnd-kit/sortable';
@@ -849,5 +849,5 @@ function KanbanBoard({
849
849
  }
850
850
 
851
851
  export { KanbanBoard, KanbanCard, kanbanAddButtonVariants, kanbanBoardVariants, kanbanCardDescriptionVariants, kanbanCardMetaVariants, kanbanCardTitleVariants, kanbanCardVariants, kanbanColumnContentVariants, kanbanColumnHeaderVariants, kanbanColumnVariants, kanbanDropIndicatorVariants, kanbanLabelVariants, kanbanSearchVariants, kanbanSwimlaneVariants };
852
- //# sourceMappingURL=chunk-RN4WIA4D.js.map
853
- //# sourceMappingURL=chunk-RN4WIA4D.js.map
852
+ //# sourceMappingURL=chunk-OBRJXVWO.js.map
853
+ //# sourceMappingURL=chunk-OBRJXVWO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/workflow/KanbanBoard/KanbanBoard.variants.ts","../src/components/workflow/KanbanBoard/KanbanBoard.tsx"],"names":["activeItem"],"mappings":"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","file":"chunk-RN4WIA4D.js","sourcesContent":["import { cva } from \"class-variance-authority\"\n\n/* eslint-disable sonarjs/no-duplicate-string -- CVA variants require repeated class patterns */\n\n/**\n * Board container variants\n */\nexport const kanbanBoardVariants = cva(\n [\n \"flex\",\n \"w-full\",\n \"min-w-0\",\n \"gap-4\",\n \"p-4\",\n \"bg-muted/30\",\n \"rounded-lg\",\n \"overflow-x-auto\",\n ],\n {\n defaultVariants: {\n layout: \"horizontal\",\n variant: \"default\",\n },\n variants: {\n layout: {\n horizontal: \"flex-row\",\n vertical: \"flex-col\",\n },\n variant: {\n collapsed: \"\",\n compact: \"[&_[data-slot=kanban-card]]:p-2 [&_[data-slot=kanban-column]]:w-60\",\n default: \"\",\n swimlanes: \"flex-col gap-6\",\n },\n },\n }\n)\n\n/**\n * Column container variants\n */\nexport const kanbanColumnVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"rounded-lg\",\n \"bg-muted/50\",\n \"min-h-52\",\n ],\n {\n defaultVariants: {\n isCollapsed: false,\n isOver: false,\n },\n variants: {\n isCollapsed: {\n false: \"w-72\",\n true: \"w-12\",\n },\n isOver: {\n false: \"\",\n true: \"ring-2 ring-primary/50 bg-primary/5\",\n },\n },\n }\n)\n\n/**\n * Column header variants\n */\nexport const kanbanColumnHeaderVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"justify-between\",\n \"gap-2\",\n \"p-3\",\n \"bg-card\",\n \"rounded-t-lg\",\n \"border-b\",\n ],\n {\n defaultVariants: {\n wipStatus: \"normal\",\n },\n variants: {\n wipStatus: {\n exceeded: \"[&_[data-slot=wip-indicator]]:text-destructive\",\n normal: \"\",\n warning: \"[&_[data-slot=wip-indicator]]:text-warning\",\n },\n },\n }\n)\n\n/**\n * Column content (cards area) variants\n */\nexport const kanbanColumnContentVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"flex-1\",\n \"gap-2\",\n \"p-2\",\n \"min-h-24\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Kanban card variants\n */\nexport const kanbanCardVariants = cva(\n [\n \"group\",\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"p-3\",\n \"bg-card\",\n \"rounded-md\",\n \"border\",\n \"shadow-sm\",\n \"cursor-pointer\",\n \"transition-all\",\n \"duration-200\",\n \"hover:shadow-md\",\n \"hover:border-primary/30\",\n ],\n {\n defaultVariants: {\n isDragging: false,\n priority: null,\n },\n variants: {\n isDragging: {\n false: \"\",\n true: \"opacity-50 ring-2 ring-primary shadow-lg\",\n },\n priority: {\n high: \"border-l-4 border-l-orange-500\",\n low: \"border-l-4 border-l-gray-400\",\n medium: \"border-l-4 border-l-yellow-500\",\n null: \"\",\n urgent: \"border-l-4 border-l-destructive\",\n },\n },\n }\n)\n\n/**\n * Card title variants\n */\nexport const kanbanCardTitleVariants = cva(\n [\n \"text-sm\",\n \"font-medium\",\n \"text-foreground\",\n \"line-clamp-2\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Card description variants\n */\nexport const kanbanCardDescriptionVariants = cva(\n [\n \"text-xs\",\n \"text-muted-foreground\",\n \"line-clamp-2\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Card metadata row variants\n */\nexport const kanbanCardMetaVariants = cva(\n [\n \"flex\",\n \"flex-wrap\",\n \"items-center\",\n \"gap-2\",\n \"text-xs\",\n \"text-muted-foreground\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Label badge variants\n */\nexport const kanbanLabelVariants = cva(\n [\n \"inline-flex\",\n \"items-center\",\n \"px-1.5\",\n \"py-0.5\",\n \"rounded-sm\",\n \"text-xs\",\n \"font-medium\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Drop indicator variants\n */\nexport const kanbanDropIndicatorVariants = cva(\n [\n \"h-1\",\n \"rounded-full\",\n \"bg-primary/20\",\n \"border\",\n \"border-primary\",\n \"transition-opacity\",\n ],\n {\n defaultVariants: {\n isVisible: false,\n },\n variants: {\n isVisible: {\n false: \"opacity-0\",\n true: \"opacity-100\",\n },\n },\n }\n)\n\n/**\n * Add button variants\n */\nexport const kanbanAddButtonVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"gap-1\",\n \"w-full\",\n \"p-2\",\n \"text-sm\",\n \"text-muted-foreground\",\n \"rounded-md\",\n \"border\",\n \"border-dashed\",\n \"hover:bg-muted/50\",\n \"hover:text-foreground\",\n \"transition-colors\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Swimlane header variants\n */\nexport const kanbanSwimlaneVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"p-3\",\n \"rounded-lg\",\n \"bg-muted/20\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Search input variants\n */\nexport const kanbanSearchVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"gap-2\",\n \"px-3\",\n \"py-2\",\n \"bg-background\",\n \"border\",\n \"rounded-md\",\n \"focus-within:ring-2\",\n \"focus-within:ring-primary/50\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n","import type {\n KanbanBoardProps,\n KanbanCardProps,\n KanbanColumn,\n KanbanColumnProps,\n KanbanItem,\n} from \"./KanbanBoard.types\"\nimport type { DragEndEvent, DragOverEvent, DragStartEvent, UniqueIdentifier } from \"@dnd-kit/core\"\nimport type { KeyboardEvent } from \"react\"\n\nimport { horizontalListSortingStrategy, SortableContext, verticalListSortingStrategy } from \"@dnd-kit/sortable\"\nimport {\n Calendar,\n ChevronDown,\n ChevronRight,\n GripVertical,\n MessageSquare,\n Paperclip,\n Plus,\n Search,\n} from \"lucide-react\"\nimport { useId, useMemo, useState } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n DndContext,\n DragHandle,\n DragOverlay,\n Droppable,\n SortableItem,\n} from \"../../advanced/DragAndDrop\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../primitives/Avatar\"\nimport { Badge } from \"../../primitives/Badge\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n kanbanAddButtonVariants,\n kanbanBoardVariants,\n kanbanCardDescriptionVariants,\n kanbanCardMetaVariants,\n kanbanCardTitleVariants,\n kanbanCardVariants,\n kanbanColumnContentVariants,\n kanbanColumnHeaderVariants,\n kanbanColumnVariants,\n kanbanLabelVariants,\n kanbanSearchVariants,\n} from \"./KanbanBoard.variants\"\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\n/**\n * Get initials from a name\n */\nfunction getInitials(name: string): string {\n return name\n .split(\" \")\n .map((part) => part[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2)\n}\n\n/**\n * Format date for display\n */\nfunction formatDueDate(date: Date): string {\n const now = new Date()\n const diff = date.getTime() - now.getTime()\n const days = Math.ceil(diff / (1000 * 60 * 60 * 24))\n\n if (days < 0) return \"Overdue\"\n if (days === 0) return \"Today\"\n if (days === 1) return \"Tomorrow\"\n if (days <= 7) return `${String(days)} days`\n return date.toLocaleDateString()\n}\n\n/**\n * Get WIP status for column\n */\nfunction getWipStatus(\n itemCount: number,\n wipLimit?: number\n): \"exceeded\" | \"normal\" | \"warning\" {\n if (!wipLimit) return \"normal\"\n if (itemCount >= wipLimit) return \"exceeded\"\n if (itemCount >= wipLimit - 1) return \"warning\"\n return \"normal\"\n}\n\n// ============================================\n// KANBAN CARD\n// ============================================\n\n/**\n * KanbanCard displays an individual task item\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity -- Complexity inherent to rendering multiple optional card elements\nfunction KanbanCard({\n className,\n isDragging = false,\n item,\n onClick,\n onDelete: _onDelete,\n}: KanbanCardProps) {\n const cardId = useId()\n const hasMeta = Boolean(\n item.assignees?.length ??\n item.labels?.length ??\n item.dueDate ??\n item.comments ??\n item.attachments ??\n item.subtasks\n )\n\n const handleClick = () => {\n onClick?.({ item })\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault()\n handleClick()\n }\n }\n\n return (\n <div\n aria-describedby={item.description ? `${cardId}-desc` : undefined}\n aria-label={item.title}\n className={cn(kanbanCardVariants({ isDragging, priority: item.priority ?? null }), className)}\n data-slot=\"kanban-card\"\n role=\"listitem\"\n tabIndex={0}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {/* Labels */}\n {item.labels && item.labels.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\" data-slot=\"kanban-card-labels\">\n {item.labels.slice(0, 3).map((label) => (\n <span\n key={label.id}\n className={kanbanLabelVariants()}\n style={{ backgroundColor: `${label.color}20`, color: label.color }}\n >\n {label.name}\n </span>\n ))}\n {item.labels.length > 3 ? (\n <span className=\"text-xs text-muted-foreground\">\n +{item.labels.length - 3}\n </span>\n ) : null}\n </div>\n ) : null}\n\n {/* Title */}\n <div className={kanbanCardTitleVariants()} data-slot=\"kanban-card-title\">\n {item.title}\n </div>\n\n {/* Description */}\n {item.description ? (\n <div\n className={kanbanCardDescriptionVariants()}\n data-slot=\"kanban-card-description\"\n id={`${cardId}-desc`}\n >\n {item.description}\n </div>\n ) : null}\n\n {/* Metadata row */}\n {hasMeta ? (\n <div className={kanbanCardMetaVariants()} data-slot=\"kanban-card-meta\">\n {/* Due date */}\n {item.dueDate ? (\n <span\n className={cn(\n \"flex items-center gap-1\",\n new Date(item.dueDate) < new Date() && \"text-destructive\"\n )}\n title={`Due: ${item.dueDate.toLocaleDateString()}`}\n >\n <Calendar className=\"h-3 w-3\" />\n {formatDueDate(new Date(item.dueDate))}\n </span>\n ) : null}\n\n {/* Subtasks */}\n {item.subtasks ? (\n <span className=\"flex items-center gap-1\" title=\"Subtasks progress\">\n {item.subtasks.completed}/{item.subtasks.total}\n </span>\n ) : null}\n\n {/* Comments */}\n {item.comments ? (\n <span className=\"flex items-center gap-1\" title={`${String(item.comments)} comments`}>\n <MessageSquare className=\"h-3 w-3\" />\n {item.comments}\n </span>\n ) : null}\n\n {/* Attachments */}\n {item.attachments ? (\n <span className=\"flex items-center gap-1\" title={`${String(item.attachments)} attachments`}>\n <Paperclip className=\"h-3 w-3\" />\n {item.attachments}\n </span>\n ) : null}\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Assignees */}\n {item.assignees && item.assignees.length > 0 ? (\n <div className=\"flex -space-x-1\" data-slot=\"kanban-card-assignees\">\n {item.assignees.slice(0, 3).map((user) => (\n <Avatar\n key={user.id}\n className=\"h-5 w-5 border-2 border-background\"\n title={user.name}\n >\n {user.avatar ? (\n <AvatarImage alt={user.name} src={user.avatar} />\n ) : null}\n <AvatarFallback className=\"text-xs\">\n {getInitials(user.name)}\n </AvatarFallback>\n </Avatar>\n ))}\n {item.assignees.length > 3 ? (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-muted text-xs border-2 border-background\">\n +{item.assignees.length - 3}\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n )\n}\n\n// ============================================\n// KANBAN COLUMN\n// ============================================\n\n/**\n * KanbanColumn displays a single column with its items\n */\nfunction KanbanColumn({\n allowAddItem = true,\n className,\n column,\n isOver = false,\n items,\n onItemAdd,\n onItemClick,\n onItemDelete,\n onToggleCollapse,\n showColumnCount = true,\n showWipLimits = true,\n}: KanbanColumnProps) {\n const columnId = useId()\n const wipStatus = getWipStatus(items.length, column.wipLimit)\n const isCollapsed = column.isCollapsed ?? false\n\n const handleAddItem = () => {\n onItemAdd?.({ columnId: column.id })\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n const target = event.currentTarget\n const cards = [...target.querySelectorAll('[data-slot=\"kanban-card\"]')] as HTMLElement[]\n const focused = document.activeElement as HTMLElement\n const currentIndex = cards.indexOf(focused)\n\n if (currentIndex === -1) {\n cards[0]?.focus()\n return\n }\n\n const nextIndex = event.key === \"ArrowDown\"\n ? Math.min(currentIndex + 1, cards.length - 1)\n : Math.max(currentIndex - 1, 0)\n\n const nextElement = cards[nextIndex]\n nextElement?.focus()\n event.preventDefault()\n }\n }\n\n // Collapsed column view\n if (isCollapsed) {\n return (\n <div\n data-collapsed\n className={cn(kanbanColumnVariants({ isCollapsed: true, isOver: false }), className)}\n data-slot=\"kanban-column\"\n >\n <Button\n aria-expanded={false}\n aria-label={`Expand ${column.title}`}\n className=\"h-full w-full flex flex-col items-center justify-start pt-3 gap-2\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n >\n <ChevronRight className=\"h-4 w-4\" />\n <span\n className=\"text-sm font-semibold writing-mode-vertical\"\n style={{ writingMode: \"vertical-rl\" }}\n >\n {column.title}\n </span>\n {showColumnCount ? (\n <Badge className=\"mt-2\" color=\"muted\" type=\"pill-color\">\n {items.length}\n </Badge>\n ) : null}\n </Button>\n </div>\n )\n }\n\n return (\n <Droppable data={{ type: \"column\", column }} id={column.id}>\n {({ isOver: droppableIsOver }) => (\n <div\n className={cn(\n kanbanColumnVariants({ isCollapsed: false, isOver: isOver || droppableIsOver }),\n className\n )}\n aria-label={`${column.title} column`}\n data-slot=\"kanban-column\"\n role=\"list\"\n onKeyDown={handleKeyDown}\n >\n {/* Column Header */}\n <div\n className={kanbanColumnHeaderVariants({ wipStatus })}\n data-slot=\"kanban-column-header\"\n >\n <div className=\"flex items-center gap-2\">\n {column.color ? (\n <div\n className=\"h-3 w-3 rounded-full\"\n style={{ backgroundColor: column.color }}\n />\n ) : null}\n <span className=\"text-sm font-semibold\">{column.title}</span>\n {showColumnCount ? (\n <Badge color=\"muted\" data-slot=\"column-count\" type=\"pill-color\">\n {items.length}\n </Badge>\n ) : null}\n {showWipLimits && column.wipLimit ? (\n <span\n className=\"text-xs\"\n data-slot=\"wip-indicator\"\n title={`WIP Limit: ${String(column.wipLimit)}`}\n >\n /{column.wipLimit}\n </span>\n ) : null}\n </div>\n {onToggleCollapse ? (\n <Button\n aria-expanded={true}\n aria-label={`Collapse ${column.title}`}\n className=\"h-6 w-6 p-0\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n ) : null}\n </div>\n\n {/* Cards */}\n <SortableContext\n items={items.map((i) => i.id)}\n strategy={verticalListSortingStrategy}\n >\n <div\n aria-labelledby={columnId}\n className={kanbanColumnContentVariants()}\n data-slot=\"kanban-column-content\"\n >\n {items.map((item) => (\n <SortableItem\n key={item.id}\n data={{ type: \"item\", item, columnId: column.id }}\n id={item.id}\n >\n {({ isDragging }) => (\n <div className=\"relative\">\n <DragHandle\n aria-label={`Drag ${item.title}`}\n className=\"absolute left-1 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-opacity cursor-grab active:cursor-grabbing h-6 w-6 flex items-center justify-center\"\n >\n <GripVertical className=\"h-4 w-4 text-muted-foreground\" />\n </DragHandle>\n <KanbanCard\n isDragging={isDragging}\n item={item}\n onClick={onItemClick}\n onDelete={onItemDelete}\n />\n </div>\n )}\n </SortableItem>\n ))}\n\n {/* Add card button */}\n {allowAddItem ? (\n <button\n aria-label={`Add item to ${column.title}`}\n className={kanbanAddButtonVariants()}\n type=\"button\"\n onClick={handleAddItem}\n >\n <Plus className=\"h-4 w-4\" />\n Add card\n </button>\n ) : null}\n </div>\n </SortableContext>\n </div>\n )}\n </Droppable>\n )\n}\n\n// ============================================\n// KANBAN BOARD\n// ============================================\n\n/**\n * KanbanBoard component for visual task management.\n *\n * Organizes items into columns representing workflow stages with drag-and-drop\n * support for moving items between columns.\n *\n * @example\n * ```tsx\n * const columns = [\n * { id: 'todo', title: 'To Do' },\n * { id: 'doing', title: 'In Progress', wipLimit: 3 },\n * { id: 'done', title: 'Done' },\n * ]\n *\n * const items = [\n * { id: '1', title: 'Task 1', columnId: 'todo', order: 0 },\n * { id: '2', title: 'Task 2', columnId: 'doing', order: 0 },\n * ]\n *\n * <KanbanBoard\n * columns={columns}\n * items={items}\n * onItemMove={({ itemId, fromColumn, toColumn }) => {\n * console.log(`Moved ${itemId} from ${fromColumn} to ${toColumn}`)\n * }}\n * />\n * ```\n */\nfunction KanbanBoard({\n allowAddColumn = false,\n allowAddItem = true,\n allowColumnReorder = false,\n className,\n columns,\n columnWidth = 288,\n filterBy,\n groupBy,\n items,\n onColumnAdd,\n onColumnDelete: _onColumnDelete,\n onColumnReorder: _onColumnReorder,\n onColumnUpdate: _onColumnUpdate,\n onItemAdd,\n onItemClick,\n onItemDelete,\n onItemMove,\n onItemUpdate: _onItemUpdate,\n searchable = false,\n showColumnCount = true,\n showWipLimits = true,\n variant = \"default\",\n layout = \"horizontal\",\n ...props\n}: KanbanBoardProps) {\n const _boardId = useId()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [activeId, setActiveId] = useState<null | UniqueIdentifier>(null)\n const [collapsedColumns, setCollapsedColumns] = useState<Set<string>>(() => new Set())\n\n // Filter items based on search and filters\n const filteredItems = useMemo(() => {\n let result = [...items]\n\n // Apply search filter\n if (searchQuery) {\n const query = searchQuery.toLowerCase()\n result = result.filter(\n (item) =>\n item.title.toLowerCase().includes(query) ||\n item.description?.toLowerCase().includes(query)\n )\n }\n\n // Apply filter config\n if (filterBy) {\n if (filterBy.priority?.length) {\n result = result.filter((item) =>\n item.priority && filterBy.priority?.includes(item.priority)\n )\n }\n if (filterBy.assignees?.length) {\n result = result.filter((item) =>\n item.assignees?.some((a) => filterBy.assignees?.includes(a.id))\n )\n }\n if (filterBy.labels?.length) {\n result = result.filter((item) =>\n item.labels?.some((l) => filterBy.labels?.includes(l.id))\n )\n }\n if (filterBy.dueDate) {\n result = result.filter((item) => {\n if (!item.dueDate) return false\n const date = new Date(item.dueDate)\n if (filterBy.dueDate?.from && date < filterBy.dueDate.from) return false\n if (filterBy.dueDate?.to && date > filterBy.dueDate.to) return false\n return true\n })\n }\n }\n\n return result\n }, [items, searchQuery, filterBy])\n\n // Get items for a specific column\n const getColumnItems = (columnId: string) => {\n return filteredItems\n .filter((item) => item.columnId === columnId)\n .sort((a, b) => a.order - b.order)\n }\n\n // Get the active item being dragged\n const activeItem = useMemo(() => {\n if (!activeId) return null\n return items.find((item) => item.id === activeId) ?? null\n }, [activeId, items])\n\n // Toggle column collapse\n const handleToggleCollapse = (columnId: string) => {\n setCollapsedColumns((prev) => {\n const next = new Set(prev)\n if (next.has(columnId)) {\n next.delete(columnId)\n } else {\n next.add(columnId)\n }\n return next\n })\n }\n\n // Drag handlers\n const handleDragStart = (event: DragStartEvent) => {\n setActiveId(event.active.id)\n }\n\n const handleDragOver = (_event: DragOverEvent) => {\n // Could implement preview of drop here\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n setActiveId(null)\n\n if (!over) return\n\n const activeData = active.data.current as undefined | { columnId?: string; item?: KanbanItem; type?: string }\n const overData = over.data.current as undefined | { column?: KanbanColumn; columnId?: string; item?: KanbanItem; type?: string }\n\n if (activeData?.type !== \"item\") return\n\n const activeItem = activeData.item\n if (!activeItem) return\n\n let toColumn: string\n let index = 0\n\n if (overData?.type === \"column\") {\n // Dropped on column\n toColumn = overData.column?.id ?? \"\"\n index = getColumnItems(toColumn).length\n } else if (overData?.type === \"item\") {\n // Dropped on item\n toColumn = overData.item?.columnId ?? \"\"\n const targetItems = getColumnItems(toColumn)\n const overItem = overData.item\n index = overItem ? targetItems.findIndex((i) => i.id === overItem.id) : 0\n } else {\n return\n }\n\n if (activeItem.columnId !== toColumn || active.id !== over.id) {\n onItemMove?.({\n fromColumn: activeItem.columnId,\n index,\n itemId: activeItem.id,\n toColumn,\n })\n }\n }\n\n const handleDragCancel = () => {\n setActiveId(null)\n }\n\n // Prepare columns with collapse state\n const columnsWithState = columns.map((col) => ({\n ...col,\n isCollapsed: collapsedColumns.has(col.id) || col.isCollapsed,\n }))\n\n // Group items by swimlane if groupBy is specified\n const swimlanes = useMemo(() => {\n if (!groupBy || variant !== \"swimlanes\") return null\n\n const groups = new Map<string, KanbanItem[]>()\n for (const item of filteredItems) {\n const key = (item.customFields?.[groupBy] as string | undefined) ?? \"Ungrouped\"\n const group = groups.get(key) ?? []\n group.push(item)\n groups.set(key, group)\n }\n return groups\n }, [filteredItems, groupBy, variant])\n\n // Column width style\n const widthValue = typeof columnWidth === \"number\" ? `${String(columnWidth)}px` : columnWidth\n const columnStyle = {\n minWidth: widthValue,\n width: widthValue,\n }\n\n return (\n <div\n aria-label=\"Kanban board\"\n className=\"flex flex-col gap-4\"\n data-slot=\"kanban-board-wrapper\"\n role=\"region\"\n {...props}\n >\n {/* Search bar */}\n {searchable ? (\n <div className={kanbanSearchVariants()} data-slot=\"kanban-search\">\n <Search className=\"h-4 w-4 text-muted-foreground\" />\n <input\n aria-label=\"Search items\"\n className=\"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder=\"Search items...\"\n type=\"text\"\n value={searchQuery}\n onChange={(e) => { setSearchQuery(e.target.value); }}\n />\n </div>\n ) : null}\n\n {/* Board */}\n <DndContext\n className={cn(kanbanBoardVariants({ layout, variant }), className)}\n onDragCancel={handleDragCancel}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragStart={handleDragStart}\n >\n {variant === \"swimlanes\" && swimlanes ? (\n // Swimlanes layout\n <div className=\"flex flex-col gap-6\" data-slot=\"kanban-swimlanes\">\n {[...swimlanes.entries()].map(([lane, _laneItems]) => (\n <div key={lane} className=\"flex flex-col gap-2\">\n <div className=\"text-sm font-semibold text-muted-foreground\">\n {lane}\n </div>\n <div className=\"flex gap-4 overflow-x-auto\">\n <SortableContext\n disabled={!allowColumnReorder}\n items={columnsWithState.map((c) => c.id)}\n strategy={horizontalListSortingStrategy}\n >\n {columnsWithState.map((column) => (\n <div key={column.id} style={columnStyle}>\n <KanbanColumn\n items={getColumnItems(column.id).filter(\n (item) => ((item.customFields?.[groupBy ?? \"\"] as string | undefined) ?? \"Ungrouped\") === lane\n )}\n allowAddItem={allowAddItem}\n column={column}\n showColumnCount={showColumnCount}\n showWipLimits={showWipLimits}\n onItemAdd={onItemAdd}\n onItemClick={onItemClick}\n onItemDelete={onItemDelete}\n onToggleCollapse={() => { handleToggleCollapse(column.id); }}\n />\n </div>\n ))}\n </SortableContext>\n </div>\n </div>\n ))}\n </div>\n ) : (\n // Standard layout\n <SortableContext\n disabled={!allowColumnReorder}\n items={columnsWithState.map((c) => c.id)}\n strategy={horizontalListSortingStrategy}\n >\n {columnsWithState.map((column) => (\n <div key={column.id} style={column.isCollapsed ? undefined : columnStyle}>\n <KanbanColumn\n allowAddItem={allowAddItem}\n column={column}\n items={getColumnItems(column.id)}\n showColumnCount={showColumnCount}\n showWipLimits={showWipLimits}\n onItemAdd={onItemAdd}\n onItemClick={onItemClick}\n onItemDelete={onItemDelete}\n onToggleCollapse={() => { handleToggleCollapse(column.id); }}\n />\n </div>\n ))}\n\n {/* Add column button */}\n {allowAddColumn ? (\n <button\n className={cn(\n kanbanAddButtonVariants(),\n \"min-w-52 h-52 flex-col\"\n )}\n aria-label=\"Add column\"\n type=\"button\"\n onClick={onColumnAdd}\n >\n <Plus className=\"h-6 w-6\" />\n Add column\n </button>\n ) : null}\n </SortableContext>\n )}\n\n {/* Drag overlay */}\n <DragOverlay>\n {activeItem ? (\n <div\n className=\"opacity-90 rotate-3\"\n style={columnStyle}\n >\n <KanbanCard isDragging item={activeItem} />\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n </div>\n )\n}\n\n// ============================================\n// EXPORTS\n// ============================================\n\nexport {\n KanbanBoard,\n kanbanBoardVariants,\n KanbanCard,\n kanbanCardVariants,\n kanbanColumnVariants,\n}\n\nexport type {\n ItemAddPayload,\n ItemClickPayload,\n ItemDeletePayload,\n ItemMovePayload,\n KanbanBoardProps,\n KanbanCardProps,\n KanbanColumn,\n KanbanColumnProps,\n KanbanFilterConfig,\n KanbanItem,\n KanbanLabel,\n KanbanSubtasks,\n KanbanUser,\n} from \"./KanbanBoard.types\"\n"]}
1
+ {"version":3,"sources":["../src/components/workflow/KanbanBoard/KanbanBoard.variants.ts","../src/components/workflow/KanbanBoard/KanbanBoard.tsx"],"names":["activeItem"],"mappings":"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","file":"chunk-OBRJXVWO.js","sourcesContent":["import { cva } from \"class-variance-authority\"\n\n/* eslint-disable sonarjs/no-duplicate-string -- CVA variants require repeated class patterns */\n\n/**\n * Board container variants\n */\nexport const kanbanBoardVariants = cva(\n [\n \"flex\",\n \"w-full\",\n \"min-w-0\",\n \"gap-4\",\n \"p-4\",\n \"bg-muted/30\",\n \"rounded-lg\",\n \"overflow-x-auto\",\n ],\n {\n defaultVariants: {\n layout: \"horizontal\",\n variant: \"default\",\n },\n variants: {\n layout: {\n horizontal: \"flex-row\",\n vertical: \"flex-col\",\n },\n variant: {\n collapsed: \"\",\n compact: \"[&_[data-slot=kanban-card]]:p-2 [&_[data-slot=kanban-column]]:w-60\",\n default: \"\",\n swimlanes: \"flex-col gap-6\",\n },\n },\n }\n)\n\n/**\n * Column container variants\n */\nexport const kanbanColumnVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"rounded-lg\",\n \"bg-muted/50\",\n \"min-h-52\",\n ],\n {\n defaultVariants: {\n isCollapsed: false,\n isOver: false,\n },\n variants: {\n isCollapsed: {\n false: \"w-72\",\n true: \"w-12\",\n },\n isOver: {\n false: \"\",\n true: \"ring-2 ring-primary/50 bg-primary/5\",\n },\n },\n }\n)\n\n/**\n * Column header variants\n */\nexport const kanbanColumnHeaderVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"justify-between\",\n \"gap-2\",\n \"p-3\",\n \"bg-card\",\n \"rounded-t-lg\",\n \"border-b\",\n ],\n {\n defaultVariants: {\n wipStatus: \"normal\",\n },\n variants: {\n wipStatus: {\n exceeded: \"[&_[data-slot=wip-indicator]]:text-destructive\",\n normal: \"\",\n warning: \"[&_[data-slot=wip-indicator]]:text-warning\",\n },\n },\n }\n)\n\n/**\n * Column content (cards area) variants\n */\nexport const kanbanColumnContentVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"flex-1\",\n \"gap-2\",\n \"p-2\",\n \"min-h-24\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Kanban card variants\n */\nexport const kanbanCardVariants = cva(\n [\n \"group\",\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"p-3\",\n \"bg-card\",\n \"rounded-md\",\n \"border\",\n \"shadow-sm\",\n \"cursor-pointer\",\n \"transition-all\",\n \"duration-200\",\n \"hover:shadow-md\",\n \"hover:border-primary/30\",\n ],\n {\n defaultVariants: {\n isDragging: false,\n priority: null,\n },\n variants: {\n isDragging: {\n false: \"\",\n true: \"opacity-50 ring-2 ring-primary shadow-lg\",\n },\n priority: {\n high: \"border-l-4 border-l-orange-500\",\n low: \"border-l-4 border-l-gray-400\",\n medium: \"border-l-4 border-l-yellow-500\",\n null: \"\",\n urgent: \"border-l-4 border-l-destructive\",\n },\n },\n }\n)\n\n/**\n * Card title variants\n */\nexport const kanbanCardTitleVariants = cva(\n [\n \"text-sm\",\n \"font-medium\",\n \"text-foreground\",\n \"line-clamp-2\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Card description variants\n */\nexport const kanbanCardDescriptionVariants = cva(\n [\n \"text-xs\",\n \"text-muted-foreground\",\n \"line-clamp-2\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Card metadata row variants\n */\nexport const kanbanCardMetaVariants = cva(\n [\n \"flex\",\n \"flex-wrap\",\n \"items-center\",\n \"gap-2\",\n \"text-xs\",\n \"text-muted-foreground\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Label badge variants\n */\nexport const kanbanLabelVariants = cva(\n [\n \"inline-flex\",\n \"items-center\",\n \"px-1.5\",\n \"py-0.5\",\n \"rounded-sm\",\n \"text-xs\",\n \"font-medium\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Drop indicator variants\n */\nexport const kanbanDropIndicatorVariants = cva(\n [\n \"h-1\",\n \"rounded-full\",\n \"bg-primary/20\",\n \"border\",\n \"border-primary\",\n \"transition-opacity\",\n ],\n {\n defaultVariants: {\n isVisible: false,\n },\n variants: {\n isVisible: {\n false: \"opacity-0\",\n true: \"opacity-100\",\n },\n },\n }\n)\n\n/**\n * Add button variants\n */\nexport const kanbanAddButtonVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"gap-1\",\n \"w-full\",\n \"p-2\",\n \"text-sm\",\n \"text-muted-foreground\",\n \"rounded-md\",\n \"border\",\n \"border-dashed\",\n \"hover:bg-muted/50\",\n \"hover:text-foreground\",\n \"transition-colors\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Swimlane header variants\n */\nexport const kanbanSwimlaneVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"p-3\",\n \"rounded-lg\",\n \"bg-muted/20\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Search input variants\n */\nexport const kanbanSearchVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"gap-2\",\n \"px-3\",\n \"py-2\",\n \"bg-background\",\n \"border\",\n \"rounded-md\",\n \"focus-within:ring-2\",\n \"focus-within:ring-primary/50\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n","import type {\n KanbanBoardProps,\n KanbanCardProps,\n KanbanColumn,\n KanbanColumnProps,\n KanbanItem,\n} from \"./KanbanBoard.types\"\nimport type { DragEndEvent, DragOverEvent, DragStartEvent, UniqueIdentifier } from \"@dnd-kit/core\"\nimport type { KeyboardEvent } from \"react\"\n\nimport { horizontalListSortingStrategy, SortableContext, verticalListSortingStrategy } from \"@dnd-kit/sortable\"\nimport {\n Calendar,\n ChevronDown,\n ChevronRight,\n GripVertical,\n MessageSquare,\n Paperclip,\n Plus,\n Search,\n} from \"lucide-react\"\nimport { useId, useMemo, useState } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n DndContext,\n DragHandle,\n DragOverlay,\n Droppable,\n SortableItem,\n} from \"../../advanced/DragAndDrop\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../primitives/Avatar\"\nimport { Badge } from \"../../primitives/Badge\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n kanbanAddButtonVariants,\n kanbanBoardVariants,\n kanbanCardDescriptionVariants,\n kanbanCardMetaVariants,\n kanbanCardTitleVariants,\n kanbanCardVariants,\n kanbanColumnContentVariants,\n kanbanColumnHeaderVariants,\n kanbanColumnVariants,\n kanbanLabelVariants,\n kanbanSearchVariants,\n} from \"./KanbanBoard.variants\"\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\n/**\n * Get initials from a name\n */\nfunction getInitials(name: string): string {\n return name\n .split(\" \")\n .map((part) => part[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2)\n}\n\n/**\n * Format date for display\n */\nfunction formatDueDate(date: Date): string {\n const now = new Date()\n const diff = date.getTime() - now.getTime()\n const days = Math.ceil(diff / (1000 * 60 * 60 * 24))\n\n if (days < 0) return \"Overdue\"\n if (days === 0) return \"Today\"\n if (days === 1) return \"Tomorrow\"\n if (days <= 7) return `${String(days)} days`\n return date.toLocaleDateString()\n}\n\n/**\n * Get WIP status for column\n */\nfunction getWipStatus(\n itemCount: number,\n wipLimit?: number\n): \"exceeded\" | \"normal\" | \"warning\" {\n if (!wipLimit) return \"normal\"\n if (itemCount >= wipLimit) return \"exceeded\"\n if (itemCount >= wipLimit - 1) return \"warning\"\n return \"normal\"\n}\n\n// ============================================\n// KANBAN CARD\n// ============================================\n\n/**\n * KanbanCard displays an individual task item\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity -- Complexity inherent to rendering multiple optional card elements\nfunction KanbanCard({\n className,\n isDragging = false,\n item,\n onClick,\n onDelete: _onDelete,\n}: KanbanCardProps) {\n const cardId = useId()\n const hasMeta = Boolean(\n item.assignees?.length ??\n item.labels?.length ??\n item.dueDate ??\n item.comments ??\n item.attachments ??\n item.subtasks\n )\n\n const handleClick = () => {\n onClick?.({ item })\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault()\n handleClick()\n }\n }\n\n return (\n <div\n aria-describedby={item.description ? `${cardId}-desc` : undefined}\n aria-label={item.title}\n className={cn(kanbanCardVariants({ isDragging, priority: item.priority ?? null }), className)}\n data-slot=\"kanban-card\"\n role=\"listitem\"\n tabIndex={0}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {/* Labels */}\n {item.labels && item.labels.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\" data-slot=\"kanban-card-labels\">\n {item.labels.slice(0, 3).map((label) => (\n <span\n key={label.id}\n className={kanbanLabelVariants()}\n style={{ backgroundColor: `${label.color}20`, color: label.color }}\n >\n {label.name}\n </span>\n ))}\n {item.labels.length > 3 ? (\n <span className=\"text-xs text-muted-foreground\">\n +{item.labels.length - 3}\n </span>\n ) : null}\n </div>\n ) : null}\n\n {/* Title */}\n <div className={kanbanCardTitleVariants()} data-slot=\"kanban-card-title\">\n {item.title}\n </div>\n\n {/* Description */}\n {item.description ? (\n <div\n className={kanbanCardDescriptionVariants()}\n data-slot=\"kanban-card-description\"\n id={`${cardId}-desc`}\n >\n {item.description}\n </div>\n ) : null}\n\n {/* Metadata row */}\n {hasMeta ? (\n <div className={kanbanCardMetaVariants()} data-slot=\"kanban-card-meta\">\n {/* Due date */}\n {item.dueDate ? (\n <span\n className={cn(\n \"flex items-center gap-1\",\n new Date(item.dueDate) < new Date() && \"text-destructive\"\n )}\n title={`Due: ${item.dueDate.toLocaleDateString()}`}\n >\n <Calendar className=\"h-3 w-3\" />\n {formatDueDate(new Date(item.dueDate))}\n </span>\n ) : null}\n\n {/* Subtasks */}\n {item.subtasks ? (\n <span className=\"flex items-center gap-1\" title=\"Subtasks progress\">\n {item.subtasks.completed}/{item.subtasks.total}\n </span>\n ) : null}\n\n {/* Comments */}\n {item.comments ? (\n <span className=\"flex items-center gap-1\" title={`${String(item.comments)} comments`}>\n <MessageSquare className=\"h-3 w-3\" />\n {item.comments}\n </span>\n ) : null}\n\n {/* Attachments */}\n {item.attachments ? (\n <span className=\"flex items-center gap-1\" title={`${String(item.attachments)} attachments`}>\n <Paperclip className=\"h-3 w-3\" />\n {item.attachments}\n </span>\n ) : null}\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Assignees */}\n {item.assignees && item.assignees.length > 0 ? (\n <div className=\"flex -space-x-1\" data-slot=\"kanban-card-assignees\">\n {item.assignees.slice(0, 3).map((user) => (\n <Avatar\n key={user.id}\n className=\"h-5 w-5 border-2 border-background\"\n title={user.name}\n >\n {user.avatar ? (\n <AvatarImage alt={user.name} src={user.avatar} />\n ) : null}\n <AvatarFallback className=\"text-xs\">\n {getInitials(user.name)}\n </AvatarFallback>\n </Avatar>\n ))}\n {item.assignees.length > 3 ? (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-muted text-xs border-2 border-background\">\n +{item.assignees.length - 3}\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n )\n}\n\n// ============================================\n// KANBAN COLUMN\n// ============================================\n\n/**\n * KanbanColumn displays a single column with its items\n */\nfunction KanbanColumn({\n allowAddItem = true,\n className,\n column,\n isOver = false,\n items,\n onItemAdd,\n onItemClick,\n onItemDelete,\n onToggleCollapse,\n showColumnCount = true,\n showWipLimits = true,\n}: KanbanColumnProps) {\n const columnId = useId()\n const wipStatus = getWipStatus(items.length, column.wipLimit)\n const isCollapsed = column.isCollapsed ?? false\n\n const handleAddItem = () => {\n onItemAdd?.({ columnId: column.id })\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n const target = event.currentTarget\n const cards = [...target.querySelectorAll('[data-slot=\"kanban-card\"]')] as HTMLElement[]\n const focused = document.activeElement as HTMLElement\n const currentIndex = cards.indexOf(focused)\n\n if (currentIndex === -1) {\n cards[0]?.focus()\n return\n }\n\n const nextIndex = event.key === \"ArrowDown\"\n ? Math.min(currentIndex + 1, cards.length - 1)\n : Math.max(currentIndex - 1, 0)\n\n const nextElement = cards[nextIndex]\n nextElement?.focus()\n event.preventDefault()\n }\n }\n\n // Collapsed column view\n if (isCollapsed) {\n return (\n <div\n data-collapsed\n className={cn(kanbanColumnVariants({ isCollapsed: true, isOver: false }), className)}\n data-slot=\"kanban-column\"\n >\n <Button\n aria-expanded={false}\n aria-label={`Expand ${column.title}`}\n className=\"h-full w-full flex flex-col items-center justify-start pt-3 gap-2\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n >\n <ChevronRight className=\"h-4 w-4\" />\n <span\n className=\"text-sm font-semibold writing-mode-vertical\"\n style={{ writingMode: \"vertical-rl\" }}\n >\n {column.title}\n </span>\n {showColumnCount ? (\n <Badge className=\"mt-2\" color=\"muted\" type=\"pill-color\">\n {items.length}\n </Badge>\n ) : null}\n </Button>\n </div>\n )\n }\n\n return (\n <Droppable data={{ type: \"column\", column }} id={column.id}>\n {({ isOver: droppableIsOver }) => (\n <div\n className={cn(\n kanbanColumnVariants({ isCollapsed: false, isOver: isOver || droppableIsOver }),\n className\n )}\n aria-label={`${column.title} column`}\n data-slot=\"kanban-column\"\n role=\"list\"\n onKeyDown={handleKeyDown}\n >\n {/* Column Header */}\n <div\n className={kanbanColumnHeaderVariants({ wipStatus })}\n data-slot=\"kanban-column-header\"\n >\n <div className=\"flex items-center gap-2\">\n {column.color ? (\n <div\n className=\"h-3 w-3 rounded-full\"\n style={{ backgroundColor: column.color }}\n />\n ) : null}\n <span className=\"text-sm font-semibold\">{column.title}</span>\n {showColumnCount ? (\n <Badge color=\"muted\" data-slot=\"column-count\" type=\"pill-color\">\n {items.length}\n </Badge>\n ) : null}\n {showWipLimits && column.wipLimit ? (\n <span\n className=\"text-xs\"\n data-slot=\"wip-indicator\"\n title={`WIP Limit: ${String(column.wipLimit)}`}\n >\n /{column.wipLimit}\n </span>\n ) : null}\n </div>\n {onToggleCollapse ? (\n <Button\n aria-expanded={true}\n aria-label={`Collapse ${column.title}`}\n className=\"h-6 w-6 p-0\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n ) : null}\n </div>\n\n {/* Cards */}\n <SortableContext\n items={items.map((i) => i.id)}\n strategy={verticalListSortingStrategy}\n >\n <div\n aria-labelledby={columnId}\n className={kanbanColumnContentVariants()}\n data-slot=\"kanban-column-content\"\n >\n {items.map((item) => (\n <SortableItem\n key={item.id}\n data={{ type: \"item\", item, columnId: column.id }}\n id={item.id}\n >\n {({ isDragging }) => (\n <div className=\"relative\">\n <DragHandle\n aria-label={`Drag ${item.title}`}\n className=\"absolute left-1 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-opacity cursor-grab active:cursor-grabbing h-6 w-6 flex items-center justify-center\"\n >\n <GripVertical className=\"h-4 w-4 text-muted-foreground\" />\n </DragHandle>\n <KanbanCard\n isDragging={isDragging}\n item={item}\n onClick={onItemClick}\n onDelete={onItemDelete}\n />\n </div>\n )}\n </SortableItem>\n ))}\n\n {/* Add card button */}\n {allowAddItem ? (\n <button\n aria-label={`Add item to ${column.title}`}\n className={kanbanAddButtonVariants()}\n type=\"button\"\n onClick={handleAddItem}\n >\n <Plus className=\"h-4 w-4\" />\n Add card\n </button>\n ) : null}\n </div>\n </SortableContext>\n </div>\n )}\n </Droppable>\n )\n}\n\n// ============================================\n// KANBAN BOARD\n// ============================================\n\n/**\n * KanbanBoard component for visual task management.\n *\n * Organizes items into columns representing workflow stages with drag-and-drop\n * support for moving items between columns.\n *\n * @example\n * ```tsx\n * const columns = [\n * { id: 'todo', title: 'To Do' },\n * { id: 'doing', title: 'In Progress', wipLimit: 3 },\n * { id: 'done', title: 'Done' },\n * ]\n *\n * const items = [\n * { id: '1', title: 'Task 1', columnId: 'todo', order: 0 },\n * { id: '2', title: 'Task 2', columnId: 'doing', order: 0 },\n * ]\n *\n * <KanbanBoard\n * columns={columns}\n * items={items}\n * onItemMove={({ itemId, fromColumn, toColumn }) => {\n * console.log(`Moved ${itemId} from ${fromColumn} to ${toColumn}`)\n * }}\n * />\n * ```\n */\nfunction KanbanBoard({\n allowAddColumn = false,\n allowAddItem = true,\n allowColumnReorder = false,\n className,\n columns,\n columnWidth = 288,\n filterBy,\n groupBy,\n items,\n onColumnAdd,\n onColumnDelete: _onColumnDelete,\n onColumnReorder: _onColumnReorder,\n onColumnUpdate: _onColumnUpdate,\n onItemAdd,\n onItemClick,\n onItemDelete,\n onItemMove,\n onItemUpdate: _onItemUpdate,\n searchable = false,\n showColumnCount = true,\n showWipLimits = true,\n variant = \"default\",\n layout = \"horizontal\",\n ...props\n}: KanbanBoardProps) {\n const _boardId = useId()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [activeId, setActiveId] = useState<null | UniqueIdentifier>(null)\n const [collapsedColumns, setCollapsedColumns] = useState<Set<string>>(() => new Set())\n\n // Filter items based on search and filters\n const filteredItems = useMemo(() => {\n let result = [...items]\n\n // Apply search filter\n if (searchQuery) {\n const query = searchQuery.toLowerCase()\n result = result.filter(\n (item) =>\n item.title.toLowerCase().includes(query) ||\n item.description?.toLowerCase().includes(query)\n )\n }\n\n // Apply filter config\n if (filterBy) {\n if (filterBy.priority?.length) {\n result = result.filter((item) =>\n item.priority && filterBy.priority?.includes(item.priority)\n )\n }\n if (filterBy.assignees?.length) {\n result = result.filter((item) =>\n item.assignees?.some((a) => filterBy.assignees?.includes(a.id))\n )\n }\n if (filterBy.labels?.length) {\n result = result.filter((item) =>\n item.labels?.some((l) => filterBy.labels?.includes(l.id))\n )\n }\n if (filterBy.dueDate) {\n result = result.filter((item) => {\n if (!item.dueDate) return false\n const date = new Date(item.dueDate)\n if (filterBy.dueDate?.from && date < filterBy.dueDate.from) return false\n if (filterBy.dueDate?.to && date > filterBy.dueDate.to) return false\n return true\n })\n }\n }\n\n return result\n }, [items, searchQuery, filterBy])\n\n // Get items for a specific column\n const getColumnItems = (columnId: string) => {\n return filteredItems\n .filter((item) => item.columnId === columnId)\n .sort((a, b) => a.order - b.order)\n }\n\n // Get the active item being dragged\n const activeItem = useMemo(() => {\n if (!activeId) return null\n return items.find((item) => item.id === activeId) ?? null\n }, [activeId, items])\n\n // Toggle column collapse\n const handleToggleCollapse = (columnId: string) => {\n setCollapsedColumns((prev) => {\n const next = new Set(prev)\n if (next.has(columnId)) {\n next.delete(columnId)\n } else {\n next.add(columnId)\n }\n return next\n })\n }\n\n // Drag handlers\n const handleDragStart = (event: DragStartEvent) => {\n setActiveId(event.active.id)\n }\n\n const handleDragOver = (_event: DragOverEvent) => {\n // Could implement preview of drop here\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n setActiveId(null)\n\n if (!over) return\n\n const activeData = active.data.current as undefined | { columnId?: string; item?: KanbanItem; type?: string }\n const overData = over.data.current as undefined | { column?: KanbanColumn; columnId?: string; item?: KanbanItem; type?: string }\n\n if (activeData?.type !== \"item\") return\n\n const activeItem = activeData.item\n if (!activeItem) return\n\n let toColumn: string\n let index = 0\n\n if (overData?.type === \"column\") {\n // Dropped on column\n toColumn = overData.column?.id ?? \"\"\n index = getColumnItems(toColumn).length\n } else if (overData?.type === \"item\") {\n // Dropped on item\n toColumn = overData.item?.columnId ?? \"\"\n const targetItems = getColumnItems(toColumn)\n const overItem = overData.item\n index = overItem ? targetItems.findIndex((i) => i.id === overItem.id) : 0\n } else {\n return\n }\n\n if (activeItem.columnId !== toColumn || active.id !== over.id) {\n onItemMove?.({\n fromColumn: activeItem.columnId,\n index,\n itemId: activeItem.id,\n toColumn,\n })\n }\n }\n\n const handleDragCancel = () => {\n setActiveId(null)\n }\n\n // Prepare columns with collapse state\n const columnsWithState = columns.map((col) => ({\n ...col,\n isCollapsed: collapsedColumns.has(col.id) || col.isCollapsed,\n }))\n\n // Group items by swimlane if groupBy is specified\n const swimlanes = useMemo(() => {\n if (!groupBy || variant !== \"swimlanes\") return null\n\n const groups = new Map<string, KanbanItem[]>()\n for (const item of filteredItems) {\n const key = (item.customFields?.[groupBy] as string | undefined) ?? \"Ungrouped\"\n const group = groups.get(key) ?? []\n group.push(item)\n groups.set(key, group)\n }\n return groups\n }, [filteredItems, groupBy, variant])\n\n // Column width style\n const widthValue = typeof columnWidth === \"number\" ? `${String(columnWidth)}px` : columnWidth\n const columnStyle = {\n minWidth: widthValue,\n width: widthValue,\n }\n\n return (\n <div\n aria-label=\"Kanban board\"\n className=\"flex flex-col gap-4\"\n data-slot=\"kanban-board-wrapper\"\n role=\"region\"\n {...props}\n >\n {/* Search bar */}\n {searchable ? (\n <div className={kanbanSearchVariants()} data-slot=\"kanban-search\">\n <Search className=\"h-4 w-4 text-muted-foreground\" />\n <input\n aria-label=\"Search items\"\n className=\"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder=\"Search items...\"\n type=\"text\"\n value={searchQuery}\n onChange={(e) => { setSearchQuery(e.target.value); }}\n />\n </div>\n ) : null}\n\n {/* Board */}\n <DndContext\n className={cn(kanbanBoardVariants({ layout, variant }), className)}\n onDragCancel={handleDragCancel}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragStart={handleDragStart}\n >\n {variant === \"swimlanes\" && swimlanes ? (\n // Swimlanes layout\n <div className=\"flex flex-col gap-6\" data-slot=\"kanban-swimlanes\">\n {[...swimlanes.entries()].map(([lane, _laneItems]) => (\n <div key={lane} className=\"flex flex-col gap-2\">\n <div className=\"text-sm font-semibold text-muted-foreground\">\n {lane}\n </div>\n <div className=\"flex gap-4 overflow-x-auto\">\n <SortableContext\n disabled={!allowColumnReorder}\n items={columnsWithState.map((c) => c.id)}\n strategy={horizontalListSortingStrategy}\n >\n {columnsWithState.map((column) => (\n <div key={column.id} style={columnStyle}>\n <KanbanColumn\n items={getColumnItems(column.id).filter(\n (item) => ((item.customFields?.[groupBy ?? \"\"] as string | undefined) ?? \"Ungrouped\") === lane\n )}\n allowAddItem={allowAddItem}\n column={column}\n showColumnCount={showColumnCount}\n showWipLimits={showWipLimits}\n onItemAdd={onItemAdd}\n onItemClick={onItemClick}\n onItemDelete={onItemDelete}\n onToggleCollapse={() => { handleToggleCollapse(column.id); }}\n />\n </div>\n ))}\n </SortableContext>\n </div>\n </div>\n ))}\n </div>\n ) : (\n // Standard layout\n <SortableContext\n disabled={!allowColumnReorder}\n items={columnsWithState.map((c) => c.id)}\n strategy={horizontalListSortingStrategy}\n >\n {columnsWithState.map((column) => (\n <div key={column.id} style={column.isCollapsed ? undefined : columnStyle}>\n <KanbanColumn\n allowAddItem={allowAddItem}\n column={column}\n items={getColumnItems(column.id)}\n showColumnCount={showColumnCount}\n showWipLimits={showWipLimits}\n onItemAdd={onItemAdd}\n onItemClick={onItemClick}\n onItemDelete={onItemDelete}\n onToggleCollapse={() => { handleToggleCollapse(column.id); }}\n />\n </div>\n ))}\n\n {/* Add column button */}\n {allowAddColumn ? (\n <button\n className={cn(\n kanbanAddButtonVariants(),\n \"min-w-52 h-52 flex-col\"\n )}\n aria-label=\"Add column\"\n type=\"button\"\n onClick={onColumnAdd}\n >\n <Plus className=\"h-6 w-6\" />\n Add column\n </button>\n ) : null}\n </SortableContext>\n )}\n\n {/* Drag overlay */}\n <DragOverlay>\n {activeItem ? (\n <div\n className=\"opacity-90 rotate-3\"\n style={columnStyle}\n >\n <KanbanCard isDragging item={activeItem} />\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n </div>\n )\n}\n\n// ============================================\n// EXPORTS\n// ============================================\n\nexport {\n KanbanBoard,\n kanbanBoardVariants,\n KanbanCard,\n kanbanCardVariants,\n kanbanColumnVariants,\n}\n\nexport type {\n ItemAddPayload,\n ItemClickPayload,\n ItemDeletePayload,\n ItemMovePayload,\n KanbanBoardProps,\n KanbanCardProps,\n KanbanColumn,\n KanbanColumnProps,\n KanbanFilterConfig,\n KanbanItem,\n KanbanLabel,\n KanbanSubtasks,\n KanbanUser,\n} from \"./KanbanBoard.types\"\n"]}
@@ -1,4 +1,4 @@
1
- import { FilterBuilder, isFilterGroup, isFilterCondition } from './chunk-Y6ZXHHUS.js';
1
+ import { FilterBuilder, isFilterGroup, isFilterCondition } from './chunk-3W7FXRO5.js';
2
2
  import { Table, TableRow, TableHeader, TableHead, TableBody, TableCell, TableFooter } from './chunk-5SUD32RK.js';
3
3
  import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuSeparator, ContextMenuItem } from './chunk-4Y72SPNL.js';
4
4
  import { SkeletonLoader } from './chunk-QHKOBGLW.js';
@@ -8,7 +8,7 @@ import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '.
8
8
  import { Checkbox } from './chunk-XETKCF73.js';
9
9
  import { TextInput } from './chunk-PWCMCMDN.js';
10
10
  import { Popover, PopoverTrigger, PopoverContent } from './chunk-AFCSDND5.js';
11
- import { Button } from './chunk-6TBA37U7.js';
11
+ import { Button } from './chunk-7TF5PVEU.js';
12
12
  import { Badge } from './chunk-4GVOOXYD.js';
13
13
  import { cn } from './chunk-HRNDJU7D.js';
14
14
  import * as React14 from 'react';
@@ -4501,5 +4501,5 @@ function DataTableDateCell({
4501
4501
  }
4502
4502
 
4503
4503
  export { DataTable, DataTableBooleanCell, DataTableCurrencyCell, DataTableDateCell, DataTableProgressCell, DataTableRatingCell, downloadFile, exportToCSV, exportToExcel, exportToPDF, tableToCSV };
4504
- //# sourceMappingURL=chunk-36LMNJKG.js.map
4505
- //# sourceMappingURL=chunk-36LMNJKG.js.map
4504
+ //# sourceMappingURL=chunk-P27ERD6W.js.map
4505
+ //# sourceMappingURL=chunk-P27ERD6W.js.map