@goplusvn/core 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/package.json +31 -175
  2. package/dist/audit/index.d.mts +0 -115
  3. package/dist/audit/index.d.ts +0 -115
  4. package/dist/audit/index.js +0 -204
  5. package/dist/audit/index.js.map +0 -1
  6. package/dist/audit/index.mjs +0 -200
  7. package/dist/audit/index.mjs.map +0 -1
  8. package/dist/auth/index.d.mts +0 -86
  9. package/dist/auth/index.d.ts +0 -86
  10. package/dist/auth/index.js +0 -210
  11. package/dist/auth/index.js.map +0 -1
  12. package/dist/auth/index.mjs +0 -198
  13. package/dist/auth/index.mjs.map +0 -1
  14. package/dist/button-1dWvP9Ib.d.mts +0 -30
  15. package/dist/button-1dWvP9Ib.d.ts +0 -30
  16. package/dist/calendar-2QzdEo1z.d.mts +0 -20
  17. package/dist/calendar-2QzdEo1z.d.ts +0 -20
  18. package/dist/code-generation/index.d.mts +0 -30
  19. package/dist/code-generation/index.d.ts +0 -30
  20. package/dist/code-generation/index.js +0 -31
  21. package/dist/code-generation/index.js.map +0 -1
  22. package/dist/code-generation/index.mjs +0 -28
  23. package/dist/code-generation/index.mjs.map +0 -1
  24. package/dist/configs/index.d.mts +0 -175
  25. package/dist/configs/index.d.ts +0 -175
  26. package/dist/configs/index.js +0 -254
  27. package/dist/configs/index.js.map +0 -1
  28. package/dist/configs/index.mjs +0 -233
  29. package/dist/configs/index.mjs.map +0 -1
  30. package/dist/crud/index.d.mts +0 -646
  31. package/dist/crud/index.d.ts +0 -646
  32. package/dist/crud/index.js +0 -11772
  33. package/dist/crud/index.js.map +0 -1
  34. package/dist/crud/index.mjs +0 -11665
  35. package/dist/crud/index.mjs.map +0 -1
  36. package/dist/crud/server.d.mts +0 -20
  37. package/dist/crud/server.d.ts +0 -20
  38. package/dist/crud/server.js +0 -123
  39. package/dist/crud/server.js.map +0 -1
  40. package/dist/crud/server.mjs +0 -120
  41. package/dist/crud/server.mjs.map +0 -1
  42. package/dist/data-table-skeleton-12NA8Mjx.d.mts +0 -39
  43. package/dist/data-table-skeleton-12NA8Mjx.d.ts +0 -39
  44. package/dist/dialog-bKfjZMTd.d.mts +0 -22
  45. package/dist/dialog-bKfjZMTd.d.ts +0 -22
  46. package/dist/dynamic-icon-DrGIiu2N.d.mts +0 -10
  47. package/dist/dynamic-icon-DrGIiu2N.d.ts +0 -10
  48. package/dist/home/index.d.mts +0 -269
  49. package/dist/home/index.d.ts +0 -269
  50. package/dist/home/index.js +0 -1678
  51. package/dist/home/index.js.map +0 -1
  52. package/dist/home/index.mjs +0 -1635
  53. package/dist/home/index.mjs.map +0 -1
  54. package/dist/hooks/index.d.mts +0 -7
  55. package/dist/hooks/index.d.ts +0 -7
  56. package/dist/hooks/index.js +0 -8316
  57. package/dist/hooks/index.js.map +0 -1
  58. package/dist/hooks/index.mjs +0 -8255
  59. package/dist/hooks/index.mjs.map +0 -1
  60. package/dist/index-50hpiPrV.d.ts +0 -116
  61. package/dist/index-B9zQVEVi.d.mts +0 -116
  62. package/dist/index.d.mts +0 -5
  63. package/dist/index.d.ts +0 -5
  64. package/dist/index.js +0 -123
  65. package/dist/index.js.map +0 -1
  66. package/dist/index.mjs +0 -118
  67. package/dist/index.mjs.map +0 -1
  68. package/dist/infrastructure/index.d.mts +0 -423
  69. package/dist/infrastructure/index.d.ts +0 -423
  70. package/dist/infrastructure/index.js +0 -633
  71. package/dist/infrastructure/index.js.map +0 -1
  72. package/dist/infrastructure/index.mjs +0 -619
  73. package/dist/infrastructure/index.mjs.map +0 -1
  74. package/dist/label-DWTEkNPo.d.ts +0 -226
  75. package/dist/label-LPpdcoBx.d.mts +0 -226
  76. package/dist/layout/index.d.mts +0 -48
  77. package/dist/layout/index.d.ts +0 -48
  78. package/dist/layout/index.js +0 -117
  79. package/dist/layout/index.js.map +0 -1
  80. package/dist/layout/index.mjs +0 -90
  81. package/dist/layout/index.mjs.map +0 -1
  82. package/dist/navigation/index.d.mts +0 -16
  83. package/dist/navigation/index.d.ts +0 -16
  84. package/dist/navigation/index.js +0 -53
  85. package/dist/navigation/index.js.map +0 -1
  86. package/dist/navigation/index.mjs +0 -50
  87. package/dist/navigation/index.mjs.map +0 -1
  88. package/dist/notification/index.d.mts +0 -105
  89. package/dist/notification/index.d.ts +0 -105
  90. package/dist/notification/index.js +0 -278
  91. package/dist/notification/index.js.map +0 -1
  92. package/dist/notification/index.mjs +0 -274
  93. package/dist/notification/index.mjs.map +0 -1
  94. package/dist/organization/index.d.mts +0 -99
  95. package/dist/organization/index.d.ts +0 -99
  96. package/dist/organization/index.js +0 -360
  97. package/dist/organization/index.js.map +0 -1
  98. package/dist/organization/index.mjs +0 -352
  99. package/dist/organization/index.mjs.map +0 -1
  100. package/dist/plugin/index.d.mts +0 -83
  101. package/dist/plugin/index.d.ts +0 -83
  102. package/dist/plugin/index.js +0 -86
  103. package/dist/plugin/index.js.map +0 -1
  104. package/dist/plugin/index.mjs +0 -84
  105. package/dist/plugin/index.mjs.map +0 -1
  106. package/dist/providers/index.d.mts +0 -25
  107. package/dist/providers/index.d.ts +0 -25
  108. package/dist/providers/index.js +0 -84
  109. package/dist/providers/index.js.map +0 -1
  110. package/dist/providers/index.mjs +0 -77
  111. package/dist/providers/index.mjs.map +0 -1
  112. package/dist/rbac/index.d.mts +0 -226
  113. package/dist/rbac/index.d.ts +0 -226
  114. package/dist/rbac/index.js +0 -4784
  115. package/dist/rbac/index.js.map +0 -1
  116. package/dist/rbac/index.mjs +0 -4722
  117. package/dist/rbac/index.mjs.map +0 -1
  118. package/dist/rbac/permissions.d.mts +0 -26
  119. package/dist/rbac/permissions.d.ts +0 -26
  120. package/dist/rbac/permissions.js +0 -94
  121. package/dist/rbac/permissions.js.map +0 -1
  122. package/dist/rbac/permissions.mjs +0 -90
  123. package/dist/rbac/permissions.mjs.map +0 -1
  124. package/dist/rbac/server.d.mts +0 -1
  125. package/dist/rbac/server.d.ts +0 -1
  126. package/dist/rbac/server.js +0 -128
  127. package/dist/rbac/server.js.map +0 -1
  128. package/dist/rbac/server.mjs +0 -124
  129. package/dist/rbac/server.mjs.map +0 -1
  130. package/dist/schemas/index.d.mts +0 -1257
  131. package/dist/schemas/index.d.ts +0 -1257
  132. package/dist/schemas/index.js +0 -572
  133. package/dist/schemas/index.js.map +0 -1
  134. package/dist/schemas/index.mjs +0 -523
  135. package/dist/schemas/index.mjs.map +0 -1
  136. package/dist/server-QuYCTa89.d.mts +0 -83
  137. package/dist/server-QuYCTa89.d.ts +0 -83
  138. package/dist/sonner-C74GlRDQ.d.mts +0 -71
  139. package/dist/sonner-C74GlRDQ.d.ts +0 -71
  140. package/dist/status-BOXZgIqX.d.mts +0 -12
  141. package/dist/status-BOXZgIqX.d.ts +0 -12
  142. package/dist/system/index.d.mts +0 -77
  143. package/dist/system/index.d.ts +0 -77
  144. package/dist/system/index.js +0 -102
  145. package/dist/system/index.js.map +0 -1
  146. package/dist/system/index.mjs +0 -100
  147. package/dist/system/index.mjs.map +0 -1
  148. package/dist/tabs-C6FfBwPY.d.mts +0 -18
  149. package/dist/tabs-C6FfBwPY.d.ts +0 -18
  150. package/dist/tenant-provider-B8eC_Wpb.d.mts +0 -27
  151. package/dist/tenant-provider-B8eC_Wpb.d.ts +0 -27
  152. package/dist/types/index.d.mts +0 -469
  153. package/dist/types/index.d.ts +0 -469
  154. package/dist/types/index.js +0 -25
  155. package/dist/types/index.js.map +0 -1
  156. package/dist/types/index.mjs +0 -21
  157. package/dist/types/index.mjs.map +0 -1
  158. package/dist/ui/auth.d.mts +0 -39
  159. package/dist/ui/auth.d.ts +0 -39
  160. package/dist/ui/auth.js +0 -4941
  161. package/dist/ui/auth.js.map +0 -1
  162. package/dist/ui/auth.mjs +0 -4896
  163. package/dist/ui/auth.mjs.map +0 -1
  164. package/dist/ui/crud.d.mts +0 -2
  165. package/dist/ui/crud.d.ts +0 -2
  166. package/dist/ui/crud.js +0 -4
  167. package/dist/ui/crud.js.map +0 -1
  168. package/dist/ui/crud.mjs +0 -3
  169. package/dist/ui/crud.mjs.map +0 -1
  170. package/dist/ui/data-display.d.mts +0 -596
  171. package/dist/ui/data-display.d.ts +0 -596
  172. package/dist/ui/data-display.js +0 -5307
  173. package/dist/ui/data-display.js.map +0 -1
  174. package/dist/ui/data-display.mjs +0 -5212
  175. package/dist/ui/data-display.mjs.map +0 -1
  176. package/dist/ui/feedback.d.mts +0 -55
  177. package/dist/ui/feedback.d.ts +0 -55
  178. package/dist/ui/feedback.js +0 -2608
  179. package/dist/ui/feedback.js.map +0 -1
  180. package/dist/ui/feedback.mjs +0 -2526
  181. package/dist/ui/feedback.mjs.map +0 -1
  182. package/dist/ui/forms.d.mts +0 -309
  183. package/dist/ui/forms.d.ts +0 -309
  184. package/dist/ui/forms.js +0 -4656
  185. package/dist/ui/forms.js.map +0 -1
  186. package/dist/ui/forms.mjs +0 -4571
  187. package/dist/ui/forms.mjs.map +0 -1
  188. package/dist/ui/index.d.mts +0 -331
  189. package/dist/ui/index.d.ts +0 -331
  190. package/dist/ui/index.js +0 -16953
  191. package/dist/ui/index.js.map +0 -1
  192. package/dist/ui/index.mjs +0 -16598
  193. package/dist/ui/index.mjs.map +0 -1
  194. package/dist/ui/primitives/client.d.mts +0 -61
  195. package/dist/ui/primitives/client.d.ts +0 -61
  196. package/dist/ui/primitives/client.js +0 -3408
  197. package/dist/ui/primitives/client.js.map +0 -1
  198. package/dist/ui/primitives/client.mjs +0 -3256
  199. package/dist/ui/primitives/client.mjs.map +0 -1
  200. package/dist/ui/primitives.d.mts +0 -113
  201. package/dist/ui/primitives.d.ts +0 -113
  202. package/dist/ui/primitives.js +0 -3356
  203. package/dist/ui/primitives.js.map +0 -1
  204. package/dist/ui/primitives.mjs +0 -3227
  205. package/dist/ui/primitives.mjs.map +0 -1
  206. package/dist/user/index.d.mts +0 -228
  207. package/dist/user/index.d.ts +0 -228
  208. package/dist/user/index.js +0 -4306
  209. package/dist/user/index.js.map +0 -1
  210. package/dist/user/index.mjs +0 -4260
  211. package/dist/user/index.mjs.map +0 -1
  212. package/dist/utils/index.d.mts +0 -205
  213. package/dist/utils/index.d.ts +0 -205
  214. package/dist/utils/index.js +0 -574
  215. package/dist/utils/index.js.map +0 -1
  216. package/dist/utils/index.mjs +0 -514
  217. package/dist/utils/index.mjs.map +0 -1
  218. package/dist/workflow/index.d.mts +0 -40
  219. package/dist/workflow/index.d.ts +0 -40
  220. package/dist/workflow/index.js +0 -3710
  221. package/dist/workflow/index.js.map +0 -1
  222. package/dist/workflow/index.mjs +0 -3677
  223. package/dist/workflow/index.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/index.ts","../../src/ui/primitives/button.tsx","../../src/ui/primitives/badge.tsx","../../src/ui/primitives/input.tsx","../../src/ui/primitives/checkbox.tsx","../../src/ui/primitives/card.tsx","../../src/ui/primitives/separator.tsx","../../src/ui/primitives/table.tsx","../../src/ui/primitives/dropdown-menu.tsx","../../src/ui/primitives/dialog.tsx","../../src/ui/primitives/tabs.tsx","../../src/ui/primitives/breadcrumb.tsx","../../src/ui/primitives/keyboard.tsx","../../src/ui/primitives/pagination.tsx","../../src/ui/primitives/status-badge.tsx","../../src/providers/tenant-provider.tsx","../../src/providers/index.tsx","../../src/ui/primitives/calendar.tsx","../../src/ui/primitives/scroll-area.tsx","../../src/ui/primitives/combobox.tsx","../../src/ui/primitives/select.tsx","../../src/ui/primitives/popover.tsx","../../src/ui/primitives/switch.tsx","../../src/ui/primitives/label.tsx","../../src/ui/primitives/tooltip.tsx","../../src/ui/primitives/resizable.tsx","../../src/ui/primitives/slider.tsx","../../src/ui/primitives/toggle.tsx","../../src/ui/primitives/toggle-group.tsx","../../src/ui/primitives/menubar.tsx","../../src/ui/primitives/navigation-menu.tsx","../../src/ui/feedback/sheet.tsx","../../src/ui/feedback/context-menu.tsx","../../src/ui/feedback/drawer.tsx","../../src/ui/feedback/progress.tsx","../../src/ui/feedback/sonner.tsx","../../src/hooks/use-tenant.ts","../../src/hooks/index.tsx","../../src/ui/primitives/sidebar.tsx","../../src/ui/primitives/index.tsx","../../src/ui/feedback/alert.tsx","../../src/ui/feedback/error-dialog.tsx","../../src/ui/feedback/index.tsx"],"names":["React","cva","React2","jsx","React3","React4","React5","React6","React7","jsxs","React8","createContext","Label","React10","SheetPrimitive","ChevronRight","Check","Dot","DrawerPrimitive","Portal","Sonner","useState","useEffect","useContext","open","Slot","React12","useCallback","ChevronDown","Fragment"],"mappings":"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","file":"feedback.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","import * as React from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils\";\n\n/**\n * Badge Variants — Enhanced with Plane-inspired semantic tokens\n *\n * New variants:\n * - danger: Red subtle background for errors/alerts\n * - info: Blue subtle background for informational\n * - accent: Brand color subtle background\n *\n * Updated variants:\n * - success: Now uses semantic token (was hardcoded bg-green-500)\n * - warning: Now uses semantic token (was hardcoded bg-yellow-500)\n */\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n // Existing variants (backwards-compatible)\n default: \"border-transparent bg-primary text-primary-foreground\",\n secondary: \"border-transparent bg-secondary text-secondary-foreground\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground\",\n outline: \"text-foreground\",\n\n // Enhanced semantic variants (using Design Tokens)\n success:\n \"border-transparent bg-success-subtle text-success-text\",\n warning:\n \"border-transparent bg-warning-subtle text-warning-text\",\n danger:\n \"border-transparent bg-danger-subtle text-danger-text\",\n info:\n \"border-transparent bg-info-subtle text-info-text\",\n accent:\n \"border-transparent bg-accent-primary-subtle text-accent-primary\",\n },\n size: {\n default: \"\",\n sm: \"px-1.5 py-0 text-[10px]\",\n lg: \"px-3 py-1 text-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, size, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant, size }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };\n\n","import * as React from \"react\";\nimport { cn } from \"../../utils\";\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\nexport interface CheckboxProps\n extends ComponentProps<typeof CheckboxPrimitive.Root> {}\n\nexport const Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n CheckboxProps\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n","import * as React from \"react\";\n\nimport { cn } from \"../../utils\";\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\";\nimport type { VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../utils\";\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\";\n}\n\nexport const Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n ({ className, orientation = \"horizontal\", ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className,\n )}\n {...props}\n />\n ),\n);\nSeparator.displayName = \"Separator\";\n\nexport function SeparatorWithText({\n className,\n orientation = \"horizontal\",\n children,\n ...props\n}: SeparatorProps) {\n return (\n <div\n className={cn(\n \"flex justify-between items-center\",\n orientation === \"horizontal\" ? \"w-full\" : \"flex-col h-full\",\n className,\n )}\n >\n <Separator orientation={orientation} className=\"shrink\" {...props} />\n <span\n className={cn(\n \"shrink-0 px-2 text-sm text-muted-foreground uppercase\",\n orientation === \"vertical\" && \"-rotate-90 rtl:rotate-90\",\n )}\n >\n {children}\n </span>\n <Separator orientation={orientation} className=\"shrink\" {...props} />\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../utils\";\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-max min-w-full caption-bottom text-xs\", className)}\n {...props}\n />\n </div>\n));\nTable.displayName = \"Table\";\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n));\nTableHeader.displayName = \"TableHeader\";\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n));\nTableBody.displayName = \"TableBody\";\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className,\n )}\n {...props}\n />\n));\nTableFooter.displayName = \"TableFooter\";\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b transition-colors even:bg-muted/30 data-[state=selected]:bg-muted\",\n className,\n )}\n {...props}\n />\n));\nTableRow.displayName = \"TableRow\";\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-9 px-3 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n className,\n )}\n {...props}\n />\n));\nTableHead.displayName = \"TableHead\";\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\"px-3 py-1.5 align-middle [&:has([role=checkbox])]:pr-0 text-xs\", className)}\n {...props}\n />\n));\nTableCell.displayName = \"TableCell\";\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nTableCaption.displayName = \"TableCaption\";\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronRight, Dot } from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\nexport function DropdownMenu({\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nexport function DropdownMenuPortal({\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n );\n}\n\nexport function DropdownMenuTrigger({\n className,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuGroup({\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n );\n}\n\nexport function DropdownMenuRadioGroup({\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n );\n}\n\nexport function DropdownMenuSub({\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\ntype DropdownMenuSubTriggerProps = ComponentProps<\n typeof DropdownMenuPrimitive.SubTrigger\n> & {\n inset?: boolean;\n};\n\nexport function DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: DropdownMenuSubTriggerProps) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"cursor-pointer flex items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:ps-8 focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ms-auto h-4 w-4 rtl:-scale-100\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nexport function DropdownMenuSubContent({\n className,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nexport function DropdownMenuItem({\n className,\n inset,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 data-[inset]:ps-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nexport function DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Dot className=\"h-4 w-4 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\nexport function DropdownMenuLabel({\n className,\n inset,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold data-[inset]:ps-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuSeparator({\n className,\n ...props\n}: ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuShortcut({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport { cn } from \"../../utils\";\n\nconst Tabs = TabsPrimitive.Root;\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { ChevronRight, Ellipsis } from \"lucide-react\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function Breadcrumb({ ...props }: ComponentProps<\"nav\">) {\n return <nav aria-label=\"breadcrumb\" data-slot=\"breadcrumb\" {...props} />;\n}\n\nexport function BreadcrumbList({ className, ...props }: ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function BreadcrumbItem({ className, ...props }: ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n );\n}\n\nexport function BreadcrumbLink({\n asChild,\n className,\n ...props\n}: ComponentProps<\"a\"> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : \"a\";\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"transition-colors hover:text-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport function BreadcrumbPage({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"font-normal text-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport function BreadcrumbSeparator({\n children,\n className,\n ...props\n}: ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n );\n}\n\nexport function BreadcrumbEllipsis({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n aria-label=\"More\"\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <Ellipsis className=\"h-4 w-4\" />\n </span>\n );\n}\n","import type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function Keyboard({\n className,\n children,\n ...props\n}: ComponentProps<\"kbd\">) {\n return (\n <kbd\n data-slot=\"keyboard\"\n className={cn(\n \"pointer-events-none select-none h-5 inline-flex items-center gap-x-1 px-1.5 bg-muted text-sm text-muted-foreground font-mono border rounded-sm\",\n \"before:content-['⌘']\",\n className,\n )}\n {...props}\n >\n {children}\n </kbd>\n );\n}\n","import Link from \"next/link\";\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\";\n\nimport type { Button } from \"./button\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nimport { buttonVariants } from \"./button\";\n\nexport function Pagination({ className, ...props }: ComponentProps<\"nav\">) {\n return (\n <nav\n data-slot=\"pagination\"\n role=\"navigation\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n aria-label=\"pagination\"\n {...props}\n />\n );\n}\n\nexport function PaginationContent({\n className,\n ...props\n}: ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n );\n}\n\nexport function PaginationItem({ ...props }: ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\nexport type PaginationLinkProps = {\n isActive?: boolean;\n} & Pick<ComponentProps<typeof Button>, \"size\"> &\n ComponentProps<typeof Link>;\n\nexport function PaginationLink({\n className,\n isActive,\n size = \"icon\",\n href = \"\",\n ...props\n}: PaginationLinkProps) {\n return (\n <Link\n data-slot=\"pagination-link\"\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className,\n )}\n href={href}\n aria-current={isActive ? \"page\" : undefined}\n {...props}\n />\n );\n}\n\nexport function PaginationPrevious({\n className,\n ...props\n}: ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n size=\"default\"\n className={cn(\"gap-1 ps-2.5\", className)}\n aria-label=\"Go to previous page\"\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4 rtl:-scale-100\" />\n <span>Previous</span>\n </PaginationLink>\n );\n}\n\nexport function PaginationNext({\n className,\n ...props\n}: ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n size=\"default\"\n className={cn(\"gap-1 pe-2.5\", className)}\n aria-label=\"Go to next page\"\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4 rtl:-scale-100\" />\n </PaginationLink>\n );\n}\n\nexport function PaginationEllipsis({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n aria-label=\"More pages\"\n aria-hidden\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </span>\n );\n}\n","import { Badge } from \"./badge\";\nimport { STATUS_COLORS, STATUS_ACTIVE, STATUS_INACTIVE } from \"../../utils\";\nimport { cn } from \"../../utils\";\n\ninterface StatusBadgeProps {\n status: string | unknown;\n className?: string;\n label?: string;\n}\n\nexport function StatusBadge({\n status,\n className,\n label: customLabel,\n}: StatusBadgeProps) {\n const statusStr = String(status);\n const variant = STATUS_COLORS[statusStr] || \"secondary\";\n\n // Custom styles for success (green) and warning (yellow) since they might not be in default badge variants\n let badgeClass = \"\";\n if (variant === \"success\") {\n badgeClass =\n \"bg-green-500 hover:bg-green-600 text-white border-transparent\";\n } else if (variant === \"warning\") {\n badgeClass =\n \"bg-yellow-500 hover:bg-yellow-600 text-white border-transparent\";\n }\n\n // Use custom label if provided, otherwise fallback to basic mapping or raw value\n let label = customLabel || statusStr;\n\n // Fallback mapping if no custom label provided\n if (!customLabel) {\n if (statusStr === STATUS_ACTIVE) label = \"Active\";\n }\n\n return (\n <Badge\n variant={\n variant === \"success\" || variant === \"warning\" ? \"default\" : variant\n }\n className={cn(badgeClass, className)}\n >\n {label}\n </Badge>\n );\n}\n","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 React from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { DayPicker } from \"react-day-picker\";\n\nimport { cn } from \"../../utils\";\nimport { buttonVariants } from \"./button\";\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>;\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n ...props\n}: CalendarProps) {\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\"p-3\", className)}\n classNames={{\n month: \"space-y-4\",\n month_caption: \"flex justify-center pt-1 items-center\",\n caption_label: \"text-sm font-medium\",\n nav: \"relative gap-x-1 flex items-center\",\n button_previous: cn(\n buttonVariants({ variant: \"outline\" }),\n \"absolute top-0 start-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\",\n ),\n button_next: cn(\n buttonVariants({ variant: \"outline\" }),\n \"absolute top-0 end-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\",\n ),\n month_grid: \"w-full border-collapse space-y-1\",\n weekdays: \"flex\",\n weekday:\n \"text-muted-foreground rounded-md w-8 font-normal text-[0.8rem]\",\n week: \"flex w-full mt-2\",\n day: cn(\n buttonVariants({ variant: \"ghost\" }),\n \"relative h-8 w-8 p-0 font-normal text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected].day-range-end)]:rounded-e-md\",\n ),\n day_button: \"cursor-pointer h-full w-full aria-selected:opacity-100\",\n range_start: \"rounded-md!\",\n range_end: \"rounded-md!\",\n selected: cn(\n \"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground\",\n props.mode === \"range\" && \"rounded-none\",\n ),\n today: \"bg-accent text-accent-foreground\",\n outside:\n \"day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30\",\n disabled: \"text-muted-foreground opacity-50\",\n range_middle:\n \"aria-selected:bg-accent aria-selected:text-accent-foreground\",\n hidden: \"invisible\",\n ...classNames,\n }}\n components={{\n Chevron: (props) => {\n if (props.orientation === \"left\") {\n return <ChevronLeft className=\"h-4 w-4\" />;\n }\n return <ChevronRight className=\"h-4 w-4\" />;\n },\n }}\n {...props}\n />\n );\n}\nCalendar.displayName = \"Calendar\";\n\nexport { Calendar };\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport { cn } from \"../../utils\";\n\ntype ScrollAreaProps = ComponentProps<typeof ScrollAreaPrimitive.Root> &\n Pick<\n ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n \"orientation\"\n >;\n\nexport function ScrollArea({\n orientation,\n className,\n children,\n ...props\n}: ScrollAreaProps) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"h-full w-full rounded-[inherit]\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar orientation={orientation} />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nexport interface ScrollBarProps\n extends ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar> {}\n\nexport function ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: ScrollBarProps) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Check, ChevronsUpDown, Search, X } from \"lucide-react\";\n\nimport { cn } from \"../../utils\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { ScrollArea } from \"./scroll-area\";\n\nexport interface ComboboxOption {\n value: string | number | boolean;\n label: string;\n}\n\ninterface ComboboxProps {\n options: ComboboxOption[];\n value?: string | number | boolean;\n onValueChange?: (value: string | number | boolean | undefined) => void;\n placeholder?: string;\n searchPlaceholder?: string;\n emptyText?: string;\n disabled?: boolean;\n className?: string;\n id?: string;\n}\n\nexport function Combobox({\n options,\n value,\n onValueChange,\n placeholder = \"Select option...\",\n searchPlaceholder = \"Search...\",\n emptyText = \"No option found.\",\n disabled = false,\n className,\n id,\n}: ComboboxProps) {\n const [open, setOpen] = useState(false);\n const [searchValue, setSearchValue] = useState(\"\");\n const containerRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const selectedOption = options.find(\n (option) => String(option.value) === String(value),\n );\n\n // Filter options based on search value\n const filteredOptions = useMemo(() => {\n if (!searchValue.trim()) {\n return options;\n }\n const searchLower = searchValue.toLowerCase();\n return options.filter(\n (option) =>\n option.label.toLowerCase().includes(searchLower) ||\n String(option.value).toLowerCase().includes(searchLower),\n );\n }, [options, searchValue]);\n\n // Reset search when dropdown closes\n useEffect(() => {\n if (!open) {\n setSearchValue(\"\");\n }\n }, [open]);\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (open && searchInputRef.current) {\n // Small delay to ensure dropdown is rendered\n setTimeout(() => {\n searchInputRef.current?.focus();\n }, 50);\n }\n }, [open]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n if (!open) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (\n containerRef.current &&\n !containerRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n // Don't close if clicking inside dialog\n if (target.closest('[data-slot=\"dialog-content\"]')) {\n return;\n }\n setOpen(false);\n }\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && open) {\n event.stopPropagation();\n setOpen(false);\n }\n };\n\n // Use capture phase to catch events before Dialog\n document.addEventListener(\"mousedown\", handleClickOutside, true);\n document.addEventListener(\"keydown\", handleEscape, true);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside, true);\n document.removeEventListener(\"keydown\", handleEscape, true);\n };\n }, [open]);\n\n const handleSelect = useCallback(\n (optionValue: string | number | boolean) => {\n if (onValueChange) {\n onValueChange(optionValue);\n setOpen(false);\n }\n },\n [onValueChange],\n );\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (onValueChange) {\n // Pass undefined instead of empty string to indicate no selection\n onValueChange(undefined);\n }\n },\n [onValueChange],\n );\n\n return (\n <div ref={containerRef} className=\"relative w-full\">\n <Button\n type=\"button\"\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn(\"w-full justify-between\", className)}\n id={id}\n onClick={(e) => {\n e.stopPropagation();\n setOpen(!open);\n }}\n >\n <span className=\"truncate\">\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <div className=\"ml-2 flex items-center gap-1 shrink-0\">\n {selectedOption && (\n <div\n role=\"button\"\n tabIndex={0}\n className=\"h-4 w-4 p-0 hover:bg-transparent cursor-pointer flex items-center justify-center\"\n onClick={handleClear}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation();\n handleClear(e as any);\n }\n }}\n >\n <X className=\"h-3.5 w-3.5 text-red-500 hover:text-red-600\" />\n </div>\n )}\n <ChevronsUpDown className=\"h-4 w-4 opacity-50\" />\n </div>\n </Button>\n\n {open && (\n <div\n ref={dropdownRef}\n className=\"absolute z-[100] mt-1 w-full rounded-md border bg-popover text-popover-foreground shadow-md\"\n style={{\n top: \"100%\",\n left: 0,\n }}\n >\n <div className=\"flex flex-col\">\n {/* Search Input */}\n <div className=\"flex items-center border-b px-3 py-2\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <Input\n ref={searchInputRef}\n placeholder={searchPlaceholder}\n value={searchValue}\n onChange={(e) => {\n e.stopPropagation();\n setSearchValue(e.target.value);\n }}\n onKeyDown={(e) => {\n // Prevent Dialog from intercepting keyboard events\n e.stopPropagation();\n // Close dropdown on Escape\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n }\n // Select first filtered option on Enter\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (filteredOptions.length > 0) {\n handleSelect(filteredOptions[0].value);\n }\n }\n }}\n onClick={(e) => {\n e.stopPropagation();\n }}\n onFocus={(e) => {\n e.stopPropagation();\n }}\n className=\"border-0 focus-visible:ring-0 focus-visible:ring-offset-0 h-9 bg-transparent px-0\"\n />\n {searchValue && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0\"\n onClick={(e) => {\n e.stopPropagation();\n setSearchValue(\"\");\n searchInputRef.current?.focus();\n }}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n )}\n </div>\n\n {/* Options List */}\n <ScrollArea className=\"max-h-[300px]\">\n {filteredOptions.length === 0 ? (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n {emptyText}\n </div>\n ) : (\n <div className=\"p-1\">\n {filteredOptions.map((option) => {\n const isSelected = String(value) === String(option.value);\n return (\n <div\n key={String(option.value)}\n role=\"option\"\n aria-selected={isSelected}\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none\",\n \"hover:bg-accent hover:text-accent-foreground\",\n isSelected && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleSelect(option.value);\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleSelect(option.value);\n }}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4 shrink-0\",\n isSelected ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <span className=\"flex-1 truncate\">{option.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </ScrollArea>\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\nexport function Select({\n ...props\n}: ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nexport function SelectGroup({\n ...props\n}: ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nexport function SelectValue({\n ...props\n}: ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\ntype SelectTriggerProps = ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\";\n};\n\nexport function SelectTrigger({\n className,\n children,\n ...props\n}: SelectTriggerProps) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n className={cn(\n \"cursor-pointer flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-hidden focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nexport function SelectScrollUpButton({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-pointer items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nexport function SelectScrollDownButton({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-pointer items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport function SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nexport function SelectLabel({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...props}\n />\n );\n}\n\nexport function SelectItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nexport function SelectSeparator({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { cn } from \"../../utils\";\n\nexport function Popover({\n ...props\n}: ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nexport function PopoverTrigger({\n className,\n ...props\n}: ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return (\n <PopoverPrimitive.Trigger\n data-slot=\"popover-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function PopoverAnchor({\n ...props\n}: ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\nexport function PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n container,\n ...props\n}: ComponentProps<typeof PopoverPrimitive.Content> & {\n container?: HTMLElement;\n}) {\n return (\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\nimport { cn } from \"../../utils\";\n\nexport interface SwitchProps\n extends ComponentProps<typeof SwitchPrimitives.Root> {}\n\nexport function Switch({ className, ...props }: SwitchProps) {\n return (\n <SwitchPrimitives.Root\n data-slot=\"switch\"\n className={cn(\n \"peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input\",\n className,\n )}\n {...props}\n >\n <SwitchPrimitives.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0 rtl:data-[state=checked]:-translate-x-4\",\n )}\n />\n </SwitchPrimitives.Root>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ComponentProps } from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cn } from \"../../utils\";\n\nexport interface LabelProps\n extends ComponentProps<typeof LabelPrimitive.Root> {}\n\nexport const Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n LabelProps\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n className,\n )}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n","\"use client\";\n\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../../utils\";\n\nexport function TooltipProvider({\n delayDuration = 0,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nexport function Tooltip({\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\nexport function TooltipTrigger({\n className,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return (\n <TooltipPrimitive.Trigger\n data-slot=\"tooltip-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function TooltipContent({\n className,\n sideOffset = 0,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-sm text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as ResizablePrimitive from \"react-resizable-panels\";\nimport { GripVertical } from \"lucide-react\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function ResizablePanelGroup({\n className,\n ...props\n}: ComponentProps<typeof ResizablePrimitive.PanelGroup>) {\n return (\n <ResizablePrimitive.PanelGroup\n data-slot=\"resizable-panel-group\"\n className={cn(\n \"flex h-full w-full data-[panel-group-direction=vertical]:flex-col\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function ResizablePanel({\n ...props\n}: ComponentProps<typeof ResizablePrimitive.Panel>) {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />;\n}\n\ntype ResizableHandleProps = ComponentProps<\n typeof ResizablePrimitive.PanelResizeHandle\n> & {\n withHandle?: boolean;\n};\n\nexport function ResizableHandle({\n withHandle,\n className,\n ...props\n}: ResizableHandleProps) {\n return (\n <ResizablePrimitive.PanelResizeHandle\n data-slot=\"resizable-handle\"\n className={cn(\n \"relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90\",\n className,\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border\">\n <GripVertical className=\"h-2.5 w-2.5\" />\n </div>\n )}\n </ResizablePrimitive.PanelResizeHandle>\n );\n}\n","\"use client\";\n\nimport * as SliderPrimitive from \"@radix-ui/react-slider\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function Slider({\n className,\n ...props\n}: ComponentProps<typeof SliderPrimitive.Root>) {\n return (\n <SliderPrimitive.Root\n className={cn(\n \"relative flex w-full touch-none select-none items-center\",\n className,\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20\">\n <SliderPrimitive.Range className=\"absolute h-full bg-primary\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"cursor-pointer block h-4 w-4 rounded-full border border-primary/50 bg-background shadow-sm transition-colors focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n );\n}\n","\"use client\";\n\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\";\nimport { cva } from \"class-variance-authority\";\n\nimport type { VariantProps } from \"class-variance-authority\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport const toggleVariants = cva(\n \"cursor-pointer inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-9 px-3\",\n sm: \"h-8 px-2\",\n lg: \"h-10 px-3\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport function Toggle({\n className,\n variant,\n size,\n ...props\n}: ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\n\nimport type { VariantProps } from \"class-variance-authority\";\nimport type { ComponentProps, ComponentPropsWithoutRef } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nimport { toggleVariants } from \"./toggle\";\n\nconst ToggleGroupContext = createContext<VariantProps<typeof toggleVariants>>({\n size: \"default\",\n variant: \"default\",\n});\n\ntype ToggleGroupProps = ComponentProps<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants>;\n\nexport function ToggleGroup({\n className,\n variant,\n size,\n children,\n ...props\n}: ToggleGroupProps) {\n return (\n <ToggleGroupPrimitive.Root\n data-slot=\"toggle-group\"\n className={cn(\"flex items-center justify-center gap-1\", className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n );\n}\n\ntype ToggleGroupItemProps = ComponentPropsWithoutRef<\n typeof ToggleGroupPrimitive.Item\n> &\n VariantProps<typeof toggleVariants>;\n\nexport function ToggleGroupItem({\n className,\n children,\n variant,\n size,\n ...props\n}: ToggleGroupItemProps) {\n const context = useContext(ToggleGroupContext);\n\n return (\n <ToggleGroupPrimitive.Item\n data-slot=\"toggle-group-item\"\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className,\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n}\n","\"use client\";\n\nimport * as MenubarPrimitive from \"@radix-ui/react-menubar\";\nimport { Check, ChevronRight, Dot } from \"lucide-react\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function MenubarMenu({\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Menu>) {\n return <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />;\n}\n\nexport function MenubarGroup({\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Group>) {\n return <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />;\n}\n\nexport function MenubarPortal({\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Portal>) {\n return <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />;\n}\n\nexport function MenubarRadioGroup({\n ...props\n}: ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n return (\n <MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />\n );\n}\n\nexport function Menubar({\n className,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Root>) {\n return (\n <MenubarPrimitive.Root\n data-slot=\"menubar\"\n className={cn(\n \"flex h-9 items-center gap-x-1 rounded-md border bg-background p-1\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function MenubarTrigger({\n className,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Trigger>) {\n return (\n <MenubarPrimitive.Trigger\n data-slot=\"menubar-trigger\"\n className={cn(\n \"flex cursor-pointer select-none items-center rounded-sm px-3 py-1 text-sm font-medium outline-hidden focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function MenubarSubTrigger({\n className,\n inset,\n children,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <MenubarPrimitive.SubTrigger\n data-slot=\"menubar-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground cursor-pointer flex items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:ps-8\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ms-auto h-4 w-4 rtl:-scale-x-100\" />\n </MenubarPrimitive.SubTrigger>\n );\n}\n\nexport function MenubarSub({\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Sub>) {\n return <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />;\n}\n\nexport function MenubarSubContent({\n className,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.SubContent>) {\n return (\n <MenubarPrimitive.SubContent\n data-slot=\"menubar-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function MenubarContent({\n className,\n align = \"start\",\n alignOffset = -4,\n sideOffset = 8,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Content>) {\n return (\n <MenubarPortal>\n <MenubarPrimitive.Content\n data-slot=\"menubar-content\"\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </MenubarPortal>\n );\n}\n\ntype MenubarItemProps = ComponentProps<typeof MenubarPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n};\n\nexport function MenubarItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: MenubarItemProps) {\n return (\n <MenubarPrimitive.Item\n data-slot=\"menubar-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function MenubarCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {\n return (\n <MenubarPrimitive.CheckboxItem\n data-slot=\"menubar-checkbox-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute start-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n );\n}\n\nexport function MenubarRadioItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.RadioItem>) {\n return (\n <MenubarPrimitive.RadioItem\n data-slot=\"menubar-radio-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute start-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <Dot className=\"h-4 w-4 fill-current\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n );\n}\n\ntype MenubarLabelProps = ComponentProps<typeof MenubarPrimitive.Label> & {\n inset?: boolean;\n};\n\nexport function MenubarLabel({\n className,\n inset,\n ...props\n}: MenubarLabelProps) {\n return (\n <MenubarPrimitive.Label\n data-slot=\"menubar-label\"\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"ps-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function MenubarSeparator({\n className,\n ...props\n}: ComponentProps<typeof MenubarPrimitive.Separator>) {\n return (\n <MenubarPrimitive.Separator\n data-slot=\"menubar-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport function MenubarShortcut({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"menubar-shortcut\"\n className={cn(\n \"ms-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n","import * as NavigationMenuPrimitive from \"@radix-ui/react-navigation-menu\";\nimport { cva } from \"class-variance-authority\";\nimport { ChevronDown } from \"lucide-react\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\ntype NavigationMenuProps = ComponentProps<\n typeof NavigationMenuPrimitive.Root\n> & {\n viewport?: boolean;\n};\n\nexport function NavigationMenu({\n className,\n children,\n viewport = true,\n ...props\n}: NavigationMenuProps) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n data-viewport={viewport}\n className={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className,\n )}\n {...props}\n >\n {children}\n {viewport && <NavigationMenuViewport />}\n </NavigationMenuPrimitive.Root>\n );\n}\n\nexport function NavigationMenuList({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn(\n \"group flex flex-1 list-none items-center justify-center gap-1\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function NavigationMenuItem({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item\n data-slot=\"navigation-menu-item\"\n className={cn(\"relative\", className)}\n {...props}\n />\n );\n}\n\nexport const navigationMenuTriggerStyle = cva(\n \"group cursor-pointer inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:hover:bg-accent data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent data-[state=open]:bg-accent/50 focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1\",\n);\n\nexport function NavigationMenuTrigger({\n className,\n children,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Trigger>) {\n return (\n <NavigationMenuPrimitive.Trigger\n data-slot=\"navigation-menu-trigger\"\n className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n {...props}\n >\n {children}{\" \"}\n <ChevronDown\n className=\"relative top-[1px] ms-1 size-3 transition duration-300 group-data-[state=open]:rotate-180\"\n aria-hidden=\"true\"\n />\n </NavigationMenuPrimitive.Trigger>\n );\n}\n\nexport function NavigationMenuContent({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Content>) {\n return (\n <NavigationMenuPrimitive.Content\n data-slot=\"navigation-menu-content\"\n className={cn(\n \"data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 top-0 left-0 w-full p-2 pr-2.5 md:absolute md:w-auto\",\n \"group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:duration-200 **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function NavigationMenuLink({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Link>) {\n return (\n <NavigationMenuPrimitive.Link\n data-slot=\"navigation-menu-link\"\n className={cn(\n \"data-[active=true]:focus:bg-accent data-[active=true]:hover:bg-accent data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-ring/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex flex-col gap-1 rounded-sm p-2 text-sm transition-all outline-none focus-visible:ring-[3px] focus-visible:outline-1 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function NavigationMenuViewport({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Viewport>) {\n return (\n <div className={cn(\"absolute start-0 top-full flex justify-center\")}>\n <NavigationMenuPrimitive.Viewport\n data-slot=\"navigation-menu-viewport\"\n className={cn(\n \"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\nexport function NavigationMenuIndicator({\n className,\n ...props\n}: ComponentProps<typeof NavigationMenuPrimitive.Indicator>) {\n return (\n <NavigationMenuPrimitive.Indicator\n data-slot=\"navigation-menu-indicator\"\n className={cn(\n \"top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in\",\n className,\n )}\n {...props}\n >\n <div className=\"relative top-[60%] h-2 w-2 rotate-45 rounded-te-sm bg-border shadow-md\" />\n </NavigationMenuPrimitive.Indicator>\n );\n}\n","\"use client\";\n\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\";\nimport { cva } from \"class-variance-authority\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../../utils\";\n\nexport function Sheet({\n ...props\n}: ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nexport function SheetTrigger({\n className,\n ...props\n}: ComponentProps<typeof SheetPrimitive.Trigger>) {\n return (\n <SheetPrimitive.Trigger\n data-slot=\"sheet-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function SheetClose({\n ...props\n}: ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nexport function SheetPortal({\n ...props\n}: ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nexport function SheetOverlay({\n className,\n ...props\n}: ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport const sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-72 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-72 border-s data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n start:\n \"inset-y-0 start-0 h-full w-72 border-e data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left data-[state=closed]:rtl:slide-out-to-right data-[state=open]:rtl:slide-in-from-right sm:max-w-sm\",\n end: \"inset-y-0 end-0 h-full w-72 border-s data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right data-[state=closed]:rtl:slide-out-to-left data-[state=open]:rtl:slide-in-from-left sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n },\n);\n\ntype SheetContentProps = ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\" | \"start\" | \"end\";\n};\n\nexport function SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: SheetContentProps) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nexport function SheetHeader({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col space-y-1\", className)}\n {...props}\n />\n );\n}\n\nexport function SheetFooter({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function SheetTitle({\n className,\n ...props\n}: ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport function SheetDescription({\n className,\n ...props\n}: ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\";\nimport { Check, ChevronRight, Dot } from \"lucide-react\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function ContextMenu({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />;\n}\n\nexport function ContextMenuTrigger({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return (\n <ContextMenuPrimitive.Trigger data-slot=\"context-menu-trigger\" {...props} />\n );\n}\n\nexport function ContextMenuGroup({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return (\n <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n );\n}\n\nexport function ContextMenuPortal({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return (\n <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n );\n}\n\nexport function ContextMenuSub({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />;\n}\n\nexport function ContextMenuRadioGroup({\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return (\n <ContextMenuPrimitive.RadioGroup\n data-slot=\"context-menu-radio-group\"\n {...props}\n />\n );\n}\n\ntype ContextMenuSubTriggerProps = ComponentProps<\n typeof ContextMenuPrimitive.SubTrigger\n> & {\n inset?: boolean;\n};\n\nexport function ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: ContextMenuSubTriggerProps) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n className={cn(\n \"flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n inset && \"ps-8\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </ContextMenuPrimitive.SubTrigger>\n );\n}\n\nexport function ContextMenuSubContent({\n className,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function ContextMenuContent({\n className,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Content>) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n );\n}\n\ntype ContextMenuItemProps = ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n};\n\nexport function ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: ContextMenuItemProps) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function ContextMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute start-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n );\n}\n\nexport function ContextMenuRadioItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.RadioItem>) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute start-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Dot className=\"h-4 w-4 fill-current\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n );\n}\n\ntype ContextMenuLabelProps = ComponentProps<\n typeof ContextMenuPrimitive.Label\n> & {\n inset?: boolean;\n};\n\nexport function ContextMenuLabel({\n className,\n inset,\n ...props\n}: ContextMenuLabelProps) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold text-foreground\",\n inset && \"ps-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function ContextMenuSeparator({\n className,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n );\n}\n\nexport function ContextMenuShortcut({\n className,\n ...props\n}: ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"ms-auto text-sm tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport { Drawer as DrawerPrimitive } from \"vaul\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport function Drawer({\n shouldScaleBackground = true,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Root>) {\n return (\n <DrawerPrimitive.Root\n data-slot=\"drawer\"\n shouldScaleBackground={shouldScaleBackground}\n {...props}\n />\n );\n}\n\nexport function DrawerTrigger({\n className,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Trigger>) {\n return (\n <DrawerPrimitive.Trigger\n data-slot=\"drawer-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function DrawerPortal({\n children,\n ...props\n}: Omit<ComponentProps<typeof DrawerPrimitive.Portal>, \"children\"> & { children?: React.ReactNode }) {\n const Portal = DrawerPrimitive.Portal as any;\n return <Portal data-slot=\"drawer-portal\" {...props}>{children as any}</Portal>;\n}\n\nexport function DrawerClose({\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Close>) {\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />;\n}\n\nexport function DrawerOverlay({\n className,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn(\"fixed inset-0 z-50 bg-black/80\", className)}\n {...props}\n />\n );\n}\n\nexport function DrawerContent({\n className,\n children,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n <DrawerOverlay />\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n \"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background\",\n className,\n )}\n {...props}\n >\n <div className=\"mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n );\n}\n\nexport function DrawerHeader({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\"grid gap-1.5 p-4 text-center sm:text-start\", className)}\n {...props}\n />\n );\n}\n\nexport function DrawerFooter({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n );\n}\n\nexport function DrawerTitle({\n className,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function DrawerDescription({\n className,\n ...props\n}: ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../../utils\";\n\nexport function Progress({\n className,\n value,\n max,\n ...props\n}: ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-lg bg-primary/20\",\n className,\n )}\n max={max}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{\n transform: `translateX(-${100 - ((value || 0) / (max || 100)) * 100}%)`,\n }}\n />\n </ProgressPrimitive.Root>\n );\n}\n","\"use client\";\n\nimport { Toaster as Sonner } from \"sonner\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { useSettings } from \"../../hooks\";\n\ntype ToasterProps = ComponentProps<typeof Sonner>;\n\nexport function Toaster({ ...props }: ToasterProps) {\n const { settings } = useSettings();\n\n const mode = settings.mode;\n\n return (\n <Sonner\n theme={mode as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton:\n \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton:\n \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n },\n }}\n richColors\n closeButton\n {...props}\n />\n );\n}\n","import { useTenantContext } from \"../providers/tenant-provider\";\n\nexport function useTenant() {\n return useTenantContext();\n}\n","// @goerp/core/hooks\n// Core React hooks for GoERP platform\n// Consolidated from packages/shared/hooks\n\n\"use client\";\n\nimport {\n useState,\n useEffect,\n useCallback,\n useRef,\n useContext,\n createContext,\n useMemo,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n useSearchParams,\n useRouter,\n usePathname,\n useParams,\n} from \"next/navigation\";\nimport { useMedia } from \"react-use\";\nimport { useDirection } from \"@radix-ui/react-direction\";\n\nimport { SettingsContext, defaultSettings } from \"../providers\";\nimport { remToPx } from \"../utils\";\n\nconst defaultSettingsValue = {\n settings: defaultSettings,\n updateSettings: () => {},\n resetSettings: () => {},\n};\n\n// ============================================================================\n// Debounce Hook\n// ============================================================================\n\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n\n// ============================================================================\n// Storage Hooks\n// ============================================================================\n\nexport function useLocalStorage<T>(\n key: string,\n initialValue: T,\n): [T, (value: T | ((prev: T) => T)) => void] {\n const [storedValue, setStoredValue] = useState<T>(initialValue);\n\n useEffect(() => {\n if (typeof window !== \"undefined\") {\n try {\n const item = window.localStorage.getItem(key);\n if (item) {\n setStoredValue(JSON.parse(item));\n }\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n }\n }\n }, [key]);\n\n const setValue = useCallback(\n (value: T | ((prev: T) => T)) => {\n try {\n const valueToStore =\n value instanceof Function ? value(storedValue) : value;\n setStoredValue(valueToStore);\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue];\n}\n\n// ============================================================================\n// State Hooks\n// ============================================================================\n\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T>(undefined);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n}\n\nexport function useToggle(\n initialValue = false,\n): [boolean, () => void, (value: boolean) => void] {\n const [value, setValue] = useState(initialValue);\n const toggle = useCallback(() => setValue((v) => !v), []);\n return [value, toggle, setValue];\n}\n\nexport function useMounted(): boolean {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return mounted;\n}\n\n// ============================================================================\n// Media Hooks\n// ============================================================================\n\nexport function useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState(false);\n\n useEffect(() => {\n if (typeof window !== \"undefined\") {\n const media = window.matchMedia(query);\n setMatches(media.matches);\n\n const listener = (event: MediaQueryListEvent) =>\n setMatches(event.matches);\n media.addEventListener(\"change\", listener);\n return () => media.removeEventListener(\"change\", listener);\n }\n }, [query]);\n\n return matches;\n}\n\nexport function useMobile(): boolean {\n return useMediaQuery(\"(max-width: 768px)\");\n}\n\n// ============================================================================\n// Clipboard Hook\n// ============================================================================\n\nexport function useCopyToClipboard(): [\n string | null,\n (text: string) => Promise<boolean>,\n] {\n const [copiedText, setCopiedText] = useState<string | null>(null);\n\n const copy = useCallback(async (text: string): Promise<boolean> => {\n if (!navigator?.clipboard) {\n console.warn(\"Clipboard not supported\");\n return false;\n }\n\n try {\n await navigator.clipboard.writeText(text);\n setCopiedText(text);\n return true;\n } catch (error) {\n console.warn(\"Copy failed\", error);\n setCopiedText(null);\n return false;\n }\n }, []);\n\n return [copiedText, copy];\n}\n\n// ============================================================================\n// Settings Hooks\n// ============================================================================\n\nexport function useSettings() {\n const context = useContext(SettingsContext);\n if (!context) {\n return defaultSettingsValue;\n }\n return context;\n}\n\nexport function useIsVertical() {\n const { settings } = useSettings();\n return settings.layout === \"vertical\";\n}\n\nexport function useIsDarkMode() {\n const { settings } = useSettings();\n const isDarkModePreferred = useMedia(\"(prefers-color-scheme: dark)\");\n\n let resolvedMode = settings.mode;\n if (resolvedMode === \"system\") {\n resolvedMode = isDarkModePreferred ? \"dark\" : \"light\";\n }\n\n return resolvedMode === \"dark\";\n}\n\nexport function useRadius(asPx = true) {\n const { settings } = useSettings();\n\n let radius = Number(settings.radius);\n if (asPx) {\n radius = remToPx(radius);\n }\n\n return radius;\n}\n\nexport function useDensity() {\n const { settings } = useSettings();\n return settings.density;\n}\n\nexport function useIsRtl() {\n const direction = useDirection();\n return direction === \"rtl\";\n}\n\n// ============================================================================\n// View Mode Hook\n// ============================================================================\n\nexport function useViewMode(\n storageKey: string,\n defaultMode: \"table\" | \"kanban\" | \"grid\" = \"table\",\n) {\n const [viewMode, setViewMode] = useState<\"table\" | \"kanban\" | \"grid\">(\n defaultMode,\n );\n\n useEffect(() => {\n const saved = localStorage.getItem(storageKey);\n if (saved === \"kanban\" || saved === \"table\" || saved === \"grid\") {\n setViewMode(saved as \"table\" | \"kanban\" | \"grid\");\n }\n }, [storageKey]);\n\n const handleViewModeChange = (mode: \"table\" | \"kanban\" | \"grid\") => {\n setViewMode(mode);\n localStorage.setItem(storageKey, mode);\n };\n\n return [viewMode, handleViewModeChange] as const;\n}\n\n// ============================================================================\n// Dictionary Hooks\n// ============================================================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type DictionaryType = any;\n\nconst DictionaryContext = createContext<DictionaryType | null>(null);\n\ninterface DictionaryProviderProps {\n dictionary: DictionaryType;\n children: ReactNode;\n}\n\nexport function DictionaryProvider({\n dictionary,\n children,\n}: DictionaryProviderProps) {\n return (\n <DictionaryContext.Provider value={dictionary}>\n {children}\n </DictionaryContext.Provider>\n );\n}\n\nexport function useDictionary() {\n const dictionary = useContext(DictionaryContext);\n\n if (!dictionary) {\n throw new Error(\"useDictionary must be used within DictionaryProvider\");\n }\n\n return dictionary;\n}\n\nexport function useDictionaryValue(key: string, fallback?: string): string {\n const dictionary = useDictionary();\n\n const keys = key.split(\".\");\n let value: unknown = dictionary;\n\n for (const k of keys) {\n if (value && typeof value === \"object\" && k in value) {\n value = (value as Record<string, unknown>)[k];\n } else {\n return fallback || key;\n }\n }\n\n return typeof value === \"string\" ? value : fallback || key;\n}\n\n// ============================================================================\n// CRUD Translations Hook\n// ============================================================================\n\nexport function useCrudTranslations() {\n const params = useParams();\n const locale = (params.lang as string) || \"en\";\n\n const t = useCallback(\n async (\n key: string,\n _params?: Record<string, string | number>,\n ): Promise<string> => {\n return key;\n },\n [],\n );\n\n const tSync = useCallback(\n (\n translations: DictionaryType,\n key: string,\n params?: Record<string, string | number>,\n ): string => {\n const keys = key.split(\".\");\n let value: unknown = translations;\n\n for (const k of keys) {\n if (value && typeof value === \"object\" && k in value) {\n value = (value as Record<string, unknown>)[k];\n } else {\n return key;\n }\n }\n\n if (typeof value === \"string\") {\n if (params) {\n return value.replace(/\\{\\{(\\w+)\\}\\}/g, (_, param) => {\n return String(params[param] || \"\");\n });\n }\n return value;\n }\n\n return key;\n },\n [],\n );\n\n return {\n t,\n tSync,\n locale,\n };\n}\n\n// ============================================================================\n// Prefetch Hook\n// ============================================================================\n\nexport function usePrefetch() {\n const router = useRouter();\n const prefetchedRoutes = useRef<Set<string>>(new Set());\n const prefetchedAPIs = useRef<Set<string>>(new Set());\n\n const prefetchRoute = useCallback(\n (route: string) => {\n if (prefetchedRoutes.current.has(route)) {\n return;\n }\n\n try {\n router.prefetch(route);\n prefetchedRoutes.current.add(route);\n } catch (error) {\n console.debug(\"Prefetch failed for route:\", route, error);\n }\n },\n [router],\n );\n\n const prefetchAPI = useCallback((endpoint: string, options?: RequestInit) => {\n const url = endpoint;\n const cacheKey = `${url}-${JSON.stringify(options || {})}`;\n\n if (prefetchedAPIs.current.has(cacheKey)) {\n return;\n }\n\n try {\n fetch(url, {\n method: \"HEAD\",\n ...options,\n headers: {\n ...options?.headers,\n \"Cache-Control\": \"max-age=60\",\n },\n })\n .then(() => {\n prefetchedAPIs.current.add(cacheKey);\n })\n .catch(() => {});\n } catch (error) {\n console.debug(\"API prefetch failed:\", url, error);\n }\n }, []);\n\n const prefetchCrudPage = useCallback(\n (entity: string, apiEndpoint: string) => {\n const route = `/crud/${entity}`;\n prefetchRoute(route);\n\n const apiUrl = `${apiEndpoint}?page=1&pageSize=10`;\n prefetchAPI(apiUrl);\n },\n [prefetchRoute, prefetchAPI],\n );\n\n const prefetchNextPage = useCallback(\n (\n apiEndpoint: string,\n currentPage: number,\n pageSize: number,\n queryParams?: Record<string, unknown>,\n ) => {\n const nextPage = currentPage + 1;\n const params = new URLSearchParams({\n page: String(nextPage),\n pageSize: String(pageSize),\n });\n\n if (queryParams) {\n Object.entries(queryParams).forEach(([k, v]) => {\n if (v === undefined || v === null || v === \"\") {\n return;\n }\n\n if (typeof v === \"object\" && !Array.isArray(v)) {\n params.append(k, JSON.stringify(v));\n } else if (Array.isArray(v)) {\n params.append(k, JSON.stringify(v));\n } else {\n params.append(k, String(v));\n }\n });\n }\n\n const apiUrl = `${apiEndpoint}?${params.toString()}`;\n prefetchAPI(apiUrl);\n },\n [prefetchAPI],\n );\n\n return {\n prefetchRoute,\n prefetchAPI,\n prefetchCrudPage,\n prefetchNextPage,\n };\n}\n\n// ============================================================================\n// URL Filters Hook\n// ============================================================================\n\ninterface UseUrlFiltersOptions {\n filters?: {\n search?: string;\n dateRange?: { from?: Date; to?: Date };\n materialGroups?: string[];\n suppliers?: string[];\n statuses?: string[];\n warehouses?: string[];\n };\n}\n\nexport function useUrlFilters(options: UseUrlFiltersOptions = {}) {\n const router = useRouter();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n const currentFilters = useMemo(() => {\n return {\n search: searchParams.get(\"search\") || \"\",\n dateRange: {\n from: searchParams.get(\"from\")\n ? new Date(searchParams.get(\"from\")!)\n : undefined,\n to: searchParams.get(\"to\")\n ? new Date(searchParams.get(\"to\")!)\n : undefined,\n },\n materialGroups:\n searchParams.get(\"materialGroups\")?.split(\",\").filter(Boolean) || [],\n suppliers:\n searchParams.get(\"suppliers\")?.split(\",\").filter(Boolean) || [],\n statuses: searchParams.get(\"statuses\")?.split(\",\").filter(Boolean) || [],\n warehouses:\n searchParams.get(\"warehouses\")?.split(\",\").filter(Boolean) || [],\n };\n }, [searchParams]);\n\n const updateFilters = useCallback(\n (filters: UseUrlFiltersOptions[\"filters\"]) => {\n const params = new URLSearchParams(searchParams.toString());\n\n if (filters?.search) {\n params.set(\"search\", filters.search);\n } else {\n params.delete(\"search\");\n }\n\n if (filters?.dateRange?.from) {\n params.set(\"from\", filters.dateRange.from.toISOString());\n } else {\n params.delete(\"from\");\n }\n\n if (filters?.dateRange?.to) {\n params.set(\"to\", filters.dateRange.to.toISOString());\n } else {\n params.delete(\"to\");\n }\n\n if (filters?.materialGroups && filters.materialGroups.length > 0) {\n params.set(\"materialGroups\", filters.materialGroups.join(\",\"));\n } else {\n params.delete(\"materialGroups\");\n }\n\n if (filters?.suppliers && filters.suppliers.length > 0) {\n params.set(\"suppliers\", filters.suppliers.join(\",\"));\n } else {\n params.delete(\"suppliers\");\n }\n\n if (filters?.statuses && filters.statuses.length > 0) {\n params.set(\"statuses\", filters.statuses.join(\",\"));\n } else {\n params.delete(\"statuses\");\n }\n\n if (filters?.warehouses && filters.warehouses.length > 0) {\n params.set(\"warehouses\", filters.warehouses.join(\",\"));\n } else {\n params.delete(\"warehouses\");\n }\n\n router.push(`${pathname}?${params.toString()}`);\n },\n [router, pathname, searchParams],\n );\n\n const clearFilters = useCallback(() => {\n router.push(pathname);\n }, [router, pathname]);\n\n return {\n currentFilters,\n updateFilters,\n clearFilters,\n };\n}\n\n\n\n// ============================================================================\n// Tab Navigation Back Hook\n// ============================================================================\n\n// Re-export from layout for use in hooks\nexport { useTabNavigation } from \"../ui/layout\";\n\n/**\n * Hook to handle back navigation that integrates with the tab system.\n */\nexport function useTabNavigationBack() {\n // Import dynamically to avoid circular dependency issues at module level\n const { useTabNavigation } = require(\"../ui/layout\");\n const { closeAndGoToParent } = useTabNavigation();\n\n return {\n navigateBack: closeAndGoToParent,\n };\n}\n// ============================================================================\n// Tenant Hooks\n// ============================================================================\n\nexport * from \"./use-tenant\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport { cva } from \"class-variance-authority\";\nimport { PanelLeft } from \"lucide-react\";\n\nimport { useMobile } from \"../../hooks\"; // Exported from core/hooks\nimport { cn } from \"../../utils\";\nimport { Button } from \"./button\";\nimport { Sheet, SheetContent, SheetTitle } from \"../feedback\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\";\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar:state\";\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = \"16rem\";\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"; // slightly wider on mobile? or same.\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\";\n\ntype SidebarContext = {\n state: \"expanded\" | \"collapsed\";\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n // Hover expand\n hoverOpen: boolean;\n setHoverOpen: (open: boolean) => void;\n isHoverExpanded: boolean;\n};\n\nconst SidebarContext = React.createContext<SidebarContext | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n }\n return context;\n}\n\nconst SidebarProvider = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n storageKey?: string;\n }\n>(\n (\n {\n defaultOpen = false,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const isMobile = useMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n // Hover expand state\n const [hoverOpen, setHoverOpen] = React.useState(false);\n\n // Internal state for desktop\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n if (setOpenProp) {\n return setOpenProp(typeof value === \"function\" ? value(open) : value);\n }\n _setOpen(value);\n // Store cookie/localstorage if needed\n // document.cookie = `${SIDEBAR_COOKIE_NAME}=${value}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open],\n );\n\n // Toggle sidebar\n const toggleSidebar = React.useCallback(() => {\n return isMobile\n ? setOpenMobile((open) => !open)\n : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Keyboard shortcut\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [toggleSidebar]);\n\n const state = open ? \"expanded\" : \"collapsed\";\n // Check if sidebar is expanded due to hover (only when collapsed)\n const isHoverExpanded = !open && hoverOpen;\n\n const contextValue = React.useMemo<SidebarContext>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n hoverOpen,\n setHoverOpen,\n isHoverExpanded,\n }),\n [\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n hoverOpen,\n setHoverOpen,\n isHoverExpanded,\n ],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar\",\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n },\n);\nSidebarProvider.displayName = \"SidebarProvider\";\n\nconst Sidebar = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\";\n variant?: \"sidebar\" | \"floating\" | \"inset\";\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\n hoverExpandEnabled?: boolean;\n }\n>(\n (\n {\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n hoverExpandEnabled = true,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const {\n isMobile,\n state,\n openMobile,\n setOpenMobile,\n setHoverOpen,\n isHoverExpanded,\n } = useSidebar();\n\n // Handlers for hover expand\n const handleMouseEnter = React.useCallback(() => {\n if (\n hoverExpandEnabled &&\n state === \"collapsed\" &&\n collapsible === \"icon\"\n ) {\n setHoverOpen(true);\n }\n }, [hoverExpandEnabled, state, collapsible, setHoverOpen]);\n\n const handleMouseLeave = React.useCallback(() => {\n if (hoverExpandEnabled) {\n setHoverOpen(false);\n }\n }, [hoverExpandEnabled, setHoverOpen]);\n\n if (collapsible === \"none\") {\n return (\n <div\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-background p-0 text-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetTitle className=\"sr-only\">Mobile Menu</SheetTitle>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n // Determine effective state for styling\n const effectiveState = isHoverExpanded ? \"hover-expanded\" : state;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"group peer hidden md:block transition-colors duration-200\",\n // Blue bg + white text when collapsed, white bg + dark text when expanded/hover\n state === \"collapsed\" && !isHoverExpanded\n ? \"text-sidebar-foreground\"\n : \"text-foreground\",\n )}\n data-state={state}\n data-hover-expanded={isHoverExpanded}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {/* Sidebar Gap - keeps layout stable, doesn't expand on hover */}\n <div\n className={cn(\n \"duration-200 relative h-svh w-(--sidebar-width) bg-transparent transition-[width] ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n )}\n />\n {/* Sidebar Content - expands on hover */}\n <div\n className={cn(\n \"duration-200 fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n // Adjustments for collapsible=icon\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_8px)] group-data-[collapsible=icon]:px-2.5\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[collapsible=icon]:border-r group-data-[collapsible=icon]:px-0\",\n // Hover expand - override icon width to full width on hover\n \"group-data-[hover-expanded=true]:!w-(--sidebar-width) group-data-[hover-expanded=true]:shadow-xl group-data-[hover-expanded=true]:z-[100]\",\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n className={cn(\n \"flex h-full w-full flex-col border-r transition-colors duration-200\",\n // Blue background when collapsed, white when expanded/hover\n \"group-data-[state=collapsed]:bg-sidebar group-data-[state=collapsed]:border-sidebar-border\",\n \"group-data-[state=expanded]:bg-background group-data-[state=expanded]:border-border\",\n \"group-data-[hover-expanded=true]:!bg-background group-data-[hover-expanded=true]:!border-border\",\n \"group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow\",\n )}\n >\n {children}\n </div>\n </div>\n </div>\n );\n },\n);\nSidebar.displayName = \"Sidebar\";\n\nconst SidebarTrigger = React.forwardRef<\n React.ElementRef<typeof Button>,\n React.ComponentProps<typeof Button>\n>(({ className, onClick, ...props }, ref) => {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n ref={ref}\n data-sidebar=\"trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"h-7 w-7\", className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeft />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n});\nSidebarTrigger.displayName = \"SidebarTrigger\";\n\nconst SidebarRail = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\">\n>(({ className, ...props }, ref) => {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n ref={ref}\n data-sidebar=\"rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex\",\n \"[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarRail.displayName = \"SidebarRail\";\n\nconst SidebarInset = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"main\">\n>(({ className, ...props }, ref) => {\n return (\n <main\n ref={ref}\n className={cn(\n \"relative flex min-h-svh flex-1 flex-col bg-muted/40 transition-[margin] duration-200 ease-linear\",\n \"peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarInset.displayName = \"SidebarInset\";\n\nconst SidebarInput = React.forwardRef<\n React.ElementRef<\"input\">,\n React.ComponentProps<\"input\">\n>(({ className, ...props }, ref) => {\n return (\n <input\n ref={ref}\n data-sidebar=\"input\"\n className={cn(\n \"flex h-8 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sidebar-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarInput.displayName = \"SidebarInput\";\n\nconst SidebarHeader = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n});\nSidebarHeader.displayName = \"SidebarHeader\";\n\nconst SidebarFooter = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n});\nSidebarFooter.displayName = \"SidebarFooter\";\n\nconst SidebarSeparator = React.forwardRef<\n React.ElementRef<\"div\">,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"separator\"\n className={cn(\"mx-2 h-[1px] w-auto bg-sidebar-border\", className)}\n {...props}\n />\n );\n});\nSidebarSeparator.displayName = \"SidebarSeparator\";\n\nconst SidebarContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto\",\n // Hide overflow when collapsed, but show when hover-expanded\n \"group-data-[collapsible=icon]:overflow-hidden group-data-[hover-expanded=true]:!overflow-auto\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarContent.displayName = \"SidebarContent\";\n\nconst SidebarGroup = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n );\n});\nSidebarGroup.displayName = \"SidebarGroup\";\n\nconst SidebarGroupLabel = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-label\"\n className={cn(\n \"duration-200 flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-bold text-primary uppercase tracking-wider outline-none ring-sidebar-ring transition-[margin,opa] ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Hide when collapsed, show when hover-expanded\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n \"group-data-[hover-expanded=true]:!mt-0 group-data-[hover-expanded=true]:!opacity-100\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarGroupLabel.displayName = \"SidebarGroupLabel\";\n\nconst SidebarGroupAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 after:md:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarGroupAction.displayName = \"SidebarGroupAction\";\n\nconst SidebarGroupContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n );\n});\nSidebarGroupContent.displayName = \"SidebarGroupContent\";\n\nconst SidebarMenu = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => {\n return (\n <ul\n ref={ref}\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n );\n});\nSidebarMenu.displayName = \"SidebarMenu\";\n\nconst SidebarMenuItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => {\n return (\n <li\n ref={ref}\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n );\n});\nSidebarMenuItem.displayName = \"SidebarMenuItem\";\n\nconst sidebarMenuButtonVariants = cva(\n // Base styles + hover-expand overrides\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 group-data-[hover-expanded=true]:!size-auto group-data-[hover-expanded=true]:!w-full group-data-[hover-expanded=true]:!p-2\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:!p-0\",\n },\n isActive: {\n true: \"bg-primary/10 text-primary font-bold\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nconst SidebarMenuButton = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n } & VariantProps<typeof sidebarMenuButtonVariants>\n>(\n (\n {\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : \"button\";\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n ref={ref}\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n sidebarMenuButtonVariants({ variant, size, isActive }),\n className,\n )}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n },\n);\nSidebarMenuButton.displayName = \"SidebarMenuButton\";\n\nconst SidebarMenuAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & { asChild?: boolean; showOnHover?: boolean }\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 after:md:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarMenuAction.displayName = \"SidebarMenuAction\";\n\nconst SidebarMenuBadge = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarMenuBadge.displayName = \"SidebarMenuBadge\";\n\nconst SidebarMenuSkeleton = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n showIcon?: boolean;\n }\n>(({ className, showIcon = false, ...props }, ref) => {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <div\n className=\"size-4 rounded-md animate-pulse bg-muted\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <div\n className=\"h-4 flex-1 max-w-[--skeleton-width] animate-pulse bg-muted rounded-full\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n});\nSidebarMenuSkeleton.displayName = \"SidebarMenuSkeleton\";\n\nconst SidebarMenuSub = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => {\n return (\n <ul\n ref={ref}\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\n // Hide when collapsed, show when hover-expanded\n \"group-data-[collapsible=icon]:hidden group-data-[hover-expanded=true]:!flex\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarMenuSub.displayName = \"SidebarMenuSub\";\n\nconst SidebarMenuSubItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ ...props }, ref) => <li ref={ref} {...props} />);\nSidebarMenuSubItem.displayName = \"SidebarMenuSubItem\";\n\nconst SidebarMenuSubButton = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n size?: \"sm\" | \"md\";\n isActive?: boolean;\n }\n>(({ asChild = false, size = \"md\", isActive, className, ...props }, ref) => {\n const Comp = asChild ? Slot : \"a\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 text-xs\",\n \"data-[active=true]:bg-primary/15 data-[active=true]:!text-primary data-[active=true]:font-bold\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarMenuSubButton.displayName = \"SidebarMenuSubButton\";\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n","// @goerp/core/ui/primitives\n// Primitive UI components (Server Compatible)\n\nimport * as React from \"react\";\nimport { cn } from \"../../utils\";\nimport { Button } from \"./button\";\nimport type { ButtonProps } from \"./button\";\n\nexport * from \"./badge\";\nexport * from \"./button\";\nexport * from \"./input\";\nexport * from \"./checkbox\";\n\n// ============================================================================\n// Textarea\n// ============================================================================\n\nexport interface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nTextarea.displayName = \"Textarea\";\n\nexport * from \"./card\";\nexport * from \"./separator\";\n\n// ============================================================================\n// Spinner / Loading\n// ============================================================================\n\nexport interface SpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\nexport function Spinner({ size = \"md\", className }: SpinnerProps) {\n const sizeClasses = {\n sm: \"h-4 w-4\",\n md: \"h-6 w-6\",\n lg: \"h-8 w-8\",\n };\n\n return (\n <div\n className={cn(\n \"animate-spin rounded-full border-2 border-current border-t-transparent\",\n sizeClasses[size],\n className,\n )}\n />\n );\n}\n\nexport interface ButtonLoadingProps extends ButtonProps {\n isLoading?: boolean;\n}\n\nexport const ButtonLoading = React.forwardRef<\n HTMLButtonElement,\n ButtonLoadingProps\n>(({ className, isLoading, children, disabled, ...props }, ref) => {\n return (\n <Button\n className={cn(\"gap-2\", className)}\n disabled={isLoading || disabled}\n ref={ref}\n {...props}\n >\n {isLoading && <Spinner size=\"sm\" />}\n {children}\n </Button>\n );\n});\nButtonLoading.displayName = \"ButtonLoading\";\n\n// ============================================================================\n// Skeleton\n// ============================================================================\n\nexport function Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\n// Data Display\nexport * from \"./card\"; // Added\nexport * from \"./table\";\nexport * from \"./dropdown-menu\";\n\n// Feedback\nexport * from \"./dialog\";\n\n// Layout\nexport * from \"./tabs\";\n\nexport * from \"./breadcrumb\";\nexport * from \"./keyboard\";\nexport * from \"./pagination\";\nexport * from \"./status-badge\";\nexport * from \"./sidebar\";\nexport * from \"./popover\";\nexport * from \"./scroll-area\";\nexport * from \"./calendar\";\nexport * from \"./resizable\";\nexport * from \"./slider\";\nexport * from \"./switch\";\nexport * from \"./tooltip\";\nexport * from \"./select\";\nexport * from \"./menubar\";\nexport * from \"./navigation-menu\";\nexport * from \"./toggle\";\nexport * from \"./toggle-group\";\nexport * from \"./combobox\";\nexport * from \"./label\";\n","import { cva } from \"class-variance-authority\";\n\nimport type { VariantProps } from \"class-variance-authority\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\n\nexport const alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7\",\n {\n variants: {\n variant: {\n default: \"bg-background text-foreground\",\n destructive:\n \"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport function Alert({\n className,\n variant,\n ...props\n}: ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nexport function AlertTitle({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <h5\n data-slot=\"alert-title\"\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n );\n}\n\nexport function AlertDescription({\n className,\n ...props\n}: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n Button,\n ScrollArea,\n} from \"../primitives\";\nimport { AlertTriangle, Check, ChevronDown, ChevronRight, ClipboardCopy, Copy } from \"lucide-react\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ErrorDialogData {\n title?: string;\n description?: ReactNode;\n trace?: string;\n code?: string;\n}\n\ninterface ErrorDialogContextType {\n showError: (data: ErrorDialogData | string | Error) => void;\n dismiss: () => void;\n}\n\n// ============================================================================\n// Event Emitter for Global Access\n// ============================================================================\n\ntype ErrorEventListener = (data: ErrorDialogData) => void;\n\nclass GlobalErrorEmitter {\n private listeners: ErrorEventListener[] = [];\n\n subscribe(listener: ErrorEventListener) {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter((l) => l !== listener);\n };\n }\n\n emit(data: ErrorDialogData) {\n this.listeners.forEach((listener) => listener(data));\n }\n}\n\nexport const globalError = new GlobalErrorEmitter();\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst ErrorDialogContext = createContext<ErrorDialogContextType | null>(null);\n\nexport function useErrorDialog() {\n const context = useContext(ErrorDialogContext);\n if (!context) {\n throw new Error(\"useErrorDialog must be used within ErrorDialogProvider\");\n }\n return context;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function ErrorDialogProvider({ children }: { children: ReactNode }) {\n const [open, setOpen] = useState(false);\n const [data, setData] = useState<ErrorDialogData>({});\n const [expanded, setExpanded] = useState(false);\n const [copied, setCopied] = useState(false);\n\n // Subscribe to global events\n useEffect(() => {\n const unsubscribe = globalError.subscribe((errorData) => {\n setData(errorData);\n setOpen(true);\n setExpanded(false);\n setCopied(false);\n });\n return unsubscribe;\n }, []);\n\n const showError = useCallback((input: ErrorDialogData | string | Error) => {\n let errorData: ErrorDialogData = {};\n\n if (input instanceof Error) {\n errorData = {\n title: input.name || \"Error\",\n description: input.message,\n trace: input.stack,\n };\n } else if (typeof input === \"string\") {\n errorData = {\n title: \"Error\",\n description: input,\n };\n } else {\n errorData = input;\n }\n\n setData(errorData);\n setOpen(true);\n setExpanded(false);\n setCopied(false);\n }, []);\n\n const dismiss = useCallback(() => {\n setOpen(false);\n }, []);\n\n /** Build full diagnostic text for copy */\n const buildFullDiagnostic = useCallback(() => {\n // If trace already contains formatted diagnostic, use it directly\n if (data.trace && data.trace.startsWith(\"=== Thông tin lỗi\")) {\n return data.trace;\n }\n\n // Otherwise build from available fields\n const parts: string[] = [\n `=== Thông tin lỗi ===`,\n ];\n\n if (data.code) parts.push(`Mã lỗi: ${data.code}`);\n\n parts.push(`Thời gian: ${new Date().toLocaleString(\"vi-VN\", {\n timeZone: \"Asia/Ho_Chi_Minh\",\n day: \"2-digit\", month: \"2-digit\", year: \"numeric\",\n hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\",\n })}`);\n\n if (data.title) parts.push(`Lỗi: ${data.title}`);\n\n if (data.description && typeof data.description === \"string\") {\n parts.push(`Mô tả: ${data.description}`);\n }\n\n if (data.trace) {\n parts.push(`\\nChi tiết:\\n${data.trace}`);\n }\n\n return parts.join(\"\\n\");\n }, [data]);\n\n const copyAll = useCallback(async () => {\n const text = buildFullDiagnostic();\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback for older browsers\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [buildFullDiagnostic]);\n\n const copyTrace = () => {\n if (data.trace) {\n navigator.clipboard.writeText(data.trace);\n }\n };\n\n return (\n <ErrorDialogContext.Provider value={{ showError, dismiss }}>\n {children}\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"max-w-md md:max-w-xl sm:max-w-lg border-destructive/20\">\n <DialogHeader>\n <div className=\"flex items-center gap-2 text-destructive\">\n <div className=\"p-2 bg-destructive/10 rounded-full\">\n <AlertTriangle className=\"h-6 w-6\" />\n </div>\n <DialogTitle className=\"text-xl\">\n {data.title || \"Đã xảy ra lỗi\"}\n </DialogTitle>\n </div>\n <DialogDescription className=\"text-base pt-2 text-foreground font-medium\">\n {data.description}\n </DialogDescription>\n {data.code && (\n <p className=\"text-xs text-muted-foreground font-mono mt-1\">\n Mã lỗi: {data.code}\n </p>\n )}\n </DialogHeader>\n\n {data.trace && (\n <div className=\"mt-2 border rounded-md bg-muted/30 overflow-hidden\">\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"w-full flex items-center justify-between p-2 text-sm font-medium hover:bg-muted/50 transition-colors\"\n >\n <div className=\"flex items-center gap-1\">\n {expanded ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : (\n <ChevronRight className=\"h-4 w-4\" />\n )}\n <span>Chi tiết lỗi & Trace Log</span>\n </div>\n </button>\n\n {expanded && (\n <div className=\"relative border-t bg-muted/50\">\n <ScrollArea className=\"h-[200px] w-full p-4\">\n <pre className=\"text-xs font-mono whitespace-pre-wrap break-all text-muted-foreground\">\n {data.trace}\n </pre>\n </ScrollArea>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute top-2 right-2 h-6 w-6\"\n onClick={copyTrace}\n title=\"Copy Trace Log\"\n >\n <Copy className=\"h-3 w-3\" />\n </Button>\n </div>\n )}\n </div>\n )}\n\n <DialogFooter className=\"flex-row gap-2 sm:justify-between\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={copyAll}\n className=\"gap-1.5 text-xs\"\n >\n {copied ? (\n <>\n <Check className=\"h-3.5 w-3.5 text-green-600\" />\n Đã sao chép\n </>\n ) : (\n <>\n <ClipboardCopy className=\"h-3.5 w-3.5\" />\n Sao chép thông tin lỗi\n </>\n )}\n </Button>\n <Button variant=\"outline\" onClick={dismiss}>\n Đóng\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </ErrorDialogContext.Provider>\n );\n}\n","// @goerp/core/ui/feedback\n// Feedback components (Toast, Dialog, Loading, etc.)\n\n// ============================================================================\n// Dialog (Re-exported from primitives)\n// ============================================================================\n\nexport {\n Dialog,\n DialogTrigger,\n DialogPortal,\n DialogClose,\n DialogOverlay,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n} from \"../primitives\";\n\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils\";\nimport { buttonVariants } from \"../primitives\";\n\nexport * from \"./progress\";\nexport * from \"./sheet\";\nexport * from \"./alert\";\nexport * from \"./context-menu\";\nexport * from \"./drawer\";\nexport * from \"./sonner\";\n\nexport * from \"./error-dialog\";\n\nexport function AlertDialog({\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />;\n}\n\nexport function AlertDialogTrigger({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger\n data-slot=\"alert-dialog-trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n}\n\nexport function AlertDialogPortal({\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n );\n}\n\nexport function AlertDialogOverlay({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function AlertDialogContent({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Content>) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n \"fixed top-[50%] left-[50%] z-50 w-full max-w-[calc(100%-2rem)] grid bg-background translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:max-w-lg\",\n className,\n )}\n {...props}\n />\n </AlertDialogPortal>\n );\n}\n\nexport function AlertDialogHeader({\n className,\n ...props\n}: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function AlertDialogFooter({\n className,\n ...props\n}: ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function AlertDialogTitle({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n );\n}\n\nexport function AlertDialogDescription({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport function AlertDialogAction({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Action>) {\n return (\n <AlertDialogPrimitive.Action\n className={cn(buttonVariants(), className)}\n {...props}\n />\n );\n}\n\nexport function AlertDialogCancel({\n className,\n ...props\n}: ComponentProps<typeof AlertDialogPrimitive.Cancel>) {\n return (\n <AlertDialogPrimitive.Cancel\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className,\n )}\n {...props}\n />\n );\n}\n"]}