@techzyapp/ui-library 1.0.4 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/dist/{Alert-BQpA48PY.js → Alert-BL8hDdEl.js} +3 -3
  2. package/dist/{Alert-BQpA48PY.js.map → Alert-BL8hDdEl.js.map} +1 -1
  3. package/dist/{Alert-DKIjM-9x.cjs → Alert-C9yBIMq0.cjs} +2 -2
  4. package/dist/{Alert-DKIjM-9x.cjs.map → Alert-C9yBIMq0.cjs.map} +1 -1
  5. package/dist/{Breadcrumbs-Bx5UgwDy.js → Breadcrumbs-BC_QSlJZ.js} +3 -3
  6. package/dist/{Breadcrumbs-Bx5UgwDy.js.map → Breadcrumbs-BC_QSlJZ.js.map} +1 -1
  7. package/dist/{Breadcrumbs-CHONper7.cjs → Breadcrumbs-DhBx2UgK.cjs} +2 -2
  8. package/dist/{Breadcrumbs-CHONper7.cjs.map → Breadcrumbs-DhBx2UgK.cjs.map} +1 -1
  9. package/dist/{Button-DhEv0YFk.js → Button-BT8XmR_T.js} +2 -2
  10. package/dist/{Button-DhEv0YFk.js.map → Button-BT8XmR_T.js.map} +1 -1
  11. package/dist/{Button-D4bfVNNa.cjs → Button-C_HPI97g.cjs} +2 -2
  12. package/dist/{Button-D4bfVNNa.cjs.map → Button-C_HPI97g.cjs.map} +1 -1
  13. package/dist/{Calendar-Bh317SaV.js → Calendar-B9mXn_zD.js} +3 -3
  14. package/dist/{Calendar-Bh317SaV.js.map → Calendar-B9mXn_zD.js.map} +1 -1
  15. package/dist/{Calendar-C8uNezI-.cjs → Calendar-CCCife5b.cjs} +2 -2
  16. package/dist/{Calendar-C8uNezI-.cjs.map → Calendar-CCCife5b.cjs.map} +1 -1
  17. package/dist/{Card-DzClqJuu.js → Card-DHPAefzg.js} +2 -2
  18. package/dist/{Card-DzClqJuu.js.map → Card-DHPAefzg.js.map} +1 -1
  19. package/dist/{Card-CfyaerZZ.cjs → Card-DfVntHqn.cjs} +2 -2
  20. package/dist/{Card-CfyaerZZ.cjs.map → Card-DfVntHqn.cjs.map} +1 -1
  21. package/dist/{Chip-DSrdXLBU.cjs → Chip-BoHt3WYS.cjs} +2 -2
  22. package/dist/{Chip-DSrdXLBU.cjs.map → Chip-BoHt3WYS.cjs.map} +1 -1
  23. package/dist/{Chip-Cfo0v3Z8.js → Chip-DX3QECcs.js} +2 -2
  24. package/dist/{Chip-Cfo0v3Z8.js.map → Chip-DX3QECcs.js.map} +1 -1
  25. package/dist/{CodeBlock-BWxQyKRo.js → CodeBlock-CPWEOym2.js} +3 -3
  26. package/dist/{CodeBlock-BWxQyKRo.js.map → CodeBlock-CPWEOym2.js.map} +1 -1
  27. package/dist/{CodeBlock-CgXOjKS-.cjs → CodeBlock-DKhIGQBg.cjs} +2 -2
  28. package/dist/{CodeBlock-CgXOjKS-.cjs.map → CodeBlock-DKhIGQBg.cjs.map} +1 -1
  29. package/dist/{Col-D2TfZKiM.js → Col-B51RlwWP.js} +2 -2
  30. package/dist/{Col-D2TfZKiM.js.map → Col-B51RlwWP.js.map} +1 -1
  31. package/dist/{Col-R5mAy8T9.cjs → Col-BdQeyKEX.cjs} +2 -2
  32. package/dist/{Col-R5mAy8T9.cjs.map → Col-BdQeyKEX.cjs.map} +1 -1
  33. package/dist/{ColorPicker-2udt1ORM.js → ColorPicker-2qD8vZkR.js} +3 -3
  34. package/dist/{ColorPicker-2udt1ORM.js.map → ColorPicker-2qD8vZkR.js.map} +1 -1
  35. package/dist/{ColorPicker-BwmaXCOy.cjs → ColorPicker-BAJWvC3h.cjs} +2 -2
  36. package/dist/{ColorPicker-BwmaXCOy.cjs.map → ColorPicker-BAJWvC3h.cjs.map} +1 -1
  37. package/dist/{ColorPickerPanel-ByB1mLSi.cjs → ColorPickerPanel-CkB2pNnX.cjs} +2 -2
  38. package/dist/{ColorPickerPanel-ByB1mLSi.cjs.map → ColorPickerPanel-CkB2pNnX.cjs.map} +1 -1
  39. package/dist/{ColorPickerPanel-BM9OwDDE.js → ColorPickerPanel-CovWDIRt.js} +2 -2
  40. package/dist/{ColorPickerPanel-BM9OwDDE.js.map → ColorPickerPanel-CovWDIRt.js.map} +1 -1
  41. package/dist/ConfigProvider-DFy6pL-C.cjs +2 -0
  42. package/dist/ConfigProvider-DFy6pL-C.cjs.map +1 -0
  43. package/dist/ConfigProvider-sEZzNTeU.js +296 -0
  44. package/dist/ConfigProvider-sEZzNTeU.js.map +1 -0
  45. package/dist/DashedButton-DeiALUPA.js +59 -0
  46. package/dist/DashedButton-DeiALUPA.js.map +1 -0
  47. package/dist/DashedButton-q7AOqKUE.cjs +2 -0
  48. package/dist/DashedButton-q7AOqKUE.cjs.map +1 -0
  49. package/dist/{DatePicker-WM9TC6L_.js → DatePicker-BVHriq5B.js} +4 -4
  50. package/dist/{DatePicker-WM9TC6L_.js.map → DatePicker-BVHriq5B.js.map} +1 -1
  51. package/dist/{DatePicker-DF4Epkn8.cjs → DatePicker-TLaQ3ZyB.cjs} +2 -2
  52. package/dist/{DatePicker-DF4Epkn8.cjs.map → DatePicker-TLaQ3ZyB.cjs.map} +1 -1
  53. package/dist/{DateTimePicker-DBtcWK0F.js → DateTimePicker-BWxsgyGB.js} +7 -7
  54. package/dist/{DateTimePicker-DBtcWK0F.js.map → DateTimePicker-BWxsgyGB.js.map} +1 -1
  55. package/dist/{DateTimePicker-C557OjBU.cjs → DateTimePicker-Dq2jJ2yb.cjs} +2 -2
  56. package/dist/{DateTimePicker-C557OjBU.cjs.map → DateTimePicker-Dq2jJ2yb.cjs.map} +1 -1
  57. package/dist/{Dropdown-DKAXue5_.js → Dropdown-FfkmluRu.js} +2 -2
  58. package/dist/{Dropdown-DKAXue5_.js.map → Dropdown-FfkmluRu.js.map} +1 -1
  59. package/dist/{Dropdown-DygP50OB.cjs → Dropdown-Ui7h2TGd.cjs} +2 -2
  60. package/dist/{Dropdown-DygP50OB.cjs.map → Dropdown-Ui7h2TGd.cjs.map} +1 -1
  61. package/dist/{EmptyState-CCCpZ-ZA.cjs → EmptyState-B2WgeL-H.cjs} +2 -2
  62. package/dist/{EmptyState-CCCpZ-ZA.cjs.map → EmptyState-B2WgeL-H.cjs.map} +1 -1
  63. package/dist/{EmptyState-CetM49vk.js → EmptyState-D8eUxb8v.js} +2 -2
  64. package/dist/{EmptyState-CetM49vk.js.map → EmptyState-D8eUxb8v.js.map} +1 -1
  65. package/dist/{FileUploader-VtmmwUFE.js → FileUploader-I0G-2WSe.js} +5 -5
  66. package/dist/{FileUploader-VtmmwUFE.js.map → FileUploader-I0G-2WSe.js.map} +1 -1
  67. package/dist/{FileUploader-B4TJHyoi.cjs → FileUploader-qsnWX-i5.cjs} +2 -2
  68. package/dist/{FileUploader-B4TJHyoi.cjs.map → FileUploader-qsnWX-i5.cjs.map} +1 -1
  69. package/dist/{Flag-EPZOrH-U.cjs → Flag-Bxl1Pa9m.cjs} +2 -2
  70. package/dist/{Flag-EPZOrH-U.cjs.map → Flag-Bxl1Pa9m.cjs.map} +1 -1
  71. package/dist/{Flag-BWCX6oSR.js → Flag-CvIo_Eqp.js} +2 -2
  72. package/dist/{Flag-BWCX6oSR.js.map → Flag-CvIo_Eqp.js.map} +1 -1
  73. package/dist/Flex-BFn4P1tJ.js +52 -0
  74. package/dist/Flex-BFn4P1tJ.js.map +1 -0
  75. package/dist/Flex-C6tHC8n7.cjs +2 -0
  76. package/dist/Flex-C6tHC8n7.cjs.map +1 -0
  77. package/dist/{FullscreenToggle-DDKN5n8B.cjs → FullscreenToggle-CEOkPSLp.cjs} +2 -2
  78. package/dist/{FullscreenToggle-DDKN5n8B.cjs.map → FullscreenToggle-CEOkPSLp.cjs.map} +1 -1
  79. package/dist/{FullscreenToggle-oWzYqUPH.js → FullscreenToggle-CRMGYmB8.js} +3 -3
  80. package/dist/{FullscreenToggle-oWzYqUPH.js.map → FullscreenToggle-CRMGYmB8.js.map} +1 -1
  81. package/dist/Grid-5k6dy-F5.js +26 -0
  82. package/dist/Grid-5k6dy-F5.js.map +1 -0
  83. package/dist/Grid-frN0D9lR.cjs +2 -0
  84. package/dist/Grid-frN0D9lR.cjs.map +1 -0
  85. package/dist/{IconButton-CBusrDa9.js → IconButton-BZ2jJn_T.js} +2 -2
  86. package/dist/{IconButton-CBusrDa9.js.map → IconButton-BZ2jJn_T.js.map} +1 -1
  87. package/dist/{IconButton-D6TenQZ_.cjs → IconButton-ChUfK0pG.cjs} +2 -2
  88. package/dist/{IconButton-D6TenQZ_.cjs.map → IconButton-ChUfK0pG.cjs.map} +1 -1
  89. package/dist/{List-CNz2M3-q.cjs → List-ChXO0Hz-.cjs} +2 -2
  90. package/dist/{List-CNz2M3-q.cjs.map → List-ChXO0Hz-.cjs.map} +1 -1
  91. package/dist/{List-BHgFI9Ll.js → List-LqbfF6gU.js} +2 -2
  92. package/dist/{List-BHgFI9Ll.js.map → List-LqbfF6gU.js.map} +1 -1
  93. package/dist/{ListItem-B4yqZR-Z.js → ListItem-B4Upc0Hy.js} +2 -2
  94. package/dist/{ListItem-B4yqZR-Z.js.map → ListItem-B4Upc0Hy.js.map} +1 -1
  95. package/dist/{ListItem-RH-D-Wey.cjs → ListItem-DWQorRxG.cjs} +2 -2
  96. package/dist/{ListItem-RH-D-Wey.cjs.map → ListItem-DWQorRxG.cjs.map} +1 -1
  97. package/dist/{Loader-C4JoXOyA.js → Loader-DFlpw5Zc.js} +2 -2
  98. package/dist/{Loader-C4JoXOyA.js.map → Loader-DFlpw5Zc.js.map} +1 -1
  99. package/dist/{Loader-D1MtlQOH.cjs → Loader-plA9fgHf.cjs} +2 -2
  100. package/dist/{Loader-D1MtlQOH.cjs.map → Loader-plA9fgHf.cjs.map} +1 -1
  101. package/dist/Masonry-BObKcPmo.js +82 -0
  102. package/dist/Masonry-BObKcPmo.js.map +1 -0
  103. package/dist/Masonry-BVphuk2X.cjs +2 -0
  104. package/dist/Masonry-BVphuk2X.cjs.map +1 -0
  105. package/dist/{Modal-B2YSCVVt.cjs → Modal-BaieUdge.cjs} +2 -2
  106. package/dist/{Modal-B2YSCVVt.cjs.map → Modal-BaieUdge.cjs.map} +1 -1
  107. package/dist/{Modal-BuaPDlKV.js → Modal-CRH_i5uU.js} +3 -3
  108. package/dist/{Modal-BuaPDlKV.js.map → Modal-CRH_i5uU.js.map} +1 -1
  109. package/dist/{MultiSelect-BGRT_B60.js → MultiSelect-BmkzNHTE.js} +6 -6
  110. package/dist/{MultiSelect-BGRT_B60.js.map → MultiSelect-BmkzNHTE.js.map} +1 -1
  111. package/dist/{MultiSelect-CSJKSWpA.cjs → MultiSelect-Cb-N8GIs.cjs} +2 -2
  112. package/dist/{MultiSelect-CSJKSWpA.cjs.map → MultiSelect-Cb-N8GIs.cjs.map} +1 -1
  113. package/dist/{NumberField-DBvhSQCw.js → NumberField-D71JI2Wv.js} +3 -3
  114. package/dist/{NumberField-DBvhSQCw.js.map → NumberField-D71JI2Wv.js.map} +1 -1
  115. package/dist/{NumberField-DBpO-Z_7.cjs → NumberField-DBwNn3-f.cjs} +2 -2
  116. package/dist/{NumberField-DBpO-Z_7.cjs.map → NumberField-DBwNn3-f.cjs.map} +1 -1
  117. package/dist/{OtpField-BUBYyorC.cjs → OtpField-C-SiHxKa.cjs} +2 -2
  118. package/dist/{OtpField-BUBYyorC.cjs.map → OtpField-C-SiHxKa.cjs.map} +1 -1
  119. package/dist/{OtpField-CTq-CUbF.js → OtpField-DOz-JmuX.js} +2 -2
  120. package/dist/{OtpField-CTq-CUbF.js.map → OtpField-DOz-JmuX.js.map} +1 -1
  121. package/dist/{PageLayout-DddzYw2B.js → PageLayout-BIdgUKsN.js} +2 -2
  122. package/dist/{PageLayout-DddzYw2B.js.map → PageLayout-BIdgUKsN.js.map} +1 -1
  123. package/dist/{PageLayout-Dfbjw6jD.cjs → PageLayout-qF5ThZKO.cjs} +2 -2
  124. package/dist/{PageLayout-Dfbjw6jD.cjs.map → PageLayout-qF5ThZKO.cjs.map} +1 -1
  125. package/dist/PageNotFound-CsgH9tY0.js +39 -0
  126. package/dist/PageNotFound-CsgH9tY0.js.map +1 -0
  127. package/dist/PageNotFound-DObWgQ0Z.cjs +2 -0
  128. package/dist/PageNotFound-DObWgQ0Z.cjs.map +1 -0
  129. package/dist/{Pagination-CN9V8M5C.js → Pagination-Kj7ZDi3N.js} +2 -2
  130. package/dist/{Pagination-CN9V8M5C.js.map → Pagination-Kj7ZDi3N.js.map} +1 -1
  131. package/dist/{Pagination-DRwTLPh8.cjs → Pagination-S3hENjDy.cjs} +2 -2
  132. package/dist/{Pagination-DRwTLPh8.cjs.map → Pagination-S3hENjDy.cjs.map} +1 -1
  133. package/dist/{RemoveDialog-ClyZKyUG.cjs → RemoveDialog-BZ0gUf1p.cjs} +2 -2
  134. package/dist/{RemoveDialog-ClyZKyUG.cjs.map → RemoveDialog-BZ0gUf1p.cjs.map} +1 -1
  135. package/dist/{RemoveDialog-Bvt6sH79.js → RemoveDialog-D9a0GttZ.js} +4 -4
  136. package/dist/{RemoveDialog-Bvt6sH79.js.map → RemoveDialog-D9a0GttZ.js.map} +1 -1
  137. package/dist/{RichTextEditor-CAYt1Zm1.cjs → RichTextEditor-BX6twJ9D.cjs} +2 -2
  138. package/dist/{RichTextEditor-CAYt1Zm1.cjs.map → RichTextEditor-BX6twJ9D.cjs.map} +1 -1
  139. package/dist/{RichTextEditor-BTx8Py3I.js → RichTextEditor-D05Czeif.js} +9 -9
  140. package/dist/{RichTextEditor-BTx8Py3I.js.map → RichTextEditor-D05Czeif.js.map} +1 -1
  141. package/dist/RootLayout-BR_pPr3d.cjs +2 -0
  142. package/dist/RootLayout-BR_pPr3d.cjs.map +1 -0
  143. package/dist/{RootLayout-DCpfuFWF.js → RootLayout-CgI03ZNA.js} +16 -16
  144. package/dist/RootLayout-CgI03ZNA.js.map +1 -0
  145. package/dist/{Select-PbTyxB1Q.js → Select-BZPA2Ytp.js} +5 -5
  146. package/dist/{Select-PbTyxB1Q.js.map → Select-BZPA2Ytp.js.map} +1 -1
  147. package/dist/{Select-_6WogC0u.cjs → Select-Dpl8dq_9.cjs} +2 -2
  148. package/dist/{Select-_6WogC0u.cjs.map → Select-Dpl8dq_9.cjs.map} +1 -1
  149. package/dist/{Sidebar-AaIlRzgk.cjs → Sidebar-6SAObU0u.cjs} +2 -2
  150. package/dist/{Sidebar-AaIlRzgk.cjs.map → Sidebar-6SAObU0u.cjs.map} +1 -1
  151. package/dist/{Sidebar-DRCs2ygZ.js → Sidebar-DEBW6lDA.js} +7 -5
  152. package/dist/{Sidebar-DRCs2ygZ.js.map → Sidebar-DEBW6lDA.js.map} +1 -1
  153. package/dist/{SpeedDial-DgFj16BQ.js → SpeedDial-C3PnANAx.js} +2 -2
  154. package/dist/{SpeedDial-DgFj16BQ.js.map → SpeedDial-C3PnANAx.js.map} +1 -1
  155. package/dist/{SpeedDial-C4jxIXTr.cjs → SpeedDial-Dex0rF2z.cjs} +2 -2
  156. package/dist/{SpeedDial-C4jxIXTr.cjs.map → SpeedDial-Dex0rF2z.cjs.map} +1 -1
  157. package/dist/{Stepper-COKAyN1L.js → Stepper-0e90ZJaw.js} +2 -2
  158. package/dist/{Stepper-COKAyN1L.js.map → Stepper-0e90ZJaw.js.map} +1 -1
  159. package/dist/{Stepper-7pPEBRLI.cjs → Stepper-yKwUaxOU.cjs} +2 -2
  160. package/dist/{Stepper-7pPEBRLI.cjs.map → Stepper-yKwUaxOU.cjs.map} +1 -1
  161. package/dist/{Table-BeOumGng.cjs → Table-BekBXEnW.cjs} +2 -2
  162. package/dist/{Table-BeOumGng.cjs.map → Table-BekBXEnW.cjs.map} +1 -1
  163. package/dist/{Table-BjPLvMbf.js → Table-KEOUL2u3.js} +174 -174
  164. package/dist/{Table-BjPLvMbf.js.map → Table-KEOUL2u3.js.map} +1 -1
  165. package/dist/{Tabs--DDM-zKe.js → Tabs-BHk2B50R.js} +2 -2
  166. package/dist/{Tabs--DDM-zKe.js.map → Tabs-BHk2B50R.js.map} +1 -1
  167. package/dist/{Tabs-BZcMnjdC.cjs → Tabs-DYUS945Y.cjs} +2 -2
  168. package/dist/{Tabs-BZcMnjdC.cjs.map → Tabs-DYUS945Y.cjs.map} +1 -1
  169. package/dist/{TagsField-BTJcZS9P.js → TagsField-BkC5OmIT.js} +4 -4
  170. package/dist/{TagsField-BTJcZS9P.js.map → TagsField-BkC5OmIT.js.map} +1 -1
  171. package/dist/{TagsField-kknWiJZZ.cjs → TagsField-DKh9SbG5.cjs} +2 -2
  172. package/dist/{TagsField-kknWiJZZ.cjs.map → TagsField-DKh9SbG5.cjs.map} +1 -1
  173. package/dist/{TextField-DMI1X09n.js → TextField-12HcFD7u.js} +3 -3
  174. package/dist/{TextField-DMI1X09n.js.map → TextField-12HcFD7u.js.map} +1 -1
  175. package/dist/{TextField-BPefnD5M.cjs → TextField-C9cPPP-B.cjs} +2 -2
  176. package/dist/{TextField-BPefnD5M.cjs.map → TextField-C9cPPP-B.cjs.map} +1 -1
  177. package/dist/{ThemeToggle-DTal3RX5.cjs → ThemeToggle-DIXVvqZ7.cjs} +2 -2
  178. package/dist/{ThemeToggle-DTal3RX5.cjs.map → ThemeToggle-DIXVvqZ7.cjs.map} +1 -1
  179. package/dist/{ThemeToggle-Deh9j8pm.js → ThemeToggle-DUtDXl1Z.js} +3 -3
  180. package/dist/{ThemeToggle-Deh9j8pm.js.map → ThemeToggle-DUtDXl1Z.js.map} +1 -1
  181. package/dist/{TimeColumns-BCNmu4b_.js → TimeColumns-BLhP81oI.js} +2 -2
  182. package/dist/{TimeColumns-BCNmu4b_.js.map → TimeColumns-BLhP81oI.js.map} +1 -1
  183. package/dist/{TimeColumns-Duh4DcYJ.cjs → TimeColumns-CgjyPGjs.cjs} +2 -2
  184. package/dist/{TimeColumns-Duh4DcYJ.cjs.map → TimeColumns-CgjyPGjs.cjs.map} +1 -1
  185. package/dist/{TimePicker-3JgvK2on.js → TimePicker-CJWjGVqT.js} +5 -5
  186. package/dist/{TimePicker-3JgvK2on.js.map → TimePicker-CJWjGVqT.js.map} +1 -1
  187. package/dist/{TimePicker-CfGrCH9T.cjs → TimePicker-CNAXFtJa.cjs} +2 -2
  188. package/dist/{TimePicker-CfGrCH9T.cjs.map → TimePicker-CNAXFtJa.cjs.map} +1 -1
  189. package/dist/{Toaster-D-eG1xv7.js → Toaster-B3Mut6eM.js} +2 -2
  190. package/dist/{Toaster-D-eG1xv7.js.map → Toaster-B3Mut6eM.js.map} +1 -1
  191. package/dist/{Toaster-Bk5GtPjX.cjs → Toaster-CYt_Hvlh.cjs} +2 -2
  192. package/dist/{Toaster-Bk5GtPjX.cjs.map → Toaster-CYt_Hvlh.cjs.map} +1 -1
  193. package/dist/{TranslatedFields-CI0F9bHw.js → TranslatedFields-BEaS1esD.js} +3 -3
  194. package/dist/{TranslatedFields-CI0F9bHw.js.map → TranslatedFields-BEaS1esD.js.map} +1 -1
  195. package/dist/{TranslatedFields-DT3bYse6.cjs → TranslatedFields-DshwXj6d.cjs} +2 -2
  196. package/dist/{TranslatedFields-DT3bYse6.cjs.map → TranslatedFields-DshwXj6d.cjs.map} +1 -1
  197. package/dist/{UserCard-BhqtX1vU.js → UserCard-Dve-LOSB.js} +3 -3
  198. package/dist/{UserCard-BhqtX1vU.js.map → UserCard-Dve-LOSB.js.map} +1 -1
  199. package/dist/{UserCard-OlLeyyS0.cjs → UserCard-sIguy8Jp.cjs} +2 -2
  200. package/dist/{UserCard-OlLeyyS0.cjs.map → UserCard-sIguy8Jp.cjs.map} +1 -1
  201. package/dist/breakpoints-BbDakdqF.js +50 -0
  202. package/dist/breakpoints-BbDakdqF.js.map +1 -0
  203. package/dist/breakpoints-Dpnh6BbG.cjs +2 -0
  204. package/dist/breakpoints-Dpnh6BbG.cjs.map +1 -0
  205. package/dist/components/Alert/index.cjs +1 -1
  206. package/dist/components/Alert/index.js +1 -1
  207. package/dist/components/Breadcrumbs/index.cjs +1 -1
  208. package/dist/components/Breadcrumbs/index.js +1 -1
  209. package/dist/components/Button/index.cjs +1 -1
  210. package/dist/components/Button/index.js +1 -1
  211. package/dist/components/Card/index.cjs +1 -1
  212. package/dist/components/Card/index.js +1 -1
  213. package/dist/components/Chip/index.cjs +1 -1
  214. package/dist/components/Chip/index.js +1 -1
  215. package/dist/components/CodeBlock/index.cjs +1 -1
  216. package/dist/components/CodeBlock/index.js +1 -1
  217. package/dist/components/ColorPicker/index.cjs +1 -1
  218. package/dist/components/ColorPicker/index.js +1 -1
  219. package/dist/components/DashedButton/DashedButton.d.cts +33 -0
  220. package/dist/components/DashedButton/DashedButton.d.ts +33 -0
  221. package/dist/components/DashedButton/index.cjs +2 -0
  222. package/dist/components/DashedButton/index.cjs.map +1 -0
  223. package/dist/components/DashedButton/index.d.cts +2 -0
  224. package/dist/components/DashedButton/index.d.ts +2 -0
  225. package/dist/components/DashedButton/index.js +6 -0
  226. package/dist/components/DashedButton/index.js.map +1 -0
  227. package/dist/components/DatePicker/index.cjs +1 -1
  228. package/dist/components/DatePicker/index.js +1 -1
  229. package/dist/components/DateTimePicker/index.cjs +1 -1
  230. package/dist/components/DateTimePicker/index.js +1 -1
  231. package/dist/components/Dropdown/index.cjs +1 -1
  232. package/dist/components/Dropdown/index.js +1 -1
  233. package/dist/components/EmptyState/index.cjs +1 -1
  234. package/dist/components/EmptyState/index.js +1 -1
  235. package/dist/components/FileUploader/index.cjs +1 -1
  236. package/dist/components/FileUploader/index.js +1 -1
  237. package/dist/components/Flag/index.cjs +1 -1
  238. package/dist/components/Flag/index.js +1 -1
  239. package/dist/components/Flex/Flex.d.cts +16 -13
  240. package/dist/components/Flex/Flex.d.ts +16 -13
  241. package/dist/components/Flex/Grid.d.cts +11 -9
  242. package/dist/components/Flex/Grid.d.ts +11 -9
  243. package/dist/components/Flex/index.cjs +1 -1
  244. package/dist/components/Flex/index.js +3 -3
  245. package/dist/components/FullscreenToggle/index.cjs +1 -1
  246. package/dist/components/FullscreenToggle/index.js +1 -1
  247. package/dist/components/IconButton/index.cjs +1 -1
  248. package/dist/components/IconButton/index.js +1 -1
  249. package/dist/components/List/index.cjs +1 -1
  250. package/dist/components/List/index.js +2 -2
  251. package/dist/components/Loader/index.cjs +1 -1
  252. package/dist/components/Loader/index.js +1 -1
  253. package/dist/components/Masonry/Masonry.d.cts +11 -11
  254. package/dist/components/Masonry/Masonry.d.ts +11 -11
  255. package/dist/components/Masonry/index.cjs +1 -1
  256. package/dist/components/Masonry/index.js +1 -1
  257. package/dist/components/Modal/index.cjs +1 -1
  258. package/dist/components/Modal/index.js +1 -1
  259. package/dist/components/MultiSelect/index.cjs +1 -1
  260. package/dist/components/MultiSelect/index.js +1 -1
  261. package/dist/components/NumberField/index.cjs +1 -1
  262. package/dist/components/NumberField/index.js +1 -1
  263. package/dist/components/OtpField/index.cjs +1 -1
  264. package/dist/components/OtpField/index.js +1 -1
  265. package/dist/components/PageLayout/index.cjs +1 -1
  266. package/dist/components/PageLayout/index.js +1 -1
  267. package/dist/components/PageNotFound/PageNotFound.d.cts +34 -0
  268. package/dist/components/PageNotFound/PageNotFound.d.ts +34 -0
  269. package/dist/components/PageNotFound/index.cjs +2 -0
  270. package/dist/components/PageNotFound/index.cjs.map +1 -0
  271. package/dist/components/PageNotFound/index.d.cts +2 -0
  272. package/dist/components/PageNotFound/index.d.ts +2 -0
  273. package/dist/components/PageNotFound/index.js +6 -0
  274. package/dist/components/PageNotFound/index.js.map +1 -0
  275. package/dist/components/Pagination/index.cjs +1 -1
  276. package/dist/components/Pagination/index.js +1 -1
  277. package/dist/components/RemoveDialog/index.cjs +1 -1
  278. package/dist/components/RemoveDialog/index.js +1 -1
  279. package/dist/components/RichTextEditor/index.cjs +1 -1
  280. package/dist/components/RichTextEditor/index.js +1 -1
  281. package/dist/components/RootLayout/index.cjs +1 -1
  282. package/dist/components/RootLayout/index.js +1 -1
  283. package/dist/components/Select/index.cjs +1 -1
  284. package/dist/components/Select/index.js +1 -1
  285. package/dist/components/Sidebar/index.cjs +1 -1
  286. package/dist/components/Sidebar/index.js +1 -1
  287. package/dist/components/SpeedDial/index.cjs +1 -1
  288. package/dist/components/SpeedDial/index.js +1 -1
  289. package/dist/components/Stepper/index.cjs +1 -1
  290. package/dist/components/Stepper/index.js +1 -1
  291. package/dist/components/Table/index.cjs +1 -1
  292. package/dist/components/Table/index.js +1 -1
  293. package/dist/components/Tabs/index.cjs +1 -1
  294. package/dist/components/Tabs/index.js +1 -1
  295. package/dist/components/TagsField/index.cjs +1 -1
  296. package/dist/components/TagsField/index.js +1 -1
  297. package/dist/components/TextField/index.cjs +1 -1
  298. package/dist/components/TextField/index.js +1 -1
  299. package/dist/components/ThemeToggle/index.cjs +1 -1
  300. package/dist/components/ThemeToggle/index.js +1 -1
  301. package/dist/components/TimePicker/index.cjs +1 -1
  302. package/dist/components/TimePicker/index.js +1 -1
  303. package/dist/components/Toast/index.cjs +1 -1
  304. package/dist/components/Toast/index.js +1 -1
  305. package/dist/components/TranslatedFields/index.cjs +1 -1
  306. package/dist/components/TranslatedFields/index.js +1 -1
  307. package/dist/components/UserCard/index.cjs +1 -1
  308. package/dist/components/UserCard/index.js +1 -1
  309. package/dist/components/index.d.cts +2 -0
  310. package/dist/components/index.d.ts +2 -0
  311. package/dist/entries/components.cjs +1 -1
  312. package/dist/entries/components.js +130 -126
  313. package/dist/entries/components.js.map +1 -1
  314. package/dist/entries/hooks.cjs +1 -1
  315. package/dist/entries/hooks.d.cts +1 -1
  316. package/dist/entries/hooks.d.ts +1 -1
  317. package/dist/entries/hooks.js +4 -3
  318. package/dist/entries/i18n.cjs +1 -1
  319. package/dist/entries/i18n.js +2 -2
  320. package/dist/entries/theme.cjs +1 -1
  321. package/dist/entries/theme.d.cts +2 -2
  322. package/dist/entries/theme.d.ts +2 -2
  323. package/dist/entries/theme.js +16 -14
  324. package/dist/hooks/index.d.cts +1 -1
  325. package/dist/hooks/index.d.ts +1 -1
  326. package/dist/hooks/useMediaQuery.d.cts +21 -8
  327. package/dist/hooks/useMediaQuery.d.ts +21 -8
  328. package/dist/i18n/messages.d.cts +3 -0
  329. package/dist/i18n/messages.d.ts +3 -0
  330. package/dist/index.cjs +1 -1
  331. package/dist/index.css +1 -1
  332. package/dist/index.js +183 -176
  333. package/dist/index.js.map +1 -1
  334. package/dist/messages-BJiUtJ2E.cjs +36 -0
  335. package/dist/messages-BJiUtJ2E.cjs.map +1 -0
  336. package/dist/{messages-C-zecFBE.js → messages-CVISEA5N.js} +37 -16
  337. package/dist/messages-CVISEA5N.js.map +1 -0
  338. package/dist/theme/ConfigProvider.d.cts +9 -0
  339. package/dist/theme/ConfigProvider.d.ts +9 -0
  340. package/dist/theme/breakpoints.d.cts +48 -13
  341. package/dist/theme/breakpoints.d.ts +48 -13
  342. package/dist/theme/index.d.cts +2 -2
  343. package/dist/theme/index.d.ts +2 -2
  344. package/dist/useMediaQuery-CHMrI6Dy.cjs +2 -0
  345. package/dist/useMediaQuery-CHMrI6Dy.cjs.map +1 -0
  346. package/dist/useMediaQuery-DrDUrkmJ.js +32 -0
  347. package/dist/useMediaQuery-DrDUrkmJ.js.map +1 -0
  348. package/package.json +1 -1
  349. package/dist/ConfigProvider-2c94kUOk.js +0 -291
  350. package/dist/ConfigProvider-2c94kUOk.js.map +0 -1
  351. package/dist/ConfigProvider-ByOFXVyP.cjs +0 -2
  352. package/dist/ConfigProvider-ByOFXVyP.cjs.map +0 -1
  353. package/dist/Flex-Bj3mMF5A.js +0 -50
  354. package/dist/Flex-Bj3mMF5A.js.map +0 -1
  355. package/dist/Flex-CqL3Ghda.cjs +0 -2
  356. package/dist/Flex-CqL3Ghda.cjs.map +0 -1
  357. package/dist/Grid-Bw95bKkJ.cjs +0 -2
  358. package/dist/Grid-Bw95bKkJ.cjs.map +0 -1
  359. package/dist/Grid-CY-syhTX.js +0 -24
  360. package/dist/Grid-CY-syhTX.js.map +0 -1
  361. package/dist/Masonry-BTvtDdnt.js +0 -104
  362. package/dist/Masonry-BTvtDdnt.js.map +0 -1
  363. package/dist/Masonry-Bl1Mlzqw.cjs +0 -2
  364. package/dist/Masonry-Bl1Mlzqw.cjs.map +0 -1
  365. package/dist/RootLayout-Cp-9CVjP.cjs +0 -2
  366. package/dist/RootLayout-Cp-9CVjP.cjs.map +0 -1
  367. package/dist/RootLayout-DCpfuFWF.js.map +0 -1
  368. package/dist/breakpoints-BNPC2_Te.cjs +0 -2
  369. package/dist/breakpoints-BNPC2_Te.cjs.map +0 -1
  370. package/dist/breakpoints-o3dzSzrU.js +0 -12
  371. package/dist/breakpoints-o3dzSzrU.js.map +0 -1
  372. package/dist/messages-C-zecFBE.js.map +0 -1
  373. package/dist/messages-Cy-qK5xU.cjs +0 -36
  374. package/dist/messages-Cy-qK5xU.cjs.map +0 -1
  375. package/dist/useMediaQuery-BCsNfMA1.cjs +0 -2
  376. package/dist/useMediaQuery-BCsNfMA1.cjs.map +0 -1
  377. package/dist/useMediaQuery-_1EcFoC5.js +0 -17
  378. package/dist/useMediaQuery-_1EcFoC5.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker-3JgvK2on.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-CJWjGVqT.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-U6sGYiSK.cjs"),Ce=require("./Button-D4bfVNNa.cjs"),O=require("./Icon-CXTl_QAP.cjs"),je=require("./IconButton-D6TenQZ_.cjs"),Z=require("./Typography-BFatE1_A.cjs"),ke=require("./TimeColumns-Duh4DcYJ.cjs"),t=require("./DatePicker.module-tE-tGNBd.cjs"),Ie=require("./ConfigProvider-ByOFXVyP.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-CfGrCH9T.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-U6sGYiSK.cjs"),Ce=require("./Button-C_HPI97g.cjs"),O=require("./Icon-CXTl_QAP.cjs"),je=require("./IconButton-ChUfK0pG.cjs"),Z=require("./Typography-BFatE1_A.cjs"),ke=require("./TimeColumns-CgjyPGjs.cjs"),t=require("./DatePicker.module-tE-tGNBd.cjs"),Ie=require("./ConfigProvider-DFy6pL-C.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-CNAXFtJa.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker-CfGrCH9T.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-CNAXFtJa.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-BQpA48PY.js";
5
+ import { A as h } from "./Alert-BL8hDdEl.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-D-eG1xv7.js.map
63
+ //# sourceMappingURL=Toaster-B3Mut6eM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toaster-D-eG1xv7.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-B3Mut6eM.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-DKIjM-9x.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-Bk5GtPjX.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-C9yBIMq0.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-CYt_Hvlh.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toaster-Bk5GtPjX.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-CYt_Hvlh.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"}
@@ -2,8 +2,8 @@ import { jsx as R } from "react/jsx-runtime";
2
2
  import { forwardRef as V, useState as z, useRef as m, useEffect as j } from "react";
3
3
  import { u as D } from "./formContext-B7ln1Miy.js";
4
4
  import { b as w } from "./translations-D15tFHM1.js";
5
- import { T as J } from "./Tabs--DDM-zKe.js";
6
- import { h as M, n as P } from "./ConfigProvider-2c94kUOk.js";
5
+ import { T as J } from "./Tabs-BHk2B50R.js";
6
+ import { h as M, n as P } from "./ConfigProvider-sEZzNTeU.js";
7
7
  const Q = "_fields_aawaf_4", U = {
8
8
  fields: Q
9
9
  }, se = V(
@@ -79,4 +79,4 @@ const Q = "_fields_aawaf_4", U = {
79
79
  export {
80
80
  se as T
81
81
  };
82
- //# sourceMappingURL=TranslatedFields-CI0F9bHw.js.map
82
+ //# sourceMappingURL=TranslatedFields-BEaS1esD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TranslatedFields-CI0F9bHw.js","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport type { IconName } from '../../icons/names'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /** Icon shown on each locale tab. Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to `'Translations'`. */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabel = 'Translations',\n className,\n style,\n },\n ref,\n ) {\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","icon","variant","size","ariaLabel","className","style","ref","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","jsx","styles","field","Tabs"],"mappings":"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"}
1
+ {"version":3,"file":"TranslatedFields-BEaS1esD.js","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport type { IconName } from '../../icons/names'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /** Icon shown on each locale tab. Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to `'Translations'`. */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabel = 'Translations',\n className,\n style,\n },\n ref,\n ) {\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","icon","variant","size","ariaLabel","className","style","ref","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","jsx","styles","field","Tabs"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const R=require("react/jsx-runtime"),c=require("react"),P=require("./formContext-bTWrqdEV.cjs"),j=require("./translations-CXEeeUDL.cjs"),V=require("./Tabs-BZcMnjdC.cjs"),S=require("./ConfigProvider-ByOFXVyP.cjs"),z="_fields_aawaf_4",D={fields:z},J=c.forwardRef(function({children:x,locales:F,namespace:N,value:b,defaultValue:w,onChange:d,icon:A="Global",variant:K,size:O,"aria-label":W="Translations",className:k,style:C},a){var q;const E=S.useLocales(),i=F??E,_=S.useTranslationsNamespace(),y=N??_,t=P.useFormContext(),T=b!==void 0,[I,L]=c.useState(w),l=(T?b:I)??((q=i[0])==null?void 0:q.code)??"",p=e=>{T||L(e),d==null||d(e)},u=e=>j.buildTranslationName(e,"",y),B=e=>!!t&&Object.keys(t.errors).some(s=>s.startsWith(u(e))&&(t.isSubmitted||t.touched[s]===!0)),v=c.useRef(null),G=e=>{v.current=e,typeof a=="function"?a(e):a&&(a.current=e)},h=c.useRef(0),f=c.useRef(null);if(c.useEffect(()=>{const e=(t==null?void 0:t.submitCount)??0;if(!t||e===h.current)return;h.current=e;const s=Object.keys(t.errors);if(s.length===0)return;const r=o=>i.some(m=>o.startsWith(u(m.code)));if(!s.every(r)||s.some(o=>o.startsWith(u(l))))return;const n=i.find(o=>s.some(m=>m.startsWith(u(o.code))));n&&n.code!==l&&(f.current=n.code,p(n.code))},[t==null?void 0:t.submitCount]),c.useEffect(()=>{var n;if(f.current==null||f.current!==l)return;f.current=null;const e=v.current;if(!e||!t)return;const s=new Set(Object.keys(t.errors)),r=Array.from(e.querySelectorAll("[name]")).find(o=>s.has(o.getAttribute("name")??""));(n=r==null?void 0:r.scrollIntoView)==null||n.call(r,{behavior:"smooth",block:"center"}),r==null||r.focus({preventScroll:!0})},[l]),i.length===0)return null;const H=i.map(e=>({value:e.code,label:e.label??e.code,icon:A,error:B(e.code),content:R.jsx("div",{className:D.fields,children:x(s=>j.buildTranslationName(e.code,s,y),e.code)},e.code)}));return R.jsx(V.Tabs,{ref:G,className:k,style:C,items:H,value:l,onChange:p,variant:K,size:O,queryKey:null,"aria-label":W})});exports.TranslatedFields=J;
2
- //# sourceMappingURL=TranslatedFields-DT3bYse6.cjs.map
1
+ "use strict";const R=require("react/jsx-runtime"),c=require("react"),P=require("./formContext-bTWrqdEV.cjs"),j=require("./translations-CXEeeUDL.cjs"),V=require("./Tabs-DYUS945Y.cjs"),S=require("./ConfigProvider-DFy6pL-C.cjs"),z="_fields_aawaf_4",D={fields:z},J=c.forwardRef(function({children:x,locales:F,namespace:N,value:b,defaultValue:w,onChange:d,icon:A="Global",variant:K,size:O,"aria-label":W="Translations",className:k,style:C},a){var q;const E=S.useLocales(),i=F??E,_=S.useTranslationsNamespace(),y=N??_,t=P.useFormContext(),T=b!==void 0,[I,L]=c.useState(w),l=(T?b:I)??((q=i[0])==null?void 0:q.code)??"",p=e=>{T||L(e),d==null||d(e)},u=e=>j.buildTranslationName(e,"",y),B=e=>!!t&&Object.keys(t.errors).some(s=>s.startsWith(u(e))&&(t.isSubmitted||t.touched[s]===!0)),v=c.useRef(null),G=e=>{v.current=e,typeof a=="function"?a(e):a&&(a.current=e)},h=c.useRef(0),f=c.useRef(null);if(c.useEffect(()=>{const e=(t==null?void 0:t.submitCount)??0;if(!t||e===h.current)return;h.current=e;const s=Object.keys(t.errors);if(s.length===0)return;const r=o=>i.some(m=>o.startsWith(u(m.code)));if(!s.every(r)||s.some(o=>o.startsWith(u(l))))return;const n=i.find(o=>s.some(m=>m.startsWith(u(o.code))));n&&n.code!==l&&(f.current=n.code,p(n.code))},[t==null?void 0:t.submitCount]),c.useEffect(()=>{var n;if(f.current==null||f.current!==l)return;f.current=null;const e=v.current;if(!e||!t)return;const s=new Set(Object.keys(t.errors)),r=Array.from(e.querySelectorAll("[name]")).find(o=>s.has(o.getAttribute("name")??""));(n=r==null?void 0:r.scrollIntoView)==null||n.call(r,{behavior:"smooth",block:"center"}),r==null||r.focus({preventScroll:!0})},[l]),i.length===0)return null;const H=i.map(e=>({value:e.code,label:e.label??e.code,icon:A,error:B(e.code),content:R.jsx("div",{className:D.fields,children:x(s=>j.buildTranslationName(e.code,s,y),e.code)},e.code)}));return R.jsx(V.Tabs,{ref:G,className:k,style:C,items:H,value:l,onChange:p,variant:K,size:O,queryKey:null,"aria-label":W})});exports.TranslatedFields=J;
2
+ //# sourceMappingURL=TranslatedFields-DshwXj6d.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TranslatedFields-DT3bYse6.cjs","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport type { IconName } from '../../icons/names'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /** Icon shown on each locale tab. Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to `'Translations'`. */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabel = 'Translations',\n className,\n style,\n },\n ref,\n ) {\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","icon","variant","size","ariaLabel","className","style","ref","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","jsx","styles","field","Tabs"],"mappings":"mQA6DaA,EAAmBC,EAAAA,WAC9B,SACE,CACE,SAAAC,EACA,QAASC,EACT,UAAWC,EACX,MAAAC,EACA,aAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,SACP,QAAAC,EACA,KAAAC,EACA,aAAcC,EAAY,eAC1B,UAAAC,EACA,MAAAC,CAAA,EAEFC,EACA,OACA,MAAMC,EAAgBC,EAAAA,WAAA,EAChBC,EAAUd,GAAeY,EAEzBG,EAAkBC,EAAAA,yBAAA,EAClBC,EAAYhB,GAAiBc,EAC7BG,EAAOC,EAAAA,eAAA,EAGPC,EAAelB,IAAU,OACzB,CAACmB,EAAUC,CAAW,EAAIC,EAAAA,SAA6BpB,CAAY,EACnEqB,GAAUJ,EAAelB,EAAQmB,MAAaI,EAAAX,EAAQ,CAAC,IAAT,YAAAW,EAAY,OAAQ,GAClEC,EAAaC,GAAiB,CAC7BP,GAAcE,EAAYK,CAAI,EACnCvB,GAAA,MAAAA,EAAWuB,EACb,EAGMC,EAAYC,GAAiBC,EAAAA,qBAAqBD,EAAM,GAAIZ,CAAS,EAErEc,EAAkBF,GACtB,CAAC,CAACX,GACF,OAAO,KAAKA,EAAK,MAAM,EAAE,KACtBc,GAAQA,EAAI,WAAWJ,EAASC,CAAI,CAAC,IAAMX,EAAK,aAAeA,EAAK,QAAQc,CAAG,IAAM,GAAA,EAIpFC,EAAUC,EAAAA,OAA8B,IAAI,EAC5CC,EAAcC,GAAgC,CAClDH,EAAQ,QAAUG,EACd,OAAOzB,GAAQ,WAAYA,EAAIyB,CAAI,EAC9BzB,IAAMA,EAA2C,QAAUyB,EACtE,EAIMC,EAAaH,EAAAA,OAAO,CAAC,EACrBI,EAAeJ,EAAAA,OAAsB,IAAI,EAmC/C,GAlCAK,EAAAA,UAAU,IAAM,CACd,MAAMC,GAAQtB,GAAA,YAAAA,EAAM,cAAe,EACnC,GAAI,CAACA,GAAQsB,IAAUH,EAAW,QAAS,OAC3CA,EAAW,QAAUG,EACrB,MAAMC,EAAY,OAAO,KAAKvB,EAAK,MAAM,EACzC,GAAIuB,EAAU,SAAW,EAAG,OAC5B,MAAMC,EAAoBC,GAAc7B,EAAQ,KAAM8B,GAAMD,EAAE,WAAWf,EAASgB,EAAE,IAAI,CAAC,CAAC,EAI1F,GAFI,CAACH,EAAU,MAAMC,CAAgB,GAEjCD,EAAU,KAAME,GAAMA,EAAE,WAAWf,EAASJ,CAAM,CAAC,CAAC,EAAG,OAC3D,MAAMqB,EAAW/B,EAAQ,KAAM8B,GAAMH,EAAU,KAAME,GAAMA,EAAE,WAAWf,EAASgB,EAAE,IAAI,CAAC,CAAC,CAAC,EACtFC,GAAYA,EAAS,OAASrB,IAChCc,EAAa,QAAUO,EAAS,KAChCnB,EAAUmB,EAAS,IAAI,EAG3B,EAAG,CAAC3B,GAAA,YAAAA,EAAM,WAAW,CAAC,EAGtBqB,EAAAA,UAAU,IAAM,OACd,GAAID,EAAa,SAAW,MAAQA,EAAa,UAAYd,EAAQ,OACrEc,EAAa,QAAU,KACvB,MAAMQ,EAAOb,EAAQ,QACrB,GAAI,CAACa,GAAQ,CAAC5B,EAAM,OACpB,MAAMuB,EAAY,IAAI,IAAI,OAAO,KAAKvB,EAAK,MAAM,CAAC,EAC5C6B,EAAS,MAAM,KAAKD,EAAK,iBAA8B,QAAQ,CAAC,EAAE,KAAME,GAC5EP,EAAU,IAAIO,EAAG,aAAa,MAAM,GAAK,EAAE,CAAA,GAE7CvB,EAAAsB,GAAA,YAAAA,EAAQ,iBAAR,MAAAtB,EAAA,KAAAsB,EAAyB,CAAE,SAAU,SAAU,MAAO,WACtDA,GAAA,MAAAA,EAAQ,MAAM,CAAE,cAAe,EAAA,EAEjC,EAAG,CAACvB,CAAM,CAAC,EAEPV,EAAQ,SAAW,EAAG,OAAO,KAEjC,MAAMmC,EAAQnC,EAAQ,IAAKoC,IAAS,CAClC,MAAOA,EAAI,KACX,MAAOA,EAAI,OAASA,EAAI,KACxB,KAAA7C,EAEA,MAAO0B,EAAemB,EAAI,IAAI,EAE9B,QACEC,EAAAA,IAAC,MAAA,CAAmB,UAAWC,EAAO,OACnC,WAAUC,GAAUvB,EAAAA,qBAAqBoB,EAAI,KAAMG,EAAOpC,CAAS,EAAGiC,EAAI,IAAI,GADvEA,EAAI,IAEd,CAAA,EAEF,EAEF,OACEC,EAAAA,IAACG,EAAAA,KAAA,CACC,IAAKnB,EACL,UAAA1B,EACA,MAAAC,EACA,MAAAuC,EACA,MAAOzB,EACP,SAAUE,EACV,QAAApB,EACA,KAAAC,EAEA,SAAU,KACV,aAAYC,CAAA,CAAA,CAGlB,CACF"}
1
+ {"version":3,"file":"TranslatedFields-DshwXj6d.cjs","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport type { IconName } from '../../icons/names'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /** Icon shown on each locale tab. Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to `'Translations'`. */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabel = 'Translations',\n className,\n style,\n },\n ref,\n ) {\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","icon","variant","size","ariaLabel","className","style","ref","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","jsx","styles","field","Tabs"],"mappings":"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"}
@@ -2,10 +2,10 @@ import { jsxs as c, jsx as r } from "react/jsx-runtime";
2
2
  import { forwardRef as x } from "react";
3
3
  import { clsx as j } from "clsx";
4
4
  import { A as C } from "./Avatar-BJVCdo-K.js";
5
- import { B as U } from "./Button-DhEv0YFk.js";
5
+ import { B as U } from "./Button-BT8XmR_T.js";
6
6
  import { I } from "./Icon-CophpkHo.js";
7
7
  import { T as a } from "./Typography-Cta6Rg4L.js";
8
- import { a as N } from "./ConfigProvider-2c94kUOk.js";
8
+ import { a as N } from "./ConfigProvider-sEZzNTeU.js";
9
9
  const S = "_card_ntjc1_3", T = "_identity_ntjc1_16", b = "_text_ntjc1_20", A = "_sm_ntjc1_33", B = "_lg_ntjc1_37", n = {
10
10
  card: S,
11
11
  identity: T,
@@ -71,4 +71,4 @@ const S = "_card_ntjc1_3", T = "_identity_ntjc1_16", b = "_text_ntjc1_20", A = "
71
71
  export {
72
72
  F as U
73
73
  };
74
- //# sourceMappingURL=UserCard-BhqtX1vU.js.map
74
+ //# sourceMappingURL=UserCard-Dve-LOSB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserCard-BhqtX1vU.js","sources":["../src/components/UserCard/UserCard.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { Avatar } from '../Avatar'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Typography } from '../Typography'\nimport styles from './UserCard.module.css'\n\nexport type UserCardSize = 'sm' | 'md' | 'lg'\n\nexport interface UserCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /** Display name — the primary line, and the source of the avatar initials. */\n name?: string\n /** Secondary line under the name (usually the email). */\n email?: ReactNode\n /** Avatar image URL (falls back to the initials from `name`, else the `icon`). */\n avatar?: string\n /** Fallback avatar icon when there's no image or name. Defaults to `'User'`. */\n icon?: IconName\n /** Theme palette token tinting the avatar. Defaults to `'primary'`. */\n color?: ThemeColor\n /** Preset size (avatar + fonts + button). Defaults to `'md'`. */\n size?: UserCardSize\n /** When provided, a **Sign out** button is shown that calls this. */\n onLogout?: () => void\n /** Sign-out button label. Defaults to `'Sign out'`. */\n logoutLabel?: ReactNode\n /** Extra content between the identity row and the sign-out button (e.g. a link or menu). */\n children?: ReactNode\n}\n\n/**\n * A compact account card — an `Avatar` + name/email and an optional **Sign out** button. Drop it into\n * the `RootLayout` `sidebarFooter` (or anywhere) for a consistent signed-in-user block across apps,\n * instead of hand-rolling the markup each time. Shows the image (`avatar`) → initials (from `name`) →\n * `icon` (default `User`) in priority order; renders the sign-out `Button` (filled `error`) only when\n * `onLogout` is given. `size` (`sm`/`md`/`lg`) scales the avatar + type; `color` (default `primary`)\n * tints the avatar. Own CSS module (token-only).\n */\nexport const UserCard = forwardRef<HTMLDivElement, UserCardProps>(function UserCard(\n {\n name,\n email,\n avatar,\n icon = 'User',\n color = 'primary',\n size = 'md',\n onLogout,\n logoutLabel,\n children,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n // the identity row + the sign-out button share the same visual size step\n const avatarSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'md'\n const buttonSize = size === 'lg' ? 'md' : 'sm'\n\n return (\n <div\n ref={ref}\n className={clsx(styles.card, styles[size], className)}\n style={style as CSSProperties}\n {...props}\n >\n <div className={styles.identity}>\n {/* Avatar priority is image → icon → initials, so pass `icon` only as the last resort (no\n name), otherwise a name would still show the icon instead of its initials */}\n <Avatar\n size={avatarSize}\n name={name}\n src={avatar}\n icon={name ? undefined : icon}\n color={color}\n />\n {(name != null || email != null) && (\n <div className={styles.text}>\n {name != null && (\n <Typography variant=\"bodySmall\" truncate>\n {name}\n </Typography>\n )}\n {email != null && (\n <Typography variant=\"caption\" color=\"muted\" truncate>\n {email}\n </Typography>\n )}\n </div>\n )}\n </div>\n\n {children}\n\n {onLogout ? (\n <Button\n variant=\"filled\"\n color=\"error\"\n size={buttonSize}\n fullWidth\n startIcon={<Icon name=\"Logout2\" />}\n onClick={onLogout}\n >\n {logoutLabel ?? t('userCard.signOut')}\n </Button>\n ) : null}\n </div>\n )\n})\n"],"names":["UserCard","forwardRef","name","email","avatar","icon","color","size","onLogout","logoutLabel","children","className","style","props","ref","t","useT","avatarSize","buttonSize","jsxs","clsx","styles","jsx","Avatar","Typography","Button","Icon"],"mappings":";;;;;;;;;;;;;;GAyCaA,IAAWC,EAA0C,SAChE;AAAA,EACE,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,MAAAC,IAAO;AAAA,EACP,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAIC,EAAA,GAEJC,IAAaV,MAAS,OAAO,OAAOA,MAAS,OAAO,OAAO,MAC3DW,IAAaX,MAAS,OAAO,OAAO;AAE1C,SACE,gBAAAY;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAL;AAAA,MACA,WAAWM,EAAKC,EAAO,MAAMA,EAAOd,CAAI,GAAGI,CAAS;AAAA,MACpD,OAAAC;AAAA,MACC,GAAGC;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWE,EAAO,UAGrB,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,MAAMN;AAAA,cACN,MAAAf;AAAA,cACA,KAAKE;AAAA,cACL,MAAMF,IAAO,SAAYG;AAAA,cACzB,OAAAC;AAAA,YAAA;AAAA,UAAA;AAAA,WAEAJ,KAAQ,QAAQC,KAAS,2BACxB,OAAA,EAAI,WAAWkB,EAAO,MACpB,UAAA;AAAA,YAAAnB,KAAQ,QACP,gBAAAoB,EAACE,GAAA,EAAW,SAAQ,aAAY,UAAQ,IACrC,UAAAtB,EAAA,CACH;AAAA,YAEDC,KAAS,QACR,gBAAAmB,EAACE,GAAA,EAAW,SAAQ,WAAU,OAAM,SAAQ,UAAQ,IACjD,UAAArB,EAAA,CACH;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GAEJ;AAAA,QAECO;AAAA,QAEAF,IACC,gBAAAc;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAMP;AAAA,YACN,WAAS;AAAA,YACT,WAAW,gBAAAI,EAACI,GAAA,EAAK,MAAK,UAAA,CAAU;AAAA,YAChC,SAASlB;AAAA,YAER,UAAAC,KAAeM,EAAE,kBAAkB;AAAA,UAAA;AAAA,QAAA,IAEpC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;"}
1
+ {"version":3,"file":"UserCard-Dve-LOSB.js","sources":["../src/components/UserCard/UserCard.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { Avatar } from '../Avatar'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Typography } from '../Typography'\nimport styles from './UserCard.module.css'\n\nexport type UserCardSize = 'sm' | 'md' | 'lg'\n\nexport interface UserCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /** Display name — the primary line, and the source of the avatar initials. */\n name?: string\n /** Secondary line under the name (usually the email). */\n email?: ReactNode\n /** Avatar image URL (falls back to the initials from `name`, else the `icon`). */\n avatar?: string\n /** Fallback avatar icon when there's no image or name. Defaults to `'User'`. */\n icon?: IconName\n /** Theme palette token tinting the avatar. Defaults to `'primary'`. */\n color?: ThemeColor\n /** Preset size (avatar + fonts + button). Defaults to `'md'`. */\n size?: UserCardSize\n /** When provided, a **Sign out** button is shown that calls this. */\n onLogout?: () => void\n /** Sign-out button label. Defaults to `'Sign out'`. */\n logoutLabel?: ReactNode\n /** Extra content between the identity row and the sign-out button (e.g. a link or menu). */\n children?: ReactNode\n}\n\n/**\n * A compact account card — an `Avatar` + name/email and an optional **Sign out** button. Drop it into\n * the `RootLayout` `sidebarFooter` (or anywhere) for a consistent signed-in-user block across apps,\n * instead of hand-rolling the markup each time. Shows the image (`avatar`) → initials (from `name`) →\n * `icon` (default `User`) in priority order; renders the sign-out `Button` (filled `error`) only when\n * `onLogout` is given. `size` (`sm`/`md`/`lg`) scales the avatar + type; `color` (default `primary`)\n * tints the avatar. Own CSS module (token-only).\n */\nexport const UserCard = forwardRef<HTMLDivElement, UserCardProps>(function UserCard(\n {\n name,\n email,\n avatar,\n icon = 'User',\n color = 'primary',\n size = 'md',\n onLogout,\n logoutLabel,\n children,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n // the identity row + the sign-out button share the same visual size step\n const avatarSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'md'\n const buttonSize = size === 'lg' ? 'md' : 'sm'\n\n return (\n <div\n ref={ref}\n className={clsx(styles.card, styles[size], className)}\n style={style as CSSProperties}\n {...props}\n >\n <div className={styles.identity}>\n {/* Avatar priority is image → icon → initials, so pass `icon` only as the last resort (no\n name), otherwise a name would still show the icon instead of its initials */}\n <Avatar\n size={avatarSize}\n name={name}\n src={avatar}\n icon={name ? undefined : icon}\n color={color}\n />\n {(name != null || email != null) && (\n <div className={styles.text}>\n {name != null && (\n <Typography variant=\"bodySmall\" truncate>\n {name}\n </Typography>\n )}\n {email != null && (\n <Typography variant=\"caption\" color=\"muted\" truncate>\n {email}\n </Typography>\n )}\n </div>\n )}\n </div>\n\n {children}\n\n {onLogout ? (\n <Button\n variant=\"filled\"\n color=\"error\"\n size={buttonSize}\n fullWidth\n startIcon={<Icon name=\"Logout2\" />}\n onClick={onLogout}\n >\n {logoutLabel ?? t('userCard.signOut')}\n </Button>\n ) : null}\n </div>\n )\n})\n"],"names":["UserCard","forwardRef","name","email","avatar","icon","color","size","onLogout","logoutLabel","children","className","style","props","ref","t","useT","avatarSize","buttonSize","jsxs","clsx","styles","jsx","Avatar","Typography","Button","Icon"],"mappings":";;;;;;;;;;;;;;GAyCaA,IAAWC,EAA0C,SAChE;AAAA,EACE,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,MAAAC,IAAO;AAAA,EACP,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAIC,EAAA,GAEJC,IAAaV,MAAS,OAAO,OAAOA,MAAS,OAAO,OAAO,MAC3DW,IAAaX,MAAS,OAAO,OAAO;AAE1C,SACE,gBAAAY;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAL;AAAA,MACA,WAAWM,EAAKC,EAAO,MAAMA,EAAOd,CAAI,GAAGI,CAAS;AAAA,MACpD,OAAAC;AAAA,MACC,GAAGC;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWE,EAAO,UAGrB,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,MAAMN;AAAA,cACN,MAAAf;AAAA,cACA,KAAKE;AAAA,cACL,MAAMF,IAAO,SAAYG;AAAA,cACzB,OAAAC;AAAA,YAAA;AAAA,UAAA;AAAA,WAEAJ,KAAQ,QAAQC,KAAS,2BACxB,OAAA,EAAI,WAAWkB,EAAO,MACpB,UAAA;AAAA,YAAAnB,KAAQ,QACP,gBAAAoB,EAACE,GAAA,EAAW,SAAQ,aAAY,UAAQ,IACrC,UAAAtB,EAAA,CACH;AAAA,YAEDC,KAAS,QACR,gBAAAmB,EAACE,GAAA,EAAW,SAAQ,WAAU,OAAM,SAAQ,UAAQ,IACjD,UAAArB,EAAA,CACH;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GAEJ;AAAA,QAECO;AAAA,QAEAF,IACC,gBAAAc;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAMP;AAAA,YACN,WAAS;AAAA,YACT,WAAW,gBAAAI,EAACI,GAAA,EAAK,MAAK,UAAA,CAAU;AAAA,YAChC,SAASlB;AAAA,YAER,UAAAC,KAAeM,EAAE,kBAAkB;AAAA,UAAA;AAAA,QAAA,IAEpC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;"}
@@ -1,2 +1,2 @@
1
- "use strict";const t=require("react/jsx-runtime"),h=require("react"),p=require("clsx"),q=require("./Avatar-_ufXh3AY.cjs"),f=require("./Button-D4bfVNNa.cjs"),C=require("./Icon-CXTl_QAP.cjs"),i=require("./Typography-BFatE1_A.cjs"),T=require("./ConfigProvider-ByOFXVyP.cjs"),U="_card_ntjc1_3",I="_identity_ntjc1_16",N="_text_ntjc1_20",S="_sm_ntjc1_33",b="_lg_ntjc1_37",n={card:U,identity:I,text:N,sm:S,lg:b},A=h.forwardRef(function({name:r,email:c,avatar:o,icon:l="User",color:a="primary",size:s="md",onLogout:e,logoutLabel:d,children:u,className:x,style:_,...j},y){const g=T.useT(),m=s==="lg"?"lg":s==="sm"?"sm":"md",v=s==="lg"?"md":"sm";return t.jsxs("div",{ref:y,className:p.clsx(n.card,n[s],x),style:_,...j,children:[t.jsxs("div",{className:n.identity,children:[t.jsx(q.Avatar,{size:m,name:r,src:o,icon:r?void 0:l,color:a}),(r!=null||c!=null)&&t.jsxs("div",{className:n.text,children:[r!=null&&t.jsx(i.Typography,{variant:"bodySmall",truncate:!0,children:r}),c!=null&&t.jsx(i.Typography,{variant:"caption",color:"muted",truncate:!0,children:c})]})]}),u,e?t.jsx(f.Button,{variant:"filled",color:"error",size:v,fullWidth:!0,startIcon:t.jsx(C.Icon,{name:"Logout2"}),onClick:e,children:d??g("userCard.signOut")}):null]})});exports.UserCard=A;
2
- //# sourceMappingURL=UserCard-OlLeyyS0.cjs.map
1
+ "use strict";const t=require("react/jsx-runtime"),h=require("react"),p=require("clsx"),q=require("./Avatar-_ufXh3AY.cjs"),f=require("./Button-C_HPI97g.cjs"),C=require("./Icon-CXTl_QAP.cjs"),i=require("./Typography-BFatE1_A.cjs"),T=require("./ConfigProvider-DFy6pL-C.cjs"),U="_card_ntjc1_3",I="_identity_ntjc1_16",N="_text_ntjc1_20",S="_sm_ntjc1_33",b="_lg_ntjc1_37",n={card:U,identity:I,text:N,sm:S,lg:b},A=h.forwardRef(function({name:r,email:c,avatar:o,icon:l="User",color:a="primary",size:s="md",onLogout:e,logoutLabel:d,children:u,className:x,style:_,...j},y){const g=T.useT(),m=s==="lg"?"lg":s==="sm"?"sm":"md",v=s==="lg"?"md":"sm";return t.jsxs("div",{ref:y,className:p.clsx(n.card,n[s],x),style:_,...j,children:[t.jsxs("div",{className:n.identity,children:[t.jsx(q.Avatar,{size:m,name:r,src:o,icon:r?void 0:l,color:a}),(r!=null||c!=null)&&t.jsxs("div",{className:n.text,children:[r!=null&&t.jsx(i.Typography,{variant:"bodySmall",truncate:!0,children:r}),c!=null&&t.jsx(i.Typography,{variant:"caption",color:"muted",truncate:!0,children:c})]})]}),u,e?t.jsx(f.Button,{variant:"filled",color:"error",size:v,fullWidth:!0,startIcon:t.jsx(C.Icon,{name:"Logout2"}),onClick:e,children:d??g("userCard.signOut")}):null]})});exports.UserCard=A;
2
+ //# sourceMappingURL=UserCard-sIguy8Jp.cjs.map