@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/calendar.tsx","../../../src/ui/primitives/input.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/dropdown-menu.tsx","../../../src/ui/primitives/switch.tsx","../../../src/ui/primitives/checkbox.tsx","../../../src/ui/primitives/label.tsx","../../../src/ui/primitives/tooltip.tsx","../../../src/providers/tenant-provider.tsx","../../../src/providers/index.tsx","../../../src/ui/primitives/resizable.tsx","../../../src/ui/primitives/slider.tsx","../../../src/ui/primitives/menubar.tsx","../../../src/ui/primitives/navigation-menu.tsx","../../../src/ui/primitives/toggle.tsx","../../../src/ui/primitives/toggle-group.tsx","../../../src/ui/primitives/dynamic-icon.tsx","../../../src/ui/feedback/progress.tsx","../../../src/ui/feedback/sheet.tsx","../../../src/ui/feedback/alert.tsx","../../../src/ui/feedback/context-menu.tsx","../../../src/ui/feedback/drawer.tsx","../../../src/ui/feedback/sonner.tsx","../../../src/ui/feedback/error-dialog.tsx","../../../src/ui/feedback/index.tsx","../../../src/hooks/use-tenant.ts","../../../src/hooks/index.tsx","../../../src/ui/primitives/sidebar.tsx","../../../src/ui/primitives/sticky-layout.tsx","../../../src/ui/primitives/prefetch-link.tsx","../../../src/ui/primitives/input-number.tsx","../../../src/ui/primitives/client.ts"],"names":["React","jsx","props","React2","jsxs","Check","ChevronRight","React3","Label","React4","createContext","Dot","ChevronDown","cva","useContext","DrawerPrimitive","Portal","Sonner","useState","useEffect","useRef","useCallback","open","Slot","Link","React7"],"mappings":"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","file":"client.mjs","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","\"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","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 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 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 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 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","\"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","import type { ReactNode } from \"react\";\nimport React, { createContext, useContext } from \"react\";\n\nexport interface TenantBranding {\n logo?: string;\n companyName: string;\n primaryColor?: string;\n favicon?: string;\n}\n\nexport interface TenantConfig {\n id: string;\n name: string;\n branding: TenantBranding;\n // Add more tenant-specific configs here (e.g., date formats, currency)\n dateFormat?: string;\n currency?: string;\n}\n\nexport interface TenantContextValue {\n tenant: TenantConfig;\n}\n\nconst TenantContext = createContext<TenantContextValue | undefined>(undefined);\n\ninterface TenantProviderProps {\n children: ReactNode;\n tenant: TenantConfig;\n}\n\nexport function TenantProvider({ children, tenant }: TenantProviderProps) {\n return (\n <TenantContext.Provider value={{ tenant }}>\n {children}\n </TenantContext.Provider>\n );\n}\n\nexport function useTenantContext() {\n const context = useContext(TenantContext);\n if (context === undefined) {\n throw new Error(\"useTenantContext must be used within a TenantProvider\");\n }\n return context;\n}\n","// @goerp/core/providers\n// Core React context providers for GoERP platform\n// Consolidated from packages/shared/providers\n\n\"use client\";\n\nimport * as React from \"react\";\nimport { createContext, useCallback, useEffect, useState } from \"react\";\nimport { useCookie } from \"react-use\";\nimport { DirectionProvider as RadixDirectionProvider } from \"@radix-ui/react-direction\";\n\nimport type { LocaleType, SettingsType, DirectionType } from \"../types\";\nimport type { ReactNode } from \"react\";\n\n// ============================================================================\n// Settings Provider\n// ============================================================================\n\nexport const defaultSettings: SettingsType = {\n theme: \"blue\",\n mode: \"system\",\n radius: 0.5,\n layout: \"vertical\",\n locale: \"vi\",\n sidebarVariant: \"sidebar\",\n sidebarCollapsible: \"icon\",\n density: \"comfortable\",\n};\n\nexport const SettingsContext = createContext<\n | {\n settings: SettingsType;\n updateSettings: (newSettings: SettingsType) => void;\n resetSettings: () => void;\n }\n | undefined\n>(undefined);\n\nexport function SettingsProvider({\n locale,\n children,\n}: {\n locale: LocaleType;\n children: ReactNode;\n}) {\n const [storedSettings, setStoredSettings, deleteStoredSettings] =\n useCookie(\"settings\");\n const [settings, setSettings] = useState<SettingsType>(() => ({\n ...defaultSettings,\n locale,\n }));\n\n useEffect(() => {\n if (storedSettings) {\n try {\n const parsedSettings = JSON.parse(storedSettings);\n setSettings({ ...defaultSettings, ...parsedSettings });\n } catch {\n setSettings({ ...defaultSettings, locale });\n }\n } else {\n setSettings({ ...defaultSettings, locale });\n }\n }, [storedSettings, locale]);\n\n const updateSettings = useCallback(\n (newSettings: SettingsType) => {\n setStoredSettings(JSON.stringify(newSettings));\n setSettings(newSettings);\n },\n [setStoredSettings],\n );\n\n const resetSettings = useCallback(() => {\n deleteStoredSettings();\n setSettings(defaultSettings);\n }, [deleteStoredSettings]);\n\n return (\n <SettingsContext.Provider\n value={{ settings, updateSettings, resetSettings }}\n >\n {children}\n </SettingsContext.Provider>\n );\n}\n\n// ============================================================================\n// Direction Provider\n// ============================================================================\n\ninterface DirectionProviderProps {\n direction: DirectionType;\n children: React.ReactNode;\n}\n\nexport function DirectionProvider({\n direction,\n children,\n}: DirectionProviderProps) {\n return (\n <RadixDirectionProvider dir={direction}>{children}</RadixDirectionProvider>\n );\n}\n// ============================================================================\n// Tenant Provider\n// ============================================================================\n\nexport * from \"./tenant-provider\";\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 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","\"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\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 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 * 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","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 * 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 { 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\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","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","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\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\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"]}