@senitix/ui 0.4.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/dist/avatar-C0aVNCG9.cjs +2 -0
- package/dist/avatar-C0aVNCG9.cjs.map +1 -0
- package/dist/avatar-CN6wcrqY.js +288 -0
- package/dist/avatar-CN6wcrqY.js.map +1 -0
- package/dist/calendar-BFWc4IB7.js +1182 -0
- package/dist/calendar-BFWc4IB7.js.map +1 -0
- package/dist/calendar-BUm7YrNf.cjs +2 -0
- package/dist/calendar-BUm7YrNf.cjs.map +1 -0
- package/dist/calendar-ChJkFXXr.js +11 -0
- package/dist/calendar-ChJkFXXr.js.map +1 -0
- package/dist/calendar-SwL5isYC.cjs +2 -0
- package/dist/calendar-SwL5isYC.cjs.map +1 -0
- package/dist/card-K4fxyYwE.js +51 -0
- package/dist/card-K4fxyYwE.js.map +1 -0
- package/dist/card-tMkUxpmW.cjs +2 -0
- package/dist/card-tMkUxpmW.cjs.map +1 -0
- package/dist/checkbox-CpOq5hkT.js +289 -0
- package/dist/checkbox-CpOq5hkT.js.map +1 -0
- package/dist/checkbox-D7-LQyCl.cjs +2 -0
- package/dist/checkbox-D7-LQyCl.cjs.map +1 -0
- package/dist/chevron-down-DHdXqOqK.cjs +2 -0
- package/dist/chevron-down-DHdXqOqK.cjs.map +1 -0
- package/dist/chevron-down-DJ1_YIFu.js +8 -0
- package/dist/chevron-down-DJ1_YIFu.js.map +1 -0
- package/dist/chevron-right-B3bovvh0.js +8 -0
- package/dist/chevron-right-B3bovvh0.js.map +1 -0
- package/dist/chevron-right-Dvyd11q0.cjs +2 -0
- package/dist/chevron-right-Dvyd11q0.cjs.map +1 -0
- package/dist/chevron-up-B9fuiZhc.cjs +2 -0
- package/dist/chevron-up-B9fuiZhc.cjs.map +1 -0
- package/dist/chevron-up-CGtXOr51.js +6 -0
- package/dist/chevron-up-CGtXOr51.js.map +1 -0
- package/dist/components/charts/index.cjs.js +2 -0
- package/dist/components/charts/index.cjs.js.map +1 -0
- package/dist/components/charts/index.es.js +12 -0
- package/dist/components/charts/index.es.js.map +1 -0
- package/dist/components/data-display/index.cjs.js +2 -0
- package/dist/components/data-display/index.cjs.js.map +1 -0
- package/dist/components/data-display/index.es.js +25 -0
- package/dist/components/data-display/index.es.js.map +1 -0
- package/dist/components/dnd/index.cjs.js +2 -0
- package/dist/components/dnd/index.cjs.js.map +1 -0
- package/dist/components/dnd/index.es.js +9 -0
- package/dist/components/dnd/index.es.js.map +1 -0
- package/dist/components/feedback/index.cjs.js +2 -0
- package/dist/components/feedback/index.cjs.js.map +1 -0
- package/dist/components/feedback/index.es.js +16 -0
- package/dist/components/feedback/index.es.js.map +1 -0
- package/dist/components/forms/index.cjs.js +2 -0
- package/dist/components/forms/index.cjs.js.map +1 -0
- package/dist/components/forms/index.es.js +27 -0
- package/dist/components/forms/index.es.js.map +1 -0
- package/dist/components/layouts/index.cjs.js +2 -0
- package/dist/components/layouts/index.cjs.js.map +1 -0
- package/dist/components/layouts/index.es.js +25 -0
- package/dist/components/layouts/index.es.js.map +1 -0
- package/dist/components/navigation/index.cjs.js +2 -0
- package/dist/components/navigation/index.cjs.js.map +1 -0
- package/dist/components/navigation/index.es.js +42 -0
- package/dist/components/navigation/index.es.js.map +1 -0
- package/dist/components/ui/index.cjs.js +2 -0
- package/dist/components/ui/index.cjs.js.map +1 -0
- package/dist/components/ui/index.es.js +165 -0
- package/dist/components/ui/index.es.js.map +1 -0
- package/dist/createLucideIcon-BbeNo6vq.js +56 -0
- package/dist/createLucideIcon-BbeNo6vq.js.map +1 -0
- package/dist/createLucideIcon-i5GEhNMV.cjs +2 -0
- package/dist/createLucideIcon-i5GEhNMV.cjs.map +1 -0
- package/dist/ellipsis-BW2gWki8.cjs +2 -0
- package/dist/ellipsis-BW2gWki8.cjs.map +1 -0
- package/dist/ellipsis-CiKEaUNP.js +10 -0
- package/dist/ellipsis-CiKEaUNP.js.map +1 -0
- package/dist/file-V_hhCUhr.cjs +2 -0
- package/dist/file-V_hhCUhr.cjs.map +1 -0
- package/dist/file-wzTXnWqz.js +9 -0
- package/dist/file-wzTXnWqz.js.map +1 -0
- package/dist/filter-tags-DjUaNXHR.cjs +5 -0
- package/dist/filter-tags-DjUaNXHR.cjs.map +1 -0
- package/dist/filter-tags-i_I8qV1N.js +2658 -0
- package/dist/filter-tags-i_I8qV1N.js.map +1 -0
- package/dist/full-calendar-7ac2FFU6.js +3518 -0
- package/dist/full-calendar-7ac2FFU6.js.map +1 -0
- package/dist/full-calendar-Cpeh5xMP.cjs +8 -0
- package/dist/full-calendar-Cpeh5xMP.cjs.map +1 -0
- package/dist/global-search-UNXjoFlI.cjs +2 -0
- package/dist/global-search-UNXjoFlI.cjs.map +1 -0
- package/dist/global-search-h1rVbP2q.js +1188 -0
- package/dist/global-search-h1rVbP2q.js.map +1 -0
- package/dist/hooks/index.cjs.js +2 -0
- package/dist/hooks/index.cjs.js.map +1 -0
- package/dist/hooks/index.es.js +13 -0
- package/dist/hooks/index.es.js.map +1 -0
- package/dist/index-Co9o9StL.js +33 -0
- package/dist/index-Co9o9StL.js.map +1 -0
- package/dist/index-CwJPJKOE.js +2278 -0
- package/dist/index-CwJPJKOE.js.map +1 -0
- package/dist/index-CzVK9Zyb.cjs +6 -0
- package/dist/index-CzVK9Zyb.cjs.map +1 -0
- package/dist/index-l828OqQN.js +288 -0
- package/dist/index-l828OqQN.js.map +1 -0
- package/dist/index-lGzB9daF.cjs +2 -0
- package/dist/index-lGzB9daF.cjs.map +1 -0
- package/dist/index-lT9bLt9X.cjs +2 -0
- package/dist/index-lT9bLt9X.cjs.map +1 -0
- package/dist/index.cjs.js +2 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.es.js +332 -0
- package/dist/index.es.js.map +1 -0
- package/dist/input-CZrckPLk.cjs +42 -0
- package/dist/input-CZrckPLk.cjs.map +1 -0
- package/dist/input-D4AoiWxo.js +3629 -0
- package/dist/input-D4AoiWxo.js.map +1 -0
- package/dist/locale-provider-DHMwuneF.cjs +2 -0
- package/dist/locale-provider-DHMwuneF.cjs.map +1 -0
- package/dist/locale-provider-DanG6RRG.js +1012 -0
- package/dist/locale-provider-DanG6RRG.js.map +1 -0
- package/dist/locale-selector-Ppe0KTi-.cjs +2 -0
- package/dist/locale-selector-Ppe0KTi-.cjs.map +1 -0
- package/dist/locale-selector-xn2GpdP9.js +1745 -0
- package/dist/locale-selector-xn2GpdP9.js.map +1 -0
- package/dist/minus-BXBFZSZs.cjs +2 -0
- package/dist/minus-BXBFZSZs.cjs.map +1 -0
- package/dist/minus-DvlYtl96.js +6 -0
- package/dist/minus-DvlYtl96.js.map +1 -0
- package/dist/multi-container-C2UpSw5f.js +731 -0
- package/dist/multi-container-C2UpSw5f.js.map +1 -0
- package/dist/multi-container-DMKL8c9B.cjs +2 -0
- package/dist/multi-container-DMKL8c9B.cjs.map +1 -0
- package/dist/pipeline-By5_8AFg.cjs +2 -0
- package/dist/pipeline-By5_8AFg.cjs.map +1 -0
- package/dist/pipeline-D-QNSU0U.js +1036 -0
- package/dist/pipeline-D-QNSU0U.js.map +1 -0
- package/dist/plus-8wKRkVu-.cjs +2 -0
- package/dist/plus-8wKRkVu-.cjs.map +1 -0
- package/dist/plus-CJD68KQD.js +9 -0
- package/dist/plus-CJD68KQD.js.map +1 -0
- package/dist/popover-4V4sGe1U.js +765 -0
- package/dist/popover-4V4sGe1U.js.map +1 -0
- package/dist/popover-ivh-plLc.cjs +2 -0
- package/dist/popover-ivh-plLc.cjs.map +1 -0
- package/dist/progress-CFnuLqnS.cjs +7 -0
- package/dist/progress-CFnuLqnS.cjs.map +1 -0
- package/dist/progress-D5AsrWa6.js +222 -0
- package/dist/progress-D5AsrWa6.js.map +1 -0
- package/dist/providers/index.cjs.js +2 -0
- package/dist/providers/index.cjs.js.map +1 -0
- package/dist/providers/index.es.js +9 -0
- package/dist/providers/index.es.js.map +1 -0
- package/dist/scroll-area-DQeqDp3Y.js +952 -0
- package/dist/scroll-area-DQeqDp3Y.js.map +1 -0
- package/dist/scroll-area-DYOiJMXh.cjs +2 -0
- package/dist/scroll-area-DYOiJMXh.cjs.map +1 -0
- package/dist/select-C1rNBi6c.js +974 -0
- package/dist/select-C1rNBi6c.js.map +1 -0
- package/dist/select-m-Mqwxu3.cjs +2 -0
- package/dist/select-m-Mqwxu3.cjs.map +1 -0
- package/dist/separator-DBUivkHq.cjs +2 -0
- package/dist/separator-DBUivkHq.cjs.map +1 -0
- package/dist/separator-DsfoJx-2.js +395 -0
- package/dist/separator-DsfoJx-2.js.map +1 -0
- package/dist/sheet-BVWCpq7E.js +84 -0
- package/dist/sheet-BVWCpq7E.js.map +1 -0
- package/dist/sheet-mKiFLVnK.cjs +2 -0
- package/dist/sheet-mKiFLVnK.cjs.map +1 -0
- package/dist/skeleton-BSwwYaQU.cjs +2 -0
- package/dist/skeleton-BSwwYaQU.cjs.map +1 -0
- package/dist/skeleton-BmGbfJw3.js +9 -0
- package/dist/skeleton-BmGbfJw3.js.map +1 -0
- package/dist/sortable.esm-Blhf_jh1.js +3391 -0
- package/dist/sortable.esm-Blhf_jh1.js.map +1 -0
- package/dist/sortable.esm-DcQYlXi3.cjs +6 -0
- package/dist/sortable.esm-DcQYlXi3.cjs.map +1 -0
- package/dist/sparkline-chart-Da-ehDGv.js +21082 -0
- package/dist/sparkline-chart-Da-ehDGv.js.map +1 -0
- package/dist/sparkline-chart-ca3uTzVK.cjs +68 -0
- package/dist/sparkline-chart-ca3uTzVK.cjs.map +1 -0
- package/dist/trending-up-D3Nfrhi3.cjs +2 -0
- package/dist/trending-up-D3Nfrhi3.cjs.map +1 -0
- package/dist/trending-up-DPwlYzQb.js +9 -0
- package/dist/trending-up-DPwlYzQb.js.map +1 -0
- package/dist/ui.css +1 -0
- package/dist/use-formatters-d97RVcmg.cjs +2 -0
- package/dist/use-formatters-d97RVcmg.cjs.map +1 -0
- package/dist/use-formatters-l1_2c8z0.js +6682 -0
- package/dist/use-formatters-l1_2c8z0.js.map +1 -0
- package/dist/use-local-storage-BjlrKzE-.js +42 -0
- package/dist/use-local-storage-BjlrKzE-.js.map +1 -0
- package/dist/use-local-storage-q-1odzIu.cjs +2 -0
- package/dist/use-local-storage-q-1odzIu.cjs.map +1 -0
- package/dist/use-mobile-C-LMK4T8.js +15 -0
- package/dist/use-mobile-C-LMK4T8.js.map +1 -0
- package/dist/use-mobile-DY7TJ5lx.cjs +2 -0
- package/dist/use-mobile-DY7TJ5lx.cjs.map +1 -0
- package/dist/use-toast-DG2qdYhl.js +97 -0
- package/dist/use-toast-DG2qdYhl.js.map +1 -0
- package/dist/use-toast-DxZJ8uUm.cjs +2 -0
- package/dist/use-toast-DxZJ8uUm.cjs.map +1 -0
- package/dist/utils/index.cjs.js +2 -0
- package/dist/utils/index.cjs.js.map +1 -0
- package/dist/utils/index.es.js +5 -0
- package/dist/utils/index.es.js.map +1 -0
- package/dist/welcome-card-CPolYl1D.cjs +2 -0
- package/dist/welcome-card-CPolYl1D.cjs.map +1 -0
- package/dist/welcome-card-CxMJZ8bv.js +963 -0
- package/dist/welcome-card-CxMJZ8bv.js.map +1 -0
- package/package.json +179 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-container-C2UpSw5f.js","sources":["../node_modules/lucide-react/dist/esm/icons/folder.js","../src/components/dnd/sortable-item.tsx","../node_modules/@dnd-kit/modifiers/dist/modifiers.esm.js","../src/components/dnd/sortable-list.tsx","../src/components/dnd/kanban-board.tsx","../src/components/dnd/tree-view.tsx","../src/components/dnd/multi-container.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.441.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Folder = createLucideIcon(\"Folder\", [\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n]);\n\nexport { Folder as default };\n//# sourceMappingURL=folder.js.map\n","import * as React from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { cn } from '@/utils/cn'\n\nexport interface SortableItemProps {\n id: string | number\n children: React.ReactNode\n className?: string\n disabled?: boolean\n}\n\nexport function SortableItem({\n id,\n children,\n className,\n disabled = false,\n}: SortableItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id, disabled })\n\n const style: React.CSSProperties = React.useMemo(() => ({\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n }), [transform, transition, isDragging])\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(\n 'rounded-xl border bg-card text-card-foreground p-3 shadow-sm touch-none select-none',\n isDragging && 'z-50 ring-2 ring-primary/30',\n disabled && 'opacity-50 cursor-not-allowed',\n !disabled && !isDragging && 'cursor-grab hover:shadow-md hover:border-primary/30',\n !disabled && isDragging && 'cursor-grabbing',\n className\n )}\n {...attributes}\n {...listeners}\n >\n <div className=\"min-w-0\">{children}</div>\n </div>\n )\n}\n","import { getEventCoordinates } from '@dnd-kit/utilities';\n\nfunction createSnapModifier(gridSize) {\n return _ref => {\n let {\n transform\n } = _ref;\n return { ...transform,\n x: Math.ceil(transform.x / gridSize) * gridSize,\n y: Math.ceil(transform.y / gridSize) * gridSize\n };\n };\n}\n\nconst restrictToHorizontalAxis = _ref => {\n let {\n transform\n } = _ref;\n return { ...transform,\n y: 0\n };\n};\n\nfunction restrictToBoundingRect(transform, rect, boundingRect) {\n const value = { ...transform\n };\n\n if (rect.top + transform.y <= boundingRect.top) {\n value.y = boundingRect.top - rect.top;\n } else if (rect.bottom + transform.y >= boundingRect.top + boundingRect.height) {\n value.y = boundingRect.top + boundingRect.height - rect.bottom;\n }\n\n if (rect.left + transform.x <= boundingRect.left) {\n value.x = boundingRect.left - rect.left;\n } else if (rect.right + transform.x >= boundingRect.left + boundingRect.width) {\n value.x = boundingRect.left + boundingRect.width - rect.right;\n }\n\n return value;\n}\n\nconst restrictToParentElement = _ref => {\n let {\n containerNodeRect,\n draggingNodeRect,\n transform\n } = _ref;\n\n if (!draggingNodeRect || !containerNodeRect) {\n return transform;\n }\n\n return restrictToBoundingRect(transform, draggingNodeRect, containerNodeRect);\n};\n\nconst restrictToFirstScrollableAncestor = _ref => {\n let {\n draggingNodeRect,\n transform,\n scrollableAncestorRects\n } = _ref;\n const firstScrollableAncestorRect = scrollableAncestorRects[0];\n\n if (!draggingNodeRect || !firstScrollableAncestorRect) {\n return transform;\n }\n\n return restrictToBoundingRect(transform, draggingNodeRect, firstScrollableAncestorRect);\n};\n\nconst restrictToVerticalAxis = _ref => {\n let {\n transform\n } = _ref;\n return { ...transform,\n x: 0\n };\n};\n\nconst restrictToWindowEdges = _ref => {\n let {\n transform,\n draggingNodeRect,\n windowRect\n } = _ref;\n\n if (!draggingNodeRect || !windowRect) {\n return transform;\n }\n\n return restrictToBoundingRect(transform, draggingNodeRect, windowRect);\n};\n\nconst snapCenterToCursor = _ref => {\n let {\n activatorEvent,\n draggingNodeRect,\n transform\n } = _ref;\n\n if (draggingNodeRect && activatorEvent) {\n const activatorCoordinates = getEventCoordinates(activatorEvent);\n\n if (!activatorCoordinates) {\n return transform;\n }\n\n const offsetX = activatorCoordinates.x - draggingNodeRect.left;\n const offsetY = activatorCoordinates.y - draggingNodeRect.top;\n return { ...transform,\n x: transform.x + offsetX - draggingNodeRect.width / 2,\n y: transform.y + offsetY - draggingNodeRect.height / 2\n };\n }\n\n return transform;\n};\n\nexport { createSnapModifier, restrictToFirstScrollableAncestor, restrictToHorizontalAxis, restrictToParentElement, restrictToVerticalAxis, restrictToWindowEdges, snapCenterToCursor };\n//# sourceMappingURL=modifiers.esm.js.map\n","import * as React from 'react'\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n DragEndEvent,\n DragStartEvent,\n DragOverlay,\n UniqueIdentifier,\n defaultDropAnimationSideEffects,\n DropAnimation,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n horizontalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { snapCenterToCursor, restrictToWindowEdges } from '@dnd-kit/modifiers'\nimport { cn } from '@/utils/cn'\nimport { SortableItem } from './sortable-item'\n\nexport interface SortableListItem {\n id: string | number\n [key: string]: unknown\n}\n\nexport interface SortableListProps<T extends SortableListItem> {\n items: T[]\n onReorder: (items: T[]) => void\n renderItem: (item: T) => React.ReactNode\n renderOverlay?: (item: T) => React.ReactNode\n direction?: 'vertical' | 'horizontal'\n className?: string\n itemClassName?: string\n disabled?: boolean\n gap?: 'sm' | 'md' | 'lg'\n}\n\nconst gapClasses = {\n sm: 'gap-1',\n md: 'gap-2',\n lg: 'gap-4',\n}\n\nconst dropAnimationConfig: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0.5',\n },\n },\n }),\n}\n\nexport function SortableList<T extends SortableListItem>({\n items,\n onReorder,\n renderItem,\n renderOverlay,\n direction = 'vertical',\n className,\n itemClassName,\n disabled = false,\n gap = 'md',\n}: SortableListProps<T>) {\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const handleDragStart = React.useCallback((event: DragStartEvent) => {\n setActiveId(event.active.id)\n }, [])\n\n const handleDragEnd = React.useCallback((event: DragEndEvent) => {\n const { active, over } = event\n\n if (over && active.id !== over.id) {\n const oldIndex = items.findIndex((item) => item.id === active.id)\n const newIndex = items.findIndex((item) => item.id === over.id)\n if (oldIndex !== -1 && newIndex !== -1) {\n onReorder(arrayMove(items, oldIndex, newIndex))\n }\n }\n\n setActiveId(null)\n }, [items, onReorder])\n\n const handleDragCancel = React.useCallback(() => {\n setActiveId(null)\n }, [])\n\n const activeItem = React.useMemo(\n () => items.find((item) => item.id === activeId),\n [activeId, items]\n )\n\n const itemIds = React.useMemo(() => items.map((item) => item.id), [items])\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <SortableContext\n items={itemIds}\n strategy={direction === 'vertical' ? verticalListSortingStrategy : horizontalListSortingStrategy}\n >\n <div\n className={cn(\n 'flex',\n direction === 'vertical' ? 'flex-col' : 'flex-row flex-wrap',\n gapClasses[gap],\n className\n )}\n >\n {items.map((item) => (\n <SortableItem\n key={item.id}\n id={item.id}\n className={itemClassName}\n disabled={disabled}\n >\n {renderItem(item)}\n </SortableItem>\n ))}\n </div>\n </SortableContext>\n\n <DragOverlay dropAnimation={dropAnimationConfig} modifiers={[snapCenterToCursor, restrictToWindowEdges]}>\n {activeItem ? (\n <div className=\"rounded-xl border bg-card text-card-foreground p-3 shadow-2xl ring-2 ring-primary/30 cursor-grabbing\">\n {renderOverlay ? renderOverlay(activeItem) : renderItem(activeItem)}\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n )\n}\n","import * as React from 'react'\nimport {\n DndContext,\n DragEndEvent,\n DragOverEvent,\n DragOverlay,\n DragStartEvent,\n KeyboardSensor,\n PointerSensor,\n UniqueIdentifier,\n useSensor,\n useSensors,\n useDroppable,\n pointerWithin,\n rectIntersection,\n CollisionDetection,\n defaultDropAnimationSideEffects,\n DropAnimation,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n arrayMove,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { snapCenterToCursor, restrictToWindowEdges } from '@dnd-kit/modifiers'\nimport { cn } from '@/utils/cn'\n\nexport interface KanbanItem {\n id: string | number\n columnId: string | number\n [key: string]: unknown\n}\n\nexport interface KanbanColumn {\n id: string | number\n title: string\n}\n\nexport interface KanbanBoardProps<T extends KanbanItem> {\n columns: KanbanColumn[]\n items: T[]\n onItemMove: (itemId: UniqueIdentifier, fromColumnId: UniqueIdentifier, toColumnId: UniqueIdentifier, newIndex: number) => void\n onReorder?: (columnId: UniqueIdentifier, items: T[]) => void\n renderItem: (item: T) => React.ReactNode\n renderColumnHeader?: (column: KanbanColumn) => React.ReactNode\n className?: string\n columnClassName?: string\n itemClassName?: string\n}\n\ninterface SortableKanbanItemProps {\n id: string | number\n children: React.ReactNode\n className?: string\n}\n\nconst SortableKanbanItem = React.memo(function SortableKanbanItem({\n id,\n children,\n className\n}: SortableKanbanItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id })\n\n const style: React.CSSProperties = React.useMemo(() => ({\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n }), [transform, transition, isDragging])\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(\n 'rounded-xl border bg-card text-card-foreground p-3 shadow-sm touch-none select-none',\n isDragging && 'ring-2 ring-primary/20',\n !isDragging && 'cursor-grab hover:shadow-md hover:border-primary/30',\n isDragging && 'cursor-grabbing',\n className\n )}\n {...attributes}\n {...listeners}\n >\n <div className=\"min-w-0\">{children}</div>\n </div>\n )\n})\n\ninterface DroppableColumnProps<T extends KanbanItem> {\n column: KanbanColumn\n items: T[]\n renderItem: (item: T) => React.ReactNode\n renderColumnHeader?: (column: KanbanColumn) => React.ReactNode\n columnClassName?: string\n itemClassName?: string\n}\n\nfunction DroppableColumn<T extends KanbanItem>({\n column,\n items,\n renderItem,\n renderColumnHeader,\n columnClassName,\n itemClassName,\n}: DroppableColumnProps<T>) {\n const { setNodeRef, isOver } = useDroppable({\n id: `column-${column.id}`,\n data: {\n type: 'column',\n columnId: column.id,\n },\n })\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'flex flex-col min-w-[280px] w-[280px] bg-muted/30 border border-border/50 rounded-xl p-3 transition-colors duration-200',\n isOver && 'ring-2 ring-primary/30 bg-primary/5',\n columnClassName\n )}\n >\n <div className=\"flex items-center justify-between mb-3 px-1\">\n {renderColumnHeader ? (\n renderColumnHeader(column)\n ) : (\n <h3 className=\"font-semibold text-sm text-foreground\">{column.title}</h3>\n )}\n <span className=\"text-xs font-medium text-muted-foreground bg-background border px-2 py-0.5 rounded-full shadow-sm\">\n {items.length}\n </span>\n </div>\n <SortableContext\n items={items.map((item) => item.id)}\n strategy={verticalListSortingStrategy}\n >\n <div className=\"flex flex-col gap-2 min-h-[100px] flex-1\">\n {items.map((item) => (\n <SortableKanbanItem\n key={item.id}\n id={item.id}\n className={itemClassName}\n >\n {renderItem(item)}\n </SortableKanbanItem>\n ))}\n </div>\n </SortableContext>\n </div>\n )\n}\n\n// Custom collision detection that prioritizes items over columns\nconst customCollisionDetection: CollisionDetection = (args) => {\n const pointerCollisions = pointerWithin(args)\n const itemCollisions = pointerCollisions.filter(\n (collision) => !String(collision.id).startsWith('column-')\n )\n\n if (itemCollisions.length > 0) {\n return itemCollisions\n }\n\n const rectCollisions = rectIntersection(args)\n return rectCollisions\n}\n\nconst dropAnimationConfig: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0.5',\n },\n },\n }),\n}\n\nexport function KanbanBoard<T extends KanbanItem>({\n columns,\n items,\n onItemMove,\n onReorder,\n renderItem,\n renderColumnHeader,\n className,\n columnClassName,\n itemClassName,\n}: KanbanBoardProps<T>) {\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null)\n const lastOverId = React.useRef<UniqueIdentifier | null>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const getItemsByColumn = React.useCallback(\n (columnId: UniqueIdentifier) => items.filter((item) => item.columnId === columnId),\n [items]\n )\n\n const findColumnByItemId = React.useCallback(\n (itemId: UniqueIdentifier): UniqueIdentifier | undefined => {\n const item = items.find((i) => i.id === itemId)\n return item?.columnId\n },\n [items]\n )\n\n const extractColumnId = React.useCallback(\n (overId: UniqueIdentifier): UniqueIdentifier | undefined => {\n const overIdStr = String(overId)\n if (overIdStr.startsWith('column-')) {\n return overIdStr.replace('column-', '')\n }\n return findColumnByItemId(overId)\n },\n [findColumnByItemId]\n )\n\n const handleDragStart = React.useCallback((event: DragStartEvent) => {\n setActiveId(event.active.id)\n lastOverId.current = null\n }, [])\n\n const handleDragOver = React.useCallback((event: DragOverEvent) => {\n const { active, over } = event\n if (!over) return\n\n const activeColumnId = findColumnByItemId(active.id)\n const overColumnId = extractColumnId(over.id)\n\n if (!activeColumnId || !overColumnId) return\n if (activeColumnId === overColumnId) return\n\n if (lastOverId.current === over.id) return\n lastOverId.current = over.id\n\n const overColumnItems = getItemsByColumn(overColumnId)\n const overIdStr = String(over.id)\n\n let newIndex: number\n if (overIdStr.startsWith('column-')) {\n newIndex = overColumnItems.length\n } else {\n const overIndex = overColumnItems.findIndex((item) => item.id === over.id)\n newIndex = overIndex >= 0 ? overIndex : overColumnItems.length\n }\n\n onItemMove(active.id, activeColumnId, overColumnId, newIndex)\n }, [findColumnByItemId, extractColumnId, getItemsByColumn, onItemMove])\n\n const handleDragEnd = React.useCallback((event: DragEndEvent) => {\n const { active, over } = event\n\n if (!over) {\n setActiveId(null)\n lastOverId.current = null\n return\n }\n\n const activeColumnId = findColumnByItemId(active.id)\n const overIdStr = String(over.id)\n\n let overColumnId: UniqueIdentifier | undefined\n if (overIdStr.startsWith('column-')) {\n overColumnId = overIdStr.replace('column-', '')\n } else {\n overColumnId = findColumnByItemId(over.id)\n }\n\n if (!activeColumnId) {\n setActiveId(null)\n lastOverId.current = null\n return\n }\n\n if (activeColumnId === overColumnId && active.id !== over.id && onReorder && !overIdStr.startsWith('column-')) {\n const columnItems = getItemsByColumn(activeColumnId)\n const oldIndex = columnItems.findIndex((item) => item.id === active.id)\n const newIndex = columnItems.findIndex((item) => item.id === over.id)\n if (oldIndex !== -1 && newIndex !== -1) {\n onReorder(activeColumnId, arrayMove(columnItems, oldIndex, newIndex) as T[])\n }\n }\n\n setActiveId(null)\n lastOverId.current = null\n }, [findColumnByItemId, getItemsByColumn, onReorder])\n\n const handleDragCancel = React.useCallback(() => {\n setActiveId(null)\n lastOverId.current = null\n }, [])\n\n const activeItem = React.useMemo(\n () => items.find((item) => item.id === activeId),\n [activeId, items]\n )\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={customCollisionDetection}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <div className={cn('flex gap-4 overflow-x-auto p-1', className)}>\n {columns.map((column) => {\n const columnItems = getItemsByColumn(column.id)\n return (\n <DroppableColumn\n key={column.id}\n column={column}\n items={columnItems}\n renderItem={renderItem}\n renderColumnHeader={renderColumnHeader}\n columnClassName={columnClassName}\n itemClassName={itemClassName}\n />\n )\n })}\n </div>\n\n <DragOverlay dropAnimation={dropAnimationConfig} modifiers={[snapCenterToCursor, restrictToWindowEdges]}>\n {activeItem ? (\n <div className=\"rounded-xl border bg-card text-card-foreground p-3 shadow-2xl ring-2 ring-primary/30 cursor-grabbing\">\n <div className=\"min-w-0\">{renderItem(activeItem)}</div>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n )\n}\n","import * as React from 'react'\nimport {\n DndContext,\n DragEndEvent,\n DragOverlay,\n DragStartEvent,\n KeyboardSensor,\n PointerSensor,\n UniqueIdentifier,\n closestCenter,\n useSensor,\n useSensors,\n defaultDropAnimationSideEffects,\n DropAnimation,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { snapCenterToCursor, restrictToWindowEdges } from '@dnd-kit/modifiers'\nimport { cn } from '@/utils/cn'\nimport { ChevronRight, Folder, File } from 'lucide-react'\n\nexport interface TreeNode {\n id: string | number\n label: string\n children?: TreeNode[]\n isFolder?: boolean\n [key: string]: unknown\n}\n\nexport interface TreeViewProps {\n data: TreeNode[]\n onMove?: (nodeId: UniqueIdentifier, newParentId: UniqueIdentifier | null, index: number) => void\n onToggle?: (nodeId: UniqueIdentifier, expanded: boolean) => void\n renderNode?: (node: TreeNode) => React.ReactNode\n className?: string\n defaultExpanded?: Set<UniqueIdentifier>\n}\n\ninterface TreeNodeItemProps {\n node: TreeNode\n depth: number\n expanded: boolean\n onToggle: () => void\n renderNode?: (node: TreeNode) => React.ReactNode\n}\n\nconst TreeNodeItem = React.memo(function TreeNodeItem({\n node,\n depth,\n expanded,\n onToggle,\n renderNode,\n}: TreeNodeItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: node.id })\n\n const style: React.CSSProperties = React.useMemo(() => ({\n transform: CSS.Transform.toString(transform),\n transition,\n paddingLeft: `${depth * 20 + 8}px`,\n opacity: isDragging ? 0.5 : 1,\n }), [transform, transition, depth, isDragging])\n\n const hasChildren = node.children && node.children.length > 0\n const isFolder = node.isFolder || hasChildren\n\n const handleToggleClick = React.useCallback((e: React.MouseEvent) => {\n e.stopPropagation()\n onToggle()\n }, [onToggle])\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(\n 'flex items-center gap-2 py-2 pr-3 rounded-lg touch-none select-none',\n isDragging && 'bg-muted ring-1 ring-primary/20',\n !isDragging && 'cursor-grab hover:bg-muted/60',\n isDragging && 'cursor-grabbing'\n )}\n {...attributes}\n {...listeners}\n >\n {isFolder ? (\n <button\n type=\"button\"\n onClick={handleToggleClick}\n className=\"flex-shrink-0 p-1 hover:bg-muted rounded-md transition-colors duration-200\"\n >\n <ChevronRight\n className={cn(\n 'h-4 w-4 text-muted-foreground transition-transform duration-200',\n expanded && 'rotate-90'\n )}\n />\n </button>\n ) : (\n <span className=\"w-6\" />\n )}\n\n <span className={cn(\n 'flex-shrink-0',\n isFolder ? 'text-primary/80' : 'text-muted-foreground'\n )}>\n {isFolder ? <Folder className=\"h-4 w-4\" /> : <File className=\"h-4 w-4\" />}\n </span>\n\n <span className=\"flex-1 truncate text-sm text-foreground\">\n {renderNode ? renderNode(node) : node.label}\n </span>\n </div>\n )\n})\n\nfunction flattenTree(\n nodes: TreeNode[],\n expandedIds: Set<UniqueIdentifier>,\n depth = 0\n): Array<{ node: TreeNode; depth: number }> {\n const result: Array<{ node: TreeNode; depth: number }> = []\n\n for (const node of nodes) {\n result.push({ node, depth })\n if (node.children && expandedIds.has(node.id)) {\n result.push(...flattenTree(node.children, expandedIds, depth + 1))\n }\n }\n\n return result\n}\n\nconst dropAnimationConfig: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0.5',\n },\n },\n }),\n}\n\nexport function TreeView({\n data,\n onMove,\n onToggle,\n renderNode,\n className,\n defaultExpanded = new Set(),\n}: TreeViewProps) {\n const [expandedIds, setExpandedIds] = React.useState<Set<UniqueIdentifier>>(defaultExpanded)\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const flattenedItems = React.useMemo(\n () => flattenTree(data, expandedIds),\n [data, expandedIds]\n )\n\n const handleToggle = React.useCallback((nodeId: UniqueIdentifier) => {\n setExpandedIds(prev => {\n const newExpanded = new Set(prev)\n const wasExpanded = newExpanded.has(nodeId)\n\n if (wasExpanded) {\n newExpanded.delete(nodeId)\n } else {\n newExpanded.add(nodeId)\n }\n\n onToggle?.(nodeId, !wasExpanded)\n return newExpanded\n })\n }, [onToggle])\n\n const handleDragStart = React.useCallback((event: DragStartEvent) => {\n setActiveId(event.active.id)\n }, [])\n\n const handleDragEnd = React.useCallback((event: DragEndEvent) => {\n const { active, over } = event\n\n if (over && active.id !== over.id) {\n const activeIndex = flattenedItems.findIndex((item) => item.node.id === active.id)\n const overIndex = flattenedItems.findIndex((item) => item.node.id === over.id)\n\n if (activeIndex !== -1 && overIndex !== -1) {\n onMove?.(active.id, null, overIndex)\n }\n }\n\n setActiveId(null)\n }, [flattenedItems, onMove])\n\n const handleDragCancel = React.useCallback(() => {\n setActiveId(null)\n }, [])\n\n const activeNode = React.useMemo(\n () => flattenedItems.find((item) => item.node.id === activeId)?.node,\n [activeId, flattenedItems]\n )\n\n const itemIds = React.useMemo(\n () => flattenedItems.map((item) => item.node.id),\n [flattenedItems]\n )\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <SortableContext\n items={itemIds}\n strategy={verticalListSortingStrategy}\n >\n <div className={cn('border rounded-xl p-3 bg-card shadow-sm', className)}>\n {flattenedItems.map(({ node, depth }) => (\n <TreeNodeItem\n key={node.id}\n node={node}\n depth={depth}\n expanded={expandedIds.has(node.id)}\n onToggle={() => handleToggle(node.id)}\n renderNode={renderNode}\n />\n ))}\n </div>\n </SortableContext>\n\n <DragOverlay dropAnimation={dropAnimationConfig} modifiers={[snapCenterToCursor, restrictToWindowEdges]}>\n {activeNode ? (\n <div className=\"flex items-center gap-2 py-2 px-3 rounded-lg bg-card border shadow-2xl ring-2 ring-primary/30 cursor-grabbing\">\n <span className={cn(\n 'flex-shrink-0',\n activeNode.isFolder || (activeNode.children && activeNode.children.length > 0)\n ? 'text-primary/80'\n : 'text-muted-foreground'\n )}>\n {activeNode.isFolder || (activeNode.children && activeNode.children.length > 0) ? (\n <Folder className=\"h-4 w-4\" />\n ) : (\n <File className=\"h-4 w-4\" />\n )}\n </span>\n <span className=\"text-sm text-foreground\">\n {renderNode ? renderNode(activeNode) : activeNode.label}\n </span>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n )\n}\n","import * as React from 'react'\nimport {\n DndContext,\n DragEndEvent,\n DragOverEvent,\n DragOverlay,\n DragStartEvent,\n KeyboardSensor,\n PointerSensor,\n UniqueIdentifier,\n closestCenter,\n useSensor,\n useSensors,\n useDroppable,\n defaultDropAnimationSideEffects,\n DropAnimation,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n arrayMove,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { snapCenterToCursor, restrictToWindowEdges } from '@dnd-kit/modifiers'\nimport { cn } from '@/utils/cn'\n\nexport interface ContainerItem {\n id: string | number\n containerId: string | number\n [key: string]: unknown\n}\n\nexport interface Container {\n id: string | number\n title: string\n}\n\nexport interface MultiContainerProps<T extends ContainerItem> {\n containers: Container[]\n items: T[]\n onItemMove: (\n itemId: UniqueIdentifier,\n fromContainerId: UniqueIdentifier,\n toContainerId: UniqueIdentifier,\n newIndex: number\n ) => void\n onReorder?: (containerId: UniqueIdentifier, items: T[]) => void\n renderItem: (item: T) => React.ReactNode\n renderContainerHeader?: (container: Container, itemCount: number) => React.ReactNode\n renderEmptyContainer?: (container: Container) => React.ReactNode\n className?: string\n containerClassName?: string\n itemClassName?: string\n layout?: 'horizontal' | 'vertical' | 'grid'\n}\n\ninterface DroppableContainerProps {\n id: UniqueIdentifier\n children: React.ReactNode\n className?: string\n isEmpty?: boolean\n}\n\nfunction DroppableContainer({ id, children, className, isEmpty }: DroppableContainerProps) {\n const { setNodeRef, isOver } = useDroppable({ id })\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'min-h-[100px] rounded-xl transition-colors duration-200',\n isOver && 'bg-primary/5 ring-2 ring-primary/30',\n isEmpty && 'border-2 border-dashed border-muted-foreground/30',\n className\n )}\n >\n {children}\n </div>\n )\n}\n\ninterface SortableContainerItemProps {\n id: string | number\n children: React.ReactNode\n className?: string\n}\n\nconst SortableContainerItem = React.memo(function SortableContainerItem({\n id,\n children,\n className\n}: SortableContainerItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id })\n\n const style: React.CSSProperties = React.useMemo(() => ({\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n }), [transform, transition, isDragging])\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(\n 'rounded-xl border bg-card text-card-foreground p-3 shadow-sm touch-none select-none',\n isDragging && 'ring-2 ring-primary/20',\n !isDragging && 'cursor-grab hover:shadow-md hover:border-primary/30',\n isDragging && 'cursor-grabbing',\n className\n )}\n {...attributes}\n {...listeners}\n >\n <div className=\"min-w-0\">{children}</div>\n </div>\n )\n})\n\nconst layoutClasses = {\n horizontal: 'flex gap-4 overflow-x-auto',\n vertical: 'flex flex-col gap-4',\n grid: 'grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4',\n}\n\nconst dropAnimationConfig: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0.5',\n },\n },\n }),\n}\n\nexport function MultiContainer<T extends ContainerItem>({\n containers,\n items,\n onItemMove,\n onReorder,\n renderItem,\n renderContainerHeader,\n renderEmptyContainer,\n className,\n containerClassName,\n itemClassName,\n layout = 'horizontal',\n}: MultiContainerProps<T>) {\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const getItemsByContainer = React.useCallback(\n (containerId: UniqueIdentifier) =>\n items.filter((item) => item.containerId === containerId),\n [items]\n )\n\n const findContainerByItemId = React.useCallback(\n (itemId: UniqueIdentifier): UniqueIdentifier | undefined => {\n const item = items.find((i) => i.id === itemId)\n return item?.containerId\n },\n [items]\n )\n\n const handleDragStart = React.useCallback((event: DragStartEvent) => {\n setActiveId(event.active.id)\n }, [])\n\n const handleDragOver = React.useCallback((event: DragOverEvent) => {\n const { active, over } = event\n if (!over) return\n\n const activeContainerId = findContainerByItemId(active.id)\n let overContainerId = findContainerByItemId(over.id)\n\n if (!overContainerId) {\n overContainerId = containers.find((c) => c.id === over.id)?.id\n }\n\n if (!activeContainerId || !overContainerId) return\n if (activeContainerId === overContainerId) return\n\n const overContainerItems = getItemsByContainer(overContainerId)\n const overIndex = overContainerItems.findIndex((item) => item.id === over.id)\n\n onItemMove(\n active.id,\n activeContainerId,\n overContainerId,\n overIndex >= 0 ? overIndex : overContainerItems.length\n )\n }, [containers, findContainerByItemId, getItemsByContainer, onItemMove])\n\n const handleDragEnd = React.useCallback((event: DragEndEvent) => {\n const { active, over } = event\n\n if (!over) {\n setActiveId(null)\n return\n }\n\n const activeContainerId = findContainerByItemId(active.id)\n if (!activeContainerId) {\n setActiveId(null)\n return\n }\n\n const overContainerId = findContainerByItemId(over.id) ||\n containers.find((c) => c.id === over.id)?.id\n\n if (activeContainerId === overContainerId && active.id !== over.id && onReorder) {\n const containerItems = getItemsByContainer(activeContainerId)\n const oldIndex = containerItems.findIndex((item) => item.id === active.id)\n const newIndex = containerItems.findIndex((item) => item.id === over.id)\n\n if (oldIndex !== -1 && newIndex !== -1) {\n onReorder(activeContainerId, arrayMove(containerItems, oldIndex, newIndex) as T[])\n }\n }\n\n setActiveId(null)\n }, [containers, findContainerByItemId, getItemsByContainer, onReorder])\n\n const handleDragCancel = React.useCallback(() => {\n setActiveId(null)\n }, [])\n\n const activeItem = React.useMemo(\n () => items.find((item) => item.id === activeId),\n [activeId, items]\n )\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <div className={cn(layoutClasses[layout], className)}>\n {containers.map((container) => {\n const containerItems = getItemsByContainer(container.id)\n const isEmpty = containerItems.length === 0\n\n return (\n <div\n key={container.id}\n className={cn(\n 'flex flex-col rounded-xl border border-border/50 bg-muted/20 p-4 transition-colors duration-200',\n layout === 'horizontal' && 'min-w-[280px] w-[280px]',\n containerClassName\n )}\n >\n <div className=\"mb-3\">\n {renderContainerHeader ? (\n renderContainerHeader(container, containerItems.length)\n ) : (\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-semibold text-sm text-foreground\">{container.title}</h3>\n <span className=\"text-xs font-medium text-muted-foreground bg-background border px-2 py-0.5 rounded-full shadow-sm\">\n {containerItems.length}\n </span>\n </div>\n )}\n </div>\n\n <DroppableContainer\n id={container.id}\n isEmpty={isEmpty}\n className=\"flex-1\"\n >\n <SortableContext\n items={containerItems.map((item) => item.id)}\n strategy={verticalListSortingStrategy}\n >\n <div className=\"flex flex-col gap-2\">\n {containerItems.map((item) => (\n <SortableContainerItem\n key={item.id}\n id={item.id}\n className={itemClassName}\n >\n {renderItem(item)}\n </SortableContainerItem>\n ))}\n {isEmpty && renderEmptyContainer && (\n <div className=\"flex items-center justify-center py-8 text-muted-foreground text-sm\">\n {renderEmptyContainer(container)}\n </div>\n )}\n </div>\n </SortableContext>\n </DroppableContainer>\n </div>\n )\n })}\n </div>\n\n <DragOverlay dropAnimation={dropAnimationConfig} modifiers={[snapCenterToCursor, restrictToWindowEdges]}>\n {activeItem ? (\n <div className=\"rounded-xl border bg-card text-card-foreground p-3 shadow-2xl ring-2 ring-primary/30 cursor-grabbing\">\n <div className=\"min-w-0\">{renderItem(activeItem)}</div>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n )\n}\n"],"names":["Folder","createLucideIcon","SortableItem","id","children","className","disabled","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","style","React","CSS","jsx","cn","restrictToBoundingRect","rect","boundingRect","value","restrictToWindowEdges","_ref","draggingNodeRect","windowRect","snapCenterToCursor","activatorEvent","activatorCoordinates","getEventCoordinates","offsetX","offsetY","gapClasses","dropAnimationConfig","defaultDropAnimationSideEffects","SortableList","items","onReorder","renderItem","renderOverlay","direction","itemClassName","gap","activeId","setActiveId","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","handleDragStart","event","handleDragEnd","active","over","oldIndex","item","newIndex","arrayMove","handleDragCancel","activeItem","itemIds","jsxs","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","horizontalListSortingStrategy","DragOverlay","SortableKanbanItem","DroppableColumn","column","renderColumnHeader","columnClassName","isOver","useDroppable","customCollisionDetection","args","itemCollisions","pointerWithin","collision","rectIntersection","KanbanBoard","columns","onItemMove","lastOverId","getItemsByColumn","columnId","findColumnByItemId","itemId","i","extractColumnId","overId","overIdStr","handleDragOver","activeColumnId","overColumnId","overColumnItems","overIndex","columnItems","TreeNodeItem","node","depth","expanded","onToggle","renderNode","hasChildren","isFolder","handleToggleClick","e","ChevronRight","File","flattenTree","nodes","expandedIds","result","TreeView","data","onMove","defaultExpanded","setExpandedIds","flattenedItems","handleToggle","nodeId","prev","newExpanded","wasExpanded","activeIndex","activeNode","DroppableContainer","isEmpty","SortableContainerItem","layoutClasses","MultiContainer","containers","renderContainerHeader","renderEmptyContainer","containerClassName","layout","getItemsByContainer","containerId","findContainerByItemId","activeContainerId","overContainerId","c","overContainerItems","containerItems","container"],"mappings":"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","x_google_ignoreList":[0,2]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const n=require("react/jsx-runtime"),z=require("react"),e=require("./sortable.esm-DcQYlXi3.cjs"),k=require("./index-lGzB9daF.cjs"),_=require("./createLucideIcon-i5GEhNMV.cjs"),q=require("./file-V_hhCUhr.cjs"),$=require("./chevron-right-Dvyd11q0.cjs");function G(s){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(s){for(const r in s)if(r!=="default"){const o=Object.getOwnPropertyDescriptor(s,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:()=>s[r]})}}return t.default=s,Object.freeze(t)}const a=G(z);const B=_.createLucideIcon("Folder",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]);function P({id:s,children:t,className:r,disabled:o=!1}){const{attributes:d,listeners:x,setNodeRef:b,transform:C,transition:m,isDragging:u}=e.useSortable({id:s,disabled:o}),h=a.useMemo(()=>({transform:e.CSS.Transform.toString(C),transition:m,opacity:u?.5:1}),[C,m,u]);return n.jsx("div",{ref:b,style:h,className:k.cn("rounded-xl border bg-card text-card-foreground p-3 shadow-sm touch-none select-none",u&&"z-50 ring-2 ring-primary/30",o&&"opacity-50 cursor-not-allowed",!o&&!u&&"cursor-grab hover:shadow-md hover:border-primary/30",!o&&u&&"cursor-grabbing",r),...d,...x,children:n.jsx("div",{className:"min-w-0",children:t})})}function V(s,t,r){const o={...s};return t.top+s.y<=r.top?o.y=r.top-t.top:t.bottom+s.y>=r.top+r.height&&(o.y=r.top+r.height-t.bottom),t.left+s.x<=r.left?o.x=r.left-t.left:t.right+s.x>=r.left+r.width&&(o.x=r.left+r.width-t.right),o}const L=s=>{let{transform:t,draggingNodeRect:r,windowRect:o}=s;return!r||!o?t:V(t,r,o)},F=s=>{let{activatorEvent:t,draggingNodeRect:r,transform:o}=s;if(r&&t){const d=e.getEventCoordinates(t);if(!d)return o;const x=d.x-r.left,b=d.y-r.top;return{...o,x:o.x+x-r.width/2,y:o.y+b-r.height/2}}return o},X={sm:"gap-1",md:"gap-2",lg:"gap-4"},Y={sideEffects:e.defaultDropAnimationSideEffects({styles:{active:{opacity:"0.5"}}})};function Z({items:s,onReorder:t,renderItem:r,renderOverlay:o,direction:d="vertical",className:x,itemClassName:b,disabled:C=!1,gap:m="md"}){const[u,h]=a.useState(null),f=e.useSensors(e.useSensor(e.PointerSensor,{activationConstraint:{distance:5}}),e.useSensor(e.KeyboardSensor,{coordinateGetter:e.sortableKeyboardCoordinates})),E=a.useCallback(I=>{h(I.active.id)},[]),A=a.useCallback(I=>{const{active:g,over:w}=I;if(w&&g.id!==w.id){const j=s.findIndex(l=>l.id===g.id),i=s.findIndex(l=>l.id===w.id);j!==-1&&i!==-1&&t(e.arrayMove(s,j,i))}h(null)},[s,t]),v=a.useCallback(()=>{h(null)},[]),S=a.useMemo(()=>s.find(I=>I.id===u),[u,s]),y=a.useMemo(()=>s.map(I=>I.id),[s]);return n.jsxs(e.DndContext,{sensors:f,collisionDetection:e.closestCenter,onDragStart:E,onDragEnd:A,onDragCancel:v,children:[n.jsx(e.SortableContext,{items:y,strategy:d==="vertical"?e.verticalListSortingStrategy:e.horizontalListSortingStrategy,children:n.jsx("div",{className:k.cn("flex",d==="vertical"?"flex-col":"flex-row flex-wrap",X[m],x),children:s.map(I=>n.jsx(P,{id:I.id,className:b,disabled:C,children:r(I)},I.id))})}),n.jsx(e.DragOverlay,{dropAnimation:Y,modifiers:[F,L],children:S?n.jsx("div",{className:"rounded-xl border bg-card text-card-foreground p-3 shadow-2xl ring-2 ring-primary/30 cursor-grabbing",children:o?o(S):r(S)}):null})]})}const J=a.memo(function({id:t,children:r,className:o}){const{attributes:d,listeners:x,setNodeRef:b,transform:C,transition:m,isDragging:u}=e.useSortable({id:t}),h=a.useMemo(()=>({transform:e.CSS.Transform.toString(C),transition:m,opacity:u?.5:1}),[C,m,u]);return n.jsx("div",{ref:b,style:h,className:k.cn("rounded-xl border bg-card text-card-foreground p-3 shadow-sm touch-none select-none",u&&"ring-2 ring-primary/20",!u&&"cursor-grab hover:shadow-md hover:border-primary/30",u&&"cursor-grabbing",o),...d,...x,children:n.jsx("div",{className:"min-w-0",children:r})})});function Q({column:s,items:t,renderItem:r,renderColumnHeader:o,columnClassName:d,itemClassName:x}){const{setNodeRef:b,isOver:C}=e.useDroppable({id:`column-${s.id}`,data:{type:"column",columnId:s.id}});return n.jsxs("div",{ref:b,className:k.cn("flex flex-col min-w-[280px] w-[280px] bg-muted/30 border border-border/50 rounded-xl p-3 transition-colors duration-200",C&&"ring-2 ring-primary/30 bg-primary/5",d),children:[n.jsxs("div",{className:"flex items-center justify-between mb-3 px-1",children:[o?o(s):n.jsx("h3",{className:"font-semibold text-sm text-foreground",children:s.title}),n.jsx("span",{className:"text-xs font-medium text-muted-foreground bg-background border px-2 py-0.5 rounded-full shadow-sm",children:t.length})]}),n.jsx(e.SortableContext,{items:t.map(m=>m.id),strategy:e.verticalListSortingStrategy,children:n.jsx("div",{className:"flex flex-col gap-2 min-h-[100px] flex-1",children:t.map(m=>n.jsx(J,{id:m.id,className:x,children:r(m)},m.id))})})]})}const R=s=>{const r=e.pointerWithin(s).filter(d=>!String(d.id).startsWith("column-"));return r.length>0?r:e.rectIntersection(s)},U={sideEffects:e.defaultDropAnimationSideEffects({styles:{active:{opacity:"0.5"}}})};function H({columns:s,items:t,onItemMove:r,onReorder:o,renderItem:d,renderColumnHeader:x,className:b,columnClassName:C,itemClassName:m}){const[u,h]=a.useState(null),f=a.useRef(null),E=e.useSensors(e.useSensor(e.PointerSensor,{activationConstraint:{distance:5}}),e.useSensor(e.KeyboardSensor,{coordinateGetter:e.sortableKeyboardCoordinates})),A=a.useCallback(i=>t.filter(l=>l.columnId===i),[t]),v=a.useCallback(i=>t.find(c=>c.id===i)?.columnId,[t]),S=a.useCallback(i=>{const l=String(i);return l.startsWith("column-")?l.replace("column-",""):v(i)},[v]),y=a.useCallback(i=>{h(i.active.id),f.current=null},[]),I=a.useCallback(i=>{const{active:l,over:c}=i;if(!c)return;const p=v(l.id),D=S(c.id);if(!p||!D||p===D||f.current===c.id)return;f.current=c.id;const N=A(D),O=String(c.id);let M;if(O.startsWith("column-"))M=N.length;else{const T=N.findIndex(K=>K.id===c.id);M=T>=0?T:N.length}r(l.id,p,D,M)},[v,S,A,r]),g=a.useCallback(i=>{const{active:l,over:c}=i;if(!c){h(null),f.current=null;return}const p=v(l.id),D=String(c.id);let N;if(D.startsWith("column-")?N=D.replace("column-",""):N=v(c.id),!p){h(null),f.current=null;return}if(p===N&&l.id!==c.id&&o&&!D.startsWith("column-")){const O=A(p),M=O.findIndex(K=>K.id===l.id),T=O.findIndex(K=>K.id===c.id);M!==-1&&T!==-1&&o(p,e.arrayMove(O,M,T))}h(null),f.current=null},[v,A,o]),w=a.useCallback(()=>{h(null),f.current=null},[]),j=a.useMemo(()=>t.find(i=>i.id===u),[u,t]);return n.jsxs(e.DndContext,{sensors:E,collisionDetection:R,onDragStart:y,onDragOver:I,onDragEnd:g,onDragCancel:w,children:[n.jsx("div",{className:k.cn("flex gap-4 overflow-x-auto p-1",b),children:s.map(i=>{const l=A(i.id);return n.jsx(Q,{column:i,items:l,renderItem:d,renderColumnHeader:x,columnClassName:C,itemClassName:m},i.id)})}),n.jsx(e.DragOverlay,{dropAnimation:U,modifiers:[F,L],children:j?n.jsx("div",{className:"rounded-xl border bg-card text-card-foreground p-3 shadow-2xl ring-2 ring-primary/30 cursor-grabbing",children:n.jsx("div",{className:"min-w-0",children:d(j)})}):null})]})}const ee=a.memo(function({node:t,depth:r,expanded:o,onToggle:d,renderNode:x}){const{attributes:b,listeners:C,setNodeRef:m,transform:u,transition:h,isDragging:f}=e.useSortable({id:t.id}),E=a.useMemo(()=>({transform:e.CSS.Transform.toString(u),transition:h,paddingLeft:`${r*20+8}px`,opacity:f?.5:1}),[u,h,r,f]),A=t.children&&t.children.length>0,v=t.isFolder||A,S=a.useCallback(y=>{y.stopPropagation(),d()},[d]);return n.jsxs("div",{ref:m,style:E,className:k.cn("flex items-center gap-2 py-2 pr-3 rounded-lg touch-none select-none",f&&"bg-muted ring-1 ring-primary/20",!f&&"cursor-grab hover:bg-muted/60",f&&"cursor-grabbing"),...b,...C,children:[v?n.jsx("button",{type:"button",onClick:S,className:"flex-shrink-0 p-1 hover:bg-muted rounded-md transition-colors duration-200",children:n.jsx($.ChevronRight,{className:k.cn("h-4 w-4 text-muted-foreground transition-transform duration-200",o&&"rotate-90")})}):n.jsx("span",{className:"w-6"}),n.jsx("span",{className:k.cn("flex-shrink-0",v?"text-primary/80":"text-muted-foreground"),children:v?n.jsx(B,{className:"h-4 w-4"}):n.jsx(q.File,{className:"h-4 w-4"})}),n.jsx("span",{className:"flex-1 truncate text-sm text-foreground",children:x?x(t):t.label})]})});function W(s,t,r=0){const o=[];for(const d of s)o.push({node:d,depth:r}),d.children&&t.has(d.id)&&o.push(...W(d.children,t,r+1));return o}const te={sideEffects:e.defaultDropAnimationSideEffects({styles:{active:{opacity:"0.5"}}})};function ne({data:s,onMove:t,onToggle:r,renderNode:o,className:d,defaultExpanded:x=new Set}){const[b,C]=a.useState(x),[m,u]=a.useState(null),h=e.useSensors(e.useSensor(e.PointerSensor,{activationConstraint:{distance:5}}),e.useSensor(e.KeyboardSensor,{coordinateGetter:e.sortableKeyboardCoordinates})),f=a.useMemo(()=>W(s,b),[s,b]),E=a.useCallback(g=>{C(w=>{const j=new Set(w),i=j.has(g);return i?j.delete(g):j.add(g),r?.(g,!i),j})},[r]),A=a.useCallback(g=>{u(g.active.id)},[]),v=a.useCallback(g=>{const{active:w,over:j}=g;if(j&&w.id!==j.id){const i=f.findIndex(c=>c.node.id===w.id),l=f.findIndex(c=>c.node.id===j.id);i!==-1&&l!==-1&&t?.(w.id,null,l)}u(null)},[f,t]),S=a.useCallback(()=>{u(null)},[]),y=a.useMemo(()=>f.find(g=>g.node.id===m)?.node,[m,f]),I=a.useMemo(()=>f.map(g=>g.node.id),[f]);return n.jsxs(e.DndContext,{sensors:h,collisionDetection:e.closestCenter,onDragStart:A,onDragEnd:v,onDragCancel:S,children:[n.jsx(e.SortableContext,{items:I,strategy:e.verticalListSortingStrategy,children:n.jsx("div",{className:k.cn("border rounded-xl p-3 bg-card shadow-sm",d),children:f.map(({node:g,depth:w})=>n.jsx(ee,{node:g,depth:w,expanded:b.has(g.id),onToggle:()=>E(g.id),renderNode:o},g.id))})}),n.jsx(e.DragOverlay,{dropAnimation:te,modifiers:[F,L],children:y?n.jsxs("div",{className:"flex items-center gap-2 py-2 px-3 rounded-lg bg-card border shadow-2xl ring-2 ring-primary/30 cursor-grabbing",children:[n.jsx("span",{className:k.cn("flex-shrink-0",y.isFolder||y.children&&y.children.length>0?"text-primary/80":"text-muted-foreground"),children:y.isFolder||y.children&&y.children.length>0?n.jsx(B,{className:"h-4 w-4"}):n.jsx(q.File,{className:"h-4 w-4"})}),n.jsx("span",{className:"text-sm text-foreground",children:o?o(y):y.label})]}):null})]})}function re({id:s,children:t,className:r,isEmpty:o}){const{setNodeRef:d,isOver:x}=e.useDroppable({id:s});return n.jsx("div",{ref:d,className:k.cn("min-h-[100px] rounded-xl transition-colors duration-200",x&&"bg-primary/5 ring-2 ring-primary/30",o&&"border-2 border-dashed border-muted-foreground/30",r),children:t})}const se=a.memo(function({id:t,children:r,className:o}){const{attributes:d,listeners:x,setNodeRef:b,transform:C,transition:m,isDragging:u}=e.useSortable({id:t}),h=a.useMemo(()=>({transform:e.CSS.Transform.toString(C),transition:m,opacity:u?.5:1}),[C,m,u]);return n.jsx("div",{ref:b,style:h,className:k.cn("rounded-xl border bg-card text-card-foreground p-3 shadow-sm touch-none select-none",u&&"ring-2 ring-primary/20",!u&&"cursor-grab hover:shadow-md hover:border-primary/30",u&&"cursor-grabbing",o),...d,...x,children:n.jsx("div",{className:"min-w-0",children:r})})}),oe={horizontal:"flex gap-4 overflow-x-auto",vertical:"flex flex-col gap-4",grid:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},ie={sideEffects:e.defaultDropAnimationSideEffects({styles:{active:{opacity:"0.5"}}})};function ae({containers:s,items:t,onItemMove:r,onReorder:o,renderItem:d,renderContainerHeader:x,renderEmptyContainer:b,className:C,containerClassName:m,itemClassName:u,layout:h="horizontal"}){const[f,E]=a.useState(null),A=e.useSensors(e.useSensor(e.PointerSensor,{activationConstraint:{distance:5}}),e.useSensor(e.KeyboardSensor,{coordinateGetter:e.sortableKeyboardCoordinates})),v=a.useCallback(i=>t.filter(l=>l.containerId===i),[t]),S=a.useCallback(i=>t.find(c=>c.id===i)?.containerId,[t]),y=a.useCallback(i=>{E(i.active.id)},[]),I=a.useCallback(i=>{const{active:l,over:c}=i;if(!c)return;const p=S(l.id);let D=S(c.id);if(D||(D=s.find(M=>M.id===c.id)?.id),!p||!D||p===D)return;const N=v(D),O=N.findIndex(M=>M.id===c.id);r(l.id,p,D,O>=0?O:N.length)},[s,S,v,r]),g=a.useCallback(i=>{const{active:l,over:c}=i;if(!c){E(null);return}const p=S(l.id);if(!p){E(null);return}const D=S(c.id)||s.find(N=>N.id===c.id)?.id;if(p===D&&l.id!==c.id&&o){const N=v(p),O=N.findIndex(T=>T.id===l.id),M=N.findIndex(T=>T.id===c.id);O!==-1&&M!==-1&&o(p,e.arrayMove(N,O,M))}E(null)},[s,S,v,o]),w=a.useCallback(()=>{E(null)},[]),j=a.useMemo(()=>t.find(i=>i.id===f),[f,t]);return n.jsxs(e.DndContext,{sensors:A,collisionDetection:e.closestCenter,onDragStart:y,onDragOver:I,onDragEnd:g,onDragCancel:w,children:[n.jsx("div",{className:k.cn(oe[h],C),children:s.map(i=>{const l=v(i.id),c=l.length===0;return n.jsxs("div",{className:k.cn("flex flex-col rounded-xl border border-border/50 bg-muted/20 p-4 transition-colors duration-200",h==="horizontal"&&"min-w-[280px] w-[280px]",m),children:[n.jsx("div",{className:"mb-3",children:x?x(i,l.length):n.jsxs("div",{className:"flex items-center justify-between",children:[n.jsx("h3",{className:"font-semibold text-sm text-foreground",children:i.title}),n.jsx("span",{className:"text-xs font-medium text-muted-foreground bg-background border px-2 py-0.5 rounded-full shadow-sm",children:l.length})]})}),n.jsx(re,{id:i.id,isEmpty:c,className:"flex-1",children:n.jsx(e.SortableContext,{items:l.map(p=>p.id),strategy:e.verticalListSortingStrategy,children:n.jsxs("div",{className:"flex flex-col gap-2",children:[l.map(p=>n.jsx(se,{id:p.id,className:u,children:d(p)},p.id)),c&&b&&n.jsx("div",{className:"flex items-center justify-center py-8 text-muted-foreground text-sm",children:b(i)})]})})})]},i.id)})}),n.jsx(e.DragOverlay,{dropAnimation:ie,modifiers:[F,L],children:j?n.jsx("div",{className:"rounded-xl border bg-card text-card-foreground p-3 shadow-2xl ring-2 ring-primary/30 cursor-grabbing",children:n.jsx("div",{className:"min-w-0",children:d(j)})}):null})]})}exports.KanbanBoard=H;exports.MultiContainer=ae;exports.SortableItem=P;exports.SortableList=Z;exports.TreeView=ne;
|
|
2
|
+
//# sourceMappingURL=multi-container-DMKL8c9B.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-container-DMKL8c9B.cjs","sources":["../node_modules/lucide-react/dist/esm/icons/folder.js","../src/components/dnd/sortable-item.tsx","../node_modules/@dnd-kit/modifiers/dist/modifiers.esm.js","../src/components/dnd/sortable-list.tsx","../src/components/dnd/kanban-board.tsx","../src/components/dnd/tree-view.tsx","../src/components/dnd/multi-container.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.441.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Folder = createLucideIcon(\"Folder\", [\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n]);\n\nexport { Folder as default };\n//# sourceMappingURL=folder.js.map\n","import * as React from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { cn } from '@/utils/cn'\n\nexport interface SortableItemProps {\n id: string | number\n children: React.ReactNode\n className?: string\n disabled?: boolean\n}\n\nexport function SortableItem({\n id,\n children,\n className,\n disabled = false,\n}: SortableItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id, disabled })\n\n const style: React.CSSProperties = React.useMemo(() => ({\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n }), [transform, transition, isDragging])\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(\n 'rounded-xl border bg-card text-card-foreground p-3 shadow-sm touch-none select-none',\n isDragging && 'z-50 ring-2 ring-primary/30',\n disabled && 'opacity-50 cursor-not-allowed',\n !disabled && !isDragging && 'cursor-grab hover:shadow-md hover:border-primary/30',\n !disabled && isDragging && 'cursor-grabbing',\n className\n )}\n {...attributes}\n {...listeners}\n >\n <div className=\"min-w-0\">{children}</div>\n </div>\n )\n}\n","import { getEventCoordinates } from '@dnd-kit/utilities';\n\nfunction createSnapModifier(gridSize) {\n return _ref => {\n let {\n transform\n } = _ref;\n return { ...transform,\n x: Math.ceil(transform.x / gridSize) * gridSize,\n y: Math.ceil(transform.y / gridSize) * gridSize\n };\n };\n}\n\nconst restrictToHorizontalAxis = _ref => {\n let {\n transform\n } = _ref;\n return { ...transform,\n y: 0\n };\n};\n\nfunction restrictToBoundingRect(transform, rect, boundingRect) {\n const value = { ...transform\n };\n\n if (rect.top + transform.y <= boundingRect.top) {\n value.y = boundingRect.top - rect.top;\n } else if (rect.bottom + transform.y >= boundingRect.top + boundingRect.height) {\n value.y = boundingRect.top + boundingRect.height - rect.bottom;\n }\n\n if (rect.left + transform.x <= boundingRect.left) {\n value.x = boundingRect.left - rect.left;\n } else if (rect.right + transform.x >= boundingRect.left + boundingRect.width) {\n value.x = boundingRect.left + boundingRect.width - rect.right;\n }\n\n return value;\n}\n\nconst restrictToParentElement = _ref => {\n let {\n containerNodeRect,\n draggingNodeRect,\n transform\n } = _ref;\n\n if (!draggingNodeRect || !containerNodeRect) {\n return transform;\n }\n\n return restrictToBoundingRect(transform, draggingNodeRect, containerNodeRect);\n};\n\nconst restrictToFirstScrollableAncestor = _ref => {\n let {\n draggingNodeRect,\n transform,\n scrollableAncestorRects\n } = _ref;\n const firstScrollableAncestorRect = scrollableAncestorRects[0];\n\n if (!draggingNodeRect || !firstScrollableAncestorRect) {\n return transform;\n }\n\n return restrictToBoundingRect(transform, draggingNodeRect, firstScrollableAncestorRect);\n};\n\nconst restrictToVerticalAxis = _ref => {\n let {\n transform\n } = _ref;\n return { ...transform,\n x: 0\n };\n};\n\nconst restrictToWindowEdges = _ref => {\n let {\n transform,\n draggingNodeRect,\n windowRect\n } = _ref;\n\n if (!draggingNodeRect || !windowRect) {\n return transform;\n }\n\n return restrictToBoundingRect(transform, draggingNodeRect, windowRect);\n};\n\nconst snapCenterToCursor = _ref => {\n let {\n activatorEvent,\n draggingNodeRect,\n transform\n } = _ref;\n\n if (draggingNodeRect && activatorEvent) {\n const activatorCoordinates = getEventCoordinates(activatorEvent);\n\n if (!activatorCoordinates) {\n return transform;\n }\n\n const offsetX = activatorCoordinates.x - draggingNodeRect.left;\n const offsetY = activatorCoordinates.y - draggingNodeRect.top;\n return { ...transform,\n x: transform.x + offsetX - draggingNodeRect.width / 2,\n y: transform.y + offsetY - draggingNodeRect.height / 2\n };\n }\n\n return transform;\n};\n\nexport { createSnapModifier, restrictToFirstScrollableAncestor, restrictToHorizontalAxis, restrictToParentElement, restrictToVerticalAxis, restrictToWindowEdges, snapCenterToCursor };\n//# sourceMappingURL=modifiers.esm.js.map\n","import * as React from 'react'\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n DragEndEvent,\n DragStartEvent,\n DragOverlay,\n UniqueIdentifier,\n defaultDropAnimationSideEffects,\n DropAnimation,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n horizontalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { snapCenterToCursor, restrictToWindowEdges } from '@dnd-kit/modifiers'\nimport { cn } from '@/utils/cn'\nimport { SortableItem } from './sortable-item'\n\nexport interface SortableListItem {\n id: string | number\n [key: string]: unknown\n}\n\nexport interface SortableListProps<T extends SortableListItem> {\n items: T[]\n onReorder: (items: T[]) => void\n renderItem: (item: T) => React.ReactNode\n renderOverlay?: (item: T) => React.ReactNode\n direction?: 'vertical' | 'horizontal'\n className?: string\n itemClassName?: string\n disabled?: boolean\n gap?: 'sm' | 'md' | 'lg'\n}\n\nconst gapClasses = {\n sm: 'gap-1',\n md: 'gap-2',\n lg: 'gap-4',\n}\n\nconst dropAnimationConfig: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0.5',\n },\n },\n }),\n}\n\nexport function SortableList<T extends SortableListItem>({\n items,\n onReorder,\n renderItem,\n renderOverlay,\n direction = 'vertical',\n className,\n itemClassName,\n disabled = false,\n gap = 'md',\n}: SortableListProps<T>) {\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const handleDragStart = React.useCallback((event: DragStartEvent) => {\n setActiveId(event.active.id)\n }, [])\n\n const handleDragEnd = React.useCallback((event: DragEndEvent) => {\n const { active, over } = event\n\n if (over && active.id !== over.id) {\n const oldIndex = items.findIndex((item) => item.id === active.id)\n const newIndex = items.findIndex((item) => item.id === over.id)\n if (oldIndex !== -1 && newIndex !== -1) {\n onReorder(arrayMove(items, oldIndex, newIndex))\n }\n }\n\n setActiveId(null)\n }, [items, onReorder])\n\n const handleDragCancel = React.useCallback(() => {\n setActiveId(null)\n }, [])\n\n const activeItem = React.useMemo(\n () => items.find((item) => item.id === activeId),\n [activeId, items]\n )\n\n const itemIds = React.useMemo(() => items.map((item) => item.id), [items])\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <SortableContext\n items={itemIds}\n strategy={direction === 'vertical' ? verticalListSortingStrategy : horizontalListSortingStrategy}\n >\n <div\n className={cn(\n 'flex',\n direction === 'vertical' ? 'flex-col' : 'flex-row flex-wrap',\n gapClasses[gap],\n className\n )}\n >\n {items.map((item) => (\n <SortableItem\n key={item.id}\n id={item.id}\n className={itemClassName}\n disabled={disabled}\n >\n {renderItem(item)}\n </SortableItem>\n ))}\n </div>\n </SortableContext>\n\n <DragOverlay dropAnimation={dropAnimationConfig} modifiers={[snapCenterToCursor, restrictToWindowEdges]}>\n {activeItem ? (\n <div className=\"rounded-xl border bg-card text-card-foreground p-3 shadow-2xl ring-2 ring-primary/30 cursor-grabbing\">\n {renderOverlay ? renderOverlay(activeItem) : renderItem(activeItem)}\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n )\n}\n","import * as React from 'react'\nimport {\n DndContext,\n DragEndEvent,\n DragOverEvent,\n DragOverlay,\n DragStartEvent,\n KeyboardSensor,\n PointerSensor,\n UniqueIdentifier,\n useSensor,\n useSensors,\n useDroppable,\n pointerWithin,\n rectIntersection,\n CollisionDetection,\n defaultDropAnimationSideEffects,\n DropAnimation,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n arrayMove,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { snapCenterToCursor, restrictToWindowEdges } from '@dnd-kit/modifiers'\nimport { cn } from '@/utils/cn'\n\nexport interface KanbanItem {\n id: string | number\n columnId: string | number\n [key: string]: unknown\n}\n\nexport interface KanbanColumn {\n id: string | number\n title: string\n}\n\nexport interface KanbanBoardProps<T extends KanbanItem> {\n columns: KanbanColumn[]\n items: T[]\n onItemMove: (itemId: UniqueIdentifier, fromColumnId: UniqueIdentifier, toColumnId: UniqueIdentifier, newIndex: number) => void\n onReorder?: (columnId: UniqueIdentifier, items: T[]) => void\n renderItem: (item: T) => React.ReactNode\n renderColumnHeader?: (column: KanbanColumn) => React.ReactNode\n className?: string\n columnClassName?: string\n itemClassName?: string\n}\n\ninterface SortableKanbanItemProps {\n id: string | number\n children: React.ReactNode\n className?: string\n}\n\nconst SortableKanbanItem = React.memo(function SortableKanbanItem({\n id,\n children,\n className\n}: SortableKanbanItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id })\n\n const style: React.CSSProperties = React.useMemo(() => ({\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n }), [transform, transition, isDragging])\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(\n 'rounded-xl border bg-card text-card-foreground p-3 shadow-sm touch-none select-none',\n isDragging && 'ring-2 ring-primary/20',\n !isDragging && 'cursor-grab hover:shadow-md hover:border-primary/30',\n isDragging && 'cursor-grabbing',\n className\n )}\n {...attributes}\n {...listeners}\n >\n <div className=\"min-w-0\">{children}</div>\n </div>\n )\n})\n\ninterface DroppableColumnProps<T extends KanbanItem> {\n column: KanbanColumn\n items: T[]\n renderItem: (item: T) => React.ReactNode\n renderColumnHeader?: (column: KanbanColumn) => React.ReactNode\n columnClassName?: string\n itemClassName?: string\n}\n\nfunction DroppableColumn<T extends KanbanItem>({\n column,\n items,\n renderItem,\n renderColumnHeader,\n columnClassName,\n itemClassName,\n}: DroppableColumnProps<T>) {\n const { setNodeRef, isOver } = useDroppable({\n id: `column-${column.id}`,\n data: {\n type: 'column',\n columnId: column.id,\n },\n })\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'flex flex-col min-w-[280px] w-[280px] bg-muted/30 border border-border/50 rounded-xl p-3 transition-colors duration-200',\n isOver && 'ring-2 ring-primary/30 bg-primary/5',\n columnClassName\n )}\n >\n <div className=\"flex items-center justify-between mb-3 px-1\">\n {renderColumnHeader ? (\n renderColumnHeader(column)\n ) : (\n <h3 className=\"font-semibold text-sm text-foreground\">{column.title}</h3>\n )}\n <span className=\"text-xs font-medium text-muted-foreground bg-background border px-2 py-0.5 rounded-full shadow-sm\">\n {items.length}\n </span>\n </div>\n <SortableContext\n items={items.map((item) => item.id)}\n strategy={verticalListSortingStrategy}\n >\n <div className=\"flex flex-col gap-2 min-h-[100px] flex-1\">\n {items.map((item) => (\n <SortableKanbanItem\n key={item.id}\n id={item.id}\n className={itemClassName}\n >\n {renderItem(item)}\n </SortableKanbanItem>\n ))}\n </div>\n </SortableContext>\n </div>\n )\n}\n\n// Custom collision detection that prioritizes items over columns\nconst customCollisionDetection: CollisionDetection = (args) => {\n const pointerCollisions = pointerWithin(args)\n const itemCollisions = pointerCollisions.filter(\n (collision) => !String(collision.id).startsWith('column-')\n )\n\n if (itemCollisions.length > 0) {\n return itemCollisions\n }\n\n const rectCollisions = rectIntersection(args)\n return rectCollisions\n}\n\nconst dropAnimationConfig: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0.5',\n },\n },\n }),\n}\n\nexport function KanbanBoard<T extends KanbanItem>({\n columns,\n items,\n onItemMove,\n onReorder,\n renderItem,\n renderColumnHeader,\n className,\n columnClassName,\n itemClassName,\n}: KanbanBoardProps<T>) {\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null)\n const lastOverId = React.useRef<UniqueIdentifier | null>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const getItemsByColumn = React.useCallback(\n (columnId: UniqueIdentifier) => items.filter((item) => item.columnId === columnId),\n [items]\n )\n\n const findColumnByItemId = React.useCallback(\n (itemId: UniqueIdentifier): UniqueIdentifier | undefined => {\n const item = items.find((i) => i.id === itemId)\n return item?.columnId\n },\n [items]\n )\n\n const extractColumnId = React.useCallback(\n (overId: UniqueIdentifier): UniqueIdentifier | undefined => {\n const overIdStr = String(overId)\n if (overIdStr.startsWith('column-')) {\n return overIdStr.replace('column-', '')\n }\n return findColumnByItemId(overId)\n },\n [findColumnByItemId]\n )\n\n const handleDragStart = React.useCallback((event: DragStartEvent) => {\n setActiveId(event.active.id)\n lastOverId.current = null\n }, [])\n\n const handleDragOver = React.useCallback((event: DragOverEvent) => {\n const { active, over } = event\n if (!over) return\n\n const activeColumnId = findColumnByItemId(active.id)\n const overColumnId = extractColumnId(over.id)\n\n if (!activeColumnId || !overColumnId) return\n if (activeColumnId === overColumnId) return\n\n if (lastOverId.current === over.id) return\n lastOverId.current = over.id\n\n const overColumnItems = getItemsByColumn(overColumnId)\n const overIdStr = String(over.id)\n\n let newIndex: number\n if (overIdStr.startsWith('column-')) {\n newIndex = overColumnItems.length\n } else {\n const overIndex = overColumnItems.findIndex((item) => item.id === over.id)\n newIndex = overIndex >= 0 ? overIndex : overColumnItems.length\n }\n\n onItemMove(active.id, activeColumnId, overColumnId, newIndex)\n }, [findColumnByItemId, extractColumnId, getItemsByColumn, onItemMove])\n\n const handleDragEnd = React.useCallback((event: DragEndEvent) => {\n const { active, over } = event\n\n if (!over) {\n setActiveId(null)\n lastOverId.current = null\n return\n }\n\n const activeColumnId = findColumnByItemId(active.id)\n const overIdStr = String(over.id)\n\n let overColumnId: UniqueIdentifier | undefined\n if (overIdStr.startsWith('column-')) {\n overColumnId = overIdStr.replace('column-', '')\n } else {\n overColumnId = findColumnByItemId(over.id)\n }\n\n if (!activeColumnId) {\n setActiveId(null)\n lastOverId.current = null\n return\n }\n\n if (activeColumnId === overColumnId && active.id !== over.id && onReorder && !overIdStr.startsWith('column-')) {\n const columnItems = getItemsByColumn(activeColumnId)\n const oldIndex = columnItems.findIndex((item) => item.id === active.id)\n const newIndex = columnItems.findIndex((item) => item.id === over.id)\n if (oldIndex !== -1 && newIndex !== -1) {\n onReorder(activeColumnId, arrayMove(columnItems, oldIndex, newIndex) as T[])\n }\n }\n\n setActiveId(null)\n lastOverId.current = null\n }, [findColumnByItemId, getItemsByColumn, onReorder])\n\n const handleDragCancel = React.useCallback(() => {\n setActiveId(null)\n lastOverId.current = null\n }, [])\n\n const activeItem = React.useMemo(\n () => items.find((item) => item.id === activeId),\n [activeId, items]\n )\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={customCollisionDetection}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <div className={cn('flex gap-4 overflow-x-auto p-1', className)}>\n {columns.map((column) => {\n const columnItems = getItemsByColumn(column.id)\n return (\n <DroppableColumn\n key={column.id}\n column={column}\n items={columnItems}\n renderItem={renderItem}\n renderColumnHeader={renderColumnHeader}\n columnClassName={columnClassName}\n itemClassName={itemClassName}\n />\n )\n })}\n </div>\n\n <DragOverlay dropAnimation={dropAnimationConfig} modifiers={[snapCenterToCursor, restrictToWindowEdges]}>\n {activeItem ? (\n <div className=\"rounded-xl border bg-card text-card-foreground p-3 shadow-2xl ring-2 ring-primary/30 cursor-grabbing\">\n <div className=\"min-w-0\">{renderItem(activeItem)}</div>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n )\n}\n","import * as React from 'react'\nimport {\n DndContext,\n DragEndEvent,\n DragOverlay,\n DragStartEvent,\n KeyboardSensor,\n PointerSensor,\n UniqueIdentifier,\n closestCenter,\n useSensor,\n useSensors,\n defaultDropAnimationSideEffects,\n DropAnimation,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { snapCenterToCursor, restrictToWindowEdges } from '@dnd-kit/modifiers'\nimport { cn } from '@/utils/cn'\nimport { ChevronRight, Folder, File } from 'lucide-react'\n\nexport interface TreeNode {\n id: string | number\n label: string\n children?: TreeNode[]\n isFolder?: boolean\n [key: string]: unknown\n}\n\nexport interface TreeViewProps {\n data: TreeNode[]\n onMove?: (nodeId: UniqueIdentifier, newParentId: UniqueIdentifier | null, index: number) => void\n onToggle?: (nodeId: UniqueIdentifier, expanded: boolean) => void\n renderNode?: (node: TreeNode) => React.ReactNode\n className?: string\n defaultExpanded?: Set<UniqueIdentifier>\n}\n\ninterface TreeNodeItemProps {\n node: TreeNode\n depth: number\n expanded: boolean\n onToggle: () => void\n renderNode?: (node: TreeNode) => React.ReactNode\n}\n\nconst TreeNodeItem = React.memo(function TreeNodeItem({\n node,\n depth,\n expanded,\n onToggle,\n renderNode,\n}: TreeNodeItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: node.id })\n\n const style: React.CSSProperties = React.useMemo(() => ({\n transform: CSS.Transform.toString(transform),\n transition,\n paddingLeft: `${depth * 20 + 8}px`,\n opacity: isDragging ? 0.5 : 1,\n }), [transform, transition, depth, isDragging])\n\n const hasChildren = node.children && node.children.length > 0\n const isFolder = node.isFolder || hasChildren\n\n const handleToggleClick = React.useCallback((e: React.MouseEvent) => {\n e.stopPropagation()\n onToggle()\n }, [onToggle])\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(\n 'flex items-center gap-2 py-2 pr-3 rounded-lg touch-none select-none',\n isDragging && 'bg-muted ring-1 ring-primary/20',\n !isDragging && 'cursor-grab hover:bg-muted/60',\n isDragging && 'cursor-grabbing'\n )}\n {...attributes}\n {...listeners}\n >\n {isFolder ? (\n <button\n type=\"button\"\n onClick={handleToggleClick}\n className=\"flex-shrink-0 p-1 hover:bg-muted rounded-md transition-colors duration-200\"\n >\n <ChevronRight\n className={cn(\n 'h-4 w-4 text-muted-foreground transition-transform duration-200',\n expanded && 'rotate-90'\n )}\n />\n </button>\n ) : (\n <span className=\"w-6\" />\n )}\n\n <span className={cn(\n 'flex-shrink-0',\n isFolder ? 'text-primary/80' : 'text-muted-foreground'\n )}>\n {isFolder ? <Folder className=\"h-4 w-4\" /> : <File className=\"h-4 w-4\" />}\n </span>\n\n <span className=\"flex-1 truncate text-sm text-foreground\">\n {renderNode ? renderNode(node) : node.label}\n </span>\n </div>\n )\n})\n\nfunction flattenTree(\n nodes: TreeNode[],\n expandedIds: Set<UniqueIdentifier>,\n depth = 0\n): Array<{ node: TreeNode; depth: number }> {\n const result: Array<{ node: TreeNode; depth: number }> = []\n\n for (const node of nodes) {\n result.push({ node, depth })\n if (node.children && expandedIds.has(node.id)) {\n result.push(...flattenTree(node.children, expandedIds, depth + 1))\n }\n }\n\n return result\n}\n\nconst dropAnimationConfig: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0.5',\n },\n },\n }),\n}\n\nexport function TreeView({\n data,\n onMove,\n onToggle,\n renderNode,\n className,\n defaultExpanded = new Set(),\n}: TreeViewProps) {\n const [expandedIds, setExpandedIds] = React.useState<Set<UniqueIdentifier>>(defaultExpanded)\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const flattenedItems = React.useMemo(\n () => flattenTree(data, expandedIds),\n [data, expandedIds]\n )\n\n const handleToggle = React.useCallback((nodeId: UniqueIdentifier) => {\n setExpandedIds(prev => {\n const newExpanded = new Set(prev)\n const wasExpanded = newExpanded.has(nodeId)\n\n if (wasExpanded) {\n newExpanded.delete(nodeId)\n } else {\n newExpanded.add(nodeId)\n }\n\n onToggle?.(nodeId, !wasExpanded)\n return newExpanded\n })\n }, [onToggle])\n\n const handleDragStart = React.useCallback((event: DragStartEvent) => {\n setActiveId(event.active.id)\n }, [])\n\n const handleDragEnd = React.useCallback((event: DragEndEvent) => {\n const { active, over } = event\n\n if (over && active.id !== over.id) {\n const activeIndex = flattenedItems.findIndex((item) => item.node.id === active.id)\n const overIndex = flattenedItems.findIndex((item) => item.node.id === over.id)\n\n if (activeIndex !== -1 && overIndex !== -1) {\n onMove?.(active.id, null, overIndex)\n }\n }\n\n setActiveId(null)\n }, [flattenedItems, onMove])\n\n const handleDragCancel = React.useCallback(() => {\n setActiveId(null)\n }, [])\n\n const activeNode = React.useMemo(\n () => flattenedItems.find((item) => item.node.id === activeId)?.node,\n [activeId, flattenedItems]\n )\n\n const itemIds = React.useMemo(\n () => flattenedItems.map((item) => item.node.id),\n [flattenedItems]\n )\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <SortableContext\n items={itemIds}\n strategy={verticalListSortingStrategy}\n >\n <div className={cn('border rounded-xl p-3 bg-card shadow-sm', className)}>\n {flattenedItems.map(({ node, depth }) => (\n <TreeNodeItem\n key={node.id}\n node={node}\n depth={depth}\n expanded={expandedIds.has(node.id)}\n onToggle={() => handleToggle(node.id)}\n renderNode={renderNode}\n />\n ))}\n </div>\n </SortableContext>\n\n <DragOverlay dropAnimation={dropAnimationConfig} modifiers={[snapCenterToCursor, restrictToWindowEdges]}>\n {activeNode ? (\n <div className=\"flex items-center gap-2 py-2 px-3 rounded-lg bg-card border shadow-2xl ring-2 ring-primary/30 cursor-grabbing\">\n <span className={cn(\n 'flex-shrink-0',\n activeNode.isFolder || (activeNode.children && activeNode.children.length > 0)\n ? 'text-primary/80'\n : 'text-muted-foreground'\n )}>\n {activeNode.isFolder || (activeNode.children && activeNode.children.length > 0) ? (\n <Folder className=\"h-4 w-4\" />\n ) : (\n <File className=\"h-4 w-4\" />\n )}\n </span>\n <span className=\"text-sm text-foreground\">\n {renderNode ? renderNode(activeNode) : activeNode.label}\n </span>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n )\n}\n","import * as React from 'react'\nimport {\n DndContext,\n DragEndEvent,\n DragOverEvent,\n DragOverlay,\n DragStartEvent,\n KeyboardSensor,\n PointerSensor,\n UniqueIdentifier,\n closestCenter,\n useSensor,\n useSensors,\n useDroppable,\n defaultDropAnimationSideEffects,\n DropAnimation,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n arrayMove,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { snapCenterToCursor, restrictToWindowEdges } from '@dnd-kit/modifiers'\nimport { cn } from '@/utils/cn'\n\nexport interface ContainerItem {\n id: string | number\n containerId: string | number\n [key: string]: unknown\n}\n\nexport interface Container {\n id: string | number\n title: string\n}\n\nexport interface MultiContainerProps<T extends ContainerItem> {\n containers: Container[]\n items: T[]\n onItemMove: (\n itemId: UniqueIdentifier,\n fromContainerId: UniqueIdentifier,\n toContainerId: UniqueIdentifier,\n newIndex: number\n ) => void\n onReorder?: (containerId: UniqueIdentifier, items: T[]) => void\n renderItem: (item: T) => React.ReactNode\n renderContainerHeader?: (container: Container, itemCount: number) => React.ReactNode\n renderEmptyContainer?: (container: Container) => React.ReactNode\n className?: string\n containerClassName?: string\n itemClassName?: string\n layout?: 'horizontal' | 'vertical' | 'grid'\n}\n\ninterface DroppableContainerProps {\n id: UniqueIdentifier\n children: React.ReactNode\n className?: string\n isEmpty?: boolean\n}\n\nfunction DroppableContainer({ id, children, className, isEmpty }: DroppableContainerProps) {\n const { setNodeRef, isOver } = useDroppable({ id })\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'min-h-[100px] rounded-xl transition-colors duration-200',\n isOver && 'bg-primary/5 ring-2 ring-primary/30',\n isEmpty && 'border-2 border-dashed border-muted-foreground/30',\n className\n )}\n >\n {children}\n </div>\n )\n}\n\ninterface SortableContainerItemProps {\n id: string | number\n children: React.ReactNode\n className?: string\n}\n\nconst SortableContainerItem = React.memo(function SortableContainerItem({\n id,\n children,\n className\n}: SortableContainerItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id })\n\n const style: React.CSSProperties = React.useMemo(() => ({\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n }), [transform, transition, isDragging])\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(\n 'rounded-xl border bg-card text-card-foreground p-3 shadow-sm touch-none select-none',\n isDragging && 'ring-2 ring-primary/20',\n !isDragging && 'cursor-grab hover:shadow-md hover:border-primary/30',\n isDragging && 'cursor-grabbing',\n className\n )}\n {...attributes}\n {...listeners}\n >\n <div className=\"min-w-0\">{children}</div>\n </div>\n )\n})\n\nconst layoutClasses = {\n horizontal: 'flex gap-4 overflow-x-auto',\n vertical: 'flex flex-col gap-4',\n grid: 'grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4',\n}\n\nconst dropAnimationConfig: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0.5',\n },\n },\n }),\n}\n\nexport function MultiContainer<T extends ContainerItem>({\n containers,\n items,\n onItemMove,\n onReorder,\n renderItem,\n renderContainerHeader,\n renderEmptyContainer,\n className,\n containerClassName,\n itemClassName,\n layout = 'horizontal',\n}: MultiContainerProps<T>) {\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const getItemsByContainer = React.useCallback(\n (containerId: UniqueIdentifier) =>\n items.filter((item) => item.containerId === containerId),\n [items]\n )\n\n const findContainerByItemId = React.useCallback(\n (itemId: UniqueIdentifier): UniqueIdentifier | undefined => {\n const item = items.find((i) => i.id === itemId)\n return item?.containerId\n },\n [items]\n )\n\n const handleDragStart = React.useCallback((event: DragStartEvent) => {\n setActiveId(event.active.id)\n }, [])\n\n const handleDragOver = React.useCallback((event: DragOverEvent) => {\n const { active, over } = event\n if (!over) return\n\n const activeContainerId = findContainerByItemId(active.id)\n let overContainerId = findContainerByItemId(over.id)\n\n if (!overContainerId) {\n overContainerId = containers.find((c) => c.id === over.id)?.id\n }\n\n if (!activeContainerId || !overContainerId) return\n if (activeContainerId === overContainerId) return\n\n const overContainerItems = getItemsByContainer(overContainerId)\n const overIndex = overContainerItems.findIndex((item) => item.id === over.id)\n\n onItemMove(\n active.id,\n activeContainerId,\n overContainerId,\n overIndex >= 0 ? overIndex : overContainerItems.length\n )\n }, [containers, findContainerByItemId, getItemsByContainer, onItemMove])\n\n const handleDragEnd = React.useCallback((event: DragEndEvent) => {\n const { active, over } = event\n\n if (!over) {\n setActiveId(null)\n return\n }\n\n const activeContainerId = findContainerByItemId(active.id)\n if (!activeContainerId) {\n setActiveId(null)\n return\n }\n\n const overContainerId = findContainerByItemId(over.id) ||\n containers.find((c) => c.id === over.id)?.id\n\n if (activeContainerId === overContainerId && active.id !== over.id && onReorder) {\n const containerItems = getItemsByContainer(activeContainerId)\n const oldIndex = containerItems.findIndex((item) => item.id === active.id)\n const newIndex = containerItems.findIndex((item) => item.id === over.id)\n\n if (oldIndex !== -1 && newIndex !== -1) {\n onReorder(activeContainerId, arrayMove(containerItems, oldIndex, newIndex) as T[])\n }\n }\n\n setActiveId(null)\n }, [containers, findContainerByItemId, getItemsByContainer, onReorder])\n\n const handleDragCancel = React.useCallback(() => {\n setActiveId(null)\n }, [])\n\n const activeItem = React.useMemo(\n () => items.find((item) => item.id === activeId),\n [activeId, items]\n )\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <div className={cn(layoutClasses[layout], className)}>\n {containers.map((container) => {\n const containerItems = getItemsByContainer(container.id)\n const isEmpty = containerItems.length === 0\n\n return (\n <div\n key={container.id}\n className={cn(\n 'flex flex-col rounded-xl border border-border/50 bg-muted/20 p-4 transition-colors duration-200',\n layout === 'horizontal' && 'min-w-[280px] w-[280px]',\n containerClassName\n )}\n >\n <div className=\"mb-3\">\n {renderContainerHeader ? (\n renderContainerHeader(container, containerItems.length)\n ) : (\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-semibold text-sm text-foreground\">{container.title}</h3>\n <span className=\"text-xs font-medium text-muted-foreground bg-background border px-2 py-0.5 rounded-full shadow-sm\">\n {containerItems.length}\n </span>\n </div>\n )}\n </div>\n\n <DroppableContainer\n id={container.id}\n isEmpty={isEmpty}\n className=\"flex-1\"\n >\n <SortableContext\n items={containerItems.map((item) => item.id)}\n strategy={verticalListSortingStrategy}\n >\n <div className=\"flex flex-col gap-2\">\n {containerItems.map((item) => (\n <SortableContainerItem\n key={item.id}\n id={item.id}\n className={itemClassName}\n >\n {renderItem(item)}\n </SortableContainerItem>\n ))}\n {isEmpty && renderEmptyContainer && (\n <div className=\"flex items-center justify-center py-8 text-muted-foreground text-sm\">\n {renderEmptyContainer(container)}\n </div>\n )}\n </div>\n </SortableContext>\n </DroppableContainer>\n </div>\n )\n })}\n </div>\n\n <DragOverlay dropAnimation={dropAnimationConfig} modifiers={[snapCenterToCursor, restrictToWindowEdges]}>\n {activeItem ? (\n <div className=\"rounded-xl border bg-card text-card-foreground p-3 shadow-2xl ring-2 ring-primary/30 cursor-grabbing\">\n <div className=\"min-w-0\">{renderItem(activeItem)}</div>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n )\n}\n"],"names":["Folder","createLucideIcon","SortableItem","id","children","className","disabled","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","style","React","CSS","jsx","cn","restrictToBoundingRect","rect","boundingRect","value","restrictToWindowEdges","_ref","draggingNodeRect","windowRect","snapCenterToCursor","activatorEvent","activatorCoordinates","getEventCoordinates","offsetX","offsetY","gapClasses","dropAnimationConfig","defaultDropAnimationSideEffects","SortableList","items","onReorder","renderItem","renderOverlay","direction","itemClassName","gap","activeId","setActiveId","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","handleDragStart","event","handleDragEnd","active","over","oldIndex","item","newIndex","arrayMove","handleDragCancel","activeItem","itemIds","jsxs","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","horizontalListSortingStrategy","DragOverlay","SortableKanbanItem","DroppableColumn","column","renderColumnHeader","columnClassName","isOver","useDroppable","customCollisionDetection","args","itemCollisions","pointerWithin","collision","rectIntersection","KanbanBoard","columns","onItemMove","lastOverId","getItemsByColumn","columnId","findColumnByItemId","itemId","i","extractColumnId","overId","overIdStr","handleDragOver","activeColumnId","overColumnId","overColumnItems","overIndex","columnItems","TreeNodeItem","node","depth","expanded","onToggle","renderNode","hasChildren","isFolder","handleToggleClick","e","ChevronRight","File","flattenTree","nodes","expandedIds","result","TreeView","data","onMove","defaultExpanded","setExpandedIds","flattenedItems","handleToggle","nodeId","prev","newExpanded","wasExpanded","activeIndex","activeNode","DroppableContainer","isEmpty","SortableContainerItem","layoutClasses","MultiContainer","containers","renderContainerHeader","renderEmptyContainer","containerClassName","layout","getItemsByContainer","containerId","findContainerByItemId","activeContainerId","overContainerId","c","overContainerItems","containerItems","container"],"mappings":"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","x_google_ignoreList":[0,2]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),ge=require("react"),j=require("./index-lGzB9daF.cjs"),be=require("./use-mobile-DY7TJ5lx.cjs"),W=require("./sheet-mKiFLVnK.cjs"),M=require("./sortable.esm-DcQYlXi3.cjs"),k=require("./scroll-area-DYOiJMXh.cjs"),D=require("./input-CZrckPLk.cjs"),E=require("./card-tMkUxpmW.cjs"),z=require("./checkbox-D7-LQyCl.cjs"),F=require("./use-formatters-d97RVcmg.cjs"),R=require("./createLucideIcon-i5GEhNMV.cjs"),je=require("./calendar-SwL5isYC.cjs"),ye=require("./index-CzVK9Zyb.cjs"),X=require("./plus-8wKRkVu-.cjs"),V=require("./ellipsis-BW2gWki8.cjs");function Ne(n){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const a in n)if(a!=="default"){const o=Object.getOwnPropertyDescriptor(n,a);Object.defineProperty(r,a,o.get?o:{enumerable:!0,get:()=>n[a]})}}return r.default=n,Object.freeze(r)}const l=Ne(ge);const ve=R.createLucideIcon("Filter",[["polygon",{points:"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3",key:"1yg77f"}]]);const we=R.createLucideIcon("GripVertical",[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]]);const De=R.createLucideIcon("LayoutGrid",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]]);const ke=R.createLucideIcon("List",[["line",{x1:"8",x2:"21",y1:"6",y2:"6",key:"7ey8pc"}],["line",{x1:"8",x2:"21",y1:"12",y2:"12",key:"rjfblc"}],["line",{x1:"8",x2:"21",y1:"18",y2:"18",key:"c3b1m8"}],["line",{x1:"3",x2:"3.01",y1:"6",y2:"6",key:"1g7gq3"}],["line",{x1:"3",x2:"3.01",y1:"12",y2:"12",key:"1pjlvk"}],["line",{x1:"3",x2:"3.01",y1:"18",y2:"18",key:"28t2mc"}]]);const Ce=R.createLucideIcon("Table2",[["path",{d:"M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18",key:"gugj83"}]]),Y=l.forwardRef(({className:n,children:r,...a},o)=>e.jsx("div",{ref:o,className:j.cn("flex min-h-screen w-full flex-col bg-background",n),...a,children:r}));Y.displayName="AppShell";const Z=l.forwardRef(({className:n,...r},a)=>e.jsx("header",{ref:a,className:j.cn("sticky top-0 z-50 flex h-16 items-center gap-4 border-b bg-background px-4 md:px-6",n),...r}));Z.displayName="AppShellHeader";const ee=l.forwardRef(({className:n,...r},a)=>e.jsx("main",{ref:a,className:j.cn("flex flex-1 flex-col gap-4 p-4 md:gap-8 md:p-6",n),...r}));ee.displayName="AppShellMain";const se=l.forwardRef(({className:n,...r},a)=>e.jsx("footer",{ref:a,className:j.cn("border-t bg-background px-4 py-6 md:px-6",n),...r}));se.displayName="AppShellFooter";const te=l.forwardRef(({className:n,heading:r,description:a,actions:o,children:i,...m},d)=>e.jsxs("div",{ref:d,className:j.cn("flex flex-col gap-4 md:flex-row md:items-center md:justify-between",n),...m,children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h1",{className:"text-2xl font-bold tracking-tight md:text-3xl",children:r}),a&&e.jsx("p",{className:"text-muted-foreground",children:a})]}),o&&e.jsx("div",{className:"flex items-center gap-2",children:o}),i]}));te.displayName="PageHeader";const re=l.createContext(null);function G(){const n=l.useContext(re);if(!n)throw new Error("useDashboardLayout must be used within a DashboardLayout.");return n}const ae=l.forwardRef(({className:n,children:r,defaultSidebarOpen:a=!0,defaultSidebarCollapsed:o=!1,sidebarWidth:i="16rem",sidebarCollapsedWidth:m="4rem",...d},y)=>{const g=be.useIsMobile(),[v,h]=l.useState(a),[f,b]=l.useState(o),p=l.useCallback(()=>{g?h(c=>!c):b(c=>!c)},[g]);l.useEffect(()=>{const c=u=>{u.key==="b"&&(u.metaKey||u.ctrlKey)&&(u.preventDefault(),p())};return window.addEventListener("keydown",c),()=>window.removeEventListener("keydown",c)},[p]);const w=l.useMemo(()=>({sidebarOpen:v,setSidebarOpen:h,sidebarCollapsed:f,setSidebarCollapsed:b,isMobile:g,toggleSidebar:p}),[v,f,g,p]);return e.jsx(re.Provider,{value:w,children:e.jsx("div",{ref:y,style:{"--sidebar-width":i,"--sidebar-collapsed-width":m},className:j.cn("flex min-h-screen w-full bg-background",n),...d,children:r})})});ae.displayName="DashboardLayout";const ne=l.forwardRef(({className:n,children:r,...a},o)=>{const{sidebarOpen:i,setSidebarOpen:m,sidebarCollapsed:d,isMobile:y}=G();return y?e.jsx(W.Sheet,{open:i,onOpenChange:m,children:e.jsx(W.SheetContent,{side:"left",className:"w-[var(--sidebar-width)] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",children:e.jsx("aside",{className:"flex h-full w-full flex-col",children:r})})}):e.jsx("aside",{ref:o,"data-collapsed":d,className:j.cn("fixed inset-y-0 left-0 z-30 flex h-screen flex-col border-r bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-in-out",d?"w-[var(--sidebar-collapsed-width)]":"w-[var(--sidebar-width)]",n),...a,children:r})});ne.displayName="DashboardSidebar";const le=l.forwardRef(({className:n,children:r,...a},o)=>{const{sidebarCollapsed:i,isMobile:m}=G();return e.jsx("div",{ref:o,className:j.cn("flex flex-1 flex-col transition-[margin-left] duration-200 ease-in-out",!m&&(i?"ml-[var(--sidebar-collapsed-width)]":"ml-[var(--sidebar-width)]"),n),...a,children:r})});le.displayName="DashboardContent";const oe=l.forwardRef(({className:n,children:r,...a},o)=>e.jsx("header",{ref:o,className:j.cn("sticky top-0 z-20 flex h-16 items-center gap-4 border-b bg-background px-4 md:px-6",n),...a,children:r}));oe.displayName="DashboardHeader";const ie=l.forwardRef(({className:n,children:r,...a},o)=>e.jsx("main",{ref:o,className:j.cn("flex-1 overflow-auto p-4 md:p-6",n),...a,children:r}));ie.displayName="DashboardMain";const ce=l.forwardRef(({className:n,children:r,...a},o)=>e.jsx("footer",{ref:o,className:j.cn("border-t bg-background px-4 py-4 md:px-6",n),...a,children:r}));ce.displayName="DashboardFooter";const de=l.createContext(null);function I(){const n=l.useContext(de);if(!n)throw new Error("usePipeline must be used within a Pipeline component");return n}const me=l.forwardRef(({className:n,stages:r,items:a,defaultView:o="kanban",view:i,onViewChange:m,onItemMove:d,onItemClick:y,onItemAdd:g,onItemEdit:v,onItemDelete:h,children:f,...b},p)=>{const[w,c]=l.useState(o),[u,s]=l.useState([]),[t,N]=l.useState(""),[P,O]=l.useState(),T=i??w,q=C=>{i===void 0&&c(C),m?.(C)},A=l.useMemo(()=>{if(!t)return a;const C=t.toLowerCase();return a.filter(S=>S.title.toLowerCase().includes(C)||S.company?.toLowerCase().includes(C)||S.owner?.name.toLowerCase().includes(C))},[a,t]),x=l.useMemo(()=>({view:T,setView:q,stages:r,items:A,selectedItems:u,setSelectedItems:s,onItemMove:d,onItemClick:y,onItemAdd:g,onItemEdit:v,onItemDelete:h,searchQuery:t,setSearchQuery:N,groupBy:P,setGroupBy:O}),[T,r,A,u,t,P,d,y,g,v,h]);return e.jsx(de.Provider,{value:x,children:e.jsx("div",{ref:p,className:j.cn("flex h-full flex-col",n),...b,children:f})})});me.displayName="Pipeline";const ue=l.forwardRef(({className:n,showViewSelector:r=!0,showSearch:a=!0,showAddButton:o=!0,addButtonLabel:i,onAdd:m,title:d,actions:y,...g},v)=>{const{view:h,setView:f,searchQuery:b,setSearchQuery:p,selectedItems:w}=I(),{t:c}=F.useFormatters(),u=[{value:"kanban",icon:e.jsx(De,{className:"h-4 w-4"}),label:"Kanban"},{value:"list",icon:e.jsx(ke,{className:"h-4 w-4"}),label:c("calendar.agenda")},{value:"table",icon:e.jsx(Ce,{className:"h-4 w-4"}),label:"Table"},{value:"timeline",icon:e.jsx(je.Calendar,{className:"h-4 w-4"}),label:"Timeline"}];return e.jsxs("div",{ref:v,className:j.cn("flex flex-wrap items-center justify-between gap-4 border-b bg-background p-4",n),...g,children:[e.jsxs("div",{className:"flex items-center gap-4",children:[d&&e.jsx("h2",{className:"text-lg font-semibold",children:d}),w.length>0&&e.jsxs(k.Badge,{variant:"secondary",children:[w.length," selected"]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[a&&e.jsxs("div",{className:"relative",children:[e.jsx(ye.Search,{className:"absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"}),e.jsx(D.Input,{placeholder:c("common.search"),value:b,onChange:s=>p(s.target.value),className:"h-9 w-[200px] pl-8"})]}),r&&e.jsx("div",{className:"flex items-center rounded-md border bg-muted/50 p-1",children:u.map(s=>e.jsx(k.Button,{variant:h===s.value?"secondary":"ghost",size:"sm",className:"h-7 px-2",onClick:()=>f(s.value),title:s.label,children:s.icon},s.value))}),e.jsxs(k.Button,{variant:"outline",size:"sm",className:"h-9",children:[e.jsx(ve,{className:"mr-2 h-4 w-4"}),c("common.filter")]}),y,o&&e.jsxs(k.Button,{size:"sm",className:"h-9",onClick:m,children:[e.jsx(X.Plus,{className:"mr-2 h-4 w-4"}),i||c("common.create")]})]})]})});ue.displayName="PipelineHeader";const xe=l.forwardRef(({className:n,children:r,...a},o)=>{const{view:i}=I();return e.jsx("div",{ref:o,className:j.cn("flex-1 overflow-hidden",n),...a,children:r||e.jsxs(e.Fragment,{children:[i==="kanban"&&e.jsx(_,{}),i==="list"&&e.jsx(K,{}),i==="table"&&e.jsx(Q,{}),i==="timeline"&&e.jsx($,{})]})})});xe.displayName="PipelineContent";const Se=l.memo(function({item:r,stageId:a,renderItem:o,defaultRenderItem:i,onItemClick:m}){const{attributes:d,listeners:y,setNodeRef:g,transform:v,transition:h,isDragging:f}=M.useSortable({id:r.id,data:{type:"item",item:r,stageId:a}}),b={transform:M.CSS.Transform.toString(v),transition:h,opacity:f?.5:1,cursor:"grab"};return e.jsx("div",{ref:g,style:b,...d,...y,onClick:p=>{p.stopPropagation(),m?.(r)},children:o?o(r,a):i(r)})}),Me=l.memo(function({stage:r,items:a,columnWidth:o,showAddButton:i,onItemAdd:m,onItemClick:d,renderItem:y,defaultRenderItem:g,getStageTotal:v,formatCurrency:h,t:f}){const b=l.useMemo(()=>a.map(p=>p.id),[a]);return e.jsxs("div",{className:"flex shrink-0 flex-col rounded-lg bg-muted/30",style:{width:o},children:[e.jsxs("div",{className:"flex items-center justify-between p-3 border-b",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[r.color&&e.jsx("div",{className:"h-3 w-3 rounded-full",style:{backgroundColor:r.color}}),e.jsx("h3",{className:"text-sm font-semibold",children:r.name}),e.jsx(k.Badge,{variant:"secondary",className:"text-xs",children:a.length})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[i&&m&&e.jsx(k.Button,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:()=>m(r.id),children:e.jsx(X.Plus,{className:"h-4 w-4"})}),e.jsxs(D.DropdownMenu,{children:[e.jsx(D.DropdownMenuTrigger,{asChild:!0,children:e.jsx(k.Button,{variant:"ghost",size:"icon",className:"h-6 w-6",children:e.jsx(V.Ellipsis,{className:"h-4 w-4"})})}),e.jsxs(D.DropdownMenuContent,{align:"end",children:[e.jsx(D.DropdownMenuItem,{children:f("common.edit")}),e.jsx(D.DropdownMenuSeparator,{}),e.jsx(D.DropdownMenuItem,{className:"text-destructive",children:f("common.delete")})]})]})]})]}),e.jsxs("div",{className:"px-3 py-2 text-xs text-muted-foreground border-b",children:[f("deal.value"),":"," ",e.jsx("span",{className:"font-medium text-foreground",children:h(v(r.id),{minimumFractionDigits:0,maximumFractionDigits:0})})]}),e.jsx(k.ScrollArea,{className:"flex-1",children:e.jsxs("div",{className:"flex flex-col gap-2 p-2 min-h-[100px]",children:[e.jsx(M.SortableContext,{items:b,strategy:M.verticalListSortingStrategy,children:a.map(p=>e.jsx(Se,{item:p,stageId:r.id,renderItem:y,defaultRenderItem:g,onItemClick:d},p.id))}),a.length===0&&e.jsx("div",{className:"py-8 text-center text-sm text-muted-foreground",children:f("common.noData")})]})})]})}),_=l.forwardRef(({className:n,columnWidth:r=320,showAddButton:a=!0,renderItem:o,...i},m)=>{const{stages:d,items:y,onItemMove:g,onItemClick:v,onItemAdd:h}=I(),{formatCurrency:f,formatDate:b,t:p}=F.useFormatters(),[w,c]=l.useState(null),u=M.useSensors(M.useSensor(M.PointerSensor,{activationConstraint:{delay:150,tolerance:5}}),M.useSensor(M.KeyboardSensor,{coordinateGetter:M.sortableKeyboardCoordinates})),s=l.useMemo(()=>{const x={};return d.forEach(C=>{x[C.id]=y.filter(S=>S.stageId===C.id)}),x},[d,y]),t=l.useCallback(x=>s[x]?.reduce((C,S)=>C+(S.value||0),0)||0,[s]),N={low:"bg-muted text-muted-foreground",medium:"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200",high:"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200"},P=l.useCallback(x=>e.jsx(E.Card,{className:"cursor-pointer transition-all hover:shadow-md",children:e.jsxs(E.CardContent,{className:"p-3 space-y-2",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h4",{className:"font-medium text-sm truncate",children:x.title}),x.company&&e.jsx("p",{className:"text-xs text-muted-foreground truncate",children:x.company})]}),x.priority&&e.jsx(k.Badge,{className:j.cn("text-[10px] ml-2",N[x.priority]),children:x.priority})]}),x.value!==void 0&&e.jsx("div",{className:"text-sm font-semibold",children:f(x.value,{minimumFractionDigits:0,maximumFractionDigits:0})}),e.jsxs("div",{className:"flex items-center justify-between text-xs text-muted-foreground",children:[x.dueDate&&e.jsx("span",{children:b(x.dueDate)}),x.owner&&e.jsx("span",{className:"truncate max-w-[100px]",children:x.owner.name})]}),x.probability!==void 0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex-1 h-1.5 bg-muted rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full bg-primary rounded-full",style:{width:`${x.probability}%`}})}),e.jsxs("span",{className:"text-[10px] text-muted-foreground",children:[x.probability,"%"]})]})]})}),[f,b,N]),O=l.useCallback(x=>{const{active:C}=x,S=C.data.current;S?.item&&c(S.item)},[]),T=l.useCallback(x=>{},[]),q=l.useCallback(x=>{const{active:C,over:S}=x;if(c(null),!S)return;const H=C.data.current,B=S.data.current;if(!H)return;const pe=H.item,J=H.stageId;let L=null;if(B?.type==="item")L=B.stageId;else if(B?.type==="column")L=B.stageId;else{const U=y.find(fe=>fe.id===S.id);U&&(L=U.stageId)}L&&J!==L&&g?.(pe.id,J,L)},[y,g]),A=l.useMemo(()=>[...d].sort((x,C)=>x.order-C.order),[d]);return e.jsx("div",{ref:m,className:j.cn("h-full",n),...i,children:e.jsxs(M.DndContext,{sensors:u,collisionDetection:M.closestCorners,onDragStart:O,onDragOver:T,onDragEnd:q,children:[e.jsxs(k.ScrollArea,{className:"h-full",children:[e.jsx("div",{className:"flex gap-4 p-4 h-full",children:A.map(x=>e.jsx(Me,{stage:x,items:s[x.id]||[],columnWidth:r,showAddButton:a,onItemAdd:h,onItemClick:v,renderItem:o,defaultRenderItem:P,getStageTotal:t,formatCurrency:f,t:p},x.id))}),e.jsx(k.ScrollBar,{orientation:"horizontal"})]}),e.jsx(M.DragOverlay,{dropAnimation:{duration:200,easing:"cubic-bezier(0.18, 0.67, 0.6, 1.22)"},children:w?e.jsx("div",{className:"opacity-90 shadow-xl rotate-3 scale-105",children:o?o(w,w.stageId):P(w)}):null})]})})});_.displayName="PipelineKanban";const K=l.forwardRef(({className:n,renderItem:r,...a},o)=>{const{stages:i,items:m,selectedItems:d,setSelectedItems:y,onItemClick:g,onItemEdit:v,onItemDelete:h}=I(),{formatCurrency:f,formatDate:b,t:p}=F.useFormatters(),w=l.useMemo(()=>{const t={};return i.forEach(N=>{t[N.id]=m.filter(P=>P.stageId===N.id)}),t},[i,m]),c=t=>{d.includes(t)?y(d.filter(N=>N!==t)):y([...d,t])},u={low:"bg-muted text-muted-foreground",medium:"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200",high:"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200"},s=(t,N)=>e.jsxs("div",{className:j.cn("flex items-center gap-4 rounded-lg border bg-card p-4 transition-colors hover:bg-muted/50",d.includes(t.id)&&"bg-muted/50 border-primary"),children:[e.jsx(z.Checkbox,{checked:d.includes(t.id),onCheckedChange:()=>c(t.id)}),e.jsx(we,{className:"h-4 w-4 text-muted-foreground cursor-grab"}),e.jsxs("div",{className:"flex-1 min-w-0 cursor-pointer",onClick:()=>g?.(t),children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("h4",{className:"font-medium truncate",children:t.title}),t.priority&&e.jsx(k.Badge,{className:j.cn("text-xs",u[t.priority]),children:t.priority})]}),e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[t.company&&e.jsx("span",{children:t.company}),t.owner&&e.jsx("span",{children:t.owner.name})]})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[N.color&&e.jsx("div",{className:"h-2 w-2 rounded-full",style:{backgroundColor:N.color}}),e.jsx("span",{className:"text-sm",children:N.name})]}),t.value!==void 0&&e.jsx("div",{className:"font-semibold min-w-[100px] text-right",children:f(t.value,{minimumFractionDigits:0,maximumFractionDigits:0})}),t.dueDate&&e.jsx("div",{className:"text-sm text-muted-foreground min-w-[100px]",children:b(t.dueDate)}),e.jsxs(D.DropdownMenu,{children:[e.jsx(D.DropdownMenuTrigger,{asChild:!0,children:e.jsx(k.Button,{variant:"ghost",size:"icon",className:"h-8 w-8",children:e.jsx(V.Ellipsis,{className:"h-4 w-4"})})}),e.jsxs(D.DropdownMenuContent,{align:"end",children:[e.jsx(D.DropdownMenuItem,{onClick:()=>v?.(t),children:p("common.edit")}),e.jsx(D.DropdownMenuSeparator,{}),e.jsx(D.DropdownMenuItem,{className:"text-destructive",onClick:()=>h?.(t.id),children:p("common.delete")})]})]})]})]});return e.jsx("div",{ref:o,className:j.cn("h-full",n),...a,children:e.jsx(k.ScrollArea,{className:"h-full",children:e.jsx("div",{className:"p-4 space-y-6",children:i.sort((t,N)=>t.order-N.order).map(t=>e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[t.color&&e.jsx("div",{className:"h-3 w-3 rounded-full",style:{backgroundColor:t.color}}),e.jsx("h3",{className:"font-semibold",children:t.name}),e.jsx(k.Badge,{variant:"secondary",children:w[t.id]?.length||0})]}),e.jsxs("div",{className:"space-y-2",children:[w[t.id]?.map(N=>r?e.jsx("div",{children:r(N)},N.id):e.jsx("div",{children:s(N,t)},N.id)),w[t.id]?.length===0&&e.jsx("div",{className:"py-4 text-center text-sm text-muted-foreground border rounded-lg",children:p("common.noData")})]})]},t.id))})})})});K.displayName="PipelineList";const Q=l.forwardRef(({className:n,...r},a)=>{const{stages:o,items:i,selectedItems:m,setSelectedItems:d,onItemClick:y,onItemEdit:g,onItemDelete:v}=I(),{formatCurrency:h,formatDate:f,t:b}=F.useFormatters(),p=l.useMemo(()=>{const s={};return o.forEach(t=>{s[t.id]=t}),s},[o]),w=()=>{m.length===i.length?d([]):d(i.map(s=>s.id))},c=s=>{m.includes(s)?d(m.filter(t=>t!==s)):d([...m,s])},u={low:"bg-muted text-muted-foreground",medium:"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200",high:"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200"};return e.jsx("div",{ref:a,className:j.cn("h-full",n),...r,children:e.jsx(k.ScrollArea,{className:"h-full",children:e.jsx("div",{className:"p-4",children:e.jsx("div",{className:"rounded-lg border",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b bg-muted/50",children:[e.jsx("th",{className:"w-[40px] p-3",children:e.jsx(z.Checkbox,{checked:m.length===i.length&&i.length>0,onCheckedChange:w})}),e.jsx("th",{className:"text-left p-3 font-medium text-sm",children:"Title"}),e.jsx("th",{className:"text-left p-3 font-medium text-sm",children:"Company"}),e.jsx("th",{className:"text-left p-3 font-medium text-sm",children:b("deal.stage")}),e.jsx("th",{className:"text-right p-3 font-medium text-sm",children:b("deal.value")}),e.jsx("th",{className:"text-center p-3 font-medium text-sm",children:b("deal.probability")}),e.jsx("th",{className:"text-left p-3 font-medium text-sm",children:"Owner"}),e.jsx("th",{className:"text-left p-3 font-medium text-sm",children:b("deal.closeDate")}),e.jsx("th",{className:"text-left p-3 font-medium text-sm",children:"Priority"}),e.jsx("th",{className:"w-[60px] p-3"})]})}),e.jsxs("tbody",{children:[i.map(s=>{const t=p[s.stageId];return e.jsxs("tr",{className:j.cn("border-b transition-colors hover:bg-muted/50",m.includes(s.id)&&"bg-muted/50"),children:[e.jsx("td",{className:"p-3",children:e.jsx(z.Checkbox,{checked:m.includes(s.id),onCheckedChange:()=>c(s.id)})}),e.jsx("td",{className:"p-3 font-medium cursor-pointer",onClick:()=>y?.(s),children:s.title}),e.jsx("td",{className:"p-3 text-muted-foreground",children:s.company}),e.jsx("td",{className:"p-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[t?.color&&e.jsx("div",{className:"h-2 w-2 rounded-full",style:{backgroundColor:t.color}}),e.jsx("span",{children:t?.name})]})}),e.jsx("td",{className:"p-3 text-right font-medium",children:s.value!==void 0?h(s.value,{minimumFractionDigits:0,maximumFractionDigits:0}):"-"}),e.jsx("td",{className:"p-3 text-center",children:s.probability!==void 0?`${s.probability}%`:"-"}),e.jsx("td",{className:"p-3 text-muted-foreground",children:s.owner?.name||"-"}),e.jsx("td",{className:"p-3 text-muted-foreground",children:s.dueDate?f(s.dueDate):"-"}),e.jsx("td",{className:"p-3",children:s.priority&&e.jsx(k.Badge,{className:j.cn("text-xs",u[s.priority]),children:s.priority})}),e.jsx("td",{className:"p-3",children:e.jsxs(D.DropdownMenu,{children:[e.jsx(D.DropdownMenuTrigger,{asChild:!0,children:e.jsx(k.Button,{variant:"ghost",size:"icon",className:"h-8 w-8",children:e.jsx(V.Ellipsis,{className:"h-4 w-4"})})}),e.jsxs(D.DropdownMenuContent,{align:"end",children:[e.jsx(D.DropdownMenuItem,{onClick:()=>g?.(s),children:b("common.edit")}),e.jsx(D.DropdownMenuSeparator,{}),e.jsx(D.DropdownMenuItem,{className:"text-destructive",onClick:()=>v?.(s.id),children:b("common.delete")})]})]})})]},s.id)}),i.length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:10,className:"p-8 text-center text-muted-foreground",children:b("common.noData")})})]})]})})})})})});Q.displayName="PipelineTable";const $=l.forwardRef(({className:n,...r},a)=>{const{stages:o,items:i,onItemClick:m}=I(),{formatCurrency:d,formatDate:y,t:g}=F.useFormatters(),v=l.useMemo(()=>{const c={};return new Date().setHours(0,0,0,0),i.filter(s=>s.dueDate).sort((s,t)=>{const N=new Date(s.dueDate),P=new Date(t.dueDate);return N.getTime()-P.getTime()}).forEach(s=>{const N=new Date(s.dueDate).toISOString().split("T")[0];c[N]||(c[N]=[]),c[N].push(s)}),c},[i]),h=l.useMemo(()=>{const c={};return o.forEach(u=>{c[u.id]=u}),c},[o]),f=Object.keys(v).sort(),b=new Date().toISOString().split("T")[0],p=c=>{const u=new Date(c),s=new Date;s.setHours(0,0,0,0);const t=Math.ceil((u.getTime()-s.getTime())/(1e3*60*60*24));return t===0?g("date.today"):t===1?g("date.tomorrow"):t===-1?g("date.yesterday"):y(u,"EEEE, MMMM d")},w=c=>c<b;return e.jsx("div",{ref:a,className:j.cn("h-full",n),...r,children:e.jsx(k.ScrollArea,{className:"h-full",children:e.jsx("div",{className:"p-4",children:f.length===0?e.jsx("div",{className:"py-12 text-center text-muted-foreground",children:g("common.noData")}):e.jsx("div",{className:"relative space-y-8 before:absolute before:inset-0 before:ml-5 before:h-full before:w-0.5 before:-translate-x-px before:bg-border md:before:mx-auto md:before:translate-x-0",children:f.map(c=>e.jsxs("div",{className:"relative flex items-start gap-6 md:gap-12",children:[e.jsx("div",{className:"flex items-center justify-center w-10 h-10 rounded-full bg-background border-2 border-muted shrink-0 md:order-1 md:mx-auto",children:e.jsx("div",{className:j.cn("w-3 h-3 rounded-full",w(c)?"bg-destructive":"bg-primary")})}),e.jsxs("div",{className:"hidden md:block md:w-1/2 md:text-right md:pr-8",children:[e.jsx("span",{className:j.cn("font-semibold",w(c)&&"text-destructive"),children:p(c)}),e.jsxs("span",{className:"block text-sm text-muted-foreground",children:[v[c].length," item(s)"]})]}),e.jsxs("div",{className:"flex-1 md:w-1/2 md:pl-8",children:[e.jsx("div",{className:"md:hidden mb-2",children:e.jsx("span",{className:j.cn("font-semibold",w(c)&&"text-destructive"),children:p(c)})}),e.jsx("div",{className:"space-y-3",children:v[c].map(u=>{const s=h[u.stageId];return e.jsx(E.Card,{className:"cursor-pointer hover:shadow-md transition-shadow",onClick:()=>m?.(u),children:e.jsxs(E.CardContent,{className:"p-4",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h4",{className:"font-medium truncate",children:u.title}),u.company&&e.jsx("p",{className:"text-sm text-muted-foreground",children:u.company})]}),u.value!==void 0&&e.jsx("div",{className:"font-semibold",children:d(u.value,{minimumFractionDigits:0,maximumFractionDigits:0})})]}),e.jsxs("div",{className:"flex items-center gap-3 mt-3 text-sm",children:[s&&e.jsxs("div",{className:"flex items-center gap-1.5",children:[s.color&&e.jsx("div",{className:"h-2 w-2 rounded-full",style:{backgroundColor:s.color}}),e.jsx("span",{children:s.name})]}),u.owner&&e.jsx("span",{className:"text-muted-foreground",children:u.owner.name})]})]})},u.id)})})]})]},c))})})})})});$.displayName="PipelineTimeline";const he=l.forwardRef(({className:n,...r},a)=>{const{stages:o,items:i}=I(),{formatCurrency:m,t:d}=F.useFormatters(),y=i.reduce((h,f)=>h+(f.value||0),0),g=i.length,v=l.useMemo(()=>o.map(h=>{const f=i.filter(p=>p.stageId===h.id),b=f.reduce((p,w)=>p+(w.value||0),0);return{...h,count:f.length,value:b}}),[o,i]);return e.jsx("div",{ref:a,className:j.cn("border-t bg-muted/30 px-4 py-3",n),...r,children:e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-6",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:d("common.total")}),e.jsx("div",{className:"font-semibold",children:m(y,{minimumFractionDigits:0,maximumFractionDigits:0})})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:d("common.items")}),e.jsx("div",{className:"font-semibold",children:g})]})]}),e.jsx("div",{className:"flex items-center gap-4",children:v.map(h=>e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[h.color&&e.jsx("div",{className:"h-2 w-2 rounded-full",style:{backgroundColor:h.color}}),e.jsxs("span",{className:"text-muted-foreground",children:[h.name,":"]}),e.jsx("span",{className:"font-medium",children:h.count})]},h.id))})]})})});he.displayName="PipelineSummary";exports.AppShell=Y;exports.AppShellFooter=se;exports.AppShellHeader=Z;exports.AppShellMain=ee;exports.DashboardContent=le;exports.DashboardFooter=ce;exports.DashboardHeader=oe;exports.DashboardLayout=ae;exports.DashboardMain=ie;exports.DashboardSidebar=ne;exports.PageHeader=te;exports.Pipeline=me;exports.PipelineContent=xe;exports.PipelineHeader=ue;exports.PipelineKanban=_;exports.PipelineList=K;exports.PipelineSummary=he;exports.PipelineTable=Q;exports.PipelineTimeline=$;exports.useDashboardLayout=G;exports.usePipeline=I;
|
|
2
|
+
//# sourceMappingURL=pipeline-By5_8AFg.cjs.map
|