@etus/ui 0.4.0-beta.7 → 0.4.0-beta.9
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/{chunk-KR3IVNQH.js → chunk-2FJJOHHH.js} +16 -10
- package/dist/chunk-2FJJOHHH.js.map +1 -0
- package/dist/{chunk-2YWWZEPE.js → chunk-2HM5Z2YP.js} +3 -3
- package/dist/{chunk-2YWWZEPE.js.map → chunk-2HM5Z2YP.js.map} +1 -1
- package/dist/{chunk-W4NC5CU5.js → chunk-2Q4I4VDB.js} +4 -4
- package/dist/{chunk-W4NC5CU5.js.map → chunk-2Q4I4VDB.js.map} +1 -1
- package/dist/{chunk-SCGKQ5RE.js → chunk-2ROFZG3A.js} +3 -3
- package/dist/{chunk-SCGKQ5RE.js.map → chunk-2ROFZG3A.js.map} +1 -1
- package/dist/chunk-2Z722V5K.js +231 -0
- package/dist/chunk-2Z722V5K.js.map +1 -0
- package/dist/chunk-37IIHQP4.js +233 -0
- package/dist/chunk-37IIHQP4.js.map +1 -0
- package/dist/{chunk-YP2ATSXP.js → chunk-3BBOSSDG.js} +14 -6
- package/dist/{chunk-YP2ATSXP.js.map → chunk-3BBOSSDG.js.map} +1 -1
- package/dist/{chunk-UFRMZ3M6.js → chunk-3JCV72FO.js} +6 -2
- package/dist/chunk-3JCV72FO.js.map +1 -0
- package/dist/{chunk-2UGDLAYC.js → chunk-45D4O7RK.js} +10 -3
- package/dist/chunk-45D4O7RK.js.map +1 -0
- package/dist/{chunk-OTSK2KAI.js → chunk-4EYYCHLD.js} +5 -5
- package/dist/{chunk-OTSK2KAI.js.map → chunk-4EYYCHLD.js.map} +1 -1
- package/dist/{chunk-QIETN4UU.js → chunk-55RLLBXW.js} +4 -4
- package/dist/{chunk-QIETN4UU.js.map → chunk-55RLLBXW.js.map} +1 -1
- package/dist/{chunk-FCT6FEEZ.js → chunk-5DMK7CVS.js} +5 -5
- package/dist/{chunk-FCT6FEEZ.js.map → chunk-5DMK7CVS.js.map} +1 -1
- package/dist/{chunk-J62TFQHR.js → chunk-5I7AXWJU.js} +13 -13
- package/dist/chunk-5I7AXWJU.js.map +1 -0
- package/dist/{chunk-65YSTUD2.js → chunk-5SUD32RK.js} +44 -14
- package/dist/chunk-5SUD32RK.js.map +1 -0
- package/dist/{chunk-VPNFYQBL.js → chunk-6DN2UAIR.js} +3 -3
- package/dist/chunk-6DN2UAIR.js.map +1 -0
- package/dist/{chunk-EGYWK2XX.js → chunk-7CTFBOD4.js} +3 -3
- package/dist/{chunk-EGYWK2XX.js.map → chunk-7CTFBOD4.js.map} +1 -1
- package/dist/{chunk-AWYOWR5N.js → chunk-C5HSYDJC.js} +3 -3
- package/dist/{chunk-AWYOWR5N.js.map → chunk-C5HSYDJC.js.map} +1 -1
- package/dist/{chunk-VFALJSXB.js → chunk-DCUFQJYP.js} +3 -3
- package/dist/chunk-DCUFQJYP.js.map +1 -0
- package/dist/{chunk-LATTRPLQ.js → chunk-E2TI5V67.js} +3 -3
- package/dist/{chunk-LATTRPLQ.js.map → chunk-E2TI5V67.js.map} +1 -1
- package/dist/{chunk-23BHD62H.js → chunk-EVZ2GZU4.js} +5 -5
- package/dist/chunk-EVZ2GZU4.js.map +1 -0
- package/dist/{chunk-IRKDMISK.js → chunk-G2MAGZHQ.js} +4 -3
- package/dist/chunk-G2MAGZHQ.js.map +1 -0
- package/dist/{chunk-4GQN76L7.js → chunk-G7PBPX3K.js} +3 -3
- package/dist/{chunk-4GQN76L7.js.map → chunk-G7PBPX3K.js.map} +1 -1
- package/dist/{chunk-36XTKR3B.js → chunk-GDSYLR7L.js} +4 -4
- package/dist/{chunk-36XTKR3B.js.map → chunk-GDSYLR7L.js.map} +1 -1
- package/dist/{chunk-ONQCNOLU.js → chunk-HDOR3SN3.js} +3 -3
- package/dist/{chunk-ONQCNOLU.js.map → chunk-HDOR3SN3.js.map} +1 -1
- package/dist/{chunk-PLLJNHWU.js → chunk-HI3T55XK.js} +3 -33
- package/dist/chunk-HI3T55XK.js.map +1 -0
- package/dist/chunk-HJ4E6YPW.js +236 -0
- package/dist/chunk-HJ4E6YPW.js.map +1 -0
- package/dist/{chunk-LS3WD6IZ.js → chunk-I55QJ4CU.js} +4 -4
- package/dist/{chunk-LS3WD6IZ.js.map → chunk-I55QJ4CU.js.map} +1 -1
- package/dist/{chunk-HKXQLWGR.js → chunk-IOWHM7ZY.js} +13 -11
- package/dist/chunk-IOWHM7ZY.js.map +1 -0
- package/dist/{chunk-ILAV2AZ4.js → chunk-IZC5YFGO.js} +3 -3
- package/dist/{chunk-ILAV2AZ4.js.map → chunk-IZC5YFGO.js.map} +1 -1
- package/dist/{chunk-Y7UFBSAD.js → chunk-KHOCAVQO.js} +3 -3
- package/dist/{chunk-Y7UFBSAD.js.map → chunk-KHOCAVQO.js.map} +1 -1
- package/dist/{chunk-IBVCSZCH.js → chunk-KVJOKWP4.js} +5 -4
- package/dist/chunk-KVJOKWP4.js.map +1 -0
- package/dist/{chunk-2Y7PQ6ZL.js → chunk-LNSCL76Q.js} +5 -5
- package/dist/{chunk-2Y7PQ6ZL.js.map → chunk-LNSCL76Q.js.map} +1 -1
- package/dist/{chunk-OWOVCGUZ.js → chunk-M2C7HBR5.js} +3 -3
- package/dist/{chunk-OWOVCGUZ.js.map → chunk-M2C7HBR5.js.map} +1 -1
- package/dist/{chunk-33JGPMUW.js → chunk-M7TPROVH.js} +20 -7
- package/dist/chunk-M7TPROVH.js.map +1 -0
- package/dist/{chunk-AVR3LVOQ.js → chunk-MQMRVBUL.js} +4 -4
- package/dist/{chunk-AVR3LVOQ.js.map → chunk-MQMRVBUL.js.map} +1 -1
- package/dist/{chunk-JMZ4CO6R.js → chunk-NCT5WXKG.js} +3 -3
- package/dist/{chunk-JMZ4CO6R.js.map → chunk-NCT5WXKG.js.map} +1 -1
- package/dist/{chunk-KPNNSUXM.js → chunk-O7AUE5GP.js} +5 -3
- package/dist/chunk-O7AUE5GP.js.map +1 -0
- package/dist/{chunk-6HEURMY3.js → chunk-OCXGG7UP.js} +5 -5
- package/dist/{chunk-6HEURMY3.js.map → chunk-OCXGG7UP.js.map} +1 -1
- package/dist/{chunk-FSMHI7DW.js → chunk-OXDWUKGP.js} +3 -3
- package/dist/chunk-OXDWUKGP.js.map +1 -0
- package/dist/{chunk-SJSYKUCL.js → chunk-Q335YODG.js} +3 -3
- package/dist/{chunk-SJSYKUCL.js.map → chunk-Q335YODG.js.map} +1 -1
- package/dist/{chunk-DDM2I5C6.js → chunk-R5OIL4I4.js} +3 -3
- package/dist/{chunk-DDM2I5C6.js.map → chunk-R5OIL4I4.js.map} +1 -1
- package/dist/{chunk-KC6CHPT3.js → chunk-RJ2QVURO.js} +4 -4
- package/dist/{chunk-KC6CHPT3.js.map → chunk-RJ2QVURO.js.map} +1 -1
- package/dist/{chunk-FYJHWYPM.js → chunk-S524YVMO.js} +3 -3
- package/dist/{chunk-FYJHWYPM.js.map → chunk-S524YVMO.js.map} +1 -1
- package/dist/{chunk-OWIFNJXZ.js → chunk-S7TVRVRU.js} +3 -3
- package/dist/chunk-S7TVRVRU.js.map +1 -0
- package/dist/{chunk-JKYB5QAP.js → chunk-SLRCXCHM.js} +4 -4
- package/dist/{chunk-JKYB5QAP.js.map → chunk-SLRCXCHM.js.map} +1 -1
- package/dist/{chunk-JONTKXGK.js → chunk-U2CXFKRK.js} +3 -3
- package/dist/{chunk-JONTKXGK.js.map → chunk-U2CXFKRK.js.map} +1 -1
- package/dist/{chunk-B4ETIQOO.js → chunk-U2R47SPY.js} +3 -3
- package/dist/{chunk-B4ETIQOO.js.map → chunk-U2R47SPY.js.map} +1 -1
- package/dist/{chunk-TNROOKX3.js → chunk-UDY3IDCY.js} +10 -2
- package/dist/chunk-UDY3IDCY.js.map +1 -0
- package/dist/{chunk-3WOGOTOV.js → chunk-UPYT2XM5.js} +7 -7
- package/dist/chunk-UPYT2XM5.js.map +1 -0
- package/dist/{chunk-V7XHE25E.js → chunk-UST7EAJM.js} +4 -4
- package/dist/{chunk-V7XHE25E.js.map → chunk-UST7EAJM.js.map} +1 -1
- package/dist/{chunk-YWA63YN3.js → chunk-VAVE4ZJF.js} +2 -2
- package/dist/chunk-VAVE4ZJF.js.map +1 -0
- package/dist/{chunk-6ELVWWIA.js → chunk-VBJ26PZJ.js} +3 -3
- package/dist/{chunk-6ELVWWIA.js.map → chunk-VBJ26PZJ.js.map} +1 -1
- package/dist/chunk-WKWLKGNI.js +643 -0
- package/dist/chunk-WKWLKGNI.js.map +1 -0
- package/dist/{chunk-Z3FL7LEK.js → chunk-X253YD45.js} +71 -6
- package/dist/chunk-X253YD45.js.map +1 -0
- package/dist/{chunk-6XY7QYVR.js → chunk-X3AXEE3S.js} +3 -3
- package/dist/{chunk-6XY7QYVR.js.map → chunk-X3AXEE3S.js.map} +1 -1
- package/dist/{chunk-R4UOT76L.js → chunk-XAIUZJOJ.js} +8 -8
- package/dist/chunk-XAIUZJOJ.js.map +1 -0
- package/dist/{chunk-ZO2EKJZM.js → chunk-XCZMJA2D.js} +7 -7
- package/dist/{chunk-ZO2EKJZM.js.map → chunk-XCZMJA2D.js.map} +1 -1
- package/dist/{chunk-XRMKL43Y.js → chunk-XOLV7G4S.js} +3 -3
- package/dist/{chunk-XRMKL43Y.js.map → chunk-XOLV7G4S.js.map} +1 -1
- package/dist/chunk-XYYOV5GW.js +186 -0
- package/dist/chunk-XYYOV5GW.js.map +1 -0
- package/dist/{chunk-4MQNDQ4O.js → chunk-YACIRNVP.js} +12 -4
- package/dist/chunk-YACIRNVP.js.map +1 -0
- package/dist/{chunk-5XQIH6WM.js → chunk-YM5YBDRM.js} +4 -4
- package/dist/{chunk-5XQIH6WM.js.map → chunk-YM5YBDRM.js.map} +1 -1
- package/dist/{chunk-AUCDXPWH.js → chunk-YZ25HHV2.js} +5 -5
- package/dist/{chunk-AUCDXPWH.js.map → chunk-YZ25HHV2.js.map} +1 -1
- package/dist/{chunk-Y3BOERVB.js → chunk-ZEFK3AXP.js} +3 -3
- package/dist/{chunk-Y3BOERVB.js.map → chunk-ZEFK3AXP.js.map} +1 -1
- package/dist/{chunk-L3Z5FAJE.js → chunk-ZEYLSDSG.js} +3 -3
- package/dist/{chunk-L3Z5FAJE.js.map → chunk-ZEYLSDSG.js.map} +1 -1
- package/dist/components/advanced/Calendar/index.js +4 -4
- package/dist/components/advanced/Command/index.js +1 -1
- package/dist/components/advanced/EventCalendar/index.js +4 -4
- package/dist/components/advanced/FileDropzone/index.js +1 -1
- package/dist/components/advanced/FilterBuilder/index.js +4 -4
- package/dist/components/advanced/MarkdownEditor/index.js +2 -2
- package/dist/components/advanced/ReportBuilder/index.js +2 -2
- package/dist/components/advanced/RichTextEditor/index.js +2 -2
- package/dist/components/advanced/index.js +17 -17
- package/dist/components/data-display/AreaChart/index.js +1 -1
- package/dist/components/data-display/BarChart/index.js +1 -1
- package/dist/components/data-display/Carousel/index.js +4 -4
- package/dist/components/data-display/ChartCard/index.js +2 -2
- package/dist/components/data-display/DashboardFilterbar/index.js +6 -6
- package/dist/components/data-display/DataTable/FilterBuilder/index.js +4 -4
- package/dist/components/data-display/DataTable/index.js +7 -7
- package/dist/components/data-display/ImageGallery/index.js +7 -7
- package/dist/components/data-display/KPICard/index.js +4 -4
- package/dist/components/data-display/Lightbox/index.js +1 -1
- package/dist/components/data-display/LineChart/index.js +1 -1
- package/dist/components/data-display/List/index.js +3 -3
- package/dist/components/data-display/Table/index.js +1 -1
- package/dist/components/data-display/VirtualTable/index.js +2 -2
- package/dist/components/data-display/index.js +34 -34
- package/dist/components/feedback/Alert/index.js +1 -1
- package/dist/components/feedback/AlertDialog/index.js +4 -4
- package/dist/components/feedback/ConfirmModal/index.js +5 -5
- package/dist/components/feedback/Modal/index.js +1 -1
- package/dist/components/feedback/Notification/index.js +2 -2
- package/dist/components/feedback/index.js +10 -10
- package/dist/components/forms/ColorPicker/index.js +1 -1
- package/dist/components/forms/DatePicker/index.js +5 -5
- package/dist/components/forms/DateRangePicker/index.js +5 -5
- package/dist/components/forms/Field/index.js +2 -2
- package/dist/components/forms/Form/index.js +2 -2
- package/dist/components/forms/IftaLabel/index.js +1 -1
- package/dist/components/forms/InputGroup/index.js +4 -4
- package/dist/components/forms/InputOTPField/index.js +3 -3
- package/dist/components/forms/MultiSelect/index.js +2 -1
- package/dist/components/forms/RadioButton/index.js +1 -1
- package/dist/components/forms/Rating/index.js +1 -1
- package/dist/components/forms/TagsInput/index.js +2 -2
- package/dist/components/forms/TextareaField/index.js +3 -3
- package/dist/components/forms/ToggleGroup/index.js +1 -1
- package/dist/components/forms/index.js +31 -31
- package/dist/components/index.js +141 -141
- package/dist/components/layout/index.js +2 -2
- package/dist/components/navigation/AccountSwitch/index.js +4 -4
- package/dist/components/navigation/Drawer/index.js +1 -1
- package/dist/components/navigation/DropdownMenu/index.js +1 -1
- package/dist/components/navigation/Header/index.js +1 -1
- package/dist/components/navigation/MobileSidebar/index.js +4 -4
- package/dist/components/navigation/Pagination/index.js +4 -4
- package/dist/components/navigation/Sidebar/index.js +5 -5
- package/dist/components/navigation/UserProfileDropdown/index.js +1 -1
- package/dist/components/navigation/WorkspaceDropdown/index.js +1 -1
- package/dist/components/navigation/index.js +16 -16
- package/dist/components/primitives/AspectRatio/index.js +1 -1
- package/dist/components/primitives/Avatar/index.js +1 -1
- package/dist/components/primitives/Badge/index.js +1 -1
- package/dist/components/primitives/Button/index.js +3 -3
- package/dist/components/primitives/ConfirmButton/index.js +5 -5
- package/dist/components/primitives/Label/index.js +1 -1
- package/dist/components/primitives/ProgressBar/index.js +1 -1
- package/dist/components/primitives/SplitButton/index.js +2 -2
- package/dist/components/primitives/StatusIndicator/index.js +1 -1
- package/dist/components/primitives/Tag/index.js +1 -1
- package/dist/components/primitives/Toggle/index.js +1 -1
- package/dist/components/primitives/index.js +21 -21
- package/dist/components/workflow/ApprovalFlow/index.js +5 -5
- package/dist/components/workflow/CommentSystem/index.js +5 -5
- package/dist/components/workflow/Dashboard/index.js +4 -4
- package/dist/components/workflow/DashboardBuilder/index.js +5 -5
- package/dist/components/workflow/KanbanBoard/index.js +5 -5
- package/dist/components/workflow/ReportGenerator/index.js +5 -5
- package/dist/components/workflow/TaskStatus/index.js +2 -2
- package/dist/components/workflow/Wizard/index.js +4 -4
- package/dist/components/workflow/index.js +16 -16
- package/dist/index.d.ts +162 -56
- package/dist/index.js +143 -143
- package/dist/styles.css +121 -25
- package/package.json +2 -2
- package/dist/chunk-23BHD62H.js.map +0 -1
- package/dist/chunk-2UGDLAYC.js.map +0 -1
- package/dist/chunk-33JGPMUW.js.map +0 -1
- package/dist/chunk-3WOGOTOV.js.map +0 -1
- package/dist/chunk-4MQNDQ4O.js.map +0 -1
- package/dist/chunk-65YSTUD2.js.map +0 -1
- package/dist/chunk-FSMHI7DW.js.map +0 -1
- package/dist/chunk-GAP3OZR7.js +0 -223
- package/dist/chunk-GAP3OZR7.js.map +0 -1
- package/dist/chunk-HKXQLWGR.js.map +0 -1
- package/dist/chunk-IBVCSZCH.js.map +0 -1
- package/dist/chunk-ICAQYWCX.js +0 -153
- package/dist/chunk-ICAQYWCX.js.map +0 -1
- package/dist/chunk-IRKDMISK.js.map +0 -1
- package/dist/chunk-J62TFQHR.js.map +0 -1
- package/dist/chunk-KPNNSUXM.js.map +0 -1
- package/dist/chunk-KR3IVNQH.js.map +0 -1
- package/dist/chunk-OWIFNJXZ.js.map +0 -1
- package/dist/chunk-PLLJNHWU.js.map +0 -1
- package/dist/chunk-R4UOT76L.js.map +0 -1
- package/dist/chunk-SHS6EGWS.js +0 -226
- package/dist/chunk-SHS6EGWS.js.map +0 -1
- package/dist/chunk-TNROOKX3.js.map +0 -1
- package/dist/chunk-UFRMZ3M6.js.map +0 -1
- package/dist/chunk-VFALJSXB.js.map +0 -1
- package/dist/chunk-VPNFYQBL.js.map +0 -1
- package/dist/chunk-XD5LE64P.js +0 -311
- package/dist/chunk-XD5LE64P.js.map +0 -1
- package/dist/chunk-XV6NXXXP.js +0 -206
- package/dist/chunk-XV6NXXXP.js.map +0 -1
- package/dist/chunk-YWA63YN3.js.map +0 -1
- package/dist/chunk-Z3FL7LEK.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/workflow/KanbanBoard/KanbanBoard.variants.ts","../src/components/workflow/KanbanBoard/KanbanBoard.tsx"],"names":["activeItem"],"mappings":"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","file":"chunk-AUCDXPWH.js","sourcesContent":["import { cva } from \"class-variance-authority\"\n\n/* eslint-disable sonarjs/no-duplicate-string -- CVA variants require repeated class patterns */\n\n/**\n * Board container variants\n */\nexport const kanbanBoardVariants = cva(\n [\n \"flex\",\n \"w-full\",\n \"min-w-0\",\n \"gap-4\",\n \"p-4\",\n \"bg-muted/30\",\n \"rounded-lg\",\n \"overflow-x-auto\",\n ],\n {\n defaultVariants: {\n layout: \"horizontal\",\n variant: \"default\",\n },\n variants: {\n layout: {\n horizontal: \"flex-row\",\n vertical: \"flex-col\",\n },\n variant: {\n collapsed: \"\",\n compact: \"[&_[data-slot=kanban-card]]:p-2 [&_[data-slot=kanban-column]]:w-60\",\n default: \"\",\n swimlanes: \"flex-col gap-6\",\n },\n },\n }\n)\n\n/**\n * Column container variants\n */\nexport const kanbanColumnVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"rounded-lg\",\n \"bg-muted/50\",\n \"min-h-52\",\n ],\n {\n defaultVariants: {\n isCollapsed: false,\n isOver: false,\n },\n variants: {\n isCollapsed: {\n false: \"w-72\",\n true: \"w-12\",\n },\n isOver: {\n false: \"\",\n true: \"ring-2 ring-primary/50 bg-primary/5\",\n },\n },\n }\n)\n\n/**\n * Column header variants\n */\nexport const kanbanColumnHeaderVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"justify-between\",\n \"gap-2\",\n \"p-3\",\n \"bg-card\",\n \"rounded-t-lg\",\n \"border-b\",\n ],\n {\n defaultVariants: {\n wipStatus: \"normal\",\n },\n variants: {\n wipStatus: {\n exceeded: \"[&_[data-slot=wip-indicator]]:text-destructive\",\n normal: \"\",\n warning: \"[&_[data-slot=wip-indicator]]:text-warning\",\n },\n },\n }\n)\n\n/**\n * Column content (cards area) variants\n */\nexport const kanbanColumnContentVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"flex-1\",\n \"gap-2\",\n \"p-2\",\n \"min-h-24\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Kanban card variants\n */\nexport const kanbanCardVariants = cva(\n [\n \"group\",\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"p-3\",\n \"bg-card\",\n \"rounded-md\",\n \"border\",\n \"shadow-sm\",\n \"cursor-pointer\",\n \"transition-all\",\n \"duration-200\",\n \"hover:shadow-md\",\n \"hover:border-primary/30\",\n ],\n {\n defaultVariants: {\n isDragging: false,\n priority: null,\n },\n variants: {\n isDragging: {\n false: \"\",\n true: \"opacity-50 ring-2 ring-primary shadow-lg\",\n },\n priority: {\n high: \"border-l-4 border-l-orange-500\",\n low: \"border-l-4 border-l-gray-400\",\n medium: \"border-l-4 border-l-yellow-500\",\n null: \"\",\n urgent: \"border-l-4 border-l-destructive\",\n },\n },\n }\n)\n\n/**\n * Card title variants\n */\nexport const kanbanCardTitleVariants = cva(\n [\n \"text-sm\",\n \"font-medium\",\n \"text-foreground\",\n \"line-clamp-2\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Card description variants\n */\nexport const kanbanCardDescriptionVariants = cva(\n [\n \"text-xs\",\n \"text-muted-foreground\",\n \"line-clamp-2\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Card metadata row variants\n */\nexport const kanbanCardMetaVariants = cva(\n [\n \"flex\",\n \"flex-wrap\",\n \"items-center\",\n \"gap-2\",\n \"text-xs\",\n \"text-muted-foreground\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Label badge variants\n */\nexport const kanbanLabelVariants = cva(\n [\n \"inline-flex\",\n \"items-center\",\n \"px-1.5\",\n \"py-0.5\",\n \"rounded-sm\",\n \"text-xs\",\n \"font-medium\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Drop indicator variants\n */\nexport const kanbanDropIndicatorVariants = cva(\n [\n \"h-1\",\n \"rounded-full\",\n \"bg-primary/20\",\n \"border\",\n \"border-primary\",\n \"transition-opacity\",\n ],\n {\n defaultVariants: {\n isVisible: false,\n },\n variants: {\n isVisible: {\n false: \"opacity-0\",\n true: \"opacity-100\",\n },\n },\n }\n)\n\n/**\n * Add button variants\n */\nexport const kanbanAddButtonVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"gap-1\",\n \"w-full\",\n \"p-2\",\n \"text-sm\",\n \"text-muted-foreground\",\n \"rounded-md\",\n \"border\",\n \"border-dashed\",\n \"hover:bg-muted/50\",\n \"hover:text-foreground\",\n \"transition-colors\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Swimlane header variants\n */\nexport const kanbanSwimlaneVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"p-3\",\n \"rounded-lg\",\n \"bg-muted/20\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Search input variants\n */\nexport const kanbanSearchVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"gap-2\",\n \"px-3\",\n \"py-2\",\n \"bg-background\",\n \"border\",\n \"rounded-md\",\n \"focus-within:ring-2\",\n \"focus-within:ring-primary/50\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n","import type {\n KanbanBoardProps,\n KanbanCardProps,\n KanbanColumn,\n KanbanColumnProps,\n KanbanItem,\n} from \"./KanbanBoard.types\"\nimport type { DragEndEvent, DragOverEvent, DragStartEvent, UniqueIdentifier } from \"@dnd-kit/core\"\nimport type { KeyboardEvent } from \"react\"\n\nimport { horizontalListSortingStrategy, SortableContext, verticalListSortingStrategy } from \"@dnd-kit/sortable\"\nimport {\n Calendar,\n ChevronDown,\n ChevronRight,\n GripVertical,\n MessageSquare,\n Paperclip,\n Plus,\n Search,\n} from \"lucide-react\"\nimport { useId, useMemo, useState } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n DndContext,\n DragHandle,\n DragOverlay,\n Droppable,\n SortableItem,\n} from \"../../advanced/DragAndDrop\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../primitives/Avatar\"\nimport { Badge } from \"../../primitives/Badge\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n kanbanAddButtonVariants,\n kanbanBoardVariants,\n kanbanCardDescriptionVariants,\n kanbanCardMetaVariants,\n kanbanCardTitleVariants,\n kanbanCardVariants,\n kanbanColumnContentVariants,\n kanbanColumnHeaderVariants,\n kanbanColumnVariants,\n kanbanLabelVariants,\n kanbanSearchVariants,\n} from \"./KanbanBoard.variants\"\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\n/**\n * Get initials from a name\n */\nfunction getInitials(name: string): string {\n return name\n .split(\" \")\n .map((part) => part[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2)\n}\n\n/**\n * Format date for display\n */\nfunction formatDueDate(date: Date): string {\n const now = new Date()\n const diff = date.getTime() - now.getTime()\n const days = Math.ceil(diff / (1000 * 60 * 60 * 24))\n\n if (days < 0) return \"Overdue\"\n if (days === 0) return \"Today\"\n if (days === 1) return \"Tomorrow\"\n if (days <= 7) return `${String(days)} days`\n return date.toLocaleDateString()\n}\n\n/**\n * Get WIP status for column\n */\nfunction getWipStatus(\n itemCount: number,\n wipLimit?: number\n): \"exceeded\" | \"normal\" | \"warning\" {\n if (!wipLimit) return \"normal\"\n if (itemCount >= wipLimit) return \"exceeded\"\n if (itemCount >= wipLimit - 1) return \"warning\"\n return \"normal\"\n}\n\n// ============================================\n// KANBAN CARD\n// ============================================\n\n/**\n * KanbanCard displays an individual task item\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity -- Complexity inherent to rendering multiple optional card elements\nfunction KanbanCard({\n className,\n isDragging = false,\n item,\n onClick,\n onDelete: _onDelete,\n}: KanbanCardProps) {\n const cardId = useId()\n const hasMeta = Boolean(\n item.assignees?.length ??\n item.labels?.length ??\n item.dueDate ??\n item.comments ??\n item.attachments ??\n item.subtasks\n )\n\n const handleClick = () => {\n onClick?.({ item })\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault()\n handleClick()\n }\n }\n\n return (\n <div\n aria-describedby={item.description ? `${cardId}-desc` : undefined}\n aria-label={item.title}\n className={cn(kanbanCardVariants({ isDragging, priority: item.priority ?? null }), className)}\n data-slot=\"kanban-card\"\n role=\"listitem\"\n tabIndex={0}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {/* Labels */}\n {item.labels && item.labels.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\" data-slot=\"kanban-card-labels\">\n {item.labels.slice(0, 3).map((label) => (\n <span\n key={label.id}\n className={kanbanLabelVariants()}\n style={{ backgroundColor: `${label.color}20`, color: label.color }}\n >\n {label.name}\n </span>\n ))}\n {item.labels.length > 3 ? (\n <span className=\"text-xs text-muted-foreground\">\n +{item.labels.length - 3}\n </span>\n ) : null}\n </div>\n ) : null}\n\n {/* Title */}\n <div className={kanbanCardTitleVariants()} data-slot=\"kanban-card-title\">\n {item.title}\n </div>\n\n {/* Description */}\n {item.description ? (\n <div\n className={kanbanCardDescriptionVariants()}\n data-slot=\"kanban-card-description\"\n id={`${cardId}-desc`}\n >\n {item.description}\n </div>\n ) : null}\n\n {/* Metadata row */}\n {hasMeta ? (\n <div className={kanbanCardMetaVariants()} data-slot=\"kanban-card-meta\">\n {/* Due date */}\n {item.dueDate ? (\n <span\n className={cn(\n \"flex items-center gap-1\",\n new Date(item.dueDate) < new Date() && \"text-destructive\"\n )}\n title={`Due: ${item.dueDate.toLocaleDateString()}`}\n >\n <Calendar className=\"h-3 w-3\" />\n {formatDueDate(new Date(item.dueDate))}\n </span>\n ) : null}\n\n {/* Subtasks */}\n {item.subtasks ? (\n <span className=\"flex items-center gap-1\" title=\"Subtasks progress\">\n {item.subtasks.completed}/{item.subtasks.total}\n </span>\n ) : null}\n\n {/* Comments */}\n {item.comments ? (\n <span className=\"flex items-center gap-1\" title={`${String(item.comments)} comments`}>\n <MessageSquare className=\"h-3 w-3\" />\n {item.comments}\n </span>\n ) : null}\n\n {/* Attachments */}\n {item.attachments ? (\n <span className=\"flex items-center gap-1\" title={`${String(item.attachments)} attachments`}>\n <Paperclip className=\"h-3 w-3\" />\n {item.attachments}\n </span>\n ) : null}\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Assignees */}\n {item.assignees && item.assignees.length > 0 ? (\n <div className=\"flex -space-x-1\" data-slot=\"kanban-card-assignees\">\n {item.assignees.slice(0, 3).map((user) => (\n <Avatar\n key={user.id}\n className=\"h-5 w-5 border-2 border-background\"\n title={user.name}\n >\n {user.avatar ? (\n <AvatarImage alt={user.name} src={user.avatar} />\n ) : null}\n <AvatarFallback className=\"text-xs\">\n {getInitials(user.name)}\n </AvatarFallback>\n </Avatar>\n ))}\n {item.assignees.length > 3 ? (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-muted text-xs border-2 border-background\">\n +{item.assignees.length - 3}\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n )\n}\n\n// ============================================\n// KANBAN COLUMN\n// ============================================\n\n/**\n * KanbanColumn displays a single column with its items\n */\nfunction KanbanColumn({\n allowAddItem = true,\n className,\n column,\n isOver = false,\n items,\n onItemAdd,\n onItemClick,\n onItemDelete,\n onToggleCollapse,\n showColumnCount = true,\n showWipLimits = true,\n}: KanbanColumnProps) {\n const columnId = useId()\n const wipStatus = getWipStatus(items.length, column.wipLimit)\n const isCollapsed = column.isCollapsed ?? false\n\n const handleAddItem = () => {\n onItemAdd?.({ columnId: column.id })\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n const target = event.currentTarget\n const cards = [...target.querySelectorAll('[data-slot=\"kanban-card\"]')] as HTMLElement[]\n const focused = document.activeElement as HTMLElement\n const currentIndex = cards.indexOf(focused)\n\n if (currentIndex === -1) {\n cards[0]?.focus()\n return\n }\n\n const nextIndex = event.key === \"ArrowDown\"\n ? Math.min(currentIndex + 1, cards.length - 1)\n : Math.max(currentIndex - 1, 0)\n\n const nextElement = cards[nextIndex]\n nextElement?.focus()\n event.preventDefault()\n }\n }\n\n // Collapsed column view\n if (isCollapsed) {\n return (\n <div\n data-collapsed\n className={cn(kanbanColumnVariants({ isCollapsed: true, isOver: false }), className)}\n data-slot=\"kanban-column\"\n >\n <Button\n aria-expanded={false}\n aria-label={`Expand ${column.title}`}\n className=\"h-full w-full flex flex-col items-center justify-start pt-3 gap-2\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n >\n <ChevronRight className=\"h-4 w-4\" />\n <span\n className=\"text-sm font-semibold writing-mode-vertical\"\n style={{ writingMode: \"vertical-rl\" }}\n >\n {column.title}\n </span>\n {showColumnCount ? (\n <Badge className=\"mt-2\" color=\"muted\" type=\"pill-color\">\n {items.length}\n </Badge>\n ) : null}\n </Button>\n </div>\n )\n }\n\n return (\n <Droppable data={{ type: \"column\", column }} id={column.id}>\n {({ isOver: droppableIsOver }) => (\n <div\n className={cn(\n kanbanColumnVariants({ isCollapsed: false, isOver: isOver || droppableIsOver }),\n className\n )}\n aria-label={`${column.title} column`}\n data-slot=\"kanban-column\"\n role=\"list\"\n onKeyDown={handleKeyDown}\n >\n {/* Column Header */}\n <div\n className={kanbanColumnHeaderVariants({ wipStatus })}\n data-slot=\"kanban-column-header\"\n >\n <div className=\"flex items-center gap-2\">\n {column.color ? (\n <div\n className=\"h-3 w-3 rounded-full\"\n style={{ backgroundColor: column.color }}\n />\n ) : null}\n <span className=\"text-sm font-semibold\">{column.title}</span>\n {showColumnCount ? (\n <Badge color=\"muted\" data-slot=\"column-count\" type=\"pill-color\">\n {items.length}\n </Badge>\n ) : null}\n {showWipLimits && column.wipLimit ? (\n <span\n className=\"text-xs\"\n data-slot=\"wip-indicator\"\n title={`WIP Limit: ${String(column.wipLimit)}`}\n >\n /{column.wipLimit}\n </span>\n ) : null}\n </div>\n {onToggleCollapse ? (\n <Button\n aria-expanded={true}\n aria-label={`Collapse ${column.title}`}\n className=\"h-6 w-6 p-0\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n ) : null}\n </div>\n\n {/* Cards */}\n <SortableContext\n items={items.map((i) => i.id)}\n strategy={verticalListSortingStrategy}\n >\n <div\n aria-labelledby={columnId}\n className={kanbanColumnContentVariants()}\n data-slot=\"kanban-column-content\"\n >\n {items.map((item) => (\n <SortableItem\n key={item.id}\n data={{ type: \"item\", item, columnId: column.id }}\n id={item.id}\n >\n {({ isDragging }) => (\n <div className=\"relative\">\n <DragHandle\n aria-label={`Drag ${item.title}`}\n className=\"absolute left-1 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-opacity cursor-grab active:cursor-grabbing h-6 w-6 flex items-center justify-center\"\n >\n <GripVertical className=\"h-4 w-4 text-muted-foreground\" />\n </DragHandle>\n <KanbanCard\n isDragging={isDragging}\n item={item}\n onClick={onItemClick}\n onDelete={onItemDelete}\n />\n </div>\n )}\n </SortableItem>\n ))}\n\n {/* Add card button */}\n {allowAddItem ? (\n <button\n aria-label={`Add item to ${column.title}`}\n className={kanbanAddButtonVariants()}\n type=\"button\"\n onClick={handleAddItem}\n >\n <Plus className=\"h-4 w-4\" />\n Add card\n </button>\n ) : null}\n </div>\n </SortableContext>\n </div>\n )}\n </Droppable>\n )\n}\n\n// ============================================\n// KANBAN BOARD\n// ============================================\n\n/**\n * KanbanBoard component for visual task management.\n *\n * Organizes items into columns representing workflow stages with drag-and-drop\n * support for moving items between columns.\n *\n * @example\n * ```tsx\n * const columns = [\n * { id: 'todo', title: 'To Do' },\n * { id: 'doing', title: 'In Progress', wipLimit: 3 },\n * { id: 'done', title: 'Done' },\n * ]\n *\n * const items = [\n * { id: '1', title: 'Task 1', columnId: 'todo', order: 0 },\n * { id: '2', title: 'Task 2', columnId: 'doing', order: 0 },\n * ]\n *\n * <KanbanBoard\n * columns={columns}\n * items={items}\n * onItemMove={({ itemId, fromColumn, toColumn }) => {\n * console.log(`Moved ${itemId} from ${fromColumn} to ${toColumn}`)\n * }}\n * />\n * ```\n */\nfunction KanbanBoard({\n allowAddColumn = false,\n allowAddItem = true,\n allowColumnReorder = false,\n className,\n columns,\n columnWidth = 288,\n filterBy,\n groupBy,\n items,\n onColumnAdd,\n onColumnDelete: _onColumnDelete,\n onColumnReorder: _onColumnReorder,\n onColumnUpdate: _onColumnUpdate,\n onItemAdd,\n onItemClick,\n onItemDelete,\n onItemMove,\n onItemUpdate: _onItemUpdate,\n searchable = false,\n showColumnCount = true,\n showWipLimits = true,\n variant = \"default\",\n layout = \"horizontal\",\n ...props\n}: KanbanBoardProps) {\n const _boardId = useId()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [activeId, setActiveId] = useState<null | UniqueIdentifier>(null)\n const [collapsedColumns, setCollapsedColumns] = useState<Set<string>>(() => new Set())\n\n // Filter items based on search and filters\n const filteredItems = useMemo(() => {\n let result = [...items]\n\n // Apply search filter\n if (searchQuery) {\n const query = searchQuery.toLowerCase()\n result = result.filter(\n (item) =>\n item.title.toLowerCase().includes(query) ||\n item.description?.toLowerCase().includes(query)\n )\n }\n\n // Apply filter config\n if (filterBy) {\n if (filterBy.priority?.length) {\n result = result.filter((item) =>\n item.priority && filterBy.priority?.includes(item.priority)\n )\n }\n if (filterBy.assignees?.length) {\n result = result.filter((item) =>\n item.assignees?.some((a) => filterBy.assignees?.includes(a.id))\n )\n }\n if (filterBy.labels?.length) {\n result = result.filter((item) =>\n item.labels?.some((l) => filterBy.labels?.includes(l.id))\n )\n }\n if (filterBy.dueDate) {\n result = result.filter((item) => {\n if (!item.dueDate) return false\n const date = new Date(item.dueDate)\n if (filterBy.dueDate?.from && date < filterBy.dueDate.from) return false\n if (filterBy.dueDate?.to && date > filterBy.dueDate.to) return false\n return true\n })\n }\n }\n\n return result\n }, [items, searchQuery, filterBy])\n\n // Get items for a specific column\n const getColumnItems = (columnId: string) => {\n return filteredItems\n .filter((item) => item.columnId === columnId)\n .sort((a, b) => a.order - b.order)\n }\n\n // Get the active item being dragged\n const activeItem = useMemo(() => {\n if (!activeId) return null\n return items.find((item) => item.id === activeId) ?? null\n }, [activeId, items])\n\n // Toggle column collapse\n const handleToggleCollapse = (columnId: string) => {\n setCollapsedColumns((prev) => {\n const next = new Set(prev)\n if (next.has(columnId)) {\n next.delete(columnId)\n } else {\n next.add(columnId)\n }\n return next\n })\n }\n\n // Drag handlers\n const handleDragStart = (event: DragStartEvent) => {\n setActiveId(event.active.id)\n }\n\n const handleDragOver = (_event: DragOverEvent) => {\n // Could implement preview of drop here\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n setActiveId(null)\n\n if (!over) return\n\n const activeData = active.data.current as undefined | { columnId?: string; item?: KanbanItem; type?: string }\n const overData = over.data.current as undefined | { column?: KanbanColumn; columnId?: string; item?: KanbanItem; type?: string }\n\n if (activeData?.type !== \"item\") return\n\n const activeItem = activeData.item\n if (!activeItem) return\n\n let toColumn: string\n let index = 0\n\n if (overData?.type === \"column\") {\n // Dropped on column\n toColumn = overData.column?.id ?? \"\"\n index = getColumnItems(toColumn).length\n } else if (overData?.type === \"item\") {\n // Dropped on item\n toColumn = overData.item?.columnId ?? \"\"\n const targetItems = getColumnItems(toColumn)\n const overItem = overData.item\n index = overItem ? targetItems.findIndex((i) => i.id === overItem.id) : 0\n } else {\n return\n }\n\n if (activeItem.columnId !== toColumn || active.id !== over.id) {\n onItemMove?.({\n fromColumn: activeItem.columnId,\n index,\n itemId: activeItem.id,\n toColumn,\n })\n }\n }\n\n const handleDragCancel = () => {\n setActiveId(null)\n }\n\n // Prepare columns with collapse state\n const columnsWithState = columns.map((col) => ({\n ...col,\n isCollapsed: collapsedColumns.has(col.id) || col.isCollapsed,\n }))\n\n // Group items by swimlane if groupBy is specified\n const swimlanes = useMemo(() => {\n if (!groupBy || variant !== \"swimlanes\") return null\n\n const groups = new Map<string, KanbanItem[]>()\n for (const item of filteredItems) {\n const key = (item.customFields?.[groupBy] as string | undefined) ?? \"Ungrouped\"\n const group = groups.get(key) ?? []\n group.push(item)\n groups.set(key, group)\n }\n return groups\n }, [filteredItems, groupBy, variant])\n\n // Column width style\n const widthValue = typeof columnWidth === \"number\" ? `${String(columnWidth)}px` : columnWidth\n const columnStyle = {\n minWidth: widthValue,\n width: widthValue,\n }\n\n return (\n <div\n aria-label=\"Kanban board\"\n className=\"flex flex-col gap-4\"\n data-slot=\"kanban-board-wrapper\"\n role=\"region\"\n {...props}\n >\n {/* Search bar */}\n {searchable ? (\n <div className={kanbanSearchVariants()} data-slot=\"kanban-search\">\n <Search className=\"h-4 w-4 text-muted-foreground\" />\n <input\n aria-label=\"Search items\"\n className=\"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder=\"Search items...\"\n type=\"text\"\n value={searchQuery}\n onChange={(e) => { setSearchQuery(e.target.value); }}\n />\n </div>\n ) : null}\n\n {/* Board */}\n <DndContext\n className={cn(kanbanBoardVariants({ layout, variant }), className)}\n onDragCancel={handleDragCancel}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragStart={handleDragStart}\n >\n {variant === \"swimlanes\" && swimlanes ? (\n // Swimlanes layout\n <div className=\"flex flex-col gap-6\" data-slot=\"kanban-swimlanes\">\n {[...swimlanes.entries()].map(([lane, _laneItems]) => (\n <div key={lane} className=\"flex flex-col gap-2\">\n <div className=\"text-sm font-semibold text-muted-foreground\">\n {lane}\n </div>\n <div className=\"flex gap-4 overflow-x-auto\">\n <SortableContext\n disabled={!allowColumnReorder}\n items={columnsWithState.map((c) => c.id)}\n strategy={horizontalListSortingStrategy}\n >\n {columnsWithState.map((column) => (\n <div key={column.id} style={columnStyle}>\n <KanbanColumn\n items={getColumnItems(column.id).filter(\n (item) => ((item.customFields?.[groupBy ?? \"\"] as string | undefined) ?? \"Ungrouped\") === lane\n )}\n allowAddItem={allowAddItem}\n column={column}\n showColumnCount={showColumnCount}\n showWipLimits={showWipLimits}\n onItemAdd={onItemAdd}\n onItemClick={onItemClick}\n onItemDelete={onItemDelete}\n onToggleCollapse={() => { handleToggleCollapse(column.id); }}\n />\n </div>\n ))}\n </SortableContext>\n </div>\n </div>\n ))}\n </div>\n ) : (\n // Standard layout\n <SortableContext\n disabled={!allowColumnReorder}\n items={columnsWithState.map((c) => c.id)}\n strategy={horizontalListSortingStrategy}\n >\n {columnsWithState.map((column) => (\n <div key={column.id} style={column.isCollapsed ? undefined : columnStyle}>\n <KanbanColumn\n allowAddItem={allowAddItem}\n column={column}\n items={getColumnItems(column.id)}\n showColumnCount={showColumnCount}\n showWipLimits={showWipLimits}\n onItemAdd={onItemAdd}\n onItemClick={onItemClick}\n onItemDelete={onItemDelete}\n onToggleCollapse={() => { handleToggleCollapse(column.id); }}\n />\n </div>\n ))}\n\n {/* Add column button */}\n {allowAddColumn ? (\n <button\n className={cn(\n kanbanAddButtonVariants(),\n \"min-w-52 h-52 flex-col\"\n )}\n aria-label=\"Add column\"\n type=\"button\"\n onClick={onColumnAdd}\n >\n <Plus className=\"h-6 w-6\" />\n Add column\n </button>\n ) : null}\n </SortableContext>\n )}\n\n {/* Drag overlay */}\n <DragOverlay>\n {activeItem ? (\n <div\n className=\"opacity-90 rotate-3\"\n style={columnStyle}\n >\n <KanbanCard isDragging item={activeItem} />\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n </div>\n )\n}\n\n// ============================================\n// EXPORTS\n// ============================================\n\nexport {\n KanbanBoard,\n kanbanBoardVariants,\n KanbanCard,\n kanbanCardVariants,\n kanbanColumnVariants,\n}\n\nexport type {\n ItemAddPayload,\n ItemClickPayload,\n ItemDeletePayload,\n ItemMovePayload,\n KanbanBoardProps,\n KanbanCardProps,\n KanbanColumn,\n KanbanColumnProps,\n KanbanFilterConfig,\n KanbanItem,\n KanbanLabel,\n KanbanSubtasks,\n KanbanUser,\n} from \"./KanbanBoard.types\"\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/workflow/KanbanBoard/KanbanBoard.variants.ts","../src/components/workflow/KanbanBoard/KanbanBoard.tsx"],"names":["activeItem"],"mappings":";;;;;;;;;;;AAOO,IAAM,mBAAA,GAAsB,GAAA;AAAA,EACjC;AAAA,IACE,MAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,eAAA,EAAiB;AAAA,MACf,MAAA,EAAQ,YAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACX;AAAA,IACA,QAAA,EAAU;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,UAAA;AAAA,QACZ,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,OAAA,EAAS;AAAA,QACP,SAAA,EAAW,EAAA;AAAA,QACX,OAAA,EAAS,oEAAA;AAAA,QACT,OAAA,EAAS,EAAA;AAAA,QACT,SAAA,EAAW;AAAA;AACb;AACF;AAEJ;AAKO,IAAM,oBAAA,GAAuB,GAAA;AAAA,EAClC;AAAA,IACE,MAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,eAAA,EAAiB;AAAA,MACf,WAAA,EAAa,KAAA;AAAA,MACb,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,QAAA,EAAU;AAAA,MACR,WAAA,EAAa;AAAA,QACX,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACR;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,EAAA;AAAA,QACP,IAAA,EAAM;AAAA;AACR;AACF;AAEJ;AAKO,IAAM,0BAAA,GAA6B,GAAA;AAAA,EACxC;AAAA,IACE,MAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,eAAA,EAAiB;AAAA,MACf,SAAA,EAAW;AAAA,KACb;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAA,EAAW;AAAA,QACT,QAAA,EAAU,gDAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,OAAA,EAAS;AAAA;AACX;AACF;AAEJ;AAKO,IAAM,2BAAA,GAA8B,GAAA;AAAA,EACzC;AAAA,IACE,MAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,iBAAiB,EAAC;AAAA,IAClB,UAAU;AAAC;AAEf;AAKO,IAAM,kBAAA,GAAqB,GAAA;AAAA,EAChC;AAAA,IACE,OAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,eAAA,EAAiB;AAAA,MACf,UAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,UAAA,EAAY;AAAA,QACV,KAAA,EAAO,EAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACR;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,gCAAA;AAAA,QACN,GAAA,EAAK,8BAAA;AAAA,QACL,MAAA,EAAQ,gCAAA;AAAA,QACR,IAAA,EAAM,EAAA;AAAA,QACN,MAAA,EAAQ;AAAA;AACV;AACF;AAEJ;AAKO,IAAM,uBAAA,GAA0B,GAAA;AAAA,EACrC;AAAA,IACE,SAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,iBAAiB,EAAC;AAAA,IAClB,UAAU;AAAC;AAEf;AAKO,IAAM,6BAAA,GAAgC,GAAA;AAAA,EAC3C;AAAA,IACE,SAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,iBAAiB,EAAC;AAAA,IAClB,UAAU;AAAC;AAEf;AAKO,IAAM,sBAAA,GAAyB,GAAA;AAAA,EACpC;AAAA,IACE,MAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,iBAAiB,EAAC;AAAA,IAClB,UAAU;AAAC;AAEf;AAKO,IAAM,mBAAA,GAAsB,GAAA;AAAA,EACjC;AAAA,IACE,aAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,iBAAiB,EAAC;AAAA,IAClB,UAAU;AAAC;AAEf;AAKO,IAAM,2BAAA,GAA8B,GAAA;AAAA,EACzC;AAAA,IACE,KAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,eAAA,EAAiB;AAAA,MACf,SAAA,EAAW;AAAA,KACb;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAA,EAAW;AAAA,QACT,KAAA,EAAO,WAAA;AAAA,QACP,IAAA,EAAM;AAAA;AACR;AACF;AAEJ;AAKO,IAAM,uBAAA,GAA0B,GAAA;AAAA,EACrC;AAAA,IACE,MAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,uBAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,IACA,mBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,iBAAiB,EAAC;AAAA,IAClB,UAAU;AAAC;AAEf;AAKO,IAAM,sBAAA,GAAyB,GAAA;AAAA,EACpC;AAAA,IACE,MAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,iBAAiB,EAAC;AAAA,IAClB,UAAU;AAAC;AAEf;AAKO,IAAM,oBAAA,GAAuB,GAAA;AAAA,EAClC;AAAA,IACE,MAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,iBAAiB,EAAC;AAAA,IAClB,UAAU;AAAC;AAEf;ACjQA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,OAAO,KACJ,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,CAAC,CAAC,CAAA,CACrB,KAAK,EAAE,CAAA,CACP,aAAY,CACZ,KAAA,CAAM,GAAG,CAAC,CAAA;AACf;AAKA,SAAS,cAAc,IAAA,EAAoB;AACzC,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,EAAQ,GAAI,IAAI,OAAA,EAAQ;AAC1C,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,GAAO,EAAA,GAAK,KAAK,EAAA,CAAG,CAAA;AAEnD,EAAA,IAAI,IAAA,GAAO,GAAG,OAAO,SAAA;AACrB,EAAA,IAAI,IAAA,KAAS,GAAG,OAAO,OAAA;AACvB,EAAA,IAAI,IAAA,KAAS,GAAG,OAAO,UAAA;AACvB,EAAA,IAAI,QAAQ,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,CAAO,IAAI,CAAC,CAAA,KAAA,CAAA;AACrC,EAAA,OAAO,KAAK,kBAAA,EAAmB;AACjC;AAKA,SAAS,YAAA,CACP,WACA,QAAA,EACmC;AACnC,EAAA,IAAI,CAAC,UAAU,OAAO,QAAA;AACtB,EAAA,IAAI,SAAA,IAAa,UAAU,OAAO,UAAA;AAClC,EAAA,IAAI,SAAA,IAAa,QAAA,GAAW,CAAA,EAAG,OAAO,SAAA;AACtC,EAAA,OAAO,QAAA;AACT;AAUA,SAAS,UAAA,CAAW;AAAA,EAClB,SAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,EAAU;AACZ,CAAA,EAAoB;AAClB,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,MAAM,OAAA,GAAU,OAAA;AAAA,IACd,IAAA,CAAK,SAAA,EAAW,MAAA,IAChB,IAAA,CAAK,MAAA,EAAQ,MAAA,IACb,IAAA,CAAK,OAAA,IACL,IAAA,CAAK,QAAA,IACL,IAAA,CAAK,WAAA,IACL,IAAA,CAAK;AAAA,GACP;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAA,GAAU,EAAE,MAAM,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyC;AAC9D,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC9C,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,WAAA,EAAY;AAAA,IACd;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,kBAAA,EAAkB,IAAA,CAAK,WAAA,GAAc,CAAA,EAAG,MAAM,CAAA,KAAA,CAAA,GAAU,MAAA;AAAA,MACxD,cAAY,IAAA,CAAK,KAAA;AAAA,MACjB,SAAA,EAAW,EAAA,CAAG,kBAAA,CAAmB,EAAE,UAAA,EAAY,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA;AAAA,MAC5F,WAAA,EAAU,aAAA;AAAA,MACV,IAAA,EAAK,UAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,aAAA;AAAA,MAGV,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,wBAClC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,WAAA,EAAU,oBAAA,EAC7C,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,qBAC5B,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cAEC,WAAW,mBAAA,EAAoB;AAAA,cAC/B,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAA,EAAG,MAAM,KAAK,CAAA,EAAA,CAAA,EAAM,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM;AAAA,cAEhE,QAAA,EAAA,KAAA,CAAM;AAAA,aAAA;AAAA,YAJF,KAAA,CAAM;AAAA,WAMd,CAAA;AAAA,UACA,KAAK,MAAA,CAAO,MAAA,GAAS,oBACpB,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAC5C,IAAA,CAAK,OAAO,MAAA,GAAS;AAAA,WAAA,EACzB,CAAA,GACE;AAAA,SAAA,EACN,CAAA,GACE,IAAA;AAAA,wBAGJ,GAAA,CAAC,SAAI,SAAA,EAAW,uBAAA,IAA2B,WAAA,EAAU,mBAAA,EAClD,eAAK,KAAA,EACR,CAAA;AAAA,QAGC,KAAK,WAAA,mBACJ,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAW,6BAAA,EAA8B;AAAA,YACzC,WAAA,EAAU,yBAAA;AAAA,YACV,EAAA,EAAI,GAAG,MAAM,CAAA,KAAA,CAAA;AAAA,YAEZ,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,SACR,GACE,IAAA;AAAA,QAGH,0BACC,IAAA,CAAC,KAAA,EAAA,EAAI,WAAW,sBAAA,EAAuB,EAAG,aAAU,kBAAA,EAEjD,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,OAAA,mBACJ,IAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,yBAAA;AAAA,gBACA,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,mBAAI,IAAI,MAAK,IAAK;AAAA,eACzC;AAAA,cACA,KAAA,EAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,oBAAoB,CAAA,CAAA;AAAA,cAEhD,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,QAAA,EAAA,EAAS,WAAU,SAAA,EAAU,CAAA;AAAA,gBAC7B,aAAA,CAAc,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAC;AAAA;AAAA;AAAA,WACvC,GACE,IAAA;AAAA,UAGH,KAAK,QAAA,mBACJ,IAAA,CAAC,UAAK,SAAA,EAAU,yBAAA,EAA0B,OAAM,mBAAA,EAC7C,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,QAAA,CAAS,SAAA;AAAA,YAAU,GAAA;AAAA,YAAE,KAAK,QAAA,CAAS;AAAA,WAAA,EAC3C,CAAA,GACE,IAAA;AAAA,UAGH,IAAA,CAAK,QAAA,mBACJ,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,KAAA,EAAO,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA,SAAA,CAAA,EACvE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,aAAA,EAAA,EAAc,WAAU,SAAA,EAAU,CAAA;AAAA,YAClC,IAAA,CAAK;AAAA,WAAA,EACR,CAAA,GACE,IAAA;AAAA,UAGH,IAAA,CAAK,WAAA,mBACJ,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,KAAA,EAAO,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA,YAAA,CAAA,EAC1E,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,SAAA,EAAA,EAAU,WAAU,SAAA,EAAU,CAAA;AAAA,YAC9B,IAAA,CAAK;AAAA,WAAA,EACR,CAAA,GACE,IAAA;AAAA,0BAGJ,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UAGvB,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,mBACzC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,WAAA,EAAU,uBAAA,EACxC,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,UAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,qBAC/B,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,oCAAA;AAAA,gBACV,OAAO,IAAA,CAAK,IAAA;AAAA,gBAEX,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAK,MAAA,uBACH,WAAA,EAAA,EAAY,GAAA,EAAK,KAAK,IAAA,EAAM,GAAA,EAAK,IAAA,CAAK,MAAA,EAAQ,CAAA,GAC7C,IAAA;AAAA,sCACH,cAAA,EAAA,EAAe,SAAA,EAAU,WACvB,QAAA,EAAA,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EACxB;AAAA;AAAA,eAAA;AAAA,cATK,IAAA,CAAK;AAAA,aAWb,CAAA;AAAA,YACA,KAAK,SAAA,CAAU,MAAA,GAAS,oBACvB,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mGAAA,EAAoG,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAChH,IAAA,CAAK,UAAU,MAAA,GAAS;AAAA,aAAA,EAC5B,CAAA,GACE;AAAA,WAAA,EACN,CAAA,GACE;AAAA,SAAA,EACN,CAAA,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AASA,SAAS,YAAA,CAAa;AAAA,EACpB,YAAA,GAAe,IAAA;AAAA,EACf,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,KAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB,aAAA,GAAgB;AAClB,CAAA,EAAsB;AACpB,EAAA,MAAM,WAAW,KAAA,EAAM;AACvB,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,KAAA,CAAM,MAAA,EAAQ,OAAO,QAAQ,CAAA;AAC5D,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe,KAAA;AAE1C,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,SAAA,GAAY,EAAE,QAAA,EAAU,MAAA,CAAO,EAAA,EAAI,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyC;AAC9D,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,WAAA,IAAe,KAAA,CAAM,QAAQ,SAAA,EAAW;AACxD,MAAA,MAAM,SAAS,KAAA,CAAM,aAAA;AACrB,MAAA,MAAM,QAAQ,CAAC,GAAG,MAAA,CAAO,gBAAA,CAAiB,2BAA2B,CAAC,CAAA;AACtE,MAAA,MAAM,UAAU,QAAA,CAAS,aAAA;AACzB,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AAE1C,MAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,QAAA,KAAA,CAAM,CAAC,GAAG,KAAA,EAAM;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,YAAY,KAAA,CAAM,GAAA,KAAQ,WAAA,GAC5B,IAAA,CAAK,IAAI,YAAA,GAAe,CAAA,EAAG,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAC3C,IAAA,CAAK,GAAA,CAAI,YAAA,GAAe,GAAG,CAAC,CAAA;AAEhC,MAAA,MAAM,WAAA,GAAc,MAAM,SAAS,CAAA;AACnC,MAAA,WAAA,EAAa,KAAA,EAAM;AACnB,MAAA,KAAA,CAAM,cAAA,EAAe;AAAA,IACvB;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,gBAAA,EAAc,IAAA;AAAA,QACd,SAAA,EAAW,EAAA,CAAG,oBAAA,CAAqB,EAAE,WAAA,EAAa,MAAM,MAAA,EAAQ,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA;AAAA,QACnF,WAAA,EAAU,eAAA;AAAA,QAEV,QAAA,kBAAA,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,eAAA,EAAe,KAAA;AAAA,YACf,YAAA,EAAY,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,YAClC,SAAA,EAAU,mEAAA;AAAA,YACV,OAAA,EAAQ,OAAA;AAAA,YACR,OAAA,EAAS,gBAAA;AAAA,YAET,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,WAAU,SAAA,EAAU,CAAA;AAAA,8BAClC,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,6CAAA;AAAA,kBACV,KAAA,EAAO,EAAE,WAAA,EAAa,aAAA,EAAc;AAAA,kBAEnC,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,eACV;AAAA,cACC,eAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,MAAA,EAAO,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAK,YAAA,EACxC,QAAA,EAAA,KAAA,CAAM,MAAA,EACT,CAAA,GACE;AAAA;AAAA;AAAA;AACN;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,EAAE,MAAM,QAAA,EAAU,MAAA,EAAO,EAAG,EAAA,EAAI,OAAO,EAAA,EACrD,QAAA,EAAA,CAAC,EAAE,MAAA,EAAQ,iBAAgB,qBAC1B,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,qBAAqB,EAAE,WAAA,EAAa,OAAO,MAAA,EAAQ,MAAA,IAAU,iBAAiB,CAAA;AAAA,QAC9E;AAAA,OACF;AAAA,MACA,YAAA,EAAY,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,OAAA,CAAA;AAAA,MAC3B,WAAA,EAAU,eAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAW,aAAA;AAAA,MAGX,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,0BAAA,CAA2B,EAAE,SAAA,EAAW,CAAA;AAAA,YACnD,WAAA,EAAU,sBAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,MAAA,CAAO,KAAA,mBACN,GAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,sBAAA;AAAA,oBACV,KAAA,EAAO,EAAE,eAAA,EAAiB,MAAA,CAAO,KAAA;AAAM;AAAA,iBACzC,GACE,IAAA;AAAA,gCACJ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,iBAAO,KAAA,EAAM,CAAA;AAAA,gBACrD,eAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAM,KAAA,EAAM,OAAA,EAAQ,WAAA,EAAU,cAAA,EAAe,IAAA,EAAK,YAAA,EAChD,QAAA,EAAA,KAAA,CAAM,MAAA,EACT,CAAA,GACE,IAAA;AAAA,gBACH,aAAA,IAAiB,OAAO,QAAA,mBACvB,IAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,SAAA;AAAA,oBACV,WAAA,EAAU,eAAA;AAAA,oBACV,KAAA,EAAO,CAAA,WAAA,EAAc,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,oBAC7C,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,sBACG,MAAA,CAAO;AAAA;AAAA;AAAA,iBACX,GACE;AAAA,eAAA,EACN,CAAA;AAAA,cACC,gBAAA,mBACC,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,eAAA,EAAe,IAAA;AAAA,kBACf,YAAA,EAAY,CAAA,SAAA,EAAY,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,kBACpC,SAAA,EAAU,aAAA;AAAA,kBACV,IAAA,EAAK,IAAA;AAAA,kBACL,OAAA,EAAQ,OAAA;AAAA,kBACR,OAAA,EAAS,gBAAA;AAAA,kBAET,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,eACnC,GACE;AAAA;AAAA;AAAA,SACN;AAAA,wBAGA,GAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,YAC5B,QAAA,EAAU,2BAAA;AAAA,YAEV,QAAA,kBAAA,IAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,iBAAA,EAAiB,QAAA;AAAA,gBACjB,WAAW,2BAAA,EAA4B;AAAA,gBACvC,WAAA,EAAU,uBAAA;AAAA,gBAET,QAAA,EAAA;AAAA,kBAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACV,GAAA;AAAA,oBAAC,YAAA;AAAA,oBAAA;AAAA,sBAEC,MAAM,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,QAAA,EAAU,OAAO,EAAA,EAAG;AAAA,sBAChD,IAAI,IAAA,CAAK,EAAA;AAAA,sBAER,WAAC,EAAE,UAAA,uBACF,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACb,QAAA,EAAA;AAAA,wCAAA,GAAA;AAAA,0BAAC,UAAA;AAAA,0BAAA;AAAA,4BACC,YAAA,EAAY,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,4BAC9B,SAAA,EAAU,2KAAA;AAAA,4BAEV,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,+BAAA,EAAgC;AAAA;AAAA,yBAC1D;AAAA,wCACA,GAAA;AAAA,0BAAC,UAAA;AAAA,0BAAA;AAAA,4BACC,UAAA;AAAA,4BACA,IAAA;AAAA,4BACA,OAAA,EAAS,WAAA;AAAA,4BACT,QAAA,EAAU;AAAA;AAAA;AACZ,uBAAA,EACF;AAAA,qBAAA;AAAA,oBAlBG,IAAA,CAAK;AAAA,mBAqBb,CAAA;AAAA,kBAGA,YAAA,mBACC,IAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,YAAA,EAAY,CAAA,YAAA,EAAe,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,sBACvC,WAAW,uBAAA,EAAwB;AAAA,sBACnC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,aAAA;AAAA,sBAET,QAAA,EAAA;AAAA,wCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,SAAA,EAAU,CAAA;AAAA,wBAAE;AAAA;AAAA;AAAA,mBAE9B,GACE;AAAA;AAAA;AAAA;AACN;AAAA;AACF;AAAA;AAAA,GACF,EAEJ,CAAA;AAEJ;AAkCA,SAAS,WAAA,CAAY;AAAA,EACnB,cAAA,GAAiB,KAAA;AAAA,EACjB,YAAA,GAAe,IAAA;AAAA,EACf,kBAAA,GAAqB,KAAA;AAAA,EACrB,SAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,GAAA;AAAA,EACd,QAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA,EAAgB,eAAA;AAAA,EAChB,eAAA,EAAiB,gBAAA;AAAA,EACjB,cAAA,EAAgB,eAAA;AAAA,EAChB,SAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA,EAAc,aAAA;AAAA,EACd,UAAA,GAAa,KAAA;AAAA,EACb,eAAA,GAAkB,IAAA;AAAA,EAClB,aAAA,GAAgB,IAAA;AAAA,EAChB,OAAA,GAAU,SAAA;AAAA,EACV,MAAA,GAAS,YAAA;AAAA,EACT,GAAG;AACL,CAAA,EAAqB;AACnB,EAAiB,KAAA;AACjB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAkC,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,kBAAkB,mBAAmB,CAAA,GAAI,SAAsB,sBAAM,IAAI,KAAK,CAAA;AAGrF,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAM;AAClC,IAAA,IAAI,MAAA,GAAS,CAAC,GAAG,KAAK,CAAA;AAGtB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,KAAA,GAAQ,YAAY,WAAA,EAAY;AACtC,MAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,QACd,CAAC,IAAA,KACC,IAAA,CAAK,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,KAAK,CAAA,IACvC,IAAA,CAAK,WAAA,EAAa,WAAA,EAAY,CAAE,SAAS,KAAK;AAAA,OAClD;AAAA,IACF;AAGA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,QAAA,CAAS,UAAU,MAAA,EAAQ;AAC7B,QAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,UAAO,CAAC,SACtB,IAAA,CAAK,QAAA,IAAY,SAAS,QAAA,EAAU,QAAA,CAAS,KAAK,QAAQ;AAAA,SAC5D;AAAA,MACF;AACA,MAAA,IAAI,QAAA,CAAS,WAAW,MAAA,EAAQ;AAC9B,QAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,UAAO,CAAC,IAAA,KACtB,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,CAAS,SAAA,EAAW,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC;AAAA,SAChE;AAAA,MACF;AACA,MAAA,IAAI,QAAA,CAAS,QAAQ,MAAA,EAAQ;AAC3B,QAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,UAAO,CAAC,IAAA,KACtB,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,CAAS,MAAA,EAAQ,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC;AAAA,SAC1D;AAAA,MACF;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,CAAC,IAAA,KAAS;AAC/B,UAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,KAAA;AAC1B,UAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAClC,UAAA,IAAI,SAAS,OAAA,EAAS,IAAA,IAAQ,OAAO,QAAA,CAAS,OAAA,CAAQ,MAAM,OAAO,KAAA;AACnE,UAAA,IAAI,SAAS,OAAA,EAAS,EAAA,IAAM,OAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,OAAO,KAAA;AAC/D,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,WAAA,EAAa,QAAQ,CAAC,CAAA;AAGjC,EAAA,MAAM,cAAA,GAAiB,CAAC,QAAA,KAAqB;AAC3C,IAAA,OAAO,aAAA,CACJ,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,QAAA,KAAa,QAAQ,CAAA,CAC3C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAAA,EACrC,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,OAAO,MAAM,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,EAAA,KAAO,QAAQ,CAAA,IAAK,IAAA;AAAA,EACvD,CAAA,EAAG,CAAC,QAAA,EAAU,KAAK,CAAC,CAAA;AAGpB,EAAA,MAAM,oBAAA,GAAuB,CAAC,QAAA,KAAqB;AACjD,IAAA,mBAAA,CAAoB,CAAC,IAAA,KAAS;AAC5B,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AAAA,MACnB;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAA0B;AACjD,IAAA,WAAA,CAAY,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAA0B;AAAA,EAElD,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AACzB,IAAA,WAAA,CAAY,IAAI,CAAA;AAEhB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,OAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,OAAA;AAE3B,IAAA,IAAI,UAAA,EAAY,SAAS,MAAA,EAAQ;AAEjC,IAAA,MAAMA,cAAa,UAAA,CAAW,IAAA;AAC9B,IAAA,IAAI,CAACA,WAAAA,EAAY;AAEjB,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,IAAI,QAAA,EAAU,SAAS,QAAA,EAAU;AAE/B,MAAA,QAAA,GAAW,QAAA,CAAS,QAAQ,EAAA,IAAM,EAAA;AAClC,MAAA,KAAA,GAAQ,cAAA,CAAe,QAAQ,CAAA,CAAE,MAAA;AAAA,IACnC,CAAA,MAAA,IAAW,QAAA,EAAU,IAAA,KAAS,MAAA,EAAQ;AAEpC,MAAA,QAAA,GAAW,QAAA,CAAS,MAAM,QAAA,IAAY,EAAA;AACtC,MAAA,MAAM,WAAA,GAAc,eAAe,QAAQ,CAAA;AAC3C,MAAA,MAAM,WAAW,QAAA,CAAS,IAAA;AAC1B,MAAA,KAAA,GAAQ,QAAA,GAAW,YAAY,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,QAAA,CAAS,EAAE,CAAA,GAAI,CAAA;AAAA,IAC1E,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAEA,IAAA,IAAIA,YAAW,QAAA,KAAa,QAAA,IAAY,MAAA,CAAO,EAAA,KAAO,KAAK,EAAA,EAAI;AAC7D,MAAA,UAAA,GAAa;AAAA,QACX,YAAYA,WAAAA,CAAW,QAAA;AAAA,QACvB,KAAA;AAAA,QACA,QAAQA,WAAAA,CAAW,EAAA;AAAA,QACnB;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB,CAAA;AAGA,EAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IAC7C,GAAG,GAAA;AAAA,IACH,aAAa,gBAAA,CAAiB,GAAA,CAAI,GAAA,CAAI,EAAE,KAAK,GAAA,CAAI;AAAA,GACnD,CAAE,CAAA;AAGF,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAM;AAC9B,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,WAAA,EAAa,OAAO,IAAA;AAEhD,IAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,MAAM,GAAA,GAAO,IAAA,CAAK,YAAA,GAAe,OAAO,CAAA,IAA4B,WAAA;AACpE,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,KAAK,EAAC;AAClC,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,aAAA,EAAe,OAAA,EAAS,OAAO,CAAC,CAAA;AAGpC,EAAA,MAAM,UAAA,GAAa,OAAO,WAAA,KAAgB,QAAA,GAAW,GAAG,MAAA,CAAO,WAAW,CAAC,CAAA,EAAA,CAAA,GAAO,WAAA;AAClF,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,cAAA;AAAA,MACX,SAAA,EAAU,qBAAA;AAAA,MACV,WAAA,EAAU,sBAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MACJ,GAAG,KAAA;AAAA,MAGH,QAAA,EAAA;AAAA,QAAA,UAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAW,oBAAA,EAAqB,EAAG,aAAU,eAAA,EAChD,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAO,WAAU,+BAAA,EAAgC,CAAA;AAAA,0BAClD,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAW,cAAA;AAAA,cACX,SAAA,EAAU,8EAAA;AAAA,cACV,WAAA,EAAY,iBAAA;AAAA,cACZ,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,WAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,gBAAA,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAAG;AAAA;AAAA;AACrD,SAAA,EACF,CAAA,GACE,IAAA;AAAA,wBAGJ,IAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,GAAG,mBAAA,CAAoB,EAAE,QAAQ,OAAA,EAAS,GAAG,SAAS,CAAA;AAAA,YACjE,YAAA,EAAc,gBAAA;AAAA,YACd,SAAA,EAAW,aAAA;AAAA,YACX,UAAA,EAAY,cAAA;AAAA,YACZ,WAAA,EAAa,eAAA;AAAA,YAEZ,QAAA,EAAA;AAAA,cAAA,OAAA,KAAY,WAAA,IAAe,SAAA;AAAA;AAAA,gCAE1B,GAAA,CAAC,SAAI,SAAA,EAAU,qBAAA,EAAsB,aAAU,kBAAA,EAC5C,QAAA,EAAA,CAAC,GAAG,SAAA,CAAU,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,UAAU,CAAA,qBAC9C,IAAA,CAAC,KAAA,EAAA,EAAe,SAAA,EAAU,qBAAA,EACxB,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACZ,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,kCACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,kBAAA,GAAA;AAAA,oBAAC,eAAA;AAAA,oBAAA;AAAA,sBACC,UAAU,CAAC,kBAAA;AAAA,sBACX,OAAO,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,sBACvC,QAAA,EAAU,6BAAA;AAAA,sBAET,2BAAiB,GAAA,CAAI,CAAC,2BACrB,GAAA,CAAC,KAAA,EAAA,EAAoB,OAAO,WAAA,EAC1B,QAAA,kBAAA,GAAA;AAAA,wBAAC,YAAA;AAAA,wBAAA;AAAA,0BACC,KAAA,EAAO,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA,CAAE,MAAA;AAAA,4BAC/B,CAAC,IAAA,KAAA,CAAW,IAAA,CAAK,eAAe,OAAA,IAAW,EAAE,KAA4B,WAAA,MAAiB;AAAA,2BAC5F;AAAA,0BACA,YAAA;AAAA,0BACA,MAAA;AAAA,0BACA,eAAA;AAAA,0BACA,aAAA;AAAA,0BACA,SAAA;AAAA,0BACA,WAAA;AAAA,0BACA,YAAA;AAAA,0BACA,kBAAkB,MAAM;AAAE,4BAAA,oBAAA,CAAqB,OAAO,EAAE,CAAA;AAAA,0BAAG;AAAA;AAAA,uBAC7D,EAAA,EAbQ,MAAA,CAAO,EAcjB,CACD;AAAA;AAAA,mBACH,EACF;AAAA,iBAAA,EAAA,EA5BQ,IA6BV,CACD,CAAA,EACH;AAAA;AAAA;AAAA,gCAGA,IAAA;AAAA,kBAAC,eAAA;AAAA,kBAAA;AAAA,oBACC,UAAU,CAAC,kBAAA;AAAA,oBACX,OAAO,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,oBACvC,QAAA,EAAU,6BAAA;AAAA,oBAET,QAAA,EAAA;AAAA,sBAAA,gBAAA,CAAiB,GAAA,CAAI,CAAC,MAAA,qBACrB,GAAA,CAAC,SAAoB,KAAA,EAAO,MAAA,CAAO,WAAA,GAAc,MAAA,GAAY,WAAA,EAC3D,QAAA,kBAAA,GAAA;AAAA,wBAAC,YAAA;AAAA,wBAAA;AAAA,0BACC,YAAA;AAAA,0BACA,MAAA;AAAA,0BACA,KAAA,EAAO,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA;AAAA,0BAC/B,eAAA;AAAA,0BACA,aAAA;AAAA,0BACA,SAAA;AAAA,0BACA,WAAA;AAAA,0BACA,YAAA;AAAA,0BACA,kBAAkB,MAAM;AAAE,4BAAA,oBAAA,CAAqB,OAAO,EAAE,CAAA;AAAA,0BAAG;AAAA;AAAA,uBAC7D,EAAA,EAXQ,MAAA,CAAO,EAYjB,CACD,CAAA;AAAA,sBAGA,cAAA,mBACC,IAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BACC,SAAA,EAAW,EAAA;AAAA,4BACT,uBAAA,EAAwB;AAAA,4BACxB;AAAA,2BACF;AAAA,0BACA,YAAA,EAAW,YAAA;AAAA,0BACX,IAAA,EAAK,QAAA;AAAA,0BACL,OAAA,EAAS,WAAA;AAAA,0BAET,QAAA,EAAA;AAAA,4CAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,SAAA,EAAU,CAAA;AAAA,4BAAE;AAAA;AAAA;AAAA,uBAE9B,GACE;AAAA;AAAA;AAAA;AACN,eAAA;AAAA,8BAIF,GAAA,CAAC,eACE,QAAA,EAAA,UAAA,mBACC,GAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qBAAA;AAAA,kBACV,KAAA,EAAO,WAAA;AAAA,kBAEP,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,UAAA,EAAU,IAAA,EAAC,MAAM,UAAA,EAAY;AAAA;AAAA,kBAEzC,IAAA,EACN;AAAA;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ","file":"chunk-YZ25HHV2.js","sourcesContent":["import { cva } from \"class-variance-authority\"\n\n/* eslint-disable sonarjs/no-duplicate-string -- CVA variants require repeated class patterns */\n\n/**\n * Board container variants\n */\nexport const kanbanBoardVariants = cva(\n [\n \"flex\",\n \"w-full\",\n \"min-w-0\",\n \"gap-4\",\n \"p-4\",\n \"bg-muted/30\",\n \"rounded-lg\",\n \"overflow-x-auto\",\n ],\n {\n defaultVariants: {\n layout: \"horizontal\",\n variant: \"default\",\n },\n variants: {\n layout: {\n horizontal: \"flex-row\",\n vertical: \"flex-col\",\n },\n variant: {\n collapsed: \"\",\n compact: \"[&_[data-slot=kanban-card]]:p-2 [&_[data-slot=kanban-column]]:w-60\",\n default: \"\",\n swimlanes: \"flex-col gap-6\",\n },\n },\n }\n)\n\n/**\n * Column container variants\n */\nexport const kanbanColumnVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"rounded-lg\",\n \"bg-muted/50\",\n \"min-h-52\",\n ],\n {\n defaultVariants: {\n isCollapsed: false,\n isOver: false,\n },\n variants: {\n isCollapsed: {\n false: \"w-72\",\n true: \"w-12\",\n },\n isOver: {\n false: \"\",\n true: \"ring-2 ring-primary/50 bg-primary/5\",\n },\n },\n }\n)\n\n/**\n * Column header variants\n */\nexport const kanbanColumnHeaderVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"justify-between\",\n \"gap-2\",\n \"p-3\",\n \"bg-card\",\n \"rounded-t-lg\",\n \"border-b\",\n ],\n {\n defaultVariants: {\n wipStatus: \"normal\",\n },\n variants: {\n wipStatus: {\n exceeded: \"[&_[data-slot=wip-indicator]]:text-destructive\",\n normal: \"\",\n warning: \"[&_[data-slot=wip-indicator]]:text-warning\",\n },\n },\n }\n)\n\n/**\n * Column content (cards area) variants\n */\nexport const kanbanColumnContentVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"flex-1\",\n \"gap-2\",\n \"p-2\",\n \"min-h-24\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Kanban card variants\n */\nexport const kanbanCardVariants = cva(\n [\n \"group\",\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"p-3\",\n \"bg-card\",\n \"rounded-md\",\n \"border\",\n \"shadow-sm\",\n \"cursor-pointer\",\n \"transition-all\",\n \"duration-200\",\n \"hover:shadow-md\",\n \"hover:border-primary/30\",\n ],\n {\n defaultVariants: {\n isDragging: false,\n priority: null,\n },\n variants: {\n isDragging: {\n false: \"\",\n true: \"opacity-50 ring-2 ring-primary shadow-lg\",\n },\n priority: {\n high: \"border-l-4 border-l-orange-500\",\n low: \"border-l-4 border-l-gray-400\",\n medium: \"border-l-4 border-l-yellow-500\",\n null: \"\",\n urgent: \"border-l-4 border-l-destructive\",\n },\n },\n }\n)\n\n/**\n * Card title variants\n */\nexport const kanbanCardTitleVariants = cva(\n [\n \"text-sm\",\n \"font-medium\",\n \"text-foreground\",\n \"line-clamp-2\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Card description variants\n */\nexport const kanbanCardDescriptionVariants = cva(\n [\n \"text-xs\",\n \"text-muted-foreground\",\n \"line-clamp-2\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Card metadata row variants\n */\nexport const kanbanCardMetaVariants = cva(\n [\n \"flex\",\n \"flex-wrap\",\n \"items-center\",\n \"gap-2\",\n \"text-xs\",\n \"text-muted-foreground\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Label badge variants\n */\nexport const kanbanLabelVariants = cva(\n [\n \"inline-flex\",\n \"items-center\",\n \"px-1.5\",\n \"py-0.5\",\n \"rounded-sm\",\n \"text-xs\",\n \"font-medium\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Drop indicator variants\n */\nexport const kanbanDropIndicatorVariants = cva(\n [\n \"h-1\",\n \"rounded-full\",\n \"bg-primary/20\",\n \"border\",\n \"border-primary\",\n \"transition-opacity\",\n ],\n {\n defaultVariants: {\n isVisible: false,\n },\n variants: {\n isVisible: {\n false: \"opacity-0\",\n true: \"opacity-100\",\n },\n },\n }\n)\n\n/**\n * Add button variants\n */\nexport const kanbanAddButtonVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"gap-1\",\n \"w-full\",\n \"p-2\",\n \"text-sm\",\n \"text-muted-foreground\",\n \"rounded-md\",\n \"border\",\n \"border-dashed\",\n \"hover:bg-muted/50\",\n \"hover:text-foreground\",\n \"transition-colors\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Swimlane header variants\n */\nexport const kanbanSwimlaneVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"gap-2\",\n \"p-3\",\n \"rounded-lg\",\n \"bg-muted/20\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n\n/**\n * Search input variants\n */\nexport const kanbanSearchVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"gap-2\",\n \"px-3\",\n \"py-2\",\n \"bg-background\",\n \"border\",\n \"rounded-md\",\n \"focus-within:ring-2\",\n \"focus-within:ring-primary/50\",\n ],\n {\n defaultVariants: {},\n variants: {},\n }\n)\n","import type {\n KanbanBoardProps,\n KanbanCardProps,\n KanbanColumn,\n KanbanColumnProps,\n KanbanItem,\n} from \"./KanbanBoard.types\"\nimport type { DragEndEvent, DragOverEvent, DragStartEvent, UniqueIdentifier } from \"@dnd-kit/core\"\nimport type { KeyboardEvent } from \"react\"\n\nimport { horizontalListSortingStrategy, SortableContext, verticalListSortingStrategy } from \"@dnd-kit/sortable\"\nimport {\n Calendar,\n ChevronDown,\n ChevronRight,\n GripVertical,\n MessageSquare,\n Paperclip,\n Plus,\n Search,\n} from \"lucide-react\"\nimport { useId, useMemo, useState } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n DndContext,\n DragHandle,\n DragOverlay,\n Droppable,\n SortableItem,\n} from \"../../advanced/DragAndDrop\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../primitives/Avatar\"\nimport { Badge } from \"../../primitives/Badge\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n kanbanAddButtonVariants,\n kanbanBoardVariants,\n kanbanCardDescriptionVariants,\n kanbanCardMetaVariants,\n kanbanCardTitleVariants,\n kanbanCardVariants,\n kanbanColumnContentVariants,\n kanbanColumnHeaderVariants,\n kanbanColumnVariants,\n kanbanLabelVariants,\n kanbanSearchVariants,\n} from \"./KanbanBoard.variants\"\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\n/**\n * Get initials from a name\n */\nfunction getInitials(name: string): string {\n return name\n .split(\" \")\n .map((part) => part[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2)\n}\n\n/**\n * Format date for display\n */\nfunction formatDueDate(date: Date): string {\n const now = new Date()\n const diff = date.getTime() - now.getTime()\n const days = Math.ceil(diff / (1000 * 60 * 60 * 24))\n\n if (days < 0) return \"Overdue\"\n if (days === 0) return \"Today\"\n if (days === 1) return \"Tomorrow\"\n if (days <= 7) return `${String(days)} days`\n return date.toLocaleDateString()\n}\n\n/**\n * Get WIP status for column\n */\nfunction getWipStatus(\n itemCount: number,\n wipLimit?: number\n): \"exceeded\" | \"normal\" | \"warning\" {\n if (!wipLimit) return \"normal\"\n if (itemCount >= wipLimit) return \"exceeded\"\n if (itemCount >= wipLimit - 1) return \"warning\"\n return \"normal\"\n}\n\n// ============================================\n// KANBAN CARD\n// ============================================\n\n/**\n * KanbanCard displays an individual task item\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity -- Complexity inherent to rendering multiple optional card elements\nfunction KanbanCard({\n className,\n isDragging = false,\n item,\n onClick,\n onDelete: _onDelete,\n}: KanbanCardProps) {\n const cardId = useId()\n const hasMeta = Boolean(\n item.assignees?.length ??\n item.labels?.length ??\n item.dueDate ??\n item.comments ??\n item.attachments ??\n item.subtasks\n )\n\n const handleClick = () => {\n onClick?.({ item })\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault()\n handleClick()\n }\n }\n\n return (\n <div\n aria-describedby={item.description ? `${cardId}-desc` : undefined}\n aria-label={item.title}\n className={cn(kanbanCardVariants({ isDragging, priority: item.priority ?? null }), className)}\n data-slot=\"kanban-card\"\n role=\"listitem\"\n tabIndex={0}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {/* Labels */}\n {item.labels && item.labels.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\" data-slot=\"kanban-card-labels\">\n {item.labels.slice(0, 3).map((label) => (\n <span\n key={label.id}\n className={kanbanLabelVariants()}\n style={{ backgroundColor: `${label.color}20`, color: label.color }}\n >\n {label.name}\n </span>\n ))}\n {item.labels.length > 3 ? (\n <span className=\"text-xs text-muted-foreground\">\n +{item.labels.length - 3}\n </span>\n ) : null}\n </div>\n ) : null}\n\n {/* Title */}\n <div className={kanbanCardTitleVariants()} data-slot=\"kanban-card-title\">\n {item.title}\n </div>\n\n {/* Description */}\n {item.description ? (\n <div\n className={kanbanCardDescriptionVariants()}\n data-slot=\"kanban-card-description\"\n id={`${cardId}-desc`}\n >\n {item.description}\n </div>\n ) : null}\n\n {/* Metadata row */}\n {hasMeta ? (\n <div className={kanbanCardMetaVariants()} data-slot=\"kanban-card-meta\">\n {/* Due date */}\n {item.dueDate ? (\n <span\n className={cn(\n \"flex items-center gap-1\",\n new Date(item.dueDate) < new Date() && \"text-destructive\"\n )}\n title={`Due: ${item.dueDate.toLocaleDateString()}`}\n >\n <Calendar className=\"h-3 w-3\" />\n {formatDueDate(new Date(item.dueDate))}\n </span>\n ) : null}\n\n {/* Subtasks */}\n {item.subtasks ? (\n <span className=\"flex items-center gap-1\" title=\"Subtasks progress\">\n {item.subtasks.completed}/{item.subtasks.total}\n </span>\n ) : null}\n\n {/* Comments */}\n {item.comments ? (\n <span className=\"flex items-center gap-1\" title={`${String(item.comments)} comments`}>\n <MessageSquare className=\"h-3 w-3\" />\n {item.comments}\n </span>\n ) : null}\n\n {/* Attachments */}\n {item.attachments ? (\n <span className=\"flex items-center gap-1\" title={`${String(item.attachments)} attachments`}>\n <Paperclip className=\"h-3 w-3\" />\n {item.attachments}\n </span>\n ) : null}\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Assignees */}\n {item.assignees && item.assignees.length > 0 ? (\n <div className=\"flex -space-x-1\" data-slot=\"kanban-card-assignees\">\n {item.assignees.slice(0, 3).map((user) => (\n <Avatar\n key={user.id}\n className=\"h-5 w-5 border-2 border-background\"\n title={user.name}\n >\n {user.avatar ? (\n <AvatarImage alt={user.name} src={user.avatar} />\n ) : null}\n <AvatarFallback className=\"text-xs\">\n {getInitials(user.name)}\n </AvatarFallback>\n </Avatar>\n ))}\n {item.assignees.length > 3 ? (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-muted text-xs border-2 border-background\">\n +{item.assignees.length - 3}\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n )\n}\n\n// ============================================\n// KANBAN COLUMN\n// ============================================\n\n/**\n * KanbanColumn displays a single column with its items\n */\nfunction KanbanColumn({\n allowAddItem = true,\n className,\n column,\n isOver = false,\n items,\n onItemAdd,\n onItemClick,\n onItemDelete,\n onToggleCollapse,\n showColumnCount = true,\n showWipLimits = true,\n}: KanbanColumnProps) {\n const columnId = useId()\n const wipStatus = getWipStatus(items.length, column.wipLimit)\n const isCollapsed = column.isCollapsed ?? false\n\n const handleAddItem = () => {\n onItemAdd?.({ columnId: column.id })\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n const target = event.currentTarget\n const cards = [...target.querySelectorAll('[data-slot=\"kanban-card\"]')] as HTMLElement[]\n const focused = document.activeElement as HTMLElement\n const currentIndex = cards.indexOf(focused)\n\n if (currentIndex === -1) {\n cards[0]?.focus()\n return\n }\n\n const nextIndex = event.key === \"ArrowDown\"\n ? Math.min(currentIndex + 1, cards.length - 1)\n : Math.max(currentIndex - 1, 0)\n\n const nextElement = cards[nextIndex]\n nextElement?.focus()\n event.preventDefault()\n }\n }\n\n // Collapsed column view\n if (isCollapsed) {\n return (\n <div\n data-collapsed\n className={cn(kanbanColumnVariants({ isCollapsed: true, isOver: false }), className)}\n data-slot=\"kanban-column\"\n >\n <Button\n aria-expanded={false}\n aria-label={`Expand ${column.title}`}\n className=\"h-full w-full flex flex-col items-center justify-start pt-3 gap-2\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n >\n <ChevronRight className=\"h-4 w-4\" />\n <span\n className=\"text-sm font-semibold writing-mode-vertical\"\n style={{ writingMode: \"vertical-rl\" }}\n >\n {column.title}\n </span>\n {showColumnCount ? (\n <Badge className=\"mt-2\" color=\"muted\" type=\"pill-color\">\n {items.length}\n </Badge>\n ) : null}\n </Button>\n </div>\n )\n }\n\n return (\n <Droppable data={{ type: \"column\", column }} id={column.id}>\n {({ isOver: droppableIsOver }) => (\n <div\n className={cn(\n kanbanColumnVariants({ isCollapsed: false, isOver: isOver || droppableIsOver }),\n className\n )}\n aria-label={`${column.title} column`}\n data-slot=\"kanban-column\"\n role=\"list\"\n onKeyDown={handleKeyDown}\n >\n {/* Column Header */}\n <div\n className={kanbanColumnHeaderVariants({ wipStatus })}\n data-slot=\"kanban-column-header\"\n >\n <div className=\"flex items-center gap-2\">\n {column.color ? (\n <div\n className=\"h-3 w-3 rounded-full\"\n style={{ backgroundColor: column.color }}\n />\n ) : null}\n <span className=\"text-sm font-semibold\">{column.title}</span>\n {showColumnCount ? (\n <Badge color=\"muted\" data-slot=\"column-count\" type=\"pill-color\">\n {items.length}\n </Badge>\n ) : null}\n {showWipLimits && column.wipLimit ? (\n <span\n className=\"text-xs\"\n data-slot=\"wip-indicator\"\n title={`WIP Limit: ${String(column.wipLimit)}`}\n >\n /{column.wipLimit}\n </span>\n ) : null}\n </div>\n {onToggleCollapse ? (\n <Button\n aria-expanded={true}\n aria-label={`Collapse ${column.title}`}\n className=\"h-6 w-6 p-0\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n ) : null}\n </div>\n\n {/* Cards */}\n <SortableContext\n items={items.map((i) => i.id)}\n strategy={verticalListSortingStrategy}\n >\n <div\n aria-labelledby={columnId}\n className={kanbanColumnContentVariants()}\n data-slot=\"kanban-column-content\"\n >\n {items.map((item) => (\n <SortableItem\n key={item.id}\n data={{ type: \"item\", item, columnId: column.id }}\n id={item.id}\n >\n {({ isDragging }) => (\n <div className=\"relative\">\n <DragHandle\n aria-label={`Drag ${item.title}`}\n className=\"absolute left-1 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-opacity cursor-grab active:cursor-grabbing h-6 w-6 flex items-center justify-center\"\n >\n <GripVertical className=\"h-4 w-4 text-muted-foreground\" />\n </DragHandle>\n <KanbanCard\n isDragging={isDragging}\n item={item}\n onClick={onItemClick}\n onDelete={onItemDelete}\n />\n </div>\n )}\n </SortableItem>\n ))}\n\n {/* Add card button */}\n {allowAddItem ? (\n <button\n aria-label={`Add item to ${column.title}`}\n className={kanbanAddButtonVariants()}\n type=\"button\"\n onClick={handleAddItem}\n >\n <Plus className=\"h-4 w-4\" />\n Add card\n </button>\n ) : null}\n </div>\n </SortableContext>\n </div>\n )}\n </Droppable>\n )\n}\n\n// ============================================\n// KANBAN BOARD\n// ============================================\n\n/**\n * KanbanBoard component for visual task management.\n *\n * Organizes items into columns representing workflow stages with drag-and-drop\n * support for moving items between columns.\n *\n * @example\n * ```tsx\n * const columns = [\n * { id: 'todo', title: 'To Do' },\n * { id: 'doing', title: 'In Progress', wipLimit: 3 },\n * { id: 'done', title: 'Done' },\n * ]\n *\n * const items = [\n * { id: '1', title: 'Task 1', columnId: 'todo', order: 0 },\n * { id: '2', title: 'Task 2', columnId: 'doing', order: 0 },\n * ]\n *\n * <KanbanBoard\n * columns={columns}\n * items={items}\n * onItemMove={({ itemId, fromColumn, toColumn }) => {\n * console.log(`Moved ${itemId} from ${fromColumn} to ${toColumn}`)\n * }}\n * />\n * ```\n */\nfunction KanbanBoard({\n allowAddColumn = false,\n allowAddItem = true,\n allowColumnReorder = false,\n className,\n columns,\n columnWidth = 288,\n filterBy,\n groupBy,\n items,\n onColumnAdd,\n onColumnDelete: _onColumnDelete,\n onColumnReorder: _onColumnReorder,\n onColumnUpdate: _onColumnUpdate,\n onItemAdd,\n onItemClick,\n onItemDelete,\n onItemMove,\n onItemUpdate: _onItemUpdate,\n searchable = false,\n showColumnCount = true,\n showWipLimits = true,\n variant = \"default\",\n layout = \"horizontal\",\n ...props\n}: KanbanBoardProps) {\n const _boardId = useId()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [activeId, setActiveId] = useState<null | UniqueIdentifier>(null)\n const [collapsedColumns, setCollapsedColumns] = useState<Set<string>>(() => new Set())\n\n // Filter items based on search and filters\n const filteredItems = useMemo(() => {\n let result = [...items]\n\n // Apply search filter\n if (searchQuery) {\n const query = searchQuery.toLowerCase()\n result = result.filter(\n (item) =>\n item.title.toLowerCase().includes(query) ||\n item.description?.toLowerCase().includes(query)\n )\n }\n\n // Apply filter config\n if (filterBy) {\n if (filterBy.priority?.length) {\n result = result.filter((item) =>\n item.priority && filterBy.priority?.includes(item.priority)\n )\n }\n if (filterBy.assignees?.length) {\n result = result.filter((item) =>\n item.assignees?.some((a) => filterBy.assignees?.includes(a.id))\n )\n }\n if (filterBy.labels?.length) {\n result = result.filter((item) =>\n item.labels?.some((l) => filterBy.labels?.includes(l.id))\n )\n }\n if (filterBy.dueDate) {\n result = result.filter((item) => {\n if (!item.dueDate) return false\n const date = new Date(item.dueDate)\n if (filterBy.dueDate?.from && date < filterBy.dueDate.from) return false\n if (filterBy.dueDate?.to && date > filterBy.dueDate.to) return false\n return true\n })\n }\n }\n\n return result\n }, [items, searchQuery, filterBy])\n\n // Get items for a specific column\n const getColumnItems = (columnId: string) => {\n return filteredItems\n .filter((item) => item.columnId === columnId)\n .sort((a, b) => a.order - b.order)\n }\n\n // Get the active item being dragged\n const activeItem = useMemo(() => {\n if (!activeId) return null\n return items.find((item) => item.id === activeId) ?? null\n }, [activeId, items])\n\n // Toggle column collapse\n const handleToggleCollapse = (columnId: string) => {\n setCollapsedColumns((prev) => {\n const next = new Set(prev)\n if (next.has(columnId)) {\n next.delete(columnId)\n } else {\n next.add(columnId)\n }\n return next\n })\n }\n\n // Drag handlers\n const handleDragStart = (event: DragStartEvent) => {\n setActiveId(event.active.id)\n }\n\n const handleDragOver = (_event: DragOverEvent) => {\n // Could implement preview of drop here\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n setActiveId(null)\n\n if (!over) return\n\n const activeData = active.data.current as undefined | { columnId?: string; item?: KanbanItem; type?: string }\n const overData = over.data.current as undefined | { column?: KanbanColumn; columnId?: string; item?: KanbanItem; type?: string }\n\n if (activeData?.type !== \"item\") return\n\n const activeItem = activeData.item\n if (!activeItem) return\n\n let toColumn: string\n let index = 0\n\n if (overData?.type === \"column\") {\n // Dropped on column\n toColumn = overData.column?.id ?? \"\"\n index = getColumnItems(toColumn).length\n } else if (overData?.type === \"item\") {\n // Dropped on item\n toColumn = overData.item?.columnId ?? \"\"\n const targetItems = getColumnItems(toColumn)\n const overItem = overData.item\n index = overItem ? targetItems.findIndex((i) => i.id === overItem.id) : 0\n } else {\n return\n }\n\n if (activeItem.columnId !== toColumn || active.id !== over.id) {\n onItemMove?.({\n fromColumn: activeItem.columnId,\n index,\n itemId: activeItem.id,\n toColumn,\n })\n }\n }\n\n const handleDragCancel = () => {\n setActiveId(null)\n }\n\n // Prepare columns with collapse state\n const columnsWithState = columns.map((col) => ({\n ...col,\n isCollapsed: collapsedColumns.has(col.id) || col.isCollapsed,\n }))\n\n // Group items by swimlane if groupBy is specified\n const swimlanes = useMemo(() => {\n if (!groupBy || variant !== \"swimlanes\") return null\n\n const groups = new Map<string, KanbanItem[]>()\n for (const item of filteredItems) {\n const key = (item.customFields?.[groupBy] as string | undefined) ?? \"Ungrouped\"\n const group = groups.get(key) ?? []\n group.push(item)\n groups.set(key, group)\n }\n return groups\n }, [filteredItems, groupBy, variant])\n\n // Column width style\n const widthValue = typeof columnWidth === \"number\" ? `${String(columnWidth)}px` : columnWidth\n const columnStyle = {\n minWidth: widthValue,\n width: widthValue,\n }\n\n return (\n <div\n aria-label=\"Kanban board\"\n className=\"flex flex-col gap-4\"\n data-slot=\"kanban-board-wrapper\"\n role=\"region\"\n {...props}\n >\n {/* Search bar */}\n {searchable ? (\n <div className={kanbanSearchVariants()} data-slot=\"kanban-search\">\n <Search className=\"h-4 w-4 text-muted-foreground\" />\n <input\n aria-label=\"Search items\"\n className=\"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder=\"Search items...\"\n type=\"text\"\n value={searchQuery}\n onChange={(e) => { setSearchQuery(e.target.value); }}\n />\n </div>\n ) : null}\n\n {/* Board */}\n <DndContext\n className={cn(kanbanBoardVariants({ layout, variant }), className)}\n onDragCancel={handleDragCancel}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragStart={handleDragStart}\n >\n {variant === \"swimlanes\" && swimlanes ? (\n // Swimlanes layout\n <div className=\"flex flex-col gap-6\" data-slot=\"kanban-swimlanes\">\n {[...swimlanes.entries()].map(([lane, _laneItems]) => (\n <div key={lane} className=\"flex flex-col gap-2\">\n <div className=\"text-sm font-semibold text-muted-foreground\">\n {lane}\n </div>\n <div className=\"flex gap-4 overflow-x-auto\">\n <SortableContext\n disabled={!allowColumnReorder}\n items={columnsWithState.map((c) => c.id)}\n strategy={horizontalListSortingStrategy}\n >\n {columnsWithState.map((column) => (\n <div key={column.id} style={columnStyle}>\n <KanbanColumn\n items={getColumnItems(column.id).filter(\n (item) => ((item.customFields?.[groupBy ?? \"\"] as string | undefined) ?? \"Ungrouped\") === lane\n )}\n allowAddItem={allowAddItem}\n column={column}\n showColumnCount={showColumnCount}\n showWipLimits={showWipLimits}\n onItemAdd={onItemAdd}\n onItemClick={onItemClick}\n onItemDelete={onItemDelete}\n onToggleCollapse={() => { handleToggleCollapse(column.id); }}\n />\n </div>\n ))}\n </SortableContext>\n </div>\n </div>\n ))}\n </div>\n ) : (\n // Standard layout\n <SortableContext\n disabled={!allowColumnReorder}\n items={columnsWithState.map((c) => c.id)}\n strategy={horizontalListSortingStrategy}\n >\n {columnsWithState.map((column) => (\n <div key={column.id} style={column.isCollapsed ? undefined : columnStyle}>\n <KanbanColumn\n allowAddItem={allowAddItem}\n column={column}\n items={getColumnItems(column.id)}\n showColumnCount={showColumnCount}\n showWipLimits={showWipLimits}\n onItemAdd={onItemAdd}\n onItemClick={onItemClick}\n onItemDelete={onItemDelete}\n onToggleCollapse={() => { handleToggleCollapse(column.id); }}\n />\n </div>\n ))}\n\n {/* Add column button */}\n {allowAddColumn ? (\n <button\n className={cn(\n kanbanAddButtonVariants(),\n \"min-w-52 h-52 flex-col\"\n )}\n aria-label=\"Add column\"\n type=\"button\"\n onClick={onColumnAdd}\n >\n <Plus className=\"h-6 w-6\" />\n Add column\n </button>\n ) : null}\n </SortableContext>\n )}\n\n {/* Drag overlay */}\n <DragOverlay>\n {activeItem ? (\n <div\n className=\"opacity-90 rotate-3\"\n style={columnStyle}\n >\n <KanbanCard isDragging item={activeItem} />\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n </div>\n )\n}\n\n// ============================================\n// EXPORTS\n// ============================================\n\nexport {\n KanbanBoard,\n kanbanBoardVariants,\n KanbanCard,\n kanbanCardVariants,\n kanbanColumnVariants,\n}\n\nexport type {\n ItemAddPayload,\n ItemClickPayload,\n ItemDeletePayload,\n ItemMovePayload,\n KanbanBoardProps,\n KanbanCardProps,\n KanbanColumn,\n KanbanColumnProps,\n KanbanFilterConfig,\n KanbanItem,\n KanbanLabel,\n KanbanSubtasks,\n KanbanUser,\n} from \"./KanbanBoard.types\"\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-WBE6VQOO.js';
|
|
2
2
|
import { TextInput } from './chunk-PWCMCMDN.js';
|
|
3
|
-
import { Button } from './chunk-
|
|
3
|
+
import { Button } from './chunk-HDOR3SN3.js';
|
|
4
4
|
import { cn } from './chunk-HRNDJU7D.js';
|
|
5
5
|
import { X, PlusCircle, Trash2 } from 'lucide-react';
|
|
6
6
|
import * as React from 'react';
|
|
@@ -478,5 +478,5 @@ function FilterBuilder({
|
|
|
478
478
|
FilterBuilder.displayName = "FilterBuilder";
|
|
479
479
|
|
|
480
480
|
export { FilterBuilder, isFilterCondition, isFilterGroup };
|
|
481
|
-
//# sourceMappingURL=chunk-
|
|
482
|
-
//# sourceMappingURL=chunk-
|
|
481
|
+
//# sourceMappingURL=chunk-ZEFK3AXP.js.map
|
|
482
|
+
//# sourceMappingURL=chunk-ZEFK3AXP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/DataTable/FilterBuilder/FilterBuilder.types.ts","../src/components/data-display/DataTable/FilterBuilder/FilterBuilder.tsx"],"names":["Fragment"],"mappings":"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","file":"chunk-Y3BOERVB.js","sourcesContent":["/**\n * Filter operators for different field types\n */\nexport type FilterOperator =\n // Text operators\n | \"after\"\n | \"before\"\n | \"between\"\n | \"contains\"\n | \"dateBetween\"\n | \"endsWith\"\n | \"equals\"\n | \"gt\"\n // Number operators\n | \"gte\"\n | \"in\"\n | \"isEmpty\"\n | \"isNotEmpty\"\n | \"lt\"\n // Date operators\n | \"lte\"\n | \"notContains\"\n | \"notEquals\"\n // Select operators\n | \"notIn\"\n | \"startsWith\"\n\n/**\n * A single filter condition\n */\nexport interface FilterCondition {\n /** Column/field to filter on */\n column: string\n /** Unique identifier for the condition */\n id: string\n /** Comparison operator */\n operator: FilterOperator\n /** Primary value for comparison */\n value: unknown\n /** Secondary value for \"between\" operators */\n value2?: unknown\n}\n\n/**\n * A group of filter conditions with AND/OR logic\n */\nexport interface FilterGroup {\n /** Conditions or nested groups */\n conditions: (FilterCondition | FilterGroup)[]\n /** Unique identifier for the group */\n id: string\n /** Logical operator for combining conditions */\n logic: \"AND\" | \"OR\"\n}\n\n/**\n * A saved filter preset\n */\nexport interface FilterPreset {\n /** The filter configuration */\n filter: FilterGroup\n /** Unique identifier for the preset */\n id: string\n /** Display name for the preset */\n name: string\n}\n\n/**\n * Column configuration for the filter builder\n */\nexport interface FilterBuilderColumn {\n /** Column identifier */\n id: string\n /** Display label */\n label: string\n /** Options for select type columns */\n options?: string[]\n /** Data type for operator selection */\n type: \"date\" | \"number\" | \"select\" | \"text\"\n}\n\n/**\n * FilterBuilder component props\n */\nexport interface FilterBuilderProps {\n /** Additional CSS classes */\n className?: string\n /** Available columns for filtering */\n columns: FilterBuilderColumn[]\n /** Current filter configuration */\n filter: FilterGroup\n /** Callback to delete a preset */\n onDeletePreset?: (presetId: string) => void\n /** Callback when filter changes */\n onFilterChange: (filter: FilterGroup) => void\n /** Callback to save a new preset */\n onSavePreset?: (preset: FilterPreset) => void\n /** Saved filter presets */\n presets?: FilterPreset[]\n}\n\n/**\n * Type guard to check if an item is a FilterGroup\n */\nexport function isFilterGroup(\n item: FilterCondition | FilterGroup\n): item is FilterGroup {\n return \"logic\" in item && \"conditions\" in item\n}\n\n/**\n * Type guard to check if an item is a FilterCondition\n */\nexport function isFilterCondition(\n item: FilterCondition | FilterGroup\n): item is FilterCondition {\n return \"column\" in item && \"operator\" in item\n}\n","// FilterBuilder/FilterBuilder.tsx\n\"use client\"\n\nimport type {\n FilterBuilderColumn,\n FilterBuilderProps,\n FilterCondition,\n FilterGroup,\n FilterOperator,\n FilterPreset,\n} from \"./FilterBuilder.types\"\n\nimport { PlusCircle, Trash2, X } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../../lib/utils\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../../forms/Select\"\nimport { TextInput } from \"../../../forms/TextInput\"\nimport { Button } from \"../../../primitives/Button\"\nimport { isFilterCondition, isFilterGroup } from \"./FilterBuilder.types\"\n\n// ============================================\n// CONSTANTS\n// ============================================\n\n/**\n * Operator labels for display\n */\nconst OPERATOR_LABELS: Record<FilterOperator, string> = {\n // Text\n contains: \"Contains\",\n notContains: \"Does not contain\",\n equals: \"Equals\",\n notEquals: \"Does not equal\",\n startsWith: \"Starts with\",\n endsWith: \"Ends with\",\n isEmpty: \"Is empty\",\n isNotEmpty: \"Is not empty\",\n // Number\n gt: \"Greater than\",\n gte: \"Greater than or equal\",\n lt: \"Less than\",\n lte: \"Less than or equal\",\n between: \"Between\",\n // Date\n before: \"Before\",\n after: \"After\",\n dateBetween: \"Date between\",\n // Select\n in: \"Is any of\",\n notIn: \"Is none of\",\n}\n\n/**\n * Operators available by column type\n */\nconst OPERATORS_BY_TYPE: Record<FilterBuilderColumn[\"type\"], FilterOperator[]> = {\n text: [\"contains\", \"notContains\", \"equals\", \"notEquals\", \"startsWith\", \"endsWith\", \"isEmpty\", \"isNotEmpty\"],\n number: [\"equals\", \"notEquals\", \"gt\", \"gte\", \"lt\", \"lte\", \"between\"],\n date: [\"equals\", \"notEquals\", \"before\", \"after\", \"dateBetween\"],\n select: [\"equals\", \"notEquals\", \"in\", \"notIn\"],\n}\n\n/**\n * Generate a unique ID\n */\nfunction generateId(): string {\n return Math.random().toString(36).slice(2, 11)\n}\n\n/**\n * Create an empty condition\n */\nfunction createEmptyCondition(columnId?: string): FilterCondition {\n return {\n id: generateId(),\n column: columnId ?? \"\",\n operator: \"contains\",\n value: \"\",\n }\n}\n\n/**\n * Create an empty group\n */\nfunction createEmptyGroup(): FilterGroup {\n return {\n id: generateId(),\n logic: \"AND\",\n conditions: [],\n }\n}\n\n// ============================================\n// FILTER CONDITION COMPONENT\n// ============================================\n\ninterface FilterConditionRowProps {\n columns: FilterBuilderColumn[]\n condition: FilterCondition\n onChange: (condition: FilterCondition) => void\n onRemove: () => void\n}\n\nfunction FilterConditionRow({\n condition,\n columns,\n onChange,\n onRemove,\n}: FilterConditionRowProps) {\n const selectedColumn = columns.find((col) => col.id === condition.column)\n const availableOperators = selectedColumn\n ? OPERATORS_BY_TYPE[selectedColumn.type]\n : OPERATORS_BY_TYPE.text\n\n const needsValue = ![\"isEmpty\", \"isNotEmpty\"].includes(condition.operator)\n const needsSecondValue = [\"between\", \"dateBetween\"].includes(condition.operator)\n\n const handleColumnChange = (columnId: string) => {\n const newColumn = columns.find((col) => col.id === columnId)\n const newOperators = newColumn\n ? OPERATORS_BY_TYPE[newColumn.type]\n : OPERATORS_BY_TYPE.text\n\n onChange({\n ...condition,\n column: columnId,\n operator: newOperators[0] ?? \"equals\",\n value: \"\",\n value2: undefined,\n })\n }\n\n const handleOperatorChange = (operator: string) => {\n onChange({\n ...condition,\n operator: operator as FilterOperator,\n value: [\"isEmpty\", \"isNotEmpty\"].includes(operator) ? \"\" : condition.value,\n value2: undefined,\n })\n }\n\n const handleValueChange = (value: string) => {\n onChange({ ...condition, value })\n }\n\n const handleValue2Change = (value2: string) => {\n onChange({ ...condition, value2 })\n }\n\n return (\n <div\n aria-label={`Filter condition: ${selectedColumn?.label ?? \"Select column\"}`}\n className=\"flex flex-wrap items-center gap-2\"\n data-slot=\"filter-condition\"\n role=\"group\"\n >\n {/* Column Select */}\n <Select value={condition.column} onValueChange={handleColumnChange}>\n <SelectTrigger\n aria-label=\"Column\"\n className=\"w-36\"\n size=\"sm\"\n >\n <SelectValue placeholder=\"Select column\" />\n </SelectTrigger>\n <SelectContent>\n {columns.map((col) => (\n <SelectItem key={col.id} value={col.id}>\n {col.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Operator Select */}\n {condition.column && (\n <Select value={condition.operator} onValueChange={handleOperatorChange}>\n <SelectTrigger\n aria-label=\"Operator\"\n className=\"w-40\"\n size=\"sm\"\n >\n <SelectValue placeholder=\"Select operator\" />\n </SelectTrigger>\n <SelectContent>\n {availableOperators.map((op) => (\n <SelectItem key={op} value={op}>\n {OPERATOR_LABELS[op]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n\n {/* Value Input */}\n {needsValue && condition.column && (\n selectedColumn?.type === \"select\" && selectedColumn.options ? (\n <Select\n value={condition.value as string}\n onValueChange={handleValueChange}\n >\n <SelectTrigger\n aria-label=\"Value\"\n className=\"w-36\"\n size=\"sm\"\n >\n <SelectValue placeholder=\"Select value\" />\n </SelectTrigger>\n <SelectContent>\n {selectedColumn.options.map((option) => (\n <SelectItem key={option} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <TextInput\n aria-label=\"Value\"\n className=\"w-36\"\n placeholder=\"Enter value\"\n size=\"sm\"\n type={selectedColumn?.type === \"number\" ? \"number\" : selectedColumn?.type === \"date\" ? \"date\" : \"text\"}\n value={condition.value as string}\n onChange={(e) => { handleValueChange(e.target.value); }}\n />\n )\n )}\n\n {/* Second Value (for between operators) */}\n {needsSecondValue && condition.column && (\n <>\n <span className=\"text-sm text-[color:var(--text-muted)]\">and</span>\n <TextInput\n aria-label=\"Value\"\n className=\"w-36\"\n placeholder=\"Enter value\"\n size=\"sm\"\n type={selectedColumn?.type === \"number\" ? \"number\" : selectedColumn?.type === \"date\" ? \"date\" : \"text\"}\n value={typeof condition.value2 === \"string\" ? condition.value2 : typeof condition.value2 === \"number\" ? condition.value2.toString() : \"\"}\n onChange={(e) => { handleValue2Change(e.target.value); }}\n />\n </>\n )}\n\n {/* Remove Button */}\n <Button\n aria-label=\"Remove condition\"\n className=\"text-[color:var(--text-muted)] hover:text-[color:var(--text-destructive)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onRemove}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n )\n}\n\n// ============================================\n// FILTER GROUP COMPONENT\n// ============================================\n\ninterface FilterGroupComponentProps {\n columns: FilterBuilderColumn[]\n depth: number\n group: FilterGroup\n isRoot?: boolean\n onChange: (group: FilterGroup) => void\n onRemove?: () => void\n}\n\nfunction FilterGroupComponent({\n group,\n columns,\n depth,\n onChange,\n onRemove,\n isRoot = false,\n}: FilterGroupComponentProps) {\n const handleLogicToggle = () => {\n onChange({\n ...group,\n logic: group.logic === \"AND\" ? \"OR\" : \"AND\",\n })\n }\n\n const handleAddCondition = () => {\n const defaultColumn = columns[0]?.id ?? \"\"\n onChange({\n ...group,\n conditions: [...group.conditions, createEmptyCondition(defaultColumn)],\n })\n }\n\n const handleAddGroup = () => {\n onChange({\n ...group,\n conditions: [...group.conditions, createEmptyGroup()],\n })\n }\n\n const handleConditionChange = (index: number, item: FilterCondition | FilterGroup) => {\n const newConditions = [...group.conditions]\n newConditions[index] = item\n onChange({ ...group, conditions: newConditions })\n }\n\n const handleConditionRemove = (index: number) => {\n onChange({\n ...group,\n conditions: group.conditions.filter((_, i) => i !== index),\n })\n }\n\n return (\n <div\n className={cn(\n \"rounded-md border p-3\",\n isRoot\n ? \"border-[color:var(--border-default)] bg-[color:var(--surface-default)]\"\n : \"border-dashed border-[color:var(--border-muted)] bg-[color:var(--surface-muted)] ml-4\"\n )}\n aria-label={`Filter group with ${group.logic} logic`}\n data-slot=\"filter-group\"\n role=\"group\"\n >\n {/* Group Header */}\n <div className=\"mb-3 flex items-center gap-2\">\n {/* Logic Toggle */}\n <Button\n aria-label={group.logic}\n aria-pressed={group.logic === \"AND\"}\n className=\"min-w-16 font-medium\"\n size=\"sm\"\n type=\"button\"\n variant={group.logic === \"AND\" ? \"secondary-color\" : \"outline\"}\n onClick={handleLogicToggle}\n >\n {group.logic}\n </Button>\n\n {/* Remove Group Button */}\n {!isRoot && onRemove && (\n <Button\n aria-label=\"Remove group\"\n className=\"ml-auto text-[color:var(--text-muted)] hover:text-[color:var(--text-destructive)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onRemove}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )}\n </div>\n\n {/* Conditions */}\n <div className=\"space-y-2\">\n {group.conditions.length === 0 ? (\n <div className=\"py-4 text-center text-sm text-[color:var(--text-muted)]\">\n No conditions. Click "Add Condition" to create one.\n </div>\n ) : (\n group.conditions.map((item, index) => (\n <React.Fragment key={item.id}>\n {/* Logic label between conditions */}\n {index > 0 && (\n <div className=\"flex items-center gap-2 py-1\">\n <span className=\"text-xs font-medium uppercase text-[color:var(--text-muted)]\">\n {group.logic}\n </span>\n <div className=\"h-px flex-1 bg-[color:var(--border-muted)]\" />\n </div>\n )}\n\n {isFilterGroup(item) ? (\n <FilterGroupComponent\n columns={columns}\n depth={depth + 1}\n group={item}\n onChange={(updated) => { handleConditionChange(index, updated); }}\n onRemove={() => { handleConditionRemove(index); }}\n />\n ) : isFilterCondition(item) ? (\n <FilterConditionRow\n columns={columns}\n condition={item}\n onChange={(updated) => { handleConditionChange(index, updated); }}\n onRemove={() => { handleConditionRemove(index); }}\n />\n ) : null}\n </React.Fragment>\n ))\n )}\n </div>\n\n {/* Action Buttons */}\n <div className=\"mt-3 flex items-center gap-2\">\n <Button\n className=\"gap-1\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddCondition}\n >\n <PlusCircle className=\"size-3\" />\n Add Condition\n </Button>\n\n <Button\n className=\"gap-1\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddGroup}\n >\n <PlusCircle className=\"size-3\" />\n Add Group\n </Button>\n </div>\n </div>\n )\n}\n\n// ============================================\n// MAIN FILTER BUILDER COMPONENT\n// ============================================\n\n/**\n * FilterBuilder - Visual interface for building complex filter conditions\n *\n * Supports AND/OR logic with nested groups, multiple operators per field type,\n * and various value input types.\n *\n * @example\n * ```tsx\n * const columns = [\n * { id: \"name\", label: \"Name\", type: \"text\" },\n * { id: \"age\", label: \"Age\", type: \"number\" },\n * { id: \"status\", label: \"Status\", type: \"select\", options: [\"active\", \"inactive\"] },\n * ]\n *\n * <FilterBuilder\n * columns={columns}\n * filter={filter}\n * onFilterChange={setFilter}\n * />\n * ```\n */\nfunction FilterBuilder({\n className,\n columns,\n filter,\n onDeletePreset,\n onFilterChange,\n onSavePreset,\n presets,\n}: FilterBuilderProps) {\n const [presetName, setPresetName] = React.useState(\"\")\n const [showSaveInput, setShowSaveInput] = React.useState(false)\n\n const handleFilterChange = (updatedFilter: FilterGroup) => {\n onFilterChange(updatedFilter)\n }\n\n const handleSavePreset = () => {\n if (!onSavePreset || !presetName.trim()) return\n onSavePreset({\n id: Math.random().toString(36).slice(2, 11),\n name: presetName.trim(),\n filter: structuredClone(filter),\n })\n setPresetName(\"\")\n setShowSaveInput(false)\n }\n\n const handleLoadPreset = (preset: FilterPreset) => {\n onFilterChange(structuredClone(preset.filter))\n }\n\n return (\n <div\n aria-label=\"Filter builder\"\n className={cn(\"space-y-3\", className)}\n data-slot=\"filter-builder\"\n role=\"region\"\n >\n {/* Filter Presets */}\n {(presets && presets.length > 0) || onSavePreset ? (\n <div className=\"flex flex-wrap items-center gap-2\" data-slot=\"filter-presets\">\n {presets?.map((preset) => (\n <div key={preset.id} className=\"flex items-center gap-1\">\n <Button\n className=\"gap-1\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => { handleLoadPreset(preset); }}\n >\n {preset.name}\n </Button>\n {onDeletePreset && (\n <Button\n aria-label={`Delete preset ${preset.name}`}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => { onDeletePreset(preset.id); }}\n >\n <X className=\"size-3\" />\n </Button>\n )}\n </div>\n ))}\n {onSavePreset && (\n showSaveInput ? (\n <div className=\"flex items-center gap-1\">\n <TextInput\n aria-label=\"Preset name\"\n className=\"h-7 w-32\"\n placeholder=\"Preset name\"\n size=\"sm\"\n value={presetName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => { setPresetName(e.target.value); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") handleSavePreset()\n if (e.key === \"Escape\") { setShowSaveInput(false); setPresetName(\"\"); }\n }}\n />\n <Button\n disabled={!presetName.trim()}\n size=\"sm\"\n type=\"button\"\n variant=\"secondary-color\"\n onClick={handleSavePreset}\n >\n Save\n </Button>\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => { setShowSaveInput(false); setPresetName(\"\"); }}\n >\n Cancel\n </Button>\n </div>\n ) : (\n <Button\n className=\"gap-1\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => { setShowSaveInput(true); }}\n >\n <PlusCircle className=\"size-3\" />\n Save Preset\n </Button>\n )\n )}\n </div>\n ) : null}\n\n <FilterGroupComponent\n isRoot\n columns={columns}\n depth={0}\n group={filter}\n onChange={handleFilterChange}\n />\n </div>\n )\n}\n\nFilterBuilder.displayName = \"FilterBuilder\"\n\nexport { FilterBuilder }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/data-display/DataTable/FilterBuilder/FilterBuilder.types.ts","../src/components/data-display/DataTable/FilterBuilder/FilterBuilder.tsx"],"names":["Fragment"],"mappings":"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","file":"chunk-ZEFK3AXP.js","sourcesContent":["/**\n * Filter operators for different field types\n */\nexport type FilterOperator =\n // Text operators\n | \"after\"\n | \"before\"\n | \"between\"\n | \"contains\"\n | \"dateBetween\"\n | \"endsWith\"\n | \"equals\"\n | \"gt\"\n // Number operators\n | \"gte\"\n | \"in\"\n | \"isEmpty\"\n | \"isNotEmpty\"\n | \"lt\"\n // Date operators\n | \"lte\"\n | \"notContains\"\n | \"notEquals\"\n // Select operators\n | \"notIn\"\n | \"startsWith\"\n\n/**\n * A single filter condition\n */\nexport interface FilterCondition {\n /** Column/field to filter on */\n column: string\n /** Unique identifier for the condition */\n id: string\n /** Comparison operator */\n operator: FilterOperator\n /** Primary value for comparison */\n value: unknown\n /** Secondary value for \"between\" operators */\n value2?: unknown\n}\n\n/**\n * A group of filter conditions with AND/OR logic\n */\nexport interface FilterGroup {\n /** Conditions or nested groups */\n conditions: (FilterCondition | FilterGroup)[]\n /** Unique identifier for the group */\n id: string\n /** Logical operator for combining conditions */\n logic: \"AND\" | \"OR\"\n}\n\n/**\n * A saved filter preset\n */\nexport interface FilterPreset {\n /** The filter configuration */\n filter: FilterGroup\n /** Unique identifier for the preset */\n id: string\n /** Display name for the preset */\n name: string\n}\n\n/**\n * Column configuration for the filter builder\n */\nexport interface FilterBuilderColumn {\n /** Column identifier */\n id: string\n /** Display label */\n label: string\n /** Options for select type columns */\n options?: string[]\n /** Data type for operator selection */\n type: \"date\" | \"number\" | \"select\" | \"text\"\n}\n\n/**\n * FilterBuilder component props\n */\nexport interface FilterBuilderProps {\n /** Additional CSS classes */\n className?: string\n /** Available columns for filtering */\n columns: FilterBuilderColumn[]\n /** Current filter configuration */\n filter: FilterGroup\n /** Callback to delete a preset */\n onDeletePreset?: (presetId: string) => void\n /** Callback when filter changes */\n onFilterChange: (filter: FilterGroup) => void\n /** Callback to save a new preset */\n onSavePreset?: (preset: FilterPreset) => void\n /** Saved filter presets */\n presets?: FilterPreset[]\n}\n\n/**\n * Type guard to check if an item is a FilterGroup\n */\nexport function isFilterGroup(\n item: FilterCondition | FilterGroup\n): item is FilterGroup {\n return \"logic\" in item && \"conditions\" in item\n}\n\n/**\n * Type guard to check if an item is a FilterCondition\n */\nexport function isFilterCondition(\n item: FilterCondition | FilterGroup\n): item is FilterCondition {\n return \"column\" in item && \"operator\" in item\n}\n","// FilterBuilder/FilterBuilder.tsx\n\"use client\"\n\nimport type {\n FilterBuilderColumn,\n FilterBuilderProps,\n FilterCondition,\n FilterGroup,\n FilterOperator,\n FilterPreset,\n} from \"./FilterBuilder.types\"\n\nimport { PlusCircle, Trash2, X } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../../lib/utils\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../../forms/Select\"\nimport { TextInput } from \"../../../forms/TextInput\"\nimport { Button } from \"../../../primitives/Button\"\nimport { isFilterCondition, isFilterGroup } from \"./FilterBuilder.types\"\n\n// ============================================\n// CONSTANTS\n// ============================================\n\n/**\n * Operator labels for display\n */\nconst OPERATOR_LABELS: Record<FilterOperator, string> = {\n // Text\n contains: \"Contains\",\n notContains: \"Does not contain\",\n equals: \"Equals\",\n notEquals: \"Does not equal\",\n startsWith: \"Starts with\",\n endsWith: \"Ends with\",\n isEmpty: \"Is empty\",\n isNotEmpty: \"Is not empty\",\n // Number\n gt: \"Greater than\",\n gte: \"Greater than or equal\",\n lt: \"Less than\",\n lte: \"Less than or equal\",\n between: \"Between\",\n // Date\n before: \"Before\",\n after: \"After\",\n dateBetween: \"Date between\",\n // Select\n in: \"Is any of\",\n notIn: \"Is none of\",\n}\n\n/**\n * Operators available by column type\n */\nconst OPERATORS_BY_TYPE: Record<FilterBuilderColumn[\"type\"], FilterOperator[]> = {\n text: [\"contains\", \"notContains\", \"equals\", \"notEquals\", \"startsWith\", \"endsWith\", \"isEmpty\", \"isNotEmpty\"],\n number: [\"equals\", \"notEquals\", \"gt\", \"gte\", \"lt\", \"lte\", \"between\"],\n date: [\"equals\", \"notEquals\", \"before\", \"after\", \"dateBetween\"],\n select: [\"equals\", \"notEquals\", \"in\", \"notIn\"],\n}\n\n/**\n * Generate a unique ID\n */\nfunction generateId(): string {\n return Math.random().toString(36).slice(2, 11)\n}\n\n/**\n * Create an empty condition\n */\nfunction createEmptyCondition(columnId?: string): FilterCondition {\n return {\n id: generateId(),\n column: columnId ?? \"\",\n operator: \"contains\",\n value: \"\",\n }\n}\n\n/**\n * Create an empty group\n */\nfunction createEmptyGroup(): FilterGroup {\n return {\n id: generateId(),\n logic: \"AND\",\n conditions: [],\n }\n}\n\n// ============================================\n// FILTER CONDITION COMPONENT\n// ============================================\n\ninterface FilterConditionRowProps {\n columns: FilterBuilderColumn[]\n condition: FilterCondition\n onChange: (condition: FilterCondition) => void\n onRemove: () => void\n}\n\nfunction FilterConditionRow({\n condition,\n columns,\n onChange,\n onRemove,\n}: FilterConditionRowProps) {\n const selectedColumn = columns.find((col) => col.id === condition.column)\n const availableOperators = selectedColumn\n ? OPERATORS_BY_TYPE[selectedColumn.type]\n : OPERATORS_BY_TYPE.text\n\n const needsValue = ![\"isEmpty\", \"isNotEmpty\"].includes(condition.operator)\n const needsSecondValue = [\"between\", \"dateBetween\"].includes(condition.operator)\n\n const handleColumnChange = (columnId: string) => {\n const newColumn = columns.find((col) => col.id === columnId)\n const newOperators = newColumn\n ? OPERATORS_BY_TYPE[newColumn.type]\n : OPERATORS_BY_TYPE.text\n\n onChange({\n ...condition,\n column: columnId,\n operator: newOperators[0] ?? \"equals\",\n value: \"\",\n value2: undefined,\n })\n }\n\n const handleOperatorChange = (operator: string) => {\n onChange({\n ...condition,\n operator: operator as FilterOperator,\n value: [\"isEmpty\", \"isNotEmpty\"].includes(operator) ? \"\" : condition.value,\n value2: undefined,\n })\n }\n\n const handleValueChange = (value: string) => {\n onChange({ ...condition, value })\n }\n\n const handleValue2Change = (value2: string) => {\n onChange({ ...condition, value2 })\n }\n\n return (\n <div\n aria-label={`Filter condition: ${selectedColumn?.label ?? \"Select column\"}`}\n className=\"flex flex-wrap items-center gap-2\"\n data-slot=\"filter-condition\"\n role=\"group\"\n >\n {/* Column Select */}\n <Select value={condition.column} onValueChange={handleColumnChange}>\n <SelectTrigger\n aria-label=\"Column\"\n className=\"w-36\"\n size=\"sm\"\n >\n <SelectValue placeholder=\"Select column\" />\n </SelectTrigger>\n <SelectContent>\n {columns.map((col) => (\n <SelectItem key={col.id} value={col.id}>\n {col.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Operator Select */}\n {condition.column && (\n <Select value={condition.operator} onValueChange={handleOperatorChange}>\n <SelectTrigger\n aria-label=\"Operator\"\n className=\"w-40\"\n size=\"sm\"\n >\n <SelectValue placeholder=\"Select operator\" />\n </SelectTrigger>\n <SelectContent>\n {availableOperators.map((op) => (\n <SelectItem key={op} value={op}>\n {OPERATOR_LABELS[op]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n\n {/* Value Input */}\n {needsValue && condition.column && (\n selectedColumn?.type === \"select\" && selectedColumn.options ? (\n <Select\n value={condition.value as string}\n onValueChange={handleValueChange}\n >\n <SelectTrigger\n aria-label=\"Value\"\n className=\"w-36\"\n size=\"sm\"\n >\n <SelectValue placeholder=\"Select value\" />\n </SelectTrigger>\n <SelectContent>\n {selectedColumn.options.map((option) => (\n <SelectItem key={option} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <TextInput\n aria-label=\"Value\"\n className=\"w-36\"\n placeholder=\"Enter value\"\n size=\"sm\"\n type={selectedColumn?.type === \"number\" ? \"number\" : selectedColumn?.type === \"date\" ? \"date\" : \"text\"}\n value={condition.value as string}\n onChange={(e) => { handleValueChange(e.target.value); }}\n />\n )\n )}\n\n {/* Second Value (for between operators) */}\n {needsSecondValue && condition.column && (\n <>\n <span className=\"text-sm text-[color:var(--text-muted)]\">and</span>\n <TextInput\n aria-label=\"Value\"\n className=\"w-36\"\n placeholder=\"Enter value\"\n size=\"sm\"\n type={selectedColumn?.type === \"number\" ? \"number\" : selectedColumn?.type === \"date\" ? \"date\" : \"text\"}\n value={typeof condition.value2 === \"string\" ? condition.value2 : typeof condition.value2 === \"number\" ? condition.value2.toString() : \"\"}\n onChange={(e) => { handleValue2Change(e.target.value); }}\n />\n </>\n )}\n\n {/* Remove Button */}\n <Button\n aria-label=\"Remove condition\"\n className=\"text-[color:var(--text-muted)] hover:text-[color:var(--text-destructive)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onRemove}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n )\n}\n\n// ============================================\n// FILTER GROUP COMPONENT\n// ============================================\n\ninterface FilterGroupComponentProps {\n columns: FilterBuilderColumn[]\n depth: number\n group: FilterGroup\n isRoot?: boolean\n onChange: (group: FilterGroup) => void\n onRemove?: () => void\n}\n\nfunction FilterGroupComponent({\n group,\n columns,\n depth,\n onChange,\n onRemove,\n isRoot = false,\n}: FilterGroupComponentProps) {\n const handleLogicToggle = () => {\n onChange({\n ...group,\n logic: group.logic === \"AND\" ? \"OR\" : \"AND\",\n })\n }\n\n const handleAddCondition = () => {\n const defaultColumn = columns[0]?.id ?? \"\"\n onChange({\n ...group,\n conditions: [...group.conditions, createEmptyCondition(defaultColumn)],\n })\n }\n\n const handleAddGroup = () => {\n onChange({\n ...group,\n conditions: [...group.conditions, createEmptyGroup()],\n })\n }\n\n const handleConditionChange = (index: number, item: FilterCondition | FilterGroup) => {\n const newConditions = [...group.conditions]\n newConditions[index] = item\n onChange({ ...group, conditions: newConditions })\n }\n\n const handleConditionRemove = (index: number) => {\n onChange({\n ...group,\n conditions: group.conditions.filter((_, i) => i !== index),\n })\n }\n\n return (\n <div\n className={cn(\n \"rounded-md border p-3\",\n isRoot\n ? \"border-[color:var(--border-default)] bg-[color:var(--surface-default)]\"\n : \"border-dashed border-[color:var(--border-muted)] bg-[color:var(--surface-muted)] ml-4\"\n )}\n aria-label={`Filter group with ${group.logic} logic`}\n data-slot=\"filter-group\"\n role=\"group\"\n >\n {/* Group Header */}\n <div className=\"mb-3 flex items-center gap-2\">\n {/* Logic Toggle */}\n <Button\n aria-label={group.logic}\n aria-pressed={group.logic === \"AND\"}\n className=\"min-w-16 font-medium\"\n size=\"sm\"\n type=\"button\"\n variant={group.logic === \"AND\" ? \"secondary-color\" : \"outline\"}\n onClick={handleLogicToggle}\n >\n {group.logic}\n </Button>\n\n {/* Remove Group Button */}\n {!isRoot && onRemove && (\n <Button\n aria-label=\"Remove group\"\n className=\"ml-auto text-[color:var(--text-muted)] hover:text-[color:var(--text-destructive)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onRemove}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )}\n </div>\n\n {/* Conditions */}\n <div className=\"space-y-2\">\n {group.conditions.length === 0 ? (\n <div className=\"py-4 text-center text-sm text-[color:var(--text-muted)]\">\n No conditions. Click "Add Condition" to create one.\n </div>\n ) : (\n group.conditions.map((item, index) => (\n <React.Fragment key={item.id}>\n {/* Logic label between conditions */}\n {index > 0 && (\n <div className=\"flex items-center gap-2 py-1\">\n <span className=\"text-xs font-medium uppercase text-[color:var(--text-muted)]\">\n {group.logic}\n </span>\n <div className=\"h-px flex-1 bg-[color:var(--border-muted)]\" />\n </div>\n )}\n\n {isFilterGroup(item) ? (\n <FilterGroupComponent\n columns={columns}\n depth={depth + 1}\n group={item}\n onChange={(updated) => { handleConditionChange(index, updated); }}\n onRemove={() => { handleConditionRemove(index); }}\n />\n ) : isFilterCondition(item) ? (\n <FilterConditionRow\n columns={columns}\n condition={item}\n onChange={(updated) => { handleConditionChange(index, updated); }}\n onRemove={() => { handleConditionRemove(index); }}\n />\n ) : null}\n </React.Fragment>\n ))\n )}\n </div>\n\n {/* Action Buttons */}\n <div className=\"mt-3 flex items-center gap-2\">\n <Button\n className=\"gap-1\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddCondition}\n >\n <PlusCircle className=\"size-3\" />\n Add Condition\n </Button>\n\n <Button\n className=\"gap-1\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddGroup}\n >\n <PlusCircle className=\"size-3\" />\n Add Group\n </Button>\n </div>\n </div>\n )\n}\n\n// ============================================\n// MAIN FILTER BUILDER COMPONENT\n// ============================================\n\n/**\n * FilterBuilder - Visual interface for building complex filter conditions\n *\n * Supports AND/OR logic with nested groups, multiple operators per field type,\n * and various value input types.\n *\n * @example\n * ```tsx\n * const columns = [\n * { id: \"name\", label: \"Name\", type: \"text\" },\n * { id: \"age\", label: \"Age\", type: \"number\" },\n * { id: \"status\", label: \"Status\", type: \"select\", options: [\"active\", \"inactive\"] },\n * ]\n *\n * <FilterBuilder\n * columns={columns}\n * filter={filter}\n * onFilterChange={setFilter}\n * />\n * ```\n */\nfunction FilterBuilder({\n className,\n columns,\n filter,\n onDeletePreset,\n onFilterChange,\n onSavePreset,\n presets,\n}: FilterBuilderProps) {\n const [presetName, setPresetName] = React.useState(\"\")\n const [showSaveInput, setShowSaveInput] = React.useState(false)\n\n const handleFilterChange = (updatedFilter: FilterGroup) => {\n onFilterChange(updatedFilter)\n }\n\n const handleSavePreset = () => {\n if (!onSavePreset || !presetName.trim()) return\n onSavePreset({\n id: Math.random().toString(36).slice(2, 11),\n name: presetName.trim(),\n filter: structuredClone(filter),\n })\n setPresetName(\"\")\n setShowSaveInput(false)\n }\n\n const handleLoadPreset = (preset: FilterPreset) => {\n onFilterChange(structuredClone(preset.filter))\n }\n\n return (\n <div\n aria-label=\"Filter builder\"\n className={cn(\"space-y-3\", className)}\n data-slot=\"filter-builder\"\n role=\"region\"\n >\n {/* Filter Presets */}\n {(presets && presets.length > 0) || onSavePreset ? (\n <div className=\"flex flex-wrap items-center gap-2\" data-slot=\"filter-presets\">\n {presets?.map((preset) => (\n <div key={preset.id} className=\"flex items-center gap-1\">\n <Button\n className=\"gap-1\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => { handleLoadPreset(preset); }}\n >\n {preset.name}\n </Button>\n {onDeletePreset && (\n <Button\n aria-label={`Delete preset ${preset.name}`}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => { onDeletePreset(preset.id); }}\n >\n <X className=\"size-3\" />\n </Button>\n )}\n </div>\n ))}\n {onSavePreset && (\n showSaveInput ? (\n <div className=\"flex items-center gap-1\">\n <TextInput\n aria-label=\"Preset name\"\n className=\"h-7 w-32\"\n placeholder=\"Preset name\"\n size=\"sm\"\n value={presetName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => { setPresetName(e.target.value); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") handleSavePreset()\n if (e.key === \"Escape\") { setShowSaveInput(false); setPresetName(\"\"); }\n }}\n />\n <Button\n disabled={!presetName.trim()}\n size=\"sm\"\n type=\"button\"\n variant=\"secondary-color\"\n onClick={handleSavePreset}\n >\n Save\n </Button>\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => { setShowSaveInput(false); setPresetName(\"\"); }}\n >\n Cancel\n </Button>\n </div>\n ) : (\n <Button\n className=\"gap-1\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => { setShowSaveInput(true); }}\n >\n <PlusCircle className=\"size-3\" />\n Save Preset\n </Button>\n )\n )}\n </div>\n ) : null}\n\n <FilterGroupComponent\n isRoot\n columns={columns}\n depth={0}\n group={filter}\n onChange={handleFilterChange}\n />\n </div>\n )\n}\n\nFilterBuilder.displayName = \"FilterBuilder\"\n\nexport { FilterBuilder }\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SkeletonLoader } from './chunk-QHKOBGLW.js';
|
|
2
|
-
import { Badge } from './chunk-
|
|
2
|
+
import { Badge } from './chunk-UDY3IDCY.js';
|
|
3
3
|
import { cn } from './chunk-HRNDJU7D.js';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import { cva } from 'class-variance-authority';
|
|
@@ -194,5 +194,5 @@ function ChartCard({
|
|
|
194
194
|
ChartCard.displayName = "ChartCard";
|
|
195
195
|
|
|
196
196
|
export { ChartCard, chartCardChartVariants, chartCardHeaderVariants, chartCardPreviousValueVariants, chartCardTitleVariants, chartCardValueContainerVariants, chartCardValueVariants, chartCardVariants };
|
|
197
|
-
//# sourceMappingURL=chunk-
|
|
198
|
-
//# sourceMappingURL=chunk-
|
|
197
|
+
//# sourceMappingURL=chunk-ZEYLSDSG.js.map
|
|
198
|
+
//# sourceMappingURL=chunk-ZEYLSDSG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/ChartCard/ChartCard.variants.ts","../src/components/data-display/ChartCard/ChartCard.tsx"],"names":[],"mappings":"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","file":"chunk-L3Z5FAJE.js","sourcesContent":["// ChartCard/ChartCard.variants.ts\nimport { cva } from \"class-variance-authority\"\n\n/**\n * ChartCard container variants.\n *\n * Consumes the `--chart-card-*` component tokens (DES-1253). The Figma container\n * is flat — background + radius + asymmetric padding, no border or shadow — so the\n * base styles render that container and `outlined` / `elevated` are code-only\n * extensions (documented in the README) layered on top.\n */\nexport const chartCardVariants = cva(\n \"rounded-[var(--chart-card-radius)] bg-[color:var(--chart-card-bg)] px-[var(--chart-card-padding-x)] pt-[var(--chart-card-padding-top)] pb-[var(--chart-card-padding-bottom)] text-[color:var(--chart-card-fg)] transition\",\n {\n variants: {\n variant: {\n default: \"\",\n outlined: \"border border-[color:var(--chart-card-border)]\",\n elevated: \"shadow-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * ChartCard header (Title Row) — leading group (featured icon + title + badge)\n * and an optional trailing overflow action.\n */\nexport const chartCardHeaderVariants = cva(\n \"flex items-center justify-between gap-x-2\"\n)\n\n/**\n * ChartCard title — Figma Heading/H5 (18px / 24px / SemiBold), tokenised.\n */\nexport const chartCardTitleVariants = cva(\n \"text-[length:var(--chart-card-title-size)] font-[var(--chart-card-title-weight)] leading-[var(--chart-card-title-line-height)] text-[color:var(--chart-card-title-color)]\"\n)\n\n/**\n * ChartCard value container.\n */\nexport const chartCardValueContainerVariants = cva(\n \"mt-2 flex items-baseline justify-between\"\n)\n\n/**\n * ChartCard KPI value text — tokenised size + color.\n */\nexport const chartCardValueVariants = cva(\n \"text-[length:var(--chart-card-value-size)] text-[color:var(--chart-card-value-color)]\"\n)\n\n/**\n * ChartCard previous-value caption.\n */\nexport const chartCardPreviousValueVariants = cva(\n \"text-sm text-[color:var(--chart-card-previous-color)]\"\n)\n\n/**\n * ChartCard chart-slot wrapper — 24px row gap + tokenised area height\n * (`--chart-card-chart-height`). The injected chart fills the area via\n * `[&>*]:h-full`; the `chartHeight` prop overrides the height.\n */\nexport const chartCardChartVariants = cva(\n \"mt-[var(--chart-card-gap)] h-[var(--chart-card-chart-height)] [&>*]:h-full\"\n)\n","// ChartCard/ChartCard.tsx\n\"use client\"\n\nimport type { ChartCardProps, ChartCardValueFormatter } from \"./ChartCard.types\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Badge } from \"../../primitives/Badge\"\nimport { SkeletonLoader } from \"../../primitives/SkeletonLoader\"\nimport {\n chartCardChartVariants,\n chartCardHeaderVariants,\n chartCardPreviousValueVariants,\n chartCardTitleVariants,\n chartCardValueContainerVariants,\n chartCardValueVariants,\n chartCardVariants,\n} from \"./ChartCard.variants\"\n\n/**\n * Default value formatter (returns value as string)\n */\nconst defaultFormatter: ChartCardValueFormatter = (value) => String(value)\n\n/**\n * Get badge color based on evolution percentage\n */\nfunction getBadgeColor(value: number): \"destructive\" | \"muted\" | \"success\" | \"warning\" {\n if (value > 0) {\n return \"success\"\n } else if (value < 0) {\n if (value < -50) {\n return \"warning\"\n }\n return \"destructive\"\n }\n return \"muted\"\n}\n\n/**\n * Format percentage for display\n */\nfunction formatPercentage(value: number): string {\n const sign = value > 0 ? \"+\" : \"\"\n return `${sign}${(value * 100).toFixed(1)}%`\n}\n\n/**\n * ChartCard - Dashboard KPI widget with a chart-agnostic slot.\n *\n * Renders a KPI value with an auto evolution badge and optional comparison\n * period. The chart itself is **injected by the consumer** via the `chart`\n * slot — ChartCard ships no default chart (DES-1253). The Title Row exposes\n * `featuredIcon` + `headerAction` (overflow) slots, with optional `tabs` and\n * `footer` composition slots below.\n *\n * @example\n * ```tsx\n * const data = [\n * { formattedDate: \"01/01\", value: 1000, previousValue: 900 },\n * { formattedDate: \"02/01\", value: 1200, previousValue: 1100 },\n * ]\n *\n * <ChartCard\n * title=\"Revenue\"\n * data={data}\n * comparisonPeriod=\"previous-year\"\n * valueFormatter={(v) => `$${v.toLocaleString()}`}\n * chart={\n * <LineChart\n * className=\"h-full\"\n * data={data}\n * config={{ value: { label: \"Current\" } }}\n * series={[\"value\"]}\n * />\n * }\n * />\n * ```\n */\nfunction ChartCard({\n badge,\n chart,\n chartHeight,\n className,\n comparisonPeriod = \"no-comparison\",\n data,\n emptyMessage,\n featuredIcon,\n footer,\n headerAction,\n isThumbnail = false,\n loading = false,\n tabs,\n title,\n valueFormatter = defaultFormatter,\n variant,\n ...props\n}: ChartCardProps) {\n const isEmpty = !loading && data.length === 0\n\n // Calculate totals\n const totalValue = React.useMemo(() => {\n return data.reduce((acc, item) => acc + (item.value ?? 0), 0)\n }, [data])\n\n const totalPreviousValue = React.useMemo(() => {\n return data.reduce((acc, item) => acc + (item.previousValue ?? 0), 0)\n }, [data])\n\n // Calculate evolution percentage\n const evolution = React.useMemo(() => {\n if (comparisonPeriod === \"no-comparison\" || totalPreviousValue === 0) {\n return 0\n }\n return (totalValue - totalPreviousValue) / totalPreviousValue\n }, [comparisonPeriod, totalPreviousValue, totalValue])\n\n // Show comparison UI elements\n const showComparison = comparisonPeriod !== \"no-comparison\"\n\n // Title Row leading slots (featured icon + title), shared across states.\n const titleLead = (\n <div className=\"flex items-center gap-x-2\">\n {featuredIcon && (\n <span data-slot=\"chart-card-featured-icon\">{featuredIcon}</span>\n )}\n <h3 className={cn(chartCardTitleVariants())} data-slot=\"chart-card-title\">\n {title}\n </h3>\n </div>\n )\n\n // Empty state (DES-1254 item 3 — Figma Empty State)\n if (isEmpty) {\n return (\n <article\n aria-label={`${title}: empty`}\n className={cn(chartCardVariants({ variant }), className)}\n data-empty=\"true\"\n data-slot=\"chart-card\"\n {...props}\n >\n <div className={cn(chartCardHeaderVariants())} data-slot=\"chart-card-header\">\n {titleLead}\n {headerAction && (\n <span data-slot=\"chart-card-header-action\">{headerAction}</span>\n )}\n </div>\n <div\n className={cn(\n chartCardChartVariants(),\n chartHeight,\n \"flex items-center justify-center text-[length:var(--chart-card-empty-state-caption-size)] text-[color:var(--chart-card-empty-state-caption-color)]\"\n )}\n data-slot=\"chart-card-empty\"\n >\n {emptyMessage ?? \"No data available\"}\n </div>\n </article>\n )\n }\n\n // Loading state\n if (loading) {\n return (\n <article\n aria-busy=\"true\"\n className={cn(chartCardVariants({ variant }), className)}\n data-slot=\"chart-card\"\n {...props}\n >\n <div className={cn(chartCardHeaderVariants())} data-slot=\"chart-card-header\">\n <SkeletonLoader className=\"h-4 w-24\" />\n <SkeletonLoader className=\"h-5 w-12\" />\n </div>\n <div\n className={cn(chartCardValueContainerVariants())}\n data-slot=\"chart-card-value\"\n >\n <SkeletonLoader className=\"h-7 w-32\" />\n </div>\n <div className={cn(chartCardChartVariants(), chartHeight)}>\n <SkeletonLoader className=\"h-full w-full\" />\n </div>\n </article>\n )\n }\n\n return (\n <article\n aria-label={`${title}: ${valueFormatter(totalValue)}`}\n className={cn(chartCardVariants({ variant }), className)}\n data-slot=\"chart-card\"\n {...props}\n >\n {/* Title Row — featured icon + title + badge / overflow action */}\n <div className={cn(chartCardHeaderVariants())} data-slot=\"chart-card-header\">\n <div className=\"flex items-center gap-x-2\">\n {featuredIcon && (\n <span data-slot=\"chart-card-featured-icon\">{featuredIcon}</span>\n )}\n <h3 className={cn(chartCardTitleVariants())} data-slot=\"chart-card-title\">\n {title}\n </h3>\n {showComparison && (\n badge ?? (\n <Badge color={getBadgeColor(evolution)} size=\"sm\">\n {formatPercentage(evolution)}\n </Badge>\n )\n )}\n </div>\n {headerAction && (\n <span data-slot=\"chart-card-header-action\">{headerAction}</span>\n )}\n </div>\n\n {/* Value display */}\n <div\n className={cn(chartCardValueContainerVariants())}\n data-slot=\"chart-card-value\"\n >\n <p className={cn(chartCardValueVariants())}>\n {valueFormatter(totalValue)}\n </p>\n {showComparison && (\n <p className={cn(chartCardPreviousValueVariants())}>\n from {valueFormatter(totalPreviousValue)}\n </p>\n )}\n </div>\n\n {/* Tabs row slot (Figma showTabs) */}\n {tabs && (\n <div className=\"mt-[var(--chart-card-gap)]\" data-slot=\"chart-card-tabs\">\n {tabs}\n </div>\n )}\n\n {/* Chart slot — injected by the consumer (chart-agnostic) */}\n {!isThumbnail && chart && (\n <div\n className={cn(chartCardChartVariants(), chartHeight)}\n data-slot=\"chart-card-chart\"\n >\n {chart}\n </div>\n )}\n\n {/* Card Footer slot (Figma showCardFooter — trend + total) */}\n {footer && (\n <div className=\"mt-[var(--chart-card-gap)]\" data-slot=\"chart-card-footer\">\n {footer}\n </div>\n )}\n </article>\n )\n}\n\nChartCard.displayName = \"ChartCard\"\n\nexport { ChartCard }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/data-display/ChartCard/ChartCard.variants.ts","../src/components/data-display/ChartCard/ChartCard.tsx"],"names":[],"mappings":"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","file":"chunk-ZEYLSDSG.js","sourcesContent":["// ChartCard/ChartCard.variants.ts\nimport { cva } from \"class-variance-authority\"\n\n/**\n * ChartCard container variants.\n *\n * Consumes the `--chart-card-*` component tokens (DES-1253). The Figma container\n * is flat — background + radius + asymmetric padding, no border or shadow — so the\n * base styles render that container and `outlined` / `elevated` are code-only\n * extensions (documented in the README) layered on top.\n */\nexport const chartCardVariants = cva(\n \"rounded-[var(--chart-card-radius)] bg-[color:var(--chart-card-bg)] px-[var(--chart-card-padding-x)] pt-[var(--chart-card-padding-top)] pb-[var(--chart-card-padding-bottom)] text-[color:var(--chart-card-fg)] transition\",\n {\n variants: {\n variant: {\n default: \"\",\n outlined: \"border border-[color:var(--chart-card-border)]\",\n elevated: \"shadow-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * ChartCard header (Title Row) — leading group (featured icon + title + badge)\n * and an optional trailing overflow action.\n */\nexport const chartCardHeaderVariants = cva(\n \"flex items-center justify-between gap-x-2\"\n)\n\n/**\n * ChartCard title — Figma Heading/H5 (18px / 24px / SemiBold), tokenised.\n */\nexport const chartCardTitleVariants = cva(\n \"text-[length:var(--chart-card-title-size)] font-[var(--chart-card-title-weight)] leading-[var(--chart-card-title-line-height)] text-[color:var(--chart-card-title-color)]\"\n)\n\n/**\n * ChartCard value container.\n */\nexport const chartCardValueContainerVariants = cva(\n \"mt-2 flex items-baseline justify-between\"\n)\n\n/**\n * ChartCard KPI value text — tokenised size + color.\n */\nexport const chartCardValueVariants = cva(\n \"text-[length:var(--chart-card-value-size)] text-[color:var(--chart-card-value-color)]\"\n)\n\n/**\n * ChartCard previous-value caption.\n */\nexport const chartCardPreviousValueVariants = cva(\n \"text-sm text-[color:var(--chart-card-previous-color)]\"\n)\n\n/**\n * ChartCard chart-slot wrapper — 24px row gap + tokenised area height\n * (`--chart-card-chart-height`). The injected chart fills the area via\n * `[&>*]:h-full`; the `chartHeight` prop overrides the height.\n */\nexport const chartCardChartVariants = cva(\n \"mt-[var(--chart-card-gap)] h-[var(--chart-card-chart-height)] [&>*]:h-full\"\n)\n","// ChartCard/ChartCard.tsx\n\"use client\"\n\nimport type { ChartCardProps, ChartCardValueFormatter } from \"./ChartCard.types\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Badge } from \"../../primitives/Badge\"\nimport { SkeletonLoader } from \"../../primitives/SkeletonLoader\"\nimport {\n chartCardChartVariants,\n chartCardHeaderVariants,\n chartCardPreviousValueVariants,\n chartCardTitleVariants,\n chartCardValueContainerVariants,\n chartCardValueVariants,\n chartCardVariants,\n} from \"./ChartCard.variants\"\n\n/**\n * Default value formatter (returns value as string)\n */\nconst defaultFormatter: ChartCardValueFormatter = (value) => String(value)\n\n/**\n * Get badge color based on evolution percentage\n */\nfunction getBadgeColor(value: number): \"destructive\" | \"muted\" | \"success\" | \"warning\" {\n if (value > 0) {\n return \"success\"\n } else if (value < 0) {\n if (value < -50) {\n return \"warning\"\n }\n return \"destructive\"\n }\n return \"muted\"\n}\n\n/**\n * Format percentage for display\n */\nfunction formatPercentage(value: number): string {\n const sign = value > 0 ? \"+\" : \"\"\n return `${sign}${(value * 100).toFixed(1)}%`\n}\n\n/**\n * ChartCard - Dashboard KPI widget with a chart-agnostic slot.\n *\n * Renders a KPI value with an auto evolution badge and optional comparison\n * period. The chart itself is **injected by the consumer** via the `chart`\n * slot — ChartCard ships no default chart (DES-1253). The Title Row exposes\n * `featuredIcon` + `headerAction` (overflow) slots, with optional `tabs` and\n * `footer` composition slots below.\n *\n * @example\n * ```tsx\n * const data = [\n * { formattedDate: \"01/01\", value: 1000, previousValue: 900 },\n * { formattedDate: \"02/01\", value: 1200, previousValue: 1100 },\n * ]\n *\n * <ChartCard\n * title=\"Revenue\"\n * data={data}\n * comparisonPeriod=\"previous-year\"\n * valueFormatter={(v) => `$${v.toLocaleString()}`}\n * chart={\n * <LineChart\n * className=\"h-full\"\n * data={data}\n * config={{ value: { label: \"Current\" } }}\n * series={[\"value\"]}\n * />\n * }\n * />\n * ```\n */\nfunction ChartCard({\n badge,\n chart,\n chartHeight,\n className,\n comparisonPeriod = \"no-comparison\",\n data,\n emptyMessage,\n featuredIcon,\n footer,\n headerAction,\n isThumbnail = false,\n loading = false,\n tabs,\n title,\n valueFormatter = defaultFormatter,\n variant,\n ...props\n}: ChartCardProps) {\n const isEmpty = !loading && data.length === 0\n\n // Calculate totals\n const totalValue = React.useMemo(() => {\n return data.reduce((acc, item) => acc + (item.value ?? 0), 0)\n }, [data])\n\n const totalPreviousValue = React.useMemo(() => {\n return data.reduce((acc, item) => acc + (item.previousValue ?? 0), 0)\n }, [data])\n\n // Calculate evolution percentage\n const evolution = React.useMemo(() => {\n if (comparisonPeriod === \"no-comparison\" || totalPreviousValue === 0) {\n return 0\n }\n return (totalValue - totalPreviousValue) / totalPreviousValue\n }, [comparisonPeriod, totalPreviousValue, totalValue])\n\n // Show comparison UI elements\n const showComparison = comparisonPeriod !== \"no-comparison\"\n\n // Title Row leading slots (featured icon + title), shared across states.\n const titleLead = (\n <div className=\"flex items-center gap-x-2\">\n {featuredIcon && (\n <span data-slot=\"chart-card-featured-icon\">{featuredIcon}</span>\n )}\n <h3 className={cn(chartCardTitleVariants())} data-slot=\"chart-card-title\">\n {title}\n </h3>\n </div>\n )\n\n // Empty state (DES-1254 item 3 — Figma Empty State)\n if (isEmpty) {\n return (\n <article\n aria-label={`${title}: empty`}\n className={cn(chartCardVariants({ variant }), className)}\n data-empty=\"true\"\n data-slot=\"chart-card\"\n {...props}\n >\n <div className={cn(chartCardHeaderVariants())} data-slot=\"chart-card-header\">\n {titleLead}\n {headerAction && (\n <span data-slot=\"chart-card-header-action\">{headerAction}</span>\n )}\n </div>\n <div\n className={cn(\n chartCardChartVariants(),\n chartHeight,\n \"flex items-center justify-center text-[length:var(--chart-card-empty-state-caption-size)] text-[color:var(--chart-card-empty-state-caption-color)]\"\n )}\n data-slot=\"chart-card-empty\"\n >\n {emptyMessage ?? \"No data available\"}\n </div>\n </article>\n )\n }\n\n // Loading state\n if (loading) {\n return (\n <article\n aria-busy=\"true\"\n className={cn(chartCardVariants({ variant }), className)}\n data-slot=\"chart-card\"\n {...props}\n >\n <div className={cn(chartCardHeaderVariants())} data-slot=\"chart-card-header\">\n <SkeletonLoader className=\"h-4 w-24\" />\n <SkeletonLoader className=\"h-5 w-12\" />\n </div>\n <div\n className={cn(chartCardValueContainerVariants())}\n data-slot=\"chart-card-value\"\n >\n <SkeletonLoader className=\"h-7 w-32\" />\n </div>\n <div className={cn(chartCardChartVariants(), chartHeight)}>\n <SkeletonLoader className=\"h-full w-full\" />\n </div>\n </article>\n )\n }\n\n return (\n <article\n aria-label={`${title}: ${valueFormatter(totalValue)}`}\n className={cn(chartCardVariants({ variant }), className)}\n data-slot=\"chart-card\"\n {...props}\n >\n {/* Title Row — featured icon + title + badge / overflow action */}\n <div className={cn(chartCardHeaderVariants())} data-slot=\"chart-card-header\">\n <div className=\"flex items-center gap-x-2\">\n {featuredIcon && (\n <span data-slot=\"chart-card-featured-icon\">{featuredIcon}</span>\n )}\n <h3 className={cn(chartCardTitleVariants())} data-slot=\"chart-card-title\">\n {title}\n </h3>\n {showComparison && (\n badge ?? (\n <Badge color={getBadgeColor(evolution)} size=\"sm\">\n {formatPercentage(evolution)}\n </Badge>\n )\n )}\n </div>\n {headerAction && (\n <span data-slot=\"chart-card-header-action\">{headerAction}</span>\n )}\n </div>\n\n {/* Value display */}\n <div\n className={cn(chartCardValueContainerVariants())}\n data-slot=\"chart-card-value\"\n >\n <p className={cn(chartCardValueVariants())}>\n {valueFormatter(totalValue)}\n </p>\n {showComparison && (\n <p className={cn(chartCardPreviousValueVariants())}>\n from {valueFormatter(totalPreviousValue)}\n </p>\n )}\n </div>\n\n {/* Tabs row slot (Figma showTabs) */}\n {tabs && (\n <div className=\"mt-[var(--chart-card-gap)]\" data-slot=\"chart-card-tabs\">\n {tabs}\n </div>\n )}\n\n {/* Chart slot — injected by the consumer (chart-agnostic) */}\n {!isThumbnail && chart && (\n <div\n className={cn(chartCardChartVariants(), chartHeight)}\n data-slot=\"chart-card-chart\"\n >\n {chart}\n </div>\n )}\n\n {/* Card Footer slot (Figma showCardFooter — trend + total) */}\n {footer && (\n <div className=\"mt-[var(--chart-card-gap)]\" data-slot=\"chart-card-footer\">\n {footer}\n </div>\n )}\n </article>\n )\n}\n\nChartCard.displayName = \"ChartCard\"\n\nexport { ChartCard }\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { Calendar, CalendarDayButton, calendarContainerVariants, calendarDayButtonVariants, calendarDayCellVariants, calendarDisabledVariants, calendarNavButtonVariants, calendarOutsideVariants, calendarRangeEndVariants, calendarRangeMiddleVariants, calendarRangeStartVariants, calendarTodayIndicatorVariants, calendarTodayVariants } from '../../../chunk-
|
|
2
|
-
import '../../../chunk-
|
|
1
|
+
export { Calendar, CalendarDayButton, calendarContainerVariants, calendarDayButtonVariants, calendarDayCellVariants, calendarDisabledVariants, calendarNavButtonVariants, calendarOutsideVariants, calendarRangeEndVariants, calendarRangeMiddleVariants, calendarRangeStartVariants, calendarTodayIndicatorVariants, calendarTodayVariants } from '../../../chunk-XAIUZJOJ.js';
|
|
2
|
+
import '../../../chunk-HDOR3SN3.js';
|
|
3
3
|
import '../../../chunk-TAZPML2P.js';
|
|
4
|
-
import '../../../chunk-
|
|
5
|
-
import '../../../chunk-3L5G7VI2.js';
|
|
4
|
+
import '../../../chunk-UDY3IDCY.js';
|
|
6
5
|
import '../../../chunk-7ZJ32KRQ.js';
|
|
6
|
+
import '../../../chunk-3L5G7VI2.js';
|
|
7
7
|
import '../../../chunk-HRNDJU7D.js';
|
|
8
8
|
import '../../../chunk-UP2VWCW5.js';
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, commandEmptyVariants, commandGroupVariants, commandInputIconVariants, commandInputVariants, commandInputWrapperVariants, commandItemVariants, commandListVariants, commandSeparatorVariants, commandShortcutVariants, commandVariants } from '../../../chunk-
|
|
1
|
+
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, commandEmptyVariants, commandGroupVariants, commandInputClearVariants, commandInputIconVariants, commandInputVariants, commandInputWrapperVariants, commandItemVariants, commandListVariants, commandSeparatorVariants, commandShortcutVariants, commandVariants } from '../../../chunk-X253YD45.js';
|
|
2
2
|
import '../../../chunk-ZUFM33AV.js';
|
|
3
3
|
import '../../../chunk-HRNDJU7D.js';
|
|
4
4
|
import '../../../chunk-UP2VWCW5.js';
|