@goplusvn/core 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/package.json +31 -175
  2. package/dist/audit/index.d.mts +0 -115
  3. package/dist/audit/index.d.ts +0 -115
  4. package/dist/audit/index.js +0 -204
  5. package/dist/audit/index.js.map +0 -1
  6. package/dist/audit/index.mjs +0 -200
  7. package/dist/audit/index.mjs.map +0 -1
  8. package/dist/auth/index.d.mts +0 -86
  9. package/dist/auth/index.d.ts +0 -86
  10. package/dist/auth/index.js +0 -210
  11. package/dist/auth/index.js.map +0 -1
  12. package/dist/auth/index.mjs +0 -198
  13. package/dist/auth/index.mjs.map +0 -1
  14. package/dist/button-1dWvP9Ib.d.mts +0 -30
  15. package/dist/button-1dWvP9Ib.d.ts +0 -30
  16. package/dist/calendar-2QzdEo1z.d.mts +0 -20
  17. package/dist/calendar-2QzdEo1z.d.ts +0 -20
  18. package/dist/code-generation/index.d.mts +0 -30
  19. package/dist/code-generation/index.d.ts +0 -30
  20. package/dist/code-generation/index.js +0 -31
  21. package/dist/code-generation/index.js.map +0 -1
  22. package/dist/code-generation/index.mjs +0 -28
  23. package/dist/code-generation/index.mjs.map +0 -1
  24. package/dist/configs/index.d.mts +0 -175
  25. package/dist/configs/index.d.ts +0 -175
  26. package/dist/configs/index.js +0 -254
  27. package/dist/configs/index.js.map +0 -1
  28. package/dist/configs/index.mjs +0 -233
  29. package/dist/configs/index.mjs.map +0 -1
  30. package/dist/crud/index.d.mts +0 -646
  31. package/dist/crud/index.d.ts +0 -646
  32. package/dist/crud/index.js +0 -11772
  33. package/dist/crud/index.js.map +0 -1
  34. package/dist/crud/index.mjs +0 -11665
  35. package/dist/crud/index.mjs.map +0 -1
  36. package/dist/crud/server.d.mts +0 -20
  37. package/dist/crud/server.d.ts +0 -20
  38. package/dist/crud/server.js +0 -123
  39. package/dist/crud/server.js.map +0 -1
  40. package/dist/crud/server.mjs +0 -120
  41. package/dist/crud/server.mjs.map +0 -1
  42. package/dist/data-table-skeleton-12NA8Mjx.d.mts +0 -39
  43. package/dist/data-table-skeleton-12NA8Mjx.d.ts +0 -39
  44. package/dist/dialog-bKfjZMTd.d.mts +0 -22
  45. package/dist/dialog-bKfjZMTd.d.ts +0 -22
  46. package/dist/dynamic-icon-DrGIiu2N.d.mts +0 -10
  47. package/dist/dynamic-icon-DrGIiu2N.d.ts +0 -10
  48. package/dist/home/index.d.mts +0 -269
  49. package/dist/home/index.d.ts +0 -269
  50. package/dist/home/index.js +0 -1678
  51. package/dist/home/index.js.map +0 -1
  52. package/dist/home/index.mjs +0 -1635
  53. package/dist/home/index.mjs.map +0 -1
  54. package/dist/hooks/index.d.mts +0 -7
  55. package/dist/hooks/index.d.ts +0 -7
  56. package/dist/hooks/index.js +0 -8316
  57. package/dist/hooks/index.js.map +0 -1
  58. package/dist/hooks/index.mjs +0 -8255
  59. package/dist/hooks/index.mjs.map +0 -1
  60. package/dist/index-50hpiPrV.d.ts +0 -116
  61. package/dist/index-B9zQVEVi.d.mts +0 -116
  62. package/dist/index.d.mts +0 -5
  63. package/dist/index.d.ts +0 -5
  64. package/dist/index.js +0 -123
  65. package/dist/index.js.map +0 -1
  66. package/dist/index.mjs +0 -118
  67. package/dist/index.mjs.map +0 -1
  68. package/dist/infrastructure/index.d.mts +0 -423
  69. package/dist/infrastructure/index.d.ts +0 -423
  70. package/dist/infrastructure/index.js +0 -633
  71. package/dist/infrastructure/index.js.map +0 -1
  72. package/dist/infrastructure/index.mjs +0 -619
  73. package/dist/infrastructure/index.mjs.map +0 -1
  74. package/dist/label-DWTEkNPo.d.ts +0 -226
  75. package/dist/label-LPpdcoBx.d.mts +0 -226
  76. package/dist/layout/index.d.mts +0 -48
  77. package/dist/layout/index.d.ts +0 -48
  78. package/dist/layout/index.js +0 -117
  79. package/dist/layout/index.js.map +0 -1
  80. package/dist/layout/index.mjs +0 -90
  81. package/dist/layout/index.mjs.map +0 -1
  82. package/dist/navigation/index.d.mts +0 -16
  83. package/dist/navigation/index.d.ts +0 -16
  84. package/dist/navigation/index.js +0 -53
  85. package/dist/navigation/index.js.map +0 -1
  86. package/dist/navigation/index.mjs +0 -50
  87. package/dist/navigation/index.mjs.map +0 -1
  88. package/dist/notification/index.d.mts +0 -105
  89. package/dist/notification/index.d.ts +0 -105
  90. package/dist/notification/index.js +0 -278
  91. package/dist/notification/index.js.map +0 -1
  92. package/dist/notification/index.mjs +0 -274
  93. package/dist/notification/index.mjs.map +0 -1
  94. package/dist/organization/index.d.mts +0 -99
  95. package/dist/organization/index.d.ts +0 -99
  96. package/dist/organization/index.js +0 -360
  97. package/dist/organization/index.js.map +0 -1
  98. package/dist/organization/index.mjs +0 -352
  99. package/dist/organization/index.mjs.map +0 -1
  100. package/dist/plugin/index.d.mts +0 -83
  101. package/dist/plugin/index.d.ts +0 -83
  102. package/dist/plugin/index.js +0 -86
  103. package/dist/plugin/index.js.map +0 -1
  104. package/dist/plugin/index.mjs +0 -84
  105. package/dist/plugin/index.mjs.map +0 -1
  106. package/dist/providers/index.d.mts +0 -25
  107. package/dist/providers/index.d.ts +0 -25
  108. package/dist/providers/index.js +0 -84
  109. package/dist/providers/index.js.map +0 -1
  110. package/dist/providers/index.mjs +0 -77
  111. package/dist/providers/index.mjs.map +0 -1
  112. package/dist/rbac/index.d.mts +0 -226
  113. package/dist/rbac/index.d.ts +0 -226
  114. package/dist/rbac/index.js +0 -4784
  115. package/dist/rbac/index.js.map +0 -1
  116. package/dist/rbac/index.mjs +0 -4722
  117. package/dist/rbac/index.mjs.map +0 -1
  118. package/dist/rbac/permissions.d.mts +0 -26
  119. package/dist/rbac/permissions.d.ts +0 -26
  120. package/dist/rbac/permissions.js +0 -94
  121. package/dist/rbac/permissions.js.map +0 -1
  122. package/dist/rbac/permissions.mjs +0 -90
  123. package/dist/rbac/permissions.mjs.map +0 -1
  124. package/dist/rbac/server.d.mts +0 -1
  125. package/dist/rbac/server.d.ts +0 -1
  126. package/dist/rbac/server.js +0 -128
  127. package/dist/rbac/server.js.map +0 -1
  128. package/dist/rbac/server.mjs +0 -124
  129. package/dist/rbac/server.mjs.map +0 -1
  130. package/dist/schemas/index.d.mts +0 -1257
  131. package/dist/schemas/index.d.ts +0 -1257
  132. package/dist/schemas/index.js +0 -572
  133. package/dist/schemas/index.js.map +0 -1
  134. package/dist/schemas/index.mjs +0 -523
  135. package/dist/schemas/index.mjs.map +0 -1
  136. package/dist/server-QuYCTa89.d.mts +0 -83
  137. package/dist/server-QuYCTa89.d.ts +0 -83
  138. package/dist/sonner-C74GlRDQ.d.mts +0 -71
  139. package/dist/sonner-C74GlRDQ.d.ts +0 -71
  140. package/dist/status-BOXZgIqX.d.mts +0 -12
  141. package/dist/status-BOXZgIqX.d.ts +0 -12
  142. package/dist/system/index.d.mts +0 -77
  143. package/dist/system/index.d.ts +0 -77
  144. package/dist/system/index.js +0 -102
  145. package/dist/system/index.js.map +0 -1
  146. package/dist/system/index.mjs +0 -100
  147. package/dist/system/index.mjs.map +0 -1
  148. package/dist/tabs-C6FfBwPY.d.mts +0 -18
  149. package/dist/tabs-C6FfBwPY.d.ts +0 -18
  150. package/dist/tenant-provider-B8eC_Wpb.d.mts +0 -27
  151. package/dist/tenant-provider-B8eC_Wpb.d.ts +0 -27
  152. package/dist/types/index.d.mts +0 -469
  153. package/dist/types/index.d.ts +0 -469
  154. package/dist/types/index.js +0 -25
  155. package/dist/types/index.js.map +0 -1
  156. package/dist/types/index.mjs +0 -21
  157. package/dist/types/index.mjs.map +0 -1
  158. package/dist/ui/auth.d.mts +0 -39
  159. package/dist/ui/auth.d.ts +0 -39
  160. package/dist/ui/auth.js +0 -4941
  161. package/dist/ui/auth.js.map +0 -1
  162. package/dist/ui/auth.mjs +0 -4896
  163. package/dist/ui/auth.mjs.map +0 -1
  164. package/dist/ui/crud.d.mts +0 -2
  165. package/dist/ui/crud.d.ts +0 -2
  166. package/dist/ui/crud.js +0 -4
  167. package/dist/ui/crud.js.map +0 -1
  168. package/dist/ui/crud.mjs +0 -3
  169. package/dist/ui/crud.mjs.map +0 -1
  170. package/dist/ui/data-display.d.mts +0 -596
  171. package/dist/ui/data-display.d.ts +0 -596
  172. package/dist/ui/data-display.js +0 -5307
  173. package/dist/ui/data-display.js.map +0 -1
  174. package/dist/ui/data-display.mjs +0 -5212
  175. package/dist/ui/data-display.mjs.map +0 -1
  176. package/dist/ui/feedback.d.mts +0 -55
  177. package/dist/ui/feedback.d.ts +0 -55
  178. package/dist/ui/feedback.js +0 -2608
  179. package/dist/ui/feedback.js.map +0 -1
  180. package/dist/ui/feedback.mjs +0 -2526
  181. package/dist/ui/feedback.mjs.map +0 -1
  182. package/dist/ui/forms.d.mts +0 -309
  183. package/dist/ui/forms.d.ts +0 -309
  184. package/dist/ui/forms.js +0 -4656
  185. package/dist/ui/forms.js.map +0 -1
  186. package/dist/ui/forms.mjs +0 -4571
  187. package/dist/ui/forms.mjs.map +0 -1
  188. package/dist/ui/index.d.mts +0 -331
  189. package/dist/ui/index.d.ts +0 -331
  190. package/dist/ui/index.js +0 -16953
  191. package/dist/ui/index.js.map +0 -1
  192. package/dist/ui/index.mjs +0 -16598
  193. package/dist/ui/index.mjs.map +0 -1
  194. package/dist/ui/primitives/client.d.mts +0 -61
  195. package/dist/ui/primitives/client.d.ts +0 -61
  196. package/dist/ui/primitives/client.js +0 -3408
  197. package/dist/ui/primitives/client.js.map +0 -1
  198. package/dist/ui/primitives/client.mjs +0 -3256
  199. package/dist/ui/primitives/client.mjs.map +0 -1
  200. package/dist/ui/primitives.d.mts +0 -113
  201. package/dist/ui/primitives.d.ts +0 -113
  202. package/dist/ui/primitives.js +0 -3356
  203. package/dist/ui/primitives.js.map +0 -1
  204. package/dist/ui/primitives.mjs +0 -3227
  205. package/dist/ui/primitives.mjs.map +0 -1
  206. package/dist/user/index.d.mts +0 -228
  207. package/dist/user/index.d.ts +0 -228
  208. package/dist/user/index.js +0 -4306
  209. package/dist/user/index.js.map +0 -1
  210. package/dist/user/index.mjs +0 -4260
  211. package/dist/user/index.mjs.map +0 -1
  212. package/dist/utils/index.d.mts +0 -205
  213. package/dist/utils/index.d.ts +0 -205
  214. package/dist/utils/index.js +0 -574
  215. package/dist/utils/index.js.map +0 -1
  216. package/dist/utils/index.mjs +0 -514
  217. package/dist/utils/index.mjs.map +0 -1
  218. package/dist/workflow/index.d.mts +0 -40
  219. package/dist/workflow/index.d.ts +0 -40
  220. package/dist/workflow/index.js +0 -3710
  221. package/dist/workflow/index.js.map +0 -1
  222. package/dist/workflow/index.mjs +0 -3677
  223. package/dist/workflow/index.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/index.ts","../../src/ui/primitives/button.tsx","../../src/ui/primitives/badge.tsx","../../src/ui/primitives/input.tsx","../../src/ui/primitives/checkbox.tsx","../../src/ui/primitives/card.tsx","../../src/ui/primitives/separator.tsx","../../src/ui/primitives/table.tsx","../../src/ui/primitives/dropdown-menu.tsx","../../src/ui/primitives/dialog.tsx","../../src/ui/primitives/tabs.tsx","../../src/ui/primitives/breadcrumb.tsx","../../src/ui/primitives/keyboard.tsx","../../src/ui/primitives/pagination.tsx","../../src/ui/primitives/status-badge.tsx","../../src/ui/primitives/calendar.tsx","../../src/ui/primitives/scroll-area.tsx","../../src/ui/primitives/combobox.tsx","../../src/ui/primitives/select.tsx","../../src/ui/primitives/popover.tsx","../../src/ui/primitives/switch.tsx","../../src/ui/primitives/label.tsx","../../src/ui/primitives/tooltip.tsx","../../src/ui/primitives/resizable.tsx","../../src/ui/primitives/slider.tsx","../../src/ui/primitives/toggle.tsx","../../src/ui/primitives/toggle-group.tsx","../../src/ui/primitives/menubar.tsx","../../src/ui/primitives/navigation-menu.tsx","../../src/ui/primitives/sticky-layout.tsx","../../src/ui/primitives/prefetch-link.tsx","../../src/ui/primitives/dynamic-icon.tsx","../../src/ui/primitives/input-number.tsx","../../src/ui/feedback/sheet.tsx","../../src/ui/feedback/context-menu.tsx","../../src/ui/feedback/drawer.tsx","../../src/ui/feedback/progress.tsx","../../src/ui/feedback/sonner.tsx","../../src/ui/primitives/client.ts","../../src/ui/feedback/alert.tsx","../../src/ui/feedback/error-dialog.tsx","../../src/ui/feedback/index.tsx","../../src/ui/data-display/avatar.tsx","../../src/hooks/use-tenant.ts","../../src/hooks/index.tsx","../../src/ui/primitives/sidebar.tsx","../../src/ui/primitives/index.tsx","../../src/ui/data-display/data-table-column-header.tsx","../../src/ui/data-display/formatted-number-input.tsx","../../src/ui/data-display/data-table-pagination.tsx","../../src/ui/data-display/data-table-view-options.tsx","../../src/ui/data-display/kpi-card.tsx","../../src/ui/data-display/compact-stat-bar.tsx","../../src/ui/data-display/show-more-text.tsx","../../src/ui/data-display/chart.tsx","../../src/ui/data-display/carousel.tsx","../../src/ui/data-display/accordion.tsx","../../src/ui/data-display/kanban/kanban-item.tsx","../../src/ui/data-display/kanban/kanban-column.tsx","../../src/ui/data-display/kanban/kanban-board.tsx","../../src/ui/data-display/kanban/kanban-types.ts","../../src/ui/data-display/kanban/index.ts","../../src/ui/data-display/aspect-ratio.tsx","../../src/ui/data-display/bento-grid.tsx","../../src/ui/data-display/highlight.tsx","../../src/ui/data-display/code-block-highlight.tsx","../../src/ui/data-display/collapsible.tsx","../../src/ui/data-display/hover-card.tsx","../../src/ui/data-display/iphone-15-pro.tsx","../../src/ui/data-display/media-grid.tsx","../../src/ui/data-display/safari.tsx","../../src/ui/data-display/timeline.tsx","../../src/ui/data-display/data-table/data-table-context.tsx","../../src/ui/data-display/data-table/data-table-skeleton.tsx","../../src/ui/data-display/data-table/data-table-empty-state.tsx","../../src/ui/data-display/data-table/data-table.tsx","../../src/ui/data-display/data-table/data-table-toolbar.tsx","../../src/ui/data-display/data-table/index.ts","../../src/ui/data-display/index.tsx"],"names":["twMerge","clsx","cva","React","jsx","Slot","jsxs","Fragment","React2","React3","CheckboxPrimitive","Check","React4","React5","Table","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","React6","DropdownMenuPrimitive","DialogPrimitive","React7","X","Tabs","TabsList","TabsTrigger","TabsContent","TabsPrimitive","React8","SelectPrimitive","ChevronDown","ChevronUp","PopoverPrimitive","Label","React9","LabelPrimitive","TooltipPrimitive","createContext","icons","React10","formatNumber","SheetPrimitive","AvatarPrimitive","Link","avatarStackVariants","useState","useEffect","React11","open","PanelLeft","React12","ArrowDown","ArrowUp","ArrowDownUp","EyeOff","FormattedNumberInput","pageSize","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight","DropdownMenuTrigger","Settings2","Icon","Minus","CompactStatBar","memo","useContext","useId","RechartsPrimitive","config","useMemo","ChartTooltip","ChartLegend","useEmblaCarousel","useCallback","api","ArrowLeft","ArrowRight","AccordionPrimitive","useSortable","CSS","GripVertical","SortableContext","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","items","arrayMove","columns","DndContext","closestCorners","horizontalListSortingStrategy","createPortal","DragOverlay","AspectRatioPrimitive","codeToHast","toJsxRuntime","bundledLanguages","useLayoutEffect","CollapsiblePrimitive","CollapsibleTrigger","CollapsibleContent","HoverCardPrimitive","Image","timelineVariants","timelineItemVariants","timelineContentVariants","timelineHeadingVariants","value","_","SearchX","FileSearch","Database","table","useReactTable","getCoreRowModel","getPaginationRowModel","getSortedRowModel","getFilteredRowModel","flexRender","Search","Filter","RefreshCw","Table2","LayoutGrid","init_data_table"],"mappings":"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","file":"data-display.js","sourcesContent":["// @goerp/core/utils\n// Utility functions for GoERP platform\n\nimport { clsx } from \"clsx\";\nimport type { ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n// Import types from core/types\nimport type { LocaleType, FormatStyleType } from \"../types\";\n\n// ============================================================================\n// Class Names\n// ============================================================================\n\n/**\n * Merge Tailwind CSS classes with clsx\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// ============================================================================\n// String Utilities\n// ============================================================================\n\n/**\n * Get initials from full name\n */\nexport function getInitials(fullName: string): string {\n if (fullName.length === 0) return \"\";\n const names = fullName.split(\" \");\n const initials = names.map((name) => name.charAt(0).toUpperCase()).join(\"\");\n return initials;\n}\n\n/**\n * Slugify string\n */\nexport function slugify(text: string): string {\n return text\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n}\n\n/**\n * Convert camelCase to Title Case\n */\nexport function camelCaseToTitleCase(camelCaseStr: string): string {\n return camelCaseStr\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (char) => char.toUpperCase());\n}\n\n/**\n * Convert Title Case to camelCase\n */\nexport function titleCaseToCamelCase(titleCaseStr: string): string {\n return titleCaseStr\n .toLowerCase()\n .replace(/[-_\\s]+(.)/g, (_, char) => char.toUpperCase())\n .replace(/[-_]/g, \"\");\n}\n\n// ============================================================================\n// Number Utilities\n// ============================================================================\n\nexport const isEven = (num: number) => num % 2 === 0;\nexport const isNonNegative = (num: number) => num >= 0;\n\n/**\n * Đọc số tiền thành chữ tiếng Việt\n * Dùng chung cho tất cả các phiếu in (hợp đồng, phiếu thu, phiếu chi, phiếu nhập/xuất kho, v.v.)\n * @param amount - Số tiền (VND)\n * @returns Chuỗi đọc bằng chữ, VD: \"Bảy mươi hai triệu một trăm năm mươi chín nghìn tám trăm hai mươi đồng\"\n */\nexport function readMoney(amount: number): string {\n if (!Number.isFinite(amount)) return \"Không đồng\"\n\n const isNegative = amount < 0\n\n // Bỏ phần thập phân - VND không có đơn vị lẻ\n amount = Math.floor(Math.abs(amount))\n\n if (amount === 0) return \"Không đồng\"\n\n const unit = [\"\", \"nghìn\", \"triệu\", \"tỷ\", \"nghìn tỷ\", \"triệu tỷ\"]\n const digit = [\n \"không\",\n \"một\",\n \"hai\",\n \"ba\",\n \"bốn\",\n \"năm\",\n \"sáu\",\n \"bảy\",\n \"tám\",\n \"chín\",\n ]\n\n let str = amount.toString()\n const groups: string[] = []\n while (str.length > 0) {\n groups.push(str.slice(-3))\n str = str.slice(0, -3)\n }\n\n let result = \"\"\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i]\n if (group === \"000\") continue\n\n const [a, b, c] = group.padStart(3, \"0\").split(\"\").map(Number)\n let groupResult = \"\"\n\n const hasHundreds = a !== 0 || groups.length > 1\n\n if (hasHundreds) {\n groupResult += `${digit[a]} trăm `\n }\n\n if (b === 0 && c !== 0) {\n if (hasHundreds) groupResult += \"lẻ \"\n } else if (b === 1) {\n groupResult += \"mười \"\n } else if (b > 1) {\n groupResult += `${digit[b]} mươi `\n }\n\n if (c === 1 && b > 1) {\n groupResult += \"mốt \"\n } else if (c === 5 && b > 0) {\n groupResult += \"lăm \"\n } else if (c !== 0) {\n groupResult += `${digit[c]} `\n }\n\n if (i === groups.length - 1 && a === 0) {\n groupResult = groupResult.replace(\"không trăm \", \"\")\n if (b === 0) groupResult = groupResult.replace(\"lẻ \", \"\")\n }\n\n if (groupResult.trim() !== \"\") {\n result = `${groupResult.trim()} ${unit[i]} ${result}`\n }\n }\n\n result = result.trim() + \" đồng\"\n\n if (isNegative) {\n return \"Âm \" + result\n }\n\n return result.charAt(0).toUpperCase() + result.slice(1)\n}\n\n/**\n * Format currency with locale\n */\nexport function formatCurrency(\n value: number,\n locales: LocaleType = \"vi\",\n currency: string = \"VND\",\n): string {\n return new Intl.NumberFormat(locales === \"vi\" ? \"vi-VN\" : locales, {\n style: \"decimal\",\n maximumFractionDigits: 0,\n }).format(value);\n}\n\n/**\n * Format number with locale\n */\nexport function formatNumber(\n value: number,\n options?: {\n locale?: string;\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n },\n): string {\n const {\n locale = \"vi-VN\",\n minimumFractionDigits = 0,\n maximumFractionDigits = 2,\n } = options || {};\n\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits,\n maximumFractionDigits,\n }).format(value);\n}\n\n/**\n * Format percent\n */\nexport function formatPercent(\n value: number,\n locales: LocaleType = \"vi\",\n): string {\n return new Intl.NumberFormat(locales === \"vi\" ? \"vi-VN\" : locales, {\n style: \"percent\",\n maximumFractionDigits: 0,\n }).format(value);\n}\n\n/**\n * Format number to compact (e.g., 1K, 1M)\n */\nexport function formatNumberToCompact(\n value: number,\n locales: LocaleType = \"vi\",\n): string {\n return new Intl.NumberFormat(locales === \"vi\" ? \"vi-VN\" : locales, {\n notation: \"compact\",\n compactDisplay: \"short\",\n }).format(value);\n}\n\n/**\n * Format file size\n */\nexport function formatFileSize(bytes: number, decimals: number = 2): string {\n if (bytes === 0) return \"0 Bytes\";\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + \" \" + sizes[i];\n}\n\n/**\n * Format unread count\n */\nexport function formatUnreadCount(unreadCount: number): string | number {\n return unreadCount >= 100 ? \"+99\" : unreadCount;\n}\n\n// ============================================================================\n// Date Utilities\n// ============================================================================\n\n/**\n * Format date with Vietnamese locale (Asia/Ho_Chi_Minh timezone)\n */\nexport function formatDate(\n date: Date | string,\n options?: {\n locale?: string;\n format?: \"short\" | \"medium\" | \"long\" | \"full\";\n },\n): string {\n const { locale = \"vi-VN\", format = \"medium\" } = options || {};\n const dateObj = typeof date === \"string\" ? new Date(date) : date;\n\n const formatOptions: Record<string, Intl.DateTimeFormatOptions> = {\n short: { day: \"2-digit\", month: \"2-digit\", year: \"numeric\", timeZone: \"Asia/Ho_Chi_Minh\" },\n medium: { day: \"2-digit\", month: \"short\", year: \"numeric\", timeZone: \"Asia/Ho_Chi_Minh\" },\n long: { day: \"numeric\", month: \"long\", year: \"numeric\", timeZone: \"Asia/Ho_Chi_Minh\" },\n full: { weekday: \"long\", day: \"numeric\", month: \"long\", year: \"numeric\", timeZone: \"Asia/Ho_Chi_Minh\" },\n };\n\n return new Intl.DateTimeFormat(locale, formatOptions[format]).format(dateObj);\n}\n\n/**\n * Format datetime with Vietnamese locale (Asia/Ho_Chi_Minh timezone)\n */\nexport function formatDateTime(\n date: Date | string,\n options?: {\n locale?: string;\n },\n): string {\n const { locale = \"vi-VN\" } = options || {};\n const dateObj = typeof date === \"string\" ? new Date(date) : date;\n\n return new Intl.DateTimeFormat(locale, {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n timeZone: \"Asia/Ho_Chi_Minh\",\n }).format(dateObj);\n}\n\n/**\n * Format relative date (Today, Yesterday, or date) - Asia/Ho_Chi_Minh timezone\n */\nexport function formatRelativeDate(value?: string | number | Date): string {\n if (!value) return \"No Date\";\n\n const date = new Date(value);\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n\n // Compare dates in Vietnam timezone\n const vnDateStr = new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Asia/Ho_Chi_Minh\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(date);\n const vnTodayStr = new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Asia/Ho_Chi_Minh\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(today);\n const vnYesterdayStr = new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Asia/Ho_Chi_Minh\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(yesterday);\n\n if (vnDateStr === vnTodayStr) return \"Today\";\n if (vnDateStr === vnYesterdayStr) return \"Yesterday\";\n\n return formatDate(date);\n}\n\n/**\n * Check if date is before today (Asia/Ho_Chi_Minh timezone)\n */\nexport function isBeforeToday(date: Date): boolean {\n const vnTodayStr = new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Asia/Ho_Chi_Minh\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(new Date());\n const vnDateStr = new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Asia/Ho_Chi_Minh\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(date);\n return vnDateStr < vnTodayStr;\n}\n\n// ============================================================================\n// Path Utilities\n// ============================================================================\n\n/**\n * Ensure path has prefix\n */\nexport function ensureWithPrefix(value: string, prefix: string): string {\n return value.startsWith(prefix) ? value : `${prefix}${value}`;\n}\n\n/**\n * Ensure path has suffix\n */\nexport function ensureWithSuffix(value: string, suffix: string): string {\n return value.endsWith(suffix) ? value : `${value}${suffix}`;\n}\n\n/**\n * Ensure path without prefix\n */\nexport function ensureWithoutPrefix(value: string, prefix: string): string {\n return value.startsWith(prefix) ? value.slice(prefix.length) : value;\n}\n\n/**\n * Ensure path without suffix\n */\nexport function ensureWithoutSuffix(value: string, suffix: string): string {\n return value.endsWith(suffix) ? value.slice(0, -suffix.length) : value;\n}\n\n/**\n * Check if pathname is active\n */\nexport function isActivePathname(\n basePathname: string,\n currentPathname: string,\n exactMatch: boolean = false,\n): boolean {\n if (typeof basePathname !== \"string\" || typeof currentPathname !== \"string\") {\n throw new Error(\"Both basePathname and currentPathname must be strings\");\n }\n\n if (exactMatch) {\n return basePathname === currentPathname;\n }\n\n return (\n currentPathname.startsWith(basePathname) &&\n (currentPathname.length === basePathname.length ||\n currentPathname[basePathname.length] === \"/\")\n );\n}\n\n// ============================================================================\n// General Utilities\n// ============================================================================\n\n/**\n * Wait/sleep function\n */\nexport function wait(ms: number = 250): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Debounce function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\n/**\n * Deep clone object\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Check if value is empty\n */\nexport function isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value).length === 0;\n return false;\n}\n\n/**\n * Generate a random ID\n */\nexport function generateId(prefix?: string): string {\n const id = Math.random().toString(36).substring(2, 11);\n return prefix ? `${prefix}_${id}` : id;\n}\n\n/**\n * Get dictionary value safely\n */\nexport function getDictionaryValue(\n key: string,\n section: Record<string, unknown>,\n fallback?: string,\n): string {\n const value = section[key];\n\n if (typeof value !== \"string\") {\n if (fallback !== undefined) {\n return fallback;\n }\n\n const normalizedKey = key.replace(/[-_]/g, \"\");\n const normalizedValue = section[normalizedKey];\n\n if (typeof normalizedValue === \"string\") {\n return normalizedValue;\n }\n\n return key;\n }\n\n return value;\n}\n\n/**\n * Format overview card value based on style\n */\nexport function formatOverviewCardValue(\n value: number,\n formatStyle: FormatStyleType,\n): string | number {\n switch (formatStyle) {\n case \"percent\":\n return formatPercent(value);\n case \"currency\":\n return formatCurrency(value);\n default:\n return value.toLocaleString(\"vi-VN\", {\n maximumFractionDigits: 0,\n });\n }\n}\n\n// ============================================================================\n// Additional Utilities (migrated from shared-utils)\n// ============================================================================\n\n/**\n * Get credit card brand name from number\n */\nexport function getCreditCardBrandName(number: string): string {\n const re = {\n visa: /^4/,\n mastercard: /^5[1-5]/,\n amex: /^3[47]/,\n discover: /^6(?:011|5)/,\n };\n\n for (const [type, regex] of Object.entries(re)) {\n if (regex.test(number)) return type;\n }\n return \"unknown\";\n}\n\n/**\n * Convert rem to pixels\n */\nexport function remToPx(rem: number): number {\n if (typeof document === \"undefined\") return rem * 16;\n const rootFontSize = parseFloat(\n getComputedStyle(document.documentElement).fontSize,\n );\n return rem * rootFontSize;\n}\n\n/**\n * Check if string is a valid URL\n */\nexport function isUrl(text: string): boolean {\n try {\n new URL(text);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Rating to percentage string\n */\nexport function ratingToPercentage(\n rating: number,\n maxRating: number,\n fractionDigits: number = 0,\n): string {\n const value = ((rating / maxRating) * 100).toFixed(fractionDigits);\n return value + \"%\";\n}\n\n/**\n * Ensure redirect pathname with query params\n */\nexport function ensureRedirectPathname(\n basePathname: string,\n redirectPathname: string,\n): string {\n const searchParams = new URLSearchParams({\n redirectTo: ensureWithoutSuffix(redirectPathname, \"/\"),\n });\n\n return ensureWithSuffix(basePathname, \"?\" + searchParams.toString());\n}\n\n/**\n * Get discounted price\n */\nexport function getDiscountedPrice(\n price: number,\n discountRate: number,\n isAnnual: boolean = false,\n): number {\n if (isAnnual) {\n const annualPrice = price * 12;\n const discountedAnnualPrice = annualPrice * (1 - discountRate);\n return discountedAnnualPrice / 12;\n } else {\n return price * (1 - discountRate);\n }\n}\n\n/**\n * Convert time string to Date\n */\nexport function timeToDate(timeString: string, baseDate = new Date()): Date {\n if (!/^\\d{2}:\\d{2}$/.test(timeString)) {\n throw new Error(\"Invalid time format. Use 'HH:mm'.\");\n }\n\n const [hours, minutes] = timeString.split(\":\").map(Number);\n const date = new Date(baseDate);\n\n date.setHours(hours, minutes, 0, 0);\n\n return date;\n}\n\n/**\n * Format file type\n */\nexport function formatFileType(type: string): string {\n return type.slice(0, type.lastIndexOf(\"/\"));\n}\n\n/**\n * Format date with time (Asia/Ho_Chi_Minh timezone)\n */\nexport function formatDateWithTime(value: string | number | Date): string {\n const date = new Date(value);\n return new Intl.DateTimeFormat(\"vi-VN\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n timeZone: \"Asia/Ho_Chi_Minh\",\n }).format(date);\n}\n\n/**\n * Format date short (MMM dd) - Asia/Ho_Chi_Minh timezone\n */\nexport function formatDateShort(value: string | number | Date): string {\n const date = new Date(value);\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"2-digit\",\n timeZone: \"Asia/Ho_Chi_Minh\",\n }).format(date);\n}\n\n/**\n * Format time (Asia/Ho_Chi_Minh timezone)\n */\nexport function formatTime(value: string | number | Date): string {\n const date = new Date(value);\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n timeZone: \"Asia/Ho_Chi_Minh\",\n }).format(date);\n}\n\n/**\n * Format duration from milliseconds\n */\nexport function formatDuration(value: string | number | Date): string {\n const numberValue = Number(value);\n const isNegative = numberValue < 0;\n const absoluteValue = Math.abs(numberValue);\n\n const hours = Math.floor(absoluteValue / 3600000);\n const minutes = Math.floor((absoluteValue % 3600000) / 60000);\n const seconds = Math.floor((absoluteValue % 60000) / 1000);\n\n const parts = [];\n if (hours) parts.push(`${hours}h`);\n if (minutes) parts.push(`${minutes}m`);\n if (seconds) parts.push(`${seconds}s`);\n\n const formattedDuration = parts.join(\" \") || \"0s\";\n\n return isNegative ? `-${formattedDuration}` : formattedDuration;\n}\n\n/**\n * Format distance to now\n */\nexport function formatDistance(value: string | number | Date): string {\n const date = new Date(value);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return \"just now\";\n if (diffMins < 60) return `${diffMins} mins ago`;\n if (diffHours < 24) return `${diffHours} hrs ago`;\n if (diffDays < 30) return `${diffDays} days ago`;\n if (diffDays < 365) return `${Math.floor(diffDays / 30)} months ago`;\n return `${Math.floor(diffDays / 365)} years ago`;\n}\n\n// Re-export status constants from configs\nexport {\n STATUS_COLORS,\n STATUS_ACTIVE,\n STATUS_INACTIVE,\n STATUS_OPTIONS,\n STATUS_VALUES,\n booleanToStatus,\n statusToBoolean,\n} from \"../configs/status\";\n\n// ============================================================================\n// Localization Utilities\n// ============================================================================\n\nconst LOCALE_LIST = [\"vi\", \"en\"];\n\nexport function isPathnameMissingLocale(pathname: string) {\n return !LOCALE_LIST.some((locale) => pathname.startsWith(`/${locale}`));\n}\n\nexport function getLocaleFromPathname(pathname: string) {\n return LOCALE_LIST.find((locale) => pathname.startsWith(`/${locale}`));\n}\n\nexport function ensureLocalizedPathname(pathname: string, locale: string) {\n if (!pathname || !locale)\n throw new Error(\"Pathname or Locale cannot be empty\");\n return isPathnameMissingLocale(pathname)\n ? `${ensureWithPrefix(locale, \"/\")}${ensureWithPrefix(pathname, \"/\")}`\n : pathname;\n}\n\nexport function relocalizePathname(pathname: string, locale: string) {\n if (!pathname || !locale)\n throw new Error(\"Pathname or Locale cannot be empty\");\n const segments = pathname.split(\"/\");\n segments[1] = locale;\n return segments.join(\"/\");\n}\n\n// ============================================================================\n// Logger\n// ============================================================================\n\ntype LogLevel = \"info\" | \"warn\" | \"error\" | \"debug\";\n\ninterface LogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: Error | unknown;\n}\n\nclass Logger {\n private log(\n level: LogLevel,\n message: string,\n context?: Record<string, unknown>,\n error?: unknown,\n ) {\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n message,\n context,\n };\n\n if (error instanceof Error) {\n entry.error = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n } else if (error) {\n entry.error = error;\n }\n\n const logString = JSON.stringify(entry);\n switch (level) {\n case \"error\":\n console.error(logString);\n break;\n case \"warn\":\n console.warn(logString);\n break;\n case \"debug\":\n if (process.env.NODE_ENV === \"development\") console.debug(logString);\n break;\n default:\n console.log(logString);\n }\n }\n\n info(message: string, context?: Record<string, unknown>) {\n this.log(\"info\", message, context);\n }\n warn(message: string, context?: Record<string, unknown>) {\n this.log(\"warn\", message, context);\n }\n error(message: string, error?: unknown, context?: Record<string, unknown>) {\n this.log(\"error\", message, context, error);\n }\n debug(message: string, context?: Record<string, unknown>) {\n this.log(\"debug\", message, context);\n }\n}\n\nexport const logger = new Logger();\n\n// ============================================================================\n// Tab Navigation Utilities\n// ============================================================================\n\nimport type {\n NavigationType,\n NavigationNestedItemWithHrefType,\n NavigationNestedItemWithItemsType,\n DynamicIconNameType,\n} from \"../types\";\n\nexport function shouldExcludeFromTabs(pathname: string): boolean {\n const excludePatterns = [\n \"/sign-in\",\n \"/sign-out\",\n \"/forgot-password\",\n \"/new-password\",\n \"/verify-email\",\n \"/register\",\n \"/unauthorized\",\n \"/not-found\",\n \"/maintenance\",\n \"/coming-soon\",\n ];\n if (\n pathname.includes(\"/ui/\") ||\n pathname.includes(\"/colors\") ||\n pathname.includes(\"/typography\")\n )\n return true;\n return excludePatterns.some((pattern) => pathname.includes(pattern));\n}\n\nexport function normalizePathname(pathname: string): string {\n return pathname.replace(/^\\/[a-z]{2}(\\/|$)/, \"/\") || \"/\";\n}\n\nfunction formatSegmentLabel(segment: string): string {\n return segment\n .replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport function findRouteTitle(\n pathname: string,\n navigations: NavigationType[],\n): string | null {\n const result = findRouteInfo(pathname, navigations);\n return result?.title || null;\n}\n\nexport function findRouteIcon(\n pathname: string,\n navigations: NavigationType[],\n): DynamicIconNameType | null {\n const result = findRouteInfo(pathname, navigations);\n return (result?.iconName as DynamicIconNameType) || null;\n}\n\ninterface RouteInfo {\n title: string;\n iconName?: DynamicIconNameType;\n}\n\nfunction findRouteInfo(\n pathname: string,\n navigations: NavigationType[],\n): RouteInfo | null {\n const normalizedPath = normalizePathname(pathname);\n let exactMatch: RouteInfo | null = null;\n const prefixMatches: Array<{ itemPath: string; routeInfo: RouteInfo }> = [];\n\n function searchItems(\n items:\n | NavigationType[\"items\"]\n | Array<\n NavigationNestedItemWithHrefType | NavigationNestedItemWithItemsType\n >\n | undefined,\n ): void {\n if (!items) return;\n for (const item of items) {\n if (\"href\" in item && item.href) {\n const itemPath = normalizePathname(item.href);\n if (normalizedPath === itemPath) {\n exactMatch = {\n title: item.title,\n iconName:\n \"iconName\" in item\n ? (item.iconName as DynamicIconNameType | undefined)\n : undefined,\n };\n } else if (normalizedPath.startsWith(itemPath + \"/\")) {\n prefixMatches.push({\n itemPath,\n routeInfo: {\n title: item.title,\n iconName:\n \"iconName\" in item\n ? (item.iconName as DynamicIconNameType | undefined)\n : undefined,\n },\n });\n }\n }\n if (\"items\" in item && item.items) searchItems(item.items);\n }\n }\n\n for (const nav of navigations) {\n searchItems(nav.items);\n if (exactMatch) return exactMatch;\n }\n\n if (prefixMatches.length > 0) {\n prefixMatches.sort((a, b) => b.itemPath.length - a.itemPath.length);\n return prefixMatches[0].routeInfo;\n }\n\n const segments = normalizedPath.split(\"/\").filter(Boolean);\n return segments.length > 0\n ? { title: formatSegmentLabel(segments[segments.length - 1]) }\n : { title: \"Home\" };\n}\n","import * as React from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils\";\n\n/**\n * Button Variants — Enhanced with Plane-inspired semantic tokens\n *\n * New variants:\n * - accent: Brand CTA button (indigo)\n * - danger: Destructive action (red, solid)\n * - danger-outline: Destructive action (red, outlined)\n * - success: Positive action (green)\n *\n * New sizes:\n * - xs: Ultra-compact for ERP table actions\n * - compact: Compact for toolbars\n */\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n // Existing variants (backwards-compatible)\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n\n // New Plane-inspired variants using semantic tokens\n accent:\n \"bg-accent-primary text-text-on-color hover:bg-accent-primary-hover active:bg-accent-primary-active disabled:bg-layer-disabled disabled:text-text-disabled\",\n danger:\n \"bg-danger text-text-on-color hover:bg-danger-hover active:bg-danger-hover disabled:bg-layer-disabled disabled:text-text-disabled\",\n \"danger-outline\":\n \"border border-danger bg-layer-2 text-danger-text hover:bg-danger-subtle active:bg-danger-subtle disabled:border-border-subtle disabled:bg-layer-2 disabled:text-text-disabled\",\n success:\n \"bg-success-semantic text-text-on-color hover:bg-success-semantic/90 active:bg-success-semantic/80 disabled:bg-layer-disabled disabled:text-text-disabled\",\n tertiary:\n \"bg-layer-3 text-text-secondary hover:bg-layer-3-hover active:bg-layer-3-hover disabled:bg-transparent disabled:text-text-disabled\",\n },\n size: {\n // Existing sizes (backwards-compatible)\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n\n // New ERP-specific compact sizes\n xs: \"h-7 rounded-sm px-2 text-xs\",\n compact: \"h-8 rounded-md px-3 text-xs\",\n \"icon-sm\": \"h-8 w-8\",\n \"icon-xs\": \"h-7 w-7\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n loading?: boolean;\n prependIcon?: React.ReactElement;\n appendIcon?: React.ReactElement;\n}\n\nimport { Slot } from \"@radix-ui/react-slot\";\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, loading = false, prependIcon, appendIcon, children, disabled, ...props }, ref) => {\n if (asChild) {\n return (\n <Slot\n className={cn(buttonVariants({ variant, size }), className)}\n ref={ref}\n {...({ disabled: disabled || loading } as any)}\n {...props}\n >\n {React.isValidElement(children) && (prependIcon || appendIcon) ? (\n React.cloneElement(children as React.ReactElement, {} as any, (\n <>\n {prependIcon && React.cloneElement(prependIcon, {\n className: cn(\"shrink-0\", size === \"xs\" || size === \"compact\" ? \"size-3.5\" : \"size-4\"),\n } as React.Attributes & Record<string, unknown>)}\n {(children as any).props.children}\n {appendIcon && React.cloneElement(appendIcon, {\n className: cn(\"shrink-0\", size === \"xs\" || size === \"compact\" ? \"size-3.5\" : \"size-4\"),\n } as React.Attributes & Record<string, unknown>)}\n </>\n ))\n ) : (\n children\n )}\n </Slot>\n );\n }\n\n return (\n <button\n className={cn(buttonVariants({ variant, size }), className)}\n ref={ref}\n disabled={disabled || loading}\n {...props}\n >\n {prependIcon && React.cloneElement(prependIcon, {\n className: cn(\"shrink-0\", size === \"xs\" || size === \"compact\" ? \"size-3.5\" : \"size-4\"),\n } as React.Attributes & Record<string, unknown>)}\n {children}\n {appendIcon && React.cloneElement(appendIcon, {\n className: cn(\"shrink-0\", size === \"xs\" || size === \"compact\" ? \"size-3.5\" : \"size-4\"),\n } as React.Attributes & Record<string, unknown>)}\n </button>\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n\n","import * as React from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils\";\n\n/**\n * Badge Variants — Enhanced with Plane-inspired semantic tokens\n *\n * New variants:\n * - danger: Red subtle background for errors/alerts\n * - info: Blue subtle background for informational\n * - accent: Brand color subtle background\n *\n * Updated variants:\n * - success: Now uses semantic token (was hardcoded bg-green-500)\n * - warning: Now uses semantic token (was hardcoded bg-yellow-500)\n */\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n // Existing variants (backwards-compatible)\n default: \"border-transparent bg-primary text-primary-foreground\",\n secondary: \"border-transparent bg-secondary text-secondary-foreground\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground\",\n outline: \"text-foreground\",\n\n // Enhanced semantic variants (using Design Tokens)\n success:\n \"border-transparent bg-success-subtle text-success-text\",\n warning:\n \"border-transparent bg-warning-subtle text-warning-text\",\n danger:\n \"border-transparent bg-danger-subtle text-danger-text\",\n info:\n \"border-transparent bg-info-subtle text-info-text\",\n accent:\n \"border-transparent bg-accent-primary-subtle text-accent-primary\",\n },\n size: {\n default: \"\",\n sm: \"px-1.5 py-0 text-[10px]\",\n lg: \"px-3 py-1 text-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, size, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant, size }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };\n\n","import * as React from \"react\";\nimport { cn } from \"../../utils\";\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\nexport interface CheckboxProps\n extends ComponentProps<typeof CheckboxPrimitive.Root> {}\n\nexport const Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n CheckboxProps\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n","import * as React from \"react\";\n\nimport { cn } from \"../../utils\";\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\";\nimport type { VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../utils\";\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\";\n}\n\nexport const Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n ({ className, orientation = \"horizontal\", ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className,\n )}\n {...props}\n />\n ),\n);\nSeparator.displayName = \"Separator\";\n\nexport function SeparatorWithText({\n className,\n orientation = \"horizontal\",\n children,\n ...props\n}: SeparatorProps) {\n return (\n <div\n className={cn(\n \"flex justify-between items-center\",\n orientation === \"horizontal\" ? \"w-full\" : \"flex-col h-full\",\n className,\n )}\n >\n <Separator orientation={orientation} className=\"shrink\" {...props} />\n <span\n className={cn(\n \"shrink-0 px-2 text-sm text-muted-foreground uppercase\",\n orientation === \"vertical\" && \"-rotate-90 rtl:rotate-90\",\n )}\n >\n {children}\n </span>\n <Separator orientation={orientation} className=\"shrink\" {...props} />\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../utils\";\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-max min-w-full caption-bottom text-xs\", className)}\n {...props}\n />\n </div>\n));\nTable.displayName = \"Table\";\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n));\nTableHeader.displayName = \"TableHeader\";\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n));\nTableBody.displayName = \"TableBody\";\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className,\n )}\n {...props}\n />\n));\nTableFooter.displayName = \"TableFooter\";\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b transition-colors even:bg-muted/30 data-[state=selected]:bg-muted\",\n className,\n )}\n {...props}\n />\n));\nTableRow.displayName = \"TableRow\";\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-9 px-3 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n className,\n )}\n {...props}\n />\n));\nTableHead.displayName = \"TableHead\";\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\"px-3 py-1.5 align-middle [&:has([role=checkbox])]:pr-0 text-xs\", className)}\n {...props}\n />\n));\nTableCell.displayName = \"TableCell\";\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nTableCaption.displayName = \"TableCaption\";\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronRight, Dot } from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\nexport function DropdownMenu({\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nexport function DropdownMenuPortal({\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n );\n}\n\nexport function DropdownMenuTrigger({\n className,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuGroup({\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n );\n}\n\nexport function DropdownMenuRadioGroup({\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n );\n}\n\nexport function DropdownMenuSub({\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\ntype DropdownMenuSubTriggerProps = ComponentProps<\n typeof DropdownMenuPrimitive.SubTrigger\n> & {\n inset?: boolean;\n};\n\nexport function DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: DropdownMenuSubTriggerProps) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"cursor-pointer flex items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:ps-8 focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ms-auto h-4 w-4 rtl:-scale-100\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nexport function DropdownMenuSubContent({\n className,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nexport function DropdownMenuItem({\n className,\n inset,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 data-[inset]:ps-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nexport function DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Dot className=\"h-4 w-4 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\nexport function DropdownMenuLabel({\n className,\n inset,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold data-[inset]:ps-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuSeparator({\n className,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuShortcut({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport { cn } from \"../../utils\";\n\nconst Tabs = TabsPrimitive.Root;\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { ChevronRight, Ellipsis } from \"lucide-react\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function Breadcrumb({ ...props }: ComponentProps<\"nav\">) {\n return <nav aria-label=\"breadcrumb\" data-slot=\"breadcrumb\" {...props} />;\n}\n\nexport function BreadcrumbList({ className, ...props }: ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function BreadcrumbItem({ className, ...props }: ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n );\n}\n\nexport function BreadcrumbLink({\n asChild,\n className,\n ...props\n}: ComponentProps<\"a\"> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : \"a\";\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"transition-colors hover:text-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport function BreadcrumbPage({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"font-normal text-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport function BreadcrumbSeparator({\n children,\n className,\n ...props\n}: ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n );\n}\n\nexport function BreadcrumbEllipsis({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n aria-label=\"More\"\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <Ellipsis className=\"h-4 w-4\" />\n </span>\n );\n}\n","import type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function Keyboard({\n className,\n children,\n ...props\n}: ComponentProps<\"kbd\">) {\n return (\n <kbd\n data-slot=\"keyboard\"\n className={cn(\n \"pointer-events-none select-none h-5 inline-flex items-center gap-x-1 px-1.5 bg-muted text-sm text-muted-foreground font-mono border rounded-sm\",\n \"before:content-['⌘']\",\n className,\n )}\n {...props}\n >\n {children}\n </kbd>\n );\n}\n","import Link from \"next/link\";\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\";\n\nimport type { Button } from \"./button\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nimport { buttonVariants } from \"./button\";\n\nexport function Pagination({ className, ...props }: ComponentProps<\"nav\">) {\n return (\n <nav\n data-slot=\"pagination\"\n role=\"navigation\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n aria-label=\"pagination\"\n {...props}\n />\n );\n}\n\nexport function PaginationContent({\n className,\n ...props\n}: ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n );\n}\n\nexport function PaginationItem({ ...props }: ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\nexport type PaginationLinkProps = {\n isActive?: boolean;\n} & Pick<ComponentProps<typeof Button>, \"size\"> &\n ComponentProps<typeof Link>;\n\nexport function PaginationLink({\n className,\n isActive,\n size = \"icon\",\n href = \"\",\n ...props\n}: PaginationLinkProps) {\n return (\n <Link\n data-slot=\"pagination-link\"\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className,\n )}\n href={href}\n aria-current={isActive ? \"page\" : undefined}\n {...props}\n />\n );\n}\n\nexport function PaginationPrevious({\n className,\n ...props\n}: ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n size=\"default\"\n className={cn(\"gap-1 ps-2.5\", className)}\n aria-label=\"Go to previous page\"\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4 rtl:-scale-100\" />\n <span>Previous</span>\n </PaginationLink>\n );\n}\n\nexport function PaginationNext({\n className,\n ...props\n}: ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n size=\"default\"\n className={cn(\"gap-1 pe-2.5\", className)}\n aria-label=\"Go to next page\"\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4 rtl:-scale-100\" />\n </PaginationLink>\n );\n}\n\nexport function PaginationEllipsis({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n aria-label=\"More pages\"\n aria-hidden\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </span>\n );\n}\n","import { Badge } from \"./badge\";\nimport { STATUS_COLORS, STATUS_ACTIVE, STATUS_INACTIVE } from \"../../utils\";\nimport { cn } from \"../../utils\";\n\ninterface StatusBadgeProps {\n status: string | unknown;\n className?: string;\n label?: string;\n}\n\nexport function StatusBadge({\n status,\n className,\n label: customLabel,\n}: StatusBadgeProps) {\n const statusStr = String(status);\n const variant = STATUS_COLORS[statusStr] || \"secondary\";\n\n // Custom styles for success (green) and warning (yellow) since they might not be in default badge variants\n let badgeClass = \"\";\n if (variant === \"success\") {\n badgeClass =\n \"bg-green-500 hover:bg-green-600 text-white border-transparent\";\n } else if (variant === \"warning\") {\n badgeClass =\n \"bg-yellow-500 hover:bg-yellow-600 text-white border-transparent\";\n }\n\n // Use custom label if provided, otherwise fallback to basic mapping or raw value\n let label = customLabel || statusStr;\n\n // Fallback mapping if no custom label provided\n if (!customLabel) {\n if (statusStr === STATUS_ACTIVE) label = \"Active\";\n }\n\n return (\n <Badge\n variant={\n variant === \"success\" || variant === \"warning\" ? \"default\" : variant\n }\n className={cn(badgeClass, className)}\n >\n {label}\n </Badge>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { DayPicker } from \"react-day-picker\";\n\nimport { cn } from \"../../utils\";\nimport { buttonVariants } from \"./button\";\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>;\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n ...props\n}: CalendarProps) {\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\"p-3\", className)}\n classNames={{\n month: \"space-y-4\",\n month_caption: \"flex justify-center pt-1 items-center\",\n caption_label: \"text-sm font-medium\",\n nav: \"relative gap-x-1 flex items-center\",\n button_previous: cn(\n buttonVariants({ variant: \"outline\" }),\n \"absolute top-0 start-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\",\n ),\n button_next: cn(\n buttonVariants({ variant: \"outline\" }),\n \"absolute top-0 end-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\",\n ),\n month_grid: \"w-full border-collapse space-y-1\",\n weekdays: \"flex\",\n weekday:\n \"text-muted-foreground rounded-md w-8 font-normal text-[0.8rem]\",\n week: \"flex w-full mt-2\",\n day: cn(\n buttonVariants({ variant: \"ghost\" }),\n \"relative h-8 w-8 p-0 font-normal text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected].day-range-end)]:rounded-e-md\",\n ),\n day_button: \"cursor-pointer h-full w-full aria-selected:opacity-100\",\n range_start: \"rounded-md!\",\n range_end: \"rounded-md!\",\n selected: cn(\n \"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground\",\n props.mode === \"range\" && \"rounded-none\",\n ),\n today: \"bg-accent text-accent-foreground\",\n outside:\n \"day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30\",\n disabled: \"text-muted-foreground opacity-50\",\n range_middle:\n \"aria-selected:bg-accent aria-selected:text-accent-foreground\",\n hidden: \"invisible\",\n ...classNames,\n }}\n components={{\n Chevron: (props) => {\n if (props.orientation === \"left\") {\n return <ChevronLeft className=\"h-4 w-4\" />;\n }\n return <ChevronRight className=\"h-4 w-4\" />;\n },\n }}\n {...props}\n />\n );\n}\nCalendar.displayName = \"Calendar\";\n\nexport { Calendar };\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport { cn } from \"../../utils\";\n\ntype ScrollAreaProps = ComponentProps<typeof ScrollAreaPrimitive.Root> &\n Pick<\n ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n \"orientation\"\n >;\n\nexport function ScrollArea({\n orientation,\n className,\n children,\n ...props\n}: ScrollAreaProps) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"h-full w-full rounded-[inherit]\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar orientation={orientation} />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nexport interface ScrollBarProps\n extends ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar> {}\n\nexport function ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: ScrollBarProps) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Check, ChevronsUpDown, Search, X } from \"lucide-react\";\n\nimport { cn } from \"../../utils\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { ScrollArea } from \"./scroll-area\";\n\nexport interface ComboboxOption {\n value: string | number | boolean;\n label: string;\n}\n\ninterface ComboboxProps {\n options: ComboboxOption[];\n value?: string | number | boolean;\n onValueChange?: (value: string | number | boolean | undefined) => void;\n placeholder?: string;\n searchPlaceholder?: string;\n emptyText?: string;\n disabled?: boolean;\n className?: string;\n id?: string;\n}\n\nexport function Combobox({\n options,\n value,\n onValueChange,\n placeholder = \"Select option...\",\n searchPlaceholder = \"Search...\",\n emptyText = \"No option found.\",\n disabled = false,\n className,\n id,\n}: ComboboxProps) {\n const [open, setOpen] = useState(false);\n const [searchValue, setSearchValue] = useState(\"\");\n const containerRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const selectedOption = options.find(\n (option) => String(option.value) === String(value),\n );\n\n // Filter options based on search value\n const filteredOptions = useMemo(() => {\n if (!searchValue.trim()) {\n return options;\n }\n const searchLower = searchValue.toLowerCase();\n return options.filter(\n (option) =>\n option.label.toLowerCase().includes(searchLower) ||\n String(option.value).toLowerCase().includes(searchLower),\n );\n }, [options, searchValue]);\n\n // Reset search when dropdown closes\n useEffect(() => {\n if (!open) {\n setSearchValue(\"\");\n }\n }, [open]);\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (open && searchInputRef.current) {\n // Small delay to ensure dropdown is rendered\n setTimeout(() => {\n searchInputRef.current?.focus();\n }, 50);\n }\n }, [open]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n if (!open) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (\n containerRef.current &&\n !containerRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n // Don't close if clicking inside dialog\n if (target.closest('[data-slot=\"dialog-content\"]')) {\n return;\n }\n setOpen(false);\n }\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && open) {\n event.stopPropagation();\n setOpen(false);\n }\n };\n\n // Use capture phase to catch events before Dialog\n document.addEventListener(\"mousedown\", handleClickOutside, true);\n document.addEventListener(\"keydown\", handleEscape, true);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside, true);\n document.removeEventListener(\"keydown\", handleEscape, true);\n };\n }, [open]);\n\n const handleSelect = useCallback(\n (optionValue: string | number | boolean) => {\n if (onValueChange) {\n onValueChange(optionValue);\n setOpen(false);\n }\n },\n [onValueChange],\n );\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (onValueChange) {\n // Pass undefined instead of empty string to indicate no selection\n onValueChange(undefined);\n }\n },\n [onValueChange],\n );\n\n return (\n <div ref={containerRef} className=\"relative w-full\">\n <Button\n type=\"button\"\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn(\"w-full justify-between\", className)}\n id={id}\n onClick={(e) => {\n e.stopPropagation();\n setOpen(!open);\n }}\n >\n <span className=\"truncate\">\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <div className=\"ml-2 flex items-center gap-1 shrink-0\">\n {selectedOption && (\n <div\n role=\"button\"\n tabIndex={0}\n className=\"h-4 w-4 p-0 hover:bg-transparent cursor-pointer flex items-center justify-center\"\n onClick={handleClear}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation();\n handleClear(e as any);\n }\n }}\n >\n <X className=\"h-3.5 w-3.5 text-red-500 hover:text-red-600\" />\n </div>\n )}\n <ChevronsUpDown className=\"h-4 w-4 opacity-50\" />\n </div>\n </Button>\n\n {open && (\n <div\n ref={dropdownRef}\n className=\"absolute z-[100] mt-1 w-full rounded-md border bg-popover text-popover-foreground shadow-md\"\n style={{\n top: \"100%\",\n left: 0,\n }}\n >\n <div className=\"flex flex-col\">\n {/* Search Input */}\n <div className=\"flex items-center border-b px-3 py-2\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <Input\n ref={searchInputRef}\n placeholder={searchPlaceholder}\n value={searchValue}\n onChange={(e) => {\n e.stopPropagation();\n setSearchValue(e.target.value);\n }}\n onKeyDown={(e) => {\n // Prevent Dialog from intercepting keyboard events\n e.stopPropagation();\n // Close dropdown on Escape\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n }\n // Select first filtered option on Enter\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (filteredOptions.length > 0) {\n handleSelect(filteredOptions[0].value);\n }\n }\n }}\n onClick={(e) => {\n e.stopPropagation();\n }}\n onFocus={(e) => {\n e.stopPropagation();\n }}\n className=\"border-0 focus-visible:ring-0 focus-visible:ring-offset-0 h-9 bg-transparent px-0\"\n />\n {searchValue && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0\"\n onClick={(e) => {\n e.stopPropagation();\n setSearchValue(\"\");\n searchInputRef.current?.focus();\n }}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n )}\n </div>\n\n {/* Options List */}\n <ScrollArea className=\"max-h-[300px]\">\n {filteredOptions.length === 0 ? (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n {emptyText}\n </div>\n ) : (\n <div className=\"p-1\">\n {filteredOptions.map((option) => {\n const isSelected = String(value) === String(option.value);\n return (\n <div\n key={String(option.value)}\n role=\"option\"\n aria-selected={isSelected}\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none\",\n \"hover:bg-accent hover:text-accent-foreground\",\n isSelected && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleSelect(option.value);\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleSelect(option.value);\n }}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4 shrink-0\",\n isSelected ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <span className=\"flex-1 truncate\">{option.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </ScrollArea>\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\nexport function Select({\n ...props\n}: ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nexport function SelectGroup({\n ...props\n}: ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nexport function SelectValue({\n ...props\n}: ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\ntype SelectTriggerProps = ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\";\n};\n\nexport function SelectTrigger({\n className,\n children,\n ...props\n}: SelectTriggerProps) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n className={cn(\n \"cursor-pointer flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-hidden focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nexport function SelectScrollUpButton({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-pointer items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nexport function SelectScrollDownButton({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-pointer items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport function SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nexport function SelectLabel({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...props}\n />\n );\n}\n\nexport function SelectItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nexport function SelectSeparator({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { cn } from \"../../utils\";\n\nexport function Popover({\n ...props\n}: ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nexport function PopoverTrigger({\n className,\n ...props\n}: ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return (\n <PopoverPrimitive.Trigger\n data-slot=\"popover-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function PopoverAnchor({\n ...props\n}: ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\nexport function PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n container,\n ...props\n}: ComponentProps<typeof PopoverPrimitive.Content> & {\n container?: HTMLElement;\n}) {\n return (\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\nimport { cn } from \"../../utils\";\n\nexport interface SwitchProps\n extends ComponentProps<typeof SwitchPrimitives.Root> {}\n\nexport function Switch({ className, ...props }: SwitchProps) {\n return (\n <SwitchPrimitives.Root\n data-slot=\"switch\"\n className={cn(\n \"peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input\",\n className,\n )}\n {...props}\n >\n <SwitchPrimitives.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0 rtl:data-[state=checked]:-translate-x-4\",\n )}\n />\n </SwitchPrimitives.Root>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cn } from \"../../utils\";\n\nexport interface LabelProps\n extends ComponentProps<typeof LabelPrimitive.Root> {}\n\nexport const Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n LabelProps\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n className,\n )}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n","\"use client\";\n\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../../utils\";\n\nexport function TooltipProvider({\n delayDuration = 0,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nexport function Tooltip({\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\nexport function TooltipTrigger({\n className,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return (\n <TooltipPrimitive.Trigger\n data-slot=\"tooltip-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function TooltipContent({\n className,\n sideOffset = 0,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-sm text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as ResizablePrimitive from \"react-resizable-panels\";\nimport { GripVertical } from \"lucide-react\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function ResizablePanelGroup({\n className,\n ...props\n}: ComponentProps<typeof ResizablePrimitive.PanelGroup>) {\n return (\n <ResizablePrimitive.PanelGroup\n data-slot=\"resizable-panel-group\"\n className={cn(\n \"flex h-full w-full data-[panel-group-direction=vertical]:flex-col\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function ResizablePanel({\n ...props\n}: ComponentProps<typeof ResizablePrimitive.Panel>) {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />;\n}\n\ntype ResizableHandleProps = ComponentProps<\n typeof ResizablePrimitive.PanelResizeHandle\n> & {\n withHandle?: boolean;\n};\n\nexport function ResizableHandle({\n withHandle,\n className,\n ...props\n}: ResizableHandleProps) {\n return (\n <ResizablePrimitive.PanelResizeHandle\n data-slot=\"resizable-handle\"\n className={cn(\n \"relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90\",\n className,\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border\">\n <GripVertical className=\"h-2.5 w-2.5\" />\n </div>\n )}\n </ResizablePrimitive.PanelResizeHandle>\n );\n}\n","\"use client\";\n\nimport * as SliderPrimitive from \"@radix-ui/react-slider\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function Slider({\n className,\n ...props\n}: ComponentProps<typeof SliderPrimitive.Root>) {\n return (\n <SliderPrimitive.Root\n className={cn(\n \"relative flex w-full touch-none select-none items-center\",\n className,\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20\">\n <SliderPrimitive.Range className=\"absolute h-full bg-primary\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"cursor-pointer block h-4 w-4 rounded-full border border-primary/50 bg-background shadow-sm transition-colors focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n );\n}\n","\"use client\";\n\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\";\nimport { cva } from \"class-variance-authority\";\n\nimport type { VariantProps } from \"class-variance-authority\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport const toggleVariants = cva(\n \"cursor-pointer inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-9 px-3\",\n sm: \"h-8 px-2\",\n lg: \"h-10 px-3\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport function Toggle({\n className,\n variant,\n size,\n ...props\n}: ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\n\nimport type { VariantProps } from \"class-variance-authority\";\nimport type { ComponentProps, ComponentPropsWithoutRef } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nimport { toggleVariants } from \"./toggle\";\n\nconst ToggleGroupContext = createContext<VariantProps<typeof toggleVariants>>({\n size: \"default\",\n variant: \"default\",\n});\n\ntype ToggleGroupProps = ComponentProps<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants>;\n\nexport function ToggleGroup({\n className,\n variant,\n size,\n children,\n ...props\n}: ToggleGroupProps) {\n return (\n <ToggleGroupPrimitive.Root\n data-slot=\"toggle-group\"\n className={cn(\"flex items-center justify-center gap-1\", className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n );\n}\n\ntype ToggleGroupItemProps = ComponentPropsWithoutRef<\n typeof ToggleGroupPrimitive.Item\n> &\n VariantProps<typeof toggleVariants>;\n\nexport function ToggleGroupItem({\n className,\n children,\n variant,\n size,\n ...props\n}: ToggleGroupItemProps) {\n const context = useContext(ToggleGroupContext);\n\n return (\n <ToggleGroupPrimitive.Item\n data-slot=\"toggle-group-item\"\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className,\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n}\n","\"use client\";\n\nimport * as MenubarPrimitive from \"@radix-ui/react-menubar\";\nimport { Check, ChevronRight, Dot } from \"lucide-react\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function MenubarMenu({\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Menu>) {\n return <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />;\n}\n\nexport function MenubarGroup({\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Group>) {\n return <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />;\n}\n\nexport function MenubarPortal({\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Portal>) {\n return <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />;\n}\n\nexport function MenubarRadioGroup({\n ...props\n}: ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n return (\n <MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />\n );\n}\n\nexport function Menubar({\n className,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Root>) {\n return (\n <MenubarPrimitive.Root\n data-slot=\"menubar\"\n className={cn(\n \"flex h-9 items-center gap-x-1 rounded-md border bg-background p-1\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function MenubarTrigger({\n className,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Trigger>) {\n return (\n <MenubarPrimitive.Trigger\n data-slot=\"menubar-trigger\"\n className={cn(\n \"flex cursor-pointer select-none items-center rounded-sm px-3 py-1 text-sm font-medium outline-hidden focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function MenubarSubTrigger({\n className,\n inset,\n children,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <MenubarPrimitive.SubTrigger\n data-slot=\"menubar-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground cursor-pointer flex items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:ps-8\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ms-auto h-4 w-4 rtl:-scale-x-100\" />\n </MenubarPrimitive.SubTrigger>\n );\n}\n\nexport function MenubarSub({\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Sub>) {\n return <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />;\n}\n\nexport function MenubarSubContent({\n className,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.SubContent>) {\n return (\n <MenubarPrimitive.SubContent\n data-slot=\"menubar-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function MenubarContent({\n className,\n align = \"start\",\n alignOffset = -4,\n sideOffset = 8,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Content>) {\n return (\n <MenubarPortal>\n <MenubarPrimitive.Content\n data-slot=\"menubar-content\"\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </MenubarPortal>\n );\n}\n\ntype MenubarItemProps = ComponentProps<typeof MenubarPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n};\n\nexport function MenubarItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: MenubarItemProps) {\n return (\n <MenubarPrimitive.Item\n data-slot=\"menubar-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function MenubarCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {\n return (\n <MenubarPrimitive.CheckboxItem\n data-slot=\"menubar-checkbox-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute start-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n );\n}\n\nexport function MenubarRadioItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.RadioItem>) {\n return (\n <MenubarPrimitive.RadioItem\n data-slot=\"menubar-radio-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute start-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <Dot className=\"h-4 w-4 fill-current\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n );\n}\n\ntype MenubarLabelProps = ComponentProps<typeof MenubarPrimitive.Label> & {\n inset?: boolean;\n};\n\nexport function MenubarLabel({\n className,\n inset,\n ...props\n}: MenubarLabelProps) {\n return (\n <MenubarPrimitive.Label\n data-slot=\"menubar-label\"\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"ps-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function MenubarSeparator({\n className,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Separator>) {\n return (\n <MenubarPrimitive.Separator\n data-slot=\"menubar-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport function MenubarShortcut({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"menubar-shortcut\"\n className={cn(\n \"ms-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n","import * as NavigationMenuPrimitive from \"@radix-ui/react-navigation-menu\";\nimport { cva } from \"class-variance-authority\";\nimport { ChevronDown } from \"lucide-react\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\ntype NavigationMenuProps = ComponentProps<\n typeof NavigationMenuPrimitive.Root\n> & {\n viewport?: boolean;\n};\n\nexport function NavigationMenu({\n className,\n children,\n viewport = true,\n ...props\n}: NavigationMenuProps) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n data-viewport={viewport}\n className={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className,\n )}\n {...props}\n >\n {children}\n {viewport && <NavigationMenuViewport />}\n </NavigationMenuPrimitive.Root>\n );\n}\n\nexport function NavigationMenuList({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn(\n \"group flex flex-1 list-none items-center justify-center gap-1\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function NavigationMenuItem({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item\n data-slot=\"navigation-menu-item\"\n className={cn(\"relative\", className)}\n {...props}\n />\n );\n}\n\nexport const navigationMenuTriggerStyle = cva(\n \"group cursor-pointer inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:hover:bg-accent data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent data-[state=open]:bg-accent/50 focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1\",\n);\n\nexport function NavigationMenuTrigger({\n className,\n children,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Trigger>) {\n return (\n <NavigationMenuPrimitive.Trigger\n data-slot=\"navigation-menu-trigger\"\n className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n {...props}\n >\n {children}{\" \"}\n <ChevronDown\n className=\"relative top-[1px] ms-1 size-3 transition duration-300 group-data-[state=open]:rotate-180\"\n aria-hidden=\"true\"\n />\n </NavigationMenuPrimitive.Trigger>\n );\n}\n\nexport function NavigationMenuContent({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Content>) {\n return (\n <NavigationMenuPrimitive.Content\n data-slot=\"navigation-menu-content\"\n className={cn(\n \"data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 top-0 left-0 w-full p-2 pr-2.5 md:absolute md:w-auto\",\n \"group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:duration-200 **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function NavigationMenuLink({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Link>) {\n return (\n <NavigationMenuPrimitive.Link\n data-slot=\"navigation-menu-link\"\n className={cn(\n \"data-[active=true]:focus:bg-accent data-[active=true]:hover:bg-accent data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-ring/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex flex-col gap-1 rounded-sm p-2 text-sm transition-all outline-none focus-visible:ring-[3px] focus-visible:outline-1 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function NavigationMenuViewport({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Viewport>) {\n return (\n <div className={cn(\"absolute start-0 top-full flex justify-center\")}>\n <NavigationMenuPrimitive.Viewport\n data-slot=\"navigation-menu-viewport\"\n className={cn(\n \"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\nexport function NavigationMenuIndicator({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Indicator>) {\n return (\n <NavigationMenuPrimitive.Indicator\n data-slot=\"navigation-menu-indicator\"\n className={cn(\n \"top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in\",\n className,\n )}\n {...props}\n >\n <div className=\"relative top-[60%] h-2 w-2 rotate-45 rounded-te-sm bg-border shadow-md\" />\n </NavigationMenuPrimitive.Indicator>\n );\n}\n","import { Slot } from \"@radix-ui/react-slot\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\ninterface CardProps extends ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nexport function StickyLayout({ className, asChild, ...props }: CardProps) {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n data-slot=\"sticky-layout\"\n className={cn(\"grid items-start gap-4 lg:grid-cols-2\", className)}\n {...props}\n />\n );\n}\n\nexport function StickyLayoutPane({\n className,\n ...props\n}: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sticky-layout-pane\"\n className={cn(\n \"top-20 flex flex-col items-center text-center space-y-1.5 lg:sticky lg:block lg:text-start\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function StickyLayoutContent({\n className,\n ...props\n}: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sticky-layout-content\"\n className={cn(\"space-y-4\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport type { LinkProps } from \"next/link\";\nimport Link from \"next/link\";\n\nimport { usePrefetch } from \"../../hooks\";\n\ninterface PrefetchLinkProps extends Omit<LinkProps, \"href\"> {\n children: React.ReactNode;\n href: string | LinkProps[\"href\"];\n className?: string;\n crudEntity?: string; // If this is a CRUD link, provide entity name\n}\n\n/**\n * Link component with automatic prefetching for CRUD pages\n * Prefetches both the route and the API endpoint when user hovers\n */\nexport function PrefetchLink({\n children,\n crudEntity,\n href,\n className,\n ...props\n}: PrefetchLinkProps) {\n const { prefetchRoute, prefetchCrudPage } = usePrefetch();\n\n const handleMouseEnter = useCallback(() => {\n if (typeof href === \"string\") {\n // Always prefetch the route\n prefetchRoute(href);\n\n // If this is a CRUD link, also prefetch the API endpoint\n if (crudEntity) {\n // Use convention: /api/[entity]\n prefetchCrudPage(crudEntity, `/api/${crudEntity}`);\n } else {\n // Try to extract entity name from href (handle localized paths like /en/crud/entity)\n const crudMatch = href.match(/\\/(?:[a-z]{2}\\/)?crud\\/([^/]+)/);\n if (crudMatch) {\n const entity = crudMatch[1];\n // Use convention: /api/[entity]\n prefetchCrudPage(entity, `/api/${entity}`);\n }\n }\n }\n }, [href, crudEntity, prefetchRoute, prefetchCrudPage]);\n\n return (\n <Link\n href={href}\n className={className}\n onMouseEnter={handleMouseEnter}\n {...props}\n >\n {children as any}\n </Link>\n );\n}\n","\"use client\";\n\n// Refer to Lucide documentation for more details https://lucide.dev/guide/packages/lucide-react\nimport { icons } from \"lucide-react\";\n\nimport type { LucideProps } from \"lucide-react\";\n\nexport type DynamicIconNameType = keyof typeof icons;\n\ninterface DynamicIconProps extends LucideProps {\n name?: DynamicIconNameType;\n}\n\n// Component to render a dynamic Lucide icon based on its name.\nexport function DynamicIcon({ name, ...props }: DynamicIconProps) {\n if (!name) return null;\n\n const LucideIcon = icons[name]; // Dynamically retrieve the icon by name.\n\n // Return null if the icon name is invalid.\n if (!LucideIcon) return null;\n\n return <LucideIcon {...props} />;\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../utils\";\n\nimport { Input } from \"./input\";\n\ninterface InputNumberProps\n extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"value\"\n > {\n value?: number | string | null;\n onChange?: (value: number | null) => void;\n decimalScale?: number;\n suffix?: string;\n}\n\nexport const InputNumber = React.forwardRef<HTMLInputElement, InputNumberProps>(\n ({ value, onChange, className, decimalScale = 0, suffix, ...props }, ref) => {\n // Internal string state to handle formatting\n const [displayValue, setDisplayValue] = React.useState(\"\");\n\n // Helper to parse displayed string to number\n const parseDisplayValue = (val: string) => {\n // Remove dots (thousands), replace comma with dot (decimal)\n const clean = val.replace(/\\./g, \"\").replace(\",\", \".\");\n return Number(clean);\n };\n\n const formatNumber = React.useCallback(\n (num: number) => {\n return new Intl.NumberFormat(\"vi-VN\", {\n maximumFractionDigits: decimalScale,\n minimumFractionDigits: 0,\n }).format(num);\n },\n [decimalScale],\n );\n\n // Update display value when prop value changes\n React.useEffect(() => {\n if (value === null || value === undefined || value === \"\") {\n setDisplayValue(\"\");\n return;\n }\n\n const numValue = Number(value);\n if (isNaN(numValue)) return;\n\n // Avoid overriding user input if they match numerically\n const currentNum = parseDisplayValue(displayValue);\n if (currentNum !== numValue) {\n setDisplayValue(formatNumber(numValue));\n }\n }, [value, decimalScale, displayValue, formatNumber]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawValue = e.target.value;\n\n // Allow digits and one comma\n let cleanVal = rawValue.replace(/[^0-9,]/g, \"\");\n\n // Handle multiple commas - keep only first\n const parts = cleanVal.split(\",\");\n if (parts.length > 2) {\n cleanVal = parts[0] + \",\" + parts.slice(1).join(\"\");\n }\n\n if (cleanVal === \"\") {\n setDisplayValue(\"\");\n onChange?.(null);\n return;\n }\n\n // Split integer and decimal parts\n const [integerPart, decimalPart] = cleanVal.split(\",\");\n\n let formattedInteger = integerPart;\n if (integerPart) {\n formattedInteger = new Intl.NumberFormat(\"vi-VN\").format(\n Number(integerPart),\n );\n }\n\n let newDisplayValue = formattedInteger;\n\n // Check decimal scale truncation\n let finalDecimalPart = decimalPart;\n\n if (decimalPart !== undefined) {\n if (decimalScale !== undefined && decimalPart.length > decimalScale) {\n finalDecimalPart = decimalPart.substring(0, decimalScale);\n }\n newDisplayValue += \",\" + finalDecimalPart;\n }\n\n setDisplayValue(newDisplayValue);\n\n // Calculate numeric value for parent\n let numStr = integerPart;\n if (finalDecimalPart !== undefined) {\n numStr += \".\" + finalDecimalPart;\n }\n\n const numValue = Number(numStr.replace(/\\./g, \"\"));\n onChange?.(numValue);\n };\n\n return (\n <div className=\"relative\">\n <Input\n {...props}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={displayValue}\n onChange={handleChange}\n className={cn(\"pr-8\", className)}\n />\n {suffix && (\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-muted-foreground text-sm\">\n {suffix}\n </div>\n )}\n </div>\n );\n },\n);\nInputNumber.displayName = \"InputNumber\";\n","\"use client\";\n\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\";\nimport { cva } from \"class-variance-authority\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../../utils\";\n\nexport function Sheet({\n ...props\n}: ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nexport function SheetTrigger({\n className,\n ...props\n}: ComponentProps<typeof SheetPrimitive.Trigger>) {\n return (\n <SheetPrimitive.Trigger\n data-slot=\"sheet-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function SheetClose({\n ...props\n}: ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nexport function SheetPortal({\n ...props\n}: ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nexport function SheetOverlay({\n className,\n ...props\n}: ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport const sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-72 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-72 border-s data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n start:\n \"inset-y-0 start-0 h-full w-72 border-e data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left data-[state=closed]:rtl:slide-out-to-right data-[state=open]:rtl:slide-in-from-right sm:max-w-sm\",\n end: \"inset-y-0 end-0 h-full w-72 border-s data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right data-[state=closed]:rtl:slide-out-to-left data-[state=open]:rtl:slide-in-from-left sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n },\n);\n\ntype SheetContentProps = ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\" | \"start\" | \"end\";\n};\n\nexport function SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: SheetContentProps) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nexport function SheetHeader({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col space-y-1\", className)}\n {...props}\n />\n );\n}\n\nexport function SheetFooter({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function SheetTitle({\n className,\n ...props\n}: ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport function SheetDescription({\n className,\n ...props\n}: ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\";\nimport { Check, ChevronRight, Dot } from \"lucide-react\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function ContextMenu({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />;\n}\n\nexport function ContextMenuTrigger({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return (\n <ContextMenuPrimitive.Trigger data-slot=\"context-menu-trigger\" {...props} />\n );\n}\n\nexport function ContextMenuGroup({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return (\n <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n );\n}\n\nexport function ContextMenuPortal({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return (\n <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n );\n}\n\nexport function ContextMenuSub({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />;\n}\n\nexport function ContextMenuRadioGroup({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return (\n <ContextMenuPrimitive.RadioGroup\n data-slot=\"context-menu-radio-group\"\n {...props}\n />\n );\n}\n\ntype ContextMenuSubTriggerProps = ComponentProps<\n typeof ContextMenuPrimitive.SubTrigger\n> & {\n inset?: boolean;\n};\n\nexport function ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: ContextMenuSubTriggerProps) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n className={cn(\n \"flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n inset && \"ps-8\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </ContextMenuPrimitive.SubTrigger>\n );\n}\n\nexport function ContextMenuSubContent({\n className,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function ContextMenuContent({\n className,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Content>) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n );\n}\n\ntype ContextMenuItemProps = ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n};\n\nexport function ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: ContextMenuItemProps) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function ContextMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute start-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n );\n}\n\nexport function ContextMenuRadioItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.RadioItem>) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute start-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Dot className=\"h-4 w-4 fill-current\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n );\n}\n\ntype ContextMenuLabelProps = ComponentProps<\n typeof ContextMenuPrimitive.Label\n> & {\n inset?: boolean;\n};\n\nexport function ContextMenuLabel({\n className,\n inset,\n ...props\n}: ContextMenuLabelProps) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold text-foreground\",\n inset && \"ps-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function ContextMenuSeparator({\n className,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n );\n}\n\nexport function ContextMenuShortcut({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"ms-auto text-sm tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport { Drawer as DrawerPrimitive } from \"vaul\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function Drawer({\n shouldScaleBackground = true,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Root>) {\n return (\n <DrawerPrimitive.Root\n data-slot=\"drawer\"\n shouldScaleBackground={shouldScaleBackground}\n {...props}\n />\n );\n}\n\nexport function DrawerTrigger({\n className,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Trigger>) {\n return (\n <DrawerPrimitive.Trigger\n data-slot=\"drawer-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function DrawerPortal({\n children,\n ...props\n}: Omit<ComponentProps<typeof DrawerPrimitive.Portal>, \"children\"> & { children?: React.ReactNode }) {\n const Portal = DrawerPrimitive.Portal as any;\n return <Portal data-slot=\"drawer-portal\" {...props}>{children as any}</Portal>;\n}\n\nexport function DrawerClose({\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Close>) {\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />;\n}\n\nexport function DrawerOverlay({\n className,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn(\"fixed inset-0 z-50 bg-black/80\", className)}\n {...props}\n />\n );\n}\n\nexport function DrawerContent({\n className,\n children,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n <DrawerOverlay />\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n \"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background\",\n className,\n )}\n {...props}\n >\n <div className=\"mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n );\n}\n\nexport function DrawerHeader({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\"grid gap-1.5 p-4 text-center sm:text-start\", className)}\n {...props}\n />\n );\n}\n\nexport function DrawerFooter({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n );\n}\n\nexport function DrawerTitle({\n className,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function DrawerDescription({\n className,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../../utils\";\n\nexport function Progress({\n className,\n value,\n max,\n ...props\n}: ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-lg bg-primary/20\",\n className,\n )}\n max={max}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{\n transform: `translateX(-${100 - ((value || 0) / (max || 100)) * 100}%)`,\n }}\n />\n </ProgressPrimitive.Root>\n );\n}\n","\"use client\";\n\nimport { Toaster as Sonner } from \"sonner\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { useSettings } from \"../../hooks\";\n\ntype ToasterProps = ComponentProps<typeof Sonner>;\n\nexport function Toaster({ ...props }: ToasterProps) {\n const { settings } = useSettings();\n\n const mode = settings.mode;\n\n return (\n <Sonner\n theme={mode as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton:\n \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton:\n \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n },\n }}\n richColors\n closeButton\n {...props}\n />\n );\n}\n","\"use client\";\n\nexport * from \"./calendar\";\nexport * from \"./combobox\";\nexport * from \"./scroll-area\";\nexport * from \"./select\";\nexport * from \"./popover\";\nexport * from \"./dropdown-menu\";\nexport * from \"./switch\";\nexport * from \"./checkbox\";\nexport * from \"./label\";\nexport * from \"./tooltip\";\nexport * from \"./sidebar\";\nexport * from \"./resizable\";\nexport * from \"./slider\";\nexport * from \"./toggle\";\nexport * from \"./toggle-group\";\nexport * from \"./menubar\";\nexport * from \"./navigation-menu\";\nexport * from \"./sticky-layout\";\nexport * from \"./prefetch-link\";\nexport * from \"./dynamic-icon\";\nexport * from \"./input-number\";\n\n// Feedback Client Components\nexport * from \"../feedback/sheet\";\nexport * from \"../feedback/context-menu\";\nexport * from \"../feedback/drawer\";\nexport * from \"../feedback/progress\";\nexport * from \"../feedback/sonner\";\n","import { cva } from \"class-variance-authority\";\n\nimport type { VariantProps } from \"class-variance-authority\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport const alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7\",\n {\n variants: {\n variant: {\n default: \"bg-background text-foreground\",\n destructive:\n \"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport function Alert({\n className,\n variant,\n ...props\n}: ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nexport function AlertTitle({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <h5\n data-slot=\"alert-title\"\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n );\n}\n\nexport function AlertDescription({\n className,\n ...props\n}: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n Button,\n ScrollArea,\n} from \"../primitives\";\nimport { AlertTriangle, Check, ChevronDown, ChevronRight, ClipboardCopy, Copy } from \"lucide-react\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ErrorDialogData {\n title?: string;\n description?: ReactNode;\n trace?: string;\n code?: string;\n}\n\ninterface ErrorDialogContextType {\n showError: (data: ErrorDialogData | string | Error) => void;\n dismiss: () => void;\n}\n\n// ============================================================================\n// Event Emitter for Global Access\n// ============================================================================\n\ntype ErrorEventListener = (data: ErrorDialogData) => void;\n\nclass GlobalErrorEmitter {\n private listeners: ErrorEventListener[] = [];\n\n subscribe(listener: ErrorEventListener) {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter((l) => l !== listener);\n };\n }\n\n emit(data: ErrorDialogData) {\n this.listeners.forEach((listener) => listener(data));\n }\n}\n\nexport const globalError = new GlobalErrorEmitter();\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst ErrorDialogContext = createContext<ErrorDialogContextType | null>(null);\n\nexport function useErrorDialog() {\n const context = useContext(ErrorDialogContext);\n if (!context) {\n throw new Error(\"useErrorDialog must be used within ErrorDialogProvider\");\n }\n return context;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function ErrorDialogProvider({ children }: { children: ReactNode }) {\n const [open, setOpen] = useState(false);\n const [data, setData] = useState<ErrorDialogData>({});\n const [expanded, setExpanded] = useState(false);\n const [copied, setCopied] = useState(false);\n\n // Subscribe to global events\n useEffect(() => {\n const unsubscribe = globalError.subscribe((errorData) => {\n setData(errorData);\n setOpen(true);\n setExpanded(false);\n setCopied(false);\n });\n return unsubscribe;\n }, []);\n\n const showError = useCallback((input: ErrorDialogData | string | Error) => {\n let errorData: ErrorDialogData = {};\n\n if (input instanceof Error) {\n errorData = {\n title: input.name || \"Error\",\n description: input.message,\n trace: input.stack,\n };\n } else if (typeof input === \"string\") {\n errorData = {\n title: \"Error\",\n description: input,\n };\n } else {\n errorData = input;\n }\n\n setData(errorData);\n setOpen(true);\n setExpanded(false);\n setCopied(false);\n }, []);\n\n const dismiss = useCallback(() => {\n setOpen(false);\n }, []);\n\n /** Build full diagnostic text for copy */\n const buildFullDiagnostic = useCallback(() => {\n // If trace already contains formatted diagnostic, use it directly\n if (data.trace && data.trace.startsWith(\"=== Thông tin lỗi\")) {\n return data.trace;\n }\n\n // Otherwise build from available fields\n const parts: string[] = [\n `=== Thông tin lỗi ===`,\n ];\n\n if (data.code) parts.push(`Mã lỗi: ${data.code}`);\n\n parts.push(`Thời gian: ${new Date().toLocaleString(\"vi-VN\", {\n timeZone: \"Asia/Ho_Chi_Minh\",\n day: \"2-digit\", month: \"2-digit\", year: \"numeric\",\n hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\",\n })}`);\n\n if (data.title) parts.push(`Lỗi: ${data.title}`);\n\n if (data.description && typeof data.description === \"string\") {\n parts.push(`Mô tả: ${data.description}`);\n }\n\n if (data.trace) {\n parts.push(`\\nChi tiết:\\n${data.trace}`);\n }\n\n return parts.join(\"\\n\");\n }, [data]);\n\n const copyAll = useCallback(async () => {\n const text = buildFullDiagnostic();\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback for older browsers\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [buildFullDiagnostic]);\n\n const copyTrace = () => {\n if (data.trace) {\n navigator.clipboard.writeText(data.trace);\n }\n };\n\n return (\n <ErrorDialogContext.Provider value={{ showError, dismiss }}>\n {children}\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"max-w-md md:max-w-xl sm:max-w-lg border-destructive/20\">\n <DialogHeader>\n <div className=\"flex items-center gap-2 text-destructive\">\n <div className=\"p-2 bg-destructive/10 rounded-full\">\n <AlertTriangle className=\"h-6 w-6\" />\n </div>\n <DialogTitle className=\"text-xl\">\n {data.title || \"Đã xảy ra lỗi\"}\n </DialogTitle>\n </div>\n <DialogDescription className=\"text-base pt-2 text-foreground font-medium\">\n {data.description}\n </DialogDescription>\n {data.code && (\n <p className=\"text-xs text-muted-foreground font-mono mt-1\">\n Mã lỗi: {data.code}\n </p>\n )}\n </DialogHeader>\n\n {data.trace && (\n <div className=\"mt-2 border rounded-md bg-muted/30 overflow-hidden\">\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"w-full flex items-center justify-between p-2 text-sm font-medium hover:bg-muted/50 transition-colors\"\n >\n <div className=\"flex items-center gap-1\">\n {expanded ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : (\n <ChevronRight className=\"h-4 w-4\" />\n )}\n <span>Chi tiết lỗi & Trace Log</span>\n </div>\n </button>\n\n {expanded && (\n <div className=\"relative border-t bg-muted/50\">\n <ScrollArea className=\"h-[200px] w-full p-4\">\n <pre className=\"text-xs font-mono whitespace-pre-wrap break-all text-muted-foreground\">\n {data.trace}\n </pre>\n </ScrollArea>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute top-2 right-2 h-6 w-6\"\n onClick={copyTrace}\n title=\"Copy Trace Log\"\n >\n <Copy className=\"h-3 w-3\" />\n </Button>\n </div>\n )}\n </div>\n )}\n\n <DialogFooter className=\"flex-row gap-2 sm:justify-between\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={copyAll}\n className=\"gap-1.5 text-xs\"\n >\n {copied ? (\n <>\n <Check className=\"h-3.5 w-3.5 text-green-600\" />\n Đã sao chép\n </>\n ) : (\n <>\n <ClipboardCopy className=\"h-3.5 w-3.5\" />\n Sao chép thông tin lỗi\n </>\n )}\n </Button>\n <Button variant=\"outline\" onClick={dismiss}>\n Đóng\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </ErrorDialogContext.Provider>\n );\n}\n","// @goerp/core/ui/feedback\n// Feedback components (Toast, Dialog, Loading, etc.)\n\n// ============================================================================\n// Dialog (Re-exported from primitives)\n// ============================================================================\n\nexport {\n Dialog,\n DialogTrigger,\n DialogPortal,\n DialogClose,\n DialogOverlay,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n} from \"../primitives\";\n\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\nimport { buttonVariants } from \"../primitives\";\n\nexport * from \"./progress\";\nexport * from \"./sheet\";\nexport * from \"./alert\";\nexport * from \"./context-menu\";\nexport * from \"./drawer\";\nexport * from \"./sonner\";\n\nexport * from \"./error-dialog\";\n\nexport function AlertDialog({\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />;\n}\n\nexport function AlertDialogTrigger({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger\n data-slot=\"alert-dialog-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function AlertDialogPortal({\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n );\n}\n\nexport function AlertDialogOverlay({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function AlertDialogContent({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Content>) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n \"fixed top-[50%] left-[50%] z-50 w-full max-w-[calc(100%-2rem)] grid bg-background translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:max-w-lg\",\n className,\n )}\n {...props}\n />\n </AlertDialogPortal>\n );\n}\n\nexport function AlertDialogHeader({\n className,\n ...props\n}: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function AlertDialogFooter({\n className,\n ...props\n}: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function AlertDialogTitle({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n );\n}\n\nexport function AlertDialogDescription({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport function AlertDialogAction({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Action>) {\n return (\n <AlertDialogPrimitive.Action\n className={cn(buttonVariants(), className)}\n {...props}\n />\n );\n}\n\nexport function AlertDialogCancel({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Cancel>) {\n return (\n <AlertDialogPrimitive.Cancel\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className,\n )}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport { cva } from \"class-variance-authority\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport type { ComponentProps, MouseEvent } from \"react\";\nimport { cn, getInitials } from \"../../utils\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../primitives/tooltip\";\n\nexport function Avatar({\n className,\n ...props\n}: ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\"relative flex h-10 w-10 shrink-0\", className)}\n {...props}\n />\n );\n}\n\nexport function AvatarImage({\n className,\n ...props\n}: ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"aspect-square h-full w-full bg-muted rounded-lg object-cover\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function AvatarFallback({\n className,\n ...props\n}: ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n className={cn(\n \"flex h-full w-full items-center justify-center bg-muted rounded-lg\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport const avatarStackVariants = cva(\n \"transition duration-300 hover:scale-105 hover:z-10\",\n {\n variants: {\n size: {\n default: \"h-10 w-10\",\n sm: \"h-9 w-9 text-sm\",\n lg: \"h-11 w-11\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n },\n);\n\ninterface AvatarStackProps\n extends ComponentProps<\"div\">,\n VariantProps<typeof avatarStackVariants> {\n avatars: { src?: string; alt: string; href?: string }[];\n avatarClassName?: string;\n limit?: number;\n onMoreButtonClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport function AvatarStack({\n avatars,\n limit = 4,\n size,\n onMoreButtonClick,\n className,\n avatarClassName,\n ...props\n}: AvatarStackProps) {\n const limitedAvatars = avatars.slice(0, limit);\n const remainingCount = avatars.length - limitedAvatars.length;\n\n return (\n <div className={cn(\"flex\", className)} {...props}>\n {limitedAvatars.slice(0, limit).map((avatar) => (\n <TooltipProvider\n key={`${avatar.alt}-${avatar.src}`}\n delayDuration={200}\n >\n <Tooltip>\n <TooltipTrigger className=\"-ms-1 -me-1\">\n {avatar.href ? (\n <Link href={avatar.href}>\n <Avatar\n className={cn(\n avatarStackVariants({ size }),\n avatarClassName,\n )}\n >\n <AvatarImage\n src={avatar.src}\n className=\"border-2 border-background\"\n />\n <AvatarFallback className=\"border-2 border-background\">\n {getInitials(avatar.alt)}\n </AvatarFallback>\n </Avatar>\n </Link>\n ) : (\n <Avatar\n className={cn(avatarStackVariants({ size }), avatarClassName)}\n >\n <AvatarImage\n src={avatar.src}\n className=\"border-2 border-background\"\n />\n <AvatarFallback className=\"border-2 border-background\">\n {getInitials(avatar.alt)}\n </AvatarFallback>\n </Avatar>\n )}\n </TooltipTrigger>\n <TooltipContent className=\"capitalize -me-[1.23rem]\">\n <p>{avatar.alt}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ))}\n\n {/* Show \"+N\" button if avatars exceed the limit */}\n {remainingCount > 0 && (\n <button\n type=\"button\"\n onClick={onMoreButtonClick}\n className=\"-ms-1 -me-1\"\n aria-label=\"Show more\"\n >\n <Avatar\n className={cn(avatarStackVariants({ size }), avatarClassName)}\n >\n <AvatarFallback className=\"border-2 border-background\">\n +{remainingCount}\n </AvatarFallback>\n </Avatar>\n </button>\n )}\n </div>\n );\n}\n","import { useTenantContext } from \"../providers/tenant-provider\";\n\nexport function useTenant() {\n return useTenantContext();\n}\n","// @goerp/core/hooks\n// Core React hooks for GoERP platform\n// Consolidated from packages/shared/hooks\n\n\"use client\";\n\nimport {\n useState,\n useEffect,\n useCallback,\n useRef,\n useContext,\n createContext,\n useMemo,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n useSearchParams,\n useRouter,\n usePathname,\n useParams,\n} from \"next/navigation\";\nimport { useMedia } from \"react-use\";\nimport { useDirection } from \"@radix-ui/react-direction\";\n\nimport { SettingsContext, defaultSettings } from \"../providers\";\nimport { remToPx } from \"../utils\";\n\nconst defaultSettingsValue = {\n settings: defaultSettings,\n updateSettings: () => {},\n resetSettings: () => {},\n};\n\n// ============================================================================\n// Debounce Hook\n// ============================================================================\n\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n\n// ============================================================================\n// Storage Hooks\n// ============================================================================\n\nexport function useLocalStorage<T>(\n key: string,\n initialValue: T,\n): [T, (value: T | ((prev: T) => T)) => void] {\n const [storedValue, setStoredValue] = useState<T>(initialValue);\n\n useEffect(() => {\n if (typeof window !== \"undefined\") {\n try {\n const item = window.localStorage.getItem(key);\n if (item) {\n setStoredValue(JSON.parse(item));\n }\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n }\n }\n }, [key]);\n\n const setValue = useCallback(\n (value: T | ((prev: T) => T)) => {\n try {\n const valueToStore =\n value instanceof Function ? value(storedValue) : value;\n setStoredValue(valueToStore);\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue];\n}\n\n// ============================================================================\n// State Hooks\n// ============================================================================\n\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T>(undefined);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n}\n\nexport function useToggle(\n initialValue = false,\n): [boolean, () => void, (value: boolean) => void] {\n const [value, setValue] = useState(initialValue);\n const toggle = useCallback(() => setValue((v) => !v), []);\n return [value, toggle, setValue];\n}\n\nexport function useMounted(): boolean {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return mounted;\n}\n\n// ============================================================================\n// Media Hooks\n// ============================================================================\n\nexport function useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState(false);\n\n useEffect(() => {\n if (typeof window !== \"undefined\") {\n const media = window.matchMedia(query);\n setMatches(media.matches);\n\n const listener = (event: MediaQueryListEvent) =>\n setMatches(event.matches);\n media.addEventListener(\"change\", listener);\n return () => media.removeEventListener(\"change\", listener);\n }\n }, [query]);\n\n return matches;\n}\n\nexport function useMobile(): boolean {\n return useMediaQuery(\"(max-width: 768px)\");\n}\n\n// ============================================================================\n// Clipboard Hook\n// ============================================================================\n\nexport function useCopyToClipboard(): [\n string | null,\n (text: string) => Promise<boolean>,\n] {\n const [copiedText, setCopiedText] = useState<string | null>(null);\n\n const copy = useCallback(async (text: string): Promise<boolean> => {\n if (!navigator?.clipboard) {\n console.warn(\"Clipboard not supported\");\n return false;\n }\n\n try {\n await navigator.clipboard.writeText(text);\n setCopiedText(text);\n return true;\n } catch (error) {\n console.warn(\"Copy failed\", error);\n setCopiedText(null);\n return false;\n }\n }, []);\n\n return [copiedText, copy];\n}\n\n// ============================================================================\n// Settings Hooks\n// ============================================================================\n\nexport function useSettings() {\n const context = useContext(SettingsContext);\n if (!context) {\n return defaultSettingsValue;\n }\n return context;\n}\n\nexport function useIsVertical() {\n const { settings } = useSettings();\n return settings.layout === \"vertical\";\n}\n\nexport function useIsDarkMode() {\n const { settings } = useSettings();\n const isDarkModePreferred = useMedia(\"(prefers-color-scheme: dark)\");\n\n let resolvedMode = settings.mode;\n if (resolvedMode === \"system\") {\n resolvedMode = isDarkModePreferred ? \"dark\" : \"light\";\n }\n\n return resolvedMode === \"dark\";\n}\n\nexport function useRadius(asPx = true) {\n const { settings } = useSettings();\n\n let radius = Number(settings.radius);\n if (asPx) {\n radius = remToPx(radius);\n }\n\n return radius;\n}\n\nexport function useDensity() {\n const { settings } = useSettings();\n return settings.density;\n}\n\nexport function useIsRtl() {\n const direction = useDirection();\n return direction === \"rtl\";\n}\n\n// ============================================================================\n// View Mode Hook\n// ============================================================================\n\nexport function useViewMode(\n storageKey: string,\n defaultMode: \"table\" | \"kanban\" | \"grid\" = \"table\",\n) {\n const [viewMode, setViewMode] = useState<\"table\" | \"kanban\" | \"grid\">(\n defaultMode,\n );\n\n useEffect(() => {\n const saved = localStorage.getItem(storageKey);\n if (saved === \"kanban\" || saved === \"table\" || saved === \"grid\") {\n setViewMode(saved as \"table\" | \"kanban\" | \"grid\");\n }\n }, [storageKey]);\n\n const handleViewModeChange = (mode: \"table\" | \"kanban\" | \"grid\") => {\n setViewMode(mode);\n localStorage.setItem(storageKey, mode);\n };\n\n return [viewMode, handleViewModeChange] as const;\n}\n\n// ============================================================================\n// Dictionary Hooks\n// ============================================================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type DictionaryType = any;\n\nconst DictionaryContext = createContext<DictionaryType | null>(null);\n\ninterface DictionaryProviderProps {\n dictionary: DictionaryType;\n children: ReactNode;\n}\n\nexport function DictionaryProvider({\n dictionary,\n children,\n}: DictionaryProviderProps) {\n return (\n <DictionaryContext.Provider value={dictionary}>\n {children}\n </DictionaryContext.Provider>\n );\n}\n\nexport function useDictionary() {\n const dictionary = useContext(DictionaryContext);\n\n if (!dictionary) {\n throw new Error(\"useDictionary must be used within DictionaryProvider\");\n }\n\n return dictionary;\n}\n\nexport function useDictionaryValue(key: string, fallback?: string): string {\n const dictionary = useDictionary();\n\n const keys = key.split(\".\");\n let value: unknown = dictionary;\n\n for (const k of keys) {\n if (value && typeof value === \"object\" && k in value) {\n value = (value as Record<string, unknown>)[k];\n } else {\n return fallback || key;\n }\n }\n\n return typeof value === \"string\" ? value : fallback || key;\n}\n\n// ============================================================================\n// CRUD Translations Hook\n// ============================================================================\n\nexport function useCrudTranslations() {\n const params = useParams();\n const locale = (params.lang as string) || \"en\";\n\n const t = useCallback(\n async (\n key: string,\n _params?: Record<string, string | number>,\n ): Promise<string> => {\n return key;\n },\n [],\n );\n\n const tSync = useCallback(\n (\n translations: DictionaryType,\n key: string,\n params?: Record<string, string | number>,\n ): string => {\n const keys = key.split(\".\");\n let value: unknown = translations;\n\n for (const k of keys) {\n if (value && typeof value === \"object\" && k in value) {\n value = (value as Record<string, unknown>)[k];\n } else {\n return key;\n }\n }\n\n if (typeof value === \"string\") {\n if (params) {\n return value.replace(/\\{\\{(\\w+)\\}\\}/g, (_, param) => {\n return String(params[param] || \"\");\n });\n }\n return value;\n }\n\n return key;\n },\n [],\n );\n\n return {\n t,\n tSync,\n locale,\n };\n}\n\n// ============================================================================\n// Prefetch Hook\n// ============================================================================\n\nexport function usePrefetch() {\n const router = useRouter();\n const prefetchedRoutes = useRef<Set<string>>(new Set());\n const prefetchedAPIs = useRef<Set<string>>(new Set());\n\n const prefetchRoute = useCallback(\n (route: string) => {\n if (prefetchedRoutes.current.has(route)) {\n return;\n }\n\n try {\n router.prefetch(route);\n prefetchedRoutes.current.add(route);\n } catch (error) {\n console.debug(\"Prefetch failed for route:\", route, error);\n }\n },\n [router],\n );\n\n const prefetchAPI = useCallback((endpoint: string, options?: RequestInit) => {\n const url = endpoint;\n const cacheKey = `${url}-${JSON.stringify(options || {})}`;\n\n if (prefetchedAPIs.current.has(cacheKey)) {\n return;\n }\n\n try {\n fetch(url, {\n method: \"HEAD\",\n ...options,\n headers: {\n ...options?.headers,\n \"Cache-Control\": \"max-age=60\",\n },\n })\n .then(() => {\n prefetchedAPIs.current.add(cacheKey);\n })\n .catch(() => {});\n } catch (error) {\n console.debug(\"API prefetch failed:\", url, error);\n }\n }, []);\n\n const prefetchCrudPage = useCallback(\n (entity: string, apiEndpoint: string) => {\n const route = `/crud/${entity}`;\n prefetchRoute(route);\n\n const apiUrl = `${apiEndpoint}?page=1&pageSize=10`;\n prefetchAPI(apiUrl);\n },\n [prefetchRoute, prefetchAPI],\n );\n\n const prefetchNextPage = useCallback(\n (\n apiEndpoint: string,\n currentPage: number,\n pageSize: number,\n queryParams?: Record<string, unknown>,\n ) => {\n const nextPage = currentPage + 1;\n const params = new URLSearchParams({\n page: String(nextPage),\n pageSize: String(pageSize),\n });\n\n if (queryParams) {\n Object.entries(queryParams).forEach(([k, v]) => {\n if (v === undefined || v === null || v === \"\") {\n return;\n }\n\n if (typeof v === \"object\" && !Array.isArray(v)) {\n params.append(k, JSON.stringify(v));\n } else if (Array.isArray(v)) {\n params.append(k, JSON.stringify(v));\n } else {\n params.append(k, String(v));\n }\n });\n }\n\n const apiUrl = `${apiEndpoint}?${params.toString()}`;\n prefetchAPI(apiUrl);\n },\n [prefetchAPI],\n );\n\n return {\n prefetchRoute,\n prefetchAPI,\n prefetchCrudPage,\n prefetchNextPage,\n };\n}\n\n// ============================================================================\n// URL Filters Hook\n// ============================================================================\n\ninterface UseUrlFiltersOptions {\n filters?: {\n search?: string;\n dateRange?: { from?: Date; to?: Date };\n materialGroups?: string[];\n suppliers?: string[];\n statuses?: string[];\n warehouses?: string[];\n };\n}\n\nexport function useUrlFilters(options: UseUrlFiltersOptions = {}) {\n const router = useRouter();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n const currentFilters = useMemo(() => {\n return {\n search: searchParams.get(\"search\") || \"\",\n dateRange: {\n from: searchParams.get(\"from\")\n ? new Date(searchParams.get(\"from\")!)\n : undefined,\n to: searchParams.get(\"to\")\n ? new Date(searchParams.get(\"to\")!)\n : undefined,\n },\n materialGroups:\n searchParams.get(\"materialGroups\")?.split(\",\").filter(Boolean) || [],\n suppliers:\n searchParams.get(\"suppliers\")?.split(\",\").filter(Boolean) || [],\n statuses: searchParams.get(\"statuses\")?.split(\",\").filter(Boolean) || [],\n warehouses:\n searchParams.get(\"warehouses\")?.split(\",\").filter(Boolean) || [],\n };\n }, [searchParams]);\n\n const updateFilters = useCallback(\n (filters: UseUrlFiltersOptions[\"filters\"]) => {\n const params = new URLSearchParams(searchParams.toString());\n\n if (filters?.search) {\n params.set(\"search\", filters.search);\n } else {\n params.delete(\"search\");\n }\n\n if (filters?.dateRange?.from) {\n params.set(\"from\", filters.dateRange.from.toISOString());\n } else {\n params.delete(\"from\");\n }\n\n if (filters?.dateRange?.to) {\n params.set(\"to\", filters.dateRange.to.toISOString());\n } else {\n params.delete(\"to\");\n }\n\n if (filters?.materialGroups && filters.materialGroups.length > 0) {\n params.set(\"materialGroups\", filters.materialGroups.join(\",\"));\n } else {\n params.delete(\"materialGroups\");\n }\n\n if (filters?.suppliers && filters.suppliers.length > 0) {\n params.set(\"suppliers\", filters.suppliers.join(\",\"));\n } else {\n params.delete(\"suppliers\");\n }\n\n if (filters?.statuses && filters.statuses.length > 0) {\n params.set(\"statuses\", filters.statuses.join(\",\"));\n } else {\n params.delete(\"statuses\");\n }\n\n if (filters?.warehouses && filters.warehouses.length > 0) {\n params.set(\"warehouses\", filters.warehouses.join(\",\"));\n } else {\n params.delete(\"warehouses\");\n }\n\n router.push(`${pathname}?${params.toString()}`);\n },\n [router, pathname, searchParams],\n );\n\n const clearFilters = useCallback(() => {\n router.push(pathname);\n }, [router, pathname]);\n\n return {\n currentFilters,\n updateFilters,\n clearFilters,\n };\n}\n\n\n\n// ============================================================================\n// Tab Navigation Back Hook\n// ============================================================================\n\n// Re-export from layout for use in hooks\nexport { useTabNavigation } from \"../ui/layout\";\n\n/**\n * Hook to handle back navigation that integrates with the tab system.\n */\nexport function useTabNavigationBack() {\n // Import dynamically to avoid circular dependency issues at module level\n const { useTabNavigation } = require(\"../ui/layout\");\n const { closeAndGoToParent } = useTabNavigation();\n\n return {\n navigateBack: closeAndGoToParent,\n };\n}\n// ============================================================================\n// Tenant Hooks\n// ============================================================================\n\nexport * from \"./use-tenant\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport { cva } from \"class-variance-authority\";\nimport { PanelLeft } from \"lucide-react\";\n\nimport { useMobile } from \"../../hooks\"; // Exported from core/hooks\nimport { cn } from \"../../utils\";\nimport { Button } from \"./button\";\nimport { Sheet, SheetContent, SheetTitle } from \"../feedback\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\";\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar:state\";\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = \"16rem\";\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"; // slightly wider on mobile? or same.\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\";\n\ntype SidebarContext = {\n state: \"expanded\" | \"collapsed\";\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n // Hover expand\n hoverOpen: boolean;\n setHoverOpen: (open: boolean) => void;\n isHoverExpanded: boolean;\n};\n\nconst SidebarContext = React.createContext<SidebarContext | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n }\n return context;\n}\n\nconst SidebarProvider = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n storageKey?: string;\n }\n>(\n (\n {\n defaultOpen = false,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const isMobile = useMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n // Hover expand state\n const [hoverOpen, setHoverOpen] = React.useState(false);\n\n // Internal state for desktop\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n if (setOpenProp) {\n return setOpenProp(typeof value === \"function\" ? value(open) : value);\n }\n _setOpen(value);\n // Store cookie/localstorage if needed\n // document.cookie = `${SIDEBAR_COOKIE_NAME}=${value}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open],\n );\n\n // Toggle sidebar\n const toggleSidebar = React.useCallback(() => {\n return isMobile\n ? setOpenMobile((open) => !open)\n : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Keyboard shortcut\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [toggleSidebar]);\n\n const state = open ? \"expanded\" : \"collapsed\";\n // Check if sidebar is expanded due to hover (only when collapsed)\n const isHoverExpanded = !open && hoverOpen;\n\n const contextValue = React.useMemo<SidebarContext>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n hoverOpen,\n setHoverOpen,\n isHoverExpanded,\n }),\n [\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n hoverOpen,\n setHoverOpen,\n isHoverExpanded,\n ],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar\",\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n },\n);\nSidebarProvider.displayName = \"SidebarProvider\";\n\nconst Sidebar = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\";\n variant?: \"sidebar\" | \"floating\" | \"inset\";\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\n hoverExpandEnabled?: boolean;\n }\n>(\n (\n {\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n hoverExpandEnabled = true,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const {\n isMobile,\n state,\n openMobile,\n setOpenMobile,\n setHoverOpen,\n isHoverExpanded,\n } = useSidebar();\n\n // Handlers for hover expand\n const handleMouseEnter = React.useCallback(() => {\n if (\n hoverExpandEnabled &&\n state === \"collapsed\" &&\n collapsible === \"icon\"\n ) {\n setHoverOpen(true);\n }\n }, [hoverExpandEnabled, state, collapsible, setHoverOpen]);\n\n const handleMouseLeave = React.useCallback(() => {\n if (hoverExpandEnabled) {\n setHoverOpen(false);\n }\n }, [hoverExpandEnabled, setHoverOpen]);\n\n if (collapsible === \"none\") {\n return (\n <div\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-background p-0 text-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetTitle className=\"sr-only\">Mobile Menu</SheetTitle>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n // Determine effective state for styling\n const effectiveState = isHoverExpanded ? \"hover-expanded\" : state;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"group peer hidden md:block transition-colors duration-200\",\n // Blue bg + white text when collapsed, white bg + dark text when expanded/hover\n state === \"collapsed\" && !isHoverExpanded\n ? \"text-sidebar-foreground\"\n : \"text-foreground\",\n )}\n data-state={state}\n data-hover-expanded={isHoverExpanded}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {/* Sidebar Gap - keeps layout stable, doesn't expand on hover */}\n <div\n className={cn(\n \"duration-200 relative h-svh w-(--sidebar-width) bg-transparent transition-[width] ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n )}\n />\n {/* Sidebar Content - expands on hover */}\n <div\n className={cn(\n \"duration-200 fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n // Adjustments for collapsible=icon\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_8px)] group-data-[collapsible=icon]:px-2.5\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[collapsible=icon]:border-r group-data-[collapsible=icon]:px-0\",\n // Hover expand - override icon width to full width on hover\n \"group-data-[hover-expanded=true]:!w-(--sidebar-width) group-data-[hover-expanded=true]:shadow-xl group-data-[hover-expanded=true]:z-[100]\",\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n className={cn(\n \"flex h-full w-full flex-col border-r transition-colors duration-200\",\n // Blue background when collapsed, white when expanded/hover\n \"group-data-[state=collapsed]:bg-sidebar group-data-[state=collapsed]:border-sidebar-border\",\n \"group-data-[state=expanded]:bg-background group-data-[state=expanded]:border-border\",\n \"group-data-[hover-expanded=true]:!bg-background group-data-[hover-expanded=true]:!border-border\",\n \"group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow\",\n )}\n >\n {children}\n </div>\n </div>\n </div>\n );\n },\n);\nSidebar.displayName = \"Sidebar\";\n\nconst SidebarTrigger = React.forwardRef<\n React.ElementRef<typeof Button>,\n React.ComponentProps<typeof Button>\n>(({ className, onClick, ...props }, ref) => {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n ref={ref}\n data-sidebar=\"trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"h-7 w-7\", className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeft />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n});\nSidebarTrigger.displayName = \"SidebarTrigger\";\n\nconst SidebarRail = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\">\n>(({ className, ...props }, ref) => {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n ref={ref}\n data-sidebar=\"rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex\",\n \"[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarRail.displayName = \"SidebarRail\";\n\nconst SidebarInset = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"main\">\n>(({ className, ...props }, ref) => {\n return (\n <main\n ref={ref}\n className={cn(\n \"relative flex min-h-svh flex-1 flex-col bg-muted/40 transition-[margin] duration-200 ease-linear\",\n \"peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarInset.displayName = \"SidebarInset\";\n\nconst SidebarInput = React.forwardRef<\n React.ElementRef<\"input\">,\n React.ComponentProps<\"input\">\n>(({ className, ...props }, ref) => {\n return (\n <input\n ref={ref}\n data-sidebar=\"input\"\n className={cn(\n \"flex h-8 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sidebar-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarInput.displayName = \"SidebarInput\";\n\nconst SidebarHeader = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n});\nSidebarHeader.displayName = \"SidebarHeader\";\n\nconst SidebarFooter = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n});\nSidebarFooter.displayName = \"SidebarFooter\";\n\nconst SidebarSeparator = React.forwardRef<\n React.ElementRef<\"div\">,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"separator\"\n className={cn(\"mx-2 h-[1px] w-auto bg-sidebar-border\", className)}\n {...props}\n />\n );\n});\nSidebarSeparator.displayName = \"SidebarSeparator\";\n\nconst SidebarContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto\",\n // Hide overflow when collapsed, but show when hover-expanded\n \"group-data-[collapsible=icon]:overflow-hidden group-data-[hover-expanded=true]:!overflow-auto\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarContent.displayName = \"SidebarContent\";\n\nconst SidebarGroup = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n );\n});\nSidebarGroup.displayName = \"SidebarGroup\";\n\nconst SidebarGroupLabel = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-label\"\n className={cn(\n \"duration-200 flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-bold text-primary uppercase tracking-wider outline-none ring-sidebar-ring transition-[margin,opa] ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Hide when collapsed, show when hover-expanded\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n \"group-data-[hover-expanded=true]:!mt-0 group-data-[hover-expanded=true]:!opacity-100\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarGroupLabel.displayName = \"SidebarGroupLabel\";\n\nconst SidebarGroupAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 after:md:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarGroupAction.displayName = \"SidebarGroupAction\";\n\nconst SidebarGroupContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n );\n});\nSidebarGroupContent.displayName = \"SidebarGroupContent\";\n\nconst SidebarMenu = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => {\n return (\n <ul\n ref={ref}\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n );\n});\nSidebarMenu.displayName = \"SidebarMenu\";\n\nconst SidebarMenuItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => {\n return (\n <li\n ref={ref}\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n );\n});\nSidebarMenuItem.displayName = \"SidebarMenuItem\";\n\nconst sidebarMenuButtonVariants = cva(\n // Base styles + hover-expand overrides\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 group-data-[hover-expanded=true]:!size-auto group-data-[hover-expanded=true]:!w-full group-data-[hover-expanded=true]:!p-2\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:!p-0\",\n },\n isActive: {\n true: \"bg-primary/10 text-primary font-bold\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nconst SidebarMenuButton = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n } & VariantProps<typeof sidebarMenuButtonVariants>\n>(\n (\n {\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : \"button\";\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n ref={ref}\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n sidebarMenuButtonVariants({ variant, size, isActive }),\n className,\n )}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n },\n);\nSidebarMenuButton.displayName = \"SidebarMenuButton\";\n\nconst SidebarMenuAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & { asChild?: boolean; showOnHover?: boolean }\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 after:md:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarMenuAction.displayName = \"SidebarMenuAction\";\n\nconst SidebarMenuBadge = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarMenuBadge.displayName = \"SidebarMenuBadge\";\n\nconst SidebarMenuSkeleton = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n showIcon?: boolean;\n }\n>(({ className, showIcon = false, ...props }, ref) => {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <div\n className=\"size-4 rounded-md animate-pulse bg-muted\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <div\n className=\"h-4 flex-1 max-w-[--skeleton-width] animate-pulse bg-muted rounded-full\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n});\nSidebarMenuSkeleton.displayName = \"SidebarMenuSkeleton\";\n\nconst SidebarMenuSub = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => {\n return (\n <ul\n ref={ref}\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\n // Hide when collapsed, show when hover-expanded\n \"group-data-[collapsible=icon]:hidden group-data-[hover-expanded=true]:!flex\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarMenuSub.displayName = \"SidebarMenuSub\";\n\nconst SidebarMenuSubItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ ...props }, ref) => <li ref={ref} {...props} />);\nSidebarMenuSubItem.displayName = \"SidebarMenuSubItem\";\n\nconst SidebarMenuSubButton = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n size?: \"sm\" | \"md\";\n isActive?: boolean;\n }\n>(({ asChild = false, size = \"md\", isActive, className, ...props }, ref) => {\n const Comp = asChild ? Slot : \"a\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 text-xs\",\n \"data-[active=true]:bg-primary/15 data-[active=true]:!text-primary data-[active=true]:font-bold\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarMenuSubButton.displayName = \"SidebarMenuSubButton\";\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n","// @goerp/core/ui/primitives\n// Primitive UI components (Server Compatible)\n\nimport * as React from \"react\";\nimport { cn } from \"../../utils\";\nimport { Button } from \"./button\";\nimport type { ButtonProps } from \"./button\";\n\nexport * from \"./badge\";\nexport * from \"./button\";\nexport * from \"./input\";\nexport * from \"./checkbox\";\n\n// ============================================================================\n// Textarea\n// ============================================================================\n\nexport interface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nTextarea.displayName = \"Textarea\";\n\nexport * from \"./card\";\nexport * from \"./separator\";\n\n// ============================================================================\n// Spinner / Loading\n// ============================================================================\n\nexport interface SpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\nexport function Spinner({ size = \"md\", className }: SpinnerProps) {\n const sizeClasses = {\n sm: \"h-4 w-4\",\n md: \"h-6 w-6\",\n lg: \"h-8 w-8\",\n };\n\n return (\n <div\n className={cn(\n \"animate-spin rounded-full border-2 border-current border-t-transparent\",\n sizeClasses[size],\n className,\n )}\n />\n );\n}\n\nexport interface ButtonLoadingProps extends ButtonProps {\n isLoading?: boolean;\n}\n\nexport const ButtonLoading = React.forwardRef<\n HTMLButtonElement,\n ButtonLoadingProps\n>(({ className, isLoading, children, disabled, ...props }, ref) => {\n return (\n <Button\n className={cn(\"gap-2\", className)}\n disabled={isLoading || disabled}\n ref={ref}\n {...props}\n >\n {isLoading && <Spinner size=\"sm\" />}\n {children}\n </Button>\n );\n});\nButtonLoading.displayName = \"ButtonLoading\";\n\n// ============================================================================\n// Skeleton\n// ============================================================================\n\nexport function Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\n// Data Display\nexport * from \"./card\"; // Added\nexport * from \"./table\";\nexport * from \"./dropdown-menu\";\n\n// Feedback\nexport * from \"./dialog\";\n\n// Layout\nexport * from \"./tabs\";\n\nexport * from \"./breadcrumb\";\nexport * from \"./keyboard\";\nexport * from \"./pagination\";\nexport * from \"./status-badge\";\nexport * from \"./sidebar\";\nexport * from \"./popover\";\nexport * from \"./scroll-area\";\nexport * from \"./calendar\";\nexport * from \"./resizable\";\nexport * from \"./slider\";\nexport * from \"./switch\";\nexport * from \"./tooltip\";\nexport * from \"./select\";\nexport * from \"./menubar\";\nexport * from \"./navigation-menu\";\nexport * from \"./toggle\";\nexport * from \"./toggle-group\";\nexport * from \"./combobox\";\nexport * from \"./label\";\n","// @goerp/core/ui/data-display\n// DataTableColumnHeader component for table column headers with sorting\n\n\"use client\";\n\nimport { ArrowDown, ArrowDownUp, ArrowUp, EyeOff, X } from \"lucide-react\";\n\nimport type { Column } from \"@tanstack/react-table\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nimport { Button } from \"../primitives\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../primitives/client\";\n\ninterface DataTableColumnHeaderProps<TData, TValue>\n extends ComponentProps<\"div\"> {\n column: Column<TData, TValue>;\n title: string;\n className?: string;\n}\n\nexport function DataTableColumnHeader<TData, TValue>({\n column,\n title,\n className,\n}: DataTableColumnHeaderProps<TData, TValue>) {\n if (!column.getCanSort()) {\n return <div className={cn(className)}>{title}</div>;\n }\n\n return (\n <div className={cn(\"flex items-center space-x-2\", className)}>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"-ml-3 h-8 data-[state=open]:bg-accent\"\n >\n <span>{title}</span>\n {column.getIsSorted() === \"desc\" ? (\n <ArrowDown className=\"ml-2 h-4 w-4\" />\n ) : column.getIsSorted() === \"asc\" ? (\n <ArrowUp className=\"ml-2 h-4 w-4\" />\n ) : (\n <ArrowDownUp className=\"ml-2 h-4 w-4\" />\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuItem onClick={() => column.toggleSorting(false)}>\n <ArrowUp className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Asc\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => column.toggleSorting(true)}>\n <ArrowDown className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Desc\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => column.toggleVisibility(false)}>\n <EyeOff className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Hide\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","// @goerp/core/ui/data-display\n// FormattedNumberInput component for number input with formatting\n\n\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { Input } from \"../primitives\";\n\n// =============================\n// Helper Functions\n// =============================\n\n// Giới hạn tối đa 2 số thập phân khi format\nconst formatNumber = (\n value: number | null,\n locale: string = \"vi-VN\",\n): string => {\n if (value === null || isNaN(value)) return \"\";\n return value.toLocaleString(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n};\n\n// Parse string -> number, có xét tới locale & số thập phân, giới hạn 2 digits\nconst parseNumberFromString = (\n raw: string,\n allowNegative: boolean,\n locale: string = \"vi-VN\",\n): number | null => {\n if (!raw) return null;\n\n // Chuẩn hoá khoảng trắng\n let cleaned = raw.replace(/[\\s]/g, \"\");\n\n // Xác định ký tự phân tách theo locale\n const isEn = locale.startsWith(\"en\"); // en-US, en-GB...\n const decimalSep = isEn ? \".\" : \",\"; // en: 1,234.56 | vi: 1.234,56\n const thousandSep = isEn ? \",\" : \".\";\n\n // Giữ lại: số, dấu . , , và -\n cleaned = cleaned.replace(/[^0-9.,-]/g, \"\");\n\n // Xử lý dấu âm\n let negative = false;\n const minusIndex = cleaned.indexOf(\"-\");\n if (minusIndex !== -1) {\n if (allowNegative && minusIndex === 0) {\n negative = true;\n }\n // bỏ tất cả dấu '-'\n cleaned = cleaned.replace(/-/g, \"\");\n }\n\n if (!cleaned) return null;\n\n // Tách phần nguyên & thập phân theo decimalSep (dùng lần xuất hiện cuối cùng)\n const lastDecimalIndex = cleaned.lastIndexOf(decimalSep);\n let intPart = \"\";\n let fracPart = \"\";\n\n if (lastDecimalIndex >= 0) {\n intPart = cleaned.slice(0, lastDecimalIndex);\n fracPart = cleaned.slice(lastDecimalIndex + 1);\n } else {\n intPart = cleaned;\n }\n\n // Xoá thousandSep trong phần nguyên và phần thập phân\n const tsRegex = new RegExp(`\\\\${thousandSep}`, \"g\");\n intPart = intPart.replace(tsRegex, \"\");\n fracPart = fracPart.replace(tsRegex, \"\");\n\n // Giới hạn tối đa 2 chữ số thập phân\n if (fracPart.length > 2) {\n fracPart = fracPart.slice(0, 2);\n }\n\n // Nếu không có phần thập phân thì coi là số nguyên\n let normalized = \"\";\n if (fracPart.length > 0) {\n normalized = `${intPart}.${fracPart}`;\n } else {\n normalized = intPart;\n }\n\n if (!normalized) return null;\n const num = Number((negative ? \"-\" : \"\") + normalized);\n return isNaN(num) ? null : num;\n};\n\n// =============================\n// FormattedNumberInput Component\n// =============================\n\nexport interface FormattedNumberInputProps\n extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"value\" | \"onChange\" | \"type\"\n > {\n value?: number | null;\n onValueChange?: (value: number | null) => void;\n min?: number;\n max?: number;\n step?: number;\n placeholder?: string;\n suffix?: string; // \"VNĐ\", \"%\", ...\n allowNegative?: boolean;\n locale?: string; // \"vi-VN\", \"en-US\", ...\n className?: string;\n}\n\nexport const FormattedNumberInput: React.FC<FormattedNumberInputProps> = ({\n value,\n onValueChange,\n min,\n max,\n step = 1,\n placeholder,\n suffix,\n allowNegative = false,\n locale = \"vi-VN\",\n className,\n ...inputProps\n}) => {\n const [internalNumber, setInternalNumber] = useState<number | null>(\n value ?? null,\n );\n const [displayValue, setDisplayValue] = useState<string>(\n formatNumber(value ?? null, locale),\n );\n\n useEffect(() => {\n if (value !== internalNumber) {\n setInternalNumber(value ?? null);\n setDisplayValue(formatNumber(value ?? null, locale));\n }\n }, [value, locale]);\n\n const clamp = (n: number | null): number | null => {\n if (n === null) return null;\n let res = n;\n if (typeof min === \"number\") res = Math.max(res, min);\n if (typeof max === \"number\") res = Math.min(res, max);\n return res;\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value;\n setDisplayValue(raw);\n\n // Parse for internal value\n const parsed = parseNumberFromString(raw, allowNegative, locale);\n const clamped = clamp(parsed);\n setInternalNumber(clamped);\n onValueChange?.(clamped);\n };\n\n const handleBlur = () => {\n setDisplayValue(formatNumber(internalNumber, locale));\n };\n\n const handleFocus = () => {\n // Optional: On focus, show raw value or keep as is?\n // Often easier to edit without separators.\n if (internalNumber !== null) {\n // Simple string representation for editing\n // But users might like seeing \"100.000\" and just changing one digit.\n // Let's keep it simple: Just let them edit the string they see.\n // If we want to strip separators on focus:\n // setDisplayValue(internalNumber.toString())\n // BUT current logic parseNumberFromString handles separators fine.\n // So we just let them edit.\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const current = internalNumber ?? 0;\n const delta = e.key === \"ArrowUp\" ? step : -step;\n const next = clamp(current + delta);\n setInternalNumber(next);\n setDisplayValue(formatNumber(next, locale));\n onValueChange?.(next);\n }\n };\n\n return (\n <div className=\"relative flex items-center w-full\">\n <Input\n type=\"text\"\n inputMode=\"decimal\"\n value={displayValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className={`font-mono text-sm ${suffix ? \"pr-12\" : \"\"} ${className || \"\"}`}\n {...inputProps}\n />\n {suffix && (\n <span className=\"pointer-events-none absolute right-3 text-xs text-muted-foreground\">\n {suffix}\n </span>\n )}\n </div>\n );\n};\n","// @goerp/core/ui/data-display\n// DataTablePagination component for table pagination\n\n\"use client\";\n\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from \"lucide-react\";\n\nimport type { Table } from \"@tanstack/react-table\";\n\nimport { Button, buttonVariants } from \"../primitives\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../primitives/client\";\n\ninterface DataTablePaginationProps<TData> {\n table: Table<TData>;\n totalItems?: number;\n currentPage?: number;\n pageSize?: number;\n}\n\nexport function DataTablePagination<TData>({\n table,\n totalItems,\n currentPage,\n pageSize,\n}: DataTablePaginationProps<TData>) {\n const startItem =\n totalItems && currentPage && pageSize\n ? (currentPage - 1) * pageSize + 1\n : table.getState().pagination.pageIndex *\n table.getState().pagination.pageSize +\n 1;\n const endItem =\n totalItems && currentPage && pageSize\n ? Math.min(currentPage * pageSize, totalItems)\n : Math.min(\n (table.getState().pagination.pageIndex + 1) *\n table.getState().pagination.pageSize,\n table.getFilteredRowModel().rows.length,\n );\n const total = totalItems ?? table.getFilteredRowModel().rows.length;\n\n return (\n <div className=\"flex flex-col items-center justify-between gap-2 py-1 md:flex-row md:gap-3\">\n <div className=\"flex-1 text-sm text-muted-foreground\">\n {total === 0 ? (\n <span>Không có dữ liệu</span>\n ) : (\n <span>\n Hiển thị {startItem} - {endItem} trong tổng số {total} mục\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium\">Số dòng mỗi trang</p>\n <Select\n value={`${table.getState().pagination.pageSize}`}\n onValueChange={(value) => {\n table.setPageSize(Number(value));\n }}\n >\n <SelectTrigger className=\"h-8 w-[70px]\">\n <SelectValue placeholder={table.getState().pagination.pageSize} />\n </SelectTrigger>\n <SelectContent side=\"top\">\n {[10, 20, 30, 50, 100].map((pageSize) => (\n <SelectItem key={pageSize} value={`${pageSize}`}>\n {pageSize}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n className=\"hidden h-8 w-8 p-0 lg:flex\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n <span className=\"sr-only\">Đi tới trang đầu</span>\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n className=\"h-8 w-8 p-0\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n <span className=\"sr-only\">Trang trước</span>\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"flex items-center justify-center text-sm font-medium\">\n Trang {table.getState().pagination.pageIndex + 1} /{\" \"}\n {table.getPageCount()}\n </div>\n <Button\n variant=\"outline\"\n className=\"h-8 w-8 p-0\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n <span className=\"sr-only\">Trang sau</span>\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n className=\"hidden h-8 w-8 p-0 lg:flex\"\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n <span className=\"sr-only\">Đi tới trang cuối</span>\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { DropdownMenuTrigger } from \"@radix-ui/react-dropdown-menu\";\nimport { Settings2 } from \"lucide-react\";\nimport type { Table } from \"@tanstack/react-table\";\n\nimport { Button } from \"../primitives/button\";\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from \"../primitives/client\"; // Importing from same package primitives\n\ninterface DataTableViewOptionsProps<TData> {\n table: Table<TData>;\n}\n\nexport function DataTableViewOptions<TData>({\n table,\n}: DataTableViewOptionsProps<TData>) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"ml-auto hidden h-8 lg:flex\"\n >\n <Settings2 className=\"mr-2 h-4 w-4\" />\n View\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[150px]\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter(\n (column) =>\n typeof column.accessorFn !== \"undefined\" && column.getCanHide(),\n )\n .map((column) => {\n return (\n <DropdownMenuCheckboxItem\n key={column.id}\n className=\"capitalize\"\n checked={column.getIsVisible()}\n onCheckedChange={(value) => column.toggleVisibility(!!value)}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","\"use client\"\n\nimport { ArrowDown, ArrowUp, Minus } from \"lucide-react\"\nimport type { LucideIcon } from \"lucide-react\"\n\nexport interface KpiCardProps {\n title: string\n value: number | string\n icon: LucideIcon\n color?: string\n percentageChange?: number\n note?: string\n}\n\nexport function KpiCard({\n title,\n value,\n icon: Icon,\n color,\n percentageChange,\n note,\n}: KpiCardProps) {\n const isPositive = percentageChange !== undefined && percentageChange > 0\n const isNeutral = percentageChange === 0\n\n return (\n <div\n className={`group relative rounded-lg shadow border-0 bg-gradient-to-br ${color || \"from-slate-500 to-slate-600\"} text-white transition-all duration-200 hover:scale-[1.01] hover:shadow-md active:scale-[0.99] min-h-[64px] overflow-hidden`}\n >\n <div className=\"absolute inset-0 opacity-5 bg-[radial-gradient(circle_at_1px_1px,_white_1px,_transparent_0)] bg-[length:16px_16px]\" />\n <div className=\"relative p-3 flex flex-col justify-between h-full\">\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-xs font-semibold opacity-90 leading-tight truncate pr-1\">\n {title}\n </p>\n <Icon className=\"h-4 w-4 shrink-0 opacity-80\" aria-hidden />\n </div>\n <div className=\"mt-2 space-y-1\">\n <p className=\"text-xl font-bold leading-none tracking-tight truncate\">\n {value}\n </p>\n {(percentageChange !== undefined || note) && (\n <div className=\"text-[10px] font-medium opacity-90 flex items-center gap-1.5\">\n {percentageChange !== undefined && (\n <span className=\"flex items-center\">\n {isPositive ? (\n <ArrowUp className=\"h-2.5 w-2.5 mr-0.5\" />\n ) : isNeutral ? (\n <Minus className=\"h-2.5 w-2.5 mr-0.5\" />\n ) : (\n <ArrowDown className=\"h-2.5 w-2.5 mr-0.5\" />\n )}\n {Math.abs(percentageChange)}%\n </span>\n )}\n {note && (\n <span className=\"opacity-80 truncate max-w-[100px]\" title={note}>\n {percentageChange !== undefined && \"•\"} {note}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n <div className=\"absolute inset-0 bg-gradient-to-br from-white/0 to-white/0 group-hover:from-white/5 group-hover:to-white/0 transition-all duration-200 pointer-events-none\" />\n </div>\n )\n}\n","import React, { memo } from \"react\";\nimport { cn } from \"../../utils\";\n\nexport type StatColorTheme =\n | \"dark\"\n | \"green\"\n | \"blue\"\n | \"purple\"\n | \"orange\"\n | \"emerald\"\n | \"rose\"\n | \"primary\"\n | \"destructive\"\n | \"muted\";\n\nexport interface CompactStatItem {\n id: string;\n label: string;\n value: string | number;\n icon: React.ElementType;\n colorTheme?: StatColorTheme;\n isHighlighted?: boolean;\n}\n\nexport interface CompactStatBarProps {\n items: CompactStatItem[];\n className?: string;\n}\n\nconst THEME_STYLES: Record<\n StatColorTheme,\n { wrapper: string; box: string; icon: string; label: string }\n> = {\n dark: {\n wrapper: \"hover:bg-[#181d26]/5 dark:hover:bg-slate-100/5\",\n box: \"bg-[#181d26] group-hover:bg-[#0a2e0e] dark:bg-slate-800 dark:group-hover:bg-slate-700\",\n icon: \"text-white\",\n label: \"text-[#181d26] dark:text-slate-300\",\n },\n green: {\n wrapper: \"hover:bg-[#006400]/10\",\n box: \"bg-[#006400] group-hover:bg-[#39bf45]\",\n icon: \"text-white\",\n label: \"text-[#006400] dark:text-[#39bf45]\",\n },\n blue: {\n wrapper: \"hover:bg-[#254fad]/10\",\n box: \"bg-[#254fad] group-hover:bg-[#1d3d8f]\",\n icon: \"text-white\",\n label: \"text-[#254fad] dark:text-[#60a5fa]\",\n },\n purple: {\n wrapper: \"hover:bg-[#7C3AED]/10\",\n box: \"bg-[#7C3AED] group-hover:bg-[#6D28D9]\",\n icon: \"text-white\",\n label: \"text-[#7C3AED] dark:text-[#a78bfa]\",\n },\n orange: {\n wrapper: \"hover:bg-[#EA580C]/10\",\n box: \"bg-[#EA580C] group-hover:bg-[#C2410C]\",\n icon: \"text-white\",\n label: \"text-[#EA580C] dark:text-[#fb923c]\",\n },\n emerald: {\n wrapper: \"hover:bg-[#059669]/10\",\n box: \"bg-[#059669] group-hover:bg-[#047857]\",\n icon: \"text-white\",\n label: \"text-[#059669] dark:text-[#34d399]\",\n },\n primary: {\n wrapper: \"hover:bg-primary/10\",\n box: \"bg-primary group-hover:bg-primary/90\",\n icon: \"text-primary-foreground\",\n label: \"text-primary\",\n },\n destructive: {\n wrapper: \"hover:bg-destructive/10\",\n box: \"bg-destructive group-hover:bg-destructive/90\",\n icon: \"text-destructive-foreground\",\n label: \"text-destructive\",\n },\n muted: {\n wrapper: \"hover:bg-muted/50\",\n box: \"bg-muted group-hover:bg-muted-foreground/20\",\n icon: \"text-muted-foreground\",\n label: \"text-muted-foreground\",\n },\n rose: {\n wrapper: \"hover:bg-[#E11D48]/10\",\n box: \"bg-[#E11D48] group-hover:bg-[#BE123C]\",\n icon: \"text-white\",\n label: \"text-[#E11D48] dark:text-[#fb7185]\",\n },\n};\n\nexport const CompactStatBar = memo(function CompactStatBar({\n items,\n className,\n}: CompactStatBarProps) {\n if (!items || items.length === 0) return null;\n\n return (\n <div className={cn(\"flex flex-col md:flex-row md:items-stretch gap-2 pb-1\", className)}>\n <div className=\"flex items-stretch overflow-x-auto no-scrollbar flex-1 bg-white dark:bg-[#1e293b] border border-slate-200 dark:border-slate-800 shadow-sm rounded-[10px] divide-x divide-slate-100 dark:divide-slate-800\">\n {items.map((item) => {\n const theme = THEME_STYLES[item.colorTheme || \"dark\"];\n const Icon = item.icon;\n\n return (\n <div\n key={item.id}\n className={cn(\n \"flex items-center gap-3 min-w-fit px-5 py-2 flex-1 transition-colors group cursor-default\",\n theme.wrapper\n )}\n >\n <div\n className={cn(\n \"p-1.5 rounded-md transition-colors shadow-sm shrink-0\",\n theme.box\n )}\n >\n <Icon className={cn(\"w-3.5 h-3.5\", theme.icon)} strokeWidth={2.5} />\n </div>\n <div className=\"flex flex-col\">\n <span\n className={cn(\n \"text-[9px] font-bold uppercase tracking-wider mb-0.5\",\n item.isHighlighted ? \"text-emerald-600 dark:text-emerald-400\" : theme.label\n )}\n >\n {item.label}\n </span>\n <span className={cn(\n \"font-black leading-none\",\n item.isHighlighted \n ? \"text-[22px] text-emerald-700 dark:text-emerald-400\" \n : \"text-[17px] text-slate-900 dark:text-white\"\n )}>\n {item.value}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n});\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../../utils\";\nimport { Button } from \"../primitives\";\n\ntype ShowMoreTextProps = ComponentProps<\"p\"> & {\n text: string;\n maxLength?: number;\n asChild?: boolean;\n};\n\nexport function ShowMoreText({\n className,\n text,\n maxLength = 250,\n asChild = false,\n ...props\n}: ShowMoreTextProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const Comp = asChild ? Slot : \"p\";\n\n if (text.length > maxLength) {\n return (\n <Comp\n data-slot=\"show-more-text\"\n className={cn(\"text-base\", className)}\n {...props}\n >\n {isExpanded ? text : `${text.slice(0, maxLength)}...`} <br />\n <Button\n variant=\"link\"\n size=\"sm\"\n className={cn(\"text-base p-0\", className)}\n onClick={() => setIsExpanded(!isExpanded)}\n >\n {isExpanded ? \"Read less\" : \"Read more\"}\n </Button>\n </Comp>\n );\n }\n\n return (\n <Comp\n data-slot=\"show-more-text\"\n className={cn(\"text-base\", className)}\n {...props}\n >\n {text}\n </Comp>\n );\n}\n","\"use client\";\n\nimport { createContext, useContext, useId, useMemo } from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\nimport type {\n CSSProperties,\n ComponentProps,\n ComponentType,\n ReactNode,\n} from \"react\";\nimport { cn } from \"../../utils\";\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const;\n\nexport type ChartConfig = {\n [k in string]: {\n label?: ReactNode;\n icon?: ComponentType;\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n );\n};\n\ntype ChartContextProps = {\n config: ChartConfig;\n};\n\nconst ChartContext = createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = useContext(ChartContext);\n\n if (!context) {\n throw new Error(\"useChart must be used within a <ChartContainer />\");\n }\n\n return context;\n}\n\ntype ChartContainerProps = ComponentProps<\"div\"> & {\n config: ChartConfig;\n children: ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"];\n};\n\nexport function ChartContainer({\n id,\n className,\n children,\n config,\n ...props\n}: ChartContainerProps) {\n const uniqueId = useId();\n const chartId = `chart-${id || uniqueId.replace(/:/g, \"\")}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-sm [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-hidden [&_.recharts-surface]:outline-hidden\",\n className,\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n}\n\nexport function ChartStyle({\n id,\n config,\n}: {\n id: string;\n config: ChartConfig;\n}) {\n const colorConfig = Object.entries(config).filter(\n ([_, config]) => config.theme || config.color,\n );\n\n if (!colorConfig.length) {\n return null;\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n itemConfig.color;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .join(\"\\n\")}\n}\n`,\n )\n .join(\"\\n\"),\n }}\n />\n );\n}\n\nexport const ChartTooltip = RechartsPrimitive.Tooltip;\n\ntype ChartTooltipContentProps = ComponentProps<\n typeof RechartsPrimitive.Tooltip\n> &\n ComponentProps<\"div\"> & {\n hideLabel?: boolean;\n hideIndicator?: boolean;\n indicator?: \"line\" | \"dot\" | \"dashed\";\n nameKey?: string;\n labelKey?: string;\n };\n\nexport function ChartTooltipContent({\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: ChartTooltipContentProps) {\n const { config } = useChart();\n\n const tooltipLabel = useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null;\n }\n\n const [item] = payload;\n const key = `${labelKey || item.dataKey || item.name || \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const value =\n !labelKey && typeof label === \"string\"\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label;\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium\", labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n );\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>;\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\";\n\n return (\n <div\n className={cn(\n \"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-sm shadow-xl\",\n className,\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload.map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = color || item.payload.fill || item.color;\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-1 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\",\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-sm border-(--color-border) bg-(--color-bg)\",\n {\n \"h-2.5 w-2.5\": indicator === \"dot\",\n \"w-1\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n },\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n } as CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between gap-4 leading-none\",\n nestLabel ? \"items-end\" : \"items-center\",\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value && (\n <span className=\"font-medium tabular-nums text-foreground\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport const ChartLegend = RechartsPrimitive.Legend;\n\ntype ChartLegendContentProps = ComponentProps<\"div\"> &\n Pick<RechartsPrimitive.LegendProps, \"payload\" | \"verticalAlign\"> & {\n hideIcon?: boolean;\n nameKey?: string;\n };\n\nexport function ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = \"bottom\",\n nameKey,\n}: ChartLegendContentProps) {\n const { config } = useChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-4\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className,\n )}\n >\n {payload.map((item) => {\n const key = `${nameKey || item.dataKey || \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n return (\n <div\n key={item.value}\n className={cn(\n \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\",\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n );\n })}\n </div>\n );\n}\n\n// Helper to extract item config from a payload.\nfunction getPayloadConfigFromPayload(\n config: ChartConfig,\n payload: unknown,\n key: string,\n) {\n if (typeof payload !== \"object\" || payload === null) {\n return undefined;\n }\n\n const payloadPayload =\n \"payload\" in payload &&\n typeof payload.payload === \"object\" &&\n payload.payload !== null\n ? payload.payload\n : undefined;\n\n let configLabelKey: string = key;\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === \"string\"\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string;\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string;\n }\n\n return configLabelKey in config\n ? config[configLabelKey]\n : config[key as keyof typeof config];\n}\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport useEmblaCarousel from \"embla-carousel-react\";\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\n\nimport type { UseEmblaCarouselType } from \"embla-carousel-react\";\nimport type { ComponentProps, KeyboardEvent } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nimport { Button } from \"../primitives\";\n\nexport type CarouselApi = UseEmblaCarouselType[1];\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>;\ntype CarouselOptions = UseCarouselParameters[0];\ntype CarouselPlugin = UseCarouselParameters[1];\n\ntype CarouselProps = {\n opts?: CarouselOptions;\n plugins?: CarouselPlugin;\n orientation?: \"horizontal\" | \"vertical\";\n setApi?: (api: CarouselApi) => void;\n};\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0];\n api: ReturnType<typeof useEmblaCarousel>[1];\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n} & CarouselProps;\n\nconst CarouselContext = createContext<CarouselContextProps | null>(null);\n\nfunction useCarousel() {\n const context = useContext(CarouselContext);\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\");\n }\n\n return context;\n}\n\nexport function Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins,\n );\n const [canScrollPrev, setCanScrollPrev] = useState(false);\n const [canScrollNext, setCanScrollNext] = useState(false);\n\n const onSelect = useCallback((api: CarouselApi) => {\n if (!api) {\n return;\n }\n\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n }, []);\n\n const scrollPrev = useCallback(() => {\n api?.scrollPrev();\n }, [api]);\n\n const scrollNext = useCallback(() => {\n api?.scrollNext();\n }, [api]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n scrollPrev();\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n scrollNext();\n }\n },\n [scrollPrev, scrollNext],\n );\n\n useEffect(() => {\n if (!api || !setApi) {\n return;\n }\n\n setApi(api);\n }, [api, setApi]);\n\n useEffect(() => {\n if (!api) {\n return;\n }\n\n onSelect(api);\n api.on(\"reInit\", onSelect);\n api.on(\"select\", onSelect);\n\n return () => {\n api?.off(\"select\", onSelect);\n };\n }, [api, onSelect]);\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation:\n orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n data-slot=\"carousel\"\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n );\n}\n\nexport function CarouselContent({\n className,\n ...props\n}: ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel();\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\">\n <div\n data-slot=\"carousel-content\"\n className={cn(\n \"flex\",\n orientation === \"horizontal\" ? \"-ms-4\" : \"-mt-4 flex-col\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\nexport function CarouselItem({ className, ...props }: ComponentProps<\"div\">) {\n const { orientation } = useCarousel();\n\n return (\n <div\n data-slot=\"carousel-item\"\n role=\"group\"\n aria-roledescription=\"slide\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"ps-4\" : \"pt-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute h-8 w-8\",\n orientation === \"horizontal\"\n ? \"top-1/2 -translate-y-1/2 ltr:-left-12 rtl:-right-12 rtl:[&_svg]:-scale-100\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n aria-label=\"Previous slide\"\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n );\n}\n\nexport function CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute h-8 w-8\",\n orientation === \"horizontal\"\n ? \"top-1/2 -translate-y-1/2 ltr:-right-12 rtl:-left-12 rtl:[&_svg]:-scale-100\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n aria-label=\"Next slide\"\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRight className=\"h-4 w-4\" />\n </Button>\n );\n}\n","\"use client\";\n\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport { ChevronDown } from \"lucide-react\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function Accordion({\n ...props\n}: ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />;\n}\n\nexport function AccordionItem({\n className,\n ...props\n}: ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"border-b last:border-b-0\", className)}\n {...props}\n />\n );\n}\n\nexport function AccordionTrigger({\n className,\n children,\n ...props\n}: ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"cursor-pointer flex flex-1 items-center justify-between py-4 text-sm text-start font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nexport function AccordionContent({\n className,\n children,\n ...props\n}: ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n );\n}\n","import React from \"react\";\nimport { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { cn } from \"../../../utils\";\nimport type { KanbanItemData } from \"./kanban-types\";\n\ninterface KanbanItemProps {\n item: KanbanItemData;\n isOverlay?: boolean;\n}\n\nexport function KanbanItem({ item, isOverlay }: KanbanItemProps) {\n const {\n setNodeRef,\n attributes,\n listeners,\n transform,\n transition,\n isDragging,\n } = useSortable({\n id: item.id,\n data: {\n type: \"Item\",\n item,\n },\n });\n\n const style = {\n transition,\n transform: CSS.Translate.toString(transform),\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n {...attributes}\n {...listeners}\n className={cn(\n \"relative flex cursor-grab flex-col gap-2 rounded-md border bg-card p-3 shadow-sm hover:ring-2 hover:ring-primary/20 bg-background hover:bg-accent/50\",\n isDragging && \"opacity-50\",\n isOverlay &&\n \"cursor-grabbing shadow-xl ring-2 ring-primary rotate-2 scale-105 z-50\",\n \"transition-colors duration-200\",\n )}\n >\n {item.content}\n </div>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { SortableContext, useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { cn } from \"../../../utils\";\nimport type { KanbanColumnData, KanbanItemData } from \"./kanban-types\";\nimport { KanbanItem } from \"./kanban-item\";\nimport { GripVertical } from \"lucide-react\";\nimport { ScrollArea } from \"../../primitives/scroll-area\";\n\ninterface KanbanColumnProps {\n column: KanbanColumnData;\n items: KanbanItemData[];\n isOverlay?: boolean;\n}\n\nexport function KanbanColumn({ column, items, isOverlay }: KanbanColumnProps) {\n const itemsIds = useMemo(() => items.map((item) => item.id), [items]);\n\n const {\n setNodeRef,\n attributes,\n listeners,\n transform,\n transition,\n isDragging,\n } = useSortable({\n id: column.id,\n data: {\n type: \"Column\",\n column,\n },\n });\n\n const style = {\n transition,\n transform: CSS.Translate.toString(transform),\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(\n \"flex h-[500px] max-h-[500px] w-[300px] flex-col rounded-lg bg-muted/50 dark:bg-muted/10 border-2 border-transparent\", // Layout fixed height for now, generic later\n isDragging && \"opacity-50\",\n isOverlay && \"opacity-50\", // Style handled by Overlay component logic usually\n )}\n >\n {/* Column Header */}\n <div\n {...attributes}\n {...listeners}\n className=\"flex items-center justify-between p-4 cursor-grab hover:bg-accent/50 rounded-t-lg transition-colors\"\n >\n <span className=\"font-semibold text-sm uppercase tracking-wider text-muted-foreground flex items-center gap-2\">\n {column.title}\n <span className=\"ml-2 rounded-full bg-background px-2 py-0.5 text-xs font-bold text-foreground border\">\n {items.length}\n </span>\n </span>\n <GripVertical className=\"bg-transparent h-4 w-4 text-muted-foreground/50\" />\n </div>\n\n {/* Column Content */}\n <div className=\"flex flex-grow flex-col gap-3 p-2 overflow-y-auto\">\n <SortableContext items={itemsIds}>\n {items.map((item) => (\n <KanbanItem key={item.id} item={item} />\n ))}\n </SortableContext>\n </div>\n </div>\n );\n}\n","import React, { useMemo, useState } from \"react\";\nimport type {\n DragStartEvent,\n DragEndEvent,\n DragOverEvent,\n} from \"@dnd-kit/core\";\nimport {\n DndContext,\n DragOverlay,\n useSensor,\n useSensors,\n PointerSensor,\n KeyboardSensor,\n closestCorners,\n defaultDropAnimationSideEffects,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n horizontalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { createPortal } from \"react-dom\";\n\nimport { KanbanColumn } from \"./kanban-column\";\nimport { KanbanItem } from \"./kanban-item\";\nimport type {\n KanbanColumnData,\n KanbanItemData,\n KanbanData,\n} from \"./kanban-types\";\nimport { cn } from \"../../../utils\";\n\ninterface KanbanBoardProps {\n initialData: KanbanData;\n onDragEnd?: (data: KanbanData) => void;\n className?: string;\n}\n\nexport function KanbanBoard({\n initialData,\n onDragEnd,\n className,\n}: KanbanBoardProps) {\n const [columns, setColumns] = useState<KanbanColumnData[]>(\n initialData.columns,\n );\n const [items, setItems] = useState<KanbanItemData[]>(initialData.items);\n const [activeColumn, setActiveColumn] = useState<KanbanColumnData | null>(\n null,\n );\n const [activeItem, setActiveItem] = useState<KanbanItemData | null>(null);\n\n const columnIds = useMemo(() => columns.map((col) => col.id), [columns]);\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 3, // Prevent accidental drags\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n function onDragStart(event: DragStartEvent) {\n if (event.active.data.current?.type === \"Column\") {\n setActiveColumn(event.active.data.current.column);\n return;\n }\n\n if (event.active.data.current?.type === \"Item\") {\n setActiveItem(event.active.data.current.item);\n return;\n }\n }\n\n function onDragOver(event: DragOverEvent) {\n const { active, over } = event;\n if (!over) return;\n\n const activeId = active.id;\n const overId = over.id;\n\n if (activeId === overId) return;\n\n const isActiveItem = active.data.current?.type === \"Item\";\n const isOverItem = over.data.current?.type === \"Item\";\n const isOverColumn = over.data.current?.type === \"Column\";\n\n if (!isActiveItem) return;\n\n // Dragging Item over Item\n if (isActiveItem && isOverItem) {\n setItems((items) => {\n const activeIndex = items.findIndex((t) => t.id === activeId);\n const overIndex = items.findIndex((t) => t.id === overId);\n\n if (items[activeIndex].columnId !== items[overIndex].columnId) {\n items[activeIndex].columnId = items[overIndex].columnId;\n return arrayMove(items, activeIndex, overIndex - 1); // Simple move, might need refinement\n }\n\n return arrayMove(items, activeIndex, overIndex);\n });\n }\n\n // Dragging Item over Column\n if (isActiveItem && isOverColumn) {\n setItems((items) => {\n const activeIndex = items.findIndex((t) => t.id === activeId);\n if (items[activeIndex].columnId !== overId) {\n items[activeIndex].columnId = overId; // Move to new column\n return arrayMove(items, activeIndex, activeIndex); // Force re-render\n }\n return items;\n });\n }\n }\n\n function onDragEndHandler(event: DragEndEvent) {\n setActiveColumn(null);\n setActiveItem(null);\n\n const { active, over } = event;\n if (!over) return;\n\n const activeId = active.id;\n const overId = over.id;\n\n if (activeId === overId) return;\n\n const isActiveColumn = active.data.current?.type === \"Column\";\n\n if (isActiveColumn) {\n setColumns((columns) => {\n const activeIndex = columns.findIndex((c) => c.id === activeId);\n const overIndex = columns.findIndex((c) => c.id === overId);\n const newColumns = arrayMove(columns, activeIndex, overIndex);\n // Notify parent\n if (onDragEnd) onDragEnd({ columns: newColumns, items });\n return newColumns;\n });\n return;\n }\n\n // For items, logic handled in DragOver basically, just sync final state\n if (onDragEnd) onDragEnd({ columns, items });\n }\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCorners}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDragEnd={onDragEndHandler}\n >\n <div className={cn(\"m-auto flex gap-4 overflow-x-auto pb-4\", className)}>\n <SortableContext\n items={columnIds}\n strategy={horizontalListSortingStrategy}\n >\n {columns.map((col) => (\n <KanbanColumn\n key={col.id}\n column={col}\n items={items.filter((item) => item.columnId === col.id)}\n />\n ))}\n </SortableContext>\n </div>\n\n <>\n {createPortal(\n <DragOverlay>\n {activeColumn && (\n <KanbanColumn\n column={activeColumn}\n items={items.filter((item) => item.columnId === activeColumn.id)}\n isOverlay\n />\n )}\n {activeItem && <KanbanItem item={activeItem} isOverlay />}\n </DragOverlay>,\n document.body,\n )}\n </>\n </DndContext>\n );\n}\n","import type { UniqueIdentifier } from \"@dnd-kit/core\";\n\nexport type KanbanItemId = UniqueIdentifier;\nexport type KanbanColumnId = UniqueIdentifier;\n\nexport interface KanbanItemData {\n id: KanbanItemId;\n columnId: KanbanColumnId;\n content: React.ReactNode;\n [key: string]: any;\n}\n\nexport interface KanbanColumnData {\n id: KanbanColumnId;\n title: string;\n}\n\nexport type KanbanData = {\n columns: KanbanColumnData[];\n items: KanbanItemData[];\n};\n","export * from \"./kanban-board\";\nexport * from \"./kanban-column\";\nexport * from \"./kanban-item\";\nexport * from \"./kanban-types\";\n","\"use client\";\n\nimport * as AspectRatioPrimitive from \"@radix-ui/react-aspect-ratio\";\n\nimport type { ComponentProps } from \"react\";\n\nexport function AspectRatio({\n ...props\n}: ComponentProps<typeof AspectRatioPrimitive.Root>) {\n return <AspectRatioPrimitive.Root data-slot=\"aspect-ratio\" {...props} />;\n}\n","import { Slot } from \"@radix-ui/react-slot\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function BentoGrid({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"bento-grid\"\n className={cn(\"w-full grid gap-4 mx-auto md:grid-cols-3\", className)}\n {...props}\n />\n );\n}\n\nexport function BentoItem({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"bento-item\"\n className={cn(\n \"group/bento flex flex-col justify-between gap-6 p-6 bg-card text-card-foreground rounded-lg border overflow-hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function BentoHeader({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"bento-header\"\n className={cn(\"flex-1 w-full h-full select-none\", className)}\n {...props}\n />\n );\n}\n\nexport function BentoContent({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"bento-content\"\n className={cn(\"space-y-1.5\", className)}\n {...props}\n />\n );\n}\n\ninterface BentoTitleProps extends ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nexport function BentoTitle({ className, asChild, ...props }: BentoTitleProps) {\n const Comp = asChild ? Slot : \"h2\";\n\n return (\n <Comp\n data-slot=\"bento-title\"\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n );\n}\n\nexport function BentoDescription({\n className,\n ...props\n}: ComponentProps<\"div\">) {\n return (\n <p\n data-slot=\"bento-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n","import { Fragment } from \"react\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport { toJsxRuntime } from \"hast-util-to-jsx-runtime\";\nimport { codeToHast } from \"shiki/bundle/web\";\n\nimport type { JSX } from \"react\";\nimport type { BundledLanguage } from \"shiki/bundle/web\";\n\nexport async function highlight(code: string, lang: BundledLanguage) {\n const out = await codeToHast(code, {\n lang,\n theme: \"github-dark\",\n });\n\n return toJsxRuntime(out, {\n Fragment,\n jsx,\n jsxs,\n }) as JSX.Element;\n}\n","\"use client\";\n\nimport { useLayoutEffect, useState } from \"react\";\nimport { bundledLanguages } from \"shiki/bundle/web\";\n\nimport type { JSX } from \"react\";\nimport type { BundledLanguage } from \"shiki/bundle/web\";\n\nimport { Button } from \"../primitives\";\nimport { highlight } from \"./highlight\";\n\nfunction isBundledLanguage(value: unknown): value is BundledLanguage {\n return typeof value === \"string\" && value in bundledLanguages;\n}\n\nexport function CodeBlock({\n children,\n lang,\n}: {\n children: string;\n lang: string;\n}) {\n const [nodes, setNodes] = useState<JSX.Element>();\n const [copied, setCopied] = useState(false);\n\n const language = isBundledLanguage(lang) ? lang : \"markdown\";\n\n useLayoutEffect(() => {\n void highlight(children, language).then(setNodes);\n }, [children, language]);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(children);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n console.error(\"Failed to copy text: \", error);\n }\n };\n\n return (\n <div className=\"relative\">\n <Button\n variant=\"secondary\"\n className=\"absolute end-2 top-2 w-16\"\n onClick={handleCopy}\n >\n {copied ? \"Copied!\" : \"Copy\"}\n </Button>\n {nodes}\n </div>\n );\n}\n","\"use client\";\n\nimport * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function Collapsible({\n ...props\n}: ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />;\n}\n\nexport function CollapsibleTrigger({\n className,\n ...props\n}: ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function CollapsibleContent({\n className,\n ...props\n}: ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return (\n <CollapsiblePrimitive.CollapsibleContent\n data-slot=\"collapsible-content\"\n className={cn(\n \"overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\",\n className,\n )}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as HoverCardPrimitive from \"@radix-ui/react-hover-card\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function HoverCard({\n ...props\n}: ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />;\n}\n\nexport function HoverCardTrigger({\n className,\n ...props\n}: ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger\n data-slot=\"hover-card-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n );\n}\n","import type { SVGProps } from \"react\";\n\nexport interface Iphone15ProProps extends SVGProps<SVGSVGElement> {\n width?: number;\n height?: number;\n imageSrc?: string;\n videoSrc?: string;\n id?: string;\n}\n\nexport function Iphone15Pro({\n width = 433,\n height = 882,\n imageSrc,\n videoSrc,\n id = \"iphone-15-pro\",\n ...props\n}: Iphone15ProProps) {\n const roundedCornersClipId = id + \"-rounded-corners\";\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n id={id}\n {...props}\n >\n <path\n d=\"M2 73C2 32.6832 34.6832 0 75 0H357C397.317 0 430 32.6832 430 73V809C430 849.317 397.317 882 357 882H75C34.6832 882 2 849.317 2 809V73Z\"\n className=\"fill-muted\"\n />\n <path\n d=\"M0 171C0 170.448 0.447715 170 1 170H3V204H1C0.447715 204 0 203.552 0 203V171Z\"\n className=\"fill-muted\"\n />\n <path\n d=\"M1 234C1 233.448 1.44772 233 2 233H3.5V300H2C1.44772 300 1 299.552 1 299V234Z\"\n className=\"fill-muted\"\n />\n <path\n d=\"M1 319C1 318.448 1.44772 318 2 318H3.5V385H2C1.44772 385 1 384.552 1 384V319Z\"\n className=\"fill-muted\"\n />\n <path\n d=\"M430 279H432C432.552 279 433 279.448 433 280V384C433 384.552 432.552 385 432 385H430V279Z\"\n className=\"fill-muted\"\n />\n <path\n d=\"M6 74C6 35.3401 37.3401 4 76 4H356C394.66 4 426 35.3401 426 74V808C426 846.66 394.66 878 356 878H76C37.3401 878 6 846.66 6 808V74Z\"\n className=\"fill-background\"\n />\n <path\n opacity=\"0.5\"\n d=\"M174 5H258V5.5C258 6.60457 257.105 7.5 256 7.5H176C174.895 7.5 174 6.60457 174 5.5V5Z\"\n className=\"fill-muted\"\n />\n <path\n d=\"M21.25 75C21.25 44.2101 46.2101 19.25 77 19.25H355C385.79 19.25 410.75 44.2101 410.75 75V807C410.75 837.79 385.79 862.75 355 862.75H77C46.2101 862.75 21.25 837.79 21.25 807V75Z\"\n className=\"fill-muted stroke-muted stroke-[0.5]\"\n />\n\n {imageSrc && (\n <image\n href={imageSrc}\n x=\"21.25\"\n y=\"19.25\"\n width=\"389.5\"\n height=\"843.5\"\n preserveAspectRatio=\"xMidYMid slice\"\n clipPath={`url(#${roundedCornersClipId})`}\n />\n )}\n {videoSrc && (\n <foreignObject x=\"21.25\" y=\"19.25\" width=\"389.5\" height=\"843.5\">\n <video\n className=\"size-full overflow-hidden rounded-[55.75px] object-cover\"\n src={videoSrc}\n autoPlay\n loop\n muted\n playsInline\n />\n </foreignObject>\n )}\n <path\n d=\"M154 48.5C154 38.2827 162.283 30 172.5 30H259.5C269.717 30 278 38.2827 278 48.5C278 58.7173 269.717 67 259.5 67H172.5C162.283 67 154 58.7173 154 48.5Z\"\n className=\"fill-muted\"\n />\n <path\n d=\"M249 48.5C249 42.701 253.701 38 259.5 38C265.299 38 270 42.701 270 48.5C270 54.299 265.299 59 259.5 59C253.701 59 249 54.299 249 48.5Z\"\n className=\"fill-muted\"\n />\n <path\n d=\"M254 48.5C254 45.4624 256.462 43 259.5 43C262.538 43 265 45.4624 265 48.5C265 51.5376 262.538 54 259.5 54C256.462 54 254 51.5376 254 48.5Z\"\n className=\"fill-background\"\n />\n <defs>\n <clipPath id={roundedCornersClipId}>\n <rect\n x=\"21.25\"\n y=\"19.25\"\n width=\"389.5\"\n height=\"843.5\"\n rx=\"55.75\"\n ry=\"55.75\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n}\n","\"use client\";\n\nimport Image from \"next/image\";\n\nimport type { ComponentProps, MouseEvent } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport interface MediaType {\n src: string;\n alt: string;\n type?: \"IMAGE\" | \"VIDEO\";\n}\n\nexport interface MediaGridProps extends ComponentProps<\"ul\"> {\n data: Array<MediaType>;\n limit?: number;\n onMoreButtonClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n onMediaClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport function MediaGrid({\n data,\n limit = 4,\n onMoreButtonClick,\n onMediaClick,\n className,\n ...props\n}: MediaGridProps) {\n if (data.length === 0) return null;\n\n const displayedMedia = data.slice(0, limit - 1);\n const remainingCount = data.length - displayedMedia.length - 1;\n const hasMoreMedia = data.length >= limit;\n const lastMedia = hasMoreMedia ? data[limit - 1] : null;\n\n return (\n <ul\n className={cn(\n \"grid gap-2 rounded-lg\",\n data.length > 1 && \"grid-cols-2\",\n className,\n )}\n {...props}\n >\n {displayedMedia.map((item) => (\n <li key={`${item.alt}-${item.src}`}>\n <button\n type=\"button\"\n onClick={onMediaClick}\n className=\"cursor-pointer relative size-full aspect-square before:absolute before:inset-0 before:rounded-lg before:z-10 hover:before:bg-black/5\"\n aria-label=\"Media\"\n >\n {item.type === \"VIDEO\" ? (\n <video\n src={item.src}\n className=\"object-cover size-full rounded-lg\"\n controls\n muted\n />\n ) : (\n <Image\n src={item.src}\n alt={item.alt}\n className=\"object-cover rounded-lg\"\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw\"\n fill\n />\n )}\n </button>\n </li>\n ))}\n\n {lastMedia && (\n <li>\n <button\n type=\"button\"\n onClick={(e) =>\n remainingCount > 0 ? onMoreButtonClick?.(e) : onMediaClick?.(e)\n }\n className=\"cursor-pointer relative size-full aspect-square before:absolute before:inset-0 before:rounded-lg before:z-10 hover:before:bg-black/5\"\n aria-label={remainingCount > 0 ? \"More media\" : \"Media\"}\n >\n {lastMedia.type === \"VIDEO\" ? (\n <video\n src={lastMedia.src}\n className=\"object-cover rounded-lg size-full\"\n controls\n muted\n />\n ) : (\n <Image\n src={lastMedia.src}\n alt={lastMedia.alt}\n className=\"object-cover rounded-lg\"\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw\"\n fill\n />\n )}\n {remainingCount > 0 && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/25 text-3xl text-white font-semibold rounded-lg\">\n <span>+{remainingCount}</span>\n </div>\n )}\n </button>\n </li>\n )}\n </ul>\n );\n}\n","import type { SVGProps } from \"react\";\n\ntype SafariMode = \"default\" | \"simple\";\n\nexport interface SafariProps extends SVGProps<SVGSVGElement> {\n url?: string;\n imageSrc?: string;\n videoSrc?: string;\n width?: number;\n height?: number;\n mode?: SafariMode;\n id?: string;\n}\n\nexport function Safari({\n imageSrc,\n videoSrc,\n url,\n width = 1203,\n height = 753,\n mode = \"default\",\n id = \"safari\",\n ...props\n}: SafariProps) {\n const roundedBottomClipId = id + \"-rounded-bottom\";\n const path0ClipId = id + \"-path-0\";\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n id={id}\n {...props}\n >\n <g clipPath={`url(#${path0ClipId})`}>\n <path\n d=\"M0 52H1202V741C1202 747.627 1196.63 753 1190 753H12C5.37258 753 0 747.627 0 741V52Z\"\n className=\"fill-border\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0 12C0 5.37258 5.37258 0 12 0H1190C1196.63 0 1202 5.37258 1202 12V52H0L0 12Z\"\n className=\"fill-border\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M1.06738 12C1.06738 5.92487 5.99225 1 12.0674 1H1189.93C1196.01 1 1200.93 5.92487 1200.93 12V51H1.06738V12Z\"\n className=\"fill-background\"\n />\n <circle cx=\"27\" cy=\"25\" r=\"6\" className=\"fill-muted\" />\n <circle cx=\"47\" cy=\"25\" r=\"6\" className=\"fill-muted\" />\n <circle cx=\"67\" cy=\"25\" r=\"6\" className=\"fill-muted\" />\n <path\n d=\"M286 17C286 13.6863 288.686 11 292 11H946C949.314 11 952 13.6863 952 17V35C952 38.3137 949.314 41 946 41H292C288.686 41 286 38.3137 286 35V17Z\"\n className=\"fill-muted\"\n />\n <g className=\"mix-blend-luminosity\">\n <path\n d=\"M566.269 32.0852H572.426C573.277 32.0852 573.696 31.6663 573.696 30.7395V25.9851C573.696 25.1472 573.353 24.7219 572.642 24.6521V23.0842C572.642 20.6721 571.036 19.5105 569.348 19.5105C567.659 19.5105 566.053 20.6721 566.053 23.0842V24.6711C565.393 24.7727 565 25.1917 565 25.9851V30.7395C565 31.6663 565.418 32.0852 566.269 32.0852ZM567.272 22.97C567.272 21.491 568.211 20.6785 569.348 20.6785C570.478 20.6785 571.423 21.491 571.423 22.97V24.6394L567.272 24.6458V22.97Z\"\n fill=\"var(--color-muted-foreground)\"\n />\n </g>\n <g className=\"mix-blend-luminosity\">\n <text\n x=\"580\"\n y=\"30\"\n fill=\"var(--color-muted-foreground)\"\n fontSize=\"12\"\n fontFamily=\"Arial, sans-serif\"\n >\n {url}\n </text>\n </g>\n {mode === \"default\" ? (\n <>\n <g className=\"mix-blend-luminosity\">\n <path\n d=\"M265.5 33.8984C265.641 33.8984 265.852 33.8516 266.047 33.7422C270.547 31.2969 272.109 30.1641 272.109 27.3203V21.4219C272.109 20.4844 271.742 20.1484 270.961 19.8125C270.094 19.4453 267.18 18.4297 266.328 18.1406C266.07 18.0547 265.766 18 265.5 18C265.234 18 264.93 18.0703 264.672 18.1406C263.82 18.3828 260.906 19.4531 260.039 19.8125C259.258 20.1406 258.891 20.4844 258.891 21.4219V27.3203C258.891 30.1641 260.461 31.2812 264.945 33.7422C265.148 33.8516 265.359 33.8984 265.5 33.8984ZM265.922 19.5781C266.945 19.9766 269.172 20.7656 270.344 21.1875C270.562 21.2656 270.617 21.3828 270.617 21.6641V27.0234C270.617 29.3125 269.469 29.9375 265.945 32.0625C265.727 32.1875 265.617 32.2344 265.508 32.2344V19.4844C265.617 19.4844 265.734 19.5156 265.922 19.5781Z\"\n fill=\"var(--color-muted-foreground)\"\n />\n </g>\n <g className=\"mix-blend-luminosity\">\n <path\n d=\"M936.273 24.9766C936.5 24.9766 936.68 24.9062 936.82 24.7578L940.023 21.5312C940.195 21.3594 940.273 21.1719 940.273 20.9531C940.273 20.7422 940.188 20.5391 940.023 20.3828L936.82 17.125C936.68 16.9688 936.5 16.8906 936.273 16.8906C935.852 16.8906 935.516 17.2422 935.516 17.6719C935.516 17.8828 935.594 18.0547 935.727 18.2031L937.594 20.0312C937.227 19.9766 936.852 19.9453 936.477 19.9453C932.609 19.9453 929.516 23.0391 929.516 26.9141C929.516 30.7891 932.633 33.9062 936.5 33.9062C940.375 33.9062 943.484 30.7891 943.484 26.9141C943.484 26.4453 943.156 26.1094 942.688 26.1094C942.234 26.1094 941.93 26.4453 941.93 26.9141C941.93 29.9297 939.516 32.3516 936.5 32.3516C933.492 32.3516 931.07 29.9297 931.07 26.9141C931.07 23.875 933.469 21.4688 936.477 21.4688C936.984 21.4688 937.453 21.5078 937.867 21.5781L935.734 23.6875C935.594 23.8281 935.516 24 935.516 24.2109C935.516 24.6406 935.852 24.9766 936.273 24.9766Z\"\n fill=\"var(--color-muted-foreground)\"\n />\n </g>\n <g className=\"mix-blend-luminosity\">\n <path\n d=\"M1134 33.0156C1134.49 33.0156 1134.89 32.6094 1134.89 32.1484V27.2578H1139.66C1140.13 27.2578 1140.54 26.8594 1140.54 26.3672C1140.54 25.8828 1140.13 25.4766 1139.66 25.4766H1134.89V20.5859C1134.89 20.1172 1134.49 19.7188 1134 19.7188C1133.52 19.7188 1133.11 20.1172 1133.11 20.5859V25.4766H1128.34C1127.88 25.4766 1127.46 25.8828 1127.46 26.3672C1127.46 26.8594 1127.88 27.2578 1128.34 27.2578H1133.11V32.1484C1133.11 32.6094 1133.52 33.0156 1134 33.0156Z\"\n fill=\"var(--color-muted-foreground)\"\n />\n </g>\n <g className=\"mix-blend-luminosity\">\n <path\n d=\"M1161.8 31.0703H1163.23V32.375C1163.23 34.0547 1164.12 34.9219 1165.81 34.9219H1174.2C1175.89 34.9219 1176.77 34.0547 1176.77 32.3828V24.0469C1176.77 22.375 1175.89 21.5 1174.2 21.5H1172.77V20.2578C1172.77 18.5859 1171.88 17.7109 1170.19 17.7109H1161.8C1160.1 17.7109 1159.23 18.5781 1159.23 20.2578V28.5234C1159.23 30.1953 1160.1 31.0703 1161.8 31.0703ZM1161.9 29.5078C1161.18 29.5078 1160.78 29.1328 1160.78 28.3828V20.3984C1160.78 19.6406 1161.18 19.2656 1161.9 19.2656H1170.09C1170.8 19.2656 1171.2 19.6406 1171.2 20.3984V21.5H1165.81C1164.12 21.5 1163.23 22.375 1163.23 24.0469V29.5078H1161.9ZM1165.91 33.3672C1165.19 33.3672 1164.8 32.9922 1164.8 32.2422V24.1875C1164.8 23.4297 1165.19 23.0625 1165.91 23.0625H1174.1C1174.81 23.0625 1175.21 23.4297 1175.21 24.1875V32.2422C1175.21 32.9922 1174.81 33.3672 1174.1 33.3672H1165.91Z\"\n fill=\"var(--color-muted-foreground)\"\n />\n </g>\n <g className=\"mix-blend-luminosity\">\n <path\n d=\"M1099.51 28.4141C1099.91 28.4141 1100.24 28.0859 1100.24 27.6953V19.8359L1100.18 18.6797L1100.66 19.25L1101.75 20.4141C1101.88 20.5547 1102.06 20.625 1102.24 20.625C1102.6 20.625 1102.9 20.3672 1102.9 20C1102.9 19.8047 1102.82 19.6641 1102.69 19.5312L1100.06 17.0078C1099.88 16.8203 1099.7 16.7578 1099.51 16.7578C1099.32 16.7578 1099.14 16.8203 1098.95 17.0078L1096.33 19.5312C1096.2 19.6641 1096.12 19.8047 1096.12 20C1096.12 20.3672 1096.41 20.625 1096.77 20.625C1096.95 20.625 1097.14 20.5547 1097.27 20.4141L1098.35 19.25L1098.84 18.6719L1098.78 19.8359V27.6953C1098.78 28.0859 1099.11 28.4141 1099.51 28.4141ZM1095 34.6562H1104C1105.7 34.6562 1106.57 33.7812 1106.57 32.1094V24.4297C1106.57 22.7578 1105.7 21.8828 1104 21.8828H1101.89V23.4375H1103.9C1104.61 23.4375 1105.02 23.8125 1105.02 24.5625V31.9688C1105.02 32.7188 1104.61 33.0938 1103.9 33.0938H1095.1C1094.38 33.0938 1093.98 32.7188 1093.98 31.9688V24.5625C1093.98 23.8125 1094.38 23.4375 1095.1 23.4375H1097.13V21.8828H1095C1093.31 21.8828 1092.43 22.75 1092.43 24.4297V32.1094C1092.43 33.7812 1093.31 34.6562 1095 34.6562Z\"\n fill=\"var(--color-muted-foreground)\"\n />\n </g>\n <g className=\"mix-blend-luminosity\">\n <path\n d=\"M99.5703 33.6016H112.938C114.633 33.6016 115.516 32.7266 115.516 31.0547V21.5469C115.516 19.875 114.633 19 112.938 19H99.5703C97.8828 19 97 19.8672 97 21.5469V31.0547C97 32.7266 97.8828 33.6016 99.5703 33.6016ZM99.6719 32.0469C98.9531 32.0469 98.5547 31.6719 98.5547 30.9141V21.6875C98.5547 20.9297 98.9531 20.5547 99.6719 20.5547H103.234V32.0469H99.6719ZM112.836 20.5547C113.555 20.5547 113.953 20.9297 113.953 21.6875V30.9141C113.953 31.6719 113.555 32.0469 112.836 32.0469H104.711V20.5547H112.836ZM101.703 23.4141C101.984 23.4141 102.219 23.1719 102.219 22.9062C102.219 22.6406 101.984 22.4062 101.703 22.4062H100.102C99.8203 22.4062 99.5859 22.6406 99.5859 22.9062C99.5859 23.1719 99.8203 23.4141 100.102 23.4141H101.703ZM101.703 25.5156C101.984 25.5156 102.219 25.2812 102.219 25.0078C102.219 24.7422 101.984 24.5078 101.703 24.5078H100.102C99.8203 24.5078 99.5859 24.7422 99.5859 25.0078C99.5859 25.2812 99.8203 25.5156 100.102 25.5156H101.703ZM101.703 27.6094C101.984 27.6094 102.219 27.3828 102.219 27.1094C102.219 26.8438 101.984 26.6172 101.703 26.6172H100.102C99.8203 26.6172 99.5859 26.8438 99.5859 27.1094C99.5859 27.3828 99.8203 27.6094 100.102 27.6094H101.703Z\"\n fill=\"var(--color-muted-foreground)\"\n />\n </g>\n <g className=\"mix-blend-luminosity\">\n <path\n d=\"M143.914 32.5938C144.094 32.7656 144.312 32.8594 144.562 32.8594C145.086 32.8594 145.492 32.4531 145.492 31.9375C145.492 31.6797 145.391 31.4453 145.211 31.2656L139.742 25.9219L145.211 20.5938C145.391 20.4141 145.492 20.1719 145.492 19.9219C145.492 19.4062 145.086 19 144.562 19C144.312 19 144.094 19.0938 143.922 19.2656L137.844 25.2031C137.625 25.4062 137.516 25.6562 137.516 25.9297C137.516 26.2031 137.625 26.4375 137.836 26.6484L143.914 32.5938Z\"\n fill=\"var(--color-muted-foreground)\"\n />\n </g>\n <g className=\"mix-blend-luminosity\">\n <path\n d=\"M168.422 32.8594C168.68 32.8594 168.891 32.7656 169.07 32.5938L175.148 26.6562C175.359 26.4375 175.469 26.2109 175.469 25.9297C175.469 25.6562 175.367 25.4141 175.148 25.2109L169.07 19.2656C168.891 19.0938 168.68 19 168.422 19C167.898 19 167.492 19.4062 167.492 19.9219C167.492 20.1719 167.602 20.4141 167.773 20.5938L173.25 25.9375L167.773 31.2656C167.594 31.4531 167.492 31.6797 167.492 31.9375C167.492 32.4531 167.898 32.8594 168.422 32.8594Z\"\n fill=\"var(--color-muted-foreground)\"\n />\n </g>\n </>\n ) : null}\n {imageSrc && (\n <image\n href={imageSrc}\n width=\"1200\"\n height=\"700\"\n x=\"1\"\n y=\"52\"\n preserveAspectRatio=\"xMidYMid slice\"\n clipPath={`url(#${roundedBottomClipId})`}\n />\n )}\n {videoSrc && (\n <foreignObject\n x=\"1\"\n y=\"52\"\n width=\"1200\"\n height=\"700\"\n preserveAspectRatio=\"xMidYMid slice\"\n clipPath={`url(#${roundedBottomClipId})`}\n >\n <video\n className=\"size-full overflow-hidden object-cover\"\n src={videoSrc}\n autoPlay\n loop\n muted\n playsInline\n />\n </foreignObject>\n )}\n </g>\n <defs>\n <clipPath id={path0ClipId}>\n <rect width={width} height={height} fill=\"var(--color-background)\" />\n </clipPath>\n <clipPath id={roundedBottomClipId}>\n <path\n d=\"M1 52H1201V741C1201 747.075 1196.08 752 1190 752H12C5.92486 752 1 747.075 1 741V52Z\"\n fill=\"var(--color-background)\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n}\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { cva } from \"class-variance-authority\";\n\nimport type { DynamicIconNameType } from \"../../types\";\nimport type * as SeparatorPrimitive from \"@radix-ui/react-separator\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nimport { DynamicIcon } from \"../primitives/client\";\nimport { Separator } from \"../primitives\";\n\nexport const timelineVariants = cva(\"grid\", {\n variants: {\n align: {\n left: \"[&>li]:grid-cols-[0_min-content_1fr]\",\n right: \"[&>li]:grid-cols-[1fr_min-content]\",\n center: \"[&>li]:grid-cols-[1fr_min-content_1fr]\",\n },\n },\n defaultVariants: {\n align: \"left\",\n },\n});\n\ntype TimelineProps = ComponentProps<\"ul\"> &\n VariantProps<typeof timelineVariants>;\n\nexport function Timeline({\n children,\n className,\n align,\n ...props\n}: TimelineProps) {\n return (\n <ul\n data-slot=\"timeline\"\n className={cn(timelineVariants({ align }), className)}\n {...props}\n >\n {children}\n </ul>\n );\n}\n\nexport const timelineItemVariants = cva(\"grid items-center gap-x-2\", {\n variants: {\n status: {\n done: \"text-foreground\",\n default: \"text-muted-foreground\",\n },\n },\n defaultVariants: {\n status: \"default\",\n },\n});\n\ntype TimelineItemProps = ComponentProps<\"li\"> &\n VariantProps<typeof timelineItemVariants>;\n\nexport function TimelineItem({\n className,\n status,\n ...props\n}: TimelineItemProps) {\n return (\n <li\n data-slot=\"timeline-item\"\n className={cn(timelineItemVariants({ status }), className)}\n {...props}\n />\n );\n}\n\ntype TimelineDotStatus = \"current\" | \"done\" | \"error\";\n\ninterface TimelineDotPropsBase extends ComponentProps<\"div\"> {\n iconClassName?: string;\n}\n\ninterface TimelineDotPropsWithStatus extends TimelineDotPropsBase {\n status?: TimelineDotStatus;\n customIconName?: never;\n customStatusName?: never;\n}\n\ninterface TimelineDotPropsWithCustom extends TimelineDotPropsBase {\n status?: never;\n customIconName: DynamicIconNameType;\n customStatusName: string;\n}\n\ntype TimelineDotProps = TimelineDotPropsWithStatus | TimelineDotPropsWithCustom;\n\ntype StatusIconNamesType = Record<\n TimelineDotStatus,\n { iconName: DynamicIconNameType; className: string }\n>;\n\nconst statusIconNames: StatusIconNamesType = {\n current: {\n iconName: \"Circle\",\n className: \"fill-foreground text-foreground rounded-full\",\n },\n done: {\n iconName: \"Check\",\n className: \"bg-primary text-primary-foreground p-0.5 rounded-full\",\n },\n error: {\n iconName: \"X\",\n className: \"bg-destructive text-destructive-foreground p-0.5 rounded-full\",\n },\n};\n\nexport function TimelineDot({\n className,\n iconClassName,\n status = \"current\",\n customIconName,\n customStatusName,\n ...props\n}: TimelineDotProps) {\n let statusIconName = statusIconNames[\"current\"].iconName;\n let statusLabel = \"current\";\n let statusClassName;\n\n // Determines if the component uses predefined statuses or custom ones\n if (customStatusName && customIconName) {\n // If a custom icon is provided, use it along with the custom status label\n statusIconName = customIconName;\n statusLabel = customStatusName;\n } else if (status) {\n // If the \"status\" prop exists, use the corresponding predefined icon and styling\n statusIconName = statusIconNames[status].iconName;\n statusClassName = statusIconNames[status].className;\n statusLabel = status; // Assigns the status label for accessibility\n }\n\n return (\n <div\n data-slot=\"timeline-dot\"\n role=\"status\"\n className={cn(\n \"col-start-2 col-end-3 row-start-1 row-end-1 flex justify-center items-center rounded-md\",\n className,\n )}\n aria-label={statusLabel}\n {...props}\n >\n <DynamicIcon\n name={statusIconName}\n className={cn(\n \"size-4 text-muted-foreground\",\n statusClassName,\n iconClassName,\n )}\n />\n </div>\n );\n}\n\nexport const timelineContentVariants = cva(\"row-start-2 row-end-2 pb-8\", {\n variants: {\n side: {\n start: \"col-start-3 col-end-4 me-auto text-start\",\n end: \"col-start-1 col-end-2 ms-auto text-end\",\n },\n },\n defaultVariants: {\n side: \"start\",\n },\n});\n\ntype TimelineContentProps = ComponentProps<\"div\"> &\n VariantProps<typeof timelineContentVariants>;\n\nexport function TimelineContent({\n className,\n side,\n ...props\n}: TimelineContentProps) {\n return (\n <div\n data-slot=\"timeline-content\"\n className={cn(timelineContentVariants({ side }), className)}\n {...props}\n />\n );\n}\n\nexport const timelineHeadingVariants = cva(\n \"row-start-1 row-end-1 line-clamp-1 max-w-full truncate\",\n {\n variants: {\n side: {\n start: \"col-start-3 col-end-4 me-auto text-start\",\n end: \"col-start-1 col-end-2 ms-auto text-end\",\n },\n variant: {\n primary: \"text-base font-medium text-foreground\",\n secondary: \"text-sm font-light text-muted-foreground\",\n },\n },\n defaultVariants: {\n side: \"start\",\n variant: \"primary\",\n },\n },\n);\n\ntype TimelineHeadingProps = ComponentProps<\"h3\"> &\n VariantProps<typeof timelineHeadingVariants> & {\n asChild?: boolean;\n };\n\nexport function TimelineHeading({\n className,\n side,\n variant,\n asChild = false,\n ...props\n}: TimelineHeadingProps) {\n const Comp = asChild ? Slot : \"h3\";\n\n return (\n <Comp\n data-slot=\"timeline-heading\"\n className={cn(timelineHeadingVariants({ side, variant }), className)}\n {...props}\n />\n );\n}\n\ntype TimelineLineProps = ComponentProps<typeof SeparatorPrimitive.Root> & {\n done?: boolean;\n};\n\nexport function TimelineLine({\n className,\n done = false,\n ...props\n}: TimelineLineProps) {\n return (\n <Separator\n data-slot=\"timeline-line\"\n orientation=\"vertical\"\n className={cn(\n \"col-start-2 col-end-3 row-start-2 row-end-2 bg-muted-foreground mx-auto w-[0.094rem]\",\n done && \"bg-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport { createContext, useCallback, useContext, useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SortingState {\n field: string;\n direction: \"asc\" | \"desc\";\n}\n\nexport interface ActiveFilter {\n name: string;\n value: unknown;\n operator: string;\n}\n\nexport interface PaginationState {\n page: number;\n pageSize: number;\n}\n\n// ============================================================================\n// DataTable Context - For standalone table usage\n// ============================================================================\n\nexport interface DataTableContextValue {\n // Pagination\n pagination: PaginationState;\n setPagination: (pagination: PaginationState) => void;\n setPage: (page: number) => void;\n setPageSize: (pageSize: number) => void;\n\n // Sorting\n sorting: SortingState | null;\n setSorting: (sorting: SortingState | null) => void;\n\n // Search\n search: string;\n setSearch: (search: string) => void;\n\n // Filters\n filters: ActiveFilter[];\n setFilters: (filters: ActiveFilter[]) => void;\n addFilter: (filter: ActiveFilter) => void;\n removeFilter: (filterName: string) => void;\n updateFilter: (filterName: string, value: unknown) => void;\n clearFilters: () => void;\n\n // Selection\n selectedRows: Set<string>;\n setSelectedRows: (rows: Set<string>) => void;\n toggleRowSelection: (rowId: string) => void;\n selectAllRows: (rowIds: string[]) => void;\n clearSelection: () => void;\n isAllSelected: boolean;\n isPartiallySelected: boolean;\n}\n\nconst DataTableContext = createContext<DataTableContextValue | undefined>(\n undefined,\n);\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\nexport interface DataTableProviderProps {\n children: ReactNode;\n defaultPagination?: PaginationState;\n defaultSorting?: SortingState | null;\n defaultSearch?: string;\n defaultFilters?: ActiveFilter[];\n}\n\n// ============================================================================\n// DataTable Provider\n// ============================================================================\n\nexport function DataTableProvider({\n children,\n defaultPagination = { page: 1, pageSize: 10 },\n defaultSorting = null,\n defaultSearch = \"\",\n defaultFilters = [],\n}: DataTableProviderProps) {\n // Pagination state\n const [pagination, setPaginationState] =\n useState<PaginationState>(defaultPagination);\n\n const setPagination = useCallback((newPagination: PaginationState) => {\n setPaginationState(newPagination);\n }, []);\n\n const setPage = useCallback((page: number) => {\n setPaginationState((prev) => ({ ...prev, page }));\n }, []);\n\n const setPageSize = useCallback((pageSize: number) => {\n setPaginationState((prev) => ({ ...prev, pageSize, page: 1 }));\n }, []);\n\n // Sorting state\n const [sorting, setSorting] = useState<SortingState | null>(defaultSorting);\n\n // Search state\n const [search, setSearch] = useState<string>(defaultSearch);\n\n // Filters state\n const [filters, setFiltersState] = useState<ActiveFilter[]>(defaultFilters);\n\n const setFilters = useCallback(\n (newFilters: ActiveFilter[]) => {\n setFiltersState(newFilters);\n setPage(1);\n },\n [setPage],\n );\n\n const addFilter = useCallback(\n (filter: ActiveFilter) => {\n setFiltersState((prev) => {\n const existing = prev.findIndex((f) => f.name === filter.name);\n if (existing >= 0) {\n const updated = [...prev];\n updated[existing] = filter;\n return updated;\n }\n return [...prev, filter];\n });\n setPage(1);\n },\n [setPage],\n );\n\n const removeFilter = useCallback(\n (filterName: string) => {\n setFiltersState((prev) => prev.filter((f) => f.name !== filterName));\n setPage(1);\n },\n [setPage],\n );\n\n const updateFilter = useCallback(\n (filterName: string, value: unknown) => {\n setFiltersState((prev) =>\n prev.map((f) => (f.name === filterName ? { ...f, value } : f)),\n );\n setPage(1);\n },\n [setPage],\n );\n\n const clearFilters = useCallback(() => {\n setFiltersState([]);\n setPage(1);\n }, [setPage]);\n\n // Selection state\n const [selectedRows, setSelectedRowsState] = useState<Set<string>>(new Set());\n const [allRowIds, setAllRowIds] = useState<string[]>([]);\n\n const setSelectedRows = useCallback((rows: Set<string>) => {\n setSelectedRowsState(rows);\n }, []);\n\n const toggleRowSelection = useCallback((rowId: string) => {\n setSelectedRowsState((prev) => {\n const next = new Set(prev);\n if (next.has(rowId)) {\n next.delete(rowId);\n } else {\n next.add(rowId);\n }\n return next;\n });\n }, []);\n\n const selectAllRows = useCallback((rowIds: string[]) => {\n setAllRowIds(rowIds);\n setSelectedRowsState((prev) => {\n if (prev.size === rowIds.length) {\n return new Set();\n }\n return new Set(rowIds);\n });\n }, []);\n\n const clearSelection = useCallback(() => {\n setSelectedRowsState(new Set());\n }, []);\n\n const isAllSelected =\n allRowIds.length > 0 && selectedRows.size === allRowIds.length;\n const isPartiallySelected =\n selectedRows.size > 0 && selectedRows.size < allRowIds.length;\n\n const value: DataTableContextValue = {\n // Pagination\n pagination,\n setPagination,\n setPage,\n setPageSize,\n // Sorting\n sorting,\n setSorting,\n // Search\n search,\n setSearch,\n // Filters\n filters,\n setFilters,\n addFilter,\n removeFilter,\n updateFilter,\n clearFilters,\n // Selection\n selectedRows,\n setSelectedRows,\n toggleRowSelection,\n selectAllRows,\n clearSelection,\n isAllSelected,\n isPartiallySelected,\n };\n\n return (\n <DataTableContext.Provider value={value}>\n {children}\n </DataTableContext.Provider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport function useDataTable() {\n const context = useContext(DataTableContext);\n if (context === undefined) {\n throw new Error(\"useDataTable must be used within DataTableProvider\");\n }\n return context;\n}\n\n/**\n * Optional hook that returns undefined if not in provider\n * Useful for components that can work both with and without context\n */\nexport function useDataTableOptional() {\n return useContext(DataTableContext);\n}\n","\"use client\";\n\nimport { Skeleton } from \"../../primitives\";\nimport { TableCell, TableRow } from \"../../primitives\";\n\nexport interface DataTableSkeletonProps {\n /**\n * Number of columns to render\n */\n columns: number;\n /**\n * Number of rows to render\n * @default 5\n */\n rows?: number;\n /**\n * Height of each skeleton cell\n * @default \"h-5\"\n */\n cellHeight?: string;\n /**\n * Show checkbox column skeleton\n * @default false\n */\n showCheckbox?: boolean;\n /**\n * Show row number column skeleton\n * @default false\n */\n showRowNumber?: boolean;\n}\n\n/**\n * Skeleton loading state for DataTable\n * Renders loading placeholder rows while data is being fetched\n */\nexport function DataTableSkeleton({\n columns,\n rows = 5,\n cellHeight = \"h-5\",\n showCheckbox = false,\n showRowNumber = false,\n}: DataTableSkeletonProps) {\n const _totalColumns =\n columns + (showCheckbox ? 1 : 0) + (showRowNumber ? 1 : 0);\n\n return (\n <>\n {Array.from({ length: rows }).map((_, rowIndex) => (\n <TableRow\n key={`skeleton-row-${rowIndex}`}\n className=\"animate-pulse\"\n aria-hidden=\"true\"\n >\n {/* Checkbox skeleton */}\n {showCheckbox && (\n <TableCell key={`skeleton-checkbox-${rowIndex}`} className=\"w-12\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n </TableCell>\n )}\n\n {/* Row number skeleton */}\n {showRowNumber && (\n <TableCell\n key={`skeleton-stt-${rowIndex}`}\n className=\"w-16 text-center\"\n >\n <Skeleton className=\"h-4 w-8 mx-auto\" />\n </TableCell>\n )}\n\n {/* Data columns skeleton */}\n {Array.from({ length: columns }).map((_, cellIndex) => (\n <TableCell key={`skeleton-cell-${rowIndex}-${cellIndex}`}>\n <Skeleton className={`${cellHeight} w-full`} />\n </TableCell>\n ))}\n </TableRow>\n ))}\n </>\n );\n}\n\n/**\n * Full table skeleton including header\n */\nexport function DataTableFullSkeleton({\n columns,\n rows = 5,\n showCheckbox = false,\n showRowNumber = false,\n}: DataTableSkeletonProps) {\n const _totalColumns =\n columns + (showCheckbox ? 1 : 0) + (showRowNumber ? 1 : 0);\n\n return (\n <div className=\"w-full border rounded-md overflow-hidden animate-pulse\">\n {/* Header skeleton */}\n <div className=\"flex bg-muted/50 border-b\">\n {showCheckbox && (\n <div className=\"w-12 p-3\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n </div>\n )}\n {showRowNumber && (\n <div className=\"w-16 p-3 text-center\">\n <Skeleton className=\"h-4 w-10 mx-auto\" />\n </div>\n )}\n {Array.from({ length: columns }).map((_, i) => (\n <div key={`header-${i}`} className=\"flex-1 p-3\">\n <Skeleton className=\"h-4 w-24\" />\n </div>\n ))}\n </div>\n\n {/* Body skeleton */}\n {Array.from({ length: rows }).map((_, rowIndex) => (\n <div\n key={`body-row-${rowIndex}`}\n className=\"flex border-b last:border-b-0\"\n >\n {showCheckbox && (\n <div className=\"w-12 p-3\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n </div>\n )}\n {showRowNumber && (\n <div className=\"w-16 p-3 text-center\">\n <Skeleton className=\"h-4 w-8 mx-auto\" />\n </div>\n )}\n {Array.from({ length: columns }).map((_, cellIndex) => (\n <div\n key={`body-cell-${rowIndex}-${cellIndex}`}\n className=\"flex-1 p-3\"\n >\n <Skeleton className=\"h-5 w-full\" />\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { Database, FileSearch, SearchX } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { Button } from \"../../primitives\";\n\nexport interface DataTableEmptyStateProps {\n /**\n * Icon to display\n */\n icon?: ReactNode;\n /**\n * Title text\n */\n title?: string;\n /**\n * Description text\n */\n description?: string;\n /**\n * Whether search is active\n */\n hasSearch?: boolean;\n /**\n * Whether filters are active\n */\n hasFilters?: boolean;\n /**\n * Clear search callback\n */\n onClearSearch?: () => void;\n /**\n * Clear filters callback\n */\n onClearFilters?: () => void;\n /**\n * Primary action button\n */\n primaryAction?: {\n label: string;\n onClick: () => void;\n icon?: ReactNode;\n };\n /**\n * Custom content to render\n */\n children?: ReactNode;\n}\n\n/**\n * Empty state component for DataTable\n * Shows different content based on whether search/filters are active\n */\nexport function DataTableEmptyState({\n icon,\n title,\n description,\n hasSearch = false,\n hasFilters = false,\n onClearSearch,\n onClearFilters,\n primaryAction,\n children,\n}: DataTableEmptyStateProps) {\n // Determine the appropriate empty state based on context\n const hasActiveFiltersOrSearch = hasSearch || hasFilters;\n\n // Default icon based on state\n const defaultIcon = hasSearch ? (\n <SearchX className=\"h-12 w-12 text-muted-foreground/50\" />\n ) : hasFilters ? (\n <FileSearch className=\"h-12 w-12 text-muted-foreground/50\" />\n ) : (\n <Database className=\"h-12 w-12 text-muted-foreground/50\" />\n );\n\n // Default title based on state\n const defaultTitle = hasSearch\n ? \"Không tìm thấy kết quả\"\n : hasFilters\n ? \"Không có dữ liệu phù hợp\"\n : \"Chưa có dữ liệu\";\n\n // Default description based on state\n const defaultDescription = hasSearch\n ? \"Không có kết quả nào khớp với từ khóa tìm kiếm. Hãy thử với từ khóa khác.\"\n : hasFilters\n ? \"Không có dữ liệu nào phù hợp với bộ lọc hiện tại.\"\n : \"Bắt đầu bằng cách thêm mục đầu tiên.\";\n\n return (\n <div className=\"flex flex-col items-center justify-center h-full min-h-[300px] p-8 text-center\">\n {/* Icon */}\n <div className=\"mb-4\">{icon || defaultIcon}</div>\n\n {/* Title */}\n <h3 className=\"text-lg font-semibold text-foreground mb-2\">\n {title || defaultTitle}\n </h3>\n\n {/* Description */}\n <p className=\"text-sm text-muted-foreground max-w-md mb-6\">\n {description || defaultDescription}\n </p>\n\n {/* Action buttons */}\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n {hasSearch && onClearSearch && (\n <Button variant=\"outline\" size=\"sm\" onClick={onClearSearch}>\n <SearchX className=\"h-4 w-4 mr-2\" />\n Xóa tìm kiếm\n </Button>\n )}\n\n {hasFilters && onClearFilters && (\n <Button variant=\"outline\" size=\"sm\" onClick={onClearFilters}>\n Xóa bộ lọc\n </Button>\n )}\n\n {primaryAction && (\n <Button onClick={primaryAction.onClick}>\n {primaryAction.icon}\n {primaryAction.label}\n </Button>\n )}\n </div>\n\n {/* Custom content */}\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { memo, useCallback, useEffect, useMemo } from \"react\";\nimport type { ReactNode, ReactElement } from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport type {\n ColumnDef,\n SortingState as TanstackSortingState,\n Table,\n Row,\n} from \"@tanstack/react-table\";\n\nimport { Checkbox } from \"../../primitives/client\";\nimport {\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../../primitives\";\nimport { DataTablePagination } from \"../data-table-pagination\";\nimport { DataTableSkeleton } from \"./data-table-skeleton\";\nimport { DataTableEmptyState } from \"./data-table-empty-state\";\nimport type { SortingState, PaginationState } from \"./data-table-context\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DataTablePaginationConfig {\n page: number;\n pageSize: number;\n total: number;\n}\n\nexport interface DataTableProps<TData> {\n /**\n * Data to display in the table\n */\n data: TData[];\n\n /**\n * Column definitions for the table\n */\n columns: ColumnDef<TData>[];\n\n /**\n * Pagination configuration (controlled)\n */\n pagination?: DataTablePaginationConfig;\n\n /**\n * Callback when pagination changes\n */\n onPaginationChange?: (pagination: PaginationState) => void;\n\n /**\n * Current sorting state (controlled)\n */\n sorting?: SortingState | null;\n\n /**\n * Callback when sorting changes\n */\n onSortingChange?: (sorting: SortingState | null) => void;\n\n /**\n * Enable row selection with checkboxes\n * @default false\n */\n enableRowSelection?: boolean;\n\n /**\n * Currently selected row IDs\n */\n selectedRows?: Set<string>;\n\n /**\n * Callback when selection changes\n */\n onSelectionChange?: (selectedRows: Set<string>) => void;\n\n /**\n * Function to get unique ID from row data\n * @default (row) => row.id\n */\n getRowId?: (row: TData) => string;\n\n /**\n * Show row numbers (STT column)\n * @default false\n */\n enableRowNumber?: boolean;\n\n /**\n * Whether data is loading\n * @default false\n */\n loading?: boolean;\n\n /**\n * Custom empty state component\n */\n emptyState?: ReactNode;\n\n /**\n * Empty state configuration\n */\n emptyStateConfig?: {\n hasSearch?: boolean;\n hasFilters?: boolean;\n onClearSearch?: () => void;\n onClearFilters?: () => void;\n onCreate?: () => void;\n createLabel?: string;\n };\n\n /**\n * Callback when table instance is ready\n */\n onTableReady?: (table: Table<TData>) => void;\n\n /**\n * Custom row click handler\n */\n onRowClick?: (row: TData) => void;\n\n /**\n * Custom class name for the table container\n */\n className?: string;\n\n /**\n * Height configuration\n * @default \"auto\"\n */\n height?: \"auto\" | \"full\" | string;\n}\n\n// ============================================================================\n// DataTable Component\n// ============================================================================\n\nexport function DataTable<TData extends Record<string, unknown>>({\n data,\n columns: userColumns,\n pagination,\n onPaginationChange,\n sorting,\n onSortingChange,\n enableRowSelection = false,\n selectedRows = new Set(),\n onSelectionChange,\n getRowId = (row) => String((row as Record<string, unknown>).id),\n enableRowNumber = false,\n loading = false,\n emptyState,\n emptyStateConfig,\n onTableReady,\n onRowClick,\n className,\n height = \"auto\",\n}: DataTableProps<TData>) {\n // Build final columns with selection and row number if enabled\n const columns = useMemo<ColumnDef<TData>[]>(() => {\n const cols: ColumnDef<TData>[] = [];\n\n // Selection column\n if (enableRowSelection) {\n cols.push({\n id: \"select\",\n header: ({ table }) => (\n <Checkbox\n checked={\n table.getIsAllPageRowsSelected() ||\n (table.getIsSomePageRowsSelected() && \"indeterminate\")\n }\n onCheckedChange={(value) => {\n const rowIds = table\n .getRowModel()\n .rows.map((row) => getRowId(row.original));\n\n if (onSelectionChange) {\n if (value) {\n onSelectionChange(new Set(rowIds));\n } else {\n onSelectionChange(new Set());\n }\n }\n table.toggleAllPageRowsSelected(!!value);\n }}\n aria-label=\"Select all\"\n />\n ),\n cell: ({ row }) => {\n const rowId = getRowId(row.original);\n return (\n <Checkbox\n checked={selectedRows.has(rowId)}\n onCheckedChange={() => {\n if (onSelectionChange) {\n const newSelection = new Set(selectedRows);\n if (newSelection.has(rowId)) {\n newSelection.delete(rowId);\n } else {\n newSelection.add(rowId);\n }\n onSelectionChange(newSelection);\n }\n row.toggleSelected(!row.getIsSelected());\n }}\n aria-label=\"Select row\"\n />\n );\n },\n enableSorting: false,\n enableHiding: false,\n size: 50,\n });\n }\n\n // Row number (STT) column\n if (enableRowNumber) {\n cols.push({\n id: \"stt\",\n header: () => (\n <div className=\"font-semibold text-center text-sm\">STT</div>\n ),\n cell: ({ row }) => {\n const rowIndex = row.index;\n const currentPage = pagination?.page ?? 1;\n const pageSize = pagination?.pageSize ?? 10;\n const stt = (currentPage - 1) * pageSize + rowIndex + 1;\n return <div className=\"text-center font-medium\">{stt}</div>;\n },\n enableSorting: false,\n enableHiding: false,\n size: 70,\n minSize: 60,\n maxSize: 80,\n });\n }\n\n // Add user columns\n cols.push(...userColumns);\n\n return cols;\n }, [\n userColumns,\n enableRowSelection,\n enableRowNumber,\n selectedRows,\n onSelectionChange,\n getRowId,\n pagination?.page,\n pagination?.pageSize,\n ]);\n\n // Convert our sorting format to tanstack's format\n const tanstackSorting = useMemo<TanstackSortingState>(() => {\n if (!sorting) return [];\n return [\n {\n id: sorting.field,\n desc: sorting.direction === \"desc\",\n },\n ];\n }, [sorting]);\n\n // Handle sorting change\n const handleSortingChange = useCallback(\n (updater: unknown) => {\n const newSorting =\n typeof updater === \"function\" ? updater(tanstackSorting) : updater;\n\n if (onSortingChange) {\n if (Array.isArray(newSorting) && newSorting.length > 0) {\n const sort = newSorting[0];\n onSortingChange({\n field: sort.id,\n direction: sort.desc ? \"desc\" : \"asc\",\n });\n } else {\n onSortingChange(null);\n }\n }\n },\n [tanstackSorting, onSortingChange],\n );\n\n // Handle pagination change\n const handlePaginationChange = useCallback(\n (updater: unknown) => {\n if (!onPaginationChange || !pagination) return;\n\n const currentPagination = {\n pageIndex: pagination.page - 1,\n pageSize: pagination.pageSize,\n };\n const newPagination =\n typeof updater === \"function\" ? updater(currentPagination) : updater;\n\n onPaginationChange({\n page: newPagination.pageIndex + 1,\n pageSize: newPagination.pageSize,\n });\n },\n [pagination, onPaginationChange],\n );\n\n // Calculate page count\n const pageCount = useMemo(() => {\n if (!pagination) return 1;\n const count = Math.ceil(pagination.total / pagination.pageSize);\n return count > 0 ? count : 1;\n }, [pagination]);\n\n // Create table instance\n const table = useReactTable({\n data: Array.isArray(data) ? data : [],\n columns,\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n onSortingChange: handleSortingChange,\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n state: {\n sorting: tanstackSorting,\n pagination: pagination\n ? {\n pageIndex: pagination.page - 1,\n pageSize: pagination.pageSize,\n }\n : undefined,\n },\n onPaginationChange: handlePaginationChange,\n manualPagination: !!pagination,\n pageCount,\n });\n\n // Notify parent when table is ready\n useEffect(() => {\n if (onTableReady && table) {\n onTableReady(table);\n }\n }, [table, onTableReady]);\n\n // Get rows safely\n let rows: Row<TData>[] = [];\n try {\n const rowModel = table.getRowModel();\n if (rowModel && Array.isArray(rowModel.rows)) {\n rows = rowModel.rows;\n }\n } catch (error) {\n console.error(\"Error getting row model:\", error);\n }\n\n // Height class\n const heightClass =\n height === \"auto\"\n ? \"\"\n : height === \"full\"\n ? \"min-h-[calc(100vh-16rem)]\"\n : height;\n\n return (\n <div\n className={`flex flex-col border border-border dark:border-slate-800 rounded-md overflow-hidden bg-card ${heightClass} ${className || \"\"}`}\n >\n {/* Table Container - Scrollable */}\n <div className=\"flex-1 overflow-auto relative\">\n <table className=\"w-max min-w-full caption-bottom text-xs relative\">\n <TableHeader className=\"sticky top-0 z-20 bg-card\">\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow\n key={headerGroup.id}\n className=\"border-b-2 border-border dark:border-slate-700 hover:bg-transparent\"\n >\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className=\"text-xs font-semibold text-foreground py-2.5\"\n style={{\n width: header.getSize(),\n minWidth: header.column.columnDef.minSize,\n maxWidth: header.column.columnDef.maxSize,\n }}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {loading ? (\n <>\n <tr aria-live=\"polite\" aria-busy=\"true\" className=\"sr-only\">\n <td colSpan={columns.length} className=\"sr-only\">\n Loading table data...\n </td>\n </tr>\n <DataTableSkeleton\n columns={userColumns.length}\n rows={pagination?.pageSize ?? 10}\n showCheckbox={enableRowSelection}\n showRowNumber={enableRowNumber}\n />\n </>\n ) : rows.length > 0 ? (\n rows.map((row) => (\n <MemoizedTableRow\n key={row.id}\n row={row}\n isSelected={row.getIsSelected()}\n visibleCellsCount={row.getVisibleCells().length}\n onRowClick={onRowClick}\n />\n ))\n ) : null}\n </TableBody>\n </table>\n {/* Empty state - rendered outside table for proper viewport centering */}\n {!loading && rows.length === 0 && (\n <div className=\"flex items-center justify-center min-h-[300px]\">\n {emptyState || (\n <DataTableEmptyState\n hasSearch={emptyStateConfig?.hasSearch}\n hasFilters={emptyStateConfig?.hasFilters}\n onClearSearch={emptyStateConfig?.onClearSearch}\n onClearFilters={emptyStateConfig?.onClearFilters}\n primaryAction={\n emptyStateConfig?.onCreate\n ? {\n label: emptyStateConfig.createLabel || \"Thêm mới\",\n onClick: emptyStateConfig.onCreate,\n }\n : undefined\n }\n />\n )}\n </div>\n )}\n </div>\n\n {/* Pagination Section */}\n {pagination && (\n <div className=\"border-t border-border dark:border-slate-800 bg-card px-4 sm:px-6 py-2 shrink-0\">\n <MemoizedPagination\n table={table}\n currentPage={pagination.page}\n pageCount={pageCount}\n pageSize={pagination.pageSize}\n totalItems={pagination.total}\n />\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Memoized TableRow\n// ============================================================================\n\ninterface MemoizedTableRowProps<TData> {\n row: Row<TData>;\n isSelected: boolean;\n visibleCellsCount: number;\n onRowClick?: (row: TData) => void;\n}\n\n// Ensure TData is maintained by making it a generic memo component, or casting it\nconst MemoizedTableRow = memo(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ({ row, isSelected, onRowClick }: MemoizedTableRowProps<any>) => {\n return (\n <TableRow\n data-state={isSelected && \"selected\"}\n className={`transition-colors duration-100 even:bg-muted/30 hover:bg-accent/50 dark:hover:bg-slate-800/40 data-[state=selected]:bg-primary/5 border-b border-border/40 dark:border-slate-800 relative hover:border-l-[3px] hover:border-l-primary ${\n onRowClick ? \"cursor-pointer\" : \"\"\n }`}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n className=\"\"\n style={{\n width: cell.column.getSize(),\n minWidth: cell.column.columnDef.minSize,\n maxWidth: cell.column.columnDef.maxSize,\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n );\n },\n (prevProps, nextProps) => {\n // Basic checks\n if (\n prevProps.row.id !== nextProps.row.id ||\n prevProps.isSelected !== nextProps.isSelected ||\n prevProps.onRowClick !== nextProps.onRowClick ||\n prevProps.visibleCellsCount !== nextProps.visibleCellsCount ||\n prevProps.row.original !== nextProps.row.original\n ) {\n return false;\n }\n\n // Since sizing could change without cells count changing\n // We check if cell sizes changed\n const prevCells = prevProps.row.getVisibleCells();\n const nextCells = nextProps.row.getVisibleCells();\n\n for (let i = 0; i < prevCells.length; i++) {\n if (\n prevCells[i]?.column.getSize() !== nextCells[i]?.column.getSize() ||\n prevCells[i]?.id !== nextCells[i]?.id ||\n prevCells[i]?.column.id !== nextCells[i]?.column.id\n ) {\n return false;\n }\n }\n\n return true;\n },\n) as <TData>(props: MemoizedTableRowProps<TData>) => ReactElement;\n// The type cast ensures the component retains the generic type TData\n// Without this, the component type would default to `any` or `unknown`.\n// Adding displayName to a typecast component can cause a ts error, so we cast it as any to add the display name.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(MemoizedTableRow as any).displayName = \"MemoizedTableRow\";\n\n// ============================================================================\n// Memoized Pagination\n// ============================================================================\n\nconst MemoizedPagination = memo(\n ({\n table,\n currentPage,\n pageSize,\n totalItems,\n }: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n table: Table<any>;\n currentPage: number;\n pageCount: number;\n pageSize: number;\n totalItems?: number;\n }) => {\n return (\n <DataTablePagination\n table={table}\n totalItems={totalItems}\n currentPage={currentPage}\n pageSize={pageSize}\n />\n );\n },\n (prevProps, nextProps) => {\n const prevState = prevProps.table.getState().pagination;\n const nextState = nextProps.table.getState().pagination;\n\n return (\n prevProps.currentPage === nextProps.currentPage &&\n prevProps.pageCount === nextProps.pageCount &&\n prevProps.pageSize === nextProps.pageSize &&\n prevProps.totalItems === nextProps.totalItems &&\n prevState.pageIndex === nextState.pageIndex &&\n prevState.pageSize === nextState.pageSize\n );\n },\n);\nMemoizedPagination.displayName = \"MemoizedPagination\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport type { ColumnDef, Table, Row };\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Filter, LayoutGrid, RefreshCw, Search, Table2, X } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { Table } from \"@tanstack/react-table\";\n\nimport { Button } from \"../../primitives\";\nimport { Input } from \"../../primitives\";\nimport { Separator } from \"../../primitives\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../primitives/client\";\nimport { DataTableViewOptions } from \"../data-table-view-options\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ActiveFilter {\n name: string;\n value: unknown;\n operator: string;\n}\n\nexport interface FilterConfig {\n name: string;\n label: string;\n type: \"text\" | \"select\" | \"checkbox\" | \"radio\" | \"datetime\" | \"custom\";\n field: string;\n options?: Array<{ label: string; value: string | number | boolean }>;\n renderFilter?: (props: {\n value: unknown;\n onChange: (value: unknown) => void;\n }) => ReactNode;\n}\n\nexport interface DataTableToolbarProps<TData> {\n /**\n * Table instance for column visibility options\n */\n table?: Table<TData>;\n\n /**\n * Enable search input\n * @default true\n */\n searchEnabled?: boolean;\n\n /**\n * Current search value\n */\n searchValue?: string;\n\n /**\n * Search change callback\n */\n onSearchChange?: (value: string) => void;\n\n /**\n * Search placeholder text\n * @default \"Search...\"\n */\n searchPlaceholder?: string;\n\n /**\n * Filter configurations\n */\n filters?: FilterConfig[];\n\n /**\n * Active filters\n */\n activeFilters?: ActiveFilter[];\n\n /**\n * Filter change callback\n */\n onFiltersChange?: (filters: ActiveFilter[]) => void;\n\n /**\n * Current view mode\n */\n viewMode?: \"table\" | \"card\";\n\n /**\n * View mode change callback\n */\n onViewModeChange?: (mode: \"table\" | \"card\") => void;\n\n /**\n * Custom content for left side (before search)\n */\n leftSlot?: ReactNode;\n\n /**\n * Custom content for right side (after view options)\n */\n rightSlot?: ReactNode;\n\n /**\n * Custom filter builder component\n */\n filterBuilder?: ReactNode;\n\n /**\n * Enable column visibility toggle\n * @default true\n */\n enableColumnToggle?: boolean;\n\n /**\n * Enable view mode toggle (table/card)\n * @default false\n */\n enableViewModeToggle?: boolean;\n\n /**\n * Reset all callback\n */\n onReset?: () => void;\n}\n\n// ============================================================================\n// DataTableToolbar Component\n// ============================================================================\n\nexport function DataTableToolbar<TData>({\n table,\n searchEnabled = true,\n searchValue = \"\",\n onSearchChange,\n searchPlaceholder = \"Tìm kiếm...\",\n filters = [],\n activeFilters = [],\n onFiltersChange,\n viewMode = \"table\",\n onViewModeChange,\n leftSlot,\n rightSlot,\n filterBuilder,\n enableColumnToggle = true,\n enableViewModeToggle = false,\n onReset,\n}: DataTableToolbarProps<TData>) {\n const [filterOpen, setFilterOpen] = useState(false);\n\n const hasActiveFilters = activeFilters.length > 0;\n const hasFilters = filters.length > 0;\n const hasActiveSearch = searchValue && searchValue.trim().length > 0;\n const hasAnyActive = hasActiveFilters || hasActiveSearch;\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onSearchChange?.(e.target.value);\n };\n\n const handleClearFilters = () => {\n onFiltersChange?.([]);\n setFilterOpen(false);\n };\n\n const handleReset = () => {\n onSearchChange?.(\"\");\n onFiltersChange?.([]);\n setFilterOpen(false);\n onReset?.();\n };\n\n return (\n <div className=\"space-y-2\">\n {/* Main toolbar row */}\n <div className=\"flex items-center gap-3 flex-wrap\">\n {/* Left slot */}\n {leftSlot}\n\n {/* Search */}\n {searchEnabled && (\n <>\n <div className=\"flex-1 min-w-[200px] sm:min-w-[250px] w-full sm:w-auto relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder={searchPlaceholder}\n value={searchValue}\n onChange={handleSearchChange}\n className=\"pl-9 pr-9 h-9 text-xs\"\n />\n {hasActiveSearch && (\n <button\n onClick={() => onSearchChange?.(\"\")}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n aria-label=\"Clear search\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n {(hasFilters || enableViewModeToggle || enableColumnToggle) && (\n <Separator\n orientation=\"vertical\"\n className=\"h-6 hidden sm:block\"\n />\n )}\n </>\n )}\n\n {/* Filters */}\n {hasFilters && (\n <>\n <Popover open={filterOpen} onOpenChange={setFilterOpen}>\n <PopoverTrigger asChild>\n <Button\n variant={hasActiveFilters ? \"default\" : \"outline\"}\n size=\"sm\"\n className=\"gap-2 shrink-0\"\n >\n <Filter className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Bộ lọc</span>\n {hasActiveFilters && (\n <span className=\"ml-1 rounded-full bg-primary-foreground/20 px-1.5 py-0.5 text-xs\">\n {activeFilters.length}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80 p-4\" align=\"start\">\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h4 className=\"font-medium text-sm\">Bộ lọc</h4>\n {hasActiveFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleClearFilters}\n className=\"h-7 text-xs\"\n >\n <X className=\"h-3 w-3 mr-1\" />\n Xóa tất cả\n </Button>\n )}\n </div>\n <div className=\"space-y-4 max-h-[400px] overflow-y-auto -mx-2 px-2\">\n {filterBuilder}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Reset button */}\n {hasAnyActive && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleReset}\n className=\"gap-2 shrink-0\"\n title=\"Đặt lại tìm kiếm và bộ lọc\"\n >\n <RefreshCw className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Đặt lại</span>\n </Button>\n )}\n </>\n )}\n\n {/* View Options Group */}\n <div className=\"flex items-center gap-2 shrink-0 ml-auto\">\n {/* View Mode Toggle */}\n {enableViewModeToggle && onViewModeChange && (\n <>\n <Separator\n orientation=\"vertical\"\n className=\"h-6 hidden sm:block\"\n />\n <div className=\"flex items-center gap-1 border rounded-md p-0.5\">\n <Button\n variant={viewMode === \"table\" ? \"default\" : \"ghost\"}\n size=\"sm\"\n onClick={() => onViewModeChange(\"table\")}\n className=\"h-7 px-2\"\n aria-label=\"Table view\"\n title=\"Xem dạng bảng\"\n >\n <Table2 className=\"h-4 w-4\" />\n </Button>\n <Button\n variant={viewMode === \"card\" ? \"default\" : \"ghost\"}\n size=\"sm\"\n onClick={() => onViewModeChange(\"card\")}\n className=\"h-7 px-2\"\n aria-label=\"Card view\"\n title=\"Xem dạng thẻ\"\n >\n <LayoutGrid className=\"h-4 w-4\" />\n </Button>\n </div>\n </>\n )}\n\n {/* Column Toggle */}\n {table && enableColumnToggle && viewMode === \"table\" && (\n <>\n <Separator\n orientation=\"vertical\"\n className=\"h-6 hidden sm:block\"\n />\n <DataTableViewOptions table={table} />\n </>\n )}\n\n {/* Right slot */}\n {rightSlot}\n </div>\n </div>\n\n {/* Active filter chips */}\n {hasActiveFilters && (\n <div className=\"flex flex-wrap gap-2\">\n {activeFilters.map((filter) => {\n const filterConfig = filters.find((f) => f.name === filter.name);\n const label = filterConfig?.label || filter.name;\n const displayValue =\n typeof filter.value === \"object\"\n ? JSON.stringify(filter.value)\n : String(filter.value);\n\n return (\n <div\n key={filter.name}\n className=\"inline-flex items-center gap-1 px-2 py-1 bg-muted rounded-md text-xs\"\n >\n <span className=\"text-muted-foreground\">{label}:</span>\n <span className=\"font-medium\">{displayValue}</span>\n <button\n onClick={() => {\n const newFilters = activeFilters.filter(\n (f) => f.name !== filter.name,\n );\n onFiltersChange?.(newFilters);\n }}\n className=\"ml-1 text-muted-foreground hover:text-foreground\"\n aria-label=\"Clear filter\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","// @goerp/core/ui/data-display/data-table\n// Reusable DataTable components for standalone table usage\n\n// Context and hooks\nexport {\n DataTableProvider,\n useDataTable,\n useDataTableOptional,\n type DataTableContextValue,\n type DataTableProviderProps,\n type SortingState,\n type ActiveFilter,\n type PaginationState,\n} from \"./data-table-context\";\n\n// Main DataTable component\nexport {\n DataTable,\n type DataTableProps,\n type DataTablePaginationConfig,\n type ColumnDef,\n type Table,\n type Row,\n} from \"./data-table\";\n\n// Skeleton loading states\nexport {\n DataTableSkeleton,\n DataTableFullSkeleton,\n type DataTableSkeletonProps,\n} from \"./data-table-skeleton\";\n\n// Empty state\nexport {\n DataTableEmptyState,\n type DataTableEmptyStateProps,\n} from \"./data-table-empty-state\";\n\n// Toolbar\nexport {\n DataTableToolbar,\n type DataTableToolbarProps,\n type FilterConfig,\n} from \"./data-table-toolbar\";\n","// @goerp/core/ui/data-display\n// Data display components (Table, Card views, etc.)\n\n\"use client\";\n\n// Table definitions removed to avoid conflict with primitives\n\n// Re-export DataTableColumnHeader, FormattedNumberInput, DataTablePagination\nexport { DataTableColumnHeader } from \"./data-table-column-header\";\nexport { FormattedNumberInput } from \"./formatted-number-input\";\nexport type { FormattedNumberInputProps } from \"./formatted-number-input\";\nexport { DataTablePagination } from \"./data-table-pagination\";\nexport { DataTableViewOptions } from \"./data-table-view-options\";\n\nexport * from \"./formatted-number-input\";\nexport * from \"./data-table-pagination\";\nexport * from \"./avatar\";\nexport * from \"./kpi-card\";\nexport * from \"./compact-stat-bar\";\nexport * from \"./show-more-text\";\nexport * from \"./chart\";\nexport * from \"./carousel\";\nexport * from \"./accordion\";\nexport * from \"./kanban\";\nexport * from \"./aspect-ratio\";\nexport * from \"./bento-grid\";\nexport * from \"./code-block-highlight\";\nexport * from \"./collapsible\";\nexport * from \"./highlight\";\nexport * from \"./hover-card\";\nexport * from \"./iphone-15-pro\";\nexport * from \"./media-grid\";\nexport * from \"./safari\";\n// Re-export specific components from primitives to avoid duplication\nexport { Tabs, TabsList, TabsTrigger, TabsContent } from \"../primitives\";\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} from \"../primitives\";\nexport * from \"./timeline\";\n\n// DataTable - Reusable table component for standalone usage\nexport * from \"./data-table\";\n"]}