@techzyapp/ui-library 1.0.40 → 1.0.41

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 (378) hide show
  1. package/dist/{AdminRoot-JOgiNkJA.js → AdminRoot-aOYQtzF0.js} +34 -32
  2. package/dist/AdminRoot-aOYQtzF0.js.map +1 -0
  3. package/dist/AdminRoot-ajWIf94J.cjs +2 -0
  4. package/dist/AdminRoot-ajWIf94J.cjs.map +1 -0
  5. package/dist/{Alert-CY8iU1zd.cjs → Alert-5tpyGb2M.cjs} +2 -2
  6. package/dist/{Alert-CY8iU1zd.cjs.map → Alert-5tpyGb2M.cjs.map} +1 -1
  7. package/dist/{Alert-CtUr-0s8.js → Alert-Dz0sNGpz.js} +3 -3
  8. package/dist/{Alert-CtUr-0s8.js.map → Alert-Dz0sNGpz.js.map} +1 -1
  9. package/dist/{Breadcrumbs-hi6dJhfN.cjs → Breadcrumbs-B6Pii2Y_.cjs} +2 -2
  10. package/dist/{Breadcrumbs-hi6dJhfN.cjs.map → Breadcrumbs-B6Pii2Y_.cjs.map} +1 -1
  11. package/dist/{Breadcrumbs-Dqhk-dY2.js → Breadcrumbs-DKYJOdHZ.js} +3 -3
  12. package/dist/{Breadcrumbs-Dqhk-dY2.js.map → Breadcrumbs-DKYJOdHZ.js.map} +1 -1
  13. package/dist/{Button-Bst_NtPJ.js → Button-CjsnB8gX.js} +2 -2
  14. package/dist/{Button-Bst_NtPJ.js.map → Button-CjsnB8gX.js.map} +1 -1
  15. package/dist/{Button-CYZoF18-.cjs → Button-ClVfHGBc.cjs} +2 -2
  16. package/dist/{Button-CYZoF18-.cjs.map → Button-ClVfHGBc.cjs.map} +1 -1
  17. package/dist/{Calendar-CMNBHtvY.cjs → Calendar-BzGVX4F4.cjs} +2 -2
  18. package/dist/{Calendar-CMNBHtvY.cjs.map → Calendar-BzGVX4F4.cjs.map} +1 -1
  19. package/dist/{Calendar-OYXsfuWz.js → Calendar-CQaPEukM.js} +3 -3
  20. package/dist/{Calendar-OYXsfuWz.js.map → Calendar-CQaPEukM.js.map} +1 -1
  21. package/dist/{Card-CkZtVNyV.cjs → Card-CIRGqg3P.cjs} +2 -2
  22. package/dist/{Card-CkZtVNyV.cjs.map → Card-CIRGqg3P.cjs.map} +1 -1
  23. package/dist/{Card-B91LGIzF.js → Card-Co3A4Qgo.js} +2 -2
  24. package/dist/{Card-B91LGIzF.js.map → Card-Co3A4Qgo.js.map} +1 -1
  25. package/dist/{Chip-D5ZZs3QH.js → Chip-BjSNgaAf.js} +2 -2
  26. package/dist/{Chip-D5ZZs3QH.js.map → Chip-BjSNgaAf.js.map} +1 -1
  27. package/dist/{Chip-B7cAHjlx.cjs → Chip-Dp8skUZ2.cjs} +2 -2
  28. package/dist/{Chip-B7cAHjlx.cjs.map → Chip-Dp8skUZ2.cjs.map} +1 -1
  29. package/dist/{CodeBlock-DrWRSRmO.js → CodeBlock-CcJjS0_q.js} +3 -3
  30. package/dist/{CodeBlock-DrWRSRmO.js.map → CodeBlock-CcJjS0_q.js.map} +1 -1
  31. package/dist/{CodeBlock-C3mG_seZ.cjs → CodeBlock-o_VSkAek.cjs} +2 -2
  32. package/dist/{CodeBlock-C3mG_seZ.cjs.map → CodeBlock-o_VSkAek.cjs.map} +1 -1
  33. package/dist/{ColorPicker-w7NdprlW.js → ColorPicker-C1hZcAbH.js} +3 -3
  34. package/dist/{ColorPicker-w7NdprlW.js.map → ColorPicker-C1hZcAbH.js.map} +1 -1
  35. package/dist/{ColorPicker-C1pDI4su.cjs → ColorPicker-DY6Vk1uS.cjs} +2 -2
  36. package/dist/{ColorPicker-C1pDI4su.cjs.map → ColorPicker-DY6Vk1uS.cjs.map} +1 -1
  37. package/dist/{ColorPickerPanel-CKMd-dqd.js → ColorPickerPanel-BuzwmkPN.js} +2 -2
  38. package/dist/{ColorPickerPanel-CKMd-dqd.js.map → ColorPickerPanel-BuzwmkPN.js.map} +1 -1
  39. package/dist/{ColorPickerPanel-BbgujQ3X.cjs → ColorPickerPanel-CDrHbCfG.cjs} +2 -2
  40. package/dist/{ColorPickerPanel-BbgujQ3X.cjs.map → ColorPickerPanel-CDrHbCfG.cjs.map} +1 -1
  41. package/dist/{ColorRamp-D9_5JULy.cjs → ColorRamp-CVnOYlu3.cjs} +2 -2
  42. package/dist/{ColorRamp-D9_5JULy.cjs.map → ColorRamp-CVnOYlu3.cjs.map} +1 -1
  43. package/dist/{ColorRamp-Mp_ddhmb.js → ColorRamp-CePqEkMR.js} +2 -2
  44. package/dist/{ColorRamp-Mp_ddhmb.js.map → ColorRamp-CePqEkMR.js.map} +1 -1
  45. package/dist/ConfigProvider-Bgu85MsI.js +379 -0
  46. package/dist/ConfigProvider-Bgu85MsI.js.map +1 -0
  47. package/dist/ConfigProvider-DELhJlqo.cjs +2 -0
  48. package/dist/ConfigProvider-DELhJlqo.cjs.map +1 -0
  49. package/dist/{CopyButton-Yg5ZVTiX.js → CopyButton-CgDeyJ3A.js} +3 -3
  50. package/dist/{CopyButton-Yg5ZVTiX.js.map → CopyButton-CgDeyJ3A.js.map} +1 -1
  51. package/dist/{CopyButton-DZeYcG68.cjs → CopyButton-CjPyKpky.cjs} +2 -2
  52. package/dist/{CopyButton-DZeYcG68.cjs.map → CopyButton-CjPyKpky.cjs.map} +1 -1
  53. package/dist/{DatePicker-CXRsT-lt.cjs → DatePicker-CwZ_-ElE.cjs} +2 -2
  54. package/dist/{DatePicker-CXRsT-lt.cjs.map → DatePicker-CwZ_-ElE.cjs.map} +1 -1
  55. package/dist/{DatePicker-BMJlfCKB.js → DatePicker-tid4OuJ2.js} +4 -4
  56. package/dist/{DatePicker-BMJlfCKB.js.map → DatePicker-tid4OuJ2.js.map} +1 -1
  57. package/dist/{DateTimePicker-B-Jjejzm.js → DateTimePicker-C2871cuc.js} +7 -7
  58. package/dist/{DateTimePicker-B-Jjejzm.js.map → DateTimePicker-C2871cuc.js.map} +1 -1
  59. package/dist/{DateTimePicker-BuTIRTUX.cjs → DateTimePicker-DdEPtw9U.cjs} +2 -2
  60. package/dist/{DateTimePicker-BuTIRTUX.cjs.map → DateTimePicker-DdEPtw9U.cjs.map} +1 -1
  61. package/dist/{DescriptionList-CG08_qwT.js → DescriptionList-BP4CDME5.js} +4 -4
  62. package/dist/{DescriptionList-CG08_qwT.js.map → DescriptionList-BP4CDME5.js.map} +1 -1
  63. package/dist/{DescriptionList-S9C6Tp90.cjs → DescriptionList-BWw0Fe6U.cjs} +2 -2
  64. package/dist/{DescriptionList-S9C6Tp90.cjs.map → DescriptionList-BWw0Fe6U.cjs.map} +1 -1
  65. package/dist/{EmptyState-BCoPw8jf.js → EmptyState-BlmQtbSs.js} +2 -2
  66. package/dist/{EmptyState-BCoPw8jf.js.map → EmptyState-BlmQtbSs.js.map} +1 -1
  67. package/dist/{EmptyState-DnGds1ch.cjs → EmptyState-DGHOD_jy.cjs} +2 -2
  68. package/dist/{EmptyState-DnGds1ch.cjs.map → EmptyState-DGHOD_jy.cjs.map} +1 -1
  69. package/dist/{ErrorBoundary-JCNa0_Ys.cjs → ErrorBoundary-DL194IyB.cjs} +2 -2
  70. package/dist/{ErrorBoundary-JCNa0_Ys.cjs.map → ErrorBoundary-DL194IyB.cjs.map} +1 -1
  71. package/dist/{ErrorBoundary-BILk_3fM.js → ErrorBoundary-ukRaS6uS.js} +3 -3
  72. package/dist/{ErrorBoundary-BILk_3fM.js.map → ErrorBoundary-ukRaS6uS.js.map} +1 -1
  73. package/dist/{ErrorState-MQBeyF2n.cjs → ErrorState-BjEA0VfF.cjs} +2 -2
  74. package/dist/{ErrorState-MQBeyF2n.cjs.map → ErrorState-BjEA0VfF.cjs.map} +1 -1
  75. package/dist/{ErrorState-DI28ZCJN.js → ErrorState-Hfd_0MeE.js} +7 -7
  76. package/dist/{ErrorState-DI28ZCJN.js.map → ErrorState-Hfd_0MeE.js.map} +1 -1
  77. package/dist/{FileCard-Cl88Gu6L.cjs → FileCard-COc4rHe-.cjs} +2 -2
  78. package/dist/{FileCard-Cl88Gu6L.cjs.map → FileCard-COc4rHe-.cjs.map} +1 -1
  79. package/dist/{FileCard-5QvVkO1-.js → FileCard-CWwB8CWF.js} +3 -3
  80. package/dist/{FileCard-5QvVkO1-.js.map → FileCard-CWwB8CWF.js.map} +1 -1
  81. package/dist/{FileUploader-DwAl3UXI.js → FileUploader--WOmlhSh.js} +5 -5
  82. package/dist/{FileUploader-DwAl3UXI.js.map → FileUploader--WOmlhSh.js.map} +1 -1
  83. package/dist/{FileUploader-FMVbj7rz.cjs → FileUploader-Bqy_fV7l.cjs} +2 -2
  84. package/dist/{FileUploader-FMVbj7rz.cjs.map → FileUploader-Bqy_fV7l.cjs.map} +1 -1
  85. package/dist/{Flag-Do7x-AhS.cjs → Flag-C48Zfhvb.cjs} +2 -2
  86. package/dist/{Flag-Do7x-AhS.cjs.map → Flag-C48Zfhvb.cjs.map} +1 -1
  87. package/dist/{Flag-DfA2t0yd.js → Flag-fgMTTcy8.js} +2 -2
  88. package/dist/{Flag-DfA2t0yd.js.map → Flag-fgMTTcy8.js.map} +1 -1
  89. package/dist/{FullscreenToggle-Bbb_z2xj.cjs → FullscreenToggle-DuLaUzi_.cjs} +2 -2
  90. package/dist/{FullscreenToggle-Bbb_z2xj.cjs.map → FullscreenToggle-DuLaUzi_.cjs.map} +1 -1
  91. package/dist/{FullscreenToggle-DM6wWZ1a.js → FullscreenToggle-GjsMn1GO.js} +3 -3
  92. package/dist/{FullscreenToggle-DM6wWZ1a.js.map → FullscreenToggle-GjsMn1GO.js.map} +1 -1
  93. package/dist/{IconButton-CQ25TtBc.cjs → IconButton-D3ZpI0XL.cjs} +2 -2
  94. package/dist/{IconButton-CQ25TtBc.cjs.map → IconButton-D3ZpI0XL.cjs.map} +1 -1
  95. package/dist/{IconButton-06pmftMo.js → IconButton-t1OhAMNc.js} +2 -2
  96. package/dist/{IconButton-06pmftMo.js.map → IconButton-t1OhAMNc.js.map} +1 -1
  97. package/dist/{Loader-B5Pm8AaT.cjs → Loader-Cywaf7ju.cjs} +2 -2
  98. package/dist/{Loader-B5Pm8AaT.cjs.map → Loader-Cywaf7ju.cjs.map} +1 -1
  99. package/dist/{Loader-Bj5uwVR9.js → Loader-De8_GqR1.js} +2 -2
  100. package/dist/{Loader-Bj5uwVR9.js.map → Loader-De8_GqR1.js.map} +1 -1
  101. package/dist/{LocationPicker-D-sT4rSe.cjs → LocationPicker-DBsxCYi9.cjs} +2 -2
  102. package/dist/{LocationPicker-D-sT4rSe.cjs.map → LocationPicker-DBsxCYi9.cjs.map} +1 -1
  103. package/dist/{LocationPicker-Ce8aLubZ.js → LocationPicker-UfyDBvhp.js} +6 -6
  104. package/dist/{LocationPicker-Ce8aLubZ.js.map → LocationPicker-UfyDBvhp.js.map} +1 -1
  105. package/dist/{Modal-DjSOhZqd.cjs → Modal--5EbLfMz.cjs} +2 -2
  106. package/dist/{Modal-DjSOhZqd.cjs.map → Modal--5EbLfMz.cjs.map} +1 -1
  107. package/dist/{Modal-DTnB_mGg.js → Modal-Dfwc9eIq.js} +3 -3
  108. package/dist/{Modal-DTnB_mGg.js.map → Modal-Dfwc9eIq.js.map} +1 -1
  109. package/dist/{MultiSelect-C4RvohFY.cjs → MultiSelect-lBAEcAlR.cjs} +2 -2
  110. package/dist/{MultiSelect-C4RvohFY.cjs.map → MultiSelect-lBAEcAlR.cjs.map} +1 -1
  111. package/dist/{MultiSelect-Dn8l5z52.js → MultiSelect-q__o8HyU.js} +4 -4
  112. package/dist/{MultiSelect-Dn8l5z52.js.map → MultiSelect-q__o8HyU.js.map} +1 -1
  113. package/dist/{NumberField-DvQ5UP1R.js → NumberField-CXH0B1Bt.js} +3 -3
  114. package/dist/{NumberField-DvQ5UP1R.js.map → NumberField-CXH0B1Bt.js.map} +1 -1
  115. package/dist/{NumberField-C3TLdAgT.cjs → NumberField-DSicjq5R.cjs} +2 -2
  116. package/dist/{NumberField-C3TLdAgT.cjs.map → NumberField-DSicjq5R.cjs.map} +1 -1
  117. package/dist/{OtpField-Dy4O1MeD.js → OtpField-Dy-LKTi9.js} +2 -2
  118. package/dist/{OtpField-Dy4O1MeD.js.map → OtpField-Dy-LKTi9.js.map} +1 -1
  119. package/dist/{OtpField-OdkuKKcV.cjs → OtpField-KHwdaajC.cjs} +2 -2
  120. package/dist/{OtpField-OdkuKKcV.cjs.map → OtpField-KHwdaajC.cjs.map} +1 -1
  121. package/dist/{PageError-aUV0vUfB.cjs → PageError-MHbSl1oT.cjs} +2 -2
  122. package/dist/{PageError-aUV0vUfB.cjs.map → PageError-MHbSl1oT.cjs.map} +1 -1
  123. package/dist/{PageError-BORFaxGW.js → PageError-VYc07Q7W.js} +5 -5
  124. package/dist/{PageError-BORFaxGW.js.map → PageError-VYc07Q7W.js.map} +1 -1
  125. package/dist/{PageLayout-rtEl8uqS.cjs → PageLayout-Bt6U_80d.cjs} +2 -2
  126. package/dist/{PageLayout-rtEl8uqS.cjs.map → PageLayout-Bt6U_80d.cjs.map} +1 -1
  127. package/dist/{PageLayout-ojiBEcxI.js → PageLayout-Df1SOlr7.js} +4 -4
  128. package/dist/{PageLayout-ojiBEcxI.js.map → PageLayout-Df1SOlr7.js.map} +1 -1
  129. package/dist/{PageNotFound-D536Tshv.js → PageNotFound-BWfaomjC.js} +5 -5
  130. package/dist/{PageNotFound-D536Tshv.js.map → PageNotFound-BWfaomjC.js.map} +1 -1
  131. package/dist/{PageNotFound-f-dxrnol.cjs → PageNotFound-e4ITkqDC.cjs} +2 -2
  132. package/dist/{PageNotFound-f-dxrnol.cjs.map → PageNotFound-e4ITkqDC.cjs.map} +1 -1
  133. package/dist/{Pagination-DoDGKGpQ.js → Pagination-DDMq_7OZ.js} +2 -2
  134. package/dist/{Pagination-DoDGKGpQ.js.map → Pagination-DDMq_7OZ.js.map} +1 -1
  135. package/dist/{Pagination-Ffv6IFIU.cjs → Pagination-UMeckhmY.cjs} +2 -2
  136. package/dist/{Pagination-Ffv6IFIU.cjs.map → Pagination-UMeckhmY.cjs.map} +1 -1
  137. package/dist/PaletteField-D4c-Q1PG.js +56 -0
  138. package/dist/PaletteField-D4c-Q1PG.js.map +1 -0
  139. package/dist/PaletteField-DnUpn2zP.cjs +2 -0
  140. package/dist/PaletteField-DnUpn2zP.cjs.map +1 -0
  141. package/dist/{PhoneField-DzLTXJcw.cjs → PhoneField-BTB2_Lo1.cjs} +2 -2
  142. package/dist/{PhoneField-DzLTXJcw.cjs.map → PhoneField-BTB2_Lo1.cjs.map} +1 -1
  143. package/dist/{PhoneField-CjYw-Unw.js → PhoneField-BY5hapKk.js} +4 -4
  144. package/dist/{PhoneField-CjYw-Unw.js.map → PhoneField-BY5hapKk.js.map} +1 -1
  145. package/dist/{Popconfirm-B3GhhrRM.js → Popconfirm-BXa5qLHY.js} +3 -3
  146. package/dist/{Popconfirm-B3GhhrRM.js.map → Popconfirm-BXa5qLHY.js.map} +1 -1
  147. package/dist/{Popconfirm-CYc8ywDI.cjs → Popconfirm-PkVgBrL-.cjs} +2 -2
  148. package/dist/{Popconfirm-CYc8ywDI.cjs.map → Popconfirm-PkVgBrL-.cjs.map} +1 -1
  149. package/dist/{Progress-BABBBG2y.cjs → Progress-R_Vt4gJA.cjs} +2 -2
  150. package/dist/{Progress-BABBBG2y.cjs.map → Progress-R_Vt4gJA.cjs.map} +1 -1
  151. package/dist/{Progress-ZNQrxw_Q.js → Progress-bId4RkgJ.js} +2 -2
  152. package/dist/{Progress-ZNQrxw_Q.js.map → Progress-bId4RkgJ.js.map} +1 -1
  153. package/dist/{RemoveDialog-B_Y18MeJ.cjs → RemoveDialog-Cvj-DaiY.cjs} +2 -2
  154. package/dist/{RemoveDialog-B_Y18MeJ.cjs.map → RemoveDialog-Cvj-DaiY.cjs.map} +1 -1
  155. package/dist/{RemoveDialog-ayAfGXpB.js → RemoveDialog-Dh_q5jZF.js} +5 -5
  156. package/dist/{RemoveDialog-ayAfGXpB.js.map → RemoveDialog-Dh_q5jZF.js.map} +1 -1
  157. package/dist/{RichTextEditor-itYD1PfE.js → RichTextEditor-Dv-LDsN-.js} +7 -7
  158. package/dist/{RichTextEditor-itYD1PfE.js.map → RichTextEditor-Dv-LDsN-.js.map} +1 -1
  159. package/dist/{RichTextEditor-DSvSaszc.cjs → RichTextEditor-lmPGowSR.cjs} +2 -2
  160. package/dist/{RichTextEditor-DSvSaszc.cjs.map → RichTextEditor-lmPGowSR.cjs.map} +1 -1
  161. package/dist/RootLayout-B_ZtI-L_.cjs +2 -0
  162. package/dist/RootLayout-B_ZtI-L_.cjs.map +1 -0
  163. package/dist/RootLayout-DIOquzrU.js +642 -0
  164. package/dist/RootLayout-DIOquzrU.js.map +1 -0
  165. package/dist/{Select-K0a_7ROf.js → Select-Bw8Q86ts.js} +3 -3
  166. package/dist/{Select-K0a_7ROf.js.map → Select-Bw8Q86ts.js.map} +1 -1
  167. package/dist/{Select-1FWkryTK.cjs → Select-DdkJXkw-.cjs} +2 -2
  168. package/dist/{Select-1FWkryTK.cjs.map → Select-DdkJXkw-.cjs.map} +1 -1
  169. package/dist/{Sidebar-Dg15hPpM.js → Sidebar-CGL5hvpl.js} +3 -3
  170. package/dist/{Sidebar-Dg15hPpM.js.map → Sidebar-CGL5hvpl.js.map} +1 -1
  171. package/dist/{Sidebar-C3-u3Agj.cjs → Sidebar-CfEx7W7i.cjs} +2 -2
  172. package/dist/{Sidebar-C3-u3Agj.cjs.map → Sidebar-CfEx7W7i.cjs.map} +1 -1
  173. package/dist/{SpeedDial-CEBAWIYo.js → SpeedDial-C-yLmnk7.js} +2 -2
  174. package/dist/{SpeedDial-CEBAWIYo.js.map → SpeedDial-C-yLmnk7.js.map} +1 -1
  175. package/dist/{SpeedDial-D6me6w_m.cjs → SpeedDial-jOxWEd09.cjs} +2 -2
  176. package/dist/{SpeedDial-D6me6w_m.cjs.map → SpeedDial-jOxWEd09.cjs.map} +1 -1
  177. package/dist/{Stepper-wPPs57uZ.cjs → Stepper-D7An-ugU.cjs} +2 -2
  178. package/dist/{Stepper-wPPs57uZ.cjs.map → Stepper-D7An-ugU.cjs.map} +1 -1
  179. package/dist/{Stepper-BN0GsRZW.js → Stepper-DYpiLhzD.js} +2 -2
  180. package/dist/{Stepper-BN0GsRZW.js.map → Stepper-DYpiLhzD.js.map} +1 -1
  181. package/dist/{Table-CFl3OYlo.cjs → Table-BhaH8EKZ.cjs} +2 -2
  182. package/dist/{Table-CFl3OYlo.cjs.map → Table-BhaH8EKZ.cjs.map} +1 -1
  183. package/dist/{Table-DChIfjqj.js → Table-DK4GBKS3.js} +15 -15
  184. package/dist/{Table-DChIfjqj.js.map → Table-DK4GBKS3.js.map} +1 -1
  185. package/dist/{Tabs-BAKPWO4g.cjs → Tabs-6x4vC8je.cjs} +2 -2
  186. package/dist/{Tabs-BAKPWO4g.cjs.map → Tabs-6x4vC8je.cjs.map} +1 -1
  187. package/dist/{Tabs-DfVFgOfs.js → Tabs-CWiDeqqW.js} +2 -2
  188. package/dist/{Tabs-DfVFgOfs.js.map → Tabs-CWiDeqqW.js.map} +1 -1
  189. package/dist/{TagsField-CoBRqcjW.js → TagsField-Cg9YVl7G.js} +4 -4
  190. package/dist/{TagsField-CoBRqcjW.js.map → TagsField-Cg9YVl7G.js.map} +1 -1
  191. package/dist/{TagsField-5mbyaFQZ.cjs → TagsField-DwZLCIeb.cjs} +2 -2
  192. package/dist/{TagsField-5mbyaFQZ.cjs.map → TagsField-DwZLCIeb.cjs.map} +1 -1
  193. package/dist/{TextField-0gFvIFs8.js → TextField-5nQkU8HP.js} +3 -3
  194. package/dist/{TextField-0gFvIFs8.js.map → TextField-5nQkU8HP.js.map} +1 -1
  195. package/dist/{TextField-BL6OAJcP.cjs → TextField-BRaoadxk.cjs} +2 -2
  196. package/dist/{TextField-BL6OAJcP.cjs.map → TextField-BRaoadxk.cjs.map} +1 -1
  197. package/dist/ThemeToggle-DXpbooYn.js +28 -0
  198. package/dist/{ThemeToggle-_SUmLxmU.js.map → ThemeToggle-DXpbooYn.js.map} +1 -1
  199. package/dist/{ThemeToggle-BgKfcb02.cjs → ThemeToggle-DhaVEyPL.cjs} +2 -2
  200. package/dist/{ThemeToggle-BgKfcb02.cjs.map → ThemeToggle-DhaVEyPL.cjs.map} +1 -1
  201. package/dist/{TimeColumns-BE1sLoRV.js → TimeColumns-C_gdJn__.js} +2 -2
  202. package/dist/{TimeColumns-BE1sLoRV.js.map → TimeColumns-C_gdJn__.js.map} +1 -1
  203. package/dist/{TimeColumns-DkJsIu1w.cjs → TimeColumns-girAEgEN.cjs} +2 -2
  204. package/dist/{TimeColumns-DkJsIu1w.cjs.map → TimeColumns-girAEgEN.cjs.map} +1 -1
  205. package/dist/{TimePicker-Bv2qIFf9.js → TimePicker-DHdsY8kQ.js} +5 -5
  206. package/dist/{TimePicker-Bv2qIFf9.js.map → TimePicker-DHdsY8kQ.js.map} +1 -1
  207. package/dist/{TimePicker-6nHQx0P5.cjs → TimePicker-_Ak5yB_5.cjs} +2 -2
  208. package/dist/{TimePicker-6nHQx0P5.cjs.map → TimePicker-_Ak5yB_5.cjs.map} +1 -1
  209. package/dist/{Toaster-Fq6-ImDJ.js → Toaster-Dput5iLU.js} +2 -2
  210. package/dist/{Toaster-Fq6-ImDJ.js.map → Toaster-Dput5iLU.js.map} +1 -1
  211. package/dist/{Toaster-Brcspf7v.cjs → Toaster-fjyF8W3F.cjs} +2 -2
  212. package/dist/{Toaster-Brcspf7v.cjs.map → Toaster-fjyF8W3F.cjs.map} +1 -1
  213. package/dist/{TranslatedFields-CVc0NvXa.cjs → TranslatedFields-B-BU17IV.cjs} +2 -2
  214. package/dist/{TranslatedFields-CVc0NvXa.cjs.map → TranslatedFields-B-BU17IV.cjs.map} +1 -1
  215. package/dist/{TranslatedFields-CmRhRGC_.js → TranslatedFields-JnqLgUiF.js} +16 -16
  216. package/dist/{TranslatedFields-CmRhRGC_.js.map → TranslatedFields-JnqLgUiF.js.map} +1 -1
  217. package/dist/{UserCard-1ubnvBV6.cjs → UserCard-B9bzkZph.cjs} +2 -2
  218. package/dist/{UserCard-1ubnvBV6.cjs.map → UserCard-B9bzkZph.cjs.map} +1 -1
  219. package/dist/{UserCard-DcTLEHFu.js → UserCard-DYK6S-nr.js} +3 -3
  220. package/dist/{UserCard-DcTLEHFu.js.map → UserCard-DYK6S-nr.js.map} +1 -1
  221. package/dist/app/AdminRoot.d.cts +8 -1
  222. package/dist/app/AdminRoot.d.ts +8 -1
  223. package/dist/components/Alert/index.cjs +1 -1
  224. package/dist/components/Alert/index.js +1 -1
  225. package/dist/components/Breadcrumbs/index.cjs +1 -1
  226. package/dist/components/Breadcrumbs/index.js +1 -1
  227. package/dist/components/Button/index.cjs +1 -1
  228. package/dist/components/Button/index.js +1 -1
  229. package/dist/components/Card/index.cjs +1 -1
  230. package/dist/components/Card/index.js +1 -1
  231. package/dist/components/Chip/index.cjs +1 -1
  232. package/dist/components/Chip/index.js +1 -1
  233. package/dist/components/CodeBlock/index.cjs +1 -1
  234. package/dist/components/CodeBlock/index.js +1 -1
  235. package/dist/components/ColorPicker/index.cjs +1 -1
  236. package/dist/components/ColorPicker/index.js +1 -1
  237. package/dist/components/ColorRamp/index.cjs +1 -1
  238. package/dist/components/ColorRamp/index.js +1 -1
  239. package/dist/components/CopyButton/index.cjs +1 -1
  240. package/dist/components/CopyButton/index.js +1 -1
  241. package/dist/components/DatePicker/index.cjs +1 -1
  242. package/dist/components/DatePicker/index.js +1 -1
  243. package/dist/components/DateTimePicker/index.cjs +1 -1
  244. package/dist/components/DateTimePicker/index.js +1 -1
  245. package/dist/components/DescriptionList/index.cjs +1 -1
  246. package/dist/components/DescriptionList/index.js +1 -1
  247. package/dist/components/EmptyState/index.cjs +1 -1
  248. package/dist/components/EmptyState/index.js +1 -1
  249. package/dist/components/ErrorState/index.cjs +1 -1
  250. package/dist/components/ErrorState/index.js +2 -2
  251. package/dist/components/FileCard/index.cjs +1 -1
  252. package/dist/components/FileCard/index.js +1 -1
  253. package/dist/components/FileUploader/index.cjs +1 -1
  254. package/dist/components/FileUploader/index.js +1 -1
  255. package/dist/components/Flag/index.cjs +1 -1
  256. package/dist/components/Flag/index.js +1 -1
  257. package/dist/components/FullscreenToggle/index.cjs +1 -1
  258. package/dist/components/FullscreenToggle/index.js +1 -1
  259. package/dist/components/IconButton/index.cjs +1 -1
  260. package/dist/components/IconButton/index.js +1 -1
  261. package/dist/components/Loader/index.cjs +1 -1
  262. package/dist/components/Loader/index.js +1 -1
  263. package/dist/components/LocationPicker/index.cjs +1 -1
  264. package/dist/components/LocationPicker/index.js +1 -1
  265. package/dist/components/Modal/index.cjs +1 -1
  266. package/dist/components/Modal/index.js +1 -1
  267. package/dist/components/MultiSelect/index.cjs +1 -1
  268. package/dist/components/MultiSelect/index.js +1 -1
  269. package/dist/components/NumberField/index.cjs +1 -1
  270. package/dist/components/NumberField/index.js +1 -1
  271. package/dist/components/OtpField/index.cjs +1 -1
  272. package/dist/components/OtpField/index.js +1 -1
  273. package/dist/components/PageError/index.cjs +1 -1
  274. package/dist/components/PageError/index.js +1 -1
  275. package/dist/components/PageLayout/index.cjs +1 -1
  276. package/dist/components/PageLayout/index.js +1 -1
  277. package/dist/components/PageNotFound/index.cjs +1 -1
  278. package/dist/components/PageNotFound/index.js +1 -1
  279. package/dist/components/Pagination/index.cjs +1 -1
  280. package/dist/components/Pagination/index.js +1 -1
  281. package/dist/components/PaletteField/PaletteField.d.cts +8 -2
  282. package/dist/components/PaletteField/PaletteField.d.ts +8 -2
  283. package/dist/components/PaletteField/index.cjs +1 -1
  284. package/dist/components/PaletteField/index.js +1 -1
  285. package/dist/components/PhoneField/index.cjs +1 -1
  286. package/dist/components/PhoneField/index.js +1 -1
  287. package/dist/components/Popconfirm/index.cjs +1 -1
  288. package/dist/components/Popconfirm/index.js +1 -1
  289. package/dist/components/Progress/index.cjs +1 -1
  290. package/dist/components/Progress/index.js +1 -1
  291. package/dist/components/RemoveDialog/index.cjs +1 -1
  292. package/dist/components/RemoveDialog/index.js +1 -1
  293. package/dist/components/RichTextEditor/index.cjs +1 -1
  294. package/dist/components/RichTextEditor/index.js +1 -1
  295. package/dist/components/RootLayout/RootLayout.d.cts +18 -5
  296. package/dist/components/RootLayout/RootLayout.d.ts +18 -5
  297. package/dist/components/RootLayout/SettingsDrawer.d.cts +8 -2
  298. package/dist/components/RootLayout/SettingsDrawer.d.ts +8 -2
  299. package/dist/components/RootLayout/index.cjs +1 -1
  300. package/dist/components/RootLayout/index.d.cts +1 -1
  301. package/dist/components/RootLayout/index.d.ts +1 -1
  302. package/dist/components/RootLayout/index.js +1 -1
  303. package/dist/components/Select/index.cjs +1 -1
  304. package/dist/components/Select/index.js +1 -1
  305. package/dist/components/Sidebar/index.cjs +1 -1
  306. package/dist/components/Sidebar/index.js +1 -1
  307. package/dist/components/SpeedDial/index.cjs +1 -1
  308. package/dist/components/SpeedDial/index.js +1 -1
  309. package/dist/components/Stepper/index.cjs +1 -1
  310. package/dist/components/Stepper/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/Toast/index.cjs +1 -1
  324. package/dist/components/Toast/index.js +1 -1
  325. package/dist/components/TranslatedFields/index.cjs +1 -1
  326. package/dist/components/TranslatedFields/index.js +1 -1
  327. package/dist/components/UserCard/index.cjs +1 -1
  328. package/dist/components/UserCard/index.js +1 -1
  329. package/dist/entries/app.cjs +1 -1
  330. package/dist/entries/app.js +1 -1
  331. package/dist/entries/components.cjs +1 -1
  332. package/dist/entries/components.js +50 -50
  333. package/dist/entries/i18n.cjs +1 -1
  334. package/dist/entries/i18n.js +2 -2
  335. package/dist/entries/theme.cjs +1 -1
  336. package/dist/entries/theme.d.cts +2 -2
  337. package/dist/entries/theme.d.ts +2 -2
  338. package/dist/entries/theme.js +12 -11
  339. package/dist/i18n/messages.d.cts +6 -0
  340. package/dist/i18n/messages.d.ts +6 -0
  341. package/dist/index.cjs +1 -1
  342. package/dist/index.css +1 -1
  343. package/dist/index.js +232 -231
  344. package/dist/{messages-CMgYU5p6.js → messages-BasxRpyx.js} +64 -22
  345. package/dist/messages-BasxRpyx.js.map +1 -0
  346. package/dist/{messages-h22vS9zn.cjs → messages-CElolVGm.cjs} +9 -9
  347. package/dist/messages-CElolVGm.cjs.map +1 -0
  348. package/dist/theme/ConfigProvider.d.cts +33 -2
  349. package/dist/theme/ConfigProvider.d.ts +33 -2
  350. package/dist/theme/index.d.cts +2 -2
  351. package/dist/theme/index.d.ts +2 -2
  352. package/dist/{useHomeTo-MfvJxziQ.cjs → useHomeTo-BnjXms11.cjs} +2 -2
  353. package/dist/{useHomeTo-MfvJxziQ.cjs.map → useHomeTo-BnjXms11.cjs.map} +1 -1
  354. package/dist/{useHomeTo-Ckq7scIY.js → useHomeTo-Btkk0RSB.js} +2 -2
  355. package/dist/{useHomeTo-Ckq7scIY.js.map → useHomeTo-Btkk0RSB.js.map} +1 -1
  356. package/dist/{useOptionMenu-BBsyUow1.js → useOptionMenu-DeW68na-.js} +3 -3
  357. package/dist/{useOptionMenu-BBsyUow1.js.map → useOptionMenu-DeW68na-.js.map} +1 -1
  358. package/dist/{useOptionMenu-3YlvxPAM.cjs → useOptionMenu-IebDGoqk.cjs} +2 -2
  359. package/dist/{useOptionMenu-3YlvxPAM.cjs.map → useOptionMenu-IebDGoqk.cjs.map} +1 -1
  360. package/package.json +1 -1
  361. package/dist/AdminRoot-CRTBGUxq.cjs +0 -2
  362. package/dist/AdminRoot-CRTBGUxq.cjs.map +0 -1
  363. package/dist/AdminRoot-JOgiNkJA.js.map +0 -1
  364. package/dist/ConfigProvider-B_Bb6pk1.cjs +0 -2
  365. package/dist/ConfigProvider-B_Bb6pk1.cjs.map +0 -1
  366. package/dist/ConfigProvider-DeMASTVo.js +0 -347
  367. package/dist/ConfigProvider-DeMASTVo.js.map +0 -1
  368. package/dist/PaletteField-ChG2VQtS.js +0 -54
  369. package/dist/PaletteField-ChG2VQtS.js.map +0 -1
  370. package/dist/PaletteField-DQ1OvXqe.cjs +0 -2
  371. package/dist/PaletteField-DQ1OvXqe.cjs.map +0 -1
  372. package/dist/RootLayout-BlYjYAYk.js +0 -582
  373. package/dist/RootLayout-BlYjYAYk.js.map +0 -1
  374. package/dist/RootLayout-D5nlzYlH.cjs +0 -2
  375. package/dist/RootLayout-D5nlzYlH.cjs.map +0 -1
  376. package/dist/ThemeToggle-_SUmLxmU.js +0 -28
  377. package/dist/messages-CMgYU5p6.js.map +0 -1
  378. package/dist/messages-h22vS9zn.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorState-DI28ZCJN.js","sources":["../src/components/ErrorState/ErrorDetailsModal.tsx","../src/components/ErrorState/ErrorState.tsx"],"sourcesContent":["import { useT } from '../../theme'\nimport { useClipboard } from '../../hooks/useClipboard'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Modal } from '../Modal'\nimport styles from './ErrorState.module.css'\n\nexport interface ErrorDetailsModalProps {\n open: boolean\n onClose: () => void\n /** The whole report — shown as-is and copied by the Copy button. */\n report: string\n}\n\n/**\n * Internal to `ErrorState`: the \"Details\" dialog — the error report (trace id, status, message, then the stack /\n * raw dump when allowed) in one monospace block, with **Copy** (the whole report, flips to \"Copied!\") and\n * **Close** in the footer, so a user can paste it into a support ticket in one go.\n */\nexport function ErrorDetailsModal({ open, onClose, report }: ErrorDetailsModalProps) {\n const t = useT()\n const { copy, copied } = useClipboard()\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={t('errorState.detailsTitle')}\n icon=\"Danger\"\n color=\"error\"\n size=\"lg\"\n scrollBehavior=\"inside\"\n footer={\n <>\n <Button variant=\"text\" color=\"primary\" onClick={onClose}>\n {t('common.close')}\n </Button>\n <Button\n startIcon={<Icon name={copied ? 'CopySuccess' : 'Copy'} />}\n onClick={() => void copy(report)}\n >\n {copied ? t('clipboard.copied') : t('clipboard.copy')}\n </Button>\n </>\n }\n >\n <pre className={styles.pre}>{report}</pre>\n </Modal>\n )\n}\n","import { forwardRef, useState, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { Alert } from '../Alert'\nimport { Button } from '../Button'\nimport { EmptyState, type EmptyStateProps } from '../EmptyState'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Tooltip } from '../Tooltip'\nimport type { IconName } from '../../icons/names'\nimport {\n getErrorDetails,\n getErrorFieldErrors,\n getErrorMessage,\n getErrorStatus,\n getErrorTraceId,\n humanizeField,\n isNetworkError,\n isDev,\n} from './errorMessage'\nimport { ErrorDetailsModal } from './ErrorDetailsModal'\nimport styles from './ErrorState.module.css'\n\nexport type ErrorStateVariant = 'block' | 'alert'\n\nexport interface ErrorStateProps extends Omit<EmptyStateProps, 'icon' | 'title' | 'color'> {\n /**\n * The shape. `'alert'` (default) — a red `Alert` banner: the message (no default title), then Try Again /\n * Details / `action` in the alert's action slot; it fits anywhere — above a form, in a modal, in a card.\n * `'block'` — the `EmptyState`-style block (puck, title, centred message, the buttons below), for an area\n * whose data failed to load, or a whole page (`PageError`). `compact` and `pattern` apply to `'block'` only.\n */\n variant?: ErrorStateVariant\n /**\n * What failed — an `Error`, a string, an axios-style error, a `{ message }` or a raw `{ status }`\n * response. Its message becomes the description (unless `description` is given) and its stack feeds\n * the details panel.\n */\n error?: unknown\n /**\n * Heading. Alert: none unless given — the message is the point. Block: defaults to the localized \"Something\n * Went Wrong\".\n */\n title?: ReactNode\n /**\n * Leading icon — a known `IconName`, any node, or `false`. Defaults to `Danger` in both variants (the alert\n * replaces the Alert's own × icon), or `CloudCross` when the request never got a response (an explicit\n * `status: 0` / network error code), tinted `error`.\n */\n icon?: IconName | ReactNode | false\n /** Adds a \"Try Again\" button that calls this (e.g. a query's `refetch`). */\n onRetry?: () => void\n /**\n * The retry is running (e.g. `query.isFetching`) — the \"Try Again\" button shows its loader and is disabled,\n * so a slow refetch doesn't look like a dead click. Defaults to `false`.\n */\n retrying?: boolean\n /** Retry button label. Defaults to the localized \"Try Again\". */\n retryLabel?: ReactNode\n /**\n * Include the technical dump (the stack, or the raw error as JSON) in the **Details** dialog. `'dev'`\n * (default) only in development builds; `true` always; `false` never. The Details button itself shows\n * whenever there's a trace id or this dump — never inline on the page.\n */\n showDetails?: boolean | 'dev'\n /** The inline variant — small, no hero pattern — for inside a table, card or panel. Defaults to `false`. */\n compact?: boolean\n /**\n * The server's trace id — it matches a report to the server log. It isn't shown on the page: it leads the\n * **Details** dialog (with a copy button), and its presence alone shows the Details button, production\n * included. Defaults to the one on `error` (`error.traceId` / `error.response.data.traceId`); `false` hides it.\n */\n traceId?: string | false\n /**\n * Per-field validation messages (`{ field: message }`), listed as the description when there's no explicit\n * `description`. Defaults to the ones on `error` (`getErrorFieldErrors`: `error.fieldErrors` — an object, a\n * method or a `{ field, message }[]` —, `error.details`, `error.response.data.errors`); `false` hides them. In a form, put them on the inputs instead.\n */\n fieldErrors?: Record<string, string> | false\n /**\n * Labels for the field-error keys (`{ newPassword: 'New Password' }`). A key without one is shown humanized\n * and Title Cased (`newPassword` / `new_password` → \"New Password\"; a dotted path keeps its last segment).\n */\n fieldLabels?: Record<string, ReactNode>\n}\n\n/**\n * The \"it broke\" counterpart of `EmptyState`. By default (`variant=\"alert\"`) a red `Alert` banner with a `Danger`\n * icon: the failure's own message (extracted from an `Error`, a string, an axios-style `response.data.message`, a\n * `{ message }`, or a raw `{ status }` → \"Request failed (404)\"), or a 400's per-field `fieldErrors` list; then\n * **Try Again** (`onRetry`, spinning while `retrying`) and **Details** in its action slot. `variant=\"block\"` is the\n * `EmptyState`-style block (an `error`-tinted puck, a \"Something Went Wrong\" title, the same buttons below);\n * `compact` is its inline size. **Details** opens a dialog with the full report — the server's `traceId`, the\n * status, the message, and the stack in development (`showDetails`) — in one block with a copy button. Announced\n * once (`role=\"alert\"`). `forwardRef` to the root; any other `EmptyState` prop passes through to the block.\n */\nexport const ErrorState = forwardRef<HTMLDivElement, ErrorStateProps>(function ErrorState(\n {\n error,\n variant = 'alert',\n title,\n description,\n icon,\n onRetry,\n retrying = false,\n retryLabel,\n showDetails = 'dev',\n compact = false,\n traceId: traceIdProp,\n fieldErrors: fieldErrorsProp,\n fieldLabels,\n size,\n pattern,\n action,\n className,\n children,\n ...props\n },\n ref,\n) {\n const t = useT()\n const [detailsOpen, setDetailsOpen] = useState(false)\n const message = getErrorMessage(error, (status) => t('errorState.requestFailed', { status }))\n const traceId = traceIdProp === false ? undefined : (traceIdProp ?? getErrorTraceId(error))\n const fieldErrors =\n fieldErrorsProp === false ? undefined : (fieldErrorsProp ?? getErrorFieldErrors(error))\n const fieldErrorList =\n fieldErrors && Object.keys(fieldErrors).length > 0 ? (\n <ul className={styles.fieldErrors}>\n {Object.entries(fieldErrors).map(([field, msg]) => (\n <li key={field}>\n <span className={styles.field}>{fieldLabels?.[field] ?? humanizeField(field)}</span> —{' '}\n {msg}\n </li>\n ))}\n </ul>\n ) : undefined\n const body = description ?? fieldErrorList ?? message ?? t('errorState.description')\n const resolvedIcon = icon === undefined ? (isNetworkError(error) ? 'CloudCross' : 'Danger') : icon\n\n // the \"Details\" report — trace id, status, message, then the stack / raw dump (dev only by default). The\n // button shows when there's something worth opening: a trace id (always — it's what support asks for) or\n // the technical dump.\n const technical = (showDetails === 'dev' ? isDev() : showDetails)\n ? getErrorDetails(error)\n : undefined\n const status = getErrorStatus(error)\n const report =\n traceId != null || technical != null\n ? [\n traceId != null && `${t('errorState.traceId')}: ${traceId}`,\n status != null && `${t('errorState.status')}: ${status}`,\n // the raw message only where it's already visible, or with the dev dump — a `description` /\n // `fallback` (or PageError) hides it on purpose\n message != null &&\n (body === message || technical != null) &&\n `${t('errorState.message')}: ${message}`,\n technical != null && `\\n${technical}`,\n ]\n .filter(Boolean)\n .join('\\n')\n : undefined\n const detailsModal =\n report != null ? (\n <ErrorDetailsModal open={detailsOpen} onClose={() => setDetailsOpen(false)} report={report} />\n ) : null\n\n // ── alert (default): a banner — the message, then Try Again / Details / action in the action slot ──\n if (variant === 'alert') {\n const alertActions =\n report != null || onRetry != null || action != null ? (\n <span className={styles.alertActions}>\n {/* an icon-only retry (tooltip + aria-label) keeps the slot narrow, so the message keeps its room on\n small screens */}\n {onRetry != null && (\n <Tooltip content={retryLabel ?? t('errorState.retry')}>\n <IconButton\n size=\"sm\"\n variant=\"text\"\n color=\"error\"\n aria-label={typeof retryLabel === 'string' ? retryLabel : t('errorState.retry')}\n loading={retrying}\n disabled={retrying}\n onClick={onRetry}\n >\n <Icon name=\"RefreshArrow2\" />\n </IconButton>\n </Tooltip>\n )}\n {report != null && (\n <Button size=\"sm\" variant=\"filled\" color=\"error\" onClick={() => setDetailsOpen(true)}>\n {t('errorState.details')}\n </Button>\n )}\n {action}\n </span>\n ) : undefined\n return (\n <>\n <Alert\n ref={ref}\n color=\"error\"\n icon={resolvedIcon}\n action={alertActions}\n className={clsx(styles.alertVariant, className)}\n {...props}\n >\n {title != null && <span className={styles.alertTitle}>{title}</span>}\n <span className={styles.alertBody}>{body}</span>\n {children}\n </Alert>\n {detailsModal}\n </>\n )\n }\n\n // ── block: the EmptyState-style hero / compact block ──\n const retry =\n onRetry != null ? (\n <Button\n size=\"sm\"\n variant=\"outlined\"\n color=\"primary\"\n startIcon={<Icon name=\"RefreshRight\" />}\n loading={retrying}\n disabled={retrying}\n onClick={onRetry}\n >\n {retryLabel ?? t('errorState.retry')}\n </Button>\n ) : null\n const detailsButton =\n report != null ? (\n <Button\n size=\"sm\"\n variant=\"text\"\n color=\"primary\"\n startIcon={<Icon name=\"DocumentText\" />}\n onClick={() => setDetailsOpen(true)}\n >\n {t('errorState.details')}\n </Button>\n ) : null\n\n return (\n <>\n <EmptyState\n ref={ref}\n // one announcement, assertive: an error is what the user needs to know now (role=\"alert\" already\n // implies aria-live=\"assertive\" — pairing it with \"polite\" was contradictory)\n role=\"alert\"\n color=\"error\"\n icon={resolvedIcon}\n title={title ?? t('errorState.title')}\n // a 400's message is the generic \"validation errors occurred\" — the per-field list is the useful part\n description={body}\n size={size ?? (compact ? 'sm' : 'md')}\n pattern={pattern ?? !compact}\n action={\n retry || detailsButton || action ? (\n <span className={styles.actions}>\n {retry}\n {detailsButton}\n {action}\n </span>\n ) : undefined\n }\n className={clsx(styles.errorState, compact && styles.compact, className)}\n {...props}\n >\n {children}\n </EmptyState>\n {detailsModal}\n </>\n )\n})\n"],"names":["ErrorDetailsModal","open","onClose","report","t","useT","copy","copied","useClipboard","jsx","Modal","jsxs","Fragment","Button","Icon","styles","ErrorState","forwardRef","error","variant","title","description","icon","onRetry","retrying","retryLabel","showDetails","compact","traceIdProp","fieldErrorsProp","fieldLabels","size","pattern","action","className","children","props","ref","detailsOpen","setDetailsOpen","useState","message","getErrorMessage","status","traceId","getErrorTraceId","fieldErrors","getErrorFieldErrors","fieldErrorList","field","msg","humanizeField","body","resolvedIcon","isNetworkError","technical","isDev","getErrorDetails","getErrorStatus","detailsModal","alertActions","Tooltip","IconButton","Alert","clsx","retry","detailsButton","EmptyState"],"mappings":"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"}
1
+ {"version":3,"file":"ErrorState-Hfd_0MeE.js","sources":["../src/components/ErrorState/ErrorDetailsModal.tsx","../src/components/ErrorState/ErrorState.tsx"],"sourcesContent":["import { useT } from '../../theme'\nimport { useClipboard } from '../../hooks/useClipboard'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Modal } from '../Modal'\nimport styles from './ErrorState.module.css'\n\nexport interface ErrorDetailsModalProps {\n open: boolean\n onClose: () => void\n /** The whole report — shown as-is and copied by the Copy button. */\n report: string\n}\n\n/**\n * Internal to `ErrorState`: the \"Details\" dialog — the error report (trace id, status, message, then the stack /\n * raw dump when allowed) in one monospace block, with **Copy** (the whole report, flips to \"Copied!\") and\n * **Close** in the footer, so a user can paste it into a support ticket in one go.\n */\nexport function ErrorDetailsModal({ open, onClose, report }: ErrorDetailsModalProps) {\n const t = useT()\n const { copy, copied } = useClipboard()\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={t('errorState.detailsTitle')}\n icon=\"Danger\"\n color=\"error\"\n size=\"lg\"\n scrollBehavior=\"inside\"\n footer={\n <>\n <Button variant=\"text\" color=\"primary\" onClick={onClose}>\n {t('common.close')}\n </Button>\n <Button\n startIcon={<Icon name={copied ? 'CopySuccess' : 'Copy'} />}\n onClick={() => void copy(report)}\n >\n {copied ? t('clipboard.copied') : t('clipboard.copy')}\n </Button>\n </>\n }\n >\n <pre className={styles.pre}>{report}</pre>\n </Modal>\n )\n}\n","import { forwardRef, useState, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { Alert } from '../Alert'\nimport { Button } from '../Button'\nimport { EmptyState, type EmptyStateProps } from '../EmptyState'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Tooltip } from '../Tooltip'\nimport type { IconName } from '../../icons/names'\nimport {\n getErrorDetails,\n getErrorFieldErrors,\n getErrorMessage,\n getErrorStatus,\n getErrorTraceId,\n humanizeField,\n isNetworkError,\n isDev,\n} from './errorMessage'\nimport { ErrorDetailsModal } from './ErrorDetailsModal'\nimport styles from './ErrorState.module.css'\n\nexport type ErrorStateVariant = 'block' | 'alert'\n\nexport interface ErrorStateProps extends Omit<EmptyStateProps, 'icon' | 'title' | 'color'> {\n /**\n * The shape. `'alert'` (default) — a red `Alert` banner: the message (no default title), then Try Again /\n * Details / `action` in the alert's action slot; it fits anywhere — above a form, in a modal, in a card.\n * `'block'` — the `EmptyState`-style block (puck, title, centred message, the buttons below), for an area\n * whose data failed to load, or a whole page (`PageError`). `compact` and `pattern` apply to `'block'` only.\n */\n variant?: ErrorStateVariant\n /**\n * What failed — an `Error`, a string, an axios-style error, a `{ message }` or a raw `{ status }`\n * response. Its message becomes the description (unless `description` is given) and its stack feeds\n * the details panel.\n */\n error?: unknown\n /**\n * Heading. Alert: none unless given — the message is the point. Block: defaults to the localized \"Something\n * Went Wrong\".\n */\n title?: ReactNode\n /**\n * Leading icon — a known `IconName`, any node, or `false`. Defaults to `Danger` in both variants (the alert\n * replaces the Alert's own × icon), or `CloudCross` when the request never got a response (an explicit\n * `status: 0` / network error code), tinted `error`.\n */\n icon?: IconName | ReactNode | false\n /** Adds a \"Try Again\" button that calls this (e.g. a query's `refetch`). */\n onRetry?: () => void\n /**\n * The retry is running (e.g. `query.isFetching`) — the \"Try Again\" button shows its loader and is disabled,\n * so a slow refetch doesn't look like a dead click. Defaults to `false`.\n */\n retrying?: boolean\n /** Retry button label. Defaults to the localized \"Try Again\". */\n retryLabel?: ReactNode\n /**\n * Include the technical dump (the stack, or the raw error as JSON) in the **Details** dialog. `'dev'`\n * (default) only in development builds; `true` always; `false` never. The Details button itself shows\n * whenever there's a trace id or this dump — never inline on the page.\n */\n showDetails?: boolean | 'dev'\n /** The inline variant — small, no hero pattern — for inside a table, card or panel. Defaults to `false`. */\n compact?: boolean\n /**\n * The server's trace id — it matches a report to the server log. It isn't shown on the page: it leads the\n * **Details** dialog (with a copy button), and its presence alone shows the Details button, production\n * included. Defaults to the one on `error` (`error.traceId` / `error.response.data.traceId`); `false` hides it.\n */\n traceId?: string | false\n /**\n * Per-field validation messages (`{ field: message }`), listed as the description when there's no explicit\n * `description`. Defaults to the ones on `error` (`getErrorFieldErrors`: `error.fieldErrors` — an object, a\n * method or a `{ field, message }[]` —, `error.details`, `error.response.data.errors`); `false` hides them. In a form, put them on the inputs instead.\n */\n fieldErrors?: Record<string, string> | false\n /**\n * Labels for the field-error keys (`{ newPassword: 'New Password' }`). A key without one is shown humanized\n * and Title Cased (`newPassword` / `new_password` → \"New Password\"; a dotted path keeps its last segment).\n */\n fieldLabels?: Record<string, ReactNode>\n}\n\n/**\n * The \"it broke\" counterpart of `EmptyState`. By default (`variant=\"alert\"`) a red `Alert` banner with a `Danger`\n * icon: the failure's own message (extracted from an `Error`, a string, an axios-style `response.data.message`, a\n * `{ message }`, or a raw `{ status }` → \"Request failed (404)\"), or a 400's per-field `fieldErrors` list; then\n * **Try Again** (`onRetry`, spinning while `retrying`) and **Details** in its action slot. `variant=\"block\"` is the\n * `EmptyState`-style block (an `error`-tinted puck, a \"Something Went Wrong\" title, the same buttons below);\n * `compact` is its inline size. **Details** opens a dialog with the full report — the server's `traceId`, the\n * status, the message, and the stack in development (`showDetails`) — in one block with a copy button. Announced\n * once (`role=\"alert\"`). `forwardRef` to the root; any other `EmptyState` prop passes through to the block.\n */\nexport const ErrorState = forwardRef<HTMLDivElement, ErrorStateProps>(function ErrorState(\n {\n error,\n variant = 'alert',\n title,\n description,\n icon,\n onRetry,\n retrying = false,\n retryLabel,\n showDetails = 'dev',\n compact = false,\n traceId: traceIdProp,\n fieldErrors: fieldErrorsProp,\n fieldLabels,\n size,\n pattern,\n action,\n className,\n children,\n ...props\n },\n ref,\n) {\n const t = useT()\n const [detailsOpen, setDetailsOpen] = useState(false)\n const message = getErrorMessage(error, (status) => t('errorState.requestFailed', { status }))\n const traceId = traceIdProp === false ? undefined : (traceIdProp ?? getErrorTraceId(error))\n const fieldErrors =\n fieldErrorsProp === false ? undefined : (fieldErrorsProp ?? getErrorFieldErrors(error))\n const fieldErrorList =\n fieldErrors && Object.keys(fieldErrors).length > 0 ? (\n <ul className={styles.fieldErrors}>\n {Object.entries(fieldErrors).map(([field, msg]) => (\n <li key={field}>\n <span className={styles.field}>{fieldLabels?.[field] ?? humanizeField(field)}</span> —{' '}\n {msg}\n </li>\n ))}\n </ul>\n ) : undefined\n const body = description ?? fieldErrorList ?? message ?? t('errorState.description')\n const resolvedIcon = icon === undefined ? (isNetworkError(error) ? 'CloudCross' : 'Danger') : icon\n\n // the \"Details\" report — trace id, status, message, then the stack / raw dump (dev only by default). The\n // button shows when there's something worth opening: a trace id (always — it's what support asks for) or\n // the technical dump.\n const technical = (showDetails === 'dev' ? isDev() : showDetails)\n ? getErrorDetails(error)\n : undefined\n const status = getErrorStatus(error)\n const report =\n traceId != null || technical != null\n ? [\n traceId != null && `${t('errorState.traceId')}: ${traceId}`,\n status != null && `${t('errorState.status')}: ${status}`,\n // the raw message only where it's already visible, or with the dev dump — a `description` /\n // `fallback` (or PageError) hides it on purpose\n message != null &&\n (body === message || technical != null) &&\n `${t('errorState.message')}: ${message}`,\n technical != null && `\\n${technical}`,\n ]\n .filter(Boolean)\n .join('\\n')\n : undefined\n const detailsModal =\n report != null ? (\n <ErrorDetailsModal open={detailsOpen} onClose={() => setDetailsOpen(false)} report={report} />\n ) : null\n\n // ── alert (default): a banner — the message, then Try Again / Details / action in the action slot ──\n if (variant === 'alert') {\n const alertActions =\n report != null || onRetry != null || action != null ? (\n <span className={styles.alertActions}>\n {/* an icon-only retry (tooltip + aria-label) keeps the slot narrow, so the message keeps its room on\n small screens */}\n {onRetry != null && (\n <Tooltip content={retryLabel ?? t('errorState.retry')}>\n <IconButton\n size=\"sm\"\n variant=\"text\"\n color=\"error\"\n aria-label={typeof retryLabel === 'string' ? retryLabel : t('errorState.retry')}\n loading={retrying}\n disabled={retrying}\n onClick={onRetry}\n >\n <Icon name=\"RefreshArrow2\" />\n </IconButton>\n </Tooltip>\n )}\n {report != null && (\n <Button size=\"sm\" variant=\"filled\" color=\"error\" onClick={() => setDetailsOpen(true)}>\n {t('errorState.details')}\n </Button>\n )}\n {action}\n </span>\n ) : undefined\n return (\n <>\n <Alert\n ref={ref}\n color=\"error\"\n icon={resolvedIcon}\n action={alertActions}\n className={clsx(styles.alertVariant, className)}\n {...props}\n >\n {title != null && <span className={styles.alertTitle}>{title}</span>}\n <span className={styles.alertBody}>{body}</span>\n {children}\n </Alert>\n {detailsModal}\n </>\n )\n }\n\n // ── block: the EmptyState-style hero / compact block ──\n const retry =\n onRetry != null ? (\n <Button\n size=\"sm\"\n variant=\"outlined\"\n color=\"primary\"\n startIcon={<Icon name=\"RefreshRight\" />}\n loading={retrying}\n disabled={retrying}\n onClick={onRetry}\n >\n {retryLabel ?? t('errorState.retry')}\n </Button>\n ) : null\n const detailsButton =\n report != null ? (\n <Button\n size=\"sm\"\n variant=\"text\"\n color=\"primary\"\n startIcon={<Icon name=\"DocumentText\" />}\n onClick={() => setDetailsOpen(true)}\n >\n {t('errorState.details')}\n </Button>\n ) : null\n\n return (\n <>\n <EmptyState\n ref={ref}\n // one announcement, assertive: an error is what the user needs to know now (role=\"alert\" already\n // implies aria-live=\"assertive\" — pairing it with \"polite\" was contradictory)\n role=\"alert\"\n color=\"error\"\n icon={resolvedIcon}\n title={title ?? t('errorState.title')}\n // a 400's message is the generic \"validation errors occurred\" — the per-field list is the useful part\n description={body}\n size={size ?? (compact ? 'sm' : 'md')}\n pattern={pattern ?? !compact}\n action={\n retry || detailsButton || action ? (\n <span className={styles.actions}>\n {retry}\n {detailsButton}\n {action}\n </span>\n ) : undefined\n }\n className={clsx(styles.errorState, compact && styles.compact, className)}\n {...props}\n >\n {children}\n </EmptyState>\n {detailsModal}\n </>\n )\n})\n"],"names":["ErrorDetailsModal","open","onClose","report","t","useT","copy","copied","useClipboard","jsx","Modal","jsxs","Fragment","Button","Icon","styles","ErrorState","forwardRef","error","variant","title","description","icon","onRetry","retrying","retryLabel","showDetails","compact","traceIdProp","fieldErrorsProp","fieldLabels","size","pattern","action","className","children","props","ref","detailsOpen","setDetailsOpen","useState","message","getErrorMessage","status","traceId","getErrorTraceId","fieldErrors","getErrorFieldErrors","fieldErrorList","field","msg","humanizeField","body","resolvedIcon","isNetworkError","technical","isDev","getErrorDetails","getErrorStatus","detailsModal","alertActions","Tooltip","IconButton","Alert","clsx","retry","detailsButton","EmptyState"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAmBO,SAASA,GAAkB,EAAE,MAAAC,GAAM,SAAAC,GAAS,QAAAC,KAAkC;AACnF,QAAMC,IAAIC,EAAA,GACJ,EAAE,MAAAC,GAAM,QAAAC,EAAA,IAAWC,GAAA;AACzB,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAT;AAAA,MACA,SAAAC;AAAA,MACA,OAAOE,EAAE,yBAAyB;AAAA,MAClC,MAAK;AAAA,MACL,OAAM;AAAA,MACN,MAAK;AAAA,MACL,gBAAe;AAAA,MACf,QACE,gBAAAO,EAAAC,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAH,EAACI,GAAA,EAAO,SAAQ,QAAO,OAAM,WAAU,SAASX,GAC7C,UAAAE,EAAE,cAAc,EAAA,CACnB;AAAA,QACA,gBAAAK;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,WAAW,gBAAAJ,EAACK,GAAA,EAAK,MAAMP,IAAS,gBAAgB,QAAQ;AAAA,YACxD,SAAS,MAAM,KAAKD,EAAKH,CAAM;AAAA,YAE9B,UAASC,EAATG,IAAW,qBAAwB,gBAAN;AAAA,UAAsB;AAAA,QAAA;AAAA,MACtD,GACF;AAAA,MAGF,UAAA,gBAAAE,EAAC,OAAA,EAAI,WAAWM,EAAO,KAAM,UAAAZ,EAAA,CAAO;AAAA,IAAA;AAAA,EAAA;AAG1C;ACgDO,MAAMa,KAAaC,EAA4C,SACpE;AAAA,EACE,OAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,YAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,SAAAC,IAAU;AAAA,EACV,SAASC;AAAA,EACT,aAAaC;AAAA,EACb,aAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAM,IAAIhC,EAAA,GACJ,CAACiC,GAAaC,CAAc,IAAIC,EAAS,EAAK,GAC9CC,IAAUC,EAAgBxB,GAAO,CAACyB,MAAW,EAAE,4BAA4B,EAAE,QAAAA,EAAAA,CAAQ,CAAC,GACtFC,IAAUhB,MAAgB,KAAQ,SAAaA,KAAeiB,EAAgB3B,CAAK,GACnF4B,IACJjB,MAAoB,KAAQ,SAAaA,KAAmBkB,GAAoB7B,CAAK,GACjF8B,IACJF,KAAe,OAAO,KAAKA,CAAW,EAAE,SAAS,IAC/C,gBAAArC,EAAC,MAAA,EAAG,WAAWM,EAAO,aACnB,UAAA,OAAO,QAAQ+B,CAAW,EAAE,IAAI,CAAC,CAACG,GAAOC,CAAG,MAC3C,gBAAAvC,EAAC,MAAA,EACC,UAAA;AAAA,IAAA,gBAAAF,EAAC,QAAA,EAAK,WAAWM,EAAO,OAAQ,kCAAckC,OAAUE,GAAcF,CAAK,EAAA,CAAE;AAAA,IAAO;AAAA,IAAG;AAAA,IACtFC;AAAA,EAAA,EAAA,GAFMD,CAGT,CACD,EAAA,CACH,IACE,QACAG,IAAO/B,KAAe2B,KAAkBP,KAAW,EAAE,wBAAwB,GAC7EY,IAAe/B,MAAS,SAAagC,GAAepC,CAAK,IAAI,eAAe,WAAYI,GAKxFiC,KAAa7B,MAAgB,QAAQ8B,GAAA,IAAU9B,KACjD+B,GAAgBvC,CAAK,IACrB,QACEyB,IAASe,GAAexC,CAAK,GAC7Bf,IACJyC,KAAW,QAAQW,KAAa,OAC5B;AAAA,IACEX,KAAW,QAAQ,GAAG,EAAE,oBAAoB,CAAC,KAAKA,CAAO;AAAA,IACzDD,KAAU,QAAQ,GAAG,EAAE,mBAAmB,CAAC,KAAKA,CAAM;AAAA;AAAA;AAAA,IAGtDF,KAAW,SACRW,MAASX,KAAWc,KAAa,SAClC,GAAG,EAAE,oBAAoB,CAAC,KAAKd,CAAO;AAAA,IACxCc,KAAa,QAAQ;AAAA,EAAKA,CAAS;AAAA,EAAA,EAElC,OAAO,OAAO,EACd,KAAK;AAAA,CAAI,IACZ,QACAI,IACJxD,KAAU,OACR,gBAAAM,EAACT,IAAA,EAAkB,MAAMsC,GAAa,SAAS,MAAMC,EAAe,EAAK,GAAG,QAAApC,GAAgB,IAC1F;AAGN,MAAIgB,MAAY,SAAS;AACvB,UAAMyC,IACJzD,KAAU,QAAQoB,KAAW,QAAQU,KAAU,OAC7C,gBAAAtB,EAAC,QAAA,EAAK,WAAWI,EAAO,cAGrB,UAAA;AAAA,MAAAQ,KAAW,QACV,gBAAAd,EAACoD,GAAA,EAAQ,SAASpC,KAAc,EAAE,kBAAkB,GAClD,UAAA,gBAAAhB;AAAA,QAACqD;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,OAAM;AAAA,UACN,cAAY,OAAOrC,KAAe,WAAWA,IAAa,EAAE,kBAAkB;AAAA,UAC9E,SAASD;AAAA,UACT,UAAUA;AAAA,UACV,SAASD;AAAA,UAET,UAAA,gBAAAd,EAACK,GAAA,EAAK,MAAK,gBAAA,CAAgB;AAAA,QAAA;AAAA,MAAA,GAE/B;AAAA,MAEDX,KAAU,QACT,gBAAAM,EAACI,GAAA,EAAO,MAAK,MAAK,SAAQ,UAAS,OAAM,SAAQ,SAAS,MAAM0B,EAAe,EAAI,GAChF,UAAA,EAAE,oBAAoB,GACzB;AAAA,MAEDN;AAAA,IAAA,EAAA,CACH,IACE;AACN,WACE,gBAAAtB,EAAAC,GAAA,EACE,UAAA;AAAA,MAAA,gBAAAD;AAAA,QAACoD;AAAA,QAAA;AAAA,UACC,KAAA1B;AAAA,UACA,OAAM;AAAA,UACN,MAAMgB;AAAA,UACN,QAAQO;AAAA,UACR,WAAWI,EAAKjD,EAAO,cAAcmB,CAAS;AAAA,UAC7C,GAAGE;AAAA,UAEH,UAAA;AAAA,YAAAhB,KAAS,QAAQ,gBAAAX,EAAC,QAAA,EAAK,WAAWM,EAAO,YAAa,UAAAK,GAAM;AAAA,YAC7D,gBAAAX,EAAC,QAAA,EAAK,WAAWM,EAAO,WAAY,UAAAqC,GAAK;AAAA,YACxCjB;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEFwB;AAAA,IAAA,GACH;AAAA,EAEJ;AAGA,QAAMM,IACJ1C,KAAW,OACT,gBAAAd;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,WAAW,gBAAAJ,EAACK,GAAA,EAAK,MAAK,eAAA,CAAe;AAAA,MACrC,SAASU;AAAA,MACT,UAAUA;AAAA,MACV,SAASD;AAAA,MAER,UAAAE,KAAc,EAAE,kBAAkB;AAAA,IAAA;AAAA,EAAA,IAEnC,MACAyC,IACJ/D,KAAU,OACR,gBAAAM;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,WAAW,gBAAAJ,EAACK,GAAA,EAAK,MAAK,eAAA,CAAe;AAAA,MACrC,SAAS,MAAMyB,EAAe,EAAI;AAAA,MAEjC,YAAE,oBAAoB;AAAA,IAAA;AAAA,EAAA,IAEvB;AAEN,SACE,gBAAA5B,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAH;AAAA,MAAC0D;AAAA,MAAA;AAAA,QACC,KAAA9B;AAAA,QAGA,MAAK;AAAA,QACL,OAAM;AAAA,QACN,MAAMgB;AAAA,QACN,OAAOjC,KAAS,EAAE,kBAAkB;AAAA,QAEpC,aAAagC;AAAA,QACb,MAAMrB,MAASJ,IAAU,OAAO;AAAA,QAChC,SAASK,KAAW,CAACL;AAAA,QACrB,QACEsC,KAASC,KAAiBjC,sBACvB,QAAA,EAAK,WAAWlB,EAAO,SACrB,UAAA;AAAA,UAAAkD;AAAA,UACAC;AAAA,UACAjC;AAAA,QAAA,EAAA,CACH,IACE;AAAA,QAEN,WAAW+B,EAAKjD,EAAO,YAAYY,KAAWZ,EAAO,SAASmB,CAAS;AAAA,QACtE,GAAGE;AAAA,QAEH,UAAAD;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFwB;AAAA,EAAA,GACH;AAEJ,CAAC;"}
@@ -1,2 +1,2 @@
1
- "use strict";const o=require("react/jsx-runtime"),u=require("react"),M=require("clsx"),S=require("./Avatar-l48Ice6t.cjs"),A=require("./IconButton-CQ25TtBc.cjs"),O=require("./Icon-B6lz-V0A.cjs"),L=require("./Typography-d97DdbNd.cjs"),$=require("./ConfigProvider-B_Bb6pk1.cjs"),V="_fileCard_kpeb5_3",G="_avatar_kpeb5_24",R="_body_kpeb5_29",H="_name_kpeb5_38",K="_nameBase_kpeb5_45",P="_nameExt_kpeb5_51",U="_type_kpeb5_57",W="_download_kpeb5_61",X="_sm_kpeb5_66",z="_md_kpeb5_77",J="_lg_kpeb5_81",s={fileCard:V,avatar:G,body:R,name:H,nameBase:K,nameExt:P,type:U,download:W,sm:X,md:z,lg:J},Q=new Set(["png","jpg","jpeg","webp","svg","gif","avif","bmp","ico","heic"]),Y={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 Z(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 ee(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 g(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 te=u.forwardRef(function({name:e,src:t,type:a,image:v,fileSize:c,fetchSize:m=!1,meta:C,color:x="accent",size:d="md",downloadable:T=!0,onDownload:i,className:j,style:q,...w},k){const B=$.useT(),l=Z(e,a),f=v??((a==null?void 0:a.startsWith("image/"))||Q.has(l)),{base:D,ext:_}=ee(e),[p,N]=u.useState(null);u.useEffect(()=>{if(!m||c!=null||!t||typeof fetch>"u")return;let r=!1;return fetch(t,{method:"HEAD"}).then(y=>{const b=y.headers.get("content-length");!r&&b&&N(Number(b))}).catch(()=>{}),()=>{r=!0}},[m,c,t]);const E=c!=null?typeof c=="number"?g(c):c:p!=null?g(p):"",I=[l?l.toUpperCase():"",E].filter(Boolean).join(" · "),h=C??(I||null),F=()=>{if(i)return i();if(!t)return;const r=document.createElement("a");r.href=t,r.download=e,r.rel="noopener",r.click()};return o.jsxs("div",{ref:k,className:M.clsx(s.fileCard,s[d],j),style:{"--tz-btn-rgb":`var(--tz-color-${x}-rgb)`,...q},...w,children:[o.jsx(S.Avatar,{className:s.avatar,src:f?t:void 0,icon:f?void 0:Y[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:D}),_&&o.jsx("span",{className:s.nameExt,children:_})]}),h!=null&&o.jsx(L.Typography,{as:"span",variant:"bodySmall",color:"muted",uppercase:!0,className:s.type,children:h})]}),T&&(t||i)&&o.jsx(A.IconButton,{variant:"filled",size:d==="lg"?"md":"sm",className:s.download,"aria-label":B("fileCard.download",{name:e}),onClick:F,children:o.jsx(O.Icon,{name:"ImportArrow"})})]})});exports.FileCard=te;
2
- //# sourceMappingURL=FileCard-Cl88Gu6L.cjs.map
1
+ "use strict";const o=require("react/jsx-runtime"),u=require("react"),M=require("clsx"),S=require("./Avatar-l48Ice6t.cjs"),A=require("./IconButton-D3ZpI0XL.cjs"),O=require("./Icon-B6lz-V0A.cjs"),L=require("./Typography-d97DdbNd.cjs"),$=require("./ConfigProvider-DELhJlqo.cjs"),V="_fileCard_kpeb5_3",G="_avatar_kpeb5_24",R="_body_kpeb5_29",H="_name_kpeb5_38",K="_nameBase_kpeb5_45",P="_nameExt_kpeb5_51",U="_type_kpeb5_57",W="_download_kpeb5_61",X="_sm_kpeb5_66",z="_md_kpeb5_77",J="_lg_kpeb5_81",s={fileCard:V,avatar:G,body:R,name:H,nameBase:K,nameExt:P,type:U,download:W,sm:X,md:z,lg:J},Q=new Set(["png","jpg","jpeg","webp","svg","gif","avif","bmp","ico","heic"]),Y={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 Z(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 ee(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 g(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 te=u.forwardRef(function({name:e,src:t,type:a,image:v,fileSize:c,fetchSize:m=!1,meta:C,color:x="accent",size:d="md",downloadable:T=!0,onDownload:i,className:j,style:q,...w},k){const B=$.useT(),l=Z(e,a),f=v??((a==null?void 0:a.startsWith("image/"))||Q.has(l)),{base:D,ext:_}=ee(e),[p,N]=u.useState(null);u.useEffect(()=>{if(!m||c!=null||!t||typeof fetch>"u")return;let r=!1;return fetch(t,{method:"HEAD"}).then(y=>{const b=y.headers.get("content-length");!r&&b&&N(Number(b))}).catch(()=>{}),()=>{r=!0}},[m,c,t]);const E=c!=null?typeof c=="number"?g(c):c:p!=null?g(p):"",I=[l?l.toUpperCase():"",E].filter(Boolean).join(" · "),h=C??(I||null),F=()=>{if(i)return i();if(!t)return;const r=document.createElement("a");r.href=t,r.download=e,r.rel="noopener",r.click()};return o.jsxs("div",{ref:k,className:M.clsx(s.fileCard,s[d],j),style:{"--tz-btn-rgb":`var(--tz-color-${x}-rgb)`,...q},...w,children:[o.jsx(S.Avatar,{className:s.avatar,src:f?t:void 0,icon:f?void 0:Y[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:D}),_&&o.jsx("span",{className:s.nameExt,children:_})]}),h!=null&&o.jsx(L.Typography,{as:"span",variant:"bodySmall",color:"muted",uppercase:!0,className:s.type,children:h})]}),T&&(t||i)&&o.jsx(A.IconButton,{variant:"filled",size:d==="lg"?"md":"sm",className:s.download,"aria-label":B("fileCard.download",{name:e}),onClick:F,children:o.jsx(O.Icon,{name:"ImportArrow"})})]})});exports.FileCard=te;
2
+ //# sourceMappingURL=FileCard-COc4rHe-.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileCard-Cl88Gu6L.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 { Typography } from '../Typography'\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 && (\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\" uppercase className={styles.type}>\n {metaLine}\n </Typography>\n )}\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","Typography","IconButton","Icon"],"mappings":"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"}
1
+ {"version":3,"file":"FileCard-COc4rHe-.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 { Typography } from '../Typography'\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 && (\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\" uppercase className={styles.type}>\n {metaLine}\n </Typography>\n )}\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","Typography","IconButton","Icon"],"mappings":"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"}
@@ -2,10 +2,10 @@ import { jsxs as m, jsx as c } from "react/jsx-runtime";
2
2
  import { forwardRef as S, useState as A, useEffect as O } from "react";
3
3
  import { clsx as y } from "clsx";
4
4
  import { A as L } from "./Avatar-ClcmN0ba.js";
5
- import { I as $ } from "./IconButton-06pmftMo.js";
5
+ import { I as $ } from "./IconButton-t1OhAMNc.js";
6
6
  import { b as V } from "./Icon-D5TxgfCc.js";
7
7
  import { T as G } from "./Typography-ChSuxgkc.js";
8
- import { a as H } from "./ConfigProvider-DeMASTVo.js";
8
+ import { a as H } from "./ConfigProvider-Bgu85MsI.js";
9
9
  const K = "_fileCard_kpeb5_3", R = "_avatar_kpeb5_24", U = "_body_kpeb5_29", W = "_name_kpeb5_38", X = "_nameBase_kpeb5_45", z = "_nameExt_kpeb5_51", J = "_type_kpeb5_57", P = "_download_kpeb5_61", Q = "_sm_kpeb5_66", Y = "_md_kpeb5_77", Z = "_lg_kpeb5_81", o = {
10
10
  fileCard: K,
11
11
  avatar: R,
@@ -146,4 +146,4 @@ const ue = S(function({
146
146
  export {
147
147
  ue as F
148
148
  };
149
- //# sourceMappingURL=FileCard-5QvVkO1-.js.map
149
+ //# sourceMappingURL=FileCard-CWwB8CWF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileCard-5QvVkO1-.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 { Typography } from '../Typography'\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 && (\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\" uppercase className={styles.type}>\n {metaLine}\n </Typography>\n )}\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","Typography","IconButton","Icon"],"mappings":"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"}
1
+ {"version":3,"file":"FileCard-CWwB8CWF.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 { Typography } from '../Typography'\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 && (\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\" uppercase className={styles.type}>\n {metaLine}\n </Typography>\n )}\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","Typography","IconButton","Icon"],"mappings":"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"}
@@ -12,10 +12,10 @@ import { b as L } from "./Icon-D5TxgfCc.js";
12
12
  import { S as Vt } from "./Skeleton-_-uGax2j.js";
13
13
  import { T as ce } from "./Typography-ChSuxgkc.js";
14
14
  import Gt from "react-image-crop";
15
- import { B as Qe } from "./Button-Bst_NtPJ.js";
16
- import { M as Yt, O as Jt } from "./Modal-DTnB_mGg.js";
17
- import { T as Qt } from "./TextField-0gFvIFs8.js";
18
- import { a as he, i as Xt } from "./ConfigProvider-DeMASTVo.js";
15
+ import { B as Qe } from "./Button-CjsnB8gX.js";
16
+ import { M as Yt, O as Jt } from "./Modal-Dfwc9eIq.js";
17
+ import { T as Qt } from "./TextField-5nQkU8HP.js";
18
+ import { a as he, i as Xt } from "./ConfigProvider-Bgu85MsI.js";
19
19
  import { f as Ie } from "./TextField.module-6gYcR9TL.js";
20
20
  const Zt = "_cropSection_1j2zs_4", eo = "_cropHead_1j2zs_10", to = "_cropStage_1j2zs_16", oo = "_crop_1j2zs_4", no = "_cropImg_1j2zs_30", ro = "_altFields_1j2zs_35", X = {
21
21
  cropSection: Zt,
@@ -704,4 +704,4 @@ const vn = Dt(function({
704
704
  export {
705
705
  vn as F
706
706
  };
707
- //# sourceMappingURL=FileUploader-DwAl3UXI.js.map
707
+ //# sourceMappingURL=FileUploader--WOmlhSh.js.map