@techzyapp/ui-library 1.0.19 → 1.0.21

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 (377) hide show
  1. package/dist/{Accordion-Dy_dM79Y.cjs → Accordion-P3PNqSER.cjs} +2 -2
  2. package/dist/{Accordion-Dy_dM79Y.cjs.map → Accordion-P3PNqSER.cjs.map} +1 -1
  3. package/dist/{Accordion-CAxa1I-m.js → Accordion-w-w_WxxV.js} +3 -3
  4. package/dist/{Accordion-CAxa1I-m.js.map → Accordion-w-w_WxxV.js.map} +1 -1
  5. package/dist/{AdminRoot-DlpMJNTx.cjs → AdminRoot-BDRLuMX6.cjs} +2 -2
  6. package/dist/{AdminRoot-DlpMJNTx.cjs.map → AdminRoot-BDRLuMX6.cjs.map} +1 -1
  7. package/dist/{AdminRoot-B2J1cHK5.js → AdminRoot-DvF0js0q.js} +4 -4
  8. package/dist/{AdminRoot-B2J1cHK5.js.map → AdminRoot-DvF0js0q.js.map} +1 -1
  9. package/dist/{Alert-DRZdNwDm.cjs → Alert-CwoRkKq4.cjs} +2 -2
  10. package/dist/{Alert-DRZdNwDm.cjs.map → Alert-CwoRkKq4.cjs.map} +1 -1
  11. package/dist/{Alert-yldGvhVM.js → Alert-DPYmdaWs.js} +5 -5
  12. package/dist/{Alert-yldGvhVM.js.map → Alert-DPYmdaWs.js.map} +1 -1
  13. package/dist/{AuthLayout-B1tzhzHo.cjs → AuthLayout-BRUxDgzs.cjs} +2 -2
  14. package/dist/{AuthLayout-B1tzhzHo.cjs.map → AuthLayout-BRUxDgzs.cjs.map} +1 -1
  15. package/dist/{AuthLayout-j7EAPPXT.js → AuthLayout-CP9qu6Bv.js} +2 -2
  16. package/dist/{AuthLayout-j7EAPPXT.js.map → AuthLayout-CP9qu6Bv.js.map} +1 -1
  17. package/dist/{Avatar-_ufXh3AY.cjs → Avatar-Dgf04PBC.cjs} +2 -2
  18. package/dist/{Avatar-_ufXh3AY.cjs.map → Avatar-Dgf04PBC.cjs.map} +1 -1
  19. package/dist/{Avatar-BJVCdo-K.js → Avatar-Q50J8wdN.js} +3 -3
  20. package/dist/{Avatar-BJVCdo-K.js.map → Avatar-Q50J8wdN.js.map} +1 -1
  21. package/dist/{AvatarGroup-DdJf4aT7.js → AvatarGroup-YaNasLMS.js} +2 -2
  22. package/dist/{AvatarGroup-DdJf4aT7.js.map → AvatarGroup-YaNasLMS.js.map} +1 -1
  23. package/dist/{AvatarGroup-TW1pt4tj.cjs → AvatarGroup-uW0SD5P4.cjs} +2 -2
  24. package/dist/{AvatarGroup-TW1pt4tj.cjs.map → AvatarGroup-uW0SD5P4.cjs.map} +1 -1
  25. package/dist/{Breadcrumbs-f0GE4lCI.cjs → Breadcrumbs-CknDBLMw.cjs} +2 -2
  26. package/dist/{Breadcrumbs-f0GE4lCI.cjs.map → Breadcrumbs-CknDBLMw.cjs.map} +1 -1
  27. package/dist/{Breadcrumbs-FpIOHx_q.js → Breadcrumbs-l0PlUpQ4.js} +5 -5
  28. package/dist/{Breadcrumbs-FpIOHx_q.js.map → Breadcrumbs-l0PlUpQ4.js.map} +1 -1
  29. package/dist/{Button-Cu0XdnW6.cjs → Button-BdihbLYJ.cjs} +2 -2
  30. package/dist/{Button-Cu0XdnW6.cjs.map → Button-BdihbLYJ.cjs.map} +1 -1
  31. package/dist/{Button-BkjZ7wEu.js → Button-RljTGqHl.js} +2 -2
  32. package/dist/{Button-BkjZ7wEu.js.map → Button-RljTGqHl.js.map} +1 -1
  33. package/dist/{Calendar-DsJ6GICt.js → Calendar-CKCikOQL.js} +4 -4
  34. package/dist/{Calendar-DsJ6GICt.js.map → Calendar-CKCikOQL.js.map} +1 -1
  35. package/dist/{Calendar-CGQCditF.cjs → Calendar-DVg1uQuj.cjs} +2 -2
  36. package/dist/{Calendar-CGQCditF.cjs.map → Calendar-DVg1uQuj.cjs.map} +1 -1
  37. package/dist/{Card-CumMi_XB.js → Card-B0bYi4g2.js} +4 -4
  38. package/dist/{Card-CumMi_XB.js.map → Card-B0bYi4g2.js.map} +1 -1
  39. package/dist/{Card-DGTGdaTZ.cjs → Card-BYFuYD-a.cjs} +2 -2
  40. package/dist/{Card-DGTGdaTZ.cjs.map → Card-BYFuYD-a.cjs.map} +1 -1
  41. package/dist/Checkbox-ZYOSBYRt.js +98 -0
  42. package/dist/Checkbox-ZYOSBYRt.js.map +1 -0
  43. package/dist/Checkbox-fzJCwe0j.cjs +2 -0
  44. package/dist/Checkbox-fzJCwe0j.cjs.map +1 -0
  45. package/dist/{Chip-D83svOCW.js → Chip-BiqfnRUi.js} +3 -3
  46. package/dist/{Chip-D83svOCW.js.map → Chip-BiqfnRUi.js.map} +1 -1
  47. package/dist/{Chip-CJuAvgst.cjs → Chip-CdKUtUGE.cjs} +2 -2
  48. package/dist/{Chip-CJuAvgst.cjs.map → Chip-CdKUtUGE.cjs.map} +1 -1
  49. package/dist/{ChoiceCardGroup-CvFzZlgI.js → ChoiceCardGroup-DBohUnRj.js} +3 -3
  50. package/dist/{ChoiceCardGroup-CvFzZlgI.js.map → ChoiceCardGroup-DBohUnRj.js.map} +1 -1
  51. package/dist/{ChoiceCardGroup-6eFM1eL0.cjs → ChoiceCardGroup-d0VVTUi5.cjs} +2 -2
  52. package/dist/{ChoiceCardGroup-6eFM1eL0.cjs.map → ChoiceCardGroup-d0VVTUi5.cjs.map} +1 -1
  53. package/dist/{CodeBlock-BK_KXhos.js → CodeBlock-BX_0tpk3.js} +4 -4
  54. package/dist/{CodeBlock-BK_KXhos.js.map → CodeBlock-BX_0tpk3.js.map} +1 -1
  55. package/dist/{CodeBlock-C_UDrrY6.cjs → CodeBlock-CAAggVXS.cjs} +2 -2
  56. package/dist/{CodeBlock-C_UDrrY6.cjs.map → CodeBlock-CAAggVXS.cjs.map} +1 -1
  57. package/dist/{ColorPicker-BmxZnsNC.cjs → ColorPicker-BCSaT1A-.cjs} +2 -2
  58. package/dist/{ColorPicker-BmxZnsNC.cjs.map → ColorPicker-BCSaT1A-.cjs.map} +1 -1
  59. package/dist/{ColorPicker-DLnB_AvZ.js → ColorPicker-DhSlvwNj.js} +3 -3
  60. package/dist/{ColorPicker-DLnB_AvZ.js.map → ColorPicker-DhSlvwNj.js.map} +1 -1
  61. package/dist/{ColorPickerPanel-CoyKplF5.cjs → ColorPickerPanel-BOGYXXF1.cjs} +2 -2
  62. package/dist/{ColorPickerPanel-CoyKplF5.cjs.map → ColorPickerPanel-BOGYXXF1.cjs.map} +1 -1
  63. package/dist/{ColorPickerPanel-CG9idF4A.js → ColorPickerPanel-D4t3b9bB.js} +3 -3
  64. package/dist/{ColorPickerPanel-CG9idF4A.js.map → ColorPickerPanel-D4t3b9bB.js.map} +1 -1
  65. package/dist/{ConfigProvider-h1WoGC3R.cjs → ConfigProvider-C7DUWHrb.cjs} +2 -2
  66. package/dist/{ConfigProvider-h1WoGC3R.cjs.map → ConfigProvider-C7DUWHrb.cjs.map} +1 -1
  67. package/dist/{ConfigProvider-DDuIJSM7.js → ConfigProvider-DT0yrgmd.js} +2 -2
  68. package/dist/{ConfigProvider-DDuIJSM7.js.map → ConfigProvider-DT0yrgmd.js.map} +1 -1
  69. package/dist/{CopyButton-tRMAy59I.cjs → CopyButton-3585thVM.cjs} +2 -2
  70. package/dist/{CopyButton-tRMAy59I.cjs.map → CopyButton-3585thVM.cjs.map} +1 -1
  71. package/dist/{CopyButton-DdQ-8ExN.js → CopyButton-BEY1gJzK.js} +4 -4
  72. package/dist/{CopyButton-DdQ-8ExN.js.map → CopyButton-BEY1gJzK.js.map} +1 -1
  73. package/dist/{DashedButton-q7AOqKUE.cjs → DashedButton-3C4IZuo4.cjs} +2 -2
  74. package/dist/{DashedButton-q7AOqKUE.cjs.map → DashedButton-3C4IZuo4.cjs.map} +1 -1
  75. package/dist/{DashedButton-DeiALUPA.js → DashedButton-BXZAyMtw.js} +3 -3
  76. package/dist/{DashedButton-DeiALUPA.js.map → DashedButton-BXZAyMtw.js.map} +1 -1
  77. package/dist/{DatePicker-pz634ktl.js → DatePicker-CEFGgXLF.js} +5 -5
  78. package/dist/{DatePicker-pz634ktl.js.map → DatePicker-CEFGgXLF.js.map} +1 -1
  79. package/dist/{DatePicker-eryY6Xmx.cjs → DatePicker-Dyj2halw.cjs} +2 -2
  80. package/dist/{DatePicker-eryY6Xmx.cjs.map → DatePicker-Dyj2halw.cjs.map} +1 -1
  81. package/dist/{DateTimePicker-CmH3ZuzN.cjs → DateTimePicker-CjX4-8PP.cjs} +2 -2
  82. package/dist/{DateTimePicker-CmH3ZuzN.cjs.map → DateTimePicker-CjX4-8PP.cjs.map} +1 -1
  83. package/dist/{DateTimePicker-BJLq9Fud.js → DateTimePicker-hmYBEuUM.js} +8 -8
  84. package/dist/{DateTimePicker-BJLq9Fud.js.map → DateTimePicker-hmYBEuUM.js.map} +1 -1
  85. package/dist/{EmptyState-Cxf4H8Cc.cjs → EmptyState-Bj-vX_UV.cjs} +2 -2
  86. package/dist/{EmptyState-Cxf4H8Cc.cjs.map → EmptyState-Bj-vX_UV.cjs.map} +1 -1
  87. package/dist/{EmptyState-B2QPNhWW.js → EmptyState-DJDNLKT7.js} +4 -4
  88. package/dist/{EmptyState-B2QPNhWW.js.map → EmptyState-DJDNLKT7.js.map} +1 -1
  89. package/dist/{FileCard-Do9D72NA.js → FileCard-C9Ncifnu.js} +5 -5
  90. package/dist/{FileCard-Do9D72NA.js.map → FileCard-C9Ncifnu.js.map} +1 -1
  91. package/dist/{FileCard-D0Sa7WJt.cjs → FileCard-Dr5-z1R3.cjs} +2 -2
  92. package/dist/{FileCard-D0Sa7WJt.cjs.map → FileCard-Dr5-z1R3.cjs.map} +1 -1
  93. package/dist/{FileUploader-B1Arfj1a.cjs → FileUploader-DeyZENqq.cjs} +2 -2
  94. package/dist/{FileUploader-B1Arfj1a.cjs.map → FileUploader-DeyZENqq.cjs.map} +1 -1
  95. package/dist/{FileUploader-4900qKEE.js → FileUploader-XFmBNkA0.js} +6 -6
  96. package/dist/{FileUploader-4900qKEE.js.map → FileUploader-XFmBNkA0.js.map} +1 -1
  97. package/dist/{Flag-DNhhLtCC.js → Flag-Bs0xNP-P.js} +2 -2
  98. package/dist/{Flag-DNhhLtCC.js.map → Flag-Bs0xNP-P.js.map} +1 -1
  99. package/dist/{Flag-D7Vlczlw.cjs → Flag-Bxnx26DM.cjs} +2 -2
  100. package/dist/{Flag-D7Vlczlw.cjs.map → Flag-Bxnx26DM.cjs.map} +1 -1
  101. package/dist/{FullscreenToggle-dU2ai_OZ.cjs → FullscreenToggle-BncatGKj.cjs} +2 -2
  102. package/dist/{FullscreenToggle-dU2ai_OZ.cjs.map → FullscreenToggle-BncatGKj.cjs.map} +1 -1
  103. package/dist/{FullscreenToggle-Bc4fB-Mi.js → FullscreenToggle-DMlp05UN.js} +4 -4
  104. package/dist/{FullscreenToggle-Bc4fB-Mi.js.map → FullscreenToggle-DMlp05UN.js.map} +1 -1
  105. package/dist/Icon-BVULqOJD.cjs +2 -0
  106. package/dist/Icon-BVULqOJD.cjs.map +1 -0
  107. package/dist/{Icon-CophpkHo.js → Icon-DaTvzLBu.js} +2 -1
  108. package/dist/Icon-DaTvzLBu.js.map +1 -0
  109. package/dist/{IconButton-DpTxmj3d.js → IconButton-DXMmtuLA.js} +2 -2
  110. package/dist/{IconButton-DpTxmj3d.js.map → IconButton-DXMmtuLA.js.map} +1 -1
  111. package/dist/{IconButton-DyRC514t.cjs → IconButton-Lv0sDDR9.cjs} +2 -2
  112. package/dist/{IconButton-DyRC514t.cjs.map → IconButton-Lv0sDDR9.cjs.map} +1 -1
  113. package/dist/{ListItem-B4Upc0Hy.js → ListItem-Cn15lJBr.js} +3 -3
  114. package/dist/{ListItem-B4Upc0Hy.js.map → ListItem-Cn15lJBr.js.map} +1 -1
  115. package/dist/{ListItem-DWQorRxG.cjs → ListItem-yXXjtepZ.cjs} +2 -2
  116. package/dist/{ListItem-DWQorRxG.cjs.map → ListItem-yXXjtepZ.cjs.map} +1 -1
  117. package/dist/{Loader-B45H2SMP.cjs → Loader-53HFNMVX.cjs} +2 -2
  118. package/dist/{Loader-B45H2SMP.cjs.map → Loader-53HFNMVX.cjs.map} +1 -1
  119. package/dist/{Loader-B9VXX401.js → Loader-WsjQFl4p.js} +2 -2
  120. package/dist/{Loader-B9VXX401.js.map → Loader-WsjQFl4p.js.map} +1 -1
  121. package/dist/{Modal-Us_E-lb2.js → Modal-DBYcoCbJ.js} +5 -5
  122. package/dist/{Modal-Us_E-lb2.js.map → Modal-DBYcoCbJ.js.map} +1 -1
  123. package/dist/{Modal-DsoSz0Sp.cjs → Modal-V6eyGSzW.cjs} +2 -2
  124. package/dist/{Modal-DsoSz0Sp.cjs.map → Modal-V6eyGSzW.cjs.map} +1 -1
  125. package/dist/{MultiSelect-sKk2KzOd.js → MultiSelect-BsYPr3LD.js} +6 -6
  126. package/dist/{MultiSelect-sKk2KzOd.js.map → MultiSelect-BsYPr3LD.js.map} +1 -1
  127. package/dist/{MultiSelect-CtLpWaBX.cjs → MultiSelect-DS2DRpaP.cjs} +2 -2
  128. package/dist/{MultiSelect-CtLpWaBX.cjs.map → MultiSelect-DS2DRpaP.cjs.map} +1 -1
  129. package/dist/{NumberField-C6qj3nCa.cjs → NumberField-DC3TdGTt.cjs} +2 -2
  130. package/dist/{NumberField-C6qj3nCa.cjs.map → NumberField-DC3TdGTt.cjs.map} +1 -1
  131. package/dist/{NumberField-Cz03nksO.js → NumberField-mFb9pKCx.js} +4 -4
  132. package/dist/{NumberField-Cz03nksO.js.map → NumberField-mFb9pKCx.js.map} +1 -1
  133. package/dist/{OtpField-DLXQYMw1.js → OtpField-1ullIIZQ.js} +2 -2
  134. package/dist/{OtpField-DLXQYMw1.js.map → OtpField-1ullIIZQ.js.map} +1 -1
  135. package/dist/{OtpField-B46P6aMy.cjs → OtpField-BYj9SDHb.cjs} +2 -2
  136. package/dist/{OtpField-B46P6aMy.cjs.map → OtpField-BYj9SDHb.cjs.map} +1 -1
  137. package/dist/{PageLayout-BfeRjBek.cjs → PageLayout-pYL43wI9.cjs} +2 -2
  138. package/dist/{PageLayout-BfeRjBek.cjs.map → PageLayout-pYL43wI9.cjs.map} +1 -1
  139. package/dist/{PageLayout-BWU-p_N9.js → PageLayout-qf0H_EmS.js} +2 -2
  140. package/dist/{PageLayout-BWU-p_N9.js.map → PageLayout-qf0H_EmS.js.map} +1 -1
  141. package/dist/{PageNotFound-nvZm-UCG.cjs → PageNotFound-D1795gJ7.cjs} +2 -2
  142. package/dist/{PageNotFound-nvZm-UCG.cjs.map → PageNotFound-D1795gJ7.cjs.map} +1 -1
  143. package/dist/{PageNotFound-B_nTMrCD.js → PageNotFound-YGVMVvyG.js} +5 -5
  144. package/dist/{PageNotFound-B_nTMrCD.js.map → PageNotFound-YGVMVvyG.js.map} +1 -1
  145. package/dist/{Pagination-BYXUhmSz.js → Pagination-BTvUJiee.js} +3 -3
  146. package/dist/{Pagination-BYXUhmSz.js.map → Pagination-BTvUJiee.js.map} +1 -1
  147. package/dist/{Pagination-CsClNqIu.cjs → Pagination-WJq_7QNi.cjs} +2 -2
  148. package/dist/{Pagination-CsClNqIu.cjs.map → Pagination-WJq_7QNi.cjs.map} +1 -1
  149. package/dist/{RemoveDialog-PHdZi9-d.js → RemoveDialog-BSQ6EMW-.js} +5 -5
  150. package/dist/{RemoveDialog-PHdZi9-d.js.map → RemoveDialog-BSQ6EMW-.js.map} +1 -1
  151. package/dist/{RemoveDialog-D5J9TYap.cjs → RemoveDialog-BhcwsY0q.cjs} +2 -2
  152. package/dist/{RemoveDialog-D5J9TYap.cjs.map → RemoveDialog-BhcwsY0q.cjs.map} +1 -1
  153. package/dist/{RichTextEditor-jWv0t3vJ.cjs → RichTextEditor-Bc1fhvzn.cjs} +2 -2
  154. package/dist/{RichTextEditor-jWv0t3vJ.cjs.map → RichTextEditor-Bc1fhvzn.cjs.map} +1 -1
  155. package/dist/{RichTextEditor-BcmsnYGJ.js → RichTextEditor-CaGPtwXe.js} +9 -9
  156. package/dist/{RichTextEditor-BcmsnYGJ.js.map → RichTextEditor-CaGPtwXe.js.map} +1 -1
  157. package/dist/{RootLayout-q_oWf5et.js → RootLayout-BNwHsuhC.js} +31 -31
  158. package/dist/{RootLayout-q_oWf5et.js.map → RootLayout-BNwHsuhC.js.map} +1 -1
  159. package/dist/{RootLayout-DtZcqk9N.cjs → RootLayout-CB-3FgOp.cjs} +2 -2
  160. package/dist/{RootLayout-DtZcqk9N.cjs.map → RootLayout-CB-3FgOp.cjs.map} +1 -1
  161. package/dist/{Select-CWCeBQ8Q.cjs → Select-Cx1Yl8nq.cjs} +2 -2
  162. package/dist/{Select-CWCeBQ8Q.cjs.map → Select-Cx1Yl8nq.cjs.map} +1 -1
  163. package/dist/{Select-UygxT1Ry.js → Select-vKZzS9K4.js} +6 -6
  164. package/dist/{Select-UygxT1Ry.js.map → Select-vKZzS9K4.js.map} +1 -1
  165. package/dist/{Sidebar-C0OJK29L.js → Sidebar-CJ7DtOqb.js} +5 -5
  166. package/dist/{Sidebar-C0OJK29L.js.map → Sidebar-CJ7DtOqb.js.map} +1 -1
  167. package/dist/{Sidebar-BfBggyuh.cjs → Sidebar-Cv95DJxZ.cjs} +2 -2
  168. package/dist/{Sidebar-BfBggyuh.cjs.map → Sidebar-Cv95DJxZ.cjs.map} +1 -1
  169. package/dist/{SpeedDial-DbvOJ4no.js → SpeedDial-Bb0ioXaO.js} +4 -4
  170. package/dist/{SpeedDial-DbvOJ4no.js.map → SpeedDial-Bb0ioXaO.js.map} +1 -1
  171. package/dist/{SpeedDial-cKvuSMuk.cjs → SpeedDial-D6sO-9ES.cjs} +2 -2
  172. package/dist/{SpeedDial-cKvuSMuk.cjs.map → SpeedDial-D6sO-9ES.cjs.map} +1 -1
  173. package/dist/{Stepper-BxGrP6JZ.js → Stepper-BaEOUnYe.js} +4 -4
  174. package/dist/{Stepper-BxGrP6JZ.js.map → Stepper-BaEOUnYe.js.map} +1 -1
  175. package/dist/{Stepper-Db_ALAc4.cjs → Stepper-CVY8NJEI.cjs} +2 -2
  176. package/dist/{Stepper-Db_ALAc4.cjs.map → Stepper-CVY8NJEI.cjs.map} +1 -1
  177. package/dist/{SwatchPicker-DbAU9-ux.cjs → SwatchPicker-CCJltwHI.cjs} +2 -2
  178. package/dist/{SwatchPicker-DbAU9-ux.cjs.map → SwatchPicker-CCJltwHI.cjs.map} +1 -1
  179. package/dist/{SwatchPicker-D30aSrbY.js → SwatchPicker-CqyWngFJ.js} +2 -2
  180. package/dist/{SwatchPicker-D30aSrbY.js.map → SwatchPicker-CqyWngFJ.js.map} +1 -1
  181. package/dist/{Table-Dvna5_TR.cjs → Table-AQ7yJhtW.cjs} +2 -2
  182. package/dist/{Table-Dvna5_TR.cjs.map → Table-AQ7yJhtW.cjs.map} +1 -1
  183. package/dist/{Table-tPOJ9umi.js → Table-wn-B7iLj.js} +143 -143
  184. package/dist/{Table-tPOJ9umi.js.map → Table-wn-B7iLj.js.map} +1 -1
  185. package/dist/{Tabs-ozklGWmX.cjs → Tabs-BtcJ2jBl.cjs} +2 -2
  186. package/dist/{Tabs-ozklGWmX.cjs.map → Tabs-BtcJ2jBl.cjs.map} +1 -1
  187. package/dist/{Tabs-B0mWCNaC.js → Tabs-DJMfAUni.js} +4 -4
  188. package/dist/{Tabs-B0mWCNaC.js.map → Tabs-DJMfAUni.js.map} +1 -1
  189. package/dist/{TagsField-BIxwLfSJ.cjs → TagsField-4x3RmGwt.cjs} +2 -2
  190. package/dist/{TagsField-BIxwLfSJ.cjs.map → TagsField-4x3RmGwt.cjs.map} +1 -1
  191. package/dist/{TagsField-CGFm17lP.js → TagsField-Bvh6Fm5Y.js} +5 -5
  192. package/dist/{TagsField-CGFm17lP.js.map → TagsField-Bvh6Fm5Y.js.map} +1 -1
  193. package/dist/{TextField-DvKEj36A.cjs → TextField-DNqnpAWB.cjs} +2 -2
  194. package/dist/{TextField-DvKEj36A.cjs.map → TextField-DNqnpAWB.cjs.map} +1 -1
  195. package/dist/{TextField-CRCYLPpr.js → TextField-DcdwUA9d.js} +4 -4
  196. package/dist/{TextField-CRCYLPpr.js.map → TextField-DcdwUA9d.js.map} +1 -1
  197. package/dist/{ThemeToggle-BwW9L115.js → ThemeToggle-BVQmSMsj.js} +4 -4
  198. package/dist/{ThemeToggle-BwW9L115.js.map → ThemeToggle-BVQmSMsj.js.map} +1 -1
  199. package/dist/{ThemeToggle-DxxLN79b.cjs → ThemeToggle-isboxfZk.cjs} +2 -2
  200. package/dist/{ThemeToggle-DxxLN79b.cjs.map → ThemeToggle-isboxfZk.cjs.map} +1 -1
  201. package/dist/{TimeColumns-D3nqkQbh.js → TimeColumns-CFy_PynH.js} +2 -2
  202. package/dist/{TimeColumns-D3nqkQbh.js.map → TimeColumns-CFy_PynH.js.map} +1 -1
  203. package/dist/{TimeColumns-DB-V4KpQ.cjs → TimeColumns-DxFjjtc7.cjs} +2 -2
  204. package/dist/{TimeColumns-DB-V4KpQ.cjs.map → TimeColumns-DxFjjtc7.cjs.map} +1 -1
  205. package/dist/{TimePicker-D51QkQYy.js → TimePicker-ZO7jOJVa.js} +6 -6
  206. package/dist/{TimePicker-D51QkQYy.js.map → TimePicker-ZO7jOJVa.js.map} +1 -1
  207. package/dist/{TimePicker-D__72q2J.cjs → TimePicker-v1yA7Igl.cjs} +2 -2
  208. package/dist/{TimePicker-D__72q2J.cjs.map → TimePicker-v1yA7Igl.cjs.map} +1 -1
  209. package/dist/{Timeline-WkV4k_we.js → Timeline-D3kzt1dy.js} +3 -3
  210. package/dist/{Timeline-WkV4k_we.js.map → Timeline-D3kzt1dy.js.map} +1 -1
  211. package/dist/{Timeline-CoxW0Ia_.cjs → Timeline-ONU_3gi3.cjs} +2 -2
  212. package/dist/{Timeline-CoxW0Ia_.cjs.map → Timeline-ONU_3gi3.cjs.map} +1 -1
  213. package/dist/{Toaster-BynCHvUr.js → Toaster-C6UK_2TB.js} +2 -2
  214. package/dist/{Toaster-BynCHvUr.js.map → Toaster-C6UK_2TB.js.map} +1 -1
  215. package/dist/{Toaster-tHet1M-T.cjs → Toaster-Qnsq3guQ.cjs} +2 -2
  216. package/dist/{Toaster-tHet1M-T.cjs.map → Toaster-Qnsq3guQ.cjs.map} +1 -1
  217. package/dist/{ToggleButtonGroup-BWd7MOcc.js → ToggleButtonGroup-D9odYMzD.js} +3 -3
  218. package/dist/{ToggleButtonGroup-BWd7MOcc.js.map → ToggleButtonGroup-D9odYMzD.js.map} +1 -1
  219. package/dist/{ToggleButtonGroup-DYRLwKKh.cjs → ToggleButtonGroup-M2oj_3mc.cjs} +2 -2
  220. package/dist/{ToggleButtonGroup-DYRLwKKh.cjs.map → ToggleButtonGroup-M2oj_3mc.cjs.map} +1 -1
  221. package/dist/{TranslatedFields-DHRFcB3n.js → TranslatedFields-Bo5rZ7so.js} +5 -5
  222. package/dist/{TranslatedFields-DHRFcB3n.js.map → TranslatedFields-Bo5rZ7so.js.map} +1 -1
  223. package/dist/{TranslatedFields-B3Gli3TZ.cjs → TranslatedFields-CLMvRpJi.cjs} +2 -2
  224. package/dist/{TranslatedFields-B3Gli3TZ.cjs.map → TranslatedFields-CLMvRpJi.cjs.map} +1 -1
  225. package/dist/UserCard-454Kc7JS.js +74 -0
  226. package/dist/UserCard-454Kc7JS.js.map +1 -0
  227. package/dist/UserCard-CIjZz5xd.cjs +2 -0
  228. package/dist/UserCard-CIjZz5xd.cjs.map +1 -0
  229. package/dist/components/Accordion/index.cjs +1 -1
  230. package/dist/components/Accordion/index.js +1 -1
  231. package/dist/components/Alert/index.cjs +1 -1
  232. package/dist/components/Alert/index.js +1 -1
  233. package/dist/components/AuthLayout/index.cjs +1 -1
  234. package/dist/components/AuthLayout/index.js +1 -1
  235. package/dist/components/Avatar/index.cjs +1 -1
  236. package/dist/components/Avatar/index.js +2 -2
  237. package/dist/components/Breadcrumbs/index.cjs +1 -1
  238. package/dist/components/Breadcrumbs/index.js +1 -1
  239. package/dist/components/Button/index.cjs +1 -1
  240. package/dist/components/Button/index.js +1 -1
  241. package/dist/components/Card/index.cjs +1 -1
  242. package/dist/components/Card/index.js +1 -1
  243. package/dist/components/Checkbox/Checkbox.d.cts +7 -0
  244. package/dist/components/Checkbox/Checkbox.d.ts +7 -0
  245. package/dist/components/Checkbox/index.cjs +1 -1
  246. package/dist/components/Checkbox/index.js +1 -1
  247. package/dist/components/Chip/index.cjs +1 -1
  248. package/dist/components/Chip/index.js +1 -1
  249. package/dist/components/ChoiceCard/index.cjs +1 -1
  250. package/dist/components/ChoiceCard/index.js +1 -1
  251. package/dist/components/CodeBlock/index.cjs +1 -1
  252. package/dist/components/CodeBlock/index.js +1 -1
  253. package/dist/components/ColorPicker/index.cjs +1 -1
  254. package/dist/components/ColorPicker/index.js +1 -1
  255. package/dist/components/CopyButton/index.cjs +1 -1
  256. package/dist/components/CopyButton/index.js +1 -1
  257. package/dist/components/DashedButton/index.cjs +1 -1
  258. package/dist/components/DashedButton/index.js +1 -1
  259. package/dist/components/DatePicker/index.cjs +1 -1
  260. package/dist/components/DatePicker/index.js +1 -1
  261. package/dist/components/DateTimePicker/index.cjs +1 -1
  262. package/dist/components/DateTimePicker/index.js +1 -1
  263. package/dist/components/EmptyState/index.cjs +1 -1
  264. package/dist/components/EmptyState/index.js +1 -1
  265. package/dist/components/FileCard/index.cjs +1 -1
  266. package/dist/components/FileCard/index.js +1 -1
  267. package/dist/components/FileUploader/index.cjs +1 -1
  268. package/dist/components/FileUploader/index.js +1 -1
  269. package/dist/components/Flag/index.cjs +1 -1
  270. package/dist/components/Flag/index.js +1 -1
  271. package/dist/components/FullscreenToggle/index.cjs +1 -1
  272. package/dist/components/FullscreenToggle/index.js +1 -1
  273. package/dist/components/Icon/index.cjs +1 -1
  274. package/dist/components/Icon/index.js +2 -2
  275. package/dist/components/IconButton/index.cjs +1 -1
  276. package/dist/components/IconButton/index.js +1 -1
  277. package/dist/components/List/index.cjs +1 -1
  278. package/dist/components/List/index.js +1 -1
  279. package/dist/components/Loader/index.cjs +1 -1
  280. package/dist/components/Loader/index.js +1 -1
  281. package/dist/components/Modal/index.cjs +1 -1
  282. package/dist/components/Modal/index.js +1 -1
  283. package/dist/components/MultiSelect/index.cjs +1 -1
  284. package/dist/components/MultiSelect/index.js +1 -1
  285. package/dist/components/NumberField/index.cjs +1 -1
  286. package/dist/components/NumberField/index.js +1 -1
  287. package/dist/components/OtpField/index.cjs +1 -1
  288. package/dist/components/OtpField/index.js +1 -1
  289. package/dist/components/PageLayout/index.cjs +1 -1
  290. package/dist/components/PageLayout/index.js +1 -1
  291. package/dist/components/PageNotFound/index.cjs +1 -1
  292. package/dist/components/PageNotFound/index.js +1 -1
  293. package/dist/components/Pagination/index.cjs +1 -1
  294. package/dist/components/Pagination/index.js +1 -1
  295. package/dist/components/RemoveDialog/index.cjs +1 -1
  296. package/dist/components/RemoveDialog/index.js +1 -1
  297. package/dist/components/RichTextEditor/index.cjs +1 -1
  298. package/dist/components/RichTextEditor/index.js +1 -1
  299. package/dist/components/RootLayout/index.cjs +1 -1
  300. package/dist/components/RootLayout/index.js +1 -1
  301. package/dist/components/Select/index.cjs +1 -1
  302. package/dist/components/Select/index.js +1 -1
  303. package/dist/components/Sidebar/index.cjs +1 -1
  304. package/dist/components/Sidebar/index.js +1 -1
  305. package/dist/components/SpeedDial/index.cjs +1 -1
  306. package/dist/components/SpeedDial/index.js +1 -1
  307. package/dist/components/Stepper/index.cjs +1 -1
  308. package/dist/components/Stepper/index.js +1 -1
  309. package/dist/components/SwatchPicker/index.cjs +1 -1
  310. package/dist/components/SwatchPicker/index.js +1 -1
  311. package/dist/components/Table/index.cjs +1 -1
  312. package/dist/components/Table/index.js +1 -1
  313. package/dist/components/Tabs/index.cjs +1 -1
  314. package/dist/components/Tabs/index.js +1 -1
  315. package/dist/components/TagsField/index.cjs +1 -1
  316. package/dist/components/TagsField/index.js +1 -1
  317. package/dist/components/TextField/index.cjs +1 -1
  318. package/dist/components/TextField/index.js +1 -1
  319. package/dist/components/ThemeToggle/index.cjs +1 -1
  320. package/dist/components/ThemeToggle/index.js +1 -1
  321. package/dist/components/TimePicker/index.cjs +1 -1
  322. package/dist/components/TimePicker/index.js +1 -1
  323. package/dist/components/Timeline/index.cjs +1 -1
  324. package/dist/components/Timeline/index.js +1 -1
  325. package/dist/components/Toast/index.cjs +1 -1
  326. package/dist/components/Toast/index.js +1 -1
  327. package/dist/components/ToggleButton/index.cjs +1 -1
  328. package/dist/components/ToggleButton/index.js +1 -1
  329. package/dist/components/TranslatedFields/index.cjs +1 -1
  330. package/dist/components/TranslatedFields/index.js +1 -1
  331. package/dist/components/UserCard/UserCard.d.cts +4 -1
  332. package/dist/components/UserCard/UserCard.d.ts +4 -1
  333. package/dist/components/UserCard/index.cjs +1 -1
  334. package/dist/components/UserCard/index.js +1 -1
  335. package/dist/entries/app.cjs +1 -1
  336. package/dist/entries/app.js +1 -1
  337. package/dist/entries/components.cjs +1 -1
  338. package/dist/entries/components.js +53 -53
  339. package/dist/entries/i18n.cjs +1 -1
  340. package/dist/entries/i18n.js +2 -2
  341. package/dist/entries/icons.cjs +1 -1
  342. package/dist/entries/icons.js +2 -2
  343. package/dist/entries/theme.cjs +1 -1
  344. package/dist/entries/theme.js +1 -1
  345. package/dist/i18n/messages.d.cts +1 -0
  346. package/dist/i18n/messages.d.ts +1 -0
  347. package/dist/icons/names.d.cts +3 -3
  348. package/dist/icons/names.d.ts +3 -3
  349. package/dist/index.cjs +1 -1
  350. package/dist/index.css +1 -1
  351. package/dist/index.js +56 -56
  352. package/dist/{messages-FciBtnCL.js → messages-CGHhwf6F.js} +10 -3
  353. package/dist/messages-CGHhwf6F.js.map +1 -0
  354. package/dist/messages-DZJyiaf9.cjs +36 -0
  355. package/dist/messages-DZJyiaf9.cjs.map +1 -0
  356. package/dist/names-BJnFU_5m.cjs +2 -0
  357. package/dist/names-BJnFU_5m.cjs.map +1 -0
  358. package/dist/{names-D8ABK2Wk.js → names-r21QPjcU.js} +3 -2
  359. package/dist/names-r21QPjcU.js.map +1 -0
  360. package/package.json +1 -1
  361. package/dist/Checkbox-DXOzYIAz.cjs +0 -2
  362. package/dist/Checkbox-DXOzYIAz.cjs.map +0 -1
  363. package/dist/Checkbox-XKL_Q5qj.js +0 -84
  364. package/dist/Checkbox-XKL_Q5qj.js.map +0 -1
  365. package/dist/Icon-CXTl_QAP.cjs +0 -2
  366. package/dist/Icon-CXTl_QAP.cjs.map +0 -1
  367. package/dist/Icon-CophpkHo.js.map +0 -1
  368. package/dist/UserCard-D7U-CLbM.js +0 -74
  369. package/dist/UserCard-D7U-CLbM.js.map +0 -1
  370. package/dist/UserCard-GHw2gTx9.cjs +0 -2
  371. package/dist/UserCard-GHw2gTx9.cjs.map +0 -1
  372. package/dist/messages-C0YutUM1.cjs +0 -36
  373. package/dist/messages-C0YutUM1.cjs.map +0 -1
  374. package/dist/messages-FciBtnCL.js.map +0 -1
  375. package/dist/names-C2Yj1p3u.cjs +0 -2
  376. package/dist/names-C2Yj1p3u.cjs.map +0 -1
  377. package/dist/names-D8ABK2Wk.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FileCard-Do9D72NA.js","sources":["../src/components/FileCard/FileCard.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Avatar, type AvatarSize } from '../Avatar'\nimport { IconButton } from '../IconButton'\nimport { Icon } from '../Icon'\nimport type { IconName } from '../../icons/names'\nimport styles from './FileCard.module.css'\n\nexport type FileCardSize = AvatarSize\n\nconst IMAGE_EXTS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'webp',\n 'svg',\n 'gif',\n 'avif',\n 'bmp',\n 'ico',\n 'heic',\n])\n\n// a leading icon per file family (non-image); everything else gets the generic document icon\nconst FILE_ICONS: Record<string, IconName> = {\n pdf: 'DocumentText',\n doc: 'DocumentText',\n docx: 'DocumentText',\n txt: 'DocumentText',\n rtf: 'DocumentText',\n md: 'DocumentText',\n csv: 'DocumentText',\n xls: 'DocumentText',\n xlsx: 'DocumentText',\n json: 'DocumentCode',\n xml: 'DocumentCode',\n zip: 'Folder',\n rar: 'Folder',\n '7z': 'Folder',\n mp4: 'VideoSquare',\n mov: 'VideoSquare',\n webm: 'VideoSquare',\n mp3: 'MusicSquare',\n wav: 'MusicSquare',\n}\n\n/** The lowercased extension from a file name, else the subtype from a MIME `type` (`image/png` → `png`). */\nfunction extensionOf(name: string, type?: string): string {\n const dot = name.lastIndexOf('.')\n if (dot > 0 && name.length - dot <= 7) return name.slice(dot + 1).toLowerCase()\n if (type && type.includes('/')) return type.slice(type.indexOf('/') + 1).toLowerCase()\n return ''\n}\n\n/** Split `report.pdf` into `{ base: 'report', ext: '.pdf' }` so the base can ellipsize and the type stays. */\nfunction splitName(name: string): { base: string; ext: string } {\n const dot = name.lastIndexOf('.')\n return dot > 0 && name.length - dot <= 7\n ? { base: name.slice(0, dot), ext: name.slice(dot) }\n : { base: name, ext: '' }\n}\n\n/** Human-readable byte size — `2411724` → `\"2.3 MB\"`. */\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return `${bytes} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let value = bytes / 1024\n let i = 0\n while (value >= 1024 && i < units.length - 1) {\n value /= 1024\n i += 1\n }\n return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[i]}`\n}\n\nexport interface FileCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** File name — shown middle-truncated (`test-file-na….pdf`) so the extension always stays visible. */\n name: string\n /** File URL — the download target and, for an image, the thumbnail `src`. */\n src?: string\n /** File type — an extension (`'pdf'`) or MIME (`'image/png'`). Derived from `name` when omitted. */\n type?: string\n /** Force image vs. file rendering. Inferred from `type` / `name` / `src` when omitted. */\n image?: boolean\n /** File size — a **bytes** number (auto-formatted to `\"2.3 MB\"`) or a preformatted string. Shown after the type. */\n fileSize?: number | string\n /**\n * When no `fileSize` is given, fetch it from `src` via a `HEAD` request (reads `Content-Length`). Off\n * by default — it's a network call and needs CORS to expose the header; prefer passing `fileSize` from\n * the backend. Fails silently (no size shown) when unavailable.\n */\n fetchSize?: boolean\n /** Meta line under the name — overrides the derived `TYPE · size`. */\n meta?: ReactNode\n /** Theme token tinting the avatar / file-icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Size — scales the avatar, text and padding. Defaults to `md`. */\n size?: FileCardSize\n /** Show the download control (only when there's a `src` or `onDownload`). Defaults to `true`. */\n downloadable?: boolean\n /** Custom download handler — replaces the default (a download of `src`). */\n onDownload?: () => void\n}\n\n/**\n * A compact, read-only **file card** for displaying a file that already exists (e.g. from the backend) —\n * an image or a document (`pdf` / `docx` / `csv` / `svg` / …). Shows a leading **`Avatar`** (the image\n * thumbnail via `src`, or a type-based file icon in a tinted square), the **name** middle-truncated so\n * the extension is never lost, the **type** underneath, and a **download** control. Simple to drop in —\n * pass `name` (+ `src` for the thumbnail/download). Not to be confused with `FileUploader` (which\n * *collects* files to upload); this only *displays* one. Token-only styling.\n *\n * @example\n * <FileCard name=\"annual-report.pdf\" src=\"/files/annual-report.pdf\" />\n * <FileCard name=\"avatar.png\" src={url} meta=\"240 KB\" />\n */\nexport const FileCard = forwardRef<HTMLDivElement, FileCardProps>(function FileCard(\n {\n name,\n src,\n type,\n image,\n fileSize,\n fetchSize = false,\n meta,\n color = 'accent',\n size = 'md',\n downloadable = true,\n onDownload,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const ext = extensionOf(name, type)\n const isImage = image ?? (type?.startsWith('image/') || IMAGE_EXTS.has(ext))\n const { base, ext: nameExt } = splitName(name)\n\n // optional auto size via a HEAD request (only when opted in and no explicit fileSize)\n const [fetchedSize, setFetchedSize] = useState<number | null>(null)\n useEffect(() => {\n if (!fetchSize || fileSize != null || !src || typeof fetch === 'undefined') return\n let cancelled = false\n fetch(src, { method: 'HEAD' })\n .then((res) => {\n const len = res.headers.get('content-length')\n if (!cancelled && len) setFetchedSize(Number(len))\n })\n .catch(() => {})\n return () => {\n cancelled = true\n }\n }, [fetchSize, fileSize, src])\n\n const sizeText =\n fileSize != null\n ? typeof fileSize === 'number'\n ? formatBytes(fileSize)\n : fileSize\n : fetchedSize != null\n ? formatBytes(fetchedSize)\n : ''\n // \"TYPE · 2.3 MB\" (either part optional) — overridden wholesale by `meta`\n const derivedMeta = [ext ? ext.toUpperCase() : '', sizeText].filter(Boolean).join(' · ')\n const metaLine = meta ?? (derivedMeta || null)\n\n const handleDownload = () => {\n if (onDownload) return onDownload()\n if (!src) return\n const a = document.createElement('a')\n a.href = src\n a.download = name\n a.rel = 'noopener'\n a.click()\n }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.fileCard, styles[size], className)}\n style={{ '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`, ...style } as CSSProperties}\n {...props}\n >\n <Avatar\n className={styles.avatar}\n src={isImage ? src : undefined}\n icon={isImage ? undefined : (FILE_ICONS[ext] ?? 'Document')}\n name={name}\n shape=\"square\"\n size={size}\n color={color}\n />\n <div className={styles.body}>\n <span className={styles.name} title={name}>\n <span className={styles.nameBase}>{base}</span>\n {nameExt && <span className={styles.nameExt}>{nameExt}</span>}\n </span>\n {metaLine != null && <span className={styles.type}>{metaLine}</span>}\n </div>\n {downloadable && (src || onDownload) && (\n <IconButton\n variant=\"filled\"\n size={size === 'lg' ? 'md' : 'sm'}\n className={styles.download}\n aria-label={t('fileCard.download', { name })}\n onClick={handleDownload}\n >\n <Icon name=\"ImportArrow\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["IMAGE_EXTS","FILE_ICONS","extensionOf","name","type","dot","splitName","formatBytes","bytes","units","value","i","FileCard","forwardRef","src","image","fileSize","fetchSize","meta","color","size","downloadable","onDownload","className","style","props","ref","t","useT","ext","isImage","base","nameExt","fetchedSize","setFetchedSize","useState","useEffect","cancelled","res","len","sizeText","derivedMeta","metaLine","handleDownload","a","jsxs","clsx","styles","jsx","Avatar","IconButton","Icon"],"mappings":"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"}
1
+ {"version":3,"file":"FileCard-C9Ncifnu.js","sources":["../src/components/FileCard/FileCard.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Avatar, type AvatarSize } from '../Avatar'\nimport { IconButton } from '../IconButton'\nimport { Icon } from '../Icon'\nimport type { IconName } from '../../icons/names'\nimport styles from './FileCard.module.css'\n\nexport type FileCardSize = AvatarSize\n\nconst IMAGE_EXTS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'webp',\n 'svg',\n 'gif',\n 'avif',\n 'bmp',\n 'ico',\n 'heic',\n])\n\n// a leading icon per file family (non-image); everything else gets the generic document icon\nconst FILE_ICONS: Record<string, IconName> = {\n pdf: 'DocumentText',\n doc: 'DocumentText',\n docx: 'DocumentText',\n txt: 'DocumentText',\n rtf: 'DocumentText',\n md: 'DocumentText',\n csv: 'DocumentText',\n xls: 'DocumentText',\n xlsx: 'DocumentText',\n json: 'DocumentCode',\n xml: 'DocumentCode',\n zip: 'Folder',\n rar: 'Folder',\n '7z': 'Folder',\n mp4: 'VideoSquare',\n mov: 'VideoSquare',\n webm: 'VideoSquare',\n mp3: 'MusicSquare',\n wav: 'MusicSquare',\n}\n\n/** The lowercased extension from a file name, else the subtype from a MIME `type` (`image/png` → `png`). */\nfunction extensionOf(name: string, type?: string): string {\n const dot = name.lastIndexOf('.')\n if (dot > 0 && name.length - dot <= 7) return name.slice(dot + 1).toLowerCase()\n if (type && type.includes('/')) return type.slice(type.indexOf('/') + 1).toLowerCase()\n return ''\n}\n\n/** Split `report.pdf` into `{ base: 'report', ext: '.pdf' }` so the base can ellipsize and the type stays. */\nfunction splitName(name: string): { base: string; ext: string } {\n const dot = name.lastIndexOf('.')\n return dot > 0 && name.length - dot <= 7\n ? { base: name.slice(0, dot), ext: name.slice(dot) }\n : { base: name, ext: '' }\n}\n\n/** Human-readable byte size — `2411724` → `\"2.3 MB\"`. */\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return `${bytes} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let value = bytes / 1024\n let i = 0\n while (value >= 1024 && i < units.length - 1) {\n value /= 1024\n i += 1\n }\n return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[i]}`\n}\n\nexport interface FileCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** File name — shown middle-truncated (`test-file-na….pdf`) so the extension always stays visible. */\n name: string\n /** File URL — the download target and, for an image, the thumbnail `src`. */\n src?: string\n /** File type — an extension (`'pdf'`) or MIME (`'image/png'`). Derived from `name` when omitted. */\n type?: string\n /** Force image vs. file rendering. Inferred from `type` / `name` / `src` when omitted. */\n image?: boolean\n /** File size — a **bytes** number (auto-formatted to `\"2.3 MB\"`) or a preformatted string. Shown after the type. */\n fileSize?: number | string\n /**\n * When no `fileSize` is given, fetch it from `src` via a `HEAD` request (reads `Content-Length`). Off\n * by default — it's a network call and needs CORS to expose the header; prefer passing `fileSize` from\n * the backend. Fails silently (no size shown) when unavailable.\n */\n fetchSize?: boolean\n /** Meta line under the name — overrides the derived `TYPE · size`. */\n meta?: ReactNode\n /** Theme token tinting the avatar / file-icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Size — scales the avatar, text and padding. Defaults to `md`. */\n size?: FileCardSize\n /** Show the download control (only when there's a `src` or `onDownload`). Defaults to `true`. */\n downloadable?: boolean\n /** Custom download handler — replaces the default (a download of `src`). */\n onDownload?: () => void\n}\n\n/**\n * A compact, read-only **file card** for displaying a file that already exists (e.g. from the backend) —\n * an image or a document (`pdf` / `docx` / `csv` / `svg` / …). Shows a leading **`Avatar`** (the image\n * thumbnail via `src`, or a type-based file icon in a tinted square), the **name** middle-truncated so\n * the extension is never lost, the **type** underneath, and a **download** control. Simple to drop in —\n * pass `name` (+ `src` for the thumbnail/download). Not to be confused with `FileUploader` (which\n * *collects* files to upload); this only *displays* one. Token-only styling.\n *\n * @example\n * <FileCard name=\"annual-report.pdf\" src=\"/files/annual-report.pdf\" />\n * <FileCard name=\"avatar.png\" src={url} meta=\"240 KB\" />\n */\nexport const FileCard = forwardRef<HTMLDivElement, FileCardProps>(function FileCard(\n {\n name,\n src,\n type,\n image,\n fileSize,\n fetchSize = false,\n meta,\n color = 'accent',\n size = 'md',\n downloadable = true,\n onDownload,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const ext = extensionOf(name, type)\n const isImage = image ?? (type?.startsWith('image/') || IMAGE_EXTS.has(ext))\n const { base, ext: nameExt } = splitName(name)\n\n // optional auto size via a HEAD request (only when opted in and no explicit fileSize)\n const [fetchedSize, setFetchedSize] = useState<number | null>(null)\n useEffect(() => {\n if (!fetchSize || fileSize != null || !src || typeof fetch === 'undefined') return\n let cancelled = false\n fetch(src, { method: 'HEAD' })\n .then((res) => {\n const len = res.headers.get('content-length')\n if (!cancelled && len) setFetchedSize(Number(len))\n })\n .catch(() => {})\n return () => {\n cancelled = true\n }\n }, [fetchSize, fileSize, src])\n\n const sizeText =\n fileSize != null\n ? typeof fileSize === 'number'\n ? formatBytes(fileSize)\n : fileSize\n : fetchedSize != null\n ? formatBytes(fetchedSize)\n : ''\n // \"TYPE · 2.3 MB\" (either part optional) — overridden wholesale by `meta`\n const derivedMeta = [ext ? ext.toUpperCase() : '', sizeText].filter(Boolean).join(' · ')\n const metaLine = meta ?? (derivedMeta || null)\n\n const handleDownload = () => {\n if (onDownload) return onDownload()\n if (!src) return\n const a = document.createElement('a')\n a.href = src\n a.download = name\n a.rel = 'noopener'\n a.click()\n }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.fileCard, styles[size], className)}\n style={{ '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`, ...style } as CSSProperties}\n {...props}\n >\n <Avatar\n className={styles.avatar}\n src={isImage ? src : undefined}\n icon={isImage ? undefined : (FILE_ICONS[ext] ?? 'Document')}\n name={name}\n shape=\"square\"\n size={size}\n color={color}\n />\n <div className={styles.body}>\n <span className={styles.name} title={name}>\n <span className={styles.nameBase}>{base}</span>\n {nameExt && <span className={styles.nameExt}>{nameExt}</span>}\n </span>\n {metaLine != null && <span className={styles.type}>{metaLine}</span>}\n </div>\n {downloadable && (src || onDownload) && (\n <IconButton\n variant=\"filled\"\n size={size === 'lg' ? 'md' : 'sm'}\n className={styles.download}\n aria-label={t('fileCard.download', { name })}\n onClick={handleDownload}\n >\n <Icon name=\"ImportArrow\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["IMAGE_EXTS","FILE_ICONS","extensionOf","name","type","dot","splitName","formatBytes","bytes","units","value","i","FileCard","forwardRef","src","image","fileSize","fetchSize","meta","color","size","downloadable","onDownload","className","style","props","ref","t","useT","ext","isImage","base","nameExt","fetchedSize","setFetchedSize","useState","useEffect","cancelled","res","len","sizeText","derivedMeta","metaLine","handleDownload","a","jsxs","clsx","styles","jsx","Avatar","IconButton","Icon"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const o=require("react/jsx-runtime"),u=require("react"),O=require("clsx"),S=require("./Avatar-_ufXh3AY.cjs"),L=require("./IconButton-DyRC514t.cjs"),$=require("./Icon-CXTl_QAP.cjs"),V=require("./ConfigProvider-h1WoGC3R.cjs"),k="_fileCard_1382m_3",G="_avatar_1382m_24",R="_body_1382m_29",y="_name_1382m_38",H="_nameBase_1382m_45",K="_nameExt_1382m_51",P="_type_1382m_56",U="_download_1382m_63",W="_sm_1382m_68",X="_md_1382m_79",z="_lg_1382m_83",s={fileCard:k,avatar:G,body:R,name:y,nameBase:H,nameExt:K,type:P,download:U,sm:W,md:X,lg:z},J=new Set(["png","jpg","jpeg","webp","svg","gif","avif","bmp","ico","heic"]),Q={pdf:"DocumentText",doc:"DocumentText",docx:"DocumentText",txt:"DocumentText",rtf:"DocumentText",md:"DocumentText",csv:"DocumentText",xls:"DocumentText",xlsx:"DocumentText",json:"DocumentCode",xml:"DocumentCode",zip:"Folder",rar:"Folder","7z":"Folder",mp4:"VideoSquare",mov:"VideoSquare",webm:"VideoSquare",mp3:"MusicSquare",wav:"MusicSquare"};function Y(n,e){const t=n.lastIndexOf(".");return t>0&&n.length-t<=7?n.slice(t+1).toLowerCase():e&&e.includes("/")?e.slice(e.indexOf("/")+1).toLowerCase():""}function Z(n){const e=n.lastIndexOf(".");return e>0&&n.length-e<=7?{base:n.slice(0,e),ext:n.slice(e)}:{base:n,ext:""}}function p(n){if(!Number.isFinite(n)||n<0)return"";if(n<1024)return`${n} B`;const e=["KB","MB","GB","TB"];let t=n/1024,a=0;for(;t>=1024&&a<e.length-1;)t/=1024,a+=1;return`${t<10?t.toFixed(1):Math.round(t)} ${e[a]}`}const ee=u.forwardRef(function({name:e,src:t,type:a,image:C,fileSize:r,fetchSize:m=!1,meta:j,color:x="accent",size:d="md",downloadable:w=!0,onDownload:i,className:b,style:q,...B},T){const D=V.useT(),l=Y(e,a),f=C??((a==null?void 0:a.startsWith("image/"))||J.has(l)),{base:N,ext:_}=Z(e),[h,E]=u.useState(null);u.useEffect(()=>{if(!m||r!=null||!t||typeof fetch>"u")return;let c=!1;return fetch(t,{method:"HEAD"}).then(A=>{const g=A.headers.get("content-length");!c&&g&&E(Number(g))}).catch(()=>{}),()=>{c=!0}},[m,r,t]);const I=r!=null?typeof r=="number"?p(r):r:h!=null?p(h):"",F=[l?l.toUpperCase():"",I].filter(Boolean).join(" · "),v=j??(F||null),M=()=>{if(i)return i();if(!t)return;const c=document.createElement("a");c.href=t,c.download=e,c.rel="noopener",c.click()};return o.jsxs("div",{ref:T,className:O.clsx(s.fileCard,s[d],b),style:{"--tz-btn-rgb":`var(--tz-color-${x}-rgb)`,...q},...B,children:[o.jsx(S.Avatar,{className:s.avatar,src:f?t:void 0,icon:f?void 0:Q[l]??"Document",name:e,shape:"square",size:d,color:x}),o.jsxs("div",{className:s.body,children:[o.jsxs("span",{className:s.name,title:e,children:[o.jsx("span",{className:s.nameBase,children:N}),_&&o.jsx("span",{className:s.nameExt,children:_})]}),v!=null&&o.jsx("span",{className:s.type,children:v})]}),w&&(t||i)&&o.jsx(L.IconButton,{variant:"filled",size:d==="lg"?"md":"sm",className:s.download,"aria-label":D("fileCard.download",{name:e}),onClick:M,children:o.jsx($.Icon,{name:"ImportArrow"})})]})});exports.FileCard=ee;
2
- //# sourceMappingURL=FileCard-D0Sa7WJt.cjs.map
1
+ "use strict";const o=require("react/jsx-runtime"),u=require("react"),O=require("clsx"),S=require("./Avatar-Dgf04PBC.cjs"),L=require("./IconButton-Lv0sDDR9.cjs"),$=require("./Icon-BVULqOJD.cjs"),V=require("./ConfigProvider-C7DUWHrb.cjs"),k="_fileCard_1382m_3",G="_avatar_1382m_24",R="_body_1382m_29",y="_name_1382m_38",H="_nameBase_1382m_45",K="_nameExt_1382m_51",P="_type_1382m_56",U="_download_1382m_63",W="_sm_1382m_68",X="_md_1382m_79",z="_lg_1382m_83",s={fileCard:k,avatar:G,body:R,name:y,nameBase:H,nameExt:K,type:P,download:U,sm:W,md:X,lg:z},J=new Set(["png","jpg","jpeg","webp","svg","gif","avif","bmp","ico","heic"]),Q={pdf:"DocumentText",doc:"DocumentText",docx:"DocumentText",txt:"DocumentText",rtf:"DocumentText",md:"DocumentText",csv:"DocumentText",xls:"DocumentText",xlsx:"DocumentText",json:"DocumentCode",xml:"DocumentCode",zip:"Folder",rar:"Folder","7z":"Folder",mp4:"VideoSquare",mov:"VideoSquare",webm:"VideoSquare",mp3:"MusicSquare",wav:"MusicSquare"};function Y(n,e){const t=n.lastIndexOf(".");return t>0&&n.length-t<=7?n.slice(t+1).toLowerCase():e&&e.includes("/")?e.slice(e.indexOf("/")+1).toLowerCase():""}function Z(n){const e=n.lastIndexOf(".");return e>0&&n.length-e<=7?{base:n.slice(0,e),ext:n.slice(e)}:{base:n,ext:""}}function p(n){if(!Number.isFinite(n)||n<0)return"";if(n<1024)return`${n} B`;const e=["KB","MB","GB","TB"];let t=n/1024,a=0;for(;t>=1024&&a<e.length-1;)t/=1024,a+=1;return`${t<10?t.toFixed(1):Math.round(t)} ${e[a]}`}const ee=u.forwardRef(function({name:e,src:t,type:a,image:C,fileSize:r,fetchSize:m=!1,meta:j,color:x="accent",size:d="md",downloadable:w=!0,onDownload:i,className:b,style:q,...B},T){const D=V.useT(),l=Y(e,a),f=C??((a==null?void 0:a.startsWith("image/"))||J.has(l)),{base:N,ext:_}=Z(e),[h,E]=u.useState(null);u.useEffect(()=>{if(!m||r!=null||!t||typeof fetch>"u")return;let c=!1;return fetch(t,{method:"HEAD"}).then(A=>{const g=A.headers.get("content-length");!c&&g&&E(Number(g))}).catch(()=>{}),()=>{c=!0}},[m,r,t]);const I=r!=null?typeof r=="number"?p(r):r:h!=null?p(h):"",F=[l?l.toUpperCase():"",I].filter(Boolean).join(" · "),v=j??(F||null),M=()=>{if(i)return i();if(!t)return;const c=document.createElement("a");c.href=t,c.download=e,c.rel="noopener",c.click()};return o.jsxs("div",{ref:T,className:O.clsx(s.fileCard,s[d],b),style:{"--tz-btn-rgb":`var(--tz-color-${x}-rgb)`,...q},...B,children:[o.jsx(S.Avatar,{className:s.avatar,src:f?t:void 0,icon:f?void 0:Q[l]??"Document",name:e,shape:"square",size:d,color:x}),o.jsxs("div",{className:s.body,children:[o.jsxs("span",{className:s.name,title:e,children:[o.jsx("span",{className:s.nameBase,children:N}),_&&o.jsx("span",{className:s.nameExt,children:_})]}),v!=null&&o.jsx("span",{className:s.type,children:v})]}),w&&(t||i)&&o.jsx(L.IconButton,{variant:"filled",size:d==="lg"?"md":"sm",className:s.download,"aria-label":D("fileCard.download",{name:e}),onClick:M,children:o.jsx($.Icon,{name:"ImportArrow"})})]})});exports.FileCard=ee;
2
+ //# sourceMappingURL=FileCard-Dr5-z1R3.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileCard-D0Sa7WJt.cjs","sources":["../src/components/FileCard/FileCard.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Avatar, type AvatarSize } from '../Avatar'\nimport { IconButton } from '../IconButton'\nimport { Icon } from '../Icon'\nimport type { IconName } from '../../icons/names'\nimport styles from './FileCard.module.css'\n\nexport type FileCardSize = AvatarSize\n\nconst IMAGE_EXTS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'webp',\n 'svg',\n 'gif',\n 'avif',\n 'bmp',\n 'ico',\n 'heic',\n])\n\n// a leading icon per file family (non-image); everything else gets the generic document icon\nconst FILE_ICONS: Record<string, IconName> = {\n pdf: 'DocumentText',\n doc: 'DocumentText',\n docx: 'DocumentText',\n txt: 'DocumentText',\n rtf: 'DocumentText',\n md: 'DocumentText',\n csv: 'DocumentText',\n xls: 'DocumentText',\n xlsx: 'DocumentText',\n json: 'DocumentCode',\n xml: 'DocumentCode',\n zip: 'Folder',\n rar: 'Folder',\n '7z': 'Folder',\n mp4: 'VideoSquare',\n mov: 'VideoSquare',\n webm: 'VideoSquare',\n mp3: 'MusicSquare',\n wav: 'MusicSquare',\n}\n\n/** The lowercased extension from a file name, else the subtype from a MIME `type` (`image/png` → `png`). */\nfunction extensionOf(name: string, type?: string): string {\n const dot = name.lastIndexOf('.')\n if (dot > 0 && name.length - dot <= 7) return name.slice(dot + 1).toLowerCase()\n if (type && type.includes('/')) return type.slice(type.indexOf('/') + 1).toLowerCase()\n return ''\n}\n\n/** Split `report.pdf` into `{ base: 'report', ext: '.pdf' }` so the base can ellipsize and the type stays. */\nfunction splitName(name: string): { base: string; ext: string } {\n const dot = name.lastIndexOf('.')\n return dot > 0 && name.length - dot <= 7\n ? { base: name.slice(0, dot), ext: name.slice(dot) }\n : { base: name, ext: '' }\n}\n\n/** Human-readable byte size — `2411724` → `\"2.3 MB\"`. */\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return `${bytes} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let value = bytes / 1024\n let i = 0\n while (value >= 1024 && i < units.length - 1) {\n value /= 1024\n i += 1\n }\n return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[i]}`\n}\n\nexport interface FileCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** File name — shown middle-truncated (`test-file-na….pdf`) so the extension always stays visible. */\n name: string\n /** File URL — the download target and, for an image, the thumbnail `src`. */\n src?: string\n /** File type — an extension (`'pdf'`) or MIME (`'image/png'`). Derived from `name` when omitted. */\n type?: string\n /** Force image vs. file rendering. Inferred from `type` / `name` / `src` when omitted. */\n image?: boolean\n /** File size — a **bytes** number (auto-formatted to `\"2.3 MB\"`) or a preformatted string. Shown after the type. */\n fileSize?: number | string\n /**\n * When no `fileSize` is given, fetch it from `src` via a `HEAD` request (reads `Content-Length`). Off\n * by default — it's a network call and needs CORS to expose the header; prefer passing `fileSize` from\n * the backend. Fails silently (no size shown) when unavailable.\n */\n fetchSize?: boolean\n /** Meta line under the name — overrides the derived `TYPE · size`. */\n meta?: ReactNode\n /** Theme token tinting the avatar / file-icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Size — scales the avatar, text and padding. Defaults to `md`. */\n size?: FileCardSize\n /** Show the download control (only when there's a `src` or `onDownload`). Defaults to `true`. */\n downloadable?: boolean\n /** Custom download handler — replaces the default (a download of `src`). */\n onDownload?: () => void\n}\n\n/**\n * A compact, read-only **file card** for displaying a file that already exists (e.g. from the backend) —\n * an image or a document (`pdf` / `docx` / `csv` / `svg` / …). Shows a leading **`Avatar`** (the image\n * thumbnail via `src`, or a type-based file icon in a tinted square), the **name** middle-truncated so\n * the extension is never lost, the **type** underneath, and a **download** control. Simple to drop in —\n * pass `name` (+ `src` for the thumbnail/download). Not to be confused with `FileUploader` (which\n * *collects* files to upload); this only *displays* one. Token-only styling.\n *\n * @example\n * <FileCard name=\"annual-report.pdf\" src=\"/files/annual-report.pdf\" />\n * <FileCard name=\"avatar.png\" src={url} meta=\"240 KB\" />\n */\nexport const FileCard = forwardRef<HTMLDivElement, FileCardProps>(function FileCard(\n {\n name,\n src,\n type,\n image,\n fileSize,\n fetchSize = false,\n meta,\n color = 'accent',\n size = 'md',\n downloadable = true,\n onDownload,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const ext = extensionOf(name, type)\n const isImage = image ?? (type?.startsWith('image/') || IMAGE_EXTS.has(ext))\n const { base, ext: nameExt } = splitName(name)\n\n // optional auto size via a HEAD request (only when opted in and no explicit fileSize)\n const [fetchedSize, setFetchedSize] = useState<number | null>(null)\n useEffect(() => {\n if (!fetchSize || fileSize != null || !src || typeof fetch === 'undefined') return\n let cancelled = false\n fetch(src, { method: 'HEAD' })\n .then((res) => {\n const len = res.headers.get('content-length')\n if (!cancelled && len) setFetchedSize(Number(len))\n })\n .catch(() => {})\n return () => {\n cancelled = true\n }\n }, [fetchSize, fileSize, src])\n\n const sizeText =\n fileSize != null\n ? typeof fileSize === 'number'\n ? formatBytes(fileSize)\n : fileSize\n : fetchedSize != null\n ? formatBytes(fetchedSize)\n : ''\n // \"TYPE · 2.3 MB\" (either part optional) — overridden wholesale by `meta`\n const derivedMeta = [ext ? ext.toUpperCase() : '', sizeText].filter(Boolean).join(' · ')\n const metaLine = meta ?? (derivedMeta || null)\n\n const handleDownload = () => {\n if (onDownload) return onDownload()\n if (!src) return\n const a = document.createElement('a')\n a.href = src\n a.download = name\n a.rel = 'noopener'\n a.click()\n }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.fileCard, styles[size], className)}\n style={{ '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`, ...style } as CSSProperties}\n {...props}\n >\n <Avatar\n className={styles.avatar}\n src={isImage ? src : undefined}\n icon={isImage ? undefined : (FILE_ICONS[ext] ?? 'Document')}\n name={name}\n shape=\"square\"\n size={size}\n color={color}\n />\n <div className={styles.body}>\n <span className={styles.name} title={name}>\n <span className={styles.nameBase}>{base}</span>\n {nameExt && <span className={styles.nameExt}>{nameExt}</span>}\n </span>\n {metaLine != null && <span className={styles.type}>{metaLine}</span>}\n </div>\n {downloadable && (src || onDownload) && (\n <IconButton\n variant=\"filled\"\n size={size === 'lg' ? 'md' : 'sm'}\n className={styles.download}\n aria-label={t('fileCard.download', { name })}\n onClick={handleDownload}\n >\n <Icon name=\"ImportArrow\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["IMAGE_EXTS","FILE_ICONS","extensionOf","name","type","dot","splitName","formatBytes","bytes","units","value","i","FileCard","forwardRef","src","image","fileSize","fetchSize","meta","color","size","downloadable","onDownload","className","style","props","ref","t","useT","ext","isImage","base","nameExt","fetchedSize","setFetchedSize","useState","useEffect","cancelled","res","len","sizeText","derivedMeta","metaLine","handleDownload","a","jsxs","clsx","styles","jsx","Avatar","IconButton","Icon"],"mappings":"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"}
1
+ {"version":3,"file":"FileCard-Dr5-z1R3.cjs","sources":["../src/components/FileCard/FileCard.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Avatar, type AvatarSize } from '../Avatar'\nimport { IconButton } from '../IconButton'\nimport { Icon } from '../Icon'\nimport type { IconName } from '../../icons/names'\nimport styles from './FileCard.module.css'\n\nexport type FileCardSize = AvatarSize\n\nconst IMAGE_EXTS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'webp',\n 'svg',\n 'gif',\n 'avif',\n 'bmp',\n 'ico',\n 'heic',\n])\n\n// a leading icon per file family (non-image); everything else gets the generic document icon\nconst FILE_ICONS: Record<string, IconName> = {\n pdf: 'DocumentText',\n doc: 'DocumentText',\n docx: 'DocumentText',\n txt: 'DocumentText',\n rtf: 'DocumentText',\n md: 'DocumentText',\n csv: 'DocumentText',\n xls: 'DocumentText',\n xlsx: 'DocumentText',\n json: 'DocumentCode',\n xml: 'DocumentCode',\n zip: 'Folder',\n rar: 'Folder',\n '7z': 'Folder',\n mp4: 'VideoSquare',\n mov: 'VideoSquare',\n webm: 'VideoSquare',\n mp3: 'MusicSquare',\n wav: 'MusicSquare',\n}\n\n/** The lowercased extension from a file name, else the subtype from a MIME `type` (`image/png` → `png`). */\nfunction extensionOf(name: string, type?: string): string {\n const dot = name.lastIndexOf('.')\n if (dot > 0 && name.length - dot <= 7) return name.slice(dot + 1).toLowerCase()\n if (type && type.includes('/')) return type.slice(type.indexOf('/') + 1).toLowerCase()\n return ''\n}\n\n/** Split `report.pdf` into `{ base: 'report', ext: '.pdf' }` so the base can ellipsize and the type stays. */\nfunction splitName(name: string): { base: string; ext: string } {\n const dot = name.lastIndexOf('.')\n return dot > 0 && name.length - dot <= 7\n ? { base: name.slice(0, dot), ext: name.slice(dot) }\n : { base: name, ext: '' }\n}\n\n/** Human-readable byte size — `2411724` → `\"2.3 MB\"`. */\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return `${bytes} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let value = bytes / 1024\n let i = 0\n while (value >= 1024 && i < units.length - 1) {\n value /= 1024\n i += 1\n }\n return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[i]}`\n}\n\nexport interface FileCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** File name — shown middle-truncated (`test-file-na….pdf`) so the extension always stays visible. */\n name: string\n /** File URL — the download target and, for an image, the thumbnail `src`. */\n src?: string\n /** File type — an extension (`'pdf'`) or MIME (`'image/png'`). Derived from `name` when omitted. */\n type?: string\n /** Force image vs. file rendering. Inferred from `type` / `name` / `src` when omitted. */\n image?: boolean\n /** File size — a **bytes** number (auto-formatted to `\"2.3 MB\"`) or a preformatted string. Shown after the type. */\n fileSize?: number | string\n /**\n * When no `fileSize` is given, fetch it from `src` via a `HEAD` request (reads `Content-Length`). Off\n * by default — it's a network call and needs CORS to expose the header; prefer passing `fileSize` from\n * the backend. Fails silently (no size shown) when unavailable.\n */\n fetchSize?: boolean\n /** Meta line under the name — overrides the derived `TYPE · size`. */\n meta?: ReactNode\n /** Theme token tinting the avatar / file-icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Size — scales the avatar, text and padding. Defaults to `md`. */\n size?: FileCardSize\n /** Show the download control (only when there's a `src` or `onDownload`). Defaults to `true`. */\n downloadable?: boolean\n /** Custom download handler — replaces the default (a download of `src`). */\n onDownload?: () => void\n}\n\n/**\n * A compact, read-only **file card** for displaying a file that already exists (e.g. from the backend) —\n * an image or a document (`pdf` / `docx` / `csv` / `svg` / …). Shows a leading **`Avatar`** (the image\n * thumbnail via `src`, or a type-based file icon in a tinted square), the **name** middle-truncated so\n * the extension is never lost, the **type** underneath, and a **download** control. Simple to drop in —\n * pass `name` (+ `src` for the thumbnail/download). Not to be confused with `FileUploader` (which\n * *collects* files to upload); this only *displays* one. Token-only styling.\n *\n * @example\n * <FileCard name=\"annual-report.pdf\" src=\"/files/annual-report.pdf\" />\n * <FileCard name=\"avatar.png\" src={url} meta=\"240 KB\" />\n */\nexport const FileCard = forwardRef<HTMLDivElement, FileCardProps>(function FileCard(\n {\n name,\n src,\n type,\n image,\n fileSize,\n fetchSize = false,\n meta,\n color = 'accent',\n size = 'md',\n downloadable = true,\n onDownload,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const ext = extensionOf(name, type)\n const isImage = image ?? (type?.startsWith('image/') || IMAGE_EXTS.has(ext))\n const { base, ext: nameExt } = splitName(name)\n\n // optional auto size via a HEAD request (only when opted in and no explicit fileSize)\n const [fetchedSize, setFetchedSize] = useState<number | null>(null)\n useEffect(() => {\n if (!fetchSize || fileSize != null || !src || typeof fetch === 'undefined') return\n let cancelled = false\n fetch(src, { method: 'HEAD' })\n .then((res) => {\n const len = res.headers.get('content-length')\n if (!cancelled && len) setFetchedSize(Number(len))\n })\n .catch(() => {})\n return () => {\n cancelled = true\n }\n }, [fetchSize, fileSize, src])\n\n const sizeText =\n fileSize != null\n ? typeof fileSize === 'number'\n ? formatBytes(fileSize)\n : fileSize\n : fetchedSize != null\n ? formatBytes(fetchedSize)\n : ''\n // \"TYPE · 2.3 MB\" (either part optional) — overridden wholesale by `meta`\n const derivedMeta = [ext ? ext.toUpperCase() : '', sizeText].filter(Boolean).join(' · ')\n const metaLine = meta ?? (derivedMeta || null)\n\n const handleDownload = () => {\n if (onDownload) return onDownload()\n if (!src) return\n const a = document.createElement('a')\n a.href = src\n a.download = name\n a.rel = 'noopener'\n a.click()\n }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.fileCard, styles[size], className)}\n style={{ '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`, ...style } as CSSProperties}\n {...props}\n >\n <Avatar\n className={styles.avatar}\n src={isImage ? src : undefined}\n icon={isImage ? undefined : (FILE_ICONS[ext] ?? 'Document')}\n name={name}\n shape=\"square\"\n size={size}\n color={color}\n />\n <div className={styles.body}>\n <span className={styles.name} title={name}>\n <span className={styles.nameBase}>{base}</span>\n {nameExt && <span className={styles.nameExt}>{nameExt}</span>}\n </span>\n {metaLine != null && <span className={styles.type}>{metaLine}</span>}\n </div>\n {downloadable && (src || onDownload) && (\n <IconButton\n variant=\"filled\"\n size={size === 'lg' ? 'md' : 'sm'}\n className={styles.download}\n aria-label={t('fileCard.download', { name })}\n onClick={handleDownload}\n >\n <Icon name=\"ImportArrow\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["IMAGE_EXTS","FILE_ICONS","extensionOf","name","type","dot","splitName","formatBytes","bytes","units","value","i","FileCard","forwardRef","src","image","fileSize","fetchSize","meta","color","size","downloadable","onDownload","className","style","props","ref","t","useT","ext","isImage","base","nameExt","fetchedSize","setFetchedSize","useState","useEffect","cancelled","res","len","sizeText","derivedMeta","metaLine","handleDownload","a","jsxs","clsx","styles","jsx","Avatar","IconButton","Icon"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const t=require("react/jsx-runtime"),d=require("react"),H=require("clsx"),W=require("@dnd-kit/core"),se=require("@dnd-kit/sortable"),Nt=require("@dnd-kit/utilities"),kt=require("@formkit/auto-animate/react"),Ft=require("react-dropzone"),Rt=require("./formContext-bTWrqdEV.cjs"),He=require("./toastStore-B4Tk2Xk7.cjs"),C=require("./Icon-CXTl_QAP.cjs"),ae=require("./Typography-BFatE1_A.cjs"),zt=require("react-image-crop"),Ke=require("./Button-Cu0XdnW6.cjs"),Ve=require("./Modal-DsoSz0Sp.cjs"),Ct=require("./TextField-DvKEj36A.cjs"),ie=require("./ConfigProvider-h1WoGC3R.cjs"),Se=require("./TextField.module-m-UllwzG.cjs"),Dt="_cropSection_1j2zs_4",Mt="_cropHead_1j2zs_10",Pt="_cropStage_1j2zs_16",Bt="_crop_1j2zs_4",$t="_cropImg_1j2zs_30",Ot="_altFields_1j2zs_35",Y={cropSection:Dt,cropHead:Mt,cropStage:Pt,crop:Bt,cropImg:$t,altFields:Ot};function Lt({mode:n,name:o,imageUrl:u,mimeType:g,editLocales:y,initialDraft:U,onClose:I,onSave:D}){const h=ie.useT(),k=d.useRef(null),[_,M]=d.useState(),[a,P]=d.useState(null),[B,K]=d.useState(null),[V,$]=d.useState(U),[O,J]=d.useState(null),[E,j]=d.useState(!1),Q=(i,w)=>{M(w);const f=k.current;if(f&&f.width>0&&i.width>=1&&i.height>=1){const L=f.naturalWidth/f.width,G=f.naturalHeight/f.height;P({x:Math.round(i.x*L),y:Math.round(i.y*G),width:Math.round(i.width*L),height:Math.round(i.height*G)})}else P(null)},S=async()=>{const i=k.current;if(!i||!a||a.width<1||a.height<1)return;const w=document.createElement("canvas");w.width=a.width,w.height=a.height;const f=w.getContext("2d");if(!f)return;f.imageSmoothingEnabled=!1,f.drawImage(i,a.x,a.y,a.width,a.height,0,0,a.width,a.height);const L=await new Promise(G=>w.toBlob(G,g,1));if(!L)throw new Error("canvas.toBlob returned null");return new File([L],o,{type:g,lastModified:Date.now()})},X=async()=>{if(n==="altText"){D({draft:V});return}j(!0);try{const i=a&&a.width>=1&&a.height>=1?await S():void 0;D({croppedFile:i})}catch{J(h("fileUploader.cropError")),j(!1)}};return t.jsx(Ve.Modal,{open:!0,onClose:I,size:n==="crop"?"lg":"sm",icon:n==="crop"?"Crop":"Text",title:h(n==="crop"?"fileUploader.cropTitle":"fileUploader.altTitle"),description:o,footer:t.jsxs(t.Fragment,{children:[t.jsx(Ke.Button,{variant:"text",color:"accent",onClick:I,disabled:E,children:h("common.cancel")}),t.jsx(Ke.Button,{onClick:X,loading:E,children:h("common.save")})]}),children:n==="crop"?t.jsxs("div",{className:Y.cropSection,children:[t.jsxs("div",{className:Y.cropHead,children:[t.jsx(ae.Typography,{variant:"bodySmall",color:"muted",children:h("fileUploader.cropHint")}),t.jsx(ae.Typography,{variant:"bodySmall",color:a?"text":"muted",children:a?`${a.width} × ${a.height} px`:B?`${B.w} × ${B.h} px`:""})]}),t.jsx("div",{className:Y.cropStage,children:t.jsx(zt,{crop:_,onChange:Q,className:Y.crop,children:t.jsx("img",{ref:k,src:u??void 0,alt:"",className:Y.cropImg,onLoad:i=>K({w:i.currentTarget.naturalWidth,h:i.currentTarget.naturalHeight})})})}),O&&t.jsx(ae.Typography,{variant:"bodySmall",color:"error",children:O})]}):t.jsx("div",{className:Y.altFields,children:y.map(i=>t.jsx(Ct.TextField,{label:i.label??(i.code||h("fileUploader.altTitle")),placeholder:h("fileUploader.altPlaceholder"),value:V[i.code]??"",onChange:w=>$(f=>({...f,[i.code]:w.target.value}))},i.code))})})}const qt="_backdrop_1c3fg_5",At="_media_1c3fg_9",Wt="_mediaSvg_1c3fg_19",Ht="_close_1c3fg_27",re={backdrop:qt,media:At,mediaSvg:Wt,close:Ht};function Kt({url:n,isVideo:o,isSvg:u,name:g,onClose:y}){const U=ie.useT();return t.jsxs(Ve.Overlay,{open:!0,onClose:y,dim:.85,className:re.backdrop,role:"dialog","aria-modal":"true","aria-label":U("fileUploader.preview",{name:g}),children:[t.jsx("button",{type:"button",className:re.close,"aria-label":U("fileUploader.closePreview"),onClick:y,autoFocus:!0,children:t.jsx(C.Icon,{name:"Close",size:"lg"})}),o?t.jsx("video",{src:n,className:re.media,controls:!0,playsInline:!0}):t.jsx("img",{src:n,alt:g,className:H.clsx(re.media,u&&re.mediaSvg)})]})}const Vt="_root_1ed4u_4",Gt="_fullWidth_1ed4u_9",Yt="_disabled_1ed4u_14",Jt="_dropzone_1ed4u_17",Qt="_dropText_1ed4u_41",Xt="_dropping_1ed4u_56",Zt="_error_1ed4u_61",eo="_dropIcon_1ed4u_65",to="_prompt_1ed4u_77",oo="_accent_1ed4u_82",no="_hint_1ed4u_87",ro="_list_1ed4u_93",so="_populated_1ed4u_102",lo="_tile_1ed4u_120",ao="_grabbable_1ed4u_129",io="_entering_1ed4u_138",co="_dragging_1ed4u_141",uo="_tileError_1ed4u_147",fo="_tileImg_1ed4u_152",po="_tileFallback_1ed4u_159",go="_tilePlay_1ed4u_169",ho="_tileTop_1ed4u_188",mo="_tileBottom_1ed4u_198",_o="_tileRemove_1ed4u_208",xo="_tileAction_1ed4u_209",bo="_tileActionEnd_1ed4u_244",vo="_tileText_1ed4u_247",yo="_name_1ed4u_254",jo="_nameBase_1ed4u_261",So="_nameExt_1ed4u_267",wo="_tileMeta_1ed4u_271",To="_metaError_1ed4u_275",s={root:Vt,fullWidth:Gt,disabled:Yt,dropzone:Jt,dropText:Qt,dropping:Xt,error:Zt,dropIcon:eo,prompt:to,accent:oo,hint:no,list:ro,populated:so,tile:lo,grabbable:ao,entering:io,dragging:co,tileError:uo,tileImg:fo,tileFallback:po,tilePlay:go,tileTop:ho,tileBottom:mo,tileRemove:_o,tileAction:xo,tileActionEnd:bo,tileText:vo,name:yo,nameBase:jo,nameExt:So,tileMeta:wo,metaError:To},Ge=()=>typeof URL<"u"&&typeof URL.createObjectURL=="function",Uo=300,Io=(n,o,u,g)=>{let y=[{},{}],U=Uo;if(o==="add")U=0;else if(o==="remove")y=[{opacity:1,transform:"translateY(0)"},{opacity:0,transform:"translateY(-8px)"}];else if(u&&g){const I=u.left-g.left,D=u.top-g.top;y=[{transform:`translate(${I}px, ${D}px)`},{transform:"translate(0, 0)"}]}return new KeyframeEffect(n,y,{duration:U,easing:"ease-out"})},le=n=>{if(n<1024)return`${n} B`;const o=["KB","MB","GB","TB"];let u=n/1024,g=0;for(;u>=1024&&g<o.length-1;)u/=1024,g+=1;return`${u.toFixed(u<10?1:0)} ${o[g]}`},Eo=n=>{if(typeof n=="number")return n;const o=/^\s*([\d.]+)\s*(b|kb|mb|gb|tb)?\s*$/i.exec(n);if(!o)return;const u={b:1,kb:1024,mb:1024**2,gb:1024**3,tb:1024**4};return parseFloat(o[1])*(u[(o[2]||"b").toLowerCase()]??1)},Ye=n=>`f:${n.name}:${n.size}:${n.lastModified}`,No=n=>n.file?Ye(n.file):`s:${n.source??""}`,pe=n=>n.file?n.file.name:n.source?/^(data|blob):/i.test(n.source)?"File":n.source.split(/[?#]/)[0].split("/").pop()||"File":"File",we=n=>{if(n.file)return n.file.type.startsWith("image/");const o=n.source;return o?/^data:image\//i.test(o)?!0:/^data:/i.test(o)?!1:/\.(png|jpe?g|gif|webp|avif|svg|bmp|ico|heic|heif)(?:[?#]|$)/i.test(o)||!/\.[a-z0-9]{1,8}(?:[?#]|$)/i.test(o):!1},Te=n=>{if(n.file)return n.file.type.startsWith("video/");const o=n.source;return o?/^data:video\//i.test(o)||/\.(mp4|webm|ogg|ogv|mov|m4v|avi|mkv)(?:[?#]|$)/i.test(o):!1},ko=n=>{if(typeof document>"u")return;const o=document.createElement("a");if(o.style.display="none",n.file){if(!Ge())return;const u=URL.createObjectURL(n.file);o.href=u,o.download=n.file.name,document.body.appendChild(o),o.click(),o.remove(),setTimeout(()=>URL.revokeObjectURL(u),1e3)}else n.source&&(o.href=n.source,o.download=pe(n),o.target="_blank",o.rel="noopener",document.body.appendChild(o),o.click(),o.remove())},Fo=n=>{const o=n.lastIndexOf(".");return o>0&&n.length-o<=7?{base:n.slice(0,o),ext:n.slice(o)}:{base:n,ext:""}};function Ro({id:n,item:o,preview:u,sortable:g,entering:y,disabled:U,error:I,onRemove:D,onCrop:h,onAltText:k,onDownload:_,onView:M,onPreviewError:a}){const{attributes:P,listeners:B,setNodeRef:K,transform:V,transition:$,isDragging:O}=se.useSortable({id:n,disabled:!g}),J={transform:Nt.CSS.Transform.toString(V),transition:$},E=ie.useT(),j=pe(o),{base:Q,ext:S}=Fo(j),X=o.file?le(o.file.size):E("fileUploader.uploaded"),i=Te(o),w=_?t.jsx("button",{type:"button",className:s.tileAction,"aria-label":E("fileUploader.download",{name:j}),onClick:_,onPointerDown:f=>f.stopPropagation(),children:t.jsx(C.Icon,{name:"DocumentDownload",size:"sm"})}):null;return t.jsxs("div",{ref:K,style:J,className:H.clsx(s.tile,g&&s.grabbable,y&&s.entering,O&&s.dragging,I&&s.tileError),...P,...B,children:[u?i?t.jsxs(t.Fragment,{children:[t.jsx("video",{src:u,className:s.tileImg,muted:!0,playsInline:!0,preload:"metadata",draggable:!1,onError:a}),t.jsx("span",{className:s.tilePlay,"aria-hidden":"true",children:t.jsx(C.Icon,{name:"Play",size:"lg"})})]}):t.jsx("img",{src:u,alt:"",className:s.tileImg,draggable:!1,onError:a}):t.jsx("span",{className:s.tileFallback,"aria-hidden":"true",children:t.jsx(C.Icon,{name:"Document",size:"lg"})}),t.jsxs("div",{className:s.tileTop,children:[t.jsxs("span",{className:s.tileText,children:[t.jsxs("span",{className:s.name,title:j,children:[t.jsx("span",{className:s.nameBase,children:Q}),S&&t.jsx("span",{className:s.nameExt,children:S})]}),t.jsx("span",{className:H.clsx(s.tileMeta,I&&s.metaError),children:I??X})]}),!U&&t.jsx("button",{type:"button",className:s.tileRemove,"aria-label":E("fileUploader.remove",{name:j}),onClick:D,onPointerDown:f=>f.stopPropagation(),children:t.jsx(C.Icon,{name:"Close",size:"sm"})})]}),(h||k||_||M)&&t.jsxs("div",{className:s.tileBottom,children:[h&&t.jsx("button",{type:"button",className:s.tileAction,"aria-label":E("fileUploader.crop",{name:j}),onClick:h,onPointerDown:f=>f.stopPropagation(),children:t.jsx(C.Icon,{name:"Crop",size:"sm"})}),k&&t.jsx("button",{type:"button",className:s.tileAction,"aria-label":E("fileUploader.editAlt",{name:j}),onClick:k,onPointerDown:f=>f.stopPropagation(),children:t.jsx(C.Icon,{name:"Text",size:"sm"})}),w,M&&t.jsx("button",{type:"button",className:H.clsx(s.tileAction,s.tileActionEnd),"aria-label":E("fileUploader.preview",{name:j}),onClick:M,onPointerDown:f=>f.stopPropagation(),children:t.jsx(C.Icon,{name:"Eye",size:"sm"})})]})]})}const zo=d.forwardRef(function({multiple:o=!1,allowDrop:u=!0,allowReorder:g=!0,allowDownload:y=!0,allowPreview:U=!0,allowAltText:I=!0,altTextLocales:D,localizedAltText:h=!0,allowDuplicates:k=!1,disabled:_=!1,accept:M,maxFiles:a,maxFileSize:P,itemInsertLocation:B="end",value:K,defaultValue:V,onChange:$,label:O,error:J,helperText:E,required:j=!1,fullWidth:Q=!0,name:S,id:X,onBlur:i,className:w,style:f,...L},G){var qe;const Je=d.useId(),Ue=X??Je,Ie=`${Ue}-helper`,F=P!=null?Eo(P):void 0,[ce,ge]=d.useState(null);d.useEffect(()=>{if(!ce)return;const e=window.setTimeout(()=>ge(null),4e3);return()=>window.clearTimeout(e)},[ce]);const Z=Rt.useFormContext(),Ee=!!(Z&&S),R=Z&&S?Z.field(S):void 0,Ne=o?[]:null,ke=K!==void 0?K:Ee?Z.values[S]??Ne:void 0,Fe=ke!==void 0,[Qe,Xe]=d.useState(V??Ne),ee=Fe?ke:Qe,m=ee==null?[]:Array.isArray(ee)?ee:[ee],he=J??(R==null?void 0:R.error)??!1,Ze=E??(R==null?void 0:R.helperText),me=ce??Ze,et=!!ce||he,de=g&&o&&!_,Re=d.useRef(new WeakMap),ze=d.useRef(0),tt=(e,r)=>{if(e.file){let l=Re.current.get(e.file);return l||(ze.current+=1,l=`f${ze.current}`,Re.current.set(e.file,l)),l}return e.source?`s:${e.source}`:`i:${r}`},T=m.map((e,r)=>tt(e,r)),Ce=d.useRef(new Set),ot=new Set(T.filter(e=>!Ce.current.has(e)));d.useEffect(()=>{Ce.current=new Set(T)});const[nt,De]=d.useState(()=>new Set),rt=e=>De(r=>r.has(e)?r:new Set(r).add(e)),[st,lt]=d.useState(()=>new Set),at=e=>lt(r=>r.has(e)?r:new Set(r).add(e)),ue=d.useRef(new Map),fe=e=>{if(e.file){const r=e.file.type;if(!r.startsWith("image/")&&!r.startsWith("video/")||!Ge()||st.has(e.file))return null;let l=ue.current.get(e.file);return l||(l=URL.createObjectURL(e.file),ue.current.set(e.file,l)),l}return e.source&&!nt.has(e.source)?e.source:null},[z,Me]=d.useState(null);d.useEffect(()=>{const e=ue.current,r=new Set(m.map(c=>c.file).filter(Boolean)),l=new Set(m.filter(c=>!c.file&&c.source).map(c=>c.source));for(const[c,p]of e)!r.has(c)&&p!==(z==null?void 0:z.url)&&(URL.revokeObjectURL(p),e.delete(c));De(c=>{if(c.size===0)return c;const p=new Set([...c].filter(b=>l.has(b)));return p.size===c.size?c:p})},[ee,z]),d.useEffect(()=>{const e=ue.current;return()=>{for(const r of e.values())URL.revokeObjectURL(r);e.clear()}},[]);const it=e=>e.map((r,l)=>r.sortIndex===l?r:{...r,sortIndex:l}),te=e=>{const r=it(e),l=o?r:r[0]??null;Fe||Xe(l),Ee&&Z.setValue(S,l),$==null||$(l)},_e=()=>R==null?void 0:R.onBlur({}),x=ie.useT(),ct=ie.useLocales(),Pe=D??ct,dt=h&&Pe.length>0?Pe:[{code:""}],[oe,xe]=d.useState(null),[Be,$e]=d.useState("altText"),be=oe!=null?T.indexOf(oe):-1,N=be!==-1?m[be]:null,ut=e=>{$e("crop"),xe(T[e]??null)},ft=e=>{$e("altText"),xe(T[e]??null)},ve=()=>xe(null),pt=e=>{const r=fe(e);if(!r)return;const l=e.file?e.file.type==="image/svg+xml":/^data:image\/svg/i.test(e.source??"")||/\.svg(?:[?#]|$)/i.test(e.source??"");Me({url:r,isVideo:Te(e),isSvg:l,name:pe(e)})},gt=N?h?N.altText&&typeof N.altText=="object"?{...N.altText}:{}:{"":typeof N.altText=="string"?N.altText:""}:{},ht=({draft:e,croppedFile:r})=>{if(be===-1)return ve();te(m.map((l,c)=>{if(T[c]!==oe)return l;const p={...l};if(e!==void 0)if(h){const b=Object.fromEntries(Object.entries(e).map(([q,v])=>[q,v.trim()]).filter(([,q])=>q!==""));p.altText=Object.keys(b).length>0?b:void 0}else p.altText=(e[""]??"").trim()||void 0;return r&&(p.file=r,p.source=""),p})),ve()},mt=(e,r=[])=>{const l=r.filter(v=>v.errors.some(A=>A.code==="file-invalid-type")),c=r.filter(v=>v.errors.some(A=>A.code==="file-too-large"));l.length>0&&He.toast.error(l.length===1?x("fileUploader.wrongTypeOne",{name:l[0].file.name}):x("fileUploader.wrongTypeMany",{count:l.length})),c.length>0&&F!=null&&He.toast.error(c.length===1?x("fileUploader.tooLargeOne",{name:c[0].file.name,size:le(F)}):x("fileUploader.tooLargeMany",{count:c.length,size:le(F)}));const p=[];let b=e;if(o&&!k){const v=new Set(m.map(No)),A=[];for(const Ae of b){const We=Ye(Ae);v.has(We)||(v.add(We),A.push(Ae))}A.length<b.length&&p.push(x("fileUploader.duplicate")),b=A}if(o&&a!=null){const v=Math.max(0,a-m.length);b.length>v&&(b=b.slice(0,v),p.push(a===1?x("fileUploader.hintUpToOne",{count:a}):x("fileUploader.hintUpToMany",{count:a})))}if(ge(p.length>0?p.join(" · "):null),b.length===0)return;const q=b.map(v=>({file:v,source:"",sortIndex:0}));if(!o){te([q[0]]);return}te(B==="start"?[...q,...m]:[...m,...q])},_t=e=>{ge(null),te(m.filter((r,l)=>l!==e)),_e()},[xt,ye]=kt.useAutoAnimate(Io),Oe=()=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>ye(!0)):ye(!0)},bt=()=>ye(!1),vt=()=>Oe(),yt=e=>{const{active:r,over:l}=e;if(l&&r.id!==l.id){const c=T.indexOf(String(r.id)),p=T.indexOf(String(l.id));c!==-1&&p!==-1&&te(se.arrayMove(m,c,p))}Oe()},jt=W.useSensors(W.useSensor(W.PointerSensor,{activationConstraint:{distance:5}}),W.useSensor(W.KeyboardSensor,{coordinateGetter:se.sortableKeyboardCoordinates})),ne=d.useRef(!1),{getRootProps:St,getInputProps:wt,isDragActive:Tt}=Ft.useDropzone({multiple:o,accept:M,maxSize:F,disabled:_,noKeyboard:!1,noDrag:!u,onFileDialogOpen:()=>{ne.current=!0},onFileDialogCancel:()=>{ne.current=!1,_e()},onDrop:(e,r)=>{ne.current=!1,mt(e,r)}}),Ut=o||m.length===0,je=[];o&&a!=null&&je.push(a===1?x("fileUploader.hintUpToOne",{count:a}):x("fileUploader.hintUpToMany",{count:a})),F!=null&&je.push(x("fileUploader.hintMax",{size:le(F)}));const Le=je.join(" · "),It=u?t.jsxs(t.Fragment,{children:[t.jsx("span",{className:s.accent,children:x("fileUploader.choose")})," ",x("fileUploader.dropSuffix")]}):t.jsx("span",{className:s.accent,children:x("fileUploader.choose")}),Et=e=>{if(i==null||i(e),!e.currentTarget.contains(e.relatedTarget)&&oe==null){if(ne.current){ne.current=!1;return}_e()}};return t.jsxs("div",{ref:G,id:Ue,className:H.clsx(s.root,Q&&s.fullWidth,he&&s.error,_&&s.disabled,w),style:f,"aria-invalid":he||void 0,"aria-describedby":me!=null?Ie:void 0,onBlur:Et,...L,...S?{name:S,tabIndex:-1}:{},children:[O!=null&&t.jsxs("label",{className:Se.fieldStyles.label,children:[t.jsx(ae.Typography,{as:"span",variant:"bodySmall",color:"muted",children:O}),j&&t.jsx("span",{className:Se.fieldStyles.required,"aria-hidden":"true",children:"*"})]}),Ut&&t.jsxs("div",{...St({className:H.clsx(s.dropzone,Tt&&s.dropping)}),children:[t.jsx("input",{...wt()}),t.jsx("span",{className:s.dropIcon,"aria-hidden":"true",children:t.jsx(C.Icon,{name:"DocumentUpload",size:"lg"})}),t.jsxs("span",{className:s.dropText,children:[t.jsx("span",{className:s.prompt,children:It}),Le&&t.jsx("span",{className:s.hint,children:Le})]})]}),t.jsx(W.DndContext,{sensors:jt,collisionDetection:W.closestCenter,onDragStart:de?bt:void 0,onDragEnd:de?yt:void 0,onDragCancel:de?vt:void 0,children:t.jsx(se.SortableContext,{items:T,strategy:se.rectSortingStrategy,children:t.jsx("div",{ref:xt,className:H.clsx(s.list,m.length>0&&s.populated),children:m.map((e,r)=>t.jsx(Ro,{id:T[r],item:e,preview:fe(e),sortable:de&&m.length>1,entering:ot.has(T[r]),disabled:_,error:e.file&&F!=null&&e.file.size>F?x("fileUploader.exceedsLimit",{size:le(F)}):void 0,onRemove:()=>_t(r),onCrop:I&&!_&&we(e)?()=>ut(r):void 0,onAltText:I&&!_&&we(e)?()=>ft(r):void 0,onDownload:y&&!_?()=>ko(e):void 0,onView:U&&!_&&fe(e)!=null&&(we(e)||Te(e))?()=>pt(e):void 0,onPreviewError:e.file?()=>at(e.file):e.source?()=>rt(e.source):void 0},T[r]))})})}),me!=null&&t.jsx(ae.Typography,{as:"span",id:Ie,variant:"bodySmall",color:et?"error":"muted",className:Se.fieldStyles.helper,role:"status","aria-live":"polite",children:me}),N&&t.jsx(Lt,{mode:Be,name:pe(N),imageUrl:fe(N),mimeType:((qe=N.file)==null?void 0:qe.type)||"image/png",editLocales:dt,initialDraft:gt,onClose:ve,onSave:ht},`${oe}:${Be}`),z&&t.jsx(Kt,{url:z.url,isVideo:z.isVideo,isSvg:z.isSvg,name:z.name,onClose:()=>Me(null)})]})});exports.FileUploader=zo;
2
- //# sourceMappingURL=FileUploader-B1Arfj1a.cjs.map
1
+ "use strict";const t=require("react/jsx-runtime"),d=require("react"),H=require("clsx"),W=require("@dnd-kit/core"),se=require("@dnd-kit/sortable"),Nt=require("@dnd-kit/utilities"),kt=require("@formkit/auto-animate/react"),Ft=require("react-dropzone"),Rt=require("./formContext-bTWrqdEV.cjs"),He=require("./toastStore-B4Tk2Xk7.cjs"),C=require("./Icon-BVULqOJD.cjs"),ae=require("./Typography-BFatE1_A.cjs"),zt=require("react-image-crop"),Ke=require("./Button-BdihbLYJ.cjs"),Ve=require("./Modal-V6eyGSzW.cjs"),Ct=require("./TextField-DNqnpAWB.cjs"),ie=require("./ConfigProvider-C7DUWHrb.cjs"),Se=require("./TextField.module-m-UllwzG.cjs"),Dt="_cropSection_1j2zs_4",Mt="_cropHead_1j2zs_10",Pt="_cropStage_1j2zs_16",Bt="_crop_1j2zs_4",$t="_cropImg_1j2zs_30",Ot="_altFields_1j2zs_35",Y={cropSection:Dt,cropHead:Mt,cropStage:Pt,crop:Bt,cropImg:$t,altFields:Ot};function Lt({mode:n,name:o,imageUrl:u,mimeType:g,editLocales:y,initialDraft:U,onClose:I,onSave:D}){const h=ie.useT(),k=d.useRef(null),[_,M]=d.useState(),[a,P]=d.useState(null),[B,K]=d.useState(null),[V,$]=d.useState(U),[O,J]=d.useState(null),[E,j]=d.useState(!1),Q=(i,w)=>{M(w);const f=k.current;if(f&&f.width>0&&i.width>=1&&i.height>=1){const L=f.naturalWidth/f.width,G=f.naturalHeight/f.height;P({x:Math.round(i.x*L),y:Math.round(i.y*G),width:Math.round(i.width*L),height:Math.round(i.height*G)})}else P(null)},S=async()=>{const i=k.current;if(!i||!a||a.width<1||a.height<1)return;const w=document.createElement("canvas");w.width=a.width,w.height=a.height;const f=w.getContext("2d");if(!f)return;f.imageSmoothingEnabled=!1,f.drawImage(i,a.x,a.y,a.width,a.height,0,0,a.width,a.height);const L=await new Promise(G=>w.toBlob(G,g,1));if(!L)throw new Error("canvas.toBlob returned null");return new File([L],o,{type:g,lastModified:Date.now()})},X=async()=>{if(n==="altText"){D({draft:V});return}j(!0);try{const i=a&&a.width>=1&&a.height>=1?await S():void 0;D({croppedFile:i})}catch{J(h("fileUploader.cropError")),j(!1)}};return t.jsx(Ve.Modal,{open:!0,onClose:I,size:n==="crop"?"lg":"sm",icon:n==="crop"?"Crop":"Text",title:h(n==="crop"?"fileUploader.cropTitle":"fileUploader.altTitle"),description:o,footer:t.jsxs(t.Fragment,{children:[t.jsx(Ke.Button,{variant:"text",color:"accent",onClick:I,disabled:E,children:h("common.cancel")}),t.jsx(Ke.Button,{onClick:X,loading:E,children:h("common.save")})]}),children:n==="crop"?t.jsxs("div",{className:Y.cropSection,children:[t.jsxs("div",{className:Y.cropHead,children:[t.jsx(ae.Typography,{variant:"bodySmall",color:"muted",children:h("fileUploader.cropHint")}),t.jsx(ae.Typography,{variant:"bodySmall",color:a?"text":"muted",children:a?`${a.width} × ${a.height} px`:B?`${B.w} × ${B.h} px`:""})]}),t.jsx("div",{className:Y.cropStage,children:t.jsx(zt,{crop:_,onChange:Q,className:Y.crop,children:t.jsx("img",{ref:k,src:u??void 0,alt:"",className:Y.cropImg,onLoad:i=>K({w:i.currentTarget.naturalWidth,h:i.currentTarget.naturalHeight})})})}),O&&t.jsx(ae.Typography,{variant:"bodySmall",color:"error",children:O})]}):t.jsx("div",{className:Y.altFields,children:y.map(i=>t.jsx(Ct.TextField,{label:i.label??(i.code||h("fileUploader.altTitle")),placeholder:h("fileUploader.altPlaceholder"),value:V[i.code]??"",onChange:w=>$(f=>({...f,[i.code]:w.target.value}))},i.code))})})}const qt="_backdrop_1c3fg_5",At="_media_1c3fg_9",Wt="_mediaSvg_1c3fg_19",Ht="_close_1c3fg_27",re={backdrop:qt,media:At,mediaSvg:Wt,close:Ht};function Kt({url:n,isVideo:o,isSvg:u,name:g,onClose:y}){const U=ie.useT();return t.jsxs(Ve.Overlay,{open:!0,onClose:y,dim:.85,className:re.backdrop,role:"dialog","aria-modal":"true","aria-label":U("fileUploader.preview",{name:g}),children:[t.jsx("button",{type:"button",className:re.close,"aria-label":U("fileUploader.closePreview"),onClick:y,autoFocus:!0,children:t.jsx(C.Icon,{name:"Close",size:"lg"})}),o?t.jsx("video",{src:n,className:re.media,controls:!0,playsInline:!0}):t.jsx("img",{src:n,alt:g,className:H.clsx(re.media,u&&re.mediaSvg)})]})}const Vt="_root_1ed4u_4",Gt="_fullWidth_1ed4u_9",Yt="_disabled_1ed4u_14",Jt="_dropzone_1ed4u_17",Qt="_dropText_1ed4u_41",Xt="_dropping_1ed4u_56",Zt="_error_1ed4u_61",eo="_dropIcon_1ed4u_65",to="_prompt_1ed4u_77",oo="_accent_1ed4u_82",no="_hint_1ed4u_87",ro="_list_1ed4u_93",so="_populated_1ed4u_102",lo="_tile_1ed4u_120",ao="_grabbable_1ed4u_129",io="_entering_1ed4u_138",co="_dragging_1ed4u_141",uo="_tileError_1ed4u_147",fo="_tileImg_1ed4u_152",po="_tileFallback_1ed4u_159",go="_tilePlay_1ed4u_169",ho="_tileTop_1ed4u_188",mo="_tileBottom_1ed4u_198",_o="_tileRemove_1ed4u_208",xo="_tileAction_1ed4u_209",bo="_tileActionEnd_1ed4u_244",vo="_tileText_1ed4u_247",yo="_name_1ed4u_254",jo="_nameBase_1ed4u_261",So="_nameExt_1ed4u_267",wo="_tileMeta_1ed4u_271",To="_metaError_1ed4u_275",s={root:Vt,fullWidth:Gt,disabled:Yt,dropzone:Jt,dropText:Qt,dropping:Xt,error:Zt,dropIcon:eo,prompt:to,accent:oo,hint:no,list:ro,populated:so,tile:lo,grabbable:ao,entering:io,dragging:co,tileError:uo,tileImg:fo,tileFallback:po,tilePlay:go,tileTop:ho,tileBottom:mo,tileRemove:_o,tileAction:xo,tileActionEnd:bo,tileText:vo,name:yo,nameBase:jo,nameExt:So,tileMeta:wo,metaError:To},Ge=()=>typeof URL<"u"&&typeof URL.createObjectURL=="function",Uo=300,Io=(n,o,u,g)=>{let y=[{},{}],U=Uo;if(o==="add")U=0;else if(o==="remove")y=[{opacity:1,transform:"translateY(0)"},{opacity:0,transform:"translateY(-8px)"}];else if(u&&g){const I=u.left-g.left,D=u.top-g.top;y=[{transform:`translate(${I}px, ${D}px)`},{transform:"translate(0, 0)"}]}return new KeyframeEffect(n,y,{duration:U,easing:"ease-out"})},le=n=>{if(n<1024)return`${n} B`;const o=["KB","MB","GB","TB"];let u=n/1024,g=0;for(;u>=1024&&g<o.length-1;)u/=1024,g+=1;return`${u.toFixed(u<10?1:0)} ${o[g]}`},Eo=n=>{if(typeof n=="number")return n;const o=/^\s*([\d.]+)\s*(b|kb|mb|gb|tb)?\s*$/i.exec(n);if(!o)return;const u={b:1,kb:1024,mb:1024**2,gb:1024**3,tb:1024**4};return parseFloat(o[1])*(u[(o[2]||"b").toLowerCase()]??1)},Ye=n=>`f:${n.name}:${n.size}:${n.lastModified}`,No=n=>n.file?Ye(n.file):`s:${n.source??""}`,pe=n=>n.file?n.file.name:n.source?/^(data|blob):/i.test(n.source)?"File":n.source.split(/[?#]/)[0].split("/").pop()||"File":"File",we=n=>{if(n.file)return n.file.type.startsWith("image/");const o=n.source;return o?/^data:image\//i.test(o)?!0:/^data:/i.test(o)?!1:/\.(png|jpe?g|gif|webp|avif|svg|bmp|ico|heic|heif)(?:[?#]|$)/i.test(o)||!/\.[a-z0-9]{1,8}(?:[?#]|$)/i.test(o):!1},Te=n=>{if(n.file)return n.file.type.startsWith("video/");const o=n.source;return o?/^data:video\//i.test(o)||/\.(mp4|webm|ogg|ogv|mov|m4v|avi|mkv)(?:[?#]|$)/i.test(o):!1},ko=n=>{if(typeof document>"u")return;const o=document.createElement("a");if(o.style.display="none",n.file){if(!Ge())return;const u=URL.createObjectURL(n.file);o.href=u,o.download=n.file.name,document.body.appendChild(o),o.click(),o.remove(),setTimeout(()=>URL.revokeObjectURL(u),1e3)}else n.source&&(o.href=n.source,o.download=pe(n),o.target="_blank",o.rel="noopener",document.body.appendChild(o),o.click(),o.remove())},Fo=n=>{const o=n.lastIndexOf(".");return o>0&&n.length-o<=7?{base:n.slice(0,o),ext:n.slice(o)}:{base:n,ext:""}};function Ro({id:n,item:o,preview:u,sortable:g,entering:y,disabled:U,error:I,onRemove:D,onCrop:h,onAltText:k,onDownload:_,onView:M,onPreviewError:a}){const{attributes:P,listeners:B,setNodeRef:K,transform:V,transition:$,isDragging:O}=se.useSortable({id:n,disabled:!g}),J={transform:Nt.CSS.Transform.toString(V),transition:$},E=ie.useT(),j=pe(o),{base:Q,ext:S}=Fo(j),X=o.file?le(o.file.size):E("fileUploader.uploaded"),i=Te(o),w=_?t.jsx("button",{type:"button",className:s.tileAction,"aria-label":E("fileUploader.download",{name:j}),onClick:_,onPointerDown:f=>f.stopPropagation(),children:t.jsx(C.Icon,{name:"DocumentDownload",size:"sm"})}):null;return t.jsxs("div",{ref:K,style:J,className:H.clsx(s.tile,g&&s.grabbable,y&&s.entering,O&&s.dragging,I&&s.tileError),...P,...B,children:[u?i?t.jsxs(t.Fragment,{children:[t.jsx("video",{src:u,className:s.tileImg,muted:!0,playsInline:!0,preload:"metadata",draggable:!1,onError:a}),t.jsx("span",{className:s.tilePlay,"aria-hidden":"true",children:t.jsx(C.Icon,{name:"Play",size:"lg"})})]}):t.jsx("img",{src:u,alt:"",className:s.tileImg,draggable:!1,onError:a}):t.jsx("span",{className:s.tileFallback,"aria-hidden":"true",children:t.jsx(C.Icon,{name:"Document",size:"lg"})}),t.jsxs("div",{className:s.tileTop,children:[t.jsxs("span",{className:s.tileText,children:[t.jsxs("span",{className:s.name,title:j,children:[t.jsx("span",{className:s.nameBase,children:Q}),S&&t.jsx("span",{className:s.nameExt,children:S})]}),t.jsx("span",{className:H.clsx(s.tileMeta,I&&s.metaError),children:I??X})]}),!U&&t.jsx("button",{type:"button",className:s.tileRemove,"aria-label":E("fileUploader.remove",{name:j}),onClick:D,onPointerDown:f=>f.stopPropagation(),children:t.jsx(C.Icon,{name:"Close",size:"sm"})})]}),(h||k||_||M)&&t.jsxs("div",{className:s.tileBottom,children:[h&&t.jsx("button",{type:"button",className:s.tileAction,"aria-label":E("fileUploader.crop",{name:j}),onClick:h,onPointerDown:f=>f.stopPropagation(),children:t.jsx(C.Icon,{name:"Crop",size:"sm"})}),k&&t.jsx("button",{type:"button",className:s.tileAction,"aria-label":E("fileUploader.editAlt",{name:j}),onClick:k,onPointerDown:f=>f.stopPropagation(),children:t.jsx(C.Icon,{name:"Text",size:"sm"})}),w,M&&t.jsx("button",{type:"button",className:H.clsx(s.tileAction,s.tileActionEnd),"aria-label":E("fileUploader.preview",{name:j}),onClick:M,onPointerDown:f=>f.stopPropagation(),children:t.jsx(C.Icon,{name:"Eye",size:"sm"})})]})]})}const zo=d.forwardRef(function({multiple:o=!1,allowDrop:u=!0,allowReorder:g=!0,allowDownload:y=!0,allowPreview:U=!0,allowAltText:I=!0,altTextLocales:D,localizedAltText:h=!0,allowDuplicates:k=!1,disabled:_=!1,accept:M,maxFiles:a,maxFileSize:P,itemInsertLocation:B="end",value:K,defaultValue:V,onChange:$,label:O,error:J,helperText:E,required:j=!1,fullWidth:Q=!0,name:S,id:X,onBlur:i,className:w,style:f,...L},G){var qe;const Je=d.useId(),Ue=X??Je,Ie=`${Ue}-helper`,F=P!=null?Eo(P):void 0,[ce,ge]=d.useState(null);d.useEffect(()=>{if(!ce)return;const e=window.setTimeout(()=>ge(null),4e3);return()=>window.clearTimeout(e)},[ce]);const Z=Rt.useFormContext(),Ee=!!(Z&&S),R=Z&&S?Z.field(S):void 0,Ne=o?[]:null,ke=K!==void 0?K:Ee?Z.values[S]??Ne:void 0,Fe=ke!==void 0,[Qe,Xe]=d.useState(V??Ne),ee=Fe?ke:Qe,m=ee==null?[]:Array.isArray(ee)?ee:[ee],he=J??(R==null?void 0:R.error)??!1,Ze=E??(R==null?void 0:R.helperText),me=ce??Ze,et=!!ce||he,de=g&&o&&!_,Re=d.useRef(new WeakMap),ze=d.useRef(0),tt=(e,r)=>{if(e.file){let l=Re.current.get(e.file);return l||(ze.current+=1,l=`f${ze.current}`,Re.current.set(e.file,l)),l}return e.source?`s:${e.source}`:`i:${r}`},T=m.map((e,r)=>tt(e,r)),Ce=d.useRef(new Set),ot=new Set(T.filter(e=>!Ce.current.has(e)));d.useEffect(()=>{Ce.current=new Set(T)});const[nt,De]=d.useState(()=>new Set),rt=e=>De(r=>r.has(e)?r:new Set(r).add(e)),[st,lt]=d.useState(()=>new Set),at=e=>lt(r=>r.has(e)?r:new Set(r).add(e)),ue=d.useRef(new Map),fe=e=>{if(e.file){const r=e.file.type;if(!r.startsWith("image/")&&!r.startsWith("video/")||!Ge()||st.has(e.file))return null;let l=ue.current.get(e.file);return l||(l=URL.createObjectURL(e.file),ue.current.set(e.file,l)),l}return e.source&&!nt.has(e.source)?e.source:null},[z,Me]=d.useState(null);d.useEffect(()=>{const e=ue.current,r=new Set(m.map(c=>c.file).filter(Boolean)),l=new Set(m.filter(c=>!c.file&&c.source).map(c=>c.source));for(const[c,p]of e)!r.has(c)&&p!==(z==null?void 0:z.url)&&(URL.revokeObjectURL(p),e.delete(c));De(c=>{if(c.size===0)return c;const p=new Set([...c].filter(b=>l.has(b)));return p.size===c.size?c:p})},[ee,z]),d.useEffect(()=>{const e=ue.current;return()=>{for(const r of e.values())URL.revokeObjectURL(r);e.clear()}},[]);const it=e=>e.map((r,l)=>r.sortIndex===l?r:{...r,sortIndex:l}),te=e=>{const r=it(e),l=o?r:r[0]??null;Fe||Xe(l),Ee&&Z.setValue(S,l),$==null||$(l)},_e=()=>R==null?void 0:R.onBlur({}),x=ie.useT(),ct=ie.useLocales(),Pe=D??ct,dt=h&&Pe.length>0?Pe:[{code:""}],[oe,xe]=d.useState(null),[Be,$e]=d.useState("altText"),be=oe!=null?T.indexOf(oe):-1,N=be!==-1?m[be]:null,ut=e=>{$e("crop"),xe(T[e]??null)},ft=e=>{$e("altText"),xe(T[e]??null)},ve=()=>xe(null),pt=e=>{const r=fe(e);if(!r)return;const l=e.file?e.file.type==="image/svg+xml":/^data:image\/svg/i.test(e.source??"")||/\.svg(?:[?#]|$)/i.test(e.source??"");Me({url:r,isVideo:Te(e),isSvg:l,name:pe(e)})},gt=N?h?N.altText&&typeof N.altText=="object"?{...N.altText}:{}:{"":typeof N.altText=="string"?N.altText:""}:{},ht=({draft:e,croppedFile:r})=>{if(be===-1)return ve();te(m.map((l,c)=>{if(T[c]!==oe)return l;const p={...l};if(e!==void 0)if(h){const b=Object.fromEntries(Object.entries(e).map(([q,v])=>[q,v.trim()]).filter(([,q])=>q!==""));p.altText=Object.keys(b).length>0?b:void 0}else p.altText=(e[""]??"").trim()||void 0;return r&&(p.file=r,p.source=""),p})),ve()},mt=(e,r=[])=>{const l=r.filter(v=>v.errors.some(A=>A.code==="file-invalid-type")),c=r.filter(v=>v.errors.some(A=>A.code==="file-too-large"));l.length>0&&He.toast.error(l.length===1?x("fileUploader.wrongTypeOne",{name:l[0].file.name}):x("fileUploader.wrongTypeMany",{count:l.length})),c.length>0&&F!=null&&He.toast.error(c.length===1?x("fileUploader.tooLargeOne",{name:c[0].file.name,size:le(F)}):x("fileUploader.tooLargeMany",{count:c.length,size:le(F)}));const p=[];let b=e;if(o&&!k){const v=new Set(m.map(No)),A=[];for(const Ae of b){const We=Ye(Ae);v.has(We)||(v.add(We),A.push(Ae))}A.length<b.length&&p.push(x("fileUploader.duplicate")),b=A}if(o&&a!=null){const v=Math.max(0,a-m.length);b.length>v&&(b=b.slice(0,v),p.push(a===1?x("fileUploader.hintUpToOne",{count:a}):x("fileUploader.hintUpToMany",{count:a})))}if(ge(p.length>0?p.join(" · "):null),b.length===0)return;const q=b.map(v=>({file:v,source:"",sortIndex:0}));if(!o){te([q[0]]);return}te(B==="start"?[...q,...m]:[...m,...q])},_t=e=>{ge(null),te(m.filter((r,l)=>l!==e)),_e()},[xt,ye]=kt.useAutoAnimate(Io),Oe=()=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>ye(!0)):ye(!0)},bt=()=>ye(!1),vt=()=>Oe(),yt=e=>{const{active:r,over:l}=e;if(l&&r.id!==l.id){const c=T.indexOf(String(r.id)),p=T.indexOf(String(l.id));c!==-1&&p!==-1&&te(se.arrayMove(m,c,p))}Oe()},jt=W.useSensors(W.useSensor(W.PointerSensor,{activationConstraint:{distance:5}}),W.useSensor(W.KeyboardSensor,{coordinateGetter:se.sortableKeyboardCoordinates})),ne=d.useRef(!1),{getRootProps:St,getInputProps:wt,isDragActive:Tt}=Ft.useDropzone({multiple:o,accept:M,maxSize:F,disabled:_,noKeyboard:!1,noDrag:!u,onFileDialogOpen:()=>{ne.current=!0},onFileDialogCancel:()=>{ne.current=!1,_e()},onDrop:(e,r)=>{ne.current=!1,mt(e,r)}}),Ut=o||m.length===0,je=[];o&&a!=null&&je.push(a===1?x("fileUploader.hintUpToOne",{count:a}):x("fileUploader.hintUpToMany",{count:a})),F!=null&&je.push(x("fileUploader.hintMax",{size:le(F)}));const Le=je.join(" · "),It=u?t.jsxs(t.Fragment,{children:[t.jsx("span",{className:s.accent,children:x("fileUploader.choose")})," ",x("fileUploader.dropSuffix")]}):t.jsx("span",{className:s.accent,children:x("fileUploader.choose")}),Et=e=>{if(i==null||i(e),!e.currentTarget.contains(e.relatedTarget)&&oe==null){if(ne.current){ne.current=!1;return}_e()}};return t.jsxs("div",{ref:G,id:Ue,className:H.clsx(s.root,Q&&s.fullWidth,he&&s.error,_&&s.disabled,w),style:f,"aria-invalid":he||void 0,"aria-describedby":me!=null?Ie:void 0,onBlur:Et,...L,...S?{name:S,tabIndex:-1}:{},children:[O!=null&&t.jsxs("label",{className:Se.fieldStyles.label,children:[t.jsx(ae.Typography,{as:"span",variant:"bodySmall",color:"muted",children:O}),j&&t.jsx("span",{className:Se.fieldStyles.required,"aria-hidden":"true",children:"*"})]}),Ut&&t.jsxs("div",{...St({className:H.clsx(s.dropzone,Tt&&s.dropping)}),children:[t.jsx("input",{...wt()}),t.jsx("span",{className:s.dropIcon,"aria-hidden":"true",children:t.jsx(C.Icon,{name:"DocumentUpload",size:"lg"})}),t.jsxs("span",{className:s.dropText,children:[t.jsx("span",{className:s.prompt,children:It}),Le&&t.jsx("span",{className:s.hint,children:Le})]})]}),t.jsx(W.DndContext,{sensors:jt,collisionDetection:W.closestCenter,onDragStart:de?bt:void 0,onDragEnd:de?yt:void 0,onDragCancel:de?vt:void 0,children:t.jsx(se.SortableContext,{items:T,strategy:se.rectSortingStrategy,children:t.jsx("div",{ref:xt,className:H.clsx(s.list,m.length>0&&s.populated),children:m.map((e,r)=>t.jsx(Ro,{id:T[r],item:e,preview:fe(e),sortable:de&&m.length>1,entering:ot.has(T[r]),disabled:_,error:e.file&&F!=null&&e.file.size>F?x("fileUploader.exceedsLimit",{size:le(F)}):void 0,onRemove:()=>_t(r),onCrop:I&&!_&&we(e)?()=>ut(r):void 0,onAltText:I&&!_&&we(e)?()=>ft(r):void 0,onDownload:y&&!_?()=>ko(e):void 0,onView:U&&!_&&fe(e)!=null&&(we(e)||Te(e))?()=>pt(e):void 0,onPreviewError:e.file?()=>at(e.file):e.source?()=>rt(e.source):void 0},T[r]))})})}),me!=null&&t.jsx(ae.Typography,{as:"span",id:Ie,variant:"bodySmall",color:et?"error":"muted",className:Se.fieldStyles.helper,role:"status","aria-live":"polite",children:me}),N&&t.jsx(Lt,{mode:Be,name:pe(N),imageUrl:fe(N),mimeType:((qe=N.file)==null?void 0:qe.type)||"image/png",editLocales:dt,initialDraft:gt,onClose:ve,onSave:ht},`${oe}:${Be}`),z&&t.jsx(Kt,{url:z.url,isVideo:z.isVideo,isSvg:z.isSvg,name:z.name,onClose:()=>Me(null)})]})});exports.FileUploader=zo;
2
+ //# sourceMappingURL=FileUploader-DeyZENqq.cjs.map