eidos-ui 0.1.0
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/LICENSE +22 -0
- package/README.md +175 -0
- package/dist/Breadcrumb.types-DaykU-C8.d.cts +20 -0
- package/dist/Breadcrumb.types-DaykU-C8.d.ts +20 -0
- package/dist/Button.types-BH0CPyPx.d.ts +33 -0
- package/dist/Button.types-DZRCVqyN.d.cts +33 -0
- package/dist/CommandPalette.types-DRMMS_ev.d.cts +73 -0
- package/dist/CommandPalette.types-DRMMS_ev.d.ts +73 -0
- package/dist/Footer.types-Dv2TPN2J.d.cts +24 -0
- package/dist/Footer.types-Dv2TPN2J.d.ts +24 -0
- package/dist/Header.types-BZi80bWz.d.cts +17 -0
- package/dist/Header.types-DJt-q01P.d.ts +17 -0
- package/dist/Input.types-DFZNyJGF.d.cts +45 -0
- package/dist/Input.types-XrJTI0JC.d.ts +45 -0
- package/dist/Menu.types-DNIpjSAK.d.ts +49 -0
- package/dist/Menu.types-DwcuCZM7.d.cts +49 -0
- package/dist/Navigation.types-Ctu5mlTa.d.cts +94 -0
- package/dist/Navigation.types-DVcLJnrB.d.ts +94 -0
- package/dist/Table.types-Bv9l7qxd.d.ts +103 -0
- package/dist/Table.types-DQ0ReOLj.d.cts +103 -0
- package/dist/Toolbar.types-BGD57Uhm.d.ts +22 -0
- package/dist/Toolbar.types-tQkLmPIu.d.cts +22 -0
- package/dist/accordion/index.cjs +10 -0
- package/dist/accordion/index.cjs.map +1 -0
- package/dist/accordion/index.d.cts +39 -0
- package/dist/accordion/index.d.ts +39 -0
- package/dist/accordion/index.js +10 -0
- package/dist/accordion/index.js.map +1 -0
- package/dist/alert/index.cjs +12 -0
- package/dist/alert/index.cjs.map +1 -0
- package/dist/alert/index.d.cts +29 -0
- package/dist/alert/index.d.ts +29 -0
- package/dist/alert/index.js +12 -0
- package/dist/alert/index.js.map +1 -0
- package/dist/avatar/index.cjs +10 -0
- package/dist/avatar/index.cjs.map +1 -0
- package/dist/avatar/index.d.cts +26 -0
- package/dist/avatar/index.d.ts +26 -0
- package/dist/avatar/index.js +10 -0
- package/dist/avatar/index.js.map +1 -0
- package/dist/badge/index.cjs +8 -0
- package/dist/badge/index.cjs.map +1 -0
- package/dist/badge/index.d.cts +27 -0
- package/dist/badge/index.d.ts +27 -0
- package/dist/badge/index.js +8 -0
- package/dist/badge/index.js.map +1 -0
- package/dist/breadcrumb/index.cjs +8 -0
- package/dist/breadcrumb/index.cjs.map +1 -0
- package/dist/breadcrumb/index.d.cts +7 -0
- package/dist/breadcrumb/index.d.ts +7 -0
- package/dist/breadcrumb/index.js +8 -0
- package/dist/breadcrumb/index.js.map +1 -0
- package/dist/button/index.cjs +14 -0
- package/dist/button/index.cjs.map +1 -0
- package/dist/button/index.d.cts +21 -0
- package/dist/button/index.d.ts +21 -0
- package/dist/button/index.js +14 -0
- package/dist/button/index.js.map +1 -0
- package/dist/button-group/index.cjs +8 -0
- package/dist/button-group/index.cjs.map +1 -0
- package/dist/button-group/index.d.cts +46 -0
- package/dist/button-group/index.d.ts +46 -0
- package/dist/button-group/index.js +8 -0
- package/dist/button-group/index.js.map +1 -0
- package/dist/card/index.cjs +8 -0
- package/dist/card/index.cjs.map +1 -0
- package/dist/card/index.d.cts +18 -0
- package/dist/card/index.d.ts +18 -0
- package/dist/card/index.js +8 -0
- package/dist/card/index.js.map +1 -0
- package/dist/checkbox/index.cjs +9 -0
- package/dist/checkbox/index.cjs.map +1 -0
- package/dist/checkbox/index.d.cts +16 -0
- package/dist/checkbox/index.d.ts +16 -0
- package/dist/checkbox/index.js +9 -0
- package/dist/checkbox/index.js.map +1 -0
- package/dist/chip/index.cjs +11 -0
- package/dist/chip/index.cjs.map +1 -0
- package/dist/chip/index.d.cts +27 -0
- package/dist/chip/index.d.ts +27 -0
- package/dist/chip/index.js +11 -0
- package/dist/chip/index.js.map +1 -0
- package/dist/chunk-2HTBZGBP.cjs +113 -0
- package/dist/chunk-2HTBZGBP.cjs.map +1 -0
- package/dist/chunk-2JWY36LD.cjs +112 -0
- package/dist/chunk-2JWY36LD.cjs.map +1 -0
- package/dist/chunk-2YQE26EK.js +54 -0
- package/dist/chunk-2YQE26EK.js.map +1 -0
- package/dist/chunk-2ZWBN3LK.cjs +92 -0
- package/dist/chunk-2ZWBN3LK.cjs.map +1 -0
- package/dist/chunk-3ETWFS2N.cjs +40 -0
- package/dist/chunk-3ETWFS2N.cjs.map +1 -0
- package/dist/chunk-3KAR5KCS.cjs +47 -0
- package/dist/chunk-3KAR5KCS.cjs.map +1 -0
- package/dist/chunk-3RUIKBH4.cjs +1 -0
- package/dist/chunk-3RUIKBH4.cjs.map +1 -0
- package/dist/chunk-3SKI6FXB.js +40 -0
- package/dist/chunk-3SKI6FXB.js.map +1 -0
- package/dist/chunk-3YPTYI7R.js +194 -0
- package/dist/chunk-3YPTYI7R.js.map +1 -0
- package/dist/chunk-4NUZP66U.js +299 -0
- package/dist/chunk-4NUZP66U.js.map +1 -0
- package/dist/chunk-5D3LIJYW.cjs +299 -0
- package/dist/chunk-5D3LIJYW.cjs.map +1 -0
- package/dist/chunk-5QG2I3FK.cjs +169 -0
- package/dist/chunk-5QG2I3FK.cjs.map +1 -0
- package/dist/chunk-5TGBNYZK.cjs +11 -0
- package/dist/chunk-5TGBNYZK.cjs.map +1 -0
- package/dist/chunk-5WRI5ZAA.js +31 -0
- package/dist/chunk-5WRI5ZAA.js.map +1 -0
- package/dist/chunk-63N2KZZX.cjs +54 -0
- package/dist/chunk-63N2KZZX.cjs.map +1 -0
- package/dist/chunk-66R54X6R.js +1 -0
- package/dist/chunk-66R54X6R.js.map +1 -0
- package/dist/chunk-6NZXWKUE.js +1 -0
- package/dist/chunk-6NZXWKUE.js.map +1 -0
- package/dist/chunk-6P4WYB3B.js +169 -0
- package/dist/chunk-6P4WYB3B.js.map +1 -0
- package/dist/chunk-6QFT3BUD.cjs +28 -0
- package/dist/chunk-6QFT3BUD.cjs.map +1 -0
- package/dist/chunk-6USUVU6J.js +26 -0
- package/dist/chunk-6USUVU6J.js.map +1 -0
- package/dist/chunk-73EKJU4G.js +11 -0
- package/dist/chunk-73EKJU4G.js.map +1 -0
- package/dist/chunk-7IOOFKG3.js +26 -0
- package/dist/chunk-7IOOFKG3.js.map +1 -0
- package/dist/chunk-7KGV6YCG.cjs +54 -0
- package/dist/chunk-7KGV6YCG.cjs.map +1 -0
- package/dist/chunk-7NZTRSMT.js +1484 -0
- package/dist/chunk-7NZTRSMT.js.map +1 -0
- package/dist/chunk-7R7IFWGB.cjs +86 -0
- package/dist/chunk-7R7IFWGB.cjs.map +1 -0
- package/dist/chunk-A35Y5MRJ.js +235 -0
- package/dist/chunk-A35Y5MRJ.js.map +1 -0
- package/dist/chunk-AOV32YBE.js +113 -0
- package/dist/chunk-AOV32YBE.js.map +1 -0
- package/dist/chunk-AUFCW7QU.cjs +526 -0
- package/dist/chunk-AUFCW7QU.cjs.map +1 -0
- package/dist/chunk-BFYSYUA6.cjs +125 -0
- package/dist/chunk-BFYSYUA6.cjs.map +1 -0
- package/dist/chunk-BTPCSBGP.js +1622 -0
- package/dist/chunk-BTPCSBGP.js.map +1 -0
- package/dist/chunk-C7F2VFAI.cjs +259 -0
- package/dist/chunk-C7F2VFAI.cjs.map +1 -0
- package/dist/chunk-CDV2OAS3.cjs +235 -0
- package/dist/chunk-CDV2OAS3.cjs.map +1 -0
- package/dist/chunk-CJUZDUXW.cjs +79 -0
- package/dist/chunk-CJUZDUXW.cjs.map +1 -0
- package/dist/chunk-CKH36D7H.js +28 -0
- package/dist/chunk-CKH36D7H.js.map +1 -0
- package/dist/chunk-D7PGZ3M3.cjs +117 -0
- package/dist/chunk-D7PGZ3M3.cjs.map +1 -0
- package/dist/chunk-DFADZZ3K.js +126 -0
- package/dist/chunk-DFADZZ3K.js.map +1 -0
- package/dist/chunk-DI2VKKLW.js +1 -0
- package/dist/chunk-DI2VKKLW.js.map +1 -0
- package/dist/chunk-DK4S3EHG.js +29 -0
- package/dist/chunk-DK4S3EHG.js.map +1 -0
- package/dist/chunk-DZUJEN5N.cjs +31 -0
- package/dist/chunk-DZUJEN5N.cjs.map +1 -0
- package/dist/chunk-E2B33QB7.js +97 -0
- package/dist/chunk-E2B33QB7.js.map +1 -0
- package/dist/chunk-E3XATJ63.js +4418 -0
- package/dist/chunk-E3XATJ63.js.map +1 -0
- package/dist/chunk-EACNRR3C.cjs +1 -0
- package/dist/chunk-EACNRR3C.cjs.map +1 -0
- package/dist/chunk-EQ6BNPTL.cjs +39 -0
- package/dist/chunk-EQ6BNPTL.cjs.map +1 -0
- package/dist/chunk-F54MVGKO.js +342 -0
- package/dist/chunk-F54MVGKO.js.map +1 -0
- package/dist/chunk-FNUOTM44.cjs +238 -0
- package/dist/chunk-FNUOTM44.cjs.map +1 -0
- package/dist/chunk-FO5FNTJX.js +69 -0
- package/dist/chunk-FO5FNTJX.js.map +1 -0
- package/dist/chunk-FQZ6F7FQ.cjs +1 -0
- package/dist/chunk-FQZ6F7FQ.cjs.map +1 -0
- package/dist/chunk-G2FANEA2.cjs +101 -0
- package/dist/chunk-G2FANEA2.cjs.map +1 -0
- package/dist/chunk-G36S5CWN.cjs +26 -0
- package/dist/chunk-G36S5CWN.cjs.map +1 -0
- package/dist/chunk-GI7WPGP2.cjs +454 -0
- package/dist/chunk-GI7WPGP2.cjs.map +1 -0
- package/dist/chunk-GL4DHGQE.js +1316 -0
- package/dist/chunk-GL4DHGQE.js.map +1 -0
- package/dist/chunk-GOVOQZYN.js +18 -0
- package/dist/chunk-GOVOQZYN.js.map +1 -0
- package/dist/chunk-GRH57M3E.js +88 -0
- package/dist/chunk-GRH57M3E.js.map +1 -0
- package/dist/chunk-H523JFY2.js +303 -0
- package/dist/chunk-H523JFY2.js.map +1 -0
- package/dist/chunk-H56YUMFB.cjs +1622 -0
- package/dist/chunk-H56YUMFB.cjs.map +1 -0
- package/dist/chunk-HO7P6IJO.js +238 -0
- package/dist/chunk-HO7P6IJO.js.map +1 -0
- package/dist/chunk-HPIBYEGE.cjs +1484 -0
- package/dist/chunk-HPIBYEGE.cjs.map +1 -0
- package/dist/chunk-HQ4KZRFH.js +67 -0
- package/dist/chunk-HQ4KZRFH.js.map +1 -0
- package/dist/chunk-HUNMRKGE.js +21 -0
- package/dist/chunk-HUNMRKGE.js.map +1 -0
- package/dist/chunk-I44YNYI6.cjs +1 -0
- package/dist/chunk-I44YNYI6.cjs.map +1 -0
- package/dist/chunk-I6UOIS4J.cjs +1 -0
- package/dist/chunk-I6UOIS4J.cjs.map +1 -0
- package/dist/chunk-ICJ3SV5I.cjs +183 -0
- package/dist/chunk-ICJ3SV5I.cjs.map +1 -0
- package/dist/chunk-IYQX7PBO.cjs +320 -0
- package/dist/chunk-IYQX7PBO.cjs.map +1 -0
- package/dist/chunk-JFA5ABVE.js +54 -0
- package/dist/chunk-JFA5ABVE.js.map +1 -0
- package/dist/chunk-JORQYNJD.js +79 -0
- package/dist/chunk-JORQYNJD.js.map +1 -0
- package/dist/chunk-K5TKNT6I.cjs +34 -0
- package/dist/chunk-K5TKNT6I.cjs.map +1 -0
- package/dist/chunk-KF64C4QI.js +138 -0
- package/dist/chunk-KF64C4QI.js.map +1 -0
- package/dist/chunk-KGXGTWUL.js +1 -0
- package/dist/chunk-KGXGTWUL.js.map +1 -0
- package/dist/chunk-KKOZX64Z.js +34 -0
- package/dist/chunk-KKOZX64Z.js.map +1 -0
- package/dist/chunk-KO2MKZDW.cjs +69 -0
- package/dist/chunk-KO2MKZDW.cjs.map +1 -0
- package/dist/chunk-KQKJVFYF.js +259 -0
- package/dist/chunk-KQKJVFYF.js.map +1 -0
- package/dist/chunk-KV2FG7AN.cjs +401 -0
- package/dist/chunk-KV2FG7AN.cjs.map +1 -0
- package/dist/chunk-L3UPSLJ5.cjs +4418 -0
- package/dist/chunk-L3UPSLJ5.cjs.map +1 -0
- package/dist/chunk-LEZ4HSBD.cjs +744 -0
- package/dist/chunk-LEZ4HSBD.cjs.map +1 -0
- package/dist/chunk-LQ3C3OR2.js +21 -0
- package/dist/chunk-LQ3C3OR2.js.map +1 -0
- package/dist/chunk-LTOHGCU4.cjs +69 -0
- package/dist/chunk-LTOHGCU4.cjs.map +1 -0
- package/dist/chunk-M56IGNH7.cjs +125 -0
- package/dist/chunk-M56IGNH7.cjs.map +1 -0
- package/dist/chunk-MOX6LYGC.js +125 -0
- package/dist/chunk-MOX6LYGC.js.map +1 -0
- package/dist/chunk-MSQXPGOD.cjs +125 -0
- package/dist/chunk-MSQXPGOD.cjs.map +1 -0
- package/dist/chunk-N5JDL4VE.js +1 -0
- package/dist/chunk-N5JDL4VE.js.map +1 -0
- package/dist/chunk-N7HX5635.cjs +138 -0
- package/dist/chunk-N7HX5635.cjs.map +1 -0
- package/dist/chunk-NDLMU6HJ.js +744 -0
- package/dist/chunk-NDLMU6HJ.js.map +1 -0
- package/dist/chunk-O5ZPSZNY.cjs +88 -0
- package/dist/chunk-O5ZPSZNY.cjs.map +1 -0
- package/dist/chunk-O6B4KB4D.js +125 -0
- package/dist/chunk-O6B4KB4D.js.map +1 -0
- package/dist/chunk-OHUVWPFJ.js +86 -0
- package/dist/chunk-OHUVWPFJ.js.map +1 -0
- package/dist/chunk-OT3VZLN4.js +117 -0
- package/dist/chunk-OT3VZLN4.js.map +1 -0
- package/dist/chunk-OVYIBDGE.js +183 -0
- package/dist/chunk-OVYIBDGE.js.map +1 -0
- package/dist/chunk-P2BTQ33C.cjs +126 -0
- package/dist/chunk-P2BTQ33C.cjs.map +1 -0
- package/dist/chunk-P6ZBENAG.js +211 -0
- package/dist/chunk-P6ZBENAG.js.map +1 -0
- package/dist/chunk-P74HNSNJ.cjs +106 -0
- package/dist/chunk-P74HNSNJ.cjs.map +1 -0
- package/dist/chunk-PEPYVWGY.cjs +327 -0
- package/dist/chunk-PEPYVWGY.cjs.map +1 -0
- package/dist/chunk-POX6JZLO.cjs +67 -0
- package/dist/chunk-POX6JZLO.cjs.map +1 -0
- package/dist/chunk-PWIA4XQD.js +320 -0
- package/dist/chunk-PWIA4XQD.js.map +1 -0
- package/dist/chunk-QGZF5MOS.cjs +342 -0
- package/dist/chunk-QGZF5MOS.cjs.map +1 -0
- package/dist/chunk-QP2A5ZMK.cjs +18 -0
- package/dist/chunk-QP2A5ZMK.cjs.map +1 -0
- package/dist/chunk-QYHTMEI5.js +92 -0
- package/dist/chunk-QYHTMEI5.js.map +1 -0
- package/dist/chunk-QYK4ECSZ.js +69 -0
- package/dist/chunk-QYK4ECSZ.js.map +1 -0
- package/dist/chunk-R36SGSJX.cjs +26 -0
- package/dist/chunk-R36SGSJX.cjs.map +1 -0
- package/dist/chunk-R5QPUQSI.cjs +303 -0
- package/dist/chunk-R5QPUQSI.cjs.map +1 -0
- package/dist/chunk-R5UNLPQZ.cjs +103 -0
- package/dist/chunk-R5UNLPQZ.cjs.map +1 -0
- package/dist/chunk-RSBQNIJZ.js +199 -0
- package/dist/chunk-RSBQNIJZ.js.map +1 -0
- package/dist/chunk-S25WB7KJ.js +50 -0
- package/dist/chunk-S25WB7KJ.js.map +1 -0
- package/dist/chunk-SAFSEXMU.cjs +211 -0
- package/dist/chunk-SAFSEXMU.cjs.map +1 -0
- package/dist/chunk-SJDTFR3I.cjs +1 -0
- package/dist/chunk-SJDTFR3I.cjs.map +1 -0
- package/dist/chunk-SOGUWOSQ.cjs +21 -0
- package/dist/chunk-SOGUWOSQ.cjs.map +1 -0
- package/dist/chunk-SWPZ3HFY.cjs +1 -0
- package/dist/chunk-SWPZ3HFY.cjs.map +1 -0
- package/dist/chunk-SXF3TCYA.js +401 -0
- package/dist/chunk-SXF3TCYA.js.map +1 -0
- package/dist/chunk-T56K5IKQ.js +526 -0
- package/dist/chunk-T56K5IKQ.js.map +1 -0
- package/dist/chunk-TBMVUI7S.cjs +21 -0
- package/dist/chunk-TBMVUI7S.cjs.map +1 -0
- package/dist/chunk-TCX3QKF3.js +103 -0
- package/dist/chunk-TCX3QKF3.js.map +1 -0
- package/dist/chunk-TH3ITGUM.js +1 -0
- package/dist/chunk-TH3ITGUM.js.map +1 -0
- package/dist/chunk-TPNCV7KA.js +1 -0
- package/dist/chunk-TPNCV7KA.js.map +1 -0
- package/dist/chunk-TQCNQKWF.cjs +194 -0
- package/dist/chunk-TQCNQKWF.cjs.map +1 -0
- package/dist/chunk-TZWNX7FF.js +1 -0
- package/dist/chunk-TZWNX7FF.js.map +1 -0
- package/dist/chunk-UEJSRMU2.js +39 -0
- package/dist/chunk-UEJSRMU2.js.map +1 -0
- package/dist/chunk-UTENJWSE.cjs +21 -0
- package/dist/chunk-UTENJWSE.cjs.map +1 -0
- package/dist/chunk-V5JNYS77.cjs +29 -0
- package/dist/chunk-V5JNYS77.cjs.map +1 -0
- package/dist/chunk-VFYG7GAH.js +327 -0
- package/dist/chunk-VFYG7GAH.js.map +1 -0
- package/dist/chunk-VGYJ4VKX.cjs +62 -0
- package/dist/chunk-VGYJ4VKX.cjs.map +1 -0
- package/dist/chunk-VLC2OZV3.cjs +50 -0
- package/dist/chunk-VLC2OZV3.cjs.map +1 -0
- package/dist/chunk-VTAABT55.js +47 -0
- package/dist/chunk-VTAABT55.js.map +1 -0
- package/dist/chunk-VW32UTUE.cjs +1 -0
- package/dist/chunk-VW32UTUE.cjs.map +1 -0
- package/dist/chunk-VYV45YOK.cjs +1316 -0
- package/dist/chunk-VYV45YOK.cjs.map +1 -0
- package/dist/chunk-VZ43OLU6.cjs +97 -0
- package/dist/chunk-VZ43OLU6.cjs.map +1 -0
- package/dist/chunk-XJAXKENE.cjs +1 -0
- package/dist/chunk-XJAXKENE.cjs.map +1 -0
- package/dist/chunk-XJBMEDQ5.js +101 -0
- package/dist/chunk-XJBMEDQ5.js.map +1 -0
- package/dist/chunk-XMRMCWSQ.js +454 -0
- package/dist/chunk-XMRMCWSQ.js.map +1 -0
- package/dist/chunk-XSGUFMT4.js +21 -0
- package/dist/chunk-XSGUFMT4.js.map +1 -0
- package/dist/chunk-XUZOU2EB.js +1 -0
- package/dist/chunk-XUZOU2EB.js.map +1 -0
- package/dist/chunk-YCUT6NQ4.js +106 -0
- package/dist/chunk-YCUT6NQ4.js.map +1 -0
- package/dist/chunk-YLKESEHQ.cjs +199 -0
- package/dist/chunk-YLKESEHQ.cjs.map +1 -0
- package/dist/chunk-YPK7RV3Y.js +62 -0
- package/dist/chunk-YPK7RV3Y.js.map +1 -0
- package/dist/chunk-Z7S4UQKY.js +125 -0
- package/dist/chunk-Z7S4UQKY.js.map +1 -0
- package/dist/chunk-ZBGTVTQJ.js +112 -0
- package/dist/chunk-ZBGTVTQJ.js.map +1 -0
- package/dist/color-picker/index.cjs +9 -0
- package/dist/color-picker/index.cjs.map +1 -0
- package/dist/color-picker/index.d.cts +40 -0
- package/dist/color-picker/index.d.ts +40 -0
- package/dist/color-picker/index.js +9 -0
- package/dist/color-picker/index.js.map +1 -0
- package/dist/combobox/index.cjs +12 -0
- package/dist/combobox/index.cjs.map +1 -0
- package/dist/combobox/index.d.cts +37 -0
- package/dist/combobox/index.d.ts +37 -0
- package/dist/combobox/index.js +12 -0
- package/dist/combobox/index.js.map +1 -0
- package/dist/command-palette/index.cjs +10 -0
- package/dist/command-palette/index.cjs.map +1 -0
- package/dist/command-palette/index.d.cts +7 -0
- package/dist/command-palette/index.d.ts +7 -0
- package/dist/command-palette/index.js +10 -0
- package/dist/command-palette/index.js.map +1 -0
- package/dist/context-menu/index.cjs +13 -0
- package/dist/context-menu/index.cjs.map +1 -0
- package/dist/context-menu/index.d.cts +38 -0
- package/dist/context-menu/index.d.ts +38 -0
- package/dist/context-menu/index.js +13 -0
- package/dist/context-menu/index.js.map +1 -0
- package/dist/data-grid/index.cjs +28 -0
- package/dist/data-grid/index.cjs.map +1 -0
- package/dist/data-grid/index.d.cts +217 -0
- package/dist/data-grid/index.d.ts +217 -0
- package/dist/data-grid/index.js +28 -0
- package/dist/data-grid/index.js.map +1 -0
- package/dist/date-picker/index.cjs +19 -0
- package/dist/date-picker/index.cjs.map +1 -0
- package/dist/date-picker/index.d.cts +106 -0
- package/dist/date-picker/index.d.ts +106 -0
- package/dist/date-picker/index.js +19 -0
- package/dist/date-picker/index.js.map +1 -0
- package/dist/divider/index.cjs +8 -0
- package/dist/divider/index.cjs.map +1 -0
- package/dist/divider/index.d.cts +9 -0
- package/dist/divider/index.d.ts +9 -0
- package/dist/divider/index.js +8 -0
- package/dist/divider/index.js.map +1 -0
- package/dist/drawer/index.cjs +13 -0
- package/dist/drawer/index.cjs.map +1 -0
- package/dist/drawer/index.d.cts +39 -0
- package/dist/drawer/index.d.ts +39 -0
- package/dist/drawer/index.js +13 -0
- package/dist/drawer/index.js.map +1 -0
- package/dist/dropdown/index.cjs +13 -0
- package/dist/dropdown/index.cjs.map +1 -0
- package/dist/dropdown/index.d.cts +66 -0
- package/dist/dropdown/index.d.ts +66 -0
- package/dist/dropdown/index.js +13 -0
- package/dist/dropdown/index.js.map +1 -0
- package/dist/empty-state/index.cjs +8 -0
- package/dist/empty-state/index.cjs.map +1 -0
- package/dist/empty-state/index.d.cts +20 -0
- package/dist/empty-state/index.d.ts +20 -0
- package/dist/empty-state/index.js +8 -0
- package/dist/empty-state/index.js.map +1 -0
- package/dist/file-upload/index.cjs +8 -0
- package/dist/file-upload/index.cjs.map +1 -0
- package/dist/file-upload/index.d.cts +27 -0
- package/dist/file-upload/index.d.ts +27 -0
- package/dist/file-upload/index.js +8 -0
- package/dist/file-upload/index.js.map +1 -0
- package/dist/footer/index.cjs +8 -0
- package/dist/footer/index.cjs.map +1 -0
- package/dist/footer/index.d.cts +7 -0
- package/dist/footer/index.d.ts +7 -0
- package/dist/footer/index.js +8 -0
- package/dist/footer/index.js.map +1 -0
- package/dist/header/index.cjs +13 -0
- package/dist/header/index.cjs.map +1 -0
- package/dist/header/index.d.cts +10 -0
- package/dist/header/index.d.ts +10 -0
- package/dist/header/index.js +13 -0
- package/dist/header/index.js.map +1 -0
- package/dist/index.cjs +269 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +8895 -0
- package/dist/index.css.d.ts +2 -0
- package/dist/index.d.cts +69 -0
- package/dist/index.d.ts +69 -0
- package/dist/index.js +269 -0
- package/dist/index.js.map +1 -0
- package/dist/inline-edit/index.cjs +11 -0
- package/dist/inline-edit/index.cjs.map +1 -0
- package/dist/inline-edit/index.d.cts +56 -0
- package/dist/inline-edit/index.d.ts +56 -0
- package/dist/inline-edit/index.js +11 -0
- package/dist/inline-edit/index.js.map +1 -0
- package/dist/input/index.cjs +11 -0
- package/dist/input/index.cjs.map +1 -0
- package/dist/input/index.d.cts +9 -0
- package/dist/input/index.d.ts +9 -0
- package/dist/input/index.js +11 -0
- package/dist/input/index.js.map +1 -0
- package/dist/kbd/index.cjs +9 -0
- package/dist/kbd/index.cjs.map +1 -0
- package/dist/kbd/index.d.cts +34 -0
- package/dist/kbd/index.d.ts +34 -0
- package/dist/kbd/index.js +9 -0
- package/dist/kbd/index.js.map +1 -0
- package/dist/menu/index.cjs +14 -0
- package/dist/menu/index.cjs.map +1 -0
- package/dist/menu/index.d.cts +14 -0
- package/dist/menu/index.d.ts +14 -0
- package/dist/menu/index.js +14 -0
- package/dist/menu/index.js.map +1 -0
- package/dist/modal/index.cjs +12 -0
- package/dist/modal/index.cjs.map +1 -0
- package/dist/modal/index.d.cts +34 -0
- package/dist/modal/index.d.ts +34 -0
- package/dist/modal/index.js +12 -0
- package/dist/modal/index.js.map +1 -0
- package/dist/navigation/index.cjs +14 -0
- package/dist/navigation/index.cjs.map +1 -0
- package/dist/navigation/index.d.cts +8 -0
- package/dist/navigation/index.d.ts +8 -0
- package/dist/navigation/index.js +14 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/number-input/index.cjs +8 -0
- package/dist/number-input/index.cjs.map +1 -0
- package/dist/number-input/index.d.cts +31 -0
- package/dist/number-input/index.d.ts +31 -0
- package/dist/number-input/index.js +8 -0
- package/dist/number-input/index.js.map +1 -0
- package/dist/o-t-p-input/index.cjs +8 -0
- package/dist/o-t-p-input/index.cjs.map +1 -0
- package/dist/o-t-p-input/index.d.cts +33 -0
- package/dist/o-t-p-input/index.d.ts +33 -0
- package/dist/o-t-p-input/index.js +8 -0
- package/dist/o-t-p-input/index.js.map +1 -0
- package/dist/page-layout/index.cjs +24 -0
- package/dist/page-layout/index.cjs.map +1 -0
- package/dist/page-layout/index.d.cts +28 -0
- package/dist/page-layout/index.d.ts +28 -0
- package/dist/page-layout/index.js +24 -0
- package/dist/page-layout/index.js.map +1 -0
- package/dist/pagination/index.cjs +17 -0
- package/dist/pagination/index.cjs.map +1 -0
- package/dist/pagination/index.d.cts +34 -0
- package/dist/pagination/index.d.ts +34 -0
- package/dist/pagination/index.js +17 -0
- package/dist/pagination/index.js.map +1 -0
- package/dist/pill/index.cjs +8 -0
- package/dist/pill/index.cjs.map +1 -0
- package/dist/pill/index.d.cts +20 -0
- package/dist/pill/index.d.ts +20 -0
- package/dist/pill/index.js +8 -0
- package/dist/pill/index.js.map +1 -0
- package/dist/popover/index.cjs +8 -0
- package/dist/popover/index.cjs.map +1 -0
- package/dist/popover/index.d.cts +35 -0
- package/dist/popover/index.d.ts +35 -0
- package/dist/popover/index.js +8 -0
- package/dist/popover/index.js.map +1 -0
- package/dist/progress/index.cjs +8 -0
- package/dist/progress/index.cjs.map +1 -0
- package/dist/progress/index.d.cts +18 -0
- package/dist/progress/index.d.ts +18 -0
- package/dist/progress/index.js +8 -0
- package/dist/progress/index.js.map +1 -0
- package/dist/radio/index.cjs +10 -0
- package/dist/radio/index.cjs.map +1 -0
- package/dist/radio/index.d.cts +33 -0
- package/dist/radio/index.d.ts +33 -0
- package/dist/radio/index.js +10 -0
- package/dist/radio/index.js.map +1 -0
- package/dist/renderIcon-C2lEMMzb.d.cts +30 -0
- package/dist/renderIcon-C2lEMMzb.d.ts +30 -0
- package/dist/segmented-control/index.cjs +11 -0
- package/dist/segmented-control/index.cjs.map +1 -0
- package/dist/segmented-control/index.d.cts +70 -0
- package/dist/segmented-control/index.d.ts +70 -0
- package/dist/segmented-control/index.js +11 -0
- package/dist/segmented-control/index.js.map +1 -0
- package/dist/select/index.cjs +13 -0
- package/dist/select/index.cjs.map +1 -0
- package/dist/select/index.d.cts +46 -0
- package/dist/select/index.d.ts +46 -0
- package/dist/select/index.js +13 -0
- package/dist/select/index.js.map +1 -0
- package/dist/sizes-DM6Rrrgq.d.cts +11 -0
- package/dist/sizes-DM6Rrrgq.d.ts +11 -0
- package/dist/skeleton/index.cjs +8 -0
- package/dist/skeleton/index.cjs.map +1 -0
- package/dist/skeleton/index.d.cts +14 -0
- package/dist/skeleton/index.d.ts +14 -0
- package/dist/skeleton/index.js +8 -0
- package/dist/skeleton/index.js.map +1 -0
- package/dist/slider/index.cjs +8 -0
- package/dist/slider/index.cjs.map +1 -0
- package/dist/slider/index.d.cts +37 -0
- package/dist/slider/index.d.ts +37 -0
- package/dist/slider/index.js +8 -0
- package/dist/slider/index.js.map +1 -0
- package/dist/snackbar/index.cjs +18 -0
- package/dist/snackbar/index.cjs.map +1 -0
- package/dist/snackbar/index.d.cts +68 -0
- package/dist/snackbar/index.d.ts +68 -0
- package/dist/snackbar/index.js +18 -0
- package/dist/snackbar/index.js.map +1 -0
- package/dist/spinner/index.cjs +9 -0
- package/dist/spinner/index.cjs.map +1 -0
- package/dist/spinner/index.d.cts +12 -0
- package/dist/spinner/index.d.ts +12 -0
- package/dist/spinner/index.js +9 -0
- package/dist/spinner/index.js.map +1 -0
- package/dist/split-button/index.cjs +13 -0
- package/dist/split-button/index.cjs.map +1 -0
- package/dist/split-button/index.d.cts +53 -0
- package/dist/split-button/index.d.ts +53 -0
- package/dist/split-button/index.js +13 -0
- package/dist/split-button/index.js.map +1 -0
- package/dist/stepper/index.cjs +8 -0
- package/dist/stepper/index.cjs.map +1 -0
- package/dist/stepper/index.d.cts +42 -0
- package/dist/stepper/index.d.ts +42 -0
- package/dist/stepper/index.js +8 -0
- package/dist/stepper/index.js.map +1 -0
- package/dist/switch/index.cjs +8 -0
- package/dist/switch/index.cjs.map +1 -0
- package/dist/switch/index.d.cts +15 -0
- package/dist/switch/index.d.ts +15 -0
- package/dist/switch/index.js +8 -0
- package/dist/switch/index.js.map +1 -0
- package/dist/table/index.cjs +33 -0
- package/dist/table/index.cjs.map +1 -0
- package/dist/table/index.d.cts +20 -0
- package/dist/table/index.d.ts +20 -0
- package/dist/table/index.js +33 -0
- package/dist/table/index.js.map +1 -0
- package/dist/tabs/index.cjs +13 -0
- package/dist/tabs/index.cjs.map +1 -0
- package/dist/tabs/index.d.cts +34 -0
- package/dist/tabs/index.d.ts +34 -0
- package/dist/tabs/index.js +13 -0
- package/dist/tabs/index.js.map +1 -0
- package/dist/tag-input/index.cjs +12 -0
- package/dist/tag-input/index.cjs.map +1 -0
- package/dist/tag-input/index.d.cts +36 -0
- package/dist/tag-input/index.d.ts +36 -0
- package/dist/tag-input/index.js +12 -0
- package/dist/tag-input/index.js.map +1 -0
- package/dist/textarea/index.cjs +10 -0
- package/dist/textarea/index.cjs.map +1 -0
- package/dist/textarea/index.d.cts +28 -0
- package/dist/textarea/index.d.ts +28 -0
- package/dist/textarea/index.js +10 -0
- package/dist/textarea/index.js.map +1 -0
- package/dist/timeline/index.cjs +8 -0
- package/dist/timeline/index.cjs.map +1 -0
- package/dist/timeline/index.d.cts +24 -0
- package/dist/timeline/index.d.ts +24 -0
- package/dist/timeline/index.js +8 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/toolbar/index.cjs +20 -0
- package/dist/toolbar/index.cjs.map +1 -0
- package/dist/toolbar/index.d.cts +13 -0
- package/dist/toolbar/index.d.ts +13 -0
- package/dist/toolbar/index.js +20 -0
- package/dist/toolbar/index.js.map +1 -0
- package/dist/tooltip/index.cjs +9 -0
- package/dist/tooltip/index.cjs.map +1 -0
- package/dist/tooltip/index.d.cts +25 -0
- package/dist/tooltip/index.d.ts +25 -0
- package/dist/tooltip/index.js +9 -0
- package/dist/tooltip/index.js.map +1 -0
- package/dist/tree-view/index.cjs +8 -0
- package/dist/tree-view/index.cjs.map +1 -0
- package/dist/tree-view/index.d.cts +36 -0
- package/dist/tree-view/index.d.ts +36 -0
- package/dist/tree-view/index.js +8 -0
- package/dist/tree-view/index.js.map +1 -0
- package/dist/virtual-list/index.cjs +9 -0
- package/dist/virtual-list/index.cjs.map +1 -0
- package/dist/virtual-list/index.d.cts +58 -0
- package/dist/virtual-list/index.d.ts +58 -0
- package/dist/virtual-list/index.js +9 -0
- package/dist/virtual-list/index.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Table/Table.component.tsx"],"sourcesContent":["import { useState, useMemo, useLayoutEffect, useRef } from 'react';\r\nimport React from 'react';\r\nimport {\r\n ChevronsUpDown,\r\n ArrowUp,\r\n ArrowDown,\r\n X,\r\n Check,\r\n Download,\r\n Columns3,\r\n AlignJustify,\r\n GripVertical,\r\n FolderOpen,\r\n SearchX,\r\n} from 'lucide-react';\r\nimport { DndContext, PointerSensor, KeyboardSensor, useSensor, useSensors } from '@dnd-kit/core';\r\nimport type { DragEndEvent } from '@dnd-kit/core';\r\nimport {\r\n SortableContext,\r\n horizontalListSortingStrategy,\r\n useSortable,\r\n sortableKeyboardCoordinates,\r\n arrayMove,\r\n} from '@dnd-kit/sortable';\r\nimport { CSS } from '@dnd-kit/utilities';\r\nimport type { TableColumn, TableProps, TableFilters, FilterValue } from './Table.types';\r\n\r\nexport type { TableColumn, TableProps, TableFilters, FilterValue };\r\nimport { Button } from '../Button';\r\nimport { Checkbox } from '../Checkbox';\r\nimport { Dropdown } from '../Dropdown';\r\nimport { EmptyState } from '../EmptyState';\r\nimport { Pagination } from '../Pagination';\r\nimport { SplitButton } from '../SplitButton';\r\nimport { Spinner } from '../Spinner';\r\nimport { TableFiltersDropdown } from './TableFiltersDropdown.component';\r\n\r\n// ── Types ─────────────────────────────────────────────────────────────────────\r\n\r\ntype Density = 'compact' | 'comfortable' | 'spacious';\r\n\r\nconst DENSITY_OPTIONS: { value: Density; label: string }[] = [\r\n { value: 'compact', label: 'Compact' },\r\n { value: 'comfortable', label: 'Comfortable' },\r\n { value: 'spacious', label: 'Spacious' },\r\n];\r\n\r\n// ── CSV helpers ───────────────────────────────────────────────────────────────\r\n\r\nfunction escapeCsvValue(value: string): string {\r\n if (value.includes(',') || value.includes('\\n') || value.includes('\"')) {\r\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return value;\r\n}\r\n\r\n// ── SortableColumnHeader ──────────────────────────────────────────────────────\r\n// Defined as a standalone component so it can legally call useSortable().\r\n// Only rendered when draggableColumns=true (inside a DndContext + SortableContext).\r\n\r\ninterface SortableThProps {\r\n id: string;\r\n column: { label: string };\r\n isSortable: boolean;\r\n isCurrentlySorted: boolean;\r\n sortDirection: 'asc' | 'desc' | null;\r\n alignment: string;\r\n columnType: string;\r\n columnWidth: string | undefined;\r\n pinnedClass: string;\r\n stickyStyle: React.CSSProperties;\r\n onSortClick: () => void;\r\n}\r\n\r\nfunction SortableColumnHeader({\r\n id,\r\n column,\r\n isSortable,\r\n isCurrentlySorted,\r\n sortDirection,\r\n alignment,\r\n columnType,\r\n columnWidth,\r\n pinnedClass,\r\n stickyStyle,\r\n onSortClick,\r\n}: SortableThProps) {\r\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\r\n id,\r\n });\r\n\r\n const transformStr = CSS.Transform.toString(transform);\r\n\r\n const thClassName = [\r\n 'eidos-table-header-cell',\r\n `eidos-table-header-cell-${columnType}`,\r\n isSortable ? 'eidos-table-sortable' : '',\r\n isCurrentlySorted ? 'eidos-table-sorted' : '',\r\n `eidos-table-align-${alignment}`,\r\n pinnedClass,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <th\r\n ref={setNodeRef as React.LegacyRef<HTMLTableCellElement>}\r\n className={thClassName}\r\n style={{\r\n width: columnWidth,\r\n ...stickyStyle,\r\n ...(transformStr ? { transform: transformStr } : {}),\r\n transition: transition ?? undefined,\r\n opacity: isDragging ? 0.5 : 1,\r\n }}\r\n data-col-key={id}\r\n onClick={() => isSortable && onSortClick()}\r\n {...attributes}\r\n >\r\n {/* Grip - absolutely positioned in the left padding zone so it never\r\n displaces the column label or causes layout shift on hover. */}\r\n <span\r\n className=\"eidos-table-drag-handle\"\r\n {...listeners}\r\n onClick={(e) => e.stopPropagation()}\r\n title=\"Drag to reorder\"\r\n >\r\n <GripVertical size={12} />\r\n </span>\r\n <div className={`eidos-table-header-content eidos-table-align-${alignment}`}>\r\n <span className=\"eidos-table-header-label\">{column.label}</span>\r\n {isSortable && (\r\n <div className=\"eidos-table-sort-indicator\">\r\n {sortDirection === 'asc' && <ArrowUp size={14} />}\r\n {sortDirection === 'desc' && <ArrowDown size={14} />}\r\n {!sortDirection && <ChevronsUpDown size={14} />}\r\n </div>\r\n )}\r\n </div>\r\n </th>\r\n );\r\n}\r\n\r\n// ── Table ─────────────────────────────────────────────────────────────────────\r\n\r\nexport const Table = <T extends Record<string, unknown>>({\r\n data,\r\n columns,\r\n loading = false,\r\n emptyMessage = 'No data available',\r\n onRowClick,\r\n className,\r\n showFooter = false,\r\n totalItems,\r\n showPagination = false,\r\n pageSize = 25,\r\n pageSizeOptions = [10, 25, 50, 100],\r\n onSortChange,\r\n currentSort,\r\n filters = {},\r\n onFiltersChange,\r\n defaultFilters,\r\n showFilters = false,\r\n // Selection\r\n selectable = false,\r\n rowKey,\r\n selectedRows: controlledSelected,\r\n defaultSelectedRows = [],\r\n onSelectionChange,\r\n bulkActions = [],\r\n // New features\r\n density = 'comfortable',\r\n showDensity = false,\r\n showColumnVisibility = false,\r\n showExport = false,\r\n draggableColumns = false,\r\n onColumnReorder,\r\n}: TableProps<T>) => {\r\n // ── Column ordering (drag-reorder) ────────────────────────────────────────\r\n const [columnOrder, setColumnOrder] = useState<string[]>(() => columns.map((c) => String(c.key)));\r\n\r\n // Derived-state reset: when the set of column keys changes, reset the order.\r\n // Calling setState during render is the React-idiomatic way to do this.\r\n const columnKeysSignature = columns.map((c) => String(c.key)).join('\\0');\r\n const prevKeysRef = useRef(columnKeysSignature);\r\n if (prevKeysRef.current !== columnKeysSignature) {\r\n prevKeysRef.current = columnKeysSignature;\r\n setColumnOrder(columns.map((c) => String(c.key)));\r\n }\r\n\r\n const orderedColumns = useMemo(() => {\r\n const orderMap = new Map(columnOrder.map((key, idx) => [key, idx]));\r\n return [...columns].sort((a, b) => {\r\n const ai = orderMap.get(String(a.key)) ?? Infinity;\r\n const bi = orderMap.get(String(b.key)) ?? Infinity;\r\n return ai - bi;\r\n });\r\n }, [columns, columnOrder]);\r\n\r\n // ── Density (internal state when showDensity=true) ────────────────────────\r\n const [internalDensity, setInternalDensity] = useState<Density>(density as Density);\r\n // When showDensity is true the table owns density; otherwise respect the prop.\r\n const effectiveDensity: Density = showDensity ? internalDensity : (density as Density);\r\n\r\n // ── Column visibility ─────────────────────────────────────────────────────\r\n const [hiddenColumnKeys, setHiddenColumnKeys] = useState<Set<string>>(() => new Set<string>());\r\n\r\n const visibleColumns = useMemo(\r\n () => orderedColumns.filter((c) => !hiddenColumnKeys.has(String(c.key))),\r\n [orderedColumns, hiddenColumnKeys],\r\n );\r\n\r\n // ── Pinned / sticky columns ────────────────────────────────────────────────\r\n const theadRef = useRef<HTMLTableSectionElement>(null);\r\n const [pinnedOffsets, setPinnedOffsets] = useState<\r\n Map<string, { side: 'left' | 'right'; offset: number }>\r\n >(new Map());\r\n\r\n useLayoutEffect(() => {\r\n const hasPinned = visibleColumns.some((c) => c.pin);\r\n if (!hasPinned || !theadRef.current) {\r\n setPinnedOffsets(new Map());\r\n return;\r\n }\r\n\r\n const headerRow = theadRef.current.querySelector('tr');\r\n if (!headerRow) return;\r\n\r\n const cells = Array.from(headerRow.querySelectorAll<HTMLTableCellElement>('th[data-col-key]'));\r\n\r\n const newOffsets = new Map<string, { side: 'left' | 'right'; offset: number }>();\r\n\r\n // Left-pinned: scan left-to-right.\r\n // Checkbox (when selectable) counts as a left-pinned element.\r\n let leftAccum = 0;\r\n for (const cell of cells) {\r\n const key = cell.dataset.colKey!;\r\n if (key === '__checkbox__') {\r\n newOffsets.set(key, { side: 'left', offset: leftAccum });\r\n leftAccum += cell.offsetWidth;\r\n } else {\r\n const col = visibleColumns.find((c) => String(c.key) === key);\r\n if (col?.pin === 'left') {\r\n newOffsets.set(key, { side: 'left', offset: leftAccum });\r\n leftAccum += cell.offsetWidth;\r\n }\r\n }\r\n }\r\n\r\n // Right-pinned: scan right-to-left.\r\n let rightAccum = 0;\r\n for (let i = cells.length - 1; i >= 0; i--) {\r\n const cell = cells[i];\r\n const key = cell.dataset.colKey!;\r\n const col = visibleColumns.find((c) => String(c.key) === key);\r\n if (col?.pin === 'right') {\r\n newOffsets.set(key, { side: 'right', offset: rightAccum });\r\n rightAccum += cell.offsetWidth;\r\n }\r\n }\r\n\r\n setPinnedOffsets(newOffsets);\r\n }, [visibleColumns, selectable]);\r\n\r\n // ── Selection state (controlled / uncontrolled) ──────────────────────────\r\n const isControlledSelection = controlledSelected !== undefined;\r\n const [internalSelected, setInternalSelected] = useState<string[]>(defaultSelectedRows);\r\n const selectedSet = useMemo(\r\n () => new Set(isControlledSelection ? controlledSelected : internalSelected),\r\n [isControlledSelection, controlledSelected, internalSelected],\r\n );\r\n\r\n /** Stable string key for a row - uses `rowKey` prop, then \"id\", then index. */\r\n const getRowKey = (item: T, index: number): string => {\r\n if (rowKey) return String(item[rowKey]);\r\n if ('id' in item) return String(item.id);\r\n return String(index);\r\n };\r\n\r\n const commitSelection = (keys: string[]) => {\r\n if (!isControlledSelection) setInternalSelected(keys);\r\n const rows = data.filter((item, idx) => keys.includes(getRowKey(item, idx)));\r\n onSelectionChange?.(keys, rows);\r\n };\r\n\r\n const toggleRow = (key: string) => {\r\n const next = selectedSet.has(key)\r\n ? [...selectedSet].filter((k) => k !== key)\r\n : [...selectedSet, key];\r\n commitSelection(next);\r\n };\r\n\r\n const allKeys = useMemo(\r\n () => data.map((item, idx) => getRowKey(item, idx)),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [data, rowKey],\r\n );\r\n\r\n const allSelected = allKeys.length > 0 && allKeys.every((k) => selectedSet.has(k));\r\n const someSelected = !allSelected && allKeys.some((k) => selectedSet.has(k));\r\n\r\n const toggleAll = () => {\r\n commitSelection(allSelected ? [] : allKeys);\r\n };\r\n\r\n const clearSelection = () => commitSelection([]);\r\n\r\n // ── Pagination ────────────────────────────────────────────────────────────\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [currentPageSize, setCurrentPageSize] = useState(pageSize);\r\n\r\n const displayData = useMemo(() => {\r\n if (!showPagination) return data;\r\n const startIndex = (currentPage - 1) * currentPageSize;\r\n return data.slice(startIndex, startIndex + currentPageSize);\r\n }, [data, showPagination, currentPage, currentPageSize]);\r\n\r\n const totalPages = Math.ceil(data.length / currentPageSize);\r\n\r\n const handleSort = (key: string) => {\r\n const newDirection =\r\n currentSort?.key === key && currentSort?.direction === 'asc' ? 'desc' : 'asc';\r\n onSortChange?.(key, newDirection);\r\n };\r\n\r\n const handlePageChange = (page: number) => setCurrentPage(page);\r\n const handlePageSizeChange = (newPageSize: number) => {\r\n setCurrentPageSize(newPageSize);\r\n setCurrentPage(1);\r\n };\r\n\r\n // ── Derived UI state ──────────────────────────────────────────────────────\r\n const hasSelection = selectedSet.size > 0;\r\n const showToolbar =\r\n (showFilters && !!onFiltersChange) ||\r\n showColumnVisibility ||\r\n showExport ||\r\n showDensity ||\r\n (selectable && hasSelection);\r\n\r\n const selectedItems = useMemo(\r\n () => data.filter((item, idx) => selectedSet.has(getRowKey(item, idx))),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [data, selectedSet, rowKey],\r\n );\r\n\r\n // ── CSV Export ────────────────────────────────────────────────────────────\r\n const getRawValue = (item: T, column: TableColumn<T>): string => {\r\n const value =\r\n typeof column.key === 'string' && column.key.includes('.')\r\n ? (column.key as string)\r\n .split('.')\r\n .reduce(\r\n (obj: unknown, k: string) => (obj as Record<string, unknown>)?.[k],\r\n item as unknown,\r\n )\r\n : item[column.key as keyof T];\r\n return String(value ?? '');\r\n };\r\n\r\n const handleExportCsv = () => {\r\n const headers = visibleColumns.map((c) => escapeCsvValue(c.label)).join(',');\r\n const rows = data.map((item) =>\r\n visibleColumns.map((col) => escapeCsvValue(getRawValue(item, col))).join(','),\r\n );\r\n const csv = [headers, ...rows].join('\\n');\r\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = 'export.csv';\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(url);\r\n };\r\n\r\n // ── DnD setup ─────────────────────────────────────────────────────────────\r\n const sensors = useSensors(\r\n useSensor(PointerSensor),\r\n useSensor(KeyboardSensor, {\r\n coordinateGetter: sortableKeyboardCoordinates,\r\n }),\r\n );\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (!over || active.id === over.id) return;\r\n\r\n const activeId = String(active.id);\r\n const overId = String(over.id);\r\n const oldIndex = columnOrder.indexOf(activeId);\r\n const newIndex = columnOrder.indexOf(overId);\r\n if (oldIndex === -1 || newIndex === -1) return;\r\n\r\n const newOrder = arrayMove(columnOrder, oldIndex, newIndex);\r\n setColumnOrder(newOrder);\r\n\r\n if (onColumnReorder) {\r\n const orderMap = new Map(newOrder.map((key, idx) => [key, idx]));\r\n const reordered = [...columns].sort((a, b) => {\r\n const ai = orderMap.get(String(a.key)) ?? Infinity;\r\n const bi = orderMap.get(String(b.key)) ?? Infinity;\r\n return ai - bi;\r\n });\r\n onColumnReorder(reordered);\r\n }\r\n };\r\n\r\n // ── Helpers ───────────────────────────────────────────────────────────────\r\n\r\n /** Returns sticky style + className for body <td> cells (zIndex: 1). */\r\n const getCellPinnedProps = (\r\n colKey: string,\r\n ): { style: React.CSSProperties; className: string } => {\r\n const pinInfo = pinnedOffsets.get(colKey);\r\n if (!pinInfo) return { style: {}, className: '' };\r\n return {\r\n style: {\r\n position: 'sticky',\r\n [pinInfo.side]: pinInfo.offset,\r\n zIndex: 1,\r\n },\r\n className:\r\n pinInfo.side === 'left'\r\n ? 'eidos-table-cell--pinned-left'\r\n : 'eidos-table-cell--pinned-right',\r\n };\r\n };\r\n\r\n /** Returns sticky style + className for header <th> cells (zIndex: 3). */\r\n const getHeaderPinnedProps = (\r\n colKey: string,\r\n ): { style: React.CSSProperties; className: string } => {\r\n const pinInfo = pinnedOffsets.get(colKey);\r\n if (!pinInfo) return { style: {}, className: '' };\r\n return {\r\n style: {\r\n position: 'sticky',\r\n [pinInfo.side]: pinInfo.offset,\r\n zIndex: 3,\r\n },\r\n className:\r\n pinInfo.side === 'left'\r\n ? 'eidos-table-header-cell--pinned-left'\r\n : 'eidos-table-header-cell--pinned-right',\r\n };\r\n };\r\n\r\n // ── Density class ─────────────────────────────────────────────────────────\r\n const densityClass = effectiveDensity !== 'comfortable' ? `eidos-table--${effectiveDensity}` : '';\r\n\r\n // ── Loading ───────────────────────────────────────────────────────────────\r\n if (loading) {\r\n return (\r\n <div className={`eidos-table-container ${className || ''}`}>\r\n <div className=\"eidos-table-loading\">\r\n <Spinner size=\"md\" />\r\n <p>Loading...</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // ── Density panel (Dropdown content) ──────────────────────────────────────\r\n const densityPanel = (\r\n <div className=\"eidos-table-menu-panel\">\r\n {DENSITY_OPTIONS.map((option) => (\r\n <button\r\n key={option.value}\r\n className={[\r\n 'eidos-table-menu-item',\r\n effectiveDensity === option.value ? 'eidos-table-menu-item--active' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n onClick={() => setInternalDensity(option.value)}\r\n >\r\n <span className=\"eidos-table-menu-item-check\">\r\n {effectiveDensity === option.value && <Check size={14} />}\r\n </span>\r\n <span>{option.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n\r\n // ── Column visibility panel (Dropdown content) ────────────────────────────\r\n const columnVisibilityPanel = (\r\n <div className=\"eidos-table-menu-panel\">\r\n {/* Use orderedColumns so list order mirrors current column order */}\r\n {orderedColumns.map((col) => {\r\n const key = String(col.key);\r\n const isVisible = !hiddenColumnKeys.has(key);\r\n const isLastVisible = visibleColumns.length === 1 && isVisible;\r\n return (\r\n <button\r\n key={key}\r\n className={['eidos-table-menu-item', isVisible ? 'eidos-table-menu-item--active' : '']\r\n .filter(Boolean)\r\n .join(' ')}\r\n disabled={isLastVisible}\r\n onClick={() => {\r\n setHiddenColumnKeys((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(key)) next.delete(key);\r\n else next.add(key);\r\n return next;\r\n });\r\n }}\r\n >\r\n <Checkbox\r\n checked={isVisible}\r\n disabled={isLastVisible}\r\n size=\"sm\"\r\n onChange={() => {\r\n /* click handled by parent button */\r\n }}\r\n />\r\n <span>{col.label}</span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n );\r\n\r\n // ── SortableContext items: visible column keys only ───────────────────────\r\n const sortableItems = visibleColumns.map((c) => String(c.key));\r\n\r\n // ── Main JSX ──────────────────────────────────────────────────────────────\r\n const tableContent = (\r\n <div className={`eidos-table-container ${className || ''}`}>\r\n {/* ── Toolbar ───────────────────────────────────────────────────────── */}\r\n {showToolbar && (\r\n <div className=\"eidos-table-toolbar\">\r\n {/* Left - bulk actions / selection info */}\r\n <div className=\"eidos-table-toolbar-left\">\r\n {selectable && hasSelection && (\r\n <>\r\n <span className=\"eidos-table-selection-count\">{selectedSet.size} selected</span>\r\n\r\n {bulkActions.length > 0 && (\r\n <div className=\"eidos-table-bulk-actions\">\r\n {bulkActions.map((action) => {\r\n const isDisabled =\r\n typeof action.disabled === 'function'\r\n ? action.disabled(selectedItems)\r\n : (action.disabled ?? false);\r\n\r\n if (action.type === 'split-button') {\r\n return (\r\n <SplitButton\r\n key={action.id}\r\n size=\"sm\"\r\n variant={action.variant ?? 'outlined'}\r\n color={action.color ?? 'secondary'}\r\n preIcon={action.icon}\r\n disabled={isDisabled}\r\n label={action.label}\r\n onClick={() => action.onClick(selectedItems)}\r\n options={action.options.map((option) => ({\r\n id: option.id,\r\n label: option.label,\r\n icon: option.icon,\r\n disabled: option.disabled,\r\n onClick: () => option.onClick(selectedItems),\r\n }))}\r\n />\r\n );\r\n }\r\n\r\n return action.label ? (\r\n <Button\r\n key={action.id}\r\n size=\"sm\"\r\n variant={action.variant ?? 'outlined'}\r\n color={action.color ?? 'secondary'}\r\n preIcon={action.icon}\r\n posIcon={action.posIcon}\r\n disabled={isDisabled}\r\n onClick={() => action.onClick(selectedItems)}\r\n >\r\n {action.label}\r\n </Button>\r\n ) : action.icon ? (\r\n <Button\r\n key={action.id}\r\n size=\"sm\"\r\n variant={action.variant ?? 'outlined'}\r\n color={action.color ?? 'secondary'}\r\n icon={action.icon}\r\n disabled={isDisabled}\r\n onClick={() => action.onClick(selectedItems)}\r\n />\r\n ) : null;\r\n })}\r\n </div>\r\n )}\r\n\r\n <button\r\n className=\"eidos-table-clear-selection\"\r\n onClick={clearSelection}\r\n aria-label=\"Clear selection\"\r\n >\r\n <X size={14} />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Right - density, column visibility, export, filter */}\r\n <div className=\"eidos-table-toolbar-right\">\r\n {showDensity && (\r\n <Dropdown\r\n placement=\"bottom\"\r\n align=\"end\"\r\n autoWidth={false}\r\n trigger={\r\n <Button variant=\"text\" size=\"sm\" preIcon={AlignJustify}>\r\n Density\r\n </Button>\r\n }\r\n content={densityPanel}\r\n />\r\n )}\r\n\r\n {showColumnVisibility && (\r\n <Dropdown\r\n placement=\"bottom\"\r\n align=\"end\"\r\n autoWidth={false}\r\n trigger={\r\n <Button variant=\"text\" size=\"sm\" preIcon={Columns3}>\r\n Columns\r\n </Button>\r\n }\r\n content={columnVisibilityPanel}\r\n />\r\n )}\r\n\r\n {showExport && (\r\n <Button\r\n variant=\"text\"\r\n size=\"sm\"\r\n icon={Download}\r\n onClick={handleExportCsv}\r\n tooltip=\"Export CSV\"\r\n />\r\n )}\r\n\r\n {showFilters && onFiltersChange && (\r\n <TableFiltersDropdown\r\n columns={columns}\r\n filters={filters}\r\n onFiltersChange={onFiltersChange}\r\n defaultFilters={defaultFilters}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ── Table (wrapped for horizontal scroll) ─────────────────────────── */}\r\n <div className=\"eidos-table-scroll\">\r\n <table\r\n className={[\r\n 'eidos-table',\r\n densityClass,\r\n draggableColumns ? 'eidos-table--draggable-columns' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n >\r\n <thead ref={theadRef}>\r\n <tr>\r\n {selectable && (\r\n <th\r\n className={[\r\n 'eidos-table-header-cell',\r\n 'eidos-table-checkbox-cell',\r\n getHeaderPinnedProps('__checkbox__').className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n style={getHeaderPinnedProps('__checkbox__').style}\r\n data-col-key=\"__checkbox__\"\r\n >\r\n <Checkbox\r\n size=\"sm\"\r\n checked={allSelected}\r\n indeterminate={someSelected}\r\n onChange={toggleAll}\r\n aria-label=\"Select all rows\"\r\n />\r\n </th>\r\n )}\r\n\r\n {/* ── Headers: draggable or plain ──────────────────────────── */}\r\n {draggableColumns\r\n ? visibleColumns.map((column) => {\r\n const colKey = String(column.key);\r\n const columnType = column.type || 'data';\r\n const columnWidth =\r\n column.type === 'icon' ? 'var(--component-size-lg)' : column.width;\r\n const isSortable = !!column.sortable;\r\n const isCurrentlySorted = currentSort?.key === colKey;\r\n const sortDirection = isCurrentlySorted\r\n ? (currentSort!.direction as 'asc' | 'desc')\r\n : null;\r\n const alignment = column.align || 'left';\r\n const { style: pinnedStyle, className: pinnedClass } =\r\n getHeaderPinnedProps(colKey);\r\n\r\n return (\r\n <SortableColumnHeader\r\n key={colKey}\r\n id={colKey}\r\n column={column}\r\n isSortable={isSortable}\r\n isCurrentlySorted={!!isCurrentlySorted}\r\n sortDirection={sortDirection}\r\n alignment={alignment}\r\n columnType={columnType}\r\n columnWidth={columnWidth}\r\n pinnedClass={pinnedClass}\r\n stickyStyle={pinnedStyle}\r\n onSortClick={() => handleSort(colKey)}\r\n />\r\n );\r\n })\r\n : visibleColumns.map((column, index) => {\r\n const colKey = String(column.key);\r\n const columnType = column.type || 'data';\r\n const columnWidth =\r\n column.type === 'icon' ? 'var(--component-size-lg)' : column.width;\r\n const isSortable = column.sortable;\r\n const isCurrentlySorted = currentSort?.key === colKey;\r\n const sortDirection = isCurrentlySorted ? currentSort!.direction : null;\r\n const alignment = column.align || 'left';\r\n const alignmentClass = `eidos-table-align-${alignment}`;\r\n const { style: pinnedStyle, className: pinnedClass } =\r\n getHeaderPinnedProps(colKey);\r\n\r\n return (\r\n <th\r\n key={index}\r\n className={[\r\n 'eidos-table-header-cell',\r\n `eidos-table-header-cell-${columnType}`,\r\n isSortable ? 'eidos-table-sortable' : '',\r\n isCurrentlySorted ? 'eidos-table-sorted' : '',\r\n alignmentClass,\r\n pinnedClass,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n style={{ width: columnWidth, ...pinnedStyle }}\r\n data-col-key={colKey}\r\n onClick={() => isSortable && handleSort(colKey)}\r\n >\r\n <div className={`eidos-table-header-content ${alignmentClass}`}>\r\n <span>{column.label}</span>\r\n {isSortable && (\r\n <div className=\"eidos-table-sort-indicator\">\r\n {sortDirection === 'asc' && <ArrowUp size={14} />}\r\n {sortDirection === 'desc' && <ArrowDown size={14} />}\r\n {!sortDirection && <ChevronsUpDown size={14} />}\r\n </div>\r\n )}\r\n </div>\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {displayData.length > 0 ? (\r\n displayData.map((item, rowIndex) => {\r\n const globalIndex = showPagination\r\n ? (currentPage - 1) * currentPageSize + rowIndex\r\n : rowIndex;\r\n const key = getRowKey(item, globalIndex);\r\n const isSelected = selectedSet.has(key);\r\n\r\n return (\r\n <tr\r\n key={key}\r\n className={[\r\n 'eidos-table-row',\r\n onRowClick ? 'eidos-table-clickable' : '',\r\n isSelected ? 'eidos-table-row--selected' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n onClick={() => onRowClick?.(item)}\r\n >\r\n {selectable && (\r\n <td\r\n className={[\r\n 'eidos-table-cell',\r\n 'eidos-table-checkbox-cell',\r\n getCellPinnedProps('__checkbox__').className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n style={getCellPinnedProps('__checkbox__').style}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleRow(key);\r\n }}\r\n >\r\n {/* Wrap in a span so Checkbox click-events don't\r\n bubble to the <td> and cause a double-toggle.\r\n The <td> onClick handles toggling when the user\r\n clicks the cell margin outside the checkbox. */}\r\n <span onClick={(e) => e.stopPropagation()}>\r\n <Checkbox\r\n size=\"sm\"\r\n checked={isSelected}\r\n onChange={() => toggleRow(key)}\r\n aria-label={`Select row ${globalIndex + 1}`}\r\n />\r\n </span>\r\n </td>\r\n )}\r\n {visibleColumns.map((column, colIndex) => {\r\n const colKey = String(column.key);\r\n const value =\r\n typeof column.key === 'string' && column.key.includes('.')\r\n ? (column.key as string)\r\n .split('.')\r\n .reduce(\r\n (obj: unknown, k: string) => (obj as Record<string, unknown>)?.[k],\r\n item as unknown,\r\n )\r\n : item[column.key as keyof T];\r\n\r\n const columnType = column.type || 'data';\r\n const columnWidth =\r\n column.type === 'icon' ? 'var(--component-size-lg)' : column.width;\r\n const alignment = column.align || 'left';\r\n const alignmentClass = `eidos-table-align-${alignment}`;\r\n const { style: pinnedStyle, className: pinnedClass } =\r\n getCellPinnedProps(colKey);\r\n\r\n return (\r\n <td\r\n key={colIndex}\r\n className={[\r\n 'eidos-table-cell',\r\n `eidos-table-cell-${columnType}`,\r\n alignmentClass,\r\n pinnedClass,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n style={{ width: columnWidth, ...pinnedStyle }}\r\n // `type: 'action'` cells exist specifically to hold\r\n // interactive controls (a row-actions Menu/button,\r\n // typically) - without this, clicking them bubbles\r\n // straight into `onRowClick` on the <tr> below,\r\n // e.g. opening a details drawer at the same time as\r\n // (or instead of) the action itself. Mirrors the\r\n // selectable checkbox cell's own stopPropagation\r\n // above, for the same reason.\r\n onClick={columnType === 'action' ? (e) => e.stopPropagation() : undefined}\r\n >\r\n {column.render ? column.render(value, item) : String(value ?? '')}\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n );\r\n })\r\n ) : (\r\n <tr className=\"eidos-table-empty-row\">\r\n <td\r\n colSpan={selectable ? visibleColumns.length + 1 : visibleColumns.length}\r\n className=\"eidos-table-cell eidos-table-empty-cell\"\r\n >\r\n {Object.keys(filters).length > 0 ? (\r\n <EmptyState\r\n icon={<SearchX />}\r\n title=\"No results found\"\r\n description=\"Try adjusting your filters or search terms.\"\r\n action={\r\n onFiltersChange ? (\r\n <Button\r\n size=\"sm\"\r\n variant=\"outlined\"\r\n color=\"primary\"\r\n onClick={() => onFiltersChange({})}\r\n >\r\n Clear filters\r\n </Button>\r\n ) : undefined\r\n }\r\n size=\"sm\"\r\n />\r\n ) : (\r\n <EmptyState\r\n icon={<FolderOpen />}\r\n title={emptyMessage}\r\n description=\"There are no records to display.\"\r\n size=\"sm\"\r\n />\r\n )}\r\n </td>\r\n </tr>\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {/* ── Footer / Pagination ───────────────────────────────────────────── */}\r\n {showFooter && (\r\n <div className=\"eidos-table-footer\">\r\n <div className=\"eidos-table-footer-content\">\r\n {showPagination && data.length > 0 ? (\r\n <Pagination\r\n page={currentPage}\r\n totalPages={totalPages}\r\n onChange={handlePageChange}\r\n totalItems={totalItems ?? data.length}\r\n pageSize={currentPageSize}\r\n onPageSizeChange={handlePageSizeChange}\r\n pageSizeOptions={pageSizeOptions}\r\n size=\"sm\"\r\n />\r\n ) : (\r\n <span className=\"eidos-table-results-info\">\r\n Showing {data.length} of {totalItems ?? data.length} results\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // ── Wrap with DnD context when draggableColumns=true ─────────────────────\r\n if (draggableColumns) {\r\n return (\r\n <DndContext sensors={sensors} onDragEnd={handleDragEnd}>\r\n <SortableContext items={sortableItems} strategy={horizontalListSortingStrategy}>\r\n {tableContent}\r\n </SortableContext>\r\n </DndContext>\r\n );\r\n }\r\n\r\n return tableContent;\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,UAAU,SAAS,iBAAiB,cAAc;AAE3D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAiHC,SA2ZM,UA3ZN,KAKE,YALF;AAtFR,IAAM,kBAAuD;AAAA,EAC3D,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,eAAe,OAAO,cAAc;AAAA,EAC7C,EAAE,OAAO,YAAY,OAAO,WAAW;AACzC;AAIA,SAAS,eAAe,OAAuB;AAC7C,MAAI,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,GAAG,GAAG;AACtE,WAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,EACtC;AACA,SAAO;AACT;AAoBA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,EAAE,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,IAAI,YAAY;AAAA,IAC3F;AAAA,EACF,CAAC;AAED,QAAM,eAAe,IAAI,UAAU,SAAS,SAAS;AAErD,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,2BAA2B,UAAU;AAAA,IACrC,aAAa,yBAAyB;AAAA,IACtC,oBAAoB,uBAAuB;AAAA,IAC3C,qBAAqB,SAAS;AAAA,IAC9B;AAAA,EACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,MACX,OAAO;AAAA,QACL,OAAO;AAAA,QACP,GAAG;AAAA,QACH,GAAI,eAAe,EAAE,WAAW,aAAa,IAAI,CAAC;AAAA,QAClD,YAAY,cAAc;AAAA,QAC1B,SAAS,aAAa,MAAM;AAAA,MAC9B;AAAA,MACA,gBAAc;AAAA,MACd,SAAS,MAAM,cAAc,YAAY;AAAA,MACxC,GAAG;AAAA,MAIJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACT,GAAG;AAAA,YACJ,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAClC,OAAM;AAAA,YAEN,8BAAC,gBAAa,MAAM,IAAI;AAAA;AAAA,QAC1B;AAAA,QACA,qBAAC,SAAI,WAAW,gDAAgD,SAAS,IACvE;AAAA,8BAAC,UAAK,WAAU,4BAA4B,iBAAO,OAAM;AAAA,UACxD,cACC,qBAAC,SAAI,WAAU,8BACZ;AAAA,8BAAkB,SAAS,oBAAC,WAAQ,MAAM,IAAI;AAAA,YAC9C,kBAAkB,UAAU,oBAAC,aAAU,MAAM,IAAI;AAAA,YACjD,CAAC,iBAAiB,oBAAC,kBAAe,MAAM,IAAI;AAAA,aAC/C;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAIO,IAAM,QAAQ,CAAoC;AAAA,EACvD;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,kBAAkB,CAAC,IAAI,IAAI,IAAI,GAAG;AAAA,EAClC;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AAAA,EACX;AAAA,EACA;AAAA,EACA,cAAc;AAAA;AAAA,EAEd,aAAa;AAAA,EACb;AAAA,EACA,cAAc;AAAA,EACd,sBAAsB,CAAC;AAAA,EACvB;AAAA,EACA,cAAc,CAAC;AAAA;AAAA,EAEf,UAAU;AAAA,EACV,cAAc;AAAA,EACd,uBAAuB;AAAA,EACvB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB;AACF,MAAqB;AAEnB,QAAM,CAAC,aAAa,cAAc,IAAI,SAAmB,MAAM,QAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,GAAG,CAAC,CAAC;AAIhG,QAAM,sBAAsB,QAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,IAAI;AACvE,QAAM,cAAc,OAAO,mBAAmB;AAC9C,MAAI,YAAY,YAAY,qBAAqB;AAC/C,gBAAY,UAAU;AACtB,mBAAe,QAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,GAAG,CAAC,CAAC;AAAA,EAClD;AAEA,QAAM,iBAAiB,QAAQ,MAAM;AACnC,UAAM,WAAW,IAAI,IAAI,YAAY,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;AAClE,WAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AACjC,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE,GAAG,CAAC,KAAK;AAC1C,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE,GAAG,CAAC,KAAK;AAC1C,aAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,WAAW,CAAC;AAGzB,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAkB,OAAkB;AAElF,QAAM,mBAA4B,cAAc,kBAAmB;AAGnE,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAsB,MAAM,oBAAI,IAAY,CAAC;AAE7F,QAAM,iBAAiB;AAAA,IACrB,MAAM,eAAe,OAAO,CAAC,MAAM,CAAC,iBAAiB,IAAI,OAAO,EAAE,GAAG,CAAC,CAAC;AAAA,IACvE,CAAC,gBAAgB,gBAAgB;AAAA,EACnC;AAGA,QAAM,WAAW,OAAgC,IAAI;AACrD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAExC,oBAAI,IAAI,CAAC;AAEX,kBAAgB,MAAM;AACpB,UAAM,YAAY,eAAe,KAAK,CAAC,MAAM,EAAE,GAAG;AAClD,QAAI,CAAC,aAAa,CAAC,SAAS,SAAS;AACnC,uBAAiB,oBAAI,IAAI,CAAC;AAC1B;AAAA,IACF;AAEA,UAAM,YAAY,SAAS,QAAQ,cAAc,IAAI;AACrD,QAAI,CAAC,UAAW;AAEhB,UAAM,QAAQ,MAAM,KAAK,UAAU,iBAAuC,kBAAkB,CAAC;AAE7F,UAAM,aAAa,oBAAI,IAAwD;AAI/E,QAAI,YAAY;AAChB,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAM,KAAK,QAAQ;AACzB,UAAI,QAAQ,gBAAgB;AAC1B,mBAAW,IAAI,KAAK,EAAE,MAAM,QAAQ,QAAQ,UAAU,CAAC;AACvD,qBAAa,KAAK;AAAA,MACpB,OAAO;AACL,cAAM,MAAM,eAAe,KAAK,CAAC,MAAM,OAAO,EAAE,GAAG,MAAM,GAAG;AAC5D,YAAI,KAAK,QAAQ,QAAQ;AACvB,qBAAW,IAAI,KAAK,EAAE,MAAM,QAAQ,QAAQ,UAAU,CAAC;AACvD,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,aAAa;AACjB,aAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1C,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,MAAM,KAAK,QAAQ;AACzB,YAAM,MAAM,eAAe,KAAK,CAAC,MAAM,OAAO,EAAE,GAAG,MAAM,GAAG;AAC5D,UAAI,KAAK,QAAQ,SAAS;AACxB,mBAAW,IAAI,KAAK,EAAE,MAAM,SAAS,QAAQ,WAAW,CAAC;AACzD,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,qBAAiB,UAAU;AAAA,EAC7B,GAAG,CAAC,gBAAgB,UAAU,CAAC;AAG/B,QAAM,wBAAwB,uBAAuB;AACrD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAmB,mBAAmB;AACtF,QAAM,cAAc;AAAA,IAClB,MAAM,IAAI,IAAI,wBAAwB,qBAAqB,gBAAgB;AAAA,IAC3E,CAAC,uBAAuB,oBAAoB,gBAAgB;AAAA,EAC9D;AAGA,QAAM,YAAY,CAAC,MAAS,UAA0B;AACpD,QAAI,OAAQ,QAAO,OAAO,KAAK,MAAM,CAAC;AACtC,QAAI,QAAQ,KAAM,QAAO,OAAO,KAAK,EAAE;AACvC,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,QAAM,kBAAkB,CAAC,SAAmB;AAC1C,QAAI,CAAC,sBAAuB,qBAAoB,IAAI;AACpD,UAAM,OAAO,KAAK,OAAO,CAAC,MAAM,QAAQ,KAAK,SAAS,UAAU,MAAM,GAAG,CAAC,CAAC;AAC3E,wBAAoB,MAAM,IAAI;AAAA,EAChC;AAEA,QAAM,YAAY,CAAC,QAAgB;AACjC,UAAM,OAAO,YAAY,IAAI,GAAG,IAC5B,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,MAAM,MAAM,GAAG,IACxC,CAAC,GAAG,aAAa,GAAG;AACxB,oBAAgB,IAAI;AAAA,EACtB;AAEA,QAAM,UAAU;AAAA,IACd,MAAM,KAAK,IAAI,CAAC,MAAM,QAAQ,UAAU,MAAM,GAAG,CAAC;AAAA;AAAA,IAElD,CAAC,MAAM,MAAM;AAAA,EACf;AAEA,QAAM,cAAc,QAAQ,SAAS,KAAK,QAAQ,MAAM,CAAC,MAAM,YAAY,IAAI,CAAC,CAAC;AACjF,QAAM,eAAe,CAAC,eAAe,QAAQ,KAAK,CAAC,MAAM,YAAY,IAAI,CAAC,CAAC;AAE3E,QAAM,YAAY,MAAM;AACtB,oBAAgB,cAAc,CAAC,IAAI,OAAO;AAAA,EAC5C;AAEA,QAAM,iBAAiB,MAAM,gBAAgB,CAAC,CAAC;AAG/C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAChD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,QAAQ;AAE/D,QAAM,cAAc,QAAQ,MAAM;AAChC,QAAI,CAAC,eAAgB,QAAO;AAC5B,UAAM,cAAc,cAAc,KAAK;AACvC,WAAO,KAAK,MAAM,YAAY,aAAa,eAAe;AAAA,EAC5D,GAAG,CAAC,MAAM,gBAAgB,aAAa,eAAe,CAAC;AAEvD,QAAM,aAAa,KAAK,KAAK,KAAK,SAAS,eAAe;AAE1D,QAAM,aAAa,CAAC,QAAgB;AAClC,UAAM,eACJ,aAAa,QAAQ,OAAO,aAAa,cAAc,QAAQ,SAAS;AAC1E,mBAAe,KAAK,YAAY;AAAA,EAClC;AAEA,QAAM,mBAAmB,CAAC,SAAiB,eAAe,IAAI;AAC9D,QAAM,uBAAuB,CAAC,gBAAwB;AACpD,uBAAmB,WAAW;AAC9B,mBAAe,CAAC;AAAA,EAClB;AAGA,QAAM,eAAe,YAAY,OAAO;AACxC,QAAM,cACH,eAAe,CAAC,CAAC,mBAClB,wBACA,cACA,eACC,cAAc;AAEjB,QAAM,gBAAgB;AAAA,IACpB,MAAM,KAAK,OAAO,CAAC,MAAM,QAAQ,YAAY,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC;AAAA;AAAA,IAEtE,CAAC,MAAM,aAAa,MAAM;AAAA,EAC5B;AAGA,QAAM,cAAc,CAAC,MAAS,WAAmC;AAC/D,UAAM,QACJ,OAAO,OAAO,QAAQ,YAAY,OAAO,IAAI,SAAS,GAAG,IACpD,OAAO,IACL,MAAM,GAAG,EACT;AAAA,MACC,CAAC,KAAc,MAAe,MAAkC,CAAC;AAAA,MACjE;AAAA,IACF,IACF,KAAK,OAAO,GAAc;AAChC,WAAO,OAAO,SAAS,EAAE;AAAA,EAC3B;AAEA,QAAM,kBAAkB,MAAM;AAC5B,UAAM,UAAU,eAAe,IAAI,CAAC,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG;AAC3E,UAAM,OAAO,KAAK;AAAA,MAAI,CAAC,SACrB,eAAe,IAAI,CAAC,QAAQ,eAAe,YAAY,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA,IAC9E;AACA,UAAM,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE,KAAK,IAAI;AACxC,UAAM,OAAO,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAChE,UAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,aAAS,KAAK,YAAY,IAAI;AAC9B,SAAK,MAAM;AACX,aAAS,KAAK,YAAY,IAAI;AAC9B,QAAI,gBAAgB,GAAG;AAAA,EACzB;AAGA,QAAM,UAAU;AAAA,IACd,UAAU,aAAa;AAAA,IACvB,UAAU,gBAAgB;AAAA,MACxB,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,CAAC,UAAwB;AAC7C,UAAM,EAAE,QAAQ,KAAK,IAAI;AACzB,QAAI,CAAC,QAAQ,OAAO,OAAO,KAAK,GAAI;AAEpC,UAAM,WAAW,OAAO,OAAO,EAAE;AACjC,UAAM,SAAS,OAAO,KAAK,EAAE;AAC7B,UAAM,WAAW,YAAY,QAAQ,QAAQ;AAC7C,UAAM,WAAW,YAAY,QAAQ,MAAM;AAC3C,QAAI,aAAa,MAAM,aAAa,GAAI;AAExC,UAAM,WAAW,UAAU,aAAa,UAAU,QAAQ;AAC1D,mBAAe,QAAQ;AAEvB,QAAI,iBAAiB;AACnB,YAAM,WAAW,IAAI,IAAI,SAAS,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;AAC/D,YAAM,YAAY,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AAC5C,cAAM,KAAK,SAAS,IAAI,OAAO,EAAE,GAAG,CAAC,KAAK;AAC1C,cAAM,KAAK,SAAS,IAAI,OAAO,EAAE,GAAG,CAAC,KAAK;AAC1C,eAAO,KAAK;AAAA,MACd,CAAC;AACD,sBAAgB,SAAS;AAAA,IAC3B;AAAA,EACF;AAKA,QAAM,qBAAqB,CACzB,WACsD;AACtD,UAAM,UAAU,cAAc,IAAI,MAAM;AACxC,QAAI,CAAC,QAAS,QAAO,EAAE,OAAO,CAAC,GAAG,WAAW,GAAG;AAChD,WAAO;AAAA,MACL,OAAO;AAAA,QACL,UAAU;AAAA,QACV,CAAC,QAAQ,IAAI,GAAG,QAAQ;AAAA,QACxB,QAAQ;AAAA,MACV;AAAA,MACA,WACE,QAAQ,SAAS,SACb,kCACA;AAAA,IACR;AAAA,EACF;AAGA,QAAM,uBAAuB,CAC3B,WACsD;AACtD,UAAM,UAAU,cAAc,IAAI,MAAM;AACxC,QAAI,CAAC,QAAS,QAAO,EAAE,OAAO,CAAC,GAAG,WAAW,GAAG;AAChD,WAAO;AAAA,MACL,OAAO;AAAA,QACL,UAAU;AAAA,QACV,CAAC,QAAQ,IAAI,GAAG,QAAQ;AAAA,QACxB,QAAQ;AAAA,MACV;AAAA,MACA,WACE,QAAQ,SAAS,SACb,yCACA;AAAA,IACR;AAAA,EACF;AAGA,QAAM,eAAe,qBAAqB,gBAAgB,gBAAgB,gBAAgB,KAAK;AAG/F,MAAI,SAAS;AACX,WACE,oBAAC,SAAI,WAAW,yBAAyB,aAAa,EAAE,IACtD,+BAAC,SAAI,WAAU,uBACb;AAAA,0BAAC,WAAQ,MAAK,MAAK;AAAA,MACnB,oBAAC,OAAE,wBAAU;AAAA,OACf,GACF;AAAA,EAEJ;AAGA,QAAM,eACJ,oBAAC,SAAI,WAAU,0BACZ,0BAAgB,IAAI,CAAC,WACpB;AAAA,IAAC;AAAA;AAAA,MAEC,WAAW;AAAA,QACT;AAAA,QACA,qBAAqB,OAAO,QAAQ,kCAAkC;AAAA,MACxE,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,SAAS,MAAM,mBAAmB,OAAO,KAAK;AAAA,MAE9C;AAAA,4BAAC,UAAK,WAAU,+BACb,+BAAqB,OAAO,SAAS,oBAAC,SAAM,MAAM,IAAI,GACzD;AAAA,QACA,oBAAC,UAAM,iBAAO,OAAM;AAAA;AAAA;AAAA,IAZf,OAAO;AAAA,EAad,CACD,GACH;AAIF,QAAM,wBACJ,oBAAC,SAAI,WAAU,0BAEZ,yBAAe,IAAI,CAAC,QAAQ;AAC3B,UAAM,MAAM,OAAO,IAAI,GAAG;AAC1B,UAAM,YAAY,CAAC,iBAAiB,IAAI,GAAG;AAC3C,UAAM,gBAAgB,eAAe,WAAW,KAAK;AACrD,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,CAAC,yBAAyB,YAAY,kCAAkC,EAAE,EAClF,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACX,UAAU;AAAA,QACV,SAAS,MAAM;AACb,8BAAoB,CAAC,SAAS;AAC5B,kBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,gBAAI,KAAK,IAAI,GAAG,EAAG,MAAK,OAAO,GAAG;AAAA,gBAC7B,MAAK,IAAI,GAAG;AACjB,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,UAAU;AAAA,cACV,MAAK;AAAA,cACL,UAAU,MAAM;AAAA,cAEhB;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,UAAM,cAAI,OAAM;AAAA;AAAA;AAAA,MAtBZ;AAAA,IAuBP;AAAA,EAEJ,CAAC,GACH;AAIF,QAAM,gBAAgB,eAAe,IAAI,CAAC,MAAM,OAAO,EAAE,GAAG,CAAC;AAG7D,QAAM,eACJ,qBAAC,SAAI,WAAW,yBAAyB,aAAa,EAAE,IAErD;AAAA,mBACC,qBAAC,SAAI,WAAU,uBAEb;AAAA,0BAAC,SAAI,WAAU,4BACZ,wBAAc,gBACb,iCACE;AAAA,6BAAC,UAAK,WAAU,+BAA+B;AAAA,sBAAY;AAAA,UAAK;AAAA,WAAS;AAAA,QAExE,YAAY,SAAS,KACpB,oBAAC,SAAI,WAAU,4BACZ,sBAAY,IAAI,CAAC,WAAW;AAC3B,gBAAM,aACJ,OAAO,OAAO,aAAa,aACvB,OAAO,SAAS,aAAa,IAC5B,OAAO,YAAY;AAE1B,cAAI,OAAO,SAAS,gBAAgB;AAClC,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,SAAS,OAAO,WAAW;AAAA,gBAC3B,OAAO,OAAO,SAAS;AAAA,gBACvB,SAAS,OAAO;AAAA,gBAChB,UAAU;AAAA,gBACV,OAAO,OAAO;AAAA,gBACd,SAAS,MAAM,OAAO,QAAQ,aAAa;AAAA,gBAC3C,SAAS,OAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,kBACvC,IAAI,OAAO;AAAA,kBACX,OAAO,OAAO;AAAA,kBACd,MAAM,OAAO;AAAA,kBACb,UAAU,OAAO;AAAA,kBACjB,SAAS,MAAM,OAAO,QAAQ,aAAa;AAAA,gBAC7C,EAAE;AAAA;AAAA,cAdG,OAAO;AAAA,YAed;AAAA,UAEJ;AAEA,iBAAO,OAAO,QACZ;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,OAAO,WAAW;AAAA,cAC3B,OAAO,OAAO,SAAS;AAAA,cACvB,SAAS,OAAO;AAAA,cAChB,SAAS,OAAO;AAAA,cAChB,UAAU;AAAA,cACV,SAAS,MAAM,OAAO,QAAQ,aAAa;AAAA,cAE1C,iBAAO;AAAA;AAAA,YATH,OAAO;AAAA,UAUd,IACE,OAAO,OACT;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,OAAO,WAAW;AAAA,cAC3B,OAAO,OAAO,SAAS;AAAA,cACvB,MAAM,OAAO;AAAA,cACb,UAAU;AAAA,cACV,SAAS,MAAM,OAAO,QAAQ,aAAa;AAAA;AAAA,YANtC,OAAO;AAAA,UAOd,IACE;AAAA,QACN,CAAC,GACH;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS;AAAA,YACT,cAAW;AAAA,YAEX,8BAAC,KAAE,MAAM,IAAI;AAAA;AAAA,QACf;AAAA,SACF,GAEJ;AAAA,MAGA,qBAAC,SAAI,WAAU,6BACZ;AAAA,uBACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAM;AAAA,YACN,WAAW;AAAA,YACX,SACE,oBAAC,UAAO,SAAQ,QAAO,MAAK,MAAK,SAAS,cAAc,qBAExD;AAAA,YAEF,SAAS;AAAA;AAAA,QACX;AAAA,QAGD,wBACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAM;AAAA,YACN,WAAW;AAAA,YACX,SACE,oBAAC,UAAO,SAAQ,QAAO,MAAK,MAAK,SAAS,UAAU,qBAEpD;AAAA,YAEF,SAAS;AAAA;AAAA,QACX;AAAA,QAGD,cACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAQ;AAAA;AAAA,QACV;AAAA,QAGD,eAAe,mBACd;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,SAEJ;AAAA,OACF;AAAA,IAIF,oBAAC,SAAI,WAAU,sBACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,mBAAmB,mCAAmC;AAAA,QACxD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QAEX;AAAA,8BAAC,WAAM,KAAK,UACV,+BAAC,QACE;AAAA,0BACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA,qBAAqB,cAAc,EAAE;AAAA,gBACvC,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBACX,OAAO,qBAAqB,cAAc,EAAE;AAAA,gBAC5C,gBAAa;AAAA,gBAEb;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,eAAe;AAAA,oBACf,UAAU;AAAA,oBACV,cAAW;AAAA;AAAA,gBACb;AAAA;AAAA,YACF;AAAA,YAID,mBACG,eAAe,IAAI,CAAC,WAAW;AAC7B,oBAAM,SAAS,OAAO,OAAO,GAAG;AAChC,oBAAM,aAAa,OAAO,QAAQ;AAClC,oBAAM,cACJ,OAAO,SAAS,SAAS,6BAA6B,OAAO;AAC/D,oBAAM,aAAa,CAAC,CAAC,OAAO;AAC5B,oBAAM,oBAAoB,aAAa,QAAQ;AAC/C,oBAAM,gBAAgB,oBACjB,YAAa,YACd;AACJ,oBAAM,YAAY,OAAO,SAAS;AAClC,oBAAM,EAAE,OAAO,aAAa,WAAW,YAAY,IACjD,qBAAqB,MAAM;AAE7B,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,IAAI;AAAA,kBACJ;AAAA,kBACA;AAAA,kBACA,mBAAmB,CAAC,CAAC;AAAA,kBACrB;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,aAAa;AAAA,kBACb,aAAa,MAAM,WAAW,MAAM;AAAA;AAAA,gBAX/B;AAAA,cAYP;AAAA,YAEJ,CAAC,IACD,eAAe,IAAI,CAAC,QAAQ,UAAU;AACpC,oBAAM,SAAS,OAAO,OAAO,GAAG;AAChC,oBAAM,aAAa,OAAO,QAAQ;AAClC,oBAAM,cACJ,OAAO,SAAS,SAAS,6BAA6B,OAAO;AAC/D,oBAAM,aAAa,OAAO;AAC1B,oBAAM,oBAAoB,aAAa,QAAQ;AAC/C,oBAAM,gBAAgB,oBAAoB,YAAa,YAAY;AACnE,oBAAM,YAAY,OAAO,SAAS;AAClC,oBAAM,iBAAiB,qBAAqB,SAAS;AACrD,oBAAM,EAAE,OAAO,aAAa,WAAW,YAAY,IACjD,qBAAqB,MAAM;AAE7B,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,WAAW;AAAA,oBACT;AAAA,oBACA,2BAA2B,UAAU;AAAA,oBACrC,aAAa,yBAAyB;AAAA,oBACtC,oBAAoB,uBAAuB;AAAA,oBAC3C;AAAA,oBACA;AAAA,kBACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,kBACX,OAAO,EAAE,OAAO,aAAa,GAAG,YAAY;AAAA,kBAC5C,gBAAc;AAAA,kBACd,SAAS,MAAM,cAAc,WAAW,MAAM;AAAA,kBAE9C,+BAAC,SAAI,WAAW,8BAA8B,cAAc,IAC1D;AAAA,wCAAC,UAAM,iBAAO,OAAM;AAAA,oBACnB,cACC,qBAAC,SAAI,WAAU,8BACZ;AAAA,wCAAkB,SAAS,oBAAC,WAAQ,MAAM,IAAI;AAAA,sBAC9C,kBAAkB,UAAU,oBAAC,aAAU,MAAM,IAAI;AAAA,sBACjD,CAAC,iBAAiB,oBAAC,kBAAe,MAAM,IAAI;AAAA,uBAC/C;AAAA,qBAEJ;AAAA;AAAA,gBAxBK;AAAA,cAyBP;AAAA,YAEJ,CAAC;AAAA,aACP,GACF;AAAA,UACA,oBAAC,WACE,sBAAY,SAAS,IACpB,YAAY,IAAI,CAAC,MAAM,aAAa;AAClC,kBAAM,cAAc,kBACf,cAAc,KAAK,kBAAkB,WACtC;AACJ,kBAAM,MAAM,UAAU,MAAM,WAAW;AACvC,kBAAM,aAAa,YAAY,IAAI,GAAG;AAEtC,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAW;AAAA,kBACT;AAAA,kBACA,aAAa,0BAA0B;AAAA,kBACvC,aAAa,8BAA8B;AAAA,gBAC7C,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBACX,SAAS,MAAM,aAAa,IAAI;AAAA,gBAE/B;AAAA,gCACC;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAW;AAAA,wBACT;AAAA,wBACA;AAAA,wBACA,mBAAmB,cAAc,EAAE;AAAA,sBACrC,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,sBACX,OAAO,mBAAmB,cAAc,EAAE;AAAA,sBAC1C,SAAS,CAAC,MAAM;AACd,0BAAE,gBAAgB;AAClB,kCAAU,GAAG;AAAA,sBACf;AAAA,sBAMA,8BAAC,UAAK,SAAS,CAAC,MAAM,EAAE,gBAAgB,GACtC;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS;AAAA,0BACT,UAAU,MAAM,UAAU,GAAG;AAAA,0BAC7B,cAAY,cAAc,cAAc,CAAC;AAAA;AAAA,sBAC3C,GACF;AAAA;AAAA,kBACF;AAAA,kBAED,eAAe,IAAI,CAAC,QAAQ,aAAa;AACxC,0BAAM,SAAS,OAAO,OAAO,GAAG;AAChC,0BAAM,QACJ,OAAO,OAAO,QAAQ,YAAY,OAAO,IAAI,SAAS,GAAG,IACpD,OAAO,IACL,MAAM,GAAG,EACT;AAAA,sBACC,CAAC,KAAc,MAAe,MAAkC,CAAC;AAAA,sBACjE;AAAA,oBACF,IACF,KAAK,OAAO,GAAc;AAEhC,0BAAM,aAAa,OAAO,QAAQ;AAClC,0BAAM,cACJ,OAAO,SAAS,SAAS,6BAA6B,OAAO;AAC/D,0BAAM,YAAY,OAAO,SAAS;AAClC,0BAAM,iBAAiB,qBAAqB,SAAS;AACrD,0BAAM,EAAE,OAAO,aAAa,WAAW,YAAY,IACjD,mBAAmB,MAAM;AAE3B,2BACE;AAAA,sBAAC;AAAA;AAAA,wBAEC,WAAW;AAAA,0BACT;AAAA,0BACA,oBAAoB,UAAU;AAAA,0BAC9B;AAAA,0BACA;AAAA,wBACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,wBACX,OAAO,EAAE,OAAO,aAAa,GAAG,YAAY;AAAA,wBAS5C,SAAS,eAAe,WAAW,CAAC,MAAM,EAAE,gBAAgB,IAAI;AAAA,wBAE/D,iBAAO,SAAS,OAAO,OAAO,OAAO,IAAI,IAAI,OAAO,SAAS,EAAE;AAAA;AAAA,sBApB3D;AAAA,oBAqBP;AAAA,kBAEJ,CAAC;AAAA;AAAA;AAAA,cApFI;AAAA,YAqFP;AAAA,UAEJ,CAAC,IAED,oBAAC,QAAG,WAAU,yBACZ;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,aAAa,eAAe,SAAS,IAAI,eAAe;AAAA,cACjE,WAAU;AAAA,cAET,iBAAO,KAAK,OAAO,EAAE,SAAS,IAC7B;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM,oBAAC,WAAQ;AAAA,kBACf,OAAM;AAAA,kBACN,aAAY;AAAA,kBACZ,QACE,kBACE;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,OAAM;AAAA,sBACN,SAAS,MAAM,gBAAgB,CAAC,CAAC;AAAA,sBAClC;AAAA;AAAA,kBAED,IACE;AAAA,kBAEN,MAAK;AAAA;AAAA,cACP,IAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM,oBAAC,cAAW;AAAA,kBAClB,OAAO;AAAA,kBACP,aAAY;AAAA,kBACZ,MAAK;AAAA;AAAA,cACP;AAAA;AAAA,UAEJ,GACF,GAEJ;AAAA;AAAA;AAAA,IACF,GACF;AAAA,IAGC,cACC,oBAAC,SAAI,WAAU,sBACb,8BAAC,SAAI,WAAU,8BACZ,4BAAkB,KAAK,SAAS,IAC/B;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN;AAAA,QACA,UAAU;AAAA,QACV,YAAY,cAAc,KAAK;AAAA,QAC/B,UAAU;AAAA,QACV,kBAAkB;AAAA,QAClB;AAAA,QACA,MAAK;AAAA;AAAA,IACP,IAEA,qBAAC,UAAK,WAAU,4BAA2B;AAAA;AAAA,MAChC,KAAK;AAAA,MAAO;AAAA,MAAK,cAAc,KAAK;AAAA,MAAO;AAAA,OACtD,GAEJ,GACF;AAAA,KAEJ;AAIF,MAAI,kBAAkB;AACpB,WACE,oBAAC,cAAW,SAAkB,WAAW,eACvC,8BAAC,mBAAgB,OAAO,eAAe,UAAU,+BAC9C,wBACH,GACF;AAAA,EAEJ;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunkTBMVUI7Scjs = require('./chunk-TBMVUI7S.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkR5QPUQSIcjs = require('./chunk-R5QPUQSI.cjs');
|
|
7
|
+
|
|
8
|
+
// src/components/Chip/Chip.component.tsx
|
|
9
|
+
var _lucidereact = require('lucide-react');
|
|
10
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
11
|
+
var Chip = ({
|
|
12
|
+
variant = "filled",
|
|
13
|
+
color = "primary",
|
|
14
|
+
size = "md",
|
|
15
|
+
disabled = false,
|
|
16
|
+
fullWidth = false,
|
|
17
|
+
tooltip,
|
|
18
|
+
className = "",
|
|
19
|
+
preIcon,
|
|
20
|
+
posIcon,
|
|
21
|
+
children,
|
|
22
|
+
onClick,
|
|
23
|
+
onRemove,
|
|
24
|
+
...chipProps
|
|
25
|
+
}) => {
|
|
26
|
+
const isClickable = !!onClick;
|
|
27
|
+
const isRemovable = !!onRemove;
|
|
28
|
+
const chipClasses = [
|
|
29
|
+
"eidos-chip",
|
|
30
|
+
`eidos-chip--${variant}`,
|
|
31
|
+
`eidos-chip--${color}`,
|
|
32
|
+
`eidos-chip--${size}`,
|
|
33
|
+
disabled && "eidos-chip--disabled",
|
|
34
|
+
isClickable && "eidos-chip--clickable",
|
|
35
|
+
isRemovable && "eidos-chip--removable",
|
|
36
|
+
fullWidth && "eidos-chip--full-width",
|
|
37
|
+
className
|
|
38
|
+
].filter(Boolean).join(" ");
|
|
39
|
+
const handleClick = () => {
|
|
40
|
+
if (disabled || !onClick) return;
|
|
41
|
+
onClick();
|
|
42
|
+
};
|
|
43
|
+
const handleRemove = (e) => {
|
|
44
|
+
e.stopPropagation();
|
|
45
|
+
if (disabled || !onRemove) return;
|
|
46
|
+
onRemove();
|
|
47
|
+
};
|
|
48
|
+
const ChipElement = isClickable && !isRemovable ? "button" : "div";
|
|
49
|
+
const chipContent = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
50
|
+
ChipElement,
|
|
51
|
+
{
|
|
52
|
+
className: chipClasses,
|
|
53
|
+
disabled: ChipElement === "button" ? disabled : void 0,
|
|
54
|
+
onClick: isClickable ? handleClick : void 0,
|
|
55
|
+
role: ChipElement === "div" && isClickable ? "button" : void 0,
|
|
56
|
+
tabIndex: ChipElement === "div" && isClickable ? 0 : void 0,
|
|
57
|
+
onKeyDown: ChipElement === "div" && isClickable ? (e) => {
|
|
58
|
+
if ((e.key === "Enter" || e.key === " ") && !disabled) {
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
handleClick();
|
|
61
|
+
}
|
|
62
|
+
} : void 0,
|
|
63
|
+
...chipProps,
|
|
64
|
+
children: [
|
|
65
|
+
preIcon && _chunkTBMVUI7Scjs.renderIcon.call(void 0, preIcon, "eidos-chip--pre-icon"),
|
|
66
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-chip--copy", children }),
|
|
67
|
+
posIcon && _chunkTBMVUI7Scjs.renderIcon.call(void 0, posIcon, "eidos-chip--pos-icon"),
|
|
68
|
+
isRemovable && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
69
|
+
"button",
|
|
70
|
+
{
|
|
71
|
+
className: "eidos-chip--remove-button",
|
|
72
|
+
onClick: handleRemove,
|
|
73
|
+
disabled,
|
|
74
|
+
"aria-label": "Remove",
|
|
75
|
+
type: "button",
|
|
76
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.X, { className: "eidos-chip--remove-icon" })
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
return tooltip ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5QPUQSIcjs.Tooltip, { message: tooltip, children: chipContent }) : chipContent;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
exports.Chip = Chip;
|
|
88
|
+
//# sourceMappingURL=chunk-O5ZPSZNY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-O5ZPSZNY.cjs","../src/components/Chip/Chip.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACNA,2CAAkB;AAqDd,+CAAA;AAhDG,IAAM,KAAA,EAA4B,CAAC;AAAA,EACxC,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,KAAA;AAAA,EACX,UAAA,EAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EACA,UAAA,EAAY,EAAA;AAAA,EACZ,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,YAAA,EAAc,CAAC,CAAC,OAAA;AACtB,EAAA,MAAM,YAAA,EAAc,CAAC,CAAC,QAAA;AAGtB,EAAA,MAAM,YAAA,EAAc;AAAA,IAClB,YAAA;AAAA,IACA,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA;AACF,IAAA;AACD,IAAA;AACP,IAAA;AACG,IAAA;AACA,IAAA;AACF,IAAA;AACb,IAAA;AAGM,EAAA;AAEY,EAAA;AACD,IAAA;AACT,IAAA;AACV,EAAA;AAEsB,EAAA;AACF,IAAA;AACD,IAAA;AACR,IAAA;AACX,EAAA;AAGoB,EAAA;AAGlB,EAAA;AAAC,IAAA;AAAA,IAAA;AACY,MAAA;AACD,MAAA;AACD,MAAA;AACH,MAAA;AACI,MAAA;AAER,MAAA;AAEqB,QAAA;AACI,UAAA;AACL,UAAA;AACd,QAAA;AAEF,MAAA;AAEF,MAAA;AAEH,MAAA;AAAW,QAAA;AAEZ,wBAAA;AAEY,QAAA;AAGV,QAAA;AAAC,UAAA;AAAA,UAAA;AACW,YAAA;AACD,YAAA;AACT,YAAA;AACW,YAAA;AACN,YAAA;AAEL,YAAA;AAAuC,UAAA;AACzC,QAAA;AAAA,MAAA;AAAA,IAAA;AAEJ,EAAA;AAGe,EAAA;AACnB;ADV2B;AACA;AACA;AACA","file":"/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-O5ZPSZNY.cjs","sourcesContent":[null,"import React from 'react';\r\nimport { X } from 'lucide-react';\r\nimport type { ChipProps } from './Chip.types';\r\nimport { Tooltip } from '../Tooltip/Tooltip.component';\r\nimport { renderIcon } from '../../utils';\r\n\r\nexport const Chip: React.FC<ChipProps> = ({\r\n variant = 'filled',\r\n color = 'primary',\r\n size = 'md',\r\n disabled = false,\r\n fullWidth = false,\r\n tooltip,\r\n className = '',\r\n preIcon,\r\n posIcon,\r\n children,\r\n onClick,\r\n onRemove,\r\n ...chipProps\r\n}) => {\r\n const isClickable = !!onClick;\r\n const isRemovable = !!onRemove;\r\n\r\n // Build CSS classes\r\n const chipClasses = [\r\n 'eidos-chip',\r\n `eidos-chip--${variant}`,\r\n `eidos-chip--${color}`,\r\n `eidos-chip--${size}`,\r\n disabled && 'eidos-chip--disabled',\r\n isClickable && 'eidos-chip--clickable',\r\n isRemovable && 'eidos-chip--removable',\r\n fullWidth && 'eidos-chip--full-width',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const handleClick = () => {\r\n if (disabled || !onClick) return;\r\n onClick();\r\n };\r\n\r\n const handleRemove = (e: React.MouseEvent) => {\r\n e.stopPropagation(); // Prevent chip click when removing\r\n if (disabled || !onRemove) return;\r\n onRemove();\r\n };\r\n\r\n // Use div when removable to avoid nested buttons, button only when clickable without remove\r\n const ChipElement = isClickable && !isRemovable ? 'button' : 'div';\r\n\r\n const chipContent = (\r\n <ChipElement\r\n className={chipClasses}\r\n disabled={ChipElement === 'button' ? disabled : undefined}\r\n onClick={isClickable ? handleClick : undefined}\r\n role={ChipElement === 'div' && isClickable ? 'button' : undefined}\r\n tabIndex={ChipElement === 'div' && isClickable ? 0 : undefined}\r\n onKeyDown={\r\n ChipElement === 'div' && isClickable\r\n ? (e) => {\r\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\r\n e.preventDefault();\r\n handleClick();\r\n }\r\n }\r\n : undefined\r\n }\r\n {...chipProps}\r\n >\r\n {preIcon && renderIcon(preIcon, 'eidos-chip--pre-icon')}\r\n\r\n <span className=\"eidos-chip--copy\">{children}</span>\r\n\r\n {posIcon && renderIcon(posIcon, 'eidos-chip--pos-icon')}\r\n\r\n {isRemovable && (\r\n <button\r\n className=\"eidos-chip--remove-button\"\r\n onClick={handleRemove}\r\n disabled={disabled}\r\n aria-label=\"Remove\"\r\n type=\"button\"\r\n >\r\n <X className=\"eidos-chip--remove-icon\" />\r\n </button>\r\n )}\r\n </ChipElement>\r\n );\r\n\r\n return tooltip ? <Tooltip message={tooltip}>{chipContent}</Tooltip> : chipContent;\r\n};\r\n"]}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Dropdown
|
|
3
|
+
} from "./chunk-SXF3TCYA.js";
|
|
4
|
+
import {
|
|
5
|
+
Kbd
|
|
6
|
+
} from "./chunk-73EKJU4G.js";
|
|
7
|
+
import {
|
|
8
|
+
renderIcon
|
|
9
|
+
} from "./chunk-XSGUFMT4.js";
|
|
10
|
+
import {
|
|
11
|
+
Tooltip
|
|
12
|
+
} from "./chunk-H523JFY2.js";
|
|
13
|
+
|
|
14
|
+
// src/components/Menu/Menu.component.tsx
|
|
15
|
+
import { useCallback } from "react";
|
|
16
|
+
import { ChevronRight } from "lucide-react";
|
|
17
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
18
|
+
var MenuPanel = ({ items, className = "", onItemClick }) => {
|
|
19
|
+
const handleItemClick = useCallback(
|
|
20
|
+
(item) => {
|
|
21
|
+
if (item.disabled) return;
|
|
22
|
+
if (item.onClick) {
|
|
23
|
+
item.onClick();
|
|
24
|
+
}
|
|
25
|
+
if (onItemClick) {
|
|
26
|
+
onItemClick(item);
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
[onItemClick]
|
|
30
|
+
);
|
|
31
|
+
const renderMenuItem = (item) => {
|
|
32
|
+
switch (item.type) {
|
|
33
|
+
case "item":
|
|
34
|
+
return /* @__PURE__ */ jsxs(
|
|
35
|
+
"li",
|
|
36
|
+
{
|
|
37
|
+
className: [
|
|
38
|
+
"eidos-menu-item",
|
|
39
|
+
item.disabled ? "eidos-menu-item--disabled" : "",
|
|
40
|
+
item.color ? `eidos-menu-item--${item.color}` : ""
|
|
41
|
+
].filter(Boolean).join(" "),
|
|
42
|
+
onClick: () => handleItemClick(item),
|
|
43
|
+
children: [
|
|
44
|
+
item.icon && renderIcon(item.icon, "eidos-menu-icon"),
|
|
45
|
+
/* @__PURE__ */ jsx("span", { className: `eidos-menu-label`, children: item.label }),
|
|
46
|
+
item.shortcut && /* @__PURE__ */ jsx(Kbd, { size: "sm", className: "eidos-menu-shortcut", children: item.shortcut })
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
item.id
|
|
50
|
+
);
|
|
51
|
+
case "component":
|
|
52
|
+
return /* @__PURE__ */ jsx("li", { className: `eidos-menu-component-item`, children: item.component }, item.id);
|
|
53
|
+
case "separator":
|
|
54
|
+
return /* @__PURE__ */ jsx("li", { className: `eidos-menu-separator` }, item.id);
|
|
55
|
+
case "nested": {
|
|
56
|
+
const triggerElement = /* @__PURE__ */ jsxs("div", { className: `eidos-menu-nested-trigger`, children: [
|
|
57
|
+
item.icon && renderIcon(item.icon, "eidos-menu-icon"),
|
|
58
|
+
/* @__PURE__ */ jsx("span", { className: `eidos-menu-label`, children: item.label }),
|
|
59
|
+
/* @__PURE__ */ jsx(ChevronRight, { className: `eidos-menu-nested-arrow` })
|
|
60
|
+
] });
|
|
61
|
+
return /* @__PURE__ */ jsx("li", { className: `eidos-menu-nested-item`, children: /* @__PURE__ */ jsx(
|
|
62
|
+
Dropdown,
|
|
63
|
+
{
|
|
64
|
+
trigger: triggerElement,
|
|
65
|
+
content: /* @__PURE__ */ jsx(MenuPanel, { items: item.items, onItemClick }),
|
|
66
|
+
placement: "right",
|
|
67
|
+
isNested: true,
|
|
68
|
+
fullWidth: true
|
|
69
|
+
}
|
|
70
|
+
) }, item.id);
|
|
71
|
+
}
|
|
72
|
+
default:
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
return /* @__PURE__ */ jsx("ul", { className: `eidos-menu ${className}`, children: items.map(renderMenuItem) });
|
|
77
|
+
};
|
|
78
|
+
var Menu = ({
|
|
79
|
+
trigger,
|
|
80
|
+
items,
|
|
81
|
+
minWidth,
|
|
82
|
+
maxWidth,
|
|
83
|
+
minHeight,
|
|
84
|
+
maxHeight,
|
|
85
|
+
autoWidth = true,
|
|
86
|
+
triggerRef,
|
|
87
|
+
closeOnItemClick = true,
|
|
88
|
+
tooltip
|
|
89
|
+
}) => {
|
|
90
|
+
const handleItemClick = useCallback(
|
|
91
|
+
(_item) => {
|
|
92
|
+
if (closeOnItemClick) {
|
|
93
|
+
setTimeout(() => {
|
|
94
|
+
const event = new MouseEvent("mousedown", {
|
|
95
|
+
bubbles: true,
|
|
96
|
+
cancelable: true,
|
|
97
|
+
view: window
|
|
98
|
+
});
|
|
99
|
+
document.dispatchEvent(event);
|
|
100
|
+
}, 10);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
[closeOnItemClick]
|
|
104
|
+
);
|
|
105
|
+
const dropdown = /* @__PURE__ */ jsx(
|
|
106
|
+
Dropdown,
|
|
107
|
+
{
|
|
108
|
+
trigger,
|
|
109
|
+
content: /* @__PURE__ */ jsx(MenuPanel, { items, onItemClick: handleItemClick }),
|
|
110
|
+
minWidth,
|
|
111
|
+
maxWidth,
|
|
112
|
+
minHeight,
|
|
113
|
+
maxHeight,
|
|
114
|
+
autoWidth,
|
|
115
|
+
triggerRef
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
return tooltip ? /* @__PURE__ */ jsx(Tooltip, { message: tooltip, children: dropdown }) : dropdown;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export {
|
|
122
|
+
MenuPanel,
|
|
123
|
+
Menu
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=chunk-O6B4KB4D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Menu/Menu.component.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\r\nimport { ChevronRight } from 'lucide-react';\r\nimport type { MenuProps, MenuItemType, MenuItem, MenuWrapperProps } from './Menu.types';\r\nimport { Dropdown } from '../Dropdown/Dropdown.component';\r\nimport { Tooltip } from '../Tooltip/Tooltip.component';\r\nimport { Kbd } from '../Kbd/Kbd.component';\r\nimport { renderIcon } from '../../utils';\r\n\r\n/**\r\n * MenuPanel - the bare menu list, without any trigger or dropdown wrapper.\r\n * Exported for use in SplitButton, ContextMenu, and other consumers that need\r\n * to render the menu content inside their own Dropdown / portal.\r\n */\r\nexport const MenuPanel: React.FC<MenuProps> = ({ items, className = '', onItemClick }) => {\r\n // Handle menu item click\r\n const handleItemClick = useCallback(\r\n (item: MenuItem) => {\r\n if (item.disabled) return;\r\n\r\n // Execute the item's onClick handler first\r\n if (item.onClick) {\r\n item.onClick();\r\n }\r\n\r\n // Then call the onItemClick callback (which will close the dropdown)\r\n if (onItemClick) {\r\n onItemClick(item);\r\n }\r\n },\r\n [onItemClick],\r\n );\r\n\r\n // Render individual menu item\r\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\r\n switch (item.type) {\r\n case 'item':\r\n return (\r\n <li\r\n key={item.id}\r\n className={[\r\n 'eidos-menu-item',\r\n item.disabled ? 'eidos-menu-item--disabled' : '',\r\n item.color ? `eidos-menu-item--${item.color}` : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n onClick={() => handleItemClick(item)}\r\n >\r\n {item.icon && renderIcon(item.icon, 'eidos-menu-icon')}\r\n <span className={`eidos-menu-label`}>{item.label}</span>\r\n {item.shortcut && (\r\n <Kbd size=\"sm\" className=\"eidos-menu-shortcut\">\r\n {item.shortcut}\r\n </Kbd>\r\n )}\r\n </li>\r\n );\r\n\r\n case 'component':\r\n return (\r\n <li key={item.id} className={`eidos-menu-component-item`}>\r\n {item.component}\r\n </li>\r\n );\r\n\r\n case 'separator':\r\n return <li key={item.id} className={`eidos-menu-separator`} />;\r\n\r\n case 'nested': {\r\n const triggerElement = (\r\n <div className={`eidos-menu-nested-trigger`}>\r\n {item.icon && renderIcon(item.icon, 'eidos-menu-icon')}\r\n <span className={`eidos-menu-label`}>{item.label}</span>\r\n <ChevronRight className={`eidos-menu-nested-arrow`} />\r\n </div>\r\n );\r\n\r\n return (\r\n <li key={item.id} className={`eidos-menu-nested-item`}>\r\n <Dropdown\r\n trigger={triggerElement}\r\n content={<MenuPanel items={item.items} onItemClick={onItemClick} />}\r\n placement=\"right\"\r\n isNested={true}\r\n fullWidth\r\n />\r\n </li>\r\n );\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return <ul className={`eidos-menu ${className}`}>{items.map(renderMenuItem)}</ul>;\r\n};\r\n\r\nexport const Menu: React.FC<MenuWrapperProps> = ({\r\n trigger,\r\n items,\r\n minWidth,\r\n maxWidth,\r\n minHeight,\r\n maxHeight,\r\n autoWidth = true,\r\n triggerRef,\r\n closeOnItemClick = true,\r\n tooltip,\r\n}) => {\r\n const handleItemClick = useCallback(\r\n (_item: MenuItem) => {\r\n // Note: item.onClick is already called in MenuPanel's handleItemClick\r\n // Here we only handle closing the dropdown if needed\r\n\r\n if (closeOnItemClick) {\r\n // Use a small delay to ensure the onClick handler completes\r\n setTimeout(() => {\r\n // Create a synthetic click event outside the dropdown to close it\r\n const event = new MouseEvent('mousedown', {\r\n bubbles: true,\r\n cancelable: true,\r\n view: window,\r\n });\r\n document.dispatchEvent(event);\r\n }, 10);\r\n }\r\n },\r\n [closeOnItemClick],\r\n );\r\n\r\n const dropdown = (\r\n <Dropdown\r\n trigger={trigger}\r\n content={<MenuPanel items={items} onItemClick={handleItemClick} />}\r\n minWidth={minWidth}\r\n maxWidth={maxWidth}\r\n minHeight={minHeight}\r\n maxHeight={maxHeight}\r\n autoWidth={autoWidth}\r\n triggerRef={triggerRef}\r\n />\r\n );\r\n\r\n return tooltip ? <Tooltip message={tooltip}>{dropdown}</Tooltip> : dropdown;\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAgB,mBAAmB;AACnC,SAAS,oBAAoB;AAoCnB,SAYE,KAZF;AAxBH,IAAM,YAAiC,CAAC,EAAE,OAAO,YAAY,IAAI,YAAY,MAAM;AAExF,QAAM,kBAAkB;AAAA,IACtB,CAAC,SAAmB;AAClB,UAAI,KAAK,SAAU;AAGnB,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ;AAAA,MACf;AAGA,UAAI,aAAa;AACf,oBAAY,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,iBAAiB,CAAC,SAAwC;AAC9D,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW;AAAA,cACT;AAAA,cACA,KAAK,WAAW,8BAA8B;AAAA,cAC9C,KAAK,QAAQ,oBAAoB,KAAK,KAAK,KAAK;AAAA,YAClD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACX,SAAS,MAAM,gBAAgB,IAAI;AAAA,YAElC;AAAA,mBAAK,QAAQ,WAAW,KAAK,MAAM,iBAAiB;AAAA,cACrD,oBAAC,UAAK,WAAW,oBAAqB,eAAK,OAAM;AAAA,cAChD,KAAK,YACJ,oBAAC,OAAI,MAAK,MAAK,WAAU,uBACtB,eAAK,UACR;AAAA;AAAA;AAAA,UAfG,KAAK;AAAA,QAiBZ;AAAA,MAGJ,KAAK;AACH,eACE,oBAAC,QAAiB,WAAW,6BAC1B,eAAK,aADC,KAAK,EAEd;AAAA,MAGJ,KAAK;AACH,eAAO,oBAAC,QAAiB,WAAW,0BAApB,KAAK,EAAuC;AAAA,MAE9D,KAAK,UAAU;AACb,cAAM,iBACJ,qBAAC,SAAI,WAAW,6BACb;AAAA,eAAK,QAAQ,WAAW,KAAK,MAAM,iBAAiB;AAAA,UACrD,oBAAC,UAAK,WAAW,oBAAqB,eAAK,OAAM;AAAA,UACjD,oBAAC,gBAAa,WAAW,2BAA2B;AAAA,WACtD;AAGF,eACE,oBAAC,QAAiB,WAAW,0BAC3B;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,SAAS,oBAAC,aAAU,OAAO,KAAK,OAAO,aAA0B;AAAA,YACjE,WAAU;AAAA,YACV,UAAU;AAAA,YACV,WAAS;AAAA;AAAA,QACX,KAPO,KAAK,EAQd;AAAA,MAEJ;AAAA,MAEA;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,SAAO,oBAAC,QAAG,WAAW,cAAc,SAAS,IAAK,gBAAM,IAAI,cAAc,GAAE;AAC9E;AAEO,IAAM,OAAmC,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,mBAAmB;AAAA,EACnB;AACF,MAAM;AACJ,QAAM,kBAAkB;AAAA,IACtB,CAAC,UAAoB;AAInB,UAAI,kBAAkB;AAEpB,mBAAW,MAAM;AAEf,gBAAM,QAAQ,IAAI,WAAW,aAAa;AAAA,YACxC,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,MAAM;AAAA,UACR,CAAC;AACD,mBAAS,cAAc,KAAK;AAAA,QAC9B,GAAG,EAAE;AAAA,MACP;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,WACJ;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,SAAS,oBAAC,aAAU,OAAc,aAAa,iBAAiB;AAAA,MAChE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAGF,SAAO,UAAU,oBAAC,WAAQ,SAAS,SAAU,oBAAS,IAAa;AACrE;","names":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// src/components/Slider/Slider.component.tsx
|
|
2
|
+
import { forwardRef, useState } from "react";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
var Slider = forwardRef(
|
|
5
|
+
({
|
|
6
|
+
value,
|
|
7
|
+
defaultValue,
|
|
8
|
+
min,
|
|
9
|
+
max,
|
|
10
|
+
step,
|
|
11
|
+
onChange,
|
|
12
|
+
color = "primary",
|
|
13
|
+
size = "md",
|
|
14
|
+
disabled = false,
|
|
15
|
+
showValue = false,
|
|
16
|
+
showMinMax = false,
|
|
17
|
+
label,
|
|
18
|
+
unit,
|
|
19
|
+
blockedRange,
|
|
20
|
+
className = ""
|
|
21
|
+
}, ref) => {
|
|
22
|
+
const minVal = min ?? 0;
|
|
23
|
+
const maxVal = max ?? 100;
|
|
24
|
+
const clamp = (v) => blockedRange && v > blockedRange.min ? blockedRange.min : v;
|
|
25
|
+
const isControlled = value !== void 0;
|
|
26
|
+
const [localValue, setLocalValue] = useState(clamp(defaultValue ?? minVal));
|
|
27
|
+
const currentValue = isControlled ? clamp(value) : localValue;
|
|
28
|
+
const fillPct = (currentValue - minVal) / (maxVal - minVal) * 100;
|
|
29
|
+
const blockedStartPct = blockedRange ? (blockedRange.min - minVal) / (maxVal - minVal) * 100 : null;
|
|
30
|
+
const sliderStyle = {
|
|
31
|
+
"--s-fill": `${fillPct}%`,
|
|
32
|
+
"--s-color": `var(--${color}-color)`,
|
|
33
|
+
"--s-empty": "var(--gray-200)",
|
|
34
|
+
...blockedStartPct !== null && { "--s-block": `${blockedStartPct}%` }
|
|
35
|
+
};
|
|
36
|
+
const handleChange = (e) => {
|
|
37
|
+
const newValue = clamp(Number(e.target.value));
|
|
38
|
+
if (!isControlled) setLocalValue(newValue);
|
|
39
|
+
onChange?.(newValue);
|
|
40
|
+
};
|
|
41
|
+
const effectiveMax = blockedRange ? blockedRange.min : maxVal;
|
|
42
|
+
const fmt = (v) => `${v}${unit ?? ""}`;
|
|
43
|
+
const rootClasses = [
|
|
44
|
+
"eidos-slider",
|
|
45
|
+
`eidos-slider--${color}`,
|
|
46
|
+
`eidos-slider--${size}`,
|
|
47
|
+
disabled && "eidos-slider--disabled",
|
|
48
|
+
className
|
|
49
|
+
].filter(Boolean).join(" ");
|
|
50
|
+
return /* @__PURE__ */ jsxs("div", { className: rootClasses, children: [
|
|
51
|
+
(label || showValue) && /* @__PURE__ */ jsxs("div", { className: "eidos-slider-top", children: [
|
|
52
|
+
label && /* @__PURE__ */ jsx("span", { className: "eidos-slider-label", children: label }),
|
|
53
|
+
showValue && /* @__PURE__ */ jsx("span", { className: "eidos-slider-value", children: fmt(currentValue) })
|
|
54
|
+
] }),
|
|
55
|
+
/* @__PURE__ */ jsx(
|
|
56
|
+
"input",
|
|
57
|
+
{
|
|
58
|
+
ref,
|
|
59
|
+
type: "range",
|
|
60
|
+
className: "eidos-slider-input",
|
|
61
|
+
min: minVal,
|
|
62
|
+
max: maxVal,
|
|
63
|
+
step: step ?? 1,
|
|
64
|
+
value: currentValue,
|
|
65
|
+
disabled,
|
|
66
|
+
onChange: handleChange,
|
|
67
|
+
"aria-label": label ?? "Slider",
|
|
68
|
+
"aria-valuemin": minVal,
|
|
69
|
+
"aria-valuemax": effectiveMax,
|
|
70
|
+
"aria-valuenow": currentValue,
|
|
71
|
+
style: sliderStyle
|
|
72
|
+
}
|
|
73
|
+
),
|
|
74
|
+
showMinMax && /* @__PURE__ */ jsxs("div", { className: "eidos-slider-minmax", children: [
|
|
75
|
+
/* @__PURE__ */ jsx("span", { children: fmt(minVal) }),
|
|
76
|
+
/* @__PURE__ */ jsx("span", { children: fmt(maxVal) })
|
|
77
|
+
] })
|
|
78
|
+
] });
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
Slider.displayName = "Slider";
|
|
82
|
+
|
|
83
|
+
export {
|
|
84
|
+
Slider
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=chunk-OHUVWPFJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Slider/Slider.component.tsx"],"sourcesContent":["import React, { forwardRef, useState } from 'react';\r\nimport type { SliderProps } from './Slider.types';\r\n\r\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(\r\n (\r\n {\r\n value,\r\n defaultValue,\r\n min,\r\n max,\r\n step,\r\n onChange,\r\n color = 'primary',\r\n size = 'md',\r\n disabled = false,\r\n showValue = false,\r\n showMinMax = false,\r\n label,\r\n unit,\r\n blockedRange,\r\n className = '',\r\n },\r\n ref,\r\n ) => {\r\n const minVal = min ?? 0;\r\n const maxVal = max ?? 100;\r\n\r\n // Clamp a raw value against the blocked range boundary.\r\n const clamp = (v: number) => (blockedRange && v > blockedRange.min ? blockedRange.min : v);\r\n\r\n const isControlled = value !== undefined;\r\n const [localValue, setLocalValue] = useState<number>(clamp(defaultValue ?? minVal));\r\n const currentValue = isControlled ? clamp(value!) : localValue;\r\n\r\n const fillPct = ((currentValue - minVal) / (maxVal - minVal)) * 100;\r\n const blockedStartPct = blockedRange\r\n ? ((blockedRange.min - minVal) / (maxVal - minVal)) * 100\r\n : null;\r\n\r\n // CSS custom properties drive the track gradient via the\r\n // ::-webkit-slider-runnable-track pseudo-element in Slider.scss.\r\n // --s-block defaults to 100% so the danger segment collapses to zero\r\n // width when there is no blocked range.\r\n const sliderStyle: React.CSSProperties = {\r\n '--s-fill': `${fillPct}%`,\r\n '--s-color': `var(--${color}-color)`,\r\n '--s-empty': 'var(--gray-200)',\r\n ...(blockedStartPct !== null && { '--s-block': `${blockedStartPct}%` }),\r\n } as React.CSSProperties;\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const newValue = clamp(Number(e.target.value));\r\n if (!isControlled) setLocalValue(newValue);\r\n onChange?.(newValue);\r\n };\r\n\r\n // Effective max for ARIA - the blocked zone is not a valid value.\r\n const effectiveMax = blockedRange ? blockedRange.min : maxVal;\r\n\r\n const fmt = (v: number) => `${v}${unit ?? ''}`;\r\n\r\n const rootClasses = [\r\n 'eidos-slider',\r\n `eidos-slider--${color}`,\r\n `eidos-slider--${size}`,\r\n disabled && 'eidos-slider--disabled',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <div className={rootClasses}>\r\n {(label || showValue) && (\r\n <div className=\"eidos-slider-top\">\r\n {label && <span className=\"eidos-slider-label\">{label}</span>}\r\n {showValue && <span className=\"eidos-slider-value\">{fmt(currentValue)}</span>}\r\n </div>\r\n )}\r\n\r\n <input\r\n ref={ref}\r\n type=\"range\"\r\n className=\"eidos-slider-input\"\r\n min={minVal}\r\n max={maxVal}\r\n step={step ?? 1}\r\n value={currentValue}\r\n disabled={disabled}\r\n onChange={handleChange}\r\n aria-label={label ?? 'Slider'}\r\n aria-valuemin={minVal}\r\n aria-valuemax={effectiveMax}\r\n aria-valuenow={currentValue}\r\n style={sliderStyle}\r\n />\r\n\r\n {showMinMax && (\r\n <div className=\"eidos-slider-minmax\">\r\n <span>{fmt(minVal)}</span>\r\n <span>{fmt(maxVal)}</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nSlider.displayName = 'Slider';\r\n"],"mappings":";AAAA,SAAgB,YAAY,gBAAgB;AA0ElC,SACY,KADZ;AAvEH,IAAM,SAAS;AAAA,EACpB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd,GACA,QACG;AACH,UAAM,SAAS,OAAO;AACtB,UAAM,SAAS,OAAO;AAGtB,UAAM,QAAQ,CAAC,MAAe,gBAAgB,IAAI,aAAa,MAAM,aAAa,MAAM;AAExF,UAAM,eAAe,UAAU;AAC/B,UAAM,CAAC,YAAY,aAAa,IAAI,SAAiB,MAAM,gBAAgB,MAAM,CAAC;AAClF,UAAM,eAAe,eAAe,MAAM,KAAM,IAAI;AAEpD,UAAM,WAAY,eAAe,WAAW,SAAS,UAAW;AAChE,UAAM,kBAAkB,gBAClB,aAAa,MAAM,WAAW,SAAS,UAAW,MACpD;AAMJ,UAAM,cAAmC;AAAA,MACvC,YAAY,GAAG,OAAO;AAAA,MACtB,aAAa,SAAS,KAAK;AAAA,MAC3B,aAAa;AAAA,MACb,GAAI,oBAAoB,QAAQ,EAAE,aAAa,GAAG,eAAe,IAAI;AAAA,IACvE;AAEA,UAAM,eAAe,CAAC,MAA2C;AAC/D,YAAM,WAAW,MAAM,OAAO,EAAE,OAAO,KAAK,CAAC;AAC7C,UAAI,CAAC,aAAc,eAAc,QAAQ;AACzC,iBAAW,QAAQ;AAAA,IACrB;AAGA,UAAM,eAAe,eAAe,aAAa,MAAM;AAEvD,UAAM,MAAM,CAAC,MAAc,GAAG,CAAC,GAAG,QAAQ,EAAE;AAE5C,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,iBAAiB,KAAK;AAAA,MACtB,iBAAiB,IAAI;AAAA,MACrB,YAAY;AAAA,MACZ;AAAA,IACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WACE,qBAAC,SAAI,WAAW,aACZ;AAAA,gBAAS,cACT,qBAAC,SAAI,WAAU,oBACZ;AAAA,iBAAS,oBAAC,UAAK,WAAU,sBAAsB,iBAAM;AAAA,QACrD,aAAa,oBAAC,UAAK,WAAU,sBAAsB,cAAI,YAAY,GAAE;AAAA,SACxE;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,MAAK;AAAA,UACL,WAAU;AAAA,UACV,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM,QAAQ;AAAA,UACd,OAAO;AAAA,UACP;AAAA,UACA,UAAU;AAAA,UACV,cAAY,SAAS;AAAA,UACrB,iBAAe;AAAA,UACf,iBAAe;AAAA,UACf,iBAAe;AAAA,UACf,OAAO;AAAA;AAAA,MACT;AAAA,MAEC,cACC,qBAAC,SAAI,WAAU,uBACb;AAAA,4BAAC,UAAM,cAAI,MAAM,GAAE;AAAA,QACnB,oBAAC,UAAM,cAAI,MAAM,GAAE;AAAA,SACrB;AAAA,OAEJ;AAAA,EAEJ;AACF;AAEA,OAAO,cAAc;","names":[]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Button
|
|
3
|
+
} from "./chunk-FO5FNTJX.js";
|
|
4
|
+
import {
|
|
5
|
+
renderIcon
|
|
6
|
+
} from "./chunk-XSGUFMT4.js";
|
|
7
|
+
|
|
8
|
+
// src/components/Modal/Modal.component.tsx
|
|
9
|
+
import { useEffect, useCallback, useId, useState } from "react";
|
|
10
|
+
import { createPortal } from "react-dom";
|
|
11
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
+
var Modal = ({
|
|
13
|
+
isOpen,
|
|
14
|
+
onClose,
|
|
15
|
+
title,
|
|
16
|
+
icon,
|
|
17
|
+
type,
|
|
18
|
+
children,
|
|
19
|
+
actions = [],
|
|
20
|
+
closeOnBackdropClick = true,
|
|
21
|
+
closeOnEscape = true,
|
|
22
|
+
size = "md",
|
|
23
|
+
className = ""
|
|
24
|
+
}) => {
|
|
25
|
+
const titleId = useId();
|
|
26
|
+
const bodyId = useId();
|
|
27
|
+
const TRANSITION_MS = 200;
|
|
28
|
+
const [isMounted, setIsMounted] = useState(isOpen);
|
|
29
|
+
const [isVisible, setIsVisible] = useState(isOpen);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
let raf1 = 0;
|
|
32
|
+
let raf2 = 0;
|
|
33
|
+
let timerId;
|
|
34
|
+
if (isOpen) {
|
|
35
|
+
setIsMounted(true);
|
|
36
|
+
raf1 = requestAnimationFrame(() => {
|
|
37
|
+
raf2 = requestAnimationFrame(() => setIsVisible(true));
|
|
38
|
+
});
|
|
39
|
+
} else {
|
|
40
|
+
setIsVisible(false);
|
|
41
|
+
timerId = setTimeout(() => setIsMounted(false), TRANSITION_MS);
|
|
42
|
+
}
|
|
43
|
+
return () => {
|
|
44
|
+
cancelAnimationFrame(raf1);
|
|
45
|
+
cancelAnimationFrame(raf2);
|
|
46
|
+
clearTimeout(timerId);
|
|
47
|
+
};
|
|
48
|
+
}, [isOpen]);
|
|
49
|
+
const handleEscapeKey = useCallback(
|
|
50
|
+
(event) => {
|
|
51
|
+
if (closeOnEscape && event.key === "Escape" && isOpen) {
|
|
52
|
+
onClose();
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
[closeOnEscape, isOpen, onClose]
|
|
56
|
+
);
|
|
57
|
+
const handleBackdropClick = useCallback(
|
|
58
|
+
(event) => {
|
|
59
|
+
if (closeOnBackdropClick && event.target === event.currentTarget) {
|
|
60
|
+
onClose();
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
[closeOnBackdropClick, onClose]
|
|
64
|
+
);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (isOpen) {
|
|
67
|
+
document.addEventListener("keydown", handleEscapeKey);
|
|
68
|
+
document.body.style.overflow = "hidden";
|
|
69
|
+
}
|
|
70
|
+
return () => {
|
|
71
|
+
document.removeEventListener("keydown", handleEscapeKey);
|
|
72
|
+
document.body.style.overflow = "";
|
|
73
|
+
};
|
|
74
|
+
}, [isOpen, handleEscapeKey]);
|
|
75
|
+
if (!isMounted) return null;
|
|
76
|
+
const modalContent = /* @__PURE__ */ jsxs("div", { className: `eidos-modal ${isVisible ? "eidos-modal--is-open" : ""} ${className}`, children: [
|
|
77
|
+
/* @__PURE__ */ jsx("div", { className: "eidos-modal-backdrop", onClick: handleBackdropClick, "aria-hidden": "true" }),
|
|
78
|
+
/* @__PURE__ */ jsxs(
|
|
79
|
+
"div",
|
|
80
|
+
{
|
|
81
|
+
role: "dialog",
|
|
82
|
+
"aria-modal": "true",
|
|
83
|
+
"aria-labelledby": title ? titleId : void 0,
|
|
84
|
+
"aria-describedby": bodyId,
|
|
85
|
+
className: `eidos-modal-content eidos-modal-content--${size}`,
|
|
86
|
+
children: [
|
|
87
|
+
title && /* @__PURE__ */ jsx("div", { className: `eidos-modal-header ${type ? `eidos-modal-header--${type}` : ""}`, children: /* @__PURE__ */ jsxs("h4", { id: titleId, children: [
|
|
88
|
+
icon && renderIcon(icon, "eidos-modal-icon"),
|
|
89
|
+
" ",
|
|
90
|
+
title
|
|
91
|
+
] }) }),
|
|
92
|
+
/* @__PURE__ */ jsx("div", { id: bodyId, className: "eidos-modal-body", children }),
|
|
93
|
+
actions.length > 0 && /* @__PURE__ */ jsx("div", { className: `eidos-modal-footer`, children: actions.map((action) => /* @__PURE__ */ jsx(
|
|
94
|
+
Button,
|
|
95
|
+
{
|
|
96
|
+
variant: action.variant || "outlined",
|
|
97
|
+
size: action.size || "md",
|
|
98
|
+
color: action.color,
|
|
99
|
+
disabled: action.disabled,
|
|
100
|
+
loading: action.loading,
|
|
101
|
+
onClick: action.onClick,
|
|
102
|
+
children: action.label
|
|
103
|
+
},
|
|
104
|
+
action.id
|
|
105
|
+
)) })
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
)
|
|
109
|
+
] });
|
|
110
|
+
return createPortal(modalContent, document.body);
|
|
111
|
+
};
|
|
112
|
+
Modal.displayName = "Modal";
|
|
113
|
+
|
|
114
|
+
export {
|
|
115
|
+
Modal
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=chunk-OT3VZLN4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Modal/Modal.component.tsx"],"sourcesContent":["import React, { useEffect, useCallback, useId, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { Button } from '../Button/Button.component';\r\nimport type { ModalProps } from './Modal.types';\r\nimport { renderIcon } from '../../utils';\r\n\r\nexport const Modal: React.FC<ModalProps> = ({\r\n isOpen,\r\n onClose,\r\n title,\r\n icon,\r\n type,\r\n children,\r\n actions = [],\r\n closeOnBackdropClick = true,\r\n closeOnEscape = true,\r\n size = 'md',\r\n className = '',\r\n}) => {\r\n const titleId = useId();\r\n const bodyId = useId();\r\n\r\n // ── Animation state ────────────────────────────────────────────────────────\r\n // isMounted: whether the portal DOM node exists at all.\r\n // isVisible: whether the '--is-open' CSS class is applied (drives the transition).\r\n //\r\n // On open: mount first → one rAF → apply --is-open (browser sees the\r\n // initial faded/scaled-down state before transitioning, so the\r\n // animation fires instead of just painting straight into \"open\").\r\n // On close: remove --is-open (CSS transition plays) → after 200 ms unmount.\r\n // 200 ms matches the CSS `transition: 0.2s` in Modal.scss.\r\n const TRANSITION_MS = 200;\r\n const [isMounted, setIsMounted] = useState(isOpen);\r\n const [isVisible, setIsVisible] = useState(isOpen);\r\n\r\n useEffect(() => {\r\n let raf1 = 0;\r\n let raf2 = 0;\r\n let timerId: ReturnType<typeof setTimeout>;\r\n\r\n if (isOpen) {\r\n setIsMounted(true);\r\n // Double rAF: React 18 automatic batching means setIsMounted(true) may\r\n // not produce a committed browser paint before the first rAF fires.\r\n // The second frame guarantees the modal is rendered in its closed\r\n // (faded/scaled-down) state before the CSS transition begins.\r\n raf1 = requestAnimationFrame(() => {\r\n raf2 = requestAnimationFrame(() => setIsVisible(true));\r\n });\r\n } else {\r\n setIsVisible(false);\r\n timerId = setTimeout(() => setIsMounted(false), TRANSITION_MS);\r\n }\r\n\r\n return () => {\r\n cancelAnimationFrame(raf1);\r\n cancelAnimationFrame(raf2);\r\n clearTimeout(timerId);\r\n };\r\n }, [isOpen]);\r\n\r\n // Handle escape key\r\n const handleEscapeKey = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (closeOnEscape && event.key === 'Escape' && isOpen) {\r\n onClose();\r\n }\r\n },\r\n [closeOnEscape, isOpen, onClose],\r\n );\r\n\r\n // Handle backdrop click\r\n const handleBackdropClick = useCallback(\r\n (event: React.MouseEvent) => {\r\n if (closeOnBackdropClick && event.target === event.currentTarget) {\r\n onClose();\r\n }\r\n },\r\n [closeOnBackdropClick, onClose],\r\n );\r\n\r\n // Add/remove escape key listener (tied to isOpen, not isMounted)\r\n useEffect(() => {\r\n if (isOpen) {\r\n document.addEventListener('keydown', handleEscapeKey);\r\n // Prevent body scroll when modal is open\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n return () => {\r\n document.removeEventListener('keydown', handleEscapeKey);\r\n document.body.style.overflow = '';\r\n };\r\n }, [isOpen, handleEscapeKey]);\r\n\r\n if (!isMounted) return null;\r\n\r\n const modalContent = (\r\n <div className={`eidos-modal ${isVisible ? 'eidos-modal--is-open' : ''} ${className}`}>\r\n <div className=\"eidos-modal-backdrop\" onClick={handleBackdropClick} aria-hidden=\"true\" />\r\n <div\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={title ? titleId : undefined}\r\n aria-describedby={bodyId}\r\n className={`eidos-modal-content eidos-modal-content--${size}`}\r\n >\r\n {title && (\r\n <div className={`eidos-modal-header ${type ? `eidos-modal-header--${type}` : ''}`}>\r\n <h4 id={titleId}>\r\n {icon && renderIcon(icon, 'eidos-modal-icon')} {title}\r\n </h4>\r\n </div>\r\n )}\r\n\r\n <div id={bodyId} className=\"eidos-modal-body\">\r\n {children}\r\n </div>\r\n\r\n {actions.length > 0 && (\r\n <div className={`eidos-modal-footer`}>\r\n {actions.map((action) => (\r\n <Button\r\n key={action.id}\r\n variant={action.variant || 'outlined'}\r\n size={action.size || 'md'}\r\n color={action.color}\r\n disabled={action.disabled}\r\n loading={action.loading}\r\n onClick={action.onClick}\r\n >\r\n {action.label}\r\n </Button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n\r\n return createPortal(modalContent, document.body);\r\n};\r\n\r\nModal.displayName = 'Modal';\r\n"],"mappings":"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","names":[]}
|