@techzyapp/ui-library 1.0.4 → 1.0.9

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 (415) hide show
  1. package/dist/{Alert-BQpA48PY.js → Alert-B3rDvpbO.js} +3 -3
  2. package/dist/{Alert-BQpA48PY.js.map → Alert-B3rDvpbO.js.map} +1 -1
  3. package/dist/{Alert-DKIjM-9x.cjs → Alert-D99G0StL.cjs} +2 -2
  4. package/dist/{Alert-DKIjM-9x.cjs.map → Alert-D99G0StL.cjs.map} +1 -1
  5. package/dist/{Breadcrumbs-CHONper7.cjs → Breadcrumbs-BnxhmyK5.cjs} +2 -2
  6. package/dist/{Breadcrumbs-CHONper7.cjs.map → Breadcrumbs-BnxhmyK5.cjs.map} +1 -1
  7. package/dist/{Breadcrumbs-Bx5UgwDy.js → Breadcrumbs-DvgctFLS.js} +3 -3
  8. package/dist/{Breadcrumbs-Bx5UgwDy.js.map → Breadcrumbs-DvgctFLS.js.map} +1 -1
  9. package/dist/{Button-DhEv0YFk.js → Button-CUsXYM-m.js} +2 -2
  10. package/dist/{Button-DhEv0YFk.js.map → Button-CUsXYM-m.js.map} +1 -1
  11. package/dist/{Button-D4bfVNNa.cjs → Button-Cj6pckNl.cjs} +2 -2
  12. package/dist/{Button-D4bfVNNa.cjs.map → Button-Cj6pckNl.cjs.map} +1 -1
  13. package/dist/{Calendar-C8uNezI-.cjs → Calendar-Br4C0x0n.cjs} +2 -2
  14. package/dist/{Calendar-C8uNezI-.cjs.map → Calendar-Br4C0x0n.cjs.map} +1 -1
  15. package/dist/{Calendar-Bh317SaV.js → Calendar-CE_9WNAB.js} +3 -3
  16. package/dist/{Calendar-Bh317SaV.js.map → Calendar-CE_9WNAB.js.map} +1 -1
  17. package/dist/{Card-CfyaerZZ.cjs → Card-DD9SWHzZ.cjs} +2 -2
  18. package/dist/{Card-CfyaerZZ.cjs.map → Card-DD9SWHzZ.cjs.map} +1 -1
  19. package/dist/{Card-DzClqJuu.js → Card-DhpudGvF.js} +2 -2
  20. package/dist/{Card-DzClqJuu.js.map → Card-DhpudGvF.js.map} +1 -1
  21. package/dist/{Chip-DSrdXLBU.cjs → Chip-B2lY4TJ0.cjs} +2 -2
  22. package/dist/{Chip-DSrdXLBU.cjs.map → Chip-B2lY4TJ0.cjs.map} +1 -1
  23. package/dist/{Chip-Cfo0v3Z8.js → Chip-DulHqhuf.js} +2 -2
  24. package/dist/{Chip-Cfo0v3Z8.js.map → Chip-DulHqhuf.js.map} +1 -1
  25. package/dist/{CodeBlock-BWxQyKRo.js → CodeBlock-DwBMghs2.js} +3 -3
  26. package/dist/{CodeBlock-BWxQyKRo.js.map → CodeBlock-DwBMghs2.js.map} +1 -1
  27. package/dist/{CodeBlock-CgXOjKS-.cjs → CodeBlock-EhB7v9-R.cjs} +2 -2
  28. package/dist/{CodeBlock-CgXOjKS-.cjs.map → CodeBlock-EhB7v9-R.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-DJgTeHht.js} +3 -3
  34. package/dist/{ColorPicker-2udt1ORM.js.map → ColorPicker-DJgTeHht.js.map} +1 -1
  35. package/dist/{ColorPicker-BwmaXCOy.cjs → ColorPicker-Dc1y9Zuu.cjs} +2 -2
  36. package/dist/{ColorPicker-BwmaXCOy.cjs.map → ColorPicker-Dc1y9Zuu.cjs.map} +1 -1
  37. package/dist/{ColorPickerPanel-BM9OwDDE.js → ColorPickerPanel-9tOQUL38.js} +2 -2
  38. package/dist/{ColorPickerPanel-BM9OwDDE.js.map → ColorPickerPanel-9tOQUL38.js.map} +1 -1
  39. package/dist/{ColorPickerPanel-ByB1mLSi.cjs → ColorPickerPanel-nXEliruE.cjs} +2 -2
  40. package/dist/{ColorPickerPanel-ByB1mLSi.cjs.map → ColorPickerPanel-nXEliruE.cjs.map} +1 -1
  41. package/dist/ConfigProvider-BHNx-NHV.cjs +2 -0
  42. package/dist/ConfigProvider-BHNx-NHV.cjs.map +1 -0
  43. package/dist/ConfigProvider-BYruQYHC.js +296 -0
  44. package/dist/ConfigProvider-BYruQYHC.js.map +1 -0
  45. package/dist/CopyButton-B4-OYsYr.js +31 -0
  46. package/dist/CopyButton-B4-OYsYr.js.map +1 -0
  47. package/dist/CopyButton-D_DCLHhb.cjs +2 -0
  48. package/dist/CopyButton-D_DCLHhb.cjs.map +1 -0
  49. package/dist/DashedButton-DeiALUPA.js +59 -0
  50. package/dist/DashedButton-DeiALUPA.js.map +1 -0
  51. package/dist/DashedButton-q7AOqKUE.cjs +2 -0
  52. package/dist/DashedButton-q7AOqKUE.cjs.map +1 -0
  53. package/dist/{DatePicker-DF4Epkn8.cjs → DatePicker-CEczjGZy.cjs} +2 -2
  54. package/dist/{DatePicker-DF4Epkn8.cjs.map → DatePicker-CEczjGZy.cjs.map} +1 -1
  55. package/dist/{DatePicker-WM9TC6L_.js → DatePicker-DkvfSN1K.js} +4 -4
  56. package/dist/{DatePicker-WM9TC6L_.js.map → DatePicker-DkvfSN1K.js.map} +1 -1
  57. package/dist/{DateTimePicker-C557OjBU.cjs → DateTimePicker-CDyGxUBX.cjs} +2 -2
  58. package/dist/{DateTimePicker-C557OjBU.cjs.map → DateTimePicker-CDyGxUBX.cjs.map} +1 -1
  59. package/dist/{DateTimePicker-DBtcWK0F.js → DateTimePicker-DPomyrnN.js} +7 -7
  60. package/dist/{DateTimePicker-DBtcWK0F.js.map → DateTimePicker-DPomyrnN.js.map} +1 -1
  61. package/dist/{Dropdown-DKAXue5_.js → Dropdown-FfkmluRu.js} +2 -2
  62. package/dist/{Dropdown-DKAXue5_.js.map → Dropdown-FfkmluRu.js.map} +1 -1
  63. package/dist/{Dropdown-DygP50OB.cjs → Dropdown-Ui7h2TGd.cjs} +2 -2
  64. package/dist/{Dropdown-DygP50OB.cjs.map → Dropdown-Ui7h2TGd.cjs.map} +1 -1
  65. package/dist/{EmptyState-CCCpZ-ZA.cjs → EmptyState-B77utgEn.cjs} +2 -2
  66. package/dist/{EmptyState-CCCpZ-ZA.cjs.map → EmptyState-B77utgEn.cjs.map} +1 -1
  67. package/dist/{EmptyState-CetM49vk.js → EmptyState-CVyFXprK.js} +2 -2
  68. package/dist/{EmptyState-CetM49vk.js.map → EmptyState-CVyFXprK.js.map} +1 -1
  69. package/dist/FileCard-Cpc5frNm.js +148 -0
  70. package/dist/FileCard-Cpc5frNm.js.map +1 -0
  71. package/dist/FileCard-CsGW2sxE.cjs +2 -0
  72. package/dist/FileCard-CsGW2sxE.cjs.map +1 -0
  73. package/dist/{FileUploader-VtmmwUFE.js → FileUploader-B_nKMh_K.js} +5 -5
  74. package/dist/{FileUploader-VtmmwUFE.js.map → FileUploader-B_nKMh_K.js.map} +1 -1
  75. package/dist/{FileUploader-B4TJHyoi.cjs → FileUploader-DDi_uzIx.cjs} +2 -2
  76. package/dist/{FileUploader-B4TJHyoi.cjs.map → FileUploader-DDi_uzIx.cjs.map} +1 -1
  77. package/dist/{Flag-EPZOrH-U.cjs → Flag-BJLWKB9J.cjs} +2 -2
  78. package/dist/{Flag-EPZOrH-U.cjs.map → Flag-BJLWKB9J.cjs.map} +1 -1
  79. package/dist/{Flag-BWCX6oSR.js → Flag-Ck1xK22A.js} +2 -2
  80. package/dist/{Flag-BWCX6oSR.js.map → Flag-Ck1xK22A.js.map} +1 -1
  81. package/dist/Flex-BFn4P1tJ.js +52 -0
  82. package/dist/Flex-BFn4P1tJ.js.map +1 -0
  83. package/dist/Flex-C6tHC8n7.cjs +2 -0
  84. package/dist/Flex-C6tHC8n7.cjs.map +1 -0
  85. package/dist/{FullscreenToggle-oWzYqUPH.js → FullscreenToggle-DmC0jTay.js} +3 -3
  86. package/dist/{FullscreenToggle-oWzYqUPH.js.map → FullscreenToggle-DmC0jTay.js.map} +1 -1
  87. package/dist/{FullscreenToggle-DDKN5n8B.cjs → FullscreenToggle-MCxGzAEe.cjs} +2 -2
  88. package/dist/{FullscreenToggle-DDKN5n8B.cjs.map → FullscreenToggle-MCxGzAEe.cjs.map} +1 -1
  89. package/dist/Grid-5k6dy-F5.js +26 -0
  90. package/dist/Grid-5k6dy-F5.js.map +1 -0
  91. package/dist/Grid-frN0D9lR.cjs +2 -0
  92. package/dist/Grid-frN0D9lR.cjs.map +1 -0
  93. package/dist/{IconButton-CBusrDa9.js → IconButton-B8FPGgDn.js} +2 -2
  94. package/dist/{IconButton-CBusrDa9.js.map → IconButton-B8FPGgDn.js.map} +1 -1
  95. package/dist/{IconButton-D6TenQZ_.cjs → IconButton-BoY2y_pV.cjs} +2 -2
  96. package/dist/{IconButton-D6TenQZ_.cjs.map → IconButton-BoY2y_pV.cjs.map} +1 -1
  97. package/dist/{List-CNz2M3-q.cjs → List-ChXO0Hz-.cjs} +2 -2
  98. package/dist/{List-CNz2M3-q.cjs.map → List-ChXO0Hz-.cjs.map} +1 -1
  99. package/dist/{List-BHgFI9Ll.js → List-LqbfF6gU.js} +2 -2
  100. package/dist/{List-BHgFI9Ll.js.map → List-LqbfF6gU.js.map} +1 -1
  101. package/dist/{ListItem-B4yqZR-Z.js → ListItem-B4Upc0Hy.js} +2 -2
  102. package/dist/{ListItem-B4yqZR-Z.js.map → ListItem-B4Upc0Hy.js.map} +1 -1
  103. package/dist/{ListItem-RH-D-Wey.cjs → ListItem-DWQorRxG.cjs} +2 -2
  104. package/dist/{ListItem-RH-D-Wey.cjs.map → ListItem-DWQorRxG.cjs.map} +1 -1
  105. package/dist/{Loader-D1MtlQOH.cjs → Loader-Cwb1bOHj.cjs} +2 -2
  106. package/dist/{Loader-D1MtlQOH.cjs.map → Loader-Cwb1bOHj.cjs.map} +1 -1
  107. package/dist/{Loader-C4JoXOyA.js → Loader-UzzqvFyo.js} +2 -2
  108. package/dist/{Loader-C4JoXOyA.js.map → Loader-UzzqvFyo.js.map} +1 -1
  109. package/dist/Masonry-9LrJKlhI.cjs +2 -0
  110. package/dist/Masonry-9LrJKlhI.cjs.map +1 -0
  111. package/dist/Masonry-BsRWG-oN.js +92 -0
  112. package/dist/Masonry-BsRWG-oN.js.map +1 -0
  113. package/dist/{Modal-B2YSCVVt.cjs → Modal-CO3c3sGY.cjs} +2 -2
  114. package/dist/{Modal-B2YSCVVt.cjs.map → Modal-CO3c3sGY.cjs.map} +1 -1
  115. package/dist/{Modal-BuaPDlKV.js → Modal-XMRDPHvQ.js} +3 -3
  116. package/dist/{Modal-BuaPDlKV.js.map → Modal-XMRDPHvQ.js.map} +1 -1
  117. package/dist/{MultiSelect-BGRT_B60.js → MultiSelect-BPLctumx.js} +6 -6
  118. package/dist/{MultiSelect-BGRT_B60.js.map → MultiSelect-BPLctumx.js.map} +1 -1
  119. package/dist/{MultiSelect-CSJKSWpA.cjs → MultiSelect-DVOVHuIm.cjs} +2 -2
  120. package/dist/{MultiSelect-CSJKSWpA.cjs.map → MultiSelect-DVOVHuIm.cjs.map} +1 -1
  121. package/dist/{NumberField-DBpO-Z_7.cjs → NumberField-BH237Vt2.cjs} +2 -2
  122. package/dist/{NumberField-DBpO-Z_7.cjs.map → NumberField-BH237Vt2.cjs.map} +1 -1
  123. package/dist/{NumberField-DBvhSQCw.js → NumberField-X2HsSpu9.js} +3 -3
  124. package/dist/{NumberField-DBvhSQCw.js.map → NumberField-X2HsSpu9.js.map} +1 -1
  125. package/dist/{OtpField-CTq-CUbF.js → OtpField-CB05q0NX.js} +2 -2
  126. package/dist/{OtpField-CTq-CUbF.js.map → OtpField-CB05q0NX.js.map} +1 -1
  127. package/dist/{OtpField-BUBYyorC.cjs → OtpField-CXP59zM2.cjs} +2 -2
  128. package/dist/{OtpField-BUBYyorC.cjs.map → OtpField-CXP59zM2.cjs.map} +1 -1
  129. package/dist/{PageLayout-Dfbjw6jD.cjs → PageLayout-CuVuZEbR.cjs} +2 -2
  130. package/dist/{PageLayout-Dfbjw6jD.cjs.map → PageLayout-CuVuZEbR.cjs.map} +1 -1
  131. package/dist/{PageLayout-DddzYw2B.js → PageLayout-WKWnj5cw.js} +2 -2
  132. package/dist/{PageLayout-DddzYw2B.js.map → PageLayout-WKWnj5cw.js.map} +1 -1
  133. package/dist/PageNotFound-CmT-Wr9m.js +39 -0
  134. package/dist/PageNotFound-CmT-Wr9m.js.map +1 -0
  135. package/dist/PageNotFound-CxLUFoJa.cjs +2 -0
  136. package/dist/PageNotFound-CxLUFoJa.cjs.map +1 -0
  137. package/dist/{Pagination-CN9V8M5C.js → Pagination-BuP4N1bj.js} +2 -2
  138. package/dist/{Pagination-CN9V8M5C.js.map → Pagination-BuP4N1bj.js.map} +1 -1
  139. package/dist/{Pagination-DRwTLPh8.cjs → Pagination-Dcs_Znx3.cjs} +2 -2
  140. package/dist/{Pagination-DRwTLPh8.cjs.map → Pagination-Dcs_Znx3.cjs.map} +1 -1
  141. package/dist/{RemoveDialog-ClyZKyUG.cjs → RemoveDialog-Cwtq9wAt.cjs} +2 -2
  142. package/dist/{RemoveDialog-ClyZKyUG.cjs.map → RemoveDialog-Cwtq9wAt.cjs.map} +1 -1
  143. package/dist/{RemoveDialog-Bvt6sH79.js → RemoveDialog-DU6MqkO8.js} +4 -4
  144. package/dist/{RemoveDialog-Bvt6sH79.js.map → RemoveDialog-DU6MqkO8.js.map} +1 -1
  145. package/dist/{RichTextEditor-CAYt1Zm1.cjs → RichTextEditor-GxbnzLRe.cjs} +2 -2
  146. package/dist/{RichTextEditor-CAYt1Zm1.cjs.map → RichTextEditor-GxbnzLRe.cjs.map} +1 -1
  147. package/dist/{RichTextEditor-BTx8Py3I.js → RichTextEditor-k-NlWb4Y.js} +9 -9
  148. package/dist/{RichTextEditor-BTx8Py3I.js.map → RichTextEditor-k-NlWb4Y.js.map} +1 -1
  149. package/dist/RootLayout-4GV6dfdB.cjs +2 -0
  150. package/dist/RootLayout-4GV6dfdB.cjs.map +1 -0
  151. package/dist/{RootLayout-DCpfuFWF.js → RootLayout-BPSWgWlI.js} +16 -16
  152. package/dist/RootLayout-BPSWgWlI.js.map +1 -0
  153. package/dist/{Select-PbTyxB1Q.js → Select-D7KJ-YMU.js} +5 -5
  154. package/dist/{Select-PbTyxB1Q.js.map → Select-D7KJ-YMU.js.map} +1 -1
  155. package/dist/{Select-_6WogC0u.cjs → Select-DjMZec8c.cjs} +2 -2
  156. package/dist/{Select-_6WogC0u.cjs.map → Select-DjMZec8c.cjs.map} +1 -1
  157. package/dist/{Sidebar-AaIlRzgk.cjs → Sidebar-CT_NUo_7.cjs} +2 -2
  158. package/dist/{Sidebar-AaIlRzgk.cjs.map → Sidebar-CT_NUo_7.cjs.map} +1 -1
  159. package/dist/{Sidebar-DRCs2ygZ.js → Sidebar-Csd3iKbS.js} +7 -5
  160. package/dist/{Sidebar-DRCs2ygZ.js.map → Sidebar-Csd3iKbS.js.map} +1 -1
  161. package/dist/{SpeedDial-C4jxIXTr.cjs → SpeedDial-CyiPagdu.cjs} +2 -2
  162. package/dist/{SpeedDial-C4jxIXTr.cjs.map → SpeedDial-CyiPagdu.cjs.map} +1 -1
  163. package/dist/{SpeedDial-DgFj16BQ.js → SpeedDial-DEWzAGXi.js} +2 -2
  164. package/dist/{SpeedDial-DgFj16BQ.js.map → SpeedDial-DEWzAGXi.js.map} +1 -1
  165. package/dist/{Stepper-COKAyN1L.js → Stepper-CS6s0dMF.js} +2 -2
  166. package/dist/{Stepper-COKAyN1L.js.map → Stepper-CS6s0dMF.js.map} +1 -1
  167. package/dist/{Stepper-7pPEBRLI.cjs → Stepper-PW7c45PV.cjs} +2 -2
  168. package/dist/{Stepper-7pPEBRLI.cjs.map → Stepper-PW7c45PV.cjs.map} +1 -1
  169. package/dist/{Table-BeOumGng.cjs → Table-C_Ov-kvK.cjs} +2 -2
  170. package/dist/{Table-BeOumGng.cjs.map → Table-C_Ov-kvK.cjs.map} +1 -1
  171. package/dist/{Table-BjPLvMbf.js → Table-IIAKXYOh.js} +174 -174
  172. package/dist/{Table-BjPLvMbf.js.map → Table-IIAKXYOh.js.map} +1 -1
  173. package/dist/{Tabs-BZcMnjdC.cjs → Tabs-CaHTJ99w.cjs} +2 -2
  174. package/dist/{Tabs-BZcMnjdC.cjs.map → Tabs-CaHTJ99w.cjs.map} +1 -1
  175. package/dist/{Tabs--DDM-zKe.js → Tabs-D3wztVB1.js} +2 -2
  176. package/dist/{Tabs--DDM-zKe.js.map → Tabs-D3wztVB1.js.map} +1 -1
  177. package/dist/{TagsField-kknWiJZZ.cjs → TagsField-BQIwSX5m.cjs} +2 -2
  178. package/dist/{TagsField-kknWiJZZ.cjs.map → TagsField-BQIwSX5m.cjs.map} +1 -1
  179. package/dist/{TagsField-BTJcZS9P.js → TagsField-BR9Z5pik.js} +4 -4
  180. package/dist/{TagsField-BTJcZS9P.js.map → TagsField-BR9Z5pik.js.map} +1 -1
  181. package/dist/{TextField-DMI1X09n.js → TextField-Bg4TwkVD.js} +3 -3
  182. package/dist/{TextField-DMI1X09n.js.map → TextField-Bg4TwkVD.js.map} +1 -1
  183. package/dist/{TextField-BPefnD5M.cjs → TextField-fmt7aacg.cjs} +2 -2
  184. package/dist/{TextField-BPefnD5M.cjs.map → TextField-fmt7aacg.cjs.map} +1 -1
  185. package/dist/{ThemeToggle-DTal3RX5.cjs → ThemeToggle-Cz5I2-DL.cjs} +2 -2
  186. package/dist/{ThemeToggle-DTal3RX5.cjs.map → ThemeToggle-Cz5I2-DL.cjs.map} +1 -1
  187. package/dist/{ThemeToggle-Deh9j8pm.js → ThemeToggle-DEfXczDs.js} +3 -3
  188. package/dist/{ThemeToggle-Deh9j8pm.js.map → ThemeToggle-DEfXczDs.js.map} +1 -1
  189. package/dist/{TimeColumns-BCNmu4b_.js → TimeColumns-B-vtakk8.js} +2 -2
  190. package/dist/{TimeColumns-BCNmu4b_.js.map → TimeColumns-B-vtakk8.js.map} +1 -1
  191. package/dist/{TimeColumns-Duh4DcYJ.cjs → TimeColumns-IBmjExao.cjs} +2 -2
  192. package/dist/{TimeColumns-Duh4DcYJ.cjs.map → TimeColumns-IBmjExao.cjs.map} +1 -1
  193. package/dist/{TimePicker-CfGrCH9T.cjs → TimePicker-B-c6uIaY.cjs} +2 -2
  194. package/dist/{TimePicker-CfGrCH9T.cjs.map → TimePicker-B-c6uIaY.cjs.map} +1 -1
  195. package/dist/{TimePicker-3JgvK2on.js → TimePicker-i2RnZHV1.js} +5 -5
  196. package/dist/{TimePicker-3JgvK2on.js.map → TimePicker-i2RnZHV1.js.map} +1 -1
  197. package/dist/{Toaster-D-eG1xv7.js → Toaster-Da8F_SFV.js} +2 -2
  198. package/dist/{Toaster-D-eG1xv7.js.map → Toaster-Da8F_SFV.js.map} +1 -1
  199. package/dist/{Toaster-Bk5GtPjX.cjs → Toaster-qdS8Urgy.cjs} +2 -2
  200. package/dist/{Toaster-Bk5GtPjX.cjs.map → Toaster-qdS8Urgy.cjs.map} +1 -1
  201. package/dist/TranslatedFields-C30ww45c.cjs +2 -0
  202. package/dist/TranslatedFields-C30ww45c.cjs.map +1 -0
  203. package/dist/TranslatedFields-Ck9JTF27.js +86 -0
  204. package/dist/TranslatedFields-Ck9JTF27.js.map +1 -0
  205. package/dist/{UserCard-BhqtX1vU.js → UserCard-0ZF29bkK.js} +3 -3
  206. package/dist/{UserCard-BhqtX1vU.js.map → UserCard-0ZF29bkK.js.map} +1 -1
  207. package/dist/{UserCard-OlLeyyS0.cjs → UserCard-C8rC_gzD.cjs} +2 -2
  208. package/dist/{UserCard-OlLeyyS0.cjs.map → UserCard-C8rC_gzD.cjs.map} +1 -1
  209. package/dist/breakpoints-BbDakdqF.js +50 -0
  210. package/dist/breakpoints-BbDakdqF.js.map +1 -0
  211. package/dist/breakpoints-Dpnh6BbG.cjs +2 -0
  212. package/dist/breakpoints-Dpnh6BbG.cjs.map +1 -0
  213. package/dist/components/Alert/index.cjs +1 -1
  214. package/dist/components/Alert/index.js +1 -1
  215. package/dist/components/Breadcrumbs/index.cjs +1 -1
  216. package/dist/components/Breadcrumbs/index.js +1 -1
  217. package/dist/components/Button/index.cjs +1 -1
  218. package/dist/components/Button/index.js +1 -1
  219. package/dist/components/Card/index.cjs +1 -1
  220. package/dist/components/Card/index.js +1 -1
  221. package/dist/components/Chip/index.cjs +1 -1
  222. package/dist/components/Chip/index.js +1 -1
  223. package/dist/components/CodeBlock/index.cjs +1 -1
  224. package/dist/components/CodeBlock/index.js +1 -1
  225. package/dist/components/ColorPicker/index.cjs +1 -1
  226. package/dist/components/ColorPicker/index.js +1 -1
  227. package/dist/components/CopyButton/CopyButton.d.cts +32 -0
  228. package/dist/components/CopyButton/CopyButton.d.ts +32 -0
  229. package/dist/components/CopyButton/index.cjs +2 -0
  230. package/dist/components/CopyButton/index.cjs.map +1 -0
  231. package/dist/components/CopyButton/index.d.cts +2 -0
  232. package/dist/components/CopyButton/index.d.ts +2 -0
  233. package/dist/components/CopyButton/index.js +6 -0
  234. package/dist/components/CopyButton/index.js.map +1 -0
  235. package/dist/components/DashedButton/DashedButton.d.cts +33 -0
  236. package/dist/components/DashedButton/DashedButton.d.ts +33 -0
  237. package/dist/components/DashedButton/index.cjs +2 -0
  238. package/dist/components/DashedButton/index.cjs.map +1 -0
  239. package/dist/components/DashedButton/index.d.cts +2 -0
  240. package/dist/components/DashedButton/index.d.ts +2 -0
  241. package/dist/components/DashedButton/index.js +6 -0
  242. package/dist/components/DashedButton/index.js.map +1 -0
  243. package/dist/components/DatePicker/index.cjs +1 -1
  244. package/dist/components/DatePicker/index.js +1 -1
  245. package/dist/components/DateTimePicker/index.cjs +1 -1
  246. package/dist/components/DateTimePicker/index.js +1 -1
  247. package/dist/components/Dropdown/index.cjs +1 -1
  248. package/dist/components/Dropdown/index.js +1 -1
  249. package/dist/components/EmptyState/index.cjs +1 -1
  250. package/dist/components/EmptyState/index.js +1 -1
  251. package/dist/components/FileCard/FileCard.d.cts +45 -0
  252. package/dist/components/FileCard/FileCard.d.ts +45 -0
  253. package/dist/components/FileCard/index.cjs +2 -0
  254. package/dist/components/FileCard/index.cjs.map +1 -0
  255. package/dist/components/FileCard/index.d.cts +2 -0
  256. package/dist/components/FileCard/index.d.ts +2 -0
  257. package/dist/components/FileCard/index.js +6 -0
  258. package/dist/components/FileCard/index.js.map +1 -0
  259. package/dist/components/FileUploader/index.cjs +1 -1
  260. package/dist/components/FileUploader/index.js +1 -1
  261. package/dist/components/Flag/index.cjs +1 -1
  262. package/dist/components/Flag/index.js +1 -1
  263. package/dist/components/Flex/Flex.d.cts +16 -13
  264. package/dist/components/Flex/Flex.d.ts +16 -13
  265. package/dist/components/Flex/Grid.d.cts +11 -9
  266. package/dist/components/Flex/Grid.d.ts +11 -9
  267. package/dist/components/Flex/index.cjs +1 -1
  268. package/dist/components/Flex/index.js +3 -3
  269. package/dist/components/FullscreenToggle/index.cjs +1 -1
  270. package/dist/components/FullscreenToggle/index.js +1 -1
  271. package/dist/components/IconButton/index.cjs +1 -1
  272. package/dist/components/IconButton/index.js +1 -1
  273. package/dist/components/List/index.cjs +1 -1
  274. package/dist/components/List/index.js +2 -2
  275. package/dist/components/Loader/index.cjs +1 -1
  276. package/dist/components/Loader/index.js +1 -1
  277. package/dist/components/Masonry/Masonry.d.cts +22 -15
  278. package/dist/components/Masonry/Masonry.d.ts +22 -15
  279. package/dist/components/Masonry/index.cjs +1 -1
  280. package/dist/components/Masonry/index.js +1 -1
  281. package/dist/components/Modal/index.cjs +1 -1
  282. package/dist/components/Modal/index.js +1 -1
  283. package/dist/components/MultiSelect/index.cjs +1 -1
  284. package/dist/components/MultiSelect/index.js +1 -1
  285. package/dist/components/NumberField/index.cjs +1 -1
  286. package/dist/components/NumberField/index.js +1 -1
  287. package/dist/components/OtpField/index.cjs +1 -1
  288. package/dist/components/OtpField/index.js +1 -1
  289. package/dist/components/PageLayout/index.cjs +1 -1
  290. package/dist/components/PageLayout/index.js +1 -1
  291. package/dist/components/PageNotFound/PageNotFound.d.cts +34 -0
  292. package/dist/components/PageNotFound/PageNotFound.d.ts +34 -0
  293. package/dist/components/PageNotFound/index.cjs +2 -0
  294. package/dist/components/PageNotFound/index.cjs.map +1 -0
  295. package/dist/components/PageNotFound/index.d.cts +2 -0
  296. package/dist/components/PageNotFound/index.d.ts +2 -0
  297. package/dist/components/PageNotFound/index.js +6 -0
  298. package/dist/components/PageNotFound/index.js.map +1 -0
  299. package/dist/components/Pagination/index.cjs +1 -1
  300. package/dist/components/Pagination/index.js +1 -1
  301. package/dist/components/RemoveDialog/index.cjs +1 -1
  302. package/dist/components/RemoveDialog/index.js +1 -1
  303. package/dist/components/RichTextEditor/index.cjs +1 -1
  304. package/dist/components/RichTextEditor/index.js +1 -1
  305. package/dist/components/RootLayout/index.cjs +1 -1
  306. package/dist/components/RootLayout/index.js +1 -1
  307. package/dist/components/Select/index.cjs +1 -1
  308. package/dist/components/Select/index.js +1 -1
  309. package/dist/components/Sidebar/index.cjs +1 -1
  310. package/dist/components/Sidebar/index.js +1 -1
  311. package/dist/components/SpeedDial/index.cjs +1 -1
  312. package/dist/components/SpeedDial/index.js +1 -1
  313. package/dist/components/Stepper/index.cjs +1 -1
  314. package/dist/components/Stepper/index.js +1 -1
  315. package/dist/components/Table/index.cjs +1 -1
  316. package/dist/components/Table/index.js +1 -1
  317. package/dist/components/Tabs/index.cjs +1 -1
  318. package/dist/components/Tabs/index.js +1 -1
  319. package/dist/components/TagsField/index.cjs +1 -1
  320. package/dist/components/TagsField/index.js +1 -1
  321. package/dist/components/TextField/index.cjs +1 -1
  322. package/dist/components/TextField/index.js +1 -1
  323. package/dist/components/ThemeToggle/index.cjs +1 -1
  324. package/dist/components/ThemeToggle/index.js +1 -1
  325. package/dist/components/TimePicker/index.cjs +1 -1
  326. package/dist/components/TimePicker/index.js +1 -1
  327. package/dist/components/Toast/index.cjs +1 -1
  328. package/dist/components/Toast/index.js +1 -1
  329. package/dist/components/TranslatedFields/TranslatedFields.d.cts +9 -2
  330. package/dist/components/TranslatedFields/TranslatedFields.d.ts +9 -2
  331. package/dist/components/TranslatedFields/index.cjs +1 -1
  332. package/dist/components/TranslatedFields/index.js +1 -1
  333. package/dist/components/UserCard/index.cjs +1 -1
  334. package/dist/components/UserCard/index.js +1 -1
  335. package/dist/components/index.d.cts +4 -0
  336. package/dist/components/index.d.ts +4 -0
  337. package/dist/entries/components.cjs +1 -1
  338. package/dist/entries/components.js +135 -127
  339. package/dist/entries/components.js.map +1 -1
  340. package/dist/entries/hooks.cjs +1 -1
  341. package/dist/entries/hooks.d.cts +3 -1
  342. package/dist/entries/hooks.d.ts +3 -1
  343. package/dist/entries/hooks.js +7 -4
  344. package/dist/entries/hooks.js.map +1 -1
  345. package/dist/entries/i18n.cjs +1 -1
  346. package/dist/entries/i18n.js +2 -2
  347. package/dist/entries/theme.cjs +1 -1
  348. package/dist/entries/theme.d.cts +2 -2
  349. package/dist/entries/theme.d.ts +2 -2
  350. package/dist/entries/theme.js +16 -14
  351. package/dist/hooks/index.d.cts +3 -1
  352. package/dist/hooks/index.d.ts +3 -1
  353. package/dist/hooks/useClipboard.d.cts +28 -0
  354. package/dist/hooks/useClipboard.d.ts +28 -0
  355. package/dist/hooks/useMediaQuery.d.cts +21 -8
  356. package/dist/hooks/useMediaQuery.d.ts +21 -8
  357. package/dist/i18n/messages.d.cts +6 -0
  358. package/dist/i18n/messages.d.ts +6 -0
  359. package/dist/index.cjs +1 -1
  360. package/dist/index.css +1 -1
  361. package/dist/index.js +197 -184
  362. package/dist/index.js.map +1 -1
  363. package/dist/{messages-C-zecFBE.js → messages-BOKick2l.js} +52 -10
  364. package/dist/messages-BOKick2l.js.map +1 -0
  365. package/dist/messages-Jxz2YMcA.cjs +36 -0
  366. package/dist/messages-Jxz2YMcA.cjs.map +1 -0
  367. package/dist/theme/ConfigProvider.d.cts +9 -0
  368. package/dist/theme/ConfigProvider.d.ts +9 -0
  369. package/dist/theme/breakpoints.d.cts +48 -13
  370. package/dist/theme/breakpoints.d.ts +48 -13
  371. package/dist/theme/index.d.cts +2 -2
  372. package/dist/theme/index.d.ts +2 -2
  373. package/dist/useClipboard-BjTIX-4g.cjs +2 -0
  374. package/dist/useClipboard-BjTIX-4g.cjs.map +1 -0
  375. package/dist/useClipboard-CEw_Juiq.js +23 -0
  376. package/dist/useClipboard-CEw_Juiq.js.map +1 -0
  377. package/dist/useMediaQuery-CHMrI6Dy.cjs +2 -0
  378. package/dist/useMediaQuery-CHMrI6Dy.cjs.map +1 -0
  379. package/dist/useMediaQuery-DrDUrkmJ.js +32 -0
  380. package/dist/useMediaQuery-DrDUrkmJ.js.map +1 -0
  381. package/package.json +4 -3
  382. package/dist/ConfigProvider-2c94kUOk.js +0 -291
  383. package/dist/ConfigProvider-2c94kUOk.js.map +0 -1
  384. package/dist/ConfigProvider-ByOFXVyP.cjs +0 -2
  385. package/dist/ConfigProvider-ByOFXVyP.cjs.map +0 -1
  386. package/dist/Flex-Bj3mMF5A.js +0 -50
  387. package/dist/Flex-Bj3mMF5A.js.map +0 -1
  388. package/dist/Flex-CqL3Ghda.cjs +0 -2
  389. package/dist/Flex-CqL3Ghda.cjs.map +0 -1
  390. package/dist/Grid-Bw95bKkJ.cjs +0 -2
  391. package/dist/Grid-Bw95bKkJ.cjs.map +0 -1
  392. package/dist/Grid-CY-syhTX.js +0 -24
  393. package/dist/Grid-CY-syhTX.js.map +0 -1
  394. package/dist/Masonry-BTvtDdnt.js +0 -104
  395. package/dist/Masonry-BTvtDdnt.js.map +0 -1
  396. package/dist/Masonry-Bl1Mlzqw.cjs +0 -2
  397. package/dist/Masonry-Bl1Mlzqw.cjs.map +0 -1
  398. package/dist/RootLayout-Cp-9CVjP.cjs +0 -2
  399. package/dist/RootLayout-Cp-9CVjP.cjs.map +0 -1
  400. package/dist/RootLayout-DCpfuFWF.js.map +0 -1
  401. package/dist/TranslatedFields-CI0F9bHw.js +0 -82
  402. package/dist/TranslatedFields-CI0F9bHw.js.map +0 -1
  403. package/dist/TranslatedFields-DT3bYse6.cjs +0 -2
  404. package/dist/TranslatedFields-DT3bYse6.cjs.map +0 -1
  405. package/dist/breakpoints-BNPC2_Te.cjs +0 -2
  406. package/dist/breakpoints-BNPC2_Te.cjs.map +0 -1
  407. package/dist/breakpoints-o3dzSzrU.js +0 -12
  408. package/dist/breakpoints-o3dzSzrU.js.map +0 -1
  409. package/dist/messages-C-zecFBE.js.map +0 -1
  410. package/dist/messages-Cy-qK5xU.cjs +0 -36
  411. package/dist/messages-Cy-qK5xU.cjs.map +0 -1
  412. package/dist/useMediaQuery-BCsNfMA1.cjs +0 -2
  413. package/dist/useMediaQuery-BCsNfMA1.cjs.map +0 -1
  414. package/dist/useMediaQuery-_1EcFoC5.js +0 -17
  415. package/dist/useMediaQuery-_1EcFoC5.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"OtpField-BUBYyorC.cjs","sources":["../src/components/OtpField/OtpField.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type ClipboardEvent,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useFormContext } from '../../form/formContext'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Typography } from '../Typography'\nimport fieldStyles from '../TextField/TextField.module.css'\nimport styles from './OtpField.module.css'\n\nexport type OtpFieldSize = 'sm' | 'md' | 'lg'\n/** Which characters the code accepts. */\nexport type OtpFieldType = 'numeric' | 'alphabetic' | 'alphanumeric'\n\n/** Allowed-character matcher per `type`. */\nconst PATTERN: Record<OtpFieldType, RegExp> = {\n numeric: /[0-9]/,\n alphabetic: /[A-Za-z]/,\n alphanumeric: /[A-Za-z0-9]/,\n}\n\n/** Split a code string into exactly `length` single-char slots, padded with empties. */\nfunction toChars(value: string, length: number): string[] {\n const out = [...value].slice(0, length)\n while (out.length < length) out.push('')\n return out\n}\n\nexport interface OtpFieldProps {\n /** Number of input boxes (the code length). Defaults to `4`. */\n length?: number\n /** Which characters are accepted (also drives the mobile keyboard). Defaults to `'numeric'`. */\n type?: OtpFieldType\n /** Controlled value — the concatenated code string. */\n value?: string\n /** Initial value for uncontrolled use. */\n defaultValue?: string\n /** Fires with the full code string on every change. */\n onChange?: (value: string) => void\n /** Fires with the code once every box is filled. */\n onComplete?: (value: string) => void\n /** Field name — the `<Form>` binding key (form value is the code `string`). */\n name?: string\n /** Label rendered above the boxes. */\n label?: ReactNode\n /** Helper / error text under the boxes (shown in the error color while `error`). */\n helperText?: ReactNode\n /** Marks the field invalid — reddens the boxes + helper. */\n error?: boolean\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Disables every box. */\n disabled?: boolean\n /** Focus the first box on mount. */\n autoFocus?: boolean\n /** Placeholder character shown in empty boxes (e.g. `'•'`). */\n placeholder?: string\n /** Preset size. Defaults to `'md'`. */\n size?: OtpFieldSize\n /** Theme palette token for the focus ring / active box. Defaults to `'primary'`. */\n color?: ThemeColor\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A one-time-passcode input — a row of single-character boxes for verification codes. **`length`**\n * (default `4`) sets the box count; **`type`** (`'numeric'` default · `'alphabetic'` · `'alphanumeric'`)\n * restricts the accepted characters and the mobile keyboard. Typing advances to the next box, Backspace\n * clears + steps back, Arrows navigate, and **paste / SMS autofill** (`autocomplete=\"one-time-code\"`)\n * distributes the whole code across the boxes. The value is the concatenated string — controlled\n * (`value` + `onChange`) or uncontrolled (`defaultValue`); **`onComplete`** fires when all boxes are\n * filled. Shares the field-family chrome (`label` · `error` + `helperText` · `required` · `disabled` ·\n * `size`) and binds to a surrounding `<Form>` by **`name`** (form value = the code string; validate with\n * e.g. `z.string().length(4)` or a `type`-matching regex). Tinted by `color` via the shared\n * `--tz-btn-rgb` pattern; `role=\"group\"` with per-box `aria-label`s. Own CSS module (+ TextField's for\n * the label/helper chrome).\n */\nexport const OtpField = forwardRef<HTMLDivElement, OtpFieldProps>(function OtpField(\n {\n length = 4,\n type = 'numeric',\n value,\n defaultValue,\n onChange,\n onComplete,\n name,\n label,\n helperText,\n error,\n required = false,\n disabled = false,\n autoFocus = false,\n placeholder,\n size = 'md',\n color = 'primary',\n className,\n style,\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const helperId = `${reactId}-helper`\n const allowed = PATTERN[type]\n\n // bind to a surrounding <Form> by `name` — form value is the code string; error/touched via field()\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = form && name ? form.field(name) : undefined\n\n const externalValue =\n value !== undefined ? value : isFormBound ? (form!.values[name!] as string) : undefined\n const isControlled = value !== undefined || isFormBound\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentValue = isControlled ? (externalValue ?? '') : internal\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n // the code split into exactly `length` single-char slots (padded with empties)\n const chars = toChars(currentValue, length)\n\n const inputsRef = useRef<(HTMLInputElement | null)[]>([])\n\n useEffect(() => {\n if (autoFocus) inputsRef.current[0]?.focus()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const focusBox = (i: number) => {\n const el = inputsRef.current[Math.max(0, Math.min(i, length - 1))]\n el?.focus()\n el?.select()\n }\n\n const commit = (nextChars: string[]) => {\n const next = nextChars.join('')\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n if (nextChars.every((c) => c !== '')) onComplete?.(next)\n }\n\n const handleChange = (index: number, raw: string) => {\n const filtered = [...raw].filter((c) => allowed.test(c))\n // a disallowed keystroke (raw non-empty but nothing survives the filter) is ignored\n if (raw !== '' && filtered.length === 0) return\n const nextChars = [...chars]\n if (filtered.length <= 1) {\n // a single typed char (boxes select-on-focus, so this replaces) — or a clear ('')\n nextChars[index] = filtered[0] ?? ''\n commit(nextChars)\n if (filtered[0]) focusBox(index + 1)\n } else {\n // multiple chars (SMS autofill dumps the whole code into one box) → distribute from here\n let k = index\n for (const ch of filtered) {\n if (k >= length) break\n nextChars[k] = ch\n k++\n }\n commit(nextChars)\n focusBox(k)\n }\n }\n\n const handleKeyDown = (index: number, event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Backspace') {\n if (chars[index] === '' && index > 0) {\n // empty box → step back and clear the previous one\n event.preventDefault()\n const nextChars = [...chars]\n nextChars[index - 1] = ''\n commit(nextChars)\n focusBox(index - 1)\n }\n // a non-empty box lets the native delete run → onChange fires with '' (stays put)\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault()\n focusBox(index - 1)\n } else if (event.key === 'ArrowRight') {\n event.preventDefault()\n focusBox(index + 1)\n } else if (event.key === 'Delete') {\n event.preventDefault()\n const nextChars = [...chars]\n nextChars[index] = ''\n commit(nextChars)\n }\n }\n\n const handlePaste = (index: number, event: ClipboardEvent<HTMLInputElement>) => {\n event.preventDefault()\n const filtered = [...event.clipboardData.getData('text')].filter((c) => allowed.test(c))\n if (filtered.length === 0) return\n const nextChars = [...chars]\n let k = index\n for (const ch of filtered) {\n if (k >= length) break\n nextChars[k] = ch\n k++\n }\n commit(nextChars)\n focusBox(k)\n }\n\n // mark the field touched when focus leaves the whole widget (not when it hops between boxes)\n const handleBlur = (event: FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n bound?.onBlur(event as unknown as FocusEvent<HTMLInputElement>)\n }\n }\n\n return (\n <div\n ref={ref}\n className={clsx(\n fieldStyles.field,\n resolvedError && fieldStyles.error,\n disabled && fieldStyles.disabled,\n className,\n )}\n style={\n {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n ...style,\n } as CSSProperties\n }\n >\n {label != null && (\n <span className={fieldStyles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={fieldStyles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </span>\n )}\n\n <div\n role=\"group\"\n aria-label={typeof label === 'string' ? label : 'One-time code'}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n className={clsx(styles.row, styles[size], resolvedError && styles.invalid)}\n onBlur={handleBlur}\n >\n {chars.map((char, i) => (\n <input\n key={i}\n ref={(el) => {\n inputsRef.current[i] = el\n }}\n // the name goes on the first box only, so the form's scroll-to-error can target it\n name={i === 0 ? name : undefined}\n type=\"text\"\n inputMode={type === 'numeric' ? 'numeric' : 'text'}\n autoComplete={i === 0 ? 'one-time-code' : 'off'}\n aria-label={t('otpField.digit', { index: i + 1, total: length })}\n className={clsx(styles.box, char !== '' && styles.filled)}\n value={char}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={(e) => handlePaste(i, e)}\n onFocus={(e) => e.target.select()}\n />\n ))}\n </div>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={fieldStyles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["PATTERN","toChars","value","length","out","OtpField","forwardRef","type","defaultValue","onChange","onComplete","name","label","helperText","error","required","disabled","autoFocus","placeholder","size","color","className","style","ref","t","useT","helperId","useId","allowed","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentValue","resolvedError","resolvedHelperText","chars","inputsRef","useRef","useEffect","_a","focusBox","i","el","commit","nextChars","next","c","handleChange","index","raw","filtered","k","ch","handleKeyDown","event","handlePaste","handleBlur","jsxs","clsx","fieldStyles","jsx","Typography","styles","char","e"],"mappings":"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"}
1
+ {"version":3,"file":"OtpField-CXP59zM2.cjs","sources":["../src/components/OtpField/OtpField.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type ClipboardEvent,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useFormContext } from '../../form/formContext'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Typography } from '../Typography'\nimport fieldStyles from '../TextField/TextField.module.css'\nimport styles from './OtpField.module.css'\n\nexport type OtpFieldSize = 'sm' | 'md' | 'lg'\n/** Which characters the code accepts. */\nexport type OtpFieldType = 'numeric' | 'alphabetic' | 'alphanumeric'\n\n/** Allowed-character matcher per `type`. */\nconst PATTERN: Record<OtpFieldType, RegExp> = {\n numeric: /[0-9]/,\n alphabetic: /[A-Za-z]/,\n alphanumeric: /[A-Za-z0-9]/,\n}\n\n/** Split a code string into exactly `length` single-char slots, padded with empties. */\nfunction toChars(value: string, length: number): string[] {\n const out = [...value].slice(0, length)\n while (out.length < length) out.push('')\n return out\n}\n\nexport interface OtpFieldProps {\n /** Number of input boxes (the code length). Defaults to `4`. */\n length?: number\n /** Which characters are accepted (also drives the mobile keyboard). Defaults to `'numeric'`. */\n type?: OtpFieldType\n /** Controlled value — the concatenated code string. */\n value?: string\n /** Initial value for uncontrolled use. */\n defaultValue?: string\n /** Fires with the full code string on every change. */\n onChange?: (value: string) => void\n /** Fires with the code once every box is filled. */\n onComplete?: (value: string) => void\n /** Field name — the `<Form>` binding key (form value is the code `string`). */\n name?: string\n /** Label rendered above the boxes. */\n label?: ReactNode\n /** Helper / error text under the boxes (shown in the error color while `error`). */\n helperText?: ReactNode\n /** Marks the field invalid — reddens the boxes + helper. */\n error?: boolean\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Disables every box. */\n disabled?: boolean\n /** Focus the first box on mount. */\n autoFocus?: boolean\n /** Placeholder character shown in empty boxes (e.g. `'•'`). */\n placeholder?: string\n /** Preset size. Defaults to `'md'`. */\n size?: OtpFieldSize\n /** Theme palette token for the focus ring / active box. Defaults to `'primary'`. */\n color?: ThemeColor\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A one-time-passcode input — a row of single-character boxes for verification codes. **`length`**\n * (default `4`) sets the box count; **`type`** (`'numeric'` default · `'alphabetic'` · `'alphanumeric'`)\n * restricts the accepted characters and the mobile keyboard. Typing advances to the next box, Backspace\n * clears + steps back, Arrows navigate, and **paste / SMS autofill** (`autocomplete=\"one-time-code\"`)\n * distributes the whole code across the boxes. The value is the concatenated string — controlled\n * (`value` + `onChange`) or uncontrolled (`defaultValue`); **`onComplete`** fires when all boxes are\n * filled. Shares the field-family chrome (`label` · `error` + `helperText` · `required` · `disabled` ·\n * `size`) and binds to a surrounding `<Form>` by **`name`** (form value = the code string; validate with\n * e.g. `z.string().length(4)` or a `type`-matching regex). Tinted by `color` via the shared\n * `--tz-btn-rgb` pattern; `role=\"group\"` with per-box `aria-label`s. Own CSS module (+ TextField's for\n * the label/helper chrome).\n */\nexport const OtpField = forwardRef<HTMLDivElement, OtpFieldProps>(function OtpField(\n {\n length = 4,\n type = 'numeric',\n value,\n defaultValue,\n onChange,\n onComplete,\n name,\n label,\n helperText,\n error,\n required = false,\n disabled = false,\n autoFocus = false,\n placeholder,\n size = 'md',\n color = 'primary',\n className,\n style,\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const helperId = `${reactId}-helper`\n const allowed = PATTERN[type]\n\n // bind to a surrounding <Form> by `name` — form value is the code string; error/touched via field()\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = form && name ? form.field(name) : undefined\n\n const externalValue =\n value !== undefined ? value : isFormBound ? (form!.values[name!] as string) : undefined\n const isControlled = value !== undefined || isFormBound\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentValue = isControlled ? (externalValue ?? '') : internal\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n // the code split into exactly `length` single-char slots (padded with empties)\n const chars = toChars(currentValue, length)\n\n const inputsRef = useRef<(HTMLInputElement | null)[]>([])\n\n useEffect(() => {\n if (autoFocus) inputsRef.current[0]?.focus()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const focusBox = (i: number) => {\n const el = inputsRef.current[Math.max(0, Math.min(i, length - 1))]\n el?.focus()\n el?.select()\n }\n\n const commit = (nextChars: string[]) => {\n const next = nextChars.join('')\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n if (nextChars.every((c) => c !== '')) onComplete?.(next)\n }\n\n const handleChange = (index: number, raw: string) => {\n const filtered = [...raw].filter((c) => allowed.test(c))\n // a disallowed keystroke (raw non-empty but nothing survives the filter) is ignored\n if (raw !== '' && filtered.length === 0) return\n const nextChars = [...chars]\n if (filtered.length <= 1) {\n // a single typed char (boxes select-on-focus, so this replaces) — or a clear ('')\n nextChars[index] = filtered[0] ?? ''\n commit(nextChars)\n if (filtered[0]) focusBox(index + 1)\n } else {\n // multiple chars (SMS autofill dumps the whole code into one box) → distribute from here\n let k = index\n for (const ch of filtered) {\n if (k >= length) break\n nextChars[k] = ch\n k++\n }\n commit(nextChars)\n focusBox(k)\n }\n }\n\n const handleKeyDown = (index: number, event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Backspace') {\n if (chars[index] === '' && index > 0) {\n // empty box → step back and clear the previous one\n event.preventDefault()\n const nextChars = [...chars]\n nextChars[index - 1] = ''\n commit(nextChars)\n focusBox(index - 1)\n }\n // a non-empty box lets the native delete run → onChange fires with '' (stays put)\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault()\n focusBox(index - 1)\n } else if (event.key === 'ArrowRight') {\n event.preventDefault()\n focusBox(index + 1)\n } else if (event.key === 'Delete') {\n event.preventDefault()\n const nextChars = [...chars]\n nextChars[index] = ''\n commit(nextChars)\n }\n }\n\n const handlePaste = (index: number, event: ClipboardEvent<HTMLInputElement>) => {\n event.preventDefault()\n const filtered = [...event.clipboardData.getData('text')].filter((c) => allowed.test(c))\n if (filtered.length === 0) return\n const nextChars = [...chars]\n let k = index\n for (const ch of filtered) {\n if (k >= length) break\n nextChars[k] = ch\n k++\n }\n commit(nextChars)\n focusBox(k)\n }\n\n // mark the field touched when focus leaves the whole widget (not when it hops between boxes)\n const handleBlur = (event: FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n bound?.onBlur(event as unknown as FocusEvent<HTMLInputElement>)\n }\n }\n\n return (\n <div\n ref={ref}\n className={clsx(\n fieldStyles.field,\n resolvedError && fieldStyles.error,\n disabled && fieldStyles.disabled,\n className,\n )}\n style={\n {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n ...style,\n } as CSSProperties\n }\n >\n {label != null && (\n <span className={fieldStyles.label}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={fieldStyles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </span>\n )}\n\n <div\n role=\"group\"\n aria-label={typeof label === 'string' ? label : 'One-time code'}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n className={clsx(styles.row, styles[size], resolvedError && styles.invalid)}\n onBlur={handleBlur}\n >\n {chars.map((char, i) => (\n <input\n key={i}\n ref={(el) => {\n inputsRef.current[i] = el\n }}\n // the name goes on the first box only, so the form's scroll-to-error can target it\n name={i === 0 ? name : undefined}\n type=\"text\"\n inputMode={type === 'numeric' ? 'numeric' : 'text'}\n autoComplete={i === 0 ? 'one-time-code' : 'off'}\n aria-label={t('otpField.digit', { index: i + 1, total: length })}\n className={clsx(styles.box, char !== '' && styles.filled)}\n value={char}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={(e) => handlePaste(i, e)}\n onFocus={(e) => e.target.select()}\n />\n ))}\n </div>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={fieldStyles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["PATTERN","toChars","value","length","out","OtpField","forwardRef","type","defaultValue","onChange","onComplete","name","label","helperText","error","required","disabled","autoFocus","placeholder","size","color","className","style","ref","t","useT","helperId","useId","allowed","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentValue","resolvedError","resolvedHelperText","chars","inputsRef","useRef","useEffect","_a","focusBox","i","el","commit","nextChars","next","c","handleChange","index","raw","filtered","k","ch","handleKeyDown","event","handlePaste","handleBlur","jsxs","clsx","fieldStyles","jsx","Typography","styles","char","e"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const t=require("react/jsx-runtime"),a=require("react"),u=require("./Card-CfyaerZZ.cjs"),o=a.forwardRef(function(e,r){return t.jsx(u.Card,{ref:r,flat:!0,...e})});exports.PageLayout=o;
2
- //# sourceMappingURL=PageLayout-Dfbjw6jD.cjs.map
1
+ "use strict";const t=require("react/jsx-runtime"),a=require("react"),u=require("./Card-DD9SWHzZ.cjs"),o=a.forwardRef(function(e,r){return t.jsx(u.Card,{ref:r,flat:!0,...e})});exports.PageLayout=o;
2
+ //# sourceMappingURL=PageLayout-CuVuZEbR.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout-Dfbjw6jD.cjs","sources":["../src/components/PageLayout/PageLayout.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { Card, type CardProps } from '../Card'\n\n/** PageLayout is a flat `Card`, so it gains all of Card's slots minus the `flat` toggle (always flat). */\nexport interface PageLayoutProps extends Omit<CardProps, 'flat'> {}\n\n/**\n * The content container a page's body sits in — a **flat `Card`** (no shadow, the page `background`\n * color), so it blends with the shell while the Cards/inputs placed inside it read as elevated. Being\n * a Card, it gains the full Card anatomy: an optional header (`icon` + `title` + `subtitle` +\n * `actions`), the body (`children`), a `footer` / `footerStart`, and `collapsible`. Rendered by the\n * consumer inside each route, below the shell's breadcrumbs + page title:\n * `<PageLayout title=\"Settings\" actions={…}>…</PageLayout>`. Styling uses `--tz-*` tokens only.\n */\nexport const PageLayout = forwardRef<HTMLDivElement, PageLayoutProps>(\n function PageLayout(props, ref) {\n return <Card ref={ref} flat {...props} />\n },\n)\n"],"names":["PageLayout","forwardRef","props","ref","Card"],"mappings":"sGAcaA,EAAaC,EAAAA,WACxB,SAAoBC,EAAOC,EAAK,CAC9B,aAAQC,EAAAA,KAAA,CAAK,IAAAD,EAAU,KAAI,GAAE,GAAGD,EAAO,CACzC,CACF"}
1
+ {"version":3,"file":"PageLayout-CuVuZEbR.cjs","sources":["../src/components/PageLayout/PageLayout.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { Card, type CardProps } from '../Card'\n\n/** PageLayout is a flat `Card`, so it gains all of Card's slots minus the `flat` toggle (always flat). */\nexport interface PageLayoutProps extends Omit<CardProps, 'flat'> {}\n\n/**\n * The content container a page's body sits in — a **flat `Card`** (no shadow, the page `background`\n * color), so it blends with the shell while the Cards/inputs placed inside it read as elevated. Being\n * a Card, it gains the full Card anatomy: an optional header (`icon` + `title` + `subtitle` +\n * `actions`), the body (`children`), a `footer` / `footerStart`, and `collapsible`. Rendered by the\n * consumer inside each route, below the shell's breadcrumbs + page title:\n * `<PageLayout title=\"Settings\" actions={…}>…</PageLayout>`. Styling uses `--tz-*` tokens only.\n */\nexport const PageLayout = forwardRef<HTMLDivElement, PageLayoutProps>(\n function PageLayout(props, ref) {\n return <Card ref={ref} flat {...props} />\n },\n)\n"],"names":["PageLayout","forwardRef","props","ref","Card"],"mappings":"sGAcaA,EAAaC,EAAAA,WACxB,SAAoBC,EAAOC,EAAK,CAC9B,aAAQC,EAAAA,KAAA,CAAK,IAAAD,EAAU,KAAI,GAAE,GAAGD,EAAO,CACzC,CACF"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as t } from "react/jsx-runtime";
2
2
  import { forwardRef as a } from "react";
3
- import { C as f } from "./Card-DzClqJuu.js";
3
+ import { C as f } from "./Card-DhpudGvF.js";
4
4
  const n = a(
5
5
  function(r, o) {
6
6
  return /* @__PURE__ */ t(f, { ref: o, flat: !0, ...r });
@@ -9,4 +9,4 @@ const n = a(
9
9
  export {
10
10
  n as P
11
11
  };
12
- //# sourceMappingURL=PageLayout-DddzYw2B.js.map
12
+ //# sourceMappingURL=PageLayout-WKWnj5cw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout-DddzYw2B.js","sources":["../src/components/PageLayout/PageLayout.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { Card, type CardProps } from '../Card'\n\n/** PageLayout is a flat `Card`, so it gains all of Card's slots minus the `flat` toggle (always flat). */\nexport interface PageLayoutProps extends Omit<CardProps, 'flat'> {}\n\n/**\n * The content container a page's body sits in — a **flat `Card`** (no shadow, the page `background`\n * color), so it blends with the shell while the Cards/inputs placed inside it read as elevated. Being\n * a Card, it gains the full Card anatomy: an optional header (`icon` + `title` + `subtitle` +\n * `actions`), the body (`children`), a `footer` / `footerStart`, and `collapsible`. Rendered by the\n * consumer inside each route, below the shell's breadcrumbs + page title:\n * `<PageLayout title=\"Settings\" actions={…}>…</PageLayout>`. Styling uses `--tz-*` tokens only.\n */\nexport const PageLayout = forwardRef<HTMLDivElement, PageLayoutProps>(\n function PageLayout(props, ref) {\n return <Card ref={ref} flat {...props} />\n },\n)\n"],"names":["PageLayout","forwardRef","props","ref","Card"],"mappings":";;;AAcO,MAAMA,IAAaC;AAAA,EACxB,SAAoBC,GAAOC,GAAK;AAC9B,6BAAQC,GAAA,EAAK,KAAAD,GAAU,MAAI,IAAE,GAAGD,GAAO;AAAA,EACzC;AACF;"}
1
+ {"version":3,"file":"PageLayout-WKWnj5cw.js","sources":["../src/components/PageLayout/PageLayout.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { Card, type CardProps } from '../Card'\n\n/** PageLayout is a flat `Card`, so it gains all of Card's slots minus the `flat` toggle (always flat). */\nexport interface PageLayoutProps extends Omit<CardProps, 'flat'> {}\n\n/**\n * The content container a page's body sits in — a **flat `Card`** (no shadow, the page `background`\n * color), so it blends with the shell while the Cards/inputs placed inside it read as elevated. Being\n * a Card, it gains the full Card anatomy: an optional header (`icon` + `title` + `subtitle` +\n * `actions`), the body (`children`), a `footer` / `footerStart`, and `collapsible`. Rendered by the\n * consumer inside each route, below the shell's breadcrumbs + page title:\n * `<PageLayout title=\"Settings\" actions={…}>…</PageLayout>`. Styling uses `--tz-*` tokens only.\n */\nexport const PageLayout = forwardRef<HTMLDivElement, PageLayoutProps>(\n function PageLayout(props, ref) {\n return <Card ref={ref} flat {...props} />\n },\n)\n"],"names":["PageLayout","forwardRef","props","ref","Card"],"mappings":";;;AAcO,MAAMA,IAAaC;AAAA,EACxB,SAAoBC,GAAOC,GAAK;AAC9B,6BAAQC,GAAA,EAAK,KAAAD,GAAU,MAAI,IAAE,GAAGD,GAAO;AAAA,EACzC;AACF;"}
@@ -0,0 +1,39 @@
1
+ import { jsx as n } from "react/jsx-runtime";
2
+ import { forwardRef as N, useMemo as P } from "react";
3
+ import { useRouter as g } from "@tanstack/react-router";
4
+ import { u as y, h as T } from "./access-Db4knwyR.js";
5
+ import { E as b } from "./EmptyState-CVyFXprK.js";
6
+ import { B } from "./Button-CUsXYM-m.js";
7
+ import { b as D, f as R } from "./Sidebar-Csd3iKbS.js";
8
+ import { a as S } from "./ConfigProvider-BYruQYHC.js";
9
+ const M = N(function({ icon: i = "SearchStatus", title: c, description: u, actionLabel: f, to: e, showAction: l = !0, ...m }, d) {
10
+ const a = S(), t = g({ warn: !1 }), p = y(), r = P(() => {
11
+ if (e != null) return e;
12
+ if (!t) return;
13
+ const F = D(
14
+ Object.values(t.looseRoutesById).map((s) => {
15
+ var o;
16
+ return { fullPath: s.fullPath, staticData: (o = s.options) == null ? void 0 : o.staticData };
17
+ }).filter((s) => {
18
+ var o;
19
+ return T((o = s.staticData) == null ? void 0 : o.roles);
20
+ })
21
+ );
22
+ return R(F) ?? "/";
23
+ }, [t, e, p]), v = !!t && r != null, h = l && v ? /* @__PURE__ */ n(B, { onClick: () => t.navigate({ to: r }), children: f ?? a("notFound.action") }) : void 0;
24
+ return /* @__PURE__ */ n(
25
+ b,
26
+ {
27
+ ref: d,
28
+ icon: i,
29
+ title: c ?? a("notFound.title"),
30
+ description: u ?? a("notFound.description"),
31
+ action: h,
32
+ ...m
33
+ }
34
+ );
35
+ });
36
+ export {
37
+ M as P
38
+ };
39
+ //# sourceMappingURL=PageNotFound-CmT-Wr9m.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageNotFound-CmT-Wr9m.js","sources":["../src/components/PageNotFound/PageNotFound.tsx"],"sourcesContent":["import { forwardRef, useMemo, type HTMLAttributes, type ReactNode } from 'react'\nimport { useRouter, type LinkProps } from '@tanstack/react-router'\nimport { useT } from '../../theme'\nimport { hasAccess, useAccessKeys } from '../../helpers/access'\nimport { EmptyState, type EmptyStateSize } from '../EmptyState'\nimport { Button } from '../Button'\nimport { buildNavTree, firstNavTo } from '../Sidebar/Sidebar'\nimport type { IconName } from '../../icons/names'\n\nexport interface PageNotFoundProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Hero glyph — an `IconName`, any node, or `false` to hide it. Defaults to `SearchStatus`. */\n icon?: IconName | ReactNode | false\n /** Heading. Defaults to the localized `notFound.title`. */\n title?: ReactNode\n /** Muted description. Defaults to the localized `notFound.description`. */\n description?: ReactNode\n /** Action button label. Defaults to the localized `notFound.action`. */\n actionLabel?: ReactNode\n /** Where the action navigates. Defaults to the first allowed menu page (RBAC-aware), else `/`. */\n to?: string\n /** Show the \"back home\" action button. Defaults to `true` (hidden anyway when there's no router). */\n showAction?: boolean\n /** Faded-grid hero backdrop — passed to `EmptyState`. Defaults to `true` (its default). */\n pattern?: boolean\n /** Size — passed to `EmptyState`. Defaults to `md`. */\n size?: EmptyStateSize\n}\n\n/**\n * The shared **404** page. Drop it straight into TanStack Router as the\n * `defaultNotFoundComponent` — zero props needed: the title/description/action strings come from the\n * built-in i18n (`useT`), so they translate with the panel language, and the action navigates to the\n * **first allowed menu page** (the same RBAC-aware target as `FirstRouteRedirect`), falling back to\n * `/`. Built on `EmptyState` (hero glyph + title + description + action, `pattern` on by default), so\n * it renders inside the `RootLayout` content area with the shell/sidebar intact. Lenient: with no\n * router context the `EmptyState` still renders, just without the action button. Token-only styling.\n *\n * @example\n * const router = createRouter({ routeTree, defaultNotFoundComponent: PageNotFound })\n */\nexport const PageNotFound = forwardRef<HTMLDivElement, PageNotFoundProps>(function PageNotFound(\n { icon = 'SearchStatus', title, description, actionLabel, to, showAction = true, ...props },\n ref,\n) {\n const t = useT()\n // lenient router access — returns undefined (no throw) outside a <RouterProvider>\n const router = useRouter({ warn: false })\n const accessKeys = useAccessKeys()\n\n // the first allowed menu page — same logic as FirstRouteRedirect, RBAC-aware; `/` fallback\n const resolvedTo = useMemo(() => {\n if (to != null) return to\n if (!router) return undefined\n const tree = buildNavTree(\n Object.values(router.looseRoutesById)\n .map((route) => ({ fullPath: route.fullPath, staticData: route.options?.staticData }))\n .filter((route) => hasAccess(route.staticData?.roles)),\n )\n return firstNavTo(tree) ?? '/'\n }, [router, to, accessKeys])\n\n const canNavigate = !!router && resolvedTo != null\n const action =\n showAction && canNavigate ? (\n <Button onClick={() => router.navigate({ to: resolvedTo as LinkProps['to'] })}>\n {actionLabel ?? t('notFound.action')}\n </Button>\n ) : undefined\n\n return (\n <EmptyState\n ref={ref}\n icon={icon}\n title={title ?? t('notFound.title')}\n description={description ?? t('notFound.description')}\n action={action}\n {...props}\n />\n )\n})\n"],"names":["PageNotFound","forwardRef","icon","title","description","actionLabel","to","showAction","props","ref","t","useT","router","useRouter","accessKeys","useAccessKeys","resolvedTo","useMemo","tree","buildNavTree","route","_a","hasAccess","firstNavTo","canNavigate","action","Button","jsx","EmptyState"],"mappings":";;;;;;;;AAwCO,MAAMA,IAAeC,EAA8C,SACxE,EAAE,MAAAC,IAAO,gBAAgB,OAAAC,GAAO,aAAAC,GAAa,aAAAC,GAAa,IAAAC,GAAI,YAAAC,IAAa,IAAM,GAAGC,EAAA,GACpFC,GACA;AACA,QAAMC,IAAIC,EAAA,GAEJC,IAASC,EAAU,EAAE,MAAM,IAAO,GAClCC,IAAaC,EAAA,GAGbC,IAAaC,EAAQ,MAAM;AAC/B,QAAIX,KAAM,KAAM,QAAOA;AACvB,QAAI,CAACM,EAAQ;AACb,UAAMM,IAAOC;AAAA,MACX,OAAO,OAAOP,EAAO,eAAe,EACjC,IAAI,CAACQ;;AAAW,iBAAE,UAAUA,EAAM,UAAU,aAAYC,IAAAD,EAAM,YAAN,gBAAAC,EAAe;OAAa,EACpF,OAAO,CAACD,MAAA;;AAAU,eAAAE,GAAUD,IAAAD,EAAM,eAAN,gBAAAC,EAAkB,KAAK;AAAA,OAAC;AAAA,IAAA;AAEzD,WAAOE,EAAWL,CAAI,KAAK;AAAA,EAC7B,GAAG,CAACN,GAAQN,GAAIQ,CAAU,CAAC,GAErBU,IAAc,CAAC,CAACZ,KAAUI,KAAc,MACxCS,IACJlB,KAAciB,sBACXE,GAAA,EAAO,SAAS,MAAMd,EAAO,SAAS,EAAE,IAAII,GAA+B,GACzE,eAAeN,EAAE,iBAAiB,GACrC,IACE;AAEN,SACE,gBAAAiB;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAAnB;AAAA,MACA,MAAAP;AAAA,MACA,OAAOC,KAASO,EAAE,gBAAgB;AAAA,MAClC,aAAaN,KAAeM,EAAE,sBAAsB;AAAA,MACpD,QAAAe;AAAA,MACC,GAAGjB;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const c=require("react/jsx-runtime"),a=require("react"),m=require("@tanstack/react-router"),u=require("./access-DPUHbE-S.cjs"),y=require("./EmptyState-B77utgEn.cjs"),R=require("./Button-Cj6pckNl.cjs"),i=require("./Sidebar-CT_NUo_7.cjs"),S=require("./ConfigProvider-BHNx-NHV.cjs"),j=a.forwardRef(function({icon:l="SearchStatus",title:d,description:f,actionLabel:v,to:s,showAction:q=!0,...g},p){const n=S.useT(),t=m.useRouter({warn:!1}),F=u.useAccessKeys(),r=a.useMemo(()=>{if(s!=null)return s;if(!t)return;const h=i.buildNavTree(Object.values(t.looseRoutesById).map(o=>{var e;return{fullPath:o.fullPath,staticData:(e=o.options)==null?void 0:e.staticData}}).filter(o=>{var e;return u.hasAccess((e=o.staticData)==null?void 0:e.roles)}));return i.firstNavTo(h)??"/"},[t,s,F]),N=!!t&&r!=null,P=q&&N?c.jsx(R.Button,{onClick:()=>t.navigate({to:r}),children:v??n("notFound.action")}):void 0;return c.jsx(y.EmptyState,{ref:p,icon:l,title:d??n("notFound.title"),description:f??n("notFound.description"),action:P,...g})});exports.PageNotFound=j;
2
+ //# sourceMappingURL=PageNotFound-CxLUFoJa.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageNotFound-CxLUFoJa.cjs","sources":["../src/components/PageNotFound/PageNotFound.tsx"],"sourcesContent":["import { forwardRef, useMemo, type HTMLAttributes, type ReactNode } from 'react'\nimport { useRouter, type LinkProps } from '@tanstack/react-router'\nimport { useT } from '../../theme'\nimport { hasAccess, useAccessKeys } from '../../helpers/access'\nimport { EmptyState, type EmptyStateSize } from '../EmptyState'\nimport { Button } from '../Button'\nimport { buildNavTree, firstNavTo } from '../Sidebar/Sidebar'\nimport type { IconName } from '../../icons/names'\n\nexport interface PageNotFoundProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Hero glyph — an `IconName`, any node, or `false` to hide it. Defaults to `SearchStatus`. */\n icon?: IconName | ReactNode | false\n /** Heading. Defaults to the localized `notFound.title`. */\n title?: ReactNode\n /** Muted description. Defaults to the localized `notFound.description`. */\n description?: ReactNode\n /** Action button label. Defaults to the localized `notFound.action`. */\n actionLabel?: ReactNode\n /** Where the action navigates. Defaults to the first allowed menu page (RBAC-aware), else `/`. */\n to?: string\n /** Show the \"back home\" action button. Defaults to `true` (hidden anyway when there's no router). */\n showAction?: boolean\n /** Faded-grid hero backdrop — passed to `EmptyState`. Defaults to `true` (its default). */\n pattern?: boolean\n /** Size — passed to `EmptyState`. Defaults to `md`. */\n size?: EmptyStateSize\n}\n\n/**\n * The shared **404** page. Drop it straight into TanStack Router as the\n * `defaultNotFoundComponent` — zero props needed: the title/description/action strings come from the\n * built-in i18n (`useT`), so they translate with the panel language, and the action navigates to the\n * **first allowed menu page** (the same RBAC-aware target as `FirstRouteRedirect`), falling back to\n * `/`. Built on `EmptyState` (hero glyph + title + description + action, `pattern` on by default), so\n * it renders inside the `RootLayout` content area with the shell/sidebar intact. Lenient: with no\n * router context the `EmptyState` still renders, just without the action button. Token-only styling.\n *\n * @example\n * const router = createRouter({ routeTree, defaultNotFoundComponent: PageNotFound })\n */\nexport const PageNotFound = forwardRef<HTMLDivElement, PageNotFoundProps>(function PageNotFound(\n { icon = 'SearchStatus', title, description, actionLabel, to, showAction = true, ...props },\n ref,\n) {\n const t = useT()\n // lenient router access — returns undefined (no throw) outside a <RouterProvider>\n const router = useRouter({ warn: false })\n const accessKeys = useAccessKeys()\n\n // the first allowed menu page — same logic as FirstRouteRedirect, RBAC-aware; `/` fallback\n const resolvedTo = useMemo(() => {\n if (to != null) return to\n if (!router) return undefined\n const tree = buildNavTree(\n Object.values(router.looseRoutesById)\n .map((route) => ({ fullPath: route.fullPath, staticData: route.options?.staticData }))\n .filter((route) => hasAccess(route.staticData?.roles)),\n )\n return firstNavTo(tree) ?? '/'\n }, [router, to, accessKeys])\n\n const canNavigate = !!router && resolvedTo != null\n const action =\n showAction && canNavigate ? (\n <Button onClick={() => router.navigate({ to: resolvedTo as LinkProps['to'] })}>\n {actionLabel ?? t('notFound.action')}\n </Button>\n ) : undefined\n\n return (\n <EmptyState\n ref={ref}\n icon={icon}\n title={title ?? t('notFound.title')}\n description={description ?? t('notFound.description')}\n action={action}\n {...props}\n />\n )\n})\n"],"names":["PageNotFound","forwardRef","icon","title","description","actionLabel","to","showAction","props","ref","t","useT","router","useRouter","accessKeys","useAccessKeys","resolvedTo","useMemo","tree","buildNavTree","route","_a","hasAccess","firstNavTo","canNavigate","action","Button","jsx","EmptyState"],"mappings":"qSAwCaA,EAAeC,EAAAA,WAA8C,SACxE,CAAE,KAAAC,EAAO,eAAgB,MAAAC,EAAO,YAAAC,EAAa,YAAAC,EAAa,GAAAC,EAAI,WAAAC,EAAa,GAAM,GAAGC,CAAA,EACpFC,EACA,CACA,MAAMC,EAAIC,EAAAA,KAAA,EAEJC,EAASC,EAAAA,UAAU,CAAE,KAAM,GAAO,EAClCC,EAAaC,EAAAA,cAAA,EAGbC,EAAaC,EAAAA,QAAQ,IAAM,CAC/B,GAAIX,GAAM,KAAM,OAAOA,EACvB,GAAI,CAACM,EAAQ,OACb,MAAMM,EAAOC,EAAAA,aACX,OAAO,OAAOP,EAAO,eAAe,EACjC,IAAKQ,UAAW,OAAE,SAAUA,EAAM,SAAU,YAAYC,EAAAD,EAAM,UAAN,YAAAC,EAAe,YAAa,EACpF,OAAQD,GAAA,OAAUE,OAAAA,aAAUD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,KAAK,EAAC,CAAA,EAEzD,OAAOE,EAAAA,WAAWL,CAAI,GAAK,GAC7B,EAAG,CAACN,EAAQN,EAAIQ,CAAU,CAAC,EAErBU,EAAc,CAAC,CAACZ,GAAUI,GAAc,KACxCS,EACJlB,GAAciB,QACXE,EAAAA,OAAA,CAAO,QAAS,IAAMd,EAAO,SAAS,CAAE,GAAII,EAA+B,EACzE,YAAeN,EAAE,iBAAiB,EACrC,EACE,OAEN,OACEiB,EAAAA,IAACC,EAAAA,WAAA,CACC,IAAAnB,EACA,KAAAP,EACA,MAAOC,GAASO,EAAE,gBAAgB,EAClC,YAAaN,GAAeM,EAAE,sBAAsB,EACpD,OAAAe,EACC,GAAGjB,CAAA,CAAA,CAGV,CAAC"}
@@ -2,7 +2,7 @@ import { jsx as r, jsxs as Q } from "react/jsx-runtime";
2
2
  import { forwardRef as U, useState as V } from "react";
3
3
  import { clsx as d } from "clsx";
4
4
  import { I as W } from "./Icon-CophpkHo.js";
5
- import { a as X } from "./ConfigProvider-2c94kUOk.js";
5
+ import { a as X } from "./ConfigProvider-BYruQYHC.js";
6
6
  const w = (s, t) => Array.from({ length: Math.max(t - s + 1, 0) }, (l, a) => s + a);
7
7
  function Y({
8
8
  count: s,
@@ -136,4 +136,4 @@ const Z = "_pagination_wk3op_3", b = "_list_wk3op_8", y = "_item_wk3op_18", u =
136
136
  export {
137
137
  fa as P
138
138
  };
139
- //# sourceMappingURL=Pagination-CN9V8M5C.js.map
139
+ //# sourceMappingURL=Pagination-BuP4N1bj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination-CN9V8M5C.js","sources":["../src/components/Pagination/paginationRange.ts","../src/components/Pagination/Pagination.tsx"],"sourcesContent":["/** A gap placeholder rendered as `…` — at the start (`1 … 4`) or end (`6 … 10`) of the range. */\nexport type PaginationEllipsis = 'start-ellipsis' | 'end-ellipsis'\n\n/** One item in a pagination range: a 1-based page number, or an ellipsis placeholder. */\nexport type PaginationItem = number | PaginationEllipsis\n\n/** Inputs for {@link paginationRange}. */\nexport interface PaginationRangeOptions {\n /** Total number of pages. */\n count: number\n /** Current page (1-based). */\n page: number\n /** Pages shown on each side of the current page. Defaults to `1`. */\n siblingCount?: number\n /** Pages always shown at the start and end. Defaults to `1`. */\n boundaryCount?: number\n}\n\n/** Inclusive integer range `[start, end]` (empty when `end < start`). */\nconst range = (start: number, end: number): number[] =>\n Array.from({ length: Math.max(end - start + 1, 0) }, (_, i) => start + i)\n\n/**\n * Build the page-item sequence for a pager — the boundary pages, the current page with its siblings,\n * and `start`/`end` ellipses where pages are skipped (the classic `1 … 4 5 6 … 10`). Pure and\n * framework-free so it can be unit-tested in isolation and reused. Assumes `1 <= page <= count`.\n */\nexport function paginationRange({\n count,\n page,\n siblingCount = 1,\n boundaryCount = 1,\n}: PaginationRangeOptions): PaginationItem[] {\n if (count <= 0) return []\n\n // Pages pinned at each edge.\n const startPages = range(1, Math.min(boundaryCount, count))\n const endPages = range(Math.max(count - boundaryCount + 1, boundaryCount + 1), count)\n\n // The window of pages around the current one, clamped so it never overlaps the boundaries.\n const siblingsStart = Math.max(\n Math.min(page - siblingCount, count - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2,\n )\n const siblingsEnd = Math.min(\n Math.max(page + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0] - 2 : count - 1,\n )\n\n return [\n ...startPages,\n // A start ellipsis, OR the single page that sits between the start boundary and the siblings.\n ...(siblingsStart > boundaryCount + 2\n ? (['start-ellipsis'] as PaginationItem[])\n : boundaryCount + 1 < count - boundaryCount\n ? [boundaryCount + 1]\n : []),\n ...range(siblingsStart, siblingsEnd),\n // An end ellipsis, OR the single page between the siblings and the end boundary.\n ...(siblingsEnd < count - boundaryCount - 1\n ? (['end-ellipsis'] as PaginationItem[])\n : count - boundaryCount > boundaryCount\n ? [count - boundaryCount]\n : []),\n ...endPages,\n ]\n}\n","import {\n forwardRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { Icon, type IconName } from '../Icon'\nimport { useT, type ThemeColor } from '../../theme'\nimport { paginationRange } from './paginationRange'\nimport styles from './Pagination.module.css'\n\nexport type PaginationVariant = 'outlined' | 'text'\nexport type PaginationSize = 'sm' | 'md' | 'lg'\n\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'color' | 'onChange'> {\n /** Total number of pages (required). From a row count, pass `Math.ceil(total / pageSize)`. */\n count: number\n /** Controlled current page (1-based). */\n page?: number\n /** Initial page for uncontrolled use (1-based). Defaults to `1`. */\n defaultPage?: number\n /** Fires with the next page (1-based) when a page or arrow is activated. */\n onChange?: (page: number) => void\n /** Pages shown on each side of the current page. Defaults to `1`. */\n siblingCount?: number\n /** Pages always shown at the start and end. Defaults to `1`. */\n boundaryCount?: number\n /** Show a jump-to-first-page button before the previous arrow. Defaults to `false`. */\n showFirstButton?: boolean\n /** Show a jump-to-last-page button after the next arrow. Defaults to `false`. */\n showLastButton?: boolean\n /** Hide the previous-page arrow. Defaults to `false`. */\n hidePrevButton?: boolean\n /** Hide the next-page arrow. Defaults to `false`. */\n hideNextButton?: boolean\n /** Item style: `outlined` (bordered boxes, default) or `text` (borderless). */\n variant?: PaginationVariant\n /** Control size — sets the box, font, and icon sizes. Defaults to `md`. */\n size?: PaginationSize\n /** Theme palette token that tints the selected page. Defaults to `accent`. */\n color?: ThemeColor\n /** Render circular page buttons instead of rounded rectangles. Defaults to `false`. */\n rounded?: boolean\n /** Disable the whole control. Defaults to `false`. */\n disabled?: boolean\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi)\n\n/**\n * A page navigator — previous/next arrows around a numbered range with `…` gaps (`1 … 4 5 6 … 10`),\n * the classic pager. Reusable across tables, lists, and galleries: drive it with `count` (total\n * pages) + `page`/`onChange`, computing `count` as `Math.ceil(total / pageSize)`. The selected page\n * is tinted via the shared `--tz-btn-rgb` pattern; unselected items are bordered (`outlined`) or\n * borderless (`text`). Controlled (`page` + `onChange`) or uncontrolled (`defaultPage`).\n */\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n {\n count,\n page,\n defaultPage = 1,\n onChange,\n siblingCount = 1,\n boundaryCount = 1,\n showFirstButton = false,\n showLastButton = false,\n hidePrevButton = false,\n hideNextButton = false,\n variant = 'outlined',\n size = 'md',\n color = 'accent',\n rounded = false,\n disabled = false,\n className,\n style,\n 'aria-label': ariaLabel = 'Pagination',\n ...props\n },\n ref,\n) {\n const isControlled = page !== undefined\n const [internal, setInternal] = useState(defaultPage)\n const lastPage = Math.max(count, 1)\n const current = clamp(isControlled ? page! : internal, 1, lastPage)\n\n const go = (next: number) => {\n const target = clamp(next, 1, lastPage)\n if (target === current) return\n if (!isControlled) setInternal(target)\n onChange?.(target)\n }\n\n const t = useT()\n const items = paginationRange({ count, page: current, siblingCount, boundaryCount })\n\n // The selected fill + its readable text color, derived once via the shared button-tint vars.\n const rootStyle = {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-btn-on': `var(--tz-color-${color}-contrast, #fff)`,\n ...style,\n } as CSSProperties\n\n // An arrow / jump control. `flip` mirrors the (left-pointing) icon to face right — the icon set has\n // no matching plain right arrow, so the next/last glyphs are the left ones flipped for symmetry.\n const control = (\n key: string,\n icon: IconName,\n label: string,\n target: number,\n hidden: boolean,\n atBound: boolean,\n flip = false,\n ): ReactNode =>\n hidden ? null : (\n <li key={key} className={styles.item}>\n <button\n type=\"button\"\n className={clsx(styles.page, styles.arrow)}\n aria-label={label}\n disabled={disabled || atBound}\n onClick={() => go(target)}\n >\n <Icon name={icon} size={size} className={flip ? styles.flip : undefined} />\n </button>\n </li>\n )\n\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel}\n className={clsx(\n styles.pagination,\n styles[variant],\n styles[size],\n rounded && styles.rounded,\n className,\n )}\n style={rootStyle}\n {...props}\n >\n <ul className={styles.list}>\n {showFirstButton &&\n control('first', 'Previous', t('pagination.first'), 1, false, current <= 1)}\n {control(\n 'prev',\n 'ArrowLeft',\n t('pagination.previous'),\n current - 1,\n hidePrevButton,\n current <= 1,\n )}\n {items.map((item, i) =>\n typeof item === 'number' ? (\n <li key={item} className={styles.item}>\n <button\n type=\"button\"\n className={clsx(styles.page, item === current && styles.selected)}\n aria-label={t('pagination.page', { page: item })}\n aria-current={item === current ? 'page' : undefined}\n disabled={disabled}\n onClick={() => go(item)}\n >\n {item}\n </button>\n </li>\n ) : (\n <li key={`${item}-${i}`} className={styles.item} aria-hidden>\n <span className={styles.ellipsis}>…</span>\n </li>\n ),\n )}\n {control(\n 'next',\n 'ArrowLeft',\n t('pagination.next'),\n current + 1,\n hideNextButton,\n current >= count,\n true,\n )}\n {showLastButton &&\n control('last', 'Next', t('pagination.last'), count, false, current >= count)}\n </ul>\n </nav>\n )\n})\n"],"names":["range","start","end","_","i","paginationRange","count","page","siblingCount","boundaryCount","startPages","endPages","siblingsStart","siblingsEnd","clamp","n","lo","hi","Pagination","forwardRef","defaultPage","onChange","showFirstButton","showLastButton","hidePrevButton","hideNextButton","variant","size","color","rounded","disabled","className","style","ariaLabel","props","ref","isControlled","internal","setInternal","useState","lastPage","current","go","next","target","t","useT","items","rootStyle","control","key","icon","label","hidden","atBound","flip","jsx","styles","clsx","Icon","jsxs","item"],"mappings":";;;;;AAmBA,MAAMA,IAAQ,CAACC,GAAeC,MAC5B,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAIA,IAAMD,IAAQ,GAAG,CAAC,EAAA,GAAK,CAACE,GAAGC,MAAMH,IAAQG,CAAC;AAOnE,SAASC,EAAgB;AAAA,EAC9B,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,eAAAC,IAAgB;AAClB,GAA6C;AAC3C,MAAIH,KAAS,EAAG,QAAO,CAAA;AAGvB,QAAMI,IAAaV,EAAM,GAAG,KAAK,IAAIS,GAAeH,CAAK,CAAC,GACpDK,IAAWX,EAAM,KAAK,IAAIM,IAAQG,IAAgB,GAAGA,IAAgB,CAAC,GAAGH,CAAK,GAG9EM,IAAgB,KAAK;AAAA,IACzB,KAAK,IAAIL,IAAOC,GAAcF,IAAQG,IAAgBD,IAAe,IAAI,CAAC;AAAA,IAC1EC,IAAgB;AAAA,EAAA,GAEZI,IAAc,KAAK;AAAA,IACvB,KAAK,IAAIN,IAAOC,GAAcC,IAAgBD,IAAe,IAAI,CAAC;AAAA,IAClEG,EAAS,SAAS,IAAIA,EAAS,CAAC,IAAI,IAAIL,IAAQ;AAAA,EAAA;AAGlD,SAAO;AAAA,IACL,GAAGI;AAAA;AAAA,IAEH,GAAIE,IAAgBH,IAAgB,IAC/B,CAAC,gBAAgB,IAClBA,IAAgB,IAAIH,IAAQG,IAC1B,CAACA,IAAgB,CAAC,IAClB,CAAA;AAAA,IACN,GAAGT,EAAMY,GAAeC,CAAW;AAAA;AAAA,IAEnC,GAAIA,IAAcP,IAAQG,IAAgB,IACrC,CAAC,cAAc,IAChBH,IAAQG,IAAgBA,IACtB,CAACH,IAAQG,CAAa,IACtB,CAAA;AAAA,IACN,GAAGE;AAAA,EAAA;AAEP;;;;;;;;;;;;;;;GCjBMG,IAAQ,CAACC,GAAWC,GAAYC,MAAe,KAAK,IAAI,KAAK,IAAIF,GAAGC,CAAE,GAAGC,CAAE,GASpEC,KAAaC,EAAyC,SACjE;AAAA,EACE,OAAAb;AAAA,EACA,MAAAC;AAAA,EACA,aAAAa,IAAc;AAAA,EACd,UAAAC;AAAA,EACA,cAAAb,IAAe;AAAA,EACf,eAAAC,IAAgB;AAAA,EAChB,iBAAAa,IAAkB;AAAA,EAClB,gBAAAC,IAAiB;AAAA,EACjB,gBAAAC,IAAiB;AAAA,EACjB,gBAAAC,IAAiB;AAAA,EACjB,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,SAAAC,IAAU;AAAA,EACV,UAAAC,IAAW;AAAA,EACX,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAcC,IAAY;AAAA,EAC1B,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAe7B,MAAS,QACxB,CAAC8B,GAAUC,CAAW,IAAIC,EAASnB,CAAW,GAC9CoB,IAAW,KAAK,IAAIlC,GAAO,CAAC,GAC5BmC,IAAU3B,EAAMsB,IAAe7B,IAAQ8B,GAAU,GAAGG,CAAQ,GAE5DE,IAAK,CAACC,MAAiB;AAC3B,UAAMC,IAAS9B,EAAM6B,GAAM,GAAGH,CAAQ;AACtC,IAAII,MAAWH,MACVL,KAAcE,EAAYM,CAAM,GACrCvB,KAAA,QAAAA,EAAWuB;AAAA,EACb,GAEMC,IAAIC,EAAA,GACJC,IAAQ1C,EAAgB,EAAE,OAAAC,GAAO,MAAMmC,GAAS,cAAAjC,GAAc,eAAAC,GAAe,GAG7EuC,IAAY;AAAA,IAChB,gBAAgB,kBAAkBpB,CAAK;AAAA,IACvC,eAAe,kBAAkBA,CAAK;AAAA,IACtC,GAAGI;AAAA,EAAA,GAKCiB,IAAU,CACdC,GACAC,GACAC,GACAR,GACAS,GACAC,GACAC,IAAO,OAEPF,IAAS,OACP,gBAAAG,EAAC,MAAA,EAAa,WAAWC,EAAO,MAC9B,UAAA,gBAAAD;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAWE,EAAKD,EAAO,MAAMA,EAAO,KAAK;AAAA,MACzC,cAAYL;AAAA,MACZ,UAAUtB,KAAYwB;AAAA,MACtB,SAAS,MAAMZ,EAAGE,CAAM;AAAA,MAExB,UAAA,gBAAAY,EAACG,KAAK,MAAMR,GAAM,MAAAxB,GAAY,WAAW4B,IAAOE,EAAO,OAAO,OAAA,CAAW;AAAA,IAAA;AAAA,EAAA,KARpEP,CAUT;AAGJ,SACE,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAArB;AAAA,MACA,cAAYF;AAAA,MACZ,WAAWyB;AAAA,QACTD,EAAO;AAAA,QACPA,EAAO/B,CAAO;AAAA,QACd+B,EAAO9B,CAAI;AAAA,QACXE,KAAW4B,EAAO;AAAA,QAClB1B;AAAA,MAAA;AAAA,MAEF,OAAOiB;AAAA,MACN,GAAGd;AAAA,MAEJ,UAAA,gBAAA0B,EAAC,MAAA,EAAG,WAAWH,EAAO,MACnB,UAAA;AAAA,QAAAnC,KACC2B,EAAQ,SAAS,YAAYJ,EAAE,kBAAkB,GAAG,GAAG,IAAOJ,KAAW,CAAC;AAAA,QAC3EQ;AAAA,UACC;AAAA,UACA;AAAA,UACAJ,EAAE,qBAAqB;AAAA,UACvBJ,IAAU;AAAA,UACVjB;AAAA,UACAiB,KAAW;AAAA,QAAA;AAAA,QAEZM,EAAM;AAAA,UAAI,CAACc,GAAMzD,MAChB,OAAOyD,KAAS,WACd,gBAAAL,EAAC,MAAA,EAAc,WAAWC,EAAO,MAC/B,UAAA,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAWE,EAAKD,EAAO,MAAMI,MAASpB,KAAWgB,EAAO,QAAQ;AAAA,cAChE,cAAYZ,EAAE,mBAAmB,EAAE,MAAMgB,GAAM;AAAA,cAC/C,gBAAcA,MAASpB,IAAU,SAAS;AAAA,cAC1C,UAAAX;AAAA,cACA,SAAS,MAAMY,EAAGmB,CAAI;AAAA,cAErB,UAAAA;AAAA,YAAA;AAAA,UAAA,EACH,GAVOA,CAWT,IAEA,gBAAAL,EAAC,QAAwB,WAAWC,EAAO,MAAM,eAAW,IAC1D,4BAAC,QAAA,EAAK,WAAWA,EAAO,UAAU,UAAA,IAAA,CAAC,KAD5B,GAAGI,CAAI,IAAIzD,CAAC,EAErB;AAAA,QAAA;AAAA,QAGH6C;AAAA,UACC;AAAA,UACA;AAAA,UACAJ,EAAE,iBAAiB;AAAA,UACnBJ,IAAU;AAAA,UACVhB;AAAA,UACAgB,KAAWnC;AAAA,UACX;AAAA,QAAA;AAAA,QAEDiB,KACC0B,EAAQ,QAAQ,QAAQJ,EAAE,iBAAiB,GAAGvC,GAAO,IAAOmC,KAAWnC,CAAK;AAAA,MAAA,EAAA,CAChF;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;"}
1
+ {"version":3,"file":"Pagination-BuP4N1bj.js","sources":["../src/components/Pagination/paginationRange.ts","../src/components/Pagination/Pagination.tsx"],"sourcesContent":["/** A gap placeholder rendered as `…` — at the start (`1 … 4`) or end (`6 … 10`) of the range. */\nexport type PaginationEllipsis = 'start-ellipsis' | 'end-ellipsis'\n\n/** One item in a pagination range: a 1-based page number, or an ellipsis placeholder. */\nexport type PaginationItem = number | PaginationEllipsis\n\n/** Inputs for {@link paginationRange}. */\nexport interface PaginationRangeOptions {\n /** Total number of pages. */\n count: number\n /** Current page (1-based). */\n page: number\n /** Pages shown on each side of the current page. Defaults to `1`. */\n siblingCount?: number\n /** Pages always shown at the start and end. Defaults to `1`. */\n boundaryCount?: number\n}\n\n/** Inclusive integer range `[start, end]` (empty when `end < start`). */\nconst range = (start: number, end: number): number[] =>\n Array.from({ length: Math.max(end - start + 1, 0) }, (_, i) => start + i)\n\n/**\n * Build the page-item sequence for a pager — the boundary pages, the current page with its siblings,\n * and `start`/`end` ellipses where pages are skipped (the classic `1 … 4 5 6 … 10`). Pure and\n * framework-free so it can be unit-tested in isolation and reused. Assumes `1 <= page <= count`.\n */\nexport function paginationRange({\n count,\n page,\n siblingCount = 1,\n boundaryCount = 1,\n}: PaginationRangeOptions): PaginationItem[] {\n if (count <= 0) return []\n\n // Pages pinned at each edge.\n const startPages = range(1, Math.min(boundaryCount, count))\n const endPages = range(Math.max(count - boundaryCount + 1, boundaryCount + 1), count)\n\n // The window of pages around the current one, clamped so it never overlaps the boundaries.\n const siblingsStart = Math.max(\n Math.min(page - siblingCount, count - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2,\n )\n const siblingsEnd = Math.min(\n Math.max(page + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0] - 2 : count - 1,\n )\n\n return [\n ...startPages,\n // A start ellipsis, OR the single page that sits between the start boundary and the siblings.\n ...(siblingsStart > boundaryCount + 2\n ? (['start-ellipsis'] as PaginationItem[])\n : boundaryCount + 1 < count - boundaryCount\n ? [boundaryCount + 1]\n : []),\n ...range(siblingsStart, siblingsEnd),\n // An end ellipsis, OR the single page between the siblings and the end boundary.\n ...(siblingsEnd < count - boundaryCount - 1\n ? (['end-ellipsis'] as PaginationItem[])\n : count - boundaryCount > boundaryCount\n ? [count - boundaryCount]\n : []),\n ...endPages,\n ]\n}\n","import {\n forwardRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { Icon, type IconName } from '../Icon'\nimport { useT, type ThemeColor } from '../../theme'\nimport { paginationRange } from './paginationRange'\nimport styles from './Pagination.module.css'\n\nexport type PaginationVariant = 'outlined' | 'text'\nexport type PaginationSize = 'sm' | 'md' | 'lg'\n\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'color' | 'onChange'> {\n /** Total number of pages (required). From a row count, pass `Math.ceil(total / pageSize)`. */\n count: number\n /** Controlled current page (1-based). */\n page?: number\n /** Initial page for uncontrolled use (1-based). Defaults to `1`. */\n defaultPage?: number\n /** Fires with the next page (1-based) when a page or arrow is activated. */\n onChange?: (page: number) => void\n /** Pages shown on each side of the current page. Defaults to `1`. */\n siblingCount?: number\n /** Pages always shown at the start and end. Defaults to `1`. */\n boundaryCount?: number\n /** Show a jump-to-first-page button before the previous arrow. Defaults to `false`. */\n showFirstButton?: boolean\n /** Show a jump-to-last-page button after the next arrow. Defaults to `false`. */\n showLastButton?: boolean\n /** Hide the previous-page arrow. Defaults to `false`. */\n hidePrevButton?: boolean\n /** Hide the next-page arrow. Defaults to `false`. */\n hideNextButton?: boolean\n /** Item style: `outlined` (bordered boxes, default) or `text` (borderless). */\n variant?: PaginationVariant\n /** Control size — sets the box, font, and icon sizes. Defaults to `md`. */\n size?: PaginationSize\n /** Theme palette token that tints the selected page. Defaults to `accent`. */\n color?: ThemeColor\n /** Render circular page buttons instead of rounded rectangles. Defaults to `false`. */\n rounded?: boolean\n /** Disable the whole control. Defaults to `false`. */\n disabled?: boolean\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi)\n\n/**\n * A page navigator — previous/next arrows around a numbered range with `…` gaps (`1 … 4 5 6 … 10`),\n * the classic pager. Reusable across tables, lists, and galleries: drive it with `count` (total\n * pages) + `page`/`onChange`, computing `count` as `Math.ceil(total / pageSize)`. The selected page\n * is tinted via the shared `--tz-btn-rgb` pattern; unselected items are bordered (`outlined`) or\n * borderless (`text`). Controlled (`page` + `onChange`) or uncontrolled (`defaultPage`).\n */\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n {\n count,\n page,\n defaultPage = 1,\n onChange,\n siblingCount = 1,\n boundaryCount = 1,\n showFirstButton = false,\n showLastButton = false,\n hidePrevButton = false,\n hideNextButton = false,\n variant = 'outlined',\n size = 'md',\n color = 'accent',\n rounded = false,\n disabled = false,\n className,\n style,\n 'aria-label': ariaLabel = 'Pagination',\n ...props\n },\n ref,\n) {\n const isControlled = page !== undefined\n const [internal, setInternal] = useState(defaultPage)\n const lastPage = Math.max(count, 1)\n const current = clamp(isControlled ? page! : internal, 1, lastPage)\n\n const go = (next: number) => {\n const target = clamp(next, 1, lastPage)\n if (target === current) return\n if (!isControlled) setInternal(target)\n onChange?.(target)\n }\n\n const t = useT()\n const items = paginationRange({ count, page: current, siblingCount, boundaryCount })\n\n // The selected fill + its readable text color, derived once via the shared button-tint vars.\n const rootStyle = {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-btn-on': `var(--tz-color-${color}-contrast, #fff)`,\n ...style,\n } as CSSProperties\n\n // An arrow / jump control. `flip` mirrors the (left-pointing) icon to face right — the icon set has\n // no matching plain right arrow, so the next/last glyphs are the left ones flipped for symmetry.\n const control = (\n key: string,\n icon: IconName,\n label: string,\n target: number,\n hidden: boolean,\n atBound: boolean,\n flip = false,\n ): ReactNode =>\n hidden ? null : (\n <li key={key} className={styles.item}>\n <button\n type=\"button\"\n className={clsx(styles.page, styles.arrow)}\n aria-label={label}\n disabled={disabled || atBound}\n onClick={() => go(target)}\n >\n <Icon name={icon} size={size} className={flip ? styles.flip : undefined} />\n </button>\n </li>\n )\n\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel}\n className={clsx(\n styles.pagination,\n styles[variant],\n styles[size],\n rounded && styles.rounded,\n className,\n )}\n style={rootStyle}\n {...props}\n >\n <ul className={styles.list}>\n {showFirstButton &&\n control('first', 'Previous', t('pagination.first'), 1, false, current <= 1)}\n {control(\n 'prev',\n 'ArrowLeft',\n t('pagination.previous'),\n current - 1,\n hidePrevButton,\n current <= 1,\n )}\n {items.map((item, i) =>\n typeof item === 'number' ? (\n <li key={item} className={styles.item}>\n <button\n type=\"button\"\n className={clsx(styles.page, item === current && styles.selected)}\n aria-label={t('pagination.page', { page: item })}\n aria-current={item === current ? 'page' : undefined}\n disabled={disabled}\n onClick={() => go(item)}\n >\n {item}\n </button>\n </li>\n ) : (\n <li key={`${item}-${i}`} className={styles.item} aria-hidden>\n <span className={styles.ellipsis}>…</span>\n </li>\n ),\n )}\n {control(\n 'next',\n 'ArrowLeft',\n t('pagination.next'),\n current + 1,\n hideNextButton,\n current >= count,\n true,\n )}\n {showLastButton &&\n control('last', 'Next', t('pagination.last'), count, false, current >= count)}\n </ul>\n </nav>\n )\n})\n"],"names":["range","start","end","_","i","paginationRange","count","page","siblingCount","boundaryCount","startPages","endPages","siblingsStart","siblingsEnd","clamp","n","lo","hi","Pagination","forwardRef","defaultPage","onChange","showFirstButton","showLastButton","hidePrevButton","hideNextButton","variant","size","color","rounded","disabled","className","style","ariaLabel","props","ref","isControlled","internal","setInternal","useState","lastPage","current","go","next","target","t","useT","items","rootStyle","control","key","icon","label","hidden","atBound","flip","jsx","styles","clsx","Icon","jsxs","item"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const r=require("react/jsx-runtime"),N=require("react"),d=require("clsx"),U=require("./Icon-CXTl_QAP.cjs"),V=require("./ConfigProvider-ByOFXVyP.cjs"),x=(e,t)=>Array.from({length:Math.max(t-e+1,0)},(l,s)=>e+s);function W({count:e,page:t,siblingCount:l=1,boundaryCount:s=1}){if(e<=0)return[];const o=x(1,Math.min(s,e)),p=x(Math.max(e-s+1,s+1),e),m=Math.max(Math.min(t-l,e-s-l*2-1),s+2),g=Math.min(Math.max(t+l,s+l*2+2),p.length>0?p[0]-2:e-1);return[...o,...m>s+2?["start-ellipsis"]:s+1<e-s?[s+1]:[],...x(m,g),...g<e-s-1?["end-ellipsis"]:e-s>s?[e-s]:[],...p]}const X="_pagination_wk3op_3",Y="_list_wk3op_8",Z="_item_wk3op_18",b="_sm_wk3op_28",u="_md_wk3op_33",y="_lg_wk3op_38",C="_page_wk3op_45",ss="_selected_wk3op_64",es="_outlined_wk3op_80",as="_rounded_wk3op_96",ts="_arrow_wk3op_26",is="_flip_wk3op_107",ls="_ellipsis_wk3op_112",a={pagination:X,list:Y,item:Z,sm:b,md:u,lg:y,page:C,selected:ss,outlined:es,rounded:as,arrow:ts,flip:is,ellipsis:ls},P=(e,t,l)=>Math.min(Math.max(e,t),l),ns=N.forwardRef(function({count:t,page:l,defaultPage:s=1,onChange:o,siblingCount:p=1,boundaryCount:m=1,showFirstButton:g=!1,showLastButton:q=!1,hidePrevButton:$=!1,hideNextButton:z=!1,variant:A="outlined",size:w="md",color:h="accent",rounded:I=!1,disabled:k=!1,className:R,style:S,"aria-label":L="Pagination",...E},T){const j=l!==void 0,[B,D]=N.useState(s),v=Math.max(t,1),n=P(j?l:B,1,v),M=i=>{const c=P(i,1,v);c!==n&&(j||D(c),o==null||o(c))},_=V.useT(),F=W({count:t,page:n,siblingCount:p,boundaryCount:m}),G={"--tz-btn-rgb":`var(--tz-color-${h}-rgb)`,"--tz-btn-on":`var(--tz-color-${h}-contrast, #fff)`,...S},f=(i,c,H,J,K,O,Q=!1)=>K?null:r.jsx("li",{className:a.item,children:r.jsx("button",{type:"button",className:d.clsx(a.page,a.arrow),"aria-label":H,disabled:k||O,onClick:()=>M(J),children:r.jsx(U.Icon,{name:c,size:w,className:Q?a.flip:void 0})})},i);return r.jsx("nav",{ref:T,"aria-label":L,className:d.clsx(a.pagination,a[A],a[w],I&&a.rounded,R),style:G,...E,children:r.jsxs("ul",{className:a.list,children:[g&&f("first","Previous",_("pagination.first"),1,!1,n<=1),f("prev","ArrowLeft",_("pagination.previous"),n-1,$,n<=1),F.map((i,c)=>typeof i=="number"?r.jsx("li",{className:a.item,children:r.jsx("button",{type:"button",className:d.clsx(a.page,i===n&&a.selected),"aria-label":_("pagination.page",{page:i}),"aria-current":i===n?"page":void 0,disabled:k,onClick:()=>M(i),children:i})},i):r.jsx("li",{className:a.item,"aria-hidden":!0,children:r.jsx("span",{className:a.ellipsis,children:"…"})},`${i}-${c}`)),f("next","ArrowLeft",_("pagination.next"),n+1,z,n>=t,!0),q&&f("last","Next",_("pagination.last"),t,!1,n>=t)]})})});exports.Pagination=ns;
2
- //# sourceMappingURL=Pagination-DRwTLPh8.cjs.map
1
+ "use strict";const r=require("react/jsx-runtime"),N=require("react"),d=require("clsx"),U=require("./Icon-CXTl_QAP.cjs"),V=require("./ConfigProvider-BHNx-NHV.cjs"),x=(e,t)=>Array.from({length:Math.max(t-e+1,0)},(l,s)=>e+s);function W({count:e,page:t,siblingCount:l=1,boundaryCount:s=1}){if(e<=0)return[];const o=x(1,Math.min(s,e)),p=x(Math.max(e-s+1,s+1),e),m=Math.max(Math.min(t-l,e-s-l*2-1),s+2),g=Math.min(Math.max(t+l,s+l*2+2),p.length>0?p[0]-2:e-1);return[...o,...m>s+2?["start-ellipsis"]:s+1<e-s?[s+1]:[],...x(m,g),...g<e-s-1?["end-ellipsis"]:e-s>s?[e-s]:[],...p]}const X="_pagination_wk3op_3",Y="_list_wk3op_8",Z="_item_wk3op_18",b="_sm_wk3op_28",u="_md_wk3op_33",y="_lg_wk3op_38",C="_page_wk3op_45",ss="_selected_wk3op_64",es="_outlined_wk3op_80",as="_rounded_wk3op_96",ts="_arrow_wk3op_26",is="_flip_wk3op_107",ls="_ellipsis_wk3op_112",a={pagination:X,list:Y,item:Z,sm:b,md:u,lg:y,page:C,selected:ss,outlined:es,rounded:as,arrow:ts,flip:is,ellipsis:ls},P=(e,t,l)=>Math.min(Math.max(e,t),l),ns=N.forwardRef(function({count:t,page:l,defaultPage:s=1,onChange:o,siblingCount:p=1,boundaryCount:m=1,showFirstButton:g=!1,showLastButton:q=!1,hidePrevButton:$=!1,hideNextButton:z=!1,variant:A="outlined",size:w="md",color:h="accent",rounded:I=!1,disabled:k=!1,className:R,style:S,"aria-label":L="Pagination",...E},T){const j=l!==void 0,[B,D]=N.useState(s),v=Math.max(t,1),n=P(j?l:B,1,v),M=i=>{const c=P(i,1,v);c!==n&&(j||D(c),o==null||o(c))},_=V.useT(),F=W({count:t,page:n,siblingCount:p,boundaryCount:m}),G={"--tz-btn-rgb":`var(--tz-color-${h}-rgb)`,"--tz-btn-on":`var(--tz-color-${h}-contrast, #fff)`,...S},f=(i,c,H,J,K,O,Q=!1)=>K?null:r.jsx("li",{className:a.item,children:r.jsx("button",{type:"button",className:d.clsx(a.page,a.arrow),"aria-label":H,disabled:k||O,onClick:()=>M(J),children:r.jsx(U.Icon,{name:c,size:w,className:Q?a.flip:void 0})})},i);return r.jsx("nav",{ref:T,"aria-label":L,className:d.clsx(a.pagination,a[A],a[w],I&&a.rounded,R),style:G,...E,children:r.jsxs("ul",{className:a.list,children:[g&&f("first","Previous",_("pagination.first"),1,!1,n<=1),f("prev","ArrowLeft",_("pagination.previous"),n-1,$,n<=1),F.map((i,c)=>typeof i=="number"?r.jsx("li",{className:a.item,children:r.jsx("button",{type:"button",className:d.clsx(a.page,i===n&&a.selected),"aria-label":_("pagination.page",{page:i}),"aria-current":i===n?"page":void 0,disabled:k,onClick:()=>M(i),children:i})},i):r.jsx("li",{className:a.item,"aria-hidden":!0,children:r.jsx("span",{className:a.ellipsis,children:"…"})},`${i}-${c}`)),f("next","ArrowLeft",_("pagination.next"),n+1,z,n>=t,!0),q&&f("last","Next",_("pagination.last"),t,!1,n>=t)]})})});exports.Pagination=ns;
2
+ //# sourceMappingURL=Pagination-Dcs_Znx3.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination-DRwTLPh8.cjs","sources":["../src/components/Pagination/paginationRange.ts","../src/components/Pagination/Pagination.tsx"],"sourcesContent":["/** A gap placeholder rendered as `…` — at the start (`1 … 4`) or end (`6 … 10`) of the range. */\nexport type PaginationEllipsis = 'start-ellipsis' | 'end-ellipsis'\n\n/** One item in a pagination range: a 1-based page number, or an ellipsis placeholder. */\nexport type PaginationItem = number | PaginationEllipsis\n\n/** Inputs for {@link paginationRange}. */\nexport interface PaginationRangeOptions {\n /** Total number of pages. */\n count: number\n /** Current page (1-based). */\n page: number\n /** Pages shown on each side of the current page. Defaults to `1`. */\n siblingCount?: number\n /** Pages always shown at the start and end. Defaults to `1`. */\n boundaryCount?: number\n}\n\n/** Inclusive integer range `[start, end]` (empty when `end < start`). */\nconst range = (start: number, end: number): number[] =>\n Array.from({ length: Math.max(end - start + 1, 0) }, (_, i) => start + i)\n\n/**\n * Build the page-item sequence for a pager — the boundary pages, the current page with its siblings,\n * and `start`/`end` ellipses where pages are skipped (the classic `1 … 4 5 6 … 10`). Pure and\n * framework-free so it can be unit-tested in isolation and reused. Assumes `1 <= page <= count`.\n */\nexport function paginationRange({\n count,\n page,\n siblingCount = 1,\n boundaryCount = 1,\n}: PaginationRangeOptions): PaginationItem[] {\n if (count <= 0) return []\n\n // Pages pinned at each edge.\n const startPages = range(1, Math.min(boundaryCount, count))\n const endPages = range(Math.max(count - boundaryCount + 1, boundaryCount + 1), count)\n\n // The window of pages around the current one, clamped so it never overlaps the boundaries.\n const siblingsStart = Math.max(\n Math.min(page - siblingCount, count - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2,\n )\n const siblingsEnd = Math.min(\n Math.max(page + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0] - 2 : count - 1,\n )\n\n return [\n ...startPages,\n // A start ellipsis, OR the single page that sits between the start boundary and the siblings.\n ...(siblingsStart > boundaryCount + 2\n ? (['start-ellipsis'] as PaginationItem[])\n : boundaryCount + 1 < count - boundaryCount\n ? [boundaryCount + 1]\n : []),\n ...range(siblingsStart, siblingsEnd),\n // An end ellipsis, OR the single page between the siblings and the end boundary.\n ...(siblingsEnd < count - boundaryCount - 1\n ? (['end-ellipsis'] as PaginationItem[])\n : count - boundaryCount > boundaryCount\n ? [count - boundaryCount]\n : []),\n ...endPages,\n ]\n}\n","import {\n forwardRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { Icon, type IconName } from '../Icon'\nimport { useT, type ThemeColor } from '../../theme'\nimport { paginationRange } from './paginationRange'\nimport styles from './Pagination.module.css'\n\nexport type PaginationVariant = 'outlined' | 'text'\nexport type PaginationSize = 'sm' | 'md' | 'lg'\n\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'color' | 'onChange'> {\n /** Total number of pages (required). From a row count, pass `Math.ceil(total / pageSize)`. */\n count: number\n /** Controlled current page (1-based). */\n page?: number\n /** Initial page for uncontrolled use (1-based). Defaults to `1`. */\n defaultPage?: number\n /** Fires with the next page (1-based) when a page or arrow is activated. */\n onChange?: (page: number) => void\n /** Pages shown on each side of the current page. Defaults to `1`. */\n siblingCount?: number\n /** Pages always shown at the start and end. Defaults to `1`. */\n boundaryCount?: number\n /** Show a jump-to-first-page button before the previous arrow. Defaults to `false`. */\n showFirstButton?: boolean\n /** Show a jump-to-last-page button after the next arrow. Defaults to `false`. */\n showLastButton?: boolean\n /** Hide the previous-page arrow. Defaults to `false`. */\n hidePrevButton?: boolean\n /** Hide the next-page arrow. Defaults to `false`. */\n hideNextButton?: boolean\n /** Item style: `outlined` (bordered boxes, default) or `text` (borderless). */\n variant?: PaginationVariant\n /** Control size — sets the box, font, and icon sizes. Defaults to `md`. */\n size?: PaginationSize\n /** Theme palette token that tints the selected page. Defaults to `accent`. */\n color?: ThemeColor\n /** Render circular page buttons instead of rounded rectangles. Defaults to `false`. */\n rounded?: boolean\n /** Disable the whole control. Defaults to `false`. */\n disabled?: boolean\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi)\n\n/**\n * A page navigator — previous/next arrows around a numbered range with `…` gaps (`1 … 4 5 6 … 10`),\n * the classic pager. Reusable across tables, lists, and galleries: drive it with `count` (total\n * pages) + `page`/`onChange`, computing `count` as `Math.ceil(total / pageSize)`. The selected page\n * is tinted via the shared `--tz-btn-rgb` pattern; unselected items are bordered (`outlined`) or\n * borderless (`text`). Controlled (`page` + `onChange`) or uncontrolled (`defaultPage`).\n */\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n {\n count,\n page,\n defaultPage = 1,\n onChange,\n siblingCount = 1,\n boundaryCount = 1,\n showFirstButton = false,\n showLastButton = false,\n hidePrevButton = false,\n hideNextButton = false,\n variant = 'outlined',\n size = 'md',\n color = 'accent',\n rounded = false,\n disabled = false,\n className,\n style,\n 'aria-label': ariaLabel = 'Pagination',\n ...props\n },\n ref,\n) {\n const isControlled = page !== undefined\n const [internal, setInternal] = useState(defaultPage)\n const lastPage = Math.max(count, 1)\n const current = clamp(isControlled ? page! : internal, 1, lastPage)\n\n const go = (next: number) => {\n const target = clamp(next, 1, lastPage)\n if (target === current) return\n if (!isControlled) setInternal(target)\n onChange?.(target)\n }\n\n const t = useT()\n const items = paginationRange({ count, page: current, siblingCount, boundaryCount })\n\n // The selected fill + its readable text color, derived once via the shared button-tint vars.\n const rootStyle = {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-btn-on': `var(--tz-color-${color}-contrast, #fff)`,\n ...style,\n } as CSSProperties\n\n // An arrow / jump control. `flip` mirrors the (left-pointing) icon to face right — the icon set has\n // no matching plain right arrow, so the next/last glyphs are the left ones flipped for symmetry.\n const control = (\n key: string,\n icon: IconName,\n label: string,\n target: number,\n hidden: boolean,\n atBound: boolean,\n flip = false,\n ): ReactNode =>\n hidden ? null : (\n <li key={key} className={styles.item}>\n <button\n type=\"button\"\n className={clsx(styles.page, styles.arrow)}\n aria-label={label}\n disabled={disabled || atBound}\n onClick={() => go(target)}\n >\n <Icon name={icon} size={size} className={flip ? styles.flip : undefined} />\n </button>\n </li>\n )\n\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel}\n className={clsx(\n styles.pagination,\n styles[variant],\n styles[size],\n rounded && styles.rounded,\n className,\n )}\n style={rootStyle}\n {...props}\n >\n <ul className={styles.list}>\n {showFirstButton &&\n control('first', 'Previous', t('pagination.first'), 1, false, current <= 1)}\n {control(\n 'prev',\n 'ArrowLeft',\n t('pagination.previous'),\n current - 1,\n hidePrevButton,\n current <= 1,\n )}\n {items.map((item, i) =>\n typeof item === 'number' ? (\n <li key={item} className={styles.item}>\n <button\n type=\"button\"\n className={clsx(styles.page, item === current && styles.selected)}\n aria-label={t('pagination.page', { page: item })}\n aria-current={item === current ? 'page' : undefined}\n disabled={disabled}\n onClick={() => go(item)}\n >\n {item}\n </button>\n </li>\n ) : (\n <li key={`${item}-${i}`} className={styles.item} aria-hidden>\n <span className={styles.ellipsis}>…</span>\n </li>\n ),\n )}\n {control(\n 'next',\n 'ArrowLeft',\n t('pagination.next'),\n current + 1,\n hideNextButton,\n current >= count,\n true,\n )}\n {showLastButton &&\n control('last', 'Next', t('pagination.last'), count, false, current >= count)}\n </ul>\n </nav>\n )\n})\n"],"names":["range","start","end","_","i","paginationRange","count","page","siblingCount","boundaryCount","startPages","endPages","siblingsStart","siblingsEnd","clamp","n","lo","hi","Pagination","forwardRef","defaultPage","onChange","showFirstButton","showLastButton","hidePrevButton","hideNextButton","variant","size","color","rounded","disabled","className","style","ariaLabel","props","ref","isControlled","internal","setInternal","useState","lastPage","current","go","next","target","t","useT","items","rootStyle","control","key","icon","label","hidden","atBound","flip","jsx","styles","clsx","Icon","jsxs","item"],"mappings":"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"}
1
+ {"version":3,"file":"Pagination-Dcs_Znx3.cjs","sources":["../src/components/Pagination/paginationRange.ts","../src/components/Pagination/Pagination.tsx"],"sourcesContent":["/** A gap placeholder rendered as `…` — at the start (`1 … 4`) or end (`6 … 10`) of the range. */\nexport type PaginationEllipsis = 'start-ellipsis' | 'end-ellipsis'\n\n/** One item in a pagination range: a 1-based page number, or an ellipsis placeholder. */\nexport type PaginationItem = number | PaginationEllipsis\n\n/** Inputs for {@link paginationRange}. */\nexport interface PaginationRangeOptions {\n /** Total number of pages. */\n count: number\n /** Current page (1-based). */\n page: number\n /** Pages shown on each side of the current page. Defaults to `1`. */\n siblingCount?: number\n /** Pages always shown at the start and end. Defaults to `1`. */\n boundaryCount?: number\n}\n\n/** Inclusive integer range `[start, end]` (empty when `end < start`). */\nconst range = (start: number, end: number): number[] =>\n Array.from({ length: Math.max(end - start + 1, 0) }, (_, i) => start + i)\n\n/**\n * Build the page-item sequence for a pager — the boundary pages, the current page with its siblings,\n * and `start`/`end` ellipses where pages are skipped (the classic `1 … 4 5 6 … 10`). Pure and\n * framework-free so it can be unit-tested in isolation and reused. Assumes `1 <= page <= count`.\n */\nexport function paginationRange({\n count,\n page,\n siblingCount = 1,\n boundaryCount = 1,\n}: PaginationRangeOptions): PaginationItem[] {\n if (count <= 0) return []\n\n // Pages pinned at each edge.\n const startPages = range(1, Math.min(boundaryCount, count))\n const endPages = range(Math.max(count - boundaryCount + 1, boundaryCount + 1), count)\n\n // The window of pages around the current one, clamped so it never overlaps the boundaries.\n const siblingsStart = Math.max(\n Math.min(page - siblingCount, count - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2,\n )\n const siblingsEnd = Math.min(\n Math.max(page + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0] - 2 : count - 1,\n )\n\n return [\n ...startPages,\n // A start ellipsis, OR the single page that sits between the start boundary and the siblings.\n ...(siblingsStart > boundaryCount + 2\n ? (['start-ellipsis'] as PaginationItem[])\n : boundaryCount + 1 < count - boundaryCount\n ? [boundaryCount + 1]\n : []),\n ...range(siblingsStart, siblingsEnd),\n // An end ellipsis, OR the single page between the siblings and the end boundary.\n ...(siblingsEnd < count - boundaryCount - 1\n ? (['end-ellipsis'] as PaginationItem[])\n : count - boundaryCount > boundaryCount\n ? [count - boundaryCount]\n : []),\n ...endPages,\n ]\n}\n","import {\n forwardRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { Icon, type IconName } from '../Icon'\nimport { useT, type ThemeColor } from '../../theme'\nimport { paginationRange } from './paginationRange'\nimport styles from './Pagination.module.css'\n\nexport type PaginationVariant = 'outlined' | 'text'\nexport type PaginationSize = 'sm' | 'md' | 'lg'\n\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'color' | 'onChange'> {\n /** Total number of pages (required). From a row count, pass `Math.ceil(total / pageSize)`. */\n count: number\n /** Controlled current page (1-based). */\n page?: number\n /** Initial page for uncontrolled use (1-based). Defaults to `1`. */\n defaultPage?: number\n /** Fires with the next page (1-based) when a page or arrow is activated. */\n onChange?: (page: number) => void\n /** Pages shown on each side of the current page. Defaults to `1`. */\n siblingCount?: number\n /** Pages always shown at the start and end. Defaults to `1`. */\n boundaryCount?: number\n /** Show a jump-to-first-page button before the previous arrow. Defaults to `false`. */\n showFirstButton?: boolean\n /** Show a jump-to-last-page button after the next arrow. Defaults to `false`. */\n showLastButton?: boolean\n /** Hide the previous-page arrow. Defaults to `false`. */\n hidePrevButton?: boolean\n /** Hide the next-page arrow. Defaults to `false`. */\n hideNextButton?: boolean\n /** Item style: `outlined` (bordered boxes, default) or `text` (borderless). */\n variant?: PaginationVariant\n /** Control size — sets the box, font, and icon sizes. Defaults to `md`. */\n size?: PaginationSize\n /** Theme palette token that tints the selected page. Defaults to `accent`. */\n color?: ThemeColor\n /** Render circular page buttons instead of rounded rectangles. Defaults to `false`. */\n rounded?: boolean\n /** Disable the whole control. Defaults to `false`. */\n disabled?: boolean\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi)\n\n/**\n * A page navigator — previous/next arrows around a numbered range with `…` gaps (`1 … 4 5 6 … 10`),\n * the classic pager. Reusable across tables, lists, and galleries: drive it with `count` (total\n * pages) + `page`/`onChange`, computing `count` as `Math.ceil(total / pageSize)`. The selected page\n * is tinted via the shared `--tz-btn-rgb` pattern; unselected items are bordered (`outlined`) or\n * borderless (`text`). Controlled (`page` + `onChange`) or uncontrolled (`defaultPage`).\n */\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n {\n count,\n page,\n defaultPage = 1,\n onChange,\n siblingCount = 1,\n boundaryCount = 1,\n showFirstButton = false,\n showLastButton = false,\n hidePrevButton = false,\n hideNextButton = false,\n variant = 'outlined',\n size = 'md',\n color = 'accent',\n rounded = false,\n disabled = false,\n className,\n style,\n 'aria-label': ariaLabel = 'Pagination',\n ...props\n },\n ref,\n) {\n const isControlled = page !== undefined\n const [internal, setInternal] = useState(defaultPage)\n const lastPage = Math.max(count, 1)\n const current = clamp(isControlled ? page! : internal, 1, lastPage)\n\n const go = (next: number) => {\n const target = clamp(next, 1, lastPage)\n if (target === current) return\n if (!isControlled) setInternal(target)\n onChange?.(target)\n }\n\n const t = useT()\n const items = paginationRange({ count, page: current, siblingCount, boundaryCount })\n\n // The selected fill + its readable text color, derived once via the shared button-tint vars.\n const rootStyle = {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-btn-on': `var(--tz-color-${color}-contrast, #fff)`,\n ...style,\n } as CSSProperties\n\n // An arrow / jump control. `flip` mirrors the (left-pointing) icon to face right — the icon set has\n // no matching plain right arrow, so the next/last glyphs are the left ones flipped for symmetry.\n const control = (\n key: string,\n icon: IconName,\n label: string,\n target: number,\n hidden: boolean,\n atBound: boolean,\n flip = false,\n ): ReactNode =>\n hidden ? null : (\n <li key={key} className={styles.item}>\n <button\n type=\"button\"\n className={clsx(styles.page, styles.arrow)}\n aria-label={label}\n disabled={disabled || atBound}\n onClick={() => go(target)}\n >\n <Icon name={icon} size={size} className={flip ? styles.flip : undefined} />\n </button>\n </li>\n )\n\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel}\n className={clsx(\n styles.pagination,\n styles[variant],\n styles[size],\n rounded && styles.rounded,\n className,\n )}\n style={rootStyle}\n {...props}\n >\n <ul className={styles.list}>\n {showFirstButton &&\n control('first', 'Previous', t('pagination.first'), 1, false, current <= 1)}\n {control(\n 'prev',\n 'ArrowLeft',\n t('pagination.previous'),\n current - 1,\n hidePrevButton,\n current <= 1,\n )}\n {items.map((item, i) =>\n typeof item === 'number' ? (\n <li key={item} className={styles.item}>\n <button\n type=\"button\"\n className={clsx(styles.page, item === current && styles.selected)}\n aria-label={t('pagination.page', { page: item })}\n aria-current={item === current ? 'page' : undefined}\n disabled={disabled}\n onClick={() => go(item)}\n >\n {item}\n </button>\n </li>\n ) : (\n <li key={`${item}-${i}`} className={styles.item} aria-hidden>\n <span className={styles.ellipsis}>…</span>\n </li>\n ),\n )}\n {control(\n 'next',\n 'ArrowLeft',\n t('pagination.next'),\n current + 1,\n hideNextButton,\n current >= count,\n true,\n )}\n {showLastButton &&\n control('last', 'Next', t('pagination.last'), count, false, current >= count)}\n </ul>\n </nav>\n )\n})\n"],"names":["range","start","end","_","i","paginationRange","count","page","siblingCount","boundaryCount","startPages","endPages","siblingsStart","siblingsEnd","clamp","n","lo","hi","Pagination","forwardRef","defaultPage","onChange","showFirstButton","showLastButton","hidePrevButton","hideNextButton","variant","size","color","rounded","disabled","className","style","ariaLabel","props","ref","isControlled","internal","setInternal","useState","lastPage","current","go","next","target","t","useT","items","rootStyle","control","key","icon","label","hidden","atBound","flip","jsx","styles","clsx","Icon","jsxs","item"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const e=require("react/jsx-runtime"),i=require("react"),c=require("./Button-D4bfVNNa.cjs"),j=require("./Icon-CXTl_QAP.cjs"),B=require("./Modal-B2YSCVVt.cjs"),b=require("./Typography-BFatE1_A.cjs"),q=require("./ConfigProvider-ByOFXVyP.cjs"),p="_body_1xrr0_3",C="_iconBox_1xrr0_13",a={body:p,iconBox:C},_=i.forwardRef(function({open:l,onClose:s,onConfirm:d,title:u,message:m,confirmLabel:x,cancelLabel:h,loading:g=!1},y){const n=q.useT(),[f,t]=i.useState(!1),o=g||f,r=()=>{o||s()},v=async()=>{try{t(!0),await d(),s()}catch{}finally{t(!1)}};return e.jsx(B.Modal,{ref:y,open:l,onClose:r,size:"sm",title:u??n("removeDialog.title"),showCloseButton:!o,closeOnBackdrop:!o,closeOnEscape:!o,footer:e.jsxs(e.Fragment,{children:[e.jsx(c.Button,{variant:"text",onClick:r,disabled:o,children:h??n("common.cancel")}),e.jsx(c.Button,{color:"error",variant:"filled",onClick:v,loading:o,children:x??n("common.delete")})]}),children:e.jsxs("div",{className:a.body,children:[e.jsx("div",{className:a.iconBox,"aria-hidden":!0,children:e.jsx(j.Icon,{name:"Trash"})}),e.jsx(b.Typography,{align:"center",children:m??n("removeDialog.message")})]})})});exports.RemoveDialog=_;
2
- //# sourceMappingURL=RemoveDialog-ClyZKyUG.cjs.map
1
+ "use strict";const e=require("react/jsx-runtime"),i=require("react"),c=require("./Button-Cj6pckNl.cjs"),j=require("./Icon-CXTl_QAP.cjs"),B=require("./Modal-CO3c3sGY.cjs"),b=require("./Typography-BFatE1_A.cjs"),q=require("./ConfigProvider-BHNx-NHV.cjs"),p="_body_1xrr0_3",C="_iconBox_1xrr0_13",a={body:p,iconBox:C},_=i.forwardRef(function({open:l,onClose:s,onConfirm:d,title:u,message:m,confirmLabel:x,cancelLabel:h,loading:g=!1},y){const n=q.useT(),[f,t]=i.useState(!1),o=g||f,r=()=>{o||s()},v=async()=>{try{t(!0),await d(),s()}catch{}finally{t(!1)}};return e.jsx(B.Modal,{ref:y,open:l,onClose:r,size:"sm",title:u??n("removeDialog.title"),showCloseButton:!o,closeOnBackdrop:!o,closeOnEscape:!o,footer:e.jsxs(e.Fragment,{children:[e.jsx(c.Button,{variant:"text",onClick:r,disabled:o,children:h??n("common.cancel")}),e.jsx(c.Button,{color:"error",variant:"filled",onClick:v,loading:o,children:x??n("common.delete")})]}),children:e.jsxs("div",{className:a.body,children:[e.jsx("div",{className:a.iconBox,"aria-hidden":!0,children:e.jsx(j.Icon,{name:"Trash"})}),e.jsx(b.Typography,{align:"center",children:m??n("removeDialog.message")})]})})});exports.RemoveDialog=_;
2
+ //# sourceMappingURL=RemoveDialog-Cwtq9wAt.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RemoveDialog-ClyZKyUG.cjs","sources":["../src/components/RemoveDialog/RemoveDialog.tsx"],"sourcesContent":["import { forwardRef, useState, type ReactNode } from 'react'\nimport { useT } from '../../theme'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Modal } from '../Modal'\nimport { Typography } from '../Typography'\nimport styles from './RemoveDialog.module.css'\n\nexport interface RemoveDialogProps {\n /** Whether the dialog is open. */\n open: boolean\n /** Called on Cancel, the × button, backdrop, or Escape (ignored while a confirm is in flight). */\n onClose: () => void\n /**\n * The destructive action. May be async — while its promise is pending the Delete button shows a\n * loader and the dialog locks (no dismiss); on success the dialog **auto-closes**, on rejection it\n * stays open so the user can retry (surface the error yourself, e.g. a toast).\n */\n onConfirm: () => void | Promise<void>\n /** Header title. Defaults to `\"Remove\"`. */\n title?: ReactNode\n /** Body prompt shown under the icon. Defaults to `\"Are you sure you want to delete?\"`. */\n message?: ReactNode\n /** Confirm (destructive) button label. Defaults to `\"Delete\"`. */\n confirmLabel?: string\n /** Cancel button label. Defaults to `\"Cancel\"`. */\n cancelLabel?: string\n /** External loading override — combined with the internal async-confirm state. */\n loading?: boolean\n}\n\n/**\n * A ready-made delete confirmation — a thin convenience wrapper over `Modal` for the ubiquitous\n * \"Are you sure you want to delete?\" prompt. Hardcodes the destructive flavor (a `Trash` glyph in a\n * soft error circle + an `error` Delete button); just wire `open` / `onClose` / `onConfirm`. An async\n * `onConfirm` drives the button loader and locks dismissal, then auto-closes on success. Built on\n * `Modal`, so it inherits the portal, scroll-lock, focus-trap, and backdrop/Escape dismissal.\n *\n * @example\n * const { isOpen, open, close } = useDisclosure()\n * <RemoveDialog open={isOpen} onClose={close} onConfirm={() => deleteItem(id)} />\n */\nexport const RemoveDialog = forwardRef<HTMLDivElement, RemoveDialogProps>(function RemoveDialog(\n { open, onClose, onConfirm, title, message, confirmLabel, cancelLabel, loading = false },\n ref,\n) {\n const t = useT()\n const [submitting, setSubmitting] = useState(false)\n const busy = loading || submitting\n\n // dismissal is blocked while the confirm is running (so the delete can't be abandoned mid-flight)\n const handleClose = () => {\n if (!busy) onClose()\n }\n\n const handleConfirm = async () => {\n try {\n setSubmitting(true)\n await onConfirm()\n onClose() // auto-close on success\n } catch {\n // keep the dialog open on failure so the user can retry; the consumer surfaces the error\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <Modal\n ref={ref}\n open={open}\n onClose={handleClose}\n size=\"sm\"\n title={title ?? t('removeDialog.title')}\n showCloseButton={!busy}\n closeOnBackdrop={!busy}\n closeOnEscape={!busy}\n footer={\n <>\n <Button variant=\"text\" onClick={handleClose} disabled={busy}>\n {cancelLabel ?? t('common.cancel')}\n </Button>\n <Button color=\"error\" variant=\"filled\" onClick={handleConfirm} loading={busy}>\n {confirmLabel ?? t('common.delete')}\n </Button>\n </>\n }\n >\n <div className={styles.body}>\n <div className={styles.iconBox} aria-hidden>\n <Icon name=\"Trash\" />\n </div>\n <Typography align=\"center\">{message ?? t('removeDialog.message')}</Typography>\n </div>\n </Modal>\n )\n})\n"],"names":["RemoveDialog","forwardRef","open","onClose","onConfirm","title","message","confirmLabel","cancelLabel","loading","ref","t","useT","submitting","setSubmitting","useState","busy","handleClose","handleConfirm","jsx","Modal","jsxs","Fragment","Button","styles","Icon","Typography"],"mappings":"0TA0CaA,EAAeC,EAAAA,WAA8C,SACxE,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,EAAW,MAAAC,EAAO,QAAAC,EAAS,aAAAC,EAAc,YAAAC,EAAa,QAAAC,EAAU,EAAA,EACjFC,EACA,CACA,MAAMC,EAAIC,EAAAA,KAAA,EACJ,CAACC,EAAYC,CAAa,EAAIC,EAAAA,SAAS,EAAK,EAC5CC,EAAOP,GAAWI,EAGlBI,EAAc,IAAM,CACnBD,GAAMb,EAAA,CACb,EAEMe,EAAgB,SAAY,CAChC,GAAI,CACFJ,EAAc,EAAI,EAClB,MAAMV,EAAA,EACND,EAAA,CACF,MAAQ,CAER,QAAA,CACEW,EAAc,EAAK,CACrB,CACF,EAEA,OACEK,EAAAA,IAACC,EAAAA,MAAA,CACC,IAAAV,EACA,KAAAR,EACA,QAASe,EACT,KAAK,KACL,MAAOZ,GAASM,EAAE,oBAAoB,EACtC,gBAAiB,CAACK,EAClB,gBAAiB,CAACA,EAClB,cAAe,CAACA,EAChB,OACEK,EAAAA,KAAAC,WAAA,CACE,SAAA,CAAAH,EAAAA,IAACI,EAAAA,OAAA,CAAO,QAAQ,OAAO,QAASN,EAAa,SAAUD,EACpD,SAAAR,GAAeG,EAAE,eAAe,CAAA,CACnC,EACAQ,EAAAA,IAACI,EAAAA,OAAA,CAAO,MAAM,QAAQ,QAAQ,SAAS,QAASL,EAAe,QAASF,EACrE,SAAAT,GAAgBI,EAAE,eAAe,CAAA,CACpC,CAAA,EACF,EAGF,SAAAU,EAAAA,KAAC,MAAA,CAAI,UAAWG,EAAO,KACrB,SAAA,CAAAL,EAAAA,IAAC,MAAA,CAAI,UAAWK,EAAO,QAAS,cAAW,GACzC,SAAAL,EAAAA,IAACM,EAAAA,KAAA,CAAK,KAAK,OAAA,CAAQ,CAAA,CACrB,QACCC,EAAAA,WAAA,CAAW,MAAM,SAAU,SAAApB,GAAWK,EAAE,sBAAsB,CAAA,CAAE,CAAA,CAAA,CACnE,CAAA,CAAA,CAGN,CAAC"}
1
+ {"version":3,"file":"RemoveDialog-Cwtq9wAt.cjs","sources":["../src/components/RemoveDialog/RemoveDialog.tsx"],"sourcesContent":["import { forwardRef, useState, type ReactNode } from 'react'\nimport { useT } from '../../theme'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Modal } from '../Modal'\nimport { Typography } from '../Typography'\nimport styles from './RemoveDialog.module.css'\n\nexport interface RemoveDialogProps {\n /** Whether the dialog is open. */\n open: boolean\n /** Called on Cancel, the × button, backdrop, or Escape (ignored while a confirm is in flight). */\n onClose: () => void\n /**\n * The destructive action. May be async — while its promise is pending the Delete button shows a\n * loader and the dialog locks (no dismiss); on success the dialog **auto-closes**, on rejection it\n * stays open so the user can retry (surface the error yourself, e.g. a toast).\n */\n onConfirm: () => void | Promise<void>\n /** Header title. Defaults to `\"Remove\"`. */\n title?: ReactNode\n /** Body prompt shown under the icon. Defaults to `\"Are you sure you want to delete?\"`. */\n message?: ReactNode\n /** Confirm (destructive) button label. Defaults to `\"Delete\"`. */\n confirmLabel?: string\n /** Cancel button label. Defaults to `\"Cancel\"`. */\n cancelLabel?: string\n /** External loading override — combined with the internal async-confirm state. */\n loading?: boolean\n}\n\n/**\n * A ready-made delete confirmation — a thin convenience wrapper over `Modal` for the ubiquitous\n * \"Are you sure you want to delete?\" prompt. Hardcodes the destructive flavor (a `Trash` glyph in a\n * soft error circle + an `error` Delete button); just wire `open` / `onClose` / `onConfirm`. An async\n * `onConfirm` drives the button loader and locks dismissal, then auto-closes on success. Built on\n * `Modal`, so it inherits the portal, scroll-lock, focus-trap, and backdrop/Escape dismissal.\n *\n * @example\n * const { isOpen, open, close } = useDisclosure()\n * <RemoveDialog open={isOpen} onClose={close} onConfirm={() => deleteItem(id)} />\n */\nexport const RemoveDialog = forwardRef<HTMLDivElement, RemoveDialogProps>(function RemoveDialog(\n { open, onClose, onConfirm, title, message, confirmLabel, cancelLabel, loading = false },\n ref,\n) {\n const t = useT()\n const [submitting, setSubmitting] = useState(false)\n const busy = loading || submitting\n\n // dismissal is blocked while the confirm is running (so the delete can't be abandoned mid-flight)\n const handleClose = () => {\n if (!busy) onClose()\n }\n\n const handleConfirm = async () => {\n try {\n setSubmitting(true)\n await onConfirm()\n onClose() // auto-close on success\n } catch {\n // keep the dialog open on failure so the user can retry; the consumer surfaces the error\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <Modal\n ref={ref}\n open={open}\n onClose={handleClose}\n size=\"sm\"\n title={title ?? t('removeDialog.title')}\n showCloseButton={!busy}\n closeOnBackdrop={!busy}\n closeOnEscape={!busy}\n footer={\n <>\n <Button variant=\"text\" onClick={handleClose} disabled={busy}>\n {cancelLabel ?? t('common.cancel')}\n </Button>\n <Button color=\"error\" variant=\"filled\" onClick={handleConfirm} loading={busy}>\n {confirmLabel ?? t('common.delete')}\n </Button>\n </>\n }\n >\n <div className={styles.body}>\n <div className={styles.iconBox} aria-hidden>\n <Icon name=\"Trash\" />\n </div>\n <Typography align=\"center\">{message ?? t('removeDialog.message')}</Typography>\n </div>\n </Modal>\n )\n})\n"],"names":["RemoveDialog","forwardRef","open","onClose","onConfirm","title","message","confirmLabel","cancelLabel","loading","ref","t","useT","submitting","setSubmitting","useState","busy","handleClose","handleConfirm","jsx","Modal","jsxs","Fragment","Button","styles","Icon","Typography"],"mappings":"0TA0CaA,EAAeC,EAAAA,WAA8C,SACxE,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,EAAW,MAAAC,EAAO,QAAAC,EAAS,aAAAC,EAAc,YAAAC,EAAa,QAAAC,EAAU,EAAA,EACjFC,EACA,CACA,MAAMC,EAAIC,EAAAA,KAAA,EACJ,CAACC,EAAYC,CAAa,EAAIC,EAAAA,SAAS,EAAK,EAC5CC,EAAOP,GAAWI,EAGlBI,EAAc,IAAM,CACnBD,GAAMb,EAAA,CACb,EAEMe,EAAgB,SAAY,CAChC,GAAI,CACFJ,EAAc,EAAI,EAClB,MAAMV,EAAA,EACND,EAAA,CACF,MAAQ,CAER,QAAA,CACEW,EAAc,EAAK,CACrB,CACF,EAEA,OACEK,EAAAA,IAACC,EAAAA,MAAA,CACC,IAAAV,EACA,KAAAR,EACA,QAASe,EACT,KAAK,KACL,MAAOZ,GAASM,EAAE,oBAAoB,EACtC,gBAAiB,CAACK,EAClB,gBAAiB,CAACA,EAClB,cAAe,CAACA,EAChB,OACEK,EAAAA,KAAAC,WAAA,CACE,SAAA,CAAAH,EAAAA,IAACI,EAAAA,OAAA,CAAO,QAAQ,OAAO,QAASN,EAAa,SAAUD,EACpD,SAAAR,GAAeG,EAAE,eAAe,CAAA,CACnC,EACAQ,EAAAA,IAACI,EAAAA,OAAA,CAAO,MAAM,QAAQ,QAAQ,SAAS,QAASL,EAAe,QAASF,EACrE,SAAAT,GAAgBI,EAAE,eAAe,CAAA,CACpC,CAAA,EACF,EAGF,SAAAU,EAAAA,KAAC,MAAA,CAAI,UAAWG,EAAO,KACrB,SAAA,CAAAL,EAAAA,IAAC,MAAA,CAAI,UAAWK,EAAO,QAAS,cAAW,GACzC,SAAAL,EAAAA,IAACM,EAAAA,KAAA,CAAK,KAAK,OAAA,CAAQ,CAAA,CACrB,QACCC,EAAAA,WAAA,CAAW,MAAM,SAAU,SAAApB,GAAWK,EAAE,sBAAsB,CAAA,CAAE,CAAA,CAAA,CACnE,CAAA,CAAA,CAGN,CAAC"}
@@ -1,10 +1,10 @@
1
1
  import { jsx as e, jsxs as a, Fragment as b } from "react/jsx-runtime";
2
2
  import { forwardRef as v, useState as B } from "react";
3
- import { B as s } from "./Button-DhEv0YFk.js";
3
+ import { B as s } from "./Button-CUsXYM-m.js";
4
4
  import { I as _ } from "./Icon-CophpkHo.js";
5
- import { M as C } from "./Modal-BuaPDlKV.js";
5
+ import { M as C } from "./Modal-XMRDPHvQ.js";
6
6
  import { T as D } from "./Typography-Cta6Rg4L.js";
7
- import { a as R } from "./ConfigProvider-2c94kUOk.js";
7
+ import { a as R } from "./ConfigProvider-BYruQYHC.js";
8
8
  const T = "_body_1xrr0_3", k = "_iconBox_1xrr0_13", c = {
9
9
  body: T,
10
10
  iconBox: k
@@ -44,4 +44,4 @@ const T = "_body_1xrr0_3", k = "_iconBox_1xrr0_13", c = {
44
44
  export {
45
45
  E as R
46
46
  };
47
- //# sourceMappingURL=RemoveDialog-Bvt6sH79.js.map
47
+ //# sourceMappingURL=RemoveDialog-DU6MqkO8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RemoveDialog-Bvt6sH79.js","sources":["../src/components/RemoveDialog/RemoveDialog.tsx"],"sourcesContent":["import { forwardRef, useState, type ReactNode } from 'react'\nimport { useT } from '../../theme'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Modal } from '../Modal'\nimport { Typography } from '../Typography'\nimport styles from './RemoveDialog.module.css'\n\nexport interface RemoveDialogProps {\n /** Whether the dialog is open. */\n open: boolean\n /** Called on Cancel, the × button, backdrop, or Escape (ignored while a confirm is in flight). */\n onClose: () => void\n /**\n * The destructive action. May be async — while its promise is pending the Delete button shows a\n * loader and the dialog locks (no dismiss); on success the dialog **auto-closes**, on rejection it\n * stays open so the user can retry (surface the error yourself, e.g. a toast).\n */\n onConfirm: () => void | Promise<void>\n /** Header title. Defaults to `\"Remove\"`. */\n title?: ReactNode\n /** Body prompt shown under the icon. Defaults to `\"Are you sure you want to delete?\"`. */\n message?: ReactNode\n /** Confirm (destructive) button label. Defaults to `\"Delete\"`. */\n confirmLabel?: string\n /** Cancel button label. Defaults to `\"Cancel\"`. */\n cancelLabel?: string\n /** External loading override — combined with the internal async-confirm state. */\n loading?: boolean\n}\n\n/**\n * A ready-made delete confirmation — a thin convenience wrapper over `Modal` for the ubiquitous\n * \"Are you sure you want to delete?\" prompt. Hardcodes the destructive flavor (a `Trash` glyph in a\n * soft error circle + an `error` Delete button); just wire `open` / `onClose` / `onConfirm`. An async\n * `onConfirm` drives the button loader and locks dismissal, then auto-closes on success. Built on\n * `Modal`, so it inherits the portal, scroll-lock, focus-trap, and backdrop/Escape dismissal.\n *\n * @example\n * const { isOpen, open, close } = useDisclosure()\n * <RemoveDialog open={isOpen} onClose={close} onConfirm={() => deleteItem(id)} />\n */\nexport const RemoveDialog = forwardRef<HTMLDivElement, RemoveDialogProps>(function RemoveDialog(\n { open, onClose, onConfirm, title, message, confirmLabel, cancelLabel, loading = false },\n ref,\n) {\n const t = useT()\n const [submitting, setSubmitting] = useState(false)\n const busy = loading || submitting\n\n // dismissal is blocked while the confirm is running (so the delete can't be abandoned mid-flight)\n const handleClose = () => {\n if (!busy) onClose()\n }\n\n const handleConfirm = async () => {\n try {\n setSubmitting(true)\n await onConfirm()\n onClose() // auto-close on success\n } catch {\n // keep the dialog open on failure so the user can retry; the consumer surfaces the error\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <Modal\n ref={ref}\n open={open}\n onClose={handleClose}\n size=\"sm\"\n title={title ?? t('removeDialog.title')}\n showCloseButton={!busy}\n closeOnBackdrop={!busy}\n closeOnEscape={!busy}\n footer={\n <>\n <Button variant=\"text\" onClick={handleClose} disabled={busy}>\n {cancelLabel ?? t('common.cancel')}\n </Button>\n <Button color=\"error\" variant=\"filled\" onClick={handleConfirm} loading={busy}>\n {confirmLabel ?? t('common.delete')}\n </Button>\n </>\n }\n >\n <div className={styles.body}>\n <div className={styles.iconBox} aria-hidden>\n <Icon name=\"Trash\" />\n </div>\n <Typography align=\"center\">{message ?? t('removeDialog.message')}</Typography>\n </div>\n </Modal>\n )\n})\n"],"names":["RemoveDialog","forwardRef","open","onClose","onConfirm","title","message","confirmLabel","cancelLabel","loading","ref","t","useT","submitting","setSubmitting","useState","busy","handleClose","handleConfirm","jsx","Modal","jsxs","Fragment","Button","styles","Icon","Typography"],"mappings":";;;;;;;;;;GA0CaA,IAAeC,EAA8C,SACxE,EAAE,MAAAC,GAAM,SAAAC,GAAS,WAAAC,GAAW,OAAAC,GAAO,SAAAC,GAAS,cAAAC,GAAc,aAAAC,GAAa,SAAAC,IAAU,GAAA,GACjFC,GACA;AACA,QAAMC,IAAIC,EAAA,GACJ,CAACC,GAAYC,CAAa,IAAIC,EAAS,EAAK,GAC5CC,IAAOP,KAAWI,GAGlBI,IAAc,MAAM;AACxB,IAAKD,KAAMb,EAAA;AAAA,EACb,GAEMe,IAAgB,YAAY;AAChC,QAAI;AACF,MAAAJ,EAAc,EAAI,GAClB,MAAMV,EAAA,GACND,EAAA;AAAA,IACF,QAAQ;AAAA,IAER,UAAA;AACE,MAAAW,EAAc,EAAK;AAAA,IACrB;AAAA,EACF;AAEA,SACE,gBAAAK;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAAV;AAAA,MACA,MAAAR;AAAA,MACA,SAASe;AAAA,MACT,MAAK;AAAA,MACL,OAAOZ,KAASM,EAAE,oBAAoB;AAAA,MACtC,iBAAiB,CAACK;AAAA,MAClB,iBAAiB,CAACA;AAAA,MAClB,eAAe,CAACA;AAAA,MAChB,QACE,gBAAAK,EAAAC,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAH,EAACI,GAAA,EAAO,SAAQ,QAAO,SAASN,GAAa,UAAUD,GACpD,UAAAR,KAAeG,EAAE,eAAe,EAAA,CACnC;AAAA,QACA,gBAAAQ,EAACI,GAAA,EAAO,OAAM,SAAQ,SAAQ,UAAS,SAASL,GAAe,SAASF,GACrE,UAAAT,KAAgBI,EAAE,eAAe,EAAA,CACpC;AAAA,MAAA,GACF;AAAA,MAGF,UAAA,gBAAAU,EAAC,OAAA,EAAI,WAAWG,EAAO,MACrB,UAAA;AAAA,QAAA,gBAAAL,EAAC,OAAA,EAAI,WAAWK,EAAO,SAAS,eAAW,IACzC,UAAA,gBAAAL,EAACM,GAAA,EAAK,MAAK,QAAA,CAAQ,EAAA,CACrB;AAAA,0BACCC,GAAA,EAAW,OAAM,UAAU,UAAApB,KAAWK,EAAE,sBAAsB,EAAA,CAAE;AAAA,MAAA,EAAA,CACnE;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;"}
1
+ {"version":3,"file":"RemoveDialog-DU6MqkO8.js","sources":["../src/components/RemoveDialog/RemoveDialog.tsx"],"sourcesContent":["import { forwardRef, useState, type ReactNode } from 'react'\nimport { useT } from '../../theme'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Modal } from '../Modal'\nimport { Typography } from '../Typography'\nimport styles from './RemoveDialog.module.css'\n\nexport interface RemoveDialogProps {\n /** Whether the dialog is open. */\n open: boolean\n /** Called on Cancel, the × button, backdrop, or Escape (ignored while a confirm is in flight). */\n onClose: () => void\n /**\n * The destructive action. May be async — while its promise is pending the Delete button shows a\n * loader and the dialog locks (no dismiss); on success the dialog **auto-closes**, on rejection it\n * stays open so the user can retry (surface the error yourself, e.g. a toast).\n */\n onConfirm: () => void | Promise<void>\n /** Header title. Defaults to `\"Remove\"`. */\n title?: ReactNode\n /** Body prompt shown under the icon. Defaults to `\"Are you sure you want to delete?\"`. */\n message?: ReactNode\n /** Confirm (destructive) button label. Defaults to `\"Delete\"`. */\n confirmLabel?: string\n /** Cancel button label. Defaults to `\"Cancel\"`. */\n cancelLabel?: string\n /** External loading override — combined with the internal async-confirm state. */\n loading?: boolean\n}\n\n/**\n * A ready-made delete confirmation — a thin convenience wrapper over `Modal` for the ubiquitous\n * \"Are you sure you want to delete?\" prompt. Hardcodes the destructive flavor (a `Trash` glyph in a\n * soft error circle + an `error` Delete button); just wire `open` / `onClose` / `onConfirm`. An async\n * `onConfirm` drives the button loader and locks dismissal, then auto-closes on success. Built on\n * `Modal`, so it inherits the portal, scroll-lock, focus-trap, and backdrop/Escape dismissal.\n *\n * @example\n * const { isOpen, open, close } = useDisclosure()\n * <RemoveDialog open={isOpen} onClose={close} onConfirm={() => deleteItem(id)} />\n */\nexport const RemoveDialog = forwardRef<HTMLDivElement, RemoveDialogProps>(function RemoveDialog(\n { open, onClose, onConfirm, title, message, confirmLabel, cancelLabel, loading = false },\n ref,\n) {\n const t = useT()\n const [submitting, setSubmitting] = useState(false)\n const busy = loading || submitting\n\n // dismissal is blocked while the confirm is running (so the delete can't be abandoned mid-flight)\n const handleClose = () => {\n if (!busy) onClose()\n }\n\n const handleConfirm = async () => {\n try {\n setSubmitting(true)\n await onConfirm()\n onClose() // auto-close on success\n } catch {\n // keep the dialog open on failure so the user can retry; the consumer surfaces the error\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <Modal\n ref={ref}\n open={open}\n onClose={handleClose}\n size=\"sm\"\n title={title ?? t('removeDialog.title')}\n showCloseButton={!busy}\n closeOnBackdrop={!busy}\n closeOnEscape={!busy}\n footer={\n <>\n <Button variant=\"text\" onClick={handleClose} disabled={busy}>\n {cancelLabel ?? t('common.cancel')}\n </Button>\n <Button color=\"error\" variant=\"filled\" onClick={handleConfirm} loading={busy}>\n {confirmLabel ?? t('common.delete')}\n </Button>\n </>\n }\n >\n <div className={styles.body}>\n <div className={styles.iconBox} aria-hidden>\n <Icon name=\"Trash\" />\n </div>\n <Typography align=\"center\">{message ?? t('removeDialog.message')}</Typography>\n </div>\n </Modal>\n )\n})\n"],"names":["RemoveDialog","forwardRef","open","onClose","onConfirm","title","message","confirmLabel","cancelLabel","loading","ref","t","useT","submitting","setSubmitting","useState","busy","handleClose","handleConfirm","jsx","Modal","jsxs","Fragment","Button","styles","Icon","Typography"],"mappings":";;;;;;;;;;GA0CaA,IAAeC,EAA8C,SACxE,EAAE,MAAAC,GAAM,SAAAC,GAAS,WAAAC,GAAW,OAAAC,GAAO,SAAAC,GAAS,cAAAC,GAAc,aAAAC,GAAa,SAAAC,IAAU,GAAA,GACjFC,GACA;AACA,QAAMC,IAAIC,EAAA,GACJ,CAACC,GAAYC,CAAa,IAAIC,EAAS,EAAK,GAC5CC,IAAOP,KAAWI,GAGlBI,IAAc,MAAM;AACxB,IAAKD,KAAMb,EAAA;AAAA,EACb,GAEMe,IAAgB,YAAY;AAChC,QAAI;AACF,MAAAJ,EAAc,EAAI,GAClB,MAAMV,EAAA,GACND,EAAA;AAAA,IACF,QAAQ;AAAA,IAER,UAAA;AACE,MAAAW,EAAc,EAAK;AAAA,IACrB;AAAA,EACF;AAEA,SACE,gBAAAK;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAAV;AAAA,MACA,MAAAR;AAAA,MACA,SAASe;AAAA,MACT,MAAK;AAAA,MACL,OAAOZ,KAASM,EAAE,oBAAoB;AAAA,MACtC,iBAAiB,CAACK;AAAA,MAClB,iBAAiB,CAACA;AAAA,MAClB,eAAe,CAACA;AAAA,MAChB,QACE,gBAAAK,EAAAC,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAH,EAACI,GAAA,EAAO,SAAQ,QAAO,SAASN,GAAa,UAAUD,GACpD,UAAAR,KAAeG,EAAE,eAAe,EAAA,CACnC;AAAA,QACA,gBAAAQ,EAACI,GAAA,EAAO,OAAM,SAAQ,SAAQ,UAAS,SAASL,GAAe,SAASF,GACrE,UAAAT,KAAgBI,EAAE,eAAe,EAAA,CACpC;AAAA,MAAA,GACF;AAAA,MAGF,UAAA,gBAAAU,EAAC,OAAA,EAAI,WAAWG,EAAO,MACrB,UAAA;AAAA,QAAA,gBAAAL,EAAC,OAAA,EAAI,WAAWK,EAAO,SAAS,eAAW,IACzC,UAAA,gBAAAL,EAACM,GAAA,EAAK,MAAK,QAAA,CAAQ,EAAA,CACrB;AAAA,0BACCC,GAAA,EAAW,OAAM,UAAU,UAAApB,KAAWK,EAAE,sBAAsB,EAAA,CAAE;AAAA,MAAA,EAAA,CACnE;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;"}
@@ -1,2 +1,2 @@
1
- "use strict";const r=require("react/jsx-runtime"),a=require("react"),$e=require("clsx"),c=require("lexical"),we=require("@lexical/react/LexicalComposer"),ve=require("@lexical/react/LexicalComposerContext"),Be=require("@lexical/react/LexicalRichTextPlugin"),Fe=require("@lexical/react/LexicalContentEditable"),Ue=require("@lexical/react/LexicalErrorBoundary"),Pe=require("@lexical/react/LexicalHistoryPlugin"),He=require("@lexical/react/LexicalListPlugin"),Ve=require("@lexical/react/LexicalCheckListPlugin"),ze=require("@lexical/react/LexicalLinkPlugin"),Ge=require("@lexical/react/LexicalMarkdownShortcutPlugin"),le=require("@lexical/markdown"),D=require("@lexical/rich-text"),T=require("@lexical/list"),$=require("@lexical/link"),Le=require("@lexical/html"),Ke=require("./formContext-bTWrqdEV.cjs"),xe=require("./Typography-BFatE1_A.cjs"),We=require("./toastStore-B4Tk2Xk7.cjs"),S=require("@lexical/selection"),I=require("@lexical/utils"),z=require("./Button-D4bfVNNa.cjs"),ge=require("./ColorPickerPanel-ByB1mLSi.cjs"),M=require("./Divider-CzbhdCiD.cjs"),se=require("./Dropdown-DygP50OB.cjs"),Je=require("./FloatingPanel-U6sGYiSK.cjs"),h=require("./Icon-CXTl_QAP.cjs"),O=require("./IconButton-D6TenQZ_.cjs"),G=require("./ListItem-RH-D-Wey.cjs"),Qe=require("./Modal-B2YSCVVt.cjs"),Xe=require("./TextField-BPefnD5M.cjs"),ce=require("./ConfigProvider-ByOFXVyP.cjs"),Ye=/^(?:https?:|mailto:|tel:|ftp:|#|\/|\?|\.)/i,Ze=/^[a-z][a-z0-9+.-]*:/i;function ae(o){const t=o.trim();return t===""?"":Ye.test(t)||!Ze.test(t)?t:"#"}function Ne(o){const t=o.trim();if(/^data:(?:image|video)\//i.test(t)||/^blob:/i.test(t))return t;const i=ae(t);return i==="#"?"":i}function et(o){return o instanceof HTMLImageElement&&o.src?{node:K(o.getAttribute("src")??o.src,o.alt)}:null}class W extends c.DecoratorNode{static getType(){return"tz-image"}static clone(t){return new W(t.__src,t.__alt,t.__key)}constructor(t,i="",n){super(n),this.__src=Ne(t),this.__alt=i}static importJSON(t){return K(t.src,t.alt)}exportJSON(){return{...super.exportJSON(),type:"tz-image",version:1,src:this.__src,alt:this.__alt}}static importDOM(){return{img:()=>({conversion:et,priority:0})}}exportDOM(){const t=document.createElement("img");return t.setAttribute("src",this.__src),t.setAttribute("alt",this.__alt),{element:t}}createDOM(){const t=document.createElement("div");return t.style.display="contents",t}updateDOM(){return!1}getSrc(){return this.__src}getAltText(){return this.__alt}decorate(){return r.jsx("img",{src:this.__src,alt:this.__alt,draggable:!1})}}function K(o,t=""){return c.$applyNodeReplacement(new W(o,t))}function je(o){return/\.(mp4|webm|ogg|ogv|mov|m4v)(\?.*)?$/i.test(o)}function tt(o){const t=o.match(/(?:youtube\.com\/(?:watch\?(?:.*&)?v=|embed\/|shorts\/)|youtu\.be\/)([\w-]{11})/);if(t)return`https://www.youtube.com/embed/${t[1]}`;const i=o.match(/vimeo\.com\/(?:video\/)?(\d+)/);return i?`https://player.vimeo.com/video/${i[1]}`:o}function ye(o){var i;const t=o.getAttribute("src")||((i=o.querySelector("source"))==null?void 0:i.getAttribute("src"));return t?{node:ue(t)}:null}class J extends c.DecoratorNode{static getType(){return"tz-video"}static clone(t){return new J(t.__src,t.__key)}constructor(t,i){super(i),this.__src=Ne(t)}static importJSON(t){return ue(t.src)}exportJSON(){return{...super.exportJSON(),type:"tz-video",version:1,src:this.__src}}static importDOM(){return{iframe:()=>({conversion:ye,priority:0}),video:()=>({conversion:ye,priority:0})}}exportDOM(){if(je(this.__src)){const i=document.createElement("video");return i.setAttribute("src",this.__src),i.setAttribute("controls","true"),{element:i}}const t=document.createElement("iframe");return t.setAttribute("src",this.__src),t.setAttribute("frameborder","0"),t.setAttribute("allowfullscreen","true"),t.setAttribute("allow","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"),{element:t}}createDOM(){const t=document.createElement("div");return t.style.display="contents",t}updateDOM(){return!1}getSrc(){return this.__src}decorate(){return je(this.__src)?r.jsx("video",{src:this.__src,controls:!0}):r.jsx(rt,{src:this.__src})}}function rt({src:o}){const t=ce.useT();return r.jsx("div",{className:"tz-rte-embed",children:r.jsx("iframe",{src:o,title:t("rte.embeddedVideo"),frameBorder:0,allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})}function ue(o){return c.$applyNodeReplacement(new J(tt(o)))}const ot="_editor_16j1l_1",nt="_label_16j1l_9",it="_required_16j1l_15",lt="_helper_16j1l_18",st="_control_16j1l_24",ct="_error_16j1l_38",at="_disabled_16j1l_45",ut="_toolbar_16j1l_51",dt="_sm_16j1l_67",mt="_md_16j1l_71",pt="_lg_16j1l_75",ht="_colorGlyph_16j1l_81",_t="_colorBar_16j1l_89",ft="_shell_16j1l_107",xt="_content_16j1l_110",gt="_placeholder_16j1l_123",jt="_paragraph_16j1l_146",yt="_h1_16j1l_152",Ct="_h2_16j1l_153",vt="_h3_16j1l_154",Lt="_h4_16j1l_155",Nt="_h5_16j1l_156",bt="_h6_16j1l_157",St="_quote_16j1l_176",Tt="_ul_16j1l_183",Et="_ol_16j1l_188",kt="_li_16j1l_193",Rt="_nestedLi_16j1l_196",It="_liChecked_16j1l_200",Mt="_liUnchecked_16j1l_201",Ot="_link_16j1l_238",Dt="_bold_16j1l_245",At="_italic_16j1l_248",qt="_underline_16j1l_251",$t="_strike_16j1l_254",wt="_codeInline_16j1l_260",l={editor:ot,label:nt,required:it,helper:lt,control:st,error:ct,disabled:at,toolbar:ut,sm:dt,md:mt,lg:pt,colorGlyph:ht,colorBar:_t,shell:ft,content:xt,placeholder:gt,paragraph:jt,h1:yt,h2:Ct,h3:vt,h4:Lt,h5:Nt,h6:bt,quote:St,ul:Tt,ol:Et,li:kt,nestedLi:Rt,liChecked:It,liUnchecked:Mt,link:Ot,bold:Dt,italic:At,underline:qt,strike:$t,codeInline:wt},Bt={paragraph:"Paragraph",h1:"Heading 1",h2:"Heading 2",h3:"Heading 3",quote:"Quote",bullet:"Bullet List",number:"Numbered List",check:"Check List"},Ft=[{type:"paragraph",icon:"Text"},{type:"h1",icon:"Hashtag"},{type:"h2",icon:"Hashtag"},{type:"h3",icon:"Hashtag"}],Ut=[{value:"left",labelKey:"rte.alignLeft",icon:"TextalignLeft"},{value:"center",labelKey:"rte.alignCenter",icon:"TextalignCenter"},{value:"right",labelKey:"rte.alignRight",icon:"TextalignRight"}],Pt=["10px","12px","14px","16px","18px","20px"],Ht={sm:"12px",md:"14px",lg:"16px"};function Vt({color:o,size:t}){return r.jsxs("span",{className:l.colorGlyph,children:[r.jsx(h.Icon,{name:"Brush",size:t}),r.jsx("span",{className:l.colorBar,style:{borderColor:`transparent transparent ${o||"currentColor"} transparent`},"aria-hidden":"true"})]})}function zt({size:o,disabled:t,onImageUpload:i}){const n=ce.useT(),d=e=>Bt[e]??e,[u]=ve.useLexicalComposerContext(),g=a.useRef(null),[C,p]=a.useState(!1),[f,Q]=a.useState(!1),[E,X]=a.useState(!1),[w,Y]=a.useState(!1),[Z,ee]=a.useState(""),[y,k]=a.useState("paragraph"),[j,x]=a.useState("left"),[A,q]=a.useState(""),[B,F]=a.useState(""),[U,P]=a.useState(!1),R=a.useRef(null),[te,_]=a.useState(!1),[be,Se]=a.useState(!1),[m,re]=a.useState(null),[de,me]=a.useState(""),oe=a.useCallback(()=>{const e=c.$getSelection();if(!c.$isRangeSelection(e))return;p(e.hasFormat("bold")),Q(e.hasFormat("italic")),X(e.hasFormat("underline")),F(S.$getSelectionStyleValueForProperty(e,"color","")),q(S.$getSelectionStyleValueForProperty(e,"font-size",""));const s=e.anchor.getNode(),N=s.getParent(),L=$.$isLinkNode(s)?s:$.$isLinkNode(N)?N:null;Y(L!==null),ee((L==null?void 0:L.getURL())??"");const b=s.getKey()==="root"?s:I.$findMatchingParent(s,qe=>{const fe=qe.getParent();return fe===null||fe.getKey()==="root"})??s.getTopLevelElement();x(c.$isElementNode(b)&&b.getFormatType()||"left");const V=I.$getNearestNodeOfType(s,T.ListNode);V?k(V.getListType()):D.$isHeadingNode(b)?k(b.getTag()):D.$isQuoteNode(b)?k("quote"):k("paragraph")},[]);a.useEffect(()=>I.mergeRegister(u.registerUpdateListener(({editorState:e})=>e.read(oe)),u.registerCommand(c.SELECTION_CHANGE_COMMAND,()=>(oe(),!1),c.COMMAND_PRIORITY_LOW),u.registerCommand(c.CAN_UNDO_COMMAND,e=>(_(e),!1),c.COMMAND_PRIORITY_LOW),u.registerCommand(c.CAN_REDO_COMMAND,e=>(Se(e),!1),c.COMMAND_PRIORITY_LOW)),[u,oe]);const ne=e=>u.dispatchCommand(c.FORMAT_TEXT_COMMAND,e),Te=e=>u.dispatchCommand(c.FORMAT_ELEMENT_COMMAND,e),Ee=e=>{F(e),u.update(()=>{const s=c.$getSelection();c.$isRangeSelection(s)&&S.$patchStyleText(s,{color:e||null})})},ke=e=>{q(e),u.update(()=>{const s=c.$getSelection();c.$isRangeSelection(s)&&S.$patchStyleText(s,{"font-size":e||null})})},H=e=>{if(e==="bullet"||e==="number"||e==="check"){if(y===e)u.dispatchCommand(T.REMOVE_LIST_COMMAND,void 0);else{const s=e==="bullet"?T.INSERT_UNORDERED_LIST_COMMAND:e==="number"?T.INSERT_ORDERED_LIST_COMMAND:T.INSERT_CHECK_LIST_COMMAND;u.dispatchCommand(s,void 0)}return}u.update(()=>{const s=c.$getSelection();c.$isRangeSelection(s)&&(e==="paragraph"?S.$setBlocksType(s,()=>c.$createParagraphNode()):e==="quote"?S.$setBlocksType(s,()=>D.$createQuoteNode()):S.$setBlocksType(s,()=>D.$createHeadingNode(e)))})},Re=()=>H(y==="quote"?"paragraph":"quote"),ie=(e,s="")=>{me(s),re(e)},pe=()=>re(null),Ie=()=>{m==null||m.onConfirm(de.trim()),re(null)},Me=()=>ie({icon:"Link2",title:n("rte.linkTitle"),label:n("rte.linkUrl"),placeholder:"https://example.com",confirmLabel:n(w?"common.update":"common.insert"),onConfirm:e=>u.dispatchCommand($.TOGGLE_LINK_COMMAND,e===""?null:ae(e))},Z),Oe=()=>ie({icon:"GalleryAdd",title:n("rte.imageTitle"),label:n("rte.imageUrl"),placeholder:"https://example.com/image.jpg",confirmLabel:n("common.insert"),onConfirm:e=>{e&&u.update(()=>I.$insertNodeToNearestRoot(K(e)))}}),De=async e=>{var N;const s=(N=e.target.files)==null?void 0:N[0];if(e.target.value="",!!s)try{const L=i?await i(s):await Gt(s);u.update(()=>I.$insertNodeToNearestRoot(K(L,s.name)))}catch{We.toast.error(n("rte.imageError"))}},Ae=()=>ie({icon:"VideoSquare",title:n("rte.videoTitle"),label:n("rte.videoUrl"),placeholder:n("rte.videoUrlPlaceholder"),confirmLabel:n("common.insert"),onConfirm:e=>{e&&u.update(()=>I.$insertNodeToNearestRoot(ue(e)))}}),v=(e,s,N,L,b)=>r.jsx(O.IconButton,{variant:e?"filled":"text",color:"primary",size:o,disabled:t,"aria-label":s,"aria-pressed":e,onMouseDown:V=>V.preventDefault(),onClick:N,children:L},b),he=y.startsWith("h")?y:"paragraph",_e=A||Ht[o];return r.jsxs("div",{className:l.toolbar,role:"toolbar","aria-label":n("rte.formatting"),"aria-orientation":"horizontal",children:[r.jsx(O.IconButton,{variant:"text",color:"primary",size:o,disabled:t||!te,"aria-label":n("rte.undo"),onMouseDown:e=>e.preventDefault(),onClick:()=>u.dispatchCommand(c.UNDO_COMMAND,void 0),children:r.jsx(h.Icon,{name:"UndoArrow"})}),r.jsx(O.IconButton,{variant:"text",color:"primary",size:o,disabled:t||!be,"aria-label":n("rte.redo"),onMouseDown:e=>e.preventDefault(),onClick:()=>u.dispatchCommand(c.REDO_COMMAND,void 0),children:r.jsx(h.Icon,{name:"RedoArrow"})}),r.jsx(M.Divider,{orientation:"vertical"}),r.jsx(se.Dropdown,{size:o,disabled:t,minWidth:!1,trigger:r.jsx(z.Button,{variant:"text",color:"primary",size:o,disabled:t,endIcon:r.jsx(h.Icon,{name:"ArrowDown4"}),"aria-label":n("rte.fontSize"),onMouseDown:e=>e.preventDefault(),children:_e}),children:Pt.map(e=>r.jsx(G.ListItem,{clickable:!0,selected:e===_e,onClick:()=>ke(e),children:e},e))}),r.jsx(M.Divider,{orientation:"vertical"}),r.jsx(se.Dropdown,{size:o,disabled:t,trigger:r.jsx(z.Button,{variant:"text",color:"primary",size:o,disabled:t,endIcon:r.jsx(h.Icon,{name:"ArrowDown4"}),onMouseDown:e=>e.preventDefault(),children:d(he)}),children:Ft.map(e=>r.jsx(G.ListItem,{clickable:!0,selected:he===e.type,icon:e.icon,onClick:()=>H(e.type),children:d(e.type)},e.type))}),r.jsx(M.Divider,{orientation:"vertical"}),v(C,n("rte.bold"),()=>ne("bold"),r.jsx(h.Icon,{name:"TextBold"})),v(f,n("rte.italic"),()=>ne("italic"),r.jsx(h.Icon,{name:"TextItalic"})),v(E,n("rte.underline"),()=>ne("underline"),r.jsx(h.Icon,{name:"TextUnderline"})),r.jsx(M.Divider,{orientation:"vertical"}),v(y==="bullet",n("rte.bulletList"),()=>H("bullet"),r.jsx(h.Icon,{name:"ListBullet"})),v(y==="number",n("rte.numberedList"),()=>H("number"),r.jsx(h.Icon,{name:"ListNumber"})),v(y==="quote",n("rte.quote"),Re,r.jsx(h.Icon,{name:"QuoteUp"})),r.jsx(M.Divider,{orientation:"vertical"}),Ut.map(e=>v(j===e.value,n(e.labelKey),()=>Te(e.value),r.jsx(h.Icon,{name:e.icon}),e.value)),r.jsx(M.Divider,{orientation:"vertical"}),r.jsx(O.IconButton,{ref:R,variant:"text",color:"primary",size:o,disabled:t,"aria-label":n("rte.textColor"),"aria-expanded":U,onMouseDown:e=>e.preventDefault(),onClick:()=>P(e=>!e),children:r.jsx(Vt,{color:B})}),r.jsx(Je.FloatingPanel,{open:U,triggerRef:R,onClose:e=>{var s;P(!1),e&&((s=R.current)==null||s.focus())},role:"dialog",ariaLabel:n("rte.textColor"),width:232,children:r.jsx(ge.ColorPickerPanel,{value:B||ge.DEFAULT_SWATCHES[0],onChange:Ee,clearable:!1})}),v(w,n("rte.link"),Me,r.jsx(h.Icon,{name:"Link2"})),r.jsxs(se.Dropdown,{size:o,disabled:t,minWidth:!1,trigger:r.jsx(O.IconButton,{variant:"text",color:"primary",size:o,disabled:t,"aria-label":n("rte.insertImage"),children:r.jsx(h.Icon,{name:"GalleryAdd"})}),children:[r.jsx(G.ListItem,{clickable:!0,icon:"GalleryImport",onClick:()=>{var e;return(e=g.current)==null?void 0:e.click()},children:n("rte.uploadImage")}),r.jsx(G.ListItem,{clickable:!0,icon:"Link",onClick:Oe,children:n("rte.imageByUrl")})]}),r.jsx(O.IconButton,{variant:"text",color:"primary",size:o,disabled:t,"aria-label":n("rte.insertVideo"),onClick:Ae,children:r.jsx(h.Icon,{name:"VideoSquare"})}),r.jsx("input",{ref:g,type:"file",accept:"image/*",hidden:!0,onChange:De,"aria-hidden":"true",tabIndex:-1}),r.jsx(Qe.Modal,{open:m!==null,onClose:pe,size:"sm",icon:m==null?void 0:m.icon,title:m==null?void 0:m.title,footer:r.jsxs(r.Fragment,{children:[r.jsx(z.Button,{variant:"text",onClick:pe,children:n("common.cancel")}),r.jsx(z.Button,{type:"submit",form:"rte-url-form",children:(m==null?void 0:m.confirmLabel)??n("common.insert")})]}),children:r.jsx("form",{id:"rte-url-form",onSubmit:e=>{e.preventDefault(),Ie()},children:r.jsx(Xe.TextField,{label:m==null?void 0:m.label,placeholder:m==null?void 0:m.placeholder,value:de,onChange:e=>me(e.target.value)})})})]})}function Gt(o){return new Promise((t,i)=>{const n=new FileReader;n.onload=()=>t(n.result),n.onerror=()=>i(n.error),n.readAsDataURL(o)})}const Kt={paragraph:l.paragraph,heading:{h1:l.h1,h2:l.h2,h3:l.h3,h4:l.h4,h5:l.h5,h6:l.h6},quote:l.quote,list:{ul:l.ul,ol:l.ol,listitem:l.li,listitemChecked:l.liChecked,listitemUnchecked:l.liUnchecked,nested:{listitem:l.nestedLi}},link:l.link,text:{bold:l.bold,italic:l.italic,underline:l.underline,strikethrough:l.strike,code:l.codeInline}},Wt=[D.HeadingNode,D.QuoteNode,T.ListNode,T.ListItemNode,$.LinkNode,W,J],Jt=[...le.ELEMENT_TRANSFORMERS,...le.TEXT_FORMAT_TRANSFORMERS,...le.TEXT_MATCH_TRANSFORMERS];function Qt(o){if(typeof document>"u")return o;const t=document.createElement("template");return t.innerHTML=o,t.content.querySelectorAll("[class]").forEach(i=>i.removeAttribute("class")),t.innerHTML}function Xt(){const o=c.$getRoot(),t=o.getFirstChild();return o.getChildrenSize()<=1&&(t===null||c.$isParagraphNode(t)&&t.getChildrenSize()===0)}function Ce(o,t){const i=c.$getRoot();if(i.clear(),t){const n=new DOMParser().parseFromString(t,"text/html"),d=Le.$generateNodesFromDOM(o,n);i.select(),c.$insertNodes(d)}i.getChildrenSize()===0&&i.append(c.$createParagraphNode()),c.$setSelection(null)}function Yt({value:o,defaultValue:t,onChange:i,disabled:n}){const[d]=ve.useLexicalComposerContext(),u=a.useRef(void 0),g=a.useRef(i);return g.current=i,a.useEffect(()=>d.setEditable(!n),[d,n]),a.useEffect(()=>d.registerNodeTransform($.LinkNode,C=>{const p=C.getURL(),f=ae(p);f!==p&&C.setURL(f)}),[d]),a.useEffect(()=>{o!==void 0||!t||(u.current=t,d.update(()=>Ce(d,t),{tag:"history-merge"}))},[]),a.useEffect(()=>{o===void 0||o===u.current||(u.current=o,d.update(()=>Ce(d,o),{tag:"history-merge"}))},[d,o]),a.useEffect(()=>d.registerUpdateListener(({dirtyElements:C,dirtyLeaves:p})=>{C.size===0&&p.size===0||d.read(()=>{const f=Xt()?"":Qt(Le.$generateHtmlFromNodes(d,null));f!==u.current&&(u.current=f,g.current(f))})}),[d]),null}const Zt=a.forwardRef(function({label:t,size:i="md",error:n,helperText:d,required:u=!1,disabled:g=!1,placeholder:C,name:p,value:f,defaultValue:Q,onChange:E,onImageUpload:X,minHeight:w=220,"aria-label":Y="Rich text editor",className:Z,style:ee},y){const k=ce.useT(),j=Ke.useFormContext(),x=j&&p?j.field(p):void 0,A=n??(x==null?void 0:x.error)??!1,q=d??(x==null?void 0:x.helperText),B=j&&p?j.values[p]:void 0,F=f!==void 0?f:j&&p?String(B??""):void 0,U=a.useCallback(_=>{j&&p&&j.setValue(p,_),E==null||E(_)},[j,p,E]),P=_=>x==null?void 0:x.onBlur(_),R=a.useRef(null);a.useEffect(()=>{const _=R.current;_&&(p?_.setAttribute("name",p):_.removeAttribute("name"))},[p]);const te={namespace:"tz-rich-text-editor",theme:Kt,nodes:Wt,editable:!g,onError:_=>{throw _}};return r.jsxs("div",{ref:y,className:$e.clsx(l.editor,l[i],A&&l.error,g&&l.disabled,Z),style:{"--tz-rte-min-height":`${w}px`,...ee},children:[t!=null&&r.jsxs("div",{className:l.label,children:[r.jsx(xe.Typography,{as:"span",variant:"bodySmall",color:"muted",children:t}),u&&r.jsx("span",{className:l.required,"aria-hidden":"true",children:"*"})]}),r.jsx("div",{className:l.control,children:r.jsxs(we.LexicalComposer,{initialConfig:te,children:[r.jsx(zt,{size:i,disabled:g,onImageUpload:X}),r.jsx("div",{className:l.shell,children:r.jsx(Be.RichTextPlugin,{contentEditable:r.jsx(Fe.ContentEditable,{ref:R,className:l.content,"aria-label":Y,"aria-invalid":A||void 0,onBlur:P}),placeholder:r.jsx("div",{className:l.placeholder,children:C??k("rte.placeholder")}),ErrorBoundary:Ue.LexicalErrorBoundary})}),r.jsx(Pe.HistoryPlugin,{}),r.jsx(He.ListPlugin,{}),r.jsx(Ve.CheckListPlugin,{}),r.jsx(ze.LinkPlugin,{}),r.jsx(Ge.MarkdownShortcutPlugin,{transformers:Jt}),r.jsx(Yt,{value:F,defaultValue:Q,onChange:U,disabled:g})]})}),q!=null&&r.jsx(xe.Typography,{as:"span",variant:"bodySmall",color:A?"error":"muted",className:l.helper,children:q})]})});exports.RichTextEditor=Zt;
2
- //# sourceMappingURL=RichTextEditor-CAYt1Zm1.cjs.map
1
+ "use strict";const r=require("react/jsx-runtime"),a=require("react"),$e=require("clsx"),c=require("lexical"),we=require("@lexical/react/LexicalComposer"),ve=require("@lexical/react/LexicalComposerContext"),Be=require("@lexical/react/LexicalRichTextPlugin"),Fe=require("@lexical/react/LexicalContentEditable"),Ue=require("@lexical/react/LexicalErrorBoundary"),Pe=require("@lexical/react/LexicalHistoryPlugin"),He=require("@lexical/react/LexicalListPlugin"),Ve=require("@lexical/react/LexicalCheckListPlugin"),ze=require("@lexical/react/LexicalLinkPlugin"),Ge=require("@lexical/react/LexicalMarkdownShortcutPlugin"),le=require("@lexical/markdown"),D=require("@lexical/rich-text"),T=require("@lexical/list"),$=require("@lexical/link"),Le=require("@lexical/html"),Ke=require("./formContext-bTWrqdEV.cjs"),xe=require("./Typography-BFatE1_A.cjs"),We=require("./toastStore-B4Tk2Xk7.cjs"),S=require("@lexical/selection"),I=require("@lexical/utils"),z=require("./Button-Cj6pckNl.cjs"),ge=require("./ColorPickerPanel-nXEliruE.cjs"),M=require("./Divider-CzbhdCiD.cjs"),se=require("./Dropdown-Ui7h2TGd.cjs"),Je=require("./FloatingPanel-U6sGYiSK.cjs"),h=require("./Icon-CXTl_QAP.cjs"),O=require("./IconButton-BoY2y_pV.cjs"),G=require("./ListItem-DWQorRxG.cjs"),Qe=require("./Modal-CO3c3sGY.cjs"),Xe=require("./TextField-fmt7aacg.cjs"),ce=require("./ConfigProvider-BHNx-NHV.cjs"),Ye=/^(?:https?:|mailto:|tel:|ftp:|#|\/|\?|\.)/i,Ze=/^[a-z][a-z0-9+.-]*:/i;function ae(o){const t=o.trim();return t===""?"":Ye.test(t)||!Ze.test(t)?t:"#"}function Ne(o){const t=o.trim();if(/^data:(?:image|video)\//i.test(t)||/^blob:/i.test(t))return t;const i=ae(t);return i==="#"?"":i}function et(o){return o instanceof HTMLImageElement&&o.src?{node:K(o.getAttribute("src")??o.src,o.alt)}:null}class W extends c.DecoratorNode{static getType(){return"tz-image"}static clone(t){return new W(t.__src,t.__alt,t.__key)}constructor(t,i="",n){super(n),this.__src=Ne(t),this.__alt=i}static importJSON(t){return K(t.src,t.alt)}exportJSON(){return{...super.exportJSON(),type:"tz-image",version:1,src:this.__src,alt:this.__alt}}static importDOM(){return{img:()=>({conversion:et,priority:0})}}exportDOM(){const t=document.createElement("img");return t.setAttribute("src",this.__src),t.setAttribute("alt",this.__alt),{element:t}}createDOM(){const t=document.createElement("div");return t.style.display="contents",t}updateDOM(){return!1}getSrc(){return this.__src}getAltText(){return this.__alt}decorate(){return r.jsx("img",{src:this.__src,alt:this.__alt,draggable:!1})}}function K(o,t=""){return c.$applyNodeReplacement(new W(o,t))}function je(o){return/\.(mp4|webm|ogg|ogv|mov|m4v)(\?.*)?$/i.test(o)}function tt(o){const t=o.match(/(?:youtube\.com\/(?:watch\?(?:.*&)?v=|embed\/|shorts\/)|youtu\.be\/)([\w-]{11})/);if(t)return`https://www.youtube.com/embed/${t[1]}`;const i=o.match(/vimeo\.com\/(?:video\/)?(\d+)/);return i?`https://player.vimeo.com/video/${i[1]}`:o}function ye(o){var i;const t=o.getAttribute("src")||((i=o.querySelector("source"))==null?void 0:i.getAttribute("src"));return t?{node:ue(t)}:null}class J extends c.DecoratorNode{static getType(){return"tz-video"}static clone(t){return new J(t.__src,t.__key)}constructor(t,i){super(i),this.__src=Ne(t)}static importJSON(t){return ue(t.src)}exportJSON(){return{...super.exportJSON(),type:"tz-video",version:1,src:this.__src}}static importDOM(){return{iframe:()=>({conversion:ye,priority:0}),video:()=>({conversion:ye,priority:0})}}exportDOM(){if(je(this.__src)){const i=document.createElement("video");return i.setAttribute("src",this.__src),i.setAttribute("controls","true"),{element:i}}const t=document.createElement("iframe");return t.setAttribute("src",this.__src),t.setAttribute("frameborder","0"),t.setAttribute("allowfullscreen","true"),t.setAttribute("allow","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"),{element:t}}createDOM(){const t=document.createElement("div");return t.style.display="contents",t}updateDOM(){return!1}getSrc(){return this.__src}decorate(){return je(this.__src)?r.jsx("video",{src:this.__src,controls:!0}):r.jsx(rt,{src:this.__src})}}function rt({src:o}){const t=ce.useT();return r.jsx("div",{className:"tz-rte-embed",children:r.jsx("iframe",{src:o,title:t("rte.embeddedVideo"),frameBorder:0,allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})}function ue(o){return c.$applyNodeReplacement(new J(tt(o)))}const ot="_editor_16j1l_1",nt="_label_16j1l_9",it="_required_16j1l_15",lt="_helper_16j1l_18",st="_control_16j1l_24",ct="_error_16j1l_38",at="_disabled_16j1l_45",ut="_toolbar_16j1l_51",dt="_sm_16j1l_67",mt="_md_16j1l_71",pt="_lg_16j1l_75",ht="_colorGlyph_16j1l_81",_t="_colorBar_16j1l_89",ft="_shell_16j1l_107",xt="_content_16j1l_110",gt="_placeholder_16j1l_123",jt="_paragraph_16j1l_146",yt="_h1_16j1l_152",Ct="_h2_16j1l_153",vt="_h3_16j1l_154",Lt="_h4_16j1l_155",Nt="_h5_16j1l_156",bt="_h6_16j1l_157",St="_quote_16j1l_176",Tt="_ul_16j1l_183",Et="_ol_16j1l_188",kt="_li_16j1l_193",Rt="_nestedLi_16j1l_196",It="_liChecked_16j1l_200",Mt="_liUnchecked_16j1l_201",Ot="_link_16j1l_238",Dt="_bold_16j1l_245",At="_italic_16j1l_248",qt="_underline_16j1l_251",$t="_strike_16j1l_254",wt="_codeInline_16j1l_260",l={editor:ot,label:nt,required:it,helper:lt,control:st,error:ct,disabled:at,toolbar:ut,sm:dt,md:mt,lg:pt,colorGlyph:ht,colorBar:_t,shell:ft,content:xt,placeholder:gt,paragraph:jt,h1:yt,h2:Ct,h3:vt,h4:Lt,h5:Nt,h6:bt,quote:St,ul:Tt,ol:Et,li:kt,nestedLi:Rt,liChecked:It,liUnchecked:Mt,link:Ot,bold:Dt,italic:At,underline:qt,strike:$t,codeInline:wt},Bt={paragraph:"Paragraph",h1:"Heading 1",h2:"Heading 2",h3:"Heading 3",quote:"Quote",bullet:"Bullet List",number:"Numbered List",check:"Check List"},Ft=[{type:"paragraph",icon:"Text"},{type:"h1",icon:"Hashtag"},{type:"h2",icon:"Hashtag"},{type:"h3",icon:"Hashtag"}],Ut=[{value:"left",labelKey:"rte.alignLeft",icon:"TextalignLeft"},{value:"center",labelKey:"rte.alignCenter",icon:"TextalignCenter"},{value:"right",labelKey:"rte.alignRight",icon:"TextalignRight"}],Pt=["10px","12px","14px","16px","18px","20px"],Ht={sm:"12px",md:"14px",lg:"16px"};function Vt({color:o,size:t}){return r.jsxs("span",{className:l.colorGlyph,children:[r.jsx(h.Icon,{name:"Brush",size:t}),r.jsx("span",{className:l.colorBar,style:{borderColor:`transparent transparent ${o||"currentColor"} transparent`},"aria-hidden":"true"})]})}function zt({size:o,disabled:t,onImageUpload:i}){const n=ce.useT(),d=e=>Bt[e]??e,[u]=ve.useLexicalComposerContext(),g=a.useRef(null),[C,p]=a.useState(!1),[f,Q]=a.useState(!1),[E,X]=a.useState(!1),[w,Y]=a.useState(!1),[Z,ee]=a.useState(""),[y,k]=a.useState("paragraph"),[j,x]=a.useState("left"),[A,q]=a.useState(""),[B,F]=a.useState(""),[U,P]=a.useState(!1),R=a.useRef(null),[te,_]=a.useState(!1),[be,Se]=a.useState(!1),[m,re]=a.useState(null),[de,me]=a.useState(""),oe=a.useCallback(()=>{const e=c.$getSelection();if(!c.$isRangeSelection(e))return;p(e.hasFormat("bold")),Q(e.hasFormat("italic")),X(e.hasFormat("underline")),F(S.$getSelectionStyleValueForProperty(e,"color","")),q(S.$getSelectionStyleValueForProperty(e,"font-size",""));const s=e.anchor.getNode(),N=s.getParent(),L=$.$isLinkNode(s)?s:$.$isLinkNode(N)?N:null;Y(L!==null),ee((L==null?void 0:L.getURL())??"");const b=s.getKey()==="root"?s:I.$findMatchingParent(s,qe=>{const fe=qe.getParent();return fe===null||fe.getKey()==="root"})??s.getTopLevelElement();x(c.$isElementNode(b)&&b.getFormatType()||"left");const V=I.$getNearestNodeOfType(s,T.ListNode);V?k(V.getListType()):D.$isHeadingNode(b)?k(b.getTag()):D.$isQuoteNode(b)?k("quote"):k("paragraph")},[]);a.useEffect(()=>I.mergeRegister(u.registerUpdateListener(({editorState:e})=>e.read(oe)),u.registerCommand(c.SELECTION_CHANGE_COMMAND,()=>(oe(),!1),c.COMMAND_PRIORITY_LOW),u.registerCommand(c.CAN_UNDO_COMMAND,e=>(_(e),!1),c.COMMAND_PRIORITY_LOW),u.registerCommand(c.CAN_REDO_COMMAND,e=>(Se(e),!1),c.COMMAND_PRIORITY_LOW)),[u,oe]);const ne=e=>u.dispatchCommand(c.FORMAT_TEXT_COMMAND,e),Te=e=>u.dispatchCommand(c.FORMAT_ELEMENT_COMMAND,e),Ee=e=>{F(e),u.update(()=>{const s=c.$getSelection();c.$isRangeSelection(s)&&S.$patchStyleText(s,{color:e||null})})},ke=e=>{q(e),u.update(()=>{const s=c.$getSelection();c.$isRangeSelection(s)&&S.$patchStyleText(s,{"font-size":e||null})})},H=e=>{if(e==="bullet"||e==="number"||e==="check"){if(y===e)u.dispatchCommand(T.REMOVE_LIST_COMMAND,void 0);else{const s=e==="bullet"?T.INSERT_UNORDERED_LIST_COMMAND:e==="number"?T.INSERT_ORDERED_LIST_COMMAND:T.INSERT_CHECK_LIST_COMMAND;u.dispatchCommand(s,void 0)}return}u.update(()=>{const s=c.$getSelection();c.$isRangeSelection(s)&&(e==="paragraph"?S.$setBlocksType(s,()=>c.$createParagraphNode()):e==="quote"?S.$setBlocksType(s,()=>D.$createQuoteNode()):S.$setBlocksType(s,()=>D.$createHeadingNode(e)))})},Re=()=>H(y==="quote"?"paragraph":"quote"),ie=(e,s="")=>{me(s),re(e)},pe=()=>re(null),Ie=()=>{m==null||m.onConfirm(de.trim()),re(null)},Me=()=>ie({icon:"Link2",title:n("rte.linkTitle"),label:n("rte.linkUrl"),placeholder:"https://example.com",confirmLabel:n(w?"common.update":"common.insert"),onConfirm:e=>u.dispatchCommand($.TOGGLE_LINK_COMMAND,e===""?null:ae(e))},Z),Oe=()=>ie({icon:"GalleryAdd",title:n("rte.imageTitle"),label:n("rte.imageUrl"),placeholder:"https://example.com/image.jpg",confirmLabel:n("common.insert"),onConfirm:e=>{e&&u.update(()=>I.$insertNodeToNearestRoot(K(e)))}}),De=async e=>{var N;const s=(N=e.target.files)==null?void 0:N[0];if(e.target.value="",!!s)try{const L=i?await i(s):await Gt(s);u.update(()=>I.$insertNodeToNearestRoot(K(L,s.name)))}catch{We.toast.error(n("rte.imageError"))}},Ae=()=>ie({icon:"VideoSquare",title:n("rte.videoTitle"),label:n("rte.videoUrl"),placeholder:n("rte.videoUrlPlaceholder"),confirmLabel:n("common.insert"),onConfirm:e=>{e&&u.update(()=>I.$insertNodeToNearestRoot(ue(e)))}}),v=(e,s,N,L,b)=>r.jsx(O.IconButton,{variant:e?"filled":"text",color:"primary",size:o,disabled:t,"aria-label":s,"aria-pressed":e,onMouseDown:V=>V.preventDefault(),onClick:N,children:L},b),he=y.startsWith("h")?y:"paragraph",_e=A||Ht[o];return r.jsxs("div",{className:l.toolbar,role:"toolbar","aria-label":n("rte.formatting"),"aria-orientation":"horizontal",children:[r.jsx(O.IconButton,{variant:"text",color:"primary",size:o,disabled:t||!te,"aria-label":n("rte.undo"),onMouseDown:e=>e.preventDefault(),onClick:()=>u.dispatchCommand(c.UNDO_COMMAND,void 0),children:r.jsx(h.Icon,{name:"UndoArrow"})}),r.jsx(O.IconButton,{variant:"text",color:"primary",size:o,disabled:t||!be,"aria-label":n("rte.redo"),onMouseDown:e=>e.preventDefault(),onClick:()=>u.dispatchCommand(c.REDO_COMMAND,void 0),children:r.jsx(h.Icon,{name:"RedoArrow"})}),r.jsx(M.Divider,{orientation:"vertical"}),r.jsx(se.Dropdown,{size:o,disabled:t,minWidth:!1,trigger:r.jsx(z.Button,{variant:"text",color:"primary",size:o,disabled:t,endIcon:r.jsx(h.Icon,{name:"ArrowDown4"}),"aria-label":n("rte.fontSize"),onMouseDown:e=>e.preventDefault(),children:_e}),children:Pt.map(e=>r.jsx(G.ListItem,{clickable:!0,selected:e===_e,onClick:()=>ke(e),children:e},e))}),r.jsx(M.Divider,{orientation:"vertical"}),r.jsx(se.Dropdown,{size:o,disabled:t,trigger:r.jsx(z.Button,{variant:"text",color:"primary",size:o,disabled:t,endIcon:r.jsx(h.Icon,{name:"ArrowDown4"}),onMouseDown:e=>e.preventDefault(),children:d(he)}),children:Ft.map(e=>r.jsx(G.ListItem,{clickable:!0,selected:he===e.type,icon:e.icon,onClick:()=>H(e.type),children:d(e.type)},e.type))}),r.jsx(M.Divider,{orientation:"vertical"}),v(C,n("rte.bold"),()=>ne("bold"),r.jsx(h.Icon,{name:"TextBold"})),v(f,n("rte.italic"),()=>ne("italic"),r.jsx(h.Icon,{name:"TextItalic"})),v(E,n("rte.underline"),()=>ne("underline"),r.jsx(h.Icon,{name:"TextUnderline"})),r.jsx(M.Divider,{orientation:"vertical"}),v(y==="bullet",n("rte.bulletList"),()=>H("bullet"),r.jsx(h.Icon,{name:"ListBullet"})),v(y==="number",n("rte.numberedList"),()=>H("number"),r.jsx(h.Icon,{name:"ListNumber"})),v(y==="quote",n("rte.quote"),Re,r.jsx(h.Icon,{name:"QuoteUp"})),r.jsx(M.Divider,{orientation:"vertical"}),Ut.map(e=>v(j===e.value,n(e.labelKey),()=>Te(e.value),r.jsx(h.Icon,{name:e.icon}),e.value)),r.jsx(M.Divider,{orientation:"vertical"}),r.jsx(O.IconButton,{ref:R,variant:"text",color:"primary",size:o,disabled:t,"aria-label":n("rte.textColor"),"aria-expanded":U,onMouseDown:e=>e.preventDefault(),onClick:()=>P(e=>!e),children:r.jsx(Vt,{color:B})}),r.jsx(Je.FloatingPanel,{open:U,triggerRef:R,onClose:e=>{var s;P(!1),e&&((s=R.current)==null||s.focus())},role:"dialog",ariaLabel:n("rte.textColor"),width:232,children:r.jsx(ge.ColorPickerPanel,{value:B||ge.DEFAULT_SWATCHES[0],onChange:Ee,clearable:!1})}),v(w,n("rte.link"),Me,r.jsx(h.Icon,{name:"Link2"})),r.jsxs(se.Dropdown,{size:o,disabled:t,minWidth:!1,trigger:r.jsx(O.IconButton,{variant:"text",color:"primary",size:o,disabled:t,"aria-label":n("rte.insertImage"),children:r.jsx(h.Icon,{name:"GalleryAdd"})}),children:[r.jsx(G.ListItem,{clickable:!0,icon:"GalleryImport",onClick:()=>{var e;return(e=g.current)==null?void 0:e.click()},children:n("rte.uploadImage")}),r.jsx(G.ListItem,{clickable:!0,icon:"Link",onClick:Oe,children:n("rte.imageByUrl")})]}),r.jsx(O.IconButton,{variant:"text",color:"primary",size:o,disabled:t,"aria-label":n("rte.insertVideo"),onClick:Ae,children:r.jsx(h.Icon,{name:"VideoSquare"})}),r.jsx("input",{ref:g,type:"file",accept:"image/*",hidden:!0,onChange:De,"aria-hidden":"true",tabIndex:-1}),r.jsx(Qe.Modal,{open:m!==null,onClose:pe,size:"sm",icon:m==null?void 0:m.icon,title:m==null?void 0:m.title,footer:r.jsxs(r.Fragment,{children:[r.jsx(z.Button,{variant:"text",onClick:pe,children:n("common.cancel")}),r.jsx(z.Button,{type:"submit",form:"rte-url-form",children:(m==null?void 0:m.confirmLabel)??n("common.insert")})]}),children:r.jsx("form",{id:"rte-url-form",onSubmit:e=>{e.preventDefault(),Ie()},children:r.jsx(Xe.TextField,{label:m==null?void 0:m.label,placeholder:m==null?void 0:m.placeholder,value:de,onChange:e=>me(e.target.value)})})})]})}function Gt(o){return new Promise((t,i)=>{const n=new FileReader;n.onload=()=>t(n.result),n.onerror=()=>i(n.error),n.readAsDataURL(o)})}const Kt={paragraph:l.paragraph,heading:{h1:l.h1,h2:l.h2,h3:l.h3,h4:l.h4,h5:l.h5,h6:l.h6},quote:l.quote,list:{ul:l.ul,ol:l.ol,listitem:l.li,listitemChecked:l.liChecked,listitemUnchecked:l.liUnchecked,nested:{listitem:l.nestedLi}},link:l.link,text:{bold:l.bold,italic:l.italic,underline:l.underline,strikethrough:l.strike,code:l.codeInline}},Wt=[D.HeadingNode,D.QuoteNode,T.ListNode,T.ListItemNode,$.LinkNode,W,J],Jt=[...le.ELEMENT_TRANSFORMERS,...le.TEXT_FORMAT_TRANSFORMERS,...le.TEXT_MATCH_TRANSFORMERS];function Qt(o){if(typeof document>"u")return o;const t=document.createElement("template");return t.innerHTML=o,t.content.querySelectorAll("[class]").forEach(i=>i.removeAttribute("class")),t.innerHTML}function Xt(){const o=c.$getRoot(),t=o.getFirstChild();return o.getChildrenSize()<=1&&(t===null||c.$isParagraphNode(t)&&t.getChildrenSize()===0)}function Ce(o,t){const i=c.$getRoot();if(i.clear(),t){const n=new DOMParser().parseFromString(t,"text/html"),d=Le.$generateNodesFromDOM(o,n);i.select(),c.$insertNodes(d)}i.getChildrenSize()===0&&i.append(c.$createParagraphNode()),c.$setSelection(null)}function Yt({value:o,defaultValue:t,onChange:i,disabled:n}){const[d]=ve.useLexicalComposerContext(),u=a.useRef(void 0),g=a.useRef(i);return g.current=i,a.useEffect(()=>d.setEditable(!n),[d,n]),a.useEffect(()=>d.registerNodeTransform($.LinkNode,C=>{const p=C.getURL(),f=ae(p);f!==p&&C.setURL(f)}),[d]),a.useEffect(()=>{o!==void 0||!t||(u.current=t,d.update(()=>Ce(d,t),{tag:"history-merge"}))},[]),a.useEffect(()=>{o===void 0||o===u.current||(u.current=o,d.update(()=>Ce(d,o),{tag:"history-merge"}))},[d,o]),a.useEffect(()=>d.registerUpdateListener(({dirtyElements:C,dirtyLeaves:p})=>{C.size===0&&p.size===0||d.read(()=>{const f=Xt()?"":Qt(Le.$generateHtmlFromNodes(d,null));f!==u.current&&(u.current=f,g.current(f))})}),[d]),null}const Zt=a.forwardRef(function({label:t,size:i="md",error:n,helperText:d,required:u=!1,disabled:g=!1,placeholder:C,name:p,value:f,defaultValue:Q,onChange:E,onImageUpload:X,minHeight:w=220,"aria-label":Y="Rich text editor",className:Z,style:ee},y){const k=ce.useT(),j=Ke.useFormContext(),x=j&&p?j.field(p):void 0,A=n??(x==null?void 0:x.error)??!1,q=d??(x==null?void 0:x.helperText),B=j&&p?j.values[p]:void 0,F=f!==void 0?f:j&&p?String(B??""):void 0,U=a.useCallback(_=>{j&&p&&j.setValue(p,_),E==null||E(_)},[j,p,E]),P=_=>x==null?void 0:x.onBlur(_),R=a.useRef(null);a.useEffect(()=>{const _=R.current;_&&(p?_.setAttribute("name",p):_.removeAttribute("name"))},[p]);const te={namespace:"tz-rich-text-editor",theme:Kt,nodes:Wt,editable:!g,onError:_=>{throw _}};return r.jsxs("div",{ref:y,className:$e.clsx(l.editor,l[i],A&&l.error,g&&l.disabled,Z),style:{"--tz-rte-min-height":`${w}px`,...ee},children:[t!=null&&r.jsxs("div",{className:l.label,children:[r.jsx(xe.Typography,{as:"span",variant:"bodySmall",color:"muted",children:t}),u&&r.jsx("span",{className:l.required,"aria-hidden":"true",children:"*"})]}),r.jsx("div",{className:l.control,children:r.jsxs(we.LexicalComposer,{initialConfig:te,children:[r.jsx(zt,{size:i,disabled:g,onImageUpload:X}),r.jsx("div",{className:l.shell,children:r.jsx(Be.RichTextPlugin,{contentEditable:r.jsx(Fe.ContentEditable,{ref:R,className:l.content,"aria-label":Y,"aria-invalid":A||void 0,onBlur:P}),placeholder:r.jsx("div",{className:l.placeholder,children:C??k("rte.placeholder")}),ErrorBoundary:Ue.LexicalErrorBoundary})}),r.jsx(Pe.HistoryPlugin,{}),r.jsx(He.ListPlugin,{}),r.jsx(Ve.CheckListPlugin,{}),r.jsx(ze.LinkPlugin,{}),r.jsx(Ge.MarkdownShortcutPlugin,{transformers:Jt}),r.jsx(Yt,{value:F,defaultValue:Q,onChange:U,disabled:g})]})}),q!=null&&r.jsx(xe.Typography,{as:"span",variant:"bodySmall",color:A?"error":"muted",className:l.helper,children:q})]})});exports.RichTextEditor=Zt;
2
+ //# sourceMappingURL=RichTextEditor-GxbnzLRe.cjs.map