@senitix/ui 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/avatar-BT_SPwFW.cjs +18 -0
- package/dist/{avatar-C0aVNCG9.cjs.map → avatar-BT_SPwFW.cjs.map} +1 -1
- package/dist/avatar-C5-ZWIqT.js +305 -0
- package/dist/{avatar-CN6wcrqY.js.map → avatar-C5-ZWIqT.js.map} +1 -1
- package/dist/calendar-BF5drX5u.cjs +12 -0
- package/dist/{calendar-BUm7YrNf.cjs.map → calendar-BF5drX5u.cjs.map} +1 -1
- package/dist/calendar-CUxm1K7J.js +17 -0
- package/dist/{calendar-ChJkFXXr.js.map → calendar-CUxm1K7J.js.map} +1 -1
- package/dist/calendar-D3RWU0_G.cjs +7 -0
- package/dist/{calendar-SwL5isYC.cjs.map → calendar-D3RWU0_G.cjs.map} +1 -1
- package/dist/{calendar-BFWc4IB7.js → calendar-DgnhzEfp.js} +126 -112
- package/dist/{calendar-BFWc4IB7.js.map → calendar-DgnhzEfp.js.map} +1 -1
- package/dist/{card-tMkUxpmW.cjs → card-DISL3sPJ.cjs} +2 -2
- package/dist/{card-tMkUxpmW.cjs.map → card-DISL3sPJ.cjs.map} +1 -1
- package/dist/{card-K4fxyYwE.js → card-fId5vof_.js} +2 -2
- package/dist/{card-K4fxyYwE.js.map → card-fId5vof_.js.map} +1 -1
- package/dist/{checkbox-CpOq5hkT.js → checkbox-BY2zxQVv.js} +5 -5
- package/dist/{checkbox-CpOq5hkT.js.map → checkbox-BY2zxQVv.js.map} +1 -1
- package/dist/checkbox-CL6u7vL6.cjs +2 -0
- package/dist/{checkbox-D7-LQyCl.cjs.map → checkbox-CL6u7vL6.cjs.map} +1 -1
- package/dist/chevron-down-BiUlxZA-.js +14 -0
- package/dist/{chevron-down-DJ1_YIFu.js.map → chevron-down-BiUlxZA-.js.map} +1 -1
- package/dist/chevron-down-Ce0kqXiD.cjs +7 -0
- package/dist/{chevron-down-DHdXqOqK.cjs.map → chevron-down-Ce0kqXiD.cjs.map} +1 -1
- package/dist/chevron-right-BLyGmyaF.js +14 -0
- package/dist/{chevron-right-B3bovvh0.js.map → chevron-right-BLyGmyaF.js.map} +1 -1
- package/dist/chevron-right-Bxf8i4gi.cjs +7 -0
- package/dist/{chevron-right-Dvyd11q0.cjs.map → chevron-right-Bxf8i4gi.cjs.map} +1 -1
- package/dist/chevron-up-BmYZUtrk.js +12 -0
- package/dist/{chevron-up-CGtXOr51.js.map → chevron-up-BmYZUtrk.js.map} +1 -1
- package/dist/chevron-up-C3RClqXD.cjs +7 -0
- package/dist/{chevron-up-B9fuiZhc.cjs.map → chevron-up-C3RClqXD.cjs.map} +1 -1
- package/dist/components/charts/index.cjs.js +1 -1
- package/dist/components/charts/index.es.js +1 -1
- package/dist/components/data-display/index.cjs.js +1 -1
- package/dist/components/data-display/index.es.js +1 -1
- package/dist/components/dnd/index.cjs.js +1 -1
- package/dist/components/dnd/index.es.js +1 -1
- package/dist/components/feedback/index.cjs.js +1 -1
- package/dist/components/feedback/index.es.js +1 -1
- package/dist/components/forms/index.cjs.js +1 -1
- package/dist/components/forms/index.es.js +1 -1
- package/dist/components/layouts/index.cjs.js +1 -1
- package/dist/components/layouts/index.es.js +1 -1
- package/dist/components/navigation/index.cjs.js +1 -1
- package/dist/components/navigation/index.es.js +1 -1
- package/dist/components/ui/index.cjs.js +1 -1
- package/dist/components/ui/index.es.js +13 -13
- package/dist/{createLucideIcon-BbeNo6vq.js → createLucideIcon-BC8wu-bu.js} +25 -1
- package/dist/{createLucideIcon-BbeNo6vq.js.map → createLucideIcon-BC8wu-bu.js.map} +1 -1
- package/dist/createLucideIcon-Cv8nC2E9.cjs +22 -0
- package/dist/{createLucideIcon-i5GEhNMV.cjs.map → createLucideIcon-Cv8nC2E9.cjs.map} +1 -1
- package/dist/ellipsis-6eUne95u.js +16 -0
- package/dist/{ellipsis-CiKEaUNP.js.map → ellipsis-6eUne95u.js.map} +1 -1
- package/dist/ellipsis-DkM3GBF5.cjs +7 -0
- package/dist/{ellipsis-BW2gWki8.cjs.map → ellipsis-DkM3GBF5.cjs.map} +1 -1
- package/dist/file-Cp5UoYUZ.cjs +7 -0
- package/dist/{file-V_hhCUhr.cjs.map → file-Cp5UoYUZ.cjs.map} +1 -1
- package/dist/file-Cw_u_aJB.js +15 -0
- package/dist/{file-wzTXnWqz.js.map → file-Cw_u_aJB.js.map} +1 -1
- package/dist/filter-tags-DoRzXjuY.cjs +48 -0
- package/dist/{filter-tags-DjUaNXHR.cjs.map → filter-tags-DoRzXjuY.cjs.map} +1 -1
- package/dist/{filter-tags-i_I8qV1N.js → filter-tags-zEQmRhEU.js} +353 -299
- package/dist/{filter-tags-i_I8qV1N.js.map → filter-tags-zEQmRhEU.js.map} +1 -1
- package/dist/{full-calendar-7ac2FFU6.js → full-calendar-5Z4JSj8g.js} +1176 -1143
- package/dist/{full-calendar-7ac2FFU6.js.map → full-calendar-5Z4JSj8g.js.map} +1 -1
- package/dist/full-calendar-DjAvCfuE.cjs +23 -0
- package/dist/{full-calendar-Cpeh5xMP.cjs.map → full-calendar-DjAvCfuE.cjs.map} +1 -1
- package/dist/{global-search-h1rVbP2q.js → global-search-BbZfc-VL.js} +514 -486
- package/dist/global-search-BbZfc-VL.js.map +1 -0
- package/dist/global-search-Bd74_wPV.cjs +22 -0
- package/dist/global-search-Bd74_wPV.cjs.map +1 -0
- package/dist/hooks/index.cjs.js +1 -1
- package/dist/hooks/index.es.js +1 -1
- package/dist/index-D2U2F80P.cjs +2 -0
- package/dist/index-D2U2F80P.cjs.map +1 -0
- package/dist/index-DG0KV-sw.cjs +11 -0
- package/dist/{index-CzVK9Zyb.cjs.map → index-DG0KV-sw.cjs.map} +1 -1
- package/dist/{index-Co9o9StL.js → index-Dk_Et2WJ.js} +2 -2
- package/dist/{index-Co9o9StL.js.map → index-Dk_Et2WJ.js.map} +1 -1
- package/dist/{index-CwJPJKOE.js → index-DtaLkIY8.js} +1072 -573
- package/dist/index-DtaLkIY8.js.map +1 -0
- package/dist/index-XnFSmCuh.js +299 -0
- package/dist/{index-l828OqQN.js.map → index-XnFSmCuh.js.map} +1 -1
- package/dist/{index-lT9bLt9X.cjs → index-gVbM3K4f.cjs} +2 -2
- package/dist/{index-lT9bLt9X.cjs.map → index-gVbM3K4f.cjs.map} +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +23 -23
- package/dist/input-BgPy-4Qu.js +3658 -0
- package/dist/{input-D4AoiWxo.js.map → input-BgPy-4Qu.js.map} +1 -1
- package/dist/input-Cfr2WB-P.cjs +47 -0
- package/dist/{input-CZrckPLk.cjs.map → input-Cfr2WB-P.cjs.map} +1 -1
- package/dist/locale-provider-BojNdf1Y.cjs +2 -0
- package/dist/{locale-provider-DHMwuneF.cjs.map → locale-provider-BojNdf1Y.cjs.map} +1 -1
- package/dist/{locale-provider-DanG6RRG.js → locale-provider-DzBeb-X3.js} +62 -61
- package/dist/{locale-provider-DanG6RRG.js.map → locale-provider-DzBeb-X3.js.map} +1 -1
- package/dist/locale-selector-BD1IWk6X.cjs +22 -0
- package/dist/{locale-selector-Ppe0KTi-.cjs.map → locale-selector-BD1IWk6X.cjs.map} +1 -1
- package/dist/locale-selector-DLRSyVye.js +1772 -0
- package/dist/{locale-selector-xn2GpdP9.js.map → locale-selector-DLRSyVye.js.map} +1 -1
- package/dist/minus-C0uyaz70.cjs +7 -0
- package/dist/{minus-BXBFZSZs.cjs.map → minus-C0uyaz70.cjs.map} +1 -1
- package/dist/minus-CiwV65ZG.js +12 -0
- package/dist/{minus-DvlYtl96.js.map → minus-CiwV65ZG.js.map} +1 -1
- package/dist/{multi-container-C2UpSw5f.js → multi-container-BZia7HCU.js} +181 -164
- package/dist/{multi-container-C2UpSw5f.js.map → multi-container-BZia7HCU.js.map} +1 -1
- package/dist/multi-container-BdNbgtPZ.cjs +7 -0
- package/dist/{multi-container-DMKL8c9B.cjs.map → multi-container-BdNbgtPZ.cjs.map} +1 -1
- package/dist/pipeline-Dh052Dvj.cjs +27 -0
- package/dist/{pipeline-By5_8AFg.cjs.map → pipeline-Dh052Dvj.cjs.map} +1 -1
- package/dist/pipeline-DqWvleNy.js +1076 -0
- package/dist/{pipeline-D-QNSU0U.js.map → pipeline-DqWvleNy.js.map} +1 -1
- package/dist/plus-BsV82JJ5.cjs +7 -0
- package/dist/{plus-8wKRkVu-.cjs.map → plus-BsV82JJ5.cjs.map} +1 -1
- package/dist/plus-DxD6rofl.js +15 -0
- package/dist/{plus-CJD68KQD.js.map → plus-DxD6rofl.js.map} +1 -1
- package/dist/popover-BgLxmm1z.cjs +7 -0
- package/dist/{popover-ivh-plLc.cjs.map → popover-BgLxmm1z.cjs.map} +1 -1
- package/dist/{popover-4V4sGe1U.js → popover-PI9jbhnS.js} +85 -75
- package/dist/{popover-4V4sGe1U.js.map → popover-PI9jbhnS.js.map} +1 -1
- package/dist/progress-CTTt_CP3.js +260 -0
- package/dist/{progress-D5AsrWa6.js.map → progress-CTTt_CP3.js.map} +1 -1
- package/dist/progress-CTWb7X1Q.cjs +37 -0
- package/dist/{progress-CFnuLqnS.cjs.map → progress-CTWb7X1Q.cjs.map} +1 -1
- package/dist/providers/index.cjs.js +1 -1
- package/dist/providers/index.es.js +1 -1
- package/dist/{scroll-area-DQeqDp3Y.js → scroll-area-A3jGu-Ta.js} +302 -280
- package/dist/{scroll-area-DQeqDp3Y.js.map → scroll-area-A3jGu-Ta.js.map} +1 -1
- package/dist/scroll-area-DzDnWIYJ.cjs +12 -0
- package/dist/{scroll-area-DYOiJMXh.cjs.map → scroll-area-DzDnWIYJ.cjs.map} +1 -1
- package/dist/select-BJpZrtep.js +989 -0
- package/dist/{select-C1rNBi6c.js.map → select-BJpZrtep.js.map} +1 -1
- package/dist/select-Ii8HRuXa.cjs +2 -0
- package/dist/{select-m-Mqwxu3.cjs.map → select-Ii8HRuXa.cjs.map} +1 -1
- package/dist/separator-BzcDE0Ei.cjs +2 -0
- package/dist/{separator-DBUivkHq.cjs.map → separator-BzcDE0Ei.cjs.map} +1 -1
- package/dist/{separator-DsfoJx-2.js → separator-DyarVo1-.js} +66 -65
- package/dist/{separator-DsfoJx-2.js.map → separator-DyarVo1-.js.map} +1 -1
- package/dist/{sheet-BVWCpq7E.js → sheet-DPSdOoE6.js} +4 -4
- package/dist/{sheet-BVWCpq7E.js.map → sheet-DPSdOoE6.js.map} +1 -1
- package/dist/{sheet-mKiFLVnK.cjs → sheet-XtjvbEMq.cjs} +2 -2
- package/dist/{sheet-mKiFLVnK.cjs.map → sheet-XtjvbEMq.cjs.map} +1 -1
- package/dist/{skeleton-BmGbfJw3.js → skeleton-Bl6FAxHT.js} +2 -2
- package/dist/{skeleton-BmGbfJw3.js.map → skeleton-Bl6FAxHT.js.map} +1 -1
- package/dist/{skeleton-BSwwYaQU.cjs → skeleton-Cb6MWerF.cjs} +2 -2
- package/dist/{skeleton-BSwwYaQU.cjs.map → skeleton-Cb6MWerF.cjs.map} +1 -1
- package/dist/sortable.esm-5DsiICDg.cjs +6 -0
- package/dist/{sortable.esm-DcQYlXi3.cjs.map → sortable.esm-5DsiICDg.cjs.map} +1 -1
- package/dist/{sortable.esm-Blhf_jh1.js → sortable.esm-Cb8oRBzU.js} +42 -42
- package/dist/{sortable.esm-Blhf_jh1.js.map → sortable.esm-Cb8oRBzU.js.map} +1 -1
- package/dist/sparkline-chart-CeCDeMNk.cjs +102 -0
- package/dist/{sparkline-chart-ca3uTzVK.cjs.map → sparkline-chart-CeCDeMNk.cjs.map} +1 -1
- package/dist/{sparkline-chart-Da-ehDGv.js → sparkline-chart-DUS4CoW_.js} +7799 -9094
- package/dist/{sparkline-chart-Da-ehDGv.js.map → sparkline-chart-DUS4CoW_.js.map} +1 -1
- package/dist/styles.css +1 -0
- package/dist/trending-up-BBjz_E69.cjs +7 -0
- package/dist/{trending-up-D3Nfrhi3.cjs.map → trending-up-BBjz_E69.cjs.map} +1 -1
- package/dist/trending-up-BHFXgLWy.js +15 -0
- package/dist/{trending-up-DPwlYzQb.js.map → trending-up-BHFXgLWy.js.map} +1 -1
- package/dist/{use-formatters-l1_2c8z0.js → use-formatters-Bgj3JA4i.js} +731 -746
- package/dist/{use-formatters-l1_2c8z0.js.map → use-formatters-Bgj3JA4i.js.map} +1 -1
- package/dist/use-formatters-CObUgipW.cjs +2 -0
- package/dist/{use-formatters-d97RVcmg.cjs.map → use-formatters-CObUgipW.cjs.map} +1 -1
- package/dist/utils/index.cjs.js +1 -1
- package/dist/utils/index.es.js +1 -1
- package/dist/welcome-card-CNuEa6Ck.cjs +67 -0
- package/dist/{welcome-card-CPolYl1D.cjs.map → welcome-card-CNuEa6Ck.cjs.map} +1 -1
- package/dist/{welcome-card-CxMJZ8bv.js → welcome-card-Cp6t6G3j.js} +197 -119
- package/dist/{welcome-card-CxMJZ8bv.js.map → welcome-card-Cp6t6G3j.js.map} +1 -1
- package/package.json +14 -12
- package/dist/avatar-C0aVNCG9.cjs +0 -2
- package/dist/avatar-CN6wcrqY.js +0 -288
- package/dist/calendar-BUm7YrNf.cjs +0 -2
- package/dist/calendar-ChJkFXXr.js +0 -11
- package/dist/calendar-SwL5isYC.cjs +0 -2
- package/dist/checkbox-D7-LQyCl.cjs +0 -2
- package/dist/chevron-down-DHdXqOqK.cjs +0 -2
- package/dist/chevron-down-DJ1_YIFu.js +0 -8
- package/dist/chevron-right-B3bovvh0.js +0 -8
- package/dist/chevron-right-Dvyd11q0.cjs +0 -2
- package/dist/chevron-up-B9fuiZhc.cjs +0 -2
- package/dist/chevron-up-CGtXOr51.js +0 -6
- package/dist/createLucideIcon-i5GEhNMV.cjs +0 -2
- package/dist/ellipsis-BW2gWki8.cjs +0 -2
- package/dist/ellipsis-CiKEaUNP.js +0 -10
- package/dist/file-V_hhCUhr.cjs +0 -2
- package/dist/file-wzTXnWqz.js +0 -9
- package/dist/filter-tags-DjUaNXHR.cjs +0 -5
- package/dist/full-calendar-Cpeh5xMP.cjs +0 -8
- package/dist/global-search-UNXjoFlI.cjs +0 -2
- package/dist/global-search-UNXjoFlI.cjs.map +0 -1
- package/dist/global-search-h1rVbP2q.js.map +0 -1
- package/dist/index-CwJPJKOE.js.map +0 -1
- package/dist/index-CzVK9Zyb.cjs +0 -6
- package/dist/index-l828OqQN.js +0 -288
- package/dist/index-lGzB9daF.cjs +0 -2
- package/dist/index-lGzB9daF.cjs.map +0 -1
- package/dist/input-CZrckPLk.cjs +0 -42
- package/dist/input-D4AoiWxo.js +0 -3629
- package/dist/locale-provider-DHMwuneF.cjs +0 -2
- package/dist/locale-selector-Ppe0KTi-.cjs +0 -2
- package/dist/locale-selector-xn2GpdP9.js +0 -1745
- package/dist/minus-BXBFZSZs.cjs +0 -2
- package/dist/minus-DvlYtl96.js +0 -6
- package/dist/multi-container-DMKL8c9B.cjs +0 -2
- package/dist/pipeline-By5_8AFg.cjs +0 -2
- package/dist/pipeline-D-QNSU0U.js +0 -1036
- package/dist/plus-8wKRkVu-.cjs +0 -2
- package/dist/plus-CJD68KQD.js +0 -9
- package/dist/popover-ivh-plLc.cjs +0 -2
- package/dist/progress-CFnuLqnS.cjs +0 -7
- package/dist/progress-D5AsrWa6.js +0 -222
- package/dist/scroll-area-DYOiJMXh.cjs +0 -2
- package/dist/select-C1rNBi6c.js +0 -974
- package/dist/select-m-Mqwxu3.cjs +0 -2
- package/dist/separator-DBUivkHq.cjs +0 -2
- package/dist/sortable.esm-DcQYlXi3.cjs +0 -6
- package/dist/sparkline-chart-ca3uTzVK.cjs +0 -68
- package/dist/trending-up-D3Nfrhi3.cjs +0 -2
- package/dist/trending-up-DPwlYzQb.js +0 -9
- package/dist/ui.css +0 -1
- package/dist/use-formatters-d97RVcmg.cjs +0 -2
- package/dist/welcome-card-CPolYl1D.cjs +0 -2
|
@@ -1 +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]}
|
|
1
|
+
{"version":3,"file":"multi-container-BdNbgtPZ.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","_a","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,27 @@
|
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),be=require("react"),v=require("./index-D2U2F80P.cjs"),ge=require("./use-mobile-DY7TJ5lx.cjs"),W=require("./sheet-XtjvbEMq.cjs"),M=require("./sortable.esm-5DsiICDg.cjs"),k=require("./scroll-area-DzDnWIYJ.cjs"),D=require("./input-Cfr2WB-P.cjs"),E=require("./card-DISL3sPJ.cjs"),z=require("./checkbox-CL6u7vL6.cjs"),B=require("./use-formatters-CObUgipW.cjs"),O=require("./createLucideIcon-Cv8nC2E9.cjs"),je=require("./calendar-D3RWU0_G.cjs"),ye=require("./index-DG0KV-sw.cjs"),X=require("./plus-BsV82JJ5.cjs"),G=require("./ellipsis-DkM3GBF5.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(be);/**
|
|
2
|
+
* @license lucide-react v0.441.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const ve=O.createLucideIcon("Filter",[["polygon",{points:"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3",key:"1yg77f"}]]);/**
|
|
7
|
+
* @license lucide-react v0.441.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const we=O.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"}]]);/**
|
|
12
|
+
* @license lucide-react v0.441.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const De=O.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"}]]);/**
|
|
17
|
+
* @license lucide-react v0.441.0 - ISC
|
|
18
|
+
*
|
|
19
|
+
* This source code is licensed under the ISC license.
|
|
20
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
+
*/const ke=O.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"}]]);/**
|
|
22
|
+
* @license lucide-react v0.441.0 - ISC
|
|
23
|
+
*
|
|
24
|
+
* This source code is licensed under the ISC license.
|
|
25
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
26
|
+
*/const Se=O.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:v.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:v.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:v.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:v.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:c,...i},m)=>e.jsxs("div",{ref:m,className:v.cn("flex flex-col gap-4 md:flex-row md:items-center md:justify-between",n),...i,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}),c]}));te.displayName="PageHeader";const re=l.createContext(null);function V(){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:c="16rem",sidebarCollapsedWidth:i="4rem",...m},g)=>{const u=ge.useIsMobile(),[j,p]=l.useState(a),[b,y]=l.useState(o),f=l.useCallback(()=>{u?p(d=>!d):y(d=>!d)},[u]);l.useEffect(()=>{const d=x=>{x.key==="b"&&(x.metaKey||x.ctrlKey)&&(x.preventDefault(),f())};return window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)},[f]);const w=l.useMemo(()=>({sidebarOpen:j,setSidebarOpen:p,sidebarCollapsed:b,setSidebarCollapsed:y,isMobile:u,toggleSidebar:f}),[j,b,u,f]);return e.jsx(re.Provider,{value:w,children:e.jsx("div",{ref:g,style:{"--sidebar-width":c,"--sidebar-collapsed-width":i},className:v.cn("flex min-h-screen w-full bg-background",n),...m,children:r})})});ae.displayName="DashboardLayout";const ne=l.forwardRef(({className:n,children:r,...a},o)=>{const{sidebarOpen:c,setSidebarOpen:i,sidebarCollapsed:m,isMobile:g}=V();return g?e.jsx(W.Sheet,{open:c,onOpenChange:i,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":m,className:v.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",m?"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:c,isMobile:i}=V();return e.jsx("div",{ref:o,className:v.cn("flex flex-1 flex-col transition-[margin-left] duration-200 ease-in-out",!i&&(c?"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:v.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 ce=l.forwardRef(({className:n,children:r,...a},o)=>e.jsx("main",{ref:o,className:v.cn("flex-1 overflow-auto p-4 md:p-6",n),...a,children:r}));ce.displayName="DashboardMain";const de=l.forwardRef(({className:n,children:r,...a},o)=>e.jsx("footer",{ref:o,className:v.cn("border-t bg-background px-4 py-4 md:px-6",n),...a,children:r}));de.displayName="DashboardFooter";const ie=l.createContext(null);function T(){const n=l.useContext(ie);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:c,onViewChange:i,onItemMove:m,onItemClick:g,onItemAdd:u,onItemEdit:j,onItemDelete:p,children:b,...y},f)=>{const[w,d]=l.useState(o),[x,t]=l.useState([]),[s,N]=l.useState(""),[P,I]=l.useState(),F=c??w,H=S=>{c===void 0&&d(S),i==null||i(S)},q=l.useMemo(()=>{if(!s)return a;const S=s.toLowerCase();return a.filter(C=>{var R,L;return C.title.toLowerCase().includes(S)||((R=C.company)==null?void 0:R.toLowerCase().includes(S))||((L=C.owner)==null?void 0:L.name.toLowerCase().includes(S))})},[a,s]),h=l.useMemo(()=>({view:F,setView:H,stages:r,items:q,selectedItems:x,setSelectedItems:t,onItemMove:m,onItemClick:g,onItemAdd:u,onItemEdit:j,onItemDelete:p,searchQuery:s,setSearchQuery:N,groupBy:P,setGroupBy:I}),[F,r,q,x,s,P,m,g,u,j,p]);return e.jsx(ie.Provider,{value:h,children:e.jsx("div",{ref:f,className:v.cn("flex h-full flex-col",n),...y,children:b})})});me.displayName="Pipeline";const ue=l.forwardRef(({className:n,showViewSelector:r=!0,showSearch:a=!0,showAddButton:o=!0,addButtonLabel:c,onAdd:i,title:m,actions:g,...u},j)=>{const{view:p,setView:b,searchQuery:y,setSearchQuery:f,selectedItems:w}=T(),{t:d}=B.useFormatters(),x=[{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:d("calendar.agenda")},{value:"table",icon:e.jsx(Se,{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:j,className:v.cn("flex flex-wrap items-center justify-between gap-4 border-b bg-background p-4",n),...u,children:[e.jsxs("div",{className:"flex items-center gap-4",children:[m&&e.jsx("h2",{className:"text-lg font-semibold",children:m}),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:d("common.search"),value:y,onChange:t=>f(t.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:x.map(t=>e.jsx(k.Button,{variant:p===t.value?"secondary":"ghost",size:"sm",className:"h-7 px-2",onClick:()=>b(t.value),title:t.label,children:t.icon},t.value))}),e.jsxs(k.Button,{variant:"outline",size:"sm",className:"h-9",children:[e.jsx(ve,{className:"mr-2 h-4 w-4"}),d("common.filter")]}),g,o&&e.jsxs(k.Button,{size:"sm",className:"h-9",onClick:i,children:[e.jsx(X.Plus,{className:"mr-2 h-4 w-4"}),c||d("common.create")]})]})]})});ue.displayName="PipelineHeader";const xe=l.forwardRef(({className:n,children:r,...a},o)=>{const{view:c}=T();return e.jsx("div",{ref:o,className:v.cn("flex-1 overflow-hidden",n),...a,children:r||e.jsxs(e.Fragment,{children:[c==="kanban"&&e.jsx(_,{}),c==="list"&&e.jsx(K,{}),c==="table"&&e.jsx(Q,{}),c==="timeline"&&e.jsx($,{})]})})});xe.displayName="PipelineContent";const Ce=l.memo(function({item:r,stageId:a,renderItem:o,defaultRenderItem:c,onItemClick:i}){const{attributes:m,listeners:g,setNodeRef:u,transform:j,transition:p,isDragging:b}=M.useSortable({id:r.id,data:{type:"item",item:r,stageId:a}}),y={transform:M.CSS.Transform.toString(j),transition:p,opacity:b?.5:1,cursor:"grab"};return e.jsx("div",{ref:u,style:y,...m,...g,onClick:f=>{f.stopPropagation(),i==null||i(r)},children:o?o(r,a):c(r)})}),Me=l.memo(function({stage:r,items:a,columnWidth:o,showAddButton:c,onItemAdd:i,onItemClick:m,renderItem:g,defaultRenderItem:u,getStageTotal:j,formatCurrency:p,t:b}){const y=l.useMemo(()=>a.map(f=>f.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:[c&&i&&e.jsx(k.Button,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:()=>i(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(G.Ellipsis,{className:"h-4 w-4"})})}),e.jsxs(D.DropdownMenuContent,{align:"end",children:[e.jsx(D.DropdownMenuItem,{children:b("common.edit")}),e.jsx(D.DropdownMenuSeparator,{}),e.jsx(D.DropdownMenuItem,{className:"text-destructive",children:b("common.delete")})]})]})]})]}),e.jsxs("div",{className:"px-3 py-2 text-xs text-muted-foreground border-b",children:[b("deal.value"),":"," ",e.jsx("span",{className:"font-medium text-foreground",children:p(j(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:y,strategy:M.verticalListSortingStrategy,children:a.map(f=>e.jsx(Ce,{item:f,stageId:r.id,renderItem:g,defaultRenderItem:u,onItemClick:m},f.id))}),a.length===0&&e.jsx("div",{className:"py-8 text-center text-sm text-muted-foreground",children:b("common.noData")})]})})]})}),_=l.forwardRef(({className:n,columnWidth:r=320,showAddButton:a=!0,renderItem:o,...c},i)=>{const{stages:m,items:g,onItemMove:u,onItemClick:j,onItemAdd:p}=T(),{formatCurrency:b,formatDate:y,t:f}=B.useFormatters(),[w,d]=l.useState(null),x=M.useSensors(M.useSensor(M.PointerSensor,{activationConstraint:{delay:150,tolerance:5}}),M.useSensor(M.KeyboardSensor,{coordinateGetter:M.sortableKeyboardCoordinates})),t=l.useMemo(()=>{const h={};return m.forEach(S=>{h[S.id]=g.filter(C=>C.stageId===S.id)}),h},[m,g]),s=l.useCallback(h=>{var S;return((S=t[h])==null?void 0:S.reduce((C,R)=>C+(R.value||0),0))||0},[t]),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(h=>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:h.title}),h.company&&e.jsx("p",{className:"text-xs text-muted-foreground truncate",children:h.company})]}),h.priority&&e.jsx(k.Badge,{className:v.cn("text-[10px] ml-2",N[h.priority]),children:h.priority})]}),h.value!==void 0&&e.jsx("div",{className:"text-sm font-semibold",children:b(h.value,{minimumFractionDigits:0,maximumFractionDigits:0})}),e.jsxs("div",{className:"flex items-center justify-between text-xs text-muted-foreground",children:[h.dueDate&&e.jsx("span",{children:y(h.dueDate)}),h.owner&&e.jsx("span",{className:"truncate max-w-[100px]",children:h.owner.name})]}),h.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:`${h.probability}%`}})}),e.jsxs("span",{className:"text-[10px] text-muted-foreground",children:[h.probability,"%"]})]})]})}),[b,y,N]),I=l.useCallback(h=>{const{active:S}=h,C=S.data.current;C!=null&&C.item&&d(C.item)},[]),F=l.useCallback(h=>{},[]),H=l.useCallback(h=>{const{active:S,over:C}=h;if(d(null),!C)return;const R=S.data.current,L=C.data.current;if(!R)return;const pe=R.item,J=R.stageId;let A=null;if((L==null?void 0:L.type)==="item")A=L.stageId;else if((L==null?void 0:L.type)==="column")A=L.stageId;else{const U=g.find(fe=>fe.id===C.id);U&&(A=U.stageId)}A&&J!==A&&(u==null||u(pe.id,J,A))},[g,u]),q=l.useMemo(()=>[...m].sort((h,S)=>h.order-S.order),[m]);return e.jsx("div",{ref:i,className:v.cn("h-full",n),...c,children:e.jsxs(M.DndContext,{sensors:x,collisionDetection:M.closestCorners,onDragStart:I,onDragOver:F,onDragEnd:H,children:[e.jsxs(k.ScrollArea,{className:"h-full",children:[e.jsx("div",{className:"flex gap-4 p-4 h-full",children:q.map(h=>e.jsx(Me,{stage:h,items:t[h.id]||[],columnWidth:r,showAddButton:a,onItemAdd:p,onItemClick:j,renderItem:o,defaultRenderItem:P,getStageTotal:s,formatCurrency:b,t:f},h.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:c,items:i,selectedItems:m,setSelectedItems:g,onItemClick:u,onItemEdit:j,onItemDelete:p}=T(),{formatCurrency:b,formatDate:y,t:f}=B.useFormatters(),w=l.useMemo(()=>{const s={};return c.forEach(N=>{s[N.id]=i.filter(P=>P.stageId===N.id)}),s},[c,i]),d=s=>{m.includes(s)?g(m.filter(N=>N!==s)):g([...m,s])},x={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"},t=(s,N)=>e.jsxs("div",{className:v.cn("flex items-center gap-4 rounded-lg border bg-card p-4 transition-colors hover:bg-muted/50",m.includes(s.id)&&"bg-muted/50 border-primary"),children:[e.jsx(z.Checkbox,{checked:m.includes(s.id),onCheckedChange:()=>d(s.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:()=>u==null?void 0:u(s),children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("h4",{className:"font-medium truncate",children:s.title}),s.priority&&e.jsx(k.Badge,{className:v.cn("text-xs",x[s.priority]),children:s.priority})]}),e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[s.company&&e.jsx("span",{children:s.company}),s.owner&&e.jsx("span",{children:s.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})]}),s.value!==void 0&&e.jsx("div",{className:"font-semibold min-w-[100px] text-right",children:b(s.value,{minimumFractionDigits:0,maximumFractionDigits:0})}),s.dueDate&&e.jsx("div",{className:"text-sm text-muted-foreground min-w-[100px]",children:y(s.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(G.Ellipsis,{className:"h-4 w-4"})})}),e.jsxs(D.DropdownMenuContent,{align:"end",children:[e.jsx(D.DropdownMenuItem,{onClick:()=>j==null?void 0:j(s),children:f("common.edit")}),e.jsx(D.DropdownMenuSeparator,{}),e.jsx(D.DropdownMenuItem,{className:"text-destructive",onClick:()=>p==null?void 0:p(s.id),children:f("common.delete")})]})]})]})]});return e.jsx("div",{ref:o,className:v.cn("h-full",n),...a,children:e.jsx(k.ScrollArea,{className:"h-full",children:e.jsx("div",{className:"p-4 space-y-6",children:c.sort((s,N)=>s.order-N.order).map(s=>{var N,P,I;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[s.color&&e.jsx("div",{className:"h-3 w-3 rounded-full",style:{backgroundColor:s.color}}),e.jsx("h3",{className:"font-semibold",children:s.name}),e.jsx(k.Badge,{variant:"secondary",children:((N=w[s.id])==null?void 0:N.length)||0})]}),e.jsxs("div",{className:"space-y-2",children:[(P=w[s.id])==null?void 0:P.map(F=>r?e.jsx("div",{children:r(F)},F.id):e.jsx("div",{children:t(F,s)},F.id)),((I=w[s.id])==null?void 0:I.length)===0&&e.jsx("div",{className:"py-4 text-center text-sm text-muted-foreground border rounded-lg",children:f("common.noData")})]})]},s.id)})})})})});K.displayName="PipelineList";const Q=l.forwardRef(({className:n,...r},a)=>{const{stages:o,items:c,selectedItems:i,setSelectedItems:m,onItemClick:g,onItemEdit:u,onItemDelete:j}=T(),{formatCurrency:p,formatDate:b,t:y}=B.useFormatters(),f=l.useMemo(()=>{const t={};return o.forEach(s=>{t[s.id]=s}),t},[o]),w=()=>{i.length===c.length?m([]):m(c.map(t=>t.id))},d=t=>{i.includes(t)?m(i.filter(s=>s!==t)):m([...i,t])},x={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:v.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:i.length===c.length&&c.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:y("deal.stage")}),e.jsx("th",{className:"text-right p-3 font-medium text-sm",children:y("deal.value")}),e.jsx("th",{className:"text-center p-3 font-medium text-sm",children:y("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:y("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:[c.map(t=>{var N;const s=f[t.stageId];return e.jsxs("tr",{className:v.cn("border-b transition-colors hover:bg-muted/50",i.includes(t.id)&&"bg-muted/50"),children:[e.jsx("td",{className:"p-3",children:e.jsx(z.Checkbox,{checked:i.includes(t.id),onCheckedChange:()=>d(t.id)})}),e.jsx("td",{className:"p-3 font-medium cursor-pointer",onClick:()=>g==null?void 0:g(t),children:t.title}),e.jsx("td",{className:"p-3 text-muted-foreground",children:t.company}),e.jsx("td",{className:"p-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[(s==null?void 0:s.color)&&e.jsx("div",{className:"h-2 w-2 rounded-full",style:{backgroundColor:s.color}}),e.jsx("span",{children:s==null?void 0:s.name})]})}),e.jsx("td",{className:"p-3 text-right font-medium",children:t.value!==void 0?p(t.value,{minimumFractionDigits:0,maximumFractionDigits:0}):"-"}),e.jsx("td",{className:"p-3 text-center",children:t.probability!==void 0?`${t.probability}%`:"-"}),e.jsx("td",{className:"p-3 text-muted-foreground",children:((N=t.owner)==null?void 0:N.name)||"-"}),e.jsx("td",{className:"p-3 text-muted-foreground",children:t.dueDate?b(t.dueDate):"-"}),e.jsx("td",{className:"p-3",children:t.priority&&e.jsx(k.Badge,{className:v.cn("text-xs",x[t.priority]),children:t.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(G.Ellipsis,{className:"h-4 w-4"})})}),e.jsxs(D.DropdownMenuContent,{align:"end",children:[e.jsx(D.DropdownMenuItem,{onClick:()=>u==null?void 0:u(t),children:y("common.edit")}),e.jsx(D.DropdownMenuSeparator,{}),e.jsx(D.DropdownMenuItem,{className:"text-destructive",onClick:()=>j==null?void 0:j(t.id),children:y("common.delete")})]})]})})]},t.id)}),c.length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:10,className:"p-8 text-center text-muted-foreground",children:y("common.noData")})})]})]})})})})})});Q.displayName="PipelineTable";const $=l.forwardRef(({className:n,...r},a)=>{const{stages:o,items:c,onItemClick:i}=T(),{formatCurrency:m,formatDate:g,t:u}=B.useFormatters(),j=l.useMemo(()=>{const d={};return new Date().setHours(0,0,0,0),c.filter(t=>t.dueDate).sort((t,s)=>{const N=new Date(t.dueDate),P=new Date(s.dueDate);return N.getTime()-P.getTime()}).forEach(t=>{const N=new Date(t.dueDate).toISOString().split("T")[0];d[N]||(d[N]=[]),d[N].push(t)}),d},[c]),p=l.useMemo(()=>{const d={};return o.forEach(x=>{d[x.id]=x}),d},[o]),b=Object.keys(j).sort(),y=new Date().toISOString().split("T")[0],f=d=>{const x=new Date(d),t=new Date;t.setHours(0,0,0,0);const s=Math.ceil((x.getTime()-t.getTime())/(1e3*60*60*24));return s===0?u("date.today"):s===1?u("date.tomorrow"):s===-1?u("date.yesterday"):g(x,"EEEE, MMMM d")},w=d=>d<y;return e.jsx("div",{ref:a,className:v.cn("h-full",n),...r,children:e.jsx(k.ScrollArea,{className:"h-full",children:e.jsx("div",{className:"p-4",children:b.length===0?e.jsx("div",{className:"py-12 text-center text-muted-foreground",children:u("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:b.map(d=>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:v.cn("w-3 h-3 rounded-full",w(d)?"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:v.cn("font-semibold",w(d)&&"text-destructive"),children:f(d)}),e.jsxs("span",{className:"block text-sm text-muted-foreground",children:[j[d].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:v.cn("font-semibold",w(d)&&"text-destructive"),children:f(d)})}),e.jsx("div",{className:"space-y-3",children:j[d].map(x=>{const t=p[x.stageId];return e.jsx(E.Card,{className:"cursor-pointer hover:shadow-md transition-shadow",onClick:()=>i==null?void 0:i(x),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:x.title}),x.company&&e.jsx("p",{className:"text-sm text-muted-foreground",children:x.company})]}),x.value!==void 0&&e.jsx("div",{className:"font-semibold",children:m(x.value,{minimumFractionDigits:0,maximumFractionDigits:0})})]}),e.jsxs("div",{className:"flex items-center gap-3 mt-3 text-sm",children:[t&&e.jsxs("div",{className:"flex items-center gap-1.5",children:[t.color&&e.jsx("div",{className:"h-2 w-2 rounded-full",style:{backgroundColor:t.color}}),e.jsx("span",{children:t.name})]}),x.owner&&e.jsx("span",{className:"text-muted-foreground",children:x.owner.name})]})]})},x.id)})})]})]},d))})})})})});$.displayName="PipelineTimeline";const he=l.forwardRef(({className:n,...r},a)=>{const{stages:o,items:c}=T(),{formatCurrency:i,t:m}=B.useFormatters(),g=c.reduce((p,b)=>p+(b.value||0),0),u=c.length,j=l.useMemo(()=>o.map(p=>{const b=c.filter(f=>f.stageId===p.id),y=b.reduce((f,w)=>f+(w.value||0),0);return{...p,count:b.length,value:y}}),[o,c]);return e.jsx("div",{ref:a,className:v.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:m("common.total")}),e.jsx("div",{className:"font-semibold",children:i(g,{minimumFractionDigits:0,maximumFractionDigits:0})})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:m("common.items")}),e.jsx("div",{className:"font-semibold",children:u})]})]}),e.jsx("div",{className:"flex items-center gap-4",children:j.map(p=>e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[p.color&&e.jsx("div",{className:"h-2 w-2 rounded-full",style:{backgroundColor:p.color}}),e.jsxs("span",{className:"text-muted-foreground",children:[p.name,":"]}),e.jsx("span",{className:"font-medium",children:p.count})]},p.id))})]})})});he.displayName="PipelineSummary";exports.AppShell=Y;exports.AppShellFooter=se;exports.AppShellHeader=Z;exports.AppShellMain=ee;exports.DashboardContent=le;exports.DashboardFooter=de;exports.DashboardHeader=oe;exports.DashboardLayout=ae;exports.DashboardMain=ce;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=V;exports.usePipeline=T;
|
|
27
|
+
//# sourceMappingURL=pipeline-Dh052Dvj.cjs.map
|