eidos-ui 3.3.0 → 3.5.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/{Menu.types-DNIpjSAK.d.ts → Menu.types-BN4g1-3A.d.ts} +9 -0
- package/dist/{Menu.types-DwcuCZM7.d.cts → Menu.types-CTnUijv5.d.cts} +9 -0
- package/dist/{Select.types-B4kDpkGB.d.ts → Select.types-C2tGy1vj.d.ts} +11 -1
- package/dist/{Select.types-CAkT2ACt.d.cts → Select.types-ok-03rLo.d.cts} +11 -1
- package/dist/{Table.types-CPj-udMc.d.cts → Table.types-D-9tC0kJ.d.cts} +2 -3
- package/dist/{Table.types-CZZ7QWAI.d.ts → Table.types-D8pmgxKA.d.ts} +2 -3
- package/dist/{Toolbar.types-RN0klQzu.d.ts → Toolbar.types-CKnQC_TW.d.ts} +1 -1
- package/dist/{Toolbar.types-DSk8z2iy.d.cts → Toolbar.types-DUz2mxct.d.cts} +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-ITXDSQT2.js → chunk-24HKKSKX.js} +94 -102
- package/dist/chunk-24HKKSKX.js.map +1 -0
- package/dist/{chunk-GDQWSCJQ.js → chunk-26SO4LZ5.js} +4 -4
- package/dist/{chunk-GPRJYPIG.js → chunk-2JW3WSBF.js} +6 -4
- package/dist/chunk-2JW3WSBF.js.map +1 -0
- package/dist/{chunk-MHZIBV2C.js → chunk-2PCCGQOH.js} +90 -19
- package/dist/chunk-2PCCGQOH.js.map +1 -0
- package/dist/{chunk-3EPND5M2.cjs → chunk-2T7ZMMH5.cjs} +72 -19
- package/dist/chunk-2T7ZMMH5.cjs.map +1 -0
- package/dist/chunk-35LGEPLP.cjs +134 -0
- package/dist/chunk-35LGEPLP.cjs.map +1 -0
- package/dist/{chunk-R4M6SNUU.cjs → chunk-36JFXFM2.cjs} +48 -37
- package/dist/chunk-36JFXFM2.cjs.map +1 -0
- package/dist/{chunk-ND526PMG.cjs → chunk-3KBBJZHK.cjs} +11 -11
- package/dist/{chunk-ND526PMG.cjs.map → chunk-3KBBJZHK.cjs.map} +1 -1
- package/dist/{chunk-EH42ND5Q.cjs → chunk-3RWZC6OW.cjs} +5 -5
- package/dist/{chunk-EH42ND5Q.cjs.map → chunk-3RWZC6OW.cjs.map} +1 -1
- package/dist/{chunk-G5N3C6AU.cjs → chunk-3ZRFOKDM.cjs} +36 -36
- package/dist/{chunk-G5N3C6AU.cjs.map → chunk-3ZRFOKDM.cjs.map} +1 -1
- package/dist/{chunk-I5XR2V4A.cjs → chunk-4AO5RKV5.cjs} +87 -96
- package/dist/chunk-4AO5RKV5.cjs.map +1 -0
- package/dist/{chunk-5HUZYY54.js → chunk-4J25XZDI.js} +23 -13
- package/dist/chunk-4J25XZDI.js.map +1 -0
- package/dist/{chunk-FXZJL2AM.cjs → chunk-4JSTBA4F.cjs} +12 -6
- package/dist/chunk-4JSTBA4F.cjs.map +1 -0
- package/dist/{chunk-GG5YGESX.js → chunk-4LNTZPSQ.js} +4 -3
- package/dist/chunk-4LNTZPSQ.js.map +1 -0
- package/dist/{chunk-3EUTXQDB.js → chunk-5XH2PHT2.js} +31 -24
- package/dist/chunk-5XH2PHT2.js.map +1 -0
- package/dist/{chunk-OJDYTCMO.cjs → chunk-66UQTF57.cjs} +69 -62
- package/dist/chunk-66UQTF57.cjs.map +1 -0
- package/dist/{chunk-MCWTQT3M.cjs → chunk-6JHVXWDV.cjs} +125 -54
- package/dist/chunk-6JHVXWDV.cjs.map +1 -0
- package/dist/chunk-75GFIQRU.js +88 -0
- package/dist/chunk-75GFIQRU.js.map +1 -0
- package/dist/{chunk-55J4LEKT.cjs → chunk-7BFODYNL.cjs} +11 -8
- package/dist/chunk-7BFODYNL.cjs.map +1 -0
- package/dist/{chunk-TEVZHN5I.cjs → chunk-7VJCGKVP.cjs} +28 -15
- package/dist/chunk-7VJCGKVP.cjs.map +1 -0
- package/dist/{chunk-KQJ3IAFT.js → chunk-A3LMUPG3.js} +2 -2
- package/dist/{chunk-O2AACVSF.js → chunk-AR2ZOO6L.js} +3 -3
- package/dist/{chunk-Z5U4NJTW.cjs → chunk-BEOECPVJ.cjs} +50 -23
- package/dist/chunk-BEOECPVJ.cjs.map +1 -0
- package/dist/{chunk-E7FGY7BJ.js → chunk-BFKPJ627.js} +5 -4
- package/dist/chunk-BFKPJ627.js.map +1 -0
- package/dist/{chunk-M7PF4FKQ.js → chunk-D7SQ7LHJ.js} +6 -3
- package/dist/chunk-D7SQ7LHJ.js.map +1 -0
- package/dist/chunk-DA375AI6.cjs +88 -0
- package/dist/chunk-DA375AI6.cjs.map +1 -0
- package/dist/{chunk-H6CWTMAH.js → chunk-DGXHR6FV.js} +5 -2
- package/dist/chunk-DGXHR6FV.js.map +1 -0
- package/dist/{chunk-ZNWIHUHZ.cjs → chunk-DU5JKTHK.cjs} +12 -4
- package/dist/chunk-DU5JKTHK.cjs.map +1 -0
- package/dist/{chunk-HALVTKW7.js → chunk-FIVMMCGM.js} +72 -81
- package/dist/chunk-FIVMMCGM.js.map +1 -0
- package/dist/{chunk-RYOQYYDO.js → chunk-GIEDIAPD.js} +12 -6
- package/dist/chunk-GIEDIAPD.js.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-L23WWO3D.js → chunk-GPVGGBIR.js} +2 -2
- package/dist/{chunk-OAK7HFOJ.js → chunk-GWHZFX2H.js} +21 -16
- package/dist/chunk-GWHZFX2H.js.map +1 -0
- package/dist/{chunk-HYDNZXPU.js → chunk-H2RS6Z6Q.js} +41 -25
- package/dist/{chunk-HYDNZXPU.js.map → chunk-H2RS6Z6Q.js.map} +1 -1
- package/dist/{chunk-2QEKSRVX.js → chunk-HEX4IMLO.js} +4 -4
- package/dist/{chunk-QJRKXT54.cjs → chunk-HMEREPDB.cjs} +7 -7
- package/dist/{chunk-QJRKXT54.cjs.map → chunk-HMEREPDB.cjs.map} +1 -1
- package/dist/{chunk-TTO7JXDB.cjs → chunk-HNGFRRVZ.cjs} +3 -3
- package/dist/{chunk-TTO7JXDB.cjs.map → chunk-HNGFRRVZ.cjs.map} +1 -1
- package/dist/{chunk-CJGFRPAS.cjs → chunk-I6M6CVI2.cjs} +4 -4
- package/dist/chunk-I6M6CVI2.cjs.map +1 -0
- package/dist/chunk-J76JHN7J.cjs +225 -0
- package/dist/chunk-J76JHN7J.cjs.map +1 -0
- package/dist/{chunk-YW65NAKH.cjs → chunk-JCKGAAPZ.cjs} +7 -7
- package/dist/{chunk-YW65NAKH.cjs.map → chunk-JCKGAAPZ.cjs.map} +1 -1
- package/dist/{chunk-6CPCNQKV.js → chunk-JHX6JK3M.js} +79 -75
- package/dist/chunk-JHX6JK3M.js.map +1 -0
- package/dist/{chunk-YV57RSPD.js → chunk-JNY7TUDS.js} +49 -22
- package/dist/chunk-JNY7TUDS.js.map +1 -0
- package/dist/{chunk-O3LG7B2J.cjs → chunk-JPYJQ4TF.cjs} +13 -5
- package/dist/chunk-JPYJQ4TF.cjs.map +1 -0
- package/dist/{chunk-PY2376XI.js → chunk-JT4KVXJK.js} +68 -15
- package/dist/chunk-JT4KVXJK.js.map +1 -0
- package/dist/{chunk-AOGNTG3W.cjs → chunk-KBQD4JLK.cjs} +5 -4
- package/dist/chunk-KBQD4JLK.cjs.map +1 -0
- package/dist/{chunk-P2JM22BF.cjs → chunk-KIZVY57H.cjs} +82 -78
- package/dist/chunk-KIZVY57H.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-ZXJU3TQD.cjs → chunk-KREHT4AQ.cjs} +11 -10
- package/dist/chunk-KREHT4AQ.cjs.map +1 -0
- package/dist/{chunk-S4S4LB63.js → chunk-L65MHFMD.js} +11 -3
- package/dist/chunk-L65MHFMD.js.map +1 -0
- package/dist/{chunk-OGC44JFZ.cjs → chunk-LQXFXXMJ.cjs} +8 -7
- package/dist/chunk-LQXFXXMJ.cjs.map +1 -0
- package/dist/{chunk-25PSIDPC.js → chunk-MPIVBAMY.js} +79 -21
- package/dist/chunk-MPIVBAMY.js.map +1 -0
- package/dist/{chunk-7SVDYEKM.js → chunk-MQAOXZD4.js} +28 -14
- package/dist/chunk-MQAOXZD4.js.map +1 -0
- package/dist/{chunk-6CSUUQ5M.cjs → chunk-NOQF7UQ5.cjs} +6 -6
- package/dist/{chunk-6CSUUQ5M.cjs.map → chunk-NOQF7UQ5.cjs.map} +1 -1
- package/dist/{chunk-OU7DCYIA.js → chunk-O3QM3BFE.js} +2 -2
- package/dist/{chunk-WKDT2XFQ.js → chunk-OOCCSMWM.js} +4 -4
- package/dist/chunk-P4XZH3OR.js +225 -0
- package/dist/chunk-P4XZH3OR.js.map +1 -0
- package/dist/{chunk-ZWAFL2B3.cjs → chunk-PMSENLOA.cjs} +37 -27
- package/dist/chunk-PMSENLOA.cjs.map +1 -0
- package/dist/{chunk-L5W2XC6M.js → chunk-RHFD2Z5V.js} +8 -8
- package/dist/chunk-RHHZRTWM.js +134 -0
- package/dist/chunk-RHHZRTWM.js.map +1 -0
- package/dist/{chunk-NZO2I5AL.cjs → chunk-RJVHR45I.cjs} +7 -7
- package/dist/{chunk-NZO2I5AL.cjs.map → chunk-RJVHR45I.cjs.map} +1 -1
- package/dist/{chunk-E6SE552P.cjs → chunk-RUDXHT76.cjs} +41 -25
- package/dist/chunk-RUDXHT76.cjs.map +1 -0
- package/dist/{chunk-SXGCRHBZ.js → chunk-SDUGYJGW.js} +24 -14
- package/dist/chunk-SDUGYJGW.js.map +1 -0
- package/dist/{chunk-VPRUHE35.js → chunk-SFFKQQ5Z.js} +4 -4
- 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-OAPOGYA5.cjs → chunk-TC5IC6OP.cjs} +7 -4
- package/dist/chunk-TC5IC6OP.cjs.map +1 -0
- package/dist/{chunk-T2KB3DJJ.js → chunk-THCTUBX6.js} +12 -4
- package/dist/chunk-THCTUBX6.js.map +1 -0
- package/dist/{chunk-NEYLNRVG.cjs → chunk-TTLFY76J.cjs} +21 -16
- package/dist/chunk-TTLFY76J.cjs.map +1 -0
- 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-65PC3YDT.cjs → chunk-V4BZWBZT.cjs} +7 -7
- package/dist/{chunk-65PC3YDT.cjs.map → chunk-V4BZWBZT.cjs.map} +1 -1
- package/dist/{chunk-FKXKBJUI.cjs → chunk-VHO6JPRR.cjs} +2 -1
- package/dist/chunk-VHO6JPRR.cjs.map +1 -0
- package/dist/{chunk-3E7TKBQI.cjs → chunk-VQGLVBPL.cjs} +24 -14
- package/dist/chunk-VQGLVBPL.cjs.map +1 -0
- package/dist/{chunk-27ZWUEPE.js → chunk-WE2SBWZ6.js} +20 -9
- package/dist/chunk-WE2SBWZ6.js.map +1 -0
- package/dist/{chunk-TQGO5WK6.js → chunk-WNDDS367.js} +7 -6
- package/dist/chunk-WNDDS367.js.map +1 -0
- package/dist/{chunk-Q5KQVBQP.cjs → chunk-X3BVQBXD.cjs} +18 -16
- package/dist/chunk-X3BVQBXD.cjs.map +1 -0
- package/dist/{chunk-J5RMLZ4P.cjs → chunk-XERBOFYZ.cjs} +80 -22
- package/dist/chunk-XERBOFYZ.cjs.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-K7T25Y3A.cjs → chunk-XZLSHEHE.cjs} +41 -27
- package/dist/chunk-XZLSHEHE.cjs.map +1 -0
- package/dist/{chunk-JRLUZDKA.js → chunk-YAKTVIVK.js} +20 -7
- package/dist/chunk-YAKTVIVK.js.map +1 -0
- package/dist/{chunk-IJ4DXG7D.cjs → chunk-YJNQLH2L.cjs} +5 -2
- package/dist/chunk-YJNQLH2L.cjs.map +1 -0
- package/dist/{chunk-ZPDETHQ7.js → chunk-YP4HUBKN.js} +3 -3
- package/dist/{chunk-ZPDETHQ7.js.map → chunk-YP4HUBKN.js.map} +1 -1
- package/dist/{chunk-5WH3JMR5.js → chunk-YXRKBKFB.js} +7 -4
- package/dist/chunk-YXRKBKFB.js.map +1 -0
- package/dist/{chunk-ACNTH2OQ.cjs → chunk-ZMRINZIO.cjs} +98 -106
- package/dist/chunk-ZMRINZIO.cjs.map +1 -0
- 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.d.cts +1 -1
- package/dist/context-menu/index.d.ts +1 -1
- package/dist/context-menu/index.js +5 -5
- package/dist/conversation/index.cjs +8 -8
- package/dist/conversation/index.d.cts +1 -1
- package/dist/conversation/index.d.ts +1 -1
- package/dist/conversation/index.js +7 -7
- package/dist/data-grid/index.cjs +16 -16
- package/dist/data-grid/index.d.cts +14 -15
- package/dist/data-grid/index.d.ts +14 -15
- package/dist/data-grid/index.js +15 -15
- package/dist/date-picker/index.cjs +8 -8
- package/dist/date-picker/index.d.cts +12 -2
- package/dist/date-picker/index.d.ts +12 -2
- 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.d.cts +34 -0
- package/dist/dropdown/index.d.ts +34 -0
- 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 +42 -42
- package/dist/index.css +112 -40
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +41 -41
- 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.d.cts +23 -2
- package/dist/menu/index.d.ts +23 -2
- 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.d.cts +2 -2
- package/dist/page-layout/index.d.ts +2 -2
- 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.d.cts +3 -1
- package/dist/popover/index.d.ts +3 -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/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.d.cts +2 -2
- package/dist/table/index.d.ts +2 -2
- 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.d.cts +3 -3
- package/dist/toolbar/index.d.ts +3 -3
- 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 +2 -2
- package/dist/virtual-list/index.js +1 -1
- package/package.json +7 -2
- package/dist/chunk-25PSIDPC.js.map +0 -1
- package/dist/chunk-27ZWUEPE.js.map +0 -1
- package/dist/chunk-3E7TKBQI.cjs.map +0 -1
- package/dist/chunk-3EPND5M2.cjs.map +0 -1
- package/dist/chunk-3EUTXQDB.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-6CPCNQKV.js.map +0 -1
- package/dist/chunk-7SVDYEKM.js.map +0 -1
- package/dist/chunk-ACNTH2OQ.cjs.map +0 -1
- package/dist/chunk-AOGNTG3W.cjs.map +0 -1
- package/dist/chunk-BNVQ34FD.js +0 -125
- package/dist/chunk-BNVQ34FD.js.map +0 -1
- package/dist/chunk-CJGFRPAS.cjs.map +0 -1
- package/dist/chunk-CUJBNRJJ.cjs +0 -38
- package/dist/chunk-CUJBNRJJ.cjs.map +0 -1
- package/dist/chunk-E6SE552P.cjs.map +0 -1
- package/dist/chunk-E7FGY7BJ.js.map +0 -1
- package/dist/chunk-EAJHEYZM.js +0 -38
- package/dist/chunk-EAJHEYZM.js.map +0 -1
- package/dist/chunk-FKXKBJUI.cjs.map +0 -1
- package/dist/chunk-FXZJL2AM.cjs.map +0 -1
- package/dist/chunk-GG5YGESX.js.map +0 -1
- package/dist/chunk-GPRJYPIG.js.map +0 -1
- package/dist/chunk-H6CWTMAH.js.map +0 -1
- package/dist/chunk-HALVTKW7.js.map +0 -1
- package/dist/chunk-I5XR2V4A.cjs.map +0 -1
- package/dist/chunk-IJ4DXG7D.cjs.map +0 -1
- package/dist/chunk-ITXDSQT2.js.map +0 -1
- package/dist/chunk-J5RMLZ4P.cjs.map +0 -1
- package/dist/chunk-JRLUZDKA.js.map +0 -1
- package/dist/chunk-K7T25Y3A.cjs.map +0 -1
- package/dist/chunk-L5Q6UDY3.js +0 -69
- package/dist/chunk-L5Q6UDY3.js.map +0 -1
- package/dist/chunk-M7PF4FKQ.js.map +0 -1
- package/dist/chunk-MCWTQT3M.cjs.map +0 -1
- package/dist/chunk-MHZIBV2C.js.map +0 -1
- package/dist/chunk-NEYLNRVG.cjs.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-OGC44JFZ.cjs.map +0 -1
- package/dist/chunk-OJDYTCMO.cjs.map +0 -1
- package/dist/chunk-P2JM22BF.cjs.map +0 -1
- package/dist/chunk-PY2376XI.js.map +0 -1
- package/dist/chunk-Q5KQVBQP.cjs.map +0 -1
- package/dist/chunk-QQIALSTX.cjs.map +0 -1
- package/dist/chunk-R4M6SNUU.cjs.map +0 -1
- package/dist/chunk-RYOQYYDO.js.map +0 -1
- package/dist/chunk-S4S4LB63.js.map +0 -1
- package/dist/chunk-SXGCRHBZ.js.map +0 -1
- package/dist/chunk-T2KB3DJJ.js.map +0 -1
- package/dist/chunk-TEVZHN5I.cjs.map +0 -1
- package/dist/chunk-TQGO5WK6.js.map +0 -1
- package/dist/chunk-VXO2MYYH.cjs +0 -125
- package/dist/chunk-VXO2MYYH.cjs.map +0 -1
- package/dist/chunk-WWYJNWJY.cjs +0 -69
- package/dist/chunk-WWYJNWJY.cjs.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-ZWAFL2B3.cjs.map +0 -1
- package/dist/chunk-ZXJU3TQD.cjs.map +0 -1
- /package/dist/{chunk-GDQWSCJQ.js.map → chunk-26SO4LZ5.js.map} +0 -0
- /package/dist/{chunk-KQJ3IAFT.js.map → chunk-A3LMUPG3.js.map} +0 -0
- /package/dist/{chunk-O2AACVSF.js.map → chunk-AR2ZOO6L.js.map} +0 -0
- /package/dist/{chunk-L23WWO3D.js.map → chunk-GPVGGBIR.js.map} +0 -0
- /package/dist/{chunk-2QEKSRVX.js.map → chunk-HEX4IMLO.js.map} +0 -0
- /package/dist/{chunk-OU7DCYIA.js.map → chunk-O3QM3BFE.js.map} +0 -0
- /package/dist/{chunk-WKDT2XFQ.js.map → chunk-OOCCSMWM.js.map} +0 -0
- /package/dist/{chunk-L5W2XC6M.js.map → chunk-RHFD2Z5V.js.map} +0 -0
- /package/dist/{chunk-VPRUHE35.js.map → chunk-SFFKQQ5Z.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/SegmentedControl/SegmentedControl.component.tsx"],"sourcesContent":["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"],"mappings":"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","names":["track"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkJ76JHN7Jcjs = require('./chunk-J76JHN7J.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkKIZVY57Hcjs = require('./chunk-KIZVY57H.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunk35LGEPLPcjs = require('./chunk-35LGEPLP.cjs');
|
|
10
10
|
|
|
11
11
|
// src/components/SplitButton/SplitButton.component.tsx
|
|
12
12
|
var _react = require('react');
|
|
@@ -48,6 +48,7 @@ var SplitButton = ({
|
|
|
48
48
|
className: `${baseClass} eidos-split-button__chevron`,
|
|
49
49
|
disabled: disabledOrLoading,
|
|
50
50
|
"aria-label": "More options",
|
|
51
|
+
"aria-haspopup": "menu",
|
|
51
52
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronDown, { className: "eidos-split-button__chevron-icon", "aria-hidden": "true" })
|
|
52
53
|
}
|
|
53
54
|
);
|
|
@@ -71,16 +72,16 @@ var SplitButton = ({
|
|
|
71
72
|
disabled: disabledOrLoading,
|
|
72
73
|
onClick,
|
|
73
74
|
children: [
|
|
74
|
-
loading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.LoaderCircle, { className: "eidos-split-button__spinner", "aria-hidden": "true" }) : preIcon &&
|
|
75
|
+
loading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.LoaderCircle, { className: "eidos-split-button__spinner", "aria-hidden": "true" }) : preIcon && _chunk35LGEPLPcjs.renderIcon.call(void 0, preIcon, "eidos-split-button__pre-icon"),
|
|
75
76
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-split-button__label", children: label })
|
|
76
77
|
]
|
|
77
78
|
}
|
|
78
79
|
),
|
|
79
80
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
80
|
-
|
|
81
|
+
_chunkKIZVY57Hcjs.Dropdown,
|
|
81
82
|
{
|
|
82
83
|
trigger: chevronTrigger,
|
|
83
|
-
content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
84
|
+
content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJ76JHN7Jcjs.MenuPanel, { items: menuItems, onItemClick: handleItemClick }),
|
|
84
85
|
placement: "bottom",
|
|
85
86
|
align: "end",
|
|
86
87
|
disabled: disabledOrLoading
|
|
@@ -94,4 +95,4 @@ var SplitButton = ({
|
|
|
94
95
|
|
|
95
96
|
|
|
96
97
|
exports.SplitButton = SplitButton;
|
|
97
|
-
//# sourceMappingURL=chunk-
|
|
98
|
+
//# sourceMappingURL=chunk-LQXFXXMJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-LQXFXXMJ.cjs","../src/components/SplitButton/SplitButton.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACVA,8BAAmC;AACnC,2CAA0C;AAsEpC,+CAAA;AA5CC,IAAM,YAAA,EAA0C,CAAC;AAAA,EACtD,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,KAAA;AAAA,EACX,QAAA,EAAU,KAAA;AAAA,EACV,OAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AAEJ,EAAA,MAAM,UAAA,EAAwB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,EAAA,GAAA,CAAS;AAAA,IAClD,IAAA,EAAM,MAAA;AAAA,IACN,EAAA,EAAI,GAAA,CAAI,EAAA;AAAA,IACR,KAAA,EAAO,GAAA,CAAI,KAAA;AAAA,IACX,IAAA,EAAM,GAAA,CAAI,IAAA;AAAA,IACV,QAAA,EAAU,GAAA,CAAI,QAAA;AAAA,IACd,OAAA,EAAS,GAAA,CAAI;AAAA,EACf,CAAA,CAAE,CAAA;AAEF,EAAA,MAAM,gBAAA,EAAkB,gCAAA,CAAY,EAAA,GAAM;AAExC,IAAA,UAAA,CAAW,CAAA,EAAA,GAAM;AACf,MAAA,QAAA,CAAS,aAAA;AAAA,QACP,IAAI,UAAA,CAAW,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,OAAO,CAAC;AAAA,MAC/E,CAAA;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAAA,EACP,CAAA,EAAG,CAAC,CAAC,CAAA;AAEL,EAAA,MAAM,UAAA,EAAY,CAAA,2BAAA,EAA8B,OAAO,CAAA,eAAA,EAAkB,KAAK,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA;AAC9D,EAAA;AAGpC,EAAA;AAAC,IAAA;AAAA,IAAA;AACM,MAAA;AACkB,MAAA;AACb,MAAA;AACC,MAAA;AAGG,MAAA;AAE4C,MAAA;AAAmB,IAAA;AAC/E,EAAA;AAIA,EAAA;AAAC,IAAA;AAAA,IAAA;AACY,MAAA;AACT,QAAA;AAC8B,QAAA;AACF,QAAA;AACD,QAAA;AACN,QAAA;AACrB,QAAA;AAGS,MAAA;AAGX,MAAA;AAAA,wBAAA;AAAC,UAAA;AAAA,UAAA;AACM,YAAA;AACkB,YAAA;AACb,YAAA;AACV,YAAA;AAEC,YAAA;AACuD,cAAA;AAIL,8BAAA;AAAA,YAAA;AAAA,UAAA;AACrD,QAAA;AAGA,wBAAA;AAAC,UAAA;AAAA,UAAA;AACU,YAAA;AAC2D,YAAA;AAC1D,YAAA;AACJ,YAAA;AACI,YAAA;AAAA,UAAA;AACZ,QAAA;AAAA,MAAA;AAAA,IAAA;AACF,EAAA;AAEJ;ADpBuG;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-LQXFXXMJ.cjs","sourcesContent":[null,"import React, { useCallback } from 'react';\nimport { ChevronDown, LoaderCircle } from 'lucide-react';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport { MenuPanel } from '../Menu';\nimport type { MenuItem } from '../Menu';\nimport { renderIcon } from '../../utils';\nimport type { SplitButtonProps } from './SplitButton.types';\n\n/**\n * SplitButton - a two-part control with a primary action button on the left\n * and a chevron that opens a dropdown of secondary actions on the right.\n *\n * The primary button fires `onClick` directly; clicking the chevron opens the\n * dropdown. Visually the two parts share a single bordered unit.\n *\n * @example\n * ```tsx\n * <SplitButton\n * label=\"Save\"\n * onClick={() => save()}\n * options={[\n * { id: 'draft', label: 'Save as draft', onClick: saveDraft },\n * { id: 'template', label: 'Save as template', onClick: saveTemplate },\n * ]}\n * />\n * ```\n */\nexport const SplitButton: React.FC<SplitButtonProps> = ({\n label,\n onClick,\n options,\n variant = 'filled',\n color = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n preIcon,\n className = '',\n}) => {\n // Convert SplitButtonOption → MenuItemType so MenuPanel can render them.\n const menuItems: MenuItem[] = options.map((opt) => ({\n type: 'item' as const,\n id: opt.id,\n label: opt.label,\n icon: opt.icon,\n disabled: opt.disabled,\n onClick: opt.onClick,\n }));\n\n const handleItemClick = useCallback(() => {\n // Close the dropdown by dispatching a mousedown outside it.\n setTimeout(() => {\n document.dispatchEvent(\n new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window }),\n );\n }, 10);\n }, []);\n\n const baseClass = `eidos-button eidos-button--${variant} eidos-button--${color} eidos-button--${size}`;\n const disabledOrLoading = disabled || loading;\n\n const chevronTrigger = (\n <button\n type=\"button\"\n className={`${baseClass} eidos-split-button__chevron`}\n disabled={disabledOrLoading}\n aria-label=\"More options\"\n // The chevron opens a `MenuPanel`. `Dropdown` adds no ARIA to its trigger,\n // so without this the control is announced as a plain button.\n aria-haspopup=\"menu\"\n >\n <ChevronDown className=\"eidos-split-button__chevron-icon\" aria-hidden=\"true\" />\n </button>\n );\n\n return (\n <div\n className={[\n 'eidos-split-button',\n `eidos-split-button--${variant}`,\n `eidos-split-button--${color}`,\n `eidos-split-button--${size}`,\n disabledOrLoading && 'eidos-split-button--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {/* Primary action */}\n <button\n type=\"button\"\n className={`${baseClass} eidos-split-button__primary`}\n disabled={disabledOrLoading}\n onClick={onClick}\n >\n {loading ? (\n <LoaderCircle className=\"eidos-split-button__spinner\" aria-hidden=\"true\" />\n ) : (\n preIcon && renderIcon(preIcon, 'eidos-split-button__pre-icon')\n )}\n <span className=\"eidos-split-button__label\">{label}</span>\n </button>\n\n {/* Secondary actions dropdown */}\n <Dropdown\n trigger={chevronTrigger}\n content={<MenuPanel items={menuItems} onItemClick={handleItemClick} />}\n placement=\"bottom\"\n align=\"end\"\n disabled={disabledOrLoading}\n />\n </div>\n );\n};\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Button
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-75GFIQRU.js";
|
|
4
4
|
|
|
5
5
|
// src/components/Snackbar/Snackbar.context.tsx
|
|
6
6
|
import { createContext, useContext, useState, useCallback, useRef } from "react";
|
|
@@ -17,21 +17,48 @@ var SnackbarProvider = ({ children }) => {
|
|
|
17
17
|
const [snackbars, setSnackbars] = useState([]);
|
|
18
18
|
const snackbarsRef = useRef([]);
|
|
19
19
|
snackbarsRef.current = snackbars;
|
|
20
|
+
const timers = useRef(
|
|
21
|
+
/* @__PURE__ */ new Map()
|
|
22
|
+
);
|
|
23
|
+
const clearTimer = useCallback((id) => {
|
|
24
|
+
const timer = timers.current.get(id);
|
|
25
|
+
if (timer) {
|
|
26
|
+
window.clearTimeout(timer.timeout);
|
|
27
|
+
timers.current.delete(id);
|
|
28
|
+
}
|
|
29
|
+
}, []);
|
|
30
|
+
const removeSnackbarRef = useRef(() => {
|
|
31
|
+
});
|
|
20
32
|
const generateId = useCallback(() => {
|
|
21
33
|
return `snackbar-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
22
34
|
}, []);
|
|
23
|
-
const removeSnackbar = useCallback(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
snackbar.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
const removeSnackbar = useCallback(
|
|
36
|
+
(id) => {
|
|
37
|
+
clearTimer(id);
|
|
38
|
+
const snackbar = snackbarsRef.current.find((item) => item.id === id);
|
|
39
|
+
if (snackbar?.onClose) {
|
|
40
|
+
snackbar.onClose(id);
|
|
41
|
+
}
|
|
42
|
+
setSnackbars(
|
|
43
|
+
(prev) => prev.map((item) => item.id === id ? { ...item, state: "exiting" } : item)
|
|
44
|
+
);
|
|
45
|
+
setTimeout(() => {
|
|
46
|
+
setSnackbars((prev) => prev.filter((item) => item.id !== id));
|
|
47
|
+
}, 300);
|
|
48
|
+
},
|
|
49
|
+
[clearTimer]
|
|
50
|
+
);
|
|
51
|
+
const startTimer = useCallback(
|
|
52
|
+
(id, ms) => {
|
|
53
|
+
clearTimer(id);
|
|
54
|
+
timers.current.set(id, {
|
|
55
|
+
timeout: window.setTimeout(() => removeSnackbarRef.current(id), ms),
|
|
56
|
+
remaining: ms,
|
|
57
|
+
startedAt: Date.now()
|
|
58
|
+
});
|
|
59
|
+
},
|
|
60
|
+
[clearTimer]
|
|
61
|
+
);
|
|
35
62
|
const addSnackbar = useCallback(
|
|
36
63
|
(snackbar) => {
|
|
37
64
|
const id = generateId();
|
|
@@ -50,14 +77,32 @@ var SnackbarProvider = ({ children }) => {
|
|
|
50
77
|
});
|
|
51
78
|
});
|
|
52
79
|
if (snackbar.duration && snackbar.duration > 0) {
|
|
53
|
-
|
|
54
|
-
removeSnackbar(id);
|
|
55
|
-
}, snackbar.duration);
|
|
80
|
+
startTimer(id, snackbar.duration);
|
|
56
81
|
}
|
|
57
82
|
return id;
|
|
58
83
|
},
|
|
59
|
-
[generateId,
|
|
84
|
+
[generateId, startTimer]
|
|
85
|
+
);
|
|
86
|
+
const pauseSnackbar = useCallback((id) => {
|
|
87
|
+
const timer = timers.current.get(id);
|
|
88
|
+
if (!timer) return;
|
|
89
|
+
window.clearTimeout(timer.timeout);
|
|
90
|
+
timers.current.set(id, {
|
|
91
|
+
...timer,
|
|
92
|
+
// What is left of the countdown at the moment of pausing, floored at 0
|
|
93
|
+
// so a timer that was already due does not resume with a negative delay.
|
|
94
|
+
remaining: Math.max(0, timer.remaining - (Date.now() - timer.startedAt))
|
|
95
|
+
});
|
|
96
|
+
}, []);
|
|
97
|
+
const resumeSnackbar = useCallback(
|
|
98
|
+
(id) => {
|
|
99
|
+
const timer = timers.current.get(id);
|
|
100
|
+
if (!timer) return;
|
|
101
|
+
startTimer(id, timer.remaining);
|
|
102
|
+
},
|
|
103
|
+
[startTimer]
|
|
60
104
|
);
|
|
105
|
+
removeSnackbarRef.current = removeSnackbar;
|
|
61
106
|
const clearAllSnackbars = useCallback(() => {
|
|
62
107
|
setSnackbars((prev) => prev.map((item) => ({ ...item, state: "exiting" })));
|
|
63
108
|
setTimeout(() => {
|
|
@@ -68,7 +113,9 @@ var SnackbarProvider = ({ children }) => {
|
|
|
68
113
|
snackbars,
|
|
69
114
|
addSnackbar,
|
|
70
115
|
removeSnackbar,
|
|
71
|
-
clearAllSnackbars
|
|
116
|
+
clearAllSnackbars,
|
|
117
|
+
pauseSnackbar,
|
|
118
|
+
resumeSnackbar
|
|
72
119
|
};
|
|
73
120
|
return /* @__PURE__ */ jsx(SnackbarContext.Provider, { value: contextValue, children });
|
|
74
121
|
};
|
|
@@ -144,12 +191,23 @@ SnackbarComponent.displayName = "SnackbarComponent";
|
|
|
144
191
|
// src/components/Snackbar/SnackbarContainer.component.tsx
|
|
145
192
|
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
146
193
|
var SnackbarContainer = () => {
|
|
147
|
-
const { snackbars, removeSnackbar } = useSnackbarContext();
|
|
194
|
+
const { snackbars, removeSnackbar, pauseSnackbar, resumeSnackbar } = useSnackbarContext();
|
|
148
195
|
if (snackbars.length === 0) {
|
|
149
196
|
return null;
|
|
150
197
|
}
|
|
151
198
|
return createPortal(
|
|
152
|
-
/* @__PURE__ */ jsx3("div", { className: "eidos-snackbar-container", children: snackbars.map((snackbar) => /* @__PURE__ */ jsx3(
|
|
199
|
+
/* @__PURE__ */ jsx3("div", { className: "eidos-snackbar-container", children: snackbars.map((snackbar) => /* @__PURE__ */ jsx3(
|
|
200
|
+
"div",
|
|
201
|
+
{
|
|
202
|
+
className: "eidos-snackbar-wrapper",
|
|
203
|
+
onMouseEnter: () => pauseSnackbar(snackbar.id),
|
|
204
|
+
onMouseLeave: () => resumeSnackbar(snackbar.id),
|
|
205
|
+
onFocus: () => pauseSnackbar(snackbar.id),
|
|
206
|
+
onBlur: () => resumeSnackbar(snackbar.id),
|
|
207
|
+
children: /* @__PURE__ */ jsx3(SnackbarComponent, { snackbar, onClose: removeSnackbar })
|
|
208
|
+
},
|
|
209
|
+
snackbar.id
|
|
210
|
+
)) }),
|
|
153
211
|
document.body
|
|
154
212
|
);
|
|
155
213
|
};
|
|
@@ -235,4 +293,4 @@ export {
|
|
|
235
293
|
SnackbarContainer,
|
|
236
294
|
useSnackbar
|
|
237
295
|
};
|
|
238
|
-
//# sourceMappingURL=chunk-
|
|
296
|
+
//# sourceMappingURL=chunk-MPIVBAMY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Snackbar/Snackbar.context.tsx","../src/components/Snackbar/SnackbarContainer.component.tsx","../src/components/Snackbar/Snackbar.component.tsx","../src/components/Snackbar/Snackbar.hooks.ts"],"sourcesContent":["import React, { createContext, useContext, useState, useCallback, useRef } from 'react';\nimport type { SnackbarContextValue, SnackbarItem, SnackbarProps } from './Snackbar.types';\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\n\nexport const useSnackbarContext = (): SnackbarContextValue => {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error('useSnackbarContext must be used within a SnackbarProvider');\n }\n return context;\n};\n\ninterface SnackbarProviderProps {\n children: React.ReactNode;\n}\n\nexport const SnackbarProvider: React.FC<SnackbarProviderProps> = ({ children }) => {\n const [snackbars, setSnackbars] = useState<SnackbarItem[]>([]);\n // Mirror state in a ref so removeSnackbar can read current items synchronously\n // without placing side-effects inside a setState updater (which StrictMode calls twice).\n const snackbarsRef = useRef<SnackbarItem[]>([]);\n snackbarsRef.current = snackbars;\n\n // ── Pausable auto-dismiss timers (SC 2.2.1 Timing Adjustable) ─────────────\n //\n // Auto-dismiss used to be a bare `setTimeout` that nothing could stop. That\n // is a Level A failure: a time limit the user can neither turn off, adjust\n // nor extend. It bites hardest exactly where a snackbar is most useful -\n // `action` puts a control (typically \"Undo\") inside something that deletes\n // itself on a stopwatch, so anyone reading slowly, using a screen reader,\n // or driving by keyboard can lose it mid-reach.\n //\n // Each timer therefore records when it started and how long is left, so it\n // can be cancelled on hover or focus and restarted with the remainder.\n const timers = useRef(\n new Map<string, { timeout: number; remaining: number; startedAt: number }>(),\n );\n\n const clearTimer = useCallback((id: string): void => {\n const timer = timers.current.get(id);\n if (timer) {\n window.clearTimeout(timer.timeout);\n timers.current.delete(id);\n }\n }, []);\n\n // `startTimer` needs `removeSnackbar`, and `removeSnackbar` needs\n // `clearTimer`. A ref breaks the cycle without reordering the file or\n // making every callback depend on the others' identity.\n const removeSnackbarRef = useRef<(id: string) => void>(() => {});\n\n const generateId = useCallback((): string => {\n return `snackbar-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }, []);\n\n const removeSnackbar = useCallback(\n (id: string): void => {\n // Read from ref - safe to call outside a setState updater.\n // Calling side-effects inside a setState updater is wrong: React StrictMode\n // deliberately invokes updaters twice, which would fire onClose 2× from here\n // plus 1× from SnackbarComponent.handleClose = 3× total.\n clearTimer(id);\n\n const snackbar = snackbarsRef.current.find((item) => item.id === id);\n if (snackbar?.onClose) {\n snackbar.onClose(id);\n }\n\n // Transition to exiting state, then remove after the CSS animation (300ms).\n setSnackbars((prev) =>\n prev.map((item) => (item.id === id ? { ...item, state: 'exiting' } : item)),\n );\n\n setTimeout(() => {\n setSnackbars((prev) => prev.filter((item) => item.id !== id));\n }, 300);\n },\n [clearTimer],\n );\n\n const startTimer = useCallback(\n (id: string, ms: number): void => {\n clearTimer(id);\n timers.current.set(id, {\n timeout: window.setTimeout(() => removeSnackbarRef.current(id), ms),\n remaining: ms,\n startedAt: Date.now(),\n });\n },\n [clearTimer],\n );\n\n const addSnackbar = useCallback(\n (snackbar: Omit<SnackbarProps, 'id'>): string => {\n const id = generateId();\n const newSnackbar: SnackbarItem = {\n ...snackbar,\n id,\n state: 'entering',\n createdAt: Date.now(),\n };\n\n setSnackbars((prev) => [newSnackbar, ...prev]); // Add to beginning (newest on top)\n\n // Use requestAnimationFrame to ensure DOM is rendered before animation\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setSnackbars((prev) =>\n prev.map((item) => (item.id === id ? { ...item, state: 'entered' } : item)),\n );\n });\n });\n\n // Auto-close if duration is set\n if (snackbar.duration && snackbar.duration > 0) {\n startTimer(id, snackbar.duration);\n }\n\n return id;\n },\n [generateId, startTimer],\n );\n\n // Pause on hover or focus, resume on leave or blur. Wired up by\n // `SnackbarContainer` - see the handlers there.\n const pauseSnackbar = useCallback((id: string): void => {\n const timer = timers.current.get(id);\n if (!timer) return;\n window.clearTimeout(timer.timeout);\n timers.current.set(id, {\n ...timer,\n // What is left of the countdown at the moment of pausing, floored at 0\n // so a timer that was already due does not resume with a negative delay.\n remaining: Math.max(0, timer.remaining - (Date.now() - timer.startedAt)),\n });\n }, []);\n\n const resumeSnackbar = useCallback(\n (id: string): void => {\n const timer = timers.current.get(id);\n if (!timer) return;\n startTimer(id, timer.remaining);\n },\n [startTimer],\n );\n\n removeSnackbarRef.current = removeSnackbar;\n\n const clearAllSnackbars = useCallback((): void => {\n // Transition all to exiting state\n setSnackbars((prev) => prev.map((item) => ({ ...item, state: 'exiting' })));\n\n // Remove all after animation completes (300ms to match CSS animation)\n setTimeout(() => {\n setSnackbars([]);\n }, 300);\n }, []);\n\n const contextValue: SnackbarContextValue = {\n snackbars,\n addSnackbar,\n removeSnackbar,\n clearAllSnackbars,\n pauseSnackbar,\n resumeSnackbar,\n };\n\n return <SnackbarContext.Provider value={contextValue}>{children}</SnackbarContext.Provider>;\n};\n\nSnackbarProvider.displayName = 'SnackbarProvider';\n","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport { useSnackbarContext } from './Snackbar.context';\nimport { SnackbarComponent } from './Snackbar.component';\n\nexport const SnackbarContainer: React.FC = () => {\n const { snackbars, removeSnackbar, pauseSnackbar, resumeSnackbar } = useSnackbarContext();\n\n if (snackbars.length === 0) {\n return null;\n }\n\n return createPortal(\n <div className={'eidos-snackbar-container'}>\n {snackbars.map((snackbar) => (\n <div\n key={snackbar.id}\n className={'eidos-snackbar-wrapper'}\n // Holds the auto-dismiss countdown while the user is engaged with\n // this snackbar, which is what makes the time limit adjustable\n // (SC 2.2.1). Hover covers reading it; focus covers reaching its\n // action by keyboard - `onFocus`/`onBlur` bubble in React, so a\n // focused \"Undo\" button inside pauses the whole snackbar.\n onMouseEnter={() => pauseSnackbar(snackbar.id)}\n onMouseLeave={() => resumeSnackbar(snackbar.id)}\n onFocus={() => pauseSnackbar(snackbar.id)}\n onBlur={() => resumeSnackbar(snackbar.id)}\n >\n <SnackbarComponent snackbar={snackbar} onClose={removeSnackbar} />\n </div>\n ))}\n </div>,\n document.body,\n );\n};\n\nSnackbarContainer.displayName = 'SnackbarContainer';\n","import React from 'react';\nimport { X } from 'lucide-react';\nimport { Button } from '../Button/Button.component';\nimport type { SnackbarItem } from './Snackbar.types';\n\ninterface SnackbarComponentProps {\n snackbar: SnackbarItem;\n onClose: (id: string) => void;\n}\n\nexport const SnackbarComponent: React.FC<SnackbarComponentProps> = ({ snackbar, onClose }) => {\n const {\n id,\n variant = 'info',\n message,\n component: Component,\n componentProps,\n action,\n state,\n } = snackbar;\n\n const handleClose = () => {\n // onClose callback is fired by removeSnackbar (context) to cover both\n // manual and auto-close paths without duplication.\n onClose(id);\n };\n\n const handleActionClick = () => {\n if (action?.onClick) {\n action.onClick();\n }\n };\n\n // Render content based on type\n const renderContent = () => {\n if (message) {\n return <span className={'eidos-snackbar-message'}>{message}</span>;\n }\n if (Component) {\n return <Component {...(componentProps || {})} />;\n }\n return null;\n };\n\n return (\n <div\n className={`eidos-snackbar eidos-snackbar--${variant} eidos-snackbar--${state} ${snackbar.className || ''}`}\n role=\"alert\"\n aria-live=\"polite\"\n >\n <div className={'eidos-snackbar-content'}>{renderContent()}</div>\n\n {action && (\n <div className={'eidos-snackbar-actions'}>\n <Button\n variant={action.variant === 'primary' ? 'filled' : 'text'}\n size=\"sm\"\n onClick={handleActionClick}\n className={'eidos-snackbar-action-button'}\n >\n {action.label}\n </Button>\n </div>\n )}\n\n <button\n className={'eidos-snackbar-close-button'}\n onClick={handleClose}\n aria-label=\"Close notification\"\n type=\"button\"\n >\n <X className={'eidos-snackbar-close-icon'} />\n </button>\n </div>\n );\n};\n\nSnackbarComponent.displayName = 'SnackbarComponent';\n","import { useCallback } from 'react';\nimport { useSnackbarContext } from './Snackbar.context';\nimport type { UseSnackbarReturn, SnackbarProps } from './Snackbar.types';\n\nexport const useSnackbar = (): UseSnackbarReturn => {\n const { addSnackbar, removeSnackbar, clearAllSnackbars } = useSnackbarContext();\n\n const showSnackbar = useCallback(\n (snackbar: Omit<SnackbarProps, 'id'>): string => {\n return addSnackbar(snackbar);\n },\n [addSnackbar],\n );\n\n const hideSnackbar = useCallback(\n (id: string): void => {\n removeSnackbar(id);\n },\n [removeSnackbar],\n );\n\n const clearAll = useCallback((): void => {\n clearAllSnackbars();\n }, [clearAllSnackbars]);\n\n const showSuccess = useCallback(\n (message: string, options?: Partial<Omit<SnackbarProps, 'id' | 'message' | 'variant'>>) => {\n return showSnackbar({\n message,\n variant: 'success',\n duration: 5000,\n ...options,\n });\n },\n [showSnackbar],\n );\n\n const showError = useCallback(\n (message: string, options?: Partial<Omit<SnackbarProps, 'id' | 'message' | 'variant'>>) => {\n return showSnackbar({\n message,\n variant: 'danger',\n duration: 5000,\n ...options,\n });\n },\n [showSnackbar],\n );\n\n const showWarning = useCallback(\n (message: string, options?: Partial<Omit<SnackbarProps, 'id' | 'message' | 'variant'>>) => {\n return showSnackbar({\n message,\n variant: 'warning',\n duration: 5000,\n ...options,\n });\n },\n [showSnackbar],\n );\n\n const showInfo = useCallback(\n (message: string, options?: Partial<Omit<SnackbarProps, 'id' | 'message' | 'variant'>>) => {\n return showSnackbar({\n message,\n variant: 'info',\n duration: 5000,\n ...options,\n });\n },\n [showSnackbar],\n );\n\n return {\n showSnackbar,\n hideSnackbar,\n clearAll,\n showSuccess,\n showError,\n showWarning,\n showInfo,\n };\n};\n\nexport default useSnackbar;\n"],"mappings":"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","names":["jsx","jsx","useCallback","useCallback"]}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Input
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YAKTVIVK.js";
|
|
4
4
|
import {
|
|
5
5
|
Dropdown
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-JHX6JK3M.js";
|
|
7
7
|
import {
|
|
8
|
+
devWarn,
|
|
8
9
|
fullWidthModifier,
|
|
9
10
|
renderIcon
|
|
10
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-RHHZRTWM.js";
|
|
11
12
|
|
|
12
13
|
// src/components/Select/Select.component.tsx
|
|
13
14
|
import React, { useState, useCallback, useRef, useEffect, useMemo } from "react";
|
|
@@ -21,6 +22,7 @@ var Select = React.forwardRef(
|
|
|
21
22
|
onChange,
|
|
22
23
|
className = "",
|
|
23
24
|
multiple = false,
|
|
25
|
+
label,
|
|
24
26
|
placeholder = "Select an option...",
|
|
25
27
|
disabled = false,
|
|
26
28
|
inputProps = {},
|
|
@@ -45,9 +47,8 @@ var Select = React.forwardRef(
|
|
|
45
47
|
}
|
|
46
48
|
return /* @__PURE__ */ new Set();
|
|
47
49
|
});
|
|
48
|
-
const [menuKey, setMenuKey] = useState(0);
|
|
49
50
|
const [focusedIndex, setFocusedIndex] = useState(-1);
|
|
50
|
-
const [isOpen, setIsOpen] = useState(
|
|
51
|
+
const [isOpen, setIsOpen] = useState(autoOpen);
|
|
51
52
|
const inputRef = useRef(null);
|
|
52
53
|
const triggerRef = useRef(null);
|
|
53
54
|
const optionRefs = useRef([]);
|
|
@@ -95,7 +96,7 @@ var Select = React.forwardRef(
|
|
|
95
96
|
}
|
|
96
97
|
if (!multiple) {
|
|
97
98
|
setIsOpen(false);
|
|
98
|
-
|
|
99
|
+
inputRef.current?.focus();
|
|
99
100
|
}
|
|
100
101
|
},
|
|
101
102
|
[multiple, onChange, selectedValues, isControlled]
|
|
@@ -109,13 +110,24 @@ var Select = React.forwardRef(
|
|
|
109
110
|
setSelectedValues(/* @__PURE__ */ new Set());
|
|
110
111
|
}
|
|
111
112
|
setIsOpen(false);
|
|
112
|
-
|
|
113
|
+
inputRef.current?.focus();
|
|
113
114
|
if (onChange) {
|
|
114
115
|
onChange(multiple ? [] : "");
|
|
115
116
|
}
|
|
116
117
|
},
|
|
117
118
|
[multiple, onChange, isControlled]
|
|
118
119
|
);
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
const element = inputRef.current;
|
|
122
|
+
if (!element) return;
|
|
123
|
+
const named = (element.labels?.length ?? 0) > 0 || element.hasAttribute("aria-label") || element.hasAttribute("aria-labelledby");
|
|
124
|
+
if (!named) {
|
|
125
|
+
devWarn(
|
|
126
|
+
"select-missing-label",
|
|
127
|
+
'Select: no accessible name. Pass `label` for a visible one, or `inputProps={{ "aria-label": "..." }}` where it must stay visually unlabelled - otherwise the field is announced as just "combobox". A placeholder is not a label, and disappears as soon as something is chosen.'
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
}, []);
|
|
119
131
|
const handleKeyDown = useCallback(
|
|
120
132
|
(e) => {
|
|
121
133
|
if (disabled) return;
|
|
@@ -172,7 +184,6 @@ var Select = React.forwardRef(
|
|
|
172
184
|
if (isOpen) {
|
|
173
185
|
setIsOpen(false);
|
|
174
186
|
setFocusedIndex(-1);
|
|
175
|
-
setMenuKey((prev) => prev + 1);
|
|
176
187
|
}
|
|
177
188
|
break;
|
|
178
189
|
case "Home":
|
|
@@ -251,6 +262,7 @@ var Select = React.forwardRef(
|
|
|
251
262
|
return /* @__PURE__ */ jsxs(
|
|
252
263
|
"div",
|
|
253
264
|
{
|
|
265
|
+
id: `${id || "select"}-option-${index}`,
|
|
254
266
|
ref: (el) => {
|
|
255
267
|
optionRefs.current[index] = el;
|
|
256
268
|
},
|
|
@@ -274,7 +286,7 @@ var Select = React.forwardRef(
|
|
|
274
286
|
option.id
|
|
275
287
|
);
|
|
276
288
|
}) }),
|
|
277
|
-
[options, selectedValues, focusedIndex, handleOptionSelect, handleOptionsMount]
|
|
289
|
+
[options, selectedValues, focusedIndex, handleOptionSelect, handleOptionsMount, id]
|
|
278
290
|
);
|
|
279
291
|
const triggerElement = /* @__PURE__ */ jsx(
|
|
280
292
|
"div",
|
|
@@ -286,7 +298,7 @@ var Select = React.forwardRef(
|
|
|
286
298
|
role: "combobox",
|
|
287
299
|
"aria-expanded": isOpen,
|
|
288
300
|
"aria-haspopup": "listbox",
|
|
289
|
-
"aria-controls": `${id || "select"}-options
|
|
301
|
+
"aria-controls": isOpen ? `${id || "select"}-options` : void 0,
|
|
290
302
|
"aria-activedescendant": focusedIndex >= 0 ? `${id || "select"}-option-${focusedIndex}` : void 0,
|
|
291
303
|
children: /* @__PURE__ */ jsx(
|
|
292
304
|
Input,
|
|
@@ -297,9 +309,11 @@ var Select = React.forwardRef(
|
|
|
297
309
|
posIcon: selectedValues.size > 0 && clearable ? X : void 0,
|
|
298
310
|
posIconButton: selectedValues.size > 0 && clearable,
|
|
299
311
|
onPosIconClick: selectedValues.size > 0 && clearable ? handleClear : void 0,
|
|
312
|
+
posIconLabel: "Clear selection",
|
|
300
313
|
disabled,
|
|
301
314
|
readOnly: true,
|
|
302
315
|
isSelect: true,
|
|
316
|
+
label,
|
|
303
317
|
name,
|
|
304
318
|
id,
|
|
305
319
|
required,
|
|
@@ -317,7 +331,8 @@ var Select = React.forwardRef(
|
|
|
317
331
|
children: /* @__PURE__ */ jsx(
|
|
318
332
|
Dropdown,
|
|
319
333
|
{
|
|
320
|
-
|
|
334
|
+
open: isOpen,
|
|
335
|
+
onOpenChange: setIsOpen,
|
|
321
336
|
trigger: triggerElement,
|
|
322
337
|
content: /* @__PURE__ */ jsx("div", { id: `${id || "select"}-options`, role: "listbox", "aria-multiselectable": multiple, children: selectContent }),
|
|
323
338
|
minWidth,
|
|
@@ -328,8 +343,7 @@ var Select = React.forwardRef(
|
|
|
328
343
|
fullWidth,
|
|
329
344
|
triggerRef,
|
|
330
345
|
...dropdownProps
|
|
331
|
-
}
|
|
332
|
-
menuKey
|
|
346
|
+
}
|
|
333
347
|
)
|
|
334
348
|
}
|
|
335
349
|
);
|
|
@@ -340,4 +354,4 @@ Select.displayName = "Select";
|
|
|
340
354
|
export {
|
|
341
355
|
Select
|
|
342
356
|
};
|
|
343
|
-
//# sourceMappingURL=chunk-
|
|
357
|
+
//# sourceMappingURL=chunk-MQAOXZD4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Select/Select.component.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { X, Check } from 'lucide-react';\nimport { Input } from '../Input/Input.component';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport type { SelectProps, SelectOption } from './Select.types';\nimport { renderIcon, fullWidthModifier, devWarn } from '../../utils';\n\nexport const Select = React.forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n options = [],\n value,\n defaultValue,\n onChange,\n className = '',\n multiple = false,\n label,\n placeholder = 'Select an option...',\n disabled = false,\n inputProps = {},\n name,\n id,\n required = false,\n fullWidth = false,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight = '300px',\n autoWidth = true,\n clearable = true,\n autoOpen = false,\n dropdownProps = {},\n },\n ref,\n ) => {\n const isControlled = value !== undefined;\n\n // Lazy initializer: seed from defaultValue in uncontrolled mode.\n const [selectedValues, setSelectedValues] = useState<Set<string>>(() => {\n if (defaultValue !== undefined) {\n const vals = Array.isArray(defaultValue) ? defaultValue : [defaultValue];\n return new Set(vals.filter((v) => v !== ''));\n }\n return new Set();\n });\n\n const [focusedIndex, setFocusedIndex] = useState(-1);\n // `Select` owns the open state and hands it to `Dropdown` as a controlled\n // value. It used to keep this flag *and* force the dropdown closed by\n // remounting it through a changing `key`, because `Dropdown`'s own state was\n // private - which meant this flag drove the ARIA attributes while reaching\n // nothing that renders, so the keyboard could not open the listbox at all.\n const [isOpen, setIsOpen] = useState(autoOpen);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const optionRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n // Kept in sync every render so the mount-only callback ref below can\n // read the latest values without needing them in its dependency array\n // (see `handleOptionsMount`).\n const optionsRef = useRef(options);\n optionsRef.current = options;\n const selectedValuesRef = useRef(selectedValues);\n selectedValuesRef.current = selectedValues;\n\n useEffect(() => {\n if (value !== undefined) {\n const values = Array.isArray(value) ? value : [value];\n\n const validValues = values.filter((v) => v !== '');\n setSelectedValues(new Set(validValues));\n }\n }, [value]);\n\n useEffect(() => {\n setFocusedIndex(-1);\n }, [options]);\n\n useEffect(() => {\n optionRefs.current = optionRefs.current.slice(0, options.length);\n }, [options.length]);\n\n const handleOptionSelect = useCallback(\n (option: SelectOption) => {\n if (option.disabled) return;\n\n const newSelectedValues = new Set(selectedValues);\n\n if (multiple) {\n if (newSelectedValues.has(option.value)) {\n newSelectedValues.delete(option.value);\n } else {\n newSelectedValues.add(option.value);\n }\n } else {\n if (newSelectedValues.has(option.value)) {\n newSelectedValues.clear();\n } else {\n newSelectedValues.clear();\n newSelectedValues.add(option.value);\n }\n }\n\n // In uncontrolled mode, own the state directly.\n // In controlled mode, let the parent drive via value prop + useEffect sync.\n if (!isControlled) {\n setSelectedValues(newSelectedValues);\n }\n\n if (onChange) {\n const newValue = multiple\n ? Array.from(newSelectedValues)\n : Array.from(newSelectedValues)[0] || '';\n onChange(newValue);\n }\n\n if (!multiple) {\n setIsOpen(false);\n // Focus is returned explicitly because a click lands on an option\n // `div`, which is not focusable - without this, choosing with the\n // mouse would leave focus on `<body>` and the field would be\n // unreachable by keyboard until tabbed to again.\n inputRef.current?.focus();\n }\n },\n [multiple, onChange, selectedValues, isControlled],\n );\n\n const handleClear = useCallback(\n (e?: React.MouseEvent) => {\n if (e) {\n e.stopPropagation();\n }\n if (!isControlled) {\n setSelectedValues(new Set());\n }\n\n setIsOpen(false);\n inputRef.current?.focus();\n if (onChange) {\n onChange(multiple ? [] : '');\n }\n },\n [multiple, onChange, isControlled],\n );\n\n // A form control with no accessible name is announced as just \"combobox\".\n // `Select` was the only field in the library that could not be labelled\n // without knowing about `inputProps`, and three call sites duly shipped\n // without one - so the gap is closed from both ends: a first-class `label`\n // prop, and this warning.\n //\n // Measured from the DOM rather than from props, because a caller may name\n // the field with an external `<label for>` - `Pagination`'s page-size\n // picker does exactly that, and a props-only check would cry wolf at it.\n // `HTMLInputElement.labels` covers both wrapping and `for` labels.\n useEffect(() => {\n const element = inputRef.current;\n if (!element) return;\n const named =\n (element.labels?.length ?? 0) > 0 ||\n element.hasAttribute('aria-label') ||\n element.hasAttribute('aria-labelledby');\n if (!named) {\n devWarn(\n 'select-missing-label',\n 'Select: no accessible name. Pass `label` for a visible one, or `inputProps={{ \"aria-label\": \"...\" }}` where it must stay visually unlabelled - otherwise the field is announced as just \"combobox\". A placeholder is not a label, and disappears as soon as something is chosen.',\n );\n }\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(0);\n } else {\n setFocusedIndex((prev) => {\n const nextIndex = prev < options.length - 1 ? prev + 1 : 0;\n\n setTimeout(() => {\n optionRefs.current[nextIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }, 0);\n return nextIndex;\n });\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(options.length - 1);\n } else {\n setFocusedIndex((prev) => {\n const nextIndex = prev > 0 ? prev - 1 : options.length - 1;\n\n setTimeout(() => {\n optionRefs.current[nextIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }, 0);\n return nextIndex;\n });\n }\n break;\n\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(0);\n } else if (focusedIndex >= 0 && focusedIndex < options.length) {\n const focusedOption = options[focusedIndex];\n handleOptionSelect(focusedOption);\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n if (isOpen) {\n setIsOpen(false);\n setFocusedIndex(-1);\n }\n break;\n\n case 'Home':\n e.preventDefault();\n if (isOpen) {\n setFocusedIndex(0);\n optionRefs.current[0]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n break;\n\n case 'End':\n e.preventDefault();\n if (isOpen) {\n const lastIndex = options.length - 1;\n setFocusedIndex(lastIndex);\n optionRefs.current[lastIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n break;\n\n default:\n if (isOpen && e.key.length === 1 && /[a-zA-Z0-9]/.test(e.key)) {\n const searchChar = e.key.toLowerCase();\n const foundIndex = options.findIndex(\n (option, index) =>\n index > focusedIndex && option.label.toLowerCase().startsWith(searchChar),\n );\n\n if (foundIndex !== -1) {\n setFocusedIndex(foundIndex);\n optionRefs.current[foundIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n } else {\n const foundFromStart = options.findIndex((option) =>\n option.label.toLowerCase().startsWith(searchChar),\n );\n if (foundFromStart !== -1) {\n setFocusedIndex(foundFromStart);\n optionRefs.current[foundFromStart]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n }\n }\n break;\n }\n },\n [disabled, isOpen, options, focusedIndex, handleOptionSelect],\n );\n\n // Scrolls the first selected option into view. Attached as the options\n // list's own ref below with an empty dependency array, so its identity\n // never changes and React only invokes it on genuine DOM mount/unmount -\n // i.e. exactly when the dropdown opens/closes (Dropdown unmounts its\n // `content` entirely while closed), not on every re-render while open.\n const handleOptionsMount = useCallback((el: HTMLDivElement | null) => {\n if (!el) return;\n const idx = optionsRef.current.findIndex((option) =>\n selectedValuesRef.current.has(option.value),\n );\n if (idx === -1) return;\n optionRefs.current[idx]?.scrollIntoView({ block: 'nearest' });\n }, []);\n\n // Past this many selections the full comma-joined label list becomes\n // unreadable in the trigger, so we switch to a compact \"N selected\" label.\n const COMPACT_LABEL_THRESHOLD = 2;\n\n const displayValue = useMemo(() => {\n if (selectedValues.size === 0) return '';\n\n if (multiple && selectedValues.size > COMPACT_LABEL_THRESHOLD) {\n return `${selectedValues.size} selected`;\n }\n\n const selectedOptions = options.filter((option) => selectedValues.has(option.value));\n const text = selectedOptions.map((option) => option.label).join(', ');\n return text;\n }, [options, selectedValues, multiple]);\n\n const selectContent = useMemo(\n () => (\n <div className={'eidos-select-options'} ref={handleOptionsMount}>\n {options.map((option, index) => {\n const isSelected = selectedValues.has(option.value);\n const isFocused = index === focusedIndex;\n return (\n <div\n key={option.id}\n // The trigger points `aria-activedescendant` at\n // `${id}-option-${focusedIndex}`, and nothing carried that id -\n // so the moment an option was hovered or arrowed to, the\n // attribute referenced an element that did not exist\n // (`aria-valid-attr-value`, critical). Invisible to axe until a\n // story left the listbox open, because the attribute is only\n // set once something is focused.\n id={`${id || 'select'}-option-${index}`}\n ref={(el) => {\n optionRefs.current[index] = el;\n }}\n className={`\n\t\t\t\t\t\t\t\t\t\t${'eidos-select-option'}\n\t\t\t\t\t\t\t\t\t\t${isSelected ? 'eidos-select-option--selected' : ''}\n\t\t\t\t\t\t\t\t\t\t${option.disabled ? 'eidos-select-option--disabled' : ''}\n\t\t\t\t\t\t\t\t\t\t${isFocused ? 'eidos-select-option--focused' : ''}\n\t\t\t\t\t\t\t\t\t`.trim()}\n onClick={() => handleOptionSelect(option)}\n onMouseEnter={() => setFocusedIndex(index)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n >\n {option.icon && renderIcon(option.icon, 'eidos-select-option-icon')}\n <span className={'eidos-select-option-label'}>{option.label}</span>\n {isSelected && <Check className={'eidos-select-option-check-icon'} />}\n </div>\n );\n })}\n </div>\n ),\n [options, selectedValues, focusedIndex, handleOptionSelect, handleOptionsMount, id],\n );\n\n const triggerElement = (\n <div\n ref={triggerRef}\n className={`eidos-select-trigger ${fullWidth ? fullWidthModifier('eidos-select-trigger') : ''}`}\n onKeyDown={handleKeyDown}\n tabIndex={disabled ? -1 : undefined}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n // Only while the listbox exists. An `aria-controls` pointing at an id\n // that is not in the document is invalid, and the listbox only renders\n // while open - `Combobox`, `TagInput` and `CommandPalette` already gate\n // theirs this way. It could not be gated here before, because `isOpen`\n // did not track whether the panel had actually rendered.\n aria-controls={isOpen ? `${id || 'select'}-options` : undefined}\n aria-activedescendant={\n focusedIndex >= 0 ? `${id || 'select'}-option-${focusedIndex}` : undefined\n }\n >\n <Input\n ref={inputRef}\n value={selectedValues.size > 0 ? displayValue : ''}\n placeholder={selectedValues.size === 0 ? placeholder : ''}\n posIcon={selectedValues.size > 0 && clearable ? X : undefined}\n posIconButton={selectedValues.size > 0 && clearable}\n onPosIconClick={selectedValues.size > 0 && clearable ? handleClear : undefined}\n posIconLabel=\"Clear selection\"\n disabled={disabled}\n readOnly={true}\n isSelect={true}\n label={label}\n name={name}\n id={id}\n required={required}\n fullWidth={fullWidth}\n {...inputProps}\n />\n </div>\n );\n\n return (\n <div\n ref={ref}\n className={`${'eidos-select-container'} ${\n fullWidth ? fullWidthModifier('eidos-select-container') : ''\n } ${className}`}\n >\n <Dropdown\n open={isOpen}\n onOpenChange={setIsOpen}\n trigger={triggerElement}\n content={\n <div id={`${id || 'select'}-options`} role=\"listbox\" aria-multiselectable={multiple}>\n {selectContent}\n </div>\n }\n minWidth={minWidth}\n maxWidth={maxWidth}\n minHeight={minHeight}\n maxHeight={maxHeight}\n autoWidth={autoWidth}\n fullWidth={fullWidth}\n triggerRef={triggerRef as React.RefObject<HTMLElement | null>}\n {...dropdownProps}\n />\n </div>\n );\n },\n);\n\nSelect.displayName = 'Select';\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunk35LGEPLPcjs = require('./chunk-35LGEPLP.cjs');
|
|
6
6
|
|
|
7
7
|
// src/components/Tabs/Tabs.component.tsx
|
|
8
8
|
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
@@ -47,7 +47,7 @@ var Tab = ({
|
|
|
47
47
|
`eidos-tab--${size}`,
|
|
48
48
|
isActive && "eidos-tab--active",
|
|
49
49
|
disabled && "eidos-tab--disabled",
|
|
50
|
-
fullWidth &&
|
|
50
|
+
fullWidth && _chunk35LGEPLPcjs.fullWidthModifier.call(void 0, "eidos-tab"),
|
|
51
51
|
className
|
|
52
52
|
].filter(Boolean).join(" ");
|
|
53
53
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
@@ -64,7 +64,7 @@ var Tab = ({
|
|
|
64
64
|
onKeyDown: handleKeyDown,
|
|
65
65
|
type: "button",
|
|
66
66
|
children: [
|
|
67
|
-
icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-icon", children:
|
|
67
|
+
icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-icon", children: _chunk35LGEPLPcjs.renderIcon.call(void 0, icon, "eidos-tab-icon-svg") }),
|
|
68
68
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-label", children })
|
|
69
69
|
]
|
|
70
70
|
}
|
|
@@ -188,11 +188,11 @@ var Tabs = ({
|
|
|
188
188
|
const listClasses = [
|
|
189
189
|
"eidos-tabs-list",
|
|
190
190
|
`eidos-tabs-list--${size}`,
|
|
191
|
-
fullWidth &&
|
|
191
|
+
fullWidth && _chunk35LGEPLPcjs.fullWidthModifier.call(void 0, "eidos-tabs-list"),
|
|
192
192
|
// With buttons, they are the affordance - a native scrollbar underneath
|
|
193
193
|
// them is redundant, and on a space-taking one it would also sit over the
|
|
194
194
|
// `line` variant's rule.
|
|
195
|
-
hasScrollButtons &&
|
|
195
|
+
hasScrollButtons && _chunk35LGEPLPcjs.dualModifier.call(void 0, "eidos-tabs-list", "hide-scrollbar", "hideScrollbar")
|
|
196
196
|
].filter(Boolean).join(" ");
|
|
197
197
|
const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;
|
|
198
198
|
const showNextButton = hasScrollButtons && scrollState.canScrollNext;
|
|
@@ -251,4 +251,4 @@ Tabs.displayName = "Tabs";
|
|
|
251
251
|
|
|
252
252
|
|
|
253
253
|
exports.Tab = Tab; exports.TabPanel = TabPanel; exports.Tabs = Tabs;
|
|
254
|
-
//# sourceMappingURL=chunk-
|
|
254
|
+
//# sourceMappingURL=chunk-NOQF7UQ5.cjs.map
|