@techzyapp/ui-library 1.0.29 → 1.0.31
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-w-w_WxxV.js → Accordion-ClK2XpD7.js} +3 -3
- package/dist/{Accordion-w-w_WxxV.js.map → Accordion-ClK2XpD7.js.map} +1 -1
- package/dist/{Accordion-P3PNqSER.cjs → Accordion-CtvAYNKd.cjs} +2 -2
- package/dist/{Accordion-P3PNqSER.cjs.map → Accordion-CtvAYNKd.cjs.map} +1 -1
- package/dist/AdminRoot-BYkmCGNx.js +57 -0
- package/dist/AdminRoot-BYkmCGNx.js.map +1 -0
- package/dist/AdminRoot-BbkfFQEn.cjs +2 -0
- package/dist/AdminRoot-BbkfFQEn.cjs.map +1 -0
- package/dist/{Alert-CJono1TJ.js → Alert-BLqAcEoT.js} +5 -5
- package/dist/{Alert-CJono1TJ.js.map → Alert-BLqAcEoT.js.map} +1 -1
- package/dist/{Alert-VFQuuII6.cjs → Alert-BM5WOI_u.cjs} +2 -2
- package/dist/{Alert-VFQuuII6.cjs.map → Alert-BM5WOI_u.cjs.map} +1 -1
- package/dist/{AuthLayout-QAtW2GAT.cjs → AuthLayout-DIcR__vo.cjs} +2 -2
- package/dist/{AuthLayout-QAtW2GAT.cjs.map → AuthLayout-DIcR__vo.cjs.map} +1 -1
- package/dist/{AuthLayout-DOFYw_z5.js → AuthLayout-m1BQ6Ixx.js} +2 -2
- package/dist/{AuthLayout-DOFYw_z5.js.map → AuthLayout-m1BQ6Ixx.js.map} +1 -1
- package/dist/{Avatar-DrV_F7Ex.cjs → Avatar-CQ--wGWS.cjs} +2 -2
- package/dist/{Avatar-DrV_F7Ex.cjs.map → Avatar-CQ--wGWS.cjs.map} +1 -1
- package/dist/{Avatar-DXNPg23a.js → Avatar-MwWIcj8z.js} +3 -3
- package/dist/{Avatar-DXNPg23a.js.map → Avatar-MwWIcj8z.js.map} +1 -1
- package/dist/{AvatarGroup-CwlYqDCI.js → AvatarGroup-BxYQo0zZ.js} +2 -2
- package/dist/{AvatarGroup-CwlYqDCI.js.map → AvatarGroup-BxYQo0zZ.js.map} +1 -1
- package/dist/{AvatarGroup-CHesdo-M.cjs → AvatarGroup-Bzu2t6Sd.cjs} +2 -2
- package/dist/{AvatarGroup-CHesdo-M.cjs.map → AvatarGroup-Bzu2t6Sd.cjs.map} +1 -1
- package/dist/{Breadcrumbs-XWU8tRvs.js → Breadcrumbs-CzHGbN2c.js} +5 -5
- package/dist/{Breadcrumbs-XWU8tRvs.js.map → Breadcrumbs-CzHGbN2c.js.map} +1 -1
- package/dist/{Breadcrumbs-DCEHxpSi.cjs → Breadcrumbs-Di4-Acfb.cjs} +2 -2
- package/dist/{Breadcrumbs-DCEHxpSi.cjs.map → Breadcrumbs-Di4-Acfb.cjs.map} +1 -1
- package/dist/{Button-CWMNNiia.js → Button-9Qcdkw-y.js} +2 -2
- package/dist/{Button-CWMNNiia.js.map → Button-9Qcdkw-y.js.map} +1 -1
- package/dist/{Button-CusxDmfq.cjs → Button-BQhiJq8e.cjs} +2 -2
- package/dist/{Button-CusxDmfq.cjs.map → Button-BQhiJq8e.cjs.map} +1 -1
- package/dist/{Calendar-Db3rr1VD.js → Calendar-BB-C0qXO.js} +4 -4
- package/dist/{Calendar-Db3rr1VD.js.map → Calendar-BB-C0qXO.js.map} +1 -1
- package/dist/{Calendar-BEQbZixA.cjs → Calendar-dXhLgOUH.cjs} +2 -2
- package/dist/{Calendar-BEQbZixA.cjs.map → Calendar-dXhLgOUH.cjs.map} +1 -1
- package/dist/Card-BERQfyhJ.js +129 -0
- package/dist/Card-BERQfyhJ.js.map +1 -0
- package/dist/Card-DULpoOfj.cjs +2 -0
- package/dist/Card-DULpoOfj.cjs.map +1 -0
- package/dist/{Chip-D12KcV4_.cjs → Chip-BuydTI6V.cjs} +2 -2
- package/dist/{Chip-D12KcV4_.cjs.map → Chip-BuydTI6V.cjs.map} +1 -1
- package/dist/{Chip-Zh1OB9nV.js → Chip-DZ5Fz7jx.js} +3 -3
- package/dist/{Chip-Zh1OB9nV.js.map → Chip-DZ5Fz7jx.js.map} +1 -1
- package/dist/{ChoiceCardGroup-CEniY_HJ.js → ChoiceCardGroup-BTbKjJdp.js} +3 -3
- package/dist/{ChoiceCardGroup-CEniY_HJ.js.map → ChoiceCardGroup-BTbKjJdp.js.map} +1 -1
- package/dist/{ChoiceCardGroup-BSagRbPI.cjs → ChoiceCardGroup-Bg2jtFpe.cjs} +2 -2
- package/dist/{ChoiceCardGroup-BSagRbPI.cjs.map → ChoiceCardGroup-Bg2jtFpe.cjs.map} +1 -1
- package/dist/{CodeBlock-DAM7BkHK.cjs → CodeBlock-BPraYPoS.cjs} +2 -2
- package/dist/{CodeBlock-DAM7BkHK.cjs.map → CodeBlock-BPraYPoS.cjs.map} +1 -1
- package/dist/{CodeBlock-CkrTnpcj.js → CodeBlock-BySsTAtY.js} +5 -5
- package/dist/{CodeBlock-CkrTnpcj.js.map → CodeBlock-BySsTAtY.js.map} +1 -1
- package/dist/{ColorPicker-BcCozxIe.cjs → ColorPicker-BTBTQD39.cjs} +2 -2
- package/dist/{ColorPicker-BcCozxIe.cjs.map → ColorPicker-BTBTQD39.cjs.map} +1 -1
- package/dist/{ColorPicker-DqxVgUoD.js → ColorPicker-DJow7m2v.js} +4 -4
- package/dist/{ColorPicker-DqxVgUoD.js.map → ColorPicker-DJow7m2v.js.map} +1 -1
- package/dist/{ColorPickerPanel-DZjN8NNn.js → ColorPickerPanel-D6agWM6y.js} +3 -3
- package/dist/{ColorPickerPanel-DZjN8NNn.js.map → ColorPickerPanel-D6agWM6y.js.map} +1 -1
- package/dist/{ColorPickerPanel-DAOESLCe.cjs → ColorPickerPanel-DXIYwUoE.cjs} +2 -2
- package/dist/{ColorPickerPanel-DAOESLCe.cjs.map → ColorPickerPanel-DXIYwUoE.cjs.map} +1 -1
- package/dist/{ColorRamp-_KwlPQ-T.cjs → ColorRamp-B45Rtwgw.cjs} +2 -2
- package/dist/{ColorRamp-_KwlPQ-T.cjs.map → ColorRamp-B45Rtwgw.cjs.map} +1 -1
- package/dist/{ColorRamp-DS5LVpRF.js → ColorRamp-Bhj28c_6.js} +3 -3
- package/dist/{ColorRamp-DS5LVpRF.js.map → ColorRamp-Bhj28c_6.js.map} +1 -1
- package/dist/ConfigProvider-Ct0Pe3Ku.js +335 -0
- package/dist/ConfigProvider-Ct0Pe3Ku.js.map +1 -0
- package/dist/ConfigProvider-CtpfSy1i.cjs +2 -0
- package/dist/ConfigProvider-CtpfSy1i.cjs.map +1 -0
- package/dist/{CopyButton-SFwjKod9.cjs → CopyButton-Bfte6TJF.cjs} +2 -2
- package/dist/{CopyButton-SFwjKod9.cjs.map → CopyButton-Bfte6TJF.cjs.map} +1 -1
- package/dist/{CopyButton-D4s8aeSE.js → CopyButton-CBk85MQ7.js} +5 -5
- package/dist/{CopyButton-D4s8aeSE.js.map → CopyButton-CBk85MQ7.js.map} +1 -1
- package/dist/{DashedButton-iM7kzopW.js → DashedButton-BpiG8rab.js} +3 -3
- package/dist/{DashedButton-iM7kzopW.js.map → DashedButton-BpiG8rab.js.map} +1 -1
- package/dist/{DashedButton-B7xodc3N.cjs → DashedButton-DZmgxLMO.cjs} +2 -2
- package/dist/{DashedButton-B7xodc3N.cjs.map → DashedButton-DZmgxLMO.cjs.map} +1 -1
- package/dist/{DatePicker-ENbn2Vab.cjs → DatePicker-DBiU4Mb6.cjs} +2 -2
- package/dist/{DatePicker-ENbn2Vab.cjs.map → DatePicker-DBiU4Mb6.cjs.map} +1 -1
- package/dist/{DatePicker-DGwjCHfd.js → DatePicker-eAzDnO2Y.js} +6 -6
- package/dist/{DatePicker-DGwjCHfd.js.map → DatePicker-eAzDnO2Y.js.map} +1 -1
- package/dist/{DateTimePicker-BQUmsFwX.cjs → DateTimePicker-CvaD8IkF.cjs} +2 -2
- package/dist/{DateTimePicker-BQUmsFwX.cjs.map → DateTimePicker-CvaD8IkF.cjs.map} +1 -1
- package/dist/{DateTimePicker-CwVkQiun.js → DateTimePicker-M2UBjFVc.js} +9 -9
- package/dist/{DateTimePicker-CwVkQiun.js.map → DateTimePicker-M2UBjFVc.js.map} +1 -1
- package/dist/{DescriptionList-0qjKr6GN.js → DescriptionList-BhsmdtS1.js} +64 -64
- package/dist/{DescriptionList-0qjKr6GN.js.map → DescriptionList-BhsmdtS1.js.map} +1 -1
- package/dist/DescriptionList-DQHNOTWl.cjs +2 -0
- package/dist/{DescriptionList-U5z2Faf4.cjs.map → DescriptionList-DQHNOTWl.cjs.map} +1 -1
- package/dist/{Dropdown-DNZ9S_zQ.cjs → Dropdown-BbaU1WDC.cjs} +2 -2
- package/dist/{Dropdown-DNZ9S_zQ.cjs.map → Dropdown-BbaU1WDC.cjs.map} +1 -1
- package/dist/{Dropdown--1mNTVZJ.js → Dropdown-BlmbYp1X.js} +2 -2
- package/dist/{Dropdown--1mNTVZJ.js.map → Dropdown-BlmbYp1X.js.map} +1 -1
- package/dist/{EmptyState-DwT9_HW7.js → EmptyState-2pA3XlOX.js} +4 -4
- package/dist/{EmptyState-DwT9_HW7.js.map → EmptyState-2pA3XlOX.js.map} +1 -1
- package/dist/{EmptyState-B2_4BN4l.cjs → EmptyState-ByBpy2vN.cjs} +2 -2
- package/dist/{EmptyState-B2_4BN4l.cjs.map → EmptyState-ByBpy2vN.cjs.map} +1 -1
- package/dist/{ErrorBoundary-CsDHKYB4.js → ErrorBoundary-B-37hGZW.js} +6 -6
- package/dist/{ErrorBoundary-CsDHKYB4.js.map → ErrorBoundary-B-37hGZW.js.map} +1 -1
- package/dist/{ErrorBoundary-CYSOAQlB.cjs → ErrorBoundary-gRGxeuM1.cjs} +2 -2
- package/dist/{ErrorBoundary-CYSOAQlB.cjs.map → ErrorBoundary-gRGxeuM1.cjs.map} +1 -1
- package/dist/{FileCard-B9f9RoXS.js → FileCard-BNfUAgsF.js} +5 -5
- package/dist/{FileCard-B9f9RoXS.js.map → FileCard-BNfUAgsF.js.map} +1 -1
- package/dist/{FileCard-zuUYik-F.cjs → FileCard-BYNJVmp0.cjs} +2 -2
- package/dist/{FileCard-zuUYik-F.cjs.map → FileCard-BYNJVmp0.cjs.map} +1 -1
- package/dist/{FileUploader-Y8hiyIpp.cjs → FileUploader-DdICa5UC.cjs} +2 -2
- package/dist/{FileUploader-Y8hiyIpp.cjs.map → FileUploader-DdICa5UC.cjs.map} +1 -1
- package/dist/{FileUploader-Dh2zA50t.js → FileUploader-TOWwDOSS.js} +6 -6
- package/dist/{FileUploader-Dh2zA50t.js.map → FileUploader-TOWwDOSS.js.map} +1 -1
- package/dist/{Flag-CmDXvd7j.js → Flag-DDR6OANA.js} +2 -2
- package/dist/{Flag-CmDXvd7j.js.map → Flag-DDR6OANA.js.map} +1 -1
- package/dist/{Flag-BpTQAgbD.cjs → Flag-DXPQ2t8z.cjs} +2 -2
- package/dist/{Flag-BpTQAgbD.cjs.map → Flag-DXPQ2t8z.cjs.map} +1 -1
- package/dist/FloatingPanel-C5c_eMQ0.js +135 -0
- package/dist/{FloatingPanel-CeSOtE_D.js.map → FloatingPanel-C5c_eMQ0.js.map} +1 -1
- package/dist/FloatingPanel-tGCG2nhA.cjs +2 -0
- package/dist/{FloatingPanel-BIC4WrFa.cjs.map → FloatingPanel-tGCG2nhA.cjs.map} +1 -1
- package/dist/{FullscreenToggle-CeGgw3z1.cjs → FullscreenToggle-BKo1lDSE.cjs} +2 -2
- package/dist/{FullscreenToggle-CeGgw3z1.cjs.map → FullscreenToggle-BKo1lDSE.cjs.map} +1 -1
- package/dist/{FullscreenToggle-2IYIS5KF.js → FullscreenToggle-DmH1541W.js} +4 -4
- package/dist/{FullscreenToggle-2IYIS5KF.js.map → FullscreenToggle-DmH1541W.js.map} +1 -1
- package/dist/Icon-BUP5_kRs.cjs +2 -0
- package/dist/Icon-BUP5_kRs.cjs.map +1 -0
- package/dist/{Icon-DaTvzLBu.js → Icon-CGQ5yGSZ.js} +4 -3
- package/dist/Icon-CGQ5yGSZ.js.map +1 -0
- package/dist/{IconButton-GU3Ud4Zg.js → IconButton-CL_6iMQh.js} +2 -2
- package/dist/{IconButton-GU3Ud4Zg.js.map → IconButton-CL_6iMQh.js.map} +1 -1
- package/dist/{IconButton-BNa0yLcv.cjs → IconButton-CvIXSFsr.cjs} +2 -2
- package/dist/{IconButton-BNa0yLcv.cjs.map → IconButton-CvIXSFsr.cjs.map} +1 -1
- package/dist/{List-CZwNGxuP.js → List-BLPB3-B8.js} +3 -3
- package/dist/{List-CZwNGxuP.js.map → List-BLPB3-B8.js.map} +1 -1
- package/dist/{List-9lUjapQ5.cjs → List-ah2PNWeY.cjs} +2 -2
- package/dist/{List-9lUjapQ5.cjs.map → List-ah2PNWeY.cjs.map} +1 -1
- package/dist/{Loader-Cpr9-OOZ.cjs → Loader-CI1j71X8.cjs} +2 -2
- package/dist/{Loader-Cpr9-OOZ.cjs.map → Loader-CI1j71X8.cjs.map} +1 -1
- package/dist/{Loader-C1uaCtx6.js → Loader-Czzb450N.js} +2 -2
- package/dist/{Loader-C1uaCtx6.js.map → Loader-Czzb450N.js.map} +1 -1
- package/dist/{Modal-DHP2R3K3.js → Modal-DMJMw6kT.js} +5 -5
- package/dist/{Modal-DHP2R3K3.js.map → Modal-DMJMw6kT.js.map} +1 -1
- package/dist/{Modal-DFeBHv-Q.cjs → Modal-DPObz0b-.cjs} +2 -2
- package/dist/{Modal-DFeBHv-Q.cjs.map → Modal-DPObz0b-.cjs.map} +1 -1
- package/dist/{MultiSelect-B-FPQ08c.js → MultiSelect-BTR6w5Ot.js} +5 -5
- package/dist/{MultiSelect-B-FPQ08c.js.map → MultiSelect-BTR6w5Ot.js.map} +1 -1
- package/dist/{MultiSelect-S5VG9g3l.cjs → MultiSelect-IDAJ5a5K.cjs} +2 -2
- package/dist/{MultiSelect-S5VG9g3l.cjs.map → MultiSelect-IDAJ5a5K.cjs.map} +1 -1
- package/dist/{NumberField-SSGXlF8U.cjs → NumberField-Cg0XEDgW.cjs} +2 -2
- package/dist/{NumberField-SSGXlF8U.cjs.map → NumberField-Cg0XEDgW.cjs.map} +1 -1
- package/dist/{NumberField-CzyvDMRV.js → NumberField-DlaW-g3Z.js} +4 -4
- package/dist/{NumberField-CzyvDMRV.js.map → NumberField-DlaW-g3Z.js.map} +1 -1
- package/dist/{OtpField-Pr7Ch0El.cjs → OtpField-DsedK1nQ.cjs} +2 -2
- package/dist/{OtpField-Pr7Ch0El.cjs.map → OtpField-DsedK1nQ.cjs.map} +1 -1
- package/dist/{OtpField-CMoJqcx1.js → OtpField-vxQuo-uR.js} +2 -2
- package/dist/{OtpField-CMoJqcx1.js.map → OtpField-vxQuo-uR.js.map} +1 -1
- package/dist/{PageLayout-BIMkjq-q.cjs → PageLayout-BPbjTYS3.cjs} +2 -2
- package/dist/{PageLayout-BIMkjq-q.cjs.map → PageLayout-BPbjTYS3.cjs.map} +1 -1
- package/dist/{PageLayout-Ctr-IEzX.js → PageLayout-Rk6KSxmn.js} +2 -2
- package/dist/{PageLayout-Ctr-IEzX.js.map → PageLayout-Rk6KSxmn.js.map} +1 -1
- package/dist/{PageNotFound-KKJTeaRF.js → PageNotFound-CBNhKZ9Y.js} +5 -5
- package/dist/{PageNotFound-KKJTeaRF.js.map → PageNotFound-CBNhKZ9Y.js.map} +1 -1
- package/dist/{PageNotFound-CnhBheI4.cjs → PageNotFound-PUQ1o9R4.cjs} +2 -2
- package/dist/{PageNotFound-CnhBheI4.cjs.map → PageNotFound-PUQ1o9R4.cjs.map} +1 -1
- package/dist/{Pagination-Oyms2ERd.js → Pagination-CNdkfXp2.js} +3 -3
- package/dist/{Pagination-Oyms2ERd.js.map → Pagination-CNdkfXp2.js.map} +1 -1
- package/dist/{Pagination-BD5WOW98.cjs → Pagination-DNGKNQy0.cjs} +2 -2
- package/dist/{Pagination-BD5WOW98.cjs.map → Pagination-DNGKNQy0.cjs.map} +1 -1
- package/dist/{PaletteField-CCQGW5LC.cjs → PaletteField-BSIF5jI6.cjs} +2 -2
- package/dist/{PaletteField-CCQGW5LC.cjs.map → PaletteField-BSIF5jI6.cjs.map} +1 -1
- package/dist/{PaletteField-BHzzzdou.js → PaletteField-Bp5Fgygh.js} +3 -3
- package/dist/{PaletteField-BHzzzdou.js.map → PaletteField-Bp5Fgygh.js.map} +1 -1
- package/dist/{PhoneField-5zGY4Wko.cjs → PhoneField-BMhZeZkW.cjs} +2 -2
- package/dist/{PhoneField-5zGY4Wko.cjs.map → PhoneField-BMhZeZkW.cjs.map} +1 -1
- package/dist/{PhoneField-CBfmChPx.js → PhoneField-BdmvslXQ.js} +5 -5
- package/dist/{PhoneField-CBfmChPx.js.map → PhoneField-BdmvslXQ.js.map} +1 -1
- package/dist/{Popconfirm-BtGDhqrc.js → Popconfirm-Cyaeybtj.js} +6 -6
- package/dist/{Popconfirm-BtGDhqrc.js.map → Popconfirm-Cyaeybtj.js.map} +1 -1
- package/dist/{Popconfirm-CkBdntxV.cjs → Popconfirm-IhlIINtZ.cjs} +2 -2
- package/dist/{Popconfirm-CkBdntxV.cjs.map → Popconfirm-IhlIINtZ.cjs.map} +1 -1
- package/dist/{Popover-DAT6DcM9.cjs → Popover-DsYUT23r.cjs} +2 -2
- package/dist/{Popover-DAT6DcM9.cjs.map → Popover-DsYUT23r.cjs.map} +1 -1
- package/dist/{Popover-B82Id9Ut.js → Popover-WaVH3jsN.js} +2 -2
- package/dist/{Popover-B82Id9Ut.js.map → Popover-WaVH3jsN.js.map} +1 -1
- package/dist/{Progress-Bwxx71Ns.cjs → Progress-CAY1p06_.cjs} +2 -2
- package/dist/{Progress-Bwxx71Ns.cjs.map → Progress-CAY1p06_.cjs.map} +1 -1
- package/dist/{Progress-pTbaOSDd.js → Progress-T7PLrJ0Y.js} +2 -2
- package/dist/{Progress-pTbaOSDd.js.map → Progress-T7PLrJ0Y.js.map} +1 -1
- package/dist/{QueryError-C01oichG.cjs → QueryError-DP22IUnp.cjs} +2 -2
- package/dist/{QueryError-C01oichG.cjs.map → QueryError-DP22IUnp.cjs.map} +1 -1
- package/dist/{QueryError-Bu_MNGek.js → QueryError-Dtspj9l4.js} +2 -2
- package/dist/{QueryError-Bu_MNGek.js.map → QueryError-Dtspj9l4.js.map} +1 -1
- package/dist/RadioGroup-CTAayuMv.js +142 -0
- package/dist/RadioGroup-CTAayuMv.js.map +1 -0
- package/dist/RadioGroup-CvC2yc4p.cjs +2 -0
- package/dist/RadioGroup-CvC2yc4p.cjs.map +1 -0
- package/dist/{RemoveDialog-Bm2mJB3l.cjs → RemoveDialog-D12B4x80.cjs} +2 -2
- package/dist/{RemoveDialog-Bm2mJB3l.cjs.map → RemoveDialog-D12B4x80.cjs.map} +1 -1
- package/dist/{RemoveDialog-C2uJzWi-.js → RemoveDialog-DdGsqaWV.js} +6 -6
- package/dist/{RemoveDialog-C2uJzWi-.js.map → RemoveDialog-DdGsqaWV.js.map} +1 -1
- package/dist/RichTextEditor-BVXY25sz.cjs +2 -0
- package/dist/RichTextEditor-BVXY25sz.cjs.map +1 -0
- package/dist/RichTextEditor-DL4y5xVv.js +916 -0
- package/dist/RichTextEditor-DL4y5xVv.js.map +1 -0
- package/dist/RootLayout-BK3t6Mm0.js +604 -0
- package/dist/RootLayout-BK3t6Mm0.js.map +1 -0
- package/dist/RootLayout-DDuzPlJe.cjs +2 -0
- package/dist/RootLayout-DDuzPlJe.cjs.map +1 -0
- package/dist/{Select-CVVJKAtS.cjs → Select-DlFDOZtn.cjs} +2 -2
- package/dist/{Select-CVVJKAtS.cjs.map → Select-DlFDOZtn.cjs.map} +1 -1
- package/dist/{Select-d9LDI8O3.js → Select-tVI_qer3.js} +5 -5
- package/dist/{Select-d9LDI8O3.js.map → Select-tVI_qer3.js.map} +1 -1
- package/dist/{Sidebar-BgCfnZBF.js → Sidebar-CjrD3nNp.js} +7 -6
- package/dist/Sidebar-CjrD3nNp.js.map +1 -0
- package/dist/Sidebar-gB-X4VLX.cjs +2 -0
- package/dist/Sidebar-gB-X4VLX.cjs.map +1 -0
- package/dist/{SpeedDial-CEr2JWQb.cjs → SpeedDial-BIOkkLKO.cjs} +2 -2
- package/dist/{SpeedDial-CEr2JWQb.cjs.map → SpeedDial-BIOkkLKO.cjs.map} +1 -1
- package/dist/{SpeedDial-CBVwgnFp.js → SpeedDial-xQr4JH0x.js} +5 -5
- package/dist/{SpeedDial-CBVwgnFp.js.map → SpeedDial-xQr4JH0x.js.map} +1 -1
- package/dist/Stepper-CBdhvPoz.cjs +2 -0
- package/dist/Stepper-CBdhvPoz.cjs.map +1 -0
- package/dist/Stepper-CkYcIc15.js +169 -0
- package/dist/Stepper-CkYcIc15.js.map +1 -0
- package/dist/{SwatchPicker-Bpxk0IOe.js → SwatchPicker-BAKslSY4.js} +2 -2
- package/dist/{SwatchPicker-Bpxk0IOe.js.map → SwatchPicker-BAKslSY4.js.map} +1 -1
- package/dist/{SwatchPicker-BWXqgsEy.cjs → SwatchPicker-CpwVq0xp.cjs} +2 -2
- package/dist/{SwatchPicker-BWXqgsEy.cjs.map → SwatchPicker-CpwVq0xp.cjs.map} +1 -1
- package/dist/Table-CwQKfXGn.js +1210 -0
- package/dist/Table-CwQKfXGn.js.map +1 -0
- package/dist/Table-Cwxqo7Br.cjs +2 -0
- package/dist/Table-Cwxqo7Br.cjs.map +1 -0
- package/dist/Tabs-651xbRe4.cjs +2 -0
- package/dist/Tabs-651xbRe4.cjs.map +1 -0
- package/dist/Tabs-Bztnezt9.js +194 -0
- package/dist/Tabs-Bztnezt9.js.map +1 -0
- package/dist/{TagsField-DcuSn7wL.cjs → TagsField-B7ZARHzD.cjs} +2 -2
- package/dist/{TagsField-DcuSn7wL.cjs.map → TagsField-B7ZARHzD.cjs.map} +1 -1
- package/dist/{TagsField-DuQEFHZ3.js → TagsField-CdymON69.js} +5 -5
- package/dist/{TagsField-DuQEFHZ3.js.map → TagsField-CdymON69.js.map} +1 -1
- package/dist/{TextField-E85pvJQC.cjs → TextField-B22NRQ91.cjs} +2 -2
- package/dist/{TextField-E85pvJQC.cjs.map → TextField-B22NRQ91.cjs.map} +1 -1
- package/dist/{TextField-SGYWviFf.js → TextField-DkaYK1DI.js} +4 -4
- package/dist/{TextField-SGYWviFf.js.map → TextField-DkaYK1DI.js.map} +1 -1
- package/dist/{ThemeToggle-BdlxzYNt.cjs → ThemeToggle-D5dWHQFb.cjs} +2 -2
- package/dist/{ThemeToggle-BdlxzYNt.cjs.map → ThemeToggle-D5dWHQFb.cjs.map} +1 -1
- package/dist/{ThemeToggle-C2kjFrD_.js → ThemeToggle-DqzUvcK5.js} +4 -4
- package/dist/{ThemeToggle-C2kjFrD_.js.map → ThemeToggle-DqzUvcK5.js.map} +1 -1
- package/dist/{TimeColumns-BS1d0qOp.js → TimeColumns-BEoHh961.js} +2 -2
- package/dist/{TimeColumns-BS1d0qOp.js.map → TimeColumns-BEoHh961.js.map} +1 -1
- package/dist/{TimeColumns-D7-O4Qyt.cjs → TimeColumns-o2xhvSGE.cjs} +2 -2
- package/dist/{TimeColumns-D7-O4Qyt.cjs.map → TimeColumns-o2xhvSGE.cjs.map} +1 -1
- package/dist/{TimePicker-Dzb3gycP.cjs → TimePicker-CACmHwNn.cjs} +2 -2
- package/dist/{TimePicker-Dzb3gycP.cjs.map → TimePicker-CACmHwNn.cjs.map} +1 -1
- package/dist/{TimePicker-DlzYNDN1.js → TimePicker-DCryZCmh.js} +7 -7
- package/dist/{TimePicker-DlzYNDN1.js.map → TimePicker-DCryZCmh.js.map} +1 -1
- package/dist/{Timeline-CKEosWka.cjs → Timeline-CMP93APm.cjs} +2 -2
- package/dist/{Timeline-CKEosWka.cjs.map → Timeline-CMP93APm.cjs.map} +1 -1
- package/dist/{Timeline-ufVXmpMY.js → Timeline-Dri2dPsK.js} +3 -3
- package/dist/{Timeline-ufVXmpMY.js.map → Timeline-Dri2dPsK.js.map} +1 -1
- package/dist/{Toaster-Cummylmj.cjs → Toaster-BwREV06e.cjs} +2 -2
- package/dist/{Toaster-Cummylmj.cjs.map → Toaster-BwREV06e.cjs.map} +1 -1
- package/dist/{Toaster-cu5XyKeE.js → Toaster-DwVLab3k.js} +2 -2
- package/dist/{Toaster-cu5XyKeE.js.map → Toaster-DwVLab3k.js.map} +1 -1
- package/dist/{ToggleButtonGroup-D9odYMzD.js → ToggleButtonGroup-BtVDnQIF.js} +3 -3
- package/dist/{ToggleButtonGroup-D9odYMzD.js.map → ToggleButtonGroup-BtVDnQIF.js.map} +1 -1
- package/dist/{ToggleButtonGroup-M2oj_3mc.cjs → ToggleButtonGroup-UylpGJ16.cjs} +2 -2
- package/dist/{ToggleButtonGroup-M2oj_3mc.cjs.map → ToggleButtonGroup-UylpGJ16.cjs.map} +1 -1
- package/dist/Tooltip-Bw-1Xk2Z.cjs +2 -0
- package/dist/Tooltip-Bw-1Xk2Z.cjs.map +1 -0
- package/dist/Tooltip-DsDv4NOq.js +135 -0
- package/dist/Tooltip-DsDv4NOq.js.map +1 -0
- package/dist/{TranslatedFields-Ccjhq2YL.js → TranslatedFields-B0LMXgiu.js} +5 -5
- package/dist/{TranslatedFields-Ccjhq2YL.js.map → TranslatedFields-B0LMXgiu.js.map} +1 -1
- package/dist/{TranslatedFields-CbTlgKnh.cjs → TranslatedFields-sio1Qfy7.cjs} +2 -2
- package/dist/{TranslatedFields-CbTlgKnh.cjs.map → TranslatedFields-sio1Qfy7.cjs.map} +1 -1
- package/dist/{UserCard-Bs8kuV2j.js → UserCard-B5FVcJaK.js} +5 -5
- package/dist/{UserCard-Bs8kuV2j.js.map → UserCard-B5FVcJaK.js.map} +1 -1
- package/dist/{UserCard-BfHHfkDr.cjs → UserCard-Dzc4zmPj.cjs} +2 -2
- package/dist/{UserCard-BfHHfkDr.cjs.map → UserCard-Dzc4zmPj.cjs.map} +1 -1
- package/dist/app/AdminRoot.d.cts +7 -2
- package/dist/app/AdminRoot.d.ts +7 -2
- 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/Card.d.cts +9 -1
- package/dist/components/Card/Card.d.ts +9 -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 +2 -2
- package/dist/components/IconButton/index.cjs +1 -1
- package/dist/components/IconButton/index.js +1 -1
- package/dist/components/List/index.cjs +1 -1
- package/dist/components/List/index.js +1 -1
- package/dist/components/Loader/index.cjs +1 -1
- package/dist/components/Loader/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/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/Popover/index.cjs +1 -1
- package/dist/components/Popover/index.js +1 -1
- package/dist/components/Progress/index.cjs +1 -1
- package/dist/components/Progress/index.js +1 -1
- package/dist/components/Radio/RadioGroup.d.cts +1 -1
- package/dist/components/Radio/RadioGroup.d.ts +1 -1
- package/dist/components/Radio/index.cjs +1 -1
- package/dist/components/Radio/index.js +1 -1
- package/dist/components/RemoveDialog/index.cjs +1 -1
- package/dist/components/RemoveDialog/index.js +1 -1
- package/dist/components/RichTextEditor/RichTextEditor.d.cts +16 -1
- package/dist/components/RichTextEditor/RichTextEditor.d.ts +16 -1
- package/dist/components/RichTextEditor/index.cjs +1 -1
- package/dist/components/RichTextEditor/index.js +1 -1
- package/dist/components/RootLayout/RootLayout.d.cts +8 -1
- package/dist/components/RootLayout/RootLayout.d.ts +8 -1
- package/dist/components/RootLayout/SettingsDrawer.d.cts +4 -1
- package/dist/components/RootLayout/SettingsDrawer.d.ts +4 -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 +2 -0
- package/dist/components/Sidebar/Sidebar.d.ts +2 -0
- package/dist/components/Sidebar/index.cjs +1 -1
- package/dist/components/Sidebar/index.js +1 -1
- package/dist/components/SpeedDial/index.cjs +1 -1
- package/dist/components/SpeedDial/index.js +1 -1
- package/dist/components/Stepper/Stepper.d.cts +8 -1
- package/dist/components/Stepper/Stepper.d.ts +8 -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/Table.d.cts +20 -3
- package/dist/components/Table/Table.d.ts +20 -3
- package/dist/components/Table/index.cjs +1 -1
- package/dist/components/Table/index.js +1 -1
- package/dist/components/Table/tableFilter.d.cts +12 -2
- package/dist/components/Table/tableFilter.d.ts +12 -2
- package/dist/components/Tabs/Tabs.d.cts +8 -1
- package/dist/components/Tabs/Tabs.d.ts +8 -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/Tooltip/Tooltip.d.cts +10 -3
- package/dist/components/Tooltip/Tooltip.d.ts +10 -3
- package/dist/components/Tooltip/index.cjs +1 -1
- package/dist/components/Tooltip/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/components.cjs +1 -1
- package/dist/entries/components.js +64 -64
- package/dist/entries/hooks.cjs +1 -1
- package/dist/entries/hooks.d.cts +2 -0
- package/dist/entries/hooks.d.ts +2 -0
- package/dist/entries/hooks.js +9 -8
- 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 +2 -2
- package/dist/entries/theme.cjs +1 -1
- package/dist/entries/theme.d.cts +1 -1
- package/dist/entries/theme.d.ts +1 -1
- package/dist/entries/theme.js +1 -1
- package/dist/hooks/index.d.cts +2 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/useClearUrlOnUnmount.d.cts +19 -0
- package/dist/hooks/useClearUrlOnUnmount.d.ts +19 -0
- package/dist/hooks/useQueryModal.d.cts +40 -0
- package/dist/hooks/useQueryModal.d.ts +40 -0
- package/dist/i18n/messages.d.cts +12 -0
- package/dist/i18n/messages.d.ts +12 -0
- package/dist/icons/names.d.cts +3 -3
- package/dist/icons/names.d.ts +3 -3
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.js +251 -250
- package/dist/{messages-FiUqCKjJ.cjs → messages-DS38X5W2.cjs} +9 -9
- package/dist/messages-DS38X5W2.cjs.map +1 -0
- package/dist/{messages-DCefu6Pn.js → messages-DswDgGe2.js} +52 -10
- package/dist/messages-DswDgGe2.js.map +1 -0
- package/dist/{names-r21QPjcU.js → names-BR1uJs0-.js} +5 -4
- package/dist/names-BR1uJs0-.js.map +1 -0
- package/dist/names-YOCJ4B5J.cjs +2 -0
- package/dist/names-YOCJ4B5J.cjs.map +1 -0
- package/dist/theme/ConfigProvider.d.cts +48 -0
- package/dist/theme/ConfigProvider.d.ts +48 -0
- package/dist/theme/index.d.cts +1 -1
- package/dist/theme/index.d.ts +1 -1
- package/dist/useClearUrlOnUnmount-Cg7v2y5B.cjs +2 -0
- package/dist/useClearUrlOnUnmount-Cg7v2y5B.cjs.map +1 -0
- package/dist/useClearUrlOnUnmount-DOeh6CUN.js +37 -0
- package/dist/useClearUrlOnUnmount-DOeh6CUN.js.map +1 -0
- package/dist/useForm-CGbJ44Gp.js +194 -0
- package/dist/useForm-CGbJ44Gp.js.map +1 -0
- package/dist/useForm-CSw6r1n1.cjs +2 -0
- package/dist/useForm-CSw6r1n1.cjs.map +1 -0
- package/dist/{useOptionMenu-BoWyPgbY.cjs → useOptionMenu-BYeSUee6.cjs} +2 -2
- package/dist/{useOptionMenu-BoWyPgbY.cjs.map → useOptionMenu-BYeSUee6.cjs.map} +1 -1
- package/dist/{useOptionMenu-D7EbYG9A.js → useOptionMenu-DtTvY9EC.js} +6 -6
- package/dist/{useOptionMenu-D7EbYG9A.js.map → useOptionMenu-DtTvY9EC.js.map} +1 -1
- package/package.json +1 -1
- package/dist/AdminRoot-9HGp3Mds.js +0 -55
- package/dist/AdminRoot-9HGp3Mds.js.map +0 -1
- package/dist/AdminRoot-D24UJ-4a.cjs +0 -2
- package/dist/AdminRoot-D24UJ-4a.cjs.map +0 -1
- package/dist/Card-CUUh4mlB.cjs +0 -2
- package/dist/Card-CUUh4mlB.cjs.map +0 -1
- package/dist/Card-MxYfQTOY.js +0 -121
- package/dist/Card-MxYfQTOY.js.map +0 -1
- package/dist/ConfigProvider-BbsI15b-.js +0 -320
- package/dist/ConfigProvider-BbsI15b-.js.map +0 -1
- package/dist/ConfigProvider-ByLHqXpv.cjs +0 -2
- package/dist/ConfigProvider-ByLHqXpv.cjs.map +0 -1
- package/dist/DescriptionList-U5z2Faf4.cjs +0 -2
- package/dist/FloatingPanel-BIC4WrFa.cjs +0 -2
- package/dist/FloatingPanel-CeSOtE_D.js +0 -135
- package/dist/Icon-BVULqOJD.cjs +0 -2
- package/dist/Icon-BVULqOJD.cjs.map +0 -1
- package/dist/Icon-DaTvzLBu.js.map +0 -1
- package/dist/RadioGroup-BcFBdFhh.cjs +0 -2
- package/dist/RadioGroup-BcFBdFhh.cjs.map +0 -1
- package/dist/RadioGroup-dVx_hMCY.js +0 -141
- package/dist/RadioGroup-dVx_hMCY.js.map +0 -1
- package/dist/RichTextEditor-BDAWmQrN.js +0 -806
- package/dist/RichTextEditor-BDAWmQrN.js.map +0 -1
- package/dist/RichTextEditor-D4HpPT3C.cjs +0 -2
- package/dist/RichTextEditor-D4HpPT3C.cjs.map +0 -1
- package/dist/RootLayout-CxncyjCz.js +0 -515
- package/dist/RootLayout-CxncyjCz.js.map +0 -1
- package/dist/RootLayout-XEcU_MBs.cjs +0 -2
- package/dist/RootLayout-XEcU_MBs.cjs.map +0 -1
- package/dist/Sidebar-B8ecHwZr.cjs +0 -2
- package/dist/Sidebar-B8ecHwZr.cjs.map +0 -1
- package/dist/Sidebar-BgCfnZBF.js.map +0 -1
- package/dist/Stepper-DOSc03YV.cjs +0 -2
- package/dist/Stepper-DOSc03YV.cjs.map +0 -1
- package/dist/Stepper-DtYamv1q.js +0 -165
- package/dist/Stepper-DtYamv1q.js.map +0 -1
- package/dist/Table-AzNzUAkl.js +0 -1170
- package/dist/Table-AzNzUAkl.js.map +0 -1
- package/dist/Table-CrpWhZUg.cjs +0 -2
- package/dist/Table-CrpWhZUg.cjs.map +0 -1
- package/dist/Tabs-CMnLXRjA.cjs +0 -2
- package/dist/Tabs-CMnLXRjA.cjs.map +0 -1
- package/dist/Tabs-D1RGhKsa.js +0 -190
- package/dist/Tabs-D1RGhKsa.js.map +0 -1
- package/dist/Tooltip-Ao7az09p.cjs +0 -2
- package/dist/Tooltip-Ao7az09p.cjs.map +0 -1
- package/dist/Tooltip-Cb_FKxT9.js +0 -65
- package/dist/Tooltip-Cb_FKxT9.js.map +0 -1
- package/dist/messages-DCefu6Pn.js.map +0 -1
- package/dist/messages-FiUqCKjJ.cjs.map +0 -1
- package/dist/names-BJnFU_5m.cjs +0 -2
- package/dist/names-BJnFU_5m.cjs.map +0 -1
- package/dist/names-r21QPjcU.js.map +0 -1
- package/dist/useForm-CN-qCrP7.js +0 -144
- package/dist/useForm-CN-qCrP7.js.map +0 -1
- package/dist/useForm-WvV361y6.cjs +0 -2
- package/dist/useForm-WvV361y6.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RootLayout-XEcU_MBs.cjs","sources":["../src/components/RootLayout/SettingsDrawer.tsx","../src/components/RootLayout/ActionSet.tsx","../src/components/RootLayout/RootLayout.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { DEFAULT_FONT_FAMILY, useT, useTheme } from '../../theme'\nimport { Col } from '../Flex'\nimport { Divider } from '../Divider'\nimport { Modal } from '../Modal'\nimport { ChoiceCardGroup } from '../ChoiceCard'\nimport { Select } from '../Select'\nimport { SwatchPicker } from '../SwatchPicker'\nimport { Typography } from '../Typography'\n\n// Accent choices offered alongside the provider's default (which leads each list) — 15 per mode, so\n// each theme shows 16 total. Tuned PER MODE (deeper tones for light, brighter for dark) and paired by\n// hue (red → violet + a neutral) so a color keeps its identity across themes.\nconst ALT_SWATCHES: Record<'light' | 'dark', string[]> = {\n light: [\n '#dc2626', // red\n '#ea580c', // orange\n '#d97706', // amber\n '#ca8a04', // yellow\n '#65a30d', // lime\n '#16a34a', // green\n '#059669', // emerald\n '#0891b2', // cyan\n '#0284c7', // sky\n '#2563eb', // blue\n '#4f46e5', // indigo\n '#7c3aed', // violet\n '#c026d3', // fuchsia\n '#db2777', // pink\n '#475569', // slate\n ],\n dark: [\n '#f87171', // red\n '#fb923c', // orange\n '#fbbf24', // amber\n '#facc15', // yellow\n '#a3e635', // lime\n '#4ade80', // green\n '#34d399', // emerald\n '#22d3ee', // cyan\n '#38bdf8', // sky\n '#60a5fa', // blue\n '#818cf8', // indigo\n '#a78bfa', // violet\n '#e879f9', // fuchsia\n '#f472b6', // pink\n '#94a3b8', // slate\n ],\n}\n\nexport interface SettingsDrawerProps {\n /** Whether the drawer is open. */\n open: boolean\n /** Close handler. */\n onClose: () => void\n /** Show the light/dark **Theme** section (gated by the shell's `header.theme`, the same flag as the header toggle). */\n showTheme?: boolean\n}\n\n/**\n * The header user-menu **Settings** drawer (a right-side `Modal`), top to bottom: a **Theme** section — an\n * exclusive `ChoiceCardGroup` (**Light** / **Dark** cards) driving `useTheme().setMode`, shown only when\n * **`showTheme`** (the shell's `header.theme`, so the header toggle + this section appear/disappear\n * together); **Accent Color** — **two `SwatchPicker`s** (Light + Dark) so both accents are chosen\n * independently, each with a per-mode set (deeper tones for light, brighter for dark), calling\n * `setAccentColor(color, mode)` and persisting it — each list leads with the provider's default for that\n * mode (`defaultAccentColors[mode]`), selected when there's no override (picking it clears the override).\n * When `showTheme` is off the panel is locked to one mode, so **only the active mode's accent picker**\n * shows (the other is pointless without a theme switch);\n * a **Font** section (a searchable `Select` — Inter preset + type any Google Font — driving\n * `setFontFamily`); and a **Header** section (an exclusive `ChoiceCardGroup` **Scrollable** / **Fixed**\n * driving `setHeaderSticky`); and a **Shape** section (an exclusive `ChoiceCardGroup` **Rounded** /\n * **Square** driving `setShape` — `square` flattens every corner in the panel to `border-radius: 0`).\n * Internal to the admin shell — not a public export.\n */\nexport function SettingsDrawer({ open, onClose, showTheme = true }: SettingsDrawerProps) {\n const {\n mode,\n setMode,\n accentColors,\n defaultAccentColors,\n setAccentColor,\n headerSticky,\n setHeaderSticky,\n fontFamily,\n setFontFamily,\n shape,\n setShape,\n } = useTheme()\n const t = useT()\n\n // One searchable Select doubles as a \"type any Google Font\" field. Base = Inter (the only preset) +\n // the active font (so a custom pick stays visible/selectable). While searching, the typed query is\n // offered as its own option — picking it applies + loads that family. Base is always kept in the\n // list (never filtered out) so `value` always resolves in the trigger, even mid-search.\n const [fontQuery, setFontQuery] = useState('')\n const q = fontQuery.trim()\n const base =\n fontFamily !== DEFAULT_FONT_FAMILY ? [DEFAULT_FONT_FAMILY, fontFamily] : [DEFAULT_FONT_FAMILY]\n const showTyped = q.length > 0 && !base.some((f) => f.toLowerCase() === q.toLowerCase())\n const fontOptions = (showTyped ? [q, ...base] : base).map((f) => ({\n value: f,\n label: f === DEFAULT_FONT_FAMILY ? t('settings.fontDefault', { font: f }) : f,\n }))\n\n const picker = (mode: 'light' | 'dark', label: string) => {\n const def = defaultAccentColors[mode]\n // the provider's default (per mode) leads the list; then the mode's alts (minus any collision)\n const colors = [def, ...ALT_SWATCHES[mode].filter((c) => c.toLowerCase() !== def.toLowerCase())]\n return (\n <SwatchPicker\n label={label}\n colors={colors}\n // with no override, this mode's default swatch reads as selected\n value={accentColors[mode] ?? def}\n // the default swatch clears this mode's override; the rest set it\n onChange={(color) =>\n setAccentColor(color.toLowerCase() === def.toLowerCase() ? null : color, mode)\n }\n labels={{ [def]: t('settings.accentDefault', { color: def }) }}\n aria-label={String(label)}\n />\n )\n }\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n placement=\"right\"\n size=\"sm\"\n title={t('settings.label')}\n icon=\"Setting5\"\n >\n {showTheme && (\n <>\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.themeTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.themeDesc')}\n </Typography>\n <ChoiceCardGroup\n exclusive\n color=\"accent\"\n minCardWidth={130}\n value={mode}\n onChange={(v) => {\n if (typeof v === 'string') setMode(v as 'light' | 'dark')\n }}\n options={[\n {\n value: 'light',\n label: t('settings.light'),\n description: t('settings.lightDesc'),\n icon: 'Sun',\n },\n {\n value: 'dark',\n label: t('settings.dark'),\n description: t('settings.darkDesc'),\n icon: 'Moon',\n },\n ]}\n aria-label={t('settings.themeTitle')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n </>\n )}\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.accentTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.accentDesc')}\n </Typography>\n <Col gap=\"md\" style={{ marginTop: 'var(--tz-space-sm)' }}>\n {showTheme ? (\n <>\n {picker('light', t('settings.lightTheme'))}\n {picker('dark', t('settings.darkTheme'))}\n </>\n ) : (\n // theme switching is off → the panel stays in one mode, so only that mode's accent matters\n picker(mode, mode === 'light' ? t('settings.lightTheme') : t('settings.darkTheme'))\n )}\n </Col>\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.fontTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.fontDesc')}\n </Typography>\n <Select\n label={t('settings.fontFamily')}\n searchable\n searchPlaceholder={t('settings.fontSearch')}\n value={fontFamily}\n options={fontOptions}\n onSearchChange={setFontQuery}\n onChange={(v) => {\n setFontFamily(v)\n setFontQuery('')\n }}\n aria-label={t('settings.fontFamily')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.headerTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.headerDesc')}\n </Typography>\n <ChoiceCardGroup\n exclusive\n color=\"accent\"\n minCardWidth={130}\n value={headerSticky ? 'fixed' : 'static'}\n // exclusive (radio) → always a string; set sticky from the picked card\n onChange={(v) => {\n if (typeof v === 'string') setHeaderSticky(v === 'fixed')\n }}\n options={[\n {\n value: 'static',\n label: t('settings.scrollable'),\n description: t('settings.scrollableDesc'),\n },\n { value: 'fixed', label: t('settings.fixed'), description: t('settings.fixedDesc') },\n ]}\n aria-label={t('settings.headerTitle')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n\n <Divider style={{ margin: 'var(--tz-space-md) 0' }} />\n\n <Typography variant=\"subtitle\" as=\"h3\">\n {t('settings.shapeTitle')}\n </Typography>\n <Typography\n variant=\"bodySmall\"\n color=\"muted\"\n as=\"p\"\n style={{ marginTop: 'var(--tz-space-xxs)' }}\n >\n {t('settings.shapeDesc')}\n </Typography>\n <ChoiceCardGroup\n exclusive\n color=\"accent\"\n minCardWidth={130}\n value={shape}\n // exclusive (radio) → always a string; the two values are exactly the ThemeShape union\n onChange={(v) => {\n if (v === 'rounded' || v === 'square') setShape(v)\n }}\n options={[\n {\n value: 'rounded',\n label: t('settings.rounded'),\n description: t('settings.roundedDesc'),\n },\n { value: 'square', label: t('settings.square'), description: t('settings.squareDesc') },\n ]}\n aria-label={t('settings.shapeTitle')}\n style={{ marginTop: 'var(--tz-space-sm)' }}\n />\n </Modal>\n )\n}\n","import { type MouseEvent, type ReactNode } from 'react'\nimport { useMediaQuery } from '../../hooks/useMediaQuery'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { Button, type ButtonVariant } from '../Button'\nimport { Icon } from '../Icon'\nimport { SpeedDial } from '../SpeedDial'\nimport styles from './RootLayout.module.css'\n\n/** A resolved page action — rendered as a `Button` (inline) or a `SpeedDial` action (collapsed). */\nexport interface PageAction {\n /** Visible label (button text; the SpeedDial action's tooltip when collapsed). */\n label: ReactNode\n /** Leading icon — an `IconName` or any node. When omitted, the collapsed dial shows the label's first letter. */\n icon?: IconName | ReactNode\n /** Click handler. */\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void\n /** Button color / tint. */\n color?: ThemeColor\n /** Inline-button variant (ignored when collapsed). Defaults to `contained`. */\n variant?: ButtonVariant\n /** Renders the action disabled. */\n disabled?: boolean\n}\n\nconst iconNode = (icon: IconName | ReactNode) =>\n typeof icon === 'string' ? <Icon name={icon as IconName} /> : icon\n\n/** The collapsed SpeedDial action's icon: the action's `icon`, else the label's first letter (uppercased),\n * else a fallback `More` glyph when the label isn't a plain string. */\nconst speedDialIcon = (a: PageAction): IconName | ReactNode => {\n if (a.icon != null) return a.icon\n if (typeof a.label === 'string' && a.label.trim())\n return <span className={styles.pageActionsLetter}>{a.label.trim()[0].toUpperCase()}</span>\n return 'More'\n}\n\n/**\n * Renders a set of page actions in the shell's page-title row: inline `Button`s on wider screens,\n * **collapsed into a `SpeedDial`** (a fixed bottom-right FAB) on the `xs` breakpoint (≤767.98px) when\n * there are **2 or more**. Fed by a route's `staticData.actions` (resolved by `RootLayout`). Internal.\n */\nexport function ActionSet({ actions }: { actions: PageAction[] }) {\n const t = useT()\n // ≤ 767.98px — collapse 2+ actions into a SpeedDial so a row of buttons doesn't crowd a phone header\n const isXs = useMediaQuery('xs')\n if (!actions.length) return null\n\n return isXs && actions.length >= 2 ? (\n <SpeedDial\n ariaLabel={t('pageActions.label')}\n icon=\"Add\"\n direction=\"up\"\n // float it as a fixed bottom-right FAB (out of the title-row flow); inset tightens on xxs\n className={styles.pageActionsFab}\n actions={actions.map((a) => ({\n icon: speedDialIcon(a),\n label: a.label,\n onClick: a.onClick,\n disabled: a.disabled,\n }))}\n />\n ) : (\n <>\n {actions.map((a, i) => (\n <Button\n key={i}\n size=\"sm\"\n color={a.color}\n variant={a.variant}\n disabled={a.disabled}\n startIcon={a.icon != null ? iconNode(a.icon) : undefined}\n onClick={a.onClick}\n >\n {a.label}\n </Button>\n ))}\n </>\n )\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { useNavigate, useRouterState, type LinkProps } from '@tanstack/react-router'\nimport { clsx } from 'clsx'\nimport { useMediaQuery } from '../../hooks/useMediaQuery'\nimport { useLockBodyScroll } from '../../hooks/useLockBodyScroll'\nimport {\n useHeaderConfig,\n useLanguage,\n useT,\n useTheme,\n type HeaderConfig,\n type HeaderUser,\n} from '../../theme'\nimport { Avatar } from '../Avatar'\nimport { Col, Row } from '../Flex'\nimport { Divider } from '../Divider'\nimport { Dropdown } from '../Dropdown'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { ListItem } from '../List'\nimport { FullscreenToggle } from '../FullscreenToggle'\nimport { ThemeToggle } from '../ThemeToggle'\nimport { Typography } from '../Typography'\nimport { Breadcrumbs } from '../Breadcrumbs'\nimport { Toaster, type ToasterProps } from '../Toast'\nimport { NavSearch, Sidebar, useLeafActions, usePageBack, usePageTitle } from '../Sidebar/Sidebar'\nimport { Flag } from '../Flag'\nimport { SettingsDrawer } from './SettingsDrawer'\nimport { ActionSet, type PageAction } from './ActionSet'\nimport styles from './RootLayout.module.css'\n\n/**\n * The shell header config + its user shape now live in the theme layer (so `config.header` can carry\n * them app-wide). These aliases keep the historical `RootLayout*` names importable.\n */\nexport type RootLayoutUser = HeaderUser\nexport type RootLayoutHeader = HeaderConfig\n\nexport interface RootLayoutProps {\n /** Brand logo at the top of the sidebar card — pass an `<img>`, an `<Icon>`, or any node. */\n logo?: ReactNode\n /** Optional content pinned to the **bottom of the sidebar** (e.g. a promo / \"Need help?\" card). */\n sidebarFooter?: ReactNode\n /**\n * Header config for **this** shell — merged **over** the app-wide `config.header` (the prop wins).\n * Fields: the built-in `theme` / `search` / `settings` / `languages` toggles (default `true`),\n * `fullscreen` (default `false`), `breadcrumbs` (default `true`), `pageTitle` (default `true`), and the\n * account (`onLogout` / `user`).\n */\n header?: RootLayoutHeader\n /**\n * The built-in toast viewport, mounted for you so `toast.*()` works app-wide with no extra setup.\n * Defaults to `true` (a `<Toaster>` with its defaults). Pass `ToasterProps` to configure it\n * (`{ position, duration }`), or `false` to opt out — e.g. when you mount your own `<Toaster>`.\n */\n toaster?: boolean | ToasterProps\n /** Routed content — the consumer passes `<Outlet />`. */\n children: ReactNode\n}\n\n/**\n * The admin-panel shell — a **floating** layout: the whole app sits on a soft `--tz-color-background`\n * canvas, with a rounded, elevated `--tz-color-surface` **sidebar card** (`logo` + auto-generated `Sidebar` + an optional\n * `sidebarFooter`) beside the header + content. Set it as the root route's component and pass\n * `<Outlet />` as `children`; the `Sidebar` builds itself from the routes' `staticData`. The header\n * holds an optional `ThemeToggle` (on by default), a **Settings** button (opens a right-side drawer to\n * pick + persist the `accent` color), plus an account `Avatar` whose menu has a **Sign out** item when\n * `header.onLogout` is given. The content area stacks\n * **`Breadcrumbs` → the page title (the active route's `staticData.name`) → `children`**; pages wrap\n * their own body in `PageLayout`. Set `header.pageTitle = false` to drop the auto `h2` when pages\n * carry their own heading inside their `PageLayout` header. On a 404 the auto title + breadcrumbs are\n * suppressed automatically (a partial route match would otherwise show a stale section), regardless of\n * the `header.pageTitle` / `header.breadcrumbs` props. A `<Toaster>` is **mounted by default** so\n * `toast.*()` works app-wide with no extra setup (configure via `toaster`, or `toaster={false}` to opt\n * out). Styling is token-based, so it follows the active `ConfigProvider` mode. Requires\n * `@tanstack/react-router` (peer).\n */\nexport function RootLayout({\n logo,\n sidebarFooter,\n header,\n toaster = true,\n children,\n}: RootLayoutProps) {\n const title = usePageTitle()\n const onBack = usePageBack() // set by the current route's `staticData.back` (opt-in) — else undefined\n // header sticky/static — the user's persisted choice (seeded from config.header.sticky)\n const { headerSticky } = useTheme()\n const { language, setLanguage, languages } = useLanguage()\n const t = useT()\n // app-wide header config (config.header) as the base; this shell's `header` prop wins over it\n const configHeader = useHeaderConfig()\n const h: HeaderConfig = { ...configHeader, ...header }\n const showTheme = h.theme ?? true\n const showFullscreen = h.fullscreen ?? false\n const showSettings = h.settings ?? true\n const showSearch = h.search ?? true\n const showLanguages = h.languages ?? true\n const showBreadcrumbs = h.breadcrumbs ?? true\n const toasterProps = typeof toaster === 'object' ? toaster : undefined\n const showPageTitle = h.pageTitle ?? true\n const onLogout = h.onLogout\n const user = h.user\n const accountMenu = h.menu ?? [] // custom account-menu items (between the user block and Sign out)\n // below 1280px the sidebar auto-collapses (and auto-expands again above it); a manual toggle holds\n // until the next breakpoint cross. `useMediaQuery` is correct on the first client render, so no flash.\n const isNarrow = useMediaQuery('md') // ≤ 1279.98px — the shared `md` breakpoint\n const [collapsed, setCollapsed] = useState(isNarrow)\n useEffect(() => {\n setCollapsed(isNarrow)\n }, [isNarrow])\n // while the sidebar overlays the content (narrow + open), lock page scroll so scrolling inside the\n // drawer doesn't scroll the content behind it\n useLockBodyScroll(isNarrow && !collapsed)\n // navigating from the overlay drawer (a nav link or a search suggestion — both change the route) auto-\n // closes it, so you land on the page instead of the still-open sidebar; desktop navigation is untouched\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n useEffect(() => {\n if (isNarrow) setCollapsed(true)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname])\n // on a 404 the URL often partially matches a named layout route (e.g. `/core/xxx` still resolves\n // \"Core\" as the active section), so the auto page title + breadcrumbs would show a stale, wrong trail.\n // suppress both when the router is in a notFound state — automatic, no opt-out needed. `statusCode ===\n // 404` is the primary signal; a `notFound` match status is the fallback.\n const isNotFound = useRouterState({\n select: (s) => s.statusCode === 404 || s.matches.some((m) => m.status === 'notFound'),\n })\n const [settingsOpen, setSettingsOpen] = useState(false)\n // declarative page-title-row actions from the current route's `staticData.actions` — `to` navigates\n // via the router; `onClick` is a plain handler. Resolved to the `ActionSet` shape here.\n const navigate = useNavigate()\n const routeActions = useLeafActions()\n const pageActions: PageAction[] = (routeActions ?? []).map((a) => ({\n label: a.label,\n icon: a.icon,\n color: a.color,\n variant: a.variant,\n disabled: a.disabled,\n onClick:\n a.onClick ??\n (a.to\n ? () =>\n navigate({ to: a.to as LinkProps['to'], params: a.params, search: a.search } as never)\n : undefined),\n }))\n\n return (\n <div className={clsx(styles.shell, collapsed && styles.shellCollapsed)}>\n <aside className={styles.sidebar}>\n {/* fixed-width inner: the outer <aside> animates its width to 0 (and clips via overflow),\n while this keeps the sidebar's real width so the content never reflows mid-collapse */}\n <div className={styles.sidebarInner}>\n {logo ? (\n <div className={styles.brand}>\n {logo}\n {/* in-drawer close — only shown when the sidebar overlays (narrow), where the header\n toggle is behind the backdrop; closes the drawer */}\n <IconButton\n variant=\"filled\"\n size=\"sm\"\n className={styles.sidebarClose}\n aria-label={t('common.close')}\n onClick={() => setCollapsed(true)}\n >\n <Icon name=\"Close\" />\n </IconButton>\n </div>\n ) : null}\n {/* the search lives in the header on desktop; below 576px (full-width drawer) it moves here,\n between the logo and the menu (CSS toggles which instance shows) */}\n {showSearch ? (\n <div className={styles.sidebarSearch}>\n <NavSearch />\n </div>\n ) : null}\n <div className={styles.navScroll}>\n <Sidebar />\n </div>\n {sidebarFooter ? <div className={styles.sidebarFooter}>{sidebarFooter}</div> : null}\n </div>\n </aside>\n {/* dim backdrop behind the overlay sidebar — a sibling of the sidebar (same stacking context, so the\n sidebar reliably sits above it, unlike a body-portaled Overlay). Only shown/interactive below\n 1280px while open (CSS); clicking it closes the drawer. On desktop the sidebar is a grid column. */}\n <div className={styles.backdrop} onClick={() => setCollapsed(true)} aria-hidden=\"true\" />\n <div className={styles.main}>\n <header className={clsx(styles.topbar, headerSticky && styles.topbarSticky)}>\n <div className={styles.headerStart}>\n <IconButton\n aria-label={collapsed ? 'Show sidebar' : 'Hide sidebar'}\n aria-expanded={!collapsed}\n variant=\"filled\"\n size=\"sm\"\n onClick={() => setCollapsed((c) => !c)}\n >\n <Icon name=\"Menu\" />\n </IconButton>\n {showSearch ? (\n <div className={styles.headerSearch}>\n <NavSearch />\n </div>\n ) : null}\n </div>\n <div className={styles.headerEnd}>\n {showFullscreen ? <FullscreenToggle variant=\"filled\" size=\"sm\" /> : null}\n {showTheme ? <ThemeToggle variant=\"filled\" size=\"sm\" /> : null}\n {showLanguages && languages.length > 1 ? (\n <Dropdown\n placement=\"bottom-end\"\n trigger={\n <IconButton variant=\"filled\" size=\"sm\" aria-label={t('language.label')}>\n <Icon name=\"Global\" />\n </IconButton>\n }\n >\n {languages.map((l) => (\n <ListItem\n key={l.code}\n clickable\n selected={l.code === language}\n onClick={() => setLanguage(l.code)}\n icon={<Flag code={l.code} />}\n >\n {l.label ?? l.code}\n </ListItem>\n ))}\n </Dropdown>\n ) : null}\n {showSettings ? (\n <IconButton\n aria-label={t('settings.label')}\n variant=\"text\"\n size=\"sm\"\n className={styles.settings}\n onClick={() => setSettingsOpen(true)}\n >\n <Icon name=\"Setting5\" />\n </IconButton>\n ) : null}\n {onLogout ? (\n <Dropdown\n placement=\"bottom-end\"\n style={{ minWidth: 230 }}\n trigger={\n <button type=\"button\" className={styles.account} aria-label={t('account.label')}>\n <Avatar size=\"md\" name={user?.name} src={user?.avatar} color=\"primary\" />\n </button>\n }\n >\n {user ? (\n <>\n <Row gap={8} align=\"center\" padding=\"var(--tz-space-xxs) var(--tz-space-xs)\">\n <Avatar size=\"md\" name={user.name} src={user.avatar} color=\"primary\" />\n <Col gap={2}>\n {/* name, or a \"Welcome\" greeting fallback when no name is given */}\n <Typography variant=\"body\">{user.name ?? t('userCard.welcome')}</Typography>\n {user.email ? (\n <Typography variant=\"bodySmall\" color=\"muted\">\n {user.email}\n </Typography>\n ) : null}\n </Col>\n </Row>\n <Divider />\n </>\n ) : null}\n {/* app-supplied items (e.g. \"Account\"), between the user block and Sign out */}\n {accountMenu.map((item, i) => (\n <ListItem\n key={i}\n icon={item.icon ? <Icon name={item.icon} color={item.color} /> : undefined}\n color={item.color}\n clickable\n disabled={item.disabled}\n onClick={item.onClick}\n >\n {item.label}\n </ListItem>\n ))}\n {/* keep the destructive Sign out visually separated from the custom items */}\n {accountMenu.length > 0 ? <Divider /> : null}\n <ListItem icon={<Icon name=\"Logout2\" color=\"error\" />} clickable onClick={onLogout}>\n {t('userCard.signOut')}\n </ListItem>\n </Dropdown>\n ) : null}\n </div>\n </header>\n <main className={styles.content}>\n {showBreadcrumbs && !isNotFound ? <Breadcrumbs /> : null}\n {showPageTitle && !isNotFound && (title || onBack) ? (\n <div className={styles.pageTitleRow}>\n {onBack ? (\n <IconButton\n aria-label={t('pageTitle.back')}\n variant=\"filled\"\n color=\"accent\"\n className={styles.backButton}\n onClick={onBack}\n size=\"sm\"\n >\n <Icon name=\"ArrowLeft\" />\n </IconButton>\n ) : null}\n {title ? (\n <Typography variant=\"h2\" className={styles.pageTitle}>\n {title}\n </Typography>\n ) : null}\n {/* right-aligned page actions from the route's `staticData.actions` */}\n {pageActions.length > 0 ? (\n <div className={styles.pageActions}>\n <ActionSet actions={pageActions} />\n </div>\n ) : null}\n </div>\n ) : null}\n {children}\n </main>\n </div>\n {toaster !== false && <Toaster {...toasterProps} />}\n {showSettings ? (\n <SettingsDrawer\n open={settingsOpen}\n onClose={() => setSettingsOpen(false)}\n showTheme={showTheme}\n />\n ) : null}\n </div>\n )\n}\n"],"names":["ALT_SWATCHES","SettingsDrawer","open","onClose","showTheme","mode","setMode","accentColors","defaultAccentColors","setAccentColor","headerSticky","setHeaderSticky","fontFamily","setFontFamily","shape","setShape","useTheme","t","useT","fontQuery","setFontQuery","useState","q","base","DEFAULT_FONT_FAMILY","fontOptions","f","picker","label","def","colors","c","jsx","SwatchPicker","color","jsxs","Modal","Fragment","Typography","ChoiceCardGroup","v","Divider","Col","Select","iconNode","icon","Icon","speedDialIcon","a","styles","ActionSet","actions","isXs","useMediaQuery","SpeedDial","i","Button","RootLayout","logo","sidebarFooter","header","toaster","children","title","usePageTitle","onBack","usePageBack","language","setLanguage","languages","useLanguage","h","useHeaderConfig","showFullscreen","showSettings","showSearch","showLanguages","showBreadcrumbs","toasterProps","showPageTitle","onLogout","user","accountMenu","isNarrow","collapsed","setCollapsed","useEffect","useLockBodyScroll","pathname","useRouterState","s","isNotFound","m","settingsOpen","setSettingsOpen","navigate","useNavigate","pageActions","useLeafActions","clsx","IconButton","NavSearch","Sidebar","FullscreenToggle","ThemeToggle","Dropdown","l","ListItem","Flag","Avatar","Row","item","Breadcrumbs","Toaster"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const i=require("react/jsx-runtime"),b=require("react"),h=require("@tanstack/react-router"),q=require("clsx"),z=require("./Icon-BVULqOJD.cjs"),x=require("./List-9lUjapQ5.cjs"),O=require("./TextField-E85pvJQC.cjs"),K=require("./Typography-B6ASPrzT.cjs"),M=require("./access-DPUHbE-S.cjs"),V=require("./ConfigProvider-ByLHqXpv.cjs"),Y="_nav_2n8z4_4",U="_module_2n8z4_17",W="_search_2n8z4_25",H="_searchPanel_2n8z4_31",G="_moduleLabel_2n8z4_46",Q="_leaves_2n8z4_57",X="_navBadge_2n8z4_62",J="_navDot_2n8z4_74",Z="_leafDot_2n8z4_82",ee="_collapsible_2n8z4_91",te="_collapsibleClosed_2n8z4_96",ne="_collapsibleInner_2n8z4_99",oe="_chevron_2n8z4_105",se="_chevronButton_2n8z4_115",m={nav:Y,module:U,search:W,searchPanel:H,moduleLabel:G,leaves:Q,navBadge:X,navDot:J,leafDot:Z,collapsible:ee,collapsibleClosed:te,collapsibleInner:ne,chevron:oe,chevronButton:se},T=x.ListItem,ae=e=>e.split("-").map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" "),E=e=>e.replace(/^\/+|\/+$/g,""),D=e=>e.length>1&&e.endsWith("/")?e.slice(0,-1):e,R=(e,n)=>e.order-n.order||e.label.localeCompare(n.label);function $(e){const n=[];for(const l of e){const a=l.staticData,s=E(l.fullPath);!(a!=null&&a.name)||!s||n.push({path:s,name:a.name,sd:a})}const t=new Map(n.map(l=>[l.path,l])),o=n.map(l=>l.path),r=l=>o.some(a=>{var s;return a!==l&&a.startsWith(`${l}/`)&&!((s=t.get(a))!=null&&s.sd.hidden)}),c=new Set(e.map(l=>l.fullPath)),u=l=>c.has(`/${l}/`),f=(l,a)=>{const s=t.get(l);return{label:(s==null?void 0:s.name)??ae(a),icon:s==null?void 0:s.sd.icon,badge:s==null?void 0:s.sd.badge,dot:s==null?void 0:s.sd.dot,order:(s==null?void 0:s.sd.order)??Number.POSITIVE_INFINITY}},g=new Map,d=l=>{let a=g.get(l);if(!a){const s=f(l,l);a={label:s.label,icon:s.icon,order:s.order,groups:new Map},g.set(l,a)}return a},_=[];for(const{path:l,name:a,sd:s}of n){const v=l.split("/");if(v.length<=2&&r(l)||s.hidden)continue;if(v.length===1){_.push({label:a,to:`/${l}`,icon:s.icon,badge:s.badge,dot:s.dot,order:s.order??Number.POSITIVE_INFINITY});continue}const C=d(v[0]);if(v.length===2)C.groups.set(l,{label:a,icon:s.icon,to:`/${l}`,badge:s.badge,dot:s.dot,order:s.order??Number.POSITIVE_INFINITY,leaves:[],isContainer:!1});else{const I=v.slice(0,2).join("/");let L=C.groups.get(I);if(!L){const j=f(I,v[1]);L={label:j.label,icon:j.icon,badge:j.badge,dot:j.dot,order:j.order,to:u(I)?`/${I}`:void 0,leaves:[],isContainer:!0},C.groups.set(I,L)}L.leaves.push({label:a,to:`/${l}`,icon:s.icon,badge:s.badge,dot:s.dot,order:s.order??Number.POSITIVE_INFINITY})}}const p=_.map(l=>({order:l.order,label:l.label,item:{kind:"link",link:{label:l.label,to:l.to,icon:l.icon,badge:l.badge,dot:l.dot}}})),N=[...g.values()].map(l=>({order:l.order,label:l.label,item:{kind:"module",module:{module:l.label,icon:l.icon,groups:[...l.groups.values()].sort(R).map(a=>({label:a.label,icon:a.icon,to:a.to,badge:a.badge,dot:a.dot,children:a.isContainer?a.leaves.sort(R).map(s=>({label:s.label,to:s.to,icon:s.icon,badge:s.badge,dot:s.dot})):void 0}))}}})),k=[...p,...N].sort(R).map(l=>l.item);return{items:k,links:k.flatMap(l=>l.kind==="link"?[l.link]:[]),modules:k.flatMap(l=>l.kind==="module"?[l.module]:[])}}function S(){const e=h.useRouter(),n=M.useAccessKeys();return b.useMemo(()=>$(Object.values(e.looseRoutesById).map(t=>{var o;return{fullPath:t.fullPath,staticData:(o=t.options)==null?void 0:o.staticData}}).filter(t=>{var o;return M.hasAccess((o=t.staticData)==null?void 0:o.roles)})),[e,n])}function B(e){var n;for(const t of e.items){if(t.kind==="link")return t.link.to;for(const o of t.module.groups){if(o.to)return o.to;const r=(n=o.children)==null?void 0:n[0];if(r)return r.to}}}function le(){return B(S())}function re(e){var t;const n=new Map;for(const o of e){const r=(t=o.staticData)==null?void 0:t.name;if(!r)continue;const c=D(o.fullPath);n.has(c)||n.set(c,r)}return n}function A(e,n){const t=[];let o="";for(const r of E(e).split("/").filter(Boolean)){o+=`/${r}`;const c=n.get(o);c&&t.push({name:c,to:o})}return t}function F(){const e=h.useRouter();return b.useMemo(()=>re(Object.values(e.looseRoutesById).map(n=>{var t;return{fullPath:n.fullPath,staticData:(t=n.options)==null?void 0:t.staticData}})),[e])}function w(e,n){if(e!=null)return typeof e=="function"?e(n):e}function ce(e,n,t){return w(e,t)??w(n,t)}function ie(){var n;const e=h.useRouterState({select:t=>t.matches});for(let t=e.length-1;t>=0;t--){const o=w((n=e[t].staticData)==null?void 0:n.title,e[t].params??{});if(o)return o}}function ue(e,n){if(!(e==null||e===!1))return e===!0?{kind:"history"}:{kind:"navigate",to:typeof e=="function"?e(n):e}}function de(){var o;const e=h.useRouter(),n=h.useNavigate(),t=h.useRouterState({select:r=>r.matches});for(let r=t.length-1;r>=0;r--){const c=(o=t[r].staticData)==null?void 0:o.back;if(c==null)continue;const u=ue(c,t[r].params??{});return u?u.kind==="history"?()=>e.history.back():()=>n({to:u.to}):void 0}}function fe(){const e=h.useRouterState({select:n=>n.matches});for(let n=e.length-1;n>=0;n--){const t=e[n].staticData,o=ce(t==null?void 0:t.breadcrumb,t==null?void 0:t.title,e[n].params??{});if(o)return o}}function he(){var n;const e=h.useRouterState({select:t=>t.matches});for(let t=e.length-1;t>=0;t--){const o=(n=e[t].staticData)==null?void 0:n.actions;if(o!=null&&o.length)return o}}function me(){const e=ie(),n=F(),t=h.useRouterState({select:r=>r.location.pathname});if(e!=null)return e;const o=A(t,n);return o.length>0?o[o.length-1].name:void 0}function be(e){const n=new Set;for(const t of e.links)n.add(t.to);for(const t of e.modules)for(const o of t.groups){o.to&&n.add(o.to);for(const r of o.children??[])n.add(r.to)}return n}function pe(e,n){const{leafPath:t,leafTitle:o,navigable:r}=n,c=e.map(({name:u,to:f})=>({label:u,to:f!==t&&r.has(f)?f:void 0}));return o&&(e.length>0&&e[e.length-1].to===t?c[c.length-1]={label:o}:c.push({label:o})),c}function ve(){const e=S(),n=F(),t=h.useRouterState({select:u=>u.location.pathname}),o=fe(),r=B(e),c=pe(A(t,n),{leafPath:D(t),leafTitle:o,navigable:be(e)});return{homeTo:r,items:c}}function ge(){const e=le();return e?i.jsx(h.Navigate,{to:e}):null}function _e(){const{items:e}=S(),n=h.useRouterState({select:c=>c.location.pathname}),t=[];let o=[];const r=()=>{if(o.length===0)return;const c=o;o=[],t.push(i.jsx(x.List,{children:c.map(u=>i.jsx(T,{as:h.Link,to:u.to,icon:u.icon,selected:y(n,u.to),clickable:!0,trailing:P(u.badge,u.dot),children:u.label},u.to))},`links-${c[0].to}`))};for(const c of e){if(c.kind==="link"){o.push(c.link);continue}r();const u=c.module;t.push(i.jsxs("div",{className:m.module,children:[i.jsx(K.Typography,{as:"div",variant:"caption",color:"muted",uppercase:!0,className:m.moduleLabel,children:u.module}),i.jsx(x.List,{children:u.groups.map(f=>i.jsx(Le,{group:f,pathname:n},f.label))})]},`mod-${u.module}`))}return r(),i.jsx("nav",{className:m.nav,children:t})}function xe(e){const n=[];for(const t of e.links)n.push({label:t.label,to:t.to});for(const t of e.modules)for(const o of t.groups){o.to&&n.push({label:o.label,to:o.to,context:t.module});for(const r of o.children??[])n.push({label:r.label,to:r.to,context:`${t.module} · ${o.label}`})}return n}const ke=8;function Ne(){const e=V.useT(),n=S(),t=h.useNavigate(),o=b.useMemo(()=>xe(n),[n]),[r,c]=b.useState(""),[u,f]=b.useState(!1),[g,d]=b.useState(0),_=b.useRef(null),p=b.useMemo(()=>{const a=r.trim().toLowerCase();return a?o.filter(s=>{var v;return s.label.toLowerCase().includes(a)||(((v=s.context)==null?void 0:v.toLowerCase().includes(a))??!1)}).slice(0,ke):[]},[o,r]),N=u&&p.length>0;b.useEffect(()=>d(0),[r]),b.useEffect(()=>{d(a=>a>p.length-1?Math.max(0,p.length-1):a)},[p.length]),b.useEffect(()=>{if(!u)return;const a=s=>{_.current&&!_.current.contains(s.target)&&f(!1)};return document.addEventListener("pointerdown",a),()=>document.removeEventListener("pointerdown",a)},[u]);const k=a=>{t({to:a}),c(""),f(!1)},l=a=>{if(N)if(a.key==="ArrowDown")a.preventDefault(),d(s=>(s+1)%p.length);else if(a.key==="ArrowUp")a.preventDefault(),d(s=>(s-1+p.length)%p.length);else if(a.key==="Enter"){a.preventDefault();const s=p[g];s&&k(s.to)}else a.key==="Escape"&&f(!1)};return i.jsxs("div",{ref:_,className:m.search,role:"combobox","aria-expanded":N,"aria-haspopup":"listbox",children:[i.jsx(O.TextField,{value:r,onChange:a=>{c(a.target.value),f(!0)},onFocus:()=>f(!0),onKeyDown:l,adornment:i.jsx(z.Icon,{name:"SearchNormal"}),placeholder:e("sidebar.searchPages"),"aria-label":e("sidebar.searchPages"),autoComplete:"off"}),N?i.jsx("div",{className:m.searchPanel,children:i.jsx(x.List,{role:"listbox",children:p.map((a,s)=>i.jsx(x.ListItem,{description:a.context,clickable:!0,selected:s===g,onMouseDown:v=>v.preventDefault(),onMouseEnter:()=>d(s),onClick:()=>k(a.to),children:a.label},a.to))})}):null]})}function y(e,n){const t=D(e),o=D(n);return o==="/"?t==="/":t===o||t.startsWith(o+"/")}function Ie(e,n){var t;return e.to&&y(n,e.to)?!0:((t=e.children)==null?void 0:t.some(o=>y(n,o.to)))??!1}function je(e){return e?i.jsx("span",{className:m.navBadge,children:e}):null}function Pe(e){return e?i.jsx("span",{className:m.navDot,style:{background:`var(--tz-color-${e})`}}):null}function P(e,n,t){if(!(e==null&&n==null&&t==null))return i.jsxs(i.Fragment,{children:[je(e),Pe(n),t]})}function Le({group:e,pathname:n}){var f,g;const t=Ie(e,n),o=!!((f=e.children)!=null&&f.length),[r,c]=b.useState(t);if(b.useEffect(()=>{t&&c(!0)},[t]),!o&&e.to)return i.jsx(T,{as:h.Link,to:e.to,icon:e.icon,selected:t,clickable:!0,trailing:P(e.badge,e.dot),children:e.label});const u=i.jsx(z.Icon,{name:"ArrowDown4",size:"sm",className:m.chevron,"data-open":r?"true":"false"});return i.jsxs(i.Fragment,{children:[o&&e.to?i.jsx(T,{as:h.Link,to:e.to,icon:e.icon,selected:t,clickable:!0,onClick:()=>c(!0),trailing:P(e.badge,e.dot,i.jsx("button",{type:"button",className:m.chevronButton,"aria-label":`${r?"Collapse":"Expand"} ${e.label}`,"aria-expanded":r,onClick:d=>{d.preventDefault(),d.stopPropagation(),c(_=>!_)},children:u})),children:e.label}):i.jsx(x.ListItem,{icon:e.icon,selected:t,clickable:!0,"aria-expanded":r,onClick:()=>c(d=>!d),trailing:P(e.badge,e.dot,u),children:e.label}),o?i.jsx("div",{className:q.clsx(m.collapsible,!r&&m.collapsibleClosed),children:i.jsx("div",{className:m.collapsibleInner,children:i.jsx(x.List,{className:m.leaves,children:(g=e.children)==null?void 0:g.map(d=>i.jsx(T,{as:h.Link,to:d.to,icon:i.jsx("span",{className:m.leafDot}),selected:y(n,d.to),size:"md",clickable:!0,trailing:P(d.badge,d.dot),children:d.label},d.to))})})}):null]})}exports.FirstRouteRedirect=ge;exports.NavSearch=Ne;exports.Sidebar=_e;exports.buildNavTree=$;exports.firstNavTo=B;exports.useBreadcrumbs=ve;exports.useLeafActions=he;exports.usePageBack=de;exports.usePageTitle=me;
|
|
2
|
-
//# sourceMappingURL=Sidebar-B8ecHwZr.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar-B8ecHwZr.cjs","sources":["../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["import {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport {\n Link,\n Navigate,\n useNavigate,\n useRouter,\n useRouterState,\n type LinkProps,\n type StaticDataRouteOption,\n} from '@tanstack/react-router'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { List, ListItem, type ListItemProps } from '../List'\nimport { TextField } from '../TextField'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport type { ButtonVariant } from '../Button'\nimport { Typography } from '../Typography'\nimport { hasAccess, useAccessKeys } from '../../helpers/access'\nimport styles from './Sidebar.module.css'\n\n// `ListItem` rendered as a TanStack `Link` — it forwards unrecognized props (like `to`) to the\n// element, so this typed alias lets us pass `to` while keeping `ListItem`'s look + behavior.\nconst NavLink = ListItem as unknown as (props: ListItemProps & { to: string }) => ReactNode\n\nexport type { IconName }\n\n/**\n * A declarative page action for a route's `staticData.actions` — rendered by `RootLayout` in the\n * page-title row (inline `Button`s, collapsing to a `SpeedDial` on `xs` when there are 2+). Because it\n * lives in static route data (no hooks), navigation goes through **`to`** (+ `params` / `search`), which\n * `RootLayout` runs via the router; use **`onClick`** for a plain, module-level handler.\n */\nexport interface RouteAction {\n /** Visible label (button text; the SpeedDial tooltip when collapsed). */\n label: string\n /** Leading icon. When omitted, the collapsed dial shows the label's first letter. */\n icon?: IconName\n /** Navigate target — `RootLayout` calls the router's `navigate({ to, params, search })`. */\n to?: string\n /** Route params for `to`. */\n params?: Record<string, string>\n /** Search params for `to`. */\n search?: Record<string, unknown>\n /** Plain click handler (alternative to `to`; can't use React hooks — it's static route data). */\n onClick?: () => void\n /** Button color / tint. */\n color?: ThemeColor\n /** Inline-button variant (ignored when collapsed). Defaults to `contained`. */\n variant?: ButtonVariant\n /** Renders the action disabled. */\n disabled?: boolean\n}\n\n// Typed `staticData` for consumers — every route describes its own menu entry.\ndeclare module '@tanstack/react-router' {\n interface StaticDataRouteOption {\n /** Menu label. A route with no `name` never appears in the menu. */\n name?: string\n /**\n * Explicit page-title / breadcrumb label for **this** route, taking priority over the path-prefix\n * `name` resolution. Read from the current (leaf) matched route, so it works on **dynamic** routes\n * (e.g. `/core/list/$id`) too. Either a static string, or a **function of the route `params`** —\n * called with the matched route's params so a detail page can title itself from the URL, e.g.\n * `title: ({ id }) => \\`Order #${id}\\``. Does **not** affect the sidebar (which reads only `name`).\n */\n title?: string | ((params: Record<string, string>) => ReactNode)\n /**\n * Explicit **breadcrumb** crumb for **this** route, independent of the page title. Same shape as\n * `title` (string, or a function of the route `params`). For the current-page crumb the priority is\n * `breadcrumb` → `title` → `name`, so a page can show one label in the header (`title`) and a\n * different one in the breadcrumb trail. Does **not** affect the page title or the sidebar.\n */\n breadcrumb?: string | ((params: Record<string, string>) => ReactNode)\n /**\n * Show a **back** arrow left of the page title for **this** route (opt-in). `true` navigates via the\n * **browser history** (`router.history.back()`); a **string** or a **function of the route `params`**\n * navigates to an explicit path (deterministic — survives a deep link / refresh, e.g.\n * `back: '/users'` or `back: ({ id }) => \\`/users/${id}\\``). `false` / omitted → no back button. Read\n * from the leaf matched route; does **not** affect the sidebar.\n */\n back?: boolean | string | ((params: Record<string, string>) => string)\n /**\n * Declarative **page actions** for this route — rendered by `RootLayout` in the page-title row, right\n * of the `h2` (inline `Button`s, collapsing to a `SpeedDial` on `xs` when there are 2+). Read from the\n * leaf matched route. Use `to` for navigation actions; `onClick` for a static handler. Does **not**\n * affect the sidebar.\n */\n actions?: RouteAction[]\n /** Optional menu icon (the library's `IconName` union). */\n icon?: IconName\n /** Sort order within the parent (ascending); falls back to alphabetical. */\n order?: number\n /** Routed but hidden from the menu. */\n hidden?: boolean\n /** Allowed accessKeys (OR — user needs any one). Omitted/empty = public. */\n roles?: string[]\n /** Small text label (e.g. `\"New\"`) shown as a pill on the menu row. */\n badge?: string\n /** Theme color of a small dot indicator on the menu row (e.g. `\"error\"`). */\n dot?: ThemeColor\n }\n}\n\nexport interface NavLeaf {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n}\nexport interface NavGroup {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n children?: NavLeaf[]\n}\nexport interface NavModule {\n module: string\n icon?: IconName\n groups: NavGroup[]\n}\n/**\n * One **top-level** sidebar entry, in the unified order — either a standalone page `link` or a `module`.\n * Top links and modules share a single `staticData.order` scale, so a module can sit before, after, or\n * between the standalone page links (not always after them). Produced by `buildNavTree` as `items`.\n */\nexport type NavItem = { kind: 'link'; link: NavLeaf } | { kind: 'module'; module: NavModule }\n\nconst prettify = (seg: string) =>\n seg\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ')\nconst trimSlashes = (p: string) => p.replace(/^\\/+|\\/+$/g, '')\n/** Normalize a pathname for comparison — drop a single trailing slash (but keep the root `/`). */\nconst normalizePath = (p: string) => (p.length > 1 && p.endsWith('/') ? p.slice(0, -1) : p)\nconst byOrderThenLabel = (\n a: { order: number; label: string },\n b: { order: number; label: string },\n) => a.order - b.order || a.label.localeCompare(b.label)\n\ninterface LeafAcc {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n order: number\n}\ninterface GroupAcc {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n order: number\n leaves: LeafAcc[]\n isContainer: boolean\n}\ninterface ModuleAcc {\n label: string\n icon?: IconName\n order: number\n groups: Map<string, GroupAcc>\n}\n\n/** A single route, reduced to what the menu needs. */\nexport interface NavRoute {\n fullPath: string\n staticData?: StaticDataRouteOption\n}\n\n/**\n * Pure menu builder — derives the 3-level nav tree (module → group → page) from a flat route list.\n * Kept router-free so it's unit-testable; `useNavTree` feeds it the live routes.\n */\nexport function buildNavTree(routes: NavRoute[]): {\n items: NavItem[]\n links: NavLeaf[]\n modules: NavModule[]\n} {\n const entries: Array<{ path: string; name: string; sd: StaticDataRouteOption }> = []\n for (const route of routes) {\n const sd = route.staticData\n const path = trimSlashes(route.fullPath)\n if (!sd?.name || !path) continue\n entries.push({ path, name: sd.name, sd })\n }\n\n const metaByPath = new Map(entries.map((e) => [e.path, e]))\n const paths = entries.map((e) => e.path)\n // A path is a \"container\" only when it has a **non-hidden** descendant — a hidden child must not turn\n // its parent into a container (which would drop the parent's own row and, if every child is hidden,\n // make the whole parent vanish from the menu).\n const isContainer = (p: string) =>\n paths.some((o) => o !== p && o.startsWith(`${p}/`) && !metaByPath.get(o)?.sd.hidden)\n const rawFullPaths = new Set(routes.map((r) => r.fullPath))\n const groupHasOwnPage = (groupKey: string) => rawFullPaths.has(`/${groupKey}/`)\n\n const chrome = (key: string, seg: string) => {\n const e = metaByPath.get(key)\n return {\n label: e?.name ?? prettify(seg),\n icon: e?.sd.icon,\n badge: e?.sd.badge,\n dot: e?.sd.dot,\n order: e?.sd.order ?? Number.POSITIVE_INFINITY,\n }\n }\n\n const modules = new Map<string, ModuleAcc>()\n const getModule = (seg: string) => {\n let mod = modules.get(seg)\n if (!mod) {\n const c = chrome(seg, seg)\n mod = { label: c.label, icon: c.icon, order: c.order, groups: new Map() }\n modules.set(seg, mod)\n }\n return mod\n }\n\n const topLinks: LeafAcc[] = []\n for (const { path, name, sd } of entries) {\n const segs = path.split('/')\n // The menu is 3 levels deep by design (module → group → page). A path only counts as a\n // \"container\" (holds children instead of being its own row) at the module/group levels; a\n // depth-3+ route is always a leaf, so a named page with even-deeper children isn't dropped.\n // Routes deeper than 3 segments still appear — flattened as leaves under their depth-2 group\n // (their `to` stays correct) — the nav just can't nest beyond level 3.\n if ((segs.length <= 2 && isContainer(path)) || sd.hidden) continue\n if (segs.length === 1) {\n topLinks.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n continue\n }\n const mod = getModule(segs[0])\n if (segs.length === 2) {\n mod.groups.set(path, {\n label: name,\n icon: sd.icon,\n to: `/${path}`,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n leaves: [],\n isContainer: false,\n })\n } else {\n const groupKey = segs.slice(0, 2).join('/')\n let group = mod.groups.get(groupKey)\n if (!group) {\n const c = chrome(groupKey, segs[1])\n group = {\n label: c.label,\n icon: c.icon,\n badge: c.badge,\n dot: c.dot,\n order: c.order,\n to: groupHasOwnPage(groupKey) ? `/${groupKey}` : undefined,\n leaves: [],\n isContainer: true,\n }\n mod.groups.set(groupKey, group)\n }\n group.leaves.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n }\n }\n\n // Top-level entries — standalone page links AND modules — share ONE `order` scale, so a module can sit\n // before / after / between the page links (not always after them). Build an ordered union, then derive\n // `links` / `modules` as its order-preserving subsets (still used by search / breadcrumbs / firstNavTo).\n const linkEntries = topLinks.map((l) => ({\n order: l.order,\n label: l.label,\n item: {\n kind: 'link' as const,\n link: { label: l.label, to: l.to, icon: l.icon, badge: l.badge, dot: l.dot },\n },\n }))\n const moduleEntries = [...modules.values()].map((mod) => ({\n order: mod.order,\n label: mod.label,\n item: {\n kind: 'module' as const,\n module: {\n module: mod.label,\n icon: mod.icon,\n groups: [...mod.groups.values()].sort(byOrderThenLabel).map(\n (g): NavGroup => ({\n label: g.label,\n icon: g.icon,\n to: g.to,\n badge: g.badge,\n dot: g.dot,\n children: g.isContainer\n ? g.leaves.sort(byOrderThenLabel).map((l) => ({\n label: l.label,\n to: l.to,\n icon: l.icon,\n badge: l.badge,\n dot: l.dot,\n }))\n : undefined,\n }),\n ),\n } satisfies NavModule,\n },\n }))\n const items: NavItem[] = [...linkEntries, ...moduleEntries]\n .sort(byOrderThenLabel)\n .map((e) => e.item)\n\n return {\n items,\n links: items.flatMap((i) => (i.kind === 'link' ? [i.link] : [])),\n modules: items.flatMap((i) => (i.kind === 'module' ? [i.module] : [])),\n }\n}\n\nfunction useNavTree(): { items: NavItem[]; links: NavLeaf[]; modules: NavModule[] } {\n const router = useRouter()\n const accessKeys = useAccessKeys() // re-render the menu when the user's roles change (login/logout)\n return useMemo(\n () =>\n buildNavTree(\n Object.values(router.looseRoutesById)\n .map((route) => ({\n fullPath: route.fullPath,\n staticData: route.options?.staticData,\n }))\n // Drop pages the current user can't access — empty groups/modules then vanish on their own.\n .filter((route) => hasAccess(route.staticData?.roles)),\n ),\n [router, accessKeys],\n )\n}\n\n/**\n * The first menu destination, following the **unified top-level order** (`items`) — so a module ordered\n * ahead of the page links wins. A link resolves to itself; a module to its first group page / leaf. Used\n * by `FirstRouteRedirect`.\n */\nexport function firstNavTo(tree: { items: NavItem[] }): string | undefined {\n for (const item of tree.items) {\n if (item.kind === 'link') return item.link.to\n for (const group of item.module.groups) {\n if (group.to) return group.to\n const firstChild = group.children?.[0]\n if (firstChild) return firstChild.to\n }\n }\n return undefined\n}\n\nfunction useFirstNavTo() {\n return firstNavTo(useNavTree())\n}\n\n/**\n * A `normalized fullPath → staticData.name` map from **all** routes (index routes included), the same\n * route source the `Sidebar` walks. The key drops a single trailing slash (`/core/list/` → `/core/list`),\n * so a list's **index route** (which carries the name) resolves under the plain path too. A named route\n * never loses its slot to an unnamed one. Pure + router-free, so it's unit-testable.\n */\nexport function buildNameMap(routes: NavRoute[]): Map<string, string> {\n const map = new Map<string, string>()\n for (const route of routes) {\n const name = route.staticData?.name\n if (!name) continue\n const key = normalizePath(route.fullPath)\n if (!map.has(key)) map.set(key, name)\n }\n return map\n}\n\n/**\n * Resolve a pathname's name crumbs from its **cumulative path prefixes** (not the matched-route chain),\n * so a dynamic/detail leaf (e.g. `/core/list/$id`) inherits its named ancestors. Each prefix is looked\n * up in `nameMap` (trailing slashes already normalized on both sides); a prefix with no name is simply\n * **skipped** — it never breaks the chain. Returns the recognized crumbs in order, each with its `to`.\n */\nexport function resolvePathNames(\n pathname: string,\n nameMap: Map<string, string>,\n): Array<{ name: string; to: string }> {\n const out: Array<{ name: string; to: string }> = []\n let prefix = ''\n for (const seg of trimSlashes(pathname).split('/').filter(Boolean)) {\n prefix += `/${seg}` // accumulates `/core`, `/core/list`, … — never trailing-slashed\n const name = nameMap.get(prefix)\n if (name) out.push({ name, to: prefix })\n }\n return out\n}\n\nfunction useNameMap(): Map<string, string> {\n const router = useRouter()\n return useMemo(\n () =>\n buildNameMap(\n Object.values(router.looseRoutesById).map((route) => ({\n fullPath: route.fullPath,\n staticData: route.options?.staticData,\n })),\n ),\n [router],\n )\n}\n\n/** Resolve a `staticData.title` value: a function is called with the route `params`, a string is used\n * as-is, and nullish yields `undefined`. Pure, so it's unit-testable. */\nexport function resolveTitle(\n title: string | ((params: Record<string, string>) => ReactNode) | undefined,\n params: Record<string, string>,\n): ReactNode | undefined {\n if (title == null) return undefined\n return typeof title === 'function' ? title(params) : title\n}\n\n/**\n * The **breadcrumb** crumb label for a route's `staticData`: `breadcrumb` wins over `title` (both\n * resolved via `resolveTitle` — functions called with `params`), so a page can show a different label in\n * the trail than in the header. Returns `undefined` when neither is set. Pure, so it's unit-testable.\n */\nexport function resolveBreadcrumbLabel(\n breadcrumb: string | ((params: Record<string, string>) => ReactNode) | undefined,\n title: string | ((params: Record<string, string>) => ReactNode) | undefined,\n params: Record<string, string>,\n): ReactNode | undefined {\n return resolveTitle(breadcrumb, params) ?? resolveTitle(title, params)\n}\n\n/**\n * The deepest matched route's explicit `staticData.title`, resolved from the live match chain. A string\n * is used as-is; a function is called with that matched route's `params` (so a dynamic detail route can\n * build its label from the URL, e.g. `({ id }) => \\`Order #${id}\\``).\n */\nfunction useLeafTitle(): ReactNode | undefined {\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const resolved = resolveTitle(\n matches[i].staticData?.title,\n (matches[i].params ?? {}) as Record<string, string>,\n )\n if (resolved) return resolved\n }\n return undefined\n}\n\n/**\n * Resolve a `staticData.back` value into a back **target**: `undefined` (nullish / `false` → no back),\n * `{ kind: 'history' }` (`true` → browser history back), or `{ kind: 'navigate', to }` (a string or a\n * `(params) => string`, called with the route params). Pure, so it's unit-testable.\n */\nexport function resolveBackTarget(\n back: boolean | string | ((params: Record<string, string>) => string) | undefined,\n params: Record<string, string>,\n): { kind: 'history' } | { kind: 'navigate'; to: string } | undefined {\n if (back == null || back === false) return undefined\n if (back === true) return { kind: 'history' }\n return { kind: 'navigate', to: typeof back === 'function' ? back(params) : back }\n}\n\n/**\n * A **back**-navigation handler for the current page, from the leaf matched route's `staticData.back`\n * (opt-in), or `undefined` when no route on the chain enables it. `back: true` → browser history back;\n * a string / `(params) => string` → navigate to that explicit path. The first (deepest) match that\n * declares `back` wins; an explicit `back: false` on it disables (even if an ancestor set `true`). Used\n * by `RootLayout` to render the back arrow beside the page title.\n */\nexport function usePageBack(): (() => void) | undefined {\n const router = useRouter()\n const navigate = useNavigate()\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const back = matches[i].staticData?.back\n if (back == null) continue\n const target = resolveBackTarget(back, (matches[i].params ?? {}) as Record<string, string>)\n if (!target) return undefined // an explicit `back: false` disables it\n return target.kind === 'history'\n ? () => router.history.back()\n : () => navigate({ to: target.to as LinkProps['to'] })\n }\n return undefined\n}\n\n/**\n * The deepest matched route's **breadcrumb** crumb override — `staticData.breadcrumb` with a fallback to\n * `staticData.title` (see `resolveBreadcrumbLabel`), resolved from the live match chain with that route's\n * `params`. Lets a page label its breadcrumb crumb independently of its page title.\n */\nfunction useLeafBreadcrumb(): ReactNode | undefined {\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const sd = matches[i].staticData\n const resolved = resolveBreadcrumbLabel(\n sd?.breadcrumb,\n sd?.title,\n (matches[i].params ?? {}) as Record<string, string>,\n )\n if (resolved) return resolved\n }\n return undefined\n}\n\n/** The deepest matched route's `staticData.actions` (the page-title-row action buttons), if any. */\nexport function useLeafActions(): RouteAction[] | undefined {\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const actions = matches[i].staticData?.actions\n if (actions?.length) return actions\n }\n return undefined\n}\n\n/**\n * The current page's title. Priority: the leaf matched route's explicit **`staticData.title`** (works on\n * dynamic routes, read from the match chain), else the **last** recognized name along the current\n * pathname's cumulative prefixes (see `resolvePathNames`), so a dynamic detail route inherits its parent\n * list's name instead of falling back to the nearest named ancestor. Used by `RootLayout` to label the\n * header automatically.\n */\nexport function usePageTitle(): ReactNode | undefined {\n const leafTitle = useLeafTitle()\n const nameMap = useNameMap()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n if (leafTitle != null) return leafTitle\n const names = resolvePathNames(pathname, nameMap)\n return names.length > 0 ? names[names.length - 1].name : undefined\n}\n\n/** One breadcrumb. `to` is set only when the crumb points at a real, navigable menu page. */\nexport interface Breadcrumb {\n label: ReactNode\n to?: string\n}\n\n/** Every `to` that the menu actually navigates to (top links, group pages, leaves). */\nfunction navigablePaths(tree: { links: NavLeaf[]; modules: NavModule[] }): Set<string> {\n const set = new Set<string>()\n for (const link of tree.links) set.add(link.to)\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) set.add(group.to)\n for (const leaf of group.children ?? []) set.add(leaf.to)\n }\n return set\n}\n\n/**\n * Assemble the breadcrumb items from the resolved prefix names. A crumb links when it maps to a real\n * navigable page **and is not the current page itself** (`to === leafPath` — you're already there, so it\n * stays plain text); this is the key difference from a blanket \"last crumb is never a link\" — an\n * **ancestor** crumb (e.g. the parent list while you're on its detail child) keeps its link. `leafTitle`\n * (the leaf route's `staticData.title`) overrides the current page's label when the leaf is itself a\n * named prefix, otherwise it's appended as the trailing current-page crumb. Pure, so it's unit-testable.\n */\nexport function buildBreadcrumbItems(\n resolved: Array<{ name: string; to: string }>,\n opts: { leafPath: string; leafTitle?: ReactNode; navigable: Set<string> },\n): Breadcrumb[] {\n const { leafPath, leafTitle, navigable } = opts\n const items: Breadcrumb[] = resolved.map(({ name, to }) => ({\n label: name,\n to: to !== leafPath && navigable.has(to) ? to : undefined,\n }))\n if (leafTitle) {\n if (resolved.length > 0 && resolved[resolved.length - 1].to === leafPath) {\n // the leaf is itself a named prefix (the current page) — the title overrides its label\n items[items.length - 1] = { label: leafTitle }\n } else {\n // a dynamic / deeper leaf with no prefix name — the title is the trailing current-page crumb\n items.push({ label: leafTitle })\n }\n }\n return items\n}\n\n/**\n * Breadcrumb trail for the current route, derived from the current pathname's **cumulative prefixes**\n * (via `resolvePathNames`) rather than the matched-route chain — so a dynamic/detail route (e.g.\n * `/core/list/$id`) still shows its named ancestors (Core › List) instead of collapsing to the nearest\n * named one. The current-page crumb label follows the priority **`breadcrumb` → `title` → `name`** (via\n * `useLeafBreadcrumb`), so a page can label its crumb independently of its header title: it overrides the\n * leaf's own label when the leaf is a named prefix, else it's appended as the trailing current-page crumb\n * (so a dynamic detail reads Core › List › <breadcrumb>). `homeTo` is the first allowed menu page (same\n * target as `FirstRouteRedirect`). A crumb links only when it maps to a real navigable page **and isn't\n * the current page** — so an ancestor crumb (the parent list while you're on its detail child) stays a\n * link, while the page you're already on is plain text.\n */\nexport function useBreadcrumbs(): { homeTo?: string; items: Breadcrumb[] } {\n const tree = useNavTree()\n const nameMap = useNameMap()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n const leafLabel = useLeafBreadcrumb()\n const homeTo = firstNavTo(tree)\n const items = buildBreadcrumbItems(resolvePathNames(pathname, nameMap), {\n leafPath: normalizePath(pathname),\n leafTitle: leafLabel,\n navigable: navigablePaths(tree),\n })\n return { homeTo, items }\n}\n\n/** Drop-in component for the `/` route: forwards to whatever sits FIRST in the menu. */\nexport function FirstRouteRedirect() {\n const to = useFirstNavTo()\n return to ? <Navigate to={to as LinkProps['to']} /> : null\n}\n\n/** Auto-generated navigation, derived from the routes' `staticData`. Rendered inside `RootLayout`. */\nexport function Sidebar() {\n const { items } = useNavTree()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n\n // Walk the unified order once. Consecutive standalone links share a single `<List>` (so their spacing\n // reads as one block); a module breaks the run and renders as its own labeled block. A module can thus\n // appear before / between / after the page links, wherever its `order` places it.\n const blocks: ReactNode[] = []\n let run: NavLeaf[] = []\n const flushRun = () => {\n if (run.length === 0) return\n const links = run\n run = []\n blocks.push(\n <List key={`links-${links[0].to}`}>\n {links.map((link) => (\n <NavLink\n key={link.to}\n as={Link}\n to={link.to}\n icon={link.icon}\n selected={isActivePath(pathname, link.to)}\n clickable\n trailing={navTrailing(link.badge, link.dot)}\n >\n {link.label}\n </NavLink>\n ))}\n </List>,\n )\n }\n for (const item of items) {\n if (item.kind === 'link') {\n run.push(item.link)\n continue\n }\n flushRun()\n const mod = item.module\n blocks.push(\n <div className={styles.module} key={`mod-${mod.module}`}>\n <Typography\n as=\"div\"\n variant=\"caption\"\n color=\"muted\"\n uppercase\n className={styles.moduleLabel}\n >\n {mod.module}\n </Typography>\n <List>\n {mod.groups.map((group) => (\n <NavGroupItem key={group.label} group={group} pathname={pathname} />\n ))}\n </List>\n </div>,\n )\n }\n flushRun()\n\n return <nav className={styles.nav}>{blocks}</nav>\n}\n\n/** A single searchable destination — a nav page flattened out of the tree, with a breadcrumb context. */\ninterface NavPage {\n label: string\n to: string\n /** Where it lives — e.g. `\"Components · Forms\"` — shown as the muted second line. */\n context?: string\n}\n\n/** Flatten the nav tree into every navigable page (top links + group pages + leaves). */\nfunction flattenPages(tree: { links: NavLeaf[]; modules: NavModule[] }): NavPage[] {\n const pages: NavPage[] = []\n for (const link of tree.links) pages.push({ label: link.label, to: link.to })\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) pages.push({ label: group.label, to: group.to, context: mod.module })\n for (const leaf of group.children ?? [])\n pages.push({\n label: leaf.label,\n to: leaf.to,\n context: `${mod.module} · ${group.label}`,\n })\n }\n return pages\n}\n\nconst MAX_SEARCH_RESULTS = 8\n\n/**\n * Header search over the sidebar's pages — type to filter the nav (by page name or its section) and\n * pick a suggestion to jump there. Data comes from the same `useNavTree` the sidebar uses (so it\n * respects RBAC). Keyboard: Up/Down move, Enter opens, Escape closes. Rendered by `RootLayout`'s header.\n */\nexport function NavSearch() {\n const t = useT()\n const tree = useNavTree()\n const navigate = useNavigate()\n const pages = useMemo(() => flattenPages(tree), [tree])\n\n const [query, setQuery] = useState('')\n const [open, setOpen] = useState(false)\n const [active, setActive] = useState(0)\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const results = useMemo(() => {\n const q = query.trim().toLowerCase()\n if (!q) return []\n return pages\n .filter(\n (p) => p.label.toLowerCase().includes(q) || (p.context?.toLowerCase().includes(q) ?? false),\n )\n .slice(0, MAX_SEARCH_RESULTS)\n }, [pages, query])\n\n const showList = open && results.length > 0\n\n // reset the highlighted row whenever the query changes\n useEffect(() => setActive(0), [query])\n\n // clamp the highlight if the result set shrinks without a query change (e.g. RBAC pages update)\n useEffect(() => {\n setActive((a) => (a > results.length - 1 ? Math.max(0, results.length - 1) : a))\n }, [results.length])\n\n // close the suggestions on an outside pointerdown\n useEffect(() => {\n if (!open) return\n const onDown = (event: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('pointerdown', onDown)\n return () => document.removeEventListener('pointerdown', onDown)\n }, [open])\n\n const go = (to: string) => {\n navigate({ to: to as LinkProps['to'] })\n setQuery('')\n setOpen(false)\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (!showList) return\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n setActive((i) => (i + 1) % results.length)\n } else if (event.key === 'ArrowUp') {\n event.preventDefault()\n setActive((i) => (i - 1 + results.length) % results.length)\n } else if (event.key === 'Enter') {\n event.preventDefault()\n const hit = results[active]\n if (hit) go(hit.to)\n } else if (event.key === 'Escape') {\n setOpen(false)\n }\n }\n\n return (\n <div\n ref={rootRef}\n className={styles.search}\n role=\"combobox\"\n aria-expanded={showList}\n aria-haspopup=\"listbox\"\n >\n <TextField\n value={query}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value)\n setOpen(true)\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={onKeyDown}\n adornment={<Icon name=\"SearchNormal\" />}\n placeholder={t('sidebar.searchPages')}\n aria-label={t('sidebar.searchPages')}\n autoComplete=\"off\"\n />\n {showList ? (\n <div className={styles.searchPanel}>\n <List role=\"listbox\">\n {results.map((page, i) => (\n <ListItem\n key={page.to}\n description={page.context}\n clickable\n selected={i === active}\n // keep the input focused through the click so blur doesn't close the list first\n onMouseDown={(event: MouseEvent) => event.preventDefault()}\n onMouseEnter={() => setActive(i)}\n onClick={() => go(page.to)}\n >\n {page.label}\n </ListItem>\n ))}\n </List>\n </div>\n ) : null}\n </div>\n )\n}\n\n/**\n * Is `to` the active nav target for `currentPath`? True on an **exact** match or when `currentPath` is a\n * **descendant** of `to` (so a parent row highlights for its child routes, e.g. `/core/page` stays active\n * on `/core/page/edit`). Trailing slashes are normalized on both sides (`/x/` === `/x`). The root `/`\n * matches **only exactly** — otherwise every route would count as its descendant.\n */\nexport function isActivePath(currentPath: string, to: string): boolean {\n const a = normalizePath(currentPath)\n const b = normalizePath(to)\n if (b === '/') return a === '/'\n return a === b || a.startsWith(b + '/')\n}\n\nfunction groupIsActive(group: NavGroup, pathname: string): boolean {\n if (group.to && isActivePath(pathname, group.to)) return true\n return group.children?.some((leaf) => isActivePath(pathname, leaf.to)) ?? false\n}\n\n/** A small \"New\"-style pill rendered on a menu row from `staticData.badge`. */\nfunction navBadge(text?: string) {\n return text ? <span className={styles.navBadge}>{text}</span> : null\n}\n\n/** A small colored dot indicator on a menu row from `staticData.dot`. */\nfunction navDot(color?: ThemeColor) {\n return color ? (\n <span className={styles.navDot} style={{ background: `var(--tz-color-${color})` }} />\n ) : null\n}\n\n/** The menu row's trailing slot: dot + badge + an optional chevron (omitted entirely when empty). */\nfunction navTrailing(badge?: string, dot?: ThemeColor, chevron?: ReactNode): ReactNode {\n if (badge == null && dot == null && chevron == null) return undefined\n return (\n <>\n {navBadge(badge)}\n {navDot(dot)}\n {chevron}\n </>\n )\n}\n\nfunction NavGroupItem({ group, pathname }: { group: NavGroup; pathname: string }) {\n const active = groupIsActive(group, pathname)\n const hasChildren = !!group.children?.length\n const [open, setOpen] = useState(active)\n\n // re-open when navigation makes this group active via a path the mount-time seed missed\n // (NavSearch, Breadcrumbs, back/forward) — collapsing an active group hides the current page\n useEffect(() => {\n if (active) setOpen(true)\n }, [active])\n\n // a plain level-2 page (no children) — just a link row\n if (!hasChildren && group.to) {\n return (\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n trailing={navTrailing(group.badge, group.dot)}\n >\n {group.label}\n </NavLink>\n )\n }\n\n const chevron = (\n <Icon\n name=\"ArrowDown4\"\n size=\"sm\"\n className={styles.chevron}\n data-open={open ? 'true' : 'false'}\n />\n )\n\n return (\n <>\n {hasChildren && group.to ? (\n // \"Case B\": the row navigates (and expands); a separate chevron only toggles.\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n onClick={() => setOpen(true)}\n trailing={navTrailing(\n group.badge,\n group.dot,\n <button\n type=\"button\"\n className={styles.chevronButton}\n aria-label={`${open ? 'Collapse' : 'Expand'} ${group.label}`}\n aria-expanded={open}\n onClick={(event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n setOpen((o) => !o)\n }}\n >\n {chevron}\n </button>,\n )}\n >\n {group.label}\n </NavLink>\n ) : (\n // a pure container — the whole row toggles its children\n <ListItem\n icon={group.icon}\n selected={active}\n clickable\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n trailing={navTrailing(group.badge, group.dot, chevron)}\n >\n {group.label}\n </ListItem>\n )}\n {hasChildren ? (\n // smooth collapse, same grid-template-rows technique as Card\n <div className={clsx(styles.collapsible, !open && styles.collapsibleClosed)}>\n <div className={styles.collapsibleInner}>\n <List className={styles.leaves}>\n {group.children?.map((leaf) => (\n <NavLink\n key={leaf.to}\n as={Link}\n to={leaf.to}\n icon={<span className={styles.leafDot} />}\n selected={isActivePath(pathname, leaf.to)}\n size=\"md\"\n clickable\n trailing={navTrailing(leaf.badge, leaf.dot)}\n >\n {leaf.label}\n </NavLink>\n ))}\n </List>\n </div>\n </div>\n ) : null}\n </>\n )\n}\n"],"names":["NavLink","ListItem","prettify","seg","w","trimSlashes","p","normalizePath","byOrderThenLabel","a","b","buildNavTree","routes","entries","route","sd","path","metaByPath","e","paths","isContainer","o","_a","rawFullPaths","r","groupHasOwnPage","groupKey","chrome","key","modules","getModule","mod","c","topLinks","name","segs","group","linkEntries","moduleEntries","g","l","items","i","useNavTree","router","useRouter","accessKeys","useAccessKeys","useMemo","hasAccess","firstNavTo","tree","item","firstChild","useFirstNavTo","buildNameMap","map","resolvePathNames","pathname","nameMap","out","prefix","useNameMap","resolveTitle","title","params","resolveBreadcrumbLabel","breadcrumb","useLeafTitle","matches","useRouterState","s","resolved","resolveBackTarget","back","usePageBack","navigate","useNavigate","target","useLeafBreadcrumb","useLeafActions","actions","usePageTitle","leafTitle","names","navigablePaths","set","link","leaf","buildBreadcrumbItems","opts","leafPath","navigable","to","useBreadcrumbs","leafLabel","homeTo","FirstRouteRedirect","jsx","Navigate","Sidebar","blocks","run","flushRun","links","List","Link","isActivePath","navTrailing","jsxs","styles","Typography","NavGroupItem","flattenPages","pages","MAX_SEARCH_RESULTS","NavSearch","t","useT","query","setQuery","useState","open","setOpen","active","setActive","rootRef","useRef","results","q","showList","useEffect","onDown","event","go","onKeyDown","hit","TextField","Icon","page","currentPath","groupIsActive","navBadge","text","navDot","color","badge","dot","chevron","Fragment","hasChildren","clsx","_b"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar-BgCfnZBF.js","sources":["../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["import {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport {\n Link,\n Navigate,\n useNavigate,\n useRouter,\n useRouterState,\n type LinkProps,\n type StaticDataRouteOption,\n} from '@tanstack/react-router'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { List, ListItem, type ListItemProps } from '../List'\nimport { TextField } from '../TextField'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport type { ButtonVariant } from '../Button'\nimport { Typography } from '../Typography'\nimport { hasAccess, useAccessKeys } from '../../helpers/access'\nimport styles from './Sidebar.module.css'\n\n// `ListItem` rendered as a TanStack `Link` — it forwards unrecognized props (like `to`) to the\n// element, so this typed alias lets us pass `to` while keeping `ListItem`'s look + behavior.\nconst NavLink = ListItem as unknown as (props: ListItemProps & { to: string }) => ReactNode\n\nexport type { IconName }\n\n/**\n * A declarative page action for a route's `staticData.actions` — rendered by `RootLayout` in the\n * page-title row (inline `Button`s, collapsing to a `SpeedDial` on `xs` when there are 2+). Because it\n * lives in static route data (no hooks), navigation goes through **`to`** (+ `params` / `search`), which\n * `RootLayout` runs via the router; use **`onClick`** for a plain, module-level handler.\n */\nexport interface RouteAction {\n /** Visible label (button text; the SpeedDial tooltip when collapsed). */\n label: string\n /** Leading icon. When omitted, the collapsed dial shows the label's first letter. */\n icon?: IconName\n /** Navigate target — `RootLayout` calls the router's `navigate({ to, params, search })`. */\n to?: string\n /** Route params for `to`. */\n params?: Record<string, string>\n /** Search params for `to`. */\n search?: Record<string, unknown>\n /** Plain click handler (alternative to `to`; can't use React hooks — it's static route data). */\n onClick?: () => void\n /** Button color / tint. */\n color?: ThemeColor\n /** Inline-button variant (ignored when collapsed). Defaults to `contained`. */\n variant?: ButtonVariant\n /** Renders the action disabled. */\n disabled?: boolean\n}\n\n// Typed `staticData` for consumers — every route describes its own menu entry.\ndeclare module '@tanstack/react-router' {\n interface StaticDataRouteOption {\n /** Menu label. A route with no `name` never appears in the menu. */\n name?: string\n /**\n * Explicit page-title / breadcrumb label for **this** route, taking priority over the path-prefix\n * `name` resolution. Read from the current (leaf) matched route, so it works on **dynamic** routes\n * (e.g. `/core/list/$id`) too. Either a static string, or a **function of the route `params`** —\n * called with the matched route's params so a detail page can title itself from the URL, e.g.\n * `title: ({ id }) => \\`Order #${id}\\``. Does **not** affect the sidebar (which reads only `name`).\n */\n title?: string | ((params: Record<string, string>) => ReactNode)\n /**\n * Explicit **breadcrumb** crumb for **this** route, independent of the page title. Same shape as\n * `title` (string, or a function of the route `params`). For the current-page crumb the priority is\n * `breadcrumb` → `title` → `name`, so a page can show one label in the header (`title`) and a\n * different one in the breadcrumb trail. Does **not** affect the page title or the sidebar.\n */\n breadcrumb?: string | ((params: Record<string, string>) => ReactNode)\n /**\n * Show a **back** arrow left of the page title for **this** route (opt-in). `true` navigates via the\n * **browser history** (`router.history.back()`); a **string** or a **function of the route `params`**\n * navigates to an explicit path (deterministic — survives a deep link / refresh, e.g.\n * `back: '/users'` or `back: ({ id }) => \\`/users/${id}\\``). `false` / omitted → no back button. Read\n * from the leaf matched route; does **not** affect the sidebar.\n */\n back?: boolean | string | ((params: Record<string, string>) => string)\n /**\n * Declarative **page actions** for this route — rendered by `RootLayout` in the page-title row, right\n * of the `h2` (inline `Button`s, collapsing to a `SpeedDial` on `xs` when there are 2+). Read from the\n * leaf matched route. Use `to` for navigation actions; `onClick` for a static handler. Does **not**\n * affect the sidebar.\n */\n actions?: RouteAction[]\n /** Optional menu icon (the library's `IconName` union). */\n icon?: IconName\n /** Sort order within the parent (ascending); falls back to alphabetical. */\n order?: number\n /** Routed but hidden from the menu. */\n hidden?: boolean\n /** Allowed accessKeys (OR — user needs any one). Omitted/empty = public. */\n roles?: string[]\n /** Small text label (e.g. `\"New\"`) shown as a pill on the menu row. */\n badge?: string\n /** Theme color of a small dot indicator on the menu row (e.g. `\"error\"`). */\n dot?: ThemeColor\n }\n}\n\nexport interface NavLeaf {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n}\nexport interface NavGroup {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n children?: NavLeaf[]\n}\nexport interface NavModule {\n module: string\n icon?: IconName\n groups: NavGroup[]\n}\n/**\n * One **top-level** sidebar entry, in the unified order — either a standalone page `link` or a `module`.\n * Top links and modules share a single `staticData.order` scale, so a module can sit before, after, or\n * between the standalone page links (not always after them). Produced by `buildNavTree` as `items`.\n */\nexport type NavItem = { kind: 'link'; link: NavLeaf } | { kind: 'module'; module: NavModule }\n\nconst prettify = (seg: string) =>\n seg\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ')\nconst trimSlashes = (p: string) => p.replace(/^\\/+|\\/+$/g, '')\n/** Normalize a pathname for comparison — drop a single trailing slash (but keep the root `/`). */\nconst normalizePath = (p: string) => (p.length > 1 && p.endsWith('/') ? p.slice(0, -1) : p)\nconst byOrderThenLabel = (\n a: { order: number; label: string },\n b: { order: number; label: string },\n) => a.order - b.order || a.label.localeCompare(b.label)\n\ninterface LeafAcc {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n order: number\n}\ninterface GroupAcc {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n order: number\n leaves: LeafAcc[]\n isContainer: boolean\n}\ninterface ModuleAcc {\n label: string\n icon?: IconName\n order: number\n groups: Map<string, GroupAcc>\n}\n\n/** A single route, reduced to what the menu needs. */\nexport interface NavRoute {\n fullPath: string\n staticData?: StaticDataRouteOption\n}\n\n/**\n * Pure menu builder — derives the 3-level nav tree (module → group → page) from a flat route list.\n * Kept router-free so it's unit-testable; `useNavTree` feeds it the live routes.\n */\nexport function buildNavTree(routes: NavRoute[]): {\n items: NavItem[]\n links: NavLeaf[]\n modules: NavModule[]\n} {\n const entries: Array<{ path: string; name: string; sd: StaticDataRouteOption }> = []\n for (const route of routes) {\n const sd = route.staticData\n const path = trimSlashes(route.fullPath)\n if (!sd?.name || !path) continue\n entries.push({ path, name: sd.name, sd })\n }\n\n const metaByPath = new Map(entries.map((e) => [e.path, e]))\n const paths = entries.map((e) => e.path)\n // A path is a \"container\" only when it has a **non-hidden** descendant — a hidden child must not turn\n // its parent into a container (which would drop the parent's own row and, if every child is hidden,\n // make the whole parent vanish from the menu).\n const isContainer = (p: string) =>\n paths.some((o) => o !== p && o.startsWith(`${p}/`) && !metaByPath.get(o)?.sd.hidden)\n const rawFullPaths = new Set(routes.map((r) => r.fullPath))\n const groupHasOwnPage = (groupKey: string) => rawFullPaths.has(`/${groupKey}/`)\n\n const chrome = (key: string, seg: string) => {\n const e = metaByPath.get(key)\n return {\n label: e?.name ?? prettify(seg),\n icon: e?.sd.icon,\n badge: e?.sd.badge,\n dot: e?.sd.dot,\n order: e?.sd.order ?? Number.POSITIVE_INFINITY,\n }\n }\n\n const modules = new Map<string, ModuleAcc>()\n const getModule = (seg: string) => {\n let mod = modules.get(seg)\n if (!mod) {\n const c = chrome(seg, seg)\n mod = { label: c.label, icon: c.icon, order: c.order, groups: new Map() }\n modules.set(seg, mod)\n }\n return mod\n }\n\n const topLinks: LeafAcc[] = []\n for (const { path, name, sd } of entries) {\n const segs = path.split('/')\n // The menu is 3 levels deep by design (module → group → page). A path only counts as a\n // \"container\" (holds children instead of being its own row) at the module/group levels; a\n // depth-3+ route is always a leaf, so a named page with even-deeper children isn't dropped.\n // Routes deeper than 3 segments still appear — flattened as leaves under their depth-2 group\n // (their `to` stays correct) — the nav just can't nest beyond level 3.\n if ((segs.length <= 2 && isContainer(path)) || sd.hidden) continue\n if (segs.length === 1) {\n topLinks.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n continue\n }\n const mod = getModule(segs[0])\n if (segs.length === 2) {\n mod.groups.set(path, {\n label: name,\n icon: sd.icon,\n to: `/${path}`,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n leaves: [],\n isContainer: false,\n })\n } else {\n const groupKey = segs.slice(0, 2).join('/')\n let group = mod.groups.get(groupKey)\n if (!group) {\n const c = chrome(groupKey, segs[1])\n group = {\n label: c.label,\n icon: c.icon,\n badge: c.badge,\n dot: c.dot,\n order: c.order,\n to: groupHasOwnPage(groupKey) ? `/${groupKey}` : undefined,\n leaves: [],\n isContainer: true,\n }\n mod.groups.set(groupKey, group)\n }\n group.leaves.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n }\n }\n\n // Top-level entries — standalone page links AND modules — share ONE `order` scale, so a module can sit\n // before / after / between the page links (not always after them). Build an ordered union, then derive\n // `links` / `modules` as its order-preserving subsets (still used by search / breadcrumbs / firstNavTo).\n const linkEntries = topLinks.map((l) => ({\n order: l.order,\n label: l.label,\n item: {\n kind: 'link' as const,\n link: { label: l.label, to: l.to, icon: l.icon, badge: l.badge, dot: l.dot },\n },\n }))\n const moduleEntries = [...modules.values()].map((mod) => ({\n order: mod.order,\n label: mod.label,\n item: {\n kind: 'module' as const,\n module: {\n module: mod.label,\n icon: mod.icon,\n groups: [...mod.groups.values()].sort(byOrderThenLabel).map(\n (g): NavGroup => ({\n label: g.label,\n icon: g.icon,\n to: g.to,\n badge: g.badge,\n dot: g.dot,\n children: g.isContainer\n ? g.leaves.sort(byOrderThenLabel).map((l) => ({\n label: l.label,\n to: l.to,\n icon: l.icon,\n badge: l.badge,\n dot: l.dot,\n }))\n : undefined,\n }),\n ),\n } satisfies NavModule,\n },\n }))\n const items: NavItem[] = [...linkEntries, ...moduleEntries]\n .sort(byOrderThenLabel)\n .map((e) => e.item)\n\n return {\n items,\n links: items.flatMap((i) => (i.kind === 'link' ? [i.link] : [])),\n modules: items.flatMap((i) => (i.kind === 'module' ? [i.module] : [])),\n }\n}\n\nfunction useNavTree(): { items: NavItem[]; links: NavLeaf[]; modules: NavModule[] } {\n const router = useRouter()\n const accessKeys = useAccessKeys() // re-render the menu when the user's roles change (login/logout)\n return useMemo(\n () =>\n buildNavTree(\n Object.values(router.looseRoutesById)\n .map((route) => ({\n fullPath: route.fullPath,\n staticData: route.options?.staticData,\n }))\n // Drop pages the current user can't access — empty groups/modules then vanish on their own.\n .filter((route) => hasAccess(route.staticData?.roles)),\n ),\n [router, accessKeys],\n )\n}\n\n/**\n * The first menu destination, following the **unified top-level order** (`items`) — so a module ordered\n * ahead of the page links wins. A link resolves to itself; a module to its first group page / leaf. Used\n * by `FirstRouteRedirect`.\n */\nexport function firstNavTo(tree: { items: NavItem[] }): string | undefined {\n for (const item of tree.items) {\n if (item.kind === 'link') return item.link.to\n for (const group of item.module.groups) {\n if (group.to) return group.to\n const firstChild = group.children?.[0]\n if (firstChild) return firstChild.to\n }\n }\n return undefined\n}\n\nfunction useFirstNavTo() {\n return firstNavTo(useNavTree())\n}\n\n/**\n * A `normalized fullPath → staticData.name` map from **all** routes (index routes included), the same\n * route source the `Sidebar` walks. The key drops a single trailing slash (`/core/list/` → `/core/list`),\n * so a list's **index route** (which carries the name) resolves under the plain path too. A named route\n * never loses its slot to an unnamed one. Pure + router-free, so it's unit-testable.\n */\nexport function buildNameMap(routes: NavRoute[]): Map<string, string> {\n const map = new Map<string, string>()\n for (const route of routes) {\n const name = route.staticData?.name\n if (!name) continue\n const key = normalizePath(route.fullPath)\n if (!map.has(key)) map.set(key, name)\n }\n return map\n}\n\n/**\n * Resolve a pathname's name crumbs from its **cumulative path prefixes** (not the matched-route chain),\n * so a dynamic/detail leaf (e.g. `/core/list/$id`) inherits its named ancestors. Each prefix is looked\n * up in `nameMap` (trailing slashes already normalized on both sides); a prefix with no name is simply\n * **skipped** — it never breaks the chain. Returns the recognized crumbs in order, each with its `to`.\n */\nexport function resolvePathNames(\n pathname: string,\n nameMap: Map<string, string>,\n): Array<{ name: string; to: string }> {\n const out: Array<{ name: string; to: string }> = []\n let prefix = ''\n for (const seg of trimSlashes(pathname).split('/').filter(Boolean)) {\n prefix += `/${seg}` // accumulates `/core`, `/core/list`, … — never trailing-slashed\n const name = nameMap.get(prefix)\n if (name) out.push({ name, to: prefix })\n }\n return out\n}\n\nfunction useNameMap(): Map<string, string> {\n const router = useRouter()\n return useMemo(\n () =>\n buildNameMap(\n Object.values(router.looseRoutesById).map((route) => ({\n fullPath: route.fullPath,\n staticData: route.options?.staticData,\n })),\n ),\n [router],\n )\n}\n\n/** Resolve a `staticData.title` value: a function is called with the route `params`, a string is used\n * as-is, and nullish yields `undefined`. Pure, so it's unit-testable. */\nexport function resolveTitle(\n title: string | ((params: Record<string, string>) => ReactNode) | undefined,\n params: Record<string, string>,\n): ReactNode | undefined {\n if (title == null) return undefined\n return typeof title === 'function' ? title(params) : title\n}\n\n/**\n * The **breadcrumb** crumb label for a route's `staticData`: `breadcrumb` wins over `title` (both\n * resolved via `resolveTitle` — functions called with `params`), so a page can show a different label in\n * the trail than in the header. Returns `undefined` when neither is set. Pure, so it's unit-testable.\n */\nexport function resolveBreadcrumbLabel(\n breadcrumb: string | ((params: Record<string, string>) => ReactNode) | undefined,\n title: string | ((params: Record<string, string>) => ReactNode) | undefined,\n params: Record<string, string>,\n): ReactNode | undefined {\n return resolveTitle(breadcrumb, params) ?? resolveTitle(title, params)\n}\n\n/**\n * The deepest matched route's explicit `staticData.title`, resolved from the live match chain. A string\n * is used as-is; a function is called with that matched route's `params` (so a dynamic detail route can\n * build its label from the URL, e.g. `({ id }) => \\`Order #${id}\\``).\n */\nfunction useLeafTitle(): ReactNode | undefined {\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const resolved = resolveTitle(\n matches[i].staticData?.title,\n (matches[i].params ?? {}) as Record<string, string>,\n )\n if (resolved) return resolved\n }\n return undefined\n}\n\n/**\n * Resolve a `staticData.back` value into a back **target**: `undefined` (nullish / `false` → no back),\n * `{ kind: 'history' }` (`true` → browser history back), or `{ kind: 'navigate', to }` (a string or a\n * `(params) => string`, called with the route params). Pure, so it's unit-testable.\n */\nexport function resolveBackTarget(\n back: boolean | string | ((params: Record<string, string>) => string) | undefined,\n params: Record<string, string>,\n): { kind: 'history' } | { kind: 'navigate'; to: string } | undefined {\n if (back == null || back === false) return undefined\n if (back === true) return { kind: 'history' }\n return { kind: 'navigate', to: typeof back === 'function' ? back(params) : back }\n}\n\n/**\n * A **back**-navigation handler for the current page, from the leaf matched route's `staticData.back`\n * (opt-in), or `undefined` when no route on the chain enables it. `back: true` → browser history back;\n * a string / `(params) => string` → navigate to that explicit path. The first (deepest) match that\n * declares `back` wins; an explicit `back: false` on it disables (even if an ancestor set `true`). Used\n * by `RootLayout` to render the back arrow beside the page title.\n */\nexport function usePageBack(): (() => void) | undefined {\n const router = useRouter()\n const navigate = useNavigate()\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const back = matches[i].staticData?.back\n if (back == null) continue\n const target = resolveBackTarget(back, (matches[i].params ?? {}) as Record<string, string>)\n if (!target) return undefined // an explicit `back: false` disables it\n return target.kind === 'history'\n ? () => router.history.back()\n : () => navigate({ to: target.to as LinkProps['to'] })\n }\n return undefined\n}\n\n/**\n * The deepest matched route's **breadcrumb** crumb override — `staticData.breadcrumb` with a fallback to\n * `staticData.title` (see `resolveBreadcrumbLabel`), resolved from the live match chain with that route's\n * `params`. Lets a page label its breadcrumb crumb independently of its page title.\n */\nfunction useLeafBreadcrumb(): ReactNode | undefined {\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const sd = matches[i].staticData\n const resolved = resolveBreadcrumbLabel(\n sd?.breadcrumb,\n sd?.title,\n (matches[i].params ?? {}) as Record<string, string>,\n )\n if (resolved) return resolved\n }\n return undefined\n}\n\n/** The deepest matched route's `staticData.actions` (the page-title-row action buttons), if any. */\nexport function useLeafActions(): RouteAction[] | undefined {\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const actions = matches[i].staticData?.actions\n if (actions?.length) return actions\n }\n return undefined\n}\n\n/**\n * The current page's title. Priority: the leaf matched route's explicit **`staticData.title`** (works on\n * dynamic routes, read from the match chain), else the **last** recognized name along the current\n * pathname's cumulative prefixes (see `resolvePathNames`), so a dynamic detail route inherits its parent\n * list's name instead of falling back to the nearest named ancestor. Used by `RootLayout` to label the\n * header automatically.\n */\nexport function usePageTitle(): ReactNode | undefined {\n const leafTitle = useLeafTitle()\n const nameMap = useNameMap()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n if (leafTitle != null) return leafTitle\n const names = resolvePathNames(pathname, nameMap)\n return names.length > 0 ? names[names.length - 1].name : undefined\n}\n\n/** One breadcrumb. `to` is set only when the crumb points at a real, navigable menu page. */\nexport interface Breadcrumb {\n label: ReactNode\n to?: string\n}\n\n/** Every `to` that the menu actually navigates to (top links, group pages, leaves). */\nfunction navigablePaths(tree: { links: NavLeaf[]; modules: NavModule[] }): Set<string> {\n const set = new Set<string>()\n for (const link of tree.links) set.add(link.to)\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) set.add(group.to)\n for (const leaf of group.children ?? []) set.add(leaf.to)\n }\n return set\n}\n\n/**\n * Assemble the breadcrumb items from the resolved prefix names. A crumb links when it maps to a real\n * navigable page **and is not the current page itself** (`to === leafPath` — you're already there, so it\n * stays plain text); this is the key difference from a blanket \"last crumb is never a link\" — an\n * **ancestor** crumb (e.g. the parent list while you're on its detail child) keeps its link. `leafTitle`\n * (the leaf route's `staticData.title`) overrides the current page's label when the leaf is itself a\n * named prefix, otherwise it's appended as the trailing current-page crumb. Pure, so it's unit-testable.\n */\nexport function buildBreadcrumbItems(\n resolved: Array<{ name: string; to: string }>,\n opts: { leafPath: string; leafTitle?: ReactNode; navigable: Set<string> },\n): Breadcrumb[] {\n const { leafPath, leafTitle, navigable } = opts\n const items: Breadcrumb[] = resolved.map(({ name, to }) => ({\n label: name,\n to: to !== leafPath && navigable.has(to) ? to : undefined,\n }))\n if (leafTitle) {\n if (resolved.length > 0 && resolved[resolved.length - 1].to === leafPath) {\n // the leaf is itself a named prefix (the current page) — the title overrides its label\n items[items.length - 1] = { label: leafTitle }\n } else {\n // a dynamic / deeper leaf with no prefix name — the title is the trailing current-page crumb\n items.push({ label: leafTitle })\n }\n }\n return items\n}\n\n/**\n * Breadcrumb trail for the current route, derived from the current pathname's **cumulative prefixes**\n * (via `resolvePathNames`) rather than the matched-route chain — so a dynamic/detail route (e.g.\n * `/core/list/$id`) still shows its named ancestors (Core › List) instead of collapsing to the nearest\n * named one. The current-page crumb label follows the priority **`breadcrumb` → `title` → `name`** (via\n * `useLeafBreadcrumb`), so a page can label its crumb independently of its header title: it overrides the\n * leaf's own label when the leaf is a named prefix, else it's appended as the trailing current-page crumb\n * (so a dynamic detail reads Core › List › <breadcrumb>). `homeTo` is the first allowed menu page (same\n * target as `FirstRouteRedirect`). A crumb links only when it maps to a real navigable page **and isn't\n * the current page** — so an ancestor crumb (the parent list while you're on its detail child) stays a\n * link, while the page you're already on is plain text.\n */\nexport function useBreadcrumbs(): { homeTo?: string; items: Breadcrumb[] } {\n const tree = useNavTree()\n const nameMap = useNameMap()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n const leafLabel = useLeafBreadcrumb()\n const homeTo = firstNavTo(tree)\n const items = buildBreadcrumbItems(resolvePathNames(pathname, nameMap), {\n leafPath: normalizePath(pathname),\n leafTitle: leafLabel,\n navigable: navigablePaths(tree),\n })\n return { homeTo, items }\n}\n\n/** Drop-in component for the `/` route: forwards to whatever sits FIRST in the menu. */\nexport function FirstRouteRedirect() {\n const to = useFirstNavTo()\n return to ? <Navigate to={to as LinkProps['to']} /> : null\n}\n\n/** Auto-generated navigation, derived from the routes' `staticData`. Rendered inside `RootLayout`. */\nexport function Sidebar() {\n const { items } = useNavTree()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n\n // Walk the unified order once. Consecutive standalone links share a single `<List>` (so their spacing\n // reads as one block); a module breaks the run and renders as its own labeled block. A module can thus\n // appear before / between / after the page links, wherever its `order` places it.\n const blocks: ReactNode[] = []\n let run: NavLeaf[] = []\n const flushRun = () => {\n if (run.length === 0) return\n const links = run\n run = []\n blocks.push(\n <List key={`links-${links[0].to}`}>\n {links.map((link) => (\n <NavLink\n key={link.to}\n as={Link}\n to={link.to}\n icon={link.icon}\n selected={isActivePath(pathname, link.to)}\n clickable\n trailing={navTrailing(link.badge, link.dot)}\n >\n {link.label}\n </NavLink>\n ))}\n </List>,\n )\n }\n for (const item of items) {\n if (item.kind === 'link') {\n run.push(item.link)\n continue\n }\n flushRun()\n const mod = item.module\n blocks.push(\n <div className={styles.module} key={`mod-${mod.module}`}>\n <Typography\n as=\"div\"\n variant=\"caption\"\n color=\"muted\"\n uppercase\n className={styles.moduleLabel}\n >\n {mod.module}\n </Typography>\n <List>\n {mod.groups.map((group) => (\n <NavGroupItem key={group.label} group={group} pathname={pathname} />\n ))}\n </List>\n </div>,\n )\n }\n flushRun()\n\n return <nav className={styles.nav}>{blocks}</nav>\n}\n\n/** A single searchable destination — a nav page flattened out of the tree, with a breadcrumb context. */\ninterface NavPage {\n label: string\n to: string\n /** Where it lives — e.g. `\"Components · Forms\"` — shown as the muted second line. */\n context?: string\n}\n\n/** Flatten the nav tree into every navigable page (top links + group pages + leaves). */\nfunction flattenPages(tree: { links: NavLeaf[]; modules: NavModule[] }): NavPage[] {\n const pages: NavPage[] = []\n for (const link of tree.links) pages.push({ label: link.label, to: link.to })\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) pages.push({ label: group.label, to: group.to, context: mod.module })\n for (const leaf of group.children ?? [])\n pages.push({\n label: leaf.label,\n to: leaf.to,\n context: `${mod.module} · ${group.label}`,\n })\n }\n return pages\n}\n\nconst MAX_SEARCH_RESULTS = 8\n\n/**\n * Header search over the sidebar's pages — type to filter the nav (by page name or its section) and\n * pick a suggestion to jump there. Data comes from the same `useNavTree` the sidebar uses (so it\n * respects RBAC). Keyboard: Up/Down move, Enter opens, Escape closes. Rendered by `RootLayout`'s header.\n */\nexport function NavSearch() {\n const t = useT()\n const tree = useNavTree()\n const navigate = useNavigate()\n const pages = useMemo(() => flattenPages(tree), [tree])\n\n const [query, setQuery] = useState('')\n const [open, setOpen] = useState(false)\n const [active, setActive] = useState(0)\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const results = useMemo(() => {\n const q = query.trim().toLowerCase()\n if (!q) return []\n return pages\n .filter(\n (p) => p.label.toLowerCase().includes(q) || (p.context?.toLowerCase().includes(q) ?? false),\n )\n .slice(0, MAX_SEARCH_RESULTS)\n }, [pages, query])\n\n const showList = open && results.length > 0\n\n // reset the highlighted row whenever the query changes\n useEffect(() => setActive(0), [query])\n\n // clamp the highlight if the result set shrinks without a query change (e.g. RBAC pages update)\n useEffect(() => {\n setActive((a) => (a > results.length - 1 ? Math.max(0, results.length - 1) : a))\n }, [results.length])\n\n // close the suggestions on an outside pointerdown\n useEffect(() => {\n if (!open) return\n const onDown = (event: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('pointerdown', onDown)\n return () => document.removeEventListener('pointerdown', onDown)\n }, [open])\n\n const go = (to: string) => {\n navigate({ to: to as LinkProps['to'] })\n setQuery('')\n setOpen(false)\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (!showList) return\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n setActive((i) => (i + 1) % results.length)\n } else if (event.key === 'ArrowUp') {\n event.preventDefault()\n setActive((i) => (i - 1 + results.length) % results.length)\n } else if (event.key === 'Enter') {\n event.preventDefault()\n const hit = results[active]\n if (hit) go(hit.to)\n } else if (event.key === 'Escape') {\n setOpen(false)\n }\n }\n\n return (\n <div\n ref={rootRef}\n className={styles.search}\n role=\"combobox\"\n aria-expanded={showList}\n aria-haspopup=\"listbox\"\n >\n <TextField\n value={query}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value)\n setOpen(true)\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={onKeyDown}\n adornment={<Icon name=\"SearchNormal\" />}\n placeholder={t('sidebar.searchPages')}\n aria-label={t('sidebar.searchPages')}\n autoComplete=\"off\"\n />\n {showList ? (\n <div className={styles.searchPanel}>\n <List role=\"listbox\">\n {results.map((page, i) => (\n <ListItem\n key={page.to}\n description={page.context}\n clickable\n selected={i === active}\n // keep the input focused through the click so blur doesn't close the list first\n onMouseDown={(event: MouseEvent) => event.preventDefault()}\n onMouseEnter={() => setActive(i)}\n onClick={() => go(page.to)}\n >\n {page.label}\n </ListItem>\n ))}\n </List>\n </div>\n ) : null}\n </div>\n )\n}\n\n/**\n * Is `to` the active nav target for `currentPath`? True on an **exact** match or when `currentPath` is a\n * **descendant** of `to` (so a parent row highlights for its child routes, e.g. `/core/page` stays active\n * on `/core/page/edit`). Trailing slashes are normalized on both sides (`/x/` === `/x`). The root `/`\n * matches **only exactly** — otherwise every route would count as its descendant.\n */\nexport function isActivePath(currentPath: string, to: string): boolean {\n const a = normalizePath(currentPath)\n const b = normalizePath(to)\n if (b === '/') return a === '/'\n return a === b || a.startsWith(b + '/')\n}\n\nfunction groupIsActive(group: NavGroup, pathname: string): boolean {\n if (group.to && isActivePath(pathname, group.to)) return true\n return group.children?.some((leaf) => isActivePath(pathname, leaf.to)) ?? false\n}\n\n/** A small \"New\"-style pill rendered on a menu row from `staticData.badge`. */\nfunction navBadge(text?: string) {\n return text ? <span className={styles.navBadge}>{text}</span> : null\n}\n\n/** A small colored dot indicator on a menu row from `staticData.dot`. */\nfunction navDot(color?: ThemeColor) {\n return color ? (\n <span className={styles.navDot} style={{ background: `var(--tz-color-${color})` }} />\n ) : null\n}\n\n/** The menu row's trailing slot: dot + badge + an optional chevron (omitted entirely when empty). */\nfunction navTrailing(badge?: string, dot?: ThemeColor, chevron?: ReactNode): ReactNode {\n if (badge == null && dot == null && chevron == null) return undefined\n return (\n <>\n {navBadge(badge)}\n {navDot(dot)}\n {chevron}\n </>\n )\n}\n\nfunction NavGroupItem({ group, pathname }: { group: NavGroup; pathname: string }) {\n const active = groupIsActive(group, pathname)\n const hasChildren = !!group.children?.length\n const [open, setOpen] = useState(active)\n\n // re-open when navigation makes this group active via a path the mount-time seed missed\n // (NavSearch, Breadcrumbs, back/forward) — collapsing an active group hides the current page\n useEffect(() => {\n if (active) setOpen(true)\n }, [active])\n\n // a plain level-2 page (no children) — just a link row\n if (!hasChildren && group.to) {\n return (\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n trailing={navTrailing(group.badge, group.dot)}\n >\n {group.label}\n </NavLink>\n )\n }\n\n const chevron = (\n <Icon\n name=\"ArrowDown4\"\n size=\"sm\"\n className={styles.chevron}\n data-open={open ? 'true' : 'false'}\n />\n )\n\n return (\n <>\n {hasChildren && group.to ? (\n // \"Case B\": the row navigates (and expands); a separate chevron only toggles.\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n onClick={() => setOpen(true)}\n trailing={navTrailing(\n group.badge,\n group.dot,\n <button\n type=\"button\"\n className={styles.chevronButton}\n aria-label={`${open ? 'Collapse' : 'Expand'} ${group.label}`}\n aria-expanded={open}\n onClick={(event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n setOpen((o) => !o)\n }}\n >\n {chevron}\n </button>,\n )}\n >\n {group.label}\n </NavLink>\n ) : (\n // a pure container — the whole row toggles its children\n <ListItem\n icon={group.icon}\n selected={active}\n clickable\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n trailing={navTrailing(group.badge, group.dot, chevron)}\n >\n {group.label}\n </ListItem>\n )}\n {hasChildren ? (\n // smooth collapse, same grid-template-rows technique as Card\n <div className={clsx(styles.collapsible, !open && styles.collapsibleClosed)}>\n <div className={styles.collapsibleInner}>\n <List className={styles.leaves}>\n {group.children?.map((leaf) => (\n <NavLink\n key={leaf.to}\n as={Link}\n to={leaf.to}\n icon={<span className={styles.leafDot} />}\n selected={isActivePath(pathname, leaf.to)}\n size=\"md\"\n clickable\n trailing={navTrailing(leaf.badge, leaf.dot)}\n >\n {leaf.label}\n </NavLink>\n ))}\n </List>\n </div>\n </div>\n ) : null}\n </>\n )\n}\n"],"names":["NavLink","ListItem","prettify","seg","w","trimSlashes","p","normalizePath","byOrderThenLabel","a","b","buildNavTree","routes","entries","route","sd","path","metaByPath","e","paths","isContainer","o","_a","rawFullPaths","r","groupHasOwnPage","groupKey","chrome","key","modules","getModule","mod","c","topLinks","name","segs","group","linkEntries","moduleEntries","g","l","items","i","useNavTree","router","useRouter","accessKeys","useAccessKeys","useMemo","hasAccess","firstNavTo","tree","item","firstChild","useFirstNavTo","buildNameMap","map","resolvePathNames","pathname","nameMap","out","prefix","useNameMap","resolveTitle","title","params","resolveBreadcrumbLabel","breadcrumb","useLeafTitle","matches","useRouterState","s","resolved","resolveBackTarget","back","usePageBack","navigate","useNavigate","target","useLeafBreadcrumb","useLeafActions","actions","usePageTitle","leafTitle","names","navigablePaths","set","link","leaf","buildBreadcrumbItems","opts","leafPath","navigable","to","useBreadcrumbs","leafLabel","homeTo","FirstRouteRedirect","jsx","Navigate","Sidebar","blocks","run","flushRun","links","List","Link","isActivePath","navTrailing","jsxs","styles","Typography","NavGroupItem","flattenPages","pages","MAX_SEARCH_RESULTS","NavSearch","t","useT","query","setQuery","useState","open","setOpen","active","setActive","rootRef","useRef","results","q","showList","useEffect","onDown","event","go","onKeyDown","hit","TextField","Icon","page","currentPath","groupIsActive","navBadge","text","navDot","color","badge","dot","chevron","Fragment","hasChildren","clsx","_b"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;GAgCMA,IAAUC,GA4GVC,KAAW,CAACC,MAChBA,EACG,MAAM,GAAG,EACT,IAAI,CAACC,MAAMA,EAAE,OAAO,CAAC,EAAE,gBAAgBA,EAAE,MAAM,CAAC,CAAC,EACjD,KAAK,GAAG,GACPC,IAAc,CAACC,MAAcA,EAAE,QAAQ,cAAc,EAAE,GAEvDC,IAAgB,CAACD,MAAeA,EAAE,SAAS,KAAKA,EAAE,SAAS,GAAG,IAAIA,EAAE,MAAM,GAAG,EAAE,IAAIA,GACnFE,IAAmB,CACvBC,GACAC,MACGD,EAAE,QAAQC,EAAE,SAASD,EAAE,MAAM,cAAcC,EAAE,KAAK;AAqChD,SAASC,GAAaC,GAI3B;AACA,QAAMC,IAA4E,CAAA;AAClF,aAAWC,KAASF,GAAQ;AAC1B,UAAMG,IAAKD,EAAM,YACXE,IAAOX,EAAYS,EAAM,QAAQ;AACvC,IAAI,EAACC,KAAA,QAAAA,EAAI,SAAQ,CAACC,KAClBH,EAAQ,KAAK,EAAE,MAAAG,GAAM,MAAMD,EAAG,MAAM,IAAAA,GAAI;AAAA,EAC1C;AAEA,QAAME,IAAa,IAAI,IAAIJ,EAAQ,IAAI,CAACK,MAAM,CAACA,EAAE,MAAMA,CAAC,CAAC,CAAC,GACpDC,IAAQN,EAAQ,IAAI,CAACK,MAAMA,EAAE,IAAI,GAIjCE,IAAc,CAACd,MACnBa,EAAM,KAAK,CAACE,MAAA;;AAAM,WAAAA,MAAMf,KAAKe,EAAE,WAAW,GAAGf,CAAC,GAAG,KAAK,GAACgB,IAAAL,EAAW,IAAII,CAAC,MAAhB,QAAAC,EAAmB,GAAG;AAAA,GAAM,GAC/EC,IAAe,IAAI,IAAIX,EAAO,IAAI,CAACY,MAAMA,EAAE,QAAQ,CAAC,GACpDC,IAAkB,CAACC,MAAqBH,EAAa,IAAI,IAAIG,CAAQ,GAAG,GAExEC,IAAS,CAACC,GAAazB,MAAgB;AAC3C,UAAMe,IAAID,EAAW,IAAIW,CAAG;AAC5B,WAAO;AAAA,MACL,QAAOV,KAAA,gBAAAA,EAAG,SAAQhB,GAASC,CAAG;AAAA,MAC9B,MAAMe,KAAA,gBAAAA,EAAG,GAAG;AAAA,MACZ,OAAOA,KAAA,gBAAAA,EAAG,GAAG;AAAA,MACb,KAAKA,KAAA,gBAAAA,EAAG,GAAG;AAAA,MACX,QAAOA,KAAA,gBAAAA,EAAG,GAAG,UAAS,OAAO;AAAA,IAAA;AAAA,EAEjC,GAEMW,wBAAc,IAAA,GACdC,IAAY,CAAC3B,MAAgB;AACjC,QAAI4B,IAAMF,EAAQ,IAAI1B,CAAG;AACzB,QAAI,CAAC4B,GAAK;AACR,YAAMC,IAAIL,EAAOxB,GAAKA,CAAG;AACzB,MAAA4B,IAAM,EAAE,OAAOC,EAAE,OAAO,MAAMA,EAAE,MAAM,OAAOA,EAAE,OAAO,QAAQ,oBAAI,MAAI,GACtEH,EAAQ,IAAI1B,GAAK4B,CAAG;AAAA,IACtB;AACA,WAAOA;AAAA,EACT,GAEME,IAAsB,CAAA;AAC5B,aAAW,EAAE,MAAAjB,GAAM,MAAAkB,GAAM,IAAAnB,EAAA,KAAQF,GAAS;AACxC,UAAMsB,IAAOnB,EAAK,MAAM,GAAG;AAM3B,QAAKmB,EAAK,UAAU,KAAKf,EAAYJ,CAAI,KAAMD,EAAG,OAAQ;AAC1D,QAAIoB,EAAK,WAAW,GAAG;AACrB,MAAAF,EAAS,KAAK;AAAA,QACZ,OAAOC;AAAA,QACP,IAAI,IAAIlB,CAAI;AAAA,QACZ,MAAMD,EAAG;AAAA,QACT,OAAOA,EAAG;AAAA,QACV,KAAKA,EAAG;AAAA,QACR,OAAOA,EAAG,SAAS,OAAO;AAAA,MAAA,CAC3B;AACD;AAAA,IACF;AACA,UAAMgB,IAAMD,EAAUK,EAAK,CAAC,CAAC;AAC7B,QAAIA,EAAK,WAAW;AAClB,MAAAJ,EAAI,OAAO,IAAIf,GAAM;AAAA,QACnB,OAAOkB;AAAA,QACP,MAAMnB,EAAG;AAAA,QACT,IAAI,IAAIC,CAAI;AAAA,QACZ,OAAOD,EAAG;AAAA,QACV,KAAKA,EAAG;AAAA,QACR,OAAOA,EAAG,SAAS,OAAO;AAAA,QAC1B,QAAQ,CAAA;AAAA,QACR,aAAa;AAAA,MAAA,CACd;AAAA,SACI;AACL,YAAMW,IAAWS,EAAK,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAC1C,UAAIC,IAAQL,EAAI,OAAO,IAAIL,CAAQ;AACnC,UAAI,CAACU,GAAO;AACV,cAAMJ,IAAIL,EAAOD,GAAUS,EAAK,CAAC,CAAC;AAClC,QAAAC,IAAQ;AAAA,UACN,OAAOJ,EAAE;AAAA,UACT,MAAMA,EAAE;AAAA,UACR,OAAOA,EAAE;AAAA,UACT,KAAKA,EAAE;AAAA,UACP,OAAOA,EAAE;AAAA,UACT,IAAIP,EAAgBC,CAAQ,IAAI,IAAIA,CAAQ,KAAK;AAAA,UACjD,QAAQ,CAAA;AAAA,UACR,aAAa;AAAA,QAAA,GAEfK,EAAI,OAAO,IAAIL,GAAUU,CAAK;AAAA,MAChC;AACA,MAAAA,EAAM,OAAO,KAAK;AAAA,QAChB,OAAOF;AAAA,QACP,IAAI,IAAIlB,CAAI;AAAA,QACZ,MAAMD,EAAG;AAAA,QACT,OAAOA,EAAG;AAAA,QACV,KAAKA,EAAG;AAAA,QACR,OAAOA,EAAG,SAAS,OAAO;AAAA,MAAA,CAC3B;AAAA,IACH;AAAA,EACF;AAKA,QAAMsB,IAAcJ,EAAS,IAAI,CAAC,OAAO;AAAA,IACvC,OAAO,EAAE;AAAA,IACT,OAAO,EAAE;AAAA,IACT,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,KAAK,EAAE,IAAA;AAAA,IAAI;AAAA,EAC7E,EACA,GACIK,IAAgB,CAAC,GAAGT,EAAQ,QAAQ,EAAE,IAAI,CAACE,OAAS;AAAA,IACxD,OAAOA,EAAI;AAAA,IACX,OAAOA,EAAI;AAAA,IACX,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,QAAQA,EAAI;AAAA,QACZ,MAAMA,EAAI;AAAA,QACV,QAAQ,CAAC,GAAGA,EAAI,OAAO,QAAQ,EAAE,KAAKvB,CAAgB,EAAE;AAAA,UACtD,CAAC+B,OAAiB;AAAA,YAChB,OAAOA,EAAE;AAAA,YACT,MAAMA,EAAE;AAAA,YACR,IAAIA,EAAE;AAAA,YACN,OAAOA,EAAE;AAAA,YACT,KAAKA,EAAE;AAAA,YACP,UAAUA,EAAE,cACRA,EAAE,OAAO,KAAK/B,CAAgB,EAAE,IAAI,CAACgC,OAAO;AAAA,cAC1C,OAAOA,EAAE;AAAA,cACT,IAAIA,EAAE;AAAA,cACN,MAAMA,EAAE;AAAA,cACR,OAAOA,EAAE;AAAA,cACT,KAAKA,EAAE;AAAA,YAAA,EACP,IACF;AAAA,UAAA;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF,EACA,GACIC,IAAmB,CAAC,GAAGJ,GAAa,GAAGC,CAAa,EACvD,KAAK9B,CAAgB,EACrB,IAAI,CAACU,MAAMA,EAAE,IAAI;AAEpB,SAAO;AAAA,IACL,OAAAuB;AAAA,IACA,OAAOA,EAAM,QAAQ,CAACC,MAAOA,EAAE,SAAS,SAAS,CAACA,EAAE,IAAI,IAAI,CAAA,CAAG;AAAA,IAC/D,SAASD,EAAM,QAAQ,CAACC,MAAOA,EAAE,SAAS,WAAW,CAACA,EAAE,MAAM,IAAI,CAAA,CAAG;AAAA,EAAA;AAEzE;AAEA,SAASC,IAA2E;AAClF,QAAMC,IAASC,EAAA,GACTC,IAAaC,EAAA;AACnB,SAAOC;AAAA,IACL,MACErC;AAAA,MACE,OAAO,OAAOiC,EAAO,eAAe,EACjC,IAAI,CAAC9B,MAAA;;AAAW;AAAA,UACf,UAAUA,EAAM;AAAA,UAChB,aAAYQ,IAAAR,EAAM,YAAN,gBAAAQ,EAAe;AAAA,QAAA;AAAA,OAC3B,EAED,OAAO,CAACR;;AAAU,eAAAmC,GAAU3B,IAAAR,EAAM,eAAN,gBAAAQ,EAAkB,KAAK;AAAA,OAAC;AAAA,IAAA;AAAA,IAE3D,CAACsB,GAAQE,CAAU;AAAA,EAAA;AAEvB;AAOO,SAASI,EAAWC,GAAgD;;AACzE,aAAWC,KAAQD,EAAK,OAAO;AAC7B,QAAIC,EAAK,SAAS,OAAQ,QAAOA,EAAK,KAAK;AAC3C,eAAWhB,KAASgB,EAAK,OAAO,QAAQ;AACtC,UAAIhB,EAAM,GAAI,QAAOA,EAAM;AAC3B,YAAMiB,KAAa/B,IAAAc,EAAM,aAAN,gBAAAd,EAAiB;AACpC,UAAI+B,UAAmBA,EAAW;AAAA,IACpC;AAAA,EACF;AAEF;AAEA,SAASC,KAAgB;AACvB,SAAOJ,EAAWP,GAAY;AAChC;AAQO,SAASY,GAAa3C,GAAyC;;AACpE,QAAM4C,wBAAU,IAAA;AAChB,aAAW1C,KAASF,GAAQ;AAC1B,UAAMsB,KAAOZ,IAAAR,EAAM,eAAN,gBAAAQ,EAAkB;AAC/B,QAAI,CAACY,EAAM;AACX,UAAMN,IAAMrB,EAAcO,EAAM,QAAQ;AACxC,IAAK0C,EAAI,IAAI5B,CAAG,KAAG4B,EAAI,IAAI5B,GAAKM,CAAI;AAAA,EACtC;AACA,SAAOsB;AACT;AAQO,SAASC,EACdC,GACAC,GACqC;AACrC,QAAMC,IAA2C,CAAA;AACjD,MAAIC,IAAS;AACb,aAAW1D,KAAOE,EAAYqD,CAAQ,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,GAAG;AAClE,IAAAG,KAAU,IAAI1D,CAAG;AACjB,UAAM+B,IAAOyB,EAAQ,IAAIE,CAAM;AAC/B,IAAI3B,KAAM0B,EAAI,KAAK,EAAE,MAAA1B,GAAM,IAAI2B,GAAQ;AAAA,EACzC;AACA,SAAOD;AACT;AAEA,SAASE,IAAkC;AACzC,QAAMlB,IAASC,EAAA;AACf,SAAOG;AAAA,IACL,MACEO;AAAA,MACE,OAAO,OAAOX,EAAO,eAAe,EAAE,IAAI,CAAC9B,MAAA;;AAAW;AAAA,UACpD,UAAUA,EAAM;AAAA,UAChB,aAAYQ,IAAAR,EAAM,YAAN,gBAAAQ,EAAe;AAAA,QAAA;AAAA,OAC3B;AAAA,IAAA;AAAA,IAEN,CAACsB,CAAM;AAAA,EAAA;AAEX;AAIO,SAASmB,EACdC,GACAC,GACuB;AACvB,MAAID,KAAS;AACb,WAAO,OAAOA,KAAU,aAAaA,EAAMC,CAAM,IAAID;AACvD;AAOO,SAASE,GACdC,GACAH,GACAC,GACuB;AACvB,SAAOF,EAAaI,GAAYF,CAAM,KAAKF,EAAaC,GAAOC,CAAM;AACvE;AAOA,SAASG,KAAsC;;AAC7C,QAAMC,IAAUC,EAAe,EAAE,QAAQ,CAACC,MAAMA,EAAE,SAAS;AAC3D,WAAS7B,IAAI2B,EAAQ,SAAS,GAAG3B,KAAK,GAAGA,KAAK;AAC5C,UAAM8B,IAAWT;AAAA,OACfzC,IAAA+C,EAAQ3B,CAAC,EAAE,eAAX,gBAAApB,EAAuB;AAAA,MACtB+C,EAAQ3B,CAAC,EAAE,UAAU,CAAA;AAAA,IAAC;AAEzB,QAAI8B,EAAU,QAAOA;AAAA,EACvB;AAEF;AAOO,SAASC,GACdC,GACAT,GACoE;AACpE,MAAI,EAAAS,KAAQ,QAAQA,MAAS;AAC7B,WAAIA,MAAS,KAAa,EAAE,MAAM,UAAA,IAC3B,EAAE,MAAM,YAAY,IAAI,OAAOA,KAAS,aAAaA,EAAKT,CAAM,IAAIS,EAAA;AAC7E;AASO,SAASC,KAAwC;;AACtD,QAAM/B,IAASC,EAAA,GACT+B,IAAWC,EAAA,GACXR,IAAUC,EAAe,EAAE,QAAQ,CAACC,MAAMA,EAAE,SAAS;AAC3D,WAAS7B,IAAI2B,EAAQ,SAAS,GAAG3B,KAAK,GAAGA,KAAK;AAC5C,UAAMgC,KAAOpD,IAAA+C,EAAQ3B,CAAC,EAAE,eAAX,gBAAApB,EAAuB;AACpC,QAAIoD,KAAQ,KAAM;AAClB,UAAMI,IAASL,GAAkBC,GAAOL,EAAQ3B,CAAC,EAAE,UAAU,EAA6B;AAC1F,WAAKoC,IACEA,EAAO,SAAS,YACnB,MAAMlC,EAAO,QAAQ,KAAA,IACrB,MAAMgC,EAAS,EAAE,IAAIE,EAAO,IAAuB,IAH1C;AAAA,EAIf;AAEF;AAOA,SAASC,KAA2C;AAClD,QAAMV,IAAUC,EAAe,EAAE,QAAQ,CAACC,MAAMA,EAAE,SAAS;AAC3D,WAAS7B,IAAI2B,EAAQ,SAAS,GAAG3B,KAAK,GAAGA,KAAK;AAC5C,UAAM3B,IAAKsD,EAAQ3B,CAAC,EAAE,YAChB8B,IAAWN;AAAA,MACfnD,KAAA,gBAAAA,EAAI;AAAA,MACJA,KAAA,gBAAAA,EAAI;AAAA,MACHsD,EAAQ3B,CAAC,EAAE,UAAU,CAAA;AAAA,IAAC;AAEzB,QAAI8B,EAAU,QAAOA;AAAA,EACvB;AAEF;AAGO,SAASQ,KAA4C;;AAC1D,QAAMX,IAAUC,EAAe,EAAE,QAAQ,CAACC,MAAMA,EAAE,SAAS;AAC3D,WAAS7B,IAAI2B,EAAQ,SAAS,GAAG3B,KAAK,GAAGA,KAAK;AAC5C,UAAMuC,KAAU3D,IAAA+C,EAAQ3B,CAAC,EAAE,eAAX,gBAAApB,EAAuB;AACvC,QAAI2D,KAAA,QAAAA,EAAS,OAAQ,QAAOA;AAAA,EAC9B;AAEF;AASO,SAASC,KAAsC;AACpD,QAAMC,IAAYf,GAAA,GACZT,IAAUG,EAAA,GACVJ,IAAWY,EAAe,EAAE,QAAQ,CAACC,MAAMA,EAAE,SAAS,UAAU;AACtE,MAAIY,KAAa,KAAM,QAAOA;AAC9B,QAAMC,IAAQ3B,EAAiBC,GAAUC,CAAO;AAChD,SAAOyB,EAAM,SAAS,IAAIA,EAAMA,EAAM,SAAS,CAAC,EAAE,OAAO;AAC3D;AASA,SAASC,GAAelC,GAA+D;AACrF,QAAMmC,wBAAU,IAAA;AAChB,aAAWC,KAAQpC,EAAK,MAAO,CAAAmC,EAAI,IAAIC,EAAK,EAAE;AAC9C,aAAWxD,KAAOoB,EAAK;AACrB,eAAWf,KAASL,EAAI,QAAQ;AAC9B,MAAIK,EAAM,MAAIkD,EAAI,IAAIlD,EAAM,EAAE;AAC9B,iBAAWoD,KAAQpD,EAAM,YAAY,CAAA,EAAI,CAAAkD,EAAI,IAAIE,EAAK,EAAE;AAAA,IAC1D;AACF,SAAOF;AACT;AAUO,SAASG,GACdjB,GACAkB,GACc;AACd,QAAM,EAAE,UAAAC,GAAU,WAAAR,GAAW,WAAAS,EAAA,IAAcF,GACrCjD,IAAsB+B,EAAS,IAAI,CAAC,EAAE,MAAAtC,GAAM,IAAA2D,SAAU;AAAA,IAC1D,OAAO3D;AAAA,IACP,IAAI2D,MAAOF,KAAYC,EAAU,IAAIC,CAAE,IAAIA,IAAK;AAAA,EAAA,EAChD;AACF,SAAIV,MACEX,EAAS,SAAS,KAAKA,EAASA,EAAS,SAAS,CAAC,EAAE,OAAOmB,IAE9DlD,EAAMA,EAAM,SAAS,CAAC,IAAI,EAAE,OAAO0C,EAAA,IAGnC1C,EAAM,KAAK,EAAE,OAAO0C,EAAA,CAAW,IAG5B1C;AACT;AAcO,SAASqD,KAA2D;AACzE,QAAM3C,IAAOR,EAAA,GACPgB,IAAUG,EAAA,GACVJ,IAAWY,EAAe,EAAE,QAAQ,CAACC,MAAMA,EAAE,SAAS,UAAU,GAChEwB,IAAYhB,GAAA,GACZiB,IAAS9C,EAAWC,CAAI,GACxBV,IAAQgD,GAAqBhC,EAAiBC,GAAUC,CAAO,GAAG;AAAA,IACtE,UAAUpD,EAAcmD,CAAQ;AAAA,IAChC,WAAWqC;AAAA,IACX,WAAWV,GAAelC,CAAI;AAAA,EAAA,CAC/B;AACD,SAAO,EAAE,QAAA6C,GAAQ,OAAAvD,EAAA;AACnB;AAGO,SAASwD,KAAqB;AACnC,QAAMJ,IAAKvC,GAAA;AACX,SAAOuC,IAAK,gBAAAK,EAACC,GAAA,EAAS,IAAAN,EAAA,CAA2B,IAAK;AACxD;AAGO,SAASO,KAAU;AACxB,QAAM,EAAE,OAAA3D,EAAA,IAAUE,EAAA,GACZe,IAAWY,EAAe,EAAE,QAAQ,CAACC,MAAMA,EAAE,SAAS,UAAU,GAKhE8B,IAAsB,CAAA;AAC5B,MAAIC,IAAiB,CAAA;AACrB,QAAMC,IAAW,MAAM;AACrB,QAAID,EAAI,WAAW,EAAG;AACtB,UAAME,IAAQF;AACd,IAAAA,IAAM,CAAA,GACND,EAAO;AAAA,MACL,gBAAAH,EAACO,GAAA,EACE,UAAAD,EAAM,IAAI,CAACjB,MACV,gBAAAW;AAAA,QAAClG;AAAA,QAAA;AAAA,UAEC,IAAI0G;AAAA,UACJ,IAAInB,EAAK;AAAA,UACT,MAAMA,EAAK;AAAA,UACX,UAAUoB,EAAajD,GAAU6B,EAAK,EAAE;AAAA,UACxC,WAAS;AAAA,UACT,UAAUqB,EAAYrB,EAAK,OAAOA,EAAK,GAAG;AAAA,UAEzC,UAAAA,EAAK;AAAA,QAAA;AAAA,QARDA,EAAK;AAAA,MAAA,CAUb,EAAA,GAbQ,SAASiB,EAAM,CAAC,EAAE,EAAE,EAc/B;AAAA,IAAA;AAAA,EAEJ;AACA,aAAWpD,KAAQX,GAAO;AACxB,QAAIW,EAAK,SAAS,QAAQ;AACxB,MAAAkD,EAAI,KAAKlD,EAAK,IAAI;AAClB;AAAA,IACF;AACA,IAAAmD,EAAA;AACA,UAAMxE,IAAMqB,EAAK;AACjB,IAAAiD,EAAO;AAAA,MACL,gBAAAQ,EAAC,OAAA,EAAI,WAAWC,EAAO,QACrB,UAAA;AAAA,QAAA,gBAAAZ;AAAA,UAACa;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,WAAS;AAAA,YACT,WAAWD,EAAO;AAAA,YAEjB,UAAA/E,EAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAEP,gBAAAmE,EAACO,GAAA,EACE,UAAA1E,EAAI,OAAO,IAAI,CAACK,MACf,gBAAA8D,EAACc,IAAA,EAA+B,OAAA5E,GAAc,UAAAsB,EAAA,GAA3BtB,EAAM,KAAyC,CACnE,EAAA,CACH;AAAA,MAAA,EAAA,GAdkC,OAAOL,EAAI,MAAM,EAerD;AAAA,IAAA;AAAA,EAEJ;AACA,SAAAwE,EAAA,GAEO,gBAAAL,EAAC,OAAA,EAAI,WAAWY,EAAO,KAAM,UAAAT,GAAO;AAC7C;AAWA,SAASY,GAAa9D,GAA6D;AACjF,QAAM+D,IAAmB,CAAA;AACzB,aAAW3B,KAAQpC,EAAK,MAAO,CAAA+D,EAAM,KAAK,EAAE,OAAO3B,EAAK,OAAO,IAAIA,EAAK,GAAA,CAAI;AAC5E,aAAWxD,KAAOoB,EAAK;AACrB,eAAWf,KAASL,EAAI,QAAQ;AAC9B,MAAIK,EAAM,MAAI8E,EAAM,KAAK,EAAE,OAAO9E,EAAM,OAAO,IAAIA,EAAM,IAAI,SAASL,EAAI,QAAQ;AAClF,iBAAWyD,KAAQpD,EAAM,YAAY,CAAA;AACnC,QAAA8E,EAAM,KAAK;AAAA,UACT,OAAO1B,EAAK;AAAA,UACZ,IAAIA,EAAK;AAAA,UACT,SAAS,GAAGzD,EAAI,MAAM,MAAMK,EAAM,KAAK;AAAA,QAAA,CACxC;AAAA,IACL;AACF,SAAO8E;AACT;AAEA,MAAMC,KAAqB;AAOpB,SAASC,KAAY;AAC1B,QAAMC,IAAIC,GAAA,GACJnE,IAAOR,EAAA,GACPiC,IAAWC,EAAA,GACXqC,IAAQlE,EAAQ,MAAMiE,GAAa9D,CAAI,GAAG,CAACA,CAAI,CAAC,GAEhD,CAACoE,GAAOC,CAAQ,IAAIC,EAAS,EAAE,GAC/B,CAACC,GAAMC,CAAO,IAAIF,EAAS,EAAK,GAChC,CAACG,GAAQC,CAAS,IAAIJ,EAAS,CAAC,GAChCK,IAAUC,EAA8B,IAAI,GAE5CC,IAAUhF,EAAQ,MAAM;AAC5B,UAAMiF,IAAIV,EAAM,KAAA,EAAO,YAAA;AACvB,WAAKU,IACEf,EACJ;AAAA,MACC,CAAC5G,MAAA;;AAAM,eAAAA,EAAE,MAAM,cAAc,SAAS2H,CAAC,QAAM3G,IAAAhB,EAAE,YAAF,gBAAAgB,EAAW,cAAc,SAAS2G,OAAM;AAAA;AAAA,IAAA,EAEtF,MAAM,GAAGd,EAAkB,IALf,CAAA;AAAA,EAMjB,GAAG,CAACD,GAAOK,CAAK,CAAC,GAEXW,IAAWR,KAAQM,EAAQ,SAAS;AAG1C,EAAAG,EAAU,MAAMN,EAAU,CAAC,GAAG,CAACN,CAAK,CAAC,GAGrCY,EAAU,MAAM;AACd,IAAAN,EAAU,CAACpH,MAAOA,IAAIuH,EAAQ,SAAS,IAAI,KAAK,IAAI,GAAGA,EAAQ,SAAS,CAAC,IAAIvH,CAAE;AAAA,EACjF,GAAG,CAACuH,EAAQ,MAAM,CAAC,GAGnBG,EAAU,MAAM;AACd,QAAI,CAACT,EAAM;AACX,UAAMU,IAAS,CAACC,MAAwB;AACtC,MAAIP,EAAQ,WAAW,CAACA,EAAQ,QAAQ,SAASO,EAAM,MAAc,KAAGV,EAAQ,EAAK;AAAA,IACvF;AACA,oBAAS,iBAAiB,eAAeS,CAAM,GACxC,MAAM,SAAS,oBAAoB,eAAeA,CAAM;AAAA,EACjE,GAAG,CAACV,CAAI,CAAC;AAET,QAAMY,IAAK,CAACzC,MAAe;AACzB,IAAAjB,EAAS,EAAE,IAAAiB,GAA2B,GACtC2B,EAAS,EAAE,GACXG,EAAQ,EAAK;AAAA,EACf,GAEMY,IAAY,CAACF,MAA2C;AAC5D,QAAKH;AACL,UAAIG,EAAM,QAAQ;AAChB,QAAAA,EAAM,eAAA,GACNR,EAAU,CAACnF,OAAOA,IAAI,KAAKsF,EAAQ,MAAM;AAAA,eAChCK,EAAM,QAAQ;AACvB,QAAAA,EAAM,eAAA,GACNR,EAAU,CAACnF,OAAOA,IAAI,IAAIsF,EAAQ,UAAUA,EAAQ,MAAM;AAAA,eACjDK,EAAM,QAAQ,SAAS;AAChC,QAAAA,EAAM,eAAA;AACN,cAAMG,IAAMR,EAAQJ,CAAM;AAC1B,QAAIY,KAAKF,EAAGE,EAAI,EAAE;AAAA,MACpB,MAAA,CAAWH,EAAM,QAAQ,YACvBV,EAAQ,EAAK;AAAA,EAEjB;AAEA,SACE,gBAAAd;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKiB;AAAA,MACL,WAAWhB,EAAO;AAAA,MAClB,MAAK;AAAA,MACL,iBAAeoB;AAAA,MACf,iBAAc;AAAA,MAEd,UAAA;AAAA,QAAA,gBAAAhC;AAAA,UAACuC;AAAA,UAAA;AAAA,YACC,OAAOlB;AAAA,YACP,UAAU,CAACc,MAAyC;AAClD,cAAAb,EAASa,EAAM,OAAO,KAAK,GAC3BV,EAAQ,EAAI;AAAA,YACd;AAAA,YACA,SAAS,MAAMA,EAAQ,EAAI;AAAA,YAC3B,WAAAY;AAAA,YACA,WAAW,gBAAArC,EAACwC,GAAA,EAAK,MAAK,eAAA,CAAe;AAAA,YACrC,aAAarB,EAAE,qBAAqB;AAAA,YACpC,cAAYA,EAAE,qBAAqB;AAAA,YACnC,cAAa;AAAA,UAAA;AAAA,QAAA;AAAA,QAEda,IACC,gBAAAhC,EAAC,OAAA,EAAI,WAAWY,EAAO,aACrB,UAAA,gBAAAZ,EAACO,GAAA,EAAK,MAAK,WACR,UAAAuB,EAAQ,IAAI,CAACW,GAAMjG,MAClB,gBAAAwD;AAAA,UAACjG;AAAA,UAAA;AAAA,YAEC,aAAa0I,EAAK;AAAA,YAClB,WAAS;AAAA,YACT,UAAUjG,MAAMkF;AAAA,YAEhB,aAAa,CAACS,MAAsBA,EAAM,eAAA;AAAA,YAC1C,cAAc,MAAMR,EAAUnF,CAAC;AAAA,YAC/B,SAAS,MAAM4F,EAAGK,EAAK,EAAE;AAAA,YAExB,UAAAA,EAAK;AAAA,UAAA;AAAA,UATDA,EAAK;AAAA,QAAA,CAWb,EAAA,CACH,EAAA,CACF,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;AAQO,SAAShC,EAAaiC,GAAqB/C,GAAqB;AACrE,QAAMpF,IAAIF,EAAcqI,CAAW,GAC7BlI,IAAIH,EAAcsF,CAAE;AAC1B,SAAInF,MAAM,MAAYD,MAAM,MACrBA,MAAMC,KAAKD,EAAE,WAAWC,IAAI,GAAG;AACxC;AAEA,SAASmI,GAAczG,GAAiBsB,GAA2B;;AACjE,SAAItB,EAAM,MAAMuE,EAAajD,GAAUtB,EAAM,EAAE,IAAU,OAClDd,IAAAc,EAAM,aAAN,gBAAAd,EAAgB,KAAK,CAACkE,MAASmB,EAAajD,GAAU8B,EAAK,EAAE,OAAM;AAC5E;AAGA,SAASsD,GAASC,GAAe;AAC/B,SAAOA,IAAO,gBAAA7C,EAAC,QAAA,EAAK,WAAWY,EAAO,UAAW,aAAK,IAAU;AAClE;AAGA,SAASkC,GAAOC,GAAoB;AAClC,SAAOA,IACL,gBAAA/C,EAAC,QAAA,EAAK,WAAWY,EAAO,QAAQ,OAAO,EAAE,YAAY,kBAAkBmC,CAAK,IAAA,GAAO,IACjF;AACN;AAGA,SAASrC,EAAYsC,GAAgBC,GAAkBC,GAAgC;AACrF,MAAI,EAAAF,KAAS,QAAQC,KAAO,QAAQC,KAAW;AAC/C,WACE,gBAAAvC,EAAAwC,GAAA,EACG,UAAA;AAAA,MAAAP,GAASI,CAAK;AAAA,MACdF,GAAOG,CAAG;AAAA,MACVC;AAAA,IAAA,GACH;AAEJ;AAEA,SAASpC,GAAa,EAAE,OAAA5E,GAAO,UAAAsB,KAAmD;;AAChF,QAAMkE,IAASiB,GAAczG,GAAOsB,CAAQ,GACtC4F,IAAc,CAAC,GAAChI,IAAAc,EAAM,aAAN,QAAAd,EAAgB,SAChC,CAACoG,GAAMC,CAAO,IAAIF,EAASG,CAAM;AASvC,MALAO,EAAU,MAAM;AACd,IAAIP,OAAgB,EAAI;AAAA,EAC1B,GAAG,CAACA,CAAM,CAAC,GAGP,CAAC0B,KAAelH,EAAM;AACxB,WACE,gBAAA8D;AAAA,MAAClG;AAAA,MAAA;AAAA,QACC,IAAI0G;AAAA,QACJ,IAAItE,EAAM;AAAA,QACV,MAAMA,EAAM;AAAA,QACZ,UAAUwF;AAAA,QACV,WAAS;AAAA,QACT,UAAUhB,EAAYxE,EAAM,OAAOA,EAAM,GAAG;AAAA,QAE3C,UAAAA,EAAM;AAAA,MAAA;AAAA,IAAA;AAKb,QAAMgH,IACJ,gBAAAlD;AAAA,IAACwC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL,WAAW5B,EAAO;AAAA,MAClB,aAAWY,IAAO,SAAS;AAAA,IAAA;AAAA,EAAA;AAI/B,SACE,gBAAAb,EAAAwC,GAAA,EACG,UAAA;AAAA,IAAAC,KAAelH,EAAM;AAAA;AAAA,MAEpB,gBAAA8D;AAAA,QAAClG;AAAA,QAAA;AAAA,UACC,IAAI0G;AAAA,UACJ,IAAItE,EAAM;AAAA,UACV,MAAMA,EAAM;AAAA,UACZ,UAAUwF;AAAA,UACV,WAAS;AAAA,UACT,SAAS,MAAMD,EAAQ,EAAI;AAAA,UAC3B,UAAUf;AAAA,YACRxE,EAAM;AAAA,YACNA,EAAM;AAAA,YACN,gBAAA8D;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAWY,EAAO;AAAA,gBAClB,cAAY,GAAGY,IAAO,aAAa,QAAQ,IAAItF,EAAM,KAAK;AAAA,gBAC1D,iBAAesF;AAAA,gBACf,SAAS,CAACW,MAAsB;AAC9B,kBAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA,GACNV,EAAQ,CAACtG,MAAM,CAACA,CAAC;AAAA,gBACnB;AAAA,gBAEC,UAAA+H;AAAA,cAAA;AAAA,YAAA;AAAA,UACH;AAAA,UAGD,UAAAhH,EAAM;AAAA,QAAA;AAAA,MAAA;AAAA;AAAA;AAAA,MAIT,gBAAA8D;AAAA,QAACjG;AAAA,QAAA;AAAA,UACC,MAAMmC,EAAM;AAAA,UACZ,UAAUwF;AAAA,UACV,WAAS;AAAA,UACT,iBAAeF;AAAA,UACf,SAAS,MAAMC,EAAQ,CAACtG,MAAM,CAACA,CAAC;AAAA,UAChC,UAAUuF,EAAYxE,EAAM,OAAOA,EAAM,KAAKgH,CAAO;AAAA,UAEpD,UAAAhH,EAAM;AAAA,QAAA;AAAA,MAAA;AAAA;AAAA,IAGVkH;AAAA;AAAA,MAEC,gBAAApD,EAAC,OAAA,EAAI,WAAWqD,EAAKzC,EAAO,aAAa,CAACY,KAAQZ,EAAO,iBAAiB,GACxE,UAAA,gBAAAZ,EAAC,SAAI,WAAWY,EAAO,kBACrB,UAAA,gBAAAZ,EAACO,GAAA,EAAK,WAAWK,EAAO,QACrB,WAAA0C,IAAApH,EAAM,aAAN,gBAAAoH,EAAgB,IAAI,CAAChE,MACpB,gBAAAU;AAAA,QAAClG;AAAA,QAAA;AAAA,UAEC,IAAI0G;AAAA,UACJ,IAAIlB,EAAK;AAAA,UACT,MAAM,gBAAAU,EAAC,QAAA,EAAK,WAAWY,EAAO,SAAS;AAAA,UACvC,UAAUH,EAAajD,GAAU8B,EAAK,EAAE;AAAA,UACxC,MAAK;AAAA,UACL,WAAS;AAAA,UACT,UAAUoB,EAAYpB,EAAK,OAAOA,EAAK,GAAG;AAAA,UAEzC,UAAAA,EAAK;AAAA,QAAA;AAAA,QATDA,EAAK;AAAA,MAAA,GAWb,CACH,EAAA,CACF,EAAA,CACF;AAAA,QACE;AAAA,EAAA,GACN;AAEJ;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const o=require("react/jsx-runtime"),c=require("react"),j=require("clsx"),X=require("./names-BJnFU_5m.cjs"),A=require("./Icon-BVULqOJD.cjs"),Y=require("./ConfigProvider-ByLHqXpv.cjs"),Z="_root_p6koa_2",H="_list_p6koa_5",ee="_horizontal_p6koa_11",ne="_vertical_p6koa_24",te="_sm_p6koa_29",oe="_md_p6koa_34",se="_lg_p6koa_39",re="_step_p6koa_47",ce="_disabled_p6koa_64",le="_main_p6koa_69",ae="_indicator_p6koa_99",ie="_number_p6koa_125",de="_completed_p6koa_130",ue="_active_p6koa_136",_e="_error_p6koa_144",fe="_text_p6koa_151",me="_label_p6koa_167",pe="_description_p6koa_181",he="_optional_p6koa_186",be="_connector_p6koa_193",we="_done_p6koa_198",ve="_panel_p6koa_224",xe="_stepContent_p6koa_228",t={root:Z,list:H,horizontal:ee,vertical:ne,sm:te,md:oe,lg:se,step:re,disabled:ce,main:le,indicator:ae,number:ie,completed:de,active:ue,error:_e,text:fe,label:me,description:pe,optional:he,connector:be,done:we,panel:ve,stepContent:xe},ke=new Set(X.ICON_NAMES),Ne=c.forwardRef(function({steps:i,activeStep:_,defaultStep:g,onStepChange:u,queryKey:y,pushHistory:R=!1,orientation:f="horizontal",size:w="md",color:I="primary",onStepClick:m,"aria-label":M,className:B,style:K},O){var P;const E=f==="vertical",T=m!=null,U=Y.useStepQueryKey(),l=y===!0?U:y||void 0,p=c.useCallback(e=>e!=null&&Number.isInteger(e)&&e>=0&&e<i.length&&!i[e].disabled,[i]),v=c.useCallback(()=>{if(!l||typeof window>"u")return null;const e=new URLSearchParams(window.location.search).get(l);return e!=null&&/^\d+$/.test(e)?Number(e)-1:null},[l]),W=Math.max(i.findIndex(e=>!e.disabled),0),[F,L]=c.useState(()=>{const e=v();return p(e)?e:p(g)?g:W}),q=_!==void 0,s=q?_:F,x=c.useRef(s);x.current=s;const h=c.useRef(u);h.current=u;const k=c.useRef(!1),z=c.useCallback((e,n)=>{if(!l||typeof window>"u")return;const r=new URLSearchParams(window.location.search),a=String(e+1);if(r.get(l)===a)return;r.set(l,a);const d=`${window.location.pathname}?${r.toString()}${window.location.hash}`;window.history[n?"pushState":"replaceState"](window.history.state,"",d)},[l]),D=e=>{e!==x.current&&(k.current=!0,q||L(e),u==null||u(e))};c.useEffect(()=>{if(!l||typeof window>"u"||!Number.isInteger(s)||s<0||s>=i.length)return;const e=k.current&&R;k.current=!1,z(s,e)},[l,s,R,z,i.length]),c.useEffect(()=>{if(!l||typeof window>"u")return;const e=()=>{var r;const n=v();p(n)&&n!==x.current&&(_===void 0&&L(n),(r=h.current)==null||r.call(h,n))};return window.addEventListener("popstate",e),()=>window.removeEventListener("popstate",e)},[l,v,p,_]);const $=(P=i[s])==null?void 0:P.content,C=c.useRef(null);c.useEffect(()=>{if(f==="vertical")return;const e=C.current,n=e==null?void 0:e.children[s];if(!e||!n)return;const r=e.getBoundingClientRect(),a=n.getBoundingClientRect(),d=a.left-r.left+e.scrollLeft,b=d+a.width;d<e.scrollLeft?e.scrollLeft=d:b>e.scrollLeft+e.clientWidth&&(e.scrollLeft=b-e.clientWidth)},[s,f]);const G=e=>typeof e=="string"&&ke.has(e)?o.jsx(A.Icon,{name:e,size:w}):e;return o.jsxs("div",{ref:O,className:j.clsx(t.root,t[f],t[w],B),style:{"--tz-btn-rgb":`var(--tz-color-${I}-rgb)`,"--tz-btn-on":`var(--tz-color-${I}-contrast, #fff)`,...K},children:[o.jsx("ol",{ref:C,"aria-label":M,className:t.list,children:i.map((e,n)=>{const r=!!e.error,a=!r&&(e.completed||n<s),d=!r&&!a&&n===s,b=r?"error":a?"completed":d?"active":"upcoming",J=n===i.length-1,N=G(e.icon),S=N??(a?o.jsx(A.Icon,{name:"Check",size:w}):o.jsx("span",{className:t.number,children:n+1})),V=e.label!=null||e.description!=null||e.optional!=null,Q=o.jsxs(o.Fragment,{children:[o.jsx("span",{className:t.indicator,"aria-hidden":N==null&&!a?void 0:!0,children:S}),V&&o.jsxs("span",{className:t.text,children:[e.label!=null&&o.jsx("span",{className:t.label,children:e.label}),e.description!=null&&o.jsx("span",{className:t.description,children:e.description}),e.optional!=null&&o.jsx("span",{className:t.optional,children:e.optional})]})]});return o.jsxs("li",{className:j.clsx(t.step,t[b],e.disabled&&t.disabled),children:[T?o.jsx("button",{type:"button",className:t.main,disabled:e.disabled,"aria-current":d?"step":void 0,onClick:()=>{m==null||m(n),D(n)},children:Q}):o.jsx("div",{className:t.main,"aria-current":d?"step":void 0,children:Q}),!J&&o.jsx("span",{className:j.clsx(t.connector,n<s&&t.done),"aria-hidden":"true"}),E&&n===s&&e.content!=null&&o.jsx("div",{className:t.stepContent,children:e.content})]},n)})}),!E&&$!=null&&o.jsx("div",{className:t.panel,children:$})]})});exports.Stepper=Ne;
|
|
2
|
-
//# sourceMappingURL=Stepper-DOSc03YV.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Stepper-DOSc03YV.cjs","sources":["../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useStepQueryKey, type ThemeColor } from '../../theme'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport styles from './Stepper.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type StepperOrientation = 'horizontal' | 'vertical'\nexport type StepperSize = 'sm' | 'md' | 'lg'\n\nexport interface StepItem {\n /** Step label. */\n label?: ReactNode\n /** Muted secondary line under the label. */\n description?: ReactNode\n /** Muted caption under the label (e.g. `\"Optional\"`). */\n optional?: ReactNode\n /** Override the step's number indicator with an icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Force the **completed** look regardless of the active step (e.g. an already-saved step). */\n completed?: boolean\n /** Marks the step **invalid** — a red indicator + label (e.g. its form section failed validation). */\n error?: boolean\n /** Disables the step — dimmed, (when clickable) not selectable, and skipped by the URL restore. */\n disabled?: boolean\n /**\n * Panel content rendered while this step is active — **below the strip** in horizontal mode, and\n * **inline under the step** (indented beside the rail) in vertical mode. Optional.\n */\n content?: ReactNode\n}\n\nexport interface StepperProps {\n /** The steps, in order. */\n steps: StepItem[]\n /**\n * Controlled current step index (**0-based**). Steps before it read **completed**, the one at it is\n * **active**, and those after it are **upcoming**. Omit for uncontrolled (see `defaultStep`).\n */\n activeStep?: number\n /**\n * Initial step index (uncontrolled). Falls back to the URL query (when URL sync is active and the\n * param is present) and otherwise the first enabled step.\n */\n defaultStep?: number\n /**\n * Fires with the next step index whenever the stepper itself changes the step — a clicked step head,\n * or a Back/Forward `popstate` restore. In controlled mode apply it to your `activeStep` state.\n */\n onStepChange?: (index: number) => void\n /**\n * **Opt-in** URL sync — **off by default** (the URL is never touched when omitted). Pass the bare\n * prop (**`queryKey`** / `true`) to sync the active step under the configured `keys.stepQueryKey`\n * (else `'step'`), or a **string** for a custom param name. The URL value is **1-based**\n * (`?step=2` = index 1) and a page refresh restores it. Two synced steppers on one page need\n * distinct keys.\n */\n queryKey?: boolean | string\n /**\n * Push a history entry on each step change, so the browser **Back** button returns to the previous\n * step. Defaults to `false` — step changes **replace** the URL, so Back leaves the page instead of\n * stepping back through the wizard (and `popstate` still restores a step when one is in the query).\n */\n pushHistory?: boolean\n /**\n * Layout direction. `horizontal` (default) centers each label **under** its circle and **scrolls\n * sideways** when the steps don't fit (so it fits a phone as-is); `vertical` stacks the steps along\n * a rail connector.\n */\n orientation?: StepperOrientation\n /** Preset size. Defaults to `'md'`. */\n size?: StepperSize\n /** Theme palette token tinting the active / completed steps. Defaults to `'primary'`. */\n color?: ThemeColor\n /**\n * Makes steps **clickable** — each step head becomes a `<button>` that fires this with the step index\n * (a `disabled` step never fires); an uncontrolled stepper also selects the clicked step itself. Omit\n * for a display-only progress indicator.\n */\n onStepClick?: (index: number) => void\n /** Accessible label for the stepper list. */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A step progress indicator. Data-driven via `steps` (each: `label`, `description`, `optional`, `icon`,\n * `completed`, `error`, `disabled`, `content`) — controlled (`activeStep`, 0-based) or uncontrolled\n * (`defaultStep`). **Opt-in URL sync:** pass **`queryKey`** (bare/`true` = the configured\n * `keys.stepQueryKey`, else `'step'`; or a custom string) and the active step syncs to that query param\n * (**1-based** — `?step=2`) so a refresh restores it; with no `queryKey` the URL is never touched.\n * Synced step changes **replace** the URL (Back doesn't walk the wizard); pass **`pushHistory`** to\n * step back with Back.\n * Horizontal (labels centered under the circles) or `vertical` (a rail); when the horizontal steps\n * don't fit, the strip **scrolls sideways** (scrollbar hidden, the active step kept in view) — so it\n * fits a phone as-is. The active step's **`content`** renders below the strip (horizontal) or inline\n * under the step (vertical). Pass **`onStepClick`** to make the steps navigable. Tinted by `color` via\n * the shared `--tz-btn-rgb` pattern; the list is an `<ol>` with `aria-current=\"step\"` on the active step.\n */\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(function Stepper(\n {\n steps,\n activeStep,\n defaultStep,\n onStepChange,\n queryKey,\n pushHistory = false,\n orientation = 'horizontal',\n size = 'md',\n color = 'primary',\n onStepClick,\n 'aria-label': ariaLabel,\n className,\n style,\n },\n ref,\n) {\n const vertical = orientation === 'vertical'\n const clickable = onStepClick != null\n\n // resolve the URL-sync key — OPT-IN: omitted/false = no sync (URL untouched); the bare/`true` form\n // uses the configured default (`keys.stepQueryKey`, else 'step'); a string is a custom param name\n const stepQueryKey = useStepQueryKey()\n const syncKey = queryKey === true ? stepQueryKey : queryKey || undefined\n\n const isSelectable = useCallback(\n (i: number | null | undefined): i is number =>\n i != null && Number.isInteger(i) && i >= 0 && i < steps.length && !steps[i].disabled,\n [steps],\n )\n\n // the URL carries the step 1-based (`?step=2` = index 1) — human-friendly, like Table's page param\n const readQuery = useCallback((): number | null => {\n if (!syncKey || typeof window === 'undefined') return null\n const raw = new URLSearchParams(window.location.search).get(syncKey)\n return raw != null && /^\\d+$/.test(raw) ? Number(raw) - 1 : null\n }, [syncKey])\n\n const firstEnabled = Math.max(\n steps.findIndex((s) => !s.disabled),\n 0,\n )\n\n const [internal, setInternal] = useState<number>(() => {\n const q = readQuery()\n if (isSelectable(q)) return q\n return isSelectable(defaultStep) ? defaultStep : firstEnabled\n })\n const isControlled = activeStep !== undefined\n // controlled mode renders the given index verbatim (even past the last step — the \"all completed\"\n // pattern); only the URL/popstate restores are gated by `isSelectable`\n const active = isControlled ? activeStep : internal\n\n // keep the latest active / onStepChange / push-intent for the stable effects + popstate listener\n const activeRef = useRef(active)\n activeRef.current = active\n const onStepChangeRef = useRef(onStepChange)\n onStepChangeRef.current = onStepChange\n const pushIntent = useRef(false)\n\n const writeQuery = useCallback(\n (next: number, push: boolean) => {\n if (!syncKey || typeof window === 'undefined') return\n const params = new URLSearchParams(window.location.search)\n const value = String(next + 1)\n if (params.get(syncKey) === value) return\n params.set(syncKey, value)\n const url = `${window.location.pathname}?${params.toString()}${window.location.hash}`\n window.history[push ? 'pushState' : 'replaceState'](window.history.state, '', url)\n },\n [syncKey],\n )\n\n const select = (next: number) => {\n if (next === activeRef.current) return\n pushIntent.current = true\n if (!isControlled) setInternal(next)\n onStepChange?.(next)\n }\n\n // mirror the active step into the URL whenever it changes (and on mount = canonicalize). A\n // user-driven change `push`es when `pushHistory`; programmatic / popstate changes just `replace`.\n useEffect(() => {\n if (!syncKey || typeof window === 'undefined') return\n // an out-of-range active (e.g. `steps.length` = \"all done\") isn't a step — leave the URL alone\n if (!Number.isInteger(active) || active < 0 || active >= steps.length) return\n const push = pushIntent.current && pushHistory\n pushIntent.current = false\n writeQuery(active, push)\n }, [syncKey, active, pushHistory, writeQuery, steps.length])\n\n // Back/Forward → restore the step from the query\n useEffect(() => {\n if (!syncKey || typeof window === 'undefined') return\n const onPopState = () => {\n const q = readQuery()\n if (isSelectable(q) && q !== activeRef.current) {\n if (activeStep === undefined) setInternal(q)\n onStepChangeRef.current?.(q)\n }\n }\n window.addEventListener('popstate', onPopState)\n return () => window.removeEventListener('popstate', onPopState)\n }, [syncKey, readQuery, isSelectable, activeStep])\n\n const activeContent = steps[active]?.content\n\n // when the horizontal strip overflows (scrolls sideways), keep the active step in view — by moving\n // the strip's own scrollLeft only. (scrollIntoView would also scroll every scrollable ancestor —\n // i.e. the page itself — yanking the viewport down to the stepper on mount.)\n const listRef = useRef<HTMLOListElement | null>(null)\n useEffect(() => {\n if (orientation === 'vertical') return // the vertical rail never scrolls sideways\n const list = listRef.current\n const el = list?.children[active] as HTMLElement | undefined\n if (!list || !el) return\n const listRect = list.getBoundingClientRect()\n const elRect = el.getBoundingClientRect()\n const left = elRect.left - listRect.left + list.scrollLeft\n const right = left + elRect.width\n if (left < list.scrollLeft) list.scrollLeft = left\n else if (right > list.scrollLeft + list.clientWidth) list.scrollLeft = right - list.clientWidth\n }, [active, orientation])\n\n const renderIcon = (icon: StepItem['icon']) =>\n typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} size={size} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n className={clsx(styles.root, styles[orientation], styles[size], className)}\n style={\n {\n '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`,\n '--tz-btn-on': `var(--tz-color-${color}-contrast, #fff)`,\n ...style,\n } as CSSProperties\n }\n >\n <ol ref={listRef} aria-label={ariaLabel} className={styles.list}>\n {steps.map((step, i) => {\n const isError = !!step.error\n const isCompleted = !isError && (step.completed || i < active)\n const isActive = !isError && !isCompleted && i === active\n const state = isError\n ? 'error'\n : isCompleted\n ? 'completed'\n : isActive\n ? 'active'\n : 'upcoming'\n const isLast = i === steps.length - 1\n\n const icon = renderIcon(step.icon)\n const indicator =\n icon != null ? (\n icon\n ) : isCompleted ? (\n <Icon name=\"Check\" size={size} />\n ) : (\n <span className={styles.number}>{i + 1}</span>\n )\n\n const hasText = step.label != null || step.description != null || step.optional != null\n const head = (\n <>\n <span\n className={styles.indicator}\n aria-hidden={icon == null && !isCompleted ? undefined : true}\n >\n {indicator}\n </span>\n {hasText && (\n <span className={styles.text}>\n {step.label != null && <span className={styles.label}>{step.label}</span>}\n {step.description != null && (\n <span className={styles.description}>{step.description}</span>\n )}\n {step.optional != null && (\n <span className={styles.optional}>{step.optional}</span>\n )}\n </span>\n )}\n </>\n )\n\n return (\n <li\n key={i}\n className={clsx(styles.step, styles[state], step.disabled && styles.disabled)}\n >\n {clickable ? (\n <button\n type=\"button\"\n className={styles.main}\n disabled={step.disabled}\n aria-current={isActive ? 'step' : undefined}\n onClick={() => {\n onStepClick?.(i)\n select(i)\n }}\n >\n {head}\n </button>\n ) : (\n <div className={styles.main} aria-current={isActive ? 'step' : undefined}>\n {head}\n </div>\n )}\n {!isLast && (\n <span\n className={clsx(styles.connector, i < active && styles.done)}\n aria-hidden=\"true\"\n />\n )}\n {/* vertical: the active step's content sits inline, indented beside the rail */}\n {vertical && i === active && step.content != null && (\n <div className={styles.stepContent}>{step.content}</div>\n )}\n </li>\n )\n })}\n </ol>\n {/* horizontal: the active step's content renders as a panel below the strip */}\n {!vertical && activeContent != null && <div className={styles.panel}>{activeContent}</div>}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","Stepper","forwardRef","steps","activeStep","defaultStep","onStepChange","queryKey","pushHistory","orientation","size","color","onStepClick","ariaLabel","className","style","ref","vertical","clickable","stepQueryKey","useStepQueryKey","syncKey","isSelectable","useCallback","i","readQuery","raw","firstEnabled","s","internal","setInternal","useState","q","isControlled","active","activeRef","useRef","onStepChangeRef","pushIntent","writeQuery","next","push","params","value","url","select","useEffect","onPopState","_a","activeContent","listRef","list","el","listRect","elRect","left","right","renderIcon","icon","jsx","Icon","jsxs","clsx","styles","step","isError","isCompleted","isActive","state","isLast","indicator","hasText","head","Fragment"],"mappings":"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"}
|