@techzyapp/ui-library 1.0.39 → 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 (398) hide show
  1. package/dist/{AdminRoot-BTPLhufU.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-C8A6E-tJ.js → CodeBlock-CcJjS0_q.js} +4 -4
  30. package/dist/{CodeBlock-C8A6E-tJ.js.map → CodeBlock-CcJjS0_q.js.map} +1 -1
  31. package/dist/{CodeBlock-BbIC5BRK.cjs → CodeBlock-o_VSkAek.cjs} +2 -2
  32. package/dist/{CodeBlock-BbIC5BRK.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-B_-ZPqMa.cjs → ColorRamp-CVnOYlu3.cjs} +2 -2
  42. package/dist/{ColorRamp-B_-ZPqMa.cjs.map → ColorRamp-CVnOYlu3.cjs.map} +1 -1
  43. package/dist/{ColorRamp-CCfImssD.js → ColorRamp-CePqEkMR.js} +3 -3
  44. package/dist/{ColorRamp-CCfImssD.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-BD5sN32G.js → CopyButton-CgDeyJ3A.js} +4 -4
  50. package/dist/CopyButton-CgDeyJ3A.js.map +1 -0
  51. package/dist/{CopyButton-CUEEp_Na.cjs → CopyButton-CjPyKpky.cjs} +2 -2
  52. package/dist/CopyButton-CjPyKpky.cjs.map +1 -0
  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-BD65gv7C.js → DescriptionList-BP4CDME5.js} +4 -4
  62. package/dist/{DescriptionList-BD65gv7C.js.map → DescriptionList-BP4CDME5.js.map} +1 -1
  63. package/dist/{DescriptionList-BlAJIabM.cjs → DescriptionList-BWw0Fe6U.cjs} +2 -2
  64. package/dist/{DescriptionList-BlAJIabM.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-6HvsCoJ8.cjs → ErrorBoundary-DL194IyB.cjs} +2 -2
  70. package/dist/{ErrorBoundary-6HvsCoJ8.cjs.map → ErrorBoundary-DL194IyB.cjs.map} +1 -1
  71. package/dist/{ErrorBoundary-sQY2sFdu.js → ErrorBoundary-ukRaS6uS.js} +3 -3
  72. package/dist/{ErrorBoundary-sQY2sFdu.js.map → ErrorBoundary-ukRaS6uS.js.map} +1 -1
  73. package/dist/{ErrorState-To_MAOf4.cjs → ErrorState-BjEA0VfF.cjs} +2 -2
  74. package/dist/{ErrorState-To_MAOf4.cjs.map → ErrorState-BjEA0VfF.cjs.map} +1 -1
  75. package/dist/{ErrorState-DdxOeZy2.js → ErrorState-Hfd_0MeE.js} +8 -8
  76. package/dist/{ErrorState-DdxOeZy2.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-CWH-RS-z.js → FileUploader--WOmlhSh.js} +5 -5
  82. package/dist/{FileUploader-CWH-RS-z.js.map → FileUploader--WOmlhSh.js.map} +1 -1
  83. package/dist/{FileUploader-H4k4Cm5B.cjs → FileUploader-Bqy_fV7l.cjs} +2 -2
  84. package/dist/{FileUploader-H4k4Cm5B.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-CgzZnTFE.cjs → LocationPicker-DBsxCYi9.cjs} +2 -2
  102. package/dist/{LocationPicker-CgzZnTFE.cjs.map → LocationPicker-DBsxCYi9.cjs.map} +1 -1
  103. package/dist/{LocationPicker-CHGJkMXl.js → LocationPicker-UfyDBvhp.js} +7 -7
  104. package/dist/{LocationPicker-CHGJkMXl.js.map → LocationPicker-UfyDBvhp.js.map} +1 -1
  105. package/dist/Modal--5EbLfMz.cjs +2 -0
  106. package/dist/Modal--5EbLfMz.cjs.map +1 -0
  107. package/dist/Modal-Dfwc9eIq.js +206 -0
  108. package/dist/Modal-Dfwc9eIq.js.map +1 -0
  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-CJHOUfCa.cjs → PageError-MHbSl1oT.cjs} +2 -2
  122. package/dist/{PageError-CJHOUfCa.cjs.map → PageError-MHbSl1oT.cjs.map} +1 -1
  123. package/dist/{PageError-9tfvBssn.js → PageError-VYc07Q7W.js} +5 -5
  124. package/dist/{PageError-9tfvBssn.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-yEZm6JaC.cjs → RemoveDialog-Cvj-DaiY.cjs} +2 -2
  154. package/dist/{RemoveDialog-yEZm6JaC.cjs.map → RemoveDialog-Cvj-DaiY.cjs.map} +1 -1
  155. package/dist/{RemoveDialog-BfPTOs1y.js → RemoveDialog-Dh_q5jZF.js} +5 -5
  156. package/dist/{RemoveDialog-BfPTOs1y.js.map → RemoveDialog-Dh_q5jZF.js.map} +1 -1
  157. package/dist/{RichTextEditor-CgItVhAR.js → RichTextEditor-Dv-LDsN-.js} +7 -7
  158. package/dist/{RichTextEditor-CgItVhAR.js.map → RichTextEditor-Dv-LDsN-.js.map} +1 -1
  159. package/dist/{RichTextEditor-CitILCiw.cjs → RichTextEditor-lmPGowSR.cjs} +2 -2
  160. package/dist/{RichTextEditor-CitILCiw.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-C2hkC_8p.js → SpeedDial-C-yLmnk7.js} +3 -3
  174. package/dist/{SpeedDial-C2hkC_8p.js.map → SpeedDial-C-yLmnk7.js.map} +1 -1
  175. package/dist/{SpeedDial-DRSIilyC.cjs → SpeedDial-jOxWEd09.cjs} +2 -2
  176. package/dist/{SpeedDial-DRSIilyC.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-DDPzTA1H.cjs → Table-BhaH8EKZ.cjs} +2 -2
  182. package/dist/{Table-DDPzTA1H.cjs.map → Table-BhaH8EKZ.cjs.map} +1 -1
  183. package/dist/{Table-AXMp0eiw.js → Table-DK4GBKS3.js} +15 -15
  184. package/dist/{Table-AXMp0eiw.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/Tooltip-BbT0uNzy.js +152 -0
  214. package/dist/Tooltip-BbT0uNzy.js.map +1 -0
  215. package/dist/Tooltip-DmMq5R1x.cjs +2 -0
  216. package/dist/Tooltip-DmMq5R1x.cjs.map +1 -0
  217. package/dist/{TranslatedFields-CVc0NvXa.cjs → TranslatedFields-B-BU17IV.cjs} +2 -2
  218. package/dist/{TranslatedFields-CVc0NvXa.cjs.map → TranslatedFields-B-BU17IV.cjs.map} +1 -1
  219. package/dist/{TranslatedFields-CmRhRGC_.js → TranslatedFields-JnqLgUiF.js} +16 -16
  220. package/dist/{TranslatedFields-CmRhRGC_.js.map → TranslatedFields-JnqLgUiF.js.map} +1 -1
  221. package/dist/{UserCard-1ubnvBV6.cjs → UserCard-B9bzkZph.cjs} +2 -2
  222. package/dist/{UserCard-1ubnvBV6.cjs.map → UserCard-B9bzkZph.cjs.map} +1 -1
  223. package/dist/{UserCard-DcTLEHFu.js → UserCard-DYK6S-nr.js} +3 -3
  224. package/dist/{UserCard-DcTLEHFu.js.map → UserCard-DYK6S-nr.js.map} +1 -1
  225. package/dist/app/AdminRoot.d.cts +8 -1
  226. package/dist/app/AdminRoot.d.ts +8 -1
  227. package/dist/components/Alert/index.cjs +1 -1
  228. package/dist/components/Alert/index.js +1 -1
  229. package/dist/components/Breadcrumbs/index.cjs +1 -1
  230. package/dist/components/Breadcrumbs/index.js +1 -1
  231. package/dist/components/Button/index.cjs +1 -1
  232. package/dist/components/Button/index.js +1 -1
  233. package/dist/components/Card/index.cjs +1 -1
  234. package/dist/components/Card/index.js +1 -1
  235. package/dist/components/Chip/index.cjs +1 -1
  236. package/dist/components/Chip/index.js +1 -1
  237. package/dist/components/CodeBlock/index.cjs +1 -1
  238. package/dist/components/CodeBlock/index.js +1 -1
  239. package/dist/components/ColorPicker/index.cjs +1 -1
  240. package/dist/components/ColorPicker/index.js +1 -1
  241. package/dist/components/ColorRamp/index.cjs +1 -1
  242. package/dist/components/ColorRamp/index.js +1 -1
  243. package/dist/components/CopyButton/CopyButton.d.cts +1 -1
  244. package/dist/components/CopyButton/CopyButton.d.ts +1 -1
  245. package/dist/components/CopyButton/index.cjs +1 -1
  246. package/dist/components/CopyButton/index.js +1 -1
  247. package/dist/components/DatePicker/index.cjs +1 -1
  248. package/dist/components/DatePicker/index.js +1 -1
  249. package/dist/components/DateTimePicker/index.cjs +1 -1
  250. package/dist/components/DateTimePicker/index.js +1 -1
  251. package/dist/components/DescriptionList/index.cjs +1 -1
  252. package/dist/components/DescriptionList/index.js +1 -1
  253. package/dist/components/EmptyState/index.cjs +1 -1
  254. package/dist/components/EmptyState/index.js +1 -1
  255. package/dist/components/ErrorState/index.cjs +1 -1
  256. package/dist/components/ErrorState/index.js +2 -2
  257. package/dist/components/FileCard/index.cjs +1 -1
  258. package/dist/components/FileCard/index.js +1 -1
  259. package/dist/components/FileUploader/index.cjs +1 -1
  260. package/dist/components/FileUploader/index.js +1 -1
  261. package/dist/components/Flag/index.cjs +1 -1
  262. package/dist/components/Flag/index.js +1 -1
  263. package/dist/components/FullscreenToggle/index.cjs +1 -1
  264. package/dist/components/FullscreenToggle/index.js +1 -1
  265. package/dist/components/IconButton/index.cjs +1 -1
  266. package/dist/components/IconButton/index.js +1 -1
  267. package/dist/components/Loader/index.cjs +1 -1
  268. package/dist/components/Loader/index.js +1 -1
  269. package/dist/components/LocationPicker/index.cjs +1 -1
  270. package/dist/components/LocationPicker/index.js +1 -1
  271. package/dist/components/Modal/index.cjs +1 -1
  272. package/dist/components/Modal/index.js +1 -1
  273. package/dist/components/MultiSelect/index.cjs +1 -1
  274. package/dist/components/MultiSelect/index.js +1 -1
  275. package/dist/components/NumberField/index.cjs +1 -1
  276. package/dist/components/NumberField/index.js +1 -1
  277. package/dist/components/OtpField/index.cjs +1 -1
  278. package/dist/components/OtpField/index.js +1 -1
  279. package/dist/components/PageError/index.cjs +1 -1
  280. package/dist/components/PageError/index.js +1 -1
  281. package/dist/components/PageLayout/index.cjs +1 -1
  282. package/dist/components/PageLayout/index.js +1 -1
  283. package/dist/components/PageNotFound/index.cjs +1 -1
  284. package/dist/components/PageNotFound/index.js +1 -1
  285. package/dist/components/Pagination/index.cjs +1 -1
  286. package/dist/components/Pagination/index.js +1 -1
  287. package/dist/components/PaletteField/PaletteField.d.cts +8 -2
  288. package/dist/components/PaletteField/PaletteField.d.ts +8 -2
  289. package/dist/components/PaletteField/index.cjs +1 -1
  290. package/dist/components/PaletteField/index.js +1 -1
  291. package/dist/components/PhoneField/index.cjs +1 -1
  292. package/dist/components/PhoneField/index.js +1 -1
  293. package/dist/components/Popconfirm/index.cjs +1 -1
  294. package/dist/components/Popconfirm/index.js +1 -1
  295. package/dist/components/Progress/index.cjs +1 -1
  296. package/dist/components/Progress/index.js +1 -1
  297. package/dist/components/RemoveDialog/index.cjs +1 -1
  298. package/dist/components/RemoveDialog/index.js +1 -1
  299. package/dist/components/RichTextEditor/index.cjs +1 -1
  300. package/dist/components/RichTextEditor/index.js +1 -1
  301. package/dist/components/RootLayout/RootLayout.d.cts +18 -5
  302. package/dist/components/RootLayout/RootLayout.d.ts +18 -5
  303. package/dist/components/RootLayout/SettingsDrawer.d.cts +8 -2
  304. package/dist/components/RootLayout/SettingsDrawer.d.ts +8 -2
  305. package/dist/components/RootLayout/index.cjs +1 -1
  306. package/dist/components/RootLayout/index.d.cts +1 -1
  307. package/dist/components/RootLayout/index.d.ts +1 -1
  308. package/dist/components/RootLayout/index.js +1 -1
  309. package/dist/components/Select/index.cjs +1 -1
  310. package/dist/components/Select/index.js +1 -1
  311. package/dist/components/Sidebar/index.cjs +1 -1
  312. package/dist/components/Sidebar/index.js +1 -1
  313. package/dist/components/SpeedDial/index.cjs +1 -1
  314. package/dist/components/SpeedDial/index.js +1 -1
  315. package/dist/components/Stepper/index.cjs +1 -1
  316. package/dist/components/Stepper/index.js +1 -1
  317. package/dist/components/Table/index.cjs +1 -1
  318. package/dist/components/Table/index.js +1 -1
  319. package/dist/components/Tabs/index.cjs +1 -1
  320. package/dist/components/Tabs/index.js +1 -1
  321. package/dist/components/TagsField/index.cjs +1 -1
  322. package/dist/components/TagsField/index.js +1 -1
  323. package/dist/components/TextField/index.cjs +1 -1
  324. package/dist/components/TextField/index.js +1 -1
  325. package/dist/components/ThemeToggle/index.cjs +1 -1
  326. package/dist/components/ThemeToggle/index.js +1 -1
  327. package/dist/components/TimePicker/index.cjs +1 -1
  328. package/dist/components/TimePicker/index.js +1 -1
  329. package/dist/components/Toast/index.cjs +1 -1
  330. package/dist/components/Toast/index.js +1 -1
  331. package/dist/components/Tooltip/Tooltip.d.cts +5 -3
  332. package/dist/components/Tooltip/Tooltip.d.ts +5 -3
  333. package/dist/components/Tooltip/index.cjs +1 -1
  334. package/dist/components/Tooltip/index.js +1 -1
  335. package/dist/components/TranslatedFields/index.cjs +1 -1
  336. package/dist/components/TranslatedFields/index.js +1 -1
  337. package/dist/components/UserCard/index.cjs +1 -1
  338. package/dist/components/UserCard/index.js +1 -1
  339. package/dist/entries/app.cjs +1 -1
  340. package/dist/entries/app.js +1 -1
  341. package/dist/entries/components.cjs +1 -1
  342. package/dist/entries/components.js +51 -51
  343. package/dist/entries/i18n.cjs +1 -1
  344. package/dist/entries/i18n.js +2 -2
  345. package/dist/entries/theme.cjs +1 -1
  346. package/dist/entries/theme.d.cts +2 -2
  347. package/dist/entries/theme.d.ts +2 -2
  348. package/dist/entries/theme.js +12 -11
  349. package/dist/i18n/messages.d.cts +6 -0
  350. package/dist/i18n/messages.d.ts +6 -0
  351. package/dist/index.cjs +1 -1
  352. package/dist/index.css +1 -1
  353. package/dist/index.js +232 -231
  354. package/dist/{messages-CMgYU5p6.js → messages-BasxRpyx.js} +64 -22
  355. package/dist/messages-BasxRpyx.js.map +1 -0
  356. package/dist/{messages-h22vS9zn.cjs → messages-CElolVGm.cjs} +9 -9
  357. package/dist/messages-CElolVGm.cjs.map +1 -0
  358. package/dist/theme/ConfigProvider.d.cts +33 -2
  359. package/dist/theme/ConfigProvider.d.ts +33 -2
  360. package/dist/theme/index.d.cts +2 -2
  361. package/dist/theme/index.d.ts +2 -2
  362. package/dist/{useHomeTo-MfvJxziQ.cjs → useHomeTo-BnjXms11.cjs} +2 -2
  363. package/dist/{useHomeTo-MfvJxziQ.cjs.map → useHomeTo-BnjXms11.cjs.map} +1 -1
  364. package/dist/{useHomeTo-Ckq7scIY.js → useHomeTo-Btkk0RSB.js} +2 -2
  365. package/dist/{useHomeTo-Ckq7scIY.js.map → useHomeTo-Btkk0RSB.js.map} +1 -1
  366. package/dist/{useOptionMenu-BBsyUow1.js → useOptionMenu-DeW68na-.js} +3 -3
  367. package/dist/{useOptionMenu-BBsyUow1.js.map → useOptionMenu-DeW68na-.js.map} +1 -1
  368. package/dist/{useOptionMenu-3YlvxPAM.cjs → useOptionMenu-IebDGoqk.cjs} +2 -2
  369. package/dist/{useOptionMenu-3YlvxPAM.cjs.map → useOptionMenu-IebDGoqk.cjs.map} +1 -1
  370. package/package.json +1 -1
  371. package/dist/AdminRoot-B2lwjQig.cjs +0 -2
  372. package/dist/AdminRoot-B2lwjQig.cjs.map +0 -1
  373. package/dist/AdminRoot-BTPLhufU.js.map +0 -1
  374. package/dist/ConfigProvider-B_Bb6pk1.cjs +0 -2
  375. package/dist/ConfigProvider-B_Bb6pk1.cjs.map +0 -1
  376. package/dist/ConfigProvider-DeMASTVo.js +0 -347
  377. package/dist/ConfigProvider-DeMASTVo.js.map +0 -1
  378. package/dist/CopyButton-BD5sN32G.js.map +0 -1
  379. package/dist/CopyButton-CUEEp_Na.cjs.map +0 -1
  380. package/dist/Modal-BkO_6afj.js +0 -195
  381. package/dist/Modal-BkO_6afj.js.map +0 -1
  382. package/dist/Modal-D8V-JZBg.cjs +0 -2
  383. package/dist/Modal-D8V-JZBg.cjs.map +0 -1
  384. package/dist/PaletteField-AMZpUMID.js +0 -54
  385. package/dist/PaletteField-AMZpUMID.js.map +0 -1
  386. package/dist/PaletteField-ClCvXFdN.cjs +0 -2
  387. package/dist/PaletteField-ClCvXFdN.cjs.map +0 -1
  388. package/dist/RootLayout-CVYEk7Wi.js +0 -582
  389. package/dist/RootLayout-CVYEk7Wi.js.map +0 -1
  390. package/dist/RootLayout-DJ2Xv35m.cjs +0 -2
  391. package/dist/RootLayout-DJ2Xv35m.cjs.map +0 -1
  392. package/dist/ThemeToggle-_SUmLxmU.js +0 -28
  393. package/dist/Tooltip-Bw-1Xk2Z.cjs +0 -2
  394. package/dist/Tooltip-Bw-1Xk2Z.cjs.map +0 -1
  395. package/dist/Tooltip-DsDv4NOq.js +0 -135
  396. package/dist/Tooltip-DsDv4NOq.js.map +0 -1
  397. package/dist/messages-CMgYU5p6.js.map +0 -1
  398. package/dist/messages-h22vS9zn.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker-Bv2qIFf9.js","sources":["../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Typography } from '../Typography'\nimport { TimeColumns } from '../DateTimePicker/TimeColumns'\nimport {\n applyMask,\n localWallToUtc,\n maskFromFormat,\n parseInput,\n parseTime,\n utcToLocalWall,\n type Dayjs,\n} from '../DatePicker/dateUtils'\nimport styles from '../DatePicker/DatePicker.module.css'\nimport tp from './TimePicker.module.css'\n\nexport type TimePickerSize = 'sm' | 'md' | 'lg'\n\nexport interface TimePickerProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — control height, font and popover density. */\n size?: TimePickerSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — a time string in `valueFormat` (`''` = empty). */\n value?: string\n /** Initial value for uncontrolled use (in `valueFormat`). */\n defaultValue?: string\n /** Fires with the next time in `valueFormat` (`''` when cleared). */\n onChange?: (value: string) => void\n /**\n * Display + typed-input format (dayjs tokens). Defaults to `'HH:mm:ss'` (or `hh:mm:ss A` when\n * `hour12`; the `:ss` is dropped when `showSeconds` is `false`).\n */\n format?: string\n /**\n * Wire format of `value`/`defaultValue`/`onChange` (dayjs tokens), decoupled from the displayed\n * `format`. Defaults to `'HH:mm:ss[Z]'` when `utc` (the `Z` marks UTC), or `'HH:mm:ss'` when\n * `utc={false}`. Incoming values are parsed **leniently** (this format, then a numeric time — so a\n * backend time like `'09:35:49.6134342'` is accepted, ms-capped — then any ISO-8601 datetime, whose\n * time is used). Only the time-of-day is used; the date is ignored.\n */\n valueFormat?: string\n /**\n * Treat the value as **UTC** and display/edit in the viewer's **local** timezone (default `true`).\n * Set `false` to disable timezone conversion — the field shows and emits the value's exact wall-clock.\n */\n utc?: boolean\n /** 12-hour clock (1–12 + AM/PM) instead of 24-hour (0–23). Defaults to `false`. */\n hour12?: boolean\n /** Minute increment for the minutes column. Defaults to `1`. */\n minuteStep?: number\n /** Show the seconds column + `:ss` in the default format. Defaults to `true`; pass `false` to hide seconds. */\n showSeconds?: boolean\n /** Placeholder shown when empty. Defaults to the lowercased `format`. */\n placeholder?: string\n /** Shows a clear (×) button when a value is set. Defaults to `true`. */\n clearable?: boolean\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the time string). */\n name?: string\n /** Id for the input (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\nfunction defaultFormatFor(hour12: boolean, showSeconds: boolean): string {\n if (hour12) return showSeconds ? 'hh:mm:ss A' : 'hh:mm A'\n return showSeconds ? 'HH:mm:ss' : 'HH:mm'\n}\n\n/** Compares two datetimes by **time of day** only (ignoring the date) at the given precision. */\nfunction sameTime(a: Dayjs, b: Dayjs, unit: 'minute' | 'second'): boolean {\n if (a.hour() !== b.hour() || a.minute() !== b.minute()) return false\n return unit === 'minute' ? true : a.second() === b.second()\n}\n\n/**\n * A time-of-day field with a typed, masked input **and** a popover of scrollable time columns\n * (hour / minute / optional second + AM/PM in 12-hour mode) — the time sibling of `DateTimePicker`,\n * with no calendar. The value is a string in `valueFormat` (UTC, with a `Z`, unless `utc={false}`) —\n * incoming values are parsed leniently (a richer backend time is accepted) and the chosen time emitted\n * in that format. Picking keeps the popover open until you click away, press Escape, or hit Done.\n * Supports `hour12`, `minuteStep`, `showSeconds`, and `clearable`. Controlled (`value` + `onChange`) or\n * uncontrolled (`defaultValue`), and binds to a surrounding `<Form>` by `name`. Requires `dayjs`.\n */\nexport const TimePicker = forwardRef<HTMLInputElement, TimePickerProps>(function TimePicker(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n format: formatProp,\n valueFormat: valueFormatProp,\n utc = true,\n hour12 = false,\n minuteStep = 1,\n showSeconds = true,\n placeholder,\n clearable = true,\n name,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n const format = formatProp ?? defaultFormatFor(hour12, showSeconds)\n // UTC time-of-day carries a `Z` (\"09:35:00Z\"); `utc={false}` emits the bare wall-clock. Override via `valueFormat`.\n const valueFormat = valueFormatProp ?? (utc ? 'HH:mm:ss[Z]' : 'HH:mm:ss')\n\n // ── value (controlled / form-bound / uncontrolled) — a `valueFormat` time string ────────────────\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = isFormBound ? form!.field(name!) : undefined\n const externalValue =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = value !== undefined || isFormBound\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentValue = isControlled ? externalValue! : internal\n // when `utc`, parse the UTC time and show it in the viewer's LOCAL time (value stays UTC, emit\n // converts back); when `utc={false}`, show/emit the value's exact wall-clock (no tz conversion)\n const selected = utc\n ? utcToLocalWall(parseTime(currentValue, valueFormat))\n : parseTime(currentValue, valueFormat)\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const mask = maskFromFormat(format)\n const timeUnit = /s/.test(format) ? 'second' : 'minute'\n\n const commit = (next: string) => {\n if (next === currentValue) return // skip redundant onChange / setValue with an unchanged value\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n\n // emit a time in the wire `valueFormat`, or '' to clear. Re-picking the same time-of-day is a no-op\n const commitTime = (d: Dayjs | null) => {\n if (d && selected && sameTime(d, selected, 'second')) return\n // local-wall → UTC for the wire value (or emit the wall-clock as-is when `utc={false}`)\n commit(d ? (utc ? localWallToUtc(d) : d).format(valueFormat) : '')\n }\n\n // true when `d` differs from the current value at the input's precision — gates typed-input commits\n const changed = (d: Dayjs) => !selected || !sameTime(d, selected, timeUnit)\n\n const [inputText, setInputText] = useState<string>(() =>\n selected ? selected.format(format) : '',\n )\n useEffect(() => {\n setInputText(selected ? selected.format(format) : '')\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentValue, format, valueFormat])\n\n // ── popover ────────────────────────────────────────────────────────────────────────────────────\n const triggerRef = useRef<HTMLDivElement | null>(null)\n const inputRef = useRef<HTMLInputElement | null>(null)\n const [open, setOpen] = useState(false)\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLInputElement | null }).current = node\n },\n [ref],\n )\n\n const fieldBlurRef = useRef<(() => void) | undefined>(undefined)\n fieldBlurRef.current = bound ? () => bound.onBlur({} as FocusEvent<HTMLInputElement>) : undefined\n\n // the floating panel forwards its node here, for the focus-leaves-the-widget check on blur\n const popoverRef = useRef<HTMLDivElement | null>(null)\n\n const closePopover = useCallback((refocus: boolean) => {\n setOpen(false)\n fieldBlurRef.current?.()\n if (refocus) inputRef.current?.focus()\n }, [])\n\n const handleInputChange = (raw: string) => {\n const masked = applyMask(raw, mask)\n setInputText(masked)\n if (masked === '') {\n commit('')\n return\n }\n const parsed = parseInput(masked, format)\n if (parsed && changed(parsed)) commitTime(parsed)\n }\n\n const handleInputBlur = (event: FocusEvent<HTMLInputElement>) => {\n const parsed = parseInput(inputText, format)\n if (inputText === '') {\n commit('')\n } else if (parsed) {\n if (changed(parsed)) commitTime(parsed)\n setInputText(parsed.format(format))\n } else {\n setInputText(selected ? selected.format(format) : '')\n }\n const nextEl = event.relatedTarget as Node | null\n if (nextEl && (popoverRef.current?.contains(nextEl) || triggerRef.current?.contains(nextEl)))\n return\n bound?.onBlur(event)\n }\n\n const handleTimeChange = (next: Dayjs) => commitTime(next)\n\n const iconSize: 'sm' | 'md' = size === 'sm' ? 'sm' : 'md'\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n <div ref={triggerRef} className={clsx(styles.control, open && styles.open)}>\n <input\n ref={setInputRef}\n id={id}\n name={name}\n className={styles.input}\n value={inputText}\n placeholder={placeholder ?? format.toLowerCase()}\n disabled={disabled}\n autoComplete=\"off\"\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n onChange={(e) => handleInputChange(e.target.value)}\n onBlur={handleInputBlur}\n />\n\n {clearable && currentValue !== '' && !disabled && (\n <button\n type=\"button\"\n className={styles.clear}\n aria-label={t('timePicker.clear')}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n commit('')\n setInputText('')\n inputRef.current?.focus()\n }}\n >\n <Icon name=\"CloseCircle\" size=\"sm\" />\n </button>\n )}\n\n <IconButton\n type=\"button\"\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={t('timePicker.open')}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n className={styles.calendarButton}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((o) => !o)}\n >\n <Icon name=\"Clock\" size={iconSize} />\n </IconButton>\n </div>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closePopover}\n role=\"dialog\"\n ariaLabel=\"Choose time\"\n trapFocus\n className={styles.popover}\n >\n <TimeColumns\n value={selected}\n onChange={handleTimeChange}\n hour12={hour12}\n minuteStep={minuteStep}\n showSeconds={showSeconds}\n autoFocus\n />\n <div className={tp.footer}>\n <Button size=\"sm\" variant=\"filled\" color=\"primary\" onClick={() => closePopover(true)}>\n {t('common.done')}\n </Button>\n </div>\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["defaultFormatFor","hour12","showSeconds","sameTime","a","b","unit","TimePicker","forwardRef","label","size","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","formatProp","valueFormatProp","utc","minuteStep","placeholder","clearable","name","idProp","className","style","ref","t","useT","reactId","useId","id","helperId","format","valueFormat","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentValue","selected","utcToLocalWall","parseTime","resolvedError","resolvedHelperText","mask","maskFromFormat","timeUnit","commit","next","commitTime","d","localWallToUtc","changed","inputText","setInputText","useEffect","triggerRef","useRef","inputRef","open","setOpen","setInputRef","useCallback","node","fieldBlurRef","popoverRef","closePopover","refocus","_a","_b","handleInputChange","raw","masked","applyMask","parsed","parseInput","handleInputBlur","event","nextEl","handleTimeChange","iconSize","jsxs","clsx","styles","jsx","Typography","Icon","IconButton","o","FloatingPanel","TimeColumns","tp","Button"],"mappings":"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"}
1
+ {"version":3,"file":"TimePicker-DHdsY8kQ.js","sources":["../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Typography } from '../Typography'\nimport { TimeColumns } from '../DateTimePicker/TimeColumns'\nimport {\n applyMask,\n localWallToUtc,\n maskFromFormat,\n parseInput,\n parseTime,\n utcToLocalWall,\n type Dayjs,\n} from '../DatePicker/dateUtils'\nimport styles from '../DatePicker/DatePicker.module.css'\nimport tp from './TimePicker.module.css'\n\nexport type TimePickerSize = 'sm' | 'md' | 'lg'\n\nexport interface TimePickerProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — control height, font and popover density. */\n size?: TimePickerSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — a time string in `valueFormat` (`''` = empty). */\n value?: string\n /** Initial value for uncontrolled use (in `valueFormat`). */\n defaultValue?: string\n /** Fires with the next time in `valueFormat` (`''` when cleared). */\n onChange?: (value: string) => void\n /**\n * Display + typed-input format (dayjs tokens). Defaults to `'HH:mm:ss'` (or `hh:mm:ss A` when\n * `hour12`; the `:ss` is dropped when `showSeconds` is `false`).\n */\n format?: string\n /**\n * Wire format of `value`/`defaultValue`/`onChange` (dayjs tokens), decoupled from the displayed\n * `format`. Defaults to `'HH:mm:ss[Z]'` when `utc` (the `Z` marks UTC), or `'HH:mm:ss'` when\n * `utc={false}`. Incoming values are parsed **leniently** (this format, then a numeric time — so a\n * backend time like `'09:35:49.6134342'` is accepted, ms-capped — then any ISO-8601 datetime, whose\n * time is used). Only the time-of-day is used; the date is ignored.\n */\n valueFormat?: string\n /**\n * Treat the value as **UTC** and display/edit in the viewer's **local** timezone (default `true`).\n * Set `false` to disable timezone conversion — the field shows and emits the value's exact wall-clock.\n */\n utc?: boolean\n /** 12-hour clock (1–12 + AM/PM) instead of 24-hour (0–23). Defaults to `false`. */\n hour12?: boolean\n /** Minute increment for the minutes column. Defaults to `1`. */\n minuteStep?: number\n /** Show the seconds column + `:ss` in the default format. Defaults to `true`; pass `false` to hide seconds. */\n showSeconds?: boolean\n /** Placeholder shown when empty. Defaults to the lowercased `format`. */\n placeholder?: string\n /** Shows a clear (×) button when a value is set. Defaults to `true`. */\n clearable?: boolean\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the time string). */\n name?: string\n /** Id for the input (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\nfunction defaultFormatFor(hour12: boolean, showSeconds: boolean): string {\n if (hour12) return showSeconds ? 'hh:mm:ss A' : 'hh:mm A'\n return showSeconds ? 'HH:mm:ss' : 'HH:mm'\n}\n\n/** Compares two datetimes by **time of day** only (ignoring the date) at the given precision. */\nfunction sameTime(a: Dayjs, b: Dayjs, unit: 'minute' | 'second'): boolean {\n if (a.hour() !== b.hour() || a.minute() !== b.minute()) return false\n return unit === 'minute' ? true : a.second() === b.second()\n}\n\n/**\n * A time-of-day field with a typed, masked input **and** a popover of scrollable time columns\n * (hour / minute / optional second + AM/PM in 12-hour mode) — the time sibling of `DateTimePicker`,\n * with no calendar. The value is a string in `valueFormat` (UTC, with a `Z`, unless `utc={false}`) —\n * incoming values are parsed leniently (a richer backend time is accepted) and the chosen time emitted\n * in that format. Picking keeps the popover open until you click away, press Escape, or hit Done.\n * Supports `hour12`, `minuteStep`, `showSeconds`, and `clearable`. Controlled (`value` + `onChange`) or\n * uncontrolled (`defaultValue`), and binds to a surrounding `<Form>` by `name`. Requires `dayjs`.\n */\nexport const TimePicker = forwardRef<HTMLInputElement, TimePickerProps>(function TimePicker(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n format: formatProp,\n valueFormat: valueFormatProp,\n utc = true,\n hour12 = false,\n minuteStep = 1,\n showSeconds = true,\n placeholder,\n clearable = true,\n name,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n const format = formatProp ?? defaultFormatFor(hour12, showSeconds)\n // UTC time-of-day carries a `Z` (\"09:35:00Z\"); `utc={false}` emits the bare wall-clock. Override via `valueFormat`.\n const valueFormat = valueFormatProp ?? (utc ? 'HH:mm:ss[Z]' : 'HH:mm:ss')\n\n // ── value (controlled / form-bound / uncontrolled) — a `valueFormat` time string ────────────────\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = isFormBound ? form!.field(name!) : undefined\n const externalValue =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = value !== undefined || isFormBound\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentValue = isControlled ? externalValue! : internal\n // when `utc`, parse the UTC time and show it in the viewer's LOCAL time (value stays UTC, emit\n // converts back); when `utc={false}`, show/emit the value's exact wall-clock (no tz conversion)\n const selected = utc\n ? utcToLocalWall(parseTime(currentValue, valueFormat))\n : parseTime(currentValue, valueFormat)\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const mask = maskFromFormat(format)\n const timeUnit = /s/.test(format) ? 'second' : 'minute'\n\n const commit = (next: string) => {\n if (next === currentValue) return // skip redundant onChange / setValue with an unchanged value\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n\n // emit a time in the wire `valueFormat`, or '' to clear. Re-picking the same time-of-day is a no-op\n const commitTime = (d: Dayjs | null) => {\n if (d && selected && sameTime(d, selected, 'second')) return\n // local-wall → UTC for the wire value (or emit the wall-clock as-is when `utc={false}`)\n commit(d ? (utc ? localWallToUtc(d) : d).format(valueFormat) : '')\n }\n\n // true when `d` differs from the current value at the input's precision — gates typed-input commits\n const changed = (d: Dayjs) => !selected || !sameTime(d, selected, timeUnit)\n\n const [inputText, setInputText] = useState<string>(() =>\n selected ? selected.format(format) : '',\n )\n useEffect(() => {\n setInputText(selected ? selected.format(format) : '')\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentValue, format, valueFormat])\n\n // ── popover ────────────────────────────────────────────────────────────────────────────────────\n const triggerRef = useRef<HTMLDivElement | null>(null)\n const inputRef = useRef<HTMLInputElement | null>(null)\n const [open, setOpen] = useState(false)\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLInputElement | null }).current = node\n },\n [ref],\n )\n\n const fieldBlurRef = useRef<(() => void) | undefined>(undefined)\n fieldBlurRef.current = bound ? () => bound.onBlur({} as FocusEvent<HTMLInputElement>) : undefined\n\n // the floating panel forwards its node here, for the focus-leaves-the-widget check on blur\n const popoverRef = useRef<HTMLDivElement | null>(null)\n\n const closePopover = useCallback((refocus: boolean) => {\n setOpen(false)\n fieldBlurRef.current?.()\n if (refocus) inputRef.current?.focus()\n }, [])\n\n const handleInputChange = (raw: string) => {\n const masked = applyMask(raw, mask)\n setInputText(masked)\n if (masked === '') {\n commit('')\n return\n }\n const parsed = parseInput(masked, format)\n if (parsed && changed(parsed)) commitTime(parsed)\n }\n\n const handleInputBlur = (event: FocusEvent<HTMLInputElement>) => {\n const parsed = parseInput(inputText, format)\n if (inputText === '') {\n commit('')\n } else if (parsed) {\n if (changed(parsed)) commitTime(parsed)\n setInputText(parsed.format(format))\n } else {\n setInputText(selected ? selected.format(format) : '')\n }\n const nextEl = event.relatedTarget as Node | null\n if (nextEl && (popoverRef.current?.contains(nextEl) || triggerRef.current?.contains(nextEl)))\n return\n bound?.onBlur(event)\n }\n\n const handleTimeChange = (next: Dayjs) => commitTime(next)\n\n const iconSize: 'sm' | 'md' = size === 'sm' ? 'sm' : 'md'\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n <div ref={triggerRef} className={clsx(styles.control, open && styles.open)}>\n <input\n ref={setInputRef}\n id={id}\n name={name}\n className={styles.input}\n value={inputText}\n placeholder={placeholder ?? format.toLowerCase()}\n disabled={disabled}\n autoComplete=\"off\"\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n onChange={(e) => handleInputChange(e.target.value)}\n onBlur={handleInputBlur}\n />\n\n {clearable && currentValue !== '' && !disabled && (\n <button\n type=\"button\"\n className={styles.clear}\n aria-label={t('timePicker.clear')}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n commit('')\n setInputText('')\n inputRef.current?.focus()\n }}\n >\n <Icon name=\"CloseCircle\" size=\"sm\" />\n </button>\n )}\n\n <IconButton\n type=\"button\"\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={t('timePicker.open')}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n className={styles.calendarButton}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((o) => !o)}\n >\n <Icon name=\"Clock\" size={iconSize} />\n </IconButton>\n </div>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closePopover}\n role=\"dialog\"\n ariaLabel=\"Choose time\"\n trapFocus\n className={styles.popover}\n >\n <TimeColumns\n value={selected}\n onChange={handleTimeChange}\n hour12={hour12}\n minuteStep={minuteStep}\n showSeconds={showSeconds}\n autoFocus\n />\n <div className={tp.footer}>\n <Button size=\"sm\" variant=\"filled\" color=\"primary\" onClick={() => closePopover(true)}>\n {t('common.done')}\n </Button>\n </div>\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["defaultFormatFor","hour12","showSeconds","sameTime","a","b","unit","TimePicker","forwardRef","label","size","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","formatProp","valueFormatProp","utc","minuteStep","placeholder","clearable","name","idProp","className","style","ref","t","useT","reactId","useId","id","helperId","format","valueFormat","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentValue","selected","utcToLocalWall","parseTime","resolvedError","resolvedHelperText","mask","maskFromFormat","timeUnit","commit","next","commitTime","d","localWallToUtc","changed","inputText","setInputText","useEffect","triggerRef","useRef","inputRef","open","setOpen","setInputRef","useCallback","node","fieldBlurRef","popoverRef","closePopover","refocus","_a","_b","handleInputChange","raw","masked","applyMask","parsed","parseInput","handleInputBlur","event","nextEl","handleTimeChange","iconSize","jsxs","clsx","styles","jsx","Typography","Icon","IconButton","o","FloatingPanel","TimeColumns","tp","Button"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const s=require("react/jsx-runtime"),r=require("react"),U=require("clsx"),xe=require("./formContext-bTWrqdEV.cjs"),Te=require("./FloatingPanel-tGCG2nhA.cjs"),Ce=require("./Button-CYZoF18-.cjs"),O=require("./Icon-B6lz-V0A.cjs"),je=require("./IconButton-CQ25TtBc.cjs"),Z=require("./Typography-d97DdbNd.cjs"),ke=require("./TimeColumns-DkJsIu1w.cjs"),t=require("./DatePicker.module-BDtTsg8M.cjs"),Ie=require("./ConfigProvider-B_Bb6pk1.cjs"),ge="_footer_p1ea2_7",qe={footer:ge};function Fe(u,i){return u?i?"hh:mm:ss A":"hh:mm A":i?"HH:mm:ss":"HH:mm"}function $(u,i,m){return u.hour()!==i.hour()||u.minute()!==i.minute()?!1:m==="minute"?!0:u.second()===i.second()}const Be=r.forwardRef(function({label:i,size:m="md",error:G,helperText:J,required:K=!1,fullWidth:Q=!0,disabled:y=!1,value:k,defaultValue:X,onChange:I,format:Y,valueFormat:ee,utc:g=!0,hour12:S=!1,minuteStep:te=1,showSeconds:_=!0,placeholder:se,clearable:re=!0,name:f,id:oe,className:ne,style:le},p){const q=Ie.useT(),ae=r.useId(),F=oe??ae,E=`${F}-helper`,a=Y??Fe(S,_),v=ee??(g?"HH:mm:ss[Z]":"HH:mm:ss"),x=xe.useFormContext(),T=!!(x&&f),o=T?x.field(f):void 0,ce=k!==void 0?k:T?x.values[f]??"":void 0,L=k!==void 0||T,[ie,ue]=r.useState(X??""),d=L?ce:ie,n=g?t.utcToLocalWall(t.parseTime(d,v)):t.parseTime(d,v),B=G??(o==null?void 0:o.error)??!1,N=J??(o==null?void 0:o.helperText),me=t.maskFromFormat(a),fe=/s/.test(a)?"second":"minute",C=e=>{e!==d&&(L||ue(e),T&&x.setValue(f,e),I==null||I(e))},P=e=>{e&&n&&$(e,n,"second")||C(e?(g?t.localWallToUtc(e):e).format(v):"")},M=e=>!n||!$(e,n,fe),[H,h]=r.useState(()=>n?n.format(a):"");r.useEffect(()=>{h(n?n.format(a):"")},[d,a,v]);const R=r.useRef(null),b=r.useRef(null),[D,V]=r.useState(!1),pe=r.useCallback(e=>{b.current=e,typeof p=="function"?p(e):p&&(p.current=e)},[p]),j=r.useRef(void 0);j.current=o?()=>o.onBlur({}):void 0;const W=r.useRef(null),w=r.useCallback(e=>{var l,c;V(!1),(l=j.current)==null||l.call(j),e&&((c=b.current)==null||c.focus())},[]),de=e=>{const l=t.applyMask(e,me);if(h(l),l===""){C("");return}const c=t.parseInput(l,a);c&&M(c)&&P(c)},he=e=>{var z,A;const l=t.parseInput(H,a);H===""?C(""):l?(M(l)&&P(l),h(l.format(a))):h(n?n.format(a):"");const c=e.relatedTarget;c&&((z=W.current)!=null&&z.contains(c)||(A=R.current)!=null&&A.contains(c))||o==null||o.onBlur(e)},ye=e=>P(e),ve=m==="sm"?"sm":"md";return s.jsxs("div",{className:U.clsx(t.styles.field,t.styles[m],Q&&t.styles.fullWidth,B&&t.styles.error,y&&t.styles.disabled,ne),style:le,children:[i!=null&&s.jsxs("label",{htmlFor:F,className:t.styles.label,children:[s.jsx(Z.Typography,{as:"span",variant:"bodySmall",color:"muted",children:i}),K&&s.jsx("span",{className:t.styles.required,"aria-hidden":"true",children:"*"})]}),s.jsxs("div",{ref:R,className:U.clsx(t.styles.control,D&&t.styles.open),children:[s.jsx("input",{ref:pe,id:F,name:f,className:t.styles.input,value:H,placeholder:se??a.toLowerCase(),disabled:y,autoComplete:"off","aria-invalid":B||void 0,"aria-describedby":N!=null?E:void 0,onChange:e=>de(e.target.value),onBlur:he}),re&&d!==""&&!y&&s.jsx("button",{type:"button",className:t.styles.clear,"aria-label":q("timePicker.clear"),tabIndex:-1,onMouseDown:e=>e.preventDefault(),onClick:()=>{var e;C(""),h(""),(e=b.current)==null||e.focus()},children:s.jsx(O.Icon,{name:"CloseCircle",size:"sm"})}),s.jsx(je.IconButton,{type:"button",variant:"text",color:"primary",size:m,disabled:y,"aria-label":q("timePicker.open"),"aria-haspopup":"dialog","aria-expanded":D,className:t.styles.calendarButton,onMouseDown:e=>e.preventDefault(),onClick:()=>V(e=>!e),children:s.jsx(O.Icon,{name:"Clock",size:ve})})]}),s.jsxs(Te.FloatingPanel,{ref:W,open:D,triggerRef:R,onClose:w,role:"dialog",ariaLabel:"Choose time",trapFocus:!0,className:t.styles.popover,children:[s.jsx(ke.TimeColumns,{value:n,onChange:ye,hour12:S,minuteStep:te,showSeconds:_,autoFocus:!0}),s.jsx("div",{className:qe.footer,children:s.jsx(Ce.Button,{size:"sm",variant:"filled",color:"primary",onClick:()=>w(!0),children:q("common.done")})})]}),N!=null&&s.jsx(Z.Typography,{as:"span",id:E,variant:"bodySmall",color:B?"error":"muted",className:t.styles.helper,children:N})]})});exports.TimePicker=Be;
2
- //# sourceMappingURL=TimePicker-6nHQx0P5.cjs.map
1
+ "use strict";const s=require("react/jsx-runtime"),r=require("react"),U=require("clsx"),xe=require("./formContext-bTWrqdEV.cjs"),Te=require("./FloatingPanel-tGCG2nhA.cjs"),Ce=require("./Button-ClVfHGBc.cjs"),O=require("./Icon-B6lz-V0A.cjs"),je=require("./IconButton-D3ZpI0XL.cjs"),Z=require("./Typography-d97DdbNd.cjs"),ke=require("./TimeColumns-girAEgEN.cjs"),t=require("./DatePicker.module-BDtTsg8M.cjs"),Ie=require("./ConfigProvider-DELhJlqo.cjs"),ge="_footer_p1ea2_7",qe={footer:ge};function Fe(u,i){return u?i?"hh:mm:ss A":"hh:mm A":i?"HH:mm:ss":"HH:mm"}function $(u,i,m){return u.hour()!==i.hour()||u.minute()!==i.minute()?!1:m==="minute"?!0:u.second()===i.second()}const Be=r.forwardRef(function({label:i,size:m="md",error:G,helperText:J,required:K=!1,fullWidth:Q=!0,disabled:y=!1,value:k,defaultValue:X,onChange:I,format:Y,valueFormat:ee,utc:g=!0,hour12:S=!1,minuteStep:te=1,showSeconds:_=!0,placeholder:se,clearable:re=!0,name:f,id:oe,className:ne,style:le},p){const q=Ie.useT(),ae=r.useId(),F=oe??ae,E=`${F}-helper`,a=Y??Fe(S,_),v=ee??(g?"HH:mm:ss[Z]":"HH:mm:ss"),x=xe.useFormContext(),T=!!(x&&f),o=T?x.field(f):void 0,ce=k!==void 0?k:T?x.values[f]??"":void 0,L=k!==void 0||T,[ie,ue]=r.useState(X??""),d=L?ce:ie,n=g?t.utcToLocalWall(t.parseTime(d,v)):t.parseTime(d,v),B=G??(o==null?void 0:o.error)??!1,N=J??(o==null?void 0:o.helperText),me=t.maskFromFormat(a),fe=/s/.test(a)?"second":"minute",C=e=>{e!==d&&(L||ue(e),T&&x.setValue(f,e),I==null||I(e))},P=e=>{e&&n&&$(e,n,"second")||C(e?(g?t.localWallToUtc(e):e).format(v):"")},M=e=>!n||!$(e,n,fe),[H,h]=r.useState(()=>n?n.format(a):"");r.useEffect(()=>{h(n?n.format(a):"")},[d,a,v]);const R=r.useRef(null),b=r.useRef(null),[D,V]=r.useState(!1),pe=r.useCallback(e=>{b.current=e,typeof p=="function"?p(e):p&&(p.current=e)},[p]),j=r.useRef(void 0);j.current=o?()=>o.onBlur({}):void 0;const W=r.useRef(null),w=r.useCallback(e=>{var l,c;V(!1),(l=j.current)==null||l.call(j),e&&((c=b.current)==null||c.focus())},[]),de=e=>{const l=t.applyMask(e,me);if(h(l),l===""){C("");return}const c=t.parseInput(l,a);c&&M(c)&&P(c)},he=e=>{var z,A;const l=t.parseInput(H,a);H===""?C(""):l?(M(l)&&P(l),h(l.format(a))):h(n?n.format(a):"");const c=e.relatedTarget;c&&((z=W.current)!=null&&z.contains(c)||(A=R.current)!=null&&A.contains(c))||o==null||o.onBlur(e)},ye=e=>P(e),ve=m==="sm"?"sm":"md";return s.jsxs("div",{className:U.clsx(t.styles.field,t.styles[m],Q&&t.styles.fullWidth,B&&t.styles.error,y&&t.styles.disabled,ne),style:le,children:[i!=null&&s.jsxs("label",{htmlFor:F,className:t.styles.label,children:[s.jsx(Z.Typography,{as:"span",variant:"bodySmall",color:"muted",children:i}),K&&s.jsx("span",{className:t.styles.required,"aria-hidden":"true",children:"*"})]}),s.jsxs("div",{ref:R,className:U.clsx(t.styles.control,D&&t.styles.open),children:[s.jsx("input",{ref:pe,id:F,name:f,className:t.styles.input,value:H,placeholder:se??a.toLowerCase(),disabled:y,autoComplete:"off","aria-invalid":B||void 0,"aria-describedby":N!=null?E:void 0,onChange:e=>de(e.target.value),onBlur:he}),re&&d!==""&&!y&&s.jsx("button",{type:"button",className:t.styles.clear,"aria-label":q("timePicker.clear"),tabIndex:-1,onMouseDown:e=>e.preventDefault(),onClick:()=>{var e;C(""),h(""),(e=b.current)==null||e.focus()},children:s.jsx(O.Icon,{name:"CloseCircle",size:"sm"})}),s.jsx(je.IconButton,{type:"button",variant:"text",color:"primary",size:m,disabled:y,"aria-label":q("timePicker.open"),"aria-haspopup":"dialog","aria-expanded":D,className:t.styles.calendarButton,onMouseDown:e=>e.preventDefault(),onClick:()=>V(e=>!e),children:s.jsx(O.Icon,{name:"Clock",size:ve})})]}),s.jsxs(Te.FloatingPanel,{ref:W,open:D,triggerRef:R,onClose:w,role:"dialog",ariaLabel:"Choose time",trapFocus:!0,className:t.styles.popover,children:[s.jsx(ke.TimeColumns,{value:n,onChange:ye,hour12:S,minuteStep:te,showSeconds:_,autoFocus:!0}),s.jsx("div",{className:qe.footer,children:s.jsx(Ce.Button,{size:"sm",variant:"filled",color:"primary",onClick:()=>w(!0),children:q("common.done")})})]}),N!=null&&s.jsx(Z.Typography,{as:"span",id:E,variant:"bodySmall",color:B?"error":"muted",className:t.styles.helper,children:N})]})});exports.TimePicker=Be;
2
+ //# sourceMappingURL=TimePicker-_Ak5yB_5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker-6nHQx0P5.cjs","sources":["../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Typography } from '../Typography'\nimport { TimeColumns } from '../DateTimePicker/TimeColumns'\nimport {\n applyMask,\n localWallToUtc,\n maskFromFormat,\n parseInput,\n parseTime,\n utcToLocalWall,\n type Dayjs,\n} from '../DatePicker/dateUtils'\nimport styles from '../DatePicker/DatePicker.module.css'\nimport tp from './TimePicker.module.css'\n\nexport type TimePickerSize = 'sm' | 'md' | 'lg'\n\nexport interface TimePickerProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — control height, font and popover density. */\n size?: TimePickerSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — a time string in `valueFormat` (`''` = empty). */\n value?: string\n /** Initial value for uncontrolled use (in `valueFormat`). */\n defaultValue?: string\n /** Fires with the next time in `valueFormat` (`''` when cleared). */\n onChange?: (value: string) => void\n /**\n * Display + typed-input format (dayjs tokens). Defaults to `'HH:mm:ss'` (or `hh:mm:ss A` when\n * `hour12`; the `:ss` is dropped when `showSeconds` is `false`).\n */\n format?: string\n /**\n * Wire format of `value`/`defaultValue`/`onChange` (dayjs tokens), decoupled from the displayed\n * `format`. Defaults to `'HH:mm:ss[Z]'` when `utc` (the `Z` marks UTC), or `'HH:mm:ss'` when\n * `utc={false}`. Incoming values are parsed **leniently** (this format, then a numeric time — so a\n * backend time like `'09:35:49.6134342'` is accepted, ms-capped — then any ISO-8601 datetime, whose\n * time is used). Only the time-of-day is used; the date is ignored.\n */\n valueFormat?: string\n /**\n * Treat the value as **UTC** and display/edit in the viewer's **local** timezone (default `true`).\n * Set `false` to disable timezone conversion — the field shows and emits the value's exact wall-clock.\n */\n utc?: boolean\n /** 12-hour clock (1–12 + AM/PM) instead of 24-hour (0–23). Defaults to `false`. */\n hour12?: boolean\n /** Minute increment for the minutes column. Defaults to `1`. */\n minuteStep?: number\n /** Show the seconds column + `:ss` in the default format. Defaults to `true`; pass `false` to hide seconds. */\n showSeconds?: boolean\n /** Placeholder shown when empty. Defaults to the lowercased `format`. */\n placeholder?: string\n /** Shows a clear (×) button when a value is set. Defaults to `true`. */\n clearable?: boolean\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the time string). */\n name?: string\n /** Id for the input (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\nfunction defaultFormatFor(hour12: boolean, showSeconds: boolean): string {\n if (hour12) return showSeconds ? 'hh:mm:ss A' : 'hh:mm A'\n return showSeconds ? 'HH:mm:ss' : 'HH:mm'\n}\n\n/** Compares two datetimes by **time of day** only (ignoring the date) at the given precision. */\nfunction sameTime(a: Dayjs, b: Dayjs, unit: 'minute' | 'second'): boolean {\n if (a.hour() !== b.hour() || a.minute() !== b.minute()) return false\n return unit === 'minute' ? true : a.second() === b.second()\n}\n\n/**\n * A time-of-day field with a typed, masked input **and** a popover of scrollable time columns\n * (hour / minute / optional second + AM/PM in 12-hour mode) — the time sibling of `DateTimePicker`,\n * with no calendar. The value is a string in `valueFormat` (UTC, with a `Z`, unless `utc={false}`) —\n * incoming values are parsed leniently (a richer backend time is accepted) and the chosen time emitted\n * in that format. Picking keeps the popover open until you click away, press Escape, or hit Done.\n * Supports `hour12`, `minuteStep`, `showSeconds`, and `clearable`. Controlled (`value` + `onChange`) or\n * uncontrolled (`defaultValue`), and binds to a surrounding `<Form>` by `name`. Requires `dayjs`.\n */\nexport const TimePicker = forwardRef<HTMLInputElement, TimePickerProps>(function TimePicker(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n format: formatProp,\n valueFormat: valueFormatProp,\n utc = true,\n hour12 = false,\n minuteStep = 1,\n showSeconds = true,\n placeholder,\n clearable = true,\n name,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n const format = formatProp ?? defaultFormatFor(hour12, showSeconds)\n // UTC time-of-day carries a `Z` (\"09:35:00Z\"); `utc={false}` emits the bare wall-clock. Override via `valueFormat`.\n const valueFormat = valueFormatProp ?? (utc ? 'HH:mm:ss[Z]' : 'HH:mm:ss')\n\n // ── value (controlled / form-bound / uncontrolled) — a `valueFormat` time string ────────────────\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = isFormBound ? form!.field(name!) : undefined\n const externalValue =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = value !== undefined || isFormBound\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentValue = isControlled ? externalValue! : internal\n // when `utc`, parse the UTC time and show it in the viewer's LOCAL time (value stays UTC, emit\n // converts back); when `utc={false}`, show/emit the value's exact wall-clock (no tz conversion)\n const selected = utc\n ? utcToLocalWall(parseTime(currentValue, valueFormat))\n : parseTime(currentValue, valueFormat)\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const mask = maskFromFormat(format)\n const timeUnit = /s/.test(format) ? 'second' : 'minute'\n\n const commit = (next: string) => {\n if (next === currentValue) return // skip redundant onChange / setValue with an unchanged value\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n\n // emit a time in the wire `valueFormat`, or '' to clear. Re-picking the same time-of-day is a no-op\n const commitTime = (d: Dayjs | null) => {\n if (d && selected && sameTime(d, selected, 'second')) return\n // local-wall → UTC for the wire value (or emit the wall-clock as-is when `utc={false}`)\n commit(d ? (utc ? localWallToUtc(d) : d).format(valueFormat) : '')\n }\n\n // true when `d` differs from the current value at the input's precision — gates typed-input commits\n const changed = (d: Dayjs) => !selected || !sameTime(d, selected, timeUnit)\n\n const [inputText, setInputText] = useState<string>(() =>\n selected ? selected.format(format) : '',\n )\n useEffect(() => {\n setInputText(selected ? selected.format(format) : '')\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentValue, format, valueFormat])\n\n // ── popover ────────────────────────────────────────────────────────────────────────────────────\n const triggerRef = useRef<HTMLDivElement | null>(null)\n const inputRef = useRef<HTMLInputElement | null>(null)\n const [open, setOpen] = useState(false)\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLInputElement | null }).current = node\n },\n [ref],\n )\n\n const fieldBlurRef = useRef<(() => void) | undefined>(undefined)\n fieldBlurRef.current = bound ? () => bound.onBlur({} as FocusEvent<HTMLInputElement>) : undefined\n\n // the floating panel forwards its node here, for the focus-leaves-the-widget check on blur\n const popoverRef = useRef<HTMLDivElement | null>(null)\n\n const closePopover = useCallback((refocus: boolean) => {\n setOpen(false)\n fieldBlurRef.current?.()\n if (refocus) inputRef.current?.focus()\n }, [])\n\n const handleInputChange = (raw: string) => {\n const masked = applyMask(raw, mask)\n setInputText(masked)\n if (masked === '') {\n commit('')\n return\n }\n const parsed = parseInput(masked, format)\n if (parsed && changed(parsed)) commitTime(parsed)\n }\n\n const handleInputBlur = (event: FocusEvent<HTMLInputElement>) => {\n const parsed = parseInput(inputText, format)\n if (inputText === '') {\n commit('')\n } else if (parsed) {\n if (changed(parsed)) commitTime(parsed)\n setInputText(parsed.format(format))\n } else {\n setInputText(selected ? selected.format(format) : '')\n }\n const nextEl = event.relatedTarget as Node | null\n if (nextEl && (popoverRef.current?.contains(nextEl) || triggerRef.current?.contains(nextEl)))\n return\n bound?.onBlur(event)\n }\n\n const handleTimeChange = (next: Dayjs) => commitTime(next)\n\n const iconSize: 'sm' | 'md' = size === 'sm' ? 'sm' : 'md'\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n <div ref={triggerRef} className={clsx(styles.control, open && styles.open)}>\n <input\n ref={setInputRef}\n id={id}\n name={name}\n className={styles.input}\n value={inputText}\n placeholder={placeholder ?? format.toLowerCase()}\n disabled={disabled}\n autoComplete=\"off\"\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n onChange={(e) => handleInputChange(e.target.value)}\n onBlur={handleInputBlur}\n />\n\n {clearable && currentValue !== '' && !disabled && (\n <button\n type=\"button\"\n className={styles.clear}\n aria-label={t('timePicker.clear')}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n commit('')\n setInputText('')\n inputRef.current?.focus()\n }}\n >\n <Icon name=\"CloseCircle\" size=\"sm\" />\n </button>\n )}\n\n <IconButton\n type=\"button\"\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={t('timePicker.open')}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n className={styles.calendarButton}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((o) => !o)}\n >\n <Icon name=\"Clock\" size={iconSize} />\n </IconButton>\n </div>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closePopover}\n role=\"dialog\"\n ariaLabel=\"Choose time\"\n trapFocus\n className={styles.popover}\n >\n <TimeColumns\n value={selected}\n onChange={handleTimeChange}\n hour12={hour12}\n minuteStep={minuteStep}\n showSeconds={showSeconds}\n autoFocus\n />\n <div className={tp.footer}>\n <Button size=\"sm\" variant=\"filled\" color=\"primary\" onClick={() => closePopover(true)}>\n {t('common.done')}\n </Button>\n </div>\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["defaultFormatFor","hour12","showSeconds","sameTime","a","b","unit","TimePicker","forwardRef","label","size","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","formatProp","valueFormatProp","utc","minuteStep","placeholder","clearable","name","idProp","className","style","ref","t","useT","reactId","useId","id","helperId","format","valueFormat","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentValue","selected","utcToLocalWall","parseTime","resolvedError","resolvedHelperText","mask","maskFromFormat","timeUnit","commit","next","commitTime","d","localWallToUtc","changed","inputText","setInputText","useEffect","triggerRef","useRef","inputRef","open","setOpen","setInputRef","useCallback","node","fieldBlurRef","popoverRef","closePopover","refocus","_a","_b","handleInputChange","raw","masked","applyMask","parsed","parseInput","handleInputBlur","event","nextEl","handleTimeChange","iconSize","jsxs","clsx","styles","jsx","Typography","Icon","IconButton","o","FloatingPanel","TimeColumns","tp","Button"],"mappings":"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"}
1
+ {"version":3,"file":"TimePicker-_Ak5yB_5.cjs","sources":["../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Typography } from '../Typography'\nimport { TimeColumns } from '../DateTimePicker/TimeColumns'\nimport {\n applyMask,\n localWallToUtc,\n maskFromFormat,\n parseInput,\n parseTime,\n utcToLocalWall,\n type Dayjs,\n} from '../DatePicker/dateUtils'\nimport styles from '../DatePicker/DatePicker.module.css'\nimport tp from './TimePicker.module.css'\n\nexport type TimePickerSize = 'sm' | 'md' | 'lg'\n\nexport interface TimePickerProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — control height, font and popover density. */\n size?: TimePickerSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — a time string in `valueFormat` (`''` = empty). */\n value?: string\n /** Initial value for uncontrolled use (in `valueFormat`). */\n defaultValue?: string\n /** Fires with the next time in `valueFormat` (`''` when cleared). */\n onChange?: (value: string) => void\n /**\n * Display + typed-input format (dayjs tokens). Defaults to `'HH:mm:ss'` (or `hh:mm:ss A` when\n * `hour12`; the `:ss` is dropped when `showSeconds` is `false`).\n */\n format?: string\n /**\n * Wire format of `value`/`defaultValue`/`onChange` (dayjs tokens), decoupled from the displayed\n * `format`. Defaults to `'HH:mm:ss[Z]'` when `utc` (the `Z` marks UTC), or `'HH:mm:ss'` when\n * `utc={false}`. Incoming values are parsed **leniently** (this format, then a numeric time — so a\n * backend time like `'09:35:49.6134342'` is accepted, ms-capped — then any ISO-8601 datetime, whose\n * time is used). Only the time-of-day is used; the date is ignored.\n */\n valueFormat?: string\n /**\n * Treat the value as **UTC** and display/edit in the viewer's **local** timezone (default `true`).\n * Set `false` to disable timezone conversion — the field shows and emits the value's exact wall-clock.\n */\n utc?: boolean\n /** 12-hour clock (1–12 + AM/PM) instead of 24-hour (0–23). Defaults to `false`. */\n hour12?: boolean\n /** Minute increment for the minutes column. Defaults to `1`. */\n minuteStep?: number\n /** Show the seconds column + `:ss` in the default format. Defaults to `true`; pass `false` to hide seconds. */\n showSeconds?: boolean\n /** Placeholder shown when empty. Defaults to the lowercased `format`. */\n placeholder?: string\n /** Shows a clear (×) button when a value is set. Defaults to `true`. */\n clearable?: boolean\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the time string). */\n name?: string\n /** Id for the input (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\nfunction defaultFormatFor(hour12: boolean, showSeconds: boolean): string {\n if (hour12) return showSeconds ? 'hh:mm:ss A' : 'hh:mm A'\n return showSeconds ? 'HH:mm:ss' : 'HH:mm'\n}\n\n/** Compares two datetimes by **time of day** only (ignoring the date) at the given precision. */\nfunction sameTime(a: Dayjs, b: Dayjs, unit: 'minute' | 'second'): boolean {\n if (a.hour() !== b.hour() || a.minute() !== b.minute()) return false\n return unit === 'minute' ? true : a.second() === b.second()\n}\n\n/**\n * A time-of-day field with a typed, masked input **and** a popover of scrollable time columns\n * (hour / minute / optional second + AM/PM in 12-hour mode) — the time sibling of `DateTimePicker`,\n * with no calendar. The value is a string in `valueFormat` (UTC, with a `Z`, unless `utc={false}`) —\n * incoming values are parsed leniently (a richer backend time is accepted) and the chosen time emitted\n * in that format. Picking keeps the popover open until you click away, press Escape, or hit Done.\n * Supports `hour12`, `minuteStep`, `showSeconds`, and `clearable`. Controlled (`value` + `onChange`) or\n * uncontrolled (`defaultValue`), and binds to a surrounding `<Form>` by `name`. Requires `dayjs`.\n */\nexport const TimePicker = forwardRef<HTMLInputElement, TimePickerProps>(function TimePicker(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n format: formatProp,\n valueFormat: valueFormatProp,\n utc = true,\n hour12 = false,\n minuteStep = 1,\n showSeconds = true,\n placeholder,\n clearable = true,\n name,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n const format = formatProp ?? defaultFormatFor(hour12, showSeconds)\n // UTC time-of-day carries a `Z` (\"09:35:00Z\"); `utc={false}` emits the bare wall-clock. Override via `valueFormat`.\n const valueFormat = valueFormatProp ?? (utc ? 'HH:mm:ss[Z]' : 'HH:mm:ss')\n\n // ── value (controlled / form-bound / uncontrolled) — a `valueFormat` time string ────────────────\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = isFormBound ? form!.field(name!) : undefined\n const externalValue =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = value !== undefined || isFormBound\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentValue = isControlled ? externalValue! : internal\n // when `utc`, parse the UTC time and show it in the viewer's LOCAL time (value stays UTC, emit\n // converts back); when `utc={false}`, show/emit the value's exact wall-clock (no tz conversion)\n const selected = utc\n ? utcToLocalWall(parseTime(currentValue, valueFormat))\n : parseTime(currentValue, valueFormat)\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const mask = maskFromFormat(format)\n const timeUnit = /s/.test(format) ? 'second' : 'minute'\n\n const commit = (next: string) => {\n if (next === currentValue) return // skip redundant onChange / setValue with an unchanged value\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n\n // emit a time in the wire `valueFormat`, or '' to clear. Re-picking the same time-of-day is a no-op\n const commitTime = (d: Dayjs | null) => {\n if (d && selected && sameTime(d, selected, 'second')) return\n // local-wall → UTC for the wire value (or emit the wall-clock as-is when `utc={false}`)\n commit(d ? (utc ? localWallToUtc(d) : d).format(valueFormat) : '')\n }\n\n // true when `d` differs from the current value at the input's precision — gates typed-input commits\n const changed = (d: Dayjs) => !selected || !sameTime(d, selected, timeUnit)\n\n const [inputText, setInputText] = useState<string>(() =>\n selected ? selected.format(format) : '',\n )\n useEffect(() => {\n setInputText(selected ? selected.format(format) : '')\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentValue, format, valueFormat])\n\n // ── popover ────────────────────────────────────────────────────────────────────────────────────\n const triggerRef = useRef<HTMLDivElement | null>(null)\n const inputRef = useRef<HTMLInputElement | null>(null)\n const [open, setOpen] = useState(false)\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLInputElement | null }).current = node\n },\n [ref],\n )\n\n const fieldBlurRef = useRef<(() => void) | undefined>(undefined)\n fieldBlurRef.current = bound ? () => bound.onBlur({} as FocusEvent<HTMLInputElement>) : undefined\n\n // the floating panel forwards its node here, for the focus-leaves-the-widget check on blur\n const popoverRef = useRef<HTMLDivElement | null>(null)\n\n const closePopover = useCallback((refocus: boolean) => {\n setOpen(false)\n fieldBlurRef.current?.()\n if (refocus) inputRef.current?.focus()\n }, [])\n\n const handleInputChange = (raw: string) => {\n const masked = applyMask(raw, mask)\n setInputText(masked)\n if (masked === '') {\n commit('')\n return\n }\n const parsed = parseInput(masked, format)\n if (parsed && changed(parsed)) commitTime(parsed)\n }\n\n const handleInputBlur = (event: FocusEvent<HTMLInputElement>) => {\n const parsed = parseInput(inputText, format)\n if (inputText === '') {\n commit('')\n } else if (parsed) {\n if (changed(parsed)) commitTime(parsed)\n setInputText(parsed.format(format))\n } else {\n setInputText(selected ? selected.format(format) : '')\n }\n const nextEl = event.relatedTarget as Node | null\n if (nextEl && (popoverRef.current?.contains(nextEl) || triggerRef.current?.contains(nextEl)))\n return\n bound?.onBlur(event)\n }\n\n const handleTimeChange = (next: Dayjs) => commitTime(next)\n\n const iconSize: 'sm' | 'md' = size === 'sm' ? 'sm' : 'md'\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n <div ref={triggerRef} className={clsx(styles.control, open && styles.open)}>\n <input\n ref={setInputRef}\n id={id}\n name={name}\n className={styles.input}\n value={inputText}\n placeholder={placeholder ?? format.toLowerCase()}\n disabled={disabled}\n autoComplete=\"off\"\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n onChange={(e) => handleInputChange(e.target.value)}\n onBlur={handleInputBlur}\n />\n\n {clearable && currentValue !== '' && !disabled && (\n <button\n type=\"button\"\n className={styles.clear}\n aria-label={t('timePicker.clear')}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n commit('')\n setInputText('')\n inputRef.current?.focus()\n }}\n >\n <Icon name=\"CloseCircle\" size=\"sm\" />\n </button>\n )}\n\n <IconButton\n type=\"button\"\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={t('timePicker.open')}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n className={styles.calendarButton}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((o) => !o)}\n >\n <Icon name=\"Clock\" size={iconSize} />\n </IconButton>\n </div>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closePopover}\n role=\"dialog\"\n ariaLabel=\"Choose time\"\n trapFocus\n className={styles.popover}\n >\n <TimeColumns\n value={selected}\n onChange={handleTimeChange}\n hour12={hour12}\n minuteStep={minuteStep}\n showSeconds={showSeconds}\n autoFocus\n />\n <div className={tp.footer}>\n <Button size=\"sm\" variant=\"filled\" color=\"primary\" onClick={() => closePopover(true)}>\n {t('common.done')}\n </Button>\n </div>\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["defaultFormatFor","hour12","showSeconds","sameTime","a","b","unit","TimePicker","forwardRef","label","size","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","formatProp","valueFormatProp","utc","minuteStep","placeholder","clearable","name","idProp","className","style","ref","t","useT","reactId","useId","id","helperId","format","valueFormat","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentValue","selected","utcToLocalWall","parseTime","resolvedError","resolvedHelperText","mask","maskFromFormat","timeUnit","commit","next","commitTime","d","localWallToUtc","changed","inputText","setInputText","useEffect","triggerRef","useRef","inputRef","open","setOpen","setInputRef","useCallback","node","fieldBlurRef","popoverRef","closePopover","refocus","_a","_b","handleInputChange","raw","masked","applyMask","parsed","parseInput","handleInputBlur","event","nextEl","handleTimeChange","iconSize","jsxs","clsx","styles","jsx","Typography","Icon","IconButton","o","FloatingPanel","TimeColumns","tp","Button"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as o } from "react/jsx-runtime";
2
2
  import { useState as b, useRef as l, useEffect as m, useSyncExternalStore as x } from "react";
3
3
  import { createPortal as g } from "react-dom";
4
4
  import { r as y, c as w, s as A, g as T } from "./toastStore-Cx_JOKwS.js";
5
- import { A as h } from "./Alert-CtUr-0s8.js";
5
+ import { A as h } from "./Alert-Dz0sNGpz.js";
6
6
  const E = "_viewport_zx7eo_3", S = "_item_zx7eo_40", z = "_alert_zx7eo_63", d = {
7
7
  viewport: E,
8
8
  item: S,
@@ -60,4 +60,4 @@ function C({ position: e = "bottom-right", duration: i = 4e3 }) {
60
60
  export {
61
61
  C as T
62
62
  };
63
- //# sourceMappingURL=Toaster-Fq6-ImDJ.js.map
63
+ //# sourceMappingURL=Toaster-Dput5iLU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toaster-Fq6-ImDJ.js","sources":["../src/components/Toast/ToastItem.tsx","../src/components/Toast/Toaster.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { Alert } from '../Alert'\nimport { closeToast, removeToast, type ToastPosition, type ToastRecord } from './toastStore'\nimport styles from './Toaster.module.css'\n\n/** Exit-animation duration (matches `--tz-duration`) — how long to keep a closing toast mounted. */\nconst EXIT_MS = 300\n\nexport interface ToastItemProps {\n toast: ToastRecord\n /** Fallback auto-dismiss delay when the toast doesn't set its own. */\n duration: number\n position: ToastPosition\n}\n\n/**\n * One rendered toast — an `Alert` wrapped with the enter/exit animation, the auto-dismiss timer\n * (paused while hovered), and the close wiring. Internal to `Toaster`.\n */\nexport function ToastItem({ toast, duration, position }: ToastItemProps) {\n const [visible, setVisible] = useState(false)\n const ttl = toast.duration ?? duration\n const timer = useRef<number | undefined>(undefined)\n const remaining = useRef(ttl)\n const startedAt = useRef(0)\n\n // enter — flip `visible` on the next frame so the transition runs\n useEffect(() => {\n const raf = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(raf)\n }, [])\n\n // exit — when the store marks this toast closing, animate out then remove it\n useEffect(() => {\n if (toast.open) return\n setVisible(false)\n const t = window.setTimeout(() => removeToast(toast.id), EXIT_MS)\n return () => window.clearTimeout(t)\n }, [toast.open, toast.id])\n\n // auto-dismiss timer, paused on hover (tracks the remaining time across pauses)\n const clearTimer = () => {\n if (timer.current != null) {\n window.clearTimeout(timer.current)\n timer.current = undefined\n }\n }\n const resume = () => {\n if (!toast.open || remaining.current === Infinity) return\n clearTimer()\n startedAt.current = Date.now()\n timer.current = window.setTimeout(() => closeToast(toast.id), remaining.current)\n }\n const pause = () => {\n if (timer.current == null) return\n clearTimer()\n remaining.current -= Date.now() - startedAt.current\n }\n useEffect(() => {\n // (re)start from the full duration on open, and whenever an update-by-id changes `duration`\n // (otherwise the original countdown keeps running against the stale ttl)\n remaining.current = ttl\n resume()\n return clearTimer\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toast.open, ttl])\n\n return (\n <div\n className={styles.item}\n data-open={visible ? 'true' : 'false'}\n data-position={position}\n onMouseEnter={pause}\n onMouseLeave={resume}\n >\n <Alert\n color={toast.color}\n variant={toast.variant ?? 'contained'}\n icon={toast.icon}\n action={toast.action}\n onClose={() => closeToast(toast.id)}\n role=\"status\"\n className={styles.alert}\n >\n {toast.message}\n </Alert>\n </div>\n )\n}\n","import { useSyncExternalStore } from 'react'\nimport { createPortal } from 'react-dom'\nimport { getToasts, subscribeToasts, type ToastPosition } from './toastStore'\nimport { ToastItem } from './ToastItem'\nimport styles from './Toaster.module.css'\n\nexport interface ToasterProps {\n /** Corner the toasts stack in. Defaults to `bottom-right`. */\n position?: ToastPosition\n /** Default auto-dismiss delay in ms; a per-toast `duration` overrides it. Defaults to `4000`. */\n duration?: number\n}\n\n/**\n * The toast viewport — mount it **once** near the app root. It portals to `<body>` at `--tz-z-toast`,\n * subscribes to the imperative `toast` store, and renders each toast as an animated, auto-dismissing\n * `Alert`. Drive it from anywhere with `toast.success('Saved')` / `toast.error(...)` / `toast.dismiss(id)`.\n *\n * @example\n * <Toaster position=\"bottom-right\" />\n * // …elsewhere:\n * toast.success('Saved')\n */\nexport function Toaster({ position = 'bottom-right', duration = 4000 }: ToasterProps) {\n const toasts = useSyncExternalStore(subscribeToasts, getToasts, getToasts)\n\n if (typeof document === 'undefined') return null\n\n return createPortal(\n <div className={styles.viewport} data-position={position} aria-live=\"polite\">\n {toasts.map((t) => (\n <ToastItem key={t.id} toast={t} duration={duration} position={position} />\n ))}\n </div>,\n document.body,\n )\n}\n"],"names":["EXIT_MS","ToastItem","toast","duration","position","visible","setVisible","useState","ttl","timer","useRef","remaining","startedAt","useEffect","raf","t","removeToast","clearTimer","resume","closeToast","pause","jsx","styles","Alert","Toaster","toasts","useSyncExternalStore","subscribeToasts","getToasts","createPortal"],"mappings":";;;;;;;;;GAMMA,IAAU;AAaT,SAASC,EAAU,EAAE,OAAAC,GAAO,UAAAC,GAAU,UAAAC,KAA4B;AACvE,QAAM,CAACC,GAASC,CAAU,IAAIC,EAAS,EAAK,GACtCC,IAAMN,EAAM,YAAYC,GACxBM,IAAQC,EAA2B,MAAS,GAC5CC,IAAYD,EAAOF,CAAG,GACtBI,IAAYF,EAAO,CAAC;AAG1B,EAAAG,EAAU,MAAM;AACd,UAAMC,IAAM,sBAAsB,MAAMR,EAAW,EAAI,CAAC;AACxD,WAAO,MAAM,qBAAqBQ,CAAG;AAAA,EACvC,GAAG,CAAA,CAAE,GAGLD,EAAU,MAAM;AACd,QAAIX,EAAM,KAAM;AAChB,IAAAI,EAAW,EAAK;AAChB,UAAMS,IAAI,OAAO,WAAW,MAAMC,EAAYd,EAAM,EAAE,GAAGF,CAAO;AAChE,WAAO,MAAM,OAAO,aAAae,CAAC;AAAA,EACpC,GAAG,CAACb,EAAM,MAAMA,EAAM,EAAE,CAAC;AAGzB,QAAMe,IAAa,MAAM;AACvB,IAAIR,EAAM,WAAW,SACnB,OAAO,aAAaA,EAAM,OAAO,GACjCA,EAAM,UAAU;AAAA,EAEpB,GACMS,IAAS,MAAM;AACnB,IAAI,CAAChB,EAAM,QAAQS,EAAU,YAAY,UACzCM,EAAA,GACAL,EAAU,UAAU,KAAK,IAAA,GACzBH,EAAM,UAAU,OAAO,WAAW,MAAMU,EAAWjB,EAAM,EAAE,GAAGS,EAAU,OAAO;AAAA,EACjF,GACMS,IAAQ,MAAM;AAClB,IAAIX,EAAM,WAAW,SACrBQ,EAAA,GACAN,EAAU,WAAW,KAAK,IAAA,IAAQC,EAAU;AAAA,EAC9C;AACA,SAAAC,EAAU,OAGRF,EAAU,UAAUH,GACpBU,EAAA,GACOD,IAEN,CAACf,EAAM,MAAMM,CAAG,CAAC,GAGlB,gBAAAa;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAO;AAAA,MAClB,aAAWjB,IAAU,SAAS;AAAA,MAC9B,iBAAeD;AAAA,MACf,cAAcgB;AAAA,MACd,cAAcF;AAAA,MAEd,UAAA,gBAAAG;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,OAAOrB,EAAM;AAAA,UACb,SAASA,EAAM,WAAW;AAAA,UAC1B,MAAMA,EAAM;AAAA,UACZ,QAAQA,EAAM;AAAA,UACd,SAAS,MAAMiB,EAAWjB,EAAM,EAAE;AAAA,UAClC,MAAK;AAAA,UACL,WAAWoB,EAAO;AAAA,UAEjB,UAAApB,EAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IACT;AAAA,EAAA;AAGN;ACjEO,SAASsB,EAAQ,EAAE,UAAApB,IAAW,gBAAgB,UAAAD,IAAW,OAAsB;AACpF,QAAMsB,IAASC,EAAqBC,GAAiBC,GAAWA,CAAS;AAEzE,SAAI,OAAO,WAAa,MAAoB,OAErCC;AAAA,IACL,gBAAAR,EAAC,SAAI,WAAWC,EAAO,UAAU,iBAAelB,GAAU,aAAU,UACjE,UAAAqB,EAAO,IAAI,CAAC,MACX,gBAAAJ,EAACpB,KAAqB,OAAO,GAAG,UAAAE,GAAoB,UAAAC,KAApC,EAAE,EAAsD,CACzE,EAAA,CACH;AAAA,IACA,SAAS;AAAA,EAAA;AAEb;"}
1
+ {"version":3,"file":"Toaster-Dput5iLU.js","sources":["../src/components/Toast/ToastItem.tsx","../src/components/Toast/Toaster.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { Alert } from '../Alert'\nimport { closeToast, removeToast, type ToastPosition, type ToastRecord } from './toastStore'\nimport styles from './Toaster.module.css'\n\n/** Exit-animation duration (matches `--tz-duration`) — how long to keep a closing toast mounted. */\nconst EXIT_MS = 300\n\nexport interface ToastItemProps {\n toast: ToastRecord\n /** Fallback auto-dismiss delay when the toast doesn't set its own. */\n duration: number\n position: ToastPosition\n}\n\n/**\n * One rendered toast — an `Alert` wrapped with the enter/exit animation, the auto-dismiss timer\n * (paused while hovered), and the close wiring. Internal to `Toaster`.\n */\nexport function ToastItem({ toast, duration, position }: ToastItemProps) {\n const [visible, setVisible] = useState(false)\n const ttl = toast.duration ?? duration\n const timer = useRef<number | undefined>(undefined)\n const remaining = useRef(ttl)\n const startedAt = useRef(0)\n\n // enter — flip `visible` on the next frame so the transition runs\n useEffect(() => {\n const raf = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(raf)\n }, [])\n\n // exit — when the store marks this toast closing, animate out then remove it\n useEffect(() => {\n if (toast.open) return\n setVisible(false)\n const t = window.setTimeout(() => removeToast(toast.id), EXIT_MS)\n return () => window.clearTimeout(t)\n }, [toast.open, toast.id])\n\n // auto-dismiss timer, paused on hover (tracks the remaining time across pauses)\n const clearTimer = () => {\n if (timer.current != null) {\n window.clearTimeout(timer.current)\n timer.current = undefined\n }\n }\n const resume = () => {\n if (!toast.open || remaining.current === Infinity) return\n clearTimer()\n startedAt.current = Date.now()\n timer.current = window.setTimeout(() => closeToast(toast.id), remaining.current)\n }\n const pause = () => {\n if (timer.current == null) return\n clearTimer()\n remaining.current -= Date.now() - startedAt.current\n }\n useEffect(() => {\n // (re)start from the full duration on open, and whenever an update-by-id changes `duration`\n // (otherwise the original countdown keeps running against the stale ttl)\n remaining.current = ttl\n resume()\n return clearTimer\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toast.open, ttl])\n\n return (\n <div\n className={styles.item}\n data-open={visible ? 'true' : 'false'}\n data-position={position}\n onMouseEnter={pause}\n onMouseLeave={resume}\n >\n <Alert\n color={toast.color}\n variant={toast.variant ?? 'contained'}\n icon={toast.icon}\n action={toast.action}\n onClose={() => closeToast(toast.id)}\n role=\"status\"\n className={styles.alert}\n >\n {toast.message}\n </Alert>\n </div>\n )\n}\n","import { useSyncExternalStore } from 'react'\nimport { createPortal } from 'react-dom'\nimport { getToasts, subscribeToasts, type ToastPosition } from './toastStore'\nimport { ToastItem } from './ToastItem'\nimport styles from './Toaster.module.css'\n\nexport interface ToasterProps {\n /** Corner the toasts stack in. Defaults to `bottom-right`. */\n position?: ToastPosition\n /** Default auto-dismiss delay in ms; a per-toast `duration` overrides it. Defaults to `4000`. */\n duration?: number\n}\n\n/**\n * The toast viewport — mount it **once** near the app root. It portals to `<body>` at `--tz-z-toast`,\n * subscribes to the imperative `toast` store, and renders each toast as an animated, auto-dismissing\n * `Alert`. Drive it from anywhere with `toast.success('Saved')` / `toast.error(...)` / `toast.dismiss(id)`.\n *\n * @example\n * <Toaster position=\"bottom-right\" />\n * // …elsewhere:\n * toast.success('Saved')\n */\nexport function Toaster({ position = 'bottom-right', duration = 4000 }: ToasterProps) {\n const toasts = useSyncExternalStore(subscribeToasts, getToasts, getToasts)\n\n if (typeof document === 'undefined') return null\n\n return createPortal(\n <div className={styles.viewport} data-position={position} aria-live=\"polite\">\n {toasts.map((t) => (\n <ToastItem key={t.id} toast={t} duration={duration} position={position} />\n ))}\n </div>,\n document.body,\n )\n}\n"],"names":["EXIT_MS","ToastItem","toast","duration","position","visible","setVisible","useState","ttl","timer","useRef","remaining","startedAt","useEffect","raf","t","removeToast","clearTimer","resume","closeToast","pause","jsx","styles","Alert","Toaster","toasts","useSyncExternalStore","subscribeToasts","getToasts","createPortal"],"mappings":";;;;;;;;;GAMMA,IAAU;AAaT,SAASC,EAAU,EAAE,OAAAC,GAAO,UAAAC,GAAU,UAAAC,KAA4B;AACvE,QAAM,CAACC,GAASC,CAAU,IAAIC,EAAS,EAAK,GACtCC,IAAMN,EAAM,YAAYC,GACxBM,IAAQC,EAA2B,MAAS,GAC5CC,IAAYD,EAAOF,CAAG,GACtBI,IAAYF,EAAO,CAAC;AAG1B,EAAAG,EAAU,MAAM;AACd,UAAMC,IAAM,sBAAsB,MAAMR,EAAW,EAAI,CAAC;AACxD,WAAO,MAAM,qBAAqBQ,CAAG;AAAA,EACvC,GAAG,CAAA,CAAE,GAGLD,EAAU,MAAM;AACd,QAAIX,EAAM,KAAM;AAChB,IAAAI,EAAW,EAAK;AAChB,UAAMS,IAAI,OAAO,WAAW,MAAMC,EAAYd,EAAM,EAAE,GAAGF,CAAO;AAChE,WAAO,MAAM,OAAO,aAAae,CAAC;AAAA,EACpC,GAAG,CAACb,EAAM,MAAMA,EAAM,EAAE,CAAC;AAGzB,QAAMe,IAAa,MAAM;AACvB,IAAIR,EAAM,WAAW,SACnB,OAAO,aAAaA,EAAM,OAAO,GACjCA,EAAM,UAAU;AAAA,EAEpB,GACMS,IAAS,MAAM;AACnB,IAAI,CAAChB,EAAM,QAAQS,EAAU,YAAY,UACzCM,EAAA,GACAL,EAAU,UAAU,KAAK,IAAA,GACzBH,EAAM,UAAU,OAAO,WAAW,MAAMU,EAAWjB,EAAM,EAAE,GAAGS,EAAU,OAAO;AAAA,EACjF,GACMS,IAAQ,MAAM;AAClB,IAAIX,EAAM,WAAW,SACrBQ,EAAA,GACAN,EAAU,WAAW,KAAK,IAAA,IAAQC,EAAU;AAAA,EAC9C;AACA,SAAAC,EAAU,OAGRF,EAAU,UAAUH,GACpBU,EAAA,GACOD,IAEN,CAACf,EAAM,MAAMM,CAAG,CAAC,GAGlB,gBAAAa;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAO;AAAA,MAClB,aAAWjB,IAAU,SAAS;AAAA,MAC9B,iBAAeD;AAAA,MACf,cAAcgB;AAAA,MACd,cAAcF;AAAA,MAEd,UAAA,gBAAAG;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,OAAOrB,EAAM;AAAA,UACb,SAASA,EAAM,WAAW;AAAA,UAC1B,MAAMA,EAAM;AAAA,UACZ,QAAQA,EAAM;AAAA,UACd,SAAS,MAAMiB,EAAWjB,EAAM,EAAE;AAAA,UAClC,MAAK;AAAA,UACL,WAAWoB,EAAO;AAAA,UAEjB,UAAApB,EAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IACT;AAAA,EAAA;AAGN;ACjEO,SAASsB,EAAQ,EAAE,UAAApB,IAAW,gBAAgB,UAAAD,IAAW,OAAsB;AACpF,QAAMsB,IAASC,EAAqBC,GAAiBC,GAAWA,CAAS;AAEzE,SAAI,OAAO,WAAa,MAAoB,OAErCC;AAAA,IACL,gBAAAR,EAAC,SAAI,WAAWC,EAAO,UAAU,iBAAelB,GAAU,aAAU,UACjE,UAAAqB,EAAO,IAAI,CAAC,MACX,gBAAAJ,EAACpB,KAAqB,OAAO,GAAG,UAAAE,GAAoB,UAAAC,KAApC,EAAE,EAAsD,CACzE,EAAA,CACH;AAAA,IACA,SAAS;AAAA,EAAA;AAEb;"}
@@ -1,2 +1,2 @@
1
- "use strict";const s=require("react/jsx-runtime"),t=require("react"),w=require("react-dom"),r=require("./toastStore-B4Tk2Xk7.cjs"),_=require("./Alert-CY8iU1zd.cjs"),x="_viewport_zx7eo_3",b="_item_zx7eo_40",q="_alert_zx7eo_63",d={viewport:x,item:b,alert:q},E=300;function g({toast:e,duration:c,position:u}){const[o,f]=t.useState(!1),a=e.duration??c,n=t.useRef(void 0),i=t.useRef(a),T=t.useRef(0);t.useEffect(()=>{const m=requestAnimationFrame(()=>f(!0));return()=>cancelAnimationFrame(m)},[]),t.useEffect(()=>{if(e.open)return;f(!1);const m=window.setTimeout(()=>r.removeToast(e.id),E);return()=>window.clearTimeout(m)},[e.open,e.id]);const l=()=>{n.current!=null&&(window.clearTimeout(n.current),n.current=void 0)},p=()=>{!e.open||i.current===1/0||(l(),T.current=Date.now(),n.current=window.setTimeout(()=>r.closeToast(e.id),i.current))},v=()=>{n.current!=null&&(l(),i.current-=Date.now()-T.current)};return t.useEffect(()=>(i.current=a,p(),l),[e.open,a]),s.jsx("div",{className:d.item,"data-open":o?"true":"false","data-position":u,onMouseEnter:v,onMouseLeave:p,children:s.jsx(_.Alert,{color:e.color,variant:e.variant??"contained",icon:e.icon,action:e.action,onClose:()=>r.closeToast(e.id),role:"status",className:d.alert,children:e.message})})}function j({position:e="bottom-right",duration:c=4e3}){const u=t.useSyncExternalStore(r.subscribeToasts,r.getToasts,r.getToasts);return typeof document>"u"?null:w.createPortal(s.jsx("div",{className:d.viewport,"data-position":e,"aria-live":"polite",children:u.map(o=>s.jsx(g,{toast:o,duration:c,position:e},o.id))}),document.body)}exports.Toaster=j;
2
- //# sourceMappingURL=Toaster-Brcspf7v.cjs.map
1
+ "use strict";const s=require("react/jsx-runtime"),t=require("react"),w=require("react-dom"),r=require("./toastStore-B4Tk2Xk7.cjs"),_=require("./Alert-5tpyGb2M.cjs"),x="_viewport_zx7eo_3",b="_item_zx7eo_40",q="_alert_zx7eo_63",d={viewport:x,item:b,alert:q},E=300;function g({toast:e,duration:c,position:u}){const[o,f]=t.useState(!1),a=e.duration??c,n=t.useRef(void 0),i=t.useRef(a),T=t.useRef(0);t.useEffect(()=>{const m=requestAnimationFrame(()=>f(!0));return()=>cancelAnimationFrame(m)},[]),t.useEffect(()=>{if(e.open)return;f(!1);const m=window.setTimeout(()=>r.removeToast(e.id),E);return()=>window.clearTimeout(m)},[e.open,e.id]);const l=()=>{n.current!=null&&(window.clearTimeout(n.current),n.current=void 0)},p=()=>{!e.open||i.current===1/0||(l(),T.current=Date.now(),n.current=window.setTimeout(()=>r.closeToast(e.id),i.current))},v=()=>{n.current!=null&&(l(),i.current-=Date.now()-T.current)};return t.useEffect(()=>(i.current=a,p(),l),[e.open,a]),s.jsx("div",{className:d.item,"data-open":o?"true":"false","data-position":u,onMouseEnter:v,onMouseLeave:p,children:s.jsx(_.Alert,{color:e.color,variant:e.variant??"contained",icon:e.icon,action:e.action,onClose:()=>r.closeToast(e.id),role:"status",className:d.alert,children:e.message})})}function j({position:e="bottom-right",duration:c=4e3}){const u=t.useSyncExternalStore(r.subscribeToasts,r.getToasts,r.getToasts);return typeof document>"u"?null:w.createPortal(s.jsx("div",{className:d.viewport,"data-position":e,"aria-live":"polite",children:u.map(o=>s.jsx(g,{toast:o,duration:c,position:e},o.id))}),document.body)}exports.Toaster=j;
2
+ //# sourceMappingURL=Toaster-fjyF8W3F.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toaster-Brcspf7v.cjs","sources":["../src/components/Toast/ToastItem.tsx","../src/components/Toast/Toaster.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { Alert } from '../Alert'\nimport { closeToast, removeToast, type ToastPosition, type ToastRecord } from './toastStore'\nimport styles from './Toaster.module.css'\n\n/** Exit-animation duration (matches `--tz-duration`) — how long to keep a closing toast mounted. */\nconst EXIT_MS = 300\n\nexport interface ToastItemProps {\n toast: ToastRecord\n /** Fallback auto-dismiss delay when the toast doesn't set its own. */\n duration: number\n position: ToastPosition\n}\n\n/**\n * One rendered toast — an `Alert` wrapped with the enter/exit animation, the auto-dismiss timer\n * (paused while hovered), and the close wiring. Internal to `Toaster`.\n */\nexport function ToastItem({ toast, duration, position }: ToastItemProps) {\n const [visible, setVisible] = useState(false)\n const ttl = toast.duration ?? duration\n const timer = useRef<number | undefined>(undefined)\n const remaining = useRef(ttl)\n const startedAt = useRef(0)\n\n // enter — flip `visible` on the next frame so the transition runs\n useEffect(() => {\n const raf = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(raf)\n }, [])\n\n // exit — when the store marks this toast closing, animate out then remove it\n useEffect(() => {\n if (toast.open) return\n setVisible(false)\n const t = window.setTimeout(() => removeToast(toast.id), EXIT_MS)\n return () => window.clearTimeout(t)\n }, [toast.open, toast.id])\n\n // auto-dismiss timer, paused on hover (tracks the remaining time across pauses)\n const clearTimer = () => {\n if (timer.current != null) {\n window.clearTimeout(timer.current)\n timer.current = undefined\n }\n }\n const resume = () => {\n if (!toast.open || remaining.current === Infinity) return\n clearTimer()\n startedAt.current = Date.now()\n timer.current = window.setTimeout(() => closeToast(toast.id), remaining.current)\n }\n const pause = () => {\n if (timer.current == null) return\n clearTimer()\n remaining.current -= Date.now() - startedAt.current\n }\n useEffect(() => {\n // (re)start from the full duration on open, and whenever an update-by-id changes `duration`\n // (otherwise the original countdown keeps running against the stale ttl)\n remaining.current = ttl\n resume()\n return clearTimer\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toast.open, ttl])\n\n return (\n <div\n className={styles.item}\n data-open={visible ? 'true' : 'false'}\n data-position={position}\n onMouseEnter={pause}\n onMouseLeave={resume}\n >\n <Alert\n color={toast.color}\n variant={toast.variant ?? 'contained'}\n icon={toast.icon}\n action={toast.action}\n onClose={() => closeToast(toast.id)}\n role=\"status\"\n className={styles.alert}\n >\n {toast.message}\n </Alert>\n </div>\n )\n}\n","import { useSyncExternalStore } from 'react'\nimport { createPortal } from 'react-dom'\nimport { getToasts, subscribeToasts, type ToastPosition } from './toastStore'\nimport { ToastItem } from './ToastItem'\nimport styles from './Toaster.module.css'\n\nexport interface ToasterProps {\n /** Corner the toasts stack in. Defaults to `bottom-right`. */\n position?: ToastPosition\n /** Default auto-dismiss delay in ms; a per-toast `duration` overrides it. Defaults to `4000`. */\n duration?: number\n}\n\n/**\n * The toast viewport — mount it **once** near the app root. It portals to `<body>` at `--tz-z-toast`,\n * subscribes to the imperative `toast` store, and renders each toast as an animated, auto-dismissing\n * `Alert`. Drive it from anywhere with `toast.success('Saved')` / `toast.error(...)` / `toast.dismiss(id)`.\n *\n * @example\n * <Toaster position=\"bottom-right\" />\n * // …elsewhere:\n * toast.success('Saved')\n */\nexport function Toaster({ position = 'bottom-right', duration = 4000 }: ToasterProps) {\n const toasts = useSyncExternalStore(subscribeToasts, getToasts, getToasts)\n\n if (typeof document === 'undefined') return null\n\n return createPortal(\n <div className={styles.viewport} data-position={position} aria-live=\"polite\">\n {toasts.map((t) => (\n <ToastItem key={t.id} toast={t} duration={duration} position={position} />\n ))}\n </div>,\n document.body,\n )\n}\n"],"names":["EXIT_MS","ToastItem","toast","duration","position","visible","setVisible","useState","ttl","timer","useRef","remaining","startedAt","useEffect","raf","t","removeToast","clearTimer","resume","closeToast","pause","jsx","styles","Alert","Toaster","toasts","useSyncExternalStore","subscribeToasts","getToasts","createPortal"],"mappings":"gQAMMA,EAAU,IAaT,SAASC,EAAU,CAAE,MAAAC,EAAO,SAAAC,EAAU,SAAAC,GAA4B,CACvE,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtCC,EAAMN,EAAM,UAAYC,EACxBM,EAAQC,EAAAA,OAA2B,MAAS,EAC5CC,EAAYD,EAAAA,OAAOF,CAAG,EACtBI,EAAYF,EAAAA,OAAO,CAAC,EAG1BG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAM,sBAAsB,IAAMR,EAAW,EAAI,CAAC,EACxD,MAAO,IAAM,qBAAqBQ,CAAG,CACvC,EAAG,CAAA,CAAE,EAGLD,EAAAA,UAAU,IAAM,CACd,GAAIX,EAAM,KAAM,OAChBI,EAAW,EAAK,EAChB,MAAMS,EAAI,OAAO,WAAW,IAAMC,EAAAA,YAAYd,EAAM,EAAE,EAAGF,CAAO,EAChE,MAAO,IAAM,OAAO,aAAae,CAAC,CACpC,EAAG,CAACb,EAAM,KAAMA,EAAM,EAAE,CAAC,EAGzB,MAAMe,EAAa,IAAM,CACnBR,EAAM,SAAW,OACnB,OAAO,aAAaA,EAAM,OAAO,EACjCA,EAAM,QAAU,OAEpB,EACMS,EAAS,IAAM,CACf,CAAChB,EAAM,MAAQS,EAAU,UAAY,MACzCM,EAAA,EACAL,EAAU,QAAU,KAAK,IAAA,EACzBH,EAAM,QAAU,OAAO,WAAW,IAAMU,aAAWjB,EAAM,EAAE,EAAGS,EAAU,OAAO,EACjF,EACMS,EAAQ,IAAM,CACdX,EAAM,SAAW,OACrBQ,EAAA,EACAN,EAAU,SAAW,KAAK,IAAA,EAAQC,EAAU,QAC9C,EACAC,OAAAA,EAAAA,UAAU,KAGRF,EAAU,QAAUH,EACpBU,EAAA,EACOD,GAEN,CAACf,EAAM,KAAMM,CAAG,CAAC,EAGlBa,EAAAA,IAAC,MAAA,CACC,UAAWC,EAAO,KAClB,YAAWjB,EAAU,OAAS,QAC9B,gBAAeD,EACf,aAAcgB,EACd,aAAcF,EAEd,SAAAG,EAAAA,IAACE,EAAAA,MAAA,CACC,MAAOrB,EAAM,MACb,QAASA,EAAM,SAAW,YAC1B,KAAMA,EAAM,KACZ,OAAQA,EAAM,OACd,QAAS,IAAMiB,EAAAA,WAAWjB,EAAM,EAAE,EAClC,KAAK,SACL,UAAWoB,EAAO,MAEjB,SAAApB,EAAM,OAAA,CAAA,CACT,CAAA,CAGN,CCjEO,SAASsB,EAAQ,CAAE,SAAApB,EAAW,eAAgB,SAAAD,EAAW,KAAsB,CACpF,MAAMsB,EAASC,EAAAA,qBAAqBC,kBAAiBC,EAAAA,UAAWA,EAAAA,SAAS,EAEzE,OAAI,OAAO,SAAa,IAAoB,KAErCC,EAAAA,aACLR,EAAAA,IAAC,OAAI,UAAWC,EAAO,SAAU,gBAAelB,EAAU,YAAU,SACjE,SAAAqB,EAAO,IAAKV,GACXM,EAAAA,IAACpB,GAAqB,MAAOc,EAAG,SAAAZ,EAAoB,SAAAC,GAApCW,EAAE,EAAsD,CACzE,CAAA,CACH,EACA,SAAS,IAAA,CAEb"}
1
+ {"version":3,"file":"Toaster-fjyF8W3F.cjs","sources":["../src/components/Toast/ToastItem.tsx","../src/components/Toast/Toaster.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { Alert } from '../Alert'\nimport { closeToast, removeToast, type ToastPosition, type ToastRecord } from './toastStore'\nimport styles from './Toaster.module.css'\n\n/** Exit-animation duration (matches `--tz-duration`) — how long to keep a closing toast mounted. */\nconst EXIT_MS = 300\n\nexport interface ToastItemProps {\n toast: ToastRecord\n /** Fallback auto-dismiss delay when the toast doesn't set its own. */\n duration: number\n position: ToastPosition\n}\n\n/**\n * One rendered toast — an `Alert` wrapped with the enter/exit animation, the auto-dismiss timer\n * (paused while hovered), and the close wiring. Internal to `Toaster`.\n */\nexport function ToastItem({ toast, duration, position }: ToastItemProps) {\n const [visible, setVisible] = useState(false)\n const ttl = toast.duration ?? duration\n const timer = useRef<number | undefined>(undefined)\n const remaining = useRef(ttl)\n const startedAt = useRef(0)\n\n // enter — flip `visible` on the next frame so the transition runs\n useEffect(() => {\n const raf = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(raf)\n }, [])\n\n // exit — when the store marks this toast closing, animate out then remove it\n useEffect(() => {\n if (toast.open) return\n setVisible(false)\n const t = window.setTimeout(() => removeToast(toast.id), EXIT_MS)\n return () => window.clearTimeout(t)\n }, [toast.open, toast.id])\n\n // auto-dismiss timer, paused on hover (tracks the remaining time across pauses)\n const clearTimer = () => {\n if (timer.current != null) {\n window.clearTimeout(timer.current)\n timer.current = undefined\n }\n }\n const resume = () => {\n if (!toast.open || remaining.current === Infinity) return\n clearTimer()\n startedAt.current = Date.now()\n timer.current = window.setTimeout(() => closeToast(toast.id), remaining.current)\n }\n const pause = () => {\n if (timer.current == null) return\n clearTimer()\n remaining.current -= Date.now() - startedAt.current\n }\n useEffect(() => {\n // (re)start from the full duration on open, and whenever an update-by-id changes `duration`\n // (otherwise the original countdown keeps running against the stale ttl)\n remaining.current = ttl\n resume()\n return clearTimer\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toast.open, ttl])\n\n return (\n <div\n className={styles.item}\n data-open={visible ? 'true' : 'false'}\n data-position={position}\n onMouseEnter={pause}\n onMouseLeave={resume}\n >\n <Alert\n color={toast.color}\n variant={toast.variant ?? 'contained'}\n icon={toast.icon}\n action={toast.action}\n onClose={() => closeToast(toast.id)}\n role=\"status\"\n className={styles.alert}\n >\n {toast.message}\n </Alert>\n </div>\n )\n}\n","import { useSyncExternalStore } from 'react'\nimport { createPortal } from 'react-dom'\nimport { getToasts, subscribeToasts, type ToastPosition } from './toastStore'\nimport { ToastItem } from './ToastItem'\nimport styles from './Toaster.module.css'\n\nexport interface ToasterProps {\n /** Corner the toasts stack in. Defaults to `bottom-right`. */\n position?: ToastPosition\n /** Default auto-dismiss delay in ms; a per-toast `duration` overrides it. Defaults to `4000`. */\n duration?: number\n}\n\n/**\n * The toast viewport — mount it **once** near the app root. It portals to `<body>` at `--tz-z-toast`,\n * subscribes to the imperative `toast` store, and renders each toast as an animated, auto-dismissing\n * `Alert`. Drive it from anywhere with `toast.success('Saved')` / `toast.error(...)` / `toast.dismiss(id)`.\n *\n * @example\n * <Toaster position=\"bottom-right\" />\n * // …elsewhere:\n * toast.success('Saved')\n */\nexport function Toaster({ position = 'bottom-right', duration = 4000 }: ToasterProps) {\n const toasts = useSyncExternalStore(subscribeToasts, getToasts, getToasts)\n\n if (typeof document === 'undefined') return null\n\n return createPortal(\n <div className={styles.viewport} data-position={position} aria-live=\"polite\">\n {toasts.map((t) => (\n <ToastItem key={t.id} toast={t} duration={duration} position={position} />\n ))}\n </div>,\n document.body,\n )\n}\n"],"names":["EXIT_MS","ToastItem","toast","duration","position","visible","setVisible","useState","ttl","timer","useRef","remaining","startedAt","useEffect","raf","t","removeToast","clearTimer","resume","closeToast","pause","jsx","styles","Alert","Toaster","toasts","useSyncExternalStore","subscribeToasts","getToasts","createPortal"],"mappings":"gQAMMA,EAAU,IAaT,SAASC,EAAU,CAAE,MAAAC,EAAO,SAAAC,EAAU,SAAAC,GAA4B,CACvE,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtCC,EAAMN,EAAM,UAAYC,EACxBM,EAAQC,EAAAA,OAA2B,MAAS,EAC5CC,EAAYD,EAAAA,OAAOF,CAAG,EACtBI,EAAYF,EAAAA,OAAO,CAAC,EAG1BG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAM,sBAAsB,IAAMR,EAAW,EAAI,CAAC,EACxD,MAAO,IAAM,qBAAqBQ,CAAG,CACvC,EAAG,CAAA,CAAE,EAGLD,EAAAA,UAAU,IAAM,CACd,GAAIX,EAAM,KAAM,OAChBI,EAAW,EAAK,EAChB,MAAMS,EAAI,OAAO,WAAW,IAAMC,EAAAA,YAAYd,EAAM,EAAE,EAAGF,CAAO,EAChE,MAAO,IAAM,OAAO,aAAae,CAAC,CACpC,EAAG,CAACb,EAAM,KAAMA,EAAM,EAAE,CAAC,EAGzB,MAAMe,EAAa,IAAM,CACnBR,EAAM,SAAW,OACnB,OAAO,aAAaA,EAAM,OAAO,EACjCA,EAAM,QAAU,OAEpB,EACMS,EAAS,IAAM,CACf,CAAChB,EAAM,MAAQS,EAAU,UAAY,MACzCM,EAAA,EACAL,EAAU,QAAU,KAAK,IAAA,EACzBH,EAAM,QAAU,OAAO,WAAW,IAAMU,aAAWjB,EAAM,EAAE,EAAGS,EAAU,OAAO,EACjF,EACMS,EAAQ,IAAM,CACdX,EAAM,SAAW,OACrBQ,EAAA,EACAN,EAAU,SAAW,KAAK,IAAA,EAAQC,EAAU,QAC9C,EACAC,OAAAA,EAAAA,UAAU,KAGRF,EAAU,QAAUH,EACpBU,EAAA,EACOD,GAEN,CAACf,EAAM,KAAMM,CAAG,CAAC,EAGlBa,EAAAA,IAAC,MAAA,CACC,UAAWC,EAAO,KAClB,YAAWjB,EAAU,OAAS,QAC9B,gBAAeD,EACf,aAAcgB,EACd,aAAcF,EAEd,SAAAG,EAAAA,IAACE,EAAAA,MAAA,CACC,MAAOrB,EAAM,MACb,QAASA,EAAM,SAAW,YAC1B,KAAMA,EAAM,KACZ,OAAQA,EAAM,OACd,QAAS,IAAMiB,EAAAA,WAAWjB,EAAM,EAAE,EAClC,KAAK,SACL,UAAWoB,EAAO,MAEjB,SAAApB,EAAM,OAAA,CAAA,CACT,CAAA,CAGN,CCjEO,SAASsB,EAAQ,CAAE,SAAApB,EAAW,eAAgB,SAAAD,EAAW,KAAsB,CACpF,MAAMsB,EAASC,EAAAA,qBAAqBC,kBAAiBC,EAAAA,UAAWA,EAAAA,SAAS,EAEzE,OAAI,OAAO,SAAa,IAAoB,KAErCC,EAAAA,aACLR,EAAAA,IAAC,OAAI,UAAWC,EAAO,SAAU,gBAAelB,EAAU,YAAU,SACjE,SAAAqB,EAAO,IAAKV,GACXM,EAAAA,IAACpB,GAAqB,MAAOc,EAAG,SAAAZ,EAAoB,SAAAC,GAApCW,EAAE,EAAsD,CACzE,CAAA,CACH,EACA,SAAS,IAAA,CAEb"}
@@ -0,0 +1,152 @@
1
+ import { jsxs as O, jsx as K } from "react/jsx-runtime";
2
+ import { useId as V, useState as L, useRef as j, useCallback as X, useEffect as x, useLayoutEffect as J, cloneElement as Q } from "react";
3
+ import { createPortal as U } from "react-dom";
4
+ import { clsx as k } from "clsx";
5
+ const Y = "_root_1i027_4", Z = "_tooltip_1i027_13", D = "_arrow_1i027_41", g = "_top_1i027_49", tt = "_bottom_1i027_59", ot = "_left_1i027_69", et = "_right_1i027_79", b = {
6
+ root: Y,
7
+ tooltip: Z,
8
+ arrow: D,
9
+ top: g,
10
+ bottom: tt,
11
+ left: ot,
12
+ right: et
13
+ }, A = 8, f = 8, G = {
14
+ top: "bottom",
15
+ bottom: "top",
16
+ left: "right",
17
+ right: "left"
18
+ }, nt = 1e3, it = 10;
19
+ function st(o) {
20
+ try {
21
+ return o.matches(":focus-visible");
22
+ } catch {
23
+ return !0;
24
+ }
25
+ }
26
+ function rt(o, s, u) {
27
+ const l = window.innerWidth, v = window.innerHeight, m = (t) => t === "top" ? o.top - A - s.height >= f : t === "bottom" ? o.bottom + A + s.height <= v - f : t === "left" ? o.left - A - s.width >= f : o.right + A + s.width <= l - f, r = !m(u) && m(G[u]) ? G[u] : u, _ = (t, a, c) => t - a < f ? f - (t - a) : t + a > c - f ? c - f - (t + a) : 0;
28
+ if (r === "top" || r === "bottom") {
29
+ const t = o.left + o.width / 2;
30
+ return {
31
+ side: r,
32
+ x: t,
33
+ y: r === "top" ? o.top : o.bottom,
34
+ shift: _(t, s.width / 2, l)
35
+ };
36
+ }
37
+ const w = o.top + o.height / 2;
38
+ return {
39
+ side: r,
40
+ x: r === "left" ? o.left : o.right,
41
+ y: w,
42
+ shift: _(w, s.height / 2, v)
43
+ };
44
+ }
45
+ function lt({
46
+ content: o,
47
+ placement: s = "top",
48
+ color: u = "primary",
49
+ children: l,
50
+ className: v,
51
+ style: m,
52
+ onKeyDown: r,
53
+ ..._
54
+ }) {
55
+ const w = `${V()}-tooltip`, [t, a] = L(!1), [c, F] = L(!1), [I, R] = L(!1), [n, P] = L(null), T = j(null), $ = j(null), q = o != null && o !== "", i = X(() => {
56
+ const e = T.current, d = $.current;
57
+ !e || !d || P(
58
+ rt(
59
+ e.getBoundingClientRect(),
60
+ { width: d.offsetWidth, height: d.offsetHeight },
61
+ s
62
+ )
63
+ );
64
+ }, [s]);
65
+ x(() => {
66
+ t ? F(!0) : R(!1);
67
+ }, [t]), J(() => {
68
+ if (!t || !c) return;
69
+ i();
70
+ const e = requestAnimationFrame(() => R(!0));
71
+ return () => cancelAnimationFrame(e);
72
+ }, [t, c, i, o]), x(() => {
73
+ if (!t) return;
74
+ let e = 0, d = "", E = 0, z = 0;
75
+ const C = () => {
76
+ var M;
77
+ const p = (M = T.current) == null ? void 0 : M.getBoundingClientRect(), S = p ? `${p.left},${p.top},${p.width},${p.height}` : "";
78
+ S !== d ? (d = S, E = 0, i()) : E++, e = E < it && performance.now() < z ? requestAnimationFrame(C) : 0;
79
+ }, h = () => {
80
+ z = performance.now() + nt, E = 0, e || (e = requestAnimationFrame(C));
81
+ };
82
+ return h(), window.addEventListener("scroll", i, !0), window.addEventListener("resize", i), window.addEventListener("transitionrun", h, !0), window.addEventListener("animationstart", h, !0), window.addEventListener("transitionend", i, !0), window.addEventListener("animationend", i, !0), () => {
83
+ cancelAnimationFrame(e), window.removeEventListener("scroll", i, !0), window.removeEventListener("resize", i), window.removeEventListener("transitionrun", h, !0), window.removeEventListener("animationstart", h, !0), window.removeEventListener("transitionend", i, !0), window.removeEventListener("animationend", i, !0);
84
+ };
85
+ }, [t, i]), x(() => {
86
+ if (t || !c) return;
87
+ const e = window.setTimeout(() => F(!1), 400);
88
+ return () => window.clearTimeout(e);
89
+ }, [t, c]);
90
+ const B = (e) => {
91
+ st(e.target) && a(!0);
92
+ }, N = (e) => {
93
+ e.key === "Escape" && a(!1), r == null || r(e);
94
+ };
95
+ if (!q) return l;
96
+ const y = {
97
+ "--tz-btn-rgb": `var(--tz-color-${u}-rgb)`,
98
+ "--tz-btn-on": `var(--tz-color-${u}-contrast, #fff)`
99
+ }, W = (n == null ? void 0 : n.side) ?? s, H = Object.fromEntries(
100
+ Object.entries(m ?? {}).filter(([e]) => e.startsWith("--"))
101
+ );
102
+ return /* @__PURE__ */ O(
103
+ "span",
104
+ {
105
+ ref: T,
106
+ className: k(b.root, v),
107
+ style: { ...y, ...m },
108
+ onMouseEnter: () => a(!0),
109
+ onMouseLeave: () => a(!1),
110
+ onFocus: B,
111
+ onBlur: () => a(!1),
112
+ onKeyDown: N,
113
+ ..._,
114
+ children: [
115
+ t ? Q(l, {
116
+ "aria-describedby": w
117
+ }) : l,
118
+ c && typeof document < "u" && U(
119
+ /* @__PURE__ */ O(
120
+ "span",
121
+ {
122
+ ref: $,
123
+ role: "tooltip",
124
+ id: w,
125
+ className: k(b.tooltip, b[W]),
126
+ "data-open": t && I ? "true" : "false",
127
+ style: {
128
+ ...y,
129
+ ...H,
130
+ top: (n == null ? void 0 : n.y) ?? 0,
131
+ left: (n == null ? void 0 : n.x) ?? 0,
132
+ "--tz-tooltip-shift": `${(n == null ? void 0 : n.shift) ?? 0}px`
133
+ },
134
+ onTransitionEnd: () => {
135
+ t || F(!1);
136
+ },
137
+ children: [
138
+ o,
139
+ /* @__PURE__ */ K("span", { className: b.arrow, "aria-hidden": "true" })
140
+ ]
141
+ }
142
+ ),
143
+ document.body
144
+ )
145
+ ]
146
+ }
147
+ );
148
+ }
149
+ export {
150
+ lt as T
151
+ };
152
+ //# sourceMappingURL=Tooltip-BbT0uNzy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip-BbT0uNzy.js","sources":["../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import {\n cloneElement,\n type FocusEvent,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { clsx } from 'clsx'\nimport type { ThemeColor } from '../../theme'\nimport styles from './Tooltip.module.css'\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right'\n\nexport interface TooltipProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'content' | 'color'> {\n /** The tooltip text/content shown on hover or keyboard focus. Empty content renders no tooltip. */\n content: ReactNode\n /**\n * Which side of the trigger the tooltip appears on. Defaults to `top`. Flips to the opposite side when\n * the preferred one has no room in the viewport.\n */\n placement?: TooltipPlacement\n /** Theme palette token for the fill (label uses its contrast color). Defaults to `primary`. */\n color?: ThemeColor\n /** A single focusable element to attach the tooltip to (e.g. a `Button` or `IconButton`). */\n children: ReactElement\n}\n\n/** Bubble ↔ trigger gap (the CSS margin, `--tz-space-xs`) — used here only to decide whether a side fits. */\nconst GAP = 8\n/** Minimum distance kept between the bubble and the viewport edge. */\nconst EDGE = 8\nconst OPPOSITE: Record<TooltipPlacement, TooltipPlacement> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n}\n\n/** How long the trigger is tracked frame-by-frame after an open or an animation start, at most (ms). */\nconst TRACK_MAX = 1000\n/** Tracking stops once the trigger hasn't moved for this many consecutive frames. */\nconst TRACK_STILL_FRAMES = 10\n\n/**\n * Keyboard focus — the focused element matches `:focus-visible` (Tab, arrow keys), as opposed to focus moved\n * by code (a modal's initial focus, a form's scroll-to-error, a menu restoring focus) or by a mouse click.\n * Engines without `:focus-visible` throw on the selector — they keep the old open-on-any-focus behavior.\n */\nfunction isKeyboardFocus(element: Element): boolean {\n try {\n return element.matches(':focus-visible')\n } catch {\n return true\n }\n}\n\ninterface TooltipGeometry {\n side: TooltipPlacement\n /** The anchor point on the trigger's edge (viewport px) — CSS offsets the bubble from it. */\n x: number\n y: number\n /** Cross-axis nudge that keeps the bubble inside the viewport (the arrow counter-shifts). */\n shift: number\n}\n\n/**\n * Where the bubble goes: the preferred side unless only the opposite one fits, anchored at the middle of\n * that trigger edge, nudged along the cross axis so it never runs off-screen.\n */\nfunction computeGeometry(\n trigger: DOMRect,\n bubble: { width: number; height: number },\n placement: TooltipPlacement,\n): TooltipGeometry {\n const vw = window.innerWidth\n const vh = window.innerHeight\n const fits = (side: TooltipPlacement) =>\n side === 'top'\n ? trigger.top - GAP - bubble.height >= EDGE\n : side === 'bottom'\n ? trigger.bottom + GAP + bubble.height <= vh - EDGE\n : side === 'left'\n ? trigger.left - GAP - bubble.width >= EDGE\n : trigger.right + GAP + bubble.width <= vw - EDGE\n const side = !fits(placement) && fits(OPPOSITE[placement]) ? OPPOSITE[placement] : placement\n\n const clampShift = (center: number, half: number, size: number) =>\n center - half < EDGE\n ? EDGE - (center - half)\n : center + half > size - EDGE\n ? size - EDGE - (center + half)\n : 0\n\n if (side === 'top' || side === 'bottom') {\n const x = trigger.left + trigger.width / 2\n return {\n side,\n x,\n y: side === 'top' ? trigger.top : trigger.bottom,\n shift: clampShift(x, bubble.width / 2, vw),\n }\n }\n const y = trigger.top + trigger.height / 2\n return {\n side,\n x: side === 'left' ? trigger.left : trigger.right,\n y,\n shift: clampShift(y, bubble.height / 2, vh),\n }\n}\n\n/**\n * Shows a small floating label on hover or keyboard focus of its child, with an arrow pointing at\n * the trigger. Wrap a single element: `<Tooltip content=\"Save\"><IconButton…/></Tooltip>`. Opens on\n * `mouseenter` or **keyboard** focus (the trigger matches `:focus-visible` — focus moved by code or a\n * click doesn't open it), closes on `mouseleave`/`blur`/`Escape`. The child gets `aria-describedby`\n * while open (the label has `role=\"tooltip\"`). The bubble is **portaled to `<body>`** with fixed\n * positioning, so a scrolling / `overflow: hidden` ancestor (a `Table`'s scroll area, a `Modal` body)\n * never clips it; it flips to the opposite side when the preferred one has no room, stays inside the\n * viewport, follows the trigger on scroll / resize and through a transform animation (a drawer sliding\n * in), and is mounted only while shown. Token-only styling\n * via the shared `--tz-btn-rgb` pattern — `color` (default `primary`) sets the fill and its contrast\n * label, flipping with the theme.\n */\nexport function Tooltip({\n content,\n placement = 'top',\n color = 'primary',\n children,\n className,\n style,\n onKeyDown,\n ...props\n}: TooltipProps) {\n const tooltipId = `${useId()}-tooltip`\n const [open, setOpen] = useState(false)\n // mounted spans the fade-out too; `shown` drives the CSS fade (one frame after the first measure)\n const [mounted, setMounted] = useState(false)\n const [shown, setShown] = useState(false)\n const [geometry, setGeometry] = useState<TooltipGeometry | null>(null)\n const rootRef = useRef<HTMLSpanElement | null>(null)\n const bubbleRef = useRef<HTMLSpanElement | null>(null)\n const hasContent = content !== null && content !== undefined && content !== ''\n\n const measure = useCallback(() => {\n const root = rootRef.current\n const bubble = bubbleRef.current\n if (!root || !bubble) return\n setGeometry(\n computeGeometry(\n root.getBoundingClientRect(),\n { width: bubble.offsetWidth, height: bubble.offsetHeight },\n placement,\n ),\n )\n }, [placement])\n\n useEffect(() => {\n if (open) setMounted(true)\n else setShown(false)\n }, [open])\n\n // measure before paint, then fade in on the next frame (so the bubble never flashes at 0,0)\n useLayoutEffect(() => {\n if (!open || !mounted) return\n measure()\n const frame = requestAnimationFrame(() => setShown(true))\n return () => cancelAnimationFrame(frame)\n }, [open, mounted, measure, content])\n\n // follow the trigger while open — any scroll (capture: a table's scroll area too) or resize, plus a\n // trigger moved by a CSS transform, which fires neither (a drawer sliding in, a modal scaling in): right\n // after opening, and whenever a transition / animation starts anywhere, the trigger's rect is tracked\n // frame by frame until it has been still for a few frames (capped), and re-measured when one ends. Only\n // an OPEN tooltip listens or tracks — nothing runs while closed.\n useEffect(() => {\n if (!open) return\n let frame = 0\n let last = ''\n let still = 0\n let until = 0\n const step = () => {\n const rect = rootRef.current?.getBoundingClientRect()\n const key = rect ? `${rect.left},${rect.top},${rect.width},${rect.height}` : ''\n if (key !== last) {\n last = key\n still = 0\n measure()\n } else {\n still++\n }\n frame =\n still < TRACK_STILL_FRAMES && performance.now() < until ? requestAnimationFrame(step) : 0\n }\n const track = () => {\n until = performance.now() + TRACK_MAX\n still = 0\n if (!frame) frame = requestAnimationFrame(step)\n }\n track()\n window.addEventListener('scroll', measure, true)\n window.addEventListener('resize', measure)\n window.addEventListener('transitionrun', track, true)\n window.addEventListener('animationstart', track, true)\n window.addEventListener('transitionend', measure, true)\n window.addEventListener('animationend', measure, true)\n return () => {\n cancelAnimationFrame(frame)\n window.removeEventListener('scroll', measure, true)\n window.removeEventListener('resize', measure)\n window.removeEventListener('transitionrun', track, true)\n window.removeEventListener('animationstart', track, true)\n window.removeEventListener('transitionend', measure, true)\n window.removeEventListener('animationend', measure, true)\n }\n }, [open, measure])\n\n // unmount once faded out; the timer covers a transition that never fires (no CSS, reduced motion)\n useEffect(() => {\n if (open || !mounted) return\n const timer = window.setTimeout(() => setMounted(false), 400)\n return () => window.clearTimeout(timer)\n }, [open, mounted])\n\n // open on KEYBOARD focus only — focus moved by code or a click shouldn't pop a tooltip nobody asked for\n const handleFocus = (event: FocusEvent<HTMLSpanElement>) => {\n if (isKeyboardFocus(event.target)) setOpen(true)\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n if (event.key === 'Escape') setOpen(false)\n onKeyDown?.(event)\n }\n\n if (!hasContent) return children\n\n const tint = {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-btn-on': `var(--tz-color-${color}-contrast, #fff)`,\n } as CSSProperties\n const side = geometry?.side ?? placement\n // the bubble is portaled out of the wrapper, so CSS variables set through `style` (e.g. a custom\n // `--tz-btn-rgb` / `--tz-btn-on` tint, as CodeBlock's white pill does) are copied onto it explicitly\n const bubbleVars = Object.fromEntries(\n Object.entries(style ?? {}).filter(([property]) => property.startsWith('--')),\n ) as CSSProperties\n\n return (\n <span\n ref={rootRef}\n className={clsx(styles.root, className)}\n style={{ ...tint, ...style }}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n onFocus={handleFocus}\n onBlur={() => setOpen(false)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {open\n ? cloneElement(children as ReactElement<{ 'aria-describedby'?: string }>, {\n 'aria-describedby': tooltipId,\n })\n : children}\n {mounted &&\n typeof document !== 'undefined' &&\n createPortal(\n <span\n ref={bubbleRef}\n role=\"tooltip\"\n id={tooltipId}\n className={clsx(styles.tooltip, styles[side])}\n data-open={open && shown ? 'true' : 'false'}\n style={\n {\n ...tint,\n ...bubbleVars,\n top: geometry?.y ?? 0,\n left: geometry?.x ?? 0,\n '--tz-tooltip-shift': `${geometry?.shift ?? 0}px`,\n } as CSSProperties\n }\n onTransitionEnd={() => {\n if (!open) setMounted(false)\n }}\n >\n {content}\n <span className={styles.arrow} aria-hidden=\"true\" />\n </span>,\n document.body,\n )}\n </span>\n )\n}\n"],"names":["GAP","EDGE","OPPOSITE","TRACK_MAX","TRACK_STILL_FRAMES","isKeyboardFocus","element","computeGeometry","trigger","bubble","placement","vw","vh","fits","side","clampShift","center","half","size","x","y","Tooltip","content","color","children","className","style","onKeyDown","props","tooltipId","useId","open","setOpen","useState","mounted","setMounted","shown","setShown","geometry","setGeometry","rootRef","useRef","bubbleRef","hasContent","measure","useCallback","root","useEffect","useLayoutEffect","frame","last","still","until","step","rect","_a","key","track","timer","handleFocus","event","handleKeyDown","tint","bubbleVars","property","jsxs","clsx","styles","cloneElement","createPortal"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const F=require("react/jsx-runtime"),n=require("react"),W=require("react-dom"),C=require("clsx"),H="_root_1i027_4",K="_tooltip_1i027_13",V="_arrow_1i027_41",X="_top_1i027_49",D="_bottom_1i027_59",J="_left_1i027_69",Q="_right_1i027_79",b={root:H,tooltip:K,arrow:V,top:X,bottom:D,left:J,right:Q},x=8,f=8,M={top:"bottom",bottom:"top",left:"right",right:"left"},U=1e3,Y=10;function Z(e){try{return e.matches(":focus-visible")}catch{return!0}}function g(e,r,l){const d=window.innerWidth,v=window.innerHeight,h=t=>t==="top"?e.top-x-r.height>=f:t==="bottom"?e.bottom+x+r.height<=v-f:t==="left"?e.left-x-r.width>=f:e.right+x+r.width<=d-f,a=!h(l)&&h(M[l])?M[l]:l,_=(t,c,u)=>t-c<f?f-(t-c):t+c>u-f?u-f-(t+c):0;if(a==="top"||a==="bottom"){const t=e.left+e.width/2;return{side:a,x:t,y:a==="top"?e.top:e.bottom,shift:_(t,r.width/2,d)}}const m=e.top+e.height/2;return{side:a,x:a==="left"?e.left:e.right,y:m,shift:_(m,r.height/2,v)}}function tt({content:e,placement:r="top",color:l="primary",children:d,className:v,style:h,onKeyDown:a,..._}){const m=`${n.useId()}-tooltip`,[t,c]=n.useState(!1),[u,A]=n.useState(!1),[O,S]=n.useState(!1),[s,k]=n.useState(null),R=n.useRef(null),T=n.useRef(null),G=e!=null&&e!=="",i=n.useCallback(()=>{const o=R.current,w=T.current;!o||!w||k(g(o.getBoundingClientRect(),{width:w.offsetWidth,height:w.offsetHeight},r))},[r]);n.useEffect(()=>{t?A(!0):S(!1)},[t]),n.useLayoutEffect(()=>{if(!t||!u)return;i();const o=requestAnimationFrame(()=>S(!0));return()=>cancelAnimationFrame(o)},[t,u,i,e]),n.useEffect(()=>{if(!t)return;let o=0,w="",L=0,q=0;const y=()=>{var z;const E=(z=R.current)==null?void 0:z.getBoundingClientRect(),j=E?`${E.left},${E.top},${E.width},${E.height}`:"";j!==w?(w=j,L=0,i()):L++,o=L<Y&&performance.now()<q?requestAnimationFrame(y):0},p=()=>{q=performance.now()+U,L=0,o||(o=requestAnimationFrame(y))};return p(),window.addEventListener("scroll",i,!0),window.addEventListener("resize",i),window.addEventListener("transitionrun",p,!0),window.addEventListener("animationstart",p,!0),window.addEventListener("transitionend",i,!0),window.addEventListener("animationend",i,!0),()=>{cancelAnimationFrame(o),window.removeEventListener("scroll",i,!0),window.removeEventListener("resize",i),window.removeEventListener("transitionrun",p,!0),window.removeEventListener("animationstart",p,!0),window.removeEventListener("transitionend",i,!0),window.removeEventListener("animationend",i,!0)}},[t,i]),n.useEffect(()=>{if(t||!u)return;const o=window.setTimeout(()=>A(!1),400);return()=>window.clearTimeout(o)},[t,u]);const I=o=>{Z(o.target)&&c(!0)},P=o=>{o.key==="Escape"&&c(!1),a==null||a(o)};if(!G)return d;const $={"--tz-btn-rgb":`var(--tz-color-${l}-rgb)`,"--tz-btn-on":`var(--tz-color-${l}-contrast, #fff)`},B=(s==null?void 0:s.side)??r,N=Object.fromEntries(Object.entries(h??{}).filter(([o])=>o.startsWith("--")));return F.jsxs("span",{ref:R,className:C.clsx(b.root,v),style:{...$,...h},onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),onFocus:I,onBlur:()=>c(!1),onKeyDown:P,..._,children:[t?n.cloneElement(d,{"aria-describedby":m}):d,u&&typeof document<"u"&&W.createPortal(F.jsxs("span",{ref:T,role:"tooltip",id:m,className:C.clsx(b.tooltip,b[B]),"data-open":t&&O?"true":"false",style:{...$,...N,top:(s==null?void 0:s.y)??0,left:(s==null?void 0:s.x)??0,"--tz-tooltip-shift":`${(s==null?void 0:s.shift)??0}px`},onTransitionEnd:()=>{t||A(!1)},children:[e,F.jsx("span",{className:b.arrow,"aria-hidden":"true"})]}),document.body)]})}exports.Tooltip=tt;
2
+ //# sourceMappingURL=Tooltip-DmMq5R1x.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip-DmMq5R1x.cjs","sources":["../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import {\n cloneElement,\n type FocusEvent,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { clsx } from 'clsx'\nimport type { ThemeColor } from '../../theme'\nimport styles from './Tooltip.module.css'\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right'\n\nexport interface TooltipProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'content' | 'color'> {\n /** The tooltip text/content shown on hover or keyboard focus. Empty content renders no tooltip. */\n content: ReactNode\n /**\n * Which side of the trigger the tooltip appears on. Defaults to `top`. Flips to the opposite side when\n * the preferred one has no room in the viewport.\n */\n placement?: TooltipPlacement\n /** Theme palette token for the fill (label uses its contrast color). Defaults to `primary`. */\n color?: ThemeColor\n /** A single focusable element to attach the tooltip to (e.g. a `Button` or `IconButton`). */\n children: ReactElement\n}\n\n/** Bubble ↔ trigger gap (the CSS margin, `--tz-space-xs`) — used here only to decide whether a side fits. */\nconst GAP = 8\n/** Minimum distance kept between the bubble and the viewport edge. */\nconst EDGE = 8\nconst OPPOSITE: Record<TooltipPlacement, TooltipPlacement> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n}\n\n/** How long the trigger is tracked frame-by-frame after an open or an animation start, at most (ms). */\nconst TRACK_MAX = 1000\n/** Tracking stops once the trigger hasn't moved for this many consecutive frames. */\nconst TRACK_STILL_FRAMES = 10\n\n/**\n * Keyboard focus — the focused element matches `:focus-visible` (Tab, arrow keys), as opposed to focus moved\n * by code (a modal's initial focus, a form's scroll-to-error, a menu restoring focus) or by a mouse click.\n * Engines without `:focus-visible` throw on the selector — they keep the old open-on-any-focus behavior.\n */\nfunction isKeyboardFocus(element: Element): boolean {\n try {\n return element.matches(':focus-visible')\n } catch {\n return true\n }\n}\n\ninterface TooltipGeometry {\n side: TooltipPlacement\n /** The anchor point on the trigger's edge (viewport px) — CSS offsets the bubble from it. */\n x: number\n y: number\n /** Cross-axis nudge that keeps the bubble inside the viewport (the arrow counter-shifts). */\n shift: number\n}\n\n/**\n * Where the bubble goes: the preferred side unless only the opposite one fits, anchored at the middle of\n * that trigger edge, nudged along the cross axis so it never runs off-screen.\n */\nfunction computeGeometry(\n trigger: DOMRect,\n bubble: { width: number; height: number },\n placement: TooltipPlacement,\n): TooltipGeometry {\n const vw = window.innerWidth\n const vh = window.innerHeight\n const fits = (side: TooltipPlacement) =>\n side === 'top'\n ? trigger.top - GAP - bubble.height >= EDGE\n : side === 'bottom'\n ? trigger.bottom + GAP + bubble.height <= vh - EDGE\n : side === 'left'\n ? trigger.left - GAP - bubble.width >= EDGE\n : trigger.right + GAP + bubble.width <= vw - EDGE\n const side = !fits(placement) && fits(OPPOSITE[placement]) ? OPPOSITE[placement] : placement\n\n const clampShift = (center: number, half: number, size: number) =>\n center - half < EDGE\n ? EDGE - (center - half)\n : center + half > size - EDGE\n ? size - EDGE - (center + half)\n : 0\n\n if (side === 'top' || side === 'bottom') {\n const x = trigger.left + trigger.width / 2\n return {\n side,\n x,\n y: side === 'top' ? trigger.top : trigger.bottom,\n shift: clampShift(x, bubble.width / 2, vw),\n }\n }\n const y = trigger.top + trigger.height / 2\n return {\n side,\n x: side === 'left' ? trigger.left : trigger.right,\n y,\n shift: clampShift(y, bubble.height / 2, vh),\n }\n}\n\n/**\n * Shows a small floating label on hover or keyboard focus of its child, with an arrow pointing at\n * the trigger. Wrap a single element: `<Tooltip content=\"Save\"><IconButton…/></Tooltip>`. Opens on\n * `mouseenter` or **keyboard** focus (the trigger matches `:focus-visible` — focus moved by code or a\n * click doesn't open it), closes on `mouseleave`/`blur`/`Escape`. The child gets `aria-describedby`\n * while open (the label has `role=\"tooltip\"`). The bubble is **portaled to `<body>`** with fixed\n * positioning, so a scrolling / `overflow: hidden` ancestor (a `Table`'s scroll area, a `Modal` body)\n * never clips it; it flips to the opposite side when the preferred one has no room, stays inside the\n * viewport, follows the trigger on scroll / resize and through a transform animation (a drawer sliding\n * in), and is mounted only while shown. Token-only styling\n * via the shared `--tz-btn-rgb` pattern — `color` (default `primary`) sets the fill and its contrast\n * label, flipping with the theme.\n */\nexport function Tooltip({\n content,\n placement = 'top',\n color = 'primary',\n children,\n className,\n style,\n onKeyDown,\n ...props\n}: TooltipProps) {\n const tooltipId = `${useId()}-tooltip`\n const [open, setOpen] = useState(false)\n // mounted spans the fade-out too; `shown` drives the CSS fade (one frame after the first measure)\n const [mounted, setMounted] = useState(false)\n const [shown, setShown] = useState(false)\n const [geometry, setGeometry] = useState<TooltipGeometry | null>(null)\n const rootRef = useRef<HTMLSpanElement | null>(null)\n const bubbleRef = useRef<HTMLSpanElement | null>(null)\n const hasContent = content !== null && content !== undefined && content !== ''\n\n const measure = useCallback(() => {\n const root = rootRef.current\n const bubble = bubbleRef.current\n if (!root || !bubble) return\n setGeometry(\n computeGeometry(\n root.getBoundingClientRect(),\n { width: bubble.offsetWidth, height: bubble.offsetHeight },\n placement,\n ),\n )\n }, [placement])\n\n useEffect(() => {\n if (open) setMounted(true)\n else setShown(false)\n }, [open])\n\n // measure before paint, then fade in on the next frame (so the bubble never flashes at 0,0)\n useLayoutEffect(() => {\n if (!open || !mounted) return\n measure()\n const frame = requestAnimationFrame(() => setShown(true))\n return () => cancelAnimationFrame(frame)\n }, [open, mounted, measure, content])\n\n // follow the trigger while open — any scroll (capture: a table's scroll area too) or resize, plus a\n // trigger moved by a CSS transform, which fires neither (a drawer sliding in, a modal scaling in): right\n // after opening, and whenever a transition / animation starts anywhere, the trigger's rect is tracked\n // frame by frame until it has been still for a few frames (capped), and re-measured when one ends. Only\n // an OPEN tooltip listens or tracks — nothing runs while closed.\n useEffect(() => {\n if (!open) return\n let frame = 0\n let last = ''\n let still = 0\n let until = 0\n const step = () => {\n const rect = rootRef.current?.getBoundingClientRect()\n const key = rect ? `${rect.left},${rect.top},${rect.width},${rect.height}` : ''\n if (key !== last) {\n last = key\n still = 0\n measure()\n } else {\n still++\n }\n frame =\n still < TRACK_STILL_FRAMES && performance.now() < until ? requestAnimationFrame(step) : 0\n }\n const track = () => {\n until = performance.now() + TRACK_MAX\n still = 0\n if (!frame) frame = requestAnimationFrame(step)\n }\n track()\n window.addEventListener('scroll', measure, true)\n window.addEventListener('resize', measure)\n window.addEventListener('transitionrun', track, true)\n window.addEventListener('animationstart', track, true)\n window.addEventListener('transitionend', measure, true)\n window.addEventListener('animationend', measure, true)\n return () => {\n cancelAnimationFrame(frame)\n window.removeEventListener('scroll', measure, true)\n window.removeEventListener('resize', measure)\n window.removeEventListener('transitionrun', track, true)\n window.removeEventListener('animationstart', track, true)\n window.removeEventListener('transitionend', measure, true)\n window.removeEventListener('animationend', measure, true)\n }\n }, [open, measure])\n\n // unmount once faded out; the timer covers a transition that never fires (no CSS, reduced motion)\n useEffect(() => {\n if (open || !mounted) return\n const timer = window.setTimeout(() => setMounted(false), 400)\n return () => window.clearTimeout(timer)\n }, [open, mounted])\n\n // open on KEYBOARD focus only — focus moved by code or a click shouldn't pop a tooltip nobody asked for\n const handleFocus = (event: FocusEvent<HTMLSpanElement>) => {\n if (isKeyboardFocus(event.target)) setOpen(true)\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n if (event.key === 'Escape') setOpen(false)\n onKeyDown?.(event)\n }\n\n if (!hasContent) return children\n\n const tint = {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-btn-on': `var(--tz-color-${color}-contrast, #fff)`,\n } as CSSProperties\n const side = geometry?.side ?? placement\n // the bubble is portaled out of the wrapper, so CSS variables set through `style` (e.g. a custom\n // `--tz-btn-rgb` / `--tz-btn-on` tint, as CodeBlock's white pill does) are copied onto it explicitly\n const bubbleVars = Object.fromEntries(\n Object.entries(style ?? {}).filter(([property]) => property.startsWith('--')),\n ) as CSSProperties\n\n return (\n <span\n ref={rootRef}\n className={clsx(styles.root, className)}\n style={{ ...tint, ...style }}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n onFocus={handleFocus}\n onBlur={() => setOpen(false)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {open\n ? cloneElement(children as ReactElement<{ 'aria-describedby'?: string }>, {\n 'aria-describedby': tooltipId,\n })\n : children}\n {mounted &&\n typeof document !== 'undefined' &&\n createPortal(\n <span\n ref={bubbleRef}\n role=\"tooltip\"\n id={tooltipId}\n className={clsx(styles.tooltip, styles[side])}\n data-open={open && shown ? 'true' : 'false'}\n style={\n {\n ...tint,\n ...bubbleVars,\n top: geometry?.y ?? 0,\n left: geometry?.x ?? 0,\n '--tz-tooltip-shift': `${geometry?.shift ?? 0}px`,\n } as CSSProperties\n }\n onTransitionEnd={() => {\n if (!open) setMounted(false)\n }}\n >\n {content}\n <span className={styles.arrow} aria-hidden=\"true\" />\n </span>,\n document.body,\n )}\n </span>\n )\n}\n"],"names":["GAP","EDGE","OPPOSITE","TRACK_MAX","TRACK_STILL_FRAMES","isKeyboardFocus","element","computeGeometry","trigger","bubble","placement","vw","vh","fits","side","clampShift","center","half","size","x","y","Tooltip","content","color","children","className","style","onKeyDown","props","tooltipId","useId","open","setOpen","useState","mounted","setMounted","shown","setShown","geometry","setGeometry","rootRef","useRef","bubbleRef","hasContent","measure","useCallback","root","useEffect","useLayoutEffect","frame","last","still","until","step","rect","_a","key","track","timer","handleFocus","event","handleKeyDown","tint","bubbleVars","property","jsxs","clsx","styles","cloneElement","createPortal"],"mappings":"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"}