@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.
- package/dist/{Accordion-DOrTQJB9.js → Accordion-C6vW_OMd.js} +2 -2
- package/dist/{Accordion-DOrTQJB9.js.map → Accordion-C6vW_OMd.js.map} +1 -1
- package/dist/{Accordion-CFyeLfPT.cjs → Accordion-Icvl9S8c.cjs} +2 -2
- package/dist/{Accordion-CFyeLfPT.cjs.map → Accordion-Icvl9S8c.cjs.map} +1 -1
- package/dist/{AdminRoot-DX6glneh.js → AdminRoot-C5l8PIyi.js} +9 -9
- package/dist/{AdminRoot-DX6glneh.js.map → AdminRoot-C5l8PIyi.js.map} +1 -1
- package/dist/{AdminRoot-DAz9u2Yc.cjs → AdminRoot-MEfy9xtz.cjs} +2 -2
- package/dist/{AdminRoot-DAz9u2Yc.cjs.map → AdminRoot-MEfy9xtz.cjs.map} +1 -1
- package/dist/{Alert-QvfNBhlU.cjs → Alert--ZnlCjaL.cjs} +2 -2
- package/dist/{Alert-QvfNBhlU.cjs.map → Alert--ZnlCjaL.cjs.map} +1 -1
- package/dist/{Alert-Bo_XgY-A.js → Alert-BVs-GcZQ.js} +4 -4
- package/dist/{Alert-Bo_XgY-A.js.map → Alert-BVs-GcZQ.js.map} +1 -1
- package/dist/AuthGuard-Cm-tqCto.cjs +2 -0
- package/dist/AuthGuard-Cm-tqCto.cjs.map +1 -0
- package/dist/AuthGuard-DJ_mMwfg.js +114 -0
- package/dist/AuthGuard-DJ_mMwfg.js.map +1 -0
- package/dist/{AuthLayout-BI1wLuDl.js → AuthLayout-BDRJFSpi.js} +2 -2
- package/dist/{AuthLayout-BI1wLuDl.js.map → AuthLayout-BDRJFSpi.js.map} +1 -1
- package/dist/{AuthLayout-Bzlsvicf.cjs → AuthLayout-D7mSMdM4.cjs} +2 -2
- package/dist/{AuthLayout-Bzlsvicf.cjs.map → AuthLayout-D7mSMdM4.cjs.map} +1 -1
- package/dist/{Avatar-BBqX1732.cjs → Avatar-BwGJl-ru.cjs} +2 -2
- package/dist/{Avatar-BBqX1732.cjs.map → Avatar-BwGJl-ru.cjs.map} +1 -1
- package/dist/{Avatar-CaYyv5wk.js → Avatar-C4qgzth2.js} +2 -2
- package/dist/{Avatar-CaYyv5wk.js.map → Avatar-C4qgzth2.js.map} +1 -1
- package/dist/{AvatarGroup-DrkzAt1-.cjs → AvatarGroup-B8u8ONs5.cjs} +2 -2
- package/dist/{AvatarGroup-DrkzAt1-.cjs.map → AvatarGroup-B8u8ONs5.cjs.map} +1 -1
- package/dist/{AvatarGroup-6fhm-van.js → AvatarGroup-BqxTFzRc.js} +2 -2
- package/dist/{AvatarGroup-6fhm-van.js.map → AvatarGroup-BqxTFzRc.js.map} +1 -1
- package/dist/{Breadcrumbs-CqGS32x5.cjs → Breadcrumbs-D4wv2-T7.cjs} +2 -2
- package/dist/{Breadcrumbs-CqGS32x5.cjs.map → Breadcrumbs-D4wv2-T7.cjs.map} +1 -1
- package/dist/{Breadcrumbs-BEv57tuJ.js → Breadcrumbs-HGk4DKrc.js} +4 -4
- package/dist/{Breadcrumbs-BEv57tuJ.js.map → Breadcrumbs-HGk4DKrc.js.map} +1 -1
- package/dist/{Button-DZWYeAno.js → Button-7mgXcRdw.js} +2 -2
- package/dist/{Button-DZWYeAno.js.map → Button-7mgXcRdw.js.map} +1 -1
- package/dist/{Button-BtiFpRie.cjs → Button-DAvQCGIw.cjs} +2 -2
- package/dist/{Button-BtiFpRie.cjs.map → Button-DAvQCGIw.cjs.map} +1 -1
- package/dist/{Calendar-7W9xNVBZ.js → Calendar-B1ZJHqjB.js} +4 -4
- package/dist/{Calendar-7W9xNVBZ.js.map → Calendar-B1ZJHqjB.js.map} +1 -1
- package/dist/{Calendar-Bgh_3Vk2.cjs → Calendar-BPYjqBy9.cjs} +2 -2
- package/dist/{Calendar-Bgh_3Vk2.cjs.map → Calendar-BPYjqBy9.cjs.map} +1 -1
- package/dist/{Card-KfmWG9Uz.cjs → Card-B-Qso__1.cjs} +2 -2
- package/dist/{Card-KfmWG9Uz.cjs.map → Card-B-Qso__1.cjs.map} +1 -1
- package/dist/{Card-ckOd617g.js → Card-vFsIhkyR.js} +4 -4
- package/dist/{Card-ckOd617g.js.map → Card-vFsIhkyR.js.map} +1 -1
- package/dist/{Chip-Crzm7Eux.js → Chip-CU0J7HJa.js} +3 -3
- package/dist/{Chip-Crzm7Eux.js.map → Chip-CU0J7HJa.js.map} +1 -1
- package/dist/{Chip-BDUsue_R.cjs → Chip-CovsonP1.cjs} +2 -2
- package/dist/{Chip-BDUsue_R.cjs.map → Chip-CovsonP1.cjs.map} +1 -1
- package/dist/{ChoiceCardGroup-D37XREKV.js → ChoiceCardGroup-BBqUbFLS.js} +2 -2
- package/dist/{ChoiceCardGroup-D37XREKV.js.map → ChoiceCardGroup-BBqUbFLS.js.map} +1 -1
- package/dist/{ChoiceCardGroup-Cj_YFj6C.cjs → ChoiceCardGroup-bnKFPDYz.cjs} +2 -2
- package/dist/{ChoiceCardGroup-Cj_YFj6C.cjs.map → ChoiceCardGroup-bnKFPDYz.cjs.map} +1 -1
- package/dist/{CodeBlock-rnGAu2DQ.cjs → CodeBlock-B404V_cc.cjs} +2 -2
- package/dist/{CodeBlock-rnGAu2DQ.cjs.map → CodeBlock-B404V_cc.cjs.map} +1 -1
- package/dist/{CodeBlock-CX8_dMPD.js → CodeBlock-DvJ45qEp.js} +4 -4
- package/dist/{CodeBlock-CX8_dMPD.js.map → CodeBlock-DvJ45qEp.js.map} +1 -1
- package/dist/{ColorPicker-CwLivdAt.js → ColorPicker-C4slmEZC.js} +3 -3
- package/dist/{ColorPicker-CwLivdAt.js.map → ColorPicker-C4slmEZC.js.map} +1 -1
- package/dist/{ColorPicker-BaAdcqR9.cjs → ColorPicker-_RBW51XB.cjs} +2 -2
- package/dist/{ColorPicker-BaAdcqR9.cjs.map → ColorPicker-_RBW51XB.cjs.map} +1 -1
- package/dist/{ColorPickerPanel-IOhJJF1R.cjs → ColorPickerPanel-CNspBZre.cjs} +2 -2
- package/dist/{ColorPickerPanel-IOhJJF1R.cjs.map → ColorPickerPanel-CNspBZre.cjs.map} +1 -1
- package/dist/{ColorPickerPanel-CkrSIf35.js → ColorPickerPanel-CQNfIbgc.js} +3 -3
- package/dist/{ColorPickerPanel-CkrSIf35.js.map → ColorPickerPanel-CQNfIbgc.js.map} +1 -1
- package/dist/{ColorRamp-DbFOsspz.js → ColorRamp-DQZZiE5I.js} +2 -2
- package/dist/{ColorRamp-DbFOsspz.js.map → ColorRamp-DQZZiE5I.js.map} +1 -1
- package/dist/{ColorRamp-BCy8a7ks.cjs → ColorRamp-DuO7gkru.cjs} +2 -2
- package/dist/{ColorRamp-BCy8a7ks.cjs.map → ColorRamp-DuO7gkru.cjs.map} +1 -1
- package/dist/{ConfigProvider-CYSpuSMJ.cjs → ConfigProvider-BFhkb0BV.cjs} +2 -2
- package/dist/{ConfigProvider-CYSpuSMJ.cjs.map → ConfigProvider-BFhkb0BV.cjs.map} +1 -1
- package/dist/{ConfigProvider-DtyUlWk6.js → ConfigProvider-bXX8dnhY.js} +2 -2
- package/dist/{ConfigProvider-DtyUlWk6.js.map → ConfigProvider-bXX8dnhY.js.map} +1 -1
- package/dist/{CopyButton-DUG5s3TM.cjs → CopyButton-B2V6guZ0.cjs} +2 -2
- package/dist/{CopyButton-DUG5s3TM.cjs.map → CopyButton-B2V6guZ0.cjs.map} +1 -1
- package/dist/{CopyButton-LURMuaYw.js → CopyButton-DfYAslz-.js} +4 -4
- package/dist/{CopyButton-LURMuaYw.js.map → CopyButton-DfYAslz-.js.map} +1 -1
- package/dist/{DashedButton-BX8hfY1x.cjs → DashedButton-CZ2hjLxT.cjs} +2 -2
- package/dist/{DashedButton-BX8hfY1x.cjs.map → DashedButton-CZ2hjLxT.cjs.map} +1 -1
- package/dist/{DashedButton-wcmXTYBw.js → DashedButton-meJSIY61.js} +2 -2
- package/dist/{DashedButton-wcmXTYBw.js.map → DashedButton-meJSIY61.js.map} +1 -1
- package/dist/{DatePicker-CSIBYSZt.js → DatePicker-CNUDjOxA.js} +5 -5
- package/dist/{DatePicker-CSIBYSZt.js.map → DatePicker-CNUDjOxA.js.map} +1 -1
- package/dist/{DatePicker-Bw9gLB8o.cjs → DatePicker-DrIHa1j1.cjs} +2 -2
- package/dist/{DatePicker-Bw9gLB8o.cjs.map → DatePicker-DrIHa1j1.cjs.map} +1 -1
- package/dist/{DateTimePicker-kikKdt0F.cjs → DateTimePicker-BzwxaOPb.cjs} +2 -2
- package/dist/{DateTimePicker-kikKdt0F.cjs.map → DateTimePicker-BzwxaOPb.cjs.map} +1 -1
- package/dist/{DateTimePicker-C9F2yJMf.js → DateTimePicker-CvWNDbib.js} +8 -8
- package/dist/{DateTimePicker-C9F2yJMf.js.map → DateTimePicker-CvWNDbib.js.map} +1 -1
- package/dist/{DescriptionList-DnGkHdzT.cjs → DescriptionList-Bed1MHU8.cjs} +2 -2
- package/dist/{DescriptionList-DnGkHdzT.cjs.map → DescriptionList-Bed1MHU8.cjs.map} +1 -1
- package/dist/{DescriptionList-kfNXbf_D.js → DescriptionList-BgMNjHJQ.js} +5 -5
- package/dist/{DescriptionList-kfNXbf_D.js.map → DescriptionList-BgMNjHJQ.js.map} +1 -1
- package/dist/{Dropdown-C_y9_dVn.cjs → Dropdown-DNL7RWdL.cjs} +2 -2
- package/dist/{Dropdown-C_y9_dVn.cjs.map → Dropdown-DNL7RWdL.cjs.map} +1 -1
- package/dist/{Dropdown-D-D_Z1Jo.js → Dropdown-iWbHokT7.js} +2 -2
- package/dist/{Dropdown-D-D_Z1Jo.js.map → Dropdown-iWbHokT7.js.map} +1 -1
- package/dist/{EmptyState-BM5LrRLq.cjs → EmptyState-BzwrOICc.cjs} +2 -2
- package/dist/{EmptyState-BM5LrRLq.cjs.map → EmptyState-BzwrOICc.cjs.map} +1 -1
- package/dist/{EmptyState-DrSj2XV_.js → EmptyState-CmcjJl_K.js} +3 -3
- package/dist/{EmptyState-DrSj2XV_.js.map → EmptyState-CmcjJl_K.js.map} +1 -1
- package/dist/{ErrorBoundary-yz669VEu.cjs → ErrorBoundary-BcZgeSsu.cjs} +2 -2
- package/dist/{ErrorBoundary-yz669VEu.cjs.map → ErrorBoundary-BcZgeSsu.cjs.map} +1 -1
- package/dist/{ErrorBoundary-DsP4hO_V.js → ErrorBoundary-TfeJetWc.js} +3 -3
- package/dist/{ErrorBoundary-DsP4hO_V.js.map → ErrorBoundary-TfeJetWc.js.map} +1 -1
- package/dist/{ErrorState-BThPIYaM.cjs → ErrorState-CzWz5UcX.cjs} +2 -2
- package/dist/{ErrorState-BThPIYaM.cjs.map → ErrorState-CzWz5UcX.cjs.map} +1 -1
- package/dist/{ErrorState-DEngucdq.js → ErrorState-EjIhdq7S.js} +8 -8
- package/dist/{ErrorState-DEngucdq.js.map → ErrorState-EjIhdq7S.js.map} +1 -1
- package/dist/{FileCard-CmCESTQd.js → FileCard-CmMxVyk3.js} +5 -5
- package/dist/{FileCard-CmCESTQd.js.map → FileCard-CmMxVyk3.js.map} +1 -1
- package/dist/{FileCard-wxDT2rj9.cjs → FileCard-Cxr1_eF2.cjs} +2 -2
- package/dist/{FileCard-wxDT2rj9.cjs.map → FileCard-Cxr1_eF2.cjs.map} +1 -1
- package/dist/{FileUploader-Dp1r4Sxc.js → FileUploader-2cXBI4Nh.js} +7 -7
- package/dist/{FileUploader-Dp1r4Sxc.js.map → FileUploader-2cXBI4Nh.js.map} +1 -1
- package/dist/{FileUploader-DBNRp5eT.cjs → FileUploader-BkM1t2aE.cjs} +2 -2
- package/dist/{FileUploader-DBNRp5eT.cjs.map → FileUploader-BkM1t2aE.cjs.map} +1 -1
- package/dist/{Flag-B6OhgwZr.cjs → Flag-CWp81_zX.cjs} +2 -2
- package/dist/{Flag-B6OhgwZr.cjs.map → Flag-CWp81_zX.cjs.map} +1 -1
- package/dist/{Flag-Q3vI7cgt.js → Flag-IQolG3j6.js} +2 -2
- package/dist/{Flag-Q3vI7cgt.js.map → Flag-IQolG3j6.js.map} +1 -1
- package/dist/{FullscreenToggle-WGsbE3Op.js → FullscreenToggle-B1DH_-k3.js} +4 -4
- package/dist/{FullscreenToggle-WGsbE3Op.js.map → FullscreenToggle-B1DH_-k3.js.map} +1 -1
- package/dist/{FullscreenToggle-DVdQriWB.cjs → FullscreenToggle-DXVAeN3M.cjs} +2 -2
- package/dist/{FullscreenToggle-DVdQriWB.cjs.map → FullscreenToggle-DXVAeN3M.cjs.map} +1 -1
- package/dist/Icon-BoQmbW7j.cjs +2 -0
- package/dist/Icon-BoQmbW7j.cjs.map +1 -0
- package/dist/{Icon-B7DJn8Tw.js → Icon-DMMO32p6.js} +72 -71
- package/dist/Icon-DMMO32p6.js.map +1 -0
- package/dist/{IconButton-DSPdv-oI.cjs → IconButton-ChhZqleN.cjs} +2 -2
- package/dist/{IconButton-DSPdv-oI.cjs.map → IconButton-ChhZqleN.cjs.map} +1 -1
- package/dist/{IconButton-iWbUJAz7.js → IconButton-s5hohjxu.js} +2 -2
- package/dist/{IconButton-iWbUJAz7.js.map → IconButton-s5hohjxu.js.map} +1 -1
- package/dist/{ImageEditor-C40dp2-V.cjs → ImageEditor-C8tFTX4e.cjs} +2 -2
- package/dist/{ImageEditor-C40dp2-V.cjs.map → ImageEditor-C8tFTX4e.cjs.map} +1 -1
- package/dist/{ImageEditor-BDNys8pq.js → ImageEditor-DWbWjGQ8.js} +8 -8
- package/dist/{ImageEditor-BDNys8pq.js.map → ImageEditor-DWbWjGQ8.js.map} +1 -1
- package/dist/{List-DS91CZUt.js → List-DQlEG_S5.js} +2 -2
- package/dist/{List-DS91CZUt.js.map → List-DQlEG_S5.js.map} +1 -1
- package/dist/{List-CLUXeaXS.cjs → List-Dfa7mlSZ.cjs} +2 -2
- package/dist/{List-CLUXeaXS.cjs.map → List-Dfa7mlSZ.cjs.map} +1 -1
- package/dist/{ListItem-Ezmdk7q-.js → ListItem-CLmg9xKQ.js} +2 -2
- package/dist/{ListItem-Ezmdk7q-.js.map → ListItem-CLmg9xKQ.js.map} +1 -1
- package/dist/{ListItem-CguNjf-u.cjs → ListItem-CWM2fUS2.cjs} +2 -2
- package/dist/{ListItem-CguNjf-u.cjs.map → ListItem-CWM2fUS2.cjs.map} +1 -1
- package/dist/{Loader-RyFTP2X5.cjs → Loader-BCrMy9NU.cjs} +2 -2
- package/dist/{Loader-RyFTP2X5.cjs.map → Loader-BCrMy9NU.cjs.map} +1 -1
- package/dist/{Loader-DD1vfqmN.js → Loader-CShIWNfG.js} +2 -2
- package/dist/{Loader-DD1vfqmN.js.map → Loader-CShIWNfG.js.map} +1 -1
- package/dist/{LocationPicker-B594f0bz.cjs → LocationPicker-8Tt0zJU4.cjs} +2 -2
- package/dist/{LocationPicker-B594f0bz.cjs.map → LocationPicker-8Tt0zJU4.cjs.map} +1 -1
- package/dist/{LocationPicker-DpmYaYyd.js → LocationPicker-DsV_s2Ur.js} +8 -8
- package/dist/{LocationPicker-DpmYaYyd.js.map → LocationPicker-DsV_s2Ur.js.map} +1 -1
- package/dist/{Modal-DVGTD2Ck.js → Modal-BO7fHn0r.js} +4 -4
- package/dist/{Modal-DVGTD2Ck.js.map → Modal-BO7fHn0r.js.map} +1 -1
- package/dist/{Modal-7cCok6fV.cjs → Modal-yj92WLay.cjs} +2 -2
- package/dist/{Modal-7cCok6fV.cjs.map → Modal-yj92WLay.cjs.map} +1 -1
- package/dist/{MultiSelect-DTKNjUDH.cjs → MultiSelect-B6JZb_5N.cjs} +2 -2
- package/dist/{MultiSelect-DTKNjUDH.cjs.map → MultiSelect-B6JZb_5N.cjs.map} +1 -1
- package/dist/{MultiSelect-D-X833xt.js → MultiSelect-D-QWlfwD.js} +5 -5
- package/dist/{MultiSelect-D-X833xt.js.map → MultiSelect-D-QWlfwD.js.map} +1 -1
- package/dist/{NumberField-Xz4yQMlm.cjs → NumberField-CS5VMnk4.cjs} +2 -2
- package/dist/{NumberField-Xz4yQMlm.cjs.map → NumberField-CS5VMnk4.cjs.map} +1 -1
- package/dist/{NumberField-OPOl0Yph.js → NumberField-D_UxKjVN.js} +4 -4
- package/dist/{NumberField-OPOl0Yph.js.map → NumberField-D_UxKjVN.js.map} +1 -1
- package/dist/{OtpField-kd0YghZq.cjs → OtpField-BuS_8j9L.cjs} +2 -2
- package/dist/{OtpField-kd0YghZq.cjs.map → OtpField-BuS_8j9L.cjs.map} +1 -1
- package/dist/{OtpField-CLrDMNtS.js → OtpField-CpjDid5_.js} +2 -2
- package/dist/{OtpField-CLrDMNtS.js.map → OtpField-CpjDid5_.js.map} +1 -1
- package/dist/{PageError-v6MAH_OL.cjs → PageError-CTEOASeb.cjs} +2 -2
- package/dist/{PageError-v6MAH_OL.cjs.map → PageError-CTEOASeb.cjs.map} +1 -1
- package/dist/{PageError-BIiZDzey.js → PageError-DjyJrGmR.js} +5 -5
- package/dist/{PageError-BIiZDzey.js.map → PageError-DjyJrGmR.js.map} +1 -1
- package/dist/{PageLayout-DH3jochw.cjs → PageLayout-BYKRmCAL.cjs} +2 -2
- package/dist/{PageLayout-DH3jochw.cjs.map → PageLayout-BYKRmCAL.cjs.map} +1 -1
- package/dist/{PageLayout-BjaPfXvb.js → PageLayout-Cz1OhQZ7.js} +5 -5
- package/dist/{PageLayout-BjaPfXvb.js.map → PageLayout-Cz1OhQZ7.js.map} +1 -1
- package/dist/{PageNotFound-C1oSsMG-.js → PageNotFound-CwBtrllo.js} +5 -5
- package/dist/{PageNotFound-C1oSsMG-.js.map → PageNotFound-CwBtrllo.js.map} +1 -1
- package/dist/{PageNotFound-Cse4bROv.cjs → PageNotFound-u9Q4KG6B.cjs} +2 -2
- package/dist/{PageNotFound-Cse4bROv.cjs.map → PageNotFound-u9Q4KG6B.cjs.map} +1 -1
- package/dist/{Pagination-BNJdqcu4.js → Pagination-CLjNwqie.js} +3 -3
- package/dist/{Pagination-BNJdqcu4.js.map → Pagination-CLjNwqie.js.map} +1 -1
- package/dist/{Pagination-DkmfEmgK.cjs → Pagination-HtS5gPnd.cjs} +2 -2
- package/dist/{Pagination-DkmfEmgK.cjs.map → Pagination-HtS5gPnd.cjs.map} +1 -1
- package/dist/{PaletteField-DqZl1mK0.cjs → PaletteField-BSgx5pxh.cjs} +2 -2
- package/dist/{PaletteField-DqZl1mK0.cjs.map → PaletteField-BSgx5pxh.cjs.map} +1 -1
- package/dist/{PaletteField-Cdky6Zka.js → PaletteField-Bk7cnSla.js} +3 -3
- package/dist/{PaletteField-Cdky6Zka.js.map → PaletteField-Bk7cnSla.js.map} +1 -1
- package/dist/{PhoneField-jq-3_i_b.cjs → PhoneField-CzFv2Vci.cjs} +2 -2
- package/dist/{PhoneField-jq-3_i_b.cjs.map → PhoneField-CzFv2Vci.cjs.map} +1 -1
- package/dist/{PhoneField-DmFaJJEa.js → PhoneField-DhoumZNG.js} +5 -5
- package/dist/{PhoneField-DmFaJJEa.js.map → PhoneField-DhoumZNG.js.map} +1 -1
- package/dist/{Popconfirm-KOE9gGi6.cjs → Popconfirm-Cb9LlmZb.cjs} +2 -2
- package/dist/{Popconfirm-KOE9gGi6.cjs.map → Popconfirm-Cb9LlmZb.cjs.map} +1 -1
- package/dist/{Popconfirm-D-8ZG2WR.js → Popconfirm-D7J5JbF-.js} +4 -4
- package/dist/{Popconfirm-D-8ZG2WR.js.map → Popconfirm-D7J5JbF-.js.map} +1 -1
- package/dist/{Progress-CdX666FP.js → Progress-Bt2LDqbD.js} +2 -2
- package/dist/{Progress-CdX666FP.js.map → Progress-Bt2LDqbD.js.map} +1 -1
- package/dist/{Progress-7EyhPtnu.cjs → Progress-dAtQ2BN-.cjs} +2 -2
- package/dist/{Progress-7EyhPtnu.cjs.map → Progress-dAtQ2BN-.cjs.map} +1 -1
- package/dist/{QrCode-ClIJjjvF.cjs → QrCode-FHUAxI8u.cjs} +2 -2
- package/dist/{QrCode-ClIJjjvF.cjs.map → QrCode-FHUAxI8u.cjs.map} +1 -1
- package/dist/{QrCode-D7ocSDi7.js → QrCode-jaDZxZkv.js} +2 -2
- package/dist/{QrCode-D7ocSDi7.js.map → QrCode-jaDZxZkv.js.map} +1 -1
- package/dist/{RemoveDialog-DTzRPLaT.js → RemoveDialog-DdO5E3Wl.js} +6 -6
- package/dist/{RemoveDialog-DTzRPLaT.js.map → RemoveDialog-DdO5E3Wl.js.map} +1 -1
- package/dist/{RemoveDialog-UsSX5z8Y.cjs → RemoveDialog-eGNxdyoO.cjs} +2 -2
- package/dist/{RemoveDialog-UsSX5z8Y.cjs.map → RemoveDialog-eGNxdyoO.cjs.map} +1 -1
- package/dist/{RichTextEditor-Bh0Q3dIW.cjs → RichTextEditor-CoYuQurR.cjs} +2 -2
- package/dist/{RichTextEditor-Bh0Q3dIW.cjs.map → RichTextEditor-CoYuQurR.cjs.map} +1 -1
- package/dist/{RichTextEditor-BMctlkVC.js → RichTextEditor-DHRiJchI.js} +10 -10
- package/dist/{RichTextEditor-BMctlkVC.js.map → RichTextEditor-DHRiJchI.js.map} +1 -1
- package/dist/{RootLayout-BztZetpk.cjs → RootLayout-CEplIlVR.cjs} +2 -2
- package/dist/{RootLayout-BztZetpk.cjs.map → RootLayout-CEplIlVR.cjs.map} +1 -1
- package/dist/{RootLayout-CTkv4iQJ.js → RootLayout-pd66MZtI.js} +21 -21
- package/dist/{RootLayout-CTkv4iQJ.js.map → RootLayout-pd66MZtI.js.map} +1 -1
- package/dist/{Select-CmonDIIU.js → Select-C2iiQLMh.js} +4 -4
- package/dist/{Select-CmonDIIU.js.map → Select-C2iiQLMh.js.map} +1 -1
- package/dist/{Select-BzVyK6Ne.cjs → Select-CvW_T9R-.cjs} +2 -2
- package/dist/{Select-BzVyK6Ne.cjs.map → Select-CvW_T9R-.cjs.map} +1 -1
- package/dist/Sidebar-CqGCazeA.cjs +2 -0
- package/dist/Sidebar-CqGCazeA.cjs.map +1 -0
- package/dist/Sidebar-DuUhzQBi.js +543 -0
- package/dist/Sidebar-DuUhzQBi.js.map +1 -0
- package/dist/{Slider-Oe9VSAdy.cjs → Slider-DlPMPdHA.cjs} +2 -2
- package/dist/{Slider-Oe9VSAdy.cjs.map → Slider-DlPMPdHA.cjs.map} +1 -1
- package/dist/{Slider-C7Wb3q_F.js → Slider-UY29adRu.js} +2 -2
- package/dist/{Slider-C7Wb3q_F.js.map → Slider-UY29adRu.js.map} +1 -1
- package/dist/{SpeedDial-DpIXoYHB.cjs → SpeedDial-Cms5pJ9t.cjs} +2 -2
- package/dist/{SpeedDial-DpIXoYHB.cjs.map → SpeedDial-Cms5pJ9t.cjs.map} +1 -1
- package/dist/{SpeedDial-CCGQlwn2.js → SpeedDial-DOWefQgo.js} +3 -3
- package/dist/{SpeedDial-CCGQlwn2.js.map → SpeedDial-DOWefQgo.js.map} +1 -1
- package/dist/{Stepper-PBDU60G_.cjs → Stepper-4wCyTnwi.cjs} +2 -2
- package/dist/{Stepper-PBDU60G_.cjs.map → Stepper-4wCyTnwi.cjs.map} +1 -1
- package/dist/{Stepper-D_WKS1RG.js → Stepper-yQEJkbUJ.js} +3 -3
- package/dist/{Stepper-D_WKS1RG.js.map → Stepper-yQEJkbUJ.js.map} +1 -1
- package/dist/{SwatchPicker-DS4WY2eM.js → SwatchPicker-BI0XHphv.js} +2 -2
- package/dist/{SwatchPicker-DS4WY2eM.js.map → SwatchPicker-BI0XHphv.js.map} +1 -1
- package/dist/{SwatchPicker-DCjE0T80.cjs → SwatchPicker-QYtqEUxX.cjs} +2 -2
- package/dist/{SwatchPicker-DCjE0T80.cjs.map → SwatchPicker-QYtqEUxX.cjs.map} +1 -1
- package/dist/{Table-DZQVa_PE.js → Table-CNrt1EWm.js} +19 -19
- package/dist/{Table-DZQVa_PE.js.map → Table-CNrt1EWm.js.map} +1 -1
- package/dist/{Table-CZ4n4-TN.cjs → Table-D4pqLNtE.cjs} +2 -2
- package/dist/{Table-CZ4n4-TN.cjs.map → Table-D4pqLNtE.cjs.map} +1 -1
- package/dist/{Tabs-Byhqm-TE.cjs → Tabs-D6qrgZTM.cjs} +2 -2
- package/dist/{Tabs-Byhqm-TE.cjs.map → Tabs-D6qrgZTM.cjs.map} +1 -1
- package/dist/{Tabs-B063mP-v.js → Tabs-lezN63jW.js} +3 -3
- package/dist/{Tabs-B063mP-v.js.map → Tabs-lezN63jW.js.map} +1 -1
- package/dist/{TagsField-g_LtwYgz.cjs → TagsField-BIJEDyfz.cjs} +2 -2
- package/dist/{TagsField-g_LtwYgz.cjs.map → TagsField-BIJEDyfz.cjs.map} +1 -1
- package/dist/{TagsField-hQFYyNcM.js → TagsField-D_a2I8eU.js} +5 -5
- package/dist/{TagsField-hQFYyNcM.js.map → TagsField-D_a2I8eU.js.map} +1 -1
- package/dist/{TextField-Dfpk0jOg.js → TextField-BsC2zoHI.js} +4 -4
- package/dist/{TextField-Dfpk0jOg.js.map → TextField-BsC2zoHI.js.map} +1 -1
- package/dist/{TextField-D4s2hGSd.cjs → TextField-CXDBlP-8.cjs} +2 -2
- package/dist/{TextField-D4s2hGSd.cjs.map → TextField-CXDBlP-8.cjs.map} +1 -1
- package/dist/{ThemeToggle-BQQ3eswr.js → ThemeToggle-Dh6XxqM7.js} +4 -4
- package/dist/{ThemeToggle-BQQ3eswr.js.map → ThemeToggle-Dh6XxqM7.js.map} +1 -1
- package/dist/{ThemeToggle-BTTI7Jz0.cjs → ThemeToggle-zbKf4ph5.cjs} +2 -2
- package/dist/{ThemeToggle-BTTI7Jz0.cjs.map → ThemeToggle-zbKf4ph5.cjs.map} +1 -1
- package/dist/{TimeColumns-BpjhrNCq.js → TimeColumns-CR__2LXh.js} +2 -2
- package/dist/{TimeColumns-BpjhrNCq.js.map → TimeColumns-CR__2LXh.js.map} +1 -1
- package/dist/{TimeColumns-DZYGWWG_.cjs → TimeColumns-CjBeUPtV.cjs} +2 -2
- package/dist/{TimeColumns-DZYGWWG_.cjs.map → TimeColumns-CjBeUPtV.cjs.map} +1 -1
- package/dist/{TimePicker-mzoMIlpq.js → TimePicker-BakQ-wPd.js} +6 -6
- package/dist/{TimePicker-mzoMIlpq.js.map → TimePicker-BakQ-wPd.js.map} +1 -1
- package/dist/{TimePicker-DChtZgBs.cjs → TimePicker-DtqmD2bH.cjs} +2 -2
- package/dist/{TimePicker-DChtZgBs.cjs.map → TimePicker-DtqmD2bH.cjs.map} +1 -1
- package/dist/{Timeline-DOojNvLG.cjs → Timeline-CFKbPpAV.cjs} +2 -2
- package/dist/{Timeline-DOojNvLG.cjs.map → Timeline-CFKbPpAV.cjs.map} +1 -1
- package/dist/{Timeline-Dg03dwTN.js → Timeline-zCHcq7Ra.js} +2 -2
- package/dist/{Timeline-Dg03dwTN.js.map → Timeline-zCHcq7Ra.js.map} +1 -1
- package/dist/{Toaster-lonArt-H.cjs → Toaster-BpXPWJ_n.cjs} +2 -2
- package/dist/{Toaster-lonArt-H.cjs.map → Toaster-BpXPWJ_n.cjs.map} +1 -1
- package/dist/{Toaster-79DvOW80.js → Toaster-C5jWNL-o.js} +3 -3
- package/dist/{Toaster-79DvOW80.js.map → Toaster-C5jWNL-o.js.map} +1 -1
- package/dist/{ToggleButtonGroup-CGNRLxjg.cjs → ToggleButtonGroup-CbKtjm8O.cjs} +2 -2
- package/dist/{ToggleButtonGroup-CGNRLxjg.cjs.map → ToggleButtonGroup-CbKtjm8O.cjs.map} +1 -1
- package/dist/{ToggleButtonGroup-K6ZcrTZT.js → ToggleButtonGroup-D3Jltv0z.js} +2 -2
- package/dist/{ToggleButtonGroup-K6ZcrTZT.js.map → ToggleButtonGroup-D3Jltv0z.js.map} +1 -1
- package/dist/{TranslatedFields-CHHtXO_n.js → TranslatedFields-C8oxlGIQ.js} +5 -5
- package/dist/{TranslatedFields-CHHtXO_n.js.map → TranslatedFields-C8oxlGIQ.js.map} +1 -1
- package/dist/{TranslatedFields-BYpMrYaw.cjs → TranslatedFields-Che_ZPHk.cjs} +2 -2
- package/dist/{TranslatedFields-BYpMrYaw.cjs.map → TranslatedFields-Che_ZPHk.cjs.map} +1 -1
- package/dist/{UserCard-SlkCgZS9.cjs → UserCard-DlrdIJHW.cjs} +2 -2
- package/dist/{UserCard-SlkCgZS9.cjs.map → UserCard-DlrdIJHW.cjs.map} +1 -1
- package/dist/{UserCard-BJFNP_nl.js → UserCard-Dr1A_bdA.js} +5 -5
- package/dist/{UserCard-BJFNP_nl.js.map → UserCard-Dr1A_bdA.js.map} +1 -1
- package/dist/auth/AuthGuard.d.cts +3 -1
- package/dist/auth/AuthGuard.d.ts +3 -1
- package/dist/auth/authLayoutRoute.d.cts +4 -3
- package/dist/auth/authLayoutRoute.d.ts +4 -3
- package/dist/auth/authRedirect.d.cts +13 -5
- package/dist/auth/authRedirect.d.ts +13 -5
- package/dist/{authLayoutRoute-AiQqIH85.cjs → authLayoutRoute-CPLqQVvx.cjs} +2 -2
- package/dist/authLayoutRoute-CPLqQVvx.cjs.map +1 -0
- package/dist/{authLayoutRoute-Nf2PDNDN.js → authLayoutRoute-nSZq8JYA.js} +2 -2
- package/dist/authLayoutRoute-nSZq8JYA.js.map +1 -0
- package/dist/chunks/icons/{62-Bfupp-0A.js → 62-9nuZO-ct.js} +9 -10
- package/dist/chunks/icons/{62-CZZzM1ev.cjs → 62-DQQ1U3IB.cjs} +1 -1
- package/dist/components/Accordion/index.cjs +1 -1
- package/dist/components/Accordion/index.js +1 -1
- package/dist/components/Alert/index.cjs +1 -1
- package/dist/components/Alert/index.js +1 -1
- package/dist/components/AuthLayout/index.cjs +1 -1
- package/dist/components/AuthLayout/index.js +1 -1
- package/dist/components/Avatar/index.cjs +1 -1
- package/dist/components/Avatar/index.js +2 -2
- package/dist/components/Breadcrumbs/index.cjs +1 -1
- package/dist/components/Breadcrumbs/index.js +1 -1
- package/dist/components/Button/index.cjs +1 -1
- package/dist/components/Button/index.js +1 -1
- package/dist/components/Card/index.cjs +1 -1
- package/dist/components/Card/index.js +1 -1
- package/dist/components/Chip/index.cjs +1 -1
- package/dist/components/Chip/index.js +1 -1
- package/dist/components/ChoiceCard/index.cjs +1 -1
- package/dist/components/ChoiceCard/index.js +1 -1
- package/dist/components/CodeBlock/index.cjs +1 -1
- package/dist/components/CodeBlock/index.js +1 -1
- package/dist/components/ColorPicker/index.cjs +1 -1
- package/dist/components/ColorPicker/index.js +1 -1
- package/dist/components/ColorRamp/index.cjs +1 -1
- package/dist/components/ColorRamp/index.js +1 -1
- package/dist/components/CopyButton/index.cjs +1 -1
- package/dist/components/CopyButton/index.js +1 -1
- package/dist/components/DashedButton/index.cjs +1 -1
- package/dist/components/DashedButton/index.js +1 -1
- package/dist/components/DatePicker/index.cjs +1 -1
- package/dist/components/DatePicker/index.js +1 -1
- package/dist/components/DateTimePicker/index.cjs +1 -1
- package/dist/components/DateTimePicker/index.js +1 -1
- package/dist/components/DescriptionList/index.cjs +1 -1
- package/dist/components/DescriptionList/index.js +1 -1
- package/dist/components/Dropdown/index.cjs +1 -1
- package/dist/components/Dropdown/index.js +1 -1
- package/dist/components/EmptyState/index.cjs +1 -1
- package/dist/components/EmptyState/index.js +1 -1
- package/dist/components/ErrorState/index.cjs +1 -1
- package/dist/components/ErrorState/index.js +2 -2
- package/dist/components/FileCard/index.cjs +1 -1
- package/dist/components/FileCard/index.js +1 -1
- package/dist/components/FileUploader/index.cjs +1 -1
- package/dist/components/FileUploader/index.js +1 -1
- package/dist/components/Flag/index.cjs +1 -1
- package/dist/components/Flag/index.js +1 -1
- package/dist/components/FullscreenToggle/index.cjs +1 -1
- package/dist/components/FullscreenToggle/index.js +1 -1
- package/dist/components/Icon/index.cjs +1 -1
- package/dist/components/Icon/index.js +1 -1
- package/dist/components/IconButton/index.cjs +1 -1
- package/dist/components/IconButton/index.js +1 -1
- package/dist/components/ImageEditor/index.cjs +1 -1
- package/dist/components/ImageEditor/index.js +1 -1
- package/dist/components/List/index.cjs +1 -1
- package/dist/components/List/index.js +2 -2
- package/dist/components/Loader/index.cjs +1 -1
- package/dist/components/Loader/index.js +1 -1
- package/dist/components/LocationPicker/index.cjs +1 -1
- package/dist/components/LocationPicker/index.js +1 -1
- package/dist/components/Modal/index.cjs +1 -1
- package/dist/components/Modal/index.js +1 -1
- package/dist/components/MultiSelect/index.cjs +1 -1
- package/dist/components/MultiSelect/index.js +1 -1
- package/dist/components/NumberField/index.cjs +1 -1
- package/dist/components/NumberField/index.js +1 -1
- package/dist/components/OtpField/index.cjs +1 -1
- package/dist/components/OtpField/index.js +1 -1
- package/dist/components/PageError/index.cjs +1 -1
- package/dist/components/PageError/index.js +1 -1
- package/dist/components/PageLayout/index.cjs +1 -1
- package/dist/components/PageLayout/index.js +1 -1
- package/dist/components/PageNotFound/index.cjs +1 -1
- package/dist/components/PageNotFound/index.js +1 -1
- package/dist/components/Pagination/index.cjs +1 -1
- package/dist/components/Pagination/index.js +1 -1
- package/dist/components/PaletteField/index.cjs +1 -1
- package/dist/components/PaletteField/index.js +1 -1
- package/dist/components/PhoneField/index.cjs +1 -1
- package/dist/components/PhoneField/index.js +1 -1
- package/dist/components/Popconfirm/index.cjs +1 -1
- package/dist/components/Popconfirm/index.js +1 -1
- package/dist/components/Progress/index.cjs +1 -1
- package/dist/components/Progress/index.js +1 -1
- package/dist/components/QrCode/index.cjs +1 -1
- package/dist/components/QrCode/index.js +1 -1
- package/dist/components/RemoveDialog/index.cjs +1 -1
- package/dist/components/RemoveDialog/index.js +1 -1
- package/dist/components/RichTextEditor/index.cjs +1 -1
- package/dist/components/RichTextEditor/index.js +1 -1
- package/dist/components/RootLayout/index.cjs +1 -1
- package/dist/components/RootLayout/index.js +1 -1
- package/dist/components/Select/index.cjs +1 -1
- package/dist/components/Select/index.js +1 -1
- package/dist/components/Sidebar/Sidebar.d.cts +40 -4
- package/dist/components/Sidebar/Sidebar.d.ts +40 -4
- package/dist/components/Sidebar/index.cjs +1 -1
- package/dist/components/Sidebar/index.d.cts +2 -1
- package/dist/components/Sidebar/index.d.ts +2 -1
- package/dist/components/Sidebar/index.js +5 -4
- package/dist/components/Slider/index.cjs +1 -1
- package/dist/components/Slider/index.js +1 -1
- package/dist/components/SpeedDial/index.cjs +1 -1
- package/dist/components/SpeedDial/index.js +1 -1
- package/dist/components/Stepper/index.cjs +1 -1
- package/dist/components/Stepper/index.js +1 -1
- package/dist/components/SwatchPicker/index.cjs +1 -1
- package/dist/components/SwatchPicker/index.js +1 -1
- package/dist/components/Table/index.cjs +1 -1
- package/dist/components/Table/index.js +1 -1
- package/dist/components/Tabs/index.cjs +1 -1
- package/dist/components/Tabs/index.js +1 -1
- package/dist/components/TagsField/index.cjs +1 -1
- package/dist/components/TagsField/index.js +1 -1
- package/dist/components/TextField/index.cjs +1 -1
- package/dist/components/TextField/index.js +1 -1
- package/dist/components/ThemeToggle/index.cjs +1 -1
- package/dist/components/ThemeToggle/index.js +1 -1
- package/dist/components/TimePicker/index.cjs +1 -1
- package/dist/components/TimePicker/index.js +1 -1
- package/dist/components/Timeline/index.cjs +1 -1
- package/dist/components/Timeline/index.js +1 -1
- package/dist/components/Toast/index.cjs +1 -1
- package/dist/components/Toast/index.js +1 -1
- package/dist/components/ToggleButton/index.cjs +1 -1
- package/dist/components/ToggleButton/index.js +1 -1
- package/dist/components/TranslatedFields/index.cjs +1 -1
- package/dist/components/TranslatedFields/index.js +1 -1
- package/dist/components/UserCard/index.cjs +1 -1
- package/dist/components/UserCard/index.js +1 -1
- package/dist/entries/app.cjs +1 -1
- package/dist/entries/app.js +1 -1
- package/dist/entries/auth.cjs +1 -1
- package/dist/entries/auth.js +2 -2
- package/dist/entries/components.cjs +1 -1
- package/dist/entries/components.js +157 -156
- package/dist/entries/i18n.cjs +1 -1
- package/dist/entries/i18n.js +2 -2
- package/dist/entries/icons.cjs +1 -1
- package/dist/entries/icons.js +1 -1
- package/dist/entries/theme.cjs +1 -1
- package/dist/entries/theme.js +1 -1
- package/dist/i18n/messages.d.cts +4 -0
- package/dist/i18n/messages.d.ts +4 -0
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.js +173 -172
- package/dist/{messages-DeQuvGln.js → messages-CZbb1xNN.js} +29 -15
- package/dist/messages-CZbb1xNN.js.map +1 -0
- package/dist/messages-D4ooXnUr.cjs +36 -0
- package/dist/messages-D4ooXnUr.cjs.map +1 -0
- package/dist/useHomeTo---51HTJ0.cjs +2 -0
- package/dist/useHomeTo---51HTJ0.cjs.map +1 -0
- package/dist/useHomeTo-CJj94TdV.js +10 -0
- package/dist/useHomeTo-CJj94TdV.js.map +1 -0
- package/dist/{useOptionMenu-6ZffgbYG.cjs → useOptionMenu-DS___46k.cjs} +2 -2
- package/dist/{useOptionMenu-6ZffgbYG.cjs.map → useOptionMenu-DS___46k.cjs.map} +1 -1
- package/dist/{useOptionMenu-CxM6FHXL.js → useOptionMenu-Sp2d3Bzi.js} +6 -6
- package/dist/{useOptionMenu-CxM6FHXL.js.map → useOptionMenu-Sp2d3Bzi.js.map} +1 -1
- package/package.json +1 -1
- package/dist/AuthGuard-BTSRwF04.js +0 -108
- package/dist/AuthGuard-BTSRwF04.js.map +0 -1
- package/dist/AuthGuard-CLqroYbX.cjs +0 -2
- package/dist/AuthGuard-CLqroYbX.cjs.map +0 -1
- package/dist/Icon-B7DJn8Tw.js.map +0 -1
- package/dist/Icon-CBg21lKA.cjs +0 -2
- package/dist/Icon-CBg21lKA.cjs.map +0 -1
- package/dist/Sidebar-CLr-DyQ_.js +0 -522
- package/dist/Sidebar-CLr-DyQ_.js.map +0 -1
- package/dist/Sidebar-CM-jZfj5.cjs +0 -2
- package/dist/Sidebar-CM-jZfj5.cjs.map +0 -1
- package/dist/authLayoutRoute-AiQqIH85.cjs.map +0 -1
- package/dist/authLayoutRoute-Nf2PDNDN.js.map +0 -1
- package/dist/messages-DeQuvGln.js.map +0 -1
- package/dist/messages-dL9MkVze.cjs +0 -36
- package/dist/messages-dL9MkVze.cjs.map +0 -1
- package/dist/useHomeTo-BLSvhJd5.js +0 -25
- package/dist/useHomeTo-BLSvhJd5.js.map +0 -1
- package/dist/useHomeTo-cXCg1tf0.cjs +0 -2
- package/dist/useHomeTo-cXCg1tf0.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToggleButtonGroup-CGNRLxjg.cjs","sources":["../src/components/ToggleButton/toggleButtonGroupContext.ts","../src/components/ToggleButton/ToggleButton.tsx","../src/components/ToggleButton/ToggleButtonGroup.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { ThemeColor } from '../../theme'\nimport type { ToggleButtonSize } from './ToggleButton'\n\n/** Shared state a `<ToggleButtonGroup>` hands down to its `<ToggleButton>` children via context. */\nexport interface ToggleButtonGroupContextValue {\n /** Whether a given button value is currently selected. */\n isSelected: (value: string) => boolean\n /** Toggle a button value — called by a child on click. */\n toggle: (value: string) => void\n size?: ToggleButtonSize\n color?: ThemeColor\n disabled?: boolean\n // (no `fullWidth` — the group applies its own `.fullWidth` class on the container; a child only honors\n // its own `fullWidth` prop when standalone, so passing it through context would be dead state)\n}\n\nexport const ToggleButtonGroupContext = createContext<ToggleButtonGroupContextValue | null>(null)\n\n/** Read the surrounding `<ToggleButtonGroup>` (or `null` when a `<ToggleButton>` is standalone). */\nexport function useToggleButtonGroup(): ToggleButtonGroupContextValue | null {\n return useContext(ToggleButtonGroupContext)\n}\n","import { forwardRef, type ButtonHTMLAttributes, type CSSProperties, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport type { ThemeColor } from '../../theme'\nimport { useToggleButtonGroup } from './toggleButtonGroupContext'\nimport styles from './ToggleButton.module.css'\n\nexport type ToggleButtonSize = 'sm' | 'md' | 'lg'\n\nexport interface ToggleButtonProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'color' | 'value' | 'onChange'\n> {\n /** The value this button represents — its identity within a `ToggleButtonGroup`. */\n value: string\n /** Selected state for standalone use (inside a group, the group owns selection). */\n selected?: boolean\n /** Fires with the next selected state — standalone use only. */\n onChange?: (selected: boolean, value: string) => void\n /** Theme palette token tinting the selected state. Defaults to `primary`. */\n color?: ThemeColor\n /** Preset size. Defaults to `md`. */\n size?: ToggleButtonSize\n /** Stretch to fill the container width. */\n fullWidth?: boolean\n /** Button content — typically an `Icon`, text, or both. */\n children?: ReactNode\n}\n\n/**\n * A two-state button that toggles between selected and unselected — the building block of\n * `ToggleButtonGroup` (which owns selection, size, color and disabled via context), but also usable\n * standalone with `selected` + `onChange`. Selected uses the soft `filled` tint of `color` (the shared\n * `--tz-btn-rgb` pattern); `aria-pressed` reflects the state. The ref points at the `<button>`.\n */\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(function ToggleButton(\n {\n value,\n selected,\n onChange,\n color,\n size,\n fullWidth,\n disabled,\n className,\n style,\n children,\n onClick,\n ...props\n },\n ref,\n) {\n const group = useToggleButtonGroup()\n const isSelected = group ? group.isSelected(value) : (selected ?? false)\n const resolvedColor = color ?? group?.color ?? 'primary'\n const resolvedSize = size ?? group?.size ?? 'md'\n const resolvedDisabled = Boolean(disabled || group?.disabled)\n // standalone full-width uses a width:100% class; inside a group the group stretches the buttons\n const resolvedFullWidth = !group && (fullWidth ?? false)\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={clsx(\n styles.toggleButton,\n styles[resolvedSize],\n isSelected && styles.selected,\n resolvedFullWidth && styles.fullWidth,\n className,\n )}\n style={{ '--tz-btn-rgb': `var(--tz-color-${resolvedColor}-rgb)`, ...style } as CSSProperties}\n aria-pressed={isSelected}\n disabled={resolvedDisabled}\n onClick={(event) => {\n onClick?.(event)\n if (group) group.toggle(value)\n else onChange?.(!isSelected, value)\n }}\n {...props}\n >\n {children}\n </button>\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 type { ThemeColor } from '../../theme'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport { ToggleButton, type ToggleButtonSize } from './ToggleButton'\nimport {\n ToggleButtonGroupContext,\n type ToggleButtonGroupContextValue,\n} from './toggleButtonGroupContext'\nimport styles from './ToggleButton.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type ToggleButtonGroupOrientation = 'horizontal' | 'vertical'\n\n/** A data-driven button for the `options` prop. */\nexport interface ToggleButtonOption {\n value: string\n label?: ReactNode\n /** Leading icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n disabled?: boolean\n /** Accessible label (use for icon-only buttons). */\n ariaLabel?: string\n}\n\nexport interface ToggleButtonGroupProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'color' | 'onChange' | 'defaultValue'\n> {\n /**\n * Single-selection (`value` is a `string | null`, like a segmented control) vs multiple (`value` is\n * a `string[]`). Defaults to `false` (multiple), matching MUI.\n */\n exclusive?: boolean\n /** Controlled value — a `string | null` when `exclusive`, else a `string[]`. */\n value?: string | string[] | null\n /** Initial value for uncontrolled use (same shape as `value`). */\n defaultValue?: string | string[] | null\n /** Fires with the next value (matches the `exclusive` shape). */\n onChange?: (value: string | string[] | null) => void\n /** Data-driven buttons — an alternative to passing `<ToggleButton>` children. */\n options?: ToggleButtonOption[]\n /** Lay the buttons in a row or a column. Defaults to `horizontal`. */\n orientation?: ToggleButtonGroupOrientation\n /** Preset size for every button. Defaults to `md`. */\n size?: ToggleButtonSize\n /** Theme palette token tinting selected buttons. Defaults to `primary`. */\n color?: ThemeColor\n /** Disables every button in the group. */\n disabled?: boolean\n /** Stretch the group to fill the width (buttons share it equally). */\n fullWidth?: boolean\n /** `<ToggleButton>` children (used when `options` is not given). */\n children?: ReactNode\n}\n\n/**\n * Groups `<ToggleButton>`s into a joined, segmented control. **`exclusive`** picks single-selection\n * (`value` is a `string | null` — clicking the active button deselects it) vs multiple (`value` is a\n * `string[]`); both are controlled (`value` + `onChange`) or uncontrolled (`defaultValue`). Supply the\n * buttons via the data-driven `options` prop or as `<ToggleButton>` children — the group shares\n * `size`/`color`/`disabled`/`fullWidth` and the selection via context. `orientation` lays them in a\n * row or column; adjacent borders collapse so the strip reads as one control. `role=\"group\"`; styling\n * uses `--tz-*` tokens.\n */\nexport const ToggleButtonGroup = forwardRef<HTMLDivElement, ToggleButtonGroupProps>(\n function ToggleButtonGroup(\n {\n exclusive = false,\n value,\n defaultValue,\n onChange,\n options,\n orientation = 'horizontal',\n size = 'md',\n color = 'primary',\n disabled = false,\n fullWidth = 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 isSelected = (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 // click the active button to deselect (MUI behavior)\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: ToggleButtonGroupContextValue = {\n isSelected,\n toggle,\n size,\n color,\n disabled,\n }\n\n return (\n <div\n ref={ref}\n role=\"group\"\n className={clsx(\n styles.group,\n orientation === 'vertical' && styles.vertical,\n fullWidth && styles.fullWidth,\n className,\n )}\n style={style as CSSProperties}\n {...props}\n >\n <ToggleButtonGroupContext.Provider value={ctx}>\n {options\n ? options.map((option) => (\n <ToggleButton\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n aria-label={option.ariaLabel}\n >\n {option.icon != null &&\n (typeof option.icon === 'string' && ICON_NAME_SET.has(option.icon) ? (\n <Icon name={option.icon as IconName} />\n ) : (\n option.icon\n ))}\n {option.label}\n </ToggleButton>\n ))\n : children}\n </ToggleButtonGroupContext.Provider>\n </div>\n )\n },\n)\n"],"names":["ToggleButtonGroupContext","createContext","useToggleButtonGroup","useContext","ToggleButton","forwardRef","value","selected","onChange","color","size","fullWidth","disabled","className","style","children","onClick","props","ref","group","isSelected","resolvedColor","resolvedSize","resolvedDisabled","resolvedFullWidth","jsx","clsx","styles","event","ICON_NAME_SET","ICON_NAMES","ToggleButtonGroup","exclusive","defaultValue","options","orientation","isControlled","internal","setInternal","useState","current","ctx","v","next","arr","x","option","jsxs","Icon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToggleButtonGroup-CbKtjm8O.cjs","sources":["../src/components/ToggleButton/toggleButtonGroupContext.ts","../src/components/ToggleButton/ToggleButton.tsx","../src/components/ToggleButton/ToggleButtonGroup.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { ThemeColor } from '../../theme'\nimport type { ToggleButtonSize } from './ToggleButton'\n\n/** Shared state a `<ToggleButtonGroup>` hands down to its `<ToggleButton>` children via context. */\nexport interface ToggleButtonGroupContextValue {\n /** Whether a given button value is currently selected. */\n isSelected: (value: string) => boolean\n /** Toggle a button value — called by a child on click. */\n toggle: (value: string) => void\n size?: ToggleButtonSize\n color?: ThemeColor\n disabled?: boolean\n // (no `fullWidth` — the group applies its own `.fullWidth` class on the container; a child only honors\n // its own `fullWidth` prop when standalone, so passing it through context would be dead state)\n}\n\nexport const ToggleButtonGroupContext = createContext<ToggleButtonGroupContextValue | null>(null)\n\n/** Read the surrounding `<ToggleButtonGroup>` (or `null` when a `<ToggleButton>` is standalone). */\nexport function useToggleButtonGroup(): ToggleButtonGroupContextValue | null {\n return useContext(ToggleButtonGroupContext)\n}\n","import { forwardRef, type ButtonHTMLAttributes, type CSSProperties, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport type { ThemeColor } from '../../theme'\nimport { useToggleButtonGroup } from './toggleButtonGroupContext'\nimport styles from './ToggleButton.module.css'\n\nexport type ToggleButtonSize = 'sm' | 'md' | 'lg'\n\nexport interface ToggleButtonProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'color' | 'value' | 'onChange'\n> {\n /** The value this button represents — its identity within a `ToggleButtonGroup`. */\n value: string\n /** Selected state for standalone use (inside a group, the group owns selection). */\n selected?: boolean\n /** Fires with the next selected state — standalone use only. */\n onChange?: (selected: boolean, value: string) => void\n /** Theme palette token tinting the selected state. Defaults to `primary`. */\n color?: ThemeColor\n /** Preset size. Defaults to `md`. */\n size?: ToggleButtonSize\n /** Stretch to fill the container width. */\n fullWidth?: boolean\n /** Button content — typically an `Icon`, text, or both. */\n children?: ReactNode\n}\n\n/**\n * A two-state button that toggles between selected and unselected — the building block of\n * `ToggleButtonGroup` (which owns selection, size, color and disabled via context), but also usable\n * standalone with `selected` + `onChange`. Selected uses the soft `filled` tint of `color` (the shared\n * `--tz-btn-rgb` pattern); `aria-pressed` reflects the state. The ref points at the `<button>`.\n */\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(function ToggleButton(\n {\n value,\n selected,\n onChange,\n color,\n size,\n fullWidth,\n disabled,\n className,\n style,\n children,\n onClick,\n ...props\n },\n ref,\n) {\n const group = useToggleButtonGroup()\n const isSelected = group ? group.isSelected(value) : (selected ?? false)\n const resolvedColor = color ?? group?.color ?? 'primary'\n const resolvedSize = size ?? group?.size ?? 'md'\n const resolvedDisabled = Boolean(disabled || group?.disabled)\n // standalone full-width uses a width:100% class; inside a group the group stretches the buttons\n const resolvedFullWidth = !group && (fullWidth ?? false)\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={clsx(\n styles.toggleButton,\n styles[resolvedSize],\n isSelected && styles.selected,\n resolvedFullWidth && styles.fullWidth,\n className,\n )}\n style={{ '--tz-btn-rgb': `var(--tz-color-${resolvedColor}-rgb)`, ...style } as CSSProperties}\n aria-pressed={isSelected}\n disabled={resolvedDisabled}\n onClick={(event) => {\n onClick?.(event)\n if (group) group.toggle(value)\n else onChange?.(!isSelected, value)\n }}\n {...props}\n >\n {children}\n </button>\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 type { ThemeColor } from '../../theme'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport { ToggleButton, type ToggleButtonSize } from './ToggleButton'\nimport {\n ToggleButtonGroupContext,\n type ToggleButtonGroupContextValue,\n} from './toggleButtonGroupContext'\nimport styles from './ToggleButton.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type ToggleButtonGroupOrientation = 'horizontal' | 'vertical'\n\n/** A data-driven button for the `options` prop. */\nexport interface ToggleButtonOption {\n value: string\n label?: ReactNode\n /** Leading icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n disabled?: boolean\n /** Accessible label (use for icon-only buttons). */\n ariaLabel?: string\n}\n\nexport interface ToggleButtonGroupProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'color' | 'onChange' | 'defaultValue'\n> {\n /**\n * Single-selection (`value` is a `string | null`, like a segmented control) vs multiple (`value` is\n * a `string[]`). Defaults to `false` (multiple), matching MUI.\n */\n exclusive?: boolean\n /** Controlled value — a `string | null` when `exclusive`, else a `string[]`. */\n value?: string | string[] | null\n /** Initial value for uncontrolled use (same shape as `value`). */\n defaultValue?: string | string[] | null\n /** Fires with the next value (matches the `exclusive` shape). */\n onChange?: (value: string | string[] | null) => void\n /** Data-driven buttons — an alternative to passing `<ToggleButton>` children. */\n options?: ToggleButtonOption[]\n /** Lay the buttons in a row or a column. Defaults to `horizontal`. */\n orientation?: ToggleButtonGroupOrientation\n /** Preset size for every button. Defaults to `md`. */\n size?: ToggleButtonSize\n /** Theme palette token tinting selected buttons. Defaults to `primary`. */\n color?: ThemeColor\n /** Disables every button in the group. */\n disabled?: boolean\n /** Stretch the group to fill the width (buttons share it equally). */\n fullWidth?: boolean\n /** `<ToggleButton>` children (used when `options` is not given). */\n children?: ReactNode\n}\n\n/**\n * Groups `<ToggleButton>`s into a joined, segmented control. **`exclusive`** picks single-selection\n * (`value` is a `string | null` — clicking the active button deselects it) vs multiple (`value` is a\n * `string[]`); both are controlled (`value` + `onChange`) or uncontrolled (`defaultValue`). Supply the\n * buttons via the data-driven `options` prop or as `<ToggleButton>` children — the group shares\n * `size`/`color`/`disabled`/`fullWidth` and the selection via context. `orientation` lays them in a\n * row or column; adjacent borders collapse so the strip reads as one control. `role=\"group\"`; styling\n * uses `--tz-*` tokens.\n */\nexport const ToggleButtonGroup = forwardRef<HTMLDivElement, ToggleButtonGroupProps>(\n function ToggleButtonGroup(\n {\n exclusive = false,\n value,\n defaultValue,\n onChange,\n options,\n orientation = 'horizontal',\n size = 'md',\n color = 'primary',\n disabled = false,\n fullWidth = 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 isSelected = (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 // click the active button to deselect (MUI behavior)\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: ToggleButtonGroupContextValue = {\n isSelected,\n toggle,\n size,\n color,\n disabled,\n }\n\n return (\n <div\n ref={ref}\n role=\"group\"\n className={clsx(\n styles.group,\n orientation === 'vertical' && styles.vertical,\n fullWidth && styles.fullWidth,\n className,\n )}\n style={style as CSSProperties}\n {...props}\n >\n <ToggleButtonGroupContext.Provider value={ctx}>\n {options\n ? options.map((option) => (\n <ToggleButton\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n aria-label={option.ariaLabel}\n >\n {option.icon != null &&\n (typeof option.icon === 'string' && ICON_NAME_SET.has(option.icon) ? (\n <Icon name={option.icon as IconName} />\n ) : (\n option.icon\n ))}\n {option.label}\n </ToggleButton>\n ))\n : children}\n </ToggleButtonGroupContext.Provider>\n </div>\n )\n },\n)\n"],"names":["ToggleButtonGroupContext","createContext","useToggleButtonGroup","useContext","ToggleButton","forwardRef","value","selected","onChange","color","size","fullWidth","disabled","className","style","children","onClick","props","ref","group","isSelected","resolvedColor","resolvedSize","resolvedDisabled","resolvedFullWidth","jsx","clsx","styles","event","ICON_NAME_SET","ICON_NAMES","ToggleButtonGroup","exclusive","defaultValue","options","orientation","isControlled","internal","setInternal","useState","current","ctx","v","next","arr","x","option","jsxs","Icon"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as f, jsxs as E } from "react/jsx-runtime";
|
|
2
2
|
import { useContext as j, createContext as w, forwardRef as N, useState as M } from "react";
|
|
3
3
|
import { clsx as W } from "clsx";
|
|
4
|
-
import { b as O, a as D } from "./Icon-
|
|
4
|
+
import { b as O, a as D } from "./Icon-DMMO32p6.js";
|
|
5
5
|
const p = w(null);
|
|
6
6
|
function F() {
|
|
7
7
|
return j(p);
|
|
@@ -119,4 +119,4 @@ export {
|
|
|
119
119
|
Q as T,
|
|
120
120
|
C as a
|
|
121
121
|
};
|
|
122
|
-
//# sourceMappingURL=ToggleButtonGroup-
|
|
122
|
+
//# sourceMappingURL=ToggleButtonGroup-D3Jltv0z.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToggleButtonGroup-K6ZcrTZT.js","sources":["../src/components/ToggleButton/toggleButtonGroupContext.ts","../src/components/ToggleButton/ToggleButton.tsx","../src/components/ToggleButton/ToggleButtonGroup.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { ThemeColor } from '../../theme'\nimport type { ToggleButtonSize } from './ToggleButton'\n\n/** Shared state a `<ToggleButtonGroup>` hands down to its `<ToggleButton>` children via context. */\nexport interface ToggleButtonGroupContextValue {\n /** Whether a given button value is currently selected. */\n isSelected: (value: string) => boolean\n /** Toggle a button value — called by a child on click. */\n toggle: (value: string) => void\n size?: ToggleButtonSize\n color?: ThemeColor\n disabled?: boolean\n // (no `fullWidth` — the group applies its own `.fullWidth` class on the container; a child only honors\n // its own `fullWidth` prop when standalone, so passing it through context would be dead state)\n}\n\nexport const ToggleButtonGroupContext = createContext<ToggleButtonGroupContextValue | null>(null)\n\n/** Read the surrounding `<ToggleButtonGroup>` (or `null` when a `<ToggleButton>` is standalone). */\nexport function useToggleButtonGroup(): ToggleButtonGroupContextValue | null {\n return useContext(ToggleButtonGroupContext)\n}\n","import { forwardRef, type ButtonHTMLAttributes, type CSSProperties, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport type { ThemeColor } from '../../theme'\nimport { useToggleButtonGroup } from './toggleButtonGroupContext'\nimport styles from './ToggleButton.module.css'\n\nexport type ToggleButtonSize = 'sm' | 'md' | 'lg'\n\nexport interface ToggleButtonProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'color' | 'value' | 'onChange'\n> {\n /** The value this button represents — its identity within a `ToggleButtonGroup`. */\n value: string\n /** Selected state for standalone use (inside a group, the group owns selection). */\n selected?: boolean\n /** Fires with the next selected state — standalone use only. */\n onChange?: (selected: boolean, value: string) => void\n /** Theme palette token tinting the selected state. Defaults to `primary`. */\n color?: ThemeColor\n /** Preset size. Defaults to `md`. */\n size?: ToggleButtonSize\n /** Stretch to fill the container width. */\n fullWidth?: boolean\n /** Button content — typically an `Icon`, text, or both. */\n children?: ReactNode\n}\n\n/**\n * A two-state button that toggles between selected and unselected — the building block of\n * `ToggleButtonGroup` (which owns selection, size, color and disabled via context), but also usable\n * standalone with `selected` + `onChange`. Selected uses the soft `filled` tint of `color` (the shared\n * `--tz-btn-rgb` pattern); `aria-pressed` reflects the state. The ref points at the `<button>`.\n */\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(function ToggleButton(\n {\n value,\n selected,\n onChange,\n color,\n size,\n fullWidth,\n disabled,\n className,\n style,\n children,\n onClick,\n ...props\n },\n ref,\n) {\n const group = useToggleButtonGroup()\n const isSelected = group ? group.isSelected(value) : (selected ?? false)\n const resolvedColor = color ?? group?.color ?? 'primary'\n const resolvedSize = size ?? group?.size ?? 'md'\n const resolvedDisabled = Boolean(disabled || group?.disabled)\n // standalone full-width uses a width:100% class; inside a group the group stretches the buttons\n const resolvedFullWidth = !group && (fullWidth ?? false)\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={clsx(\n styles.toggleButton,\n styles[resolvedSize],\n isSelected && styles.selected,\n resolvedFullWidth && styles.fullWidth,\n className,\n )}\n style={{ '--tz-btn-rgb': `var(--tz-color-${resolvedColor}-rgb)`, ...style } as CSSProperties}\n aria-pressed={isSelected}\n disabled={resolvedDisabled}\n onClick={(event) => {\n onClick?.(event)\n if (group) group.toggle(value)\n else onChange?.(!isSelected, value)\n }}\n {...props}\n >\n {children}\n </button>\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 type { ThemeColor } from '../../theme'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport { ToggleButton, type ToggleButtonSize } from './ToggleButton'\nimport {\n ToggleButtonGroupContext,\n type ToggleButtonGroupContextValue,\n} from './toggleButtonGroupContext'\nimport styles from './ToggleButton.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type ToggleButtonGroupOrientation = 'horizontal' | 'vertical'\n\n/** A data-driven button for the `options` prop. */\nexport interface ToggleButtonOption {\n value: string\n label?: ReactNode\n /** Leading icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n disabled?: boolean\n /** Accessible label (use for icon-only buttons). */\n ariaLabel?: string\n}\n\nexport interface ToggleButtonGroupProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'color' | 'onChange' | 'defaultValue'\n> {\n /**\n * Single-selection (`value` is a `string | null`, like a segmented control) vs multiple (`value` is\n * a `string[]`). Defaults to `false` (multiple), matching MUI.\n */\n exclusive?: boolean\n /** Controlled value — a `string | null` when `exclusive`, else a `string[]`. */\n value?: string | string[] | null\n /** Initial value for uncontrolled use (same shape as `value`). */\n defaultValue?: string | string[] | null\n /** Fires with the next value (matches the `exclusive` shape). */\n onChange?: (value: string | string[] | null) => void\n /** Data-driven buttons — an alternative to passing `<ToggleButton>` children. */\n options?: ToggleButtonOption[]\n /** Lay the buttons in a row or a column. Defaults to `horizontal`. */\n orientation?: ToggleButtonGroupOrientation\n /** Preset size for every button. Defaults to `md`. */\n size?: ToggleButtonSize\n /** Theme palette token tinting selected buttons. Defaults to `primary`. */\n color?: ThemeColor\n /** Disables every button in the group. */\n disabled?: boolean\n /** Stretch the group to fill the width (buttons share it equally). */\n fullWidth?: boolean\n /** `<ToggleButton>` children (used when `options` is not given). */\n children?: ReactNode\n}\n\n/**\n * Groups `<ToggleButton>`s into a joined, segmented control. **`exclusive`** picks single-selection\n * (`value` is a `string | null` — clicking the active button deselects it) vs multiple (`value` is a\n * `string[]`); both are controlled (`value` + `onChange`) or uncontrolled (`defaultValue`). Supply the\n * buttons via the data-driven `options` prop or as `<ToggleButton>` children — the group shares\n * `size`/`color`/`disabled`/`fullWidth` and the selection via context. `orientation` lays them in a\n * row or column; adjacent borders collapse so the strip reads as one control. `role=\"group\"`; styling\n * uses `--tz-*` tokens.\n */\nexport const ToggleButtonGroup = forwardRef<HTMLDivElement, ToggleButtonGroupProps>(\n function ToggleButtonGroup(\n {\n exclusive = false,\n value,\n defaultValue,\n onChange,\n options,\n orientation = 'horizontal',\n size = 'md',\n color = 'primary',\n disabled = false,\n fullWidth = 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 isSelected = (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 // click the active button to deselect (MUI behavior)\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: ToggleButtonGroupContextValue = {\n isSelected,\n toggle,\n size,\n color,\n disabled,\n }\n\n return (\n <div\n ref={ref}\n role=\"group\"\n className={clsx(\n styles.group,\n orientation === 'vertical' && styles.vertical,\n fullWidth && styles.fullWidth,\n className,\n )}\n style={style as CSSProperties}\n {...props}\n >\n <ToggleButtonGroupContext.Provider value={ctx}>\n {options\n ? options.map((option) => (\n <ToggleButton\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n aria-label={option.ariaLabel}\n >\n {option.icon != null &&\n (typeof option.icon === 'string' && ICON_NAME_SET.has(option.icon) ? (\n <Icon name={option.icon as IconName} />\n ) : (\n option.icon\n ))}\n {option.label}\n </ToggleButton>\n ))\n : children}\n </ToggleButtonGroupContext.Provider>\n </div>\n )\n },\n)\n"],"names":["ToggleButtonGroupContext","createContext","useToggleButtonGroup","useContext","ToggleButton","forwardRef","value","selected","onChange","color","size","fullWidth","disabled","className","style","children","onClick","props","ref","group","isSelected","resolvedColor","resolvedSize","resolvedDisabled","resolvedFullWidth","jsx","clsx","styles","event","ICON_NAME_SET","ICON_NAMES","ToggleButtonGroup","exclusive","defaultValue","options","orientation","isControlled","internal","setInternal","useState","current","ctx","v","next","arr","x","option","jsxs","Icon"],"mappings":";;;;AAiBO,MAAMA,IAA2BC,EAAoD,IAAI;AAGzF,SAASC,IAA6D;AAC3E,SAAOC,EAAWH,CAAwB;AAC5C;;;;;;;;;;GCYaI,IAAeC,EAAiD,SAC3E;AAAA,EACE,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAQjB,EAAA,GACRkB,IAAaD,IAAQA,EAAM,WAAWb,CAAK,IAAKC,KAAY,IAC5Dc,IAAgBZ,MAASU,KAAA,gBAAAA,EAAO,UAAS,WACzCG,IAAeZ,MAAQS,KAAA,gBAAAA,EAAO,SAAQ,MACtCI,IAAmB,GAAQX,KAAYO,KAAA,QAAAA,EAAO,WAE9CK,IAAoB,CAACL,MAAUR,KAAa;AAElD,SACE,gBAAAc;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAP;AAAA,MACA,MAAK;AAAA,MACL,WAAWQ;AAAA,QACTC,EAAO;AAAA,QACPA,EAAOL,CAAY;AAAA,QACnBF,KAAcO,EAAO;AAAA,QACrBH,KAAqBG,EAAO;AAAA,QAC5Bd;AAAA,MAAA;AAAA,MAEF,OAAO,EAAE,gBAAgB,kBAAkBQ,CAAa,SAAS,GAAGP,EAAA;AAAA,MACpE,gBAAcM;AAAA,MACd,UAAUG;AAAA,MACV,SAAS,CAACK,MAAU;AAClB,QAAAZ,KAAA,QAAAA,EAAUY,IACNT,IAAOA,EAAM,OAAOb,CAAK,IACxBE,KAAA,QAAAA,EAAW,CAACY,GAAYd;AAAA,MAC/B;AAAA,MACC,GAAGW;AAAA,MAEH,UAAAF;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC,GCjEKc,IAAgB,IAAI,IAAYC,CAAU,GAuDnCC,IAAoB1B;AAAA,EAC/B,SACE;AAAA,IACE,WAAA2B,IAAY;AAAA,IACZ,OAAA1B;AAAA,IACA,cAAA2B;AAAA,IACA,UAAAzB;AAAA,IACA,SAAA0B;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,MAAAzB,IAAO;AAAA,IACP,OAAAD,IAAQ;AAAA,IACR,UAAAG,IAAW;AAAA,IACX,WAAAD,IAAY;AAAA,IACZ,UAAAI;AAAA,IACA,WAAAF;AAAA,IACA,OAAAC;AAAA,IACA,GAAGG;AAAA,EAAA,GAELC,GACA;AACA,UAAMkB,IAAe9B,MAAU,QACzB,CAAC+B,GAAUC,CAAW,IAAIC,EAA+CN,CAAY,GACrFO,IAAUJ,IAAe9B,IAAQ+B,GAiBjCI,IAAqC;AAAA,MACzC,YAhBiB,CAACC,MAClBV,IAAYQ,MAAYE,IAAI,MAAM,QAAQF,CAAO,KAAKA,EAAQ,SAASE,CAAC;AAAA,MAgBxE,QAda,CAACA,MAAc;AAC5B,YAAIC;AACJ,YAAIX;AACF,UAAAW,IAAOH,MAAYE,IAAI,OAAOA;AAAA,aACzB;AACL,gBAAME,IAAM,MAAM,QAAQJ,CAAO,IAAIA,IAAU,CAAA;AAC/C,UAAAG,IAAOC,EAAI,SAASF,CAAC,IAAIE,EAAI,OAAO,CAACC,MAAMA,MAAMH,CAAC,IAAI,CAAC,GAAGE,GAAKF,CAAC;AAAA,QAClE;AACA,QAAKN,KAAcE,EAAYK,CAAI,GACnCnC,KAAA,QAAAA,EAAWmC;AAAA,MACb;AAAA,MAKE,MAAAjC;AAAA,MACA,OAAAD;AAAA,MACA,UAAAG;AAAA,IAAA;AAGF,WACE,gBAAAa;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAP;AAAA,QACA,MAAK;AAAA,QACL,WAAWQ;AAAA,UACTC,EAAO;AAAA,UACPQ,MAAgB,cAAcR,EAAO;AAAA,UACrChB,KAAagB,EAAO;AAAA,UACpBd;AAAA,QAAA;AAAA,QAEF,OAAAC;AAAA,QACC,GAAGG;AAAA,QAEJ,UAAA,gBAAAQ,EAACzB,EAAyB,UAAzB,EAAkC,OAAOyC,GACvC,UAAAP,IACGA,EAAQ,IAAI,CAACY,MACX,gBAAAC;AAAA,UAAC3C;AAAA,UAAA;AAAA,YAEC,OAAO0C,EAAO;AAAA,YACd,UAAUA,EAAO;AAAA,YACjB,cAAYA,EAAO;AAAA,YAElB,UAAA;AAAA,cAAAA,EAAO,QAAQ,SACb,OAAOA,EAAO,QAAS,YAAYjB,EAAc,IAAIiB,EAAO,IAAI,IAC/D,gBAAArB,EAACuB,GAAA,EAAK,MAAMF,EAAO,KAAA,CAAkB,IAErCA,EAAO;AAAA,cAEVA,EAAO;AAAA,YAAA;AAAA,UAAA;AAAA,UAXHA,EAAO;AAAA,QAAA,CAaf,IACD/B,EAAA,CACN;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;"}
|
|
1
|
+
{"version":3,"file":"ToggleButtonGroup-D3Jltv0z.js","sources":["../src/components/ToggleButton/toggleButtonGroupContext.ts","../src/components/ToggleButton/ToggleButton.tsx","../src/components/ToggleButton/ToggleButtonGroup.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { ThemeColor } from '../../theme'\nimport type { ToggleButtonSize } from './ToggleButton'\n\n/** Shared state a `<ToggleButtonGroup>` hands down to its `<ToggleButton>` children via context. */\nexport interface ToggleButtonGroupContextValue {\n /** Whether a given button value is currently selected. */\n isSelected: (value: string) => boolean\n /** Toggle a button value — called by a child on click. */\n toggle: (value: string) => void\n size?: ToggleButtonSize\n color?: ThemeColor\n disabled?: boolean\n // (no `fullWidth` — the group applies its own `.fullWidth` class on the container; a child only honors\n // its own `fullWidth` prop when standalone, so passing it through context would be dead state)\n}\n\nexport const ToggleButtonGroupContext = createContext<ToggleButtonGroupContextValue | null>(null)\n\n/** Read the surrounding `<ToggleButtonGroup>` (or `null` when a `<ToggleButton>` is standalone). */\nexport function useToggleButtonGroup(): ToggleButtonGroupContextValue | null {\n return useContext(ToggleButtonGroupContext)\n}\n","import { forwardRef, type ButtonHTMLAttributes, type CSSProperties, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport type { ThemeColor } from '../../theme'\nimport { useToggleButtonGroup } from './toggleButtonGroupContext'\nimport styles from './ToggleButton.module.css'\n\nexport type ToggleButtonSize = 'sm' | 'md' | 'lg'\n\nexport interface ToggleButtonProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'color' | 'value' | 'onChange'\n> {\n /** The value this button represents — its identity within a `ToggleButtonGroup`. */\n value: string\n /** Selected state for standalone use (inside a group, the group owns selection). */\n selected?: boolean\n /** Fires with the next selected state — standalone use only. */\n onChange?: (selected: boolean, value: string) => void\n /** Theme palette token tinting the selected state. Defaults to `primary`. */\n color?: ThemeColor\n /** Preset size. Defaults to `md`. */\n size?: ToggleButtonSize\n /** Stretch to fill the container width. */\n fullWidth?: boolean\n /** Button content — typically an `Icon`, text, or both. */\n children?: ReactNode\n}\n\n/**\n * A two-state button that toggles between selected and unselected — the building block of\n * `ToggleButtonGroup` (which owns selection, size, color and disabled via context), but also usable\n * standalone with `selected` + `onChange`. Selected uses the soft `filled` tint of `color` (the shared\n * `--tz-btn-rgb` pattern); `aria-pressed` reflects the state. The ref points at the `<button>`.\n */\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(function ToggleButton(\n {\n value,\n selected,\n onChange,\n color,\n size,\n fullWidth,\n disabled,\n className,\n style,\n children,\n onClick,\n ...props\n },\n ref,\n) {\n const group = useToggleButtonGroup()\n const isSelected = group ? group.isSelected(value) : (selected ?? false)\n const resolvedColor = color ?? group?.color ?? 'primary'\n const resolvedSize = size ?? group?.size ?? 'md'\n const resolvedDisabled = Boolean(disabled || group?.disabled)\n // standalone full-width uses a width:100% class; inside a group the group stretches the buttons\n const resolvedFullWidth = !group && (fullWidth ?? false)\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={clsx(\n styles.toggleButton,\n styles[resolvedSize],\n isSelected && styles.selected,\n resolvedFullWidth && styles.fullWidth,\n className,\n )}\n style={{ '--tz-btn-rgb': `var(--tz-color-${resolvedColor}-rgb)`, ...style } as CSSProperties}\n aria-pressed={isSelected}\n disabled={resolvedDisabled}\n onClick={(event) => {\n onClick?.(event)\n if (group) group.toggle(value)\n else onChange?.(!isSelected, value)\n }}\n {...props}\n >\n {children}\n </button>\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 type { ThemeColor } from '../../theme'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport { ToggleButton, type ToggleButtonSize } from './ToggleButton'\nimport {\n ToggleButtonGroupContext,\n type ToggleButtonGroupContextValue,\n} from './toggleButtonGroupContext'\nimport styles from './ToggleButton.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type ToggleButtonGroupOrientation = 'horizontal' | 'vertical'\n\n/** A data-driven button for the `options` prop. */\nexport interface ToggleButtonOption {\n value: string\n label?: ReactNode\n /** Leading icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n disabled?: boolean\n /** Accessible label (use for icon-only buttons). */\n ariaLabel?: string\n}\n\nexport interface ToggleButtonGroupProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'color' | 'onChange' | 'defaultValue'\n> {\n /**\n * Single-selection (`value` is a `string | null`, like a segmented control) vs multiple (`value` is\n * a `string[]`). Defaults to `false` (multiple), matching MUI.\n */\n exclusive?: boolean\n /** Controlled value — a `string | null` when `exclusive`, else a `string[]`. */\n value?: string | string[] | null\n /** Initial value for uncontrolled use (same shape as `value`). */\n defaultValue?: string | string[] | null\n /** Fires with the next value (matches the `exclusive` shape). */\n onChange?: (value: string | string[] | null) => void\n /** Data-driven buttons — an alternative to passing `<ToggleButton>` children. */\n options?: ToggleButtonOption[]\n /** Lay the buttons in a row or a column. Defaults to `horizontal`. */\n orientation?: ToggleButtonGroupOrientation\n /** Preset size for every button. Defaults to `md`. */\n size?: ToggleButtonSize\n /** Theme palette token tinting selected buttons. Defaults to `primary`. */\n color?: ThemeColor\n /** Disables every button in the group. */\n disabled?: boolean\n /** Stretch the group to fill the width (buttons share it equally). */\n fullWidth?: boolean\n /** `<ToggleButton>` children (used when `options` is not given). */\n children?: ReactNode\n}\n\n/**\n * Groups `<ToggleButton>`s into a joined, segmented control. **`exclusive`** picks single-selection\n * (`value` is a `string | null` — clicking the active button deselects it) vs multiple (`value` is a\n * `string[]`); both are controlled (`value` + `onChange`) or uncontrolled (`defaultValue`). Supply the\n * buttons via the data-driven `options` prop or as `<ToggleButton>` children — the group shares\n * `size`/`color`/`disabled`/`fullWidth` and the selection via context. `orientation` lays them in a\n * row or column; adjacent borders collapse so the strip reads as one control. `role=\"group\"`; styling\n * uses `--tz-*` tokens.\n */\nexport const ToggleButtonGroup = forwardRef<HTMLDivElement, ToggleButtonGroupProps>(\n function ToggleButtonGroup(\n {\n exclusive = false,\n value,\n defaultValue,\n onChange,\n options,\n orientation = 'horizontal',\n size = 'md',\n color = 'primary',\n disabled = false,\n fullWidth = 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 isSelected = (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 // click the active button to deselect (MUI behavior)\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: ToggleButtonGroupContextValue = {\n isSelected,\n toggle,\n size,\n color,\n disabled,\n }\n\n return (\n <div\n ref={ref}\n role=\"group\"\n className={clsx(\n styles.group,\n orientation === 'vertical' && styles.vertical,\n fullWidth && styles.fullWidth,\n className,\n )}\n style={style as CSSProperties}\n {...props}\n >\n <ToggleButtonGroupContext.Provider value={ctx}>\n {options\n ? options.map((option) => (\n <ToggleButton\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n aria-label={option.ariaLabel}\n >\n {option.icon != null &&\n (typeof option.icon === 'string' && ICON_NAME_SET.has(option.icon) ? (\n <Icon name={option.icon as IconName} />\n ) : (\n option.icon\n ))}\n {option.label}\n </ToggleButton>\n ))\n : children}\n </ToggleButtonGroupContext.Provider>\n </div>\n )\n },\n)\n"],"names":["ToggleButtonGroupContext","createContext","useToggleButtonGroup","useContext","ToggleButton","forwardRef","value","selected","onChange","color","size","fullWidth","disabled","className","style","children","onClick","props","ref","group","isSelected","resolvedColor","resolvedSize","resolvedDisabled","resolvedFullWidth","jsx","clsx","styles","event","ICON_NAME_SET","ICON_NAMES","ToggleButtonGroup","exclusive","defaultValue","options","orientation","isControlled","internal","setInternal","useState","current","ctx","v","next","arr","x","option","jsxs","Icon"],"mappings":"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"}
|
|
@@ -2,10 +2,10 @@ import { jsx as m } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as D, useState as J, useRef as b, useEffect as j } from "react";
|
|
3
3
|
import { u as M } from "./formContext-B7ln1Miy.js";
|
|
4
4
|
import { b as R } from "./translations-D15tFHM1.js";
|
|
5
|
-
import { f as P } from "./messages-
|
|
6
|
-
import { F as Q } from "./Flag-
|
|
7
|
-
import { T as U } from "./Tabs-
|
|
8
|
-
import { a as X, j as Y, t as Z } from "./ConfigProvider-
|
|
5
|
+
import { f as P } from "./messages-CZbb1xNN.js";
|
|
6
|
+
import { F as Q } from "./Flag-IQolG3j6.js";
|
|
7
|
+
import { T as U } from "./Tabs-lezN63jW.js";
|
|
8
|
+
import { a as X, j as Y, t as Z } from "./ConfigProvider-bXX8dnhY.js";
|
|
9
9
|
const $ = "_fields_aawaf_4", ee = {
|
|
10
10
|
fields: $
|
|
11
11
|
}, ue = D(
|
|
@@ -83,4 +83,4 @@ const $ = "_fields_aawaf_4", ee = {
|
|
|
83
83
|
export {
|
|
84
84
|
ue as T
|
|
85
85
|
};
|
|
86
|
-
//# sourceMappingURL=TranslatedFields-
|
|
86
|
+
//# sourceMappingURL=TranslatedFields-C8oxlGIQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranslatedFields-CHHtXO_n.js","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useT, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport { flagFor } from '../../i18n/messages'\nimport type { IconName } from '../../icons/names'\nimport { Flag } from '../Flag'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /**\n * Show each locale's **flag** on its tab (matched by the language via `flagFor`). A language with no\n * built-in flag falls back to the `icon`. Defaults to `true`; pass `false` to always use `icon`.\n */\n showFlags?: boolean\n /** Fallback icon shown on a locale tab when its language has no flag (or `showFlags={false}`). Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to the localized `translatedFields.label` (\"Translations\"). */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). Each tab shows its language's **flag**\n * (matched via `flagFor`); a language with no built-in flag falls back to the `icon` (a `Global` icon by\n * default), and `showFlags={false}` uses the `icon` for every tab. While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n showFlags = true,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabelProp,\n className,\n style,\n },\n ref,\n ) {\n const t = useT()\n const ariaLabel = ariaLabelProp ?? t('translatedFields.label')\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n // the locale's flag when it has one (and flags are enabled), else the fallback `icon` (Global)\n icon: showFlags && flagFor(loc.code) ? <Flag code={loc.code} /> : icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","showFlags","icon","variant","size","ariaLabelProp","className","style","ref","t","useT","ariaLabel","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","flagFor","jsx","Flag","styles","field","Tabs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TranslatedFields-C8oxlGIQ.js","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useT, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport { flagFor } from '../../i18n/messages'\nimport type { IconName } from '../../icons/names'\nimport { Flag } from '../Flag'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /**\n * Show each locale's **flag** on its tab (matched by the language via `flagFor`). A language with no\n * built-in flag falls back to the `icon`. Defaults to `true`; pass `false` to always use `icon`.\n */\n showFlags?: boolean\n /** Fallback icon shown on a locale tab when its language has no flag (or `showFlags={false}`). Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to the localized `translatedFields.label` (\"Translations\"). */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). Each tab shows its language's **flag**\n * (matched via `flagFor`); a language with no built-in flag falls back to the `icon` (a `Global` icon by\n * default), and `showFlags={false}` uses the `icon` for every tab. While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n showFlags = true,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabelProp,\n className,\n style,\n },\n ref,\n ) {\n const t = useT()\n const ariaLabel = ariaLabelProp ?? t('translatedFields.label')\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n // the locale's flag when it has one (and flags are enabled), else the fallback `icon` (Global)\n icon: showFlags && flagFor(loc.code) ? <Flag code={loc.code} /> : icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","showFlags","icon","variant","size","ariaLabelProp","className","style","ref","t","useT","ariaLabel","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","flagFor","jsx","Flag","styles","field","Tabs"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const b=require("react/jsx-runtime"),c=require("react"),z=require("./formContext-bTWrqdEV.cjs"),j=require("./translations-CXEeeUDL.cjs"),D=require("./messages-
|
|
2
|
-
//# sourceMappingURL=TranslatedFields-
|
|
1
|
+
"use strict";const b=require("react/jsx-runtime"),c=require("react"),z=require("./formContext-bTWrqdEV.cjs"),j=require("./translations-CXEeeUDL.cjs"),D=require("./messages-D4ooXnUr.cjs"),J=require("./Flag-CWp81_zX.cjs"),M=require("./Tabs-D6qrgZTM.cjs"),y=require("./ConfigProvider-BFhkb0BV.cjs"),Q="_fields_aawaf_4",U={fields:Q},X=c.forwardRef(function({children:x,locales:S,namespace:N,value:q,defaultValue:w,onChange:f,showFlags:A=!0,icon:K="Global",variant:O,size:W,"aria-label":g,className:k,style:C},l){var R;const E=y.useT(),L=g??E("translatedFields.label"),_=y.useLocales(),i=S??_,I=y.useTranslationsNamespace(),T=N??I,s=z.useFormContext(),p=q!==void 0,[B,G]=c.useState(w),a=(p?q:B)??((R=i[0])==null?void 0:R.code)??"",v=e=>{p||G(e),f==null||f(e)},u=e=>j.buildTranslationName(e,"",T),H=e=>!!s&&Object.keys(s.errors).some(t=>t.startsWith(u(e))&&(s.isSubmitted||s.touched[t]===!0)),F=c.useRef(null),P=e=>{F.current=e,typeof l=="function"?l(e):l&&(l.current=e)},h=c.useRef(0),d=c.useRef(null);if(c.useEffect(()=>{const e=(s==null?void 0:s.submitCount)??0;if(!s||e===h.current)return;h.current=e;const t=Object.keys(s.errors);if(t.length===0)return;const r=o=>i.some(m=>o.startsWith(u(m.code)));if(!t.every(r)||t.some(o=>o.startsWith(u(a))))return;const n=i.find(o=>t.some(m=>m.startsWith(u(o.code))));n&&n.code!==a&&(d.current=n.code,v(n.code))},[s==null?void 0:s.submitCount]),c.useEffect(()=>{var n;if(d.current==null||d.current!==a)return;d.current=null;const e=F.current;if(!e||!s)return;const t=new Set(Object.keys(s.errors)),r=Array.from(e.querySelectorAll("[name]")).find(o=>t.has(o.getAttribute("name")??""));(n=r==null?void 0:r.scrollIntoView)==null||n.call(r,{behavior:"smooth",block:"center"}),r==null||r.focus({preventScroll:!0})},[a]),i.length===0)return null;const V=i.map(e=>({value:e.code,label:e.label??e.code,icon:A&&D.flagFor(e.code)?b.jsx(J.Flag,{code:e.code}):K,error:H(e.code),content:b.jsx("div",{className:U.fields,children:x(t=>j.buildTranslationName(e.code,t,T),e.code)},e.code)}));return b.jsx(M.Tabs,{ref:P,className:k,style:C,items:V,value:a,onChange:v,variant:O,size:W,queryKey:null,"aria-label":L})});exports.TranslatedFields=X;
|
|
2
|
+
//# sourceMappingURL=TranslatedFields-Che_ZPHk.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranslatedFields-BYpMrYaw.cjs","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useT, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport { flagFor } from '../../i18n/messages'\nimport type { IconName } from '../../icons/names'\nimport { Flag } from '../Flag'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /**\n * Show each locale's **flag** on its tab (matched by the language via `flagFor`). A language with no\n * built-in flag falls back to the `icon`. Defaults to `true`; pass `false` to always use `icon`.\n */\n showFlags?: boolean\n /** Fallback icon shown on a locale tab when its language has no flag (or `showFlags={false}`). Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to the localized `translatedFields.label` (\"Translations\"). */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). Each tab shows its language's **flag**\n * (matched via `flagFor`); a language with no built-in flag falls back to the `icon` (a `Global` icon by\n * default), and `showFlags={false}` uses the `icon` for every tab. While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n showFlags = true,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabelProp,\n className,\n style,\n },\n ref,\n ) {\n const t = useT()\n const ariaLabel = ariaLabelProp ?? t('translatedFields.label')\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n // the locale's flag when it has one (and flags are enabled), else the fallback `icon` (Global)\n icon: showFlags && flagFor(loc.code) ? <Flag code={loc.code} /> : icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","showFlags","icon","variant","size","ariaLabelProp","className","style","ref","t","useT","ariaLabel","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","flagFor","jsx","Flag","styles","field","Tabs"],"mappings":"yUAsEaA,EAAmBC,EAAAA,WAC9B,SACE,CACE,SAAAC,EACA,QAASC,EACT,UAAWC,EACX,MAAAC,EACA,aAAAC,EACA,SAAAC,EACA,UAAAC,EAAY,GACZ,KAAAC,EAAO,SACP,QAAAC,EACA,KAAAC,EACA,aAAcC,EACd,UAAAC,EACA,MAAAC,CAAA,EAEFC,EACA,OACA,MAAMC,EAAIC,EAAAA,KAAA,EACJC,EAAYN,GAAiBI,EAAE,wBAAwB,EACvDG,EAAgBC,EAAAA,WAAA,EAChBC,EAAUlB,GAAegB,EAEzBG,EAAkBC,EAAAA,yBAAA,EAClBC,EAAYpB,GAAiBkB,EAC7BG,EAAOC,EAAAA,eAAA,EAGPC,EAAetB,IAAU,OACzB,CAACuB,EAAUC,CAAW,EAAIC,EAAAA,SAA6BxB,CAAY,EACnEyB,GAAUJ,EAAetB,EAAQuB,MAAaI,EAAAX,EAAQ,CAAC,IAAT,YAAAW,EAAY,OAAQ,GAClEC,EAAaC,GAAiB,CAC7BP,GAAcE,EAAYK,CAAI,EACnC3B,GAAA,MAAAA,EAAW2B,EACb,EAGMC,EAAYC,GAAiBC,EAAAA,qBAAqBD,EAAM,GAAIZ,CAAS,EAErEc,EAAkBF,GACtB,CAAC,CAACX,GACF,OAAO,KAAKA,EAAK,MAAM,EAAE,KACtBc,GAAQA,EAAI,WAAWJ,EAASC,CAAI,CAAC,IAAMX,EAAK,aAAeA,EAAK,QAAQc,CAAG,IAAM,GAAA,EAIpFC,EAAUC,EAAAA,OAA8B,IAAI,EAC5CC,EAAcC,GAAgC,CAClDH,EAAQ,QAAUG,EACd,OAAO5B,GAAQ,WAAYA,EAAI4B,CAAI,EAC9B5B,IAAMA,EAA2C,QAAU4B,EACtE,EAIMC,EAAaH,EAAAA,OAAO,CAAC,EACrBI,EAAeJ,EAAAA,OAAsB,IAAI,EAmC/C,GAlCAK,EAAAA,UAAU,IAAM,CACd,MAAMC,GAAQtB,GAAA,YAAAA,EAAM,cAAe,EACnC,GAAI,CAACA,GAAQsB,IAAUH,EAAW,QAAS,OAC3CA,EAAW,QAAUG,EACrB,MAAMC,EAAY,OAAO,KAAKvB,EAAK,MAAM,EACzC,GAAIuB,EAAU,SAAW,EAAG,OAC5B,MAAMC,EAAoBC,GAAc7B,EAAQ,KAAM8B,GAAMD,EAAE,WAAWf,EAASgB,EAAE,IAAI,CAAC,CAAC,EAI1F,GAFI,CAACH,EAAU,MAAMC,CAAgB,GAEjCD,EAAU,KAAME,GAAMA,EAAE,WAAWf,EAASJ,CAAM,CAAC,CAAC,EAAG,OAC3D,MAAMqB,EAAW/B,EAAQ,KAAM8B,GAAMH,EAAU,KAAME,GAAMA,EAAE,WAAWf,EAASgB,EAAE,IAAI,CAAC,CAAC,CAAC,EACtFC,GAAYA,EAAS,OAASrB,IAChCc,EAAa,QAAUO,EAAS,KAChCnB,EAAUmB,EAAS,IAAI,EAG3B,EAAG,CAAC3B,GAAA,YAAAA,EAAM,WAAW,CAAC,EAGtBqB,EAAAA,UAAU,IAAM,OACd,GAAID,EAAa,SAAW,MAAQA,EAAa,UAAYd,EAAQ,OACrEc,EAAa,QAAU,KACvB,MAAMQ,EAAOb,EAAQ,QACrB,GAAI,CAACa,GAAQ,CAAC5B,EAAM,OACpB,MAAMuB,EAAY,IAAI,IAAI,OAAO,KAAKvB,EAAK,MAAM,CAAC,EAC5C6B,EAAS,MAAM,KAAKD,EAAK,iBAA8B,QAAQ,CAAC,EAAE,KAAME,GAC5EP,EAAU,IAAIO,EAAG,aAAa,MAAM,GAAK,EAAE,CAAA,GAE7CvB,EAAAsB,GAAA,YAAAA,EAAQ,iBAAR,MAAAtB,EAAA,KAAAsB,EAAyB,CAAE,SAAU,SAAU,MAAO,WACtDA,GAAA,MAAAA,EAAQ,MAAM,CAAE,cAAe,EAAA,EAEjC,EAAG,CAACvB,CAAM,CAAC,EAEPV,EAAQ,SAAW,EAAG,OAAO,KAEjC,MAAMmC,EAAQnC,EAAQ,IAAKoC,IAAS,CAClC,MAAOA,EAAI,KACX,MAAOA,EAAI,OAASA,EAAI,KAExB,KAAMjD,GAAakD,EAAAA,QAAQD,EAAI,IAAI,EAAIE,EAAAA,IAACC,EAAAA,KAAA,CAAK,KAAMH,EAAI,IAAA,CAAM,EAAKhD,EAElE,MAAO6B,EAAemB,EAAI,IAAI,EAE9B,QACEE,EAAAA,IAAC,MAAA,CAAmB,UAAWE,EAAO,OACnC,WAAUC,GAAUzB,EAAAA,qBAAqBoB,EAAI,KAAMK,EAAOtC,CAAS,EAAGiC,EAAI,IAAI,GADvEA,EAAI,IAEd,CAAA,EAEF,EAEF,OACEE,EAAAA,IAACI,EAAAA,KAAA,CACC,IAAKrB,EACL,UAAA7B,EACA,MAAAC,EACA,MAAA0C,EACA,MAAOzB,EACP,SAAUE,EACV,QAAAvB,EACA,KAAAC,EAEA,SAAU,KACV,aAAYO,CAAA,CAAA,CAGlB,CACF"}
|
|
1
|
+
{"version":3,"file":"TranslatedFields-Che_ZPHk.cjs","sources":["../src/components/TranslatedFields/TranslatedFields.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { useFormContext } from '../../form/formContext'\nimport { useLocales, useT, useTranslationsNamespace, type LocaleConfig } from '../../theme'\nimport { buildTranslationName } from '../../helpers/translations'\nimport { flagFor } from '../../i18n/messages'\nimport type { IconName } from '../../icons/names'\nimport { Flag } from '../Flag'\nimport { Tabs, type TabsSize, type TabsVariant } from '../Tabs'\nimport styles from './TranslatedFields.module.css'\n\n/** Builds a field's namespaced form name for the active locale (`(field) => name`). */\nexport type TranslatedFieldName = (field: string) => string\n\nexport interface TranslatedFieldsProps {\n /**\n * Render the fields for one locale. `name(field)` returns the namespaced form name to put on each\n * control (e.g. `translations[en-US].title`); `locale` is the active code. The same render runs per\n * locale, so the fields are identical bar their names.\n */\n children: (name: TranslatedFieldName, locale: string) => ReactNode\n /**\n * Locales (one tab each). Defaults to the app's configured locales\n * (`<ConfigProvider config={{ locales }}>`).\n */\n locales?: LocaleConfig[]\n /**\n * Top-level namespace for the field names (`<namespace>[<locale>].<field>`) and the nested object.\n * Falls back to `<ConfigProvider config={{ keys: { translationsNamespace } }}>`, then `'translations'`.\n * Pass to override per-instance (e.g. `'languages'`).\n */\n namespace?: string\n /** Controlled active locale code. */\n value?: string\n /** Initial active locale code (uncontrolled). Defaults to the first locale. */\n defaultValue?: string\n /** Fires with the next active locale code. */\n onChange?: (locale: string) => void\n /**\n * Show each locale's **flag** on its tab (matched by the language via `flagFor`). A language with no\n * built-in flag falls back to the `icon`. Defaults to `true`; pass `false` to always use `icon`.\n */\n showFlags?: boolean\n /** Fallback icon shown on a locale tab when its language has no flag (or `showFlags={false}`). Defaults to `'Global'`. */\n icon?: IconName\n /** Tab strip variant. Defaults to `Tabs`' default (`underline`). */\n variant?: TabsVariant\n /** Tab + field density. Defaults to `Tabs`' default (`md`). */\n size?: TabsSize\n /** Accessible label for the tablist. Defaults to the localized `translatedFields.label` (\"Translations\"). */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tabbed group of **per-locale** form fields — one tab per content locale, each rendering the same\n * fields with locale-namespaced `name`s (`translations[<locale>].<field>` by default), so a `<Form>`\n * submits e.g. `translations[en-US].title` / `translations[ka-GE].title`. You supply the fields once\n * via a render function that receives a `name(field)` builder for the active locale; bring any field\n * component (`TextField`, `MultilineTextField`, a rich-text editor, …). Locales come from\n * `<ConfigProvider config={{ locales }}>` (override with the `locales` prop). The top-level word is the\n * `namespace` (default `'translations'`, e.g. `'languages'`). Each tab shows its language's **flag**\n * (matched via `flagFor`); a language with no built-in flag falls back to the `icon` (a `Global` icon by\n * default), and `showFlags={false}` uses the `icon` for every tab. While inside a `<Form>`, an incomplete\n * locale's tab shows a **dot**, and on submit the strip auto-advances to the first locale with errors\n * and focuses its field. Build the schema / defaults with `buildTranslations`; the form values stay\n * **flat** (`translations[en-US].title` — the `FormData` shape) — convert to/from the **nested** JSON\n * shape (`{ translations: { 'en-US': { title } } }`) with `nestTranslations` / `flattenTranslations`.\n * Requires the `Tabs` component.\n */\nexport const TranslatedFields = forwardRef<HTMLDivElement, TranslatedFieldsProps>(\n function TranslatedFields(\n {\n children,\n locales: localesProp,\n namespace: namespaceProp,\n value,\n defaultValue,\n onChange,\n showFlags = true,\n icon = 'Global',\n variant,\n size,\n 'aria-label': ariaLabelProp,\n className,\n style,\n },\n ref,\n ) {\n const t = useT()\n const ariaLabel = ariaLabelProp ?? t('translatedFields.label')\n const configLocales = useLocales()\n const locales = localesProp ?? configLocales\n // namespace: the `namespace` prop wins, else the ConfigProvider's (which falls back to the default)\n const configNamespace = useTranslationsNamespace()\n const namespace = namespaceProp ?? configNamespace\n const form = useFormContext()\n\n // active locale — controlled (`value`) or internal; falls back to the first locale\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const active = (isControlled ? value : internal) ?? locales[0]?.code ?? ''\n const setActive = (next: string) => {\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // the namespaced-name prefix for a locale (e.g. `translations[en-US].`)\n const prefixOf = (code: string) => buildTranslationName(code, '', namespace)\n // a locale's tab is flagged when any of its fields is invalid AND the error is shown (submitted/touched)\n const localeHasError = (code: string): boolean =>\n !!form &&\n Object.keys(form.errors).some(\n (key) => key.startsWith(prefixOf(code)) && (form.isSubmitted || form.touched[key] === true),\n )\n\n // merge the forwarded ref with an internal one (to query the mounted fields for scroll/focus)\n const rootRef = useRef<HTMLDivElement | null>(null)\n const setRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }\n\n // on each submit, if the active tab is complete but another locale has the only remaining errors,\n // switch to it and focus its first invalid field (the form's own scroll can't reach an unmounted tab)\n const lastSubmit = useRef(0)\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const count = form?.submitCount ?? 0\n if (!form || count === lastSubmit.current) return\n lastSubmit.current = count\n const errorKeys = Object.keys(form.errors)\n if (errorKeys.length === 0) return\n const isTranslationKey = (k: string) => locales.some((l) => k.startsWith(prefixOf(l.code)))\n // a non-translation field is still invalid → the form's scroll-to-error handles it (above the tabs)\n if (!errorKeys.every(isTranslationKey)) return\n // active locale already shows its (mounted) errors → nothing to switch to\n if (errorKeys.some((k) => k.startsWith(prefixOf(active)))) return\n const firstBad = locales.find((l) => errorKeys.some((k) => k.startsWith(prefixOf(l.code))))\n if (firstBad && firstBad.code !== active) {\n pendingFocus.current = firstBad.code\n setActive(firstBad.code)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form?.submitCount])\n\n // once the auto-switched tab has mounted, focus its first invalid field\n useEffect(() => {\n if (pendingFocus.current == null || pendingFocus.current !== active) return\n pendingFocus.current = null\n const root = rootRef.current\n if (!root || !form) return\n const errorKeys = new Set(Object.keys(form.errors))\n const target = Array.from(root.querySelectorAll<HTMLElement>('[name]')).find((el) =>\n errorKeys.has(el.getAttribute('name') ?? ''),\n )\n target?.scrollIntoView?.({ behavior: 'smooth', block: 'center' })\n target?.focus({ preventScroll: true })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n if (locales.length === 0) return null\n\n const items = locales.map((loc) => ({\n value: loc.code,\n label: loc.label ?? loc.code,\n // the locale's flag when it has one (and flags are enabled), else the fallback `icon` (Global)\n icon: showFlags && flagFor(loc.code) ? <Flag code={loc.code} /> : icon,\n // an invalid locale shows the Tabs error dot (a small red dot — no full-tab tint)\n error: localeHasError(loc.code),\n // keyed by locale so switching tabs remounts the fields (no value/state bleed between locales)\n content: (\n <div key={loc.code} className={styles.fields}>\n {children((field) => buildTranslationName(loc.code, field, namespace), loc.code)}\n </div>\n ),\n }))\n\n return (\n <Tabs\n ref={setRootRef}\n className={className}\n style={style}\n items={items}\n value={active}\n onChange={setActive}\n variant={variant}\n size={size}\n // locale tabs are internal UI — never sync them to the page URL\n queryKey={null}\n aria-label={ariaLabel}\n />\n )\n },\n)\n"],"names":["TranslatedFields","forwardRef","children","localesProp","namespaceProp","value","defaultValue","onChange","showFlags","icon","variant","size","ariaLabelProp","className","style","ref","t","useT","ariaLabel","configLocales","useLocales","locales","configNamespace","useTranslationsNamespace","namespace","form","useFormContext","isControlled","internal","setInternal","useState","active","_a","setActive","next","prefixOf","code","buildTranslationName","localeHasError","key","rootRef","useRef","setRootRef","node","lastSubmit","pendingFocus","useEffect","count","errorKeys","isTranslationKey","k","l","firstBad","root","target","el","items","loc","flagFor","jsx","Flag","styles","field","Tabs"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const t=require("react/jsx-runtime"),q=require("react"),p=require("clsx"),g=require("./Avatar-
|
|
2
|
-
//# sourceMappingURL=UserCard-
|
|
1
|
+
"use strict";const t=require("react/jsx-runtime"),q=require("react"),p=require("clsx"),g=require("./Avatar-BwGJl-ru.cjs"),C=require("./Button-DAvQCGIw.cjs"),S=require("./Icon-BoQmbW7j.cjs"),a=require("./Skeleton-DK0lAjS9.cjs"),d=require("./Typography-d97DdbNd.cjs"),w=require("./ConfigProvider-BFhkb0BV.cjs"),T="_card_1fykc_3",U="_identity_1fykc_16",b="_text_1fykc_20",I="_sm_1fykc_33",N="_lg_1fykc_37",s={card:T,identity:U,text:b,sm:I,lg:N},A=q.forwardRef(function({name:c,email:n,avatar:l,icon:u="User",color:y="primary",size:e="md",onLogout:i,logoutLabel:x,children:m,loading:r=!1,className:_,style:f,...h},v){const o=w.useT(),j=e==="lg"?"lg":e==="sm"?"sm":"md",k=e==="lg"?"md":"sm";return t.jsxs("div",{ref:v,className:p.clsx(s.card,s[e],_),style:f,"aria-busy":r||void 0,...h,children:[t.jsxs("div",{className:s.identity,children:[t.jsx(g.Avatar,{size:j,name:c,src:l,icon:c?void 0:u,color:y,loading:r}),t.jsxs("div",{className:s.text,children:[t.jsx(d.Typography,{variant:"bodySmall",truncate:!0,children:r?t.jsx(a.Skeleton,{width:"60%"}):c??o("userCard.welcome")}),(r||n!=null)&&t.jsx(d.Typography,{variant:"caption",color:"muted",truncate:!0,children:r?t.jsx(a.Skeleton,{width:"85%"}):n})]})]}),m,i?t.jsx(C.Button,{variant:"filled",color:"error",size:k,fullWidth:!0,startIcon:t.jsx(S.Icon,{name:"Logout2"}),onClick:i,children:x??o("userCard.signOut")}):null]})});exports.UserCard=A;
|
|
2
|
+
//# sourceMappingURL=UserCard-DlrdIJHW.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserCard-
|
|
1
|
+
{"version":3,"file":"UserCard-DlrdIJHW.cjs","sources":["../src/components/UserCard/UserCard.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { Avatar } from '../Avatar'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Skeleton } from '../Skeleton'\nimport { Typography } from '../Typography'\nimport styles from './UserCard.module.css'\n\nexport type UserCardSize = 'sm' | 'md' | 'lg'\n\nexport interface UserCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /**\n * Display name — the primary line, and the source of the avatar initials. When omitted, the primary\n * line falls back to a localized **\"Welcome\"** greeting (and the avatar shows the `icon`).\n */\n name?: string\n /** Secondary line under the name (usually the email). */\n email?: ReactNode\n /** Avatar image URL (falls back to the initials from `name`, else the `icon`). */\n avatar?: string\n /** Fallback avatar icon when there's no image or name. Defaults to `'User'`. */\n icon?: IconName\n /** Theme palette token tinting the avatar. Defaults to `'primary'`. */\n color?: ThemeColor\n /** Preset size (avatar + button + card padding; the text stays fixed). Defaults to `'md'`. */\n size?: UserCardSize\n /** When provided, a **Sign out** button is shown that calls this. */\n onLogout?: () => void\n /** Sign-out button label. Defaults to `'Sign Out'`. */\n logoutLabel?: ReactNode\n /** Extra content between the identity row and the sign-out button (e.g. a link or menu). */\n children?: ReactNode\n /** Show skeletons for the avatar, name and email while the user is being fetched (sign-out stays usable). Defaults to `false`. */\n loading?: boolean\n}\n\n/**\n * A compact account card — an `Avatar` + name/email and an optional **Sign out** button — for a consistent\n * signed-in-user block across apps, instead of hand-rolling the markup each time. The shell's sidebar renders\n * one itself (`config.sidebar.userCard` / the `RootLayout` `showUserCard` prop), so place it by hand only\n * elsewhere. Shows the image (`avatar`) → initials (from `name`) →\n * `icon` (default `User`) in priority order; renders the sign-out `Button` (filled `error`) only when\n * `onLogout` is given. `size` (`sm`/`md`/`lg`) scales the avatar, button and padding; `color` (default `primary`)\n * tints the avatar. `loading` swaps the avatar + name + email for skeletons. Own CSS module (token-only).\n */\nexport const UserCard = forwardRef<HTMLDivElement, UserCardProps>(function UserCard(\n {\n name,\n email,\n avatar,\n icon = 'User',\n color = 'primary',\n size = 'md',\n onLogout,\n logoutLabel,\n children,\n loading = false,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n // the identity row + the sign-out button share the same visual size step\n const avatarSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'md'\n const buttonSize = size === 'lg' ? 'md' : 'sm'\n\n return (\n <div\n ref={ref}\n className={clsx(styles.card, styles[size], className)}\n style={style as CSSProperties}\n aria-busy={loading || undefined}\n {...props}\n >\n <div className={styles.identity}>\n {/* Avatar priority is image → icon → initials, so pass `icon` only as the last resort (no\n name), otherwise a name would still show the icon instead of its initials */}\n <Avatar\n size={avatarSize}\n name={name}\n src={avatar}\n icon={name ? undefined : icon}\n color={color}\n loading={loading}\n />\n <div className={styles.text}>\n {/* primary line: the name, or a \"Welcome\" greeting fallback when no name is given */}\n <Typography variant=\"bodySmall\" truncate>\n {loading ? <Skeleton width=\"60%\" /> : (name ?? t('userCard.welcome'))}\n </Typography>\n {(loading || email != null) && (\n <Typography variant=\"caption\" color=\"muted\" truncate>\n {loading ? <Skeleton width=\"85%\" /> : email}\n </Typography>\n )}\n </div>\n </div>\n\n {children}\n\n {onLogout ? (\n <Button\n variant=\"filled\"\n color=\"error\"\n size={buttonSize}\n fullWidth\n startIcon={<Icon name=\"Logout2\" />}\n onClick={onLogout}\n >\n {logoutLabel ?? t('userCard.signOut')}\n </Button>\n ) : null}\n </div>\n )\n})\n"],"names":["UserCard","forwardRef","name","email","avatar","icon","color","size","onLogout","logoutLabel","children","loading","className","style","props","ref","t","useT","avatarSize","buttonSize","jsxs","clsx","styles","jsx","Avatar","Typography","Skeleton","Button","Icon"],"mappings":"0bAgDaA,EAAWC,EAAAA,WAA0C,SAChE,CACE,KAAAC,EACA,MAAAC,EACA,OAAAC,EACA,KAAAC,EAAO,OACP,MAAAC,EAAQ,UACR,KAAAC,EAAO,KACP,SAAAC,EACA,YAAAC,EACA,SAAAC,EACA,QAAAC,EAAU,GACV,UAAAC,EACA,MAAAC,EACA,GAAGC,CACL,EACAC,EACA,CACA,MAAMC,EAAIC,EAAAA,KAAA,EAEJC,EAAaX,IAAS,KAAO,KAAOA,IAAS,KAAO,KAAO,KAC3DY,EAAaZ,IAAS,KAAO,KAAO,KAE1C,OACEa,EAAAA,KAAC,MAAA,CACC,IAAAL,EACA,UAAWM,EAAAA,KAAKC,EAAO,KAAMA,EAAOf,CAAI,EAAGK,CAAS,EACpD,MAAAC,EACA,YAAWF,GAAW,OACrB,GAAGG,EAEJ,SAAA,CAAAM,EAAAA,KAAC,MAAA,CAAI,UAAWE,EAAO,SAGrB,SAAA,CAAAC,EAAAA,IAACC,EAAAA,OAAA,CACC,KAAMN,EACN,KAAAhB,EACA,IAAKE,EACL,KAAMF,EAAO,OAAYG,EACzB,MAAAC,EACA,QAAAK,CAAA,CAAA,EAEFS,EAAAA,KAAC,MAAA,CAAI,UAAWE,EAAO,KAErB,SAAA,CAAAC,EAAAA,IAACE,EAAAA,WAAA,CAAW,QAAQ,YAAY,SAAQ,GACrC,SAAAd,EAAUY,EAAAA,IAACG,WAAA,CAAS,MAAM,KAAA,CAAM,EAAMxB,GAAQc,EAAE,kBAAkB,EACrE,GACEL,GAAWR,GAAS,OACpBoB,EAAAA,IAACE,EAAAA,WAAA,CAAW,QAAQ,UAAU,MAAM,QAAQ,SAAQ,GACjD,SAAAd,EAAUY,MAACG,EAAAA,UAAS,MAAM,MAAM,EAAKvB,CAAA,CACxC,CAAA,CAAA,CAEJ,CAAA,EACF,EAECO,EAEAF,EACCe,EAAAA,IAACI,EAAAA,OAAA,CACC,QAAQ,SACR,MAAM,QACN,KAAMR,EACN,UAAS,GACT,UAAWI,EAAAA,IAACK,EAAAA,KAAA,CAAK,KAAK,SAAA,CAAU,EAChC,QAASpB,EAER,SAAAC,GAAeO,EAAE,kBAAkB,CAAA,CAAA,EAEpC,IAAA,CAAA,CAAA,CAGV,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsxs as e, jsx as t } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as S } from "react";
|
|
3
3
|
import { clsx as b } from "clsx";
|
|
4
|
-
import { A as g } from "./Avatar-
|
|
5
|
-
import { B as w } from "./Button-
|
|
6
|
-
import { b as U } from "./Icon-
|
|
4
|
+
import { A as g } from "./Avatar-C4qgzth2.js";
|
|
5
|
+
import { B as w } from "./Button-7mgXcRdw.js";
|
|
6
|
+
import { b as U } from "./Icon-DMMO32p6.js";
|
|
7
7
|
import { S as m } from "./Skeleton-_-uGax2j.js";
|
|
8
8
|
import { T as d } from "./Typography-ChSuxgkc.js";
|
|
9
|
-
import { a as N } from "./ConfigProvider-
|
|
9
|
+
import { a as N } from "./ConfigProvider-bXX8dnhY.js";
|
|
10
10
|
const T = "_card_1fykc_3", j = "_identity_1fykc_16", A = "_text_1fykc_20", B = "_sm_1fykc_33", I = "_lg_1fykc_37", o = {
|
|
11
11
|
card: T,
|
|
12
12
|
identity: j,
|
|
@@ -75,4 +75,4 @@ const T = "_card_1fykc_3", j = "_identity_1fykc_16", A = "_text_1fykc_20", B = "
|
|
|
75
75
|
export {
|
|
76
76
|
J as U
|
|
77
77
|
};
|
|
78
|
-
//# sourceMappingURL=UserCard-
|
|
78
|
+
//# sourceMappingURL=UserCard-Dr1A_bdA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserCard-
|
|
1
|
+
{"version":3,"file":"UserCard-Dr1A_bdA.js","sources":["../src/components/UserCard/UserCard.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { Avatar } from '../Avatar'\nimport { Button } from '../Button'\nimport { Icon } from '../Icon'\nimport { Skeleton } from '../Skeleton'\nimport { Typography } from '../Typography'\nimport styles from './UserCard.module.css'\n\nexport type UserCardSize = 'sm' | 'md' | 'lg'\n\nexport interface UserCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /**\n * Display name — the primary line, and the source of the avatar initials. When omitted, the primary\n * line falls back to a localized **\"Welcome\"** greeting (and the avatar shows the `icon`).\n */\n name?: string\n /** Secondary line under the name (usually the email). */\n email?: ReactNode\n /** Avatar image URL (falls back to the initials from `name`, else the `icon`). */\n avatar?: string\n /** Fallback avatar icon when there's no image or name. Defaults to `'User'`. */\n icon?: IconName\n /** Theme palette token tinting the avatar. Defaults to `'primary'`. */\n color?: ThemeColor\n /** Preset size (avatar + button + card padding; the text stays fixed). Defaults to `'md'`. */\n size?: UserCardSize\n /** When provided, a **Sign out** button is shown that calls this. */\n onLogout?: () => void\n /** Sign-out button label. Defaults to `'Sign Out'`. */\n logoutLabel?: ReactNode\n /** Extra content between the identity row and the sign-out button (e.g. a link or menu). */\n children?: ReactNode\n /** Show skeletons for the avatar, name and email while the user is being fetched (sign-out stays usable). Defaults to `false`. */\n loading?: boolean\n}\n\n/**\n * A compact account card — an `Avatar` + name/email and an optional **Sign out** button — for a consistent\n * signed-in-user block across apps, instead of hand-rolling the markup each time. The shell's sidebar renders\n * one itself (`config.sidebar.userCard` / the `RootLayout` `showUserCard` prop), so place it by hand only\n * elsewhere. Shows the image (`avatar`) → initials (from `name`) →\n * `icon` (default `User`) in priority order; renders the sign-out `Button` (filled `error`) only when\n * `onLogout` is given. `size` (`sm`/`md`/`lg`) scales the avatar, button and padding; `color` (default `primary`)\n * tints the avatar. `loading` swaps the avatar + name + email for skeletons. Own CSS module (token-only).\n */\nexport const UserCard = forwardRef<HTMLDivElement, UserCardProps>(function UserCard(\n {\n name,\n email,\n avatar,\n icon = 'User',\n color = 'primary',\n size = 'md',\n onLogout,\n logoutLabel,\n children,\n loading = false,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n // the identity row + the sign-out button share the same visual size step\n const avatarSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'md'\n const buttonSize = size === 'lg' ? 'md' : 'sm'\n\n return (\n <div\n ref={ref}\n className={clsx(styles.card, styles[size], className)}\n style={style as CSSProperties}\n aria-busy={loading || undefined}\n {...props}\n >\n <div className={styles.identity}>\n {/* Avatar priority is image → icon → initials, so pass `icon` only as the last resort (no\n name), otherwise a name would still show the icon instead of its initials */}\n <Avatar\n size={avatarSize}\n name={name}\n src={avatar}\n icon={name ? undefined : icon}\n color={color}\n loading={loading}\n />\n <div className={styles.text}>\n {/* primary line: the name, or a \"Welcome\" greeting fallback when no name is given */}\n <Typography variant=\"bodySmall\" truncate>\n {loading ? <Skeleton width=\"60%\" /> : (name ?? t('userCard.welcome'))}\n </Typography>\n {(loading || email != null) && (\n <Typography variant=\"caption\" color=\"muted\" truncate>\n {loading ? <Skeleton width=\"85%\" /> : email}\n </Typography>\n )}\n </div>\n </div>\n\n {children}\n\n {onLogout ? (\n <Button\n variant=\"filled\"\n color=\"error\"\n size={buttonSize}\n fullWidth\n startIcon={<Icon name=\"Logout2\" />}\n onClick={onLogout}\n >\n {logoutLabel ?? t('userCard.signOut')}\n </Button>\n ) : null}\n </div>\n )\n})\n"],"names":["UserCard","forwardRef","name","email","avatar","icon","color","size","onLogout","logoutLabel","children","loading","className","style","props","ref","t","useT","avatarSize","buttonSize","jsxs","clsx","styles","jsx","Avatar","Typography","Skeleton","Button","Icon"],"mappings":";;;;;;;;;;;;;;;GAgDaA,IAAWC,EAA0C,SAChE;AAAA,EACE,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,MAAAC,IAAO;AAAA,EACP,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAIC,EAAA,GAEJC,IAAaX,MAAS,OAAO,OAAOA,MAAS,OAAO,OAAO,MAC3DY,IAAaZ,MAAS,OAAO,OAAO;AAE1C,SACE,gBAAAa;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAL;AAAA,MACA,WAAWM,EAAKC,EAAO,MAAMA,EAAOf,CAAI,GAAGK,CAAS;AAAA,MACpD,OAAAC;AAAA,MACA,aAAWF,KAAW;AAAA,MACrB,GAAGG;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWE,EAAO,UAGrB,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,MAAMN;AAAA,cACN,MAAAhB;AAAA,cACA,KAAKE;AAAA,cACL,MAAMF,IAAO,SAAYG;AAAA,cACzB,OAAAC;AAAA,cACA,SAAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAEF,gBAAAS,EAAC,OAAA,EAAI,WAAWE,EAAO,MAErB,UAAA;AAAA,YAAA,gBAAAC,EAACE,GAAA,EAAW,SAAQ,aAAY,UAAQ,IACrC,UAAAd,IAAU,gBAAAY,EAACG,GAAA,EAAS,OAAM,MAAA,CAAM,IAAMxB,KAAQc,EAAE,kBAAkB,GACrE;AAAA,aACEL,KAAWR,KAAS,SACpB,gBAAAoB,EAACE,GAAA,EAAW,SAAQ,WAAU,OAAM,SAAQ,UAAQ,IACjD,UAAAd,IAAU,gBAAAY,EAACG,KAAS,OAAM,OAAM,IAAKvB,EAAA,CACxC;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GACF;AAAA,QAECO;AAAA,QAEAF,IACC,gBAAAe;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAMR;AAAA,YACN,WAAS;AAAA,YACT,WAAW,gBAAAI,EAACK,GAAA,EAAK,MAAK,UAAA,CAAU;AAAA,YAChC,SAASpB;AAAA,YAER,UAAAC,KAAeO,EAAE,kBAAkB;AAAA,UAAA;AAAA,QAAA,IAEpC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;"}
|
|
@@ -15,7 +15,9 @@ export interface AuthGuardProps {
|
|
|
15
15
|
* param name follows `config.keys.redirectQueryKey`) and keeps the same target in memory for this tab, so
|
|
16
16
|
* a multi-step sign-in that drops the query string still knows it. Read it back after sign-in with
|
|
17
17
|
* `useAuthRedirect` / `getAuthRedirect`. Nothing is remembered from `/`, from the login path itself, or
|
|
18
|
-
* during an explicit Sign Out (`AdminRoot`'s)
|
|
18
|
+
* during an explicit Sign Out (`AdminRoot`'s) — and turning a visitor away from such a page forgets an
|
|
19
|
+
* older remembered target, so it can't come back on the next sign-in. Once it renders signed-in content,
|
|
20
|
+
* the target is forgotten.
|
|
19
21
|
*
|
|
20
22
|
* Requires a `@tanstack/react-router` context (it renders `<Navigate>`), so use it inside a routed
|
|
21
23
|
* tree. `redirectTo` is a plain string — the library can't know the app's typed route tree, so it's
|
package/dist/auth/AuthGuard.d.ts
CHANGED
|
@@ -15,7 +15,9 @@ export interface AuthGuardProps {
|
|
|
15
15
|
* param name follows `config.keys.redirectQueryKey`) and keeps the same target in memory for this tab, so
|
|
16
16
|
* a multi-step sign-in that drops the query string still knows it. Read it back after sign-in with
|
|
17
17
|
* `useAuthRedirect` / `getAuthRedirect`. Nothing is remembered from `/`, from the login path itself, or
|
|
18
|
-
* during an explicit Sign Out (`AdminRoot`'s)
|
|
18
|
+
* during an explicit Sign Out (`AdminRoot`'s) — and turning a visitor away from such a page forgets an
|
|
19
|
+
* older remembered target, so it can't come back on the next sign-in. Once it renders signed-in content,
|
|
20
|
+
* the target is forgotten.
|
|
19
21
|
*
|
|
20
22
|
* Requires a `@tanstack/react-router` context (it renders `<Navigate>`), so use it inside a routed
|
|
21
23
|
* tree. `redirectTo` is a plain string — the library can't know the app's typed route tree, so it's
|
|
@@ -11,9 +11,10 @@ export interface AuthLayoutRouteOptions {
|
|
|
11
11
|
/**
|
|
12
12
|
* Route options for the pathless `_auth` layout that groups the public auth pages (login,
|
|
13
13
|
* forgot-password, reset-password, otp, …). In `beforeLoad` it bounces an already signed-in visitor to
|
|
14
|
-
* the
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* the return target (the safe `?redirect=` param, else this tab's memory — see `getAuthRedirect`),
|
|
15
|
+
* falling back to `redirectTo`; otherwise it renders its children standalone (`component: Outlet`). The
|
|
16
|
+
* bounce only **reads** the target — unlike `getAuthRedirect` / `useAuthRedirect` it never remembers the
|
|
17
|
+
* param (a signed-in visitor has no later sign-in step to keep it for).
|
|
17
18
|
*
|
|
18
19
|
* Returns only the route **options** (`beforeLoad` + `component`) — not a whole route — because the
|
|
19
20
|
* router plugin needs the literal path in the file. Compose it with `createFileRoute('/_auth')`.
|
|
@@ -11,9 +11,10 @@ export interface AuthLayoutRouteOptions {
|
|
|
11
11
|
/**
|
|
12
12
|
* Route options for the pathless `_auth` layout that groups the public auth pages (login,
|
|
13
13
|
* forgot-password, reset-password, otp, …). In `beforeLoad` it bounces an already signed-in visitor to
|
|
14
|
-
* the
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* the return target (the safe `?redirect=` param, else this tab's memory — see `getAuthRedirect`),
|
|
15
|
+
* falling back to `redirectTo`; otherwise it renders its children standalone (`component: Outlet`). The
|
|
16
|
+
* bounce only **reads** the target — unlike `getAuthRedirect` / `useAuthRedirect` it never remembers the
|
|
17
|
+
* param (a signed-in visitor has no later sign-in step to keep it for).
|
|
17
18
|
*
|
|
18
19
|
* Returns only the route **options** (`beforeLoad` + `component`) — not a whole route — because the
|
|
19
20
|
* router plugin needs the literal path in the file. Compose it with `createFileRoute('/_auth')`.
|
|
@@ -21,7 +21,12 @@ export declare function configureAuthRedirect(next: Partial<typeof settings>): v
|
|
|
21
21
|
* `javascript:…`), and isn't the login path, a step under it, or a public auth page.
|
|
22
22
|
*/
|
|
23
23
|
export declare function safeAuthRedirect(value: unknown, { loginPath, isAuthPath, origin }: AuthRedirectContext): string | null;
|
|
24
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* @internal The target for a search string: its param, else the remembered one, else `fallback`. Reads
|
|
26
|
+
* only — `authLayoutRoute` bounces an already signed-in visitor with it, and that bounce has no later
|
|
27
|
+
* sign-in step to remember anything for (a target left in memory while signed in would come back on the
|
|
28
|
+
* next sign-in).
|
|
29
|
+
*/
|
|
25
30
|
export declare function resolveAuthRedirect(searchStr: string, fallback?: string, queryKey?: string): string;
|
|
26
31
|
/**
|
|
27
32
|
* @internal Remember a target for this tab — returns it (normalized) when it's worth remembering, `null`
|
|
@@ -40,15 +45,18 @@ export declare function authRedirectConsumed(): void;
|
|
|
40
45
|
/**
|
|
41
46
|
* Where to go after a successful sign-in, outside React (a route `beforeLoad`, a mutation's `onSuccess`):
|
|
42
47
|
* the `?redirect=` param of `window.location` if it's safe, else the target remembered in this tab, else
|
|
43
|
-
* `fallback` (default `'/'`).
|
|
44
|
-
*
|
|
48
|
+
* `fallback` (default `'/'`). A safe param it finds is remembered for the tab, so a later step of the
|
|
49
|
+
* sign-in that drops the query string still gets it (`?redirect=/` forgets an older target instead).
|
|
50
|
+
* Unsafe params are ignored and never overwrite a remembered target. The param name follows
|
|
51
|
+
* `config.keys.redirectQueryKey` once the guard, the shell or `useAuthRedirect` has rendered.
|
|
45
52
|
*/
|
|
46
53
|
export declare function getAuthRedirect(fallback?: string): string;
|
|
47
54
|
/**
|
|
48
55
|
* Where to go after a successful sign-in: the `?redirect=` param of the page this component is mounted on
|
|
49
56
|
* (read from the router's location) if it's safe, else the target remembered in this tab, else `fallback`
|
|
50
|
-
* (default `'/'`).
|
|
51
|
-
*
|
|
57
|
+
* (default `'/'`). A safe param it finds is remembered for the tab (a reloaded or shared login link then
|
|
58
|
+
* survives a multi-step sign-in; `?redirect=/` forgets an older target instead). It never spends the
|
|
59
|
+
* target; that's forgotten once `AuthGuard` renders signed-in content (or `clearAuthRedirect`).
|
|
52
60
|
*
|
|
53
61
|
* **Stable for the component's life:** once it has found a target it keeps returning it, and it listens
|
|
54
62
|
* only to the `?redirect=` of the page it was mounted on. A `<Navigate>` to the target moves the router's
|
|
@@ -21,7 +21,12 @@ export declare function configureAuthRedirect(next: Partial<typeof settings>): v
|
|
|
21
21
|
* `javascript:…`), and isn't the login path, a step under it, or a public auth page.
|
|
22
22
|
*/
|
|
23
23
|
export declare function safeAuthRedirect(value: unknown, { loginPath, isAuthPath, origin }: AuthRedirectContext): string | null;
|
|
24
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* @internal The target for a search string: its param, else the remembered one, else `fallback`. Reads
|
|
26
|
+
* only — `authLayoutRoute` bounces an already signed-in visitor with it, and that bounce has no later
|
|
27
|
+
* sign-in step to remember anything for (a target left in memory while signed in would come back on the
|
|
28
|
+
* next sign-in).
|
|
29
|
+
*/
|
|
25
30
|
export declare function resolveAuthRedirect(searchStr: string, fallback?: string, queryKey?: string): string;
|
|
26
31
|
/**
|
|
27
32
|
* @internal Remember a target for this tab — returns it (normalized) when it's worth remembering, `null`
|
|
@@ -40,15 +45,18 @@ export declare function authRedirectConsumed(): void;
|
|
|
40
45
|
/**
|
|
41
46
|
* Where to go after a successful sign-in, outside React (a route `beforeLoad`, a mutation's `onSuccess`):
|
|
42
47
|
* the `?redirect=` param of `window.location` if it's safe, else the target remembered in this tab, else
|
|
43
|
-
* `fallback` (default `'/'`).
|
|
44
|
-
*
|
|
48
|
+
* `fallback` (default `'/'`). A safe param it finds is remembered for the tab, so a later step of the
|
|
49
|
+
* sign-in that drops the query string still gets it (`?redirect=/` forgets an older target instead).
|
|
50
|
+
* Unsafe params are ignored and never overwrite a remembered target. The param name follows
|
|
51
|
+
* `config.keys.redirectQueryKey` once the guard, the shell or `useAuthRedirect` has rendered.
|
|
45
52
|
*/
|
|
46
53
|
export declare function getAuthRedirect(fallback?: string): string;
|
|
47
54
|
/**
|
|
48
55
|
* Where to go after a successful sign-in: the `?redirect=` param of the page this component is mounted on
|
|
49
56
|
* (read from the router's location) if it's safe, else the target remembered in this tab, else `fallback`
|
|
50
|
-
* (default `'/'`).
|
|
51
|
-
*
|
|
57
|
+
* (default `'/'`). A safe param it finds is remembered for the tab (a reloaded or shared login link then
|
|
58
|
+
* survives a multi-step sign-in; `?redirect=/` forgets an older target instead). It never spends the
|
|
59
|
+
* target; that's forgotten once `AuthGuard` renders signed-in content (or `clearAuthRedirect`).
|
|
52
60
|
*
|
|
53
61
|
* **Stable for the component's life:** once it has found a target it keeps returning it, and it listens
|
|
54
62
|
* only to the `?redirect=` of the page it was mounted on. A `<Navigate>` to the target moves the router's
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const h=require("@tanstack/react-router"),n=require("./AuthGuard-
|
|
2
|
-
//# sourceMappingURL=authLayoutRoute-
|
|
1
|
+
"use strict";const h=require("@tanstack/react-router"),n=require("./AuthGuard-Cm-tqCto.cjs"),p=({isAuthenticated:s,redirectTo:r="/"})=>({beforeLoad:({location:e}={})=>{if(!s())return;const t=typeof window>"u"?void 0:window.location,a=(e==null?void 0:e.searchStr)??(t==null?void 0:t.search)??"",d=(e==null?void 0:e.pathname)??(t==null?void 0:t.pathname);let u=n.resolveAuthRedirect(a,r);throw u.split(/[?#]/)[0]===d&&(u=r),h.redirect({to:u,replace:!0})},component:h.Outlet});exports.authLayoutRoute=p;
|
|
2
|
+
//# sourceMappingURL=authLayoutRoute-CPLqQVvx.cjs.map
|