@techzyapp/ui-library 1.0.48 → 1.0.50

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 (480) hide show
  1. package/dist/{Accordion-DOrTQJB9.js → Accordion-C6vW_OMd.js} +2 -2
  2. package/dist/{Accordion-DOrTQJB9.js.map → Accordion-C6vW_OMd.js.map} +1 -1
  3. package/dist/{Accordion-CFyeLfPT.cjs → Accordion-Icvl9S8c.cjs} +2 -2
  4. package/dist/{Accordion-CFyeLfPT.cjs.map → Accordion-Icvl9S8c.cjs.map} +1 -1
  5. package/dist/{AdminRoot-DX6glneh.js → AdminRoot-C5l8PIyi.js} +9 -9
  6. package/dist/{AdminRoot-DX6glneh.js.map → AdminRoot-C5l8PIyi.js.map} +1 -1
  7. package/dist/{AdminRoot-DAz9u2Yc.cjs → AdminRoot-MEfy9xtz.cjs} +2 -2
  8. package/dist/{AdminRoot-DAz9u2Yc.cjs.map → AdminRoot-MEfy9xtz.cjs.map} +1 -1
  9. package/dist/{Alert-QvfNBhlU.cjs → Alert--ZnlCjaL.cjs} +2 -2
  10. package/dist/{Alert-QvfNBhlU.cjs.map → Alert--ZnlCjaL.cjs.map} +1 -1
  11. package/dist/{Alert-Bo_XgY-A.js → Alert-BVs-GcZQ.js} +4 -4
  12. package/dist/{Alert-Bo_XgY-A.js.map → Alert-BVs-GcZQ.js.map} +1 -1
  13. package/dist/AuthGuard-Cm-tqCto.cjs +2 -0
  14. package/dist/AuthGuard-Cm-tqCto.cjs.map +1 -0
  15. package/dist/AuthGuard-DJ_mMwfg.js +114 -0
  16. package/dist/AuthGuard-DJ_mMwfg.js.map +1 -0
  17. package/dist/{AuthLayout-BI1wLuDl.js → AuthLayout-BDRJFSpi.js} +2 -2
  18. package/dist/{AuthLayout-BI1wLuDl.js.map → AuthLayout-BDRJFSpi.js.map} +1 -1
  19. package/dist/{AuthLayout-Bzlsvicf.cjs → AuthLayout-D7mSMdM4.cjs} +2 -2
  20. package/dist/{AuthLayout-Bzlsvicf.cjs.map → AuthLayout-D7mSMdM4.cjs.map} +1 -1
  21. package/dist/{Avatar-BBqX1732.cjs → Avatar-BwGJl-ru.cjs} +2 -2
  22. package/dist/{Avatar-BBqX1732.cjs.map → Avatar-BwGJl-ru.cjs.map} +1 -1
  23. package/dist/{Avatar-CaYyv5wk.js → Avatar-C4qgzth2.js} +2 -2
  24. package/dist/{Avatar-CaYyv5wk.js.map → Avatar-C4qgzth2.js.map} +1 -1
  25. package/dist/{AvatarGroup-DrkzAt1-.cjs → AvatarGroup-B8u8ONs5.cjs} +2 -2
  26. package/dist/{AvatarGroup-DrkzAt1-.cjs.map → AvatarGroup-B8u8ONs5.cjs.map} +1 -1
  27. package/dist/{AvatarGroup-6fhm-van.js → AvatarGroup-BqxTFzRc.js} +2 -2
  28. package/dist/{AvatarGroup-6fhm-van.js.map → AvatarGroup-BqxTFzRc.js.map} +1 -1
  29. package/dist/{Breadcrumbs-CqGS32x5.cjs → Breadcrumbs-D4wv2-T7.cjs} +2 -2
  30. package/dist/{Breadcrumbs-CqGS32x5.cjs.map → Breadcrumbs-D4wv2-T7.cjs.map} +1 -1
  31. package/dist/{Breadcrumbs-BEv57tuJ.js → Breadcrumbs-HGk4DKrc.js} +4 -4
  32. package/dist/{Breadcrumbs-BEv57tuJ.js.map → Breadcrumbs-HGk4DKrc.js.map} +1 -1
  33. package/dist/{Button-DZWYeAno.js → Button-7mgXcRdw.js} +2 -2
  34. package/dist/{Button-DZWYeAno.js.map → Button-7mgXcRdw.js.map} +1 -1
  35. package/dist/{Button-BtiFpRie.cjs → Button-DAvQCGIw.cjs} +2 -2
  36. package/dist/{Button-BtiFpRie.cjs.map → Button-DAvQCGIw.cjs.map} +1 -1
  37. package/dist/{Calendar-7W9xNVBZ.js → Calendar-B1ZJHqjB.js} +4 -4
  38. package/dist/{Calendar-7W9xNVBZ.js.map → Calendar-B1ZJHqjB.js.map} +1 -1
  39. package/dist/{Calendar-Bgh_3Vk2.cjs → Calendar-BPYjqBy9.cjs} +2 -2
  40. package/dist/{Calendar-Bgh_3Vk2.cjs.map → Calendar-BPYjqBy9.cjs.map} +1 -1
  41. package/dist/{Card-KfmWG9Uz.cjs → Card-B-Qso__1.cjs} +2 -2
  42. package/dist/{Card-KfmWG9Uz.cjs.map → Card-B-Qso__1.cjs.map} +1 -1
  43. package/dist/{Card-ckOd617g.js → Card-vFsIhkyR.js} +4 -4
  44. package/dist/{Card-ckOd617g.js.map → Card-vFsIhkyR.js.map} +1 -1
  45. package/dist/{Chip-Crzm7Eux.js → Chip-CU0J7HJa.js} +3 -3
  46. package/dist/{Chip-Crzm7Eux.js.map → Chip-CU0J7HJa.js.map} +1 -1
  47. package/dist/{Chip-BDUsue_R.cjs → Chip-CovsonP1.cjs} +2 -2
  48. package/dist/{Chip-BDUsue_R.cjs.map → Chip-CovsonP1.cjs.map} +1 -1
  49. package/dist/{ChoiceCardGroup-D37XREKV.js → ChoiceCardGroup-BBqUbFLS.js} +2 -2
  50. package/dist/{ChoiceCardGroup-D37XREKV.js.map → ChoiceCardGroup-BBqUbFLS.js.map} +1 -1
  51. package/dist/{ChoiceCardGroup-Cj_YFj6C.cjs → ChoiceCardGroup-bnKFPDYz.cjs} +2 -2
  52. package/dist/{ChoiceCardGroup-Cj_YFj6C.cjs.map → ChoiceCardGroup-bnKFPDYz.cjs.map} +1 -1
  53. package/dist/{CodeBlock-rnGAu2DQ.cjs → CodeBlock-B404V_cc.cjs} +2 -2
  54. package/dist/{CodeBlock-rnGAu2DQ.cjs.map → CodeBlock-B404V_cc.cjs.map} +1 -1
  55. package/dist/{CodeBlock-CX8_dMPD.js → CodeBlock-DvJ45qEp.js} +4 -4
  56. package/dist/{CodeBlock-CX8_dMPD.js.map → CodeBlock-DvJ45qEp.js.map} +1 -1
  57. package/dist/{ColorPicker-CwLivdAt.js → ColorPicker-C4slmEZC.js} +3 -3
  58. package/dist/{ColorPicker-CwLivdAt.js.map → ColorPicker-C4slmEZC.js.map} +1 -1
  59. package/dist/{ColorPicker-BaAdcqR9.cjs → ColorPicker-_RBW51XB.cjs} +2 -2
  60. package/dist/{ColorPicker-BaAdcqR9.cjs.map → ColorPicker-_RBW51XB.cjs.map} +1 -1
  61. package/dist/{ColorPickerPanel-IOhJJF1R.cjs → ColorPickerPanel-CNspBZre.cjs} +2 -2
  62. package/dist/{ColorPickerPanel-IOhJJF1R.cjs.map → ColorPickerPanel-CNspBZre.cjs.map} +1 -1
  63. package/dist/{ColorPickerPanel-CkrSIf35.js → ColorPickerPanel-CQNfIbgc.js} +3 -3
  64. package/dist/{ColorPickerPanel-CkrSIf35.js.map → ColorPickerPanel-CQNfIbgc.js.map} +1 -1
  65. package/dist/{ColorRamp-DbFOsspz.js → ColorRamp-DQZZiE5I.js} +2 -2
  66. package/dist/{ColorRamp-DbFOsspz.js.map → ColorRamp-DQZZiE5I.js.map} +1 -1
  67. package/dist/{ColorRamp-BCy8a7ks.cjs → ColorRamp-DuO7gkru.cjs} +2 -2
  68. package/dist/{ColorRamp-BCy8a7ks.cjs.map → ColorRamp-DuO7gkru.cjs.map} +1 -1
  69. package/dist/{ConfigProvider-CYSpuSMJ.cjs → ConfigProvider-BFhkb0BV.cjs} +2 -2
  70. package/dist/{ConfigProvider-CYSpuSMJ.cjs.map → ConfigProvider-BFhkb0BV.cjs.map} +1 -1
  71. package/dist/{ConfigProvider-DtyUlWk6.js → ConfigProvider-bXX8dnhY.js} +2 -2
  72. package/dist/{ConfigProvider-DtyUlWk6.js.map → ConfigProvider-bXX8dnhY.js.map} +1 -1
  73. package/dist/{CopyButton-DUG5s3TM.cjs → CopyButton-B2V6guZ0.cjs} +2 -2
  74. package/dist/{CopyButton-DUG5s3TM.cjs.map → CopyButton-B2V6guZ0.cjs.map} +1 -1
  75. package/dist/{CopyButton-LURMuaYw.js → CopyButton-DfYAslz-.js} +4 -4
  76. package/dist/{CopyButton-LURMuaYw.js.map → CopyButton-DfYAslz-.js.map} +1 -1
  77. package/dist/{DashedButton-BX8hfY1x.cjs → DashedButton-CZ2hjLxT.cjs} +2 -2
  78. package/dist/{DashedButton-BX8hfY1x.cjs.map → DashedButton-CZ2hjLxT.cjs.map} +1 -1
  79. package/dist/{DashedButton-wcmXTYBw.js → DashedButton-meJSIY61.js} +2 -2
  80. package/dist/{DashedButton-wcmXTYBw.js.map → DashedButton-meJSIY61.js.map} +1 -1
  81. package/dist/{DatePicker-CSIBYSZt.js → DatePicker-CNUDjOxA.js} +5 -5
  82. package/dist/{DatePicker-CSIBYSZt.js.map → DatePicker-CNUDjOxA.js.map} +1 -1
  83. package/dist/{DatePicker-Bw9gLB8o.cjs → DatePicker-DrIHa1j1.cjs} +2 -2
  84. package/dist/{DatePicker-Bw9gLB8o.cjs.map → DatePicker-DrIHa1j1.cjs.map} +1 -1
  85. package/dist/{DateTimePicker-kikKdt0F.cjs → DateTimePicker-BzwxaOPb.cjs} +2 -2
  86. package/dist/{DateTimePicker-kikKdt0F.cjs.map → DateTimePicker-BzwxaOPb.cjs.map} +1 -1
  87. package/dist/{DateTimePicker-C9F2yJMf.js → DateTimePicker-CvWNDbib.js} +8 -8
  88. package/dist/{DateTimePicker-C9F2yJMf.js.map → DateTimePicker-CvWNDbib.js.map} +1 -1
  89. package/dist/{DescriptionList-DnGkHdzT.cjs → DescriptionList-Bed1MHU8.cjs} +2 -2
  90. package/dist/{DescriptionList-DnGkHdzT.cjs.map → DescriptionList-Bed1MHU8.cjs.map} +1 -1
  91. package/dist/{DescriptionList-kfNXbf_D.js → DescriptionList-BgMNjHJQ.js} +5 -5
  92. package/dist/{DescriptionList-kfNXbf_D.js.map → DescriptionList-BgMNjHJQ.js.map} +1 -1
  93. package/dist/{Dropdown-C_y9_dVn.cjs → Dropdown-DNL7RWdL.cjs} +2 -2
  94. package/dist/{Dropdown-C_y9_dVn.cjs.map → Dropdown-DNL7RWdL.cjs.map} +1 -1
  95. package/dist/{Dropdown-D-D_Z1Jo.js → Dropdown-iWbHokT7.js} +2 -2
  96. package/dist/{Dropdown-D-D_Z1Jo.js.map → Dropdown-iWbHokT7.js.map} +1 -1
  97. package/dist/{EmptyState-BM5LrRLq.cjs → EmptyState-BzwrOICc.cjs} +2 -2
  98. package/dist/{EmptyState-BM5LrRLq.cjs.map → EmptyState-BzwrOICc.cjs.map} +1 -1
  99. package/dist/{EmptyState-DrSj2XV_.js → EmptyState-CmcjJl_K.js} +3 -3
  100. package/dist/{EmptyState-DrSj2XV_.js.map → EmptyState-CmcjJl_K.js.map} +1 -1
  101. package/dist/{ErrorBoundary-yz669VEu.cjs → ErrorBoundary-BcZgeSsu.cjs} +2 -2
  102. package/dist/{ErrorBoundary-yz669VEu.cjs.map → ErrorBoundary-BcZgeSsu.cjs.map} +1 -1
  103. package/dist/{ErrorBoundary-DsP4hO_V.js → ErrorBoundary-TfeJetWc.js} +3 -3
  104. package/dist/{ErrorBoundary-DsP4hO_V.js.map → ErrorBoundary-TfeJetWc.js.map} +1 -1
  105. package/dist/{ErrorState-BThPIYaM.cjs → ErrorState-CzWz5UcX.cjs} +2 -2
  106. package/dist/{ErrorState-BThPIYaM.cjs.map → ErrorState-CzWz5UcX.cjs.map} +1 -1
  107. package/dist/{ErrorState-DEngucdq.js → ErrorState-EjIhdq7S.js} +8 -8
  108. package/dist/{ErrorState-DEngucdq.js.map → ErrorState-EjIhdq7S.js.map} +1 -1
  109. package/dist/{FileCard-CmCESTQd.js → FileCard-CmMxVyk3.js} +5 -5
  110. package/dist/{FileCard-CmCESTQd.js.map → FileCard-CmMxVyk3.js.map} +1 -1
  111. package/dist/{FileCard-wxDT2rj9.cjs → FileCard-Cxr1_eF2.cjs} +2 -2
  112. package/dist/{FileCard-wxDT2rj9.cjs.map → FileCard-Cxr1_eF2.cjs.map} +1 -1
  113. package/dist/{FileUploader-Dp1r4Sxc.js → FileUploader-2cXBI4Nh.js} +7 -7
  114. package/dist/{FileUploader-Dp1r4Sxc.js.map → FileUploader-2cXBI4Nh.js.map} +1 -1
  115. package/dist/{FileUploader-DBNRp5eT.cjs → FileUploader-BkM1t2aE.cjs} +2 -2
  116. package/dist/{FileUploader-DBNRp5eT.cjs.map → FileUploader-BkM1t2aE.cjs.map} +1 -1
  117. package/dist/{Flag-B6OhgwZr.cjs → Flag-CWp81_zX.cjs} +2 -2
  118. package/dist/{Flag-B6OhgwZr.cjs.map → Flag-CWp81_zX.cjs.map} +1 -1
  119. package/dist/{Flag-Q3vI7cgt.js → Flag-IQolG3j6.js} +2 -2
  120. package/dist/{Flag-Q3vI7cgt.js.map → Flag-IQolG3j6.js.map} +1 -1
  121. package/dist/{FullscreenToggle-WGsbE3Op.js → FullscreenToggle-B1DH_-k3.js} +4 -4
  122. package/dist/{FullscreenToggle-WGsbE3Op.js.map → FullscreenToggle-B1DH_-k3.js.map} +1 -1
  123. package/dist/{FullscreenToggle-DVdQriWB.cjs → FullscreenToggle-DXVAeN3M.cjs} +2 -2
  124. package/dist/{FullscreenToggle-DVdQriWB.cjs.map → FullscreenToggle-DXVAeN3M.cjs.map} +1 -1
  125. package/dist/Icon-BoQmbW7j.cjs +2 -0
  126. package/dist/Icon-BoQmbW7j.cjs.map +1 -0
  127. package/dist/{Icon-B7DJn8Tw.js → Icon-DMMO32p6.js} +72 -71
  128. package/dist/Icon-DMMO32p6.js.map +1 -0
  129. package/dist/{IconButton-DSPdv-oI.cjs → IconButton-ChhZqleN.cjs} +2 -2
  130. package/dist/{IconButton-DSPdv-oI.cjs.map → IconButton-ChhZqleN.cjs.map} +1 -1
  131. package/dist/{IconButton-iWbUJAz7.js → IconButton-s5hohjxu.js} +2 -2
  132. package/dist/{IconButton-iWbUJAz7.js.map → IconButton-s5hohjxu.js.map} +1 -1
  133. package/dist/{ImageEditor-C40dp2-V.cjs → ImageEditor-C8tFTX4e.cjs} +2 -2
  134. package/dist/{ImageEditor-C40dp2-V.cjs.map → ImageEditor-C8tFTX4e.cjs.map} +1 -1
  135. package/dist/{ImageEditor-BDNys8pq.js → ImageEditor-DWbWjGQ8.js} +8 -8
  136. package/dist/{ImageEditor-BDNys8pq.js.map → ImageEditor-DWbWjGQ8.js.map} +1 -1
  137. package/dist/{List-DS91CZUt.js → List-DQlEG_S5.js} +2 -2
  138. package/dist/{List-DS91CZUt.js.map → List-DQlEG_S5.js.map} +1 -1
  139. package/dist/{List-CLUXeaXS.cjs → List-Dfa7mlSZ.cjs} +2 -2
  140. package/dist/{List-CLUXeaXS.cjs.map → List-Dfa7mlSZ.cjs.map} +1 -1
  141. package/dist/{ListItem-Ezmdk7q-.js → ListItem-CLmg9xKQ.js} +2 -2
  142. package/dist/{ListItem-Ezmdk7q-.js.map → ListItem-CLmg9xKQ.js.map} +1 -1
  143. package/dist/{ListItem-CguNjf-u.cjs → ListItem-CWM2fUS2.cjs} +2 -2
  144. package/dist/{ListItem-CguNjf-u.cjs.map → ListItem-CWM2fUS2.cjs.map} +1 -1
  145. package/dist/{Loader-RyFTP2X5.cjs → Loader-BCrMy9NU.cjs} +2 -2
  146. package/dist/{Loader-RyFTP2X5.cjs.map → Loader-BCrMy9NU.cjs.map} +1 -1
  147. package/dist/{Loader-DD1vfqmN.js → Loader-CShIWNfG.js} +2 -2
  148. package/dist/{Loader-DD1vfqmN.js.map → Loader-CShIWNfG.js.map} +1 -1
  149. package/dist/{LocationPicker-B594f0bz.cjs → LocationPicker-8Tt0zJU4.cjs} +2 -2
  150. package/dist/{LocationPicker-B594f0bz.cjs.map → LocationPicker-8Tt0zJU4.cjs.map} +1 -1
  151. package/dist/{LocationPicker-DpmYaYyd.js → LocationPicker-DsV_s2Ur.js} +8 -8
  152. package/dist/{LocationPicker-DpmYaYyd.js.map → LocationPicker-DsV_s2Ur.js.map} +1 -1
  153. package/dist/{Modal-DVGTD2Ck.js → Modal-BO7fHn0r.js} +4 -4
  154. package/dist/{Modal-DVGTD2Ck.js.map → Modal-BO7fHn0r.js.map} +1 -1
  155. package/dist/{Modal-7cCok6fV.cjs → Modal-yj92WLay.cjs} +2 -2
  156. package/dist/{Modal-7cCok6fV.cjs.map → Modal-yj92WLay.cjs.map} +1 -1
  157. package/dist/{MultiSelect-DTKNjUDH.cjs → MultiSelect-B6JZb_5N.cjs} +2 -2
  158. package/dist/{MultiSelect-DTKNjUDH.cjs.map → MultiSelect-B6JZb_5N.cjs.map} +1 -1
  159. package/dist/{MultiSelect-D-X833xt.js → MultiSelect-D-QWlfwD.js} +5 -5
  160. package/dist/{MultiSelect-D-X833xt.js.map → MultiSelect-D-QWlfwD.js.map} +1 -1
  161. package/dist/{NumberField-Xz4yQMlm.cjs → NumberField-CS5VMnk4.cjs} +2 -2
  162. package/dist/{NumberField-Xz4yQMlm.cjs.map → NumberField-CS5VMnk4.cjs.map} +1 -1
  163. package/dist/{NumberField-OPOl0Yph.js → NumberField-D_UxKjVN.js} +4 -4
  164. package/dist/{NumberField-OPOl0Yph.js.map → NumberField-D_UxKjVN.js.map} +1 -1
  165. package/dist/{OtpField-kd0YghZq.cjs → OtpField-BuS_8j9L.cjs} +2 -2
  166. package/dist/{OtpField-kd0YghZq.cjs.map → OtpField-BuS_8j9L.cjs.map} +1 -1
  167. package/dist/{OtpField-CLrDMNtS.js → OtpField-CpjDid5_.js} +2 -2
  168. package/dist/{OtpField-CLrDMNtS.js.map → OtpField-CpjDid5_.js.map} +1 -1
  169. package/dist/{PageError-v6MAH_OL.cjs → PageError-CTEOASeb.cjs} +2 -2
  170. package/dist/{PageError-v6MAH_OL.cjs.map → PageError-CTEOASeb.cjs.map} +1 -1
  171. package/dist/{PageError-BIiZDzey.js → PageError-DjyJrGmR.js} +5 -5
  172. package/dist/{PageError-BIiZDzey.js.map → PageError-DjyJrGmR.js.map} +1 -1
  173. package/dist/{PageLayout-DH3jochw.cjs → PageLayout-BYKRmCAL.cjs} +2 -2
  174. package/dist/{PageLayout-DH3jochw.cjs.map → PageLayout-BYKRmCAL.cjs.map} +1 -1
  175. package/dist/{PageLayout-BjaPfXvb.js → PageLayout-Cz1OhQZ7.js} +5 -5
  176. package/dist/{PageLayout-BjaPfXvb.js.map → PageLayout-Cz1OhQZ7.js.map} +1 -1
  177. package/dist/{PageNotFound-C1oSsMG-.js → PageNotFound-CwBtrllo.js} +5 -5
  178. package/dist/{PageNotFound-C1oSsMG-.js.map → PageNotFound-CwBtrllo.js.map} +1 -1
  179. package/dist/{PageNotFound-Cse4bROv.cjs → PageNotFound-u9Q4KG6B.cjs} +2 -2
  180. package/dist/{PageNotFound-Cse4bROv.cjs.map → PageNotFound-u9Q4KG6B.cjs.map} +1 -1
  181. package/dist/{Pagination-BNJdqcu4.js → Pagination-CLjNwqie.js} +3 -3
  182. package/dist/{Pagination-BNJdqcu4.js.map → Pagination-CLjNwqie.js.map} +1 -1
  183. package/dist/{Pagination-DkmfEmgK.cjs → Pagination-HtS5gPnd.cjs} +2 -2
  184. package/dist/{Pagination-DkmfEmgK.cjs.map → Pagination-HtS5gPnd.cjs.map} +1 -1
  185. package/dist/{PaletteField-DqZl1mK0.cjs → PaletteField-BSgx5pxh.cjs} +2 -2
  186. package/dist/{PaletteField-DqZl1mK0.cjs.map → PaletteField-BSgx5pxh.cjs.map} +1 -1
  187. package/dist/{PaletteField-Cdky6Zka.js → PaletteField-Bk7cnSla.js} +3 -3
  188. package/dist/{PaletteField-Cdky6Zka.js.map → PaletteField-Bk7cnSla.js.map} +1 -1
  189. package/dist/{PhoneField-jq-3_i_b.cjs → PhoneField-CzFv2Vci.cjs} +2 -2
  190. package/dist/{PhoneField-jq-3_i_b.cjs.map → PhoneField-CzFv2Vci.cjs.map} +1 -1
  191. package/dist/{PhoneField-DmFaJJEa.js → PhoneField-DhoumZNG.js} +5 -5
  192. package/dist/{PhoneField-DmFaJJEa.js.map → PhoneField-DhoumZNG.js.map} +1 -1
  193. package/dist/{Popconfirm-KOE9gGi6.cjs → Popconfirm-Cb9LlmZb.cjs} +2 -2
  194. package/dist/{Popconfirm-KOE9gGi6.cjs.map → Popconfirm-Cb9LlmZb.cjs.map} +1 -1
  195. package/dist/{Popconfirm-D-8ZG2WR.js → Popconfirm-D7J5JbF-.js} +4 -4
  196. package/dist/{Popconfirm-D-8ZG2WR.js.map → Popconfirm-D7J5JbF-.js.map} +1 -1
  197. package/dist/{Progress-CdX666FP.js → Progress-Bt2LDqbD.js} +2 -2
  198. package/dist/{Progress-CdX666FP.js.map → Progress-Bt2LDqbD.js.map} +1 -1
  199. package/dist/{Progress-7EyhPtnu.cjs → Progress-dAtQ2BN-.cjs} +2 -2
  200. package/dist/{Progress-7EyhPtnu.cjs.map → Progress-dAtQ2BN-.cjs.map} +1 -1
  201. package/dist/{QrCode-ClIJjjvF.cjs → QrCode-FHUAxI8u.cjs} +2 -2
  202. package/dist/{QrCode-ClIJjjvF.cjs.map → QrCode-FHUAxI8u.cjs.map} +1 -1
  203. package/dist/{QrCode-D7ocSDi7.js → QrCode-jaDZxZkv.js} +2 -2
  204. package/dist/{QrCode-D7ocSDi7.js.map → QrCode-jaDZxZkv.js.map} +1 -1
  205. package/dist/{RemoveDialog-DTzRPLaT.js → RemoveDialog-DdO5E3Wl.js} +6 -6
  206. package/dist/{RemoveDialog-DTzRPLaT.js.map → RemoveDialog-DdO5E3Wl.js.map} +1 -1
  207. package/dist/{RemoveDialog-UsSX5z8Y.cjs → RemoveDialog-eGNxdyoO.cjs} +2 -2
  208. package/dist/{RemoveDialog-UsSX5z8Y.cjs.map → RemoveDialog-eGNxdyoO.cjs.map} +1 -1
  209. package/dist/{RichTextEditor-Bh0Q3dIW.cjs → RichTextEditor-CoYuQurR.cjs} +2 -2
  210. package/dist/{RichTextEditor-Bh0Q3dIW.cjs.map → RichTextEditor-CoYuQurR.cjs.map} +1 -1
  211. package/dist/{RichTextEditor-BMctlkVC.js → RichTextEditor-DHRiJchI.js} +10 -10
  212. package/dist/{RichTextEditor-BMctlkVC.js.map → RichTextEditor-DHRiJchI.js.map} +1 -1
  213. package/dist/{RootLayout-BztZetpk.cjs → RootLayout-CEplIlVR.cjs} +2 -2
  214. package/dist/{RootLayout-BztZetpk.cjs.map → RootLayout-CEplIlVR.cjs.map} +1 -1
  215. package/dist/{RootLayout-CTkv4iQJ.js → RootLayout-pd66MZtI.js} +21 -21
  216. package/dist/{RootLayout-CTkv4iQJ.js.map → RootLayout-pd66MZtI.js.map} +1 -1
  217. package/dist/{Select-CmonDIIU.js → Select-C2iiQLMh.js} +4 -4
  218. package/dist/{Select-CmonDIIU.js.map → Select-C2iiQLMh.js.map} +1 -1
  219. package/dist/{Select-BzVyK6Ne.cjs → Select-CvW_T9R-.cjs} +2 -2
  220. package/dist/{Select-BzVyK6Ne.cjs.map → Select-CvW_T9R-.cjs.map} +1 -1
  221. package/dist/Sidebar-CqGCazeA.cjs +2 -0
  222. package/dist/Sidebar-CqGCazeA.cjs.map +1 -0
  223. package/dist/Sidebar-DuUhzQBi.js +543 -0
  224. package/dist/Sidebar-DuUhzQBi.js.map +1 -0
  225. package/dist/{Slider-Oe9VSAdy.cjs → Slider-DlPMPdHA.cjs} +2 -2
  226. package/dist/{Slider-Oe9VSAdy.cjs.map → Slider-DlPMPdHA.cjs.map} +1 -1
  227. package/dist/{Slider-C7Wb3q_F.js → Slider-UY29adRu.js} +2 -2
  228. package/dist/{Slider-C7Wb3q_F.js.map → Slider-UY29adRu.js.map} +1 -1
  229. package/dist/{SpeedDial-DpIXoYHB.cjs → SpeedDial-Cms5pJ9t.cjs} +2 -2
  230. package/dist/{SpeedDial-DpIXoYHB.cjs.map → SpeedDial-Cms5pJ9t.cjs.map} +1 -1
  231. package/dist/{SpeedDial-CCGQlwn2.js → SpeedDial-DOWefQgo.js} +3 -3
  232. package/dist/{SpeedDial-CCGQlwn2.js.map → SpeedDial-DOWefQgo.js.map} +1 -1
  233. package/dist/{Stepper-PBDU60G_.cjs → Stepper-4wCyTnwi.cjs} +2 -2
  234. package/dist/{Stepper-PBDU60G_.cjs.map → Stepper-4wCyTnwi.cjs.map} +1 -1
  235. package/dist/{Stepper-D_WKS1RG.js → Stepper-yQEJkbUJ.js} +3 -3
  236. package/dist/{Stepper-D_WKS1RG.js.map → Stepper-yQEJkbUJ.js.map} +1 -1
  237. package/dist/{SwatchPicker-DS4WY2eM.js → SwatchPicker-BI0XHphv.js} +2 -2
  238. package/dist/{SwatchPicker-DS4WY2eM.js.map → SwatchPicker-BI0XHphv.js.map} +1 -1
  239. package/dist/{SwatchPicker-DCjE0T80.cjs → SwatchPicker-QYtqEUxX.cjs} +2 -2
  240. package/dist/{SwatchPicker-DCjE0T80.cjs.map → SwatchPicker-QYtqEUxX.cjs.map} +1 -1
  241. package/dist/{Table-DZQVa_PE.js → Table-CNrt1EWm.js} +19 -19
  242. package/dist/{Table-DZQVa_PE.js.map → Table-CNrt1EWm.js.map} +1 -1
  243. package/dist/{Table-CZ4n4-TN.cjs → Table-D4pqLNtE.cjs} +2 -2
  244. package/dist/{Table-CZ4n4-TN.cjs.map → Table-D4pqLNtE.cjs.map} +1 -1
  245. package/dist/{Tabs-Byhqm-TE.cjs → Tabs-D6qrgZTM.cjs} +2 -2
  246. package/dist/{Tabs-Byhqm-TE.cjs.map → Tabs-D6qrgZTM.cjs.map} +1 -1
  247. package/dist/{Tabs-B063mP-v.js → Tabs-lezN63jW.js} +3 -3
  248. package/dist/{Tabs-B063mP-v.js.map → Tabs-lezN63jW.js.map} +1 -1
  249. package/dist/{TagsField-g_LtwYgz.cjs → TagsField-BIJEDyfz.cjs} +2 -2
  250. package/dist/{TagsField-g_LtwYgz.cjs.map → TagsField-BIJEDyfz.cjs.map} +1 -1
  251. package/dist/{TagsField-hQFYyNcM.js → TagsField-D_a2I8eU.js} +5 -5
  252. package/dist/{TagsField-hQFYyNcM.js.map → TagsField-D_a2I8eU.js.map} +1 -1
  253. package/dist/{TextField-Dfpk0jOg.js → TextField-BsC2zoHI.js} +4 -4
  254. package/dist/{TextField-Dfpk0jOg.js.map → TextField-BsC2zoHI.js.map} +1 -1
  255. package/dist/{TextField-D4s2hGSd.cjs → TextField-CXDBlP-8.cjs} +2 -2
  256. package/dist/{TextField-D4s2hGSd.cjs.map → TextField-CXDBlP-8.cjs.map} +1 -1
  257. package/dist/{ThemeToggle-BQQ3eswr.js → ThemeToggle-Dh6XxqM7.js} +4 -4
  258. package/dist/{ThemeToggle-BQQ3eswr.js.map → ThemeToggle-Dh6XxqM7.js.map} +1 -1
  259. package/dist/{ThemeToggle-BTTI7Jz0.cjs → ThemeToggle-zbKf4ph5.cjs} +2 -2
  260. package/dist/{ThemeToggle-BTTI7Jz0.cjs.map → ThemeToggle-zbKf4ph5.cjs.map} +1 -1
  261. package/dist/{TimeColumns-BpjhrNCq.js → TimeColumns-CR__2LXh.js} +2 -2
  262. package/dist/{TimeColumns-BpjhrNCq.js.map → TimeColumns-CR__2LXh.js.map} +1 -1
  263. package/dist/{TimeColumns-DZYGWWG_.cjs → TimeColumns-CjBeUPtV.cjs} +2 -2
  264. package/dist/{TimeColumns-DZYGWWG_.cjs.map → TimeColumns-CjBeUPtV.cjs.map} +1 -1
  265. package/dist/{TimePicker-mzoMIlpq.js → TimePicker-BakQ-wPd.js} +6 -6
  266. package/dist/{TimePicker-mzoMIlpq.js.map → TimePicker-BakQ-wPd.js.map} +1 -1
  267. package/dist/{TimePicker-DChtZgBs.cjs → TimePicker-DtqmD2bH.cjs} +2 -2
  268. package/dist/{TimePicker-DChtZgBs.cjs.map → TimePicker-DtqmD2bH.cjs.map} +1 -1
  269. package/dist/{Timeline-DOojNvLG.cjs → Timeline-CFKbPpAV.cjs} +2 -2
  270. package/dist/{Timeline-DOojNvLG.cjs.map → Timeline-CFKbPpAV.cjs.map} +1 -1
  271. package/dist/{Timeline-Dg03dwTN.js → Timeline-zCHcq7Ra.js} +2 -2
  272. package/dist/{Timeline-Dg03dwTN.js.map → Timeline-zCHcq7Ra.js.map} +1 -1
  273. package/dist/{Toaster-lonArt-H.cjs → Toaster-BpXPWJ_n.cjs} +2 -2
  274. package/dist/{Toaster-lonArt-H.cjs.map → Toaster-BpXPWJ_n.cjs.map} +1 -1
  275. package/dist/{Toaster-79DvOW80.js → Toaster-C5jWNL-o.js} +3 -3
  276. package/dist/{Toaster-79DvOW80.js.map → Toaster-C5jWNL-o.js.map} +1 -1
  277. package/dist/{ToggleButtonGroup-CGNRLxjg.cjs → ToggleButtonGroup-CbKtjm8O.cjs} +2 -2
  278. package/dist/{ToggleButtonGroup-CGNRLxjg.cjs.map → ToggleButtonGroup-CbKtjm8O.cjs.map} +1 -1
  279. package/dist/{ToggleButtonGroup-K6ZcrTZT.js → ToggleButtonGroup-D3Jltv0z.js} +2 -2
  280. package/dist/{ToggleButtonGroup-K6ZcrTZT.js.map → ToggleButtonGroup-D3Jltv0z.js.map} +1 -1
  281. package/dist/{TranslatedFields-CHHtXO_n.js → TranslatedFields-C8oxlGIQ.js} +5 -5
  282. package/dist/{TranslatedFields-CHHtXO_n.js.map → TranslatedFields-C8oxlGIQ.js.map} +1 -1
  283. package/dist/{TranslatedFields-BYpMrYaw.cjs → TranslatedFields-Che_ZPHk.cjs} +2 -2
  284. package/dist/{TranslatedFields-BYpMrYaw.cjs.map → TranslatedFields-Che_ZPHk.cjs.map} +1 -1
  285. package/dist/{UserCard-SlkCgZS9.cjs → UserCard-DlrdIJHW.cjs} +2 -2
  286. package/dist/{UserCard-SlkCgZS9.cjs.map → UserCard-DlrdIJHW.cjs.map} +1 -1
  287. package/dist/{UserCard-BJFNP_nl.js → UserCard-Dr1A_bdA.js} +5 -5
  288. package/dist/{UserCard-BJFNP_nl.js.map → UserCard-Dr1A_bdA.js.map} +1 -1
  289. package/dist/auth/AuthGuard.d.cts +3 -1
  290. package/dist/auth/AuthGuard.d.ts +3 -1
  291. package/dist/auth/authLayoutRoute.d.cts +4 -3
  292. package/dist/auth/authLayoutRoute.d.ts +4 -3
  293. package/dist/auth/authRedirect.d.cts +13 -5
  294. package/dist/auth/authRedirect.d.ts +13 -5
  295. package/dist/{authLayoutRoute-AiQqIH85.cjs → authLayoutRoute-CPLqQVvx.cjs} +2 -2
  296. package/dist/authLayoutRoute-CPLqQVvx.cjs.map +1 -0
  297. package/dist/{authLayoutRoute-Nf2PDNDN.js → authLayoutRoute-nSZq8JYA.js} +2 -2
  298. package/dist/authLayoutRoute-nSZq8JYA.js.map +1 -0
  299. package/dist/chunks/icons/{62-Bfupp-0A.js → 62-9nuZO-ct.js} +9 -10
  300. package/dist/chunks/icons/{62-CZZzM1ev.cjs → 62-DQQ1U3IB.cjs} +1 -1
  301. package/dist/components/Accordion/index.cjs +1 -1
  302. package/dist/components/Accordion/index.js +1 -1
  303. package/dist/components/Alert/index.cjs +1 -1
  304. package/dist/components/Alert/index.js +1 -1
  305. package/dist/components/AuthLayout/index.cjs +1 -1
  306. package/dist/components/AuthLayout/index.js +1 -1
  307. package/dist/components/Avatar/index.cjs +1 -1
  308. package/dist/components/Avatar/index.js +2 -2
  309. package/dist/components/Breadcrumbs/index.cjs +1 -1
  310. package/dist/components/Breadcrumbs/index.js +1 -1
  311. package/dist/components/Button/index.cjs +1 -1
  312. package/dist/components/Button/index.js +1 -1
  313. package/dist/components/Card/index.cjs +1 -1
  314. package/dist/components/Card/index.js +1 -1
  315. package/dist/components/Chip/index.cjs +1 -1
  316. package/dist/components/Chip/index.js +1 -1
  317. package/dist/components/ChoiceCard/index.cjs +1 -1
  318. package/dist/components/ChoiceCard/index.js +1 -1
  319. package/dist/components/CodeBlock/index.cjs +1 -1
  320. package/dist/components/CodeBlock/index.js +1 -1
  321. package/dist/components/ColorPicker/index.cjs +1 -1
  322. package/dist/components/ColorPicker/index.js +1 -1
  323. package/dist/components/ColorRamp/index.cjs +1 -1
  324. package/dist/components/ColorRamp/index.js +1 -1
  325. package/dist/components/CopyButton/index.cjs +1 -1
  326. package/dist/components/CopyButton/index.js +1 -1
  327. package/dist/components/DashedButton/index.cjs +1 -1
  328. package/dist/components/DashedButton/index.js +1 -1
  329. package/dist/components/DatePicker/index.cjs +1 -1
  330. package/dist/components/DatePicker/index.js +1 -1
  331. package/dist/components/DateTimePicker/index.cjs +1 -1
  332. package/dist/components/DateTimePicker/index.js +1 -1
  333. package/dist/components/DescriptionList/index.cjs +1 -1
  334. package/dist/components/DescriptionList/index.js +1 -1
  335. package/dist/components/Dropdown/index.cjs +1 -1
  336. package/dist/components/Dropdown/index.js +1 -1
  337. package/dist/components/EmptyState/index.cjs +1 -1
  338. package/dist/components/EmptyState/index.js +1 -1
  339. package/dist/components/ErrorState/index.cjs +1 -1
  340. package/dist/components/ErrorState/index.js +2 -2
  341. package/dist/components/FileCard/index.cjs +1 -1
  342. package/dist/components/FileCard/index.js +1 -1
  343. package/dist/components/FileUploader/index.cjs +1 -1
  344. package/dist/components/FileUploader/index.js +1 -1
  345. package/dist/components/Flag/index.cjs +1 -1
  346. package/dist/components/Flag/index.js +1 -1
  347. package/dist/components/FullscreenToggle/index.cjs +1 -1
  348. package/dist/components/FullscreenToggle/index.js +1 -1
  349. package/dist/components/Icon/index.cjs +1 -1
  350. package/dist/components/Icon/index.js +1 -1
  351. package/dist/components/IconButton/index.cjs +1 -1
  352. package/dist/components/IconButton/index.js +1 -1
  353. package/dist/components/ImageEditor/index.cjs +1 -1
  354. package/dist/components/ImageEditor/index.js +1 -1
  355. package/dist/components/List/index.cjs +1 -1
  356. package/dist/components/List/index.js +2 -2
  357. package/dist/components/Loader/index.cjs +1 -1
  358. package/dist/components/Loader/index.js +1 -1
  359. package/dist/components/LocationPicker/index.cjs +1 -1
  360. package/dist/components/LocationPicker/index.js +1 -1
  361. package/dist/components/Modal/index.cjs +1 -1
  362. package/dist/components/Modal/index.js +1 -1
  363. package/dist/components/MultiSelect/index.cjs +1 -1
  364. package/dist/components/MultiSelect/index.js +1 -1
  365. package/dist/components/NumberField/index.cjs +1 -1
  366. package/dist/components/NumberField/index.js +1 -1
  367. package/dist/components/OtpField/index.cjs +1 -1
  368. package/dist/components/OtpField/index.js +1 -1
  369. package/dist/components/PageError/index.cjs +1 -1
  370. package/dist/components/PageError/index.js +1 -1
  371. package/dist/components/PageLayout/index.cjs +1 -1
  372. package/dist/components/PageLayout/index.js +1 -1
  373. package/dist/components/PageNotFound/index.cjs +1 -1
  374. package/dist/components/PageNotFound/index.js +1 -1
  375. package/dist/components/Pagination/index.cjs +1 -1
  376. package/dist/components/Pagination/index.js +1 -1
  377. package/dist/components/PaletteField/index.cjs +1 -1
  378. package/dist/components/PaletteField/index.js +1 -1
  379. package/dist/components/PhoneField/index.cjs +1 -1
  380. package/dist/components/PhoneField/index.js +1 -1
  381. package/dist/components/Popconfirm/index.cjs +1 -1
  382. package/dist/components/Popconfirm/index.js +1 -1
  383. package/dist/components/Progress/index.cjs +1 -1
  384. package/dist/components/Progress/index.js +1 -1
  385. package/dist/components/QrCode/index.cjs +1 -1
  386. package/dist/components/QrCode/index.js +1 -1
  387. package/dist/components/RemoveDialog/index.cjs +1 -1
  388. package/dist/components/RemoveDialog/index.js +1 -1
  389. package/dist/components/RichTextEditor/index.cjs +1 -1
  390. package/dist/components/RichTextEditor/index.js +1 -1
  391. package/dist/components/RootLayout/index.cjs +1 -1
  392. package/dist/components/RootLayout/index.js +1 -1
  393. package/dist/components/Select/index.cjs +1 -1
  394. package/dist/components/Select/index.js +1 -1
  395. package/dist/components/Sidebar/Sidebar.d.cts +40 -4
  396. package/dist/components/Sidebar/Sidebar.d.ts +40 -4
  397. package/dist/components/Sidebar/index.cjs +1 -1
  398. package/dist/components/Sidebar/index.d.cts +2 -1
  399. package/dist/components/Sidebar/index.d.ts +2 -1
  400. package/dist/components/Sidebar/index.js +5 -4
  401. package/dist/components/Slider/index.cjs +1 -1
  402. package/dist/components/Slider/index.js +1 -1
  403. package/dist/components/SpeedDial/index.cjs +1 -1
  404. package/dist/components/SpeedDial/index.js +1 -1
  405. package/dist/components/Stepper/index.cjs +1 -1
  406. package/dist/components/Stepper/index.js +1 -1
  407. package/dist/components/SwatchPicker/index.cjs +1 -1
  408. package/dist/components/SwatchPicker/index.js +1 -1
  409. package/dist/components/Table/index.cjs +1 -1
  410. package/dist/components/Table/index.js +1 -1
  411. package/dist/components/Tabs/index.cjs +1 -1
  412. package/dist/components/Tabs/index.js +1 -1
  413. package/dist/components/TagsField/index.cjs +1 -1
  414. package/dist/components/TagsField/index.js +1 -1
  415. package/dist/components/TextField/index.cjs +1 -1
  416. package/dist/components/TextField/index.js +1 -1
  417. package/dist/components/ThemeToggle/index.cjs +1 -1
  418. package/dist/components/ThemeToggle/index.js +1 -1
  419. package/dist/components/TimePicker/index.cjs +1 -1
  420. package/dist/components/TimePicker/index.js +1 -1
  421. package/dist/components/Timeline/index.cjs +1 -1
  422. package/dist/components/Timeline/index.js +1 -1
  423. package/dist/components/Toast/index.cjs +1 -1
  424. package/dist/components/Toast/index.js +1 -1
  425. package/dist/components/ToggleButton/index.cjs +1 -1
  426. package/dist/components/ToggleButton/index.js +1 -1
  427. package/dist/components/TranslatedFields/index.cjs +1 -1
  428. package/dist/components/TranslatedFields/index.js +1 -1
  429. package/dist/components/UserCard/index.cjs +1 -1
  430. package/dist/components/UserCard/index.js +1 -1
  431. package/dist/entries/app.cjs +1 -1
  432. package/dist/entries/app.js +1 -1
  433. package/dist/entries/auth.cjs +1 -1
  434. package/dist/entries/auth.js +2 -2
  435. package/dist/entries/components.cjs +1 -1
  436. package/dist/entries/components.js +157 -156
  437. package/dist/entries/i18n.cjs +1 -1
  438. package/dist/entries/i18n.js +2 -2
  439. package/dist/entries/icons.cjs +1 -1
  440. package/dist/entries/icons.js +1 -1
  441. package/dist/entries/theme.cjs +1 -1
  442. package/dist/entries/theme.js +1 -1
  443. package/dist/i18n/messages.d.cts +4 -0
  444. package/dist/i18n/messages.d.ts +4 -0
  445. package/dist/index.cjs +1 -1
  446. package/dist/index.css +1 -1
  447. package/dist/index.js +173 -172
  448. package/dist/{messages-DeQuvGln.js → messages-CZbb1xNN.js} +29 -15
  449. package/dist/messages-CZbb1xNN.js.map +1 -0
  450. package/dist/messages-D4ooXnUr.cjs +36 -0
  451. package/dist/messages-D4ooXnUr.cjs.map +1 -0
  452. package/dist/useHomeTo---51HTJ0.cjs +2 -0
  453. package/dist/useHomeTo---51HTJ0.cjs.map +1 -0
  454. package/dist/useHomeTo-CJj94TdV.js +10 -0
  455. package/dist/useHomeTo-CJj94TdV.js.map +1 -0
  456. package/dist/{useOptionMenu-6ZffgbYG.cjs → useOptionMenu-DS___46k.cjs} +2 -2
  457. package/dist/{useOptionMenu-6ZffgbYG.cjs.map → useOptionMenu-DS___46k.cjs.map} +1 -1
  458. package/dist/{useOptionMenu-CxM6FHXL.js → useOptionMenu-Sp2d3Bzi.js} +6 -6
  459. package/dist/{useOptionMenu-CxM6FHXL.js.map → useOptionMenu-Sp2d3Bzi.js.map} +1 -1
  460. package/package.json +1 -1
  461. package/dist/AuthGuard-BTSRwF04.js +0 -108
  462. package/dist/AuthGuard-BTSRwF04.js.map +0 -1
  463. package/dist/AuthGuard-CLqroYbX.cjs +0 -2
  464. package/dist/AuthGuard-CLqroYbX.cjs.map +0 -1
  465. package/dist/Icon-B7DJn8Tw.js.map +0 -1
  466. package/dist/Icon-CBg21lKA.cjs +0 -2
  467. package/dist/Icon-CBg21lKA.cjs.map +0 -1
  468. package/dist/Sidebar-CLr-DyQ_.js +0 -522
  469. package/dist/Sidebar-CLr-DyQ_.js.map +0 -1
  470. package/dist/Sidebar-CM-jZfj5.cjs +0 -2
  471. package/dist/Sidebar-CM-jZfj5.cjs.map +0 -1
  472. package/dist/authLayoutRoute-AiQqIH85.cjs.map +0 -1
  473. package/dist/authLayoutRoute-Nf2PDNDN.js.map +0 -1
  474. package/dist/messages-DeQuvGln.js.map +0 -1
  475. package/dist/messages-dL9MkVze.cjs +0 -36
  476. package/dist/messages-dL9MkVze.cjs.map +0 -1
  477. package/dist/useHomeTo-BLSvhJd5.js +0 -25
  478. package/dist/useHomeTo-BLSvhJd5.js.map +0 -1
  479. package/dist/useHomeTo-cXCg1tf0.cjs +0 -2
  480. package/dist/useHomeTo-cXCg1tf0.cjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { jsx as o, jsxs as g } from "react/jsx-runtime";
2
2
  import { createContext as D, useContext as M, forwardRef as O, useId as v, useState as k } from "react";
3
3
  import { clsx as C } from "clsx";
4
- import { b as w, a as P } from "./Icon-B7DJn8Tw.js";
4
+ import { b as w, a as P } from "./Icon-DMMO32p6.js";
5
5
  const E = D(null);
6
6
  function R() {
7
7
  const t = M(E);
@@ -108,4 +108,4 @@ export {
108
108
  ne as A,
109
109
  W as a
110
110
  };
111
- //# sourceMappingURL=Accordion-DOrTQJB9.js.map
111
+ //# sourceMappingURL=Accordion-C6vW_OMd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion-DOrTQJB9.js","sources":["../src/components/Accordion/accordionContext.ts","../src/components/Accordion/AccordionItem.tsx","../src/components/Accordion/Accordion.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { AccordionSize } from './Accordion'\n\n/** Shared state an `<Accordion>` hands down to its `<AccordionItem>`s via context. */\nexport interface AccordionContextValue {\n /** Whether a given item value is currently open. */\n isOpen: (value: string) => boolean\n /** Toggle an item open/closed — called by a header on click. */\n toggle: (value: string) => void\n size: AccordionSize\n disabled: boolean\n}\n\nexport const AccordionContext = createContext<AccordionContextValue | null>(null)\n\n/** Read the surrounding `<Accordion>`. Throws if an `<AccordionItem>` is used outside one. */\nexport function useAccordionContext(): AccordionContextValue {\n const ctx = useContext(AccordionContext)\n if (!ctx) throw new Error('AccordionItem must be used within an <Accordion>')\n return ctx\n}\n","import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { useAccordionContext } from './accordionContext'\nimport styles from './Accordion.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport interface AccordionItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** This item's identity within the `Accordion` (matched against the open value/values). */\n value: string\n /** Header label. */\n label: ReactNode\n /** Leading header icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Disable this item (the group's `disabled` also applies). */\n disabled?: boolean\n /** Collapsible body content. */\n children?: ReactNode\n}\n\n/**\n * One collapsible panel inside an `<Accordion>` — a header (`label` + optional `icon` + a chevron that\n * rotates) that toggles a smoothly-folding body (`grid-template-rows` animation). Reads the open state,\n * size, and disabled flag from the surrounding `Accordion` via context.\n */\nexport const AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(function AccordionItem(\n { value, label, icon, disabled: itemDisabled = false, className, children, ...props },\n ref,\n) {\n const { isOpen, toggle, size, disabled: groupDisabled } = useAccordionContext()\n const open = isOpen(value)\n const disabled = groupDisabled || itemDisabled\n const headerId = useId()\n const bodyId = useId()\n\n const renderedIcon =\n icon == null ? null : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} size={size} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n className={clsx(styles.item, className)}\n data-open={open ? 'true' : 'false'}\n {...props}\n >\n <button\n type=\"button\"\n id={headerId}\n className={styles.header}\n aria-expanded={open}\n aria-controls={bodyId}\n disabled={disabled}\n onClick={() => toggle(value)}\n >\n {renderedIcon != null && (\n <span className={styles.icon} aria-hidden>\n {renderedIcon}\n </span>\n )}\n <span className={styles.label}>{label}</span>\n <Icon\n name=\"ArrowDown4\"\n size={size}\n className={styles.chevron}\n data-open={open ? 'true' : 'false'}\n />\n </button>\n <div className={styles.collapsible} data-open={open ? 'true' : 'false'}>\n <div className={styles.collapsibleInner}>\n <div id={bodyId} role=\"region\" aria-labelledby={headerId} className={styles.body}>\n {children}\n </div>\n </div>\n </div>\n </div>\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 { AccordionItem } from './AccordionItem'\nimport { AccordionContext, type AccordionContextValue } from './accordionContext'\nimport type { IconName } from '../../icons/names'\nimport styles from './Accordion.module.css'\n\nexport type AccordionSize = 'sm' | 'md' | 'lg'\n\n/** A data-driven panel for the `items` prop. */\nexport interface AccordionItemData {\n value: string\n label: ReactNode\n /** Leading header icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Collapsible body content. */\n content: ReactNode\n disabled?: boolean\n}\n\nexport interface AccordionProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /**\n * Single-open (`value` is a `string | null` — opening one closes the others) vs multi-open (`value`\n * is a `string[]`). Defaults to `false` (multiple).\n */\n exclusive?: boolean\n /** Controlled open value — a `string | null` when `exclusive`, else a `string[]`. */\n value?: string | string[] | null\n /** Initial open value for uncontrolled use (same shape as `value`). */\n defaultValue?: string | string[] | null\n /** Fires with the next open value (matches the `exclusive` shape). */\n onChange?: (value: string | string[] | null) => void\n /** Data-driven panels — an alternative to passing `<AccordionItem>` children. */\n items?: AccordionItemData[]\n /** Preset size for every panel header. Defaults to `md`. */\n size?: AccordionSize\n /** Disables every panel in the accordion. */\n disabled?: boolean\n /** `<AccordionItem>` children (used when `items` is not given). */\n children?: ReactNode\n}\n\n/**\n * A set of collapsible panels (settings sections, FAQs, grouped forms). **`exclusive`** picks\n * single-open (`value` is a `string | null`) vs multi-open (`value` is a `string[]`); both are\n * controlled (`value` + `onChange`) or uncontrolled (`defaultValue`). Supply panels via the\n * data-driven `items` prop or as `<AccordionItem>` children — the group shares the open state, `size`,\n * and `disabled` via context, and each body folds with the shared `grid-template-rows` animation\n * (like `Card`'s `collapsible`). Token-only styling.\n */\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(function Accordion(\n {\n exclusive = false,\n value,\n defaultValue,\n onChange,\n items,\n size = 'md',\n disabled = false,\n children,\n className,\n style,\n ...props\n },\n ref,\n) {\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | string[] | null | undefined>(defaultValue)\n const current = isControlled ? value : internal\n\n const isOpen = (v: string) =>\n exclusive ? current === v : Array.isArray(current) && current.includes(v)\n\n const toggle = (v: string) => {\n let next: string | string[] | null\n if (exclusive) {\n next = current === v ? null : v\n } else {\n const arr = Array.isArray(current) ? current : []\n next = arr.includes(v) ? arr.filter((x) => x !== v) : [...arr, v]\n }\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n const ctx: AccordionContextValue = { isOpen, toggle, size, disabled }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.accordion, styles[size], className)}\n style={style as CSSProperties}\n {...props}\n >\n <AccordionContext.Provider value={ctx}>\n {items\n ? items.map((item) => (\n <AccordionItem\n key={item.value}\n value={item.value}\n label={item.label}\n icon={item.icon}\n disabled={item.disabled}\n >\n {item.content}\n </AccordionItem>\n ))\n : children}\n </AccordionContext.Provider>\n </div>\n )\n})\n"],"names":["AccordionContext","createContext","useAccordionContext","ctx","useContext","ICON_NAME_SET","ICON_NAMES","AccordionItem","forwardRef","value","label","icon","itemDisabled","className","children","props","ref","isOpen","toggle","size","groupDisabled","open","disabled","headerId","useId","bodyId","renderedIcon","jsx","Icon","jsxs","clsx","styles","Accordion","exclusive","defaultValue","onChange","items","style","isControlled","internal","setInternal","useState","current","v","next","arr","x","item"],"mappings":"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"}
1
+ {"version":3,"file":"Accordion-C6vW_OMd.js","sources":["../src/components/Accordion/accordionContext.ts","../src/components/Accordion/AccordionItem.tsx","../src/components/Accordion/Accordion.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { AccordionSize } from './Accordion'\n\n/** Shared state an `<Accordion>` hands down to its `<AccordionItem>`s via context. */\nexport interface AccordionContextValue {\n /** Whether a given item value is currently open. */\n isOpen: (value: string) => boolean\n /** Toggle an item open/closed — called by a header on click. */\n toggle: (value: string) => void\n size: AccordionSize\n disabled: boolean\n}\n\nexport const AccordionContext = createContext<AccordionContextValue | null>(null)\n\n/** Read the surrounding `<Accordion>`. Throws if an `<AccordionItem>` is used outside one. */\nexport function useAccordionContext(): AccordionContextValue {\n const ctx = useContext(AccordionContext)\n if (!ctx) throw new Error('AccordionItem must be used within an <Accordion>')\n return ctx\n}\n","import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { useAccordionContext } from './accordionContext'\nimport styles from './Accordion.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport interface AccordionItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** This item's identity within the `Accordion` (matched against the open value/values). */\n value: string\n /** Header label. */\n label: ReactNode\n /** Leading header icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Disable this item (the group's `disabled` also applies). */\n disabled?: boolean\n /** Collapsible body content. */\n children?: ReactNode\n}\n\n/**\n * One collapsible panel inside an `<Accordion>` — a header (`label` + optional `icon` + a chevron that\n * rotates) that toggles a smoothly-folding body (`grid-template-rows` animation). Reads the open state,\n * size, and disabled flag from the surrounding `Accordion` via context.\n */\nexport const AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(function AccordionItem(\n { value, label, icon, disabled: itemDisabled = false, className, children, ...props },\n ref,\n) {\n const { isOpen, toggle, size, disabled: groupDisabled } = useAccordionContext()\n const open = isOpen(value)\n const disabled = groupDisabled || itemDisabled\n const headerId = useId()\n const bodyId = useId()\n\n const renderedIcon =\n icon == null ? null : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} size={size} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n className={clsx(styles.item, className)}\n data-open={open ? 'true' : 'false'}\n {...props}\n >\n <button\n type=\"button\"\n id={headerId}\n className={styles.header}\n aria-expanded={open}\n aria-controls={bodyId}\n disabled={disabled}\n onClick={() => toggle(value)}\n >\n {renderedIcon != null && (\n <span className={styles.icon} aria-hidden>\n {renderedIcon}\n </span>\n )}\n <span className={styles.label}>{label}</span>\n <Icon\n name=\"ArrowDown4\"\n size={size}\n className={styles.chevron}\n data-open={open ? 'true' : 'false'}\n />\n </button>\n <div className={styles.collapsible} data-open={open ? 'true' : 'false'}>\n <div className={styles.collapsibleInner}>\n <div id={bodyId} role=\"region\" aria-labelledby={headerId} className={styles.body}>\n {children}\n </div>\n </div>\n </div>\n </div>\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 { AccordionItem } from './AccordionItem'\nimport { AccordionContext, type AccordionContextValue } from './accordionContext'\nimport type { IconName } from '../../icons/names'\nimport styles from './Accordion.module.css'\n\nexport type AccordionSize = 'sm' | 'md' | 'lg'\n\n/** A data-driven panel for the `items` prop. */\nexport interface AccordionItemData {\n value: string\n label: ReactNode\n /** Leading header icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Collapsible body content. */\n content: ReactNode\n disabled?: boolean\n}\n\nexport interface AccordionProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /**\n * Single-open (`value` is a `string | null` — opening one closes the others) vs multi-open (`value`\n * is a `string[]`). Defaults to `false` (multiple).\n */\n exclusive?: boolean\n /** Controlled open value — a `string | null` when `exclusive`, else a `string[]`. */\n value?: string | string[] | null\n /** Initial open value for uncontrolled use (same shape as `value`). */\n defaultValue?: string | string[] | null\n /** Fires with the next open value (matches the `exclusive` shape). */\n onChange?: (value: string | string[] | null) => void\n /** Data-driven panels — an alternative to passing `<AccordionItem>` children. */\n items?: AccordionItemData[]\n /** Preset size for every panel header. Defaults to `md`. */\n size?: AccordionSize\n /** Disables every panel in the accordion. */\n disabled?: boolean\n /** `<AccordionItem>` children (used when `items` is not given). */\n children?: ReactNode\n}\n\n/**\n * A set of collapsible panels (settings sections, FAQs, grouped forms). **`exclusive`** picks\n * single-open (`value` is a `string | null`) vs multi-open (`value` is a `string[]`); both are\n * controlled (`value` + `onChange`) or uncontrolled (`defaultValue`). Supply panels via the\n * data-driven `items` prop or as `<AccordionItem>` children — the group shares the open state, `size`,\n * and `disabled` via context, and each body folds with the shared `grid-template-rows` animation\n * (like `Card`'s `collapsible`). Token-only styling.\n */\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(function Accordion(\n {\n exclusive = false,\n value,\n defaultValue,\n onChange,\n items,\n size = 'md',\n disabled = false,\n children,\n className,\n style,\n ...props\n },\n ref,\n) {\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | string[] | null | undefined>(defaultValue)\n const current = isControlled ? value : internal\n\n const isOpen = (v: string) =>\n exclusive ? current === v : Array.isArray(current) && current.includes(v)\n\n const toggle = (v: string) => {\n let next: string | string[] | null\n if (exclusive) {\n next = current === v ? null : v\n } else {\n const arr = Array.isArray(current) ? current : []\n next = arr.includes(v) ? arr.filter((x) => x !== v) : [...arr, v]\n }\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n const ctx: AccordionContextValue = { isOpen, toggle, size, disabled }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.accordion, styles[size], className)}\n style={style as CSSProperties}\n {...props}\n >\n <AccordionContext.Provider value={ctx}>\n {items\n ? items.map((item) => (\n <AccordionItem\n key={item.value}\n value={item.value}\n label={item.label}\n icon={item.icon}\n disabled={item.disabled}\n >\n {item.content}\n </AccordionItem>\n ))\n : children}\n </AccordionContext.Provider>\n </div>\n )\n})\n"],"names":["AccordionContext","createContext","useAccordionContext","ctx","useContext","ICON_NAME_SET","ICON_NAMES","AccordionItem","forwardRef","value","label","icon","itemDisabled","className","children","props","ref","isOpen","toggle","size","groupDisabled","open","disabled","headerId","useId","bodyId","renderedIcon","jsx","Icon","jsxs","clsx","styles","Accordion","exclusive","defaultValue","onChange","items","style","isControlled","internal","setInternal","useState","current","v","next","arr","x","item"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const n=require("react/jsx-runtime"),a=require("react"),w=require("clsx"),g=require("./Icon-CBg21lKA.cjs"),v=a.createContext(null);function E(){const i=a.useContext(v);if(!i)throw new Error("AccordionItem must be used within an <Accordion>");return i}const S="_accordion_1fia4_3",R="_sm_1fia4_12",D="_md_1fia4_16",M="_lg_1fia4_20",k="_item_1fia4_26",P="_header_1fia4_39",T="_icon_1fia4_65",z="_label_1fia4_70",B="_chevron_1fia4_75",F="_collapsible_1fia4_88",G="_collapsibleInner_1fia4_96",H="_body_1fia4_100",s={accordion:S,sm:R,md:D,lg:M,item:k,header:P,icon:T,label:z,chevron:B,collapsible:F,collapsibleInner:G,body:H},J=new Set(g.ICON_NAMES),O=a.forwardRef(function({value:r,label:d,icon:c,disabled:t=!1,className:_,children:u,...x},p){const{isOpen:I,toggle:h,size:b,disabled:A}=E(),l=I(r),j=A||t,f=a.useId(),o=a.useId(),y=c==null?null:typeof c=="string"&&J.has(c)?n.jsx(g.Icon,{name:c,size:b}):c;return n.jsxs("div",{ref:p,className:w.clsx(s.item,_),"data-open":l?"true":"false",...x,children:[n.jsxs("button",{type:"button",id:f,className:s.header,"aria-expanded":l,"aria-controls":o,disabled:j,onClick:()=>h(r),children:[y!=null&&n.jsx("span",{className:s.icon,"aria-hidden":!0,children:y}),n.jsx("span",{className:s.label,children:d}),n.jsx(g.Icon,{name:"ArrowDown4",size:b,className:s.chevron,"data-open":l?"true":"false"})]}),n.jsx("div",{className:s.collapsible,"data-open":l?"true":"false",children:n.jsx("div",{className:s.collapsibleInner,children:n.jsx("div",{id:o,role:"region","aria-labelledby":f,className:s.body,children:u})})})]})}),K=a.forwardRef(function({exclusive:r=!1,value:d,defaultValue:c,onChange:t,items:_,size:u="md",disabled:x=!1,children:p,className:I,style:h,...b},A){const l=d!==void 0,[j,f]=a.useState(c),o=l?d:j,q={isOpen:e=>r?o===e:Array.isArray(o)&&o.includes(e),toggle:e=>{let m;if(r)m=o===e?null:e;else{const N=Array.isArray(o)?o:[];m=N.includes(e)?N.filter(C=>C!==e):[...N,e]}l||f(m),t==null||t(m)},size:u,disabled:x};return n.jsx("div",{ref:A,className:w.clsx(s.accordion,s[u],I),style:h,...b,children:n.jsx(v.Provider,{value:q,children:_?_.map(e=>n.jsx(O,{value:e.value,label:e.label,icon:e.icon,disabled:e.disabled,children:e.content},e.value)):p})})});exports.Accordion=K;exports.AccordionItem=O;
2
- //# sourceMappingURL=Accordion-CFyeLfPT.cjs.map
1
+ "use strict";const n=require("react/jsx-runtime"),a=require("react"),w=require("clsx"),g=require("./Icon-BoQmbW7j.cjs"),v=a.createContext(null);function E(){const i=a.useContext(v);if(!i)throw new Error("AccordionItem must be used within an <Accordion>");return i}const S="_accordion_1fia4_3",R="_sm_1fia4_12",D="_md_1fia4_16",M="_lg_1fia4_20",k="_item_1fia4_26",P="_header_1fia4_39",T="_icon_1fia4_65",z="_label_1fia4_70",B="_chevron_1fia4_75",F="_collapsible_1fia4_88",G="_collapsibleInner_1fia4_96",H="_body_1fia4_100",s={accordion:S,sm:R,md:D,lg:M,item:k,header:P,icon:T,label:z,chevron:B,collapsible:F,collapsibleInner:G,body:H},J=new Set(g.ICON_NAMES),O=a.forwardRef(function({value:r,label:d,icon:c,disabled:t=!1,className:_,children:u,...x},p){const{isOpen:I,toggle:h,size:b,disabled:A}=E(),l=I(r),j=A||t,f=a.useId(),o=a.useId(),y=c==null?null:typeof c=="string"&&J.has(c)?n.jsx(g.Icon,{name:c,size:b}):c;return n.jsxs("div",{ref:p,className:w.clsx(s.item,_),"data-open":l?"true":"false",...x,children:[n.jsxs("button",{type:"button",id:f,className:s.header,"aria-expanded":l,"aria-controls":o,disabled:j,onClick:()=>h(r),children:[y!=null&&n.jsx("span",{className:s.icon,"aria-hidden":!0,children:y}),n.jsx("span",{className:s.label,children:d}),n.jsx(g.Icon,{name:"ArrowDown4",size:b,className:s.chevron,"data-open":l?"true":"false"})]}),n.jsx("div",{className:s.collapsible,"data-open":l?"true":"false",children:n.jsx("div",{className:s.collapsibleInner,children:n.jsx("div",{id:o,role:"region","aria-labelledby":f,className:s.body,children:u})})})]})}),K=a.forwardRef(function({exclusive:r=!1,value:d,defaultValue:c,onChange:t,items:_,size:u="md",disabled:x=!1,children:p,className:I,style:h,...b},A){const l=d!==void 0,[j,f]=a.useState(c),o=l?d:j,q={isOpen:e=>r?o===e:Array.isArray(o)&&o.includes(e),toggle:e=>{let m;if(r)m=o===e?null:e;else{const N=Array.isArray(o)?o:[];m=N.includes(e)?N.filter(C=>C!==e):[...N,e]}l||f(m),t==null||t(m)},size:u,disabled:x};return n.jsx("div",{ref:A,className:w.clsx(s.accordion,s[u],I),style:h,...b,children:n.jsx(v.Provider,{value:q,children:_?_.map(e=>n.jsx(O,{value:e.value,label:e.label,icon:e.icon,disabled:e.disabled,children:e.content},e.value)):p})})});exports.Accordion=K;exports.AccordionItem=O;
2
+ //# sourceMappingURL=Accordion-Icvl9S8c.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion-CFyeLfPT.cjs","sources":["../src/components/Accordion/accordionContext.ts","../src/components/Accordion/AccordionItem.tsx","../src/components/Accordion/Accordion.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { AccordionSize } from './Accordion'\n\n/** Shared state an `<Accordion>` hands down to its `<AccordionItem>`s via context. */\nexport interface AccordionContextValue {\n /** Whether a given item value is currently open. */\n isOpen: (value: string) => boolean\n /** Toggle an item open/closed — called by a header on click. */\n toggle: (value: string) => void\n size: AccordionSize\n disabled: boolean\n}\n\nexport const AccordionContext = createContext<AccordionContextValue | null>(null)\n\n/** Read the surrounding `<Accordion>`. Throws if an `<AccordionItem>` is used outside one. */\nexport function useAccordionContext(): AccordionContextValue {\n const ctx = useContext(AccordionContext)\n if (!ctx) throw new Error('AccordionItem must be used within an <Accordion>')\n return ctx\n}\n","import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { useAccordionContext } from './accordionContext'\nimport styles from './Accordion.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport interface AccordionItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** This item's identity within the `Accordion` (matched against the open value/values). */\n value: string\n /** Header label. */\n label: ReactNode\n /** Leading header icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Disable this item (the group's `disabled` also applies). */\n disabled?: boolean\n /** Collapsible body content. */\n children?: ReactNode\n}\n\n/**\n * One collapsible panel inside an `<Accordion>` — a header (`label` + optional `icon` + a chevron that\n * rotates) that toggles a smoothly-folding body (`grid-template-rows` animation). Reads the open state,\n * size, and disabled flag from the surrounding `Accordion` via context.\n */\nexport const AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(function AccordionItem(\n { value, label, icon, disabled: itemDisabled = false, className, children, ...props },\n ref,\n) {\n const { isOpen, toggle, size, disabled: groupDisabled } = useAccordionContext()\n const open = isOpen(value)\n const disabled = groupDisabled || itemDisabled\n const headerId = useId()\n const bodyId = useId()\n\n const renderedIcon =\n icon == null ? null : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} size={size} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n className={clsx(styles.item, className)}\n data-open={open ? 'true' : 'false'}\n {...props}\n >\n <button\n type=\"button\"\n id={headerId}\n className={styles.header}\n aria-expanded={open}\n aria-controls={bodyId}\n disabled={disabled}\n onClick={() => toggle(value)}\n >\n {renderedIcon != null && (\n <span className={styles.icon} aria-hidden>\n {renderedIcon}\n </span>\n )}\n <span className={styles.label}>{label}</span>\n <Icon\n name=\"ArrowDown4\"\n size={size}\n className={styles.chevron}\n data-open={open ? 'true' : 'false'}\n />\n </button>\n <div className={styles.collapsible} data-open={open ? 'true' : 'false'}>\n <div className={styles.collapsibleInner}>\n <div id={bodyId} role=\"region\" aria-labelledby={headerId} className={styles.body}>\n {children}\n </div>\n </div>\n </div>\n </div>\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 { AccordionItem } from './AccordionItem'\nimport { AccordionContext, type AccordionContextValue } from './accordionContext'\nimport type { IconName } from '../../icons/names'\nimport styles from './Accordion.module.css'\n\nexport type AccordionSize = 'sm' | 'md' | 'lg'\n\n/** A data-driven panel for the `items` prop. */\nexport interface AccordionItemData {\n value: string\n label: ReactNode\n /** Leading header icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Collapsible body content. */\n content: ReactNode\n disabled?: boolean\n}\n\nexport interface AccordionProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /**\n * Single-open (`value` is a `string | null` — opening one closes the others) vs multi-open (`value`\n * is a `string[]`). Defaults to `false` (multiple).\n */\n exclusive?: boolean\n /** Controlled open value — a `string | null` when `exclusive`, else a `string[]`. */\n value?: string | string[] | null\n /** Initial open value for uncontrolled use (same shape as `value`). */\n defaultValue?: string | string[] | null\n /** Fires with the next open value (matches the `exclusive` shape). */\n onChange?: (value: string | string[] | null) => void\n /** Data-driven panels — an alternative to passing `<AccordionItem>` children. */\n items?: AccordionItemData[]\n /** Preset size for every panel header. Defaults to `md`. */\n size?: AccordionSize\n /** Disables every panel in the accordion. */\n disabled?: boolean\n /** `<AccordionItem>` children (used when `items` is not given). */\n children?: ReactNode\n}\n\n/**\n * A set of collapsible panels (settings sections, FAQs, grouped forms). **`exclusive`** picks\n * single-open (`value` is a `string | null`) vs multi-open (`value` is a `string[]`); both are\n * controlled (`value` + `onChange`) or uncontrolled (`defaultValue`). Supply panels via the\n * data-driven `items` prop or as `<AccordionItem>` children — the group shares the open state, `size`,\n * and `disabled` via context, and each body folds with the shared `grid-template-rows` animation\n * (like `Card`'s `collapsible`). Token-only styling.\n */\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(function Accordion(\n {\n exclusive = false,\n value,\n defaultValue,\n onChange,\n items,\n size = 'md',\n disabled = false,\n children,\n className,\n style,\n ...props\n },\n ref,\n) {\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | string[] | null | undefined>(defaultValue)\n const current = isControlled ? value : internal\n\n const isOpen = (v: string) =>\n exclusive ? current === v : Array.isArray(current) && current.includes(v)\n\n const toggle = (v: string) => {\n let next: string | string[] | null\n if (exclusive) {\n next = current === v ? null : v\n } else {\n const arr = Array.isArray(current) ? current : []\n next = arr.includes(v) ? arr.filter((x) => x !== v) : [...arr, v]\n }\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n const ctx: AccordionContextValue = { isOpen, toggle, size, disabled }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.accordion, styles[size], className)}\n style={style as CSSProperties}\n {...props}\n >\n <AccordionContext.Provider value={ctx}>\n {items\n ? items.map((item) => (\n <AccordionItem\n key={item.value}\n value={item.value}\n label={item.label}\n icon={item.icon}\n disabled={item.disabled}\n >\n {item.content}\n </AccordionItem>\n ))\n : children}\n </AccordionContext.Provider>\n </div>\n )\n})\n"],"names":["AccordionContext","createContext","useAccordionContext","ctx","useContext","ICON_NAME_SET","ICON_NAMES","AccordionItem","forwardRef","value","label","icon","itemDisabled","className","children","props","ref","isOpen","toggle","size","groupDisabled","open","disabled","headerId","useId","bodyId","renderedIcon","jsx","Icon","jsxs","clsx","styles","Accordion","exclusive","defaultValue","onChange","items","style","isControlled","internal","setInternal","useState","current","v","next","arr","x","item"],"mappings":"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"}
1
+ {"version":3,"file":"Accordion-Icvl9S8c.cjs","sources":["../src/components/Accordion/accordionContext.ts","../src/components/Accordion/AccordionItem.tsx","../src/components/Accordion/Accordion.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { AccordionSize } from './Accordion'\n\n/** Shared state an `<Accordion>` hands down to its `<AccordionItem>`s via context. */\nexport interface AccordionContextValue {\n /** Whether a given item value is currently open. */\n isOpen: (value: string) => boolean\n /** Toggle an item open/closed — called by a header on click. */\n toggle: (value: string) => void\n size: AccordionSize\n disabled: boolean\n}\n\nexport const AccordionContext = createContext<AccordionContextValue | null>(null)\n\n/** Read the surrounding `<Accordion>`. Throws if an `<AccordionItem>` is used outside one. */\nexport function useAccordionContext(): AccordionContextValue {\n const ctx = useContext(AccordionContext)\n if (!ctx) throw new Error('AccordionItem must be used within an <Accordion>')\n return ctx\n}\n","import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { useAccordionContext } from './accordionContext'\nimport styles from './Accordion.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport interface AccordionItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** This item's identity within the `Accordion` (matched against the open value/values). */\n value: string\n /** Header label. */\n label: ReactNode\n /** Leading header icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Disable this item (the group's `disabled` also applies). */\n disabled?: boolean\n /** Collapsible body content. */\n children?: ReactNode\n}\n\n/**\n * One collapsible panel inside an `<Accordion>` — a header (`label` + optional `icon` + a chevron that\n * rotates) that toggles a smoothly-folding body (`grid-template-rows` animation). Reads the open state,\n * size, and disabled flag from the surrounding `Accordion` via context.\n */\nexport const AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(function AccordionItem(\n { value, label, icon, disabled: itemDisabled = false, className, children, ...props },\n ref,\n) {\n const { isOpen, toggle, size, disabled: groupDisabled } = useAccordionContext()\n const open = isOpen(value)\n const disabled = groupDisabled || itemDisabled\n const headerId = useId()\n const bodyId = useId()\n\n const renderedIcon =\n icon == null ? null : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} size={size} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n className={clsx(styles.item, className)}\n data-open={open ? 'true' : 'false'}\n {...props}\n >\n <button\n type=\"button\"\n id={headerId}\n className={styles.header}\n aria-expanded={open}\n aria-controls={bodyId}\n disabled={disabled}\n onClick={() => toggle(value)}\n >\n {renderedIcon != null && (\n <span className={styles.icon} aria-hidden>\n {renderedIcon}\n </span>\n )}\n <span className={styles.label}>{label}</span>\n <Icon\n name=\"ArrowDown4\"\n size={size}\n className={styles.chevron}\n data-open={open ? 'true' : 'false'}\n />\n </button>\n <div className={styles.collapsible} data-open={open ? 'true' : 'false'}>\n <div className={styles.collapsibleInner}>\n <div id={bodyId} role=\"region\" aria-labelledby={headerId} className={styles.body}>\n {children}\n </div>\n </div>\n </div>\n </div>\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 { AccordionItem } from './AccordionItem'\nimport { AccordionContext, type AccordionContextValue } from './accordionContext'\nimport type { IconName } from '../../icons/names'\nimport styles from './Accordion.module.css'\n\nexport type AccordionSize = 'sm' | 'md' | 'lg'\n\n/** A data-driven panel for the `items` prop. */\nexport interface AccordionItemData {\n value: string\n label: ReactNode\n /** Leading header icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Collapsible body content. */\n content: ReactNode\n disabled?: boolean\n}\n\nexport interface AccordionProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /**\n * Single-open (`value` is a `string | null` — opening one closes the others) vs multi-open (`value`\n * is a `string[]`). Defaults to `false` (multiple).\n */\n exclusive?: boolean\n /** Controlled open value — a `string | null` when `exclusive`, else a `string[]`. */\n value?: string | string[] | null\n /** Initial open value for uncontrolled use (same shape as `value`). */\n defaultValue?: string | string[] | null\n /** Fires with the next open value (matches the `exclusive` shape). */\n onChange?: (value: string | string[] | null) => void\n /** Data-driven panels — an alternative to passing `<AccordionItem>` children. */\n items?: AccordionItemData[]\n /** Preset size for every panel header. Defaults to `md`. */\n size?: AccordionSize\n /** Disables every panel in the accordion. */\n disabled?: boolean\n /** `<AccordionItem>` children (used when `items` is not given). */\n children?: ReactNode\n}\n\n/**\n * A set of collapsible panels (settings sections, FAQs, grouped forms). **`exclusive`** picks\n * single-open (`value` is a `string | null`) vs multi-open (`value` is a `string[]`); both are\n * controlled (`value` + `onChange`) or uncontrolled (`defaultValue`). Supply panels via the\n * data-driven `items` prop or as `<AccordionItem>` children — the group shares the open state, `size`,\n * and `disabled` via context, and each body folds with the shared `grid-template-rows` animation\n * (like `Card`'s `collapsible`). Token-only styling.\n */\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(function Accordion(\n {\n exclusive = false,\n value,\n defaultValue,\n onChange,\n items,\n size = 'md',\n disabled = false,\n children,\n className,\n style,\n ...props\n },\n ref,\n) {\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | string[] | null | undefined>(defaultValue)\n const current = isControlled ? value : internal\n\n const isOpen = (v: string) =>\n exclusive ? current === v : Array.isArray(current) && current.includes(v)\n\n const toggle = (v: string) => {\n let next: string | string[] | null\n if (exclusive) {\n next = current === v ? null : v\n } else {\n const arr = Array.isArray(current) ? current : []\n next = arr.includes(v) ? arr.filter((x) => x !== v) : [...arr, v]\n }\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n const ctx: AccordionContextValue = { isOpen, toggle, size, disabled }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.accordion, styles[size], className)}\n style={style as CSSProperties}\n {...props}\n >\n <AccordionContext.Provider value={ctx}>\n {items\n ? items.map((item) => (\n <AccordionItem\n key={item.value}\n value={item.value}\n label={item.label}\n icon={item.icon}\n disabled={item.disabled}\n >\n {item.content}\n </AccordionItem>\n ))\n : children}\n </AccordionContext.Provider>\n </div>\n )\n})\n"],"names":["AccordionContext","createContext","useAccordionContext","ctx","useContext","ICON_NAME_SET","ICON_NAMES","AccordionItem","forwardRef","value","label","icon","itemDisabled","className","children","props","ref","isOpen","toggle","size","groupDisabled","open","disabled","headerId","useId","bodyId","renderedIcon","jsx","Icon","jsxs","clsx","styles","Accordion","exclusive","defaultValue","onChange","items","style","isControlled","internal","setInternal","useState","current","v","next","arr","x","item"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  import { jsx as e, jsxs as m, Fragment as A } from "react/jsx-runtime";
2
2
  import { useNavigate as k, useRouter as q, useRouterState as S, Outlet as L } from "@tanstack/react-router";
3
3
  import { c as B } from "./errorMessage-C83fB2h5.js";
4
- import { a as G, A as M, e as w, b as D } from "./AuthGuard-BTSRwF04.js";
5
- import { a as F, m as H } from "./ConfigProvider-DtyUlWk6.js";
6
- import { T as I } from "./Toaster-79DvOW80.js";
7
- import { A as J } from "./AuthLayout-BI1wLuDl.js";
4
+ import { a as G, A as M, e as w, b as D } from "./AuthGuard-DJ_mMwfg.js";
5
+ import { a as F, m as H } from "./ConfigProvider-bXX8dnhY.js";
6
+ import { T as I } from "./Toaster-C5jWNL-o.js";
7
+ import { A as J } from "./AuthLayout-BDRJFSpi.js";
8
8
  import { C as P } from "./Col-B51RlwWP.js";
9
- import { Q as U, E as V } from "./ErrorBoundary-DsP4hO_V.js";
10
- import { B as T } from "./Button-DZWYeAno.js";
11
- import { R as X } from "./RootLayout-CTkv4iQJ.js";
12
- import { L as Y } from "./Loader-DD1vfqmN.js";
9
+ import { Q as U, E as V } from "./ErrorBoundary-TfeJetWc.js";
10
+ import { B as T } from "./Button-7mgXcRdw.js";
11
+ import { R as X } from "./RootLayout-pd66MZtI.js";
12
+ import { L as Y } from "./Loader-CShIWNfG.js";
13
13
  const Z = "_pending_1jy0z_2", $ = {
14
14
  pending: Z
15
15
  }, le = ({
@@ -104,4 +104,4 @@ const Z = "_pending_1jy0z_2", $ = {
104
104
  export {
105
105
  le as A
106
106
  };
107
- //# sourceMappingURL=AdminRoot-DX6glneh.js.map
107
+ //# sourceMappingURL=AdminRoot-C5l8PIyi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminRoot-DX6glneh.js","sources":["../src/app/AdminRoot.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport {\n Outlet,\n useNavigate,\n useRouter,\n useRouterState,\n type LinkProps,\n} from '@tanstack/react-router'\nimport {\n AuthLayout,\n Button,\n Col,\n ErrorBoundary,\n Loader,\n QueryError,\n RootLayout,\n Toaster,\n type ErrorBoundaryProps,\n type ToasterProps,\n type IconName,\n type RootLayoutHeader,\n type RootLayoutProps,\n} from '../components'\nimport { getErrorStatus } from '../components/ErrorState/errorMessage'\nimport { useRedirectQueryKey, useT, type ThemeColor } from '../theme'\nimport { AuthGuard } from '../auth/AuthGuard'\nimport { beginSignOut, configureAuthRedirect, endSignOut } from '../auth/authRedirect'\nimport styles from './AdminRoot.module.css'\n\n/** Why the session can't be used — see `AdminRootUnavailable.reason`. */\nexport type AdminRootUnavailableReason = 'forbidden' | 'unreachable'\n\n/** The `unavailable` state of `AdminRoot` — the session could not be checked, or may not be used here. */\nexport interface AdminRootUnavailable {\n /** What failed — passed to `QueryError` (message, trace id). */\n error: unknown\n /**\n * Why. `'forbidden'` = a valid session this panel may not use (no retry, only Sign Out).\n * `'unreachable'` = the check itself failed (Try Again + Sign Out). Defaults to `'forbidden'` when the\n * error carries HTTP status 403 (`error.status` or `error.response.status`), else `'unreachable'`.\n */\n reason?: AdminRootUnavailableReason\n /** Re-runs the session check. Shown as \"Try Again\" for `'unreachable'` only. */\n onRetry?: () => void\n /**\n * The `AuthLayout` icon. Default: none — apps differ here (one shows a tinted `CloudCross`, another keeps\n * every auth page icon-free), so it's the app's choice.\n */\n icon?: IconName | false\n /** Tint for `icon` (`AuthLayout`'s `color`). Default `'error'`. */\n color?: ThemeColor\n}\n\n/** What an `unavailableFallback` receives. */\nexport interface AdminRootUnavailableFallbackProps {\n /** The `unavailable.error`. */\n error: unknown\n /** The resolved reason (explicit, or inferred from a 403). */\n reason: AdminRootUnavailableReason\n /** `unavailable.onRetry`, when given — whatever the reason (the fallback decides whether to offer it). */\n retry?: () => void\n /** The shell's Sign Out: `onLogout()`, then navigate to plain `loginPath` (no return target is remembered). */\n signOut: () => void\n}\n\n/** The minimal user shape `AdminRoot` reads — apps pass their own richer type via the generic. */\nexport interface AdminUser {\n name?: string\n email?: string\n avatar?: string\n}\n\nexport interface AdminRootProps<U extends AdminUser = AdminUser> {\n /** Brand mark for the sidebar top. */\n logo?: ReactNode\n /**\n * Where clicking the logo goes — the first menu page by default (see `RootLayout`'s `logoTo`); a path to\n * send it elsewhere, or `false` for a non-clickable logo.\n */\n logoTo?: RootLayoutProps['logoTo']\n /** Current user, or `null` when signed out. */\n getUser: () => U | null\n /** Clears the session; `AdminRoot` navigates to `loginPath` afterwards. */\n onLogout: () => void\n /** Route-id prefix for standalone public pages (rendered outside the shell). Default `'/_auth'`. */\n authRouteId?: string\n /**\n * Guard target for signed-out visitors + post-logout redirect. Default `'/login'`. A session that ends by\n * itself (an expired token, a 401, revoked in another tab) reaches it through `AuthGuard`, which remembers\n * the page (`?redirect=…` — read it back with `useAuthRedirect`); an explicit Sign Out remembers nothing.\n */\n loginPath?: string\n /**\n * Show a `UserCard` (the user + Sign Out) at the bottom of the sidebar — passed to `RootLayout`. Unset, the\n * app-wide `config.sidebar.userCard` applies (default `false`, hidden).\n */\n showUserCard?: boolean\n /**\n * The sidebar's look, passed to `RootLayout` — `'floating'` or `'docked'` (flush to the edges). **Unset\n * (recommended)**, each user picks it in the header Settings drawer (saved), defaulting to the app-wide\n * `config.sidebar.variant` (`'floating'` when unset). **Set**, it pins the look and the drawer's Sidebar\n * section is hidden.\n */\n sidebarVariant?: RootLayoutProps['sidebarVariant']\n /**\n * Extra `RootLayout` header config, merged **over** the defaults (the app's fields win). Flows through\n * unchanged — e.g. **`header.menu`** (`HeaderMenuItem[]`) adds items to the account menu above Sign out.\n */\n header?: RootLayoutHeader\n /**\n * Wrap the page content in an `ErrorBoundary` (reset on navigation), so a crashing page shows an\n * `ErrorState` inside the shell instead of a white screen. Default `true`; `false` opts out; an object\n * configures it (e.g. `{ onError: Sentry.captureException }` or a custom `fallback`). It only catches what\n * the router doesn't: TanStack Router catches a route's component / `loader` / `beforeLoad` errors in its own\n * per-route boundary, so page crashes need `createRouter({ defaultErrorComponent: PageError })`.\n */\n errorBoundary?: boolean | Omit<ErrorBoundaryProps, 'children' | 'resetKeys'>\n /**\n * The one app-wide toast viewport AdminRoot mounts (the inner `RootLayout`'s is always off, so there's never a\n * second one). Unset / `true` → `<Toaster />`, following the app-wide `config.toast`; `ToasterProps`\n * (`{ position, duration }`) → this shell's override, anything unset still falls back to `config.toast`;\n * `false` → no viewport (e.g. the app mounts its own `<Toaster>`). Same shape as `RootLayout`'s `toaster`.\n */\n toaster?: boolean | ToasterProps\n /**\n * The app is still finding out who is signed in (e.g. verifying a stored token or refreshing a cookie\n * session). While `true`, AdminRoot renders only `pendingFallback` — no shell, no public page, no\n * `AuthGuard`, and `getUser()` isn't read — so a signed-in admin is never redirected to sign-in before the\n * check resolves. Route `beforeLoad` guards (e.g. `authLayoutRoute`) still run in the router, independent\n * of this — they must tolerate the unknown state themselves. No minimum display time. Default `false`.\n */\n pending?: boolean\n /** What to show while `pending`. Default: a `Loader size=\"lg\"` centred in the full viewport. */\n pendingFallback?: ReactNode\n /**\n * The session could not be checked, or the server will not serve this account here. While set, AdminRoot\n * renders a standalone `AuthLayout` screen (the app's `logo`, a `QueryError`, Try Again / Sign Out) instead\n * of the shell or a public page — and never redirects. Sign Out calls `onLogout` then navigates to\n * `loginPath`, so **`onLogout` must clear whatever set `unavailable`** (or this screen shows again).\n * `pending` wins when both are set. `null` / `undefined` = not unavailable (the default).\n */\n unavailable?: AdminRootUnavailable | null\n /** Replaces the whole `unavailable` screen — for an app that needs its own wording or extra actions. */\n unavailableFallback?: (props: AdminRootUnavailableFallbackProps) => ReactNode\n}\n\n/**\n * Root-route component for admin apps — it wires up the whole shell orchestration so an app only has to\n * supply `logo` + `getUser` + `onLogout`. Public pages (route id under `authRouteId`) render standalone;\n * everything else renders inside the guarded admin shell (`RootLayout`, with an optional sidebar `UserCard`), gated by\n * `AuthGuard` (signed-out visitors bounce to `loginPath?redirect=<the page>`, so a lost session or a shared\n * link returns there after sign-in — see `useAuthRedirect`). Sign Out clears the session and navigates to\n * plain `loginPath`, remembering nothing. Mounts exactly one app-wide `<Toaster/>` (`toaster`; none with `toaster={false}` — the inner\n * `RootLayout` always gets `toaster={false}`),\n * and wraps the page in an `ErrorBoundary` that resets on navigation (`errorBoundary`, default on).\n * While the app is still checking the session, pass `pending` (a full-screen loader instead of a premature\n * sign-in redirect); when the check failed or the server refuses this account, pass `unavailable` (a\n * standalone \"Cannot Reach the Server\" / \"No Access\" screen with Try Again / Sign Out). The `Toaster` stays\n * mounted in both.\n *\n * `loginPath` is a plain string, cast loosely to the router's `to` type (the library can't know the\n * app's typed route tree). The generic `<U>` preserves the app's own user type through `getUser`.\n *\n * @example\n * // routes/__root.tsx\n * export const Route = createRootRoute({\n * component: () => {\n * const { status, error, retry } = useSession()\n * return (\n * <AdminRoot<AuthUser>\n * pending={status === 'loading'}\n * unavailable={status === 'unavailable' ? { error, onRetry: retry } : null}\n * logo={<Logo />}\n * getUser={getUser}\n * onLogout={logout}\n * />\n * )\n * },\n * })\n */\nexport const AdminRoot = <U extends AdminUser = AdminUser>({\n logo,\n logoTo,\n getUser,\n onLogout,\n authRouteId = '/_auth',\n loginPath = '/login',\n showUserCard,\n sidebarVariant,\n header,\n errorBoundary = true,\n toaster = true,\n pending = false,\n pendingFallback,\n unavailable,\n unavailableFallback,\n}: AdminRootProps<U>) => {\n const t = useT()\n const navigate = useNavigate()\n const router = useRouter()\n const redirectQueryKey = useRedirectQueryKey()\n // the return-after-sign-in settings (known before any guard renders, e.g. on a cold /login?…) and its\n // safety check: never back onto the login page or a public auth page\n configureAuthRedirect({\n queryKey: redirectQueryKey,\n loginPath,\n isAuthPath: (path) =>\n router.getMatchedRoutes(path).matchedRoutes.some((r) => r.id.startsWith(authRouteId)),\n })\n // the single app-wide toast viewport (props → config.toast → built-in defaults, resolved inside Toaster)\n const toasterNode =\n toaster === false ? null : <Toaster {...(typeof toaster === 'object' ? toaster : undefined)} />\n const isAuthRoute = useRouterState({\n select: (s) => s.matches.some((m) => m.routeId.startsWith(authRouteId)),\n })\n const pathname = useRouterState({ select: (s) => s.location?.pathname })\n // an explicit Sign Out: the admin chose to leave, so nothing is remembered for the next sign-in\n const handleLogout = () => {\n beginSignOut()\n onLogout()\n void Promise.resolve(navigate({ to: loginPath as LinkProps['to'] })).finally(endSignOut)\n }\n\n // the session isn't known yet / can't be used — a standalone screen instead of the shell or a public\n // page (so no AuthGuard redirect, no sign-in flash). The Toaster stays, so a bootstrap toast isn't lost.\n if (pending || unavailable) {\n let gate: ReactNode\n if (pending) {\n gate = pendingFallback ?? (\n <div className={styles.pending} aria-busy=\"true\">\n <Loader size=\"lg\" />\n </div>\n )\n } else if (unavailable) {\n const reason: AdminRootUnavailableReason =\n unavailable.reason ??\n (getErrorStatus(unavailable.error) === 403 ? 'forbidden' : 'unreachable')\n if (unavailableFallback) {\n gate = unavailableFallback({\n error: unavailable.error,\n reason,\n retry: unavailable.onRetry,\n signOut: handleLogout,\n })\n } else {\n const retry = reason === 'unreachable' ? unavailable.onRetry : undefined\n const forbidden = reason === 'forbidden'\n gate = (\n <AuthLayout\n logo={logo}\n icon={unavailable.icon || undefined}\n color={unavailable.color ?? 'error'}\n title={t(forbidden ? 'adminRoot.noAccessTitle' : 'adminRoot.unreachableTitle')}\n subtitle={t(forbidden ? 'adminRoot.noAccessSubtitle' : 'adminRoot.unreachableSubtitle')}\n >\n <Col gap={16}>\n <QueryError variant=\"alert\" error={unavailable.error} />\n {retry ? (\n <Button fullWidth onClick={retry}>\n {t('errorState.retry')}\n </Button>\n ) : null}\n <Button fullWidth variant={retry ? 'filled' : 'contained'} onClick={handleLogout}>\n {t('userCard.signOut')}\n </Button>\n </Col>\n </AuthLayout>\n )\n }\n }\n return (\n <>\n {gate}\n {toasterNode}\n </>\n )\n }\n\n const user = getUser()\n // the routed page, inside an ErrorBoundary that resets whenever the path changes\n const page =\n errorBoundary === false ? (\n <Outlet />\n ) : (\n <ErrorBoundary {...(errorBoundary === true ? {} : errorBoundary)} resetKeys={[pathname]}>\n <Outlet />\n </ErrorBoundary>\n )\n const content = isAuthRoute ? (\n page\n ) : (\n <AuthGuard isAuthenticated={user != null} redirectTo={loginPath}>\n <RootLayout\n logo={logo}\n logoTo={logoTo}\n sidebarVariant={sidebarVariant}\n toaster={false}\n header={{\n user: user ? { name: user.name, email: user.email, avatar: user.avatar } : undefined,\n onLogout: handleLogout,\n ...header,\n }}\n showUserCard={showUserCard}\n >\n {page}\n </RootLayout>\n </AuthGuard>\n )\n return (\n <>\n {content}\n {toasterNode}\n </>\n )\n}\n"],"names":["AdminRoot","logo","logoTo","getUser","onLogout","authRouteId","loginPath","showUserCard","sidebarVariant","header","errorBoundary","toaster","pending","pendingFallback","unavailable","unavailableFallback","t","useT","navigate","useNavigate","router","useRouter","redirectQueryKey","useRedirectQueryKey","configureAuthRedirect","path","r","toasterNode","jsx","Toaster","isAuthRoute","useRouterState","s","m","pathname","_a","handleLogout","beginSignOut","endSignOut","gate","styles","Loader","reason","getErrorStatus","retry","forbidden","AuthLayout","jsxs","Col","QueryError","Button","Fragment","user","page","Outlet","ErrorBoundary","content","AuthGuard","RootLayout"],"mappings":"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"}
1
+ {"version":3,"file":"AdminRoot-C5l8PIyi.js","sources":["../src/app/AdminRoot.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport {\n Outlet,\n useNavigate,\n useRouter,\n useRouterState,\n type LinkProps,\n} from '@tanstack/react-router'\nimport {\n AuthLayout,\n Button,\n Col,\n ErrorBoundary,\n Loader,\n QueryError,\n RootLayout,\n Toaster,\n type ErrorBoundaryProps,\n type ToasterProps,\n type IconName,\n type RootLayoutHeader,\n type RootLayoutProps,\n} from '../components'\nimport { getErrorStatus } from '../components/ErrorState/errorMessage'\nimport { useRedirectQueryKey, useT, type ThemeColor } from '../theme'\nimport { AuthGuard } from '../auth/AuthGuard'\nimport { beginSignOut, configureAuthRedirect, endSignOut } from '../auth/authRedirect'\nimport styles from './AdminRoot.module.css'\n\n/** Why the session can't be used — see `AdminRootUnavailable.reason`. */\nexport type AdminRootUnavailableReason = 'forbidden' | 'unreachable'\n\n/** The `unavailable` state of `AdminRoot` — the session could not be checked, or may not be used here. */\nexport interface AdminRootUnavailable {\n /** What failed — passed to `QueryError` (message, trace id). */\n error: unknown\n /**\n * Why. `'forbidden'` = a valid session this panel may not use (no retry, only Sign Out).\n * `'unreachable'` = the check itself failed (Try Again + Sign Out). Defaults to `'forbidden'` when the\n * error carries HTTP status 403 (`error.status` or `error.response.status`), else `'unreachable'`.\n */\n reason?: AdminRootUnavailableReason\n /** Re-runs the session check. Shown as \"Try Again\" for `'unreachable'` only. */\n onRetry?: () => void\n /**\n * The `AuthLayout` icon. Default: none — apps differ here (one shows a tinted `CloudCross`, another keeps\n * every auth page icon-free), so it's the app's choice.\n */\n icon?: IconName | false\n /** Tint for `icon` (`AuthLayout`'s `color`). Default `'error'`. */\n color?: ThemeColor\n}\n\n/** What an `unavailableFallback` receives. */\nexport interface AdminRootUnavailableFallbackProps {\n /** The `unavailable.error`. */\n error: unknown\n /** The resolved reason (explicit, or inferred from a 403). */\n reason: AdminRootUnavailableReason\n /** `unavailable.onRetry`, when given — whatever the reason (the fallback decides whether to offer it). */\n retry?: () => void\n /** The shell's Sign Out: `onLogout()`, then navigate to plain `loginPath` (no return target is remembered). */\n signOut: () => void\n}\n\n/** The minimal user shape `AdminRoot` reads — apps pass their own richer type via the generic. */\nexport interface AdminUser {\n name?: string\n email?: string\n avatar?: string\n}\n\nexport interface AdminRootProps<U extends AdminUser = AdminUser> {\n /** Brand mark for the sidebar top. */\n logo?: ReactNode\n /**\n * Where clicking the logo goes — the first menu page by default (see `RootLayout`'s `logoTo`); a path to\n * send it elsewhere, or `false` for a non-clickable logo.\n */\n logoTo?: RootLayoutProps['logoTo']\n /** Current user, or `null` when signed out. */\n getUser: () => U | null\n /** Clears the session; `AdminRoot` navigates to `loginPath` afterwards. */\n onLogout: () => void\n /** Route-id prefix for standalone public pages (rendered outside the shell). Default `'/_auth'`. */\n authRouteId?: string\n /**\n * Guard target for signed-out visitors + post-logout redirect. Default `'/login'`. A session that ends by\n * itself (an expired token, a 401, revoked in another tab) reaches it through `AuthGuard`, which remembers\n * the page (`?redirect=…` — read it back with `useAuthRedirect`); an explicit Sign Out remembers nothing.\n */\n loginPath?: string\n /**\n * Show a `UserCard` (the user + Sign Out) at the bottom of the sidebar — passed to `RootLayout`. Unset, the\n * app-wide `config.sidebar.userCard` applies (default `false`, hidden).\n */\n showUserCard?: boolean\n /**\n * The sidebar's look, passed to `RootLayout` — `'floating'` or `'docked'` (flush to the edges). **Unset\n * (recommended)**, each user picks it in the header Settings drawer (saved), defaulting to the app-wide\n * `config.sidebar.variant` (`'floating'` when unset). **Set**, it pins the look and the drawer's Sidebar\n * section is hidden.\n */\n sidebarVariant?: RootLayoutProps['sidebarVariant']\n /**\n * Extra `RootLayout` header config, merged **over** the defaults (the app's fields win). Flows through\n * unchanged — e.g. **`header.menu`** (`HeaderMenuItem[]`) adds items to the account menu above Sign out.\n */\n header?: RootLayoutHeader\n /**\n * Wrap the page content in an `ErrorBoundary` (reset on navigation), so a crashing page shows an\n * `ErrorState` inside the shell instead of a white screen. Default `true`; `false` opts out; an object\n * configures it (e.g. `{ onError: Sentry.captureException }` or a custom `fallback`). It only catches what\n * the router doesn't: TanStack Router catches a route's component / `loader` / `beforeLoad` errors in its own\n * per-route boundary, so page crashes need `createRouter({ defaultErrorComponent: PageError })`.\n */\n errorBoundary?: boolean | Omit<ErrorBoundaryProps, 'children' | 'resetKeys'>\n /**\n * The one app-wide toast viewport AdminRoot mounts (the inner `RootLayout`'s is always off, so there's never a\n * second one). Unset / `true` → `<Toaster />`, following the app-wide `config.toast`; `ToasterProps`\n * (`{ position, duration }`) → this shell's override, anything unset still falls back to `config.toast`;\n * `false` → no viewport (e.g. the app mounts its own `<Toaster>`). Same shape as `RootLayout`'s `toaster`.\n */\n toaster?: boolean | ToasterProps\n /**\n * The app is still finding out who is signed in (e.g. verifying a stored token or refreshing a cookie\n * session). While `true`, AdminRoot renders only `pendingFallback` — no shell, no public page, no\n * `AuthGuard`, and `getUser()` isn't read — so a signed-in admin is never redirected to sign-in before the\n * check resolves. Route `beforeLoad` guards (e.g. `authLayoutRoute`) still run in the router, independent\n * of this — they must tolerate the unknown state themselves. No minimum display time. Default `false`.\n */\n pending?: boolean\n /** What to show while `pending`. Default: a `Loader size=\"lg\"` centred in the full viewport. */\n pendingFallback?: ReactNode\n /**\n * The session could not be checked, or the server will not serve this account here. While set, AdminRoot\n * renders a standalone `AuthLayout` screen (the app's `logo`, a `QueryError`, Try Again / Sign Out) instead\n * of the shell or a public page — and never redirects. Sign Out calls `onLogout` then navigates to\n * `loginPath`, so **`onLogout` must clear whatever set `unavailable`** (or this screen shows again).\n * `pending` wins when both are set. `null` / `undefined` = not unavailable (the default).\n */\n unavailable?: AdminRootUnavailable | null\n /** Replaces the whole `unavailable` screen — for an app that needs its own wording or extra actions. */\n unavailableFallback?: (props: AdminRootUnavailableFallbackProps) => ReactNode\n}\n\n/**\n * Root-route component for admin apps — it wires up the whole shell orchestration so an app only has to\n * supply `logo` + `getUser` + `onLogout`. Public pages (route id under `authRouteId`) render standalone;\n * everything else renders inside the guarded admin shell (`RootLayout`, with an optional sidebar `UserCard`), gated by\n * `AuthGuard` (signed-out visitors bounce to `loginPath?redirect=<the page>`, so a lost session or a shared\n * link returns there after sign-in — see `useAuthRedirect`). Sign Out clears the session and navigates to\n * plain `loginPath`, remembering nothing. Mounts exactly one app-wide `<Toaster/>` (`toaster`; none with `toaster={false}` — the inner\n * `RootLayout` always gets `toaster={false}`),\n * and wraps the page in an `ErrorBoundary` that resets on navigation (`errorBoundary`, default on).\n * While the app is still checking the session, pass `pending` (a full-screen loader instead of a premature\n * sign-in redirect); when the check failed or the server refuses this account, pass `unavailable` (a\n * standalone \"Cannot Reach the Server\" / \"No Access\" screen with Try Again / Sign Out). The `Toaster` stays\n * mounted in both.\n *\n * `loginPath` is a plain string, cast loosely to the router's `to` type (the library can't know the\n * app's typed route tree). The generic `<U>` preserves the app's own user type through `getUser`.\n *\n * @example\n * // routes/__root.tsx\n * export const Route = createRootRoute({\n * component: () => {\n * const { status, error, retry } = useSession()\n * return (\n * <AdminRoot<AuthUser>\n * pending={status === 'loading'}\n * unavailable={status === 'unavailable' ? { error, onRetry: retry } : null}\n * logo={<Logo />}\n * getUser={getUser}\n * onLogout={logout}\n * />\n * )\n * },\n * })\n */\nexport const AdminRoot = <U extends AdminUser = AdminUser>({\n logo,\n logoTo,\n getUser,\n onLogout,\n authRouteId = '/_auth',\n loginPath = '/login',\n showUserCard,\n sidebarVariant,\n header,\n errorBoundary = true,\n toaster = true,\n pending = false,\n pendingFallback,\n unavailable,\n unavailableFallback,\n}: AdminRootProps<U>) => {\n const t = useT()\n const navigate = useNavigate()\n const router = useRouter()\n const redirectQueryKey = useRedirectQueryKey()\n // the return-after-sign-in settings (known before any guard renders, e.g. on a cold /login?…) and its\n // safety check: never back onto the login page or a public auth page\n configureAuthRedirect({\n queryKey: redirectQueryKey,\n loginPath,\n isAuthPath: (path) =>\n router.getMatchedRoutes(path).matchedRoutes.some((r) => r.id.startsWith(authRouteId)),\n })\n // the single app-wide toast viewport (props → config.toast → built-in defaults, resolved inside Toaster)\n const toasterNode =\n toaster === false ? null : <Toaster {...(typeof toaster === 'object' ? toaster : undefined)} />\n const isAuthRoute = useRouterState({\n select: (s) => s.matches.some((m) => m.routeId.startsWith(authRouteId)),\n })\n const pathname = useRouterState({ select: (s) => s.location?.pathname })\n // an explicit Sign Out: the admin chose to leave, so nothing is remembered for the next sign-in\n const handleLogout = () => {\n beginSignOut()\n onLogout()\n void Promise.resolve(navigate({ to: loginPath as LinkProps['to'] })).finally(endSignOut)\n }\n\n // the session isn't known yet / can't be used — a standalone screen instead of the shell or a public\n // page (so no AuthGuard redirect, no sign-in flash). The Toaster stays, so a bootstrap toast isn't lost.\n if (pending || unavailable) {\n let gate: ReactNode\n if (pending) {\n gate = pendingFallback ?? (\n <div className={styles.pending} aria-busy=\"true\">\n <Loader size=\"lg\" />\n </div>\n )\n } else if (unavailable) {\n const reason: AdminRootUnavailableReason =\n unavailable.reason ??\n (getErrorStatus(unavailable.error) === 403 ? 'forbidden' : 'unreachable')\n if (unavailableFallback) {\n gate = unavailableFallback({\n error: unavailable.error,\n reason,\n retry: unavailable.onRetry,\n signOut: handleLogout,\n })\n } else {\n const retry = reason === 'unreachable' ? unavailable.onRetry : undefined\n const forbidden = reason === 'forbidden'\n gate = (\n <AuthLayout\n logo={logo}\n icon={unavailable.icon || undefined}\n color={unavailable.color ?? 'error'}\n title={t(forbidden ? 'adminRoot.noAccessTitle' : 'adminRoot.unreachableTitle')}\n subtitle={t(forbidden ? 'adminRoot.noAccessSubtitle' : 'adminRoot.unreachableSubtitle')}\n >\n <Col gap={16}>\n <QueryError variant=\"alert\" error={unavailable.error} />\n {retry ? (\n <Button fullWidth onClick={retry}>\n {t('errorState.retry')}\n </Button>\n ) : null}\n <Button fullWidth variant={retry ? 'filled' : 'contained'} onClick={handleLogout}>\n {t('userCard.signOut')}\n </Button>\n </Col>\n </AuthLayout>\n )\n }\n }\n return (\n <>\n {gate}\n {toasterNode}\n </>\n )\n }\n\n const user = getUser()\n // the routed page, inside an ErrorBoundary that resets whenever the path changes\n const page =\n errorBoundary === false ? (\n <Outlet />\n ) : (\n <ErrorBoundary {...(errorBoundary === true ? {} : errorBoundary)} resetKeys={[pathname]}>\n <Outlet />\n </ErrorBoundary>\n )\n const content = isAuthRoute ? (\n page\n ) : (\n <AuthGuard isAuthenticated={user != null} redirectTo={loginPath}>\n <RootLayout\n logo={logo}\n logoTo={logoTo}\n sidebarVariant={sidebarVariant}\n toaster={false}\n header={{\n user: user ? { name: user.name, email: user.email, avatar: user.avatar } : undefined,\n onLogout: handleLogout,\n ...header,\n }}\n showUserCard={showUserCard}\n >\n {page}\n </RootLayout>\n </AuthGuard>\n )\n return (\n <>\n {content}\n {toasterNode}\n </>\n )\n}\n"],"names":["AdminRoot","logo","logoTo","getUser","onLogout","authRouteId","loginPath","showUserCard","sidebarVariant","header","errorBoundary","toaster","pending","pendingFallback","unavailable","unavailableFallback","t","useT","navigate","useNavigate","router","useRouter","redirectQueryKey","useRedirectQueryKey","configureAuthRedirect","path","r","toasterNode","jsx","Toaster","isAuthRoute","useRouterState","s","m","pathname","_a","handleLogout","beginSignOut","endSignOut","gate","styles","Loader","reason","getErrorStatus","retry","forbidden","AuthLayout","jsxs","Col","QueryError","Button","Fragment","user","page","Outlet","ErrorBoundary","content","AuthGuard","RootLayout"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const e=require("react/jsx-runtime"),s=require("@tanstack/react-router"),b=require("./errorMessage-C7N4KvUS.cjs"),u=require("./AuthGuard-CLqroYbX.cjs"),q=require("./ConfigProvider-CYSpuSMJ.cjs"),z=require("./Toaster-lonArt-H.cjs"),G=require("./AuthLayout-Bzlsvicf.cjs"),M=require("./Col-BdQeyKEX.cjs"),A=require("./ErrorBoundary-yz669VEu.cjs"),p=require("./Button-BtiFpRie.cjs"),k=require("./RootLayout-BztZetpk.cjs"),F=require("./Loader-RyFTP2X5.cjs"),P="_pending_1jy0z_2",w={pending:P},D=({logo:y,logoTo:L,getUser:S,onLogout:C,authRouteId:g="/_auth",loginPath:c="/login",showUserCard:O,sidebarVariant:T,header:v,errorBoundary:d=!0,toaster:a=!0,pending:m=!1,pendingFallback:E,unavailable:t,unavailableFallback:R})=>{const i=q.useT(),K=s.useNavigate(),W=s.useRouter(),_=q.useRedirectQueryKey();u.configureAuthRedirect({queryKey:_,loginPath:c,isAuthPath:r=>W.getMatchedRoutes(r).matchedRoutes.some(o=>o.id.startsWith(g))});const f=a===!1?null:e.jsx(z.Toaster,{...typeof a=="object"?a:void 0}),B=s.useRouterState({select:r=>r.matches.some(o=>o.routeId.startsWith(g))}),N=s.useRouterState({select:r=>{var o;return(o=r.location)==null?void 0:o.pathname}}),l=()=>{u.beginSignOut(),C(),Promise.resolve(K({to:c})).finally(u.endSignOut)};if(m||t){let r;if(m)r=E??e.jsx("div",{className:w.pending,"aria-busy":"true",children:e.jsx(F.Loader,{size:"lg"})});else if(t){const o=t.reason??(b.getErrorStatus(t.error)===403?"forbidden":"unreachable");if(R)r=R({error:t.error,reason:o,retry:t.onRetry,signOut:l});else{const h=o==="unreachable"?t.onRetry:void 0,x=o==="forbidden";r=e.jsx(G.AuthLayout,{logo:y,icon:t.icon||void 0,color:t.color??"error",title:i(x?"adminRoot.noAccessTitle":"adminRoot.unreachableTitle"),subtitle:i(x?"adminRoot.noAccessSubtitle":"adminRoot.unreachableSubtitle"),children:e.jsxs(M.Col,{gap:16,children:[e.jsx(A.QueryError,{variant:"alert",error:t.error}),h?e.jsx(p.Button,{fullWidth:!0,onClick:h,children:i("errorState.retry")}):null,e.jsx(p.Button,{fullWidth:!0,variant:h?"filled":"contained",onClick:l,children:i("userCard.signOut")})]})})}}return e.jsxs(e.Fragment,{children:[r,f]})}const n=S(),j=d===!1?e.jsx(s.Outlet,{}):e.jsx(A.ErrorBoundary,{...d===!0?{}:d,resetKeys:[N],children:e.jsx(s.Outlet,{})}),Q=B?j:e.jsx(u.AuthGuard,{isAuthenticated:n!=null,redirectTo:c,children:e.jsx(k.RootLayout,{logo:y,logoTo:L,sidebarVariant:T,toaster:!1,header:{user:n?{name:n.name,email:n.email,avatar:n.avatar}:void 0,onLogout:l,...v},showUserCard:O,children:j})});return e.jsxs(e.Fragment,{children:[Q,f]})};exports.AdminRoot=D;
2
- //# sourceMappingURL=AdminRoot-DAz9u2Yc.cjs.map
1
+ "use strict";const e=require("react/jsx-runtime"),s=require("@tanstack/react-router"),b=require("./errorMessage-C7N4KvUS.cjs"),u=require("./AuthGuard-Cm-tqCto.cjs"),q=require("./ConfigProvider-BFhkb0BV.cjs"),z=require("./Toaster-BpXPWJ_n.cjs"),G=require("./AuthLayout-D7mSMdM4.cjs"),M=require("./Col-BdQeyKEX.cjs"),A=require("./ErrorBoundary-BcZgeSsu.cjs"),p=require("./Button-DAvQCGIw.cjs"),k=require("./RootLayout-CEplIlVR.cjs"),F=require("./Loader-BCrMy9NU.cjs"),P="_pending_1jy0z_2",w={pending:P},D=({logo:y,logoTo:L,getUser:S,onLogout:C,authRouteId:g="/_auth",loginPath:c="/login",showUserCard:O,sidebarVariant:T,header:v,errorBoundary:d=!0,toaster:a=!0,pending:m=!1,pendingFallback:E,unavailable:t,unavailableFallback:R})=>{const i=q.useT(),K=s.useNavigate(),W=s.useRouter(),_=q.useRedirectQueryKey();u.configureAuthRedirect({queryKey:_,loginPath:c,isAuthPath:r=>W.getMatchedRoutes(r).matchedRoutes.some(o=>o.id.startsWith(g))});const f=a===!1?null:e.jsx(z.Toaster,{...typeof a=="object"?a:void 0}),B=s.useRouterState({select:r=>r.matches.some(o=>o.routeId.startsWith(g))}),N=s.useRouterState({select:r=>{var o;return(o=r.location)==null?void 0:o.pathname}}),l=()=>{u.beginSignOut(),C(),Promise.resolve(K({to:c})).finally(u.endSignOut)};if(m||t){let r;if(m)r=E??e.jsx("div",{className:w.pending,"aria-busy":"true",children:e.jsx(F.Loader,{size:"lg"})});else if(t){const o=t.reason??(b.getErrorStatus(t.error)===403?"forbidden":"unreachable");if(R)r=R({error:t.error,reason:o,retry:t.onRetry,signOut:l});else{const h=o==="unreachable"?t.onRetry:void 0,x=o==="forbidden";r=e.jsx(G.AuthLayout,{logo:y,icon:t.icon||void 0,color:t.color??"error",title:i(x?"adminRoot.noAccessTitle":"adminRoot.unreachableTitle"),subtitle:i(x?"adminRoot.noAccessSubtitle":"adminRoot.unreachableSubtitle"),children:e.jsxs(M.Col,{gap:16,children:[e.jsx(A.QueryError,{variant:"alert",error:t.error}),h?e.jsx(p.Button,{fullWidth:!0,onClick:h,children:i("errorState.retry")}):null,e.jsx(p.Button,{fullWidth:!0,variant:h?"filled":"contained",onClick:l,children:i("userCard.signOut")})]})})}}return e.jsxs(e.Fragment,{children:[r,f]})}const n=S(),j=d===!1?e.jsx(s.Outlet,{}):e.jsx(A.ErrorBoundary,{...d===!0?{}:d,resetKeys:[N],children:e.jsx(s.Outlet,{})}),Q=B?j:e.jsx(u.AuthGuard,{isAuthenticated:n!=null,redirectTo:c,children:e.jsx(k.RootLayout,{logo:y,logoTo:L,sidebarVariant:T,toaster:!1,header:{user:n?{name:n.name,email:n.email,avatar:n.avatar}:void 0,onLogout:l,...v},showUserCard:O,children:j})});return e.jsxs(e.Fragment,{children:[Q,f]})};exports.AdminRoot=D;
2
+ //# sourceMappingURL=AdminRoot-MEfy9xtz.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminRoot-DAz9u2Yc.cjs","sources":["../src/app/AdminRoot.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport {\n Outlet,\n useNavigate,\n useRouter,\n useRouterState,\n type LinkProps,\n} from '@tanstack/react-router'\nimport {\n AuthLayout,\n Button,\n Col,\n ErrorBoundary,\n Loader,\n QueryError,\n RootLayout,\n Toaster,\n type ErrorBoundaryProps,\n type ToasterProps,\n type IconName,\n type RootLayoutHeader,\n type RootLayoutProps,\n} from '../components'\nimport { getErrorStatus } from '../components/ErrorState/errorMessage'\nimport { useRedirectQueryKey, useT, type ThemeColor } from '../theme'\nimport { AuthGuard } from '../auth/AuthGuard'\nimport { beginSignOut, configureAuthRedirect, endSignOut } from '../auth/authRedirect'\nimport styles from './AdminRoot.module.css'\n\n/** Why the session can't be used — see `AdminRootUnavailable.reason`. */\nexport type AdminRootUnavailableReason = 'forbidden' | 'unreachable'\n\n/** The `unavailable` state of `AdminRoot` — the session could not be checked, or may not be used here. */\nexport interface AdminRootUnavailable {\n /** What failed — passed to `QueryError` (message, trace id). */\n error: unknown\n /**\n * Why. `'forbidden'` = a valid session this panel may not use (no retry, only Sign Out).\n * `'unreachable'` = the check itself failed (Try Again + Sign Out). Defaults to `'forbidden'` when the\n * error carries HTTP status 403 (`error.status` or `error.response.status`), else `'unreachable'`.\n */\n reason?: AdminRootUnavailableReason\n /** Re-runs the session check. Shown as \"Try Again\" for `'unreachable'` only. */\n onRetry?: () => void\n /**\n * The `AuthLayout` icon. Default: none — apps differ here (one shows a tinted `CloudCross`, another keeps\n * every auth page icon-free), so it's the app's choice.\n */\n icon?: IconName | false\n /** Tint for `icon` (`AuthLayout`'s `color`). Default `'error'`. */\n color?: ThemeColor\n}\n\n/** What an `unavailableFallback` receives. */\nexport interface AdminRootUnavailableFallbackProps {\n /** The `unavailable.error`. */\n error: unknown\n /** The resolved reason (explicit, or inferred from a 403). */\n reason: AdminRootUnavailableReason\n /** `unavailable.onRetry`, when given — whatever the reason (the fallback decides whether to offer it). */\n retry?: () => void\n /** The shell's Sign Out: `onLogout()`, then navigate to plain `loginPath` (no return target is remembered). */\n signOut: () => void\n}\n\n/** The minimal user shape `AdminRoot` reads — apps pass their own richer type via the generic. */\nexport interface AdminUser {\n name?: string\n email?: string\n avatar?: string\n}\n\nexport interface AdminRootProps<U extends AdminUser = AdminUser> {\n /** Brand mark for the sidebar top. */\n logo?: ReactNode\n /**\n * Where clicking the logo goes — the first menu page by default (see `RootLayout`'s `logoTo`); a path to\n * send it elsewhere, or `false` for a non-clickable logo.\n */\n logoTo?: RootLayoutProps['logoTo']\n /** Current user, or `null` when signed out. */\n getUser: () => U | null\n /** Clears the session; `AdminRoot` navigates to `loginPath` afterwards. */\n onLogout: () => void\n /** Route-id prefix for standalone public pages (rendered outside the shell). Default `'/_auth'`. */\n authRouteId?: string\n /**\n * Guard target for signed-out visitors + post-logout redirect. Default `'/login'`. A session that ends by\n * itself (an expired token, a 401, revoked in another tab) reaches it through `AuthGuard`, which remembers\n * the page (`?redirect=…` — read it back with `useAuthRedirect`); an explicit Sign Out remembers nothing.\n */\n loginPath?: string\n /**\n * Show a `UserCard` (the user + Sign Out) at the bottom of the sidebar — passed to `RootLayout`. Unset, the\n * app-wide `config.sidebar.userCard` applies (default `false`, hidden).\n */\n showUserCard?: boolean\n /**\n * The sidebar's look, passed to `RootLayout` — `'floating'` or `'docked'` (flush to the edges). **Unset\n * (recommended)**, each user picks it in the header Settings drawer (saved), defaulting to the app-wide\n * `config.sidebar.variant` (`'floating'` when unset). **Set**, it pins the look and the drawer's Sidebar\n * section is hidden.\n */\n sidebarVariant?: RootLayoutProps['sidebarVariant']\n /**\n * Extra `RootLayout` header config, merged **over** the defaults (the app's fields win). Flows through\n * unchanged — e.g. **`header.menu`** (`HeaderMenuItem[]`) adds items to the account menu above Sign out.\n */\n header?: RootLayoutHeader\n /**\n * Wrap the page content in an `ErrorBoundary` (reset on navigation), so a crashing page shows an\n * `ErrorState` inside the shell instead of a white screen. Default `true`; `false` opts out; an object\n * configures it (e.g. `{ onError: Sentry.captureException }` or a custom `fallback`). It only catches what\n * the router doesn't: TanStack Router catches a route's component / `loader` / `beforeLoad` errors in its own\n * per-route boundary, so page crashes need `createRouter({ defaultErrorComponent: PageError })`.\n */\n errorBoundary?: boolean | Omit<ErrorBoundaryProps, 'children' | 'resetKeys'>\n /**\n * The one app-wide toast viewport AdminRoot mounts (the inner `RootLayout`'s is always off, so there's never a\n * second one). Unset / `true` → `<Toaster />`, following the app-wide `config.toast`; `ToasterProps`\n * (`{ position, duration }`) → this shell's override, anything unset still falls back to `config.toast`;\n * `false` → no viewport (e.g. the app mounts its own `<Toaster>`). Same shape as `RootLayout`'s `toaster`.\n */\n toaster?: boolean | ToasterProps\n /**\n * The app is still finding out who is signed in (e.g. verifying a stored token or refreshing a cookie\n * session). While `true`, AdminRoot renders only `pendingFallback` — no shell, no public page, no\n * `AuthGuard`, and `getUser()` isn't read — so a signed-in admin is never redirected to sign-in before the\n * check resolves. Route `beforeLoad` guards (e.g. `authLayoutRoute`) still run in the router, independent\n * of this — they must tolerate the unknown state themselves. No minimum display time. Default `false`.\n */\n pending?: boolean\n /** What to show while `pending`. Default: a `Loader size=\"lg\"` centred in the full viewport. */\n pendingFallback?: ReactNode\n /**\n * The session could not be checked, or the server will not serve this account here. While set, AdminRoot\n * renders a standalone `AuthLayout` screen (the app's `logo`, a `QueryError`, Try Again / Sign Out) instead\n * of the shell or a public page — and never redirects. Sign Out calls `onLogout` then navigates to\n * `loginPath`, so **`onLogout` must clear whatever set `unavailable`** (or this screen shows again).\n * `pending` wins when both are set. `null` / `undefined` = not unavailable (the default).\n */\n unavailable?: AdminRootUnavailable | null\n /** Replaces the whole `unavailable` screen — for an app that needs its own wording or extra actions. */\n unavailableFallback?: (props: AdminRootUnavailableFallbackProps) => ReactNode\n}\n\n/**\n * Root-route component for admin apps — it wires up the whole shell orchestration so an app only has to\n * supply `logo` + `getUser` + `onLogout`. Public pages (route id under `authRouteId`) render standalone;\n * everything else renders inside the guarded admin shell (`RootLayout`, with an optional sidebar `UserCard`), gated by\n * `AuthGuard` (signed-out visitors bounce to `loginPath?redirect=<the page>`, so a lost session or a shared\n * link returns there after sign-in — see `useAuthRedirect`). Sign Out clears the session and navigates to\n * plain `loginPath`, remembering nothing. Mounts exactly one app-wide `<Toaster/>` (`toaster`; none with `toaster={false}` — the inner\n * `RootLayout` always gets `toaster={false}`),\n * and wraps the page in an `ErrorBoundary` that resets on navigation (`errorBoundary`, default on).\n * While the app is still checking the session, pass `pending` (a full-screen loader instead of a premature\n * sign-in redirect); when the check failed or the server refuses this account, pass `unavailable` (a\n * standalone \"Cannot Reach the Server\" / \"No Access\" screen with Try Again / Sign Out). The `Toaster` stays\n * mounted in both.\n *\n * `loginPath` is a plain string, cast loosely to the router's `to` type (the library can't know the\n * app's typed route tree). The generic `<U>` preserves the app's own user type through `getUser`.\n *\n * @example\n * // routes/__root.tsx\n * export const Route = createRootRoute({\n * component: () => {\n * const { status, error, retry } = useSession()\n * return (\n * <AdminRoot<AuthUser>\n * pending={status === 'loading'}\n * unavailable={status === 'unavailable' ? { error, onRetry: retry } : null}\n * logo={<Logo />}\n * getUser={getUser}\n * onLogout={logout}\n * />\n * )\n * },\n * })\n */\nexport const AdminRoot = <U extends AdminUser = AdminUser>({\n logo,\n logoTo,\n getUser,\n onLogout,\n authRouteId = '/_auth',\n loginPath = '/login',\n showUserCard,\n sidebarVariant,\n header,\n errorBoundary = true,\n toaster = true,\n pending = false,\n pendingFallback,\n unavailable,\n unavailableFallback,\n}: AdminRootProps<U>) => {\n const t = useT()\n const navigate = useNavigate()\n const router = useRouter()\n const redirectQueryKey = useRedirectQueryKey()\n // the return-after-sign-in settings (known before any guard renders, e.g. on a cold /login?…) and its\n // safety check: never back onto the login page or a public auth page\n configureAuthRedirect({\n queryKey: redirectQueryKey,\n loginPath,\n isAuthPath: (path) =>\n router.getMatchedRoutes(path).matchedRoutes.some((r) => r.id.startsWith(authRouteId)),\n })\n // the single app-wide toast viewport (props → config.toast → built-in defaults, resolved inside Toaster)\n const toasterNode =\n toaster === false ? null : <Toaster {...(typeof toaster === 'object' ? toaster : undefined)} />\n const isAuthRoute = useRouterState({\n select: (s) => s.matches.some((m) => m.routeId.startsWith(authRouteId)),\n })\n const pathname = useRouterState({ select: (s) => s.location?.pathname })\n // an explicit Sign Out: the admin chose to leave, so nothing is remembered for the next sign-in\n const handleLogout = () => {\n beginSignOut()\n onLogout()\n void Promise.resolve(navigate({ to: loginPath as LinkProps['to'] })).finally(endSignOut)\n }\n\n // the session isn't known yet / can't be used — a standalone screen instead of the shell or a public\n // page (so no AuthGuard redirect, no sign-in flash). The Toaster stays, so a bootstrap toast isn't lost.\n if (pending || unavailable) {\n let gate: ReactNode\n if (pending) {\n gate = pendingFallback ?? (\n <div className={styles.pending} aria-busy=\"true\">\n <Loader size=\"lg\" />\n </div>\n )\n } else if (unavailable) {\n const reason: AdminRootUnavailableReason =\n unavailable.reason ??\n (getErrorStatus(unavailable.error) === 403 ? 'forbidden' : 'unreachable')\n if (unavailableFallback) {\n gate = unavailableFallback({\n error: unavailable.error,\n reason,\n retry: unavailable.onRetry,\n signOut: handleLogout,\n })\n } else {\n const retry = reason === 'unreachable' ? unavailable.onRetry : undefined\n const forbidden = reason === 'forbidden'\n gate = (\n <AuthLayout\n logo={logo}\n icon={unavailable.icon || undefined}\n color={unavailable.color ?? 'error'}\n title={t(forbidden ? 'adminRoot.noAccessTitle' : 'adminRoot.unreachableTitle')}\n subtitle={t(forbidden ? 'adminRoot.noAccessSubtitle' : 'adminRoot.unreachableSubtitle')}\n >\n <Col gap={16}>\n <QueryError variant=\"alert\" error={unavailable.error} />\n {retry ? (\n <Button fullWidth onClick={retry}>\n {t('errorState.retry')}\n </Button>\n ) : null}\n <Button fullWidth variant={retry ? 'filled' : 'contained'} onClick={handleLogout}>\n {t('userCard.signOut')}\n </Button>\n </Col>\n </AuthLayout>\n )\n }\n }\n return (\n <>\n {gate}\n {toasterNode}\n </>\n )\n }\n\n const user = getUser()\n // the routed page, inside an ErrorBoundary that resets whenever the path changes\n const page =\n errorBoundary === false ? (\n <Outlet />\n ) : (\n <ErrorBoundary {...(errorBoundary === true ? {} : errorBoundary)} resetKeys={[pathname]}>\n <Outlet />\n </ErrorBoundary>\n )\n const content = isAuthRoute ? (\n page\n ) : (\n <AuthGuard isAuthenticated={user != null} redirectTo={loginPath}>\n <RootLayout\n logo={logo}\n logoTo={logoTo}\n sidebarVariant={sidebarVariant}\n toaster={false}\n header={{\n user: user ? { name: user.name, email: user.email, avatar: user.avatar } : undefined,\n onLogout: handleLogout,\n ...header,\n }}\n showUserCard={showUserCard}\n >\n {page}\n </RootLayout>\n </AuthGuard>\n )\n return (\n <>\n {content}\n {toasterNode}\n </>\n )\n}\n"],"names":["AdminRoot","logo","logoTo","getUser","onLogout","authRouteId","loginPath","showUserCard","sidebarVariant","header","errorBoundary","toaster","pending","pendingFallback","unavailable","unavailableFallback","t","useT","navigate","useNavigate","router","useRouter","redirectQueryKey","useRedirectQueryKey","configureAuthRedirect","path","r","toasterNode","jsx","Toaster","isAuthRoute","useRouterState","s","m","pathname","_a","handleLogout","beginSignOut","endSignOut","gate","styles","Loader","reason","getErrorStatus","retry","forbidden","AuthLayout","jsxs","Col","QueryError","Button","Fragment","user","page","Outlet","ErrorBoundary","content","AuthGuard","RootLayout"],"mappings":"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"}
1
+ {"version":3,"file":"AdminRoot-MEfy9xtz.cjs","sources":["../src/app/AdminRoot.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport {\n Outlet,\n useNavigate,\n useRouter,\n useRouterState,\n type LinkProps,\n} from '@tanstack/react-router'\nimport {\n AuthLayout,\n Button,\n Col,\n ErrorBoundary,\n Loader,\n QueryError,\n RootLayout,\n Toaster,\n type ErrorBoundaryProps,\n type ToasterProps,\n type IconName,\n type RootLayoutHeader,\n type RootLayoutProps,\n} from '../components'\nimport { getErrorStatus } from '../components/ErrorState/errorMessage'\nimport { useRedirectQueryKey, useT, type ThemeColor } from '../theme'\nimport { AuthGuard } from '../auth/AuthGuard'\nimport { beginSignOut, configureAuthRedirect, endSignOut } from '../auth/authRedirect'\nimport styles from './AdminRoot.module.css'\n\n/** Why the session can't be used — see `AdminRootUnavailable.reason`. */\nexport type AdminRootUnavailableReason = 'forbidden' | 'unreachable'\n\n/** The `unavailable` state of `AdminRoot` — the session could not be checked, or may not be used here. */\nexport interface AdminRootUnavailable {\n /** What failed — passed to `QueryError` (message, trace id). */\n error: unknown\n /**\n * Why. `'forbidden'` = a valid session this panel may not use (no retry, only Sign Out).\n * `'unreachable'` = the check itself failed (Try Again + Sign Out). Defaults to `'forbidden'` when the\n * error carries HTTP status 403 (`error.status` or `error.response.status`), else `'unreachable'`.\n */\n reason?: AdminRootUnavailableReason\n /** Re-runs the session check. Shown as \"Try Again\" for `'unreachable'` only. */\n onRetry?: () => void\n /**\n * The `AuthLayout` icon. Default: none — apps differ here (one shows a tinted `CloudCross`, another keeps\n * every auth page icon-free), so it's the app's choice.\n */\n icon?: IconName | false\n /** Tint for `icon` (`AuthLayout`'s `color`). Default `'error'`. */\n color?: ThemeColor\n}\n\n/** What an `unavailableFallback` receives. */\nexport interface AdminRootUnavailableFallbackProps {\n /** The `unavailable.error`. */\n error: unknown\n /** The resolved reason (explicit, or inferred from a 403). */\n reason: AdminRootUnavailableReason\n /** `unavailable.onRetry`, when given — whatever the reason (the fallback decides whether to offer it). */\n retry?: () => void\n /** The shell's Sign Out: `onLogout()`, then navigate to plain `loginPath` (no return target is remembered). */\n signOut: () => void\n}\n\n/** The minimal user shape `AdminRoot` reads — apps pass their own richer type via the generic. */\nexport interface AdminUser {\n name?: string\n email?: string\n avatar?: string\n}\n\nexport interface AdminRootProps<U extends AdminUser = AdminUser> {\n /** Brand mark for the sidebar top. */\n logo?: ReactNode\n /**\n * Where clicking the logo goes — the first menu page by default (see `RootLayout`'s `logoTo`); a path to\n * send it elsewhere, or `false` for a non-clickable logo.\n */\n logoTo?: RootLayoutProps['logoTo']\n /** Current user, or `null` when signed out. */\n getUser: () => U | null\n /** Clears the session; `AdminRoot` navigates to `loginPath` afterwards. */\n onLogout: () => void\n /** Route-id prefix for standalone public pages (rendered outside the shell). Default `'/_auth'`. */\n authRouteId?: string\n /**\n * Guard target for signed-out visitors + post-logout redirect. Default `'/login'`. A session that ends by\n * itself (an expired token, a 401, revoked in another tab) reaches it through `AuthGuard`, which remembers\n * the page (`?redirect=…` — read it back with `useAuthRedirect`); an explicit Sign Out remembers nothing.\n */\n loginPath?: string\n /**\n * Show a `UserCard` (the user + Sign Out) at the bottom of the sidebar — passed to `RootLayout`. Unset, the\n * app-wide `config.sidebar.userCard` applies (default `false`, hidden).\n */\n showUserCard?: boolean\n /**\n * The sidebar's look, passed to `RootLayout` — `'floating'` or `'docked'` (flush to the edges). **Unset\n * (recommended)**, each user picks it in the header Settings drawer (saved), defaulting to the app-wide\n * `config.sidebar.variant` (`'floating'` when unset). **Set**, it pins the look and the drawer's Sidebar\n * section is hidden.\n */\n sidebarVariant?: RootLayoutProps['sidebarVariant']\n /**\n * Extra `RootLayout` header config, merged **over** the defaults (the app's fields win). Flows through\n * unchanged — e.g. **`header.menu`** (`HeaderMenuItem[]`) adds items to the account menu above Sign out.\n */\n header?: RootLayoutHeader\n /**\n * Wrap the page content in an `ErrorBoundary` (reset on navigation), so a crashing page shows an\n * `ErrorState` inside the shell instead of a white screen. Default `true`; `false` opts out; an object\n * configures it (e.g. `{ onError: Sentry.captureException }` or a custom `fallback`). It only catches what\n * the router doesn't: TanStack Router catches a route's component / `loader` / `beforeLoad` errors in its own\n * per-route boundary, so page crashes need `createRouter({ defaultErrorComponent: PageError })`.\n */\n errorBoundary?: boolean | Omit<ErrorBoundaryProps, 'children' | 'resetKeys'>\n /**\n * The one app-wide toast viewport AdminRoot mounts (the inner `RootLayout`'s is always off, so there's never a\n * second one). Unset / `true` → `<Toaster />`, following the app-wide `config.toast`; `ToasterProps`\n * (`{ position, duration }`) → this shell's override, anything unset still falls back to `config.toast`;\n * `false` → no viewport (e.g. the app mounts its own `<Toaster>`). Same shape as `RootLayout`'s `toaster`.\n */\n toaster?: boolean | ToasterProps\n /**\n * The app is still finding out who is signed in (e.g. verifying a stored token or refreshing a cookie\n * session). While `true`, AdminRoot renders only `pendingFallback` — no shell, no public page, no\n * `AuthGuard`, and `getUser()` isn't read — so a signed-in admin is never redirected to sign-in before the\n * check resolves. Route `beforeLoad` guards (e.g. `authLayoutRoute`) still run in the router, independent\n * of this — they must tolerate the unknown state themselves. No minimum display time. Default `false`.\n */\n pending?: boolean\n /** What to show while `pending`. Default: a `Loader size=\"lg\"` centred in the full viewport. */\n pendingFallback?: ReactNode\n /**\n * The session could not be checked, or the server will not serve this account here. While set, AdminRoot\n * renders a standalone `AuthLayout` screen (the app's `logo`, a `QueryError`, Try Again / Sign Out) instead\n * of the shell or a public page — and never redirects. Sign Out calls `onLogout` then navigates to\n * `loginPath`, so **`onLogout` must clear whatever set `unavailable`** (or this screen shows again).\n * `pending` wins when both are set. `null` / `undefined` = not unavailable (the default).\n */\n unavailable?: AdminRootUnavailable | null\n /** Replaces the whole `unavailable` screen — for an app that needs its own wording or extra actions. */\n unavailableFallback?: (props: AdminRootUnavailableFallbackProps) => ReactNode\n}\n\n/**\n * Root-route component for admin apps — it wires up the whole shell orchestration so an app only has to\n * supply `logo` + `getUser` + `onLogout`. Public pages (route id under `authRouteId`) render standalone;\n * everything else renders inside the guarded admin shell (`RootLayout`, with an optional sidebar `UserCard`), gated by\n * `AuthGuard` (signed-out visitors bounce to `loginPath?redirect=<the page>`, so a lost session or a shared\n * link returns there after sign-in — see `useAuthRedirect`). Sign Out clears the session and navigates to\n * plain `loginPath`, remembering nothing. Mounts exactly one app-wide `<Toaster/>` (`toaster`; none with `toaster={false}` — the inner\n * `RootLayout` always gets `toaster={false}`),\n * and wraps the page in an `ErrorBoundary` that resets on navigation (`errorBoundary`, default on).\n * While the app is still checking the session, pass `pending` (a full-screen loader instead of a premature\n * sign-in redirect); when the check failed or the server refuses this account, pass `unavailable` (a\n * standalone \"Cannot Reach the Server\" / \"No Access\" screen with Try Again / Sign Out). The `Toaster` stays\n * mounted in both.\n *\n * `loginPath` is a plain string, cast loosely to the router's `to` type (the library can't know the\n * app's typed route tree). The generic `<U>` preserves the app's own user type through `getUser`.\n *\n * @example\n * // routes/__root.tsx\n * export const Route = createRootRoute({\n * component: () => {\n * const { status, error, retry } = useSession()\n * return (\n * <AdminRoot<AuthUser>\n * pending={status === 'loading'}\n * unavailable={status === 'unavailable' ? { error, onRetry: retry } : null}\n * logo={<Logo />}\n * getUser={getUser}\n * onLogout={logout}\n * />\n * )\n * },\n * })\n */\nexport const AdminRoot = <U extends AdminUser = AdminUser>({\n logo,\n logoTo,\n getUser,\n onLogout,\n authRouteId = '/_auth',\n loginPath = '/login',\n showUserCard,\n sidebarVariant,\n header,\n errorBoundary = true,\n toaster = true,\n pending = false,\n pendingFallback,\n unavailable,\n unavailableFallback,\n}: AdminRootProps<U>) => {\n const t = useT()\n const navigate = useNavigate()\n const router = useRouter()\n const redirectQueryKey = useRedirectQueryKey()\n // the return-after-sign-in settings (known before any guard renders, e.g. on a cold /login?…) and its\n // safety check: never back onto the login page or a public auth page\n configureAuthRedirect({\n queryKey: redirectQueryKey,\n loginPath,\n isAuthPath: (path) =>\n router.getMatchedRoutes(path).matchedRoutes.some((r) => r.id.startsWith(authRouteId)),\n })\n // the single app-wide toast viewport (props → config.toast → built-in defaults, resolved inside Toaster)\n const toasterNode =\n toaster === false ? null : <Toaster {...(typeof toaster === 'object' ? toaster : undefined)} />\n const isAuthRoute = useRouterState({\n select: (s) => s.matches.some((m) => m.routeId.startsWith(authRouteId)),\n })\n const pathname = useRouterState({ select: (s) => s.location?.pathname })\n // an explicit Sign Out: the admin chose to leave, so nothing is remembered for the next sign-in\n const handleLogout = () => {\n beginSignOut()\n onLogout()\n void Promise.resolve(navigate({ to: loginPath as LinkProps['to'] })).finally(endSignOut)\n }\n\n // the session isn't known yet / can't be used — a standalone screen instead of the shell or a public\n // page (so no AuthGuard redirect, no sign-in flash). The Toaster stays, so a bootstrap toast isn't lost.\n if (pending || unavailable) {\n let gate: ReactNode\n if (pending) {\n gate = pendingFallback ?? (\n <div className={styles.pending} aria-busy=\"true\">\n <Loader size=\"lg\" />\n </div>\n )\n } else if (unavailable) {\n const reason: AdminRootUnavailableReason =\n unavailable.reason ??\n (getErrorStatus(unavailable.error) === 403 ? 'forbidden' : 'unreachable')\n if (unavailableFallback) {\n gate = unavailableFallback({\n error: unavailable.error,\n reason,\n retry: unavailable.onRetry,\n signOut: handleLogout,\n })\n } else {\n const retry = reason === 'unreachable' ? unavailable.onRetry : undefined\n const forbidden = reason === 'forbidden'\n gate = (\n <AuthLayout\n logo={logo}\n icon={unavailable.icon || undefined}\n color={unavailable.color ?? 'error'}\n title={t(forbidden ? 'adminRoot.noAccessTitle' : 'adminRoot.unreachableTitle')}\n subtitle={t(forbidden ? 'adminRoot.noAccessSubtitle' : 'adminRoot.unreachableSubtitle')}\n >\n <Col gap={16}>\n <QueryError variant=\"alert\" error={unavailable.error} />\n {retry ? (\n <Button fullWidth onClick={retry}>\n {t('errorState.retry')}\n </Button>\n ) : null}\n <Button fullWidth variant={retry ? 'filled' : 'contained'} onClick={handleLogout}>\n {t('userCard.signOut')}\n </Button>\n </Col>\n </AuthLayout>\n )\n }\n }\n return (\n <>\n {gate}\n {toasterNode}\n </>\n )\n }\n\n const user = getUser()\n // the routed page, inside an ErrorBoundary that resets whenever the path changes\n const page =\n errorBoundary === false ? (\n <Outlet />\n ) : (\n <ErrorBoundary {...(errorBoundary === true ? {} : errorBoundary)} resetKeys={[pathname]}>\n <Outlet />\n </ErrorBoundary>\n )\n const content = isAuthRoute ? (\n page\n ) : (\n <AuthGuard isAuthenticated={user != null} redirectTo={loginPath}>\n <RootLayout\n logo={logo}\n logoTo={logoTo}\n sidebarVariant={sidebarVariant}\n toaster={false}\n header={{\n user: user ? { name: user.name, email: user.email, avatar: user.avatar } : undefined,\n onLogout: handleLogout,\n ...header,\n }}\n showUserCard={showUserCard}\n >\n {page}\n </RootLayout>\n </AuthGuard>\n )\n return (\n <>\n {content}\n {toasterNode}\n </>\n )\n}\n"],"names":["AdminRoot","logo","logoTo","getUser","onLogout","authRouteId","loginPath","showUserCard","sidebarVariant","header","errorBoundary","toaster","pending","pendingFallback","unavailable","unavailableFallback","t","useT","navigate","useNavigate","router","useRouter","redirectQueryKey","useRedirectQueryKey","configureAuthRedirect","path","r","toasterNode","jsx","Toaster","isAuthRoute","useRouterState","s","m","pathname","_a","handleLogout","beginSignOut","endSignOut","gate","styles","Loader","reason","getErrorStatus","retry","forbidden","AuthLayout","jsxs","Col","QueryError","Button","Fragment","user","page","Outlet","ErrorBoundary","content","AuthGuard","RootLayout"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const e=require("react/jsx-runtime"),x=require("react"),I=require("clsx"),c=require("./Icon-CBg21lKA.cjs"),g=require("./IconButton-DSPdv-oI.cjs"),C=require("./ConfigProvider-CYSpuSMJ.cjs"),N="_alert_ujn1a_3",v="_filled_ujn1a_19",h="_contained_ujn1a_22",q="_outlined_ujn1a_26",A="_text_ujn1a_30",b="_icon_ujn1a_35",z="_message_ujn1a_44",E="_action_ujn1a_50",T="_close_ujn1a_57",s={alert:N,filled:v,contained:h,outlined:q,text:A,icon:b,message:z,action:E,close:T},w=new Set(c.ICON_NAMES),y={success:"TickCircle",error:"CloseCircle",warning:"Warning",info:"InfoCircle"},O=x.forwardRef(function({variant:r="filled",color:t="info",icon:n,action:o,onClose:a,closeLabel:i,className:u,style:_,children:d,...j},f){const m=C.useT(),l=n===!1?null:n==null?e.jsx(c.Icon,{name:y[t]??"InfoCircle"}):typeof n=="string"&&w.has(n)?e.jsx(c.Icon,{name:n}):n;return e.jsxs("div",{ref:f,role:"alert",className:I.clsx(s.alert,s[r],u),style:{"--tz-btn-rgb":`var(--tz-color-${t}-rgb)`,"--tz-btn-on":`var(--tz-color-${t}-contrast, #fff)`,..._},...j,children:[l!=null&&e.jsx("span",{className:s.icon,"aria-hidden":!0,children:l}),e.jsx("div",{className:s.message,children:d}),o!=null&&e.jsx("div",{className:s.action,children:o}),a&&e.jsx(g.IconButton,{variant:"text",color:t,size:"sm",className:s.close,"aria-label":i??m("common.close"),onClick:a,children:e.jsx(c.Icon,{name:"Close"})})]})});exports.Alert=O;
2
- //# sourceMappingURL=Alert-QvfNBhlU.cjs.map
1
+ "use strict";const e=require("react/jsx-runtime"),x=require("react"),I=require("clsx"),c=require("./Icon-BoQmbW7j.cjs"),g=require("./IconButton-ChhZqleN.cjs"),C=require("./ConfigProvider-BFhkb0BV.cjs"),N="_alert_ujn1a_3",v="_filled_ujn1a_19",h="_contained_ujn1a_22",q="_outlined_ujn1a_26",A="_text_ujn1a_30",b="_icon_ujn1a_35",z="_message_ujn1a_44",E="_action_ujn1a_50",T="_close_ujn1a_57",s={alert:N,filled:v,contained:h,outlined:q,text:A,icon:b,message:z,action:E,close:T},w=new Set(c.ICON_NAMES),y={success:"TickCircle",error:"CloseCircle",warning:"Warning",info:"InfoCircle"},O=x.forwardRef(function({variant:r="filled",color:t="info",icon:n,action:o,onClose:a,closeLabel:i,className:u,style:_,children:d,...j},f){const m=C.useT(),l=n===!1?null:n==null?e.jsx(c.Icon,{name:y[t]??"InfoCircle"}):typeof n=="string"&&w.has(n)?e.jsx(c.Icon,{name:n}):n;return e.jsxs("div",{ref:f,role:"alert",className:I.clsx(s.alert,s[r],u),style:{"--tz-btn-rgb":`var(--tz-color-${t}-rgb)`,"--tz-btn-on":`var(--tz-color-${t}-contrast, #fff)`,..._},...j,children:[l!=null&&e.jsx("span",{className:s.icon,"aria-hidden":!0,children:l}),e.jsx("div",{className:s.message,children:d}),o!=null&&e.jsx("div",{className:s.action,children:o}),a&&e.jsx(g.IconButton,{variant:"text",color:t,size:"sm",className:s.close,"aria-label":i??m("common.close"),onClick:a,children:e.jsx(c.Icon,{name:"Close"})})]})});exports.Alert=O;
2
+ //# sourceMappingURL=Alert--ZnlCjaL.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Alert-QvfNBhlU.cjs","sources":["../src/components/Alert/Alert.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { useT, type ThemeColor } from '../../theme'\nimport styles from './Alert.module.css'\n\nexport type AlertVariant = 'contained' | 'filled' | 'outlined' | 'text'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\n/** Default leading icon per semantic color (other colors fall back to `InfoCircle`). */\nconst DEFAULT_ICON: Partial<Record<ThemeColor, IconName>> = {\n success: 'TickCircle',\n error: 'CloseCircle',\n warning: 'Warning',\n info: 'InfoCircle',\n}\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color' | 'title'> {\n /** Tint style. Defaults to `filled` (the soft tint). */\n variant?: AlertVariant\n /** Brand / semantic palette token that tints the alert. Defaults to `info`. */\n color?: ThemeColor\n /**\n * Leading icon — a known `IconName`, any node, or `false` to hide it. Defaults to the semantic icon\n * for `color` (success → `TickCircle`, error → `CloseCircle`, warning → `Warning`, info → `InfoCircle`).\n */\n icon?: IconName | ReactNode | false\n /** Trailing action (e.g. an `UNDO` button), placed before the close button. */\n action?: ReactNode\n /** When provided, a trailing × close button appears that calls this. */\n onClose?: () => void\n /** Accessible label for the close button. Defaults to the localized \"Close\" (`common.close`). */\n closeLabel?: string\n /** Alert message. */\n children?: ReactNode\n}\n\n/**\n * A message banner — the library's inline feedback surface (info, success, warning, error). Tinted by\n * `color` via the shared `--tz-btn-rgb` pattern across the 4 standard `variant`s; a semantic leading\n * `icon` is auto-picked per color (override with `icon`, or `icon={false}` to drop it). An optional\n * `action` slot (e.g. an `UNDO` button) and an `onClose` × button trail the message. `role=\"alert\"`.\n */\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n {\n variant = 'filled',\n color = 'info',\n icon,\n action,\n onClose,\n closeLabel,\n className,\n style,\n children,\n ...props\n },\n ref,\n) {\n const t = useT()\n const renderedIcon =\n icon === false ? null : icon == null ? (\n <Icon name={DEFAULT_ICON[color] ?? 'InfoCircle'} />\n ) : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={clsx(styles.alert, styles[variant], className)}\n style={\n {\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 {...props}\n >\n {renderedIcon != null && (\n <span className={styles.icon} aria-hidden>\n {renderedIcon}\n </span>\n )}\n <div className={styles.message}>{children}</div>\n {action != null && <div className={styles.action}>{action}</div>}\n {onClose && (\n <IconButton\n variant=\"text\"\n color={color}\n size=\"sm\"\n className={styles.close}\n aria-label={closeLabel ?? t('common.close')}\n onClick={onClose}\n >\n <Icon name=\"Close\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","DEFAULT_ICON","Alert","forwardRef","variant","color","icon","action","onClose","closeLabel","className","style","children","props","ref","t","useT","renderedIcon","jsx","Icon","jsxs","clsx","styles","IconButton"],"mappings":"2dAUMA,EAAgB,IAAI,IAAYC,YAAU,EAG1CC,EAAsD,CAC1D,QAAS,aACT,MAAO,cACP,QAAS,UACT,KAAM,YACR,EA4BaC,EAAQC,EAAAA,WAAuC,SAC1D,CACE,QAAAC,EAAU,SACV,MAAAC,EAAQ,OACR,KAAAC,EACA,OAAAC,EACA,QAAAC,EACA,WAAAC,EACA,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EACAC,EACA,CACA,MAAMC,EAAIC,EAAAA,KAAA,EACJC,EACJX,IAAS,GAAQ,KAAOA,GAAQ,KAC9BY,EAAAA,IAACC,EAAAA,KAAA,CAAK,KAAMlB,EAAaI,CAAK,GAAK,aAAc,EAC/C,OAAOC,GAAS,UAAYP,EAAc,IAAIO,CAAI,EACpDY,EAAAA,IAACC,EAAAA,KAAA,CAAK,KAAMb,CAAA,CAAkB,EAE9BA,EAGJ,OACEc,EAAAA,KAAC,MAAA,CACC,IAAAN,EACA,KAAK,QACL,UAAWO,EAAAA,KAAKC,EAAO,MAAOA,EAAOlB,CAAO,EAAGM,CAAS,EACxD,MACE,CACE,eAAgB,kBAAkBL,CAAK,QACvC,cAAe,kBAAkBA,CAAK,mBACtC,GAAGM,CAAA,EAGN,GAAGE,EAEH,SAAA,CAAAI,GAAgB,YACd,OAAA,CAAK,UAAWK,EAAO,KAAM,cAAW,GACtC,SAAAL,CAAA,CACH,EAEFC,EAAAA,IAAC,MAAA,CAAI,UAAWI,EAAO,QAAU,SAAAV,EAAS,EACzCL,GAAU,MAAQW,EAAAA,IAAC,OAAI,UAAWI,EAAO,OAAS,SAAAf,EAAO,EACzDC,GACCU,EAAAA,IAACK,EAAAA,WAAA,CACC,QAAQ,OACR,MAAAlB,EACA,KAAK,KACL,UAAWiB,EAAO,MAClB,aAAYb,GAAcM,EAAE,cAAc,EAC1C,QAASP,EAET,SAAAU,EAAAA,IAACC,EAAAA,KAAA,CAAK,KAAK,OAAA,CAAQ,CAAA,CAAA,CACrB,CAAA,CAAA,CAIR,CAAC"}
1
+ {"version":3,"file":"Alert--ZnlCjaL.cjs","sources":["../src/components/Alert/Alert.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { useT, type ThemeColor } from '../../theme'\nimport styles from './Alert.module.css'\n\nexport type AlertVariant = 'contained' | 'filled' | 'outlined' | 'text'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\n/** Default leading icon per semantic color (other colors fall back to `InfoCircle`). */\nconst DEFAULT_ICON: Partial<Record<ThemeColor, IconName>> = {\n success: 'TickCircle',\n error: 'CloseCircle',\n warning: 'Warning',\n info: 'InfoCircle',\n}\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color' | 'title'> {\n /** Tint style. Defaults to `filled` (the soft tint). */\n variant?: AlertVariant\n /** Brand / semantic palette token that tints the alert. Defaults to `info`. */\n color?: ThemeColor\n /**\n * Leading icon — a known `IconName`, any node, or `false` to hide it. Defaults to the semantic icon\n * for `color` (success → `TickCircle`, error → `CloseCircle`, warning → `Warning`, info → `InfoCircle`).\n */\n icon?: IconName | ReactNode | false\n /** Trailing action (e.g. an `UNDO` button), placed before the close button. */\n action?: ReactNode\n /** When provided, a trailing × close button appears that calls this. */\n onClose?: () => void\n /** Accessible label for the close button. Defaults to the localized \"Close\" (`common.close`). */\n closeLabel?: string\n /** Alert message. */\n children?: ReactNode\n}\n\n/**\n * A message banner — the library's inline feedback surface (info, success, warning, error). Tinted by\n * `color` via the shared `--tz-btn-rgb` pattern across the 4 standard `variant`s; a semantic leading\n * `icon` is auto-picked per color (override with `icon`, or `icon={false}` to drop it). An optional\n * `action` slot (e.g. an `UNDO` button) and an `onClose` × button trail the message. `role=\"alert\"`.\n */\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n {\n variant = 'filled',\n color = 'info',\n icon,\n action,\n onClose,\n closeLabel,\n className,\n style,\n children,\n ...props\n },\n ref,\n) {\n const t = useT()\n const renderedIcon =\n icon === false ? null : icon == null ? (\n <Icon name={DEFAULT_ICON[color] ?? 'InfoCircle'} />\n ) : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={clsx(styles.alert, styles[variant], className)}\n style={\n {\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 {...props}\n >\n {renderedIcon != null && (\n <span className={styles.icon} aria-hidden>\n {renderedIcon}\n </span>\n )}\n <div className={styles.message}>{children}</div>\n {action != null && <div className={styles.action}>{action}</div>}\n {onClose && (\n <IconButton\n variant=\"text\"\n color={color}\n size=\"sm\"\n className={styles.close}\n aria-label={closeLabel ?? t('common.close')}\n onClick={onClose}\n >\n <Icon name=\"Close\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","DEFAULT_ICON","Alert","forwardRef","variant","color","icon","action","onClose","closeLabel","className","style","children","props","ref","t","useT","renderedIcon","jsx","Icon","jsxs","clsx","styles","IconButton"],"mappings":"2dAUMA,EAAgB,IAAI,IAAYC,YAAU,EAG1CC,EAAsD,CAC1D,QAAS,aACT,MAAO,cACP,QAAS,UACT,KAAM,YACR,EA4BaC,EAAQC,EAAAA,WAAuC,SAC1D,CACE,QAAAC,EAAU,SACV,MAAAC,EAAQ,OACR,KAAAC,EACA,OAAAC,EACA,QAAAC,EACA,WAAAC,EACA,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EACAC,EACA,CACA,MAAMC,EAAIC,EAAAA,KAAA,EACJC,EACJX,IAAS,GAAQ,KAAOA,GAAQ,KAC9BY,EAAAA,IAACC,EAAAA,KAAA,CAAK,KAAMlB,EAAaI,CAAK,GAAK,aAAc,EAC/C,OAAOC,GAAS,UAAYP,EAAc,IAAIO,CAAI,EACpDY,EAAAA,IAACC,EAAAA,KAAA,CAAK,KAAMb,CAAA,CAAkB,EAE9BA,EAGJ,OACEc,EAAAA,KAAC,MAAA,CACC,IAAAN,EACA,KAAK,QACL,UAAWO,EAAAA,KAAKC,EAAO,MAAOA,EAAOlB,CAAO,EAAGM,CAAS,EACxD,MACE,CACE,eAAgB,kBAAkBL,CAAK,QACvC,cAAe,kBAAkBA,CAAK,mBACtC,GAAGM,CAAA,EAGN,GAAGE,EAEH,SAAA,CAAAI,GAAgB,YACd,OAAA,CAAK,UAAWK,EAAO,KAAM,cAAW,GACtC,SAAAL,CAAA,CACH,EAEFC,EAAAA,IAAC,MAAA,CAAI,UAAWI,EAAO,QAAU,SAAAV,EAAS,EACzCL,GAAU,MAAQW,EAAAA,IAAC,OAAI,UAAWI,EAAO,OAAS,SAAAf,EAAO,EACzDC,GACCU,EAAAA,IAACK,EAAAA,WAAA,CACC,QAAQ,OACR,MAAAlB,EACA,KAAK,KACL,UAAWiB,EAAO,MAClB,aAAYb,GAAcM,EAAE,cAAc,EAC1C,QAASP,EAET,SAAAU,EAAAA,IAACC,EAAAA,KAAA,CAAK,KAAK,OAAA,CAAQ,CAAA,CAAA,CACrB,CAAA,CAAA,CAIR,CAAC"}
@@ -1,9 +1,9 @@
1
1
  import { jsx as n, jsxs as N } from "react/jsx-runtime";
2
2
  import { forwardRef as g } from "react";
3
3
  import { clsx as p } from "clsx";
4
- import { b as a, a as C } from "./Icon-B7DJn8Tw.js";
5
- import { I } from "./IconButton-iWbUJAz7.js";
6
- import { a as x } from "./ConfigProvider-DtyUlWk6.js";
4
+ import { b as a, a as C } from "./Icon-DMMO32p6.js";
5
+ import { I } from "./IconButton-s5hohjxu.js";
6
+ import { a as x } from "./ConfigProvider-bXX8dnhY.js";
7
7
  const b = "_alert_ujn1a_3", h = "_filled_ujn1a_19", v = "_contained_ujn1a_22", A = "_outlined_ujn1a_26", z = "_text_ujn1a_30", E = "_icon_ujn1a_35", T = "_message_ujn1a_44", w = "_action_ujn1a_50", y = "_close_ujn1a_57", t = {
8
8
  alert: b,
9
9
  filled: h,
@@ -67,4 +67,4 @@ const b = "_alert_ujn1a_3", h = "_filled_ujn1a_19", v = "_contained_ujn1a_22", A
67
67
  export {
68
68
  R as A
69
69
  };
70
- //# sourceMappingURL=Alert-Bo_XgY-A.js.map
70
+ //# sourceMappingURL=Alert-BVs-GcZQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Alert-Bo_XgY-A.js","sources":["../src/components/Alert/Alert.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { useT, type ThemeColor } from '../../theme'\nimport styles from './Alert.module.css'\n\nexport type AlertVariant = 'contained' | 'filled' | 'outlined' | 'text'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\n/** Default leading icon per semantic color (other colors fall back to `InfoCircle`). */\nconst DEFAULT_ICON: Partial<Record<ThemeColor, IconName>> = {\n success: 'TickCircle',\n error: 'CloseCircle',\n warning: 'Warning',\n info: 'InfoCircle',\n}\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color' | 'title'> {\n /** Tint style. Defaults to `filled` (the soft tint). */\n variant?: AlertVariant\n /** Brand / semantic palette token that tints the alert. Defaults to `info`. */\n color?: ThemeColor\n /**\n * Leading icon — a known `IconName`, any node, or `false` to hide it. Defaults to the semantic icon\n * for `color` (success → `TickCircle`, error → `CloseCircle`, warning → `Warning`, info → `InfoCircle`).\n */\n icon?: IconName | ReactNode | false\n /** Trailing action (e.g. an `UNDO` button), placed before the close button. */\n action?: ReactNode\n /** When provided, a trailing × close button appears that calls this. */\n onClose?: () => void\n /** Accessible label for the close button. Defaults to the localized \"Close\" (`common.close`). */\n closeLabel?: string\n /** Alert message. */\n children?: ReactNode\n}\n\n/**\n * A message banner — the library's inline feedback surface (info, success, warning, error). Tinted by\n * `color` via the shared `--tz-btn-rgb` pattern across the 4 standard `variant`s; a semantic leading\n * `icon` is auto-picked per color (override with `icon`, or `icon={false}` to drop it). An optional\n * `action` slot (e.g. an `UNDO` button) and an `onClose` × button trail the message. `role=\"alert\"`.\n */\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n {\n variant = 'filled',\n color = 'info',\n icon,\n action,\n onClose,\n closeLabel,\n className,\n style,\n children,\n ...props\n },\n ref,\n) {\n const t = useT()\n const renderedIcon =\n icon === false ? null : icon == null ? (\n <Icon name={DEFAULT_ICON[color] ?? 'InfoCircle'} />\n ) : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={clsx(styles.alert, styles[variant], className)}\n style={\n {\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 {...props}\n >\n {renderedIcon != null && (\n <span className={styles.icon} aria-hidden>\n {renderedIcon}\n </span>\n )}\n <div className={styles.message}>{children}</div>\n {action != null && <div className={styles.action}>{action}</div>}\n {onClose && (\n <IconButton\n variant=\"text\"\n color={color}\n size=\"sm\"\n className={styles.close}\n aria-label={closeLabel ?? t('common.close')}\n onClick={onClose}\n >\n <Icon name=\"Close\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","DEFAULT_ICON","Alert","forwardRef","variant","color","icon","action","onClose","closeLabel","className","style","children","props","ref","t","useT","renderedIcon","jsx","Icon","jsxs","clsx","styles","IconButton"],"mappings":";;;;;;;;;;;;;;;;GAUMA,IAAgB,IAAI,IAAYC,CAAU,GAG1CC,IAAsD;AAAA,EAC1D,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR,GA4BaC,IAAQC,EAAuC,SAC1D;AAAA,EACE,SAAAC,IAAU;AAAA,EACV,OAAAC,IAAQ;AAAA,EACR,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAIC,EAAA,GACJC,IACJX,MAAS,KAAQ,OAAOA,KAAQ,OAC9B,gBAAAY,EAACC,GAAA,EAAK,MAAMlB,EAAaI,CAAK,KAAK,cAAc,IAC/C,OAAOC,KAAS,YAAYP,EAAc,IAAIO,CAAI,IACpD,gBAAAY,EAACC,GAAA,EAAK,MAAMb,EAAA,CAAkB,IAE9BA;AAGJ,SACE,gBAAAc;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAN;AAAA,MACA,MAAK;AAAA,MACL,WAAWO,EAAKC,EAAO,OAAOA,EAAOlB,CAAO,GAAGM,CAAS;AAAA,MACxD,OACE;AAAA,QACE,gBAAgB,kBAAkBL,CAAK;AAAA,QACvC,eAAe,kBAAkBA,CAAK;AAAA,QACtC,GAAGM;AAAA,MAAA;AAAA,MAGN,GAAGE;AAAA,MAEH,UAAA;AAAA,QAAAI,KAAgB,0BACd,QAAA,EAAK,WAAWK,EAAO,MAAM,eAAW,IACtC,UAAAL,EAAA,CACH;AAAA,QAEF,gBAAAC,EAAC,OAAA,EAAI,WAAWI,EAAO,SAAU,UAAAV,GAAS;AAAA,QACzCL,KAAU,QAAQ,gBAAAW,EAAC,SAAI,WAAWI,EAAO,QAAS,UAAAf,GAAO;AAAA,QACzDC,KACC,gBAAAU;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAAlB;AAAA,YACA,MAAK;AAAA,YACL,WAAWiB,EAAO;AAAA,YAClB,cAAYb,KAAcM,EAAE,cAAc;AAAA,YAC1C,SAASP;AAAA,YAET,UAAA,gBAAAU,EAACC,GAAA,EAAK,MAAK,QAAA,CAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACrB;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;"}
1
+ {"version":3,"file":"Alert-BVs-GcZQ.js","sources":["../src/components/Alert/Alert.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { useT, type ThemeColor } from '../../theme'\nimport styles from './Alert.module.css'\n\nexport type AlertVariant = 'contained' | 'filled' | 'outlined' | 'text'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\n/** Default leading icon per semantic color (other colors fall back to `InfoCircle`). */\nconst DEFAULT_ICON: Partial<Record<ThemeColor, IconName>> = {\n success: 'TickCircle',\n error: 'CloseCircle',\n warning: 'Warning',\n info: 'InfoCircle',\n}\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color' | 'title'> {\n /** Tint style. Defaults to `filled` (the soft tint). */\n variant?: AlertVariant\n /** Brand / semantic palette token that tints the alert. Defaults to `info`. */\n color?: ThemeColor\n /**\n * Leading icon — a known `IconName`, any node, or `false` to hide it. Defaults to the semantic icon\n * for `color` (success → `TickCircle`, error → `CloseCircle`, warning → `Warning`, info → `InfoCircle`).\n */\n icon?: IconName | ReactNode | false\n /** Trailing action (e.g. an `UNDO` button), placed before the close button. */\n action?: ReactNode\n /** When provided, a trailing × close button appears that calls this. */\n onClose?: () => void\n /** Accessible label for the close button. Defaults to the localized \"Close\" (`common.close`). */\n closeLabel?: string\n /** Alert message. */\n children?: ReactNode\n}\n\n/**\n * A message banner — the library's inline feedback surface (info, success, warning, error). Tinted by\n * `color` via the shared `--tz-btn-rgb` pattern across the 4 standard `variant`s; a semantic leading\n * `icon` is auto-picked per color (override with `icon`, or `icon={false}` to drop it). An optional\n * `action` slot (e.g. an `UNDO` button) and an `onClose` × button trail the message. `role=\"alert\"`.\n */\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n {\n variant = 'filled',\n color = 'info',\n icon,\n action,\n onClose,\n closeLabel,\n className,\n style,\n children,\n ...props\n },\n ref,\n) {\n const t = useT()\n const renderedIcon =\n icon === false ? null : icon == null ? (\n <Icon name={DEFAULT_ICON[color] ?? 'InfoCircle'} />\n ) : typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={clsx(styles.alert, styles[variant], className)}\n style={\n {\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 {...props}\n >\n {renderedIcon != null && (\n <span className={styles.icon} aria-hidden>\n {renderedIcon}\n </span>\n )}\n <div className={styles.message}>{children}</div>\n {action != null && <div className={styles.action}>{action}</div>}\n {onClose && (\n <IconButton\n variant=\"text\"\n color={color}\n size=\"sm\"\n className={styles.close}\n aria-label={closeLabel ?? t('common.close')}\n onClick={onClose}\n >\n <Icon name=\"Close\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","DEFAULT_ICON","Alert","forwardRef","variant","color","icon","action","onClose","closeLabel","className","style","children","props","ref","t","useT","renderedIcon","jsx","Icon","jsxs","clsx","styles","IconButton"],"mappings":";;;;;;;;;;;;;;;;GAUMA,IAAgB,IAAI,IAAYC,CAAU,GAG1CC,IAAsD;AAAA,EAC1D,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR,GA4BaC,IAAQC,EAAuC,SAC1D;AAAA,EACE,SAAAC,IAAU;AAAA,EACV,OAAAC,IAAQ;AAAA,EACR,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAIC,EAAA,GACJC,IACJX,MAAS,KAAQ,OAAOA,KAAQ,OAC9B,gBAAAY,EAACC,GAAA,EAAK,MAAMlB,EAAaI,CAAK,KAAK,cAAc,IAC/C,OAAOC,KAAS,YAAYP,EAAc,IAAIO,CAAI,IACpD,gBAAAY,EAACC,GAAA,EAAK,MAAMb,EAAA,CAAkB,IAE9BA;AAGJ,SACE,gBAAAc;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAN;AAAA,MACA,MAAK;AAAA,MACL,WAAWO,EAAKC,EAAO,OAAOA,EAAOlB,CAAO,GAAGM,CAAS;AAAA,MACxD,OACE;AAAA,QACE,gBAAgB,kBAAkBL,CAAK;AAAA,QACvC,eAAe,kBAAkBA,CAAK;AAAA,QACtC,GAAGM;AAAA,MAAA;AAAA,MAGN,GAAGE;AAAA,MAEH,UAAA;AAAA,QAAAI,KAAgB,0BACd,QAAA,EAAK,WAAWK,EAAO,MAAM,eAAW,IACtC,UAAAL,EAAA,CACH;AAAA,QAEF,gBAAAC,EAAC,OAAA,EAAI,WAAWI,EAAO,SAAU,UAAAV,GAAS;AAAA,QACzCL,KAAU,QAAQ,gBAAAW,EAAC,SAAI,WAAWI,EAAO,QAAS,UAAAf,GAAO;AAAA,QACzDC,KACC,gBAAAU;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAAlB;AAAA,YACA,MAAK;AAAA,YACL,WAAWiB,EAAO;AAAA,YAClB,cAAYb,KAAcM,EAAE,cAAc;AAAA,YAC1C,SAASP;AAAA,YAET,UAAA,gBAAAU,EAACC,GAAA,EAAK,MAAK,QAAA,CAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACrB;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const g=require("react/jsx-runtime"),h=require("@tanstack/react-router"),o=require("react"),m=require("./ConfigProvider-BFhkb0BV.cjs"),O=2048;let s=null,a=!1;const l={queryKey:m.DEFAULT_REDIRECT_QUERY_KEY,loginPath:"/login",isAuthPath:null};function y(e){Object.assign(l,e)}const p=()=>typeof window<"u",P=()=>typeof window>"u"?"http://localhost":window.location.origin,U=(e,t)=>{const u=t.length>1?t.replace(/\/+$/,""):t;return e===u||e.startsWith(`${u}/`)};function _(e,{loginPath:t,isAuthPath:u,origin:r=P()}){if(typeof e!="string"||e.length===0||e.length>O||!e.startsWith("/")||e.startsWith("//")||e.startsWith("/\\"))return null;let n;try{n=new URL(e,r)}catch{return null}if(n.origin!==r||n.pathname.startsWith("//")||U(n.pathname,t))return null;try{if(u!=null&&u(n.pathname))return null}catch{}return`${n.pathname}${n.search}${n.hash}`}const d=e=>_(e,{loginPath:l.loginPath,isAuthPath:l.isAuthPath}),q=(e,t)=>{try{return new URLSearchParams(e).get(t)}catch{return null}},E=e=>{e==="/"?a||(s=null):S(e)},A=(e,t,u)=>{const r=d(q(e,t));return r?(u&&E(r),r):p()?d(s):null};function b(e,t="/",u=l.queryKey){return A(e,u,!1)??t}function S(e){if(a||!p())return null;const t=d(e);return!t||t==="/"?null:(s=t,t)}function W(){s=null,a=p()}function j(){a=!1}function C(){s=null,a=!1}function L(e="/"){const t=typeof window>"u"?"":window.location.search;return A(t,l.queryKey,!0)??e}function x(e="/"){const t=m.useRedirectQueryKey();y({queryKey:t});const u=h.useRouter(),r=o.useRef(null);r.current===null&&(r.current=u.state.location.pathname);const n=o.useRef(null),R=h.useRouterState({select:f=>(f.location.pathname===r.current&&(n.current=q(f.location.searchStr,t)),n.current)}),c=o.useRef(null),i=d(R);return i?(i!==c.current&&E(i),c.current=i):c.current===null&&(c.current=A("",t,!1)),c.current??e}function $(){s=null}const D=({isAuthenticated:e,redirectTo:t="/login",children:u})=>{const r=typeof e=="function"?e():e,n=m.useRedirectQueryKey(),R=h.useRouter();y({queryKey:n,loginPath:t});const c=o.useRef(void 0);if(r)c.current=void 0;else if(c.current===void 0){const{pathname:f,searchStr:K,hash:w}=R.state.location;c.current=S(`${f}${K}${w?`#${w}`:""}`),c.current===null&&$()}const i=o.useMemo(()=>r?null:g.jsx(h.Navigate,{to:t,search:c.current?{[n]:c.current}:{},replace:!0}),[r,t,n]);return o.useEffect(()=>{r&&C()},[r]),r?g.jsx(g.Fragment,{children:u}):i};exports.AuthGuard=D;exports.beginSignOut=W;exports.clearAuthRedirect=$;exports.configureAuthRedirect=y;exports.endSignOut=j;exports.getAuthRedirect=L;exports.resolveAuthRedirect=b;exports.useAuthRedirect=x;
2
+ //# sourceMappingURL=AuthGuard-Cm-tqCto.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthGuard-Cm-tqCto.cjs","sources":["../src/auth/authRedirect.ts","../src/auth/AuthGuard.tsx"],"sourcesContent":["// Return-after-sign-in: where `AuthGuard` sent a signed-out visitor away from, read back once they've\n// signed in. The target travels in the login URL (`?redirect=…`) and, for a multi-step sign-in that moves\n// between auth routes and drops the query string, in a module-level slot for this tab — written when the\n// guard turns a visitor away and when a reader finds a safe param in the URL (a reloaded or shared login\n// link). Memory only — a path can carry record ids, so it never goes to localStorage / sessionStorage.\nimport { useRouter, useRouterState } from '@tanstack/react-router'\nimport { useRef } from 'react'\nimport { DEFAULT_REDIRECT_QUERY_KEY, useRedirectQueryKey } from '../theme/ConfigProvider'\n\n/** The longest target accepted (characters) — anything longer is treated as crafted. */\nexport const AUTH_REDIRECT_MAX_LENGTH = 2048\n\n/** What the safety check needs to know about the app's sign-in pages. */\nexport interface AuthRedirectContext {\n /** The sign-in page — the target may not be it, or a step under it (`/login/mfa`). */\n loginPath: string\n /** Whether a path belongs to a public auth page (under `authRouteId`) — registered by `AdminRoot`. */\n isAuthPath?: ((pathname: string) => boolean) | null\n /** The origin a target must stay on. Defaults to `window.location.origin`. */\n origin?: string\n}\n\n// The tab's state. `settings` is what the guard / shell last told us (the configured param name, the\n// login path, the auth-page matcher), so `getAuthRedirect` works outside React with no arguments.\nlet remembered: string | null = null\nlet signingOut = false\nconst settings: Required<Omit<AuthRedirectContext, 'origin'>> & { queryKey: string } = {\n queryKey: DEFAULT_REDIRECT_QUERY_KEY,\n loginPath: '/login',\n isAuthPath: null,\n}\n\n/** @internal Update what the module knows about the app (called by `AuthGuard` / `AdminRoot` / the hook). */\nexport function configureAuthRedirect(next: Partial<typeof settings>) {\n Object.assign(settings, next)\n}\n\n// the memory slot is per browser tab — on a server it would be shared between visitors, so it's off there\nconst isBrowser = () => typeof window !== 'undefined'\n\nconst currentOrigin = () =>\n typeof window === 'undefined' ? 'http://localhost' : window.location.origin\n\nconst isUnder = (pathname: string, base: string) => {\n const b = base.length > 1 ? base.replace(/\\/+$/, '') : base\n return pathname === b || pathname.startsWith(`${b}/`)\n}\n\n/**\n * The target, normalized to `pathname + search + hash`, when it's safe to navigate to — else `null`.\n * Safe = a string of at most `AUTH_REDIRECT_MAX_LENGTH` characters, starting with a single `/`, that\n * resolves to the same origin (rejects `https://evil.example`, `//evil.example`, `/\\evil.example`,\n * `javascript:…`), and isn't the login path, a step under it, or a public auth page.\n */\nexport function safeAuthRedirect(\n value: unknown,\n { loginPath, isAuthPath, origin = currentOrigin() }: AuthRedirectContext,\n): string | null {\n if (typeof value !== 'string' || value.length === 0 || value.length > AUTH_REDIRECT_MAX_LENGTH)\n return null\n if (!value.startsWith('/') || value.startsWith('//') || value.startsWith('/\\\\')) return null\n let url: URL\n try {\n url = new URL(value, origin)\n } catch {\n return null\n }\n // the parser drops tabs / newlines, so `/\\t/evil.example` only shows its real origin here\n if (url.origin !== origin) return null\n // …and collapses `/./`, `%2e` and `\\` — `/.//evil.example` normalizes to `//evil.example`\n if (url.pathname.startsWith('//')) return null\n if (isUnder(url.pathname, loginPath)) return null\n try {\n if (isAuthPath?.(url.pathname)) return null\n } catch {\n // an unmatchable path isn't an auth page\n }\n return `${url.pathname}${url.search}${url.hash}`\n}\n\n/** The safety check with the module's current settings. */\nconst safe = (value: unknown) =>\n safeAuthRedirect(value, { loginPath: settings.loginPath, isAuthPath: settings.isAuthPath })\n\n/** Read a param out of a raw search string (`?a=1&b=2`). */\nconst paramOf = (searchStr: string, key: string) => {\n try {\n return new URLSearchParams(searchStr).get(key)\n } catch {\n return null\n }\n}\n\n/**\n * A safe param a reader found in the login URL becomes the tab's target (the fresher intent), so the next\n * step of a sign-in — which drops the query string — still finds it. `?redirect=/` means home: it replaces\n * an older target by forgetting it.\n */\nconst rememberFromUrl = (target: string) => {\n if (target === '/') {\n if (!signingOut) remembered = null\n } else rememberAuthRedirect(target)\n}\n\n/**\n * The target for a search string — its param, else the remembered one — or `null` when there's none. With\n * `remember`, a safe param is also remembered for the tab (see `rememberFromUrl`).\n */\nconst findAuthRedirect = (searchStr: string, queryKey: string, remember: boolean) => {\n const fromParam = safe(paramOf(searchStr, queryKey))\n if (fromParam) {\n if (remember) rememberFromUrl(fromParam)\n return fromParam\n }\n return isBrowser() ? safe(remembered) : null\n}\n\n/**\n * @internal The target for a search string: its param, else the remembered one, else `fallback`. Reads\n * only — `authLayoutRoute` bounces an already signed-in visitor with it, and that bounce has no later\n * sign-in step to remember anything for (a target left in memory while signed in would come back on the\n * next sign-in).\n */\nexport function resolveAuthRedirect(\n searchStr: string,\n fallback = '/',\n queryKey = settings.queryKey,\n) {\n return findAuthRedirect(searchStr, queryKey, false) ?? fallback\n}\n\n/**\n * @internal Remember a target for this tab — returns it (normalized) when it's worth remembering, `null`\n * otherwise (unsafe, `/`, the login path, or an explicit Sign Out is under way).\n */\nexport function rememberAuthRedirect(target: string): string | null {\n if (signingOut || !isBrowser()) return null\n const value = safe(target)\n if (!value || value === '/') return null\n remembered = value\n return value\n}\n\n/**\n * @internal An explicit Sign Out: forget the target and remember nothing until `endSignOut` (once the\n * navigation to the login page has settled) or the next sign-in.\n */\nexport function beginSignOut() {\n remembered = null\n signingOut = isBrowser()\n}\n\n/** @internal The Sign Out navigation settled — later guard redirects remember their page again. */\nexport function endSignOut() {\n signingOut = false\n}\n\n/** @internal Signed in (the guard rendered its content): the target is spent, Sign Out is over. */\nexport function authRedirectConsumed() {\n remembered = null\n signingOut = false\n}\n\n/**\n * Where to go after a successful sign-in, outside React (a route `beforeLoad`, a mutation's `onSuccess`):\n * the `?redirect=` param of `window.location` if it's safe, else the target remembered in this tab, else\n * `fallback` (default `'/'`). A safe param it finds is remembered for the tab, so a later step of the\n * sign-in that drops the query string still gets it (`?redirect=/` forgets an older target instead).\n * Unsafe params are ignored and never overwrite a remembered target. The param name follows\n * `config.keys.redirectQueryKey` once the guard, the shell or `useAuthRedirect` has rendered.\n */\nexport function getAuthRedirect(fallback = '/'): string {\n const searchStr = typeof window === 'undefined' ? '' : window.location.search\n return findAuthRedirect(searchStr, settings.queryKey, true) ?? fallback\n}\n\n/**\n * Where to go after a successful sign-in: the `?redirect=` param of the page this component is mounted on\n * (read from the router's location) if it's safe, else the target remembered in this tab, else `fallback`\n * (default `'/'`). A safe param it finds is remembered for the tab (a reloaded or shared login link then\n * survives a multi-step sign-in; `?redirect=/` forgets an older target instead). It never spends the\n * target; that's forgotten once `AuthGuard` renders signed-in content (or `clearAuthRedirect`).\n *\n * **Stable for the component's life:** once it has found a target it keeps returning it, and it listens\n * only to the `?redirect=` of the page it was mounted on. A `<Navigate>` to the target moves the router's\n * location there (no param any more) while the login page can still be mounted — e.g. a code-split route\n * whose chunk is loading — and a value that changed then would make the `<Navigate>` navigate again, to\n * the fallback; a re-render alone would too (TanStack's `<Navigate>` navigates on new props), so location\n * changes elsewhere don't re-render it. A new safe param on its own page (arriving after mount) still wins.\n *\n * @example\n * const to = useAuthRedirect('/')\n * if (status === 'authenticated') return <Navigate to={to} replace />\n */\nexport function useAuthRedirect(fallback = '/'): string {\n const queryKey = useRedirectQueryKey()\n configureAuthRedirect({ queryKey })\n const router = useRouter()\n // the page this component was mounted on — only its own URL is listened to\n const page = useRef<string | null>(null)\n if (page.current === null) page.current = router.state.location.pathname\n // the param of that page, held once the router has moved on — so the navigation to the target (or a\n // guard redirecting away from it) doesn't re-render this component, and its `<Navigate>` fires once\n const heard = useRef<string | null>(null)\n const param = useRouterState({\n select: (s) => {\n if (s.location.pathname === page.current)\n heard.current = paramOf(s.location.searchStr, queryKey)\n return heard.current\n },\n })\n const found = useRef<string | null>(null)\n const fromParam = safe(param)\n if (fromParam) {\n // a new param: remember it for the tab (idempotent, so the StrictMode double render is harmless)\n if (fromParam !== found.current) rememberFromUrl(fromParam)\n found.current = fromParam\n } else if (found.current === null) found.current = findAuthRedirect('', queryKey, false)\n return found.current ?? fallback\n}\n\n/**\n * Forget the remembered target. `AuthGuard` already does this once it renders signed-in content, so a\n * later sign-in in the same tab doesn't reuse it — call it yourself only when you navigate elsewhere.\n */\nexport function clearAuthRedirect(): void {\n remembered = null\n}\n\n/** @internal Test-only: back to a fresh tab. */\nexport function resetAuthRedirect() {\n remembered = null\n signingOut = false\n Object.assign(settings, {\n queryKey: DEFAULT_REDIRECT_QUERY_KEY,\n loginPath: '/login',\n isAuthPath: null,\n })\n}\n","import { Navigate, useRouter, type LinkProps } from '@tanstack/react-router'\nimport { useEffect, useMemo, useRef, type ReactNode } from 'react'\nimport { useRedirectQueryKey } from '../theme/ConfigProvider'\nimport {\n authRedirectConsumed,\n clearAuthRedirect,\n configureAuthRedirect,\n rememberAuthRedirect,\n} from './authRedirect'\n\nexport interface AuthGuardProps {\n /** Session check — a boolean, or a function that returns one (evaluated on render). */\n isAuthenticated: boolean | (() => boolean)\n /** Where to send an unauthenticated visitor. Defaults to `'/login'`. */\n redirectTo?: string\n /** The protected content, rendered only when authenticated. */\n children: ReactNode\n}\n\n/**\n * Component-level auth guard: renders `children` only when authenticated, otherwise redirects to\n * `redirectTo` via `<Navigate replace>` (so Back from the login page doesn't bounce off the guard).\n *\n * The redirect **remembers the page**: it adds `?redirect=<path + search + hash>` to the login URL (the\n * param name follows `config.keys.redirectQueryKey`) and keeps the same target in memory for this tab, so\n * a multi-step sign-in that drops the query string still knows it. Read it back after sign-in with\n * `useAuthRedirect` / `getAuthRedirect`. Nothing is remembered from `/`, from the login path itself, or\n * during an explicit Sign Out (`AdminRoot`'s) — and turning a visitor away from such a page forgets an\n * older remembered target, so it can't come back on the next sign-in. Once it renders signed-in content,\n * the target is forgotten.\n *\n * Requires a `@tanstack/react-router` context (it renders `<Navigate>`), so use it inside a routed\n * tree. `redirectTo` is a plain string — the library can't know the app's typed route tree, so it's\n * cast loosely to the router's `to` type.\n *\n * @example\n * <AuthGuard isAuthenticated={session.isAuthenticated} redirectTo=\"/login\">\n * <Dashboard />\n * </AuthGuard>\n */\nexport const AuthGuard = ({ isAuthenticated, redirectTo = '/login', children }: AuthGuardProps) => {\n const ok = typeof isAuthenticated === 'function' ? isAuthenticated() : isAuthenticated\n const queryKey = useRedirectQueryKey()\n const router = useRouter()\n configureAuthRedirect({ queryKey, loginPath: redirectTo })\n // The target is taken once, when the guard first turns the visitor away, and read without subscribing:\n // the router moves its location to the login URL before the login page mounts, so a later render here\n // would read that instead (and a `<Navigate>` whose props change navigates again).\n const target = useRef<string | null | undefined>(undefined)\n if (ok) target.current = undefined\n else if (target.current === undefined) {\n const { pathname, searchStr, hash } = router.state.location\n target.current = rememberAuthRedirect(`${pathname}${searchStr}${hash ? `#${hash}` : ''}`)\n // the turn-away is authoritative: from a page not worth remembering (`/`), an older target mustn't\n // come back on the next sign-in\n if (target.current === null) clearAuthRedirect()\n }\n const redirect = useMemo(\n () =>\n ok ? null : (\n <Navigate\n to={redirectTo as LinkProps['to']}\n search={(target.current ? { [queryKey]: target.current } : {}) as LinkProps['search']}\n replace\n />\n ),\n [ok, redirectTo, queryKey],\n )\n\n // signed in: a remembered target is spent (and a Sign Out is over) — idempotent, so StrictMode is fine\n useEffect(() => {\n if (ok) authRedirectConsumed()\n }, [ok])\n\n return ok ? <>{children}</> : redirect\n}\n"],"names":["AUTH_REDIRECT_MAX_LENGTH","remembered","signingOut","settings","DEFAULT_REDIRECT_QUERY_KEY","configureAuthRedirect","next","isBrowser","currentOrigin","isUnder","pathname","base","b","safeAuthRedirect","value","loginPath","isAuthPath","origin","url","safe","paramOf","searchStr","key","rememberFromUrl","target","findAuthRedirect","queryKey","remember","fromParam","resolveAuthRedirect","fallback","rememberAuthRedirect","beginSignOut","endSignOut","authRedirectConsumed","getAuthRedirect","useAuthRedirect","useRedirectQueryKey","router","useRouter","page","useRef","heard","param","useRouterState","s","found","clearAuthRedirect","AuthGuard","isAuthenticated","redirectTo","children","ok","hash","redirect","useMemo","jsx","Navigate","useEffect","Fragment"],"mappings":"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"}