@iclips/ui 1.4.12 → 2.0.0

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 (686) hide show
  1. package/LICENSE +21 -0
  2. package/MIGRATION-v2.md +214 -0
  3. package/README.md +106 -0
  4. package/dist/alert-theme.css +94 -0
  5. package/dist/assets/illustrations/announcements.png.cjs +2 -0
  6. package/dist/assets/illustrations/announcements.png.cjs.map +1 -0
  7. package/dist/assets/illustrations/announcements.png.js +5 -0
  8. package/dist/assets/illustrations/announcements.png.js.map +1 -0
  9. package/dist/assets/illustrations/checklist-approved.png.cjs +2 -0
  10. package/dist/assets/illustrations/checklist-approved.png.cjs.map +1 -0
  11. package/dist/assets/illustrations/checklist-approved.png.js +5 -0
  12. package/dist/assets/illustrations/checklist-approved.png.js.map +1 -0
  13. package/dist/assets/illustrations/client-profile.png.cjs +2 -0
  14. package/dist/assets/illustrations/client-profile.png.cjs.map +1 -0
  15. package/dist/assets/illustrations/client-profile.png.js +5 -0
  16. package/dist/assets/illustrations/client-profile.png.js.map +1 -0
  17. package/dist/assets/illustrations/contract-agreement.png.cjs +2 -0
  18. package/dist/assets/illustrations/contract-agreement.png.cjs.map +1 -0
  19. package/dist/assets/illustrations/contract-agreement.png.js +5 -0
  20. package/dist/assets/illustrations/contract-agreement.png.js.map +1 -0
  21. package/dist/assets/illustrations/create-record.png.cjs +2 -0
  22. package/dist/assets/illustrations/create-record.png.cjs.map +1 -0
  23. package/dist/assets/illustrations/create-record.png.js +5 -0
  24. package/dist/assets/illustrations/create-record.png.js.map +1 -0
  25. package/dist/assets/illustrations/cta-action.png.cjs +2 -0
  26. package/dist/assets/illustrations/cta-action.png.cjs.map +1 -0
  27. package/dist/assets/illustrations/cta-action.png.js +5 -0
  28. package/dist/assets/illustrations/cta-action.png.js.map +1 -0
  29. package/dist/assets/illustrations/draft-document.png.cjs +2 -0
  30. package/dist/assets/illustrations/draft-document.png.cjs.map +1 -0
  31. package/dist/assets/illustrations/draft-document.png.js +5 -0
  32. package/dist/assets/illustrations/draft-document.png.js.map +1 -0
  33. package/dist/assets/illustrations/edit-company.png.cjs +2 -0
  34. package/dist/assets/illustrations/edit-company.png.cjs.map +1 -0
  35. package/dist/assets/illustrations/edit-company.png.js +5 -0
  36. package/dist/assets/illustrations/edit-company.png.js.map +1 -0
  37. package/dist/assets/illustrations/edit-document.png.cjs +2 -0
  38. package/dist/assets/illustrations/edit-document.png.cjs.map +1 -0
  39. package/dist/assets/illustrations/edit-document.png.js +5 -0
  40. package/dist/assets/illustrations/edit-document.png.js.map +1 -0
  41. package/dist/assets/illustrations/empty-no-results.png.cjs +2 -0
  42. package/dist/assets/illustrations/empty-no-results.png.cjs.map +1 -0
  43. package/dist/assets/illustrations/empty-no-results.png.js +5 -0
  44. package/dist/assets/illustrations/empty-no-results.png.js.map +1 -0
  45. package/dist/assets/illustrations/empty-not-found.png.cjs +2 -0
  46. package/dist/assets/illustrations/empty-not-found.png.cjs.map +1 -0
  47. package/dist/assets/illustrations/empty-not-found.png.js +5 -0
  48. package/dist/assets/illustrations/empty-not-found.png.js.map +1 -0
  49. package/dist/assets/illustrations/empty-task-approved.png.cjs +2 -0
  50. package/dist/assets/illustrations/empty-task-approved.png.cjs.map +1 -0
  51. package/dist/assets/illustrations/empty-task-approved.png.js +5 -0
  52. package/dist/assets/illustrations/empty-task-approved.png.js.map +1 -0
  53. package/dist/assets/illustrations/empty-workflow-status.png.cjs +2 -0
  54. package/dist/assets/illustrations/empty-workflow-status.png.cjs.map +1 -0
  55. package/dist/assets/illustrations/empty-workflow-status.png.js +5 -0
  56. package/dist/assets/illustrations/empty-workflow-status.png.js.map +1 -0
  57. package/dist/assets/illustrations/integrations.png.cjs +2 -0
  58. package/dist/assets/illustrations/integrations.png.cjs.map +1 -0
  59. package/dist/assets/illustrations/integrations.png.js +5 -0
  60. package/dist/assets/illustrations/integrations.png.js.map +1 -0
  61. package/dist/assets/illustrations/onboarding-tips.png.cjs +2 -0
  62. package/dist/assets/illustrations/onboarding-tips.png.cjs.map +1 -0
  63. package/dist/assets/illustrations/onboarding-tips.png.js +5 -0
  64. package/dist/assets/illustrations/onboarding-tips.png.js.map +1 -0
  65. package/dist/assets/illustrations/scheduled-tasks.png.cjs +2 -0
  66. package/dist/assets/illustrations/scheduled-tasks.png.cjs.map +1 -0
  67. package/dist/assets/illustrations/scheduled-tasks.png.js +5 -0
  68. package/dist/assets/illustrations/scheduled-tasks.png.js.map +1 -0
  69. package/dist/assets/illustrations/search-documents.png.cjs +2 -0
  70. package/dist/assets/illustrations/search-documents.png.cjs.map +1 -0
  71. package/dist/assets/illustrations/search-documents.png.js +5 -0
  72. package/dist/assets/illustrations/search-documents.png.js.map +1 -0
  73. package/dist/assets/illustrations/success-checkmark.png.cjs +2 -0
  74. package/dist/assets/illustrations/success-checkmark.png.cjs.map +1 -0
  75. package/dist/assets/illustrations/success-checkmark.png.js +5 -0
  76. package/dist/assets/illustrations/success-checkmark.png.js.map +1 -0
  77. package/dist/components/ui/brand-colors.cjs +2 -0
  78. package/dist/components/ui/brand-colors.cjs.map +1 -0
  79. package/dist/components/ui/brand-colors.js +8 -0
  80. package/dist/components/ui/brand-colors.js.map +1 -0
  81. package/dist/components/ui/charts/chart.cjs +8 -0
  82. package/dist/components/ui/charts/chart.cjs.map +1 -0
  83. package/dist/components/ui/charts/chart.js +214 -0
  84. package/dist/components/ui/charts/chart.js.map +1 -0
  85. package/dist/components/ui/charts/donut-chart.cjs +2 -0
  86. package/dist/components/ui/charts/donut-chart.cjs.map +1 -0
  87. package/dist/components/ui/charts/donut-chart.js +285 -0
  88. package/dist/components/ui/charts/donut-chart.js.map +1 -0
  89. package/dist/components/ui/charts/kpi-card.cjs +2 -0
  90. package/dist/components/ui/charts/kpi-card.cjs.map +1 -0
  91. package/dist/components/ui/charts/kpi-card.js +71 -0
  92. package/dist/components/ui/charts/kpi-card.js.map +1 -0
  93. package/dist/components/ui/data/advanced-data-table.cjs +2 -0
  94. package/dist/components/ui/data/advanced-data-table.cjs.map +1 -0
  95. package/dist/components/ui/data/advanced-data-table.js +69 -0
  96. package/dist/components/ui/data/advanced-data-table.js.map +1 -0
  97. package/dist/components/ui/data/comment-system.cjs +2 -0
  98. package/dist/components/ui/data/comment-system.cjs.map +1 -0
  99. package/dist/components/ui/data/comment-system.js +492 -0
  100. package/dist/components/ui/data/comment-system.js.map +1 -0
  101. package/dist/components/ui/data/data-table-empty-state.cjs +2 -0
  102. package/dist/components/ui/data/data-table-empty-state.cjs.map +1 -0
  103. package/dist/components/ui/data/data-table-empty-state.js +40 -0
  104. package/dist/components/ui/data/data-table-empty-state.js.map +1 -0
  105. package/dist/components/ui/data/data-table-toolbar.cjs +2 -0
  106. package/dist/components/ui/data/data-table-toolbar.cjs.map +1 -0
  107. package/dist/components/ui/data/data-table-toolbar.js +85 -0
  108. package/dist/components/ui/data/data-table-toolbar.js.map +1 -0
  109. package/dist/components/ui/data/data-table.cjs +2 -0
  110. package/dist/components/ui/data/data-table.cjs.map +1 -0
  111. package/dist/components/ui/data/data-table.js +181 -0
  112. package/dist/components/ui/data/data-table.js.map +1 -0
  113. package/dist/components/ui/data/document-editor.cjs +2 -0
  114. package/dist/components/ui/data/document-editor.cjs.map +1 -0
  115. package/dist/components/ui/data/document-editor.js +158 -0
  116. package/dist/components/ui/data/document-editor.js.map +1 -0
  117. package/dist/components/ui/data/editorial-calendar.cjs +2 -0
  118. package/dist/components/ui/data/editorial-calendar.cjs.map +1 -0
  119. package/dist/components/ui/data/editorial-calendar.js +840 -0
  120. package/dist/components/ui/data/editorial-calendar.js.map +1 -0
  121. package/dist/components/ui/data/filter-bar.cjs +2 -0
  122. package/dist/components/ui/data/filter-bar.cjs.map +1 -0
  123. package/dist/components/ui/data/filter-bar.js +60 -0
  124. package/dist/components/ui/data/filter-bar.js.map +1 -0
  125. package/dist/components/ui/data/filter-builder.cjs +2 -0
  126. package/dist/components/ui/data/filter-builder.cjs.map +1 -0
  127. package/dist/components/ui/data/filter-builder.js +378 -0
  128. package/dist/components/ui/data/filter-builder.js.map +1 -0
  129. package/dist/components/ui/data/filter-chip.cjs +2 -0
  130. package/dist/components/ui/data/filter-chip.cjs.map +1 -0
  131. package/dist/components/ui/data/filter-chip.js +39 -0
  132. package/dist/components/ui/data/filter-chip.js.map +1 -0
  133. package/dist/components/ui/data/mention-list.cjs +2 -0
  134. package/dist/components/ui/data/mention-list.cjs.map +1 -0
  135. package/dist/components/ui/data/mention-list.js +46 -0
  136. package/dist/components/ui/data/mention-list.js.map +1 -0
  137. package/dist/components/ui/data/table-pagination.cjs +2 -0
  138. package/dist/components/ui/data/table-pagination.cjs.map +1 -0
  139. package/dist/components/ui/data/table-pagination.js +176 -0
  140. package/dist/components/ui/data/table-pagination.js.map +1 -0
  141. package/dist/components/ui/data/table-types.cjs +2 -0
  142. package/dist/components/ui/data/table-types.cjs.map +1 -0
  143. package/dist/components/ui/data/table-types.js +14 -0
  144. package/dist/components/ui/data/table-types.js.map +1 -0
  145. package/dist/components/ui/data/table.cjs +2 -0
  146. package/dist/components/ui/data/table.cjs.map +1 -0
  147. package/dist/components/ui/data/table.js +130 -0
  148. package/dist/components/ui/data/table.js.map +1 -0
  149. package/dist/components/ui/feedback/alert.cjs +2 -0
  150. package/dist/components/ui/feedback/alert.cjs.map +1 -0
  151. package/dist/components/ui/feedback/alert.js +67 -0
  152. package/dist/components/ui/feedback/alert.js.map +1 -0
  153. package/dist/components/ui/feedback/empty-state.cjs +2 -0
  154. package/dist/components/ui/feedback/empty-state.cjs.map +1 -0
  155. package/dist/components/ui/feedback/empty-state.js +78 -0
  156. package/dist/components/ui/feedback/empty-state.js.map +1 -0
  157. package/dist/components/ui/feedback/illustrations.cjs +2 -0
  158. package/dist/components/ui/feedback/illustrations.cjs.map +1 -0
  159. package/dist/components/ui/feedback/illustrations.js +157 -0
  160. package/dist/components/ui/feedback/illustrations.js.map +1 -0
  161. package/dist/components/ui/feedback/toast.cjs +2 -0
  162. package/dist/components/ui/feedback/toast.cjs.map +1 -0
  163. package/dist/components/ui/feedback/toast.js +38 -0
  164. package/dist/components/ui/feedback/toast.js.map +1 -0
  165. package/dist/components/ui/forms/calendar.cjs +2 -0
  166. package/dist/components/ui/forms/calendar.cjs.map +1 -0
  167. package/dist/components/ui/forms/calendar.js +65 -0
  168. package/dist/components/ui/forms/calendar.js.map +1 -0
  169. package/dist/components/ui/forms/checkbox.cjs +2 -0
  170. package/dist/components/ui/forms/checkbox.cjs.map +1 -0
  171. package/dist/components/ui/forms/checkbox.js +31 -0
  172. package/dist/components/ui/forms/checkbox.js.map +1 -0
  173. package/dist/components/ui/forms/color-picker.cjs +2 -0
  174. package/dist/components/ui/forms/color-picker.cjs.map +1 -0
  175. package/dist/components/ui/forms/color-picker.js +151 -0
  176. package/dist/components/ui/forms/color-picker.js.map +1 -0
  177. package/dist/components/ui/forms/combobox.cjs +2 -0
  178. package/dist/components/ui/forms/combobox.cjs.map +1 -0
  179. package/dist/components/ui/forms/combobox.js +208 -0
  180. package/dist/components/ui/forms/combobox.js.map +1 -0
  181. package/dist/components/ui/forms/currency-input.cjs +2 -0
  182. package/dist/components/ui/forms/currency-input.cjs.map +1 -0
  183. package/dist/components/ui/forms/currency-input.js +81 -0
  184. package/dist/components/ui/forms/currency-input.js.map +1 -0
  185. package/dist/components/ui/forms/date-picker.cjs +2 -0
  186. package/dist/components/ui/forms/date-picker.cjs.map +1 -0
  187. package/dist/components/ui/forms/date-picker.js +197 -0
  188. package/dist/components/ui/forms/date-picker.js.map +1 -0
  189. package/dist/components/ui/forms/date-range-picker.cjs +2 -0
  190. package/dist/components/ui/forms/date-range-picker.cjs.map +1 -0
  191. package/dist/components/ui/forms/date-range-picker.js +303 -0
  192. package/dist/components/ui/forms/date-range-picker.js.map +1 -0
  193. package/dist/components/ui/forms/editable-badge.cjs +2 -0
  194. package/dist/components/ui/forms/editable-badge.cjs.map +1 -0
  195. package/dist/components/ui/forms/editable-badge.js +137 -0
  196. package/dist/components/ui/forms/editable-badge.js.map +1 -0
  197. package/dist/components/ui/forms/file-attachment-list.cjs +2 -0
  198. package/dist/components/ui/forms/file-attachment-list.cjs.map +1 -0
  199. package/dist/components/ui/forms/file-attachment-list.js +235 -0
  200. package/dist/components/ui/forms/file-attachment-list.js.map +1 -0
  201. package/dist/components/ui/forms/file-upload-zone.cjs +3 -0
  202. package/dist/components/ui/forms/file-upload-zone.cjs.map +1 -0
  203. package/dist/components/ui/forms/file-upload-zone.js +142 -0
  204. package/dist/components/ui/forms/file-upload-zone.js.map +1 -0
  205. package/dist/components/ui/forms/form.cjs +2 -0
  206. package/dist/components/ui/forms/form.cjs.map +1 -0
  207. package/dist/components/ui/forms/form.js +109 -0
  208. package/dist/components/ui/forms/form.js.map +1 -0
  209. package/dist/components/ui/forms/input-group.cjs +2 -0
  210. package/dist/components/ui/forms/input-group.cjs.map +1 -0
  211. package/dist/components/ui/forms/input-group.js +131 -0
  212. package/dist/components/ui/forms/input-group.js.map +1 -0
  213. package/dist/components/ui/forms/input-otp.cjs +2 -0
  214. package/dist/components/ui/forms/input-otp.cjs.map +1 -0
  215. package/dist/components/ui/forms/input-otp.js +63 -0
  216. package/dist/components/ui/forms/input-otp.js.map +1 -0
  217. package/dist/components/ui/forms/input-validation.cjs +2 -0
  218. package/dist/components/ui/forms/input-validation.cjs.map +1 -0
  219. package/dist/components/ui/forms/input-validation.js +55 -0
  220. package/dist/components/ui/forms/input-validation.js.map +1 -0
  221. package/dist/components/ui/forms/input.cjs +2 -0
  222. package/dist/components/ui/forms/input.cjs.map +1 -0
  223. package/dist/components/ui/forms/input.js +26 -0
  224. package/dist/components/ui/forms/input.js.map +1 -0
  225. package/dist/components/ui/forms/month-range-picker.cjs +2 -0
  226. package/dist/components/ui/forms/month-range-picker.cjs.map +1 -0
  227. package/dist/components/ui/forms/month-range-picker.js +261 -0
  228. package/dist/components/ui/forms/month-range-picker.js.map +1 -0
  229. package/dist/components/ui/forms/multi-select.cjs +2 -0
  230. package/dist/components/ui/forms/multi-select.cjs.map +1 -0
  231. package/dist/components/ui/forms/multi-select.js +251 -0
  232. package/dist/components/ui/forms/multi-select.js.map +1 -0
  233. package/dist/components/ui/forms/number-input.cjs +2 -0
  234. package/dist/components/ui/forms/number-input.cjs.map +1 -0
  235. package/dist/components/ui/forms/number-input.js +220 -0
  236. package/dist/components/ui/forms/number-input.js.map +1 -0
  237. package/dist/components/ui/forms/password-input.cjs +2 -0
  238. package/dist/components/ui/forms/password-input.cjs.map +1 -0
  239. package/dist/components/ui/forms/password-input.js +43 -0
  240. package/dist/components/ui/forms/password-input.js.map +1 -0
  241. package/dist/components/ui/forms/radio-group.cjs +2 -0
  242. package/dist/components/ui/forms/radio-group.cjs.map +1 -0
  243. package/dist/components/ui/forms/radio-group.js +41 -0
  244. package/dist/components/ui/forms/radio-group.js.map +1 -0
  245. package/dist/components/ui/forms/select.cjs +2 -0
  246. package/dist/components/ui/forms/select.cjs.map +1 -0
  247. package/dist/components/ui/forms/select.js +140 -0
  248. package/dist/components/ui/forms/select.js.map +1 -0
  249. package/dist/components/ui/forms/slider.cjs +2 -0
  250. package/dist/components/ui/forms/slider.cjs.map +1 -0
  251. package/dist/components/ui/forms/slider.js +62 -0
  252. package/dist/components/ui/forms/slider.js.map +1 -0
  253. package/dist/components/ui/forms/social-button.cjs +2 -0
  254. package/dist/components/ui/forms/social-button.cjs.map +1 -0
  255. package/dist/components/ui/forms/social-button.js +86 -0
  256. package/dist/components/ui/forms/social-button.js.map +1 -0
  257. package/dist/components/ui/forms/switch.cjs +2 -0
  258. package/dist/components/ui/forms/switch.cjs.map +1 -0
  259. package/dist/components/ui/forms/switch.js +31 -0
  260. package/dist/components/ui/forms/switch.js.map +1 -0
  261. package/dist/components/ui/forms/textarea.cjs +2 -0
  262. package/dist/components/ui/forms/textarea.cjs.map +1 -0
  263. package/dist/components/ui/forms/textarea.js +22 -0
  264. package/dist/components/ui/forms/textarea.js.map +1 -0
  265. package/dist/components/ui/forms/time-picker.cjs +2 -0
  266. package/dist/components/ui/forms/time-picker.cjs.map +1 -0
  267. package/dist/components/ui/forms/time-picker.js +195 -0
  268. package/dist/components/ui/forms/time-picker.js.map +1 -0
  269. package/dist/components/ui/forms/toggle-group.cjs +2 -0
  270. package/dist/components/ui/forms/toggle-group.cjs.map +1 -0
  271. package/dist/components/ui/forms/toggle-group.js +53 -0
  272. package/dist/components/ui/forms/toggle-group.js.map +1 -0
  273. package/dist/components/ui/forms/toggle.cjs +2 -0
  274. package/dist/components/ui/forms/toggle.cjs.map +1 -0
  275. package/dist/components/ui/forms/toggle.js +40 -0
  276. package/dist/components/ui/forms/toggle.js.map +1 -0
  277. package/dist/components/ui/layout/accordion.cjs +2 -0
  278. package/dist/components/ui/layout/accordion.cjs.map +1 -0
  279. package/dist/components/ui/layout/accordion.js +53 -0
  280. package/dist/components/ui/layout/accordion.js.map +1 -0
  281. package/dist/components/ui/layout/auth-layout.cjs +2 -0
  282. package/dist/components/ui/layout/auth-layout.cjs.map +1 -0
  283. package/dist/components/ui/layout/auth-layout.js +74 -0
  284. package/dist/components/ui/layout/auth-layout.js.map +1 -0
  285. package/dist/components/ui/layout/card.cjs +2 -0
  286. package/dist/components/ui/layout/card.cjs.map +1 -0
  287. package/dist/components/ui/layout/card.js +104 -0
  288. package/dist/components/ui/layout/card.js.map +1 -0
  289. package/dist/components/ui/layout/carousel.cjs +2 -0
  290. package/dist/components/ui/layout/carousel.cjs.map +1 -0
  291. package/dist/components/ui/layout/carousel.js +189 -0
  292. package/dist/components/ui/layout/carousel.js.map +1 -0
  293. package/dist/components/ui/layout/collapsible.cjs +2 -0
  294. package/dist/components/ui/layout/collapsible.cjs.map +1 -0
  295. package/dist/components/ui/layout/collapsible.js +30 -0
  296. package/dist/components/ui/layout/collapsible.js.map +1 -0
  297. package/dist/components/ui/layout/page-header.cjs +2 -0
  298. package/dist/components/ui/layout/page-header.cjs.map +1 -0
  299. package/dist/components/ui/layout/page-header.js +81 -0
  300. package/dist/components/ui/layout/page-header.js.map +1 -0
  301. package/dist/components/ui/layout/resizable.cjs +2 -0
  302. package/dist/components/ui/layout/resizable.cjs.map +1 -0
  303. package/dist/components/ui/layout/resizable.js +45 -0
  304. package/dist/components/ui/layout/resizable.js.map +1 -0
  305. package/dist/components/ui/layout/scroll-area.cjs +2 -0
  306. package/dist/components/ui/layout/scroll-area.cjs.map +1 -0
  307. package/dist/components/ui/layout/scroll-area.js +56 -0
  308. package/dist/components/ui/layout/scroll-area.js.map +1 -0
  309. package/dist/components/ui/navigation/breadcrumb.cjs +2 -0
  310. package/dist/components/ui/navigation/breadcrumb.cjs.map +1 -0
  311. package/dist/components/ui/navigation/breadcrumb.js +94 -0
  312. package/dist/components/ui/navigation/breadcrumb.js.map +1 -0
  313. package/dist/components/ui/navigation/navigation-menu.cjs +2 -0
  314. package/dist/components/ui/navigation/navigation-menu.cjs.map +1 -0
  315. package/dist/components/ui/navigation/navigation-menu.js +144 -0
  316. package/dist/components/ui/navigation/navigation-menu.js.map +1 -0
  317. package/dist/components/ui/navigation/pagination.cjs +2 -0
  318. package/dist/components/ui/navigation/pagination.cjs.map +1 -0
  319. package/dist/components/ui/navigation/pagination.js +106 -0
  320. package/dist/components/ui/navigation/pagination.js.map +1 -0
  321. package/dist/components/ui/navigation/sidebar.cjs +2 -0
  322. package/dist/components/ui/navigation/sidebar.cjs.map +1 -0
  323. package/dist/components/ui/navigation/sidebar.js +579 -0
  324. package/dist/components/ui/navigation/sidebar.js.map +1 -0
  325. package/dist/components/ui/navigation/tabs.cjs +2 -0
  326. package/dist/components/ui/navigation/tabs.cjs.map +1 -0
  327. package/dist/components/ui/navigation/tabs.js +58 -0
  328. package/dist/components/ui/navigation/tabs.js.map +1 -0
  329. package/dist/components/ui/navigation/underline-tabs.cjs +2 -0
  330. package/dist/components/ui/navigation/underline-tabs.cjs.map +1 -0
  331. package/dist/components/ui/navigation/underline-tabs.js +109 -0
  332. package/dist/components/ui/navigation/underline-tabs.js.map +1 -0
  333. package/dist/components/ui/overlays/alert-dialog.cjs +2 -0
  334. package/dist/components/ui/overlays/alert-dialog.cjs.map +1 -0
  335. package/dist/components/ui/overlays/alert-dialog.js +135 -0
  336. package/dist/components/ui/overlays/alert-dialog.js.map +1 -0
  337. package/dist/components/ui/overlays/command.cjs +2 -0
  338. package/dist/components/ui/overlays/command.cjs.map +1 -0
  339. package/dist/components/ui/overlays/command.js +143 -0
  340. package/dist/components/ui/overlays/command.js.map +1 -0
  341. package/dist/components/ui/overlays/context-menu.cjs +2 -0
  342. package/dist/components/ui/overlays/context-menu.cjs.map +1 -0
  343. package/dist/components/ui/overlays/context-menu.js +197 -0
  344. package/dist/components/ui/overlays/context-menu.js.map +1 -0
  345. package/dist/components/ui/overlays/dialog.cjs +2 -0
  346. package/dist/components/ui/overlays/dialog.cjs.map +1 -0
  347. package/dist/components/ui/overlays/dialog.js +112 -0
  348. package/dist/components/ui/overlays/dialog.js.map +1 -0
  349. package/dist/components/ui/overlays/drawer.cjs +2 -0
  350. package/dist/components/ui/overlays/drawer.cjs.map +1 -0
  351. package/dist/components/ui/overlays/drawer.js +109 -0
  352. package/dist/components/ui/overlays/drawer.js.map +1 -0
  353. package/dist/components/ui/overlays/dropdown-menu.cjs +2 -0
  354. package/dist/components/ui/overlays/dropdown-menu.cjs.map +1 -0
  355. package/dist/components/ui/overlays/dropdown-menu.js +198 -0
  356. package/dist/components/ui/overlays/dropdown-menu.js.map +1 -0
  357. package/dist/components/ui/overlays/hover-card.cjs +2 -0
  358. package/dist/components/ui/overlays/hover-card.cjs.map +1 -0
  359. package/dist/components/ui/overlays/hover-card.js +40 -0
  360. package/dist/components/ui/overlays/hover-card.js.map +1 -0
  361. package/dist/components/ui/overlays/menubar.cjs +2 -0
  362. package/dist/components/ui/overlays/menubar.cjs.map +1 -0
  363. package/dist/components/ui/overlays/menubar.js +213 -0
  364. package/dist/components/ui/overlays/menubar.js.map +1 -0
  365. package/dist/components/ui/overlays/popover.cjs +2 -0
  366. package/dist/components/ui/overlays/popover.cjs.map +1 -0
  367. package/dist/components/ui/overlays/popover.js +36 -0
  368. package/dist/components/ui/overlays/popover.js.map +1 -0
  369. package/dist/components/ui/overlays/sheet.cjs +2 -0
  370. package/dist/components/ui/overlays/sheet.cjs.map +1 -0
  371. package/dist/components/ui/overlays/sheet.js +109 -0
  372. package/dist/components/ui/overlays/sheet.js.map +1 -0
  373. package/dist/components/ui/overlays/side-panel.cjs +16 -0
  374. package/dist/components/ui/overlays/side-panel.cjs.map +1 -0
  375. package/dist/components/ui/overlays/side-panel.js +117 -0
  376. package/dist/components/ui/overlays/side-panel.js.map +1 -0
  377. package/dist/components/ui/overlays/tooltip.cjs +2 -0
  378. package/dist/components/ui/overlays/tooltip.cjs.map +1 -0
  379. package/dist/components/ui/overlays/tooltip.js +50 -0
  380. package/dist/components/ui/overlays/tooltip.js.map +1 -0
  381. package/dist/components/ui/primitives/aspect-ratio.cjs +2 -0
  382. package/dist/components/ui/primitives/aspect-ratio.cjs.map +1 -0
  383. package/dist/components/ui/primitives/aspect-ratio.js +10 -0
  384. package/dist/components/ui/primitives/aspect-ratio.js.map +1 -0
  385. package/dist/components/ui/primitives/avatar.cjs +2 -0
  386. package/dist/components/ui/primitives/avatar.cjs.map +1 -0
  387. package/dist/components/ui/primitives/avatar.js +63 -0
  388. package/dist/components/ui/primitives/avatar.js.map +1 -0
  389. package/dist/components/ui/primitives/badge.cjs +2 -0
  390. package/dist/components/ui/primitives/badge.cjs.map +1 -0
  391. package/dist/components/ui/primitives/badge.js +50 -0
  392. package/dist/components/ui/primitives/badge.js.map +1 -0
  393. package/dist/components/ui/primitives/brand-logo.cjs +2 -0
  394. package/dist/components/ui/primitives/brand-logo.cjs.map +1 -0
  395. package/dist/components/ui/primitives/brand-logo.js +74 -0
  396. package/dist/components/ui/primitives/brand-logo.js.map +1 -0
  397. package/dist/components/ui/primitives/brand-logo.negative-paths.cjs +2 -0
  398. package/dist/components/ui/primitives/brand-logo.negative-paths.cjs.map +1 -0
  399. package/dist/components/ui/primitives/brand-logo.negative-paths.js +15 -0
  400. package/dist/components/ui/primitives/brand-logo.negative-paths.js.map +1 -0
  401. package/dist/components/ui/primitives/brand-logo.positive-paths.cjs +2 -0
  402. package/dist/components/ui/primitives/brand-logo.positive-paths.cjs.map +1 -0
  403. package/dist/components/ui/primitives/brand-logo.positive-paths.js +15 -0
  404. package/dist/components/ui/primitives/brand-logo.positive-paths.js.map +1 -0
  405. package/dist/components/ui/primitives/brand-logo.symbol-paths.cjs +2 -0
  406. package/dist/components/ui/primitives/brand-logo.symbol-paths.cjs.map +1 -0
  407. package/dist/components/ui/primitives/brand-logo.symbol-paths.js +8 -0
  408. package/dist/components/ui/primitives/brand-logo.symbol-paths.js.map +1 -0
  409. package/dist/components/ui/primitives/button.cjs +2 -0
  410. package/dist/components/ui/primitives/button.cjs.map +1 -0
  411. package/dist/components/ui/primitives/button.js +52 -0
  412. package/dist/components/ui/primitives/button.js.map +1 -0
  413. package/dist/components/ui/primitives/label.cjs +2 -0
  414. package/dist/components/ui/primitives/label.cjs.map +1 -0
  415. package/dist/components/ui/primitives/label.js +22 -0
  416. package/dist/components/ui/primitives/label.js.map +1 -0
  417. package/dist/components/ui/primitives/progress.cjs +2 -0
  418. package/dist/components/ui/primitives/progress.cjs.map +1 -0
  419. package/dist/components/ui/primitives/progress.js +30 -0
  420. package/dist/components/ui/primitives/progress.js.map +1 -0
  421. package/dist/components/ui/primitives/separator.cjs +2 -0
  422. package/dist/components/ui/primitives/separator.cjs.map +1 -0
  423. package/dist/components/ui/primitives/separator.js +26 -0
  424. package/dist/components/ui/primitives/separator.js.map +1 -0
  425. package/dist/components/ui/primitives/skeleton.cjs +2 -0
  426. package/dist/components/ui/primitives/skeleton.cjs.map +1 -0
  427. package/dist/components/ui/primitives/skeleton.js +31 -0
  428. package/dist/components/ui/primitives/skeleton.js.map +1 -0
  429. package/dist/components/ui/utils.cjs +2 -0
  430. package/dist/components/ui/utils.cjs.map +1 -0
  431. package/dist/components/ui/utils.js +20 -0
  432. package/dist/components/ui/utils.js.map +1 -0
  433. package/dist/editor.cjs +2 -0
  434. package/dist/editor.cjs.map +1 -0
  435. package/dist/editor.d.cts +114 -0
  436. package/dist/editor.d.ts +114 -0
  437. package/dist/editor.js +12 -0
  438. package/dist/editor.js.map +1 -0
  439. package/dist/hooks/use-data-table-filters.cjs +2 -0
  440. package/dist/hooks/use-data-table-filters.cjs.map +1 -0
  441. package/dist/hooks/use-data-table-filters.js +118 -0
  442. package/dist/hooks/use-data-table-filters.js.map +1 -0
  443. package/dist/hooks/use-data-table.cjs +2 -0
  444. package/dist/hooks/use-data-table.cjs.map +1 -0
  445. package/dist/hooks/use-data-table.js +84 -0
  446. package/dist/hooks/use-data-table.js.map +1 -0
  447. package/dist/hooks/use-mobile.cjs +2 -0
  448. package/dist/hooks/use-mobile.cjs.map +1 -0
  449. package/dist/hooks/use-mobile.js +17 -0
  450. package/dist/hooks/use-mobile.js.map +1 -0
  451. package/dist/hooks/use-table-pagination.cjs +2 -0
  452. package/dist/hooks/use-table-pagination.cjs.map +1 -0
  453. package/dist/hooks/use-table-pagination.js +44 -0
  454. package/dist/hooks/use-table-pagination.js.map +1 -0
  455. package/dist/index.cjs +1 -242
  456. package/dist/index.cjs.map +1 -1
  457. package/dist/index.css +1 -1
  458. package/dist/index.d.cts +2918 -0
  459. package/dist/index.d.ts +2918 -149
  460. package/dist/index.js +375 -63146
  461. package/dist/index.js.map +1 -1
  462. package/dist/preset.css +352 -0
  463. package/dist/toast-theme.css +100 -0
  464. package/dist/tokens.css +471 -0
  465. package/package.json +144 -45
  466. package/scripts/codemod-v2-renames.mjs +101 -0
  467. package/scripts/codemod-v2-toast.mjs +84 -0
  468. package/dist/components/figma/ImageWithFallback.d.ts +0 -3
  469. package/dist/components/figma/ImageWithFallback.d.ts.map +0 -1
  470. package/dist/components/print-templates/ContractTemplate.d.ts +0 -89
  471. package/dist/components/print-templates/ContractTemplate.d.ts.map +0 -1
  472. package/dist/components/print-templates/ProposalTemplate.d.ts +0 -41
  473. package/dist/components/print-templates/ProposalTemplate.d.ts.map +0 -1
  474. package/dist/components/print-templates/index.d.ts +0 -22
  475. package/dist/components/print-templates/index.d.ts.map +0 -1
  476. package/dist/components/print-templates/shared/PrintFooter.d.ts +0 -21
  477. package/dist/components/print-templates/shared/PrintFooter.d.ts.map +0 -1
  478. package/dist/components/print-templates/shared/PrintHeader.d.ts +0 -38
  479. package/dist/components/print-templates/shared/PrintHeader.d.ts.map +0 -1
  480. package/dist/components/print-templates/shared/PrintInfoGrid.d.ts +0 -22
  481. package/dist/components/print-templates/shared/PrintInfoGrid.d.ts.map +0 -1
  482. package/dist/components/print-templates/shared/PrintSection.d.ts +0 -29
  483. package/dist/components/print-templates/shared/PrintSection.d.ts.map +0 -1
  484. package/dist/components/print-templates/shared/PrintSignature.d.ts +0 -27
  485. package/dist/components/print-templates/shared/PrintSignature.d.ts.map +0 -1
  486. package/dist/components/print-templates/shared/PrintTable.d.ts +0 -44
  487. package/dist/components/print-templates/shared/PrintTable.d.ts.map +0 -1
  488. package/dist/components/timeline-demo.d.ts +0 -3
  489. package/dist/components/timeline-demo.d.ts.map +0 -1
  490. package/dist/components/ui/accordion.d.ts +0 -8
  491. package/dist/components/ui/accordion.d.ts.map +0 -1
  492. package/dist/components/ui/advanced-data-table.d.ts +0 -100
  493. package/dist/components/ui/advanced-data-table.d.ts.map +0 -1
  494. package/dist/components/ui/alert-dialog.d.ts +0 -15
  495. package/dist/components/ui/alert-dialog.d.ts.map +0 -1
  496. package/dist/components/ui/alert-toast.d.ts +0 -11
  497. package/dist/components/ui/alert-toast.d.ts.map +0 -1
  498. package/dist/components/ui/alert.d.ts +0 -10
  499. package/dist/components/ui/alert.d.ts.map +0 -1
  500. package/dist/components/ui/app-layout-primary-nav.d.ts +0 -30
  501. package/dist/components/ui/app-layout-primary-nav.d.ts.map +0 -1
  502. package/dist/components/ui/app-layout-secondary-nav.d.ts +0 -34
  503. package/dist/components/ui/app-layout-secondary-nav.d.ts.map +0 -1
  504. package/dist/components/ui/app-layout-user-menu.d.ts +0 -28
  505. package/dist/components/ui/app-layout-user-menu.d.ts.map +0 -1
  506. package/dist/components/ui/aspect-ratio.d.ts +0 -4
  507. package/dist/components/ui/aspect-ratio.d.ts.map +0 -1
  508. package/dist/components/ui/auth-layout.d.ts +0 -28
  509. package/dist/components/ui/auth-layout.d.ts.map +0 -1
  510. package/dist/components/ui/avatar.d.ts +0 -21
  511. package/dist/components/ui/avatar.d.ts.map +0 -1
  512. package/dist/components/ui/badge.d.ts +0 -18
  513. package/dist/components/ui/badge.d.ts.map +0 -1
  514. package/dist/components/ui/brand-logo.d.ts +0 -7
  515. package/dist/components/ui/brand-logo.d.ts.map +0 -1
  516. package/dist/components/ui/breadcrumb.d.ts +0 -12
  517. package/dist/components/ui/breadcrumb.d.ts.map +0 -1
  518. package/dist/components/ui/button.d.ts +0 -15
  519. package/dist/components/ui/button.d.ts.map +0 -1
  520. package/dist/components/ui/calendar.d.ts +0 -31
  521. package/dist/components/ui/calendar.d.ts.map +0 -1
  522. package/dist/components/ui/card.d.ts +0 -10
  523. package/dist/components/ui/card.d.ts.map +0 -1
  524. package/dist/components/ui/carousel.d.ts +0 -20
  525. package/dist/components/ui/carousel.d.ts.map +0 -1
  526. package/dist/components/ui/chart.d.ts +0 -45
  527. package/dist/components/ui/chart.d.ts.map +0 -1
  528. package/dist/components/ui/checkbox.d.ts +0 -5
  529. package/dist/components/ui/checkbox.d.ts.map +0 -1
  530. package/dist/components/ui/collapsible.d.ts +0 -6
  531. package/dist/components/ui/collapsible.d.ts.map +0 -1
  532. package/dist/components/ui/color-picker.d.ts +0 -13
  533. package/dist/components/ui/color-picker.d.ts.map +0 -1
  534. package/dist/components/ui/combobox.d.ts +0 -118
  535. package/dist/components/ui/combobox.d.ts.map +0 -1
  536. package/dist/components/ui/command.d.ts +0 -17
  537. package/dist/components/ui/command.d.ts.map +0 -1
  538. package/dist/components/ui/comment-system.d.ts +0 -43
  539. package/dist/components/ui/comment-system.d.ts.map +0 -1
  540. package/dist/components/ui/context-menu.d.ts +0 -26
  541. package/dist/components/ui/context-menu.d.ts.map +0 -1
  542. package/dist/components/ui/contract-print.d.ts +0 -82
  543. package/dist/components/ui/contract-print.d.ts.map +0 -1
  544. package/dist/components/ui/currency-input.d.ts +0 -11
  545. package/dist/components/ui/currency-input.d.ts.map +0 -1
  546. package/dist/components/ui/data-table.d.ts +0 -30
  547. package/dist/components/ui/data-table.d.ts.map +0 -1
  548. package/dist/components/ui/date-picker.d.ts +0 -111
  549. package/dist/components/ui/date-picker.d.ts.map +0 -1
  550. package/dist/components/ui/date-range-picker.d.ts +0 -128
  551. package/dist/components/ui/date-range-picker.d.ts.map +0 -1
  552. package/dist/components/ui/dialog.d.ts +0 -14
  553. package/dist/components/ui/dialog.d.ts.map +0 -1
  554. package/dist/components/ui/document-editor.d.ts +0 -14
  555. package/dist/components/ui/document-editor.d.ts.map +0 -1
  556. package/dist/components/ui/donut-chart.d.ts +0 -32
  557. package/dist/components/ui/donut-chart.d.ts.map +0 -1
  558. package/dist/components/ui/drawer.d.ts +0 -14
  559. package/dist/components/ui/drawer.d.ts.map +0 -1
  560. package/dist/components/ui/dropdown-menu.d.ts +0 -26
  561. package/dist/components/ui/dropdown-menu.d.ts.map +0 -1
  562. package/dist/components/ui/editable-badge.d.ts +0 -98
  563. package/dist/components/ui/editable-badge.d.ts.map +0 -1
  564. package/dist/components/ui/editorial-calendar.d.ts +0 -22
  565. package/dist/components/ui/editorial-calendar.d.ts.map +0 -1
  566. package/dist/components/ui/empty-state.d.ts +0 -59
  567. package/dist/components/ui/empty-state.d.ts.map +0 -1
  568. package/dist/components/ui/filter-bar.d.ts +0 -16
  569. package/dist/components/ui/filter-bar.d.ts.map +0 -1
  570. package/dist/components/ui/filter-builder.d.ts +0 -39
  571. package/dist/components/ui/filter-builder.d.ts.map +0 -1
  572. package/dist/components/ui/filter-chip.d.ts +0 -8
  573. package/dist/components/ui/filter-chip.d.ts.map +0 -1
  574. package/dist/components/ui/form.d.ts +0 -25
  575. package/dist/components/ui/form.d.ts.map +0 -1
  576. package/dist/components/ui/gantt-chart.d.ts +0 -28
  577. package/dist/components/ui/gantt-chart.d.ts.map +0 -1
  578. package/dist/components/ui/hover-card.d.ts +0 -7
  579. package/dist/components/ui/hover-card.d.ts.map +0 -1
  580. package/dist/components/ui/illustrations.d.ts +0 -76
  581. package/dist/components/ui/illustrations.d.ts.map +0 -1
  582. package/dist/components/ui/index.d.ts +0 -91
  583. package/dist/components/ui/index.d.ts.map +0 -1
  584. package/dist/components/ui/input-group.d.ts +0 -19
  585. package/dist/components/ui/input-group.d.ts.map +0 -1
  586. package/dist/components/ui/input-otp.d.ts +0 -12
  587. package/dist/components/ui/input-otp.d.ts.map +0 -1
  588. package/dist/components/ui/input-validation.d.ts +0 -35
  589. package/dist/components/ui/input-validation.d.ts.map +0 -1
  590. package/dist/components/ui/input.d.ts +0 -4
  591. package/dist/components/ui/input.d.ts.map +0 -1
  592. package/dist/components/ui/kanban-card.d.ts +0 -59
  593. package/dist/components/ui/kanban-card.d.ts.map +0 -1
  594. package/dist/components/ui/kanban-generic-card.d.ts +0 -43
  595. package/dist/components/ui/kanban-generic-card.d.ts.map +0 -1
  596. package/dist/components/ui/kpi-card.d.ts +0 -45
  597. package/dist/components/ui/kpi-card.d.ts.map +0 -1
  598. package/dist/components/ui/label.d.ts +0 -5
  599. package/dist/components/ui/label.d.ts.map +0 -1
  600. package/dist/components/ui/lista-anexos-arquivo.d.ts +0 -47
  601. package/dist/components/ui/lista-anexos-arquivo.d.ts.map +0 -1
  602. package/dist/components/ui/mention-list.d.ts +0 -7
  603. package/dist/components/ui/mention-list.d.ts.map +0 -1
  604. package/dist/components/ui/menubar.d.ts +0 -27
  605. package/dist/components/ui/menubar.d.ts.map +0 -1
  606. package/dist/components/ui/month-range-picker.d.ts +0 -71
  607. package/dist/components/ui/month-range-picker.d.ts.map +0 -1
  608. package/dist/components/ui/multi-select.d.ts +0 -98
  609. package/dist/components/ui/multi-select.d.ts.map +0 -1
  610. package/dist/components/ui/navigation-menu.d.ts +0 -15
  611. package/dist/components/ui/navigation-menu.d.ts.map +0 -1
  612. package/dist/components/ui/number-input.d.ts +0 -83
  613. package/dist/components/ui/number-input.d.ts.map +0 -1
  614. package/dist/components/ui/page-header.d.ts +0 -32
  615. package/dist/components/ui/page-header.d.ts.map +0 -1
  616. package/dist/components/ui/pagination.d.ts +0 -14
  617. package/dist/components/ui/pagination.d.ts.map +0 -1
  618. package/dist/components/ui/password-input.d.ts +0 -7
  619. package/dist/components/ui/password-input.d.ts.map +0 -1
  620. package/dist/components/ui/popover.d.ts +0 -8
  621. package/dist/components/ui/popover.d.ts.map +0 -1
  622. package/dist/components/ui/progress-timeline.d.ts +0 -42
  623. package/dist/components/ui/progress-timeline.d.ts.map +0 -1
  624. package/dist/components/ui/progress.d.ts +0 -7
  625. package/dist/components/ui/progress.d.ts.map +0 -1
  626. package/dist/components/ui/radio-group.d.ts +0 -6
  627. package/dist/components/ui/radio-group.d.ts.map +0 -1
  628. package/dist/components/ui/resizable.d.ts +0 -9
  629. package/dist/components/ui/resizable.d.ts.map +0 -1
  630. package/dist/components/ui/saved-filters.d.ts +0 -16
  631. package/dist/components/ui/saved-filters.d.ts.map +0 -1
  632. package/dist/components/ui/scroll-area.d.ts +0 -8
  633. package/dist/components/ui/scroll-area.d.ts.map +0 -1
  634. package/dist/components/ui/select.d.ts +0 -16
  635. package/dist/components/ui/select.d.ts.map +0 -1
  636. package/dist/components/ui/separator.d.ts +0 -5
  637. package/dist/components/ui/separator.d.ts.map +0 -1
  638. package/dist/components/ui/sheet.d.ts +0 -14
  639. package/dist/components/ui/sheet.d.ts.map +0 -1
  640. package/dist/components/ui/side-panel.d.ts +0 -40
  641. package/dist/components/ui/side-panel.d.ts.map +0 -1
  642. package/dist/components/ui/sidebar.d.ts +0 -70
  643. package/dist/components/ui/sidebar.d.ts.map +0 -1
  644. package/dist/components/ui/skeleton.d.ts +0 -8
  645. package/dist/components/ui/skeleton.d.ts.map +0 -1
  646. package/dist/components/ui/slider.d.ts +0 -5
  647. package/dist/components/ui/slider.d.ts.map +0 -1
  648. package/dist/components/ui/social-button.d.ts +0 -13
  649. package/dist/components/ui/social-button.d.ts.map +0 -1
  650. package/dist/components/ui/switch.d.ts +0 -5
  651. package/dist/components/ui/switch.d.ts.map +0 -1
  652. package/dist/components/ui/table-pagination.d.ts +0 -131
  653. package/dist/components/ui/table-pagination.d.ts.map +0 -1
  654. package/dist/components/ui/table-types.d.ts +0 -320
  655. package/dist/components/ui/table-types.d.ts.map +0 -1
  656. package/dist/components/ui/table.d.ts +0 -34
  657. package/dist/components/ui/table.d.ts.map +0 -1
  658. package/dist/components/ui/tabs.d.ts +0 -8
  659. package/dist/components/ui/tabs.d.ts.map +0 -1
  660. package/dist/components/ui/task-edit-dialog.d.ts +0 -15
  661. package/dist/components/ui/task-edit-dialog.d.ts.map +0 -1
  662. package/dist/components/ui/textarea.d.ts +0 -4
  663. package/dist/components/ui/textarea.d.ts.map +0 -1
  664. package/dist/components/ui/time-picker.d.ts +0 -85
  665. package/dist/components/ui/time-picker.d.ts.map +0 -1
  666. package/dist/components/ui/timeline.d.ts +0 -63
  667. package/dist/components/ui/timeline.d.ts.map +0 -1
  668. package/dist/components/ui/toast.d.ts +0 -5
  669. package/dist/components/ui/toast.d.ts.map +0 -1
  670. package/dist/components/ui/toggle-group.d.ts +0 -8
  671. package/dist/components/ui/toggle-group.d.ts.map +0 -1
  672. package/dist/components/ui/toggle.d.ts +0 -10
  673. package/dist/components/ui/toggle.d.ts.map +0 -1
  674. package/dist/components/ui/tooltip.d.ts +0 -8
  675. package/dist/components/ui/tooltip.d.ts.map +0 -1
  676. package/dist/components/ui/underline-tabs.d.ts +0 -29
  677. package/dist/components/ui/underline-tabs.d.ts.map +0 -1
  678. package/dist/components/ui/use-mobile.d.ts +0 -2
  679. package/dist/components/ui/use-mobile.d.ts.map +0 -1
  680. package/dist/components/ui/use-print-contract.d.ts +0 -37
  681. package/dist/components/ui/use-print-contract.d.ts.map +0 -1
  682. package/dist/components/ui/utils.d.ts +0 -3
  683. package/dist/components/ui/utils.d.ts.map +0 -1
  684. package/dist/components/ui/zona-upload-arquivo.d.ts +0 -34
  685. package/dist/components/ui/zona-upload-arquivo.d.ts.map +0 -1
  686. package/dist/index.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-attachment-list.cjs","sources":["../../../../src/components/ui/forms/file-attachment-list.tsx"],"sourcesContent":["import { AlertCircle, Download, Eye, Paperclip, Trash2 } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { Badge } from '../primitives/badge';\nimport { Button } from '../primitives/button';\nimport { Progress } from '../primitives/progress';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../overlays/tooltip';\nimport { cn } from '../utils';\n\n/**\n * Interface para um anexo de arquivo\n */\nexport interface FileAttachment {\n id?: string;\n nomeOriginal: string;\n chave?: string;\n tamanhoBytes?: number;\n dataUpload?: string;\n status?: 'completed' | 'uploading' | 'failed' | 'retrying';\n progress?: number;\n erro?: string;\n}\n\n/**\n * Props do componente FileAttachmentList\n */\nexport interface FileAttachmentListProps {\n /** Lista de anexos a serem exibidos */\n attachments: FileAttachment[];\n\n /** Callback quando usuário clica em download */\n onDownload?: (attachment: FileAttachment) => void | Promise<void>;\n\n /** Callback quando usuário clica em remover */\n onRemove?: (attachment: FileAttachment) => void;\n\n /** Callback quando usuário clica em visualizar */\n onView?: (attachment: FileAttachment) => void | Promise<void>;\n\n /** Mostrar botão de download */\n showDownload?: boolean;\n\n /** Mostrar botão de remover */\n showRemove?: boolean;\n\n /** Mostrar botão de visualizar */\n showView?: boolean;\n\n /** Comprimento máximo do nome do arquivo antes de truncar */\n maxFilenameLength?: number;\n\n /** Variante de exibição */\n variant?: 'compact' | 'detailed';\n\n /** Mensagem quando lista está vazia */\n emptyMessage?: string;\n\n /** Estado de loading geral */\n isLoading?: boolean;\n\n /** Classe CSS adicional */\n className?: string;\n}\n\n/**\n * Formata o tamanho do arquivo em formato legível\n */\nfunction formatarTamanhoArquivo(bytes?: number): string {\n if (!bytes) return '';\n\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/**\n * Formata a data em formato brasileiro\n */\nfunction formatarData(stringData?: string): string {\n if (!stringData) return '';\n\n try {\n const data = new Date(stringData);\n if (isNaN(data.getTime())) return stringData;\n return data.toLocaleDateString('pt-BR', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return stringData;\n }\n}\n\n/**\n * Trunca o nome do arquivo mantendo a extensão\n */\nfunction truncarNomeArquivo(nomeArquivo: string, comprimentoMaximo: number): string {\n if (nomeArquivo.length <= comprimentoMaximo) return nomeArquivo;\n\n const ultimoIndicePonto = nomeArquivo.lastIndexOf('.');\n if (ultimoIndicePonto === -1) {\n return nomeArquivo.substring(0, comprimentoMaximo - 3) + '...';\n }\n\n const extensao = nomeArquivo.substring(ultimoIndicePonto);\n const nome = nomeArquivo.substring(0, ultimoIndicePonto);\n const nomeTruncado = nome.substring(0, comprimentoMaximo - extensao.length - 3) + '...';\n\n return nomeTruncado + extensao;\n}\n\n/**\n * Componente para exibir lista de anexos com ações (download, view, remove)\n */\nexport function FileAttachmentList({\n attachments,\n onDownload,\n onRemove,\n onView,\n showDownload = true,\n showRemove = false,\n showView = false,\n maxFilenameLength = 40,\n variant = 'compact',\n emptyMessage = 'Nenhum anexo',\n isLoading = false,\n className,\n}: FileAttachmentListProps) {\n const [estadosCarregamento, setEstadosCarregamento] = useState<Record<string, 'download' | 'view' | null>>({});\n\n const gerenciarAcao = async (\n anexo: FileAttachment,\n acao: 'download' | 'view',\n callback?: (attachment: FileAttachment) => void | Promise<void>,\n ) => {\n if (!callback) return;\n\n const chave = anexo.chave || anexo.nomeOriginal;\n setEstadosCarregamento(anterior => ({ ...anterior, [chave]: acao }));\n\n try {\n await callback(anexo);\n } finally {\n setEstadosCarregamento(anterior => ({ ...anterior, [chave]: null }));\n }\n };\n\n if (isLoading) {\n return (\n <div className={cn('space-y-2', className)}>\n {[1, 2, 3].map(i => (\n <div key={i} className=\"flex items-center gap-2 p-3 border rounded bg-muted/30 animate-pulse\">\n <div className=\"h-4 w-4 bg-muted-foreground/20 rounded\" />\n <div className=\"h-4 flex-1 bg-muted-foreground/20 rounded\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (attachments.length === 0) {\n return (\n <div className={cn('text-center py-6 text-sm text-muted-foreground border rounded-lg bg-muted/20', className)}>\n {emptyMessage}\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)}>\n {attachments.map((anexo, indice) => {\n const chave = anexo.chave || anexo.id || `${anexo.nomeOriginal}-${indice}`;\n const estadoCarregamentoAtual = estadosCarregamento[anexo.chave || anexo.nomeOriginal];\n const estaBaixando = estadoCarregamentoAtual === 'download';\n const estaVisualizando = estadoCarregamentoAtual === 'view';\n\n // Badge de status\n const badgeStatus = (() => {\n switch (anexo.status) {\n case 'completed':\n return (\n <Badge variant=\"outline\" className=\"bg-success/10 text-success-emphasis border-success/20 hover:bg-success/10\">\n ✓ Enviado\n </Badge>\n );\n case 'uploading':\n return (\n <Badge variant=\"outline\" className=\"bg-info/10 text-info-emphasis border-info/20 hover:bg-info/10\">\n Enviando...\n </Badge>\n );\n case 'failed':\n return (\n <Badge variant=\"outline\" className=\"bg-destructive/10 text-destructive-emphasis border-destructive/20 hover:bg-destructive/10\">\n ✗ Erro\n </Badge>\n );\n case 'retrying':\n return (\n <Badge variant=\"outline\" className=\"bg-warning/10 text-warning-emphasis border-warning/20 hover:bg-warning/10\">\n Tentando...\n </Badge>\n );\n default:\n return null;\n }\n })();\n\n if (variant === 'detailed') {\n return (\n <div\n key={chave}\n className={cn(\n 'p-4 border rounded-lg bg-card transition-colors',\n anexo.status === 'failed' && 'border-destructive/30 bg-destructive/5',\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1 min-w-0\">\n <Paperclip className=\"h-5 w-5 text-muted-foreground mt-0.5 flex-shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <p className=\"text-sm font-medium truncate\">\n {anexo.nomeOriginal}\n </p>\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"text-xs\">{anexo.nomeOriginal}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <div className=\"flex items-center gap-2 mt-1 text-xs text-muted-foreground\">\n {anexo.tamanhoBytes && (\n <span>{formatarTamanhoArquivo(anexo.tamanhoBytes)}</span>\n )}\n {anexo.tamanhoBytes && anexo.dataUpload && (\n <span>•</span>\n )}\n {anexo.dataUpload && (\n <span>{formatarData(anexo.dataUpload)}</span>\n )}\n </div>\n\n {anexo.status === 'uploading' && typeof anexo.progress === 'number' && (\n <Progress value={anexo.progress} className=\"h-1 mt-2\" />\n )}\n\n {anexo.status === 'failed' && anexo.erro && (\n <div className=\"flex items-center gap-1 mt-2 text-xs text-destructive\">\n <AlertCircle className=\"h-3 w-3\" />\n <span>{anexo.erro}</span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {badgeStatus}\n\n {anexo.status === 'completed' && (\n <>\n {showView && onView && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'view', onView)}\n disabled={estaVisualizando}\n aria-label={`Visualizar ${anexo.nomeOriginal}`}\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Visualizar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showDownload && onDownload && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'download', onDownload)}\n disabled={estaBaixando}\n aria-label={`Baixar ${anexo.nomeOriginal}`}\n >\n <Download className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Baixar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showRemove && onRemove && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onRemove(anexo)}\n aria-label={`Remover ${anexo.nomeOriginal}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Remover</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // Variante: compact\n return (\n <div\n key={chave}\n className={cn(\n 'flex items-center justify-between gap-2 p-3 border rounded-lg bg-muted/30 transition-colors',\n anexo.status === 'failed' && 'border-destructive/30 bg-destructive/5',\n )}\n >\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <Paperclip className=\"h-4 w-4 text-muted-foreground flex-shrink-0\" />\n\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-sm truncate\">\n {truncarNomeArquivo(anexo.nomeOriginal, maxFilenameLength)}\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"max-w-xs break-all\">{anexo.nomeOriginal}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n {anexo.status === 'uploading' && typeof anexo.progress === 'number' && (\n <span className=\"text-xs text-muted-foreground flex-shrink-0\">\n {anexo.progress}%\n </span>\n )}\n\n {badgeStatus}\n </div>\n\n {anexo.status === 'completed' && (\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {showView && onView && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'view', onView)}\n disabled={estaVisualizando}\n aria-label={`Visualizar ${anexo.nomeOriginal}`}\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Visualizar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showDownload && onDownload && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'download', onDownload)}\n disabled={estaBaixando}\n aria-label={`Baixar ${anexo.nomeOriginal}`}\n >\n <Download className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Baixar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showRemove && onRemove && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onRemove(anexo)}\n aria-label={`Remover ${anexo.nomeOriginal}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Remover</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n\n {anexo.status === 'failed' && anexo.erro && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <AlertCircle className=\"h-4 w-4 text-destructive flex-shrink-0\" />\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"text-xs\">{anexo.erro}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["formatarTamanhoArquivo","bytes","formatarData","stringData","data","truncarNomeArquivo","nomeArquivo","comprimentoMaximo","ultimoIndicePonto","extensao","FileAttachmentList","attachments","onDownload","onRemove","onView","showDownload","showRemove","showView","maxFilenameLength","variant","emptyMessage","isLoading","className","estadosCarregamento","setEstadosCarregamento","useState","gerenciarAcao","anexo","acao","callback","chave","anterior","cn","jsxs","jsx","i","indice","estadoCarregamentoAtual","estaBaixando","estaVisualizando","badgeStatus","Badge","Paperclip","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","Progress","AlertCircle","Fragment","Button","Eye","Download","Trash2"],"mappings":"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"}
@@ -0,0 +1,235 @@
1
+ import { jsx as e, jsxs as t, Fragment as I } from "react/jsx-runtime";
2
+ import { Paperclip as $, AlertCircle as y, Eye as z, Download as T, Trash2 as E } from "lucide-react";
3
+ import { useState as L } from "react";
4
+ import { Badge as v } from "../primitives/badge.js";
5
+ import { Button as u } from "../primitives/button.js";
6
+ import { Progress as A } from "../primitives/progress.js";
7
+ import { TooltipProvider as a, Tooltip as l, TooltipTrigger as n, TooltipContent as d } from "../overlays/tooltip.js";
8
+ import { cn as f } from "../utils.js";
9
+ function G(i) {
10
+ return i ? i < 1024 ? `${i} B` : i < 1024 * 1024 ? `${(i / 1024).toFixed(1)} KB` : i < 1024 * 1024 * 1024 ? `${(i / (1024 * 1024)).toFixed(1)} MB` : `${(i / (1024 * 1024 * 1024)).toFixed(1)} GB` : "";
11
+ }
12
+ function K(i) {
13
+ if (!i) return "";
14
+ try {
15
+ const s = new Date(i);
16
+ return isNaN(s.getTime()) ? i : s.toLocaleDateString("pt-BR", {
17
+ day: "2-digit",
18
+ month: "2-digit",
19
+ year: "numeric",
20
+ hour: "2-digit",
21
+ minute: "2-digit"
22
+ });
23
+ } catch {
24
+ return i;
25
+ }
26
+ }
27
+ function R(i, s) {
28
+ if (i.length <= s) return i;
29
+ const c = i.lastIndexOf(".");
30
+ if (c === -1)
31
+ return i.substring(0, s - 3) + "...";
32
+ const h = i.substring(c);
33
+ return i.substring(0, c).substring(0, s - h.length - 3) + "..." + h;
34
+ }
35
+ function _({
36
+ attachments: i,
37
+ onDownload: s,
38
+ onRemove: c,
39
+ onView: h,
40
+ showDownload: N = !0,
41
+ showRemove: b = !1,
42
+ showView: x = !1,
43
+ maxFilenameLength: F = 40,
44
+ variant: j = "compact",
45
+ emptyMessage: P = "Nenhum anexo",
46
+ isLoading: S = !1,
47
+ className: w
48
+ }) {
49
+ const [U, B] = L({}), p = async (r, C, o) => {
50
+ if (!o) return;
51
+ const g = r.chave || r.nomeOriginal;
52
+ B((m) => ({ ...m, [g]: C }));
53
+ try {
54
+ await o(r);
55
+ } finally {
56
+ B((m) => ({ ...m, [g]: null }));
57
+ }
58
+ };
59
+ return S ? /* @__PURE__ */ e("div", { className: f("space-y-2", w), children: [1, 2, 3].map((r) => /* @__PURE__ */ t("div", { className: "flex items-center gap-2 p-3 border rounded bg-muted/30 animate-pulse", children: [
60
+ /* @__PURE__ */ e("div", { className: "h-4 w-4 bg-muted-foreground/20 rounded" }),
61
+ /* @__PURE__ */ e("div", { className: "h-4 flex-1 bg-muted-foreground/20 rounded" })
62
+ ] }, r)) }) : i.length === 0 ? /* @__PURE__ */ e("div", { className: f("text-center py-6 text-sm text-muted-foreground border rounded-lg bg-muted/20", w), children: P }) : /* @__PURE__ */ e("div", { className: f("space-y-2", w), children: i.map((r, C) => {
63
+ const o = r.chave || r.id || `${r.nomeOriginal}-${C}`, g = U[r.chave || r.nomeOriginal], m = g === "download", O = g === "view", k = (() => {
64
+ switch (r.status) {
65
+ case "completed":
66
+ return /* @__PURE__ */ e(v, { variant: "outline", className: "bg-success/10 text-success-emphasis border-success/20 hover:bg-success/10", children: "✓ Enviado" });
67
+ case "uploading":
68
+ return /* @__PURE__ */ e(v, { variant: "outline", className: "bg-info/10 text-info-emphasis border-info/20 hover:bg-info/10", children: "Enviando..." });
69
+ case "failed":
70
+ return /* @__PURE__ */ e(v, { variant: "outline", className: "bg-destructive/10 text-destructive-emphasis border-destructive/20 hover:bg-destructive/10", children: "✗ Erro" });
71
+ case "retrying":
72
+ return /* @__PURE__ */ e(v, { variant: "outline", className: "bg-warning/10 text-warning-emphasis border-warning/20 hover:bg-warning/10", children: "Tentando..." });
73
+ default:
74
+ return null;
75
+ }
76
+ })();
77
+ return j === "detailed" ? /* @__PURE__ */ e(
78
+ "div",
79
+ {
80
+ className: f(
81
+ "p-4 border rounded-lg bg-card transition-colors",
82
+ r.status === "failed" && "border-destructive/30 bg-destructive/5"
83
+ ),
84
+ children: /* @__PURE__ */ t("div", { className: "flex items-start justify-between gap-3", children: [
85
+ /* @__PURE__ */ t("div", { className: "flex items-start gap-3 flex-1 min-w-0", children: [
86
+ /* @__PURE__ */ e($, { className: "h-5 w-5 text-muted-foreground mt-0.5 flex-shrink-0" }),
87
+ /* @__PURE__ */ t("div", { className: "flex-1 min-w-0", children: [
88
+ /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
89
+ /* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e("p", { className: "text-sm font-medium truncate", children: r.nomeOriginal }) }),
90
+ /* @__PURE__ */ e(d, { children: /* @__PURE__ */ e("p", { className: "text-xs", children: r.nomeOriginal }) })
91
+ ] }) }),
92
+ /* @__PURE__ */ t("div", { className: "flex items-center gap-2 mt-1 text-xs text-muted-foreground", children: [
93
+ r.tamanhoBytes && /* @__PURE__ */ e("span", { children: G(r.tamanhoBytes) }),
94
+ r.tamanhoBytes && r.dataUpload && /* @__PURE__ */ e("span", { children: "•" }),
95
+ r.dataUpload && /* @__PURE__ */ e("span", { children: K(r.dataUpload) })
96
+ ] }),
97
+ r.status === "uploading" && typeof r.progress == "number" && /* @__PURE__ */ e(A, { value: r.progress, className: "h-1 mt-2" }),
98
+ r.status === "failed" && r.erro && /* @__PURE__ */ t("div", { className: "flex items-center gap-1 mt-2 text-xs text-destructive", children: [
99
+ /* @__PURE__ */ e(y, { className: "h-3 w-3" }),
100
+ /* @__PURE__ */ e("span", { children: r.erro })
101
+ ] })
102
+ ] })
103
+ ] }),
104
+ /* @__PURE__ */ t("div", { className: "flex items-center gap-2 flex-shrink-0", children: [
105
+ k,
106
+ r.status === "completed" && /* @__PURE__ */ t(I, { children: [
107
+ x && h && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
108
+ /* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
109
+ u,
110
+ {
111
+ variant: "ghost",
112
+ size: "icon",
113
+ className: "h-8 w-8",
114
+ onClick: () => p(r, "view", h),
115
+ disabled: O,
116
+ "aria-label": `Visualizar ${r.nomeOriginal}`,
117
+ children: /* @__PURE__ */ e(z, { className: "h-4 w-4" })
118
+ }
119
+ ) }),
120
+ /* @__PURE__ */ e(d, { children: "Visualizar" })
121
+ ] }) }),
122
+ N && s && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
123
+ /* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
124
+ u,
125
+ {
126
+ variant: "ghost",
127
+ size: "icon",
128
+ className: "h-8 w-8",
129
+ onClick: () => p(r, "download", s),
130
+ disabled: m,
131
+ "aria-label": `Baixar ${r.nomeOriginal}`,
132
+ children: /* @__PURE__ */ e(T, { className: "h-4 w-4" })
133
+ }
134
+ ) }),
135
+ /* @__PURE__ */ e(d, { children: "Baixar" })
136
+ ] }) }),
137
+ b && c && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
138
+ /* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
139
+ u,
140
+ {
141
+ variant: "ghost",
142
+ size: "icon",
143
+ className: "h-8 w-8 text-destructive hover:text-destructive",
144
+ onClick: () => c(r),
145
+ "aria-label": `Remover ${r.nomeOriginal}`,
146
+ children: /* @__PURE__ */ e(E, { className: "h-4 w-4" })
147
+ }
148
+ ) }),
149
+ /* @__PURE__ */ e(d, { children: "Remover" })
150
+ ] }) })
151
+ ] })
152
+ ] })
153
+ ] })
154
+ },
155
+ o
156
+ ) : /* @__PURE__ */ t(
157
+ "div",
158
+ {
159
+ className: f(
160
+ "flex items-center justify-between gap-2 p-3 border rounded-lg bg-muted/30 transition-colors",
161
+ r.status === "failed" && "border-destructive/30 bg-destructive/5"
162
+ ),
163
+ children: [
164
+ /* @__PURE__ */ t("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [
165
+ /* @__PURE__ */ e($, { className: "h-4 w-4 text-muted-foreground flex-shrink-0" }),
166
+ /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
167
+ /* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e("span", { className: "text-sm truncate", children: R(r.nomeOriginal, F) }) }),
168
+ /* @__PURE__ */ e(d, { children: /* @__PURE__ */ e("p", { className: "max-w-xs break-all", children: r.nomeOriginal }) })
169
+ ] }) }),
170
+ r.status === "uploading" && typeof r.progress == "number" && /* @__PURE__ */ t("span", { className: "text-xs text-muted-foreground flex-shrink-0", children: [
171
+ r.progress,
172
+ "%"
173
+ ] }),
174
+ k
175
+ ] }),
176
+ r.status === "completed" && /* @__PURE__ */ t("div", { className: "flex items-center gap-1 flex-shrink-0", children: [
177
+ x && h && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
178
+ /* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
179
+ u,
180
+ {
181
+ variant: "ghost",
182
+ size: "icon",
183
+ className: "h-8 w-8",
184
+ onClick: () => p(r, "view", h),
185
+ disabled: O,
186
+ "aria-label": `Visualizar ${r.nomeOriginal}`,
187
+ children: /* @__PURE__ */ e(z, { className: "h-4 w-4" })
188
+ }
189
+ ) }),
190
+ /* @__PURE__ */ e(d, { children: "Visualizar" })
191
+ ] }) }),
192
+ N && s && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
193
+ /* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
194
+ u,
195
+ {
196
+ variant: "ghost",
197
+ size: "icon",
198
+ className: "h-8 w-8",
199
+ onClick: () => p(r, "download", s),
200
+ disabled: m,
201
+ "aria-label": `Baixar ${r.nomeOriginal}`,
202
+ children: /* @__PURE__ */ e(T, { className: "h-4 w-4" })
203
+ }
204
+ ) }),
205
+ /* @__PURE__ */ e(d, { children: "Baixar" })
206
+ ] }) }),
207
+ b && c && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
208
+ /* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
209
+ u,
210
+ {
211
+ variant: "ghost",
212
+ size: "icon",
213
+ className: "h-8 w-8 text-destructive hover:text-destructive",
214
+ onClick: () => c(r),
215
+ "aria-label": `Remover ${r.nomeOriginal}`,
216
+ children: /* @__PURE__ */ e(E, { className: "h-4 w-4" })
217
+ }
218
+ ) }),
219
+ /* @__PURE__ */ e(d, { children: "Remover" })
220
+ ] }) })
221
+ ] }),
222
+ r.status === "failed" && r.erro && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
223
+ /* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(y, { className: "h-4 w-4 text-destructive flex-shrink-0" }) }),
224
+ /* @__PURE__ */ e(d, { children: /* @__PURE__ */ e("p", { className: "text-xs", children: r.erro }) })
225
+ ] }) })
226
+ ]
227
+ },
228
+ o
229
+ );
230
+ }) });
231
+ }
232
+ export {
233
+ _ as FileAttachmentList
234
+ };
235
+ //# sourceMappingURL=file-attachment-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-attachment-list.js","sources":["../../../../src/components/ui/forms/file-attachment-list.tsx"],"sourcesContent":["import { AlertCircle, Download, Eye, Paperclip, Trash2 } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { Badge } from '../primitives/badge';\nimport { Button } from '../primitives/button';\nimport { Progress } from '../primitives/progress';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../overlays/tooltip';\nimport { cn } from '../utils';\n\n/**\n * Interface para um anexo de arquivo\n */\nexport interface FileAttachment {\n id?: string;\n nomeOriginal: string;\n chave?: string;\n tamanhoBytes?: number;\n dataUpload?: string;\n status?: 'completed' | 'uploading' | 'failed' | 'retrying';\n progress?: number;\n erro?: string;\n}\n\n/**\n * Props do componente FileAttachmentList\n */\nexport interface FileAttachmentListProps {\n /** Lista de anexos a serem exibidos */\n attachments: FileAttachment[];\n\n /** Callback quando usuário clica em download */\n onDownload?: (attachment: FileAttachment) => void | Promise<void>;\n\n /** Callback quando usuário clica em remover */\n onRemove?: (attachment: FileAttachment) => void;\n\n /** Callback quando usuário clica em visualizar */\n onView?: (attachment: FileAttachment) => void | Promise<void>;\n\n /** Mostrar botão de download */\n showDownload?: boolean;\n\n /** Mostrar botão de remover */\n showRemove?: boolean;\n\n /** Mostrar botão de visualizar */\n showView?: boolean;\n\n /** Comprimento máximo do nome do arquivo antes de truncar */\n maxFilenameLength?: number;\n\n /** Variante de exibição */\n variant?: 'compact' | 'detailed';\n\n /** Mensagem quando lista está vazia */\n emptyMessage?: string;\n\n /** Estado de loading geral */\n isLoading?: boolean;\n\n /** Classe CSS adicional */\n className?: string;\n}\n\n/**\n * Formata o tamanho do arquivo em formato legível\n */\nfunction formatarTamanhoArquivo(bytes?: number): string {\n if (!bytes) return '';\n\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/**\n * Formata a data em formato brasileiro\n */\nfunction formatarData(stringData?: string): string {\n if (!stringData) return '';\n\n try {\n const data = new Date(stringData);\n if (isNaN(data.getTime())) return stringData;\n return data.toLocaleDateString('pt-BR', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return stringData;\n }\n}\n\n/**\n * Trunca o nome do arquivo mantendo a extensão\n */\nfunction truncarNomeArquivo(nomeArquivo: string, comprimentoMaximo: number): string {\n if (nomeArquivo.length <= comprimentoMaximo) return nomeArquivo;\n\n const ultimoIndicePonto = nomeArquivo.lastIndexOf('.');\n if (ultimoIndicePonto === -1) {\n return nomeArquivo.substring(0, comprimentoMaximo - 3) + '...';\n }\n\n const extensao = nomeArquivo.substring(ultimoIndicePonto);\n const nome = nomeArquivo.substring(0, ultimoIndicePonto);\n const nomeTruncado = nome.substring(0, comprimentoMaximo - extensao.length - 3) + '...';\n\n return nomeTruncado + extensao;\n}\n\n/**\n * Componente para exibir lista de anexos com ações (download, view, remove)\n */\nexport function FileAttachmentList({\n attachments,\n onDownload,\n onRemove,\n onView,\n showDownload = true,\n showRemove = false,\n showView = false,\n maxFilenameLength = 40,\n variant = 'compact',\n emptyMessage = 'Nenhum anexo',\n isLoading = false,\n className,\n}: FileAttachmentListProps) {\n const [estadosCarregamento, setEstadosCarregamento] = useState<Record<string, 'download' | 'view' | null>>({});\n\n const gerenciarAcao = async (\n anexo: FileAttachment,\n acao: 'download' | 'view',\n callback?: (attachment: FileAttachment) => void | Promise<void>,\n ) => {\n if (!callback) return;\n\n const chave = anexo.chave || anexo.nomeOriginal;\n setEstadosCarregamento(anterior => ({ ...anterior, [chave]: acao }));\n\n try {\n await callback(anexo);\n } finally {\n setEstadosCarregamento(anterior => ({ ...anterior, [chave]: null }));\n }\n };\n\n if (isLoading) {\n return (\n <div className={cn('space-y-2', className)}>\n {[1, 2, 3].map(i => (\n <div key={i} className=\"flex items-center gap-2 p-3 border rounded bg-muted/30 animate-pulse\">\n <div className=\"h-4 w-4 bg-muted-foreground/20 rounded\" />\n <div className=\"h-4 flex-1 bg-muted-foreground/20 rounded\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (attachments.length === 0) {\n return (\n <div className={cn('text-center py-6 text-sm text-muted-foreground border rounded-lg bg-muted/20', className)}>\n {emptyMessage}\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)}>\n {attachments.map((anexo, indice) => {\n const chave = anexo.chave || anexo.id || `${anexo.nomeOriginal}-${indice}`;\n const estadoCarregamentoAtual = estadosCarregamento[anexo.chave || anexo.nomeOriginal];\n const estaBaixando = estadoCarregamentoAtual === 'download';\n const estaVisualizando = estadoCarregamentoAtual === 'view';\n\n // Badge de status\n const badgeStatus = (() => {\n switch (anexo.status) {\n case 'completed':\n return (\n <Badge variant=\"outline\" className=\"bg-success/10 text-success-emphasis border-success/20 hover:bg-success/10\">\n ✓ Enviado\n </Badge>\n );\n case 'uploading':\n return (\n <Badge variant=\"outline\" className=\"bg-info/10 text-info-emphasis border-info/20 hover:bg-info/10\">\n Enviando...\n </Badge>\n );\n case 'failed':\n return (\n <Badge variant=\"outline\" className=\"bg-destructive/10 text-destructive-emphasis border-destructive/20 hover:bg-destructive/10\">\n ✗ Erro\n </Badge>\n );\n case 'retrying':\n return (\n <Badge variant=\"outline\" className=\"bg-warning/10 text-warning-emphasis border-warning/20 hover:bg-warning/10\">\n Tentando...\n </Badge>\n );\n default:\n return null;\n }\n })();\n\n if (variant === 'detailed') {\n return (\n <div\n key={chave}\n className={cn(\n 'p-4 border rounded-lg bg-card transition-colors',\n anexo.status === 'failed' && 'border-destructive/30 bg-destructive/5',\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1 min-w-0\">\n <Paperclip className=\"h-5 w-5 text-muted-foreground mt-0.5 flex-shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <p className=\"text-sm font-medium truncate\">\n {anexo.nomeOriginal}\n </p>\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"text-xs\">{anexo.nomeOriginal}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <div className=\"flex items-center gap-2 mt-1 text-xs text-muted-foreground\">\n {anexo.tamanhoBytes && (\n <span>{formatarTamanhoArquivo(anexo.tamanhoBytes)}</span>\n )}\n {anexo.tamanhoBytes && anexo.dataUpload && (\n <span>•</span>\n )}\n {anexo.dataUpload && (\n <span>{formatarData(anexo.dataUpload)}</span>\n )}\n </div>\n\n {anexo.status === 'uploading' && typeof anexo.progress === 'number' && (\n <Progress value={anexo.progress} className=\"h-1 mt-2\" />\n )}\n\n {anexo.status === 'failed' && anexo.erro && (\n <div className=\"flex items-center gap-1 mt-2 text-xs text-destructive\">\n <AlertCircle className=\"h-3 w-3\" />\n <span>{anexo.erro}</span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {badgeStatus}\n\n {anexo.status === 'completed' && (\n <>\n {showView && onView && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'view', onView)}\n disabled={estaVisualizando}\n aria-label={`Visualizar ${anexo.nomeOriginal}`}\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Visualizar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showDownload && onDownload && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'download', onDownload)}\n disabled={estaBaixando}\n aria-label={`Baixar ${anexo.nomeOriginal}`}\n >\n <Download className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Baixar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showRemove && onRemove && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onRemove(anexo)}\n aria-label={`Remover ${anexo.nomeOriginal}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Remover</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // Variante: compact\n return (\n <div\n key={chave}\n className={cn(\n 'flex items-center justify-between gap-2 p-3 border rounded-lg bg-muted/30 transition-colors',\n anexo.status === 'failed' && 'border-destructive/30 bg-destructive/5',\n )}\n >\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <Paperclip className=\"h-4 w-4 text-muted-foreground flex-shrink-0\" />\n\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-sm truncate\">\n {truncarNomeArquivo(anexo.nomeOriginal, maxFilenameLength)}\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"max-w-xs break-all\">{anexo.nomeOriginal}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n {anexo.status === 'uploading' && typeof anexo.progress === 'number' && (\n <span className=\"text-xs text-muted-foreground flex-shrink-0\">\n {anexo.progress}%\n </span>\n )}\n\n {badgeStatus}\n </div>\n\n {anexo.status === 'completed' && (\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {showView && onView && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'view', onView)}\n disabled={estaVisualizando}\n aria-label={`Visualizar ${anexo.nomeOriginal}`}\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Visualizar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showDownload && onDownload && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'download', onDownload)}\n disabled={estaBaixando}\n aria-label={`Baixar ${anexo.nomeOriginal}`}\n >\n <Download className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Baixar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showRemove && onRemove && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onRemove(anexo)}\n aria-label={`Remover ${anexo.nomeOriginal}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Remover</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n\n {anexo.status === 'failed' && anexo.erro && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <AlertCircle className=\"h-4 w-4 text-destructive flex-shrink-0\" />\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"text-xs\">{anexo.erro}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["formatarTamanhoArquivo","bytes","formatarData","stringData","data","truncarNomeArquivo","nomeArquivo","comprimentoMaximo","ultimoIndicePonto","extensao","FileAttachmentList","attachments","onDownload","onRemove","onView","showDownload","showRemove","showView","maxFilenameLength","variant","emptyMessage","isLoading","className","estadosCarregamento","setEstadosCarregamento","useState","gerenciarAcao","anexo","acao","callback","chave","anterior","cn","jsxs","jsx","i","indice","estadoCarregamentoAtual","estaBaixando","estaVisualizando","badgeStatus","Badge","Paperclip","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","Progress","AlertCircle","Fragment","Button","Eye","Download","Trash2"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),w=require("lucide-react"),o=require("react"),g=require("../utils.cjs");function R(n,s){const u=s*1024*1024;return n.size>u?`Arquivo muito grande. Máximo: ${s}MB`:null}function W(n,s){if(!s)return null;const u=s.split(",").map(r=>r.trim().toLowerCase()),c=n.name.toLowerCase(),i=n.type.toLowerCase();return u.some(r=>{if(r.includes("*")){const[j]=r.split("/");return i.startsWith(j+"/")}return r.startsWith(".")?c.endsWith(r):i===r})?null:"Tipo de arquivo não suportado"}function M({onFilesSelected:n,accept:s,multiple:u=!0,maxFiles:c=10,maxSizeMB:i=50,disabled:a=!1,isUploading:r=!1,title:j="Clique para fazer upload de arquivos",description:b,icon:k,className:T,onError:m}){const[l,q]=o.useState(!1),p=o.useRef(null),y=o.useCallback(e=>{m==null||m(e)},[m]),h=o.useCallback(e=>{if(!e||e.length===0)return;const v=Array.from(e);if(v.length>c){y(`Máximo de ${c} arquivo(s) permitido(s)`);return}const f=[],x=[];for(const d of v){const A=R(d,i);if(A){x.push(`${d.name}: ${A}`);continue}const N=W(d,s);if(N){x.push(`${d.name}: ${N}`);continue}f.push(d)}x.length>0&&y(x.join(`
2
+ `)),f.length>0&&n(f),p.current&&(p.current.value="")},[c,i,s,n,y]),$=o.useCallback(()=>{var e;a||r||(e=p.current)==null||e.click()},[a,r]),D=o.useCallback(e=>{h(e.target.files)},[h]),P=o.useCallback(e=>{e.preventDefault(),e.stopPropagation(),!a&&!r&&q(!0)},[a,r]),V=o.useCallback(e=>{e.preventDefault(),e.stopPropagation(),q(!1)},[]),L=o.useCallback(e=>{e.preventDefault(),e.stopPropagation(),q(!1),!(a||r)&&h(e.dataTransfer.files)},[a,r,h]),C=b||(()=>{const e=[];if(s){const v=s.split(",").map(f=>f.trim().replace(".","").toUpperCase()).join(", ");e.push(v)}return i&&e.push(`máx ${i}MB cada`),e.join(" • ")})();return t.jsxs("div",{className:g.cn("relative border-2 border-dashed rounded-lg p-8 text-center transition-all cursor-pointer","hover:border-primary/50 hover:bg-muted/30",l&&"border-primary bg-primary/5 scale-[1.02]",(a||r)&&"opacity-50 cursor-not-allowed hover:border-dashed hover:bg-transparent",r&&"animate-pulse",T),onClick:$,onDragOver:P,onDragLeave:V,onDrop:L,children:[t.jsx("input",{ref:p,type:"file",multiple:u,accept:s,className:"hidden",onChange:D,disabled:a||r}),t.jsxs("div",{className:"flex flex-col items-center gap-3",children:[k||t.jsx("div",{className:g.cn("transition-transform",l&&"scale-110"),children:r?t.jsx("div",{className:"h-12 w-12 mx-auto",children:t.jsxs("svg",{className:"animate-spin h-12 w-12 text-primary",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]})}):t.jsx(w.Upload,{className:g.cn("h-12 w-12 mx-auto text-muted-foreground transition-colors",l&&"text-primary")})}),t.jsxs("div",{className:"space-y-1",children:[t.jsx("p",{className:g.cn("font-medium transition-colors",l&&"text-primary",r&&"text-muted-foreground"),children:r?"Enviando arquivos...":l?"Solte os arquivos aqui":j}),C&&t.jsx("p",{className:"text-xs text-muted-foreground",children:C}),!a&&!r&&u&&c>1&&t.jsxs("p",{className:"text-xs text-muted-foreground",children:["Você pode selecionar até ",c," arquivo(s)"]})]}),a&&t.jsxs("div",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[t.jsx(w.AlertCircle,{className:"h-3 w-3"}),t.jsx("span",{children:"Upload desabilitado"})]})]})]})}exports.FileUploadZone=M;
3
+ //# sourceMappingURL=file-upload-zone.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload-zone.cjs","sources":["../../../../src/components/ui/forms/file-upload-zone.tsx"],"sourcesContent":["import { AlertCircle, Upload } from 'lucide-react';\nimport { useCallback, useRef, useState } from 'react';\n\nimport { cn } from '../utils';\n\n/**\n * Props do componente FileUploadZone\n */\nexport interface FileUploadZoneProps {\n /** Callback quando arquivos são selecionados */\n onFilesSelected: (files: File[]) => void;\n\n /** Tipos de arquivo aceitos (ex: \".pdf,.doc,.docx\" ou \"image/*\") */\n accept?: string;\n\n /** Permitir múltiplos arquivos */\n multiple?: boolean;\n\n /** Número máximo de arquivos */\n maxFiles?: number;\n\n /** Tamanho máximo em MB */\n maxSizeMB?: number;\n\n /** Desabilitar upload */\n disabled?: boolean;\n\n /** Estado de loading/upload em andamento */\n isUploading?: boolean;\n\n /** Título da zona de upload */\n title?: string;\n\n /** Descrição da zona de upload */\n description?: string;\n\n /** Ícone customizado */\n icon?: React.ReactNode;\n\n /** Classe CSS adicional */\n className?: string;\n\n /** Callback quando houver erro de validação */\n onError?: (error: string) => void;\n}\n\n/**\n * Valida o tamanho do arquivo\n */\nfunction validarTamanhoArquivo(arquivo: File, tamanhoMaximoMB: number): string | null {\n const bytesMaximos = tamanhoMaximoMB * 1024 * 1024;\n if (arquivo.size > bytesMaximos) {\n return `Arquivo muito grande. Máximo: ${tamanhoMaximoMB}MB`;\n }\n return null;\n}\n\n/**\n * Valida o tipo do arquivo\n */\nfunction validarTipoArquivo(arquivo: File, tiposAceitos?: string): string | null {\n if (!tiposAceitos) return null;\n\n const tiposAceitosArray = tiposAceitos.split(',').map(t => t.trim().toLowerCase());\n const nomeArquivo = arquivo.name.toLowerCase();\n const tipoArquivo = arquivo.type.toLowerCase();\n\n const eValido = tiposAceitosArray.some(tipo => {\n // Wildcard (ex: image/*)\n if (tipo.includes('*')) {\n const [categoria] = tipo.split('/');\n return tipoArquivo.startsWith(categoria + '/');\n }\n\n // Extensão (ex: .pdf)\n if (tipo.startsWith('.')) {\n return nomeArquivo.endsWith(tipo);\n }\n\n // MIME type exato\n return tipoArquivo === tipo;\n });\n\n if (!eValido) {\n return 'Tipo de arquivo não suportado';\n }\n\n return null;\n}\n\n/**\n * Componente de zona de upload com drag-and-drop\n */\nexport function FileUploadZone({\n onFilesSelected,\n accept,\n multiple = true,\n maxFiles = 10,\n maxSizeMB = 50,\n disabled = false,\n isUploading = false,\n title = 'Clique para fazer upload de arquivos',\n description,\n icon,\n className,\n onError,\n}: FileUploadZoneProps) {\n const [estaArrastando, setEstaArrastando] = useState(false);\n const refInput = useRef<HTMLInputElement>(null);\n\n const gerenciarErro = useCallback((erro: string) => {\n onError?.(erro);\n }, [onError]);\n\n const validarEProcessarArquivos = useCallback((arquivos: FileList | null) => {\n if (!arquivos || arquivos.length === 0) return;\n\n const arrayArquivos = Array.from(arquivos);\n\n // Validar número de arquivos\n if (arrayArquivos.length > maxFiles) {\n gerenciarErro(`Máximo de ${maxFiles} arquivo(s) permitido(s)`);\n return;\n }\n\n // Validar cada arquivo\n const arquivosValidos: File[] = [];\n const erros: string[] = [];\n\n for (const arquivo of arrayArquivos) {\n // Validar tamanho\n const erroTamanho = validarTamanhoArquivo(arquivo, maxSizeMB);\n if (erroTamanho) {\n erros.push(`${arquivo.name}: ${erroTamanho}`);\n continue;\n }\n\n // Validar tipo\n const erroTipo = validarTipoArquivo(arquivo, accept);\n if (erroTipo) {\n erros.push(`${arquivo.name}: ${erroTipo}`);\n continue;\n }\n\n arquivosValidos.push(arquivo);\n }\n\n // Mostrar erros\n if (erros.length > 0) {\n gerenciarErro(erros.join('\\n'));\n }\n\n // Processar arquivos válidos\n if (arquivosValidos.length > 0) {\n onFilesSelected(arquivosValidos);\n }\n\n // Limpar input\n if (refInput.current) {\n refInput.current.value = '';\n }\n }, [maxFiles, maxSizeMB, accept, onFilesSelected, gerenciarErro]);\n\n const gerenciarClique = useCallback(() => {\n if (disabled || isUploading) return;\n refInput.current?.click();\n }, [disabled, isUploading]);\n\n const gerenciarMudancaArquivo = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n validarEProcessarArquivos(e.target.files);\n }, [validarEProcessarArquivos]);\n\n const gerenciarArrastarSobre = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled && !isUploading) {\n setEstaArrastando(true);\n }\n }, [disabled, isUploading]);\n\n const gerenciarArrastarSair = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setEstaArrastando(false);\n }, []);\n\n const gerenciarSoltar = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setEstaArrastando(false);\n\n if (disabled || isUploading) return;\n\n validarEProcessarArquivos(e.dataTransfer.files);\n }, [disabled, isUploading, validarEProcessarArquivos]);\n\n const descricaoPadrao = description || (() => {\n const partes: string[] = [];\n\n if (accept) {\n const tipos = accept.split(',').map(t => t.trim().replace('.', '').toUpperCase()).join(', ');\n partes.push(tipos);\n }\n\n if (maxSizeMB) {\n partes.push(`máx ${maxSizeMB}MB cada`);\n }\n\n return partes.join(' • ');\n })();\n\n return (\n <div\n className={cn(\n 'relative border-2 border-dashed rounded-lg p-8 text-center transition-all cursor-pointer',\n 'hover:border-primary/50 hover:bg-muted/30',\n estaArrastando && 'border-primary bg-primary/5 scale-[1.02]',\n (disabled || isUploading) && 'opacity-50 cursor-not-allowed hover:border-dashed hover:bg-transparent',\n isUploading && 'animate-pulse',\n className,\n )}\n onClick={gerenciarClique}\n onDragOver={gerenciarArrastarSobre}\n onDragLeave={gerenciarArrastarSair}\n onDrop={gerenciarSoltar}\n >\n <input\n ref={refInput}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n className=\"hidden\"\n onChange={gerenciarMudancaArquivo}\n disabled={disabled || isUploading}\n />\n\n <div className=\"flex flex-col items-center gap-3\">\n {icon || (\n <div className={cn(\n 'transition-transform',\n estaArrastando && 'scale-110',\n )}>\n {isUploading ? (\n <div className=\"h-12 w-12 mx-auto\">\n <svg className=\"animate-spin h-12 w-12 text-primary\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </div>\n ) : (\n <Upload className={cn(\n 'h-12 w-12 mx-auto text-muted-foreground transition-colors',\n estaArrastando && 'text-primary',\n )} />\n )}\n </div>\n )}\n\n <div className=\"space-y-1\">\n <p className={cn(\n 'font-medium transition-colors',\n estaArrastando && 'text-primary',\n isUploading && 'text-muted-foreground',\n )}>\n {isUploading ? 'Enviando arquivos...' : estaArrastando ? 'Solte os arquivos aqui' : title}\n </p>\n\n {descricaoPadrao && (\n <p className=\"text-xs text-muted-foreground\">\n {descricaoPadrao}\n </p>\n )}\n\n {!disabled && !isUploading && multiple && maxFiles > 1 && (\n <p className=\"text-xs text-muted-foreground\">\n Você pode selecionar até {maxFiles} arquivo(s)\n </p>\n )}\n </div>\n\n {disabled && (\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <AlertCircle className=\"h-3 w-3\" />\n <span>Upload desabilitado</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["validarTamanhoArquivo","arquivo","tamanhoMaximoMB","bytesMaximos","validarTipoArquivo","tiposAceitos","tiposAceitosArray","t","nomeArquivo","tipoArquivo","tipo","categoria","FileUploadZone","onFilesSelected","accept","multiple","maxFiles","maxSizeMB","disabled","isUploading","title","description","icon","className","onError","estaArrastando","setEstaArrastando","useState","refInput","useRef","gerenciarErro","useCallback","erro","validarEProcessarArquivos","arquivos","arrayArquivos","arquivosValidos","erros","erroTamanho","erroTipo","gerenciarClique","_a","gerenciarMudancaArquivo","gerenciarArrastarSobre","gerenciarArrastarSair","gerenciarSoltar","descricaoPadrao","partes","tipos","jsxs","cn","jsx","Upload","AlertCircle"],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ import { jsxs as l, jsx as a } from "react/jsx-runtime";
2
+ import { Upload as W, AlertCircle as M } from "lucide-react";
3
+ import { useState as z, useRef as H, useCallback as c } from "react";
4
+ import { cn as y } from "../utils.js";
5
+ function I(n, t) {
6
+ const u = t * 1024 * 1024;
7
+ return n.size > u ? `Arquivo muito grande. Máximo: ${t}MB` : null;
8
+ }
9
+ function O(n, t) {
10
+ if (!t) return null;
11
+ const u = t.split(",").map((e) => e.trim().toLowerCase()), s = n.name.toLowerCase(), i = n.type.toLowerCase();
12
+ return u.some((e) => {
13
+ if (e.includes("*")) {
14
+ const [q] = e.split("/");
15
+ return i.startsWith(q + "/");
16
+ }
17
+ return e.startsWith(".") ? s.endsWith(e) : i === e;
18
+ }) ? null : "Tipo de arquivo não suportado";
19
+ }
20
+ function J({
21
+ onFilesSelected: n,
22
+ accept: t,
23
+ multiple: u = !0,
24
+ maxFiles: s = 10,
25
+ maxSizeMB: i = 50,
26
+ disabled: o = !1,
27
+ isUploading: e = !1,
28
+ title: q = "Clique para fazer upload de arquivos",
29
+ description: D,
30
+ icon: T,
31
+ className: j,
32
+ onError: d
33
+ }) {
34
+ const [f, A] = z(!1), h = H(null), N = c((r) => {
35
+ d == null || d(r);
36
+ }, [d]), v = c((r) => {
37
+ if (!r || r.length === 0) return;
38
+ const x = Array.from(r);
39
+ if (x.length > s) {
40
+ N(`Máximo de ${s} arquivo(s) permitido(s)`);
41
+ return;
42
+ }
43
+ const m = [], g = [];
44
+ for (const p of x) {
45
+ const C = I(p, i);
46
+ if (C) {
47
+ g.push(`${p.name}: ${C}`);
48
+ continue;
49
+ }
50
+ const $ = O(p, t);
51
+ if ($) {
52
+ g.push(`${p.name}: ${$}`);
53
+ continue;
54
+ }
55
+ m.push(p);
56
+ }
57
+ g.length > 0 && N(g.join(`
58
+ `)), m.length > 0 && n(m), h.current && (h.current.value = "");
59
+ }, [s, i, t, n, N]), k = c(() => {
60
+ var r;
61
+ o || e || (r = h.current) == null || r.click();
62
+ }, [o, e]), P = c((r) => {
63
+ v(r.target.files);
64
+ }, [v]), V = c((r) => {
65
+ r.preventDefault(), r.stopPropagation(), !o && !e && A(!0);
66
+ }, [o, e]), b = c((r) => {
67
+ r.preventDefault(), r.stopPropagation(), A(!1);
68
+ }, []), L = c((r) => {
69
+ r.preventDefault(), r.stopPropagation(), A(!1), !(o || e) && v(r.dataTransfer.files);
70
+ }, [o, e, v]), w = D || (() => {
71
+ const r = [];
72
+ if (t) {
73
+ const x = t.split(",").map((m) => m.trim().replace(".", "").toUpperCase()).join(", ");
74
+ r.push(x);
75
+ }
76
+ return i && r.push(`máx ${i}MB cada`), r.join(" • ");
77
+ })();
78
+ return /* @__PURE__ */ l(
79
+ "div",
80
+ {
81
+ className: y(
82
+ "relative border-2 border-dashed rounded-lg p-8 text-center transition-all cursor-pointer",
83
+ "hover:border-primary/50 hover:bg-muted/30",
84
+ f && "border-primary bg-primary/5 scale-[1.02]",
85
+ (o || e) && "opacity-50 cursor-not-allowed hover:border-dashed hover:bg-transparent",
86
+ e && "animate-pulse",
87
+ j
88
+ ),
89
+ onClick: k,
90
+ onDragOver: V,
91
+ onDragLeave: b,
92
+ onDrop: L,
93
+ children: [
94
+ /* @__PURE__ */ a(
95
+ "input",
96
+ {
97
+ ref: h,
98
+ type: "file",
99
+ multiple: u,
100
+ accept: t,
101
+ className: "hidden",
102
+ onChange: P,
103
+ disabled: o || e
104
+ }
105
+ ),
106
+ /* @__PURE__ */ l("div", { className: "flex flex-col items-center gap-3", children: [
107
+ T || /* @__PURE__ */ a("div", { className: y(
108
+ "transition-transform",
109
+ f && "scale-110"
110
+ ), children: e ? /* @__PURE__ */ a("div", { className: "h-12 w-12 mx-auto", children: /* @__PURE__ */ l("svg", { className: "animate-spin h-12 w-12 text-primary", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: [
111
+ /* @__PURE__ */ a("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
112
+ /* @__PURE__ */ a("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })
113
+ ] }) }) : /* @__PURE__ */ a(W, { className: y(
114
+ "h-12 w-12 mx-auto text-muted-foreground transition-colors",
115
+ f && "text-primary"
116
+ ) }) }),
117
+ /* @__PURE__ */ l("div", { className: "space-y-1", children: [
118
+ /* @__PURE__ */ a("p", { className: y(
119
+ "font-medium transition-colors",
120
+ f && "text-primary",
121
+ e && "text-muted-foreground"
122
+ ), children: e ? "Enviando arquivos..." : f ? "Solte os arquivos aqui" : q }),
123
+ w && /* @__PURE__ */ a("p", { className: "text-xs text-muted-foreground", children: w }),
124
+ !o && !e && u && s > 1 && /* @__PURE__ */ l("p", { className: "text-xs text-muted-foreground", children: [
125
+ "Você pode selecionar até ",
126
+ s,
127
+ " arquivo(s)"
128
+ ] })
129
+ ] }),
130
+ o && /* @__PURE__ */ l("div", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [
131
+ /* @__PURE__ */ a(M, { className: "h-3 w-3" }),
132
+ /* @__PURE__ */ a("span", { children: "Upload desabilitado" })
133
+ ] })
134
+ ] })
135
+ ]
136
+ }
137
+ );
138
+ }
139
+ export {
140
+ J as FileUploadZone
141
+ };
142
+ //# sourceMappingURL=file-upload-zone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload-zone.js","sources":["../../../../src/components/ui/forms/file-upload-zone.tsx"],"sourcesContent":["import { AlertCircle, Upload } from 'lucide-react';\nimport { useCallback, useRef, useState } from 'react';\n\nimport { cn } from '../utils';\n\n/**\n * Props do componente FileUploadZone\n */\nexport interface FileUploadZoneProps {\n /** Callback quando arquivos são selecionados */\n onFilesSelected: (files: File[]) => void;\n\n /** Tipos de arquivo aceitos (ex: \".pdf,.doc,.docx\" ou \"image/*\") */\n accept?: string;\n\n /** Permitir múltiplos arquivos */\n multiple?: boolean;\n\n /** Número máximo de arquivos */\n maxFiles?: number;\n\n /** Tamanho máximo em MB */\n maxSizeMB?: number;\n\n /** Desabilitar upload */\n disabled?: boolean;\n\n /** Estado de loading/upload em andamento */\n isUploading?: boolean;\n\n /** Título da zona de upload */\n title?: string;\n\n /** Descrição da zona de upload */\n description?: string;\n\n /** Ícone customizado */\n icon?: React.ReactNode;\n\n /** Classe CSS adicional */\n className?: string;\n\n /** Callback quando houver erro de validação */\n onError?: (error: string) => void;\n}\n\n/**\n * Valida o tamanho do arquivo\n */\nfunction validarTamanhoArquivo(arquivo: File, tamanhoMaximoMB: number): string | null {\n const bytesMaximos = tamanhoMaximoMB * 1024 * 1024;\n if (arquivo.size > bytesMaximos) {\n return `Arquivo muito grande. Máximo: ${tamanhoMaximoMB}MB`;\n }\n return null;\n}\n\n/**\n * Valida o tipo do arquivo\n */\nfunction validarTipoArquivo(arquivo: File, tiposAceitos?: string): string | null {\n if (!tiposAceitos) return null;\n\n const tiposAceitosArray = tiposAceitos.split(',').map(t => t.trim().toLowerCase());\n const nomeArquivo = arquivo.name.toLowerCase();\n const tipoArquivo = arquivo.type.toLowerCase();\n\n const eValido = tiposAceitosArray.some(tipo => {\n // Wildcard (ex: image/*)\n if (tipo.includes('*')) {\n const [categoria] = tipo.split('/');\n return tipoArquivo.startsWith(categoria + '/');\n }\n\n // Extensão (ex: .pdf)\n if (tipo.startsWith('.')) {\n return nomeArquivo.endsWith(tipo);\n }\n\n // MIME type exato\n return tipoArquivo === tipo;\n });\n\n if (!eValido) {\n return 'Tipo de arquivo não suportado';\n }\n\n return null;\n}\n\n/**\n * Componente de zona de upload com drag-and-drop\n */\nexport function FileUploadZone({\n onFilesSelected,\n accept,\n multiple = true,\n maxFiles = 10,\n maxSizeMB = 50,\n disabled = false,\n isUploading = false,\n title = 'Clique para fazer upload de arquivos',\n description,\n icon,\n className,\n onError,\n}: FileUploadZoneProps) {\n const [estaArrastando, setEstaArrastando] = useState(false);\n const refInput = useRef<HTMLInputElement>(null);\n\n const gerenciarErro = useCallback((erro: string) => {\n onError?.(erro);\n }, [onError]);\n\n const validarEProcessarArquivos = useCallback((arquivos: FileList | null) => {\n if (!arquivos || arquivos.length === 0) return;\n\n const arrayArquivos = Array.from(arquivos);\n\n // Validar número de arquivos\n if (arrayArquivos.length > maxFiles) {\n gerenciarErro(`Máximo de ${maxFiles} arquivo(s) permitido(s)`);\n return;\n }\n\n // Validar cada arquivo\n const arquivosValidos: File[] = [];\n const erros: string[] = [];\n\n for (const arquivo of arrayArquivos) {\n // Validar tamanho\n const erroTamanho = validarTamanhoArquivo(arquivo, maxSizeMB);\n if (erroTamanho) {\n erros.push(`${arquivo.name}: ${erroTamanho}`);\n continue;\n }\n\n // Validar tipo\n const erroTipo = validarTipoArquivo(arquivo, accept);\n if (erroTipo) {\n erros.push(`${arquivo.name}: ${erroTipo}`);\n continue;\n }\n\n arquivosValidos.push(arquivo);\n }\n\n // Mostrar erros\n if (erros.length > 0) {\n gerenciarErro(erros.join('\\n'));\n }\n\n // Processar arquivos válidos\n if (arquivosValidos.length > 0) {\n onFilesSelected(arquivosValidos);\n }\n\n // Limpar input\n if (refInput.current) {\n refInput.current.value = '';\n }\n }, [maxFiles, maxSizeMB, accept, onFilesSelected, gerenciarErro]);\n\n const gerenciarClique = useCallback(() => {\n if (disabled || isUploading) return;\n refInput.current?.click();\n }, [disabled, isUploading]);\n\n const gerenciarMudancaArquivo = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n validarEProcessarArquivos(e.target.files);\n }, [validarEProcessarArquivos]);\n\n const gerenciarArrastarSobre = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled && !isUploading) {\n setEstaArrastando(true);\n }\n }, [disabled, isUploading]);\n\n const gerenciarArrastarSair = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setEstaArrastando(false);\n }, []);\n\n const gerenciarSoltar = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setEstaArrastando(false);\n\n if (disabled || isUploading) return;\n\n validarEProcessarArquivos(e.dataTransfer.files);\n }, [disabled, isUploading, validarEProcessarArquivos]);\n\n const descricaoPadrao = description || (() => {\n const partes: string[] = [];\n\n if (accept) {\n const tipos = accept.split(',').map(t => t.trim().replace('.', '').toUpperCase()).join(', ');\n partes.push(tipos);\n }\n\n if (maxSizeMB) {\n partes.push(`máx ${maxSizeMB}MB cada`);\n }\n\n return partes.join(' • ');\n })();\n\n return (\n <div\n className={cn(\n 'relative border-2 border-dashed rounded-lg p-8 text-center transition-all cursor-pointer',\n 'hover:border-primary/50 hover:bg-muted/30',\n estaArrastando && 'border-primary bg-primary/5 scale-[1.02]',\n (disabled || isUploading) && 'opacity-50 cursor-not-allowed hover:border-dashed hover:bg-transparent',\n isUploading && 'animate-pulse',\n className,\n )}\n onClick={gerenciarClique}\n onDragOver={gerenciarArrastarSobre}\n onDragLeave={gerenciarArrastarSair}\n onDrop={gerenciarSoltar}\n >\n <input\n ref={refInput}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n className=\"hidden\"\n onChange={gerenciarMudancaArquivo}\n disabled={disabled || isUploading}\n />\n\n <div className=\"flex flex-col items-center gap-3\">\n {icon || (\n <div className={cn(\n 'transition-transform',\n estaArrastando && 'scale-110',\n )}>\n {isUploading ? (\n <div className=\"h-12 w-12 mx-auto\">\n <svg className=\"animate-spin h-12 w-12 text-primary\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </div>\n ) : (\n <Upload className={cn(\n 'h-12 w-12 mx-auto text-muted-foreground transition-colors',\n estaArrastando && 'text-primary',\n )} />\n )}\n </div>\n )}\n\n <div className=\"space-y-1\">\n <p className={cn(\n 'font-medium transition-colors',\n estaArrastando && 'text-primary',\n isUploading && 'text-muted-foreground',\n )}>\n {isUploading ? 'Enviando arquivos...' : estaArrastando ? 'Solte os arquivos aqui' : title}\n </p>\n\n {descricaoPadrao && (\n <p className=\"text-xs text-muted-foreground\">\n {descricaoPadrao}\n </p>\n )}\n\n {!disabled && !isUploading && multiple && maxFiles > 1 && (\n <p className=\"text-xs text-muted-foreground\">\n Você pode selecionar até {maxFiles} arquivo(s)\n </p>\n )}\n </div>\n\n {disabled && (\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <AlertCircle className=\"h-3 w-3\" />\n <span>Upload desabilitado</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["validarTamanhoArquivo","arquivo","tamanhoMaximoMB","bytesMaximos","validarTipoArquivo","tiposAceitos","tiposAceitosArray","t","nomeArquivo","tipoArquivo","tipo","categoria","FileUploadZone","onFilesSelected","accept","multiple","maxFiles","maxSizeMB","disabled","isUploading","title","description","icon","className","onError","estaArrastando","setEstaArrastando","useState","refInput","useRef","gerenciarErro","useCallback","erro","validarEProcessarArquivos","arquivos","arrayArquivos","arquivosValidos","erros","erroTamanho","erroTipo","gerenciarClique","_a","gerenciarMudancaArquivo","e","gerenciarArrastarSobre","gerenciarArrastarSair","gerenciarSoltar","descricaoPadrao","partes","tipos","jsxs","cn","jsx","Upload","AlertCircle"],"mappings":";;;;AAiDA,SAASA,EAAsBC,GAAeC,GAAwC;AACpF,QAAMC,IAAeD,IAAkB,OAAO;AAC9C,SAAID,EAAQ,OAAOE,IACV,iCAAiCD,CAAe,OAElD;AACT;AAKA,SAASE,EAAmBH,GAAeI,GAAsC;AAC/E,MAAI,CAACA,EAAc,QAAO;AAE1B,QAAMC,IAAoBD,EAAa,MAAM,GAAG,EAAE,IAAI,CAAAE,MAAKA,EAAE,KAAA,EAAO,YAAA,CAAa,GAC3EC,IAAcP,EAAQ,KAAK,YAAA,GAC3BQ,IAAcR,EAAQ,KAAK,YAAA;AAkBjC,SAhBgBK,EAAkB,KAAK,CAAAI,MAAQ;AAE7C,QAAIA,EAAK,SAAS,GAAG,GAAG;AACtB,YAAM,CAACC,CAAS,IAAID,EAAK,MAAM,GAAG;AAClC,aAAOD,EAAY,WAAWE,IAAY,GAAG;AAAA,IAC/C;AAGA,WAAID,EAAK,WAAW,GAAG,IACdF,EAAY,SAASE,CAAI,IAI3BD,MAAgBC;AAAA,EACzB,CAAC,IAMM,OAHE;AAIX;AAKO,SAASE,EAAe;AAAA,EAC7B,iBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc;AAAA,EACd,OAAAC,IAAQ;AAAA,EACR,aAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC;AACF,GAAwB;AACtB,QAAM,CAACC,GAAgBC,CAAiB,IAAIC,EAAS,EAAK,GACpDC,IAAWC,EAAyB,IAAI,GAExCC,IAAgBC,EAAY,CAACC,MAAiB;AAClD,IAAAR,KAAA,QAAAA,EAAUQ;AAAA,EACZ,GAAG,CAACR,CAAO,CAAC,GAENS,IAA4BF,EAAY,CAACG,MAA8B;AAC3E,QAAI,CAACA,KAAYA,EAAS,WAAW,EAAG;AAExC,UAAMC,IAAgB,MAAM,KAAKD,CAAQ;AAGzC,QAAIC,EAAc,SAASnB,GAAU;AACnC,MAAAc,EAAc,aAAad,CAAQ,0BAA0B;AAC7D;AAAA,IACF;AAGA,UAAMoB,IAA0B,CAAA,GAC1BC,IAAkB,CAAA;AAExB,eAAWpC,KAAWkC,GAAe;AAEnC,YAAMG,IAActC,EAAsBC,GAASgB,CAAS;AAC5D,UAAIqB,GAAa;AACf,QAAAD,EAAM,KAAK,GAAGpC,EAAQ,IAAI,KAAKqC,CAAW,EAAE;AAC5C;AAAA,MACF;AAGA,YAAMC,IAAWnC,EAAmBH,GAASa,CAAM;AACnD,UAAIyB,GAAU;AACZ,QAAAF,EAAM,KAAK,GAAGpC,EAAQ,IAAI,KAAKsC,CAAQ,EAAE;AACzC;AAAA,MACF;AAEA,MAAAH,EAAgB,KAAKnC,CAAO;AAAA,IAC9B;AAGA,IAAIoC,EAAM,SAAS,KACjBP,EAAcO,EAAM,KAAK;AAAA,CAAI,CAAC,GAI5BD,EAAgB,SAAS,KAC3BvB,EAAgBuB,CAAe,GAI7BR,EAAS,YACXA,EAAS,QAAQ,QAAQ;AAAA,EAE7B,GAAG,CAACZ,GAAUC,GAAWH,GAAQD,GAAiBiB,CAAa,CAAC,GAE1DU,IAAkBT,EAAY,MAAM;;AACxC,IAAIb,KAAYC,MAChBsB,IAAAb,EAAS,YAAT,QAAAa,EAAkB;AAAA,EACpB,GAAG,CAACvB,GAAUC,CAAW,CAAC,GAEpBuB,IAA0BX,EAAY,CAACY,MAA2C;AACtF,IAAAV,EAA0BU,EAAE,OAAO,KAAK;AAAA,EAC1C,GAAG,CAACV,CAAyB,CAAC,GAExBW,IAAyBb,EAAY,CAACY,MAAuC;AACjF,IAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACE,CAACzB,KAAY,CAACC,KAChBO,EAAkB,EAAI;AAAA,EAE1B,GAAG,CAACR,GAAUC,CAAW,CAAC,GAEpB0B,IAAwBd,EAAY,CAACY,MAAuC;AAChF,IAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFjB,EAAkB,EAAK;AAAA,EACzB,GAAG,CAAA,CAAE,GAECoB,IAAkBf,EAAY,CAACY,MAAuC;AAK1E,IAJAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFjB,EAAkB,EAAK,GAEnB,EAAAR,KAAYC,MAEhBc,EAA0BU,EAAE,aAAa,KAAK;AAAA,EAChD,GAAG,CAACzB,GAAUC,GAAac,CAAyB,CAAC,GAE/Cc,IAAkB1B,MAAgB,MAAM;AAC5C,UAAM2B,IAAmB,CAAA;AAEzB,QAAIlC,GAAQ;AACV,YAAMmC,IAAQnC,EAAO,MAAM,GAAG,EAAE,IAAI,OAAKP,EAAE,KAAA,EAAO,QAAQ,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,IAAI;AAC3F,MAAAyC,EAAO,KAAKC,CAAK;AAAA,IACnB;AAEA,WAAIhC,KACF+B,EAAO,KAAK,OAAO/B,CAAS,SAAS,GAGhC+B,EAAO,KAAK,KAAK;AAAA,EAC1B,GAAA;AAEA,SACE,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACA;AAAA,QACA1B,KAAkB;AAAA,SACjBP,KAAYC,MAAgB;AAAA,QAC7BA,KAAe;AAAA,QACfI;AAAA,MAAA;AAAA,MAEF,SAASiB;AAAA,MACT,YAAYI;AAAA,MACZ,aAAaC;AAAA,MACb,QAAQC;AAAA,MAER,UAAA;AAAA,QAAA,gBAAAM;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKxB;AAAA,YACL,MAAK;AAAA,YACL,UAAAb;AAAA,YACA,QAAAD;AAAA,YACA,WAAU;AAAA,YACV,UAAU4B;AAAA,YACV,UAAUxB,KAAYC;AAAA,UAAA;AAAA,QAAA;AAAA,QAGxB,gBAAA+B,EAAC,OAAA,EAAI,WAAU,oCACZ,UAAA;AAAA,UAAA5B,KACC,gBAAA8B,EAAC,SAAI,WAAWD;AAAA,YACd;AAAA,YACA1B,KAAkB;AAAA,UAAA,GAEjB,UAAAN,IACC,gBAAAiC,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA,gBAAAF,EAAC,OAAA,EAAI,WAAU,uCAAsC,OAAM,8BAA6B,MAAK,QAAO,SAAQ,aAC1G,UAAA;AAAA,YAAA,gBAAAE,EAAC,UAAA,EAAO,WAAU,cAAa,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,gBAAe,aAAY,KAAI;AAAA,8BAC3F,QAAA,EAAK,WAAU,cAAa,MAAK,gBAAe,GAAE,kHAAA,CAAkH;AAAA,UAAA,EAAA,CACvK,EAAA,CACF,IAEA,gBAAAA,EAACC,GAAA,EAAO,WAAWF;AAAA,YACjB;AAAA,YACA1B,KAAkB;AAAA,UAAA,GACjB,EAAA,CAEP;AAAA,UAGF,gBAAAyB,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,YAAA,gBAAAE,EAAC,OAAE,WAAWD;AAAA,cACZ;AAAA,cACA1B,KAAkB;AAAA,cAClBN,KAAe;AAAA,YAAA,GAEd,UAAAA,IAAc,yBAAyBM,IAAiB,2BAA2BL,GACtF;AAAA,YAEC2B,KACC,gBAAAK,EAAC,KAAA,EAAE,WAAU,iCACV,UAAAL,GACH;AAAA,YAGD,CAAC7B,KAAY,CAACC,KAAeJ,KAAYC,IAAW,KACnD,gBAAAkC,EAAC,KAAA,EAAE,WAAU,iCAAgC,UAAA;AAAA,cAAA;AAAA,cACjBlC;AAAA,cAAS;AAAA,YAAA,EAAA,CACrC;AAAA,UAAA,GAEJ;AAAA,UAECE,KACC,gBAAAgC,EAAC,OAAA,EAAI,WAAU,yDACb,UAAA;AAAA,YAAA,gBAAAE,EAACE,GAAA,EAAY,WAAU,UAAA,CAAU;AAAA,YACjC,gBAAAF,EAAC,UAAK,UAAA,sBAAA,CAAmB;AAAA,UAAA,EAAA,CAC3B;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("react/jsx-runtime"),b=require("react"),I=require("@radix-ui/react-slot"),c=require("react-hook-form"),d=require("../utils.cjs"),j=require("../primitives/label.cjs");function C(e){const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(o,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return o.default=e,Object.freeze(o)}const s=C(b),y=c.FormProvider,l=s.createContext({}),v=({...e})=>m.jsx(l.Provider,{value:{name:e.name},children:m.jsx(c.Controller,{...e})}),i=()=>{const e=s.useContext(l),o=s.useContext(u),{getFieldState:t}=c.useFormContext(),r=c.useFormState({name:e.name}),a=t(e.name,r);if(!e)throw new Error("useFormField should be used within <FormField>");const{id:n}=o;return{id:n,name:e.name,formItemId:`${n}-form-item`,formDescriptionId:`${n}-form-item-description`,formMessageId:`${n}-form-item-message`,...a}},u=s.createContext({}),f=s.forwardRef(({className:e,...o},t)=>{const r=s.useId();return m.jsx(u.Provider,{value:{id:r},children:m.jsx("div",{ref:t,"data-slot":"form-item",className:d.cn("grid gap-2",e),...o})})});f.displayName="FormItem";const F=s.forwardRef(({className:e,...o},t)=>{const{error:r,formItemId:a}=i();return m.jsx(j.Label,{ref:t,"data-slot":"form-label","data-error":!!r,className:d.cn("data-[error=true]:text-destructive",e),htmlFor:a,...o})});F.displayName="FormLabel";const x=s.forwardRef(({...e},o)=>{const{error:t,formItemId:r,formDescriptionId:a,formMessageId:n}=i();return m.jsx(I.Slot,{ref:o,"data-slot":"form-control",id:r,"aria-describedby":t?`${a} ${n}`:`${a}`,"aria-invalid":!!t,...e})});x.displayName="FormControl";const g=s.forwardRef(({className:e,...o},t)=>{const{formDescriptionId:r}=i();return m.jsx("p",{ref:t,"data-slot":"form-description",id:r,className:d.cn("text-muted-foreground text-sm",e),...o})});g.displayName="FormDescription";const p=s.forwardRef(({className:e,...o},t)=>{const{error:r,formMessageId:a}=i(),n=r?String((r==null?void 0:r.message)??""):o.children;return n?m.jsx("p",{ref:t,"data-slot":"form-message",id:a,className:d.cn("text-destructive text-sm",e),...o,children:n}):null});p.displayName="FormMessage";exports.Form=y;exports.FormControl=x;exports.FormDescription=g;exports.FormField=v;exports.FormItem=f;exports.FormLabel=F;exports.FormMessage=p;exports.useFormField=i;
2
+ //# sourceMappingURL=form.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.cjs","sources":["../../../../src/components/ui/forms/form.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n Controller,\n FormProvider,\n useFormContext,\n useFormState,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\";\n\nimport { cn } from \"../utils\";\nimport { Label } from \"../primitives/label\";\n\nconst Form = FormProvider;\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n name: TName;\n};\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n {} as FormFieldContextValue,\n);\n\nconst FormField = <\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n );\n};\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext);\n const itemContext = React.useContext(FormItemContext);\n const { getFieldState } = useFormContext();\n const formState = useFormState({ name: fieldContext.name });\n const fieldState = getFieldState(fieldContext.name, formState);\n\n if (!fieldContext) {\n throw new Error(\"useFormField should be used within <FormField>\");\n }\n\n const { id } = itemContext;\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n };\n};\n\ntype FormItemContextValue = {\n id: string;\n};\n\nconst FormItemContext = React.createContext<FormItemContextValue>(\n {} as FormItemContextValue,\n);\n\nconst FormItem = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n const id = React.useId();\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div\n ref={ref}\n data-slot=\"form-item\"\n className={cn(\"grid gap-2\", className)}\n {...props}\n />\n </FormItemContext.Provider>\n );\n});\nFormItem.displayName = \"FormItem\";\n\nconst FormLabel = React.forwardRef<\n React.ElementRef<typeof Label>,\n React.ComponentPropsWithoutRef<typeof Label>\n>(({ className, ...props }, ref) => {\n const { error, formItemId } = useFormField();\n\n return (\n <Label\n ref={ref}\n data-slot=\"form-label\"\n data-error={!!error}\n className={cn(\"data-[error=true]:text-destructive\", className)}\n htmlFor={formItemId}\n {...props}\n />\n );\n});\nFormLabel.displayName = \"FormLabel\";\n\nconst FormControl = React.forwardRef<\n React.ElementRef<typeof Slot>,\n React.ComponentPropsWithoutRef<typeof Slot>\n>(({ ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } =\n useFormField();\n\n return (\n <Slot\n ref={ref}\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={\n !error\n ? `${formDescriptionId}`\n : `${formDescriptionId} ${formMessageId}`\n }\n aria-invalid={!!error}\n {...props}\n />\n );\n});\nFormControl.displayName = \"FormControl\";\n\nconst FormDescription = React.forwardRef<\n HTMLParagraphElement,\n React.ComponentProps<\"p\">\n>(({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField();\n\n return (\n <p\n ref={ref}\n data-slot=\"form-description\"\n id={formDescriptionId}\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n});\nFormDescription.displayName = \"FormDescription\";\n\nconst FormMessage = React.forwardRef<\n HTMLParagraphElement,\n React.ComponentProps<\"p\">\n>(({ className, ...props }, ref) => {\n const { error, formMessageId } = useFormField();\n const body = error ? String(error?.message ?? \"\") : props.children;\n\n if (!body) {\n return null;\n }\n\n return (\n <p\n ref={ref}\n data-slot=\"form-message\"\n id={formMessageId}\n className={cn(\"text-destructive text-sm\", className)}\n {...props}\n >\n {body}\n </p>\n );\n});\nFormMessage.displayName = \"FormMessage\";\n\nexport {\n useFormField,\n Form,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n FormField,\n};\n"],"names":["Form","FormProvider","FormFieldContext","React","FormField","props","jsx","Controller","useFormField","fieldContext","itemContext","FormItemContext","getFieldState","useFormContext","formState","useFormState","fieldState","id","FormItem","className","ref","cn","FormLabel","error","formItemId","Label","FormControl","formDescriptionId","formMessageId","Slot","FormDescription","FormMessage","body"],"mappings":"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"}