eidos-ui 3.2.1 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -5
- package/dist/{Input.types-XrJTI0JC.d.ts → Input.types-CSDMaZNe.d.ts} +10 -0
- package/dist/{Input.types-DFZNyJGF.d.cts → Input.types-D7-sWq-q.d.cts} +10 -0
- package/dist/{Select.types-CAkT2ACt.d.cts → Select.types-2p-mpaBL.d.cts} +1 -1
- package/dist/{Select.types-B4kDpkGB.d.ts → Select.types-BqaD7bmB.d.ts} +1 -1
- package/dist/alert/index.cjs +5 -5
- package/dist/alert/index.js +4 -4
- package/dist/button/index.cjs +4 -4
- package/dist/button/index.js +3 -3
- package/dist/checkbox/index.cjs +2 -2
- package/dist/checkbox/index.js +1 -1
- package/dist/chip/index.cjs +4 -4
- package/dist/chip/index.js +3 -3
- package/dist/{chunk-RYOQYYDO.js → chunk-22EKNTWJ.js} +9 -5
- package/dist/chunk-22EKNTWJ.js.map +1 -0
- package/dist/{chunk-3E7TKBQI.cjs → chunk-27UANGPW.cjs} +14 -6
- package/dist/chunk-27UANGPW.cjs.map +1 -0
- package/dist/{chunk-CJGFRPAS.cjs → chunk-3QQKWXMV.cjs} +4 -4
- package/dist/chunk-3QQKWXMV.cjs.map +1 -0
- package/dist/{chunk-R3WPVTGY.cjs → chunk-3S33BIN2.cjs} +23 -21
- package/dist/chunk-3S33BIN2.cjs.map +1 -0
- package/dist/{chunk-ZPDETHQ7.js → chunk-3WV6RTXX.js} +3 -3
- package/dist/{chunk-ZPDETHQ7.js.map → chunk-3WV6RTXX.js.map} +1 -1
- package/dist/chunk-44T4HMFU.js +88 -0
- package/dist/chunk-44T4HMFU.js.map +1 -0
- package/dist/{chunk-3EPND5M2.cjs → chunk-4LET2PEX.cjs} +12 -12
- package/dist/chunk-4LET2PEX.cjs.map +1 -0
- package/dist/{chunk-VRQBDTLT.cjs → chunk-5E4DYTZ3.cjs} +48 -37
- package/dist/chunk-5E4DYTZ3.cjs.map +1 -0
- package/dist/{chunk-EL3YXTOW.cjs → chunk-5V7DXZWT.cjs} +79 -76
- package/dist/chunk-5V7DXZWT.cjs.map +1 -0
- package/dist/{chunk-2R77XZEP.js → chunk-67EXHO4T.js} +2 -4
- package/dist/{chunk-2R77XZEP.js.map → chunk-67EXHO4T.js.map} +1 -1
- package/dist/{chunk-HI6WCX4T.cjs → chunk-6LCYO2HG.cjs} +10 -9
- package/dist/chunk-6LCYO2HG.cjs.map +1 -0
- package/dist/{chunk-ZNWIHUHZ.cjs → chunk-7KVXXHFX.cjs} +9 -3
- package/dist/chunk-7KVXXHFX.cjs.map +1 -0
- package/dist/{chunk-55J4LEKT.cjs → chunk-AHVDTWVM.cjs} +11 -8
- package/dist/chunk-AHVDTWVM.cjs.map +1 -0
- package/dist/{chunk-OAPOGYA5.cjs → chunk-AXPEJ5IG.cjs} +7 -4
- package/dist/chunk-AXPEJ5IG.cjs.map +1 -0
- package/dist/{chunk-BHVHM66Z.js → chunk-BBU7QG7L.js} +4 -4
- package/dist/{chunk-T2KB3DJJ.js → chunk-BGBAZMFE.js} +9 -3
- package/dist/chunk-BGBAZMFE.js.map +1 -0
- package/dist/{chunk-EH42ND5Q.cjs → chunk-BIANFFJL.cjs} +5 -5
- package/dist/{chunk-EH42ND5Q.cjs.map → chunk-BIANFFJL.cjs.map} +1 -1
- package/dist/{chunk-O2AACVSF.js → chunk-BO4LTIJI.js} +3 -3
- package/dist/{chunk-ZGT4LT5Y.cjs → chunk-CBT3TTQR.cjs} +36 -36
- package/dist/{chunk-ZGT4LT5Y.cjs.map → chunk-CBT3TTQR.cjs.map} +1 -1
- package/dist/{chunk-JRLUZDKA.js → chunk-CEC3GO4R.js} +20 -7
- package/dist/chunk-CEC3GO4R.js.map +1 -0
- package/dist/{chunk-KNQ6NN6L.js → chunk-CP335H4Q.js} +4 -4
- package/dist/{chunk-H6CWTMAH.js → chunk-DGXHR6FV.js} +5 -2
- package/dist/chunk-DGXHR6FV.js.map +1 -0
- package/dist/{chunk-FALDCW2E.js → chunk-DMOZURHV.js} +2 -2
- package/dist/{chunk-NWJ6NETE.js → chunk-EWTMX4DK.js} +8 -8
- package/dist/{chunk-3RLGH45H.js → chunk-FDMYDIGI.js} +8 -6
- package/dist/chunk-FDMYDIGI.js.map +1 -0
- package/dist/{chunk-LVHZBCTA.cjs → chunk-FODRHCRP.cjs} +5 -4
- package/dist/chunk-FODRHCRP.cjs.map +1 -0
- package/dist/{chunk-QIITXVRG.js → chunk-FPLX5FIK.js} +4 -4
- package/dist/{chunk-NEYLNRVG.cjs → chunk-FXMRDNR6.cjs} +21 -16
- package/dist/chunk-FXMRDNR6.cjs.map +1 -0
- package/dist/{chunk-D2SKXRKP.cjs → chunk-G74DHVHV.cjs} +9 -9
- package/dist/{chunk-D2SKXRKP.cjs.map → chunk-G74DHVHV.cjs.map} +1 -1
- package/dist/{chunk-O3LG7B2J.cjs → chunk-GMDVW76A.cjs} +13 -5
- package/dist/chunk-GMDVW76A.cjs.map +1 -0
- package/dist/{chunk-NQ4L6PYW.js → chunk-GOF6A4M4.js} +2 -2
- package/dist/{chunk-NQ4L6PYW.js.map → chunk-GOF6A4M4.js.map} +1 -1
- package/dist/{chunk-QUDVJUZU.js → chunk-GPK2THIG.js} +7 -6
- package/dist/chunk-GPK2THIG.js.map +1 -0
- package/dist/{chunk-CJVC3A4O.js → chunk-H2RS6Z6Q.js} +44 -27
- package/dist/chunk-H2RS6Z6Q.js.map +1 -0
- package/dist/{chunk-UOOGS6N7.cjs → chunk-H5D3ZFBM.cjs} +68 -61
- package/dist/chunk-H5D3ZFBM.cjs.map +1 -0
- package/dist/{chunk-IYWAZEFI.cjs → chunk-IGFR5TES.cjs} +3 -2
- package/dist/chunk-IGFR5TES.cjs.map +1 -0
- package/dist/{chunk-PR7CVQ4R.js → chunk-IXVM2XNS.js} +7 -6
- package/dist/chunk-IXVM2XNS.js.map +1 -0
- package/dist/{chunk-Q6ICDKQZ.cjs → chunk-JKBBHAIC.cjs} +21 -20
- package/dist/chunk-JKBBHAIC.cjs.map +1 -0
- package/dist/{chunk-QQIALSTX.cjs → chunk-KPMIIGHH.cjs} +27 -17
- package/dist/chunk-KPMIIGHH.cjs.map +1 -0
- package/dist/{chunk-EBSKRZXI.cjs → chunk-KWDOOMHR.cjs} +7 -7
- package/dist/{chunk-EBSKRZXI.cjs.map → chunk-KWDOOMHR.cjs.map} +1 -1
- package/dist/{chunk-BC5I2MYB.js → chunk-LH5A2SIX.js} +78 -75
- package/dist/{chunk-BC5I2MYB.js.map → chunk-LH5A2SIX.js.map} +1 -1
- package/dist/{chunk-2WP27QAN.js → chunk-LIKSLFX6.js} +20 -9
- package/dist/chunk-LIKSLFX6.js.map +1 -0
- package/dist/{chunk-Z5U4NJTW.cjs → chunk-MLUHM3VG.cjs} +48 -19
- package/dist/chunk-MLUHM3VG.cjs.map +1 -0
- package/dist/{chunk-M7PF4FKQ.js → chunk-MP7LN5CW.js} +6 -3
- package/dist/chunk-MP7LN5CW.js.map +1 -0
- package/dist/{chunk-4MZ7HEQC.cjs → chunk-MW4YZVP5.cjs} +96 -97
- package/dist/chunk-MW4YZVP5.cjs.map +1 -0
- package/dist/{chunk-WFEORBLC.cjs → chunk-N5ZWQJTM.cjs} +11 -10
- package/dist/chunk-N5ZWQJTM.cjs.map +1 -0
- package/dist/{chunk-OMLXP2CK.cjs → chunk-N77VOYCK.cjs} +7 -7
- package/dist/{chunk-OMLXP2CK.cjs.map → chunk-N77VOYCK.cjs.map} +1 -1
- package/dist/{chunk-OAK7HFOJ.js → chunk-NACA72XI.js} +21 -16
- package/dist/chunk-NACA72XI.js.map +1 -0
- package/dist/{chunk-TEVZHN5I.cjs → chunk-NCZUQFKL.cjs} +28 -15
- package/dist/chunk-NCZUQFKL.cjs.map +1 -0
- package/dist/{chunk-NZO2I5AL.cjs → chunk-NF55JG2V.cjs} +7 -7
- package/dist/{chunk-NZO2I5AL.cjs.map → chunk-NF55JG2V.cjs.map} +1 -1
- package/dist/{chunk-KBGFDHKD.cjs → chunk-O46UJUZM.cjs} +21 -19
- package/dist/chunk-O46UJUZM.cjs.map +1 -0
- package/dist/{chunk-25PSIDPC.js → chunk-OIXPYXR6.js} +79 -21
- package/dist/chunk-OIXPYXR6.js.map +1 -0
- package/dist/chunk-OWWPHXAF.cjs +88 -0
- package/dist/chunk-OWWPHXAF.cjs.map +1 -0
- package/dist/{chunk-65PC3YDT.cjs → chunk-OZQKWDFH.cjs} +7 -7
- package/dist/{chunk-65PC3YDT.cjs.map → chunk-OZQKWDFH.cjs.map} +1 -1
- package/dist/{chunk-75VXB3H2.cjs → chunk-P7J6WZTO.cjs} +3 -5
- package/dist/chunk-P7J6WZTO.cjs.map +1 -0
- package/dist/{chunk-KQJ3IAFT.js → chunk-PG2EII6U.js} +2 -2
- package/dist/{chunk-6A2ZKVST.cjs → chunk-RUDXHT76.cjs} +47 -30
- package/dist/chunk-RUDXHT76.cjs.map +1 -0
- package/dist/{chunk-S4S4LB63.js → chunk-SCLFJHN2.js} +11 -3
- package/dist/chunk-SCLFJHN2.js.map +1 -0
- package/dist/{chunk-WKDT2XFQ.js → chunk-SFRILDXY.js} +4 -4
- package/dist/{chunk-J5RMLZ4P.cjs → chunk-SKBKTNEQ.cjs} +80 -22
- package/dist/chunk-SKBKTNEQ.cjs.map +1 -0
- package/dist/{chunk-75TDY7XF.cjs → chunk-SKLMBE3Z.cjs} +7 -7
- package/dist/{chunk-75TDY7XF.cjs.map → chunk-SKLMBE3Z.cjs.map} +1 -1
- package/dist/{chunk-PY2376XI.js → chunk-SVCWSW2F.js} +8 -8
- package/dist/chunk-SVCWSW2F.js.map +1 -0
- package/dist/{chunk-2RXQMQYW.js → chunk-SXL4DMZ7.js} +27 -17
- package/dist/{chunk-2RXQMQYW.js.map → chunk-SXL4DMZ7.js.map} +1 -1
- package/dist/{chunk-X3U7SDOZ.js → chunk-TLECMA3B.js} +5 -4
- package/dist/{chunk-X3U7SDOZ.js.map → chunk-TLECMA3B.js.map} +1 -1
- package/dist/{chunk-FXZJL2AM.cjs → chunk-TWXZKUCG.cjs} +9 -5
- package/dist/chunk-TWXZKUCG.cjs.map +1 -0
- package/dist/{chunk-YDPEHUMH.js → chunk-TYGVKSL6.js} +4 -3
- package/dist/chunk-TYGVKSL6.js.map +1 -0
- package/dist/{chunk-I3CSPYHG.cjs → chunk-TYSNOPMQ.cjs} +3 -3
- package/dist/{chunk-I3CSPYHG.cjs.map → chunk-TYSNOPMQ.cjs.map} +1 -1
- package/dist/{chunk-ZZSPQFMX.js → chunk-U233KQZX.js} +2 -1
- package/dist/{chunk-ZZSPQFMX.js.map → chunk-U233KQZX.js.map} +1 -1
- package/dist/{chunk-5HUZYY54.js → chunk-UDRAM6JU.js} +13 -5
- package/dist/chunk-UDRAM6JU.js.map +1 -0
- package/dist/{chunk-TJC7UELT.js → chunk-UGTKZ7HP.js} +30 -23
- package/dist/chunk-UGTKZ7HP.js.map +1 -0
- package/dist/{chunk-FKXKBJUI.cjs → chunk-VHO6JPRR.cjs} +2 -1
- package/dist/chunk-VHO6JPRR.cjs.map +1 -0
- package/dist/chunk-VHSTB7GB.cjs +123 -0
- package/dist/chunk-VHSTB7GB.cjs.map +1 -0
- package/dist/{chunk-ATL7325T.js → chunk-VRNCXYEP.js} +4 -4
- package/dist/{chunk-4ZWAJTNH.js → chunk-WGCGSM5P.js} +96 -97
- package/dist/chunk-WGCGSM5P.js.map +1 -0
- package/dist/chunk-WT4WBHBR.js +123 -0
- package/dist/chunk-WT4WBHBR.js.map +1 -0
- package/dist/{chunk-L23WWO3D.js → chunk-X6UKU3C3.js} +2 -2
- package/dist/{chunk-5WH3JMR5.js → chunk-XK5USBHB.js} +7 -4
- package/dist/chunk-XK5USBHB.js.map +1 -0
- package/dist/{chunk-ND526PMG.cjs → chunk-XMXL6NVJ.cjs} +11 -11
- package/dist/{chunk-ND526PMG.cjs.map → chunk-XMXL6NVJ.cjs.map} +1 -1
- package/dist/{chunk-YV57RSPD.js → chunk-XO7WTE6O.js} +47 -18
- package/dist/chunk-XO7WTE6O.js.map +1 -0
- package/dist/{chunk-3CXULV4G.cjs → chunk-XRVRGRC3.cjs} +2 -2
- package/dist/{chunk-3CXULV4G.cjs.map → chunk-XRVRGRC3.cjs.map} +1 -1
- package/dist/{chunk-O3I3RBZJ.js → chunk-Y55M34RQ.js} +3 -2
- package/dist/chunk-Y55M34RQ.js.map +1 -0
- package/dist/{chunk-QZX3A4FX.js → chunk-Y7VSWZWM.js} +7 -5
- package/dist/chunk-Y7VSWZWM.js.map +1 -0
- package/dist/{chunk-2QEKSRVX.js → chunk-YIBPOLNN.js} +4 -4
- package/dist/{chunk-IJ4DXG7D.cjs → chunk-YJNQLH2L.cjs} +5 -2
- package/dist/chunk-YJNQLH2L.cjs.map +1 -0
- package/dist/{chunk-6CSUUQ5M.cjs → chunk-YUH56CJI.cjs} +6 -6
- package/dist/{chunk-6CSUUQ5M.cjs.map → chunk-YUH56CJI.cjs.map} +1 -1
- package/dist/color-picker/index.cjs +4 -4
- package/dist/color-picker/index.d.cts +8 -0
- package/dist/color-picker/index.d.ts +8 -0
- package/dist/color-picker/index.js +3 -3
- package/dist/combobox/index.cjs +6 -6
- package/dist/combobox/index.js +5 -5
- package/dist/command-palette/index.cjs +3 -2
- package/dist/command-palette/index.cjs.map +1 -1
- package/dist/command-palette/index.js +2 -1
- package/dist/context-menu/index.cjs +6 -6
- package/dist/context-menu/index.js +5 -5
- package/dist/conversation/index.cjs +9 -9
- package/dist/conversation/index.js +8 -8
- package/dist/data-grid/index.cjs +16 -16
- package/dist/data-grid/index.d.cts +2 -2
- package/dist/data-grid/index.d.ts +2 -2
- package/dist/data-grid/index.js +15 -15
- package/dist/date-picker/index.cjs +8 -8
- package/dist/date-picker/index.d.cts +1 -1
- package/dist/date-picker/index.d.ts +1 -1
- package/dist/date-picker/index.js +7 -7
- package/dist/drawer/index.cjs +5 -5
- package/dist/drawer/index.js +4 -4
- package/dist/dropdown/index.cjs +3 -3
- package/dist/dropdown/index.js +2 -2
- package/dist/file-upload/index.cjs +2 -2
- package/dist/file-upload/index.js +1 -1
- package/dist/header/index.cjs +6 -6
- package/dist/header/index.js +5 -5
- package/dist/index.cjs +43 -43
- package/dist/index.css +205 -148
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +42 -42
- package/dist/inline-edit/index.cjs +5 -5
- package/dist/inline-edit/index.js +4 -4
- package/dist/input/index.cjs +4 -4
- package/dist/input/index.d.cts +2 -2
- package/dist/input/index.d.ts +2 -2
- package/dist/input/index.js +3 -3
- package/dist/menu/index.cjs +5 -5
- package/dist/menu/index.js +4 -4
- package/dist/modal/index.cjs +5 -5
- package/dist/modal/index.js +4 -4
- package/dist/navigation/index.cjs +5 -5
- package/dist/navigation/index.js +4 -4
- package/dist/number-input/index.cjs +3 -3
- package/dist/number-input/index.js +2 -2
- package/dist/o-t-p-input/index.cjs +2 -2
- package/dist/o-t-p-input/index.js +1 -1
- package/dist/page-layout/index.cjs +12 -12
- package/dist/page-layout/index.js +11 -11
- package/dist/pagination/index.cjs +8 -8
- package/dist/pagination/index.js +7 -7
- package/dist/popover/index.cjs +3 -2
- package/dist/popover/index.cjs.map +1 -1
- package/dist/popover/index.js +2 -1
- package/dist/radio/index.cjs +2 -2
- package/dist/radio/index.js +1 -1
- package/dist/segmented-control/index.cjs +4 -4
- package/dist/segmented-control/index.js +3 -3
- package/dist/select/index.cjs +6 -6
- package/dist/select/index.d.cts +3 -3
- package/dist/select/index.d.ts +3 -3
- package/dist/select/index.js +5 -5
- package/dist/skeleton/index.cjs +2 -2
- package/dist/skeleton/index.js +1 -1
- package/dist/snackbar/index.cjs +5 -5
- package/dist/snackbar/index.d.cts +4 -0
- package/dist/snackbar/index.d.ts +4 -0
- package/dist/snackbar/index.js +4 -4
- package/dist/split-button/index.cjs +6 -6
- package/dist/split-button/index.js +5 -5
- package/dist/table/index.cjs +14 -14
- package/dist/table/index.js +13 -13
- package/dist/tabs/index.cjs +3 -3
- package/dist/tabs/index.js +2 -2
- package/dist/tag-input/index.cjs +6 -6
- package/dist/tag-input/index.js +5 -5
- package/dist/textarea/index.cjs +4 -4
- package/dist/textarea/index.js +3 -3
- package/dist/theme-editor/index.cjs +11 -11
- package/dist/theme-editor/index.js +10 -10
- package/dist/theme-provider/index.cjs +3 -3
- package/dist/theme-provider/index.js +2 -2
- package/dist/toolbar/index.cjs +8 -8
- package/dist/toolbar/index.js +7 -7
- package/dist/tooltip/index.cjs +3 -2
- package/dist/tooltip/index.cjs.map +1 -1
- package/dist/tooltip/index.js +2 -1
- package/dist/virtual-list/index.cjs +3 -3
- package/dist/virtual-list/index.js +2 -2
- package/package.json +8 -2
- package/dist/chunk-25PSIDPC.js.map +0 -1
- package/dist/chunk-2WP27QAN.js.map +0 -1
- package/dist/chunk-3E7TKBQI.cjs.map +0 -1
- package/dist/chunk-3EPND5M2.cjs.map +0 -1
- package/dist/chunk-3RLGH45H.js.map +0 -1
- package/dist/chunk-4MZ7HEQC.cjs.map +0 -1
- package/dist/chunk-4ZWAJTNH.js.map +0 -1
- package/dist/chunk-55J4LEKT.cjs.map +0 -1
- package/dist/chunk-5HUZYY54.js.map +0 -1
- package/dist/chunk-5WH3JMR5.js.map +0 -1
- package/dist/chunk-6A2ZKVST.cjs.map +0 -1
- package/dist/chunk-75VXB3H2.cjs.map +0 -1
- package/dist/chunk-CJGFRPAS.cjs.map +0 -1
- package/dist/chunk-CJVC3A4O.js.map +0 -1
- package/dist/chunk-CUJBNRJJ.cjs +0 -38
- package/dist/chunk-CUJBNRJJ.cjs.map +0 -1
- package/dist/chunk-EAJHEYZM.js +0 -38
- package/dist/chunk-EAJHEYZM.js.map +0 -1
- package/dist/chunk-EL3YXTOW.cjs.map +0 -1
- package/dist/chunk-FKXKBJUI.cjs.map +0 -1
- package/dist/chunk-FXZJL2AM.cjs.map +0 -1
- package/dist/chunk-H6CWTMAH.js.map +0 -1
- package/dist/chunk-HI6WCX4T.cjs.map +0 -1
- package/dist/chunk-IJ4DXG7D.cjs.map +0 -1
- package/dist/chunk-IYWAZEFI.cjs.map +0 -1
- package/dist/chunk-J5RMLZ4P.cjs.map +0 -1
- package/dist/chunk-JRLUZDKA.js.map +0 -1
- package/dist/chunk-KBGFDHKD.cjs.map +0 -1
- package/dist/chunk-L5Q6UDY3.js +0 -69
- package/dist/chunk-L5Q6UDY3.js.map +0 -1
- package/dist/chunk-LVHZBCTA.cjs.map +0 -1
- package/dist/chunk-M7PF4FKQ.js.map +0 -1
- package/dist/chunk-NEYLNRVG.cjs.map +0 -1
- package/dist/chunk-O3I3RBZJ.js.map +0 -1
- package/dist/chunk-O3LG7B2J.cjs.map +0 -1
- package/dist/chunk-OAK7HFOJ.js.map +0 -1
- package/dist/chunk-OAPOGYA5.cjs.map +0 -1
- package/dist/chunk-PR7CVQ4R.js.map +0 -1
- package/dist/chunk-PY2376XI.js.map +0 -1
- package/dist/chunk-Q6ICDKQZ.cjs.map +0 -1
- package/dist/chunk-QQIALSTX.cjs.map +0 -1
- package/dist/chunk-QUDVJUZU.js.map +0 -1
- package/dist/chunk-QZX3A4FX.js.map +0 -1
- package/dist/chunk-R3WPVTGY.cjs.map +0 -1
- package/dist/chunk-RYOQYYDO.js.map +0 -1
- package/dist/chunk-S4S4LB63.js.map +0 -1
- package/dist/chunk-T2KB3DJJ.js.map +0 -1
- package/dist/chunk-TEVZHN5I.cjs.map +0 -1
- package/dist/chunk-TJC7UELT.js.map +0 -1
- package/dist/chunk-UOOGS6N7.cjs.map +0 -1
- package/dist/chunk-VRQBDTLT.cjs.map +0 -1
- package/dist/chunk-WFEORBLC.cjs.map +0 -1
- package/dist/chunk-WWYJNWJY.cjs +0 -69
- package/dist/chunk-WWYJNWJY.cjs.map +0 -1
- package/dist/chunk-YDPEHUMH.js.map +0 -1
- package/dist/chunk-YV57RSPD.js.map +0 -1
- package/dist/chunk-Z5U4NJTW.cjs.map +0 -1
- package/dist/chunk-ZNWIHUHZ.cjs.map +0 -1
- /package/dist/{chunk-BHVHM66Z.js.map → chunk-BBU7QG7L.js.map} +0 -0
- /package/dist/{chunk-O2AACVSF.js.map → chunk-BO4LTIJI.js.map} +0 -0
- /package/dist/{chunk-KNQ6NN6L.js.map → chunk-CP335H4Q.js.map} +0 -0
- /package/dist/{chunk-FALDCW2E.js.map → chunk-DMOZURHV.js.map} +0 -0
- /package/dist/{chunk-NWJ6NETE.js.map → chunk-EWTMX4DK.js.map} +0 -0
- /package/dist/{chunk-QIITXVRG.js.map → chunk-FPLX5FIK.js.map} +0 -0
- /package/dist/{chunk-KQJ3IAFT.js.map → chunk-PG2EII6U.js.map} +0 -0
- /package/dist/{chunk-WKDT2XFQ.js.map → chunk-SFRILDXY.js.map} +0 -0
- /package/dist/{chunk-ATL7325T.js.map → chunk-VRNCXYEP.js.map} +0 -0
- /package/dist/{chunk-L23WWO3D.js.map → chunk-X6UKU3C3.js.map} +0 -0
- /package/dist/{chunk-2QEKSRVX.js.map → chunk-YIBPOLNN.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkP7J6WZTOcjs = require('./chunk-P7J6WZTO.cjs');
|
|
4
4
|
|
|
5
5
|
// src/components/ColorPicker/ColorPicker.component.tsx
|
|
6
6
|
var _react = require('react');
|
|
@@ -205,6 +205,7 @@ var ColorPicker = ({
|
|
|
205
205
|
size = "md",
|
|
206
206
|
inline = false,
|
|
207
207
|
label,
|
|
208
|
+
ariaLabel,
|
|
208
209
|
className = ""
|
|
209
210
|
}) => {
|
|
210
211
|
const initialHex = _nullishCoalesce(_nullishCoalesce(value, () => ( defaultValue)), () => ( "#6366f1"));
|
|
@@ -496,7 +497,7 @@ var ColorPicker = ({
|
|
|
496
497
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: rootClasses, children: [
|
|
497
498
|
label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-color-picker-label", children: label }),
|
|
498
499
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
499
|
-
|
|
500
|
+
_chunkP7J6WZTOcjs.Dropdown,
|
|
500
501
|
{
|
|
501
502
|
trigger: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
502
503
|
"button",
|
|
@@ -504,7 +505,7 @@ var ColorPicker = ({
|
|
|
504
505
|
type: "button",
|
|
505
506
|
className: "eidos-color-picker-trigger",
|
|
506
507
|
disabled,
|
|
507
|
-
"aria-label": _nullishCoalesce(label, () => ( "Open colour picker")),
|
|
508
|
+
"aria-label": _nullishCoalesce(_nullishCoalesce(label, () => ( ariaLabel)), () => ( "Open colour picker")),
|
|
508
509
|
children: [
|
|
509
510
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
510
511
|
"span",
|
|
@@ -531,4 +532,4 @@ ColorPicker.displayName = "ColorPicker";
|
|
|
531
532
|
|
|
532
533
|
|
|
533
534
|
exports.ColorPicker = ColorPicker;
|
|
534
|
-
//# sourceMappingURL=chunk-
|
|
535
|
+
//# sourceMappingURL=chunk-FODRHCRP.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-FODRHCRP.cjs","../src/components/ColorPicker/ColorPicker.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-FODRHCRP.cjs","sourcesContent":[null,"import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { Copy, Check } from 'lucide-react';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport type {\n ColorPickerProps,\n HSVColor,\n RGBColor,\n HSLColor,\n ColorFormat,\n} from './ColorPicker.types';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_SWATCHES: string[] = [\n '#ef4444',\n '#f97316',\n '#f59e0b',\n '#10b981',\n '#06b6d4',\n '#6366f1',\n '#8b5cf6',\n '#ec4899',\n '#64748b',\n '#1e293b',\n];\n\n// ============================================================================\n// Pure colour-utility functions\n// ============================================================================\n\nfunction hsvToRgb(h: number, s: number, v: number): RGBColor {\n // h: 0–360, s: 0–100, v: 0–100 → r,g,b: 0–255\n const sn = s / 100;\n const vn = v / 100;\n const c = vn * sn;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = vn - c;\n\n let r: number, g: number, b: number;\n if (h < 60) {\n r = c;\n g = x;\n b = 0;\n } else if (h < 120) {\n r = x;\n g = c;\n b = 0;\n } else if (h < 180) {\n r = 0;\n g = c;\n b = x;\n } else if (h < 240) {\n r = 0;\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n g = 0;\n b = c;\n } else {\n r = c;\n g = 0;\n b = x;\n }\n\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n };\n}\n\nfunction rgbToHsv(r: number, g: number, b: number): HSVColor {\n // r,g,b: 0–255 → h: 0–360, s: 0–100, v: 0–100\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const delta = max - min;\n\n const v = max * 100;\n const s = max === 0 ? 0 : (delta / max) * 100;\n\n let h = 0;\n if (delta !== 0) {\n if (max === rn) h = ((gn - bn) / delta) % 6;\n else if (max === gn) h = (bn - rn) / delta + 2;\n else h = (rn - gn) / delta + 4;\n h = h * 60;\n if (h < 0) h += 360;\n }\n\n // Deliberately NOT rounded. HSV is this component's internal state, and\n // rounding s/v to whole percent makes the hex -> HSV -> hex round trip lossy:\n // `#5c5de8` came back as `#5d5de8`, so a controlled `value` displayed a\n // different colour than the one passed in, and any interaction committed the\n // drifted value. `hsvToRgb` already rounds to whole channels at the end, so\n // precision is only needed in between. Every consumer of these floats (the\n // hue gradient, the thumb offsets, the hue slider) accepts them.\n return { h, s, v };\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n const ch = (n: number) =>\n Math.round(Math.max(0, Math.min(255, n)))\n .toString(16)\n .padStart(2, '0');\n return `#${ch(r)}${ch(g)}${ch(b)}`;\n}\n\nfunction hexToRgb(hex: string): RGBColor | null {\n const c = hex.trim().replace(/^#/, '');\n let r: number, g: number, b: number;\n\n if (c.length === 3) {\n r = parseInt(c[0] + c[0], 16);\n g = parseInt(c[1] + c[1], 16);\n b = parseInt(c[2] + c[2], 16);\n } else if (c.length === 6) {\n r = parseInt(c.slice(0, 2), 16);\n g = parseInt(c.slice(2, 4), 16);\n b = parseInt(c.slice(4, 6), 16);\n } else {\n return null;\n }\n\n if (isNaN(r) || isNaN(g) || isNaN(b)) return null;\n return { r, g, b };\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): HSLColor {\n // r,g,b: 0–255 → h: 0–360, s: 0–100, l: 0–100\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const delta = max - min;\n const l = (max + min) / 2;\n\n let h = 0;\n let s = 0;\n\n if (delta !== 0) {\n s = delta / (1 - Math.abs(2 * l - 1));\n if (max === rn) h = ((gn - bn) / delta) % 6;\n else if (max === gn) h = (bn - rn) / delta + 2;\n else h = (rn - gn) / delta + 4;\n h = h * 60;\n if (h < 0) h += 360;\n }\n\n return { h: Math.round(h), s: Math.round(s * 100), l: Math.round(l * 100) };\n}\n\nfunction hslToRgb(h: number, s: number, l: number): RGBColor {\n // h: 0–360, s: 0–100, l: 0–100 → r,g,b: 0–255\n const sn = s / 100;\n const ln = l / 100;\n const c = (1 - Math.abs(2 * ln - 1)) * sn;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = ln - c / 2;\n\n let r: number, g: number, b: number;\n if (h < 60) {\n r = c;\n g = x;\n b = 0;\n } else if (h < 120) {\n r = x;\n g = c;\n b = 0;\n } else if (h < 180) {\n r = 0;\n g = c;\n b = x;\n } else if (h < 240) {\n r = 0;\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n g = 0;\n b = c;\n } else {\n r = c;\n g = 0;\n b = x;\n }\n\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n };\n}\n\n// ============================================================================\n// Format helpers\n// ============================================================================\n\nfunction colorToText(hsv: HSVColor, alpha: number, fmt: ColorFormat): string {\n const rgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n\n switch (fmt) {\n case 'hex':\n return rgbToHex(rgb.r, rgb.g, rgb.b);\n case 'rgb':\n return alpha < 1\n ? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha.toFixed(2)})`\n : `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n case 'hsl': {\n const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n return alpha < 1\n ? `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${alpha.toFixed(2)})`\n : `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n }\n}\n\nfunction parseColorText(text: string): RGBColor | null {\n const t = text.trim();\n\n // Try hex (with or without leading #)\n const hexCandidate = t.startsWith('#') ? t : /^[0-9a-f]{3,6}$/i.test(t) ? `#${t}` : null;\n if (hexCandidate) return hexToRgb(hexCandidate);\n\n // Try rgb() / rgba()\n const rgbMatch = t.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/i);\n if (rgbMatch) {\n return {\n r: parseInt(rgbMatch[1], 10),\n g: parseInt(rgbMatch[2], 10),\n b: parseInt(rgbMatch[3], 10),\n };\n }\n\n // Try hsl() / hsla()\n const hslMatch = t.match(/hsla?\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?/i);\n if (hslMatch) {\n return hslToRgb(\n parseInt(hslMatch[1], 10),\n parseInt(hslMatch[2], 10),\n parseInt(hslMatch[3], 10),\n );\n }\n\n return null;\n}\n\n/** Parse a hex string to HSVColor, falling back to red on failure. */\nfunction hexToHsv(hex: string): HSVColor {\n const rgb = hexToRgb(hex);\n return rgb ? rgbToHsv(rgb.r, rgb.g, rgb.b) : { h: 0, s: 100, v: 100 };\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({\n value,\n defaultValue,\n onChange,\n format = 'hex',\n showAlpha = false,\n showSwatches = true,\n swatches = DEFAULT_SWATCHES,\n disabled = false,\n size = 'md',\n inline = false,\n label,\n ariaLabel,\n className = '',\n}) => {\n // ── Initial hex (only used on first render by useState) ──────────────────\n const initialHex = value ?? defaultValue ?? '#6366f1';\n\n // ── State ─────────────────────────────────────────────────────────────────\n const [hsv, setHsv] = useState<HSVColor>(() => hexToHsv(initialHex));\n const [alpha, setAlpha] = useState<number>(1);\n const [activeFormat, setActiveFormat] = useState<ColorFormat>(format);\n const [inputText, setInputText] = useState<string>(() =>\n colorToText(hexToHsv(initialHex), 1, format),\n );\n const [copied, setCopied] = useState(false);\n\n // ── Refs - give event handlers always-fresh values without stale closures ──\n const hsvRef = useRef<HSVColor>(hsv);\n hsvRef.current = hsv;\n\n const alphaRef = useRef<number>(alpha);\n alphaRef.current = alpha;\n\n const activeFormatRef = useRef<ColorFormat>(activeFormat);\n activeFormatRef.current = activeFormat;\n\n // onChange is stored in a ref so applyColor never becomes stale\n const onChangeRef = useRef<ColorPickerProps['onChange']>(onChange);\n onChangeRef.current = onChange;\n\n const inputFocusedRef = useRef(false);\n const canvasRef = useRef<HTMLDivElement>(null);\n\n // Refs for in-flight drag listeners - cleaned up on mouseup and on unmount\n const dragHandlersRef = useRef<{\n move: (e: MouseEvent) => void;\n up: () => void;\n } | null>(null);\n\n const copiedTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // ── Derived ───────────────────────────────────────────────────────────────\n const currentRgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n const currentHex = rgbToHex(currentRgb.r, currentRgb.g, currentRgb.b);\n\n // ── Sync from controlled `value` prop ─────────────────────────────────────\n // Runs only when `value` changes. We normalize both sides to the same\n // hex format before comparing so that round-trip conversions don't trigger\n // spurious updates (which would overwrite the preserved hue when s/v = 0).\n useEffect(() => {\n if (value === undefined) return;\n const rgb = hexToRgb(value);\n if (!rgb) return;\n const newHsv = rgbToHsv(rgb.r, rgb.g, rgb.b);\n const newNormalised = rgbToHex(\n ...(Object.values(hsvToRgb(newHsv.h, newHsv.s, newHsv.v)) as [number, number, number]),\n );\n // currentHex is captured from this render - guards against echo loops\n // when the parent echoes back our own onChange emission\n if (newNormalised === currentHex) return;\n setHsv(newHsv);\n if (!inputFocusedRef.current) {\n setInputText(colorToText(newHsv, alphaRef.current, activeFormatRef.current));\n }\n }, [value, currentHex]);\n\n // ── Cleanup drag listeners and timers on unmount ──────────────────────────\n useEffect(() => {\n return () => {\n if (dragHandlersRef.current) {\n document.removeEventListener('mousemove', dragHandlersRef.current.move);\n document.removeEventListener('mouseup', dragHandlersRef.current.up);\n }\n if (copiedTimerRef.current) clearTimeout(copiedTimerRef.current);\n };\n }, []);\n\n // ── Core: apply a new HSV + alpha, emit onChange ───────────────────────────\n // Stable (empty dep array) - reads live values exclusively via refs.\n const applyColor = useCallback((newHsv: HSVColor, newAlpha: number) => {\n setHsv(newHsv);\n setAlpha(newAlpha);\n\n if (!inputFocusedRef.current) {\n setInputText(colorToText(newHsv, newAlpha, activeFormatRef.current));\n }\n\n const rgb = hsvToRgb(newHsv.h, newHsv.s, newHsv.v);\n const hex = rgbToHex(rgb.r, rgb.g, rgb.b);\n onChangeRef.current?.(hex);\n }, []);\n\n // ── 2-D saturation / brightness canvas ────────────────────────────────────\n const handleCanvasMouseDown = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n e.preventDefault();\n\n const pick = (clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const s = Math.max(0, Math.min(100, ((clientX - rect.left) / rect.width) * 100));\n const v = Math.max(0, Math.min(100, 100 - ((clientY - rect.top) / rect.height) * 100));\n applyColor({ h: hsvRef.current.h, s, v }, alphaRef.current);\n };\n\n pick(e.clientX, e.clientY);\n\n const handleMouseMove = (me: MouseEvent) => pick(me.clientX, me.clientY);\n const handleMouseUp = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n dragHandlersRef.current = null;\n };\n\n dragHandlersRef.current = { move: handleMouseMove, up: handleMouseUp };\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n },\n [disabled, applyColor],\n );\n\n // ── Hue slider ────────────────────────────────────────────────────────────\n const handleHueChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n applyColor({ ...hsvRef.current, h: Number(e.target.value) }, alphaRef.current);\n },\n [applyColor],\n );\n\n // ── Alpha slider ──────────────────────────────────────────────────────────\n const handleAlphaChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n applyColor(hsvRef.current, Number(e.target.value) / 100);\n },\n [applyColor],\n );\n\n // ── Format toggle ─────────────────────────────────────────────────────────\n const handleFormatChange = useCallback((fmt: ColorFormat) => {\n setActiveFormat(fmt);\n setInputText(colorToText(hsvRef.current, alphaRef.current, fmt));\n }, []);\n\n // ── Text-input commit (Enter / blur) ──────────────────────────────────────\n const handleInputCommit = useCallback(() => {\n const rgb = parseColorText(inputText);\n if (!rgb) {\n // Invalid - reset to the current valid colour\n setInputText(colorToText(hsvRef.current, alphaRef.current, activeFormatRef.current));\n return;\n }\n const newHsv = rgbToHsv(rgb.r, rgb.g, rgb.b);\n applyColor(newHsv, alphaRef.current);\n // Always normalise the text after a commit (even if the input still has focus)\n setInputText(colorToText(newHsv, alphaRef.current, activeFormatRef.current));\n }, [inputText, applyColor]);\n\n // ── Swatch click ──────────────────────────────────────────────────────────\n const handleSwatchClick = useCallback(\n (hex: string) => {\n const rgb = hexToRgb(hex);\n if (!rgb) return;\n applyColor(rgbToHsv(rgb.r, rgb.g, rgb.b), alphaRef.current);\n },\n [applyColor],\n );\n\n // ── Copy to clipboard ─────────────────────────────────────────────────────\n const handleCopy = useCallback(() => {\n const text = colorToText(hsvRef.current, alphaRef.current, activeFormatRef.current);\n navigator.clipboard\n .writeText(text)\n .then(() => {\n setCopied(true);\n if (copiedTimerRef.current) clearTimeout(copiedTimerRef.current);\n copiedTimerRef.current = setTimeout(() => setCopied(false), 2000);\n })\n .catch(() => {\n // Clipboard access denied - silently ignore\n });\n }, []);\n\n // ── Alpha-slider background gradient ─────────────────────────────────────\n // We use a transparent-to-current-colour gradient layered over a checkerboard\n // so the alpha slider always shows the correct colour transition.\n const transparentColor = `rgba(${currentRgb.r}, ${currentRgb.g}, ${currentRgb.b}, 0)`;\n\n const alphaTrackBg = {\n backgroundImage: [\n `linear-gradient(to right, ${transparentColor}, ${currentHex})`,\n 'linear-gradient(45deg, #e2e8f0 25%, transparent 25%)',\n 'linear-gradient(-45deg, #e2e8f0 25%, transparent 25%)',\n 'linear-gradient(45deg, transparent 75%, #e2e8f0 75%)',\n 'linear-gradient(-45deg, transparent 75%, #e2e8f0 75%)',\n ].join(', '),\n backgroundSize: '100%, 8px 8px, 8px 8px, 8px 8px, 8px 8px',\n backgroundPosition: '0 0, 0 0, 0 4px, 4px -4px, -4px 0',\n };\n\n // ── Picker panel (shared between inline and popover modes) ────────────────\n //\n // The size modifier has to live on the panel itself, not only on the root:\n // in popover mode the panel is portaled to document.body by Dropdown, so\n // anything inside it that sized itself off a `.eidos-color-picker--{size}`\n // ancestor matched nothing and collapsed. That is what removed the\n // saturation/brightness canvas entirely from every non-inline picker.\n const panel = (\n <div\n className={`eidos-color-picker-panel eidos-color-picker-panel--${size}${\n inline ? ' eidos-color-picker-panel--inline' : ''\n }`}\n >\n {/* 2-D sat / brightness canvas */}\n <div\n ref={canvasRef}\n className=\"eidos-color-picker-canvas\"\n style={{\n background: [\n 'linear-gradient(to top, #000, transparent)',\n `linear-gradient(to right, #fff, hsl(${hsv.h}, 100%, 50%))`,\n ].join(', '),\n }}\n onMouseDown={handleCanvasMouseDown}\n role=\"presentation\"\n >\n <div\n className=\"eidos-color-picker-thumb\"\n style={{\n // Rounded for display only - hsv.s/v are unrounded floats so the\n // hex round trip stays lossless (see rgbToHsv).\n left: `${hsv.s.toFixed(2)}%`,\n top: `${(100 - hsv.v).toFixed(2)}%`,\n background: currentHex,\n }}\n />\n </div>\n\n {/* Sliders */}\n <div className=\"eidos-color-picker-sliders\">\n {/* Hue */}\n <input\n type=\"range\"\n className=\"eidos-color-picker-hue\"\n min={0}\n max={360}\n step={1}\n value={hsv.h}\n disabled={disabled}\n onChange={handleHueChange}\n aria-label=\"Hue\"\n />\n\n {/* Alpha */}\n {showAlpha && (\n <div className=\"eidos-color-picker-alpha-wrapper\">\n <div className=\"eidos-color-picker-alpha-bg\" style={alphaTrackBg} />\n <input\n type=\"range\"\n className=\"eidos-color-picker-alpha\"\n min={0}\n max={100}\n step={1}\n value={Math.round(alpha * 100)}\n disabled={disabled}\n onChange={handleAlphaChange}\n aria-label=\"Opacity\"\n />\n </div>\n )}\n </div>\n\n {/* Text input + format toggles + copy */}\n <div className=\"eidos-color-picker-inputs\">\n <div className=\"eidos-color-picker-format-btns\" role=\"group\" aria-label=\"Colour format\">\n {(['hex', 'rgb', 'hsl'] as ColorFormat[]).map((fmt) => (\n <button\n key={fmt}\n type=\"button\"\n className={[\n 'eidos-color-picker-format-btn',\n activeFormat === fmt && 'eidos-color-picker-format-btn--active',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => handleFormatChange(fmt)}\n disabled={disabled}\n aria-pressed={activeFormat === fmt}\n >\n {fmt.toUpperCase()}\n </button>\n ))}\n </div>\n\n <input\n type=\"text\"\n className=\"eidos-color-picker-input\"\n value={inputText}\n disabled={disabled}\n spellCheck={false}\n aria-label=\"Colour value\"\n onChange={(e) => setInputText(e.target.value)}\n onFocus={() => {\n inputFocusedRef.current = true;\n }}\n onBlur={() => {\n inputFocusedRef.current = false;\n handleInputCommit();\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleInputCommit();\n if (e.key === 'Escape') {\n setInputText(colorToText(hsvRef.current, alphaRef.current, activeFormatRef.current));\n }\n }}\n />\n\n <button\n type=\"button\"\n className={['eidos-color-picker-copy', copied && 'eidos-color-picker-copy--copied']\n .filter(Boolean)\n .join(' ')}\n onClick={handleCopy}\n disabled={disabled}\n aria-label=\"Copy colour value\"\n title=\"Copy colour value\"\n >\n {copied ? <Check size={14} /> : <Copy size={14} />}\n </button>\n </div>\n\n {/* Swatches */}\n {showSwatches && (\n <div className=\"eidos-color-picker-swatches\" role=\"group\" aria-label=\"Colour presets\">\n {swatches.map((swatchHex) => (\n <button\n key={swatchHex}\n type=\"button\"\n className={[\n 'eidos-color-picker-swatch',\n currentHex === swatchHex && 'eidos-color-picker-swatch--active',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ background: swatchHex }}\n onClick={() => handleSwatchClick(swatchHex)}\n disabled={disabled}\n aria-label={`Select ${swatchHex}`}\n title={swatchHex}\n />\n ))}\n </div>\n )}\n </div>\n );\n\n // ── Root element classes ───────────────────────────────────────────────────\n const rootClasses = [\n 'eidos-color-picker',\n `eidos-color-picker--${size}`,\n disabled && 'eidos-color-picker--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // ── Inline mode ───────────────────────────────────────────────────────────\n if (inline) {\n return (\n <div className={rootClasses}>\n {label && <span className=\"eidos-color-picker-label\">{label}</span>}\n {panel}\n </div>\n );\n }\n\n // ── Popover (trigger + Dropdown) ──────────────────────────────────────────\n return (\n <div className={rootClasses}>\n {label && <span className=\"eidos-color-picker-label\">{label}</span>}\n <Dropdown\n trigger={\n <button\n type=\"button\"\n className=\"eidos-color-picker-trigger\"\n disabled={disabled}\n aria-label={label ?? ariaLabel ?? 'Open colour picker'}\n >\n <span\n className=\"eidos-color-picker-trigger-swatch\"\n style={{ background: currentHex }}\n />\n <span className=\"eidos-color-picker-trigger-value\">{currentHex}</span>\n </button>\n }\n content={panel}\n placement=\"bottom\"\n autoWidth={false}\n minWidth={260}\n disabled={disabled}\n />\n </div>\n );\n};\n\nColorPicker.displayName = 'ColorPicker';\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MenuPanel
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CP335H4Q.js";
|
|
4
4
|
import {
|
|
5
5
|
Dropdown
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-67EXHO4T.js";
|
|
7
7
|
import {
|
|
8
8
|
renderIcon
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-WT4WBHBR.js";
|
|
10
10
|
|
|
11
11
|
// src/components/SplitButton/SplitButton.component.tsx
|
|
12
12
|
import { useCallback } from "react";
|
|
@@ -94,4 +94,4 @@ var SplitButton = ({
|
|
|
94
94
|
export {
|
|
95
95
|
SplitButton
|
|
96
96
|
};
|
|
97
|
-
//# sourceMappingURL=chunk-
|
|
97
|
+
//# sourceMappingURL=chunk-FPLX5FIK.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkMLUHM3VGcjs = require('./chunk-MLUHM3VG.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkVHSTB7GBcjs = require('./chunk-VHSTB7GB.cjs');
|
|
7
7
|
|
|
8
8
|
// src/components/Chip/Chip.component.tsx
|
|
9
9
|
var _lucidereact = require('lucide-react');
|
|
@@ -45,26 +45,31 @@ var Chip = ({
|
|
|
45
45
|
if (disabled || !onRemove) return;
|
|
46
46
|
onRemove();
|
|
47
47
|
};
|
|
48
|
+
const hasBothControls = isClickable && isRemovable;
|
|
48
49
|
const ChipElement = isClickable && !isRemovable ? "button" : "div";
|
|
50
|
+
const body = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
51
|
+
preIcon && _chunkVHSTB7GBcjs.renderIcon.call(void 0, preIcon, "eidos-chip--pre-icon"),
|
|
52
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-chip--copy", children }),
|
|
53
|
+
posIcon && _chunkVHSTB7GBcjs.renderIcon.call(void 0, posIcon, "eidos-chip--pos-icon")
|
|
54
|
+
] });
|
|
49
55
|
const chipContent = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
50
56
|
ChipElement,
|
|
51
57
|
{
|
|
52
58
|
className: chipClasses,
|
|
53
59
|
disabled: ChipElement === "button" ? disabled : void 0,
|
|
54
|
-
onClick: isClickable ? handleClick : void 0,
|
|
55
|
-
role: ChipElement === "div" && isClickable ? "button" : void 0,
|
|
56
|
-
tabIndex: ChipElement === "div" && isClickable ? 0 : void 0,
|
|
57
|
-
onKeyDown: ChipElement === "div" && isClickable ? (e) => {
|
|
58
|
-
if ((e.key === "Enter" || e.key === " ") && !disabled) {
|
|
59
|
-
e.preventDefault();
|
|
60
|
-
handleClick();
|
|
61
|
-
}
|
|
62
|
-
} : void 0,
|
|
60
|
+
onClick: isClickable && !hasBothControls ? handleClick : void 0,
|
|
63
61
|
...chipProps,
|
|
64
62
|
children: [
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
hasBothControls ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
64
|
+
"button",
|
|
65
|
+
{
|
|
66
|
+
type: "button",
|
|
67
|
+
className: "eidos-chip--action",
|
|
68
|
+
onClick: handleClick,
|
|
69
|
+
disabled,
|
|
70
|
+
children: body
|
|
71
|
+
}
|
|
72
|
+
) : body,
|
|
68
73
|
isRemovable && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
69
74
|
"button",
|
|
70
75
|
{
|
|
@@ -79,10 +84,10 @@ var Chip = ({
|
|
|
79
84
|
]
|
|
80
85
|
}
|
|
81
86
|
);
|
|
82
|
-
return tooltip ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
87
|
+
return tooltip ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkMLUHM3VGcjs.Tooltip, { message: tooltip, children: chipContent }) : chipContent;
|
|
83
88
|
};
|
|
84
89
|
|
|
85
90
|
|
|
86
91
|
|
|
87
92
|
exports.Chip = Chip;
|
|
88
|
-
//# sourceMappingURL=chunk-
|
|
93
|
+
//# sourceMappingURL=chunk-FXMRDNR6.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-FXMRDNR6.cjs","../src/components/Chip/Chip.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACNA,2CAAkB;AAoEd,+CAAA;AA/DG,IAAM,KAAA,EAA4B,CAAC;AAAA,EACxC,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,KAAA;AAAA,EACX,UAAA,EAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EACA,UAAA,EAAY,EAAA;AAAA,EACZ,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,YAAA,EAAc,CAAC,CAAC,OAAA;AACtB,EAAA,MAAM,YAAA,EAAc,CAAC,CAAC,QAAA;AAGtB,EAAA,MAAM,YAAA,EAAc;AAAA,IAClB,YAAA;AAAA,IACA,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA;AACF,IAAA;AACD,IAAA;AACP,IAAA;AACG,IAAA;AACA,IAAA;AACF,IAAA;AACb,IAAA;AAGM,EAAA;AAEY,EAAA;AACD,IAAA;AACT,IAAA;AACV,EAAA;AAEsB,EAAA;AACF,IAAA;AACD,IAAA;AACR,IAAA;AACX,EAAA;AAiBwB,EAAA;AACJ,EAAA;AAGlB,EAAA;AACyB,IAAA;AAEtB,oBAAA;AAEsB,IAAA;AACzB,EAAA;AAIA,EAAA;AAAC,IAAA;AAAA,IAAA;AACY,MAAA;AACD,MAAA;AACD,MAAA;AACL,MAAA;AAEH,MAAA;AACC,QAAA;AAAC,UAAA;AAAA,UAAA;AACM,YAAA;AACK,YAAA;AACD,YAAA;AACT,YAAA;AAEC,YAAA;AAAA,UAAA;AAGH,QAAA;AAIA,QAAA;AAAC,UAAA;AAAA,UAAA;AACW,YAAA;AACD,YAAA;AACT,YAAA;AACW,YAAA;AACN,YAAA;AAEL,YAAA;AAAuC,UAAA;AACzC,QAAA;AAAA,MAAA;AAAA,IAAA;AAEJ,EAAA;AAGe,EAAA;AACnB;ADzB2B;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-FXMRDNR6.cjs","sourcesContent":[null,"import React from 'react';\nimport { X } from 'lucide-react';\nimport type { ChipProps } from './Chip.types';\nimport { Tooltip } from '../Tooltip/Tooltip.component';\nimport { renderIcon } from '../../utils';\n\nexport const Chip: React.FC<ChipProps> = ({\n variant = 'filled',\n color = 'primary',\n size = 'md',\n disabled = false,\n fullWidth = false,\n tooltip,\n className = '',\n preIcon,\n posIcon,\n children,\n onClick,\n onRemove,\n ...chipProps\n}) => {\n const isClickable = !!onClick;\n const isRemovable = !!onRemove;\n\n // Build CSS classes\n const chipClasses = [\n 'eidos-chip',\n `eidos-chip--${variant}`,\n `eidos-chip--${color}`,\n `eidos-chip--${size}`,\n disabled && 'eidos-chip--disabled',\n isClickable && 'eidos-chip--clickable',\n isRemovable && 'eidos-chip--removable',\n fullWidth && 'eidos-chip--full-width',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleClick = () => {\n if (disabled || !onClick) return;\n onClick();\n };\n\n const handleRemove = (e: React.MouseEvent) => {\n e.stopPropagation(); // Prevent chip click when removing\n if (disabled || !onRemove) return;\n onRemove();\n };\n\n // A chip that is both clickable and removable holds *two* controls, so it\n // has to render them as siblings.\n //\n // The previous shape switched the outer element to a `<div>` when\n // removable - the comment said \"to avoid nested buttons\" - and then gave\n // that div `role=\"button\"` and `tabIndex={0}`. That is the same defect\n // wearing a different hat: a button containing a button, which is invalid\n // (`nested-interactive`) and leaves a screen reader announcing a control\n // inside a control. It is the same shape already fixed on `Dropdown` and\n // `DataGrid`'s rows.\n //\n // Now the outer element is a plain container whenever there is a remove\n // button, and the chip's own action moves to an inner `<button>` wrapping\n // just the content. Each control is separately reachable and separately\n // named.\n const hasBothControls = isClickable && isRemovable;\n const ChipElement = isClickable && !isRemovable ? 'button' : 'div';\n\n const body = (\n <>\n {preIcon && renderIcon(preIcon, 'eidos-chip--pre-icon')}\n\n <span className=\"eidos-chip--copy\">{children}</span>\n\n {posIcon && renderIcon(posIcon, 'eidos-chip--pos-icon')}\n </>\n );\n\n const chipContent = (\n <ChipElement\n className={chipClasses}\n disabled={ChipElement === 'button' ? disabled : undefined}\n onClick={isClickable && !hasBothControls ? handleClick : undefined}\n {...chipProps}\n >\n {hasBothControls ? (\n <button\n type=\"button\"\n className=\"eidos-chip--action\"\n onClick={handleClick}\n disabled={disabled}\n >\n {body}\n </button>\n ) : (\n body\n )}\n\n {isRemovable && (\n <button\n className=\"eidos-chip--remove-button\"\n onClick={handleRemove}\n disabled={disabled}\n aria-label=\"Remove\"\n type=\"button\"\n >\n <X className=\"eidos-chip--remove-icon\" />\n </button>\n )}\n </ChipElement>\n );\n\n return tooltip ? <Tooltip message={tooltip}>{chipContent}</Tooltip> : chipContent;\n};\n"]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkP7J6WZTOcjs = require('./chunk-P7J6WZTO.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
var _chunkKVIL4EP4cjs = require('./chunk-KVIL4EP4.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkMLUHM3VGcjs = require('./chunk-MLUHM3VG.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunkVHSTB7GBcjs = require('./chunk-VHSTB7GB.cjs');
|
|
13
13
|
|
|
14
14
|
// src/components/Menu/Menu.component.tsx
|
|
15
15
|
var _react = require('react');
|
|
@@ -41,7 +41,7 @@ var MenuPanel = ({ items, className = "", onItemClick }) => {
|
|
|
41
41
|
].filter(Boolean).join(" "),
|
|
42
42
|
onClick: () => handleItemClick(item),
|
|
43
43
|
children: [
|
|
44
|
-
item.icon &&
|
|
44
|
+
item.icon && _chunkVHSTB7GBcjs.renderIcon.call(void 0, item.icon, "eidos-menu-icon"),
|
|
45
45
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: `eidos-menu-label`, children: item.label }),
|
|
46
46
|
item.shortcut && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKVIL4EP4cjs.Kbd, { size: "sm", className: "eidos-menu-shortcut", children: item.shortcut })
|
|
47
47
|
]
|
|
@@ -54,12 +54,12 @@ var MenuPanel = ({ items, className = "", onItemClick }) => {
|
|
|
54
54
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { className: `eidos-menu-separator` }, item.id);
|
|
55
55
|
case "nested": {
|
|
56
56
|
const triggerElement = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: `eidos-menu-nested-trigger`, children: [
|
|
57
|
-
item.icon &&
|
|
57
|
+
item.icon && _chunkVHSTB7GBcjs.renderIcon.call(void 0, item.icon, "eidos-menu-icon"),
|
|
58
58
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: `eidos-menu-label`, children: item.label }),
|
|
59
59
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronRight, { className: `eidos-menu-nested-arrow` })
|
|
60
60
|
] });
|
|
61
61
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { className: `eidos-menu-nested-item`, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
62
|
-
|
|
62
|
+
_chunkP7J6WZTOcjs.Dropdown,
|
|
63
63
|
{
|
|
64
64
|
trigger: triggerElement,
|
|
65
65
|
content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MenuPanel, { items: item.items, onItemClick }),
|
|
@@ -103,7 +103,7 @@ var Menu = ({
|
|
|
103
103
|
[closeOnItemClick]
|
|
104
104
|
);
|
|
105
105
|
const dropdown = /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
106
|
-
|
|
106
|
+
_chunkP7J6WZTOcjs.Dropdown,
|
|
107
107
|
{
|
|
108
108
|
trigger,
|
|
109
109
|
content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MenuPanel, { items, onItemClick: handleItemClick }),
|
|
@@ -115,11 +115,11 @@ var Menu = ({
|
|
|
115
115
|
triggerRef
|
|
116
116
|
}
|
|
117
117
|
);
|
|
118
|
-
return tooltip ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
118
|
+
return tooltip ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkMLUHM3VGcjs.Tooltip, { message: tooltip, children: dropdown }) : dropdown;
|
|
119
119
|
};
|
|
120
120
|
|
|
121
121
|
|
|
122
122
|
|
|
123
123
|
|
|
124
124
|
exports.MenuPanel = MenuPanel; exports.Menu = Menu;
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
125
|
+
//# sourceMappingURL=chunk-G74DHVHV.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-G74DHVHV.cjs","../src/components/Menu/Menu.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACbA,8BAAmC;AACnC,2CAA6B;AAoCnB,+CAAA;AAxBH,IAAM,UAAA,EAAiC,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,EAAA,EAAI,YAAY,CAAA,EAAA,GAAM;AAExF,EAAA,MAAM,gBAAA,EAAkB,gCAAA;AAAA,IACtB,CAAC,IAAA,EAAA,GAAmB;AAClB,MAAA,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,MAAA;AAGnB,MAAA,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS;AAChB,QAAA,IAAA,CAAK,OAAA,CAAQ,CAAA;AAAA,MACf;AAGA,MAAA,GAAA,CAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,IAAI,CAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,EACd,CAAA;AAGA,EAAA,MAAM,eAAA,EAAiB,CAAC,IAAA,EAAA,GAAwC;AAC9D,IAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM;AAAA,MACjB,KAAK,MAAA;AACH,QAAA,uBACE,8BAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAW;AAAA,cACT,iBAAA;AAAA,cACA,IAAA,CAAK,SAAA,EAAW,4BAAA,EAA8B,EAAA;AAAA,cAC9C,IAAA,CAAK,MAAA,EAAQ,CAAA,iBAAA,EAAoB,IAAA,CAAK,KAAK,CAAA,EAAA;AAGlC,YAAA;AACwB,YAAA;AAElC,YAAA;AAAmC,cAAA;AACnB,8BAAA;AAEV,cAAA;AAEL,YAAA;AAAA,UAAA;AAfQ,UAAA;AAiBZ,QAAA;AAGC,MAAA;AAE4B,QAAA;AAK5B,MAAA;AACiC,QAAA;AAEvB,MAAA;AAEV,QAAA;AACqC,UAAA;AACnB,0BAAA;AACQ,0BAAA;AAC3B,QAAA;AAI6B,QAAA;AAC1B,UAAA;AAAA,UAAA;AACU,YAAA;AACW,YAAA;AACV,YAAA;AACA,YAAA;AACD,YAAA;AAAA,UAAA;AAEb,QAAA;AAEJ,MAAA;AAEA,MAAA;AACS,QAAA;AACX,IAAA;AACF,EAAA;AAEsB,EAAA;AACxB;AAEiD;AAC/C,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACY,EAAA;AACZ,EAAA;AACmB,EAAA;AACnB,EAAA;AACI;AACoB,EAAA;AACD,IAAA;AAIG,MAAA;AAEH,QAAA;AAE2B,UAAA;AAC/B,YAAA;AACG,YAAA;AACN,YAAA;AACP,UAAA;AAC2B,UAAA;AACzB,QAAA;AACP,MAAA;AACF,IAAA;AACiB,IAAA;AACnB,EAAA;AAGE,EAAA;AAAC,IAAA;AAAA,IAAA;AACC,MAAA;AACkC,MAAA;AAClC,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AAAA,IAAA;AACF,EAAA;AAGwB,EAAA;AAC5B;AD1B0D;AACA;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-G74DHVHV.cjs","sourcesContent":[null,"import React, { useCallback } from 'react';\nimport { ChevronRight } from 'lucide-react';\nimport type { MenuProps, MenuItemType, MenuItem, MenuWrapperProps } from './Menu.types';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport { Tooltip } from '../Tooltip/Tooltip.component';\nimport { Kbd } from '../Kbd/Kbd.component';\nimport { renderIcon } from '../../utils';\n\n/**\n * MenuPanel - the bare menu list, without any trigger or dropdown wrapper.\n * Exported for use in SplitButton, ContextMenu, and other consumers that need\n * to render the menu content inside their own Dropdown / portal.\n */\nexport const MenuPanel: React.FC<MenuProps> = ({ items, className = '', onItemClick }) => {\n // Handle menu item click\n const handleItemClick = useCallback(\n (item: MenuItem) => {\n if (item.disabled) return;\n\n // Execute the item's onClick handler first\n if (item.onClick) {\n item.onClick();\n }\n\n // Then call the onItemClick callback (which will close the dropdown)\n if (onItemClick) {\n onItemClick(item);\n }\n },\n [onItemClick],\n );\n\n // Render individual menu item\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\n switch (item.type) {\n case 'item':\n return (\n <li\n key={item.id}\n className={[\n 'eidos-menu-item',\n item.disabled ? 'eidos-menu-item--disabled' : '',\n item.color ? `eidos-menu-item--${item.color}` : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => handleItemClick(item)}\n >\n {item.icon && renderIcon(item.icon, 'eidos-menu-icon')}\n <span className={`eidos-menu-label`}>{item.label}</span>\n {item.shortcut && (\n <Kbd size=\"sm\" className=\"eidos-menu-shortcut\">\n {item.shortcut}\n </Kbd>\n )}\n </li>\n );\n\n case 'component':\n return (\n <li key={item.id} className={`eidos-menu-component-item`}>\n {item.component}\n </li>\n );\n\n case 'separator':\n return <li key={item.id} className={`eidos-menu-separator`} />;\n\n case 'nested': {\n const triggerElement = (\n <div className={`eidos-menu-nested-trigger`}>\n {item.icon && renderIcon(item.icon, 'eidos-menu-icon')}\n <span className={`eidos-menu-label`}>{item.label}</span>\n <ChevronRight className={`eidos-menu-nested-arrow`} />\n </div>\n );\n\n return (\n <li key={item.id} className={`eidos-menu-nested-item`}>\n <Dropdown\n trigger={triggerElement}\n content={<MenuPanel items={item.items} onItemClick={onItemClick} />}\n placement=\"right\"\n isNested={true}\n fullWidth\n />\n </li>\n );\n }\n\n default:\n return null;\n }\n };\n\n return <ul className={`eidos-menu ${className}`}>{items.map(renderMenuItem)}</ul>;\n};\n\nexport const Menu: React.FC<MenuWrapperProps> = ({\n trigger,\n items,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n autoWidth = true,\n triggerRef,\n closeOnItemClick = true,\n tooltip,\n}) => {\n const handleItemClick = useCallback(\n (_item: MenuItem) => {\n // Note: item.onClick is already called in MenuPanel's handleItemClick\n // Here we only handle closing the dropdown if needed\n\n if (closeOnItemClick) {\n // Use a small delay to ensure the onClick handler completes\n setTimeout(() => {\n // Create a synthetic click event outside the dropdown to close it\n const event = new MouseEvent('mousedown', {\n bubbles: true,\n cancelable: true,\n view: window,\n });\n document.dispatchEvent(event);\n }, 10);\n }\n },\n [closeOnItemClick],\n );\n\n const dropdown = (\n <Dropdown\n trigger={trigger}\n content={<MenuPanel items={items} onItemClick={handleItemClick} />}\n minWidth={minWidth}\n maxWidth={maxWidth}\n minHeight={minHeight}\n maxHeight={maxHeight}\n autoWidth={autoWidth}\n triggerRef={triggerRef}\n />\n );\n\n return tooltip ? <Tooltip message={tooltip}>{dropdown}</Tooltip> : dropdown;\n};\n"]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkMLUHM3VGcjs = require('./chunk-MLUHM3VG.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
var _chunkVHSTB7GBcjs = require('./chunk-VHSTB7GB.cjs');
|
|
7
8
|
|
|
8
9
|
// src/components/SegmentedControl/SegmentedControl.component.tsx
|
|
9
10
|
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
@@ -130,6 +131,12 @@ var SegmentedControl = ({
|
|
|
130
131
|
const track = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref: trackRef, className: containerClasses, role: "radiogroup", children: options.map((opt) => {
|
|
131
132
|
const isActive = activeValue === opt.value;
|
|
132
133
|
const isDisabled = disabled || !!opt.disabled;
|
|
134
|
+
if (!opt.label && !opt.tooltip) {
|
|
135
|
+
_chunkVHSTB7GBcjs.devWarn.call(void 0,
|
|
136
|
+
"segmented-icon-only-name",
|
|
137
|
+
`SegmentedControl: option "${opt.value}" has an icon but no \`label\` or \`tooltip\`, so it has no accessible name.`
|
|
138
|
+
);
|
|
139
|
+
}
|
|
133
140
|
const segment = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
134
141
|
"button",
|
|
135
142
|
{
|
|
@@ -142,14 +149,15 @@ var SegmentedControl = ({
|
|
|
142
149
|
className: ["eidos-segmented-item", isActive && "eidos-segmented-item--active"].filter(Boolean).join(" "),
|
|
143
150
|
onClick: () => !isDisabled && handleSelect(opt.value),
|
|
144
151
|
onKeyDown: handleKeyDown,
|
|
152
|
+
"aria-label": !opt.label ? opt.tooltip : void 0,
|
|
145
153
|
children: [
|
|
146
|
-
opt.icon &&
|
|
154
|
+
opt.icon && _chunkVHSTB7GBcjs.renderIcon.call(void 0, opt.icon, "eidos-segmented-icon"),
|
|
147
155
|
opt.label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-segmented-label", children: opt.label })
|
|
148
156
|
]
|
|
149
157
|
},
|
|
150
158
|
opt.value
|
|
151
159
|
);
|
|
152
|
-
return opt.tooltip ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
160
|
+
return opt.tooltip ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkMLUHM3VGcjs.Tooltip, { message: opt.tooltip, children: segment }, opt.value) : _react2.default.cloneElement(segment, { key: opt.value });
|
|
153
161
|
}) });
|
|
154
162
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: barClasses, children: [
|
|
155
163
|
showPrevButton && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
@@ -183,4 +191,4 @@ var SegmentedControl = ({
|
|
|
183
191
|
|
|
184
192
|
|
|
185
193
|
exports.SegmentedControl = SegmentedControl;
|
|
186
|
-
//# sourceMappingURL=chunk-
|
|
194
|
+
//# sourceMappingURL=chunk-GMDVW76A.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-GMDVW76A.cjs","../src/components/SegmentedControl/SegmentedControl.component.tsx"],"names":["track"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-GMDVW76A.cjs","sourcesContent":[null,"import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Tooltip } from '../Tooltip';\nimport { renderIcon, devWarn } from '../../utils';\nimport type { SegmentedControlProps } from './SegmentedControl.types';\n\n/**\n * SegmentedControl - a compact, single-select toggle group rendered as a pill.\n *\n * Semantics: `role=\"radiogroup\"` on the container, `role=\"radio\"` on each\n * segment. Supports controlled and uncontrolled usage.\n *\n * @example\n * ```tsx\n * // Controlled\n * const [view, setView] = useState('list');\n * <SegmentedControl\n * options={[\n * { value: 'list', icon: List, tooltip: 'List view' },\n * { value: 'grid', icon: LayoutGrid, tooltip: 'Grid view' },\n * { value: 'table', icon: Table2, tooltip: 'Table view' },\n * ]}\n * value={view}\n * onChange={setView}\n * />\n *\n * // With labels\n * <SegmentedControl\n * options={[\n * { value: 'day', label: 'Day' },\n * { value: 'week', label: 'Week' },\n * { value: 'month', label: 'Month' },\n * ]}\n * defaultValue=\"week\"\n * onChange={console.log}\n * />\n * ```\n */\nexport const SegmentedControl: React.FC<SegmentedControlProps> = ({\n options,\n value,\n defaultValue,\n onChange,\n size = 'md',\n color = 'primary',\n disabled = false,\n fullWidth = false,\n scrollButtons = 'auto',\n className = '',\n}) => {\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? options[0]?.value ?? '',\n );\n\n const activeValue = isControlled ? value : internalValue;\n\n const handleSelect = (optValue: string) => {\n if (disabled) return;\n if (optValue === activeValue) return; // already selected\n if (!isControlled) setInternalValue(optValue);\n onChange?.(optValue);\n };\n\n const trackRef = useRef<HTMLDivElement>(null);\n\n // Roving tabindex: the group is a single tab stop, and arrow keys move\n // within it - the WAI-ARIA radiogroup pattern, which this had none of.\n // Every segment used to be its own tab stop, so a six-option control cost\n // six presses to skip past.\n //\n // The tabbable segment is the selected one; if nothing is selected (a\n // controlled `value` matching no option), the first enabled segment takes\n // the stop so the group can still be reached at all.\n const selectableValues = options.filter((opt) => !opt.disabled).map((opt) => opt.value);\n const hasSelection = selectableValues.includes(activeValue);\n const fallbackTabbableValue = selectableValues[0];\n\n const isTabbable = (optValue: string) =>\n hasSelection ? optValue === activeValue : optValue === fallbackTabbableValue;\n\n // Selection follows focus, which is what the radio pattern specifies -\n // unlike `Tabs`, where arrow keys only move focus. Disabled segments are\n // skipped rather than selected-and-ignored, and both ends wrap.\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (disabled || selectableValues.length === 0) return;\n\n const currentIndex = selectableValues.indexOf(activeValue);\n const from = currentIndex === -1 ? 0 : currentIndex;\n let targetIndex = -1;\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n targetIndex = (from + 1) % selectableValues.length;\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n targetIndex = (from - 1 + selectableValues.length) % selectableValues.length;\n } else if (event.key === 'Home') {\n targetIndex = 0;\n } else if (event.key === 'End') {\n targetIndex = selectableValues.length - 1;\n }\n\n if (targetIndex === -1) return;\n\n event.preventDefault();\n const targetValue = selectableValues[targetIndex];\n handleSelect(targetValue);\n\n // Focus has to follow the selection explicitly: the segment that was\n // focused is about to lose its `tabIndex={0}` to the newly selected one,\n // and focus does not move on its own.\n const target = trackRef.current?.querySelector<HTMLElement>(\n `[data-value=\"${CSS.escape(targetValue)}\"]`,\n );\n target?.focus();\n };\n\n // The selected segment can sit outside the scrollport - after a controlled\n // `value` change, or once focus moves to a segment off screen. `scrollLeft`\n // is set directly rather than through `scrollIntoView`, which walks the\n // whole ancestor chain and would scroll the page vertically when the\n // control is below the fold.\n useLayoutEffect(() => {\n const track = trackRef.current;\n if (!track) return;\n\n const activeItem = track.querySelector('[aria-checked=\"true\"]') as HTMLElement | null;\n if (!activeItem) return;\n\n const left = activeItem.offsetLeft;\n const right = left + activeItem.offsetWidth;\n\n if (left < track.scrollLeft) {\n track.scrollLeft = left;\n } else if (right > track.scrollLeft + track.clientWidth) {\n track.scrollLeft = right - track.clientWidth;\n }\n }, [activeValue]);\n\n // Whether either end has segments hidden past it. Drives the presence of\n // each button: none at all when the track fits, and none at the end already\n // reached, since a button there would point at nothing.\n const [scrollState, setScrollState] = useState({ canScrollPrev: false, canScrollNext: false });\n const hasScrollButtons = scrollButtons !== 'none';\n\n useEffect(() => {\n if (!hasScrollButtons) return;\n const track = trackRef.current;\n if (!track) return;\n\n const update = () => {\n const maxScroll = track.scrollWidth - track.clientWidth;\n // 1px of tolerance: fractional layout widths leave a sub-pixel\n // remainder at either end that would otherwise keep a button enabled\n // for a scroll that can no longer move anything.\n const canScrollPrev = track.scrollLeft > 1;\n const canScrollNext = track.scrollLeft < maxScroll - 1;\n setScrollState((previous) =>\n previous.canScrollPrev === canScrollPrev && previous.canScrollNext === canScrollNext\n ? previous\n : { canScrollPrev, canScrollNext },\n );\n };\n\n update();\n track.addEventListener('scroll', update, { passive: true });\n\n // The track's own box stays the same width when a label reflows or a font\n // finishes loading, so the segments have to be observed as well as the\n // container - only their sizes tell us the track started overflowing.\n const observer = new ResizeObserver(update);\n observer.observe(track);\n Array.from(track.children).forEach((child) => observer.observe(child));\n\n return () => {\n track.removeEventListener('scroll', update);\n observer.disconnect();\n };\n }, [hasScrollButtons, options.length, size, fullWidth]);\n\n const scrollByStep = (direction: -1 | 1) => {\n const track = trackRef.current;\n if (!track) return;\n\n // A step just short of a full page keeps a segment of context on screen,\n // the same way a paged scrollbar click does.\n const step = track.clientWidth * 0.8;\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n track.scrollBy({ left: direction * step, behavior: reducedMotion ? 'auto' : 'smooth' });\n };\n\n const barClasses = [\n 'eidos-segmented-bar',\n fullWidth && 'eidos-segmented-bar--full-width',\n disabled && 'eidos-segmented-bar--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const containerClasses = [\n 'eidos-segmented',\n `eidos-segmented--${size}`,\n `eidos-segmented--${color}`,\n disabled && 'eidos-segmented--disabled',\n fullWidth && 'eidos-segmented--full-width',\n // With buttons, they are the affordance - a native scrollbar under a\n // compact pill control is redundant and would break its shape.\n hasScrollButtons && 'eidos-segmented--hide-scrollbar',\n ]\n .filter(Boolean)\n .join(' ');\n\n const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;\n const showNextButton = hasScrollButtons && scrollState.canScrollNext;\n\n const scrollButtonClasses = (direction: 'prev' | 'next') =>\n [\n 'eidos-segmented-scroll-button',\n `eidos-segmented-scroll-button--${direction}`,\n `eidos-segmented-scroll-button--${size}`,\n ].join(' ');\n\n const track = (\n <div ref={trackRef} className={containerClasses} role=\"radiogroup\">\n {options.map((opt) => {\n const isActive = activeValue === opt.value;\n const isDisabled = disabled || !!opt.disabled;\n\n // An icon-only segment has no text to be named by. `tooltip` wraps\n // it in a `Tooltip`, which contributes nothing to the accessible\n // name, so such a segment was announced as just \"radio\" - identical\n // to every other segment, making the group unusable by voice or\n // screen reader. Same fallback as `Button`.\n if (!opt.label && !opt.tooltip) {\n devWarn(\n 'segmented-icon-only-name',\n `SegmentedControl: option \"${opt.value}\" has an icon but no \\`label\\` or \\`tooltip\\`, so it has no accessible name.`,\n );\n }\n\n const segment = (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n disabled={isDisabled}\n // Read back by the keyboard handler to move focus onto the newly\n // selected segment, which `value` alone can't identify in the DOM.\n data-value={opt.value}\n tabIndex={isTabbable(opt.value) ? 0 : -1}\n className={['eidos-segmented-item', isActive && 'eidos-segmented-item--active']\n .filter(Boolean)\n .join(' ')}\n onClick={() => !isDisabled && handleSelect(opt.value)}\n onKeyDown={handleKeyDown}\n aria-label={!opt.label ? opt.tooltip : undefined}\n >\n {opt.icon && renderIcon(opt.icon, 'eidos-segmented-icon')}\n {opt.label && <span className=\"eidos-segmented-label\">{opt.label}</span>}\n </button>\n );\n\n return opt.tooltip ? (\n <Tooltip key={opt.value} message={opt.tooltip}>\n {segment}\n </Tooltip>\n ) : (\n React.cloneElement(segment, { key: opt.value })\n );\n })}\n </div>\n );\n\n // The buttons are siblings of the track, never children of it:\n // `role=\"radiogroup\"` only accepts radios. They are also hidden from\n // assistive tech and skipped by Tab, because they are a pointer affordance\n // for something the keyboard already does - tabbing to a segment scrolls it\n // into view. Same arrangement as `Tabs`.\n return (\n <div className={barClasses}>\n {showPrevButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('prev')}\n onClick={() => scrollByStep(-1)}\n // `tabIndex={-1}` keeps these out of the tab order, but it does not\n // stop a *click* from focusing them - and focus landing inside an\n // `aria-hidden` subtree is an error the browser reports (\"Blocked\n // aria-hidden on an element because its descendant retained\n // focus\"). Suppressing the default mousedown behaviour keeps the\n // button unfocusable by pointer as well, while the click still\n // fires. `inert` would also prevent the click, so it is not an\n // option here.\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronLeft className=\"eidos-segmented-scroll-button-icon\" />\n </button>\n )}\n\n {track}\n\n {showNextButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('next')}\n onClick={() => scrollByStep(1)}\n onMouseDown={(event) => event.preventDefault()} // see the prev button\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronRight className=\"eidos-segmented-scroll-button-icon\" />\n </button>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -135,7 +135,7 @@ function FileUpload({
|
|
|
135
135
|
onKeyDown: handleKeyDown,
|
|
136
136
|
role: "button",
|
|
137
137
|
tabIndex: disabled ? -1 : 0,
|
|
138
|
-
"aria-label": "
|
|
138
|
+
"aria-label": "Click to upload, or drag and drop",
|
|
139
139
|
"aria-disabled": disabled || void 0,
|
|
140
140
|
children: [
|
|
141
141
|
/* @__PURE__ */ jsx("div", { className: "eidos-file-upload-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Upload, {}) }),
|
|
@@ -191,4 +191,4 @@ FileUpload.displayName = "FileUpload";
|
|
|
191
191
|
export {
|
|
192
192
|
FileUpload
|
|
193
193
|
};
|
|
194
|
-
//# sourceMappingURL=chunk-
|
|
194
|
+
//# sourceMappingURL=chunk-GOF6A4M4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/FileUpload/FileUpload.component.tsx"],"sourcesContent":["import React, { useState, useRef } from 'react';\nimport { Upload, X, CircleAlert, FileText } from 'lucide-react';\nimport type { FileUploadProps } from './FileUpload.types';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction isFileTypeAccepted(file: File, acceptedTypes: string[]): boolean {\n return acceptedTypes.some((type) => {\n const trimmed = type.trim();\n // Extension match: \".pdf\", \".docx\"\n if (trimmed.startsWith('.')) {\n return file.name.toLowerCase().endsWith(trimmed.toLowerCase());\n }\n // Wildcard MIME group: \"image/*\", \"video/*\"\n if (trimmed.endsWith('/*')) {\n const baseType = trimmed.slice(0, -2);\n return file.type.startsWith(`${baseType}/`);\n }\n // Exact MIME type: \"application/pdf\"\n return file.type === trimmed;\n });\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport function FileUpload({\n accept,\n multiple = false,\n maxSize,\n maxFiles,\n onFilesAccepted,\n onFilesRejected,\n hint,\n disabled = false,\n className = '',\n}: FileUploadProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [files, setFiles] = useState<File[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n // ── Validation ─────────────────────────────────────────────────────────────\n\n const validateAndAccept = (fileList: FileList | File[]) => {\n const incoming = Array.from(fileList);\n\n if (maxFiles !== undefined && incoming.length > maxFiles) {\n setError(`Maximum ${maxFiles} file${maxFiles === 1 ? '' : 's'} allowed`);\n onFilesRejected?.(incoming, 'count');\n return;\n }\n\n if (accept) {\n const acceptedTypes = accept.split(',').map((t) => t.trim());\n const invalid = incoming.filter((f) => !isFileTypeAccepted(f, acceptedTypes));\n if (invalid.length > 0) {\n setError('One or more files have an unsupported type');\n onFilesRejected?.(incoming, 'type');\n return;\n }\n }\n\n if (maxSize !== undefined) {\n const oversized = incoming.filter((f) => f.size > maxSize);\n if (oversized.length > 0) {\n setError(`File size exceeds the ${formatBytes(maxSize)} limit`);\n onFilesRejected?.(oversized, 'size');\n return;\n }\n }\n\n setError(null);\n setFiles(incoming);\n onFilesAccepted?.(incoming);\n };\n\n // ── Drag handlers ──────────────────────────────────────────────────────────\n\n const handleDragEnter = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n // Prevent default to allow the drop event to fire\n e.preventDefault();\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n // Only clear the dragging state when leaving the zone entirely,\n // not when moving over a child element inside it.\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setIsDragging(false);\n }\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n const { files: dropped } = e.dataTransfer;\n if (dropped.length > 0) validateAndAccept(dropped);\n };\n\n // ── Click / keyboard ───────────────────────────────────────────────────────\n\n const handleZoneClick = () => {\n if (!disabled) inputRef.current?.click();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleZoneClick();\n }\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n validateAndAccept(e.target.files);\n }\n // Reset the input value so the same file(s) can be re-selected\n e.target.value = '';\n };\n\n // ── File list management ───────────────────────────────────────────────────\n\n const handleRemoveFile = (index: number) => {\n const remaining = files.filter((_, i) => i !== index);\n setFiles(remaining);\n onFilesAccepted?.(remaining);\n };\n\n // ── CSS classes ────────────────────────────────────────────────────────────\n\n const rootClasses = ['eidos-file-upload', className].filter(Boolean).join(' ');\n\n const zoneClasses = [\n 'eidos-file-upload-zone',\n isDragging && 'eidos-file-upload-zone--dragging',\n disabled && 'eidos-file-upload-zone--disabled',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Build the auto-generated hint from the constraints when no hint is provided\n const autoHint = [\n accept ? `Accepted: ${accept}` : null,\n maxSize ? `Max size: ${formatBytes(maxSize)}` : null,\n maxFiles && multiple ? `Up to ${maxFiles} files` : null,\n ]\n .filter(Boolean)\n .join(' · ');\n\n const displayHint = hint ?? (autoHint.length > 0 ? autoHint : null);\n\n return (\n <div\n className={rootClasses}\n role=\"region\"\n aria-label=\"File upload\"\n aria-disabled={disabled || undefined}\n >\n <div\n className={zoneClasses}\n onClick={handleZoneClick}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label=\"Upload files - click or drag and drop\"\n aria-disabled={disabled || undefined}\n >\n <div className=\"eidos-file-upload-icon\" aria-hidden=\"true\">\n <Upload />\n </div>\n\n <div className=\"eidos-file-upload-text\">\n <p className=\"eidos-file-upload-title\">\n <em>Click to upload</em>\n </p>\n <span style={{ fontWeight: 'normal', fontSize: '0.875rem' }}>or drag and drop</span>\n {displayHint && <p className=\"eidos-file-upload-hint\">{displayHint}</p>}\n </div>\n\n {/* Hidden native input - triggered programmatically via click() */}\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={handleFileChange}\n className=\"eidos-file-upload-input-hidden\"\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n </div>\n\n {error && (\n <p className=\"eidos-file-upload-error\" role=\"alert\">\n <CircleAlert aria-hidden=\"true\" />\n {error}\n </p>\n )}\n\n {files.length > 0 && (\n <ul className=\"eidos-file-upload-list\" aria-label=\"Selected files\">\n {files.map((file, index) => (\n <li key={`${file.name}-${index}`} className=\"eidos-file-upload-item\">\n <div className=\"eidos-file-upload-item-info\">\n <FileText aria-hidden=\"true\" />\n <span className=\"eidos-file-upload-item-name\">{file.name}</span>\n <span className=\"eidos-file-upload-item-size\">{formatBytes(file.size)}</span>\n </div>\n <button\n type=\"button\"\n className=\"eidos-file-upload-item-remove\"\n onClick={() => handleRemoveFile(index)}\n aria-label={`Remove ${file.name}`}\n >\n <X />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nFileUpload.displayName = 'FileUpload';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/components/FileUpload/FileUpload.component.tsx"],"sourcesContent":["import React, { useState, useRef } from 'react';\nimport { Upload, X, CircleAlert, FileText } from 'lucide-react';\nimport type { FileUploadProps } from './FileUpload.types';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction isFileTypeAccepted(file: File, acceptedTypes: string[]): boolean {\n return acceptedTypes.some((type) => {\n const trimmed = type.trim();\n // Extension match: \".pdf\", \".docx\"\n if (trimmed.startsWith('.')) {\n return file.name.toLowerCase().endsWith(trimmed.toLowerCase());\n }\n // Wildcard MIME group: \"image/*\", \"video/*\"\n if (trimmed.endsWith('/*')) {\n const baseType = trimmed.slice(0, -2);\n return file.type.startsWith(`${baseType}/`);\n }\n // Exact MIME type: \"application/pdf\"\n return file.type === trimmed;\n });\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport function FileUpload({\n accept,\n multiple = false,\n maxSize,\n maxFiles,\n onFilesAccepted,\n onFilesRejected,\n hint,\n disabled = false,\n className = '',\n}: FileUploadProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [files, setFiles] = useState<File[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n // ── Validation ─────────────────────────────────────────────────────────────\n\n const validateAndAccept = (fileList: FileList | File[]) => {\n const incoming = Array.from(fileList);\n\n if (maxFiles !== undefined && incoming.length > maxFiles) {\n setError(`Maximum ${maxFiles} file${maxFiles === 1 ? '' : 's'} allowed`);\n onFilesRejected?.(incoming, 'count');\n return;\n }\n\n if (accept) {\n const acceptedTypes = accept.split(',').map((t) => t.trim());\n const invalid = incoming.filter((f) => !isFileTypeAccepted(f, acceptedTypes));\n if (invalid.length > 0) {\n setError('One or more files have an unsupported type');\n onFilesRejected?.(incoming, 'type');\n return;\n }\n }\n\n if (maxSize !== undefined) {\n const oversized = incoming.filter((f) => f.size > maxSize);\n if (oversized.length > 0) {\n setError(`File size exceeds the ${formatBytes(maxSize)} limit`);\n onFilesRejected?.(oversized, 'size');\n return;\n }\n }\n\n setError(null);\n setFiles(incoming);\n onFilesAccepted?.(incoming);\n };\n\n // ── Drag handlers ──────────────────────────────────────────────────────────\n\n const handleDragEnter = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n // Prevent default to allow the drop event to fire\n e.preventDefault();\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n // Only clear the dragging state when leaving the zone entirely,\n // not when moving over a child element inside it.\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setIsDragging(false);\n }\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n const { files: dropped } = e.dataTransfer;\n if (dropped.length > 0) validateAndAccept(dropped);\n };\n\n // ── Click / keyboard ───────────────────────────────────────────────────────\n\n const handleZoneClick = () => {\n if (!disabled) inputRef.current?.click();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleZoneClick();\n }\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n validateAndAccept(e.target.files);\n }\n // Reset the input value so the same file(s) can be re-selected\n e.target.value = '';\n };\n\n // ── File list management ───────────────────────────────────────────────────\n\n const handleRemoveFile = (index: number) => {\n const remaining = files.filter((_, i) => i !== index);\n setFiles(remaining);\n onFilesAccepted?.(remaining);\n };\n\n // ── CSS classes ────────────────────────────────────────────────────────────\n\n const rootClasses = ['eidos-file-upload', className].filter(Boolean).join(' ');\n\n const zoneClasses = [\n 'eidos-file-upload-zone',\n isDragging && 'eidos-file-upload-zone--dragging',\n disabled && 'eidos-file-upload-zone--disabled',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Build the auto-generated hint from the constraints when no hint is provided\n const autoHint = [\n accept ? `Accepted: ${accept}` : null,\n maxSize ? `Max size: ${formatBytes(maxSize)}` : null,\n maxFiles && multiple ? `Up to ${maxFiles} files` : null,\n ]\n .filter(Boolean)\n .join(' · ');\n\n const displayHint = hint ?? (autoHint.length > 0 ? autoHint : null);\n\n return (\n <div\n className={rootClasses}\n role=\"region\"\n aria-label=\"File upload\"\n aria-disabled={disabled || undefined}\n >\n <div\n className={zoneClasses}\n onClick={handleZoneClick}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n // Starts with the visible \"Click to upload\" so the name contains the\n // label a speech-input user can see (SC 2.5.3). The previous\n // \"Upload files - click or drag and drop\" paraphrased it instead.\n aria-label=\"Click to upload, or drag and drop\"\n aria-disabled={disabled || undefined}\n >\n <div className=\"eidos-file-upload-icon\" aria-hidden=\"true\">\n <Upload />\n </div>\n\n <div className=\"eidos-file-upload-text\">\n <p className=\"eidos-file-upload-title\">\n <em>Click to upload</em>\n </p>\n <span style={{ fontWeight: 'normal', fontSize: '0.875rem' }}>or drag and drop</span>\n {displayHint && <p className=\"eidos-file-upload-hint\">{displayHint}</p>}\n </div>\n\n {/* Hidden native input - triggered programmatically via click() */}\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={handleFileChange}\n className=\"eidos-file-upload-input-hidden\"\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n </div>\n\n {error && (\n <p className=\"eidos-file-upload-error\" role=\"alert\">\n <CircleAlert aria-hidden=\"true\" />\n {error}\n </p>\n )}\n\n {files.length > 0 && (\n <ul className=\"eidos-file-upload-list\" aria-label=\"Selected files\">\n {files.map((file, index) => (\n <li key={`${file.name}-${index}`} className=\"eidos-file-upload-item\">\n <div className=\"eidos-file-upload-item-info\">\n <FileText aria-hidden=\"true\" />\n <span className=\"eidos-file-upload-item-name\">{file.name}</span>\n <span className=\"eidos-file-upload-item-size\">{formatBytes(file.size)}</span>\n </div>\n <button\n type=\"button\"\n className=\"eidos-file-upload-item-remove\"\n onClick={() => handleRemoveFile(index)}\n aria-label={`Remove ${file.name}`}\n >\n <X />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nFileUpload.displayName = 'FileUpload';\n"],"mappings":"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","names":[]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Select
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-TLECMA3B.js";
|
|
4
4
|
import {
|
|
5
5
|
Button
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-44T4HMFU.js";
|
|
7
7
|
|
|
8
8
|
// src/components/Pagination/Pagination.component.tsx
|
|
9
|
-
import { useState, useEffect } from "react";
|
|
9
|
+
import { useState, useEffect, useId } from "react";
|
|
10
10
|
import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from "lucide-react";
|
|
11
11
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
12
|
var ELLIPSIS = "ellipsis";
|
|
@@ -52,6 +52,7 @@ var Pagination = ({
|
|
|
52
52
|
onPageSizeChange,
|
|
53
53
|
pageSizeOptions = [10, 25, 50, 100]
|
|
54
54
|
}) => {
|
|
55
|
+
const pageSizeId = useId();
|
|
55
56
|
const items = usePaginationRange(page, totalPages, siblingCount);
|
|
56
57
|
const [inputValue, setInputValue] = useState(String(page));
|
|
57
58
|
useEffect(() => {
|
|
@@ -182,7 +183,7 @@ var Pagination = ({
|
|
|
182
183
|
] }),
|
|
183
184
|
/* @__PURE__ */ jsxs("div", { className: "eidos-pagination-controls", children: [
|
|
184
185
|
hasPageSize && /* @__PURE__ */ jsxs("div", { className: "eidos-pagination-size", children: [
|
|
185
|
-
/* @__PURE__ */ jsx("label", { className: "eidos-pagination-size-label", children: "Show:" }),
|
|
186
|
+
/* @__PURE__ */ jsx("label", { className: "eidos-pagination-size-label", htmlFor: pageSizeId, children: "Show:" }),
|
|
186
187
|
/* @__PURE__ */ jsx(
|
|
187
188
|
Select,
|
|
188
189
|
{
|
|
@@ -195,7 +196,7 @@ var Pagination = ({
|
|
|
195
196
|
})),
|
|
196
197
|
clearable: false,
|
|
197
198
|
disabled,
|
|
198
|
-
inputProps: { size: "sm", width: 72 }
|
|
199
|
+
inputProps: { size: "sm", width: 72, id: pageSizeId }
|
|
199
200
|
}
|
|
200
201
|
)
|
|
201
202
|
] }),
|
|
@@ -208,4 +209,4 @@ Pagination.displayName = "Pagination";
|
|
|
208
209
|
export {
|
|
209
210
|
Pagination
|
|
210
211
|
};
|
|
211
|
-
//# sourceMappingURL=chunk-
|
|
212
|
+
//# sourceMappingURL=chunk-GPK2THIG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Pagination/Pagination.component.tsx"],"sourcesContent":["import React, { useState, useEffect, useId } from 'react';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react';\nimport { Button } from '../Button';\nimport { Select } from '../Select';\nimport type { PaginationProps } from './Pagination.types';\n\n// ── Ellipsis range helper ─────────────────────────────────────────────────────\n\nconst ELLIPSIS = 'ellipsis' as const;\ntype PageItem = number | typeof ELLIPSIS;\n\nfunction usePaginationRange(page: number, totalPages: number, siblingCount: number): PageItem[] {\n const totalShown = siblingCount * 2 + 5;\n\n if (totalPages <= totalShown) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const leftSibling = Math.max(page - siblingCount, 1);\n const rightSibling = Math.min(page + siblingCount, totalPages);\n\n const showLeftEllipsis = leftSibling > 2;\n const showRightEllipsis = rightSibling < totalPages - 1;\n\n const items: PageItem[] = [1];\n\n if (showLeftEllipsis) {\n items.push(ELLIPSIS);\n } else {\n for (let i = 2; i < leftSibling; i++) items.push(i);\n }\n\n for (let i = leftSibling; i <= rightSibling; i++) {\n if (i !== 1 && i !== totalPages) items.push(i);\n }\n\n if (showRightEllipsis) {\n items.push(ELLIPSIS);\n } else {\n for (let i = rightSibling + 1; i < totalPages; i++) items.push(i);\n }\n\n items.push(totalPages);\n\n return items;\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport const Pagination: React.FC<PaginationProps> = ({\n page,\n totalPages,\n onChange,\n siblingCount = 1,\n showFirstLast = false,\n color = 'primary',\n size = 'sm',\n disabled = false,\n className = '',\n // Table-footer mode\n totalItems,\n pageSize,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n}) => {\n const pageSizeId = useId();\n const items = usePaginationRange(page, totalPages, siblingCount);\n\n // ── Active-page editable input ─────────────────────────────────────────────\n const [inputValue, setInputValue] = useState(String(page));\n useEffect(() => {\n setInputValue(String(page));\n }, [page]);\n\n const commitInput = (raw: string) => {\n const val = parseInt(raw, 10);\n if (!isNaN(val) && val >= 1 && val <= totalPages && val !== page) {\n onChange(val);\n } else {\n setInputValue(String(page)); // revert on invalid or same-page\n }\n };\n\n // ── Layout flags ───────────────────────────────────────────────────────────\n const hasResults = totalItems !== undefined && pageSize !== undefined;\n const hasPageSize = !!onPageSizeChange && pageSize !== undefined;\n const tableMode = hasResults || hasPageSize;\n\n const startItem = hasResults ? (totalItems === 0 ? 0 : (page - 1) * pageSize! + 1) : undefined;\n const endItem = hasResults ? Math.min(page * pageSize!, totalItems!) : undefined;\n\n const rootClasses = [\n 'eidos-pagination',\n `eidos-pagination--${size}`,\n tableMode && 'eidos-pagination--table',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // ── Navigation block ───────────────────────────────────────────────────────\n const nav = (\n <nav aria-label=\"Pagination\" className=\"eidos-pagination-nav\">\n {showFirstLast && (\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronsLeft}\n disabled={page === 1 || disabled}\n onClick={() => onChange(1)}\n aria-label=\"First page\"\n />\n )}\n\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronLeft}\n disabled={page === 1 || disabled}\n onClick={() => onChange(page - 1)}\n aria-label=\"Previous page\"\n />\n\n {items.map((item, i) =>\n item === ELLIPSIS ? (\n <span key={`ellipsis-${i}`} className=\"eidos-pagination-ellipsis\" aria-hidden=\"true\">\n …\n </span>\n ) : item === page ? (\n // Active page - styled as filled chip, editable via keyboard/click\n <input\n key=\"active-page\"\n type=\"text\"\n inputMode=\"numeric\"\n className={[\n 'eidos-pagination-page',\n 'eidos-pagination-page--active',\n `eidos-pagination-page--${color}`,\n ].join(' ')}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onFocus={(e) => e.target.select()}\n onBlur={() => commitInput(inputValue)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n commitInput(inputValue);\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n setInputValue(String(page));\n e.currentTarget.blur();\n }\n }}\n aria-label={`Page ${page} of ${totalPages}, editable`}\n aria-current=\"page\"\n disabled={disabled}\n />\n ) : (\n <button\n key={item}\n type=\"button\"\n className=\"eidos-pagination-page\"\n onClick={() => onChange(item)}\n disabled={disabled}\n aria-label={`Page ${item}`}\n >\n {item}\n </button>\n ),\n )}\n\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronRight}\n disabled={page === totalPages || disabled}\n onClick={() => onChange(page + 1)}\n aria-label=\"Next page\"\n />\n\n {showFirstLast && (\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronsRight}\n disabled={page === totalPages || disabled}\n onClick={() => onChange(totalPages)}\n aria-label=\"Last page\"\n />\n )}\n </nav>\n );\n\n // ── Standalone mode ────────────────────────────────────────────────────────\n if (!tableMode) {\n return <div className={rootClasses}>{nav}</div>;\n }\n\n // ── Table-footer mode ──────────────────────────────────────────────────────\n return (\n <div className={rootClasses}>\n {hasResults && (\n <span className=\"eidos-pagination-info\">\n Showing {startItem}-{endItem} of {totalItems} results\n </span>\n )}\n\n <div className=\"eidos-pagination-controls\">\n {hasPageSize && (\n <div className=\"eidos-pagination-size\">\n <label className=\"eidos-pagination-size-label\" htmlFor={pageSizeId}>\n Show:\n </label>\n <Select\n value={String(pageSize)}\n onChange={(val) => onPageSizeChange(Number(val))}\n options={pageSizeOptions.map((n) => ({\n id: String(n),\n value: String(n),\n label: String(n),\n }))}\n clearable={false}\n disabled={disabled}\n // Sizes the whole field, chevron and padding included - wide\n // enough for a 3-digit page size. `'3ch'` used to work here only\n // because `Input.width` sized the inner <input> and let the\n // chrome overflow it; now that it sizes the field, 3ch left no\n // room for the value at all.\n // Associated with the visible \"Show:\" label above rather\n // than given an `aria-label`. The `<label>` was real but had no\n // `htmlFor`, so it named nothing; an `aria-label` would have\n // worked for axe while risking SC 2.5.3 Label in Name, since\n // the spoken name would no longer contain the visible text.\n inputProps={{ size: 'sm', width: 72, id: pageSizeId }}\n />\n </div>\n )}\n\n {totalPages > 1 && nav}\n </div>\n </div>\n );\n};\n\nPagination.displayName = 'Pagination';\n"],"mappings":"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","names":[]}
|