@etus/ui 0.4.0-beta.7 → 0.4.0-beta.8

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 (221) hide show
  1. package/dist/{chunk-2Y7PQ6ZL.js → chunk-237TQKWH.js} +4 -4
  2. package/dist/{chunk-2Y7PQ6ZL.js.map → chunk-237TQKWH.js.map} +1 -1
  3. package/dist/{chunk-KR3IVNQH.js → chunk-2FJJOHHH.js} +16 -10
  4. package/dist/chunk-2FJJOHHH.js.map +1 -0
  5. package/dist/{chunk-W4NC5CU5.js → chunk-2Q4I4VDB.js} +4 -4
  6. package/dist/{chunk-W4NC5CU5.js.map → chunk-2Q4I4VDB.js.map} +1 -1
  7. package/dist/chunk-2Z722V5K.js +231 -0
  8. package/dist/chunk-2Z722V5K.js.map +1 -0
  9. package/dist/chunk-37IIHQP4.js +233 -0
  10. package/dist/chunk-37IIHQP4.js.map +1 -0
  11. package/dist/{chunk-UFRMZ3M6.js → chunk-3JCV72FO.js} +6 -2
  12. package/dist/chunk-3JCV72FO.js.map +1 -0
  13. package/dist/{chunk-FCT6FEEZ.js → chunk-43BS3PPX.js} +5 -5
  14. package/dist/{chunk-FCT6FEEZ.js.map → chunk-43BS3PPX.js.map} +1 -1
  15. package/dist/{chunk-2UGDLAYC.js → chunk-45D4O7RK.js} +10 -3
  16. package/dist/chunk-45D4O7RK.js.map +1 -0
  17. package/dist/{chunk-OTSK2KAI.js → chunk-4EYYCHLD.js} +5 -5
  18. package/dist/{chunk-OTSK2KAI.js.map → chunk-4EYYCHLD.js.map} +1 -1
  19. package/dist/{chunk-J62TFQHR.js → chunk-5I7AXWJU.js} +13 -13
  20. package/dist/chunk-5I7AXWJU.js.map +1 -0
  21. package/dist/{chunk-65YSTUD2.js → chunk-5SUD32RK.js} +44 -14
  22. package/dist/chunk-5SUD32RK.js.map +1 -0
  23. package/dist/{chunk-23BHD62H.js → chunk-5TZDEGZN.js} +4 -4
  24. package/dist/chunk-5TZDEGZN.js.map +1 -0
  25. package/dist/{chunk-VPNFYQBL.js → chunk-6DN2UAIR.js} +3 -3
  26. package/dist/chunk-6DN2UAIR.js.map +1 -0
  27. package/dist/{chunk-EGYWK2XX.js → chunk-7CTFBOD4.js} +3 -3
  28. package/dist/{chunk-EGYWK2XX.js.map → chunk-7CTFBOD4.js.map} +1 -1
  29. package/dist/{chunk-36XTKR3B.js → chunk-BMNCNBPA.js} +3 -3
  30. package/dist/{chunk-36XTKR3B.js.map → chunk-BMNCNBPA.js.map} +1 -1
  31. package/dist/{chunk-AWYOWR5N.js → chunk-C5HSYDJC.js} +3 -3
  32. package/dist/{chunk-AWYOWR5N.js.map → chunk-C5HSYDJC.js.map} +1 -1
  33. package/dist/{chunk-VFALJSXB.js → chunk-DCUFQJYP.js} +3 -3
  34. package/dist/chunk-DCUFQJYP.js.map +1 -0
  35. package/dist/{chunk-LATTRPLQ.js → chunk-E2TI5V67.js} +3 -3
  36. package/dist/{chunk-LATTRPLQ.js.map → chunk-E2TI5V67.js.map} +1 -1
  37. package/dist/{chunk-IRKDMISK.js → chunk-G2MAGZHQ.js} +4 -3
  38. package/dist/chunk-G2MAGZHQ.js.map +1 -0
  39. package/dist/{chunk-ONQCNOLU.js → chunk-HDOR3SN3.js} +3 -3
  40. package/dist/{chunk-ONQCNOLU.js.map → chunk-HDOR3SN3.js.map} +1 -1
  41. package/dist/{chunk-PLLJNHWU.js → chunk-HI3T55XK.js} +3 -33
  42. package/dist/chunk-HI3T55XK.js.map +1 -0
  43. package/dist/chunk-HJ4E6YPW.js +236 -0
  44. package/dist/chunk-HJ4E6YPW.js.map +1 -0
  45. package/dist/{chunk-LS3WD6IZ.js → chunk-I55QJ4CU.js} +4 -4
  46. package/dist/{chunk-LS3WD6IZ.js.map → chunk-I55QJ4CU.js.map} +1 -1
  47. package/dist/{chunk-HKXQLWGR.js → chunk-IOWHM7ZY.js} +13 -11
  48. package/dist/chunk-IOWHM7ZY.js.map +1 -0
  49. package/dist/{chunk-ILAV2AZ4.js → chunk-IZC5YFGO.js} +3 -3
  50. package/dist/{chunk-ILAV2AZ4.js.map → chunk-IZC5YFGO.js.map} +1 -1
  51. package/dist/{chunk-Y7UFBSAD.js → chunk-KHOCAVQO.js} +3 -3
  52. package/dist/{chunk-Y7UFBSAD.js.map → chunk-KHOCAVQO.js.map} +1 -1
  53. package/dist/{chunk-IBVCSZCH.js → chunk-KVJOKWP4.js} +5 -4
  54. package/dist/chunk-KVJOKWP4.js.map +1 -0
  55. package/dist/{chunk-KC6CHPT3.js → chunk-KZRTQF64.js} +3 -3
  56. package/dist/{chunk-KC6CHPT3.js.map → chunk-KZRTQF64.js.map} +1 -1
  57. package/dist/{chunk-QIETN4UU.js → chunk-LEAK22ZP.js} +3 -3
  58. package/dist/{chunk-QIETN4UU.js.map → chunk-LEAK22ZP.js.map} +1 -1
  59. package/dist/{chunk-OWOVCGUZ.js → chunk-M2C7HBR5.js} +3 -3
  60. package/dist/{chunk-OWOVCGUZ.js.map → chunk-M2C7HBR5.js.map} +1 -1
  61. package/dist/{chunk-33JGPMUW.js → chunk-M7TPROVH.js} +20 -7
  62. package/dist/chunk-M7TPROVH.js.map +1 -0
  63. package/dist/{chunk-AVR3LVOQ.js → chunk-MQMRVBUL.js} +4 -4
  64. package/dist/{chunk-AVR3LVOQ.js.map → chunk-MQMRVBUL.js.map} +1 -1
  65. package/dist/{chunk-KPNNSUXM.js → chunk-O7AUE5GP.js} +5 -3
  66. package/dist/chunk-O7AUE5GP.js.map +1 -0
  67. package/dist/{chunk-6HEURMY3.js → chunk-OCXGG7UP.js} +5 -5
  68. package/dist/{chunk-6HEURMY3.js.map → chunk-OCXGG7UP.js.map} +1 -1
  69. package/dist/{chunk-V7XHE25E.js → chunk-ON7WFRYH.js} +3 -3
  70. package/dist/{chunk-V7XHE25E.js.map → chunk-ON7WFRYH.js.map} +1 -1
  71. package/dist/{chunk-FSMHI7DW.js → chunk-OXDWUKGP.js} +3 -3
  72. package/dist/chunk-OXDWUKGP.js.map +1 -0
  73. package/dist/{chunk-SJSYKUCL.js → chunk-Q335YODG.js} +3 -3
  74. package/dist/{chunk-SJSYKUCL.js.map → chunk-Q335YODG.js.map} +1 -1
  75. package/dist/{chunk-6ELVWWIA.js → chunk-QZWKXUZP.js} +3 -3
  76. package/dist/{chunk-6ELVWWIA.js.map → chunk-QZWKXUZP.js.map} +1 -1
  77. package/dist/{chunk-DDM2I5C6.js → chunk-R5OIL4I4.js} +3 -3
  78. package/dist/{chunk-DDM2I5C6.js.map → chunk-R5OIL4I4.js.map} +1 -1
  79. package/dist/{chunk-FYJHWYPM.js → chunk-S524YVMO.js} +3 -3
  80. package/dist/{chunk-FYJHWYPM.js.map → chunk-S524YVMO.js.map} +1 -1
  81. package/dist/{chunk-OWIFNJXZ.js → chunk-S7TVRVRU.js} +3 -3
  82. package/dist/chunk-S7TVRVRU.js.map +1 -0
  83. package/dist/{chunk-TNROOKX3.js → chunk-UDY3IDCY.js} +10 -2
  84. package/dist/chunk-UDY3IDCY.js.map +1 -0
  85. package/dist/{chunk-3WOGOTOV.js → chunk-UPYT2XM5.js} +7 -7
  86. package/dist/chunk-UPYT2XM5.js.map +1 -0
  87. package/dist/{chunk-YWA63YN3.js → chunk-VAVE4ZJF.js} +2 -2
  88. package/dist/chunk-VAVE4ZJF.js.map +1 -0
  89. package/dist/chunk-WKWLKGNI.js +643 -0
  90. package/dist/chunk-WKWLKGNI.js.map +1 -0
  91. package/dist/{chunk-Z3FL7LEK.js → chunk-X253YD45.js} +71 -6
  92. package/dist/chunk-X253YD45.js.map +1 -0
  93. package/dist/{chunk-6XY7QYVR.js → chunk-X3AXEE3S.js} +3 -3
  94. package/dist/{chunk-6XY7QYVR.js.map → chunk-X3AXEE3S.js.map} +1 -1
  95. package/dist/{chunk-R4UOT76L.js → chunk-XAIUZJOJ.js} +8 -8
  96. package/dist/chunk-XAIUZJOJ.js.map +1 -0
  97. package/dist/{chunk-ZO2EKJZM.js → chunk-XCZMJA2D.js} +7 -7
  98. package/dist/{chunk-ZO2EKJZM.js.map → chunk-XCZMJA2D.js.map} +1 -1
  99. package/dist/{chunk-XRMKL43Y.js → chunk-XOLV7G4S.js} +3 -3
  100. package/dist/{chunk-XRMKL43Y.js.map → chunk-XOLV7G4S.js.map} +1 -1
  101. package/dist/chunk-XYYOV5GW.js +186 -0
  102. package/dist/chunk-XYYOV5GW.js.map +1 -0
  103. package/dist/{chunk-4MQNDQ4O.js → chunk-YACIRNVP.js} +12 -4
  104. package/dist/chunk-YACIRNVP.js.map +1 -0
  105. package/dist/{chunk-JKYB5QAP.js → chunk-YDZBLZVZ.js} +3 -3
  106. package/dist/{chunk-JKYB5QAP.js.map → chunk-YDZBLZVZ.js.map} +1 -1
  107. package/dist/{chunk-5XQIH6WM.js → chunk-YM5YBDRM.js} +4 -4
  108. package/dist/{chunk-5XQIH6WM.js.map → chunk-YM5YBDRM.js.map} +1 -1
  109. package/dist/{chunk-AUCDXPWH.js → chunk-YQX7XZES.js} +4 -4
  110. package/dist/{chunk-AUCDXPWH.js.map → chunk-YQX7XZES.js.map} +1 -1
  111. package/dist/{chunk-Y3BOERVB.js → chunk-ZEFK3AXP.js} +3 -3
  112. package/dist/{chunk-Y3BOERVB.js.map → chunk-ZEFK3AXP.js.map} +1 -1
  113. package/dist/{chunk-L3Z5FAJE.js → chunk-ZEYLSDSG.js} +3 -3
  114. package/dist/{chunk-L3Z5FAJE.js.map → chunk-ZEYLSDSG.js.map} +1 -1
  115. package/dist/components/advanced/Calendar/index.js +4 -4
  116. package/dist/components/advanced/Command/index.js +1 -1
  117. package/dist/components/advanced/EventCalendar/index.js +4 -4
  118. package/dist/components/advanced/FileDropzone/index.js +1 -1
  119. package/dist/components/advanced/FilterBuilder/index.js +4 -4
  120. package/dist/components/advanced/MarkdownEditor/index.js +2 -2
  121. package/dist/components/advanced/RichTextEditor/index.js +2 -2
  122. package/dist/components/advanced/index.js +16 -16
  123. package/dist/components/data-display/AreaChart/index.js +1 -1
  124. package/dist/components/data-display/BarChart/index.js +1 -1
  125. package/dist/components/data-display/Carousel/index.js +4 -4
  126. package/dist/components/data-display/ChartCard/index.js +2 -2
  127. package/dist/components/data-display/DashboardFilterbar/index.js +5 -5
  128. package/dist/components/data-display/DataTable/FilterBuilder/index.js +4 -4
  129. package/dist/components/data-display/DataTable/index.js +7 -7
  130. package/dist/components/data-display/ImageGallery/index.js +7 -7
  131. package/dist/components/data-display/KPICard/index.js +4 -4
  132. package/dist/components/data-display/Lightbox/index.js +1 -1
  133. package/dist/components/data-display/LineChart/index.js +1 -1
  134. package/dist/components/data-display/List/index.js +2 -2
  135. package/dist/components/data-display/Table/index.js +1 -1
  136. package/dist/components/data-display/VirtualTable/index.js +2 -2
  137. package/dist/components/data-display/index.js +35 -35
  138. package/dist/components/feedback/Alert/index.js +1 -1
  139. package/dist/components/feedback/AlertDialog/index.js +4 -4
  140. package/dist/components/feedback/ConfirmModal/index.js +5 -5
  141. package/dist/components/feedback/Modal/index.js +1 -1
  142. package/dist/components/feedback/index.js +9 -9
  143. package/dist/components/forms/ColorPicker/index.js +1 -1
  144. package/dist/components/forms/DatePicker/index.js +5 -5
  145. package/dist/components/forms/DateRangePicker/index.js +5 -5
  146. package/dist/components/forms/IftaLabel/index.js +1 -1
  147. package/dist/components/forms/InputGroup/index.js +4 -4
  148. package/dist/components/forms/InputOTPField/index.js +2 -2
  149. package/dist/components/forms/MultiSelect/index.js +2 -1
  150. package/dist/components/forms/RadioButton/index.js +1 -1
  151. package/dist/components/forms/Rating/index.js +1 -1
  152. package/dist/components/forms/TagsInput/index.js +2 -2
  153. package/dist/components/forms/ToggleGroup/index.js +1 -1
  154. package/dist/components/forms/index.js +28 -28
  155. package/dist/components/index.js +138 -138
  156. package/dist/components/layout/index.js +3 -3
  157. package/dist/components/navigation/AccountSwitch/index.js +3 -3
  158. package/dist/components/navigation/Drawer/index.js +1 -1
  159. package/dist/components/navigation/DropdownMenu/index.js +1 -1
  160. package/dist/components/navigation/Header/index.js +1 -1
  161. package/dist/components/navigation/MobileSidebar/index.js +4 -4
  162. package/dist/components/navigation/Pagination/index.js +4 -4
  163. package/dist/components/navigation/Sidebar/index.js +5 -5
  164. package/dist/components/navigation/UserProfileDropdown/index.js +1 -1
  165. package/dist/components/navigation/WorkspaceDropdown/index.js +1 -1
  166. package/dist/components/navigation/index.js +15 -15
  167. package/dist/components/primitives/AspectRatio/index.js +1 -1
  168. package/dist/components/primitives/Badge/index.js +1 -1
  169. package/dist/components/primitives/Button/index.js +3 -3
  170. package/dist/components/primitives/ConfirmButton/index.js +5 -5
  171. package/dist/components/primitives/ProgressBar/index.js +1 -1
  172. package/dist/components/primitives/SplitButton/index.js +2 -2
  173. package/dist/components/primitives/StatusIndicator/index.js +1 -1
  174. package/dist/components/primitives/Tag/index.js +1 -1
  175. package/dist/components/primitives/Toggle/index.js +1 -1
  176. package/dist/components/primitives/index.js +18 -18
  177. package/dist/components/workflow/ApprovalFlow/index.js +4 -4
  178. package/dist/components/workflow/CommentSystem/index.js +4 -4
  179. package/dist/components/workflow/Dashboard/index.js +4 -4
  180. package/dist/components/workflow/DashboardBuilder/index.js +4 -4
  181. package/dist/components/workflow/KanbanBoard/index.js +4 -4
  182. package/dist/components/workflow/ReportGenerator/index.js +4 -4
  183. package/dist/components/workflow/TaskStatus/index.js +2 -2
  184. package/dist/components/workflow/Wizard/index.js +4 -4
  185. package/dist/components/workflow/index.js +15 -15
  186. package/dist/index.d.ts +156 -50
  187. package/dist/index.js +140 -140
  188. package/dist/styles.css +23 -0
  189. package/package.json +2 -2
  190. package/dist/chunk-23BHD62H.js.map +0 -1
  191. package/dist/chunk-2UGDLAYC.js.map +0 -1
  192. package/dist/chunk-33JGPMUW.js.map +0 -1
  193. package/dist/chunk-3WOGOTOV.js.map +0 -1
  194. package/dist/chunk-4MQNDQ4O.js.map +0 -1
  195. package/dist/chunk-65YSTUD2.js.map +0 -1
  196. package/dist/chunk-FSMHI7DW.js.map +0 -1
  197. package/dist/chunk-GAP3OZR7.js +0 -223
  198. package/dist/chunk-GAP3OZR7.js.map +0 -1
  199. package/dist/chunk-HKXQLWGR.js.map +0 -1
  200. package/dist/chunk-IBVCSZCH.js.map +0 -1
  201. package/dist/chunk-ICAQYWCX.js +0 -153
  202. package/dist/chunk-ICAQYWCX.js.map +0 -1
  203. package/dist/chunk-IRKDMISK.js.map +0 -1
  204. package/dist/chunk-J62TFQHR.js.map +0 -1
  205. package/dist/chunk-KPNNSUXM.js.map +0 -1
  206. package/dist/chunk-KR3IVNQH.js.map +0 -1
  207. package/dist/chunk-OWIFNJXZ.js.map +0 -1
  208. package/dist/chunk-PLLJNHWU.js.map +0 -1
  209. package/dist/chunk-R4UOT76L.js.map +0 -1
  210. package/dist/chunk-SHS6EGWS.js +0 -226
  211. package/dist/chunk-SHS6EGWS.js.map +0 -1
  212. package/dist/chunk-TNROOKX3.js.map +0 -1
  213. package/dist/chunk-UFRMZ3M6.js.map +0 -1
  214. package/dist/chunk-VFALJSXB.js.map +0 -1
  215. package/dist/chunk-VPNFYQBL.js.map +0 -1
  216. package/dist/chunk-XD5LE64P.js +0 -311
  217. package/dist/chunk-XD5LE64P.js.map +0 -1
  218. package/dist/chunk-XV6NXXXP.js +0 -206
  219. package/dist/chunk-XV6NXXXP.js.map +0 -1
  220. package/dist/chunk-YWA63YN3.js.map +0 -1
  221. package/dist/chunk-Z3FL7LEK.js.map +0 -1
@@ -1,6 +1,6 @@
1
- import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuSeparator, DropdownMenuLabel, DropdownMenuGroup, DropdownMenuItem } from './chunk-FSMHI7DW.js';
1
+ import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuSeparator, DropdownMenuLabel, DropdownMenuGroup, DropdownMenuItem } from './chunk-OXDWUKGP.js';
2
2
  import { Avatar, AvatarImage, AvatarFallback } from './chunk-YP2ATSXP.js';
3
- import { Badge } from './chunk-TNROOKX3.js';
3
+ import { Badge } from './chunk-UDY3IDCY.js';
4
4
  import { cn } from './chunk-HRNDJU7D.js';
5
5
  import { ChevronsUpDown, Check } from 'lucide-react';
6
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -92,5 +92,5 @@ function AccountSwitch({
92
92
  }
93
93
 
94
94
  export { AccountSwitch };
95
- //# sourceMappingURL=chunk-2Y7PQ6ZL.js.map
96
- //# sourceMappingURL=chunk-2Y7PQ6ZL.js.map
95
+ //# sourceMappingURL=chunk-237TQKWH.js.map
96
+ //# sourceMappingURL=chunk-237TQKWH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/navigation/AccountSwitch/AccountSwitch.tsx"],"names":[],"mappings":"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","file":"chunk-2Y7PQ6ZL.js","sourcesContent":["\"use client\"\n\nimport type { AccountSwitchAccount, AccountSwitchProps } from \"./AccountSwitch.types\"\n\nimport { Check, ChevronsUpDown } from \"lucide-react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../primitives/Avatar\"\nimport { Badge } from \"../../primitives/Badge\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../DropdownMenu\"\n\nfunction AccountSwitch({\n className,\n accounts,\n triggerShape = \"pill\",\n header,\n footer,\n onSelect,\n ...props\n}: AccountSwitchProps) {\n const currentAccount = accounts.find((a) => a.isCurrent) ?? accounts[0]\n\n const handleSelect = (account: AccountSwitchAccount) => {\n if (account.id !== currentAccount?.id) {\n onSelect?.(account)\n }\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n className={cn(\n \"inline-flex items-center gap-2 h-[var(--input-size-md-h)] border bg-card text-card-foreground transition-colors hover:bg-accent/50 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none\",\n triggerShape === \"pill\"\n ? \"rounded-full pl-1.5 pr-3\"\n : \"rounded-[var(--radius-md)] px-3\",\n className\n )}\n data-slot=\"account-switch-trigger\"\n type=\"button\"\n {...props}\n >\n {currentAccount && (\n <>\n <Avatar size=\"xs\">\n {currentAccount.avatarSrc && (\n <AvatarImage alt={currentAccount.name} src={currentAccount.avatarSrc} />\n )}\n <AvatarFallback>\n {currentAccount.avatarFallback ?? currentAccount.name.charAt(0)}\n </AvatarFallback>\n </Avatar>\n <span className=\"text-sm font-medium truncate max-w-[var(--account-switch-name-max-width)]\">\n {currentAccount.name}\n </span>\n </>\n )}\n <ChevronsUpDown\n aria-hidden=\"true\"\n className=\"size-3.5 text-muted-foreground shrink-0 ml-auto\"\n />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n className=\"min-w-[var(--account-switch-content-min-width)]\"\n data-slot=\"account-switch-content\"\n >\n {header && (\n <>\n <div className=\"px-2 py-1.5\">{header}</div>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuLabel className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Contas\n </DropdownMenuLabel>\n <DropdownMenuGroup>\n {accounts.map((account) => (\n <DropdownMenuItem\n key={account.id}\n className=\"flex items-center gap-2\"\n onClick={() => {\n handleSelect(account)\n }}\n >\n <Avatar size=\"xs\">\n {account.avatarSrc && (\n <AvatarImage alt={account.name} src={account.avatarSrc} />\n )}\n <AvatarFallback>\n {account.avatarFallback ?? account.name.charAt(0)}\n </AvatarFallback>\n </Avatar>\n <span className=\"flex-1 truncate\">{account.name}</span>\n {account.plan && (\n <Badge color={account.plan === \"PRO\" ? \"primary\" : \"muted\"} size=\"sm\" type=\"pill-color\">\n {account.plan}\n </Badge>\n )}\n {account.isCurrent && <Check aria-hidden=\"true\" className=\"size-3.5 text-primary\" />}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n {footer && (\n <>\n <DropdownMenuSeparator />\n {footer}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport { AccountSwitch }\n"]}
1
+ {"version":3,"sources":["../src/components/navigation/AccountSwitch/AccountSwitch.tsx"],"names":[],"mappings":"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","file":"chunk-237TQKWH.js","sourcesContent":["\"use client\"\n\nimport type { AccountSwitchAccount, AccountSwitchProps } from \"./AccountSwitch.types\"\n\nimport { Check, ChevronsUpDown } from \"lucide-react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../primitives/Avatar\"\nimport { Badge } from \"../../primitives/Badge\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../DropdownMenu\"\n\nfunction AccountSwitch({\n className,\n accounts,\n triggerShape = \"pill\",\n header,\n footer,\n onSelect,\n ...props\n}: AccountSwitchProps) {\n const currentAccount = accounts.find((a) => a.isCurrent) ?? accounts[0]\n\n const handleSelect = (account: AccountSwitchAccount) => {\n if (account.id !== currentAccount?.id) {\n onSelect?.(account)\n }\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n className={cn(\n \"inline-flex items-center gap-2 h-[var(--input-size-md-h)] border bg-card text-card-foreground transition-colors hover:bg-accent/50 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none\",\n triggerShape === \"pill\"\n ? \"rounded-full pl-1.5 pr-3\"\n : \"rounded-[var(--radius-md)] px-3\",\n className\n )}\n data-slot=\"account-switch-trigger\"\n type=\"button\"\n {...props}\n >\n {currentAccount && (\n <>\n <Avatar size=\"xs\">\n {currentAccount.avatarSrc && (\n <AvatarImage alt={currentAccount.name} src={currentAccount.avatarSrc} />\n )}\n <AvatarFallback>\n {currentAccount.avatarFallback ?? currentAccount.name.charAt(0)}\n </AvatarFallback>\n </Avatar>\n <span className=\"text-sm font-medium truncate max-w-[var(--account-switch-name-max-width)]\">\n {currentAccount.name}\n </span>\n </>\n )}\n <ChevronsUpDown\n aria-hidden=\"true\"\n className=\"size-3.5 text-muted-foreground shrink-0 ml-auto\"\n />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n className=\"min-w-[var(--account-switch-content-min-width)]\"\n data-slot=\"account-switch-content\"\n >\n {header && (\n <>\n <div className=\"px-2 py-1.5\">{header}</div>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuLabel className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Contas\n </DropdownMenuLabel>\n <DropdownMenuGroup>\n {accounts.map((account) => (\n <DropdownMenuItem\n key={account.id}\n className=\"flex items-center gap-2\"\n onClick={() => {\n handleSelect(account)\n }}\n >\n <Avatar size=\"xs\">\n {account.avatarSrc && (\n <AvatarImage alt={account.name} src={account.avatarSrc} />\n )}\n <AvatarFallback>\n {account.avatarFallback ?? account.name.charAt(0)}\n </AvatarFallback>\n </Avatar>\n <span className=\"flex-1 truncate\">{account.name}</span>\n {account.plan && (\n <Badge color={account.plan === \"PRO\" ? \"primary\" : \"muted\"} size=\"sm\" type=\"pill-color\">\n {account.plan}\n </Badge>\n )}\n {account.isCurrent && <Check aria-hidden=\"true\" className=\"size-3.5 text-primary\" />}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n {footer && (\n <>\n <DropdownMenuSeparator />\n {footer}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport { AccountSwitch }\n"]}
@@ -5,12 +5,18 @@ import * as React from 'react';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
 
7
7
  var controlButtonBase = cn(
8
- "flex items-center justify-center rounded-full",
8
+ "flex items-center justify-center rounded-[var(--lightbox-button-radius)]",
9
9
  "bg-white/10 text-white transition-colors hover:bg-white/20",
10
10
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/50"
11
11
  );
12
- var controlButtonSmall = cn(controlButtonBase, "size-10");
13
- var controlButtonLarge = cn(controlButtonBase, "size-12");
12
+ var controlButtonSmall = cn(
13
+ controlButtonBase,
14
+ "size-[var(--lightbox-button-size-sm)]"
15
+ );
16
+ var controlButtonLarge = cn(
17
+ controlButtonBase,
18
+ "size-[var(--lightbox-button-size-lg)]"
19
+ );
14
20
  var controlButtonDisabled = "disabled:cursor-not-allowed disabled:opacity-30";
15
21
  function Lightbox({
16
22
  className,
@@ -173,7 +179,7 @@ function Lightbox({
173
179
  /* @__PURE__ */ jsxs(
174
180
  "div",
175
181
  {
176
- className: "absolute top-0 left-0 right-0 z-10 flex items-center justify-between p-4",
182
+ className: "absolute top-0 left-0 right-0 z-10 flex items-center justify-between p-[var(--lightbox-header-padding)]",
177
183
  "data-slot": "lightbox-header",
178
184
  children: [
179
185
  showCounter && hasMultipleImages ? /* @__PURE__ */ jsxs(
@@ -299,7 +305,7 @@ function Lightbox({
299
305
  "div",
300
306
  {
301
307
  className: cn(
302
- "absolute bottom-0 left-0 right-0 z-10 flex flex-col items-center gap-3 p-4",
308
+ "absolute bottom-0 left-0 right-0 z-10 flex flex-col items-center gap-[var(--lightbox-footer-gap)] p-[var(--lightbox-footer-padding)]",
303
309
  showThumbnails ? "pb-4" : "pb-6"
304
310
  ),
305
311
  "data-slot": "lightbox-footer",
@@ -354,16 +360,16 @@ function Lightbox({
354
360
  "div",
355
361
  {
356
362
  "aria-label": "Image thumbnails",
357
- className: "flex max-w-full gap-2 overflow-x-auto px-4 py-2",
363
+ className: "flex max-w-full gap-[var(--lightbox-thumbnail-gap)] overflow-x-auto px-4 py-2",
358
364
  "data-slot": "lightbox-thumbnails",
359
365
  role: "tablist",
360
366
  children: images.map((image, index) => /* @__PURE__ */ jsx(
361
367
  "button",
362
368
  {
363
369
  className: cn(
364
- "relative size-16 shrink-0 overflow-hidden rounded-md transition-all",
370
+ "relative size-[var(--lightbox-thumbnail-size)] shrink-0 overflow-hidden rounded-md transition-all",
365
371
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/50",
366
- index === currentIndex ? "ring-2 ring-white ring-offset-2 ring-offset-black/90" : "opacity-60 hover:opacity-100"
372
+ index === currentIndex ? "ring-2 ring-white ring-offset-2 ring-offset-black/90" : "opacity-[var(--lightbox-thumbnail-opacity-inactive)] hover:opacity-100"
367
373
  ),
368
374
  "aria-label": `View ${image.alt}`,
369
375
  "aria-selected": index === currentIndex,
@@ -398,5 +404,5 @@ function Lightbox({
398
404
  }
399
405
 
400
406
  export { Lightbox };
401
- //# sourceMappingURL=chunk-KR3IVNQH.js.map
402
- //# sourceMappingURL=chunk-KR3IVNQH.js.map
407
+ //# sourceMappingURL=chunk-2FJJOHHH.js.map
408
+ //# sourceMappingURL=chunk-2FJJOHHH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/Lightbox/Lightbox.tsx"],"names":[],"mappings":"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","file":"chunk-2FJJOHHH.js","sourcesContent":["\"use client\"\n\nimport type { LightboxImage, LightboxProps } from \"./Lightbox.types\"\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport {\n ChevronLeft,\n ChevronRight,\n Download,\n X,\n ZoomIn,\n ZoomOut,\n} from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\n\n// Shared button styles\nconst controlButtonBase = cn(\n \"flex items-center justify-center rounded-[var(--lightbox-button-radius)]\",\n \"bg-white/10 text-white transition-colors hover:bg-white/20\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/50\"\n)\n\nconst controlButtonSmall = cn(\n controlButtonBase,\n \"size-[var(--lightbox-button-size-sm)]\"\n)\nconst controlButtonLarge = cn(\n controlButtonBase,\n \"size-[var(--lightbox-button-size-lg)]\"\n)\nconst controlButtonDisabled = \"disabled:cursor-not-allowed disabled:opacity-30\"\n\n/**\n * Lightbox - A full-screen media viewer with navigation, zoom, and captions\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false)\n * const images = [\n * { id: '1', src: '/img1.jpg', alt: 'Image 1', caption: 'First image' },\n * { id: '2', src: '/img2.jpg', alt: 'Image 2', caption: 'Second image' },\n * ]\n *\n * <Lightbox\n * images={images}\n * open={open}\n * onOpenChange={setOpen}\n * showCaption\n * enableZoom\n * />\n * ```\n */\nfunction Lightbox({\n className,\n enableDownload = false,\n enableZoom = true,\n images,\n initialIndex = 0,\n loop = true,\n onClose,\n onIndexChange,\n onOpenChange,\n open,\n showCaption = true,\n showCounter = true,\n showThumbnails = false,\n}: LightboxProps) {\n // Use a key to reset state when dialog opens at a specific index\n const [stateKey, setStateKey] = React.useState(0)\n const [currentIndex, setCurrentIndex] = React.useState(initialIndex)\n const [zoom, setZoom] = React.useState(1)\n const [imageLoading, setImageLoading] = React.useState(true)\n const [imageError, setImageError] = React.useState(false)\n\n // Track previous open state to detect when dialog opens\n const prevOpenRef = React.useRef(open)\n\n // Reset state when dialog opens (not on every render)\n /* eslint-disable react-you-might-not-need-an-effect/no-derived-state, react-you-might-not-need-an-effect/no-adjust-state-on-prop-change, @eslint-react/hooks-extra/no-direct-set-state-in-use-effect -- Intentional state reset on open */\n React.useEffect(() => {\n if (open && !prevOpenRef.current) {\n // Dialog just opened - reset to initialIndex\n setCurrentIndex(initialIndex)\n setZoom(1)\n setImageLoading(true)\n setImageError(false)\n setStateKey((k) => k + 1)\n }\n prevOpenRef.current = open\n }, [open, initialIndex])\n /* eslint-enable react-you-might-not-need-an-effect/no-derived-state, react-you-might-not-need-an-effect/no-adjust-state-on-prop-change, @eslint-react/hooks-extra/no-direct-set-state-in-use-effect */\n\n // Reset loading state when the image changes\n /* eslint-disable react-you-might-not-need-an-effect/no-adjust-state-on-prop-change, react-you-might-not-need-an-effect/no-chain-state-updates, @eslint-react/hooks-extra/no-direct-set-state-in-use-effect -- Image loading state sync */\n React.useEffect(() => {\n setImageLoading(true)\n setImageError(false)\n }, [currentIndex])\n /* eslint-enable react-you-might-not-need-an-effect/no-adjust-state-on-prop-change, react-you-might-not-need-an-effect/no-chain-state-updates, @eslint-react/hooks-extra/no-direct-set-state-in-use-effect */\n\n const currentImage: LightboxImage | undefined = images[currentIndex]\n const hasMultipleImages = images.length > 1\n\n const canGoNext = loop || currentIndex < images.length - 1\n const canGoPrev = loop || currentIndex > 0\n\n const goNext = React.useCallback(() => {\n if (!canGoNext) return\n setZoom(1)\n const nextIndex =\n currentIndex < images.length - 1\n ? currentIndex + 1\n : loop\n ? 0\n : currentIndex\n setCurrentIndex(nextIndex)\n onIndexChange?.(nextIndex)\n }, [currentIndex, images.length, loop, canGoNext, onIndexChange])\n\n const goPrev = React.useCallback(() => {\n if (!canGoPrev) return\n setZoom(1)\n const prevIndex =\n currentIndex > 0\n ? currentIndex - 1\n : loop\n ? images.length - 1\n : currentIndex\n setCurrentIndex(prevIndex)\n onIndexChange?.(prevIndex)\n }, [currentIndex, images.length, loop, canGoPrev, onIndexChange])\n\n const goToIndex = React.useCallback(\n (index: number) => {\n if (index >= 0 && index < images.length) {\n setZoom(1)\n setCurrentIndex(index)\n onIndexChange?.(index)\n }\n },\n [images.length, onIndexChange]\n )\n\n const handleClose = React.useCallback(() => {\n onOpenChange?.(false)\n onClose?.()\n }, [onOpenChange, onClose])\n\n const handleZoomIn = React.useCallback(() => {\n setZoom((prev) => Math.min(3, prev + 0.25))\n }, [])\n\n const handleZoomOut = React.useCallback(() => {\n setZoom((prev) => Math.max(0.5, prev - 0.25))\n }, [])\n\n const handleDownload = React.useCallback(() => {\n if (!currentImage) return\n\n const link = document.createElement(\"a\")\n link.href = currentImage.src\n link.download = currentImage.alt || `image-${currentImage.id}`\n link.target = \"_blank\"\n link.rel = \"noopener noreferrer\"\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n }, [currentImage])\n\n const handleImageLoad = React.useCallback(() => {\n setImageLoading(false)\n setImageError(false)\n }, [])\n\n const handleImageError = React.useCallback(() => {\n setImageLoading(false)\n setImageError(true)\n }, [])\n\n // Keyboard navigation\n React.useEffect(() => {\n if (!open) return\n\n const handleKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case \"ArrowLeft\":\n event.preventDefault()\n goPrev()\n break\n case \"ArrowRight\":\n event.preventDefault()\n goNext()\n break\n case \"Escape\":\n event.preventDefault()\n handleClose()\n break\n case \"+\":\n case \"=\":\n if (enableZoom) {\n event.preventDefault()\n handleZoomIn()\n }\n break\n case \"-\":\n if (enableZoom) {\n event.preventDefault()\n handleZoomOut()\n }\n break\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown)\n }\n }, [open, goNext, goPrev, handleClose, enableZoom, handleZoomIn, handleZoomOut])\n\n if (!currentImage) return null\n\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/90\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\"\n )}\n data-slot=\"lightbox-overlay\"\n />\n <DialogPrimitive.Content\n key={stateKey}\n className={cn(\n \"fixed inset-0 z-50 flex flex-col\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"duration-200\",\n className\n )}\n aria-describedby={currentImage.caption ? \"lightbox-caption\" : undefined}\n aria-label={`Lightbox: ${currentImage.alt}`}\n data-slot=\"lightbox\"\n >\n {/* Hide dialog title for screen readers but provide accessible label */}\n <DialogPrimitive.Title className=\"sr-only\">\n Image Viewer\n </DialogPrimitive.Title>\n <DialogPrimitive.Description className=\"sr-only\">\n {`Viewing image ${String(currentIndex + 1)} of ${String(images.length)}`}\n </DialogPrimitive.Description>\n\n {/* Top controls bar */}\n <div\n className=\"absolute top-0 left-0 right-0 z-10 flex items-center justify-between p-[var(--lightbox-header-padding)]\"\n data-slot=\"lightbox-header\"\n >\n {/* Counter */}\n {showCounter && hasMultipleImages ? (\n <div\n aria-live=\"polite\"\n className=\"text-sm text-white/70\"\n data-slot=\"lightbox-counter\"\n >\n {currentIndex + 1} / {images.length}\n </div>\n ) : (\n <div />\n )}\n\n {/* Action buttons */}\n <div className=\"flex items-center gap-2\">\n {enableDownload && (\n <button\n aria-label=\"Download image\"\n className={controlButtonSmall}\n data-slot=\"lightbox-download\"\n type=\"button\"\n onClick={handleDownload}\n >\n <Download className=\"size-5\" />\n </button>\n )}\n <DialogPrimitive.Close asChild>\n <button\n aria-label=\"Close lightbox\"\n className={controlButtonSmall}\n data-slot=\"lightbox-close\"\n type=\"button\"\n >\n <X className=\"size-6\" />\n </button>\n </DialogPrimitive.Close>\n </div>\n </div>\n\n {/* Navigation arrows */}\n {hasMultipleImages && (\n <>\n <button\n className={cn(\n \"absolute left-4 top-1/2 z-10 -translate-y-1/2\",\n controlButtonLarge,\n controlButtonDisabled\n )}\n aria-label=\"Previous image\"\n data-slot=\"lightbox-prev\"\n disabled={!canGoPrev}\n type=\"button\"\n onClick={goPrev}\n >\n <ChevronLeft className=\"size-8\" />\n </button>\n <button\n className={cn(\n \"absolute right-4 top-1/2 z-10 -translate-y-1/2\",\n controlButtonLarge,\n controlButtonDisabled\n )}\n aria-label=\"Next image\"\n data-slot=\"lightbox-next\"\n disabled={!canGoNext}\n type=\"button\"\n onClick={goNext}\n >\n <ChevronRight className=\"size-8\" />\n </button>\n </>\n )}\n\n {/* Main image area */}\n <div\n className={cn(\n \"flex flex-1 items-center justify-center\",\n showThumbnails ? \"pb-24\" : \"pb-20\",\n \"pt-16 px-16\"\n )}\n data-slot=\"lightbox-image-container\"\n >\n {imageLoading && (\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n data-loading=\"true\"\n >\n <div className=\"size-12 animate-spin rounded-full border-4 border-white/20 border-t-white\" />\n </div>\n )}\n {imageError ? (\n <div\n className=\"flex flex-col items-center justify-center gap-4 text-white/70\"\n data-error=\"true\"\n >\n <X className=\"size-16 text-white/40\" />\n <span>Failed to load image</span>\n </div>\n ) : (\n <img\n className={cn(\n \"max-h-full max-w-full object-contain transition-all duration-200\",\n imageLoading ? \"opacity-0\" : \"opacity-100\"\n )}\n alt={currentImage.alt}\n data-slot=\"lightbox-image\"\n src={currentImage.src}\n style={{ transform: `scale(${String(zoom)})` }}\n onError={handleImageError}\n onLoad={handleImageLoad}\n />\n )}\n </div>\n\n {/* Bottom controls bar */}\n <div\n className={cn(\n \"absolute bottom-0 left-0 right-0 z-10 flex flex-col items-center gap-[var(--lightbox-footer-gap)] p-[var(--lightbox-footer-padding)]\",\n showThumbnails ? \"pb-4\" : \"pb-6\"\n )}\n data-slot=\"lightbox-footer\"\n >\n {/* Zoom controls */}\n {enableZoom && (\n <div\n className=\"flex items-center gap-2\"\n data-slot=\"lightbox-zoom-controls\"\n >\n <button\n aria-label=\"Zoom out\"\n className={cn(controlButtonSmall, controlButtonDisabled)}\n data-slot=\"lightbox-zoom-out\"\n disabled={zoom <= 0.5}\n type=\"button\"\n onClick={handleZoomOut}\n >\n <ZoomOut className=\"size-5\" />\n </button>\n <span className=\"min-w-[4ch] text-center text-sm text-white/70\">\n {Math.round(zoom * 100)}%\n </span>\n <button\n aria-label=\"Zoom in\"\n className={cn(controlButtonSmall, controlButtonDisabled)}\n data-slot=\"lightbox-zoom-in\"\n disabled={zoom >= 3}\n type=\"button\"\n onClick={handleZoomIn}\n >\n <ZoomIn className=\"size-5\" />\n </button>\n </div>\n )}\n\n {/* Caption */}\n {showCaption && currentImage.caption && (\n <p\n className=\"text-center text-sm text-white/90\"\n data-slot=\"lightbox-caption\"\n id=\"lightbox-caption\"\n >\n {currentImage.caption}\n </p>\n )}\n\n {/* Thumbnails strip */}\n {showThumbnails && hasMultipleImages && (\n <div\n aria-label=\"Image thumbnails\"\n className=\"flex max-w-full gap-[var(--lightbox-thumbnail-gap)] overflow-x-auto px-4 py-2\"\n data-slot=\"lightbox-thumbnails\"\n role=\"tablist\"\n >\n {images.map((image, index) => (\n <button\n key={image.id}\n className={cn(\n \"relative size-[var(--lightbox-thumbnail-size)] shrink-0 overflow-hidden rounded-md transition-all\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/50\",\n index === currentIndex\n ? \"ring-2 ring-white ring-offset-2 ring-offset-black/90\"\n : \"opacity-[var(--lightbox-thumbnail-opacity-inactive)] hover:opacity-100\"\n )}\n aria-label={`View ${image.alt}`}\n aria-selected={index === currentIndex}\n data-slot=\"lightbox-thumbnail\"\n role=\"tab\"\n type=\"button\"\n onClick={() => {\n goToIndex(index)\n }}\n >\n <img\n alt={image.alt}\n className=\"size-full object-cover\"\n loading=\"lazy\"\n src={image.thumbnail ?? image.src}\n />\n </button>\n ))}\n </div>\n )}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n )\n}\n\nexport { Lightbox }\nexport type { LightboxImage, LightboxProps }\n"]}
@@ -126,8 +126,8 @@ function FileDropzone({
126
126
  )
127
127
  }
128
128
  ),
129
- /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: isDragActive ? isDragReject ? "File type not accepted" : "Drop files here..." : "Drag files here or click to upload" }),
130
- /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground mt-1", children: [
129
+ /* @__PURE__ */ jsx("p", { className: "text-[length:var(--text-font-size-lg)] leading-[var(--text-line-height-lg)] font-normal", children: isDragActive ? isDragReject ? "File type not accepted" : "Drop files here..." : "Drag files here or click to upload" }),
130
+ /* @__PURE__ */ jsxs("p", { className: "text-[length:var(--text-font-size-base)] leading-[var(--text-line-height-base)] text-muted-foreground mt-1", children: [
131
131
  maxSize !== void 0 && `Max size: ${formatBytes(maxSize)}`,
132
132
  maxSize !== void 0 && maxFiles !== void 0 && " \u2022 ",
133
133
  maxFiles !== void 0 && `Max ${String(maxFiles)} file${maxFiles > 1 ? "s" : ""}`
@@ -171,5 +171,5 @@ function formatBytes(bytes) {
171
171
  FileDropzone.displayName = "FileDropzone";
172
172
 
173
173
  export { FileDropzone, fileDropzoneVariants };
174
- //# sourceMappingURL=chunk-W4NC5CU5.js.map
175
- //# sourceMappingURL=chunk-W4NC5CU5.js.map
174
+ //# sourceMappingURL=chunk-2Q4I4VDB.js.map
175
+ //# sourceMappingURL=chunk-2Q4I4VDB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/advanced/FileDropzone/FileDropzone.variants.ts","../src/components/advanced/FileDropzone/FileDropzone.tsx"],"names":["acceptedFiles","fileRejections"],"mappings":"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","file":"chunk-W4NC5CU5.js","sourcesContent":["import { cva } from \"class-variance-authority\"\n\nexport const fileDropzoneVariants = cva(\n [\n \"flex flex-col items-center justify-center\",\n \"border-2 border-dashed rounded-lg\",\n \"transition-colors duration-200\",\n \"cursor-pointer\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n ],\n {\n variants: {\n variant: {\n default: \"gap-2 p-8 bg-muted/50 border-muted-foreground/25\",\n compact: \"gap-1 p-4 bg-muted/50 border-muted-foreground/25\",\n image: \"gap-2 p-8 bg-muted/50 border-muted-foreground/25 aspect-video\",\n },\n isDragActive: {\n true: \"border-primary bg-primary/5\",\n false: \"\",\n },\n isDragReject: {\n true: \"border-destructive bg-destructive/5\",\n false: \"\",\n },\n disabled: {\n true: \"opacity-50 cursor-not-allowed pointer-events-none\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n isDragActive: false,\n isDragReject: false,\n disabled: false,\n className: \"hover:border-primary hover:bg-primary/5\",\n },\n ],\n defaultVariants: {\n variant: \"default\",\n isDragActive: false,\n isDragReject: false,\n disabled: false,\n },\n }\n)\n","\"use client\"\n\nimport type { FileDropzoneProps } from \"./FileDropzone.types\"\nimport type { DropEvent, FileRejection } from \"react-dropzone\"\n\nimport { UploadCloudIcon } from \"lucide-react\"\nimport * as React from \"react\"\nimport { useDropzone } from \"react-dropzone\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { fileDropzoneVariants } from \"./FileDropzone.variants\"\n\n/**\n * FileDropzone - Drag and drop file upload component\n *\n * A flexible dropzone component built on react-dropzone that provides\n * visual feedback during drag operations and supports file validation.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <FileDropzone onDrop={(files) => console.log(files)}>\n * <p>Drag files here or click to upload</p>\n * </FileDropzone>\n *\n * // With validation\n * <FileDropzone\n * accept={{ \"image/*\": [\".png\", \".jpg\"] }}\n * maxSize={5 * 1024 * 1024}\n * maxFiles={5}\n * onDrop={(files) => handleFiles(files)}\n * onReject={(rejections) => handleErrors(rejections)}\n * >\n * <p>Drop images here (max 5MB each)</p>\n * </FileDropzone>\n *\n * // With render props for custom state handling\n * <FileDropzone onDrop={handleDrop}>\n * {({ isDragActive, isDragReject }) => (\n * <div className={isDragActive ? \"bg-blue-50\" : \"\"}>\n * {isDragReject ? \"Invalid file type\" : \"Drop files here\"}\n * </div>\n * )}\n * </FileDropzone>\n * ```\n */\nfunction FileDropzone({\n accept,\n children,\n className,\n disabled = false,\n maxFiles,\n maxSize,\n minSize,\n multiple = true,\n noClick = false,\n noDrag = false,\n noKeyboard = false,\n onDrop,\n onReject,\n variant = \"default\",\n ...props\n}: FileDropzoneProps) {\n const handleDrop = React.useCallback(\n (\n acceptedFiles: File[],\n fileRejections: FileRejection[],\n event: DropEvent\n ) => {\n onDrop?.(acceptedFiles, fileRejections, event)\n\n if (fileRejections.length > 0) {\n onReject?.(fileRejections)\n }\n },\n [onDrop, onReject]\n )\n\n const {\n acceptedFiles,\n fileRejections,\n getInputProps,\n getRootProps,\n isDragAccept,\n isDragActive,\n isDragReject,\n isFileDialogActive,\n isFocused,\n open,\n } = useDropzone({\n accept,\n disabled,\n maxFiles,\n maxSize,\n minSize,\n multiple,\n noClick,\n noDrag,\n noKeyboard,\n onDrop: handleDrop,\n ...props,\n })\n\n const dropzoneState = {\n acceptedFiles,\n fileRejections,\n isDragAccept,\n isDragActive,\n isDragReject,\n isFileDialogActive,\n isFocused,\n open,\n }\n\n const renderContent = () => {\n if (typeof children === \"function\") {\n return children(dropzoneState)\n }\n\n if (children) {\n return children\n }\n\n // Default content\n return (\n <>\n <UploadCloudIcon\n className={cn(\n \"size-10 mb-2\",\n isDragActive ? \"text-primary\" : \"text-muted-foreground\"\n )}\n />\n <p className=\"text-sm font-medium\">\n {isDragActive\n ? isDragReject\n ? \"File type not accepted\"\n : \"Drop files here...\"\n : \"Drag files here or click to upload\"}\n </p>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {maxSize !== undefined && `Max size: ${formatBytes(maxSize)}`}\n {maxSize !== undefined && maxFiles !== undefined && \" • \"}\n {maxFiles !== undefined && `Max ${String(maxFiles)} file${maxFiles > 1 ? \"s\" : \"\"}`}\n </p>\n </>\n )\n }\n\n return (\n <div\n {...getRootProps({\n className: cn(\n fileDropzoneVariants({\n variant,\n isDragActive,\n isDragReject,\n disabled,\n }),\n className\n ),\n \"data-slot\": \"file-dropzone\",\n \"data-drag-active\": isDragActive,\n \"data-drag-accept\": isDragAccept,\n \"data-drag-reject\": isDragReject,\n \"data-disabled\": disabled,\n \"aria-disabled\": disabled,\n })}\n >\n <input {...getInputProps()} data-slot=\"file-dropzone-input\" />\n {renderContent()}\n </div>\n )\n}\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\"\n const k = 1024\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"]\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${String(Number.parseFloat((bytes / Math.pow(k, i)).toFixed(1)))} ${sizes[i] ?? \"\"}`\n}\n\nFileDropzone.displayName = \"FileDropzone\"\n\nexport { FileDropzone }\n"]}
1
+ {"version":3,"sources":["../src/components/advanced/FileDropzone/FileDropzone.variants.ts","../src/components/advanced/FileDropzone/FileDropzone.tsx"],"names":["acceptedFiles","fileRejections"],"mappings":"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","file":"chunk-2Q4I4VDB.js","sourcesContent":["import { cva } from \"class-variance-authority\"\n\nexport const fileDropzoneVariants = cva(\n [\n \"flex flex-col items-center justify-center\",\n \"border-2 border-dashed rounded-lg\",\n \"transition-colors duration-200\",\n \"cursor-pointer\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n ],\n {\n variants: {\n variant: {\n default: \"gap-2 p-8 bg-muted/50 border-muted-foreground/25\",\n compact: \"gap-1 p-4 bg-muted/50 border-muted-foreground/25\",\n image: \"gap-2 p-8 bg-muted/50 border-muted-foreground/25 aspect-video\",\n },\n isDragActive: {\n true: \"border-primary bg-primary/5\",\n false: \"\",\n },\n isDragReject: {\n true: \"border-destructive bg-destructive/5\",\n false: \"\",\n },\n disabled: {\n true: \"opacity-50 cursor-not-allowed pointer-events-none\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n isDragActive: false,\n isDragReject: false,\n disabled: false,\n className: \"hover:border-primary hover:bg-primary/5\",\n },\n ],\n defaultVariants: {\n variant: \"default\",\n isDragActive: false,\n isDragReject: false,\n disabled: false,\n },\n }\n)\n","\"use client\"\n\nimport type { FileDropzoneProps } from \"./FileDropzone.types\"\nimport type { DropEvent, FileRejection } from \"react-dropzone\"\n\nimport { UploadCloudIcon } from \"lucide-react\"\nimport * as React from \"react\"\nimport { useDropzone } from \"react-dropzone\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { fileDropzoneVariants } from \"./FileDropzone.variants\"\n\n/**\n * FileDropzone - Drag and drop file upload component\n *\n * A flexible dropzone component built on react-dropzone that provides\n * visual feedback during drag operations and supports file validation.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <FileDropzone onDrop={(files) => console.log(files)}>\n * <p>Drag files here or click to upload</p>\n * </FileDropzone>\n *\n * // With validation\n * <FileDropzone\n * accept={{ \"image/*\": [\".png\", \".jpg\"] }}\n * maxSize={5 * 1024 * 1024}\n * maxFiles={5}\n * onDrop={(files) => handleFiles(files)}\n * onReject={(rejections) => handleErrors(rejections)}\n * >\n * <p>Drop images here (max 5MB each)</p>\n * </FileDropzone>\n *\n * // With render props for custom state handling\n * <FileDropzone onDrop={handleDrop}>\n * {({ isDragActive, isDragReject }) => (\n * <div className={isDragActive ? \"bg-blue-50\" : \"\"}>\n * {isDragReject ? \"Invalid file type\" : \"Drop files here\"}\n * </div>\n * )}\n * </FileDropzone>\n * ```\n */\nfunction FileDropzone({\n accept,\n children,\n className,\n disabled = false,\n maxFiles,\n maxSize,\n minSize,\n multiple = true,\n noClick = false,\n noDrag = false,\n noKeyboard = false,\n onDrop,\n onReject,\n variant = \"default\",\n ...props\n}: FileDropzoneProps) {\n const handleDrop = React.useCallback(\n (\n acceptedFiles: File[],\n fileRejections: FileRejection[],\n event: DropEvent\n ) => {\n onDrop?.(acceptedFiles, fileRejections, event)\n\n if (fileRejections.length > 0) {\n onReject?.(fileRejections)\n }\n },\n [onDrop, onReject]\n )\n\n const {\n acceptedFiles,\n fileRejections,\n getInputProps,\n getRootProps,\n isDragAccept,\n isDragActive,\n isDragReject,\n isFileDialogActive,\n isFocused,\n open,\n } = useDropzone({\n accept,\n disabled,\n maxFiles,\n maxSize,\n minSize,\n multiple,\n noClick,\n noDrag,\n noKeyboard,\n onDrop: handleDrop,\n ...props,\n })\n\n const dropzoneState = {\n acceptedFiles,\n fileRejections,\n isDragAccept,\n isDragActive,\n isDragReject,\n isFileDialogActive,\n isFocused,\n open,\n }\n\n const renderContent = () => {\n if (typeof children === \"function\") {\n return children(dropzoneState)\n }\n\n if (children) {\n return children\n }\n\n // Default content\n return (\n <>\n <UploadCloudIcon\n className={cn(\n \"size-10 mb-2\",\n isDragActive ? \"text-primary\" : \"text-muted-foreground\"\n )}\n />\n <p className=\"text-[length:var(--text-font-size-lg)] leading-[var(--text-line-height-lg)] font-normal\">\n {isDragActive\n ? isDragReject\n ? \"File type not accepted\"\n : \"Drop files here...\"\n : \"Drag files here or click to upload\"}\n </p>\n <p className=\"text-[length:var(--text-font-size-base)] leading-[var(--text-line-height-base)] text-muted-foreground mt-1\">\n {maxSize !== undefined && `Max size: ${formatBytes(maxSize)}`}\n {maxSize !== undefined && maxFiles !== undefined && \" • \"}\n {maxFiles !== undefined && `Max ${String(maxFiles)} file${maxFiles > 1 ? \"s\" : \"\"}`}\n </p>\n </>\n )\n }\n\n return (\n <div\n {...getRootProps({\n className: cn(\n fileDropzoneVariants({\n variant,\n isDragActive,\n isDragReject,\n disabled,\n }),\n className\n ),\n \"data-slot\": \"file-dropzone\",\n \"data-drag-active\": isDragActive,\n \"data-drag-accept\": isDragAccept,\n \"data-drag-reject\": isDragReject,\n \"data-disabled\": disabled,\n \"aria-disabled\": disabled,\n })}\n >\n <input {...getInputProps()} data-slot=\"file-dropzone-input\" />\n {renderContent()}\n </div>\n )\n}\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\"\n const k = 1024\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"]\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${String(Number.parseFloat((bytes / Math.pow(k, i)).toFixed(1)))} ${sizes[i] ?? \"\"}`\n}\n\nFileDropzone.displayName = \"FileDropzone\"\n\nexport { FileDropzone }\n"]}
@@ -0,0 +1,231 @@
1
+ import { ChartTooltipContent, ChartContainer, ChartTooltip, ChartLegend, ChartLegendContent } from './chunk-7I6KK6QE.js';
2
+ import { cn } from './chunk-HRNDJU7D.js';
3
+ import * as React from 'react';
4
+ import { LineChart as LineChart$1, CartesianGrid, XAxis, Label, YAxis, Line } from 'recharts';
5
+ import { cva } from 'class-variance-authority';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ cva(
9
+ // Base styles (always applied)
10
+ "",
11
+ {
12
+ variants: {
13
+ variant: {
14
+ default: "",
15
+ dashed: "",
16
+ dotted: ""
17
+ }
18
+ },
19
+ defaultVariants: {
20
+ variant: "default"
21
+ }
22
+ }
23
+ );
24
+ var lineStrokeDashArray = {
25
+ default: void 0,
26
+ dashed: "5 5",
27
+ dotted: "2 2"
28
+ };
29
+ function normalizeSeriesConfig(series) {
30
+ return series.map(
31
+ (s) => typeof s === "string" ? { dataKey: s } : s
32
+ );
33
+ }
34
+ function getVariantStrokeDasharray(variant) {
35
+ return lineStrokeDashArray[variant ?? "default"];
36
+ }
37
+ function LineChart({
38
+ activeDot = { r: 6 },
39
+ allowDecimals = true,
40
+ ariaLabel,
41
+ autoMinValue = false,
42
+ className,
43
+ config,
44
+ connectNulls = false,
45
+ customTooltip,
46
+ curveType = "monotone",
47
+ data,
48
+ dot = false,
49
+ enableLegendSlider = false,
50
+ gridDashArray = "3 3",
51
+ intervalType,
52
+ legendPosition = "bottom",
53
+ maxValue,
54
+ minValue,
55
+ onValueChange,
56
+ series,
57
+ showGrid = true,
58
+ showLegend = false,
59
+ showTooltip = true,
60
+ showXAxis = true,
61
+ showYAxis = true,
62
+ startEndOnly = false,
63
+ strokeWidth = 2,
64
+ tickGap,
65
+ tooltipCallback,
66
+ tooltipIndicator = "dot",
67
+ variant = "default",
68
+ xAxisLabel,
69
+ xAxisKey,
70
+ xAxisTickFormatter,
71
+ yAxisLabel,
72
+ yAxisTickFormatter,
73
+ yAxisWidth,
74
+ ...props
75
+ }) {
76
+ const normalizedSeries = normalizeSeriesConfig(series);
77
+ const variantStrokeDasharray = getVariantStrokeDasharray(variant);
78
+ const prevTooltipStateRef = React.useRef(false);
79
+ const handleDotClick = React.useCallback(
80
+ (dataKey) => (data2) => {
81
+ if (!onValueChange) return;
82
+ const payload = data2.payload;
83
+ const value = payload[dataKey];
84
+ onValueChange({
85
+ category: payload[xAxisKey],
86
+ dataKey,
87
+ payload,
88
+ value: typeof value === "number" ? value : 0
89
+ });
90
+ },
91
+ [onValueChange, xAxisKey]
92
+ );
93
+ const TooltipContentWithCallback = React.useCallback(
94
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
95
+ (props2) => {
96
+ const { active = false, label, payload } = props2;
97
+ if (tooltipCallback && active !== prevTooltipStateRef.current) {
98
+ prevTooltipStateRef.current = active;
99
+ tooltipCallback({
100
+ active,
101
+ label,
102
+ payload: payload?.map((p) => ({
103
+ dataKey: String(p.dataKey),
104
+ value: p.value,
105
+ payload: p.payload
106
+ }))
107
+ });
108
+ }
109
+ return /* @__PURE__ */ jsx(ChartTooltipContent, { indicator: tooltipIndicator, ...props2 });
110
+ },
111
+ [tooltipCallback, tooltipIndicator]
112
+ );
113
+ const yDomain = React.useMemo(() => {
114
+ const min = minValue ?? (autoMinValue ? "auto" : 0);
115
+ const max = maxValue ?? "auto";
116
+ return [min, max];
117
+ }, [autoMinValue, maxValue, minValue]);
118
+ const xAxisTicks = React.useMemo(() => {
119
+ if (!startEndOnly || data.length < 2) return;
120
+ const first = data[0];
121
+ const last = data[data.length - 1];
122
+ if (!first || !last) return;
123
+ return [first[xAxisKey], last[xAxisKey]];
124
+ }, [data, startEndOnly, xAxisKey]);
125
+ return /* @__PURE__ */ jsx(
126
+ "div",
127
+ {
128
+ "aria-label": ariaLabel,
129
+ "data-slot": "line-chart",
130
+ role: ariaLabel ? "img" : void 0,
131
+ ...props,
132
+ children: /* @__PURE__ */ jsx(
133
+ ChartContainer,
134
+ {
135
+ className: cn(className),
136
+ config,
137
+ children: /* @__PURE__ */ jsxs(
138
+ LineChart$1,
139
+ {
140
+ accessibilityLayer: true,
141
+ data,
142
+ margin: { left: xAxisLabel ? 20 : 12, right: 12, bottom: yAxisLabel ? 20 : 0 },
143
+ children: [
144
+ showGrid && /* @__PURE__ */ jsx(CartesianGrid, { strokeDasharray: gridDashArray, vertical: false }),
145
+ showXAxis && /* @__PURE__ */ jsx(
146
+ XAxis,
147
+ {
148
+ axisLine: false,
149
+ dataKey: xAxisKey,
150
+ interval: intervalType,
151
+ minTickGap: tickGap,
152
+ tickFormatter: xAxisTickFormatter,
153
+ tickLine: false,
154
+ tickMargin: 8,
155
+ ticks: xAxisTicks,
156
+ children: xAxisLabel && /* @__PURE__ */ jsx(Label, { offset: -5, position: "insideBottom", value: xAxisLabel })
157
+ }
158
+ ),
159
+ showYAxis && /* @__PURE__ */ jsx(
160
+ YAxis,
161
+ {
162
+ allowDecimals,
163
+ axisLine: false,
164
+ domain: yDomain,
165
+ tickFormatter: yAxisTickFormatter,
166
+ tickLine: false,
167
+ tickMargin: 8,
168
+ width: yAxisWidth,
169
+ children: yAxisLabel && /* @__PURE__ */ jsx(Label, { angle: -90, offset: -5, position: "insideLeft", value: yAxisLabel })
170
+ }
171
+ ),
172
+ showTooltip && /* @__PURE__ */ jsx(
173
+ ChartTooltip,
174
+ {
175
+ content: customTooltip ?? (tooltipCallback ? /* @__PURE__ */ jsx(TooltipContentWithCallback, {}) : /* @__PURE__ */ jsx(ChartTooltipContent, { indicator: tooltipIndicator })),
176
+ cursor: false
177
+ }
178
+ ),
179
+ showLegend && /* @__PURE__ */ jsx(
180
+ ChartLegend,
181
+ {
182
+ align: legendPosition === "left" ? "left" : legendPosition === "right" ? "right" : "center",
183
+ content: /* @__PURE__ */ jsx(ChartLegendContent, { enableSlider: enableLegendSlider }),
184
+ layout: legendPosition === "left" || legendPosition === "right" ? "vertical" : "horizontal",
185
+ verticalAlign: legendPosition === "top" ? "top" : legendPosition === "bottom" ? "bottom" : "middle"
186
+ }
187
+ ),
188
+ normalizedSeries.map((seriesConfig) => {
189
+ const {
190
+ activeDot: seriesActiveDot,
191
+ dataKey,
192
+ dot: seriesDot,
193
+ strokeDasharray: seriesStrokeDasharray,
194
+ strokeOpacity,
195
+ strokeWidth: seriesStrokeWidth
196
+ } = seriesConfig;
197
+ const stroke = `var(--color-${dataKey})`;
198
+ const finalStrokeDasharray = seriesStrokeDasharray ?? variantStrokeDasharray;
199
+ const finalDot = seriesDot ?? dot;
200
+ const finalStrokeWidth = seriesStrokeWidth ?? strokeWidth;
201
+ const baseActiveDot = seriesActiveDot ?? activeDot;
202
+ const finalActiveDot = onValueChange ? typeof baseActiveDot === "object" ? { ...baseActiveDot, onClick: handleDotClick(dataKey), style: { cursor: "pointer" } } : !baseActiveDot ? false : { r: 6, onClick: handleDotClick(dataKey), style: { cursor: "pointer" } } : baseActiveDot;
203
+ return /* @__PURE__ */ jsx(
204
+ Line,
205
+ {
206
+ activeDot: finalActiveDot,
207
+ connectNulls,
208
+ dataKey,
209
+ dot: finalDot,
210
+ stroke,
211
+ strokeDasharray: finalStrokeDasharray,
212
+ strokeOpacity,
213
+ strokeWidth: finalStrokeWidth,
214
+ type: curveType
215
+ },
216
+ dataKey
217
+ );
218
+ })
219
+ ]
220
+ }
221
+ )
222
+ }
223
+ )
224
+ }
225
+ );
226
+ }
227
+ LineChart.displayName = "LineChart";
228
+
229
+ export { LineChart };
230
+ //# sourceMappingURL=chunk-2Z722V5K.js.map
231
+ //# sourceMappingURL=chunk-2Z722V5K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/LineChart/LineChart.variants.ts","../src/components/data-display/LineChart/LineChart.tsx"],"names":["data","props","RechartsLineChart"],"mappings":"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","file":"chunk-2Z722V5K.js","sourcesContent":["// LineChart/LineChart.variants.ts\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * LineChart style variants using CVA\n *\n * Controls the line appearance and chart styling.\n *\n * @see https://cva.style/docs\n */\nexport const lineChartVariants = cva(\n // Base styles (always applied)\n \"\",\n {\n variants: {\n variant: {\n default: \"\",\n dashed: \"\",\n dotted: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Line stroke dash array configuration by variant\n */\nexport const lineStrokeDashArray: Record<string, string | undefined> = {\n default: undefined,\n dashed: \"5 5\",\n dotted: \"2 2\",\n}\n\n/**\n * Line curve type configuration\n */\nexport const curveTypes = {\n linear: \"linear\",\n monotone: \"monotone\",\n step: \"step\",\n stepAfter: \"stepAfter\",\n stepBefore: \"stepBefore\",\n natural: \"natural\",\n} as const\n\nexport type CurveType = keyof typeof curveTypes\n\n// Export variant prop types\nexport type LineChartVariantProps = VariantProps<typeof lineChartVariants>\n","\"use client\"\n\nimport type {\n LineChartProps,\n LineChartSeriesConfig,\n} from \"./LineChart.types\"\n\nimport * as React from \"react\"\nimport {\n CartesianGrid,\n Label,\n Line,\n LineChart as RechartsLineChart,\n XAxis,\n YAxis,\n} from \"recharts\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n ChartContainer,\n ChartLegend,\n ChartLegendContent,\n ChartTooltip,\n ChartTooltipContent,\n} from \"../Chart\"\nimport { lineStrokeDashArray } from \"./LineChart.variants\"\n\n/**\n * Normalize series to LineChartSeriesConfig format\n */\nfunction normalizeSeriesConfig(\n series: (LineChartSeriesConfig | string)[]\n): LineChartSeriesConfig[] {\n return series.map((s) =>\n typeof s === \"string\" ? { dataKey: s } : s\n )\n}\n\n/**\n * Get stroke dash array based on variant\n */\nfunction getVariantStrokeDasharray(variant: LineChartProps[\"variant\"]): string | undefined {\n return lineStrokeDashArray[variant ?? \"default\"]\n}\n\n/**\n * LineChart - Data visualization component for trends and time series\n *\n * Connects data points with lines, ideal for showing trends and changes\n * over a continuous axis (usually time). Supports multiple series for\n * comparison.\n *\n * @example\n * ```tsx\n * const data = [\n * { month: \"Jan\", desktop: 186, mobile: 80 },\n * { month: \"Feb\", desktop: 305, mobile: 200 },\n * ]\n *\n * const config = {\n * desktop: { label: \"Desktop\", color: \"hsl(var(--chart-1))\" },\n * mobile: { label: \"Mobile\", color: \"hsl(var(--chart-2))\" },\n * }\n *\n * <LineChart\n * data={data}\n * config={config}\n * xAxisKey=\"month\"\n * series={[\"desktop\", \"mobile\"]}\n * />\n * ```\n */\nexport function LineChart({\n activeDot = { r: 6 },\n allowDecimals = true,\n ariaLabel,\n autoMinValue = false,\n className,\n config,\n connectNulls = false,\n customTooltip,\n curveType = \"monotone\",\n data,\n dot = false,\n enableLegendSlider = false,\n gridDashArray = \"3 3\",\n intervalType,\n legendPosition = \"bottom\",\n maxValue,\n minValue,\n onValueChange,\n series,\n showGrid = true,\n showLegend = false,\n showTooltip = true,\n showXAxis = true,\n showYAxis = true,\n startEndOnly = false,\n strokeWidth = 2,\n tickGap,\n tooltipCallback,\n tooltipIndicator = \"dot\",\n variant = \"default\",\n xAxisLabel,\n xAxisKey,\n xAxisTickFormatter,\n yAxisLabel,\n yAxisTickFormatter,\n yAxisWidth,\n ...props\n}: LineChartProps) {\n const normalizedSeries = normalizeSeriesConfig(series)\n const variantStrokeDasharray = getVariantStrokeDasharray(variant)\n const prevTooltipStateRef = React.useRef<boolean>(false)\n\n // Handle dot click for onValueChange\n const handleDotClick = React.useCallback(\n (dataKey: string) => (data: { payload: Record<string, unknown> }) => {\n if (!onValueChange) return\n const payload = data.payload\n const value = payload[dataKey]\n onValueChange({\n category: payload[xAxisKey],\n dataKey,\n payload,\n value: typeof value === \"number\" ? value : 0,\n })\n },\n [onValueChange, xAxisKey]\n )\n\n /* eslint-disable react-hooks/static-components, @eslint-react/no-nested-component-definitions, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access -- Intentional: memoized render function with Recharts any-typed props */\n // Custom tooltip content wrapper for tooltipCallback\n const TooltipContentWithCallback = React.useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (props: any) => {\n const { active = false, label, payload } = props\n\n // Call tooltipCallback when state changes\n if (tooltipCallback && active !== prevTooltipStateRef.current) {\n prevTooltipStateRef.current = active\n tooltipCallback({\n active,\n label,\n payload: payload?.map((p: { dataKey: number | string; payload: Record<string, unknown>; value: number; }) => ({\n dataKey: String(p.dataKey),\n value: p.value,\n payload: p.payload,\n })),\n })\n }\n\n return <ChartTooltipContent indicator={tooltipIndicator} {...props} />\n },\n [tooltipCallback, tooltipIndicator]\n )\n\n // Calculate Y-axis domain\n const yDomain = React.useMemo(() => {\n const min = minValue ?? (autoMinValue ? \"auto\" : 0)\n const max = maxValue ?? \"auto\"\n return [min, max] as const\n }, [autoMinValue, maxValue, minValue])\n\n // Calculate X-axis ticks for startEndOnly\n const xAxisTicks = React.useMemo(() => {\n if (!startEndOnly || data.length < 2) return\n const first = data[0]\n const last = data[data.length - 1]\n if (!first || !last) return\n return [first[xAxisKey], last[xAxisKey]] as string[]\n }, [data, startEndOnly, xAxisKey])\n\n return (\n <div\n aria-label={ariaLabel}\n data-slot=\"line-chart\"\n role={ariaLabel ? \"img\" : undefined}\n {...props}\n >\n <ChartContainer\n className={cn(className)}\n config={config}\n >\n <RechartsLineChart\n accessibilityLayer\n data={data}\n margin={{ left: xAxisLabel ? 20 : 12, right: 12, bottom: yAxisLabel ? 20 : 0 }}\n >\n {showGrid && (\n <CartesianGrid strokeDasharray={gridDashArray} vertical={false} />\n )}\n\n {showXAxis && (\n <XAxis\n axisLine={false}\n dataKey={xAxisKey}\n interval={intervalType}\n minTickGap={tickGap}\n tickFormatter={xAxisTickFormatter}\n tickLine={false}\n tickMargin={8}\n ticks={xAxisTicks}\n >\n {xAxisLabel && (\n <Label offset={-5} position=\"insideBottom\" value={xAxisLabel} />\n )}\n </XAxis>\n )}\n\n {showYAxis && (\n <YAxis\n allowDecimals={allowDecimals}\n axisLine={false}\n domain={yDomain}\n tickFormatter={yAxisTickFormatter}\n tickLine={false}\n tickMargin={8}\n width={yAxisWidth}\n >\n {yAxisLabel && (\n <Label angle={-90} offset={-5} position=\"insideLeft\" value={yAxisLabel} />\n )}\n </YAxis>\n )}\n\n {showTooltip && (\n <ChartTooltip\n content={\n customTooltip\n ?? (tooltipCallback\n ? <TooltipContentWithCallback />\n : <ChartTooltipContent indicator={tooltipIndicator} />)\n }\n cursor={false}\n />\n )}\n\n {showLegend && (\n <ChartLegend\n align={legendPosition === \"left\" ? \"left\" : legendPosition === \"right\" ? \"right\" : \"center\"}\n content={<ChartLegendContent enableSlider={enableLegendSlider} />}\n layout={legendPosition === \"left\" || legendPosition === \"right\" ? \"vertical\" : \"horizontal\"}\n verticalAlign={legendPosition === \"top\" ? \"top\" : legendPosition === \"bottom\" ? \"bottom\" : \"middle\"}\n />\n )}\n\n {normalizedSeries.map((seriesConfig) => {\n const {\n activeDot: seriesActiveDot,\n dataKey,\n dot: seriesDot,\n strokeDasharray: seriesStrokeDasharray,\n strokeOpacity,\n strokeWidth: seriesStrokeWidth,\n } = seriesConfig\n\n const stroke = `var(--color-${dataKey})`\n const finalStrokeDasharray = seriesStrokeDasharray ?? variantStrokeDasharray\n const finalDot = seriesDot ?? dot\n const finalStrokeWidth = seriesStrokeWidth ?? strokeWidth\n\n // Merge activeDot config with click handler\n const baseActiveDot = seriesActiveDot ?? activeDot\n const finalActiveDot = onValueChange\n ? typeof baseActiveDot === \"object\"\n ? { ...baseActiveDot, onClick: handleDotClick(dataKey), style: { cursor: \"pointer\" } }\n : !baseActiveDot\n ? false\n : { r: 6, onClick: handleDotClick(dataKey), style: { cursor: \"pointer\" } }\n : baseActiveDot\n\n return (\n <Line\n key={dataKey}\n activeDot={finalActiveDot}\n connectNulls={connectNulls}\n dataKey={dataKey}\n dot={finalDot}\n stroke={stroke}\n strokeDasharray={finalStrokeDasharray}\n strokeOpacity={strokeOpacity}\n strokeWidth={finalStrokeWidth}\n type={curveType}\n />\n )\n })}\n </RechartsLineChart>\n </ChartContainer>\n </div>\n )\n}\n\nLineChart.displayName = \"LineChart\"\n"]}