@mieweb/ui 0.2.2 → 0.3.0-dev.100
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/README.md +17 -0
- package/dist/ag-grid.cjs +37 -26
- package/dist/ag-grid.cjs.map +1 -1
- package/dist/ag-grid.js +33 -22
- package/dist/ag-grid.js.map +1 -1
- package/dist/brands/bluehive.cjs +3 -3
- package/dist/brands/bluehive.css +5 -5
- package/dist/brands/bluehive.js +1 -1
- package/dist/brands/index.cjs +29 -29
- package/dist/brands/index.js +8 -8
- package/dist/brands/mieweb.css +5 -5
- package/dist/brands/ozwell.cjs +2 -2
- package/dist/brands/ozwell.css +5 -5
- package/dist/brands/ozwell.js +1 -1
- package/dist/brands/types.cjs +4 -4
- package/dist/brands/types.d.cts +14 -8
- package/dist/brands/types.d.ts +14 -8
- package/dist/brands/types.js +1 -1
- package/dist/brands/waggleline.css +1 -1
- package/dist/brands/webchart.css +5 -5
- package/dist/{chunk-QDGZBDBI.cjs → chunk-2LF7PSSX.cjs} +3 -3
- package/dist/{chunk-QDGZBDBI.cjs.map → chunk-2LF7PSSX.cjs.map} +1 -1
- package/dist/{chunk-OWPWP46L.js → chunk-2NTYAALC.js} +3 -3
- package/dist/{chunk-OWPWP46L.js.map → chunk-2NTYAALC.js.map} +1 -1
- package/dist/{chunk-NAATBUHR.cjs → chunk-2VCAWAPC.cjs} +45 -20
- package/dist/chunk-2VCAWAPC.cjs.map +1 -0
- package/dist/{chunk-N3QTYHRZ.cjs → chunk-3GGET5LK.cjs} +40 -22
- package/dist/chunk-3GGET5LK.cjs.map +1 -0
- package/dist/{chunk-QL2YTVTR.js → chunk-43GBCUSQ.js} +8 -3
- package/dist/chunk-43GBCUSQ.js.map +1 -0
- package/dist/chunk-4DMZAVB2.js +334 -0
- package/dist/chunk-4DMZAVB2.js.map +1 -0
- package/dist/{chunk-EKIQE524.cjs → chunk-4FALCEJI.cjs} +3 -2
- package/dist/chunk-4FALCEJI.cjs.map +1 -0
- package/dist/chunk-4O3WJY4C.cjs +615 -0
- package/dist/chunk-4O3WJY4C.cjs.map +1 -0
- package/dist/{chunk-6OCIIIAI.js → chunk-4Z6ZZKIY.js} +40 -22
- package/dist/chunk-4Z6ZZKIY.js.map +1 -0
- package/dist/{chunk-QUA7WVHK.cjs → chunk-4ZU53GNR.cjs} +6 -14
- package/dist/{chunk-QUA7WVHK.cjs.map → chunk-4ZU53GNR.cjs.map} +1 -1
- package/dist/{chunk-S6UNPMAS.cjs → chunk-66S4PT6C.cjs} +3 -3
- package/dist/{chunk-S6UNPMAS.cjs.map → chunk-66S4PT6C.cjs.map} +1 -1
- package/dist/{chunk-4AWW5WPF.js → chunk-6LFG4JFF.js} +51 -24
- package/dist/chunk-6LFG4JFF.js.map +1 -0
- package/dist/chunk-7BARESXI.cjs +353 -0
- package/dist/chunk-7BARESXI.cjs.map +1 -0
- package/dist/{chunk-PEH4ZOEM.cjs → chunk-A2QVQF54.cjs} +12 -6
- package/dist/chunk-A2QVQF54.cjs.map +1 -0
- package/dist/{chunk-I7L6CQXR.cjs → chunk-AWUADXYI.cjs} +58 -31
- package/dist/chunk-AWUADXYI.cjs.map +1 -0
- package/dist/{chunk-PEFJAWNR.cjs → chunk-BWYYA3LQ.cjs} +26 -10
- package/dist/chunk-BWYYA3LQ.cjs.map +1 -0
- package/dist/chunk-C4QQAUYN.js +588 -0
- package/dist/chunk-C4QQAUYN.js.map +1 -0
- package/dist/chunk-CJQXWFIW.js +829 -0
- package/dist/chunk-CJQXWFIW.js.map +1 -0
- package/dist/{chunk-KWDTTGH2.js → chunk-CVF4HRWL.js} +5 -5
- package/dist/{chunk-KWDTTGH2.js.map → chunk-CVF4HRWL.js.map} +1 -1
- package/dist/{chunk-WH6I7CMP.cjs → chunk-CW75IKA6.cjs} +27 -2
- package/dist/chunk-CW75IKA6.cjs.map +1 -0
- package/dist/{chunk-3NJ72QU6.js → chunk-DCER2QQB.js} +3 -2
- package/dist/chunk-DCER2QQB.js.map +1 -0
- package/dist/{chunk-JYMQJ32S.cjs → chunk-DEZ7XSTG.cjs} +9 -5
- package/dist/chunk-DEZ7XSTG.cjs.map +1 -0
- package/dist/{chunk-QYJ7RQJ2.cjs → chunk-DFCZPVG4.cjs} +84 -38
- package/dist/chunk-DFCZPVG4.cjs.map +1 -0
- package/dist/{chunk-AWIULTJW.js → chunk-DNPRRYPQ.js} +18 -3
- package/dist/chunk-DNPRRYPQ.js.map +1 -0
- package/dist/{chunk-SSKI6VTW.cjs → chunk-E35GUUTC.cjs} +23 -4
- package/dist/chunk-E35GUUTC.cjs.map +1 -0
- package/dist/{chunk-B5364UWR.cjs → chunk-EAXY5X33.cjs} +6 -6
- package/dist/{chunk-B5364UWR.cjs.map → chunk-EAXY5X33.cjs.map} +1 -1
- package/dist/{chunk-53K3KWXQ.cjs → chunk-EUUQVDXX.cjs} +168 -138
- package/dist/chunk-EUUQVDXX.cjs.map +1 -0
- package/dist/{chunk-5UUL5EEO.cjs → chunk-FRT6RQND.cjs} +181 -128
- package/dist/chunk-FRT6RQND.cjs.map +1 -0
- package/dist/{chunk-R4DM4635.cjs → chunk-FSBFQBNE.cjs} +86 -2
- package/dist/chunk-FSBFQBNE.cjs.map +1 -0
- package/dist/{chunk-6Q4SU72T.js → chunk-FYEK4RZ3.js} +50 -11
- package/dist/chunk-FYEK4RZ3.js.map +1 -0
- package/dist/{chunk-UZUBLXVC.js → chunk-FZJBFJJR.js} +3 -2
- package/dist/chunk-FZJBFJJR.js.map +1 -0
- package/dist/{chunk-UHSPAFY6.js → chunk-GFZNSSSN.js} +3 -3
- package/dist/{chunk-UHSPAFY6.js.map → chunk-GFZNSSSN.js.map} +1 -1
- package/dist/chunk-GOKC4CCZ.cjs +384 -0
- package/dist/chunk-GOKC4CCZ.cjs.map +1 -0
- package/dist/{chunk-Z3TFPXVN.cjs → chunk-GXQFRLTN.cjs} +3 -3
- package/dist/{chunk-Z3TFPXVN.cjs.map → chunk-GXQFRLTN.cjs.map} +1 -1
- package/dist/{chunk-B3L43JGH.js → chunk-HEH3QXOQ.js} +26 -10
- package/dist/chunk-HEH3QXOQ.js.map +1 -0
- package/dist/{chunk-TA6FVVCM.js → chunk-I56VBDSC.js} +3 -3
- package/dist/{chunk-TA6FVVCM.js.map → chunk-I56VBDSC.js.map} +1 -1
- package/dist/{chunk-4DJNHPHB.js → chunk-IGWABMSM.js} +3 -3
- package/dist/{chunk-4DJNHPHB.js.map → chunk-IGWABMSM.js.map} +1 -1
- package/dist/{chunk-SWMRCGL4.cjs → chunk-IKMR2ADM.cjs} +5 -4
- package/dist/chunk-IKMR2ADM.cjs.map +1 -0
- package/dist/{chunk-HRA4FUO6.cjs → chunk-IWU7H3YS.cjs} +79 -52
- package/dist/chunk-IWU7H3YS.cjs.map +1 -0
- package/dist/{chunk-ONWOB76P.js → chunk-J3BU3JBX.js} +33 -14
- package/dist/chunk-J3BU3JBX.js.map +1 -0
- package/dist/{chunk-FFJVCQ5R.cjs → chunk-J644FU54.cjs} +49 -19
- package/dist/chunk-J644FU54.cjs.map +1 -0
- package/dist/chunk-JBB25LFB.js +359 -0
- package/dist/chunk-JBB25LFB.js.map +1 -0
- package/dist/{chunk-VDMQCSXT.cjs → chunk-JHPFOG2N.cjs} +4 -4
- package/dist/{chunk-VDMQCSXT.cjs.map → chunk-JHPFOG2N.cjs.map} +1 -1
- package/dist/{chunk-RYQ5NEKH.js → chunk-JV7UJGBM.js} +6 -6
- package/dist/{chunk-RYQ5NEKH.js.map → chunk-JV7UJGBM.js.map} +1 -1
- package/dist/{chunk-C6MDPPPL.js → chunk-JW5GWKV7.js} +3 -3
- package/dist/{chunk-C6MDPPPL.js.map → chunk-JW5GWKV7.js.map} +1 -1
- package/dist/{chunk-XXOBTAKA.js → chunk-JWUVVPKM.js} +79 -52
- package/dist/chunk-JWUVVPKM.js.map +1 -0
- package/dist/{chunk-EYH7OUX5.js → chunk-JYAWYBA3.js} +23 -4
- package/dist/chunk-JYAWYBA3.js.map +1 -0
- package/dist/{chunk-5T3AWNHG.cjs → chunk-K7IGBNZA.cjs} +70 -39
- package/dist/chunk-K7IGBNZA.cjs.map +1 -0
- package/dist/{chunk-BTJHYGPI.cjs → chunk-L7YQBSEL.cjs} +14 -4
- package/dist/chunk-L7YQBSEL.cjs.map +1 -0
- package/dist/chunk-LEMY57MI.js +3 -0
- package/dist/{chunk-Y22SOAJM.js.map → chunk-LEMY57MI.js.map} +1 -1
- package/dist/{chunk-AU5ADTYD.cjs → chunk-MIGLLTTD.cjs} +50 -11
- package/dist/chunk-MIGLLTTD.cjs.map +1 -0
- package/dist/{chunk-VV4N4WY6.cjs → chunk-MSRU3XBH.cjs} +61 -35
- package/dist/chunk-MSRU3XBH.cjs.map +1 -0
- package/dist/{chunk-JFAXLE2J.js → chunk-MUYTGWGE.js} +9 -5
- package/dist/chunk-MUYTGWGE.js.map +1 -0
- package/dist/{chunk-B26RIQ5R.js → chunk-MV3MTHWQ.js} +6 -2
- package/dist/chunk-MV3MTHWQ.js.map +1 -0
- package/dist/{chunk-VZUVYJFU.cjs → chunk-MXQNNKPX.cjs} +17 -17
- package/dist/{chunk-VZUVYJFU.cjs.map → chunk-MXQNNKPX.cjs.map} +1 -1
- package/dist/{chunk-PF3XWKE5.cjs → chunk-NIEIRA5A.cjs} +33 -14
- package/dist/chunk-NIEIRA5A.cjs.map +1 -0
- package/dist/{chunk-RRQGH7C5.cjs → chunk-NVHAQOHH.cjs} +8 -3
- package/dist/chunk-NVHAQOHH.cjs.map +1 -0
- package/dist/chunk-OGOFYY22.js +247 -0
- package/dist/chunk-OGOFYY22.js.map +1 -0
- package/dist/{chunk-OT36EMM5.js → chunk-OKBR6PX4.js} +5 -4
- package/dist/chunk-OKBR6PX4.js.map +1 -0
- package/dist/{chunk-LZEY55QZ.cjs → chunk-OYKS2JBB.cjs} +18 -3
- package/dist/chunk-OYKS2JBB.cjs.map +1 -0
- package/dist/{chunk-4LTN2LEN.js → chunk-PSTGFXQG.js} +3 -3
- package/dist/{chunk-4LTN2LEN.js.map → chunk-PSTGFXQG.js.map} +1 -1
- package/dist/{chunk-OW2BWGST.js → chunk-PU6ZC4GI.js} +48 -31
- package/dist/chunk-PU6ZC4GI.js.map +1 -0
- package/dist/chunk-PVUDXJAI.js +124 -0
- package/dist/chunk-PVUDXJAI.js.map +1 -0
- package/dist/{chunk-EF46XW4Z.cjs → chunk-Q2EWNXIB.cjs} +161 -67
- package/dist/chunk-Q2EWNXIB.cjs.map +1 -0
- package/dist/{chunk-CP7NPDQW.js → chunk-Q7NBJFEB.js} +87 -4
- package/dist/chunk-Q7NBJFEB.js.map +1 -0
- package/dist/{chunk-ORUPC5TV.cjs → chunk-QASIWBXU.cjs} +9 -5
- package/dist/chunk-QASIWBXU.cjs.map +1 -0
- package/dist/{chunk-4LNS5QDP.cjs → chunk-QITBJX4A.cjs} +3 -3
- package/dist/{chunk-4LNS5QDP.cjs.map → chunk-QITBJX4A.cjs.map} +1 -1
- package/dist/{chunk-KEIA2G6O.cjs → chunk-QO6U5VOT.cjs} +3 -3
- package/dist/{chunk-KEIA2G6O.cjs.map → chunk-QO6U5VOT.cjs.map} +1 -1
- package/dist/{chunk-XVZ4SLQB.js → chunk-QVJBUWJQ.js} +70 -39
- package/dist/chunk-QVJBUWJQ.js.map +1 -0
- package/dist/{chunk-QSMMFATL.js → chunk-R25H4N4Z.js} +181 -128
- package/dist/chunk-R25H4N4Z.js.map +1 -0
- package/dist/{chunk-TPGT236K.js → chunk-RC2YMOMS.js} +26 -3
- package/dist/chunk-RC2YMOMS.js.map +1 -0
- package/dist/{chunk-BXK5TNJE.cjs → chunk-RH43XBNV.cjs} +3 -2
- package/dist/chunk-RH43XBNV.cjs.map +1 -0
- package/dist/{chunk-4MHTSFPX.js → chunk-TGCY5FNL.js} +45 -20
- package/dist/chunk-TGCY5FNL.js.map +1 -0
- package/dist/{chunk-QZLRB3UG.js → chunk-TRZXK57D.js} +168 -138
- package/dist/chunk-TRZXK57D.js.map +1 -0
- package/dist/{chunk-B7YGVKTE.cjs → chunk-U3ABLVYH.cjs} +51 -24
- package/dist/chunk-U3ABLVYH.cjs.map +1 -0
- package/dist/chunk-VACI5SP7.cjs +270 -0
- package/dist/chunk-VACI5SP7.cjs.map +1 -0
- package/dist/{chunk-GV5JQBPX.js → chunk-VCO2IZOG.js} +9 -5
- package/dist/chunk-VCO2IZOG.js.map +1 -0
- package/dist/chunk-WFS6R2F5.js +328 -0
- package/dist/chunk-WFS6R2F5.js.map +1 -0
- package/dist/{chunk-IY7UQPDO.cjs → chunk-WGPMTW36.cjs} +6 -2
- package/dist/chunk-WGPMTW36.cjs.map +1 -0
- package/dist/chunk-WJU3KLVV.cjs +855 -0
- package/dist/chunk-WJU3KLVV.cjs.map +1 -0
- package/dist/{chunk-SOFX4T7M.js → chunk-WOYUQ4AT.js} +49 -19
- package/dist/chunk-WOYUQ4AT.js.map +1 -0
- package/dist/{chunk-SD44QJIP.js → chunk-WTDCNXZO.js} +58 -31
- package/dist/chunk-WTDCNXZO.js.map +1 -0
- package/dist/{chunk-2J2V4TMJ.cjs → chunk-WZBCK7KG.cjs} +42 -32
- package/dist/chunk-WZBCK7KG.cjs.map +1 -0
- package/dist/{chunk-O5HS7ZND.cjs → chunk-X7S76WB7.cjs} +3 -3
- package/dist/{chunk-O5HS7ZND.cjs.map → chunk-X7S76WB7.cjs.map} +1 -1
- package/dist/{chunk-ULOA7WBW.js → chunk-XB7QCKK7.js} +3 -3
- package/dist/{chunk-ULOA7WBW.js.map → chunk-XB7QCKK7.js.map} +1 -1
- package/dist/{chunk-G2DOD34H.js → chunk-XCLQZ4FV.js} +84 -38
- package/dist/chunk-XCLQZ4FV.js.map +1 -0
- package/dist/{chunk-NIHESA7O.js → chunk-YDJUUR4Y.js} +42 -32
- package/dist/chunk-YDJUUR4Y.js.map +1 -0
- package/dist/{chunk-RCMF6KZA.js → chunk-YTZPVEIO.js} +3 -3
- package/dist/{chunk-RCMF6KZA.js.map → chunk-YTZPVEIO.js.map} +1 -1
- package/dist/{chunk-SWV5E75F.cjs → chunk-Z5J4NTPL.cjs} +3 -3
- package/dist/{chunk-SWV5E75F.cjs.map → chunk-Z5J4NTPL.cjs.map} +1 -1
- package/dist/{chunk-XHJGYBYG.cjs → chunk-ZKFVGYBK.cjs} +48 -31
- package/dist/chunk-ZKFVGYBK.cjs.map +1 -0
- package/dist/{chunk-CEHWXAAI.js → chunk-ZVPJ2MH6.js} +14 -4
- package/dist/chunk-ZVPJ2MH6.js.map +1 -0
- package/dist/{chunk-VBHPXSCV.js → chunk-ZVSW2KS6.js} +12 -6
- package/dist/chunk-ZVSW2KS6.js.map +1 -0
- package/dist/components/Alert/index.cjs +5 -5
- package/dist/components/Alert/index.js +1 -1
- package/dist/components/AudioPlayer/index.cjs +6 -6
- package/dist/components/AudioPlayer/index.d.cts +5 -4
- package/dist/components/AudioPlayer/index.d.ts +5 -4
- package/dist/components/AudioPlayer/index.js +1 -1
- package/dist/components/AudioRecorder/index.cjs +6 -6
- package/dist/components/AudioRecorder/index.js +1 -1
- package/dist/components/Avatar/index.cjs +5 -5
- package/dist/components/Avatar/index.js +1 -1
- package/dist/components/Badge/index.cjs +3 -3
- package/dist/components/Badge/index.js +1 -1
- package/dist/components/Breadcrumb/index.cjs +3 -3
- package/dist/components/Breadcrumb/index.js +1 -1
- package/dist/components/Button/index.cjs +3 -3
- package/dist/components/Button/index.js +1 -1
- package/dist/components/Card/index.cjs +15 -15
- package/dist/components/Card/index.d.cts +6 -2
- package/dist/components/Card/index.d.ts +6 -2
- package/dist/components/Card/index.js +1 -1
- package/dist/components/Checkbox/index.cjs +4 -4
- package/dist/components/Checkbox/index.js +1 -1
- package/dist/components/CountryCodeDropdown/index.cjs +23 -0
- package/dist/components/CountryCodeDropdown/index.cjs.map +1 -0
- package/dist/components/CountryCodeDropdown/index.d.cts +69 -0
- package/dist/components/CountryCodeDropdown/index.d.ts +69 -0
- package/dist/components/CountryCodeDropdown/index.js +6 -0
- package/dist/components/CountryCodeDropdown/index.js.map +1 -0
- package/dist/components/DateInput/index.cjs +4 -4
- package/dist/components/DateInput/index.js +3 -3
- package/dist/components/Dropdown/index.cjs +9 -8
- package/dist/components/Dropdown/index.d.cts +29 -1
- package/dist/components/Dropdown/index.d.ts +29 -1
- package/dist/components/Dropdown/index.js +3 -2
- package/dist/components/Input/index.cjs +3 -3
- package/dist/components/Input/index.js +1 -1
- package/dist/components/Modal/index.cjs +9 -9
- package/dist/components/Modal/index.js +1 -1
- package/dist/components/Pagination/index.cjs +4 -4
- package/dist/components/Pagination/index.d.cts +6 -2
- package/dist/components/Pagination/index.d.ts +6 -2
- package/dist/components/Pagination/index.js +1 -1
- package/dist/components/PhoneInput/index.cjs +5 -5
- package/dist/components/PhoneInput/index.js +3 -3
- package/dist/components/Progress/index.cjs +6 -6
- package/dist/components/Progress/index.js +1 -1
- package/dist/components/QuickAction/index.cjs +6 -6
- package/dist/components/QuickAction/index.js +1 -1
- package/dist/components/Radio/index.cjs +4 -4
- package/dist/components/Radio/index.js +1 -1
- package/dist/components/RecordButton/index.cjs +4 -4
- package/dist/components/RecordButton/index.js +1 -1
- package/dist/components/SchedulePicker/index.cjs +10 -10
- package/dist/components/SchedulePicker/index.js +1 -1
- package/dist/components/Select/index.cjs +3 -3
- package/dist/components/Select/index.d.cts +3 -1
- package/dist/components/Select/index.d.ts +3 -1
- package/dist/components/Select/index.js +1 -1
- package/dist/components/Skeleton/index.cjs +6 -6
- package/dist/components/Skeleton/index.d.cts +1 -1
- package/dist/components/Skeleton/index.d.ts +1 -1
- package/dist/components/Skeleton/index.js +1 -1
- package/dist/components/Slider/index.cjs +5 -5
- package/dist/components/Slider/index.js +1 -1
- package/dist/components/Spinner/index.cjs +5 -5
- package/dist/components/Spinner/index.js +1 -1
- package/dist/components/Switch/index.cjs +4 -4
- package/dist/components/Switch/index.js +1 -1
- package/dist/components/Table/index.cjs +9 -9
- package/dist/components/Table/index.js +1 -1
- package/dist/components/Tabs/index.cjs +7 -7
- package/dist/components/Tabs/index.js +1 -1
- package/dist/components/Text/index.cjs +4 -4
- package/dist/components/Text/index.js +1 -1
- package/dist/components/Textarea/index.cjs +3 -3
- package/dist/components/Textarea/index.js +1 -1
- package/dist/components/ThemeProvider/index.cjs +8 -8
- package/dist/components/ThemeProvider/index.js +2 -2
- package/dist/components/Tooltip/index.cjs +2 -2
- package/dist/components/Tooltip/index.js +1 -1
- package/dist/datavis.cjs +251 -0
- package/dist/datavis.cjs.map +1 -0
- package/dist/datavis.d.cts +47 -0
- package/dist/datavis.d.ts +47 -0
- package/dist/datavis.js +247 -0
- package/dist/datavis.js.map +1 -0
- package/dist/default-BTEIFIZJ.cjs +18 -0
- package/dist/{default-ZGHKI5WF.cjs.map → default-BTEIFIZJ.cjs.map} +1 -1
- package/dist/default-ORBRVZRZ.js +3 -0
- package/dist/{default-LIRPABBK.js.map → default-ORBRVZRZ.js.map} +1 -1
- package/dist/hooks/index.cjs +19 -15
- package/dist/hooks/index.d.cts +39 -3
- package/dist/hooks/index.d.ts +39 -3
- package/dist/hooks/index.js +2 -2
- package/dist/index.cjs +13453 -9169
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +134 -55
- package/dist/index.d.ts +134 -55
- package/dist/index.js +12679 -8419
- package/dist/index.js.map +1 -1
- package/dist/mieweb-4XR6UKDQ.cjs +18 -0
- package/dist/{mieweb-UJABK5XX.cjs.map → mieweb-4XR6UKDQ.cjs.map} +1 -1
- package/dist/mieweb-N6UMH4MU.js +3 -0
- package/dist/{mieweb-PV2YKYO7.js.map → mieweb-N6UMH4MU.js.map} +1 -1
- package/dist/ozwell.cjs +385 -0
- package/dist/ozwell.cjs.map +1 -0
- package/dist/ozwell.d.cts +15 -0
- package/dist/ozwell.d.ts +15 -0
- package/dist/ozwell.js +360 -0
- package/dist/ozwell.js.map +1 -0
- package/dist/styles/init.css +339 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.d.cts +13 -2
- package/dist/tailwind-preset.d.ts +13 -2
- package/dist/tailwind-preset.js +1 -1
- package/dist/utils/index.cjs +31 -23
- package/dist/utils/index.d.cts +19 -2
- package/dist/utils/index.d.ts +19 -2
- package/dist/utils/index.js +2 -2
- package/dist/waggleline-2MLRNVCV.js +3 -0
- package/dist/{waggleline-BMUYAFJF.js.map → waggleline-2MLRNVCV.js.map} +1 -1
- package/dist/waggleline-I7QWD3YX.cjs +18 -0
- package/dist/{waggleline-6IGA66HR.cjs.map → waggleline-I7QWD3YX.cjs.map} +1 -1
- package/dist/webchart-F6EIMC3I.js +3 -0
- package/dist/{webchart-2SLO5ICI.js.map → webchart-F6EIMC3I.js.map} +1 -1
- package/dist/webchart-H3BHYNHB.cjs +18 -0
- package/dist/{webchart-EHVGP46N.cjs.map → webchart-H3BHYNHB.cjs.map} +1 -1
- package/package.json +42 -4
- package/dist/chunk-265CFCCX.js +0 -173
- package/dist/chunk-265CFCCX.js.map +0 -1
- package/dist/chunk-2J2V4TMJ.cjs.map +0 -1
- package/dist/chunk-3NJ72QU6.js.map +0 -1
- package/dist/chunk-4AWW5WPF.js.map +0 -1
- package/dist/chunk-4MHTSFPX.js.map +0 -1
- package/dist/chunk-4T2ZNPTC.js +0 -220
- package/dist/chunk-4T2ZNPTC.js.map +0 -1
- package/dist/chunk-4YRAEFYW.js +0 -233
- package/dist/chunk-4YRAEFYW.js.map +0 -1
- package/dist/chunk-53K3KWXQ.cjs.map +0 -1
- package/dist/chunk-5T3AWNHG.cjs.map +0 -1
- package/dist/chunk-5UUL5EEO.cjs.map +0 -1
- package/dist/chunk-6OCIIIAI.js.map +0 -1
- package/dist/chunk-6Q4SU72T.js.map +0 -1
- package/dist/chunk-AU5ADTYD.cjs.map +0 -1
- package/dist/chunk-AWIULTJW.js.map +0 -1
- package/dist/chunk-B26RIQ5R.js.map +0 -1
- package/dist/chunk-B3L43JGH.js.map +0 -1
- package/dist/chunk-B7YGVKTE.cjs.map +0 -1
- package/dist/chunk-BTJHYGPI.cjs.map +0 -1
- package/dist/chunk-BV75DAKO.cjs +0 -245
- package/dist/chunk-BV75DAKO.cjs.map +0 -1
- package/dist/chunk-BXK5TNJE.cjs.map +0 -1
- package/dist/chunk-CEHWXAAI.js.map +0 -1
- package/dist/chunk-CP7NPDQW.js.map +0 -1
- package/dist/chunk-CQCYXHCU.cjs +0 -256
- package/dist/chunk-CQCYXHCU.cjs.map +0 -1
- package/dist/chunk-DMA74PZ7.js +0 -240
- package/dist/chunk-DMA74PZ7.js.map +0 -1
- package/dist/chunk-EF46XW4Z.cjs.map +0 -1
- package/dist/chunk-EKIQE524.cjs.map +0 -1
- package/dist/chunk-EYH7OUX5.js.map +0 -1
- package/dist/chunk-FFJVCQ5R.cjs.map +0 -1
- package/dist/chunk-FIXAVBUA.cjs +0 -200
- package/dist/chunk-FIXAVBUA.cjs.map +0 -1
- package/dist/chunk-G2DOD34H.js.map +0 -1
- package/dist/chunk-GHRQ3ZJH.js +0 -764
- package/dist/chunk-GHRQ3ZJH.js.map +0 -1
- package/dist/chunk-GV5JQBPX.js.map +0 -1
- package/dist/chunk-HRA4FUO6.cjs.map +0 -1
- package/dist/chunk-I7L6CQXR.cjs.map +0 -1
- package/dist/chunk-INFSKLXE.cjs +0 -790
- package/dist/chunk-INFSKLXE.cjs.map +0 -1
- package/dist/chunk-IY7UQPDO.cjs.map +0 -1
- package/dist/chunk-JFAXLE2J.js.map +0 -1
- package/dist/chunk-JYMQJ32S.cjs.map +0 -1
- package/dist/chunk-LZEY55QZ.cjs.map +0 -1
- package/dist/chunk-N3QTYHRZ.cjs.map +0 -1
- package/dist/chunk-NAATBUHR.cjs.map +0 -1
- package/dist/chunk-NIHESA7O.js.map +0 -1
- package/dist/chunk-NXRLGHEC.js +0 -98
- package/dist/chunk-NXRLGHEC.js.map +0 -1
- package/dist/chunk-ONWOB76P.js.map +0 -1
- package/dist/chunk-ORUPC5TV.cjs.map +0 -1
- package/dist/chunk-OT36EMM5.js.map +0 -1
- package/dist/chunk-OW2BWGST.js.map +0 -1
- package/dist/chunk-PEFJAWNR.cjs.map +0 -1
- package/dist/chunk-PEH4ZOEM.cjs.map +0 -1
- package/dist/chunk-PF3XWKE5.cjs.map +0 -1
- package/dist/chunk-QL2YTVTR.js.map +0 -1
- package/dist/chunk-QSMMFATL.js.map +0 -1
- package/dist/chunk-QYJ7RQJ2.cjs.map +0 -1
- package/dist/chunk-QZLRB3UG.js.map +0 -1
- package/dist/chunk-R4DM4635.cjs.map +0 -1
- package/dist/chunk-RRQGH7C5.cjs.map +0 -1
- package/dist/chunk-SD44QJIP.js.map +0 -1
- package/dist/chunk-SOFX4T7M.js.map +0 -1
- package/dist/chunk-SSKI6VTW.cjs.map +0 -1
- package/dist/chunk-SWMRCGL4.cjs.map +0 -1
- package/dist/chunk-TPGT236K.js.map +0 -1
- package/dist/chunk-UZUBLXVC.js.map +0 -1
- package/dist/chunk-VBHPXSCV.js.map +0 -1
- package/dist/chunk-VV4N4WY6.cjs.map +0 -1
- package/dist/chunk-WH6I7CMP.cjs.map +0 -1
- package/dist/chunk-XHJGYBYG.cjs.map +0 -1
- package/dist/chunk-XVZ4SLQB.js.map +0 -1
- package/dist/chunk-XXOBTAKA.js.map +0 -1
- package/dist/chunk-Y22SOAJM.js +0 -3
- package/dist/default-LIRPABBK.js +0 -3
- package/dist/default-ZGHKI5WF.cjs +0 -18
- package/dist/mieweb-PV2YKYO7.js +0 -3
- package/dist/mieweb-UJABK5XX.cjs +0 -18
- package/dist/waggleline-6IGA66HR.cjs +0 -18
- package/dist/waggleline-BMUYAFJF.js +0 -3
- package/dist/webchart-2SLO5ICI.js +0 -3
- package/dist/webchart-EHVGP46N.cjs +0 -18
package/README.md
CHANGED
|
@@ -47,6 +47,23 @@ This library requires React 18+ and React DOM 18+:
|
|
|
47
47
|
npm install react react-dom
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
+
### Optional Add-ons
|
|
51
|
+
|
|
52
|
+
Heavy or specialized dependencies are kept in separate entry points so they don't bloat the core bundle. Install the peer dependencies for the add-ons you need:
|
|
53
|
+
|
|
54
|
+
| Entry point | Install | Import path |
|
|
55
|
+
| ------------------------ | ---------------------------------------------------- | ------------------------ |
|
|
56
|
+
| **AG Grid** | `npm install ag-grid-community ag-grid-react` | `@mieweb/ui/ag-grid` |
|
|
57
|
+
| **DataVis** | `npm install datavis-ace` | `@mieweb/ui/datavis` |
|
|
58
|
+
| **Ozwell AI Widget** | `npm install @ozwell/react` | `@mieweb/ui/ozwell` |
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
// Example: Ozwell widget
|
|
62
|
+
import { OzwellWidget } from '@mieweb/ui/ozwell';
|
|
63
|
+
|
|
64
|
+
<OzwellWidget apiKey="agnt_key-your-key" />
|
|
65
|
+
```
|
|
66
|
+
|
|
50
67
|
## Quick Start
|
|
51
68
|
|
|
52
69
|
### Option 1: With Tailwind CSS (Recommended)
|
package/dist/ag-grid.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk4ZU53GNR_cjs = require('./chunk-4ZU53GNR.cjs');
|
|
4
4
|
var chunkOR5DRJCW_cjs = require('./chunk-OR5DRJCW.cjs');
|
|
5
5
|
var React = require('react');
|
|
6
6
|
var agGridReact = require('ag-grid-react');
|
|
@@ -165,6 +165,7 @@ function AGGridInner({
|
|
|
165
165
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
166
166
|
"div",
|
|
167
167
|
{
|
|
168
|
+
"data-slot": "ag-grid",
|
|
168
169
|
className: chunkOR5DRJCW_cjs.cn(agGridVariants({ variant, size, brand }), className),
|
|
169
170
|
style: {
|
|
170
171
|
height: typeof resolvedHeight === "number" ? `${resolvedHeight}px` : resolvedHeight,
|
|
@@ -243,7 +244,7 @@ function getInitials(name) {
|
|
|
243
244
|
}
|
|
244
245
|
function getAvatarColor(name) {
|
|
245
246
|
const colors = [
|
|
246
|
-
"bg-primary-
|
|
247
|
+
"bg-primary-800",
|
|
247
248
|
"bg-green-600",
|
|
248
249
|
"bg-orange-600",
|
|
249
250
|
"bg-secondary-600",
|
|
@@ -269,32 +270,42 @@ var statusColors = {
|
|
|
269
270
|
active: {
|
|
270
271
|
label: "Active",
|
|
271
272
|
bgClass: "bg-green-100 dark:bg-green-900/30",
|
|
272
|
-
textClass: "text-green-
|
|
273
|
+
textClass: "text-green-700 dark:text-green-400"
|
|
273
274
|
},
|
|
274
275
|
inactive: {
|
|
275
276
|
label: "Inactive",
|
|
276
277
|
bgClass: "bg-gray-200 dark:bg-gray-700",
|
|
277
|
-
textClass: "text-gray-600 dark:text-gray-
|
|
278
|
+
textClass: "text-gray-600 dark:text-gray-300"
|
|
279
|
+
},
|
|
280
|
+
closed_won: {
|
|
281
|
+
label: "Closed Won",
|
|
282
|
+
bgClass: "bg-green-100 dark:bg-green-900/30",
|
|
283
|
+
textClass: "text-green-700 dark:text-green-400"
|
|
284
|
+
},
|
|
285
|
+
closed_lost: {
|
|
286
|
+
label: "Closed Lost",
|
|
287
|
+
bgClass: "bg-red-100 dark:bg-red-900/30",
|
|
288
|
+
textClass: "text-red-700 dark:text-red-400"
|
|
278
289
|
},
|
|
279
290
|
pending: {
|
|
280
291
|
label: "Pending",
|
|
281
292
|
bgClass: "bg-amber-100 dark:bg-amber-900/30",
|
|
282
|
-
textClass: "text-amber-
|
|
293
|
+
textClass: "text-amber-700 dark:text-amber-400"
|
|
283
294
|
},
|
|
284
295
|
new: {
|
|
285
296
|
label: "New",
|
|
286
297
|
bgClass: "bg-primary-100 dark:bg-primary-900/30",
|
|
287
|
-
textClass: "text-
|
|
298
|
+
textClass: "text-green-700 dark:text-green-400"
|
|
288
299
|
},
|
|
289
300
|
verified: {
|
|
290
301
|
label: "Verified",
|
|
291
302
|
bgClass: "bg-green-100 dark:bg-green-900/30",
|
|
292
|
-
textClass: "text-green-
|
|
303
|
+
textClass: "text-green-700 dark:text-green-400"
|
|
293
304
|
},
|
|
294
305
|
flagged: {
|
|
295
306
|
label: "Flagged",
|
|
296
307
|
bgClass: "bg-red-100 dark:bg-red-900/30",
|
|
297
|
-
textClass: "text-red-
|
|
308
|
+
textClass: "text-red-700 dark:text-red-400"
|
|
298
309
|
}
|
|
299
310
|
};
|
|
300
311
|
function AvatarNameRenderer(props) {
|
|
@@ -311,8 +322,8 @@ function AvatarNameRenderer(props) {
|
|
|
311
322
|
const imageUrl = avatarUrl || faviconUrl;
|
|
312
323
|
if (isSystemValue) {
|
|
313
324
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 py-1", children: [
|
|
314
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-7 w-7 items-center justify-center rounded-full bg-gray-200 text-xs font-semibold text-gray-400 dark:bg-gray-700
|
|
315
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-gray-400 italic
|
|
325
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "dark:text-muted-foreground flex h-7 w-7 items-center justify-center rounded-full bg-gray-200 text-xs font-semibold text-gray-400 dark:bg-gray-700", children: displayName === "Unassigned" ? "\u2014" : "??" }),
|
|
326
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "dark:text-muted-foreground truncate text-gray-400 italic", children: displayName })
|
|
316
327
|
] });
|
|
317
328
|
}
|
|
318
329
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 py-1", children: [
|
|
@@ -351,7 +362,7 @@ function StatusBadgeRenderer(props) {
|
|
|
351
362
|
const config = statusConfig[normalizedValue] || {
|
|
352
363
|
label: value,
|
|
353
364
|
bgClass: "bg-gray-200 dark:bg-gray-700",
|
|
354
|
-
textClass: "text-gray-600 dark:text-gray-
|
|
365
|
+
textClass: "text-gray-600 dark:text-gray-300"
|
|
355
366
|
};
|
|
356
367
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
357
368
|
"span",
|
|
@@ -369,21 +380,21 @@ function getEngagementScoreColors(score) {
|
|
|
369
380
|
if (score >= 70)
|
|
370
381
|
return {
|
|
371
382
|
barColor: "bg-green-500",
|
|
372
|
-
textColor: "text-green-
|
|
383
|
+
textColor: "text-green-700 dark:text-green-400"
|
|
373
384
|
};
|
|
374
385
|
if (score >= 40)
|
|
375
386
|
return {
|
|
376
387
|
barColor: "bg-amber-500",
|
|
377
|
-
textColor: "text-amber-
|
|
388
|
+
textColor: "text-amber-700 dark:text-amber-400"
|
|
378
389
|
};
|
|
379
390
|
if (score >= 20)
|
|
380
391
|
return {
|
|
381
392
|
barColor: "bg-orange-500",
|
|
382
|
-
textColor: "text-orange-
|
|
393
|
+
textColor: "text-orange-700 dark:text-orange-400"
|
|
383
394
|
};
|
|
384
395
|
return {
|
|
385
396
|
barColor: "bg-gray-400",
|
|
386
|
-
textColor: "text-
|
|
397
|
+
textColor: "text-muted-foreground"
|
|
387
398
|
};
|
|
388
399
|
}
|
|
389
400
|
function EngagementScoreRenderer(props) {
|
|
@@ -410,10 +421,10 @@ function EmailRenderer(props) {
|
|
|
410
421
|
"a",
|
|
411
422
|
{
|
|
412
423
|
href: `mailto:${value}`,
|
|
413
|
-
className: "text-primary-
|
|
424
|
+
className: "text-primary-800 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline",
|
|
414
425
|
onClick: (e) => e.stopPropagation(),
|
|
415
426
|
children: [
|
|
416
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
427
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk4ZU53GNR_cjs.Mail, { className: "h-3 w-3 opacity-60" }),
|
|
417
428
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: value })
|
|
418
429
|
]
|
|
419
430
|
}
|
|
@@ -427,10 +438,10 @@ function PhoneRenderer(props) {
|
|
|
427
438
|
"a",
|
|
428
439
|
{
|
|
429
440
|
href: `tel:${value}`,
|
|
430
|
-
className: "text-foreground hover:text-primary-
|
|
441
|
+
className: "text-foreground hover:text-primary-800 dark:hover:text-primary-400 inline-flex items-center gap-1.5",
|
|
431
442
|
onClick: (e) => e.stopPropagation(),
|
|
432
443
|
children: [
|
|
433
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
444
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk4ZU53GNR_cjs.Phone, { className: "h-3 w-3 text-green-500 opacity-70" }),
|
|
434
445
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: displayValue })
|
|
435
446
|
]
|
|
436
447
|
}
|
|
@@ -447,10 +458,10 @@ function DomainRenderer(props) {
|
|
|
447
458
|
href: url,
|
|
448
459
|
target: "_blank",
|
|
449
460
|
rel: "noopener noreferrer",
|
|
450
|
-
className: "text-primary-
|
|
461
|
+
className: "text-primary-800 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline",
|
|
451
462
|
onClick: (e) => e.stopPropagation(),
|
|
452
463
|
children: [
|
|
453
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
464
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk4ZU53GNR_cjs.Globe, { className: "h-3 w-3 opacity-60" }),
|
|
454
465
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: displayDomain })
|
|
455
466
|
]
|
|
456
467
|
}
|
|
@@ -544,10 +555,10 @@ function BooleanRenderer(props) {
|
|
|
544
555
|
{
|
|
545
556
|
className: chunkOR5DRJCW_cjs.cn(
|
|
546
557
|
"inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium",
|
|
547
|
-
isTrue ? "bg-green-100 text-green-
|
|
558
|
+
isTrue ? "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400" : "bg-gray-200 text-gray-600 dark:bg-gray-700 dark:text-gray-300"
|
|
548
559
|
),
|
|
549
560
|
children: [
|
|
550
|
-
isTrue ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
561
|
+
isTrue ? /* @__PURE__ */ jsxRuntime.jsx(chunk4ZU53GNR_cjs.CheckCircle, { className: "h-3 w-3" }) : /* @__PURE__ */ jsxRuntime.jsx(chunk4ZU53GNR_cjs.Clock, { className: "h-3 w-3" }),
|
|
551
562
|
isTrue ? "Yes" : "No"
|
|
552
563
|
]
|
|
553
564
|
}
|
|
@@ -576,7 +587,7 @@ function CompanyRenderer(props) {
|
|
|
576
587
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
577
588
|
"div",
|
|
578
589
|
{
|
|
579
|
-
className: "bg-primary-100 text-primary-
|
|
590
|
+
className: "bg-primary-100 text-primary-800 dark:bg-primary-900/30 dark:text-primary-400 flex h-5 w-5 items-center justify-center rounded text-[9px] font-semibold",
|
|
580
591
|
style: { display: faviconUrl ? "none" : "flex" },
|
|
581
592
|
children: getInitials(value)
|
|
582
593
|
}
|
|
@@ -585,7 +596,7 @@ function CompanyRenderer(props) {
|
|
|
585
596
|
] });
|
|
586
597
|
}
|
|
587
598
|
function ProgressRenderer(props) {
|
|
588
|
-
const { value, barColor = "bg-primary-
|
|
599
|
+
const { value, barColor = "bg-primary-800", max = 100 } = props;
|
|
589
600
|
if (value == null) return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "--" });
|
|
590
601
|
const percentage = Math.min(100, Math.max(0, Number(value) / max * 100));
|
|
591
602
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 py-1", children: [
|
|
@@ -611,7 +622,7 @@ function TagsRenderer(props) {
|
|
|
611
622
|
value.slice(0, 3).map((tag, index) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
612
623
|
"span",
|
|
613
624
|
{
|
|
614
|
-
className: "inline-flex items-center rounded-full bg-gray-100 px-2 py-0.5 text-xs font-medium
|
|
625
|
+
className: "text-foreground inline-flex items-center rounded-full bg-gray-100 px-2 py-0.5 text-xs font-medium dark:bg-gray-800",
|
|
615
626
|
children: tag
|
|
616
627
|
},
|
|
617
628
|
index
|
package/dist/ag-grid.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/AGGrid/AGGrid.tsx","../src/components/AGGrid/CellRenderers.tsx"],"names":["ModuleRegistry","AllCommunityModule","cva","React","jsx","cn","AgGridReact","jsxs","Mail","Phone","Globe","Linkedin","formatted","CheckCircle","Clock","memo"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBAA,8BAAA,CAAe,eAAA,CAAgB,CAACC,kCAAkB,CAAC,CAAA;AAMnD,IAAM,cAAA,GAAiBC,2BAAI,wBAAA,EAA0B;AAAA,EACnD,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA,IAIR,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,EAAA;AAAA,MACT,QAAA,EACE,gGAAA;AAAA,MACF,OAAA,EAAS,6BAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACR;AAAA;AAAA;AAAA;AAAA,IAIA,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,kEAAA;AAAA,MACJ,EAAA,EAAI,kEAAA;AAAA,MACJ,EAAA,EAAI,oEAAA;AAAA,MACJ,EAAA,EAAI,sEAAA;AAAA,MACJ,EAAA,EAAI;AAAA,KACN;AAAA;AAAA;AAAA;AAAA,IAIA,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,EAAA;AAAA,MACT,MAAA,EAAQ,iBAAA;AAAA,MACR,QAAA,EAAU,mBAAA;AAAA,MACV,UAAA,EAAY,qBAAA;AAAA,MACZ,QAAA,EAAU,mBAAA;AAAA,MACV,mBAAA,EAAqB;AAAA;AACvB,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAC,CAAA;AA2CD,IAAM,eAAA,GAGF;AAAA,EACF,IAAI,EAAE,SAAA,EAAW,IAAI,YAAA,EAAc,EAAA,EAAI,iBAAiB,GAAA,EAAI;AAAA,EAC5D,IAAI,EAAE,SAAA,EAAW,IAAI,YAAA,EAAc,EAAA,EAAI,iBAAiB,GAAA,EAAI;AAAA,EAC5D,IAAI,EAAE,SAAA,EAAW,IAAI,YAAA,EAAc,EAAA,EAAI,iBAAiB,GAAA,EAAI;AAAA,EAC5D,IAAI,EAAE,SAAA,EAAW,IAAI,YAAA,EAAc,EAAA,EAAI,iBAAiB,GAAA,EAAI;AAAA,EAC5D,IAAI,EAAE,SAAA,EAAW,IAAI,YAAA,EAAc,EAAA,EAAI,iBAAiB,GAAA;AAC1D,CAAA;AAGA,IAAM,gBAAA,GAAmB,CACvB,QAAA,EACA,UAAA,EACA,SAAA,MACc;AAAA,EACd,QAAA;AAAA,EACA,MAAA,EAAQ,UAAA;AAAA,EACR,SAAA;AAAA,EACA,QAAA,EAAU,GAAA;AAAA,EACV,IAAA,EAAM,CAAA;AAAA,EACN,eAAA,EAAiB,KAAA;AAAA,EACjB,WAAA,EAAa,uBAAA;AAAA,EACb,SAAA,EAAW;AACb,CAAA,CAAA;AAqCA,SAAS,WAAA,CACP;AAAA,EACE,SAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,UAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA,EAAe,iBAAA;AAAA,EACf,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,SAAA,GAAY,IAAA;AAAA,EACZ,QAAA,GAAW,IAAA;AAAA,EACX,UAAA,GAAa,IAAA;AAAA,EACb,aAAA,GAAgB,oBAAA;AAAA,EAChB,cAAA,GAAiB,YAAA;AAAA,EACjB,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,WAAA,GAAoBC,wBAA2B,IAAI,CAAA;AACzD,EAAA,MAAM,UAAA,GAAmBA,wBAA8B,IAAI,CAAA;AAG3D,EAAA,MAAM,WAAA,GAAc,WAAW,GAAA,IAAO,WAAA;AAGtC,EAAA,MAAM,eAAA,GAAwBA,gBAAA,CAAA,WAAA;AAAA,IAC5B,CAAC,KAAA,KAAiC;AAChC,MAAA,UAAA,CAAW,UAAU,KAAA,CAAM,GAAA;AAC3B,MAAA,WAAA,GAAc,KAAK,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAGA,EAAA,MAAM,gBAAA,GAAyBA,gBAAA,CAAA,WAAA;AAAA,IAC7B,CAAC,KAAA,KAAkC;AACjC,MAAA,UAAA,GAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAGA,EAAA,MAAM,mBAAA,GAA4BA,gBAAA,CAAA,OAAA;AAAA,IAChC,OACG;AAAA,MACC,GAAG,gBAAA,CAAiB,QAAA,EAAU,UAAA,EAAY,SAAS,CAAA;AAAA,MACnD,GAAG;AAAA,KACL,CAAA;AAAA,IACF,CAAC,iBAAA,EAAmB,QAAA,EAAU,UAAA,EAAY,SAAS;AAAA,GACrD;AAGA,EAAA,MAAM,oBAAA,GAA6BA,yBAAQ,MAE1B;AACf,IAAA,IAAI,CAAC,cAAc,OAAO,MAAA;AAG1B,IAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,MAAA,OAAO,YAAA;AAAA,IACT;AAGA,IAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,oBAAA,EAAsB;AAAA,OACxB;AAAA,IACF;AAEA,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,oBAAA,EAAsB;AAAA,OACxB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,UAAA,CAAW,QAAQ,kBAAA,EAAmB;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,QAAQ,WAAA,EAAY;AAAA,MACjC;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,IAAA,IAAQ,IAAI,CAAA;AAG/C,EAAA,MAAM,cAAA,GAAiB,UAAU,UAAA,CAAW,eAAA;AAE5C,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,qBAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA;AAAA,MACjE,KAAA,EAAO;AAAA,QACL,QACE,OAAO,cAAA,KAAmB,QAAA,GACtB,CAAA,EAAG,cAAc,CAAA,EAAA,CAAA,GACjB,cAAA;AAAA,QACN,GAAI,WAAA,IACD;AAAA,UACC,oBAAA,EAAsB,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,UACpD,oBACE,WAAA,CAAY,UAAA,CAAW,UAAA,CAAW,IAAA,CAAK,KAAK,IAAI;AAAA;AACpD,OACJ;AAAA,MACA,YAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,kBAAAD,cAAA;AAAA,QAACE,uBAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,WAAA;AAAA,UACL,UAAA;AAAA,UACA,OAAA;AAAA,UACA,aAAA,EAAe,mBAAA;AAAA,UACf,WAAA,EAAa,eAAA;AAAA,UACb,YAAA,EAAc,gBAAA;AAAA,UACd,WAAA,EAAa,IAAA;AAAA,UACb,qBAAA,EAAuB,IAAA;AAAA,UACvB,YAAA,EAAc,oBAAA;AAAA,UACd,UAAA;AAAA,UACA,kBAAA,EAAoB,aAAa,EAAA,GAAK,MAAA;AAAA,UACtC,4BAA4B,UAAA,GAAa,CAAC,IAAI,EAAA,EAAI,GAAA,EAAK,GAAG,CAAA,GAAI,MAAA;AAAA,UAC9D,WAAW,UAAA,CAAW,SAAA;AAAA,UACtB,cAAc,UAAA,CAAW,YAAA;AAAA,UACzB,wBAAwB,sBACtBF,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CACZ,QAAA,EAAA,aAAA,EACH,CAAA;AAAA,UAEF,yBAAyB,sBACvBA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CACZ,QAAA,EAAA,cAAA,EACH,CAAA;AAAA,UAEF,KAAA,EAAM,QAAA;AAAA,UACL,GAAG;AAAA;AAAA;AACN;AAAA,GACF;AAEJ;AAGO,IAAM,MAAA,GAAeD,4BAAW,WAAW;AAKjD,MAAA,CAAoB,WAAA,GAAc,QAAA;ACxSnC,SAAS,cAAA,CACP,KACA,IAAA,EACS;AACT,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,IAAA,EAAM,OAAO,MAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,IAAI,OAAA,GAAmB,GAAA;AACvB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,EAAW,OAAO,MAAA;AACtD,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,OAAA,GAAW,QAAoC,IAAI,CAAA;AAAA,IACrD,CAAA,MAAO;AACL,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,cAAc,MAAA,EAAkD;AACvE,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,UAAU,OAAO,IAAA;AAClD,EAAA,MAAM,WAAA,GAAc,MAAA,CACjB,OAAA,CAAQ,cAAA,EAAgB,EAAE,EAC1B,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CACnB,IAAA,EAAK;AACR,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,EAAA,OAAO,6CAA6C,WAAW,CAAA,MAAA,CAAA;AACjE;AAKO,SAAS,mBAAmB,KAAA,EAA0C;AAC3E,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACvC,EAAA,IAAI,OAAA,CAAQ,WAAW,EAAA,EAAI;AACzB,IAAA,OAAO,GAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AACA,EAAA,IAAI,QAAQ,MAAA,KAAW,EAAA,IAAM,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACpD,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAC,CAAC,IAAI,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAC,CAAC,IAAI,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAC,CAAC,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EACxF;AACA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AAC9C,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAC5C,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,IAAA,OAAO,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,CAAE,CAAC,CAAC,GAAG,WAAA,EAAY;AAAA,EACnE;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,CAAC,EAAE,WAAA,EAAY;AAC1C;AAKA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,SAAS,QAAA,EAAU,OAAO,OAAO,CAAC,CAAA;AACtD,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,IAAA,CAAM,QAAQ,CAAA,IAAK,IAAA,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,OAAO,MAAM,CAAA;AAC9C;AAKA,SAAS,yBAAA,CACP,WACA,SAAA,EACS;AACT,EAAA,IAAI,SAAA,CAAU,KAAA,KAAU,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAChD,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,SAAA,CAAU,IAAA,EAAM,OAAO,KAAA;AAC9C,EAAA,IAAI,UAAU,IAAA,EAAM,QAAA,KAAa,SAAA,CAAU,IAAA,EAAM,UAAU,OAAO,KAAA;AAClE,EAAA,OAAO,IAAA;AACT;AAiBO,IAAM,YAAA,GAA6C;AAAA,EACxD,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAA,EAAS,mCAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,OAAA,EAAS,8BAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,mCAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AAAA,EACA,GAAA,EAAK;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,uCAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,OAAA,EAAS,mCAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,+BAAA;AAAA,IACT,SAAA,EAAW;AAAA;AAEf;AAcO,SAAS,mBACd,KAAA,EACoB;AACpB,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,KAAA;AACxB,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,EAAO,uBAAOC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAEtE,EAAA,MAAM,WAAA,GAAc,OAAO,KAAA,KAAU,QAAA,IAAY,QAAQ,KAAA,GAAQ,SAAA;AACjE,EAAA,MAAM,aAAA,GAAgB,CAAC,SAAA,EAAW,YAAA,EAAc,QAAQ,CAAA,CAAE,QAAA;AAAA,IACxD;AAAA,GACF;AAEA,EAAA,MAAM,SAAA,GACJ,MAAM,WAAA,IAAe,IAAA,GAChB,eAAe,IAAA,EAAM,KAAA,CAAM,WAAW,CAAA,GACvC,IAAA,EAAM,SAAA;AAEZ,EAAA,MAAM,MAAA,GACJ,KAAA,CAAM,WAAA,IAAe,IAAA,GAChB,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,WAAW,CAAA,GACvC,IAAA,EAAM,OAAA,EAAS,MAAA,IAAU,IAAA,EAAM,MAAA;AAErC,EAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,YAAY,WAAW,CAAA;AACxC,EAAA,MAAM,WAAW,SAAA,IAAa,UAAA;AAE9B,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,uBACEG,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,sBAAAH,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6IACZ,QAAA,EAAA,WAAA,KAAgB,YAAA,GAAe,WAAM,IAAA,EACxC,CAAA;AAAA,sBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDACb,QAAA,EAAA,WAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEG,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,QAAA,mBACCH,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,GAAA,EAAK,WAAA;AAAA,QACL,SAAA,EAAU,iFAAA;AAAA,QACV,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,UAAA,MAAA,CAAO,MAAM,OAAA,GAAU,MAAA;AACvB,UAAA,MAAM,UAAU,MAAA,CAAO,kBAAA;AACvB,UAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,OAAA,GAAU,MAAA;AAAA,QACvC;AAAA;AAAA,KACF,GACE,IAAA;AAAA,oBACJA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,oBAAA;AAAA,UACT,wFAAA;AAAA,UACA,eAAe,WAAW;AAAA,SAC5B;AAAA,QACA,KAAA,EAAO,EAAE,OAAA,EAAS,QAAA,GAAW,SAAS,MAAA,EAAO;AAAA,QAE5C,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBACAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCACb,QAAA,EAAA,WAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAcO,SAAS,oBACd,KAAA,EACoB;AACpB,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,GAAe,YAAA,EAAa,GAAI,KAAA;AAC/C,EAAA,IAAI,CAAC,OAAO,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAE7D,EAAA,MAAM,eAAA,GAAkB,OAAO,KAAK,CAAA,CAAE,aAAY,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACvE,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,eAAe,CAAA,IAAK;AAAA,IAC9C,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,8BAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,oBAAA;AAAA,QACT,iFAAA;AAAA,QACA,MAAA,CAAO,OAAA;AAAA,QACP,MAAA,CAAO;AAAA,OACT;AAAA,MAEC,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,GACV;AAEJ;AASA,SAAS,yBAAyB,KAAA,EAGhC;AACA,EAAA,IAAI,KAAA,IAAS,EAAA;AACX,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AACF,EAAA,IAAI,KAAA,IAAS,EAAA;AACX,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AACF,EAAA,IAAI,KAAA,IAAS,EAAA;AACX,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AACF,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,aAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,wBACd,KAAA,EACoB;AACpB,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,EAAA,IAAI,KAAA,IAAS,MAAM,uBAAOD,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAEpE,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AACnD,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,yBAAyB,KAAK,CAAA;AAE9D,EAAA,uBACEG,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,oBAAAH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,oBAAA,CAAG,oCAAA,EAAsC,QAAQ,CAAA;AAAA,QAC5D,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,UAAU,CAAA,CAAA,CAAA;AAAI;AAAA,KACnC,EACF,CAAA;AAAA,oBACAD,eAAC,MAAA,EAAA,EAAK,SAAA,EAAWC,qBAAG,qBAAA,EAAuB,SAAS,GAAI,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAChE,CAAA;AAEJ;AASO,SAAS,cAAc,KAAA,EAAgD;AAC5E,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,EAAA,IAAI,CAAC,OAAO,uBAAOD,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAE7D,EAAA,uBACEG,eAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,UAAU,KAAK,CAAA,CAAA;AAAA,MACrB,SAAA,EAAU,yFAAA;AAAA,MACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MAElC,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAACI,sBAAA,EAAA,EAAS,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,wBACzCJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACpC;AAEJ;AASO,SAAS,cAAc,KAAA,EAAgD;AAC5E,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,EAAA,IAAI,CAAC,OAAO,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAE7D,EAAA,MAAM,YAAA,GAAe,mBAAmB,KAAK,CAAA;AAE7C,EAAA,uBACEG,eAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,OAAO,KAAK,CAAA,CAAA;AAAA,MAClB,SAAA,EAAU,qGAAA;AAAA,MACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MAElC,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAACK,uBAAA,EAAA,EAAU,SAAA,EAAU,mCAAA,EAAoC,CAAA;AAAA,wBACzDL,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,EAAa;AAAA;AAAA;AAAA,GACtB;AAEJ;AASO,SAAS,eAAe,KAAA,EAAgD;AAC7E,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,EAAA,IAAI,CAAC,OAAO,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAE7D,EAAA,MAAM,MAAM,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,GAAI,KAAA,GAAQ,WAAW,KAAK,CAAA,CAAA;AAC/D,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAEzE,EAAA,uBACEG,eAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,GAAA;AAAA,MACN,MAAA,EAAO,QAAA;AAAA,MACP,GAAA,EAAI,qBAAA;AAAA,MACJ,SAAA,EAAU,yFAAA;AAAA,MACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MAElC,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAACM,uBAAA,EAAA,EAAU,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,wBAC1CN,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,aAAA,EAAc;AAAA;AAAA;AAAA,GAC5C;AAEJ;AAKO,SAAS,iBACd,KAAA,EACoB;AACpB,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,EAAA,IAAI,CAAC,OAAO,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAE7D,EAAA,uBACEG,eAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAO,QAAA;AAAA,MACP,GAAA,EAAI,qBAAA;AAAA,MACJ,SAAA,EAAU,iEAAA;AAAA,MACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MAElC,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAACO,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,wBAC9BP,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,QAAA,EAAA,UAAA,EAAQ;AAAA;AAAA;AAAA,GAC7C;AAEJ;AASO,SAAS,iBACd,KAAA,EACoB;AACpB,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,EAAA,IAAI,KAAA,IAAS,MAAM,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAEpE,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IAC/C,KAAA,EAAO,UAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GACxB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAEf,EAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CACb,QAAA,EAAA,SAAA,EACH,CAAA;AAEJ;AASO,SAAS,eAAe,KAAA,EAAgD;AAC7E,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,EAAA,IAAI,KAAA,IAAS,MAAM,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAEpE,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAK,CAAA,CAAE,cAAA,EAAe;AAE/C,EAAA,uBAAOA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAgC,QAAA,EAAA,SAAA,EAAU,CAAA;AACnE;AAaO,SAAS,aAAa,KAAA,EAA8C;AACzE,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,GAAS,QAAA,EAAS,GAAI,KAAA;AACrC,EAAA,IAAI,CAAC,OAAO,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAE7D,EAAA,MAAM,OAAO,KAAA,YAAiB,IAAA,GAAO,KAAA,GAAQ,IAAI,KAAK,KAAK,CAAA;AAE3D,EAAA,IAAI,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG;AACzB,IAAA,uBAAOA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAK,OAAA,EAAQ;AAC1C,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAA,GAAO,EAAA,GAAK,KAAK,EAAA,CAAG,CAAA;AAEpD,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,YAAA,GAAe,OAAA;AAAA,IACjB,CAAA,MAAA,IAAW,SAAS,CAAA,EAAG;AACrB,MAAA,YAAA,GAAe,WAAA;AAAA,IACjB,CAAA,MAAA,IAAW,OAAO,CAAA,EAAG;AACnB,MAAA,YAAA,GAAe,GAAG,IAAI,CAAA,SAAA,CAAA;AAAA,IACxB,CAAA,MAAA,IAAW,OAAO,EAAA,EAAI;AACpB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AACjC,MAAA,YAAA,GAAe,GAAG,KAAK,CAAA,KAAA,EAAQ,KAAA,GAAQ,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,IACrD,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AACrB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA;AACnC,MAAA,YAAA,GAAe,GAAG,MAAM,CAAA,MAAA,EAAS,MAAA,GAAS,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,GAAG,CAAA;AACnC,MAAA,YAAA,GAAe,GAAG,KAAK,CAAA,KAAA,EAAQ,KAAA,GAAQ,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,IACrD;AAEA,IAAA,uBAAOA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAyB,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,EAC/D;AAEA,EAAA,MAAM,WAAA,GACJ,MAAA,KAAW,OAAA,GACP,EAAE,KAAA,EAAO,WAAW,GAAA,EAAK,SAAA,EAAU,GACnC,MAAA,KAAW,MAAA,GACT,EAAE,OAAO,MAAA,EAAQ,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU,GACjD,EAAE,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAE1D,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,MAAMQ,UAAAA,GAAY,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS;AAAA,MACjD,KAAA,EAAO,OAAA;AAAA,MACP,GAAA,EAAK,SAAA;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,uBAAOR,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,UAAAQ,UAAAA,EAAU,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,WAAW,CAAA;AAE9D,EAAA,uBAAOR,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAmB,QAAA,EAAA,SAAA,EAAU,CAAA;AACtD;AASO,SAAS,gBACd,KAAA,EACoB;AACpB,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,EAAA,IAAI,KAAA,IAAS,MAAM,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAEpE,EAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAE5B,EAAA,uBACEG,eAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWF,oBAAA;AAAA,QACT,6EAAA;AAAA,QACA,SACI,sEAAA,GACA;AAAA,OACN;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,MAAA,mBACCD,cAAAA,CAACS,6BAAA,EAAA,EAAgB,SAAA,EAAU,SAAA,EAAU,oBAErCT,cAAAA,CAACU,uBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,QAEhC,SAAS,KAAA,GAAQ;AAAA;AAAA;AAAA,GACpB;AAEJ;AAcO,SAAS,gBACd,KAAA,EACoB;AACpB,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,KAAA;AACxB,EAAA,IAAI,CAAC,OAAO,uBAAOV,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAE7D,EAAA,MAAM,MAAA,GACJ,KAAA,CAAM,WAAA,IAAe,IAAA,GAChB,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,WAAW,CAAA,GACvC,IAAA,EAAM,OAAA,EAAS,MAAA,IAAU,IAAA,EAAM,MAAA;AAErC,EAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AAEvC,EAAA,uBACEG,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,UAAA,mBACCH,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,UAAA;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAU,yCAAA;AAAA,QACV,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,UAAA,MAAA,CAAO,MAAM,OAAA,GAAU,MAAA;AACvB,UAAA,MAAM,UAAU,MAAA,CAAO,kBAAA;AACvB,UAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,OAAA,GAAU,MAAA;AAAA,QACvC;AAAA;AAAA,KACF,GACE,IAAA;AAAA,oBACJA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,wJAAA;AAAA,QACV,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA,GAAa,SAAS,MAAA,EAAO;AAAA,QAE9C,sBAAY,KAAK;AAAA;AAAA,KACpB;AAAA,oBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAwB,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAChD,CAAA;AAEJ;AAgBO,SAAS,iBACd,KAAA,EACoB;AACpB,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,GAAW,gBAAA,EAAkB,GAAA,GAAM,KAAI,GAAI,KAAA;AAC1D,EAAA,IAAI,KAAA,IAAS,MAAM,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAEpE,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,GAAI,GAAA,GAAO,GAAG,CAAC,CAAA;AAEzE,EAAA,uBACEG,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,oBAAAH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,oBAAA,CAAG,oCAAA,EAAsC,QAAQ,CAAA;AAAA,QAC5D,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,UAAU,CAAA,CAAA,CAAA;AAAI;AAAA,KACnC,EACF,CAAA;AAAA,oBACAE,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,MAAE;AAAA,KAAA,EAC1B;AAAA,GAAA,EACF,CAAA;AAEJ;AASO,SAAS,aAAa,KAAA,EAAgD;AAC3E,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,EAAA,IAAI,CAAC,SAAS,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACzD,IAAA,uBAAOH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,EACnD;AAEA,EAAA,uBACEG,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAI,CAAC,GAAA,EAAa,0BACnCH,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,qIAAA;AAAA,QAET,QAAA,EAAA;AAAA,OAAA;AAAA,MAHI;AAAA,KAKR,CAAA;AAAA,IACA,MAAM,MAAA,GAAS,CAAA,oBACdG,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAC5C,MAAM,MAAA,GAAS;AAAA,KAAA,EACnB;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAMO,IAAM,0BAAA,GAA6BQ,UAAA;AAAA,EACxC,kBAAA;AAAA,EACA;AACF;AACO,IAAM,2BAAA,GAA8BA,UAAA;AAAA,EACzC,mBAAA;AAAA,EACA;AACF;AACO,IAAM,+BAAA,GAAkCA,UAAA;AAAA,EAC7C,uBAAA;AAAA,EACA;AACF;AACO,IAAM,qBAAA,GAAwBA,UAAA;AAAA,EACnC,aAAA;AAAA,EACA;AACF;AACO,IAAM,qBAAA,GAAwBA,UAAA;AAAA,EACnC,aAAA;AAAA,EACA;AACF;AACO,IAAM,wBAAA,GAA2BA,UAAA;AAAA,EACtC,gBAAA;AAAA,EACA;AACF;AACO,IAAM,sBAAA,GAAyBA,UAAA;AAAA,EACpC,cAAA;AAAA,EACA;AACF;AACO,IAAM,wBAAA,GAA2BA,UAAA;AAAA,EACtC,gBAAA;AAAA,EACA;AACF;AACO,IAAM,sBAAA,GAAyBA,UAAA;AAAA,EACpC,cAAA;AAAA,EACA;AACF;AACO,IAAM,oBAAA,GAAuBA,UAAA;AAAA,EAClC,YAAA;AAAA,EACA;AACF;AACO,IAAM,uBAAA,GAA0BA,UAAA;AAAA,EACrC,eAAA;AAAA,EACA;AACF;AACO,IAAM,uBAAA,GAA0BA,UAAA;AAAA,EACrC,eAAA;AAAA,EACA;AACF;AACO,IAAM,wBAAA,GAA2BA,UAAA;AAAA,EACtC,gBAAA;AAAA,EACA;AACF;AACO,IAAM,oBAAA,GAAuBA,UAAA;AAAA,EAClC,YAAA;AAAA,EACA;AACF;AAMO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,uBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAGA,0BAAA;AAAA,EACA,2BAAA;AAAA,EACA,+BAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,wBAAA;AAAA,EACA,sBAAA;AAAA,EACA,wBAAA;AAAA,EACA,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA,uBAAA;AAAA,EACA,uBAAA;AAAA,EACA,wBAAA;AAAA,EACA,oBAAA;AAAA;AAAA,EAGA;AACF","file":"ag-grid.cjs","sourcesContent":["import * as React from 'react';\nimport { AgGridReact, AgGridReactProps } from 'ag-grid-react';\nimport {\n ModuleRegistry,\n AllCommunityModule,\n type GridApi,\n type GridReadyEvent,\n type ColDef as AGColDef,\n type RowClickedEvent,\n type RowSelectionOptions,\n} from 'ag-grid-community';\nimport { cn } from '../../utils/cn';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type { BrandConfig } from '../../brands/types';\n\n// Register AG Grid Community modules\nModuleRegistry.registerModules([AllCommunityModule]);\n\n// ============================================================================\n// AG Grid Wrapper Styles\n// ============================================================================\n\nconst agGridVariants = cva('ag-theme-custom w-full', {\n variants: {\n /**\n * Visual variant of the grid\n */\n variant: {\n default: '',\n bordered:\n '[&_.ag-root-wrapper]:border [&_.ag-root-wrapper]:border-border [&_.ag-root-wrapper]:rounded-lg',\n striped: '[&_.ag-row-odd]:bg-muted/50',\n card: '[&_.ag-root-wrapper]:shadow-card [&_.ag-root-wrapper]:rounded-lg [&_.ag-root-wrapper]:border-0',\n },\n /**\n * Size/density of the grid rows\n */\n size: {\n xs: '[&_.ag-row]:h-7 [&_.ag-header-row]:h-7 text-xs [&_.ag-cell]:px-2',\n sm: '[&_.ag-row]:h-8 [&_.ag-header-row]:h-8 text-xs [&_.ag-cell]:px-3',\n md: '[&_.ag-row]:h-10 [&_.ag-header-row]:h-10 text-sm [&_.ag-cell]:px-4',\n lg: '[&_.ag-row]:h-12 [&_.ag-header-row]:h-12 text-base [&_.ag-cell]:px-4',\n xl: '[&_.ag-row]:h-14 [&_.ag-header-row]:h-14 text-base [&_.ag-cell]:px-6',\n },\n /**\n * Brand theme variant\n */\n brand: {\n default: '',\n mieweb: 'ag-brand-mieweb',\n bluehive: 'ag-brand-bluehive',\n waggleline: 'ag-brand-waggleline',\n webchart: 'ag-brand-webchart',\n 'enterprise-health': 'ag-brand-enterprise-health',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n brand: 'default',\n },\n});\n\n// ============================================================================\n// AG Grid Component Types\n// ============================================================================\n\nexport interface AGGridProps<TData = unknown>\n extends\n Omit<AgGridReactProps<TData>, 'className' | 'rowSelection'>,\n VariantProps<typeof agGridVariants> {\n /** Additional CSS classes for the grid container */\n className?: string;\n /** Height of the grid container */\n height?: string | number;\n /** Loading state */\n loading?: boolean;\n /** Callback when a row is clicked */\n onRowClick?: (event: RowClickedEvent<TData>) => void;\n /** Reference to access the grid API */\n gridRef?: React.RefObject<AgGridReact<TData> | null>;\n /** Row selection configuration (v35+ object format or legacy string) */\n rowSelection?: RowSelectionOptions | 'single' | 'multiple';\n /** Brand configuration for theming */\n brandConfig?: BrandConfig;\n /** Show pagination controls */\n pagination?: boolean;\n /** Enable column resizing */\n resizable?: boolean;\n /** Enable sorting */\n sortable?: boolean;\n /** Enable filtering */\n filterable?: boolean;\n /** Custom empty state message */\n noDataMessage?: string;\n /** Custom loading message */\n loadingMessage?: string;\n}\n\n// ============================================================================\n// Default Column Definitions\n// ============================================================================\n\n// Size to pixel height mapping for AG Grid (row heights + default container heights)\nconst sizeToRowHeight: Record<\n string,\n { rowHeight: number; headerHeight: number; containerHeight: number }\n> = {\n xs: { rowHeight: 28, headerHeight: 28, containerHeight: 280 },\n sm: { rowHeight: 32, headerHeight: 32, containerHeight: 320 },\n md: { rowHeight: 40, headerHeight: 40, containerHeight: 400 },\n lg: { rowHeight: 48, headerHeight: 48, containerHeight: 480 },\n xl: { rowHeight: 56, headerHeight: 56, containerHeight: 560 },\n};\n\n// Enhanced default column definitions with brand awareness\nconst getDefaultColDef = (\n sortable: boolean,\n filterable: boolean,\n resizable: boolean\n): AGColDef => ({\n sortable,\n filter: filterable,\n resizable,\n minWidth: 100,\n flex: 1,\n suppressMovable: false,\n headerClass: 'ag-header-cell-custom',\n cellClass: 'ag-cell-custom',\n});\n\n// ============================================================================\n// AG Grid Component\n// ============================================================================\n\n/**\n * A themed AG Grid wrapper component that integrates with the MIE Web UI design system.\n *\n * This component wraps AG Grid Community Edition and provides:\n * - Consistent theming with CSS variables\n * - Size variants (sm, md, lg)\n * - Visual variants (default, bordered, striped)\n * - Loading states\n * - Simplified API while maintaining full AG Grid capabilities\n *\n * @example\n * ```tsx\n * const columnDefs = [\n * { field: 'name', headerName: 'Name' },\n * { field: 'email', headerName: 'Email' },\n * { field: 'status', headerName: 'Status' },\n * ];\n *\n * const rowData = [\n * { name: 'John Doe', email: 'john@example.com', status: 'Active' },\n * { name: 'Jane Smith', email: 'jane@example.com', status: 'Pending' },\n * ];\n *\n * <AGGrid\n * columnDefs={columnDefs}\n * rowData={rowData}\n * variant=\"bordered\"\n * size=\"md\"\n * />\n * ```\n */\nfunction AGGridInner<TData = unknown>(\n {\n className,\n variant,\n size,\n brand,\n height,\n loading = false,\n columnDefs,\n rowData,\n defaultColDef: userDefaultColDef,\n onGridReady,\n onRowClick,\n gridRef,\n rowSelection,\n brandConfig,\n pagination = false,\n resizable = true,\n sortable = true,\n filterable = true,\n noDataMessage = 'No data to display',\n loadingMessage = 'Loading...',\n ...props\n }: AGGridProps<TData>,\n ref: React.ForwardedRef<AgGridReact<TData>>\n) {\n const internalRef = React.useRef<AgGridReact<TData>>(null);\n const gridApiRef = React.useRef<GridApi<TData> | null>(null);\n\n // Use provided ref or internal ref\n const resolvedRef = gridRef || ref || internalRef;\n\n // Handle grid ready\n const handleGridReady = React.useCallback(\n (event: GridReadyEvent<TData>) => {\n gridApiRef.current = event.api;\n onGridReady?.(event);\n },\n [onGridReady]\n );\n\n // Handle row click\n const handleRowClicked = React.useCallback(\n (event: RowClickedEvent<TData>) => {\n onRowClick?.(event);\n },\n [onRowClick]\n );\n\n // Merge default column definitions with feature toggles\n const mergedDefaultColDef = React.useMemo(\n () =>\n ({\n ...getDefaultColDef(sortable, filterable, resizable),\n ...userDefaultColDef,\n }) as AGColDef<TData>,\n [userDefaultColDef, sortable, filterable, resizable]\n );\n\n // Convert legacy rowSelection string to v35+ object format\n const resolvedRowSelection = React.useMemo(():\n | RowSelectionOptions\n | undefined => {\n if (!rowSelection) return undefined;\n\n // If already in object format, use as-is\n if (typeof rowSelection === 'object') {\n return rowSelection;\n }\n\n // Convert legacy string format to v35+ object format\n if (rowSelection === 'multiple') {\n return {\n mode: 'multiRow',\n enableClickSelection: true,\n };\n }\n\n if (rowSelection === 'single') {\n return {\n mode: 'singleRow',\n enableClickSelection: true,\n };\n }\n\n return undefined;\n }, [rowSelection]);\n\n // Show loading overlay when loading prop changes\n React.useEffect(() => {\n if (gridApiRef.current) {\n if (loading) {\n gridApiRef.current.showLoadingOverlay();\n } else {\n gridApiRef.current.hideOverlay();\n }\n }\n }, [loading]);\n\n // Get row/header heights based on size prop\n const sizeConfig = sizeToRowHeight[size || 'md'];\n\n // Use provided height or default based on size\n const resolvedHeight = height ?? sizeConfig.containerHeight;\n\n return (\n <div\n className={cn(agGridVariants({ variant, size, brand }), className)}\n style={{\n height:\n typeof resolvedHeight === 'number'\n ? `${resolvedHeight}px`\n : resolvedHeight,\n ...(brandConfig &&\n ({\n '--ag-primary-color': brandConfig.colors.primary[600],\n '--ag-font-family':\n brandConfig.typography.fontFamily.sans.join(', '),\n } as React.CSSProperties)),\n }}\n data-brand={brand}\n >\n <AgGridReact<TData>\n ref={resolvedRef as React.RefObject<AgGridReact<TData>>}\n columnDefs={columnDefs}\n rowData={rowData}\n defaultColDef={mergedDefaultColDef}\n onGridReady={handleGridReady}\n onRowClicked={handleRowClicked}\n animateRows={true}\n enableBrowserTooltips={true}\n rowSelection={resolvedRowSelection}\n pagination={pagination}\n paginationPageSize={pagination ? 50 : undefined}\n paginationPageSizeSelector={pagination ? [25, 50, 100, 200] : undefined}\n rowHeight={sizeConfig.rowHeight}\n headerHeight={sizeConfig.headerHeight}\n noRowsOverlayComponent={() => (\n <div className=\"text-muted-foreground py-8 text-center\">\n {noDataMessage}\n </div>\n )}\n loadingOverlayComponent={() => (\n <div className=\"text-muted-foreground py-8 text-center\">\n {loadingMessage}\n </div>\n )}\n theme=\"legacy\"\n {...props}\n />\n </div>\n );\n}\n\n// Forward ref with generic support\nexport const AGGrid = React.forwardRef(AGGridInner) as <TData = unknown>(\n props: AGGridProps<TData> & { ref?: React.ForwardedRef<AgGridReact<TData>> }\n) => React.ReactElement;\n\n// Display name for debugging\n(AGGrid as React.FC).displayName = 'AGGrid';\n\n// ============================================================================\n// Re-export AG Grid types for convenience\n// ============================================================================\n\n// Export ColDef with the original name for external use\nexport type { ColDef as AGColDef } from 'ag-grid-community';\n\n// Also export as ColDef for convenience\nexport type ColDef<TData = unknown, TValue = unknown> = AGColDef<TData, TValue>;\n\nexport type {\n GridApi,\n GridReadyEvent,\n RowClickedEvent,\n CellClickedEvent,\n CellValueChangedEvent,\n SelectionChangedEvent,\n FilterChangedEvent,\n SortChangedEvent,\n RowSelectedEvent,\n FirstDataRenderedEvent,\n} from 'ag-grid-community';\n\nexport { AgGridReact } from 'ag-grid-react';\n","/**\n * AG Grid Cell Renderers\n *\n * Rich, visually appealing cell renderers for AG Grid tables.\n * Based on Waggleline's production-tested implementations with\n * full dark mode support and design system integration.\n *\n * All renderers are memoized with React.memo for performance optimization.\n */\n\nimport * as React from 'react';\nimport { memo } from 'react';\nimport type { ICellRendererParams } from 'ag-grid-community';\nimport { cn } from '../../utils/cn';\nimport {\n MailIcon,\n PhoneIcon,\n GlobeIcon,\n CheckCircleIcon,\n ClockIcon,\n} from '../Icons';\nimport { Linkedin } from 'lucide-react';\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get a nested value from an object using dot notation (e.g., 'company.domain')\n */\nfunction getNestedValue(\n obj: Record<string, unknown> | undefined | null,\n path: string\n): unknown {\n if (!obj || !path) return undefined;\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current === 'object') {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\n/**\n * Get favicon URL from a domain using Google's favicon service\n */\nfunction getFaviconUrl(domain: string | null | undefined): string | null {\n if (!domain || typeof domain !== 'string') return null;\n const cleanDomain = domain\n .replace(/^https?:\\/\\//, '')\n .replace(/\\/.*$/, '')\n .trim();\n if (!cleanDomain) return null;\n return `https://www.google.com/s2/favicons?domain=${cleanDomain}&sz=64`;\n}\n\n/**\n * Format a phone number with dashes for display\n */\nexport function formatPhoneDisplay(phone: string | null | undefined): string {\n if (!phone) return '';\n const cleaned = phone.replace(/\\D/g, '');\n if (cleaned.length === 10) {\n return `${cleaned.slice(0, 3)}-${cleaned.slice(3, 6)}-${cleaned.slice(6)}`;\n }\n if (cleaned.length === 11 && cleaned.startsWith('1')) {\n return `${cleaned[0]}-${cleaned.slice(1, 4)}-${cleaned.slice(4, 7)}-${cleaned.slice(7)}`;\n }\n return phone;\n}\n\n/**\n * Generate initials from a name\n */\nfunction getInitials(name: string): string {\n if (!name || typeof name !== 'string') return '??';\n const parts = name.split(' ').filter(Boolean);\n if (parts.length >= 2) {\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n return name.substring(0, 2).toUpperCase();\n}\n\n/**\n * Generate a consistent avatar color based on a name\n */\nfunction getAvatarColor(name: string): string {\n const colors = [\n 'bg-primary-600',\n 'bg-green-600',\n 'bg-orange-600',\n 'bg-secondary-600',\n 'bg-pink-600',\n 'bg-primary-700',\n 'bg-teal-600',\n 'bg-amber-600',\n ];\n if (!name || typeof name !== 'string') return colors[0];\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n}\n\n/**\n * Custom comparison function for AG Grid cell renderers.\n */\nfunction cellRendererPropsAreEqual(\n prevProps: ICellRendererParams,\n nextProps: ICellRendererParams\n): boolean {\n if (prevProps.value !== nextProps.value) return false;\n if (prevProps.data !== nextProps.data) return false;\n if (prevProps.node?.rowIndex !== nextProps.node?.rowIndex) return false;\n return true;\n}\n\n// =============================================================================\n// Status Configuration Types\n// =============================================================================\n\nexport interface StatusConfig {\n label: string;\n bgClass: string;\n textClass: string;\n iconName?: string;\n}\n\n// =============================================================================\n// Default Status Colors\n// =============================================================================\n\nexport const statusColors: Record<string, StatusConfig> = {\n active: {\n label: 'Active',\n bgClass: 'bg-green-100 dark:bg-green-900/30',\n textClass: 'text-green-600 dark:text-green-400',\n },\n inactive: {\n label: 'Inactive',\n bgClass: 'bg-gray-200 dark:bg-gray-700',\n textClass: 'text-gray-600 dark:text-gray-400',\n },\n pending: {\n label: 'Pending',\n bgClass: 'bg-amber-100 dark:bg-amber-900/30',\n textClass: 'text-amber-600 dark:text-amber-400',\n },\n new: {\n label: 'New',\n bgClass: 'bg-primary-100 dark:bg-primary-900/30',\n textClass: 'text-primary-600 dark:text-primary-400',\n },\n verified: {\n label: 'Verified',\n bgClass: 'bg-green-100 dark:bg-green-900/30',\n textClass: 'text-green-600 dark:text-green-400',\n },\n flagged: {\n label: 'Flagged',\n bgClass: 'bg-red-100 dark:bg-red-900/30',\n textClass: 'text-red-600 dark:text-red-400',\n },\n};\n\n// =============================================================================\n// Avatar Name Renderer\n// =============================================================================\n\ninterface AvatarNameRendererProps extends ICellRendererParams {\n avatarField?: string;\n domainField?: string;\n}\n\n/**\n * Renders an avatar with name, suitable for contact/owner columns\n */\nexport function AvatarNameRenderer(\n props: AvatarNameRendererProps\n): React.ReactElement {\n const { data, value } = props;\n if (!data && !value) return <span className=\"text-muted-foreground\">--</span>;\n\n const displayName = typeof value === 'string' && value ? value : 'Unknown';\n const isSystemValue = ['Unknown', 'Unassigned', 'System'].includes(\n displayName\n );\n\n const avatarUrl =\n props.avatarField && data\n ? (getNestedValue(data, props.avatarField) as string | undefined)\n : data?.avatarUrl;\n\n const domain =\n props.domainField && data\n ? (getNestedValue(data, props.domainField) as string | undefined)\n : data?.company?.domain || data?.domain;\n\n const faviconUrl = getFaviconUrl(domain);\n const initials = getInitials(displayName);\n const imageUrl = avatarUrl || faviconUrl;\n\n if (isSystemValue) {\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"flex h-7 w-7 items-center justify-center rounded-full bg-gray-200 text-xs font-semibold text-gray-400 dark:bg-gray-700 dark:text-gray-500\">\n {displayName === 'Unassigned' ? '—' : '??'}\n </div>\n <span className=\"truncate text-gray-400 italic dark:text-gray-500\">\n {displayName}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={displayName}\n className=\"h-7 w-7 rounded-full bg-white object-cover ring-2 ring-white dark:ring-gray-700\"\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = 'none';\n const sibling = target.nextElementSibling as HTMLElement;\n if (sibling) sibling.style.display = 'flex';\n }}\n />\n ) : null}\n <div\n className={cn(\n 'flex h-7 w-7 items-center justify-center rounded-full text-xs font-semibold text-white',\n getAvatarColor(displayName)\n )}\n style={{ display: imageUrl ? 'none' : 'flex' }}\n >\n {initials}\n </div>\n <span className=\"text-foreground truncate font-medium\">\n {displayName}\n </span>\n </div>\n );\n}\n\n// =============================================================================\n// Status Badge Renderer\n// =============================================================================\n\nexport interface StatusBadgeRendererProps extends ICellRendererParams {\n /** Custom status color configuration */\n statusConfig?: Record<string, StatusConfig>;\n}\n\n/**\n * Renders a colorful status badge\n */\nexport function StatusBadgeRenderer(\n props: StatusBadgeRendererProps\n): React.ReactElement {\n const { value, statusConfig = statusColors } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const normalizedValue = String(value).toLowerCase().replace(/\\s+/g, '_');\n const config = statusConfig[normalizedValue] || {\n label: value,\n bgClass: 'bg-gray-200 dark:bg-gray-700',\n textClass: 'text-gray-600 dark:text-gray-400',\n };\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n config.bgClass,\n config.textClass\n )}\n >\n {config.label}\n </span>\n );\n}\n\n// =============================================================================\n// Engagement Score Renderer\n// =============================================================================\n\n/**\n * Get engagement score colors based on threshold\n */\nfunction getEngagementScoreColors(score: number): {\n barColor: string;\n textColor: string;\n} {\n if (score >= 70)\n return {\n barColor: 'bg-green-500',\n textColor: 'text-green-600 dark:text-green-400',\n };\n if (score >= 40)\n return {\n barColor: 'bg-amber-500',\n textColor: 'text-amber-600 dark:text-amber-400',\n };\n if (score >= 20)\n return {\n barColor: 'bg-orange-500',\n textColor: 'text-orange-600 dark:text-orange-400',\n };\n return {\n barColor: 'bg-gray-400',\n textColor: 'text-gray-600 dark:text-gray-400',\n };\n}\n\n/**\n * Renders engagement score with color-coded progress bar\n */\nexport function EngagementScoreRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const score = Number(value);\n const percentage = Math.min(100, Math.max(0, score));\n const { barColor, textColor } = getEngagementScoreColors(score);\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"h-1.5 w-16 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={cn('h-full rounded-full transition-all', barColor)}\n style={{ width: `${percentage}%` }}\n />\n </div>\n <span className={cn('text-sm font-medium', textColor)}>{score}</span>\n </div>\n );\n}\n\n// =============================================================================\n// Email Renderer\n// =============================================================================\n\n/**\n * Renders email with mailto link\n */\nexport function EmailRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n return (\n <a\n href={`mailto:${value}`}\n className=\"text-primary-600 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <MailIcon className=\"h-3 w-3 opacity-60\" />\n <span className=\"truncate\">{value}</span>\n </a>\n );\n}\n\n// =============================================================================\n// Phone Renderer\n// =============================================================================\n\n/**\n * Renders phone with click-to-call\n */\nexport function PhoneRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const displayValue = formatPhoneDisplay(value);\n\n return (\n <a\n href={`tel:${value}`}\n className=\"text-foreground hover:text-primary-600 dark:hover:text-primary-400 inline-flex items-center gap-1.5\"\n onClick={(e) => e.stopPropagation()}\n >\n <PhoneIcon className=\"h-3 w-3 text-green-500 opacity-70\" />\n <span>{displayValue}</span>\n </a>\n );\n}\n\n// =============================================================================\n// Link Renderers\n// =============================================================================\n\n/**\n * Renders a domain/website URL with icon\n */\nexport function DomainRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const url = value.startsWith('http') ? value : `https://${value}`;\n const displayDomain = value.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-600 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <GlobeIcon className=\"h-3 w-3 opacity-60\" />\n <span className=\"truncate\">{displayDomain}</span>\n </a>\n );\n}\n\n/**\n * Renders a LinkedIn URL with icon\n */\nexport function LinkedInRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n return (\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-[#0A66C2] hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <Linkedin className=\"h-4 w-4\" />\n <span className=\"truncate text-sm\">LinkedIn</span>\n </a>\n );\n}\n\n// =============================================================================\n// Currency Renderer\n// =============================================================================\n\n/**\n * Renders currency with proper formatting\n */\nexport function CurrencyRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const formatted = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n\n return (\n <span className=\"text-foreground font-medium tabular-nums\">\n {formatted}\n </span>\n );\n}\n\n// =============================================================================\n// Number Renderer\n// =============================================================================\n\n/**\n * Renders number with comma formatting\n */\nexport function NumberRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const formatted = Number(value).toLocaleString();\n\n return <span className=\"text-foreground tabular-nums\">{formatted}</span>;\n}\n\n// =============================================================================\n// Date Renderer\n// =============================================================================\n\nexport interface DateRendererProps extends ICellRendererParams {\n format?: 'short' | 'medium' | 'long' | 'relative' | 'datetime';\n}\n\n/**\n * Renders date with formatting options\n */\nexport function DateRenderer(props: DateRendererProps): React.ReactElement {\n const { value, format = 'medium' } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const date = value instanceof Date ? value : new Date(value);\n\n if (isNaN(date.getTime())) {\n return <span className=\"text-muted-foreground\">--</span>;\n }\n\n if (format === 'relative') {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n let relativeText: string;\n if (days === 0) {\n relativeText = 'Today';\n } else if (days === 1) {\n relativeText = 'Yesterday';\n } else if (days < 7) {\n relativeText = `${days} days ago`;\n } else if (days < 30) {\n const weeks = Math.floor(days / 7);\n relativeText = `${weeks} week${weeks > 1 ? 's' : ''} ago`;\n } else if (days < 365) {\n const months = Math.floor(days / 30);\n relativeText = `${months} month${months > 1 ? 's' : ''} ago`;\n } else {\n const years = Math.floor(days / 365);\n relativeText = `${years} year${years > 1 ? 's' : ''} ago`;\n }\n\n return <span className=\"text-muted-foreground\">{relativeText}</span>;\n }\n\n const dateOptions: Intl.DateTimeFormatOptions =\n format === 'short'\n ? { month: 'numeric', day: 'numeric' }\n : format === 'long'\n ? { month: 'long', day: 'numeric', year: 'numeric' }\n : { month: 'short', day: 'numeric', year: 'numeric' };\n\n if (format === 'datetime') {\n const formatted = date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n return <span className=\"text-foreground\">{formatted}</span>;\n }\n\n const formatted = date.toLocaleDateString('en-US', dateOptions);\n\n return <span className=\"text-foreground\">{formatted}</span>;\n}\n\n// =============================================================================\n// Boolean/Yes-No Renderer\n// =============================================================================\n\n/**\n * Renders boolean as styled Yes/No badge\n */\nexport function BooleanRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const isTrue = Boolean(value);\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n isTrue\n ? 'bg-green-100 text-green-600 dark:bg-green-900/30 dark:text-green-400'\n : 'bg-gray-200 text-gray-600 dark:bg-gray-700 dark:text-gray-400'\n )}\n >\n {isTrue ? (\n <CheckCircleIcon className=\"h-3 w-3\" />\n ) : (\n <ClockIcon className=\"h-3 w-3\" />\n )}\n {isTrue ? 'Yes' : 'No'}\n </span>\n );\n}\n\n// =============================================================================\n// Company Renderer\n// =============================================================================\n\ninterface CompanyRendererProps extends ICellRendererParams {\n companyIdField?: string;\n domainField?: string;\n}\n\n/**\n * Renders company name with favicon\n */\nexport function CompanyRenderer(\n props: CompanyRendererProps\n): React.ReactElement {\n const { data, value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const domain =\n props.domainField && data\n ? (getNestedValue(data, props.domainField) as string | undefined)\n : data?.company?.domain || data?.domain;\n\n const faviconUrl = getFaviconUrl(domain);\n\n return (\n <div className=\"flex items-center gap-2 py-0.5\">\n {faviconUrl ? (\n <img\n src={faviconUrl}\n alt={value}\n className=\"h-5 w-5 rounded bg-white object-contain\"\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = 'none';\n const sibling = target.nextElementSibling as HTMLElement;\n if (sibling) sibling.style.display = 'flex';\n }}\n />\n ) : null}\n <div\n className=\"bg-primary-100 text-primary-600 dark:bg-primary-900/30 dark:text-primary-400 flex h-5 w-5 items-center justify-center rounded text-[9px] font-semibold\"\n style={{ display: faviconUrl ? 'none' : 'flex' }}\n >\n {getInitials(value)}\n </div>\n <span className=\"truncate font-medium\">{value}</span>\n </div>\n );\n}\n\n// =============================================================================\n// Progress Renderer\n// =============================================================================\n\nexport interface ProgressRendererProps extends ICellRendererParams {\n /** Color of the progress bar */\n barColor?: string;\n /** Maximum value (default 100) */\n max?: number;\n}\n\n/**\n * Renders a progress bar\n */\nexport function ProgressRenderer(\n props: ProgressRendererProps\n): React.ReactElement {\n const { value, barColor = 'bg-primary-500', max = 100 } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const percentage = Math.min(100, Math.max(0, (Number(value) / max) * 100));\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"h-2 w-20 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={cn('h-full rounded-full transition-all', barColor)}\n style={{ width: `${percentage}%` }}\n />\n </div>\n <span className=\"text-muted-foreground text-xs font-medium\">\n {Math.round(percentage)}%\n </span>\n </div>\n );\n}\n\n// =============================================================================\n// Tags Renderer\n// =============================================================================\n\n/**\n * Renders an array of tags as badges\n */\nexport function TagsRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value || !Array.isArray(value) || value.length === 0) {\n return <span className=\"text-muted-foreground\">--</span>;\n }\n\n return (\n <div className=\"flex flex-wrap gap-1\">\n {value.slice(0, 3).map((tag: string, index: number) => (\n <span\n key={index}\n className=\"inline-flex items-center rounded-full bg-gray-100 px-2 py-0.5 text-xs font-medium text-gray-600 dark:bg-gray-800 dark:text-gray-400\"\n >\n {tag}\n </span>\n ))}\n {value.length > 3 && (\n <span className=\"text-muted-foreground text-xs\">\n +{value.length - 3}\n </span>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// Memoized Renderer Exports (for performance)\n// =============================================================================\n\nexport const MemoizedAvatarNameRenderer = memo(\n AvatarNameRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedStatusBadgeRenderer = memo(\n StatusBadgeRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedEngagementScoreRenderer = memo(\n EngagementScoreRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedEmailRenderer = memo(\n EmailRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedPhoneRenderer = memo(\n PhoneRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedLinkedInRenderer = memo(\n LinkedInRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedDomainRenderer = memo(\n DomainRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedCurrencyRenderer = memo(\n CurrencyRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedNumberRenderer = memo(\n NumberRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedDateRenderer = memo(\n DateRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedBooleanRenderer = memo(\n BooleanRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedCompanyRenderer = memo(\n CompanyRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedProgressRenderer = memo(\n ProgressRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedTagsRenderer = memo(\n TagsRenderer,\n cellRendererPropsAreEqual\n);\n\n// =============================================================================\n// Default Export\n// =============================================================================\n\nexport const CellRenderers = {\n // Original renderers\n AvatarNameRenderer,\n StatusBadgeRenderer,\n EngagementScoreRenderer,\n EmailRenderer,\n PhoneRenderer,\n LinkedInRenderer,\n DomainRenderer,\n CurrencyRenderer,\n NumberRenderer,\n DateRenderer,\n BooleanRenderer,\n CompanyRenderer,\n ProgressRenderer,\n TagsRenderer,\n\n // Memoized renderers (recommended for performance)\n MemoizedAvatarNameRenderer,\n MemoizedStatusBadgeRenderer,\n MemoizedEngagementScoreRenderer,\n MemoizedEmailRenderer,\n MemoizedPhoneRenderer,\n MemoizedLinkedInRenderer,\n MemoizedDomainRenderer,\n MemoizedCurrencyRenderer,\n MemoizedNumberRenderer,\n MemoizedDateRenderer,\n MemoizedBooleanRenderer,\n MemoizedCompanyRenderer,\n MemoizedProgressRenderer,\n MemoizedTagsRenderer,\n\n // Utility functions\n formatPhoneDisplay,\n};\n\nexport default CellRenderers;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/AGGrid/AGGrid.tsx","../src/components/AGGrid/CellRenderers.tsx"],"names":["ModuleRegistry","AllCommunityModule","cva","React","jsx","cn","AgGridReact","jsxs","Mail","Phone","Globe","Linkedin","formatted","CheckCircle","Clock","memo"],"mappings":"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","file":"ag-grid.cjs","sourcesContent":["import * as React from 'react';\nimport { AgGridReact, AgGridReactProps } from 'ag-grid-react';\nimport {\n ModuleRegistry,\n AllCommunityModule,\n type GridApi,\n type GridReadyEvent,\n type ColDef as AGColDef,\n type RowClickedEvent,\n type RowSelectionOptions,\n} from 'ag-grid-community';\nimport { cn } from '../../utils/cn';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type { BrandConfig } from '../../brands/types';\n\n// Register AG Grid Community modules\nModuleRegistry.registerModules([AllCommunityModule]);\n\n// ============================================================================\n// AG Grid Wrapper Styles\n// ============================================================================\n\nconst agGridVariants = cva('ag-theme-custom w-full', {\n variants: {\n /**\n * Visual variant of the grid\n */\n variant: {\n default: '',\n bordered:\n '[&_.ag-root-wrapper]:border [&_.ag-root-wrapper]:border-border [&_.ag-root-wrapper]:rounded-lg',\n striped: '[&_.ag-row-odd]:bg-muted/50',\n card: '[&_.ag-root-wrapper]:shadow-card [&_.ag-root-wrapper]:rounded-lg [&_.ag-root-wrapper]:border-0',\n },\n /**\n * Size/density of the grid rows\n */\n size: {\n xs: '[&_.ag-row]:h-7 [&_.ag-header-row]:h-7 text-xs [&_.ag-cell]:px-2',\n sm: '[&_.ag-row]:h-8 [&_.ag-header-row]:h-8 text-xs [&_.ag-cell]:px-3',\n md: '[&_.ag-row]:h-10 [&_.ag-header-row]:h-10 text-sm [&_.ag-cell]:px-4',\n lg: '[&_.ag-row]:h-12 [&_.ag-header-row]:h-12 text-base [&_.ag-cell]:px-4',\n xl: '[&_.ag-row]:h-14 [&_.ag-header-row]:h-14 text-base [&_.ag-cell]:px-6',\n },\n /**\n * Brand theme variant\n */\n brand: {\n default: '',\n mieweb: 'ag-brand-mieweb',\n bluehive: 'ag-brand-bluehive',\n waggleline: 'ag-brand-waggleline',\n webchart: 'ag-brand-webchart',\n 'enterprise-health': 'ag-brand-enterprise-health',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n brand: 'default',\n },\n});\n\n// ============================================================================\n// AG Grid Component Types\n// ============================================================================\n\nexport interface AGGridProps<TData = unknown>\n extends\n Omit<AgGridReactProps<TData>, 'className' | 'rowSelection'>,\n VariantProps<typeof agGridVariants> {\n /** Additional CSS classes for the grid container */\n className?: string;\n /** Height of the grid container */\n height?: string | number;\n /** Loading state */\n loading?: boolean;\n /** Callback when a row is clicked */\n onRowClick?: (event: RowClickedEvent<TData>) => void;\n /** Reference to access the grid API */\n gridRef?: React.RefObject<AgGridReact<TData> | null>;\n /** Row selection configuration (v35+ object format or legacy string) */\n rowSelection?: RowSelectionOptions | 'single' | 'multiple';\n /** Brand configuration for theming */\n brandConfig?: BrandConfig;\n /** Show pagination controls */\n pagination?: boolean;\n /** Enable column resizing */\n resizable?: boolean;\n /** Enable sorting */\n sortable?: boolean;\n /** Enable filtering */\n filterable?: boolean;\n /** Custom empty state message */\n noDataMessage?: string;\n /** Custom loading message */\n loadingMessage?: string;\n}\n\n// ============================================================================\n// Default Column Definitions\n// ============================================================================\n\n// Size to pixel height mapping for AG Grid (row heights + default container heights)\nconst sizeToRowHeight: Record<\n string,\n { rowHeight: number; headerHeight: number; containerHeight: number }\n> = {\n xs: { rowHeight: 28, headerHeight: 28, containerHeight: 280 },\n sm: { rowHeight: 32, headerHeight: 32, containerHeight: 320 },\n md: { rowHeight: 40, headerHeight: 40, containerHeight: 400 },\n lg: { rowHeight: 48, headerHeight: 48, containerHeight: 480 },\n xl: { rowHeight: 56, headerHeight: 56, containerHeight: 560 },\n};\n\n// Enhanced default column definitions with brand awareness\nconst getDefaultColDef = (\n sortable: boolean,\n filterable: boolean,\n resizable: boolean\n): AGColDef => ({\n sortable,\n filter: filterable,\n resizable,\n minWidth: 100,\n flex: 1,\n suppressMovable: false,\n headerClass: 'ag-header-cell-custom',\n cellClass: 'ag-cell-custom',\n});\n\n// ============================================================================\n// AG Grid Component\n// ============================================================================\n\n/**\n * A themed AG Grid wrapper component that integrates with the MIE Web UI design system.\n *\n * This component wraps AG Grid Community Edition and provides:\n * - Consistent theming with CSS variables\n * - Size variants (sm, md, lg)\n * - Visual variants (default, bordered, striped)\n * - Loading states\n * - Simplified API while maintaining full AG Grid capabilities\n *\n * @example\n * ```tsx\n * const columnDefs = [\n * { field: 'name', headerName: 'Name' },\n * { field: 'email', headerName: 'Email' },\n * { field: 'status', headerName: 'Status' },\n * ];\n *\n * const rowData = [\n * { name: 'John Doe', email: 'john@example.com', status: 'Active' },\n * { name: 'Jane Smith', email: 'jane@example.com', status: 'Pending' },\n * ];\n *\n * <AGGrid\n * columnDefs={columnDefs}\n * rowData={rowData}\n * variant=\"bordered\"\n * size=\"md\"\n * />\n * ```\n */\nfunction AGGridInner<TData = unknown>(\n {\n className,\n variant,\n size,\n brand,\n height,\n loading = false,\n columnDefs,\n rowData,\n defaultColDef: userDefaultColDef,\n onGridReady,\n onRowClick,\n gridRef,\n rowSelection,\n brandConfig,\n pagination = false,\n resizable = true,\n sortable = true,\n filterable = true,\n noDataMessage = 'No data to display',\n loadingMessage = 'Loading...',\n ...props\n }: AGGridProps<TData>,\n ref: React.ForwardedRef<AgGridReact<TData>>\n) {\n const internalRef = React.useRef<AgGridReact<TData>>(null);\n const gridApiRef = React.useRef<GridApi<TData> | null>(null);\n\n // Use provided ref or internal ref\n const resolvedRef = gridRef || ref || internalRef;\n\n // Handle grid ready\n const handleGridReady = React.useCallback(\n (event: GridReadyEvent<TData>) => {\n gridApiRef.current = event.api;\n onGridReady?.(event);\n },\n [onGridReady]\n );\n\n // Handle row click\n const handleRowClicked = React.useCallback(\n (event: RowClickedEvent<TData>) => {\n onRowClick?.(event);\n },\n [onRowClick]\n );\n\n // Merge default column definitions with feature toggles\n const mergedDefaultColDef = React.useMemo(\n () =>\n ({\n ...getDefaultColDef(sortable, filterable, resizable),\n ...userDefaultColDef,\n }) as AGColDef<TData>,\n [userDefaultColDef, sortable, filterable, resizable]\n );\n\n // Convert legacy rowSelection string to v35+ object format\n const resolvedRowSelection = React.useMemo(():\n | RowSelectionOptions\n | undefined => {\n if (!rowSelection) return undefined;\n\n // If already in object format, use as-is\n if (typeof rowSelection === 'object') {\n return rowSelection;\n }\n\n // Convert legacy string format to v35+ object format\n if (rowSelection === 'multiple') {\n return {\n mode: 'multiRow',\n enableClickSelection: true,\n };\n }\n\n if (rowSelection === 'single') {\n return {\n mode: 'singleRow',\n enableClickSelection: true,\n };\n }\n\n return undefined;\n }, [rowSelection]);\n\n // Show loading overlay when loading prop changes\n React.useEffect(() => {\n if (gridApiRef.current) {\n if (loading) {\n gridApiRef.current.showLoadingOverlay();\n } else {\n gridApiRef.current.hideOverlay();\n }\n }\n }, [loading]);\n\n // Get row/header heights based on size prop\n const sizeConfig = sizeToRowHeight[size || 'md'];\n\n // Use provided height or default based on size\n const resolvedHeight = height ?? sizeConfig.containerHeight;\n\n return (\n <div\n data-slot=\"ag-grid\"\n className={cn(agGridVariants({ variant, size, brand }), className)}\n style={{\n height:\n typeof resolvedHeight === 'number'\n ? `${resolvedHeight}px`\n : resolvedHeight,\n ...(brandConfig &&\n ({\n '--ag-primary-color': brandConfig.colors.primary[600],\n '--ag-font-family':\n brandConfig.typography.fontFamily.sans.join(', '),\n } as React.CSSProperties)),\n }}\n data-brand={brand}\n >\n <AgGridReact<TData>\n ref={resolvedRef as React.RefObject<AgGridReact<TData>>}\n columnDefs={columnDefs}\n rowData={rowData}\n defaultColDef={mergedDefaultColDef}\n onGridReady={handleGridReady}\n onRowClicked={handleRowClicked}\n animateRows={true}\n enableBrowserTooltips={true}\n rowSelection={resolvedRowSelection}\n pagination={pagination}\n paginationPageSize={pagination ? 50 : undefined}\n paginationPageSizeSelector={pagination ? [25, 50, 100, 200] : undefined}\n rowHeight={sizeConfig.rowHeight}\n headerHeight={sizeConfig.headerHeight}\n noRowsOverlayComponent={() => (\n <div className=\"text-muted-foreground py-8 text-center\">\n {noDataMessage}\n </div>\n )}\n loadingOverlayComponent={() => (\n <div className=\"text-muted-foreground py-8 text-center\">\n {loadingMessage}\n </div>\n )}\n theme=\"legacy\"\n {...props}\n />\n </div>\n );\n}\n\n// Forward ref with generic support\nexport const AGGrid = React.forwardRef(AGGridInner) as <TData = unknown>(\n props: AGGridProps<TData> & { ref?: React.ForwardedRef<AgGridReact<TData>> }\n) => React.ReactElement;\n\n// Display name for debugging\n(AGGrid as React.FC).displayName = 'AGGrid';\n\n// ============================================================================\n// Re-export AG Grid types for convenience\n// ============================================================================\n\n// Export ColDef with the original name for external use\nexport type { ColDef as AGColDef } from 'ag-grid-community';\n\n// Also export as ColDef for convenience\nexport type ColDef<TData = unknown, TValue = unknown> = AGColDef<TData, TValue>;\n\nexport type {\n GridApi,\n GridReadyEvent,\n RowClickedEvent,\n CellClickedEvent,\n CellValueChangedEvent,\n SelectionChangedEvent,\n FilterChangedEvent,\n SortChangedEvent,\n RowSelectedEvent,\n FirstDataRenderedEvent,\n} from 'ag-grid-community';\n\nexport { AgGridReact } from 'ag-grid-react';\n","/**\n * AG Grid Cell Renderers\n *\n * Rich, visually appealing cell renderers for AG Grid tables.\n * Based on Waggleline's production-tested implementations with\n * full dark mode support and design system integration.\n *\n * All renderers are memoized with React.memo for performance optimization.\n */\n\nimport * as React from 'react';\nimport { memo } from 'react';\nimport type { ICellRendererParams } from 'ag-grid-community';\nimport { cn } from '../../utils/cn';\nimport {\n MailIcon,\n PhoneIcon,\n GlobeIcon,\n CheckCircleIcon,\n ClockIcon,\n} from '../Icons';\nimport { Linkedin } from 'lucide-react';\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get a nested value from an object using dot notation (e.g., 'company.domain')\n */\nfunction getNestedValue(\n obj: Record<string, unknown> | undefined | null,\n path: string\n): unknown {\n if (!obj || !path) return undefined;\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current === 'object') {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\n/**\n * Get favicon URL from a domain using Google's favicon service\n */\nfunction getFaviconUrl(domain: string | null | undefined): string | null {\n if (!domain || typeof domain !== 'string') return null;\n const cleanDomain = domain\n .replace(/^https?:\\/\\//, '')\n .replace(/\\/.*$/, '')\n .trim();\n if (!cleanDomain) return null;\n return `https://www.google.com/s2/favicons?domain=${cleanDomain}&sz=64`;\n}\n\n/**\n * Format a phone number with dashes for display\n */\nexport function formatPhoneDisplay(phone: string | null | undefined): string {\n if (!phone) return '';\n const cleaned = phone.replace(/\\D/g, '');\n if (cleaned.length === 10) {\n return `${cleaned.slice(0, 3)}-${cleaned.slice(3, 6)}-${cleaned.slice(6)}`;\n }\n if (cleaned.length === 11 && cleaned.startsWith('1')) {\n return `${cleaned[0]}-${cleaned.slice(1, 4)}-${cleaned.slice(4, 7)}-${cleaned.slice(7)}`;\n }\n return phone;\n}\n\n/**\n * Generate initials from a name\n */\nfunction getInitials(name: string): string {\n if (!name || typeof name !== 'string') return '??';\n const parts = name.split(' ').filter(Boolean);\n if (parts.length >= 2) {\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n return name.substring(0, 2).toUpperCase();\n}\n\n/**\n * Generate a consistent avatar color based on a name\n */\nfunction getAvatarColor(name: string): string {\n const colors = [\n 'bg-primary-800',\n 'bg-green-600',\n 'bg-orange-600',\n 'bg-secondary-600',\n 'bg-pink-600',\n 'bg-primary-700',\n 'bg-teal-600',\n 'bg-amber-600',\n ];\n if (!name || typeof name !== 'string') return colors[0];\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n}\n\n/**\n * Custom comparison function for AG Grid cell renderers.\n */\nfunction cellRendererPropsAreEqual(\n prevProps: ICellRendererParams,\n nextProps: ICellRendererParams\n): boolean {\n if (prevProps.value !== nextProps.value) return false;\n if (prevProps.data !== nextProps.data) return false;\n if (prevProps.node?.rowIndex !== nextProps.node?.rowIndex) return false;\n return true;\n}\n\n// =============================================================================\n// Status Configuration Types\n// =============================================================================\n\nexport interface StatusConfig {\n label: string;\n bgClass: string;\n textClass: string;\n iconName?: string;\n}\n\n// =============================================================================\n// Default Status Colors\n// =============================================================================\n\nexport const statusColors: Record<string, StatusConfig> = {\n active: {\n label: 'Active',\n bgClass: 'bg-green-100 dark:bg-green-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n inactive: {\n label: 'Inactive',\n bgClass: 'bg-gray-200 dark:bg-gray-700',\n textClass: 'text-gray-600 dark:text-gray-300',\n },\n closed_won: {\n label: 'Closed Won',\n bgClass: 'bg-green-100 dark:bg-green-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n closed_lost: {\n label: 'Closed Lost',\n bgClass: 'bg-red-100 dark:bg-red-900/30',\n textClass: 'text-red-700 dark:text-red-400',\n },\n pending: {\n label: 'Pending',\n bgClass: 'bg-amber-100 dark:bg-amber-900/30',\n textClass: 'text-amber-700 dark:text-amber-400',\n },\n new: {\n label: 'New',\n bgClass: 'bg-primary-100 dark:bg-primary-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n verified: {\n label: 'Verified',\n bgClass: 'bg-green-100 dark:bg-green-900/30',\n textClass: 'text-green-700 dark:text-green-400',\n },\n flagged: {\n label: 'Flagged',\n bgClass: 'bg-red-100 dark:bg-red-900/30',\n textClass: 'text-red-700 dark:text-red-400',\n },\n};\n\n// =============================================================================\n// Avatar Name Renderer\n// =============================================================================\n\ninterface AvatarNameRendererProps extends ICellRendererParams {\n avatarField?: string;\n domainField?: string;\n}\n\n/**\n * Renders an avatar with name, suitable for contact/owner columns\n */\nexport function AvatarNameRenderer(\n props: AvatarNameRendererProps\n): React.ReactElement {\n const { data, value } = props;\n if (!data && !value) return <span className=\"text-muted-foreground\">--</span>;\n\n const displayName = typeof value === 'string' && value ? value : 'Unknown';\n const isSystemValue = ['Unknown', 'Unassigned', 'System'].includes(\n displayName\n );\n\n const avatarUrl =\n props.avatarField && data\n ? (getNestedValue(data, props.avatarField) as string | undefined)\n : data?.avatarUrl;\n\n const domain =\n props.domainField && data\n ? (getNestedValue(data, props.domainField) as string | undefined)\n : data?.company?.domain || data?.domain;\n\n const faviconUrl = getFaviconUrl(domain);\n const initials = getInitials(displayName);\n const imageUrl = avatarUrl || faviconUrl;\n\n if (isSystemValue) {\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"dark:text-muted-foreground flex h-7 w-7 items-center justify-center rounded-full bg-gray-200 text-xs font-semibold text-gray-400 dark:bg-gray-700\">\n {displayName === 'Unassigned' ? '—' : '??'}\n </div>\n <span className=\"dark:text-muted-foreground truncate text-gray-400 italic\">\n {displayName}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={displayName}\n className=\"h-7 w-7 rounded-full bg-white object-cover ring-2 ring-white dark:ring-gray-700\"\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = 'none';\n const sibling = target.nextElementSibling as HTMLElement;\n if (sibling) sibling.style.display = 'flex';\n }}\n />\n ) : null}\n <div\n className={cn(\n 'flex h-7 w-7 items-center justify-center rounded-full text-xs font-semibold text-white',\n getAvatarColor(displayName)\n )}\n style={{ display: imageUrl ? 'none' : 'flex' }}\n >\n {initials}\n </div>\n <span className=\"text-foreground truncate font-medium\">\n {displayName}\n </span>\n </div>\n );\n}\n\n// =============================================================================\n// Status Badge Renderer\n// =============================================================================\n\nexport interface StatusBadgeRendererProps extends ICellRendererParams {\n /** Custom status color configuration */\n statusConfig?: Record<string, StatusConfig>;\n}\n\n/**\n * Renders a colorful status badge\n */\nexport function StatusBadgeRenderer(\n props: StatusBadgeRendererProps\n): React.ReactElement {\n const { value, statusConfig = statusColors } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const normalizedValue = String(value).toLowerCase().replace(/\\s+/g, '_');\n const config = statusConfig[normalizedValue] || {\n label: value,\n bgClass: 'bg-gray-200 dark:bg-gray-700',\n textClass: 'text-gray-600 dark:text-gray-300',\n };\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n config.bgClass,\n config.textClass\n )}\n >\n {config.label}\n </span>\n );\n}\n\n// =============================================================================\n// Engagement Score Renderer\n// =============================================================================\n\n/**\n * Get engagement score colors based on threshold\n */\nfunction getEngagementScoreColors(score: number): {\n barColor: string;\n textColor: string;\n} {\n if (score >= 70)\n return {\n barColor: 'bg-green-500',\n textColor: 'text-green-700 dark:text-green-400',\n };\n if (score >= 40)\n return {\n barColor: 'bg-amber-500',\n textColor: 'text-amber-700 dark:text-amber-400',\n };\n if (score >= 20)\n return {\n barColor: 'bg-orange-500',\n textColor: 'text-orange-700 dark:text-orange-400',\n };\n return {\n barColor: 'bg-gray-400',\n textColor: 'text-muted-foreground',\n };\n}\n\n/**\n * Renders engagement score with color-coded progress bar\n */\nexport function EngagementScoreRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const score = Number(value);\n const percentage = Math.min(100, Math.max(0, score));\n const { barColor, textColor } = getEngagementScoreColors(score);\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"h-1.5 w-16 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={cn('h-full rounded-full transition-all', barColor)}\n style={{ width: `${percentage}%` }}\n />\n </div>\n <span className={cn('text-sm font-medium', textColor)}>{score}</span>\n </div>\n );\n}\n\n// =============================================================================\n// Email Renderer\n// =============================================================================\n\n/**\n * Renders email with mailto link\n */\nexport function EmailRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n return (\n <a\n href={`mailto:${value}`}\n className=\"text-primary-800 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <MailIcon className=\"h-3 w-3 opacity-60\" />\n <span className=\"truncate\">{value}</span>\n </a>\n );\n}\n\n// =============================================================================\n// Phone Renderer\n// =============================================================================\n\n/**\n * Renders phone with click-to-call\n */\nexport function PhoneRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const displayValue = formatPhoneDisplay(value);\n\n return (\n <a\n href={`tel:${value}`}\n className=\"text-foreground hover:text-primary-800 dark:hover:text-primary-400 inline-flex items-center gap-1.5\"\n onClick={(e) => e.stopPropagation()}\n >\n <PhoneIcon className=\"h-3 w-3 text-green-500 opacity-70\" />\n <span>{displayValue}</span>\n </a>\n );\n}\n\n// =============================================================================\n// Link Renderers\n// =============================================================================\n\n/**\n * Renders a domain/website URL with icon\n */\nexport function DomainRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const url = value.startsWith('http') ? value : `https://${value}`;\n const displayDomain = value.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-800 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <GlobeIcon className=\"h-3 w-3 opacity-60\" />\n <span className=\"truncate\">{displayDomain}</span>\n </a>\n );\n}\n\n/**\n * Renders a LinkedIn URL with icon\n */\nexport function LinkedInRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n return (\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-[#0A66C2] hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n <Linkedin className=\"h-4 w-4\" />\n <span className=\"truncate text-sm\">LinkedIn</span>\n </a>\n );\n}\n\n// =============================================================================\n// Currency Renderer\n// =============================================================================\n\n/**\n * Renders currency with proper formatting\n */\nexport function CurrencyRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const formatted = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n\n return (\n <span className=\"text-foreground font-medium tabular-nums\">\n {formatted}\n </span>\n );\n}\n\n// =============================================================================\n// Number Renderer\n// =============================================================================\n\n/**\n * Renders number with comma formatting\n */\nexport function NumberRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const formatted = Number(value).toLocaleString();\n\n return <span className=\"text-foreground tabular-nums\">{formatted}</span>;\n}\n\n// =============================================================================\n// Date Renderer\n// =============================================================================\n\nexport interface DateRendererProps extends ICellRendererParams {\n format?: 'short' | 'medium' | 'long' | 'relative' | 'datetime';\n}\n\n/**\n * Renders date with formatting options\n */\nexport function DateRenderer(props: DateRendererProps): React.ReactElement {\n const { value, format = 'medium' } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const date = value instanceof Date ? value : new Date(value);\n\n if (isNaN(date.getTime())) {\n return <span className=\"text-muted-foreground\">--</span>;\n }\n\n if (format === 'relative') {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n let relativeText: string;\n if (days === 0) {\n relativeText = 'Today';\n } else if (days === 1) {\n relativeText = 'Yesterday';\n } else if (days < 7) {\n relativeText = `${days} days ago`;\n } else if (days < 30) {\n const weeks = Math.floor(days / 7);\n relativeText = `${weeks} week${weeks > 1 ? 's' : ''} ago`;\n } else if (days < 365) {\n const months = Math.floor(days / 30);\n relativeText = `${months} month${months > 1 ? 's' : ''} ago`;\n } else {\n const years = Math.floor(days / 365);\n relativeText = `${years} year${years > 1 ? 's' : ''} ago`;\n }\n\n return <span className=\"text-muted-foreground\">{relativeText}</span>;\n }\n\n const dateOptions: Intl.DateTimeFormatOptions =\n format === 'short'\n ? { month: 'numeric', day: 'numeric' }\n : format === 'long'\n ? { month: 'long', day: 'numeric', year: 'numeric' }\n : { month: 'short', day: 'numeric', year: 'numeric' };\n\n if (format === 'datetime') {\n const formatted = date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n return <span className=\"text-foreground\">{formatted}</span>;\n }\n\n const formatted = date.toLocaleDateString('en-US', dateOptions);\n\n return <span className=\"text-foreground\">{formatted}</span>;\n}\n\n// =============================================================================\n// Boolean/Yes-No Renderer\n// =============================================================================\n\n/**\n * Renders boolean as styled Yes/No badge\n */\nexport function BooleanRenderer(\n props: ICellRendererParams\n): React.ReactElement {\n const { value } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const isTrue = Boolean(value);\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n isTrue\n ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\n : 'bg-gray-200 text-gray-600 dark:bg-gray-700 dark:text-gray-300'\n )}\n >\n {isTrue ? (\n <CheckCircleIcon className=\"h-3 w-3\" />\n ) : (\n <ClockIcon className=\"h-3 w-3\" />\n )}\n {isTrue ? 'Yes' : 'No'}\n </span>\n );\n}\n\n// =============================================================================\n// Company Renderer\n// =============================================================================\n\ninterface CompanyRendererProps extends ICellRendererParams {\n companyIdField?: string;\n domainField?: string;\n}\n\n/**\n * Renders company name with favicon\n */\nexport function CompanyRenderer(\n props: CompanyRendererProps\n): React.ReactElement {\n const { data, value } = props;\n if (!value) return <span className=\"text-muted-foreground\">--</span>;\n\n const domain =\n props.domainField && data\n ? (getNestedValue(data, props.domainField) as string | undefined)\n : data?.company?.domain || data?.domain;\n\n const faviconUrl = getFaviconUrl(domain);\n\n return (\n <div className=\"flex items-center gap-2 py-0.5\">\n {faviconUrl ? (\n <img\n src={faviconUrl}\n alt={value}\n className=\"h-5 w-5 rounded bg-white object-contain\"\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = 'none';\n const sibling = target.nextElementSibling as HTMLElement;\n if (sibling) sibling.style.display = 'flex';\n }}\n />\n ) : null}\n <div\n className=\"bg-primary-100 text-primary-800 dark:bg-primary-900/30 dark:text-primary-400 flex h-5 w-5 items-center justify-center rounded text-[9px] font-semibold\"\n style={{ display: faviconUrl ? 'none' : 'flex' }}\n >\n {getInitials(value)}\n </div>\n <span className=\"truncate font-medium\">{value}</span>\n </div>\n );\n}\n\n// =============================================================================\n// Progress Renderer\n// =============================================================================\n\nexport interface ProgressRendererProps extends ICellRendererParams {\n /** Color of the progress bar */\n barColor?: string;\n /** Maximum value (default 100) */\n max?: number;\n}\n\n/**\n * Renders a progress bar\n */\nexport function ProgressRenderer(\n props: ProgressRendererProps\n): React.ReactElement {\n const { value, barColor = 'bg-primary-800', max = 100 } = props;\n if (value == null) return <span className=\"text-muted-foreground\">--</span>;\n\n const percentage = Math.min(100, Math.max(0, (Number(value) / max) * 100));\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"h-2 w-20 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={cn('h-full rounded-full transition-all', barColor)}\n style={{ width: `${percentage}%` }}\n />\n </div>\n <span className=\"text-muted-foreground text-xs font-medium\">\n {Math.round(percentage)}%\n </span>\n </div>\n );\n}\n\n// =============================================================================\n// Tags Renderer\n// =============================================================================\n\n/**\n * Renders an array of tags as badges\n */\nexport function TagsRenderer(props: ICellRendererParams): React.ReactElement {\n const { value } = props;\n if (!value || !Array.isArray(value) || value.length === 0) {\n return <span className=\"text-muted-foreground\">--</span>;\n }\n\n return (\n <div className=\"flex flex-wrap gap-1\">\n {value.slice(0, 3).map((tag: string, index: number) => (\n <span\n key={index}\n className=\"text-foreground inline-flex items-center rounded-full bg-gray-100 px-2 py-0.5 text-xs font-medium dark:bg-gray-800\"\n >\n {tag}\n </span>\n ))}\n {value.length > 3 && (\n <span className=\"text-muted-foreground text-xs\">\n +{value.length - 3}\n </span>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// Memoized Renderer Exports (for performance)\n// =============================================================================\n\nexport const MemoizedAvatarNameRenderer = memo(\n AvatarNameRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedStatusBadgeRenderer = memo(\n StatusBadgeRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedEngagementScoreRenderer = memo(\n EngagementScoreRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedEmailRenderer = memo(\n EmailRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedPhoneRenderer = memo(\n PhoneRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedLinkedInRenderer = memo(\n LinkedInRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedDomainRenderer = memo(\n DomainRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedCurrencyRenderer = memo(\n CurrencyRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedNumberRenderer = memo(\n NumberRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedDateRenderer = memo(\n DateRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedBooleanRenderer = memo(\n BooleanRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedCompanyRenderer = memo(\n CompanyRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedProgressRenderer = memo(\n ProgressRenderer,\n cellRendererPropsAreEqual\n);\nexport const MemoizedTagsRenderer = memo(\n TagsRenderer,\n cellRendererPropsAreEqual\n);\n\n// =============================================================================\n// Default Export\n// =============================================================================\n\nexport const CellRenderers = {\n // Original renderers\n AvatarNameRenderer,\n StatusBadgeRenderer,\n EngagementScoreRenderer,\n EmailRenderer,\n PhoneRenderer,\n LinkedInRenderer,\n DomainRenderer,\n CurrencyRenderer,\n NumberRenderer,\n DateRenderer,\n BooleanRenderer,\n CompanyRenderer,\n ProgressRenderer,\n TagsRenderer,\n\n // Memoized renderers (recommended for performance)\n MemoizedAvatarNameRenderer,\n MemoizedStatusBadgeRenderer,\n MemoizedEngagementScoreRenderer,\n MemoizedEmailRenderer,\n MemoizedPhoneRenderer,\n MemoizedLinkedInRenderer,\n MemoizedDomainRenderer,\n MemoizedCurrencyRenderer,\n MemoizedNumberRenderer,\n MemoizedDateRenderer,\n MemoizedBooleanRenderer,\n MemoizedCompanyRenderer,\n MemoizedProgressRenderer,\n MemoizedTagsRenderer,\n\n // Utility functions\n formatPhoneDisplay,\n};\n\nexport default CellRenderers;\n"]}
|