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
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
devWarn,
|
|
3
|
+
fullWidthModifier,
|
|
4
|
+
useIsClient
|
|
5
|
+
} from "./chunk-RHHZRTWM.js";
|
|
4
6
|
|
|
5
7
|
// src/components/Dropdown/Dropdown.context.types.ts
|
|
6
8
|
import { createContext } from "react";
|
|
@@ -33,8 +35,11 @@ var DropdownInternal = ({
|
|
|
33
35
|
delay = 0,
|
|
34
36
|
disabled = false,
|
|
35
37
|
defaultOpen = false,
|
|
38
|
+
open,
|
|
39
|
+
onOpenChange,
|
|
36
40
|
triggerClassName = "",
|
|
37
41
|
contentClassName = "",
|
|
42
|
+
role,
|
|
38
43
|
closeOnClickOutside = true,
|
|
39
44
|
closeOnEscape = true,
|
|
40
45
|
minWidth,
|
|
@@ -50,11 +55,40 @@ var DropdownInternal = ({
|
|
|
50
55
|
}) => {
|
|
51
56
|
const context = useDropdownContext();
|
|
52
57
|
const actualLevel = dropdownLevel !== void 0 ? dropdownLevel : context.level;
|
|
58
|
+
const isClient = useIsClient();
|
|
53
59
|
const [dropdownState, setDropdownState] = useState({
|
|
54
60
|
isVisible: defaultOpen,
|
|
55
61
|
isPositioned: false,
|
|
56
62
|
position: { top: 0, left: 0, placement: preferredPlacement }
|
|
57
63
|
});
|
|
64
|
+
const isControlled = open !== void 0;
|
|
65
|
+
const isVisible = isControlled ? open : dropdownState.isVisible;
|
|
66
|
+
const wasControlled = useRef(isControlled);
|
|
67
|
+
if (wasControlled.current !== isControlled) {
|
|
68
|
+
devWarn(
|
|
69
|
+
"dropdown-controlled-switch",
|
|
70
|
+
"Dropdown: `open` switched between controlled and uncontrolled. Pick one for the lifetime of the component - the dropdown keeps its own state as a fallback, so switching makes it jump to whatever that happens to be."
|
|
71
|
+
);
|
|
72
|
+
wasControlled.current = isControlled;
|
|
73
|
+
}
|
|
74
|
+
const setOpen = useCallback(
|
|
75
|
+
(next) => {
|
|
76
|
+
setDropdownState((prev) => ({ ...prev, isVisible: next, isPositioned: false }));
|
|
77
|
+
onOpenChange?.(next);
|
|
78
|
+
},
|
|
79
|
+
[onOpenChange]
|
|
80
|
+
);
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
if (!isVisible) {
|
|
83
|
+
setDropdownState((prev) => prev.isPositioned ? { ...prev, isPositioned: false } : prev);
|
|
84
|
+
}
|
|
85
|
+
}, [isVisible]);
|
|
86
|
+
useEffect(() => {
|
|
87
|
+
if (!isVisible && timeoutRef.current) {
|
|
88
|
+
clearTimeout(timeoutRef.current);
|
|
89
|
+
timeoutRef.current = void 0;
|
|
90
|
+
}
|
|
91
|
+
}, [isVisible]);
|
|
58
92
|
const triggerRef = useRef(null);
|
|
59
93
|
const contentRef = useRef(null);
|
|
60
94
|
const timeoutRef = useRef(void 0);
|
|
@@ -65,9 +99,14 @@ var DropdownInternal = ({
|
|
|
65
99
|
[externalTriggerRef]
|
|
66
100
|
);
|
|
67
101
|
const calculateDynamicSizing = useCallback(
|
|
102
|
+
// Only the width is read, so the parameter is the narrowest shape that
|
|
103
|
+
// satisfies it rather than a `DOMRect`. The caller used to fall back to
|
|
104
|
+
// `new DOMRect()`, which is a browser-only global evaluated *during
|
|
105
|
+
// render* - it was the first thing to throw when an open dropdown was
|
|
106
|
+
// server-rendered, before `document.body` ever got a chance to.
|
|
68
107
|
(triggerRect) => {
|
|
69
108
|
const styles = { width: "max-content" };
|
|
70
|
-
if (autoWidth && (externalTriggerRef?.current || triggerRef.current)) {
|
|
109
|
+
if (autoWidth && triggerRect && (externalTriggerRef?.current || triggerRef.current)) {
|
|
71
110
|
const triggerWidth = triggerRect.width;
|
|
72
111
|
styles.minWidth = triggerWidth;
|
|
73
112
|
}
|
|
@@ -167,7 +206,7 @@ var DropdownInternal = ({
|
|
|
167
206
|
[preferredPlacement, align]
|
|
168
207
|
);
|
|
169
208
|
const handleScroll = useCallback(() => {
|
|
170
|
-
if (!
|
|
209
|
+
if (!isVisible || !dropdownState.isPositioned || isScrollingRef.current) return;
|
|
171
210
|
isScrollingRef.current = true;
|
|
172
211
|
animationFrameRef.current = requestAnimationFrame(() => {
|
|
173
212
|
const triggerElement = getTriggerElement();
|
|
@@ -182,20 +221,11 @@ var DropdownInternal = ({
|
|
|
182
221
|
}
|
|
183
222
|
isScrollingRef.current = false;
|
|
184
223
|
});
|
|
185
|
-
}, [
|
|
186
|
-
dropdownState.isVisible,
|
|
187
|
-
dropdownState.isPositioned,
|
|
188
|
-
calculateOptimalPosition,
|
|
189
|
-
getTriggerElement
|
|
190
|
-
]);
|
|
224
|
+
}, [isVisible, dropdownState.isPositioned, calculateOptimalPosition, getTriggerElement]);
|
|
191
225
|
const handleTriggerClick = useCallback(() => {
|
|
192
226
|
if (disabled) return;
|
|
193
|
-
if (
|
|
194
|
-
|
|
195
|
-
...prev,
|
|
196
|
-
isVisible: false,
|
|
197
|
-
isPositioned: false
|
|
198
|
-
}));
|
|
227
|
+
if (isVisible) {
|
|
228
|
+
setOpen(false);
|
|
199
229
|
} else {
|
|
200
230
|
if (dropdownGroup) {
|
|
201
231
|
const siblingDropdowns = document.querySelectorAll(
|
|
@@ -207,31 +237,15 @@ var DropdownInternal = ({
|
|
|
207
237
|
});
|
|
208
238
|
}
|
|
209
239
|
if (delay > 0) {
|
|
210
|
-
timeoutRef.current = setTimeout(() =>
|
|
211
|
-
setDropdownState((prev) => ({
|
|
212
|
-
...prev,
|
|
213
|
-
isVisible: true,
|
|
214
|
-
isPositioned: false
|
|
215
|
-
}));
|
|
216
|
-
}, delay);
|
|
240
|
+
timeoutRef.current = setTimeout(() => setOpen(true), delay);
|
|
217
241
|
} else {
|
|
218
|
-
|
|
219
|
-
...prev,
|
|
220
|
-
isVisible: true,
|
|
221
|
-
isPositioned: false
|
|
222
|
-
}));
|
|
242
|
+
setOpen(true);
|
|
223
243
|
}
|
|
224
244
|
}
|
|
225
|
-
}, [disabled,
|
|
245
|
+
}, [disabled, isVisible, delay, dropdownGroup, setOpen]);
|
|
226
246
|
useEffect(() => {
|
|
227
247
|
const handleCloseSibling = () => {
|
|
228
|
-
if (
|
|
229
|
-
setDropdownState((prev) => ({
|
|
230
|
-
...prev,
|
|
231
|
-
isVisible: false,
|
|
232
|
-
isPositioned: false
|
|
233
|
-
}));
|
|
234
|
-
}
|
|
248
|
+
if (isVisible) setOpen(false);
|
|
235
249
|
};
|
|
236
250
|
const currentContentRef = contentRef.current;
|
|
237
251
|
if (currentContentRef) {
|
|
@@ -242,10 +256,10 @@ var DropdownInternal = ({
|
|
|
242
256
|
currentContentRef.removeEventListener("closeSibling", handleCloseSibling);
|
|
243
257
|
}
|
|
244
258
|
};
|
|
245
|
-
}, [
|
|
259
|
+
}, [isVisible, setOpen]);
|
|
246
260
|
const handleClickOutside = useCallback(
|
|
247
261
|
(event) => {
|
|
248
|
-
if (!closeOnClickOutside || !
|
|
262
|
+
if (!closeOnClickOutside || !isVisible) return;
|
|
249
263
|
const target = event.target;
|
|
250
264
|
if (contentRef.current?.contains(target)) {
|
|
251
265
|
return;
|
|
@@ -265,29 +279,21 @@ var DropdownInternal = ({
|
|
|
265
279
|
}
|
|
266
280
|
}
|
|
267
281
|
}
|
|
268
|
-
|
|
269
|
-
...prev,
|
|
270
|
-
isVisible: false,
|
|
271
|
-
isPositioned: false
|
|
272
|
-
}));
|
|
282
|
+
setOpen(false);
|
|
273
283
|
},
|
|
274
|
-
[closeOnClickOutside,
|
|
284
|
+
[closeOnClickOutside, isVisible, actualLevel, getTriggerElement, setOpen]
|
|
275
285
|
);
|
|
276
286
|
const handleEscapeKey = useCallback(
|
|
277
287
|
(event) => {
|
|
278
|
-
if (closeOnEscape && event.key === "Escape" &&
|
|
279
|
-
|
|
280
|
-
...prev,
|
|
281
|
-
isVisible: false,
|
|
282
|
-
isPositioned: false
|
|
283
|
-
}));
|
|
288
|
+
if (closeOnEscape && event.key === "Escape" && isVisible) {
|
|
289
|
+
setOpen(false);
|
|
284
290
|
}
|
|
285
291
|
},
|
|
286
|
-
[closeOnEscape,
|
|
292
|
+
[closeOnEscape, isVisible, setOpen]
|
|
287
293
|
);
|
|
288
294
|
useEffect(() => {
|
|
289
295
|
const triggerElement = getTriggerElement();
|
|
290
|
-
if (
|
|
296
|
+
if (isVisible && !dropdownState.isPositioned && contentRef.current && triggerElement) {
|
|
291
297
|
const triggerRect = triggerElement.getBoundingClientRect();
|
|
292
298
|
const contentRect = contentRef.current.getBoundingClientRect();
|
|
293
299
|
const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);
|
|
@@ -298,15 +304,22 @@ var DropdownInternal = ({
|
|
|
298
304
|
}));
|
|
299
305
|
}
|
|
300
306
|
}, [
|
|
301
|
-
|
|
307
|
+
isVisible,
|
|
302
308
|
dropdownState.isPositioned,
|
|
303
309
|
calculateOptimalPosition,
|
|
304
|
-
getTriggerElement
|
|
310
|
+
getTriggerElement,
|
|
311
|
+
// Load-bearing, not incidental. With `defaultOpen` the panel is "visible"
|
|
312
|
+
// from the first render, but the portal is deferred one render for SSR
|
|
313
|
+
// safety - so this effect's first run finds `contentRef.current` still
|
|
314
|
+
// null, measures nothing, and without `isClient` in the deps it would never
|
|
315
|
+
// run again. The panel then stays `visibility: hidden` forever: mounted,
|
|
316
|
+
// unpositioned, invisible. Caught by `OpensOnMountWithDefaultOpen`.
|
|
317
|
+
isClient
|
|
305
318
|
]);
|
|
306
319
|
useEffect(() => {
|
|
307
320
|
const handleResize = () => {
|
|
308
321
|
const triggerElement = getTriggerElement();
|
|
309
|
-
if (
|
|
322
|
+
if (isVisible && dropdownState.isPositioned && contentRef.current && triggerElement) {
|
|
310
323
|
const triggerRect = triggerElement.getBoundingClientRect();
|
|
311
324
|
const contentRect = contentRef.current.getBoundingClientRect();
|
|
312
325
|
const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);
|
|
@@ -318,24 +331,17 @@ var DropdownInternal = ({
|
|
|
318
331
|
};
|
|
319
332
|
window.addEventListener("resize", handleResize);
|
|
320
333
|
return () => window.removeEventListener("resize", handleResize);
|
|
321
|
-
}, [
|
|
322
|
-
dropdownState.isVisible,
|
|
323
|
-
dropdownState.isPositioned,
|
|
324
|
-
calculateOptimalPosition,
|
|
325
|
-
getTriggerElement
|
|
326
|
-
]);
|
|
334
|
+
}, [isVisible, dropdownState.isPositioned, calculateOptimalPosition, getTriggerElement]);
|
|
327
335
|
useEffect(() => {
|
|
328
|
-
if (
|
|
329
|
-
|
|
330
|
-
document.body.addEventListener("scroll", handleScroll, { passive: true });
|
|
336
|
+
if (isVisible) {
|
|
337
|
+
document.addEventListener("scroll", handleScroll, { capture: true, passive: true });
|
|
331
338
|
}
|
|
332
339
|
return () => {
|
|
333
|
-
|
|
334
|
-
document.body.removeEventListener("scroll", handleScroll);
|
|
340
|
+
document.removeEventListener("scroll", handleScroll, { capture: true });
|
|
335
341
|
};
|
|
336
|
-
}, [
|
|
342
|
+
}, [isVisible, handleScroll]);
|
|
337
343
|
useEffect(() => {
|
|
338
|
-
if (
|
|
344
|
+
if (isVisible) {
|
|
339
345
|
document.addEventListener("mousedown", handleClickOutside);
|
|
340
346
|
document.addEventListener("keydown", handleEscapeKey);
|
|
341
347
|
}
|
|
@@ -343,7 +349,7 @@ var DropdownInternal = ({
|
|
|
343
349
|
document.removeEventListener("mousedown", handleClickOutside);
|
|
344
350
|
document.removeEventListener("keydown", handleEscapeKey);
|
|
345
351
|
};
|
|
346
|
-
}, [
|
|
352
|
+
}, [isVisible, handleClickOutside, handleEscapeKey]);
|
|
347
353
|
useEffect(() => {
|
|
348
354
|
return () => {
|
|
349
355
|
if (timeoutRef.current) {
|
|
@@ -364,7 +370,7 @@ var DropdownInternal = ({
|
|
|
364
370
|
children: trigger
|
|
365
371
|
}
|
|
366
372
|
),
|
|
367
|
-
|
|
373
|
+
isClient && isVisible && createPortal(
|
|
368
374
|
/* @__PURE__ */ jsx2(
|
|
369
375
|
"div",
|
|
370
376
|
{
|
|
@@ -376,11 +382,9 @@ var DropdownInternal = ({
|
|
|
376
382
|
style: {
|
|
377
383
|
top: dropdownState.position.top,
|
|
378
384
|
left: dropdownState.position.left,
|
|
379
|
-
...calculateDynamicSizing(
|
|
380
|
-
getTriggerElement()?.getBoundingClientRect() || new DOMRect()
|
|
381
|
-
)
|
|
385
|
+
...calculateDynamicSizing(getTriggerElement()?.getBoundingClientRect() ?? null)
|
|
382
386
|
},
|
|
383
|
-
role
|
|
387
|
+
role,
|
|
384
388
|
children: content
|
|
385
389
|
}
|
|
386
390
|
),
|
|
@@ -400,4 +404,4 @@ export {
|
|
|
400
404
|
useDropdownContext,
|
|
401
405
|
Dropdown
|
|
402
406
|
};
|
|
403
|
-
//# sourceMappingURL=chunk-
|
|
407
|
+
//# sourceMappingURL=chunk-JHX6JK3M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Dropdown/Dropdown.context.types.ts","../src/components/Dropdown/Dropdown.context.tsx","../src/components/Dropdown/Dropdown.hooks.ts","../src/components/Dropdown/Dropdown.component.tsx"],"sourcesContent":["import { createContext } from 'react';\n\nexport interface DropdownContextValue {\n level: number;\n}\n\nexport const DropdownContext = createContext<DropdownContextValue>({ level: 0 });\n","import React from 'react';\nimport { DropdownContext } from './Dropdown.context.types';\n\nexport const DropdownProvider: React.FC<{ children: React.ReactNode; level?: number }> = ({\n children,\n level = 0,\n}) => {\n return <DropdownContext.Provider value={{ level }}>{children}</DropdownContext.Provider>;\n};\n","import { useContext } from 'react';\nimport { DropdownContext } from './Dropdown.context.types';\n\nexport const useDropdownContext = () => {\n return useContext(DropdownContext);\n};\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { devWarn, fullWidthModifier, useIsClient } from '../../utils';\nimport type { DropdownProps, DropdownState } from './Dropdown.types';\nimport { DropdownProvider } from './Dropdown.context';\nimport { useDropdownContext } from './Dropdown.hooks';\n\nconst DropdownInternal: React.FC<DropdownProps> = ({\n trigger,\n content,\n placement: preferredPlacement = 'bottom',\n align = 'start',\n delay = 0,\n disabled = false,\n defaultOpen = false,\n open,\n onOpenChange,\n triggerClassName = '',\n contentClassName = '',\n role,\n closeOnClickOutside = true,\n closeOnEscape = true,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n autoWidth = true,\n fullWidth = false,\n triggerRef: externalTriggerRef,\n isNested = false,\n dropdownLevel,\n dropdownGroup,\n}) => {\n const context = useDropdownContext();\n const actualLevel = dropdownLevel !== undefined ? dropdownLevel : context.level;\n // `defaultOpen` makes the portal reachable on the first render, which cannot\n // happen on a server - see `useIsClient`.\n const isClient = useIsClient();\n const [dropdownState, setDropdownState] = useState<DropdownState>({\n isVisible: defaultOpen,\n isPositioned: false,\n position: { top: 0, left: 0, placement: preferredPlacement },\n });\n\n // ── Controlled / uncontrolled open state ──────────────────────────────────\n //\n // `dropdownState.isVisible` stays the *uncontrolled* value and is kept in\n // step even while controlled, so removing `open` later leaves coherent state.\n // Everything downstream reads `isVisible` below, never the field directly.\n //\n // `DropdownState` is exported from the package root, so it keeps its shape:\n // splitting `isVisible` out of it would be a breaking type change for a\n // consumer who imports it, in exchange for nothing a reader of this file\n // needs.\n const isControlled = open !== undefined;\n const isVisible = isControlled ? open : dropdownState.isVisible;\n\n const wasControlled = useRef(isControlled);\n if (wasControlled.current !== isControlled) {\n devWarn(\n 'dropdown-controlled-switch',\n 'Dropdown: `open` switched between controlled and uncontrolled. Pick one for the lifetime of the component - the dropdown keeps its own state as a fallback, so switching makes it jump to whatever that happens to be.',\n );\n wasControlled.current = isControlled;\n }\n\n /**\n * The single place the open state changes. Every route - trigger click,\n * click-outside, Escape, a group sibling, the `delay` timer - goes through\n * here, so a controlled consumer sees all of them and cannot desync.\n */\n const setOpen = useCallback(\n (next: boolean) => {\n setDropdownState((prev) => ({ ...prev, isVisible: next, isPositioned: false }));\n onOpenChange?.(next);\n },\n [onOpenChange],\n );\n\n // A controlled caller can flip `open` without going through `setOpen`, which\n // would leave `isPositioned` true from the previous open and paint the panel\n // at its old coordinates for a frame. Re-arm the positioning pass from the\n // transition itself.\n useEffect(() => {\n if (!isVisible) {\n setDropdownState((prev) => (prev.isPositioned ? { ...prev, isPositioned: false } : prev));\n }\n }, [isVisible]);\n\n // A pending `delay` timer outlives a controlled close otherwise, and reopens\n // the panel a moment after the consumer closed it.\n useEffect(() => {\n if (!isVisible && timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n }, [isVisible]);\n const triggerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const animationFrameRef = useRef<number | undefined>(undefined);\n const isScrollingRef = useRef(false);\n\n // The element to actually measure/anchor against. When a consumer passes\n // `triggerRef`, that's an explicit statement of \"this is what I want the\n // dropdown positioned relative to\" - it must win over the internal wrapper\n // div, not just inform sizing. Consumers occasionally need `trigger` to be\n // a small anchor node (e.g. a 0-height span) sitting inside a larger,\n // variable-content field (chips, wrapped text); anchoring position to the\n // wrapper instead of that field silently drifts as soon as the field's\n // internal layout changes, since the wrapper only ever contains `trigger`\n // itself, never the field around it.\n const getTriggerElement = useCallback(\n (): HTMLElement | null => externalTriggerRef?.current ?? triggerRef.current,\n [externalTriggerRef],\n );\n\n const calculateDynamicSizing = useCallback(\n // Only the width is read, so the parameter is the narrowest shape that\n // satisfies it rather than a `DOMRect`. The caller used to fall back to\n // `new DOMRect()`, which is a browser-only global evaluated *during\n // render* - it was the first thing to throw when an open dropdown was\n // server-rendered, before `document.body` ever got a chance to.\n (triggerRect: { width: number } | null) => {\n // Shrink the panel to its content by default. This prevents the\n // position:fixed element from expanding to viewport width when children\n // use `width:100%` or `flex:1`. `minWidth` (set below) still wins when\n // the trigger is wider than the content, as CSS min-width overrides width.\n const styles: Record<string, string | number> = { width: 'max-content' };\n\n if (autoWidth && triggerRect && (externalTriggerRef?.current || triggerRef.current)) {\n const triggerWidth = triggerRect.width;\n styles.minWidth = triggerWidth;\n }\n\n if (minWidth !== undefined) {\n styles.minWidth = typeof minWidth === 'number' ? `${minWidth}px` : minWidth;\n }\n if (maxWidth !== undefined) {\n if (maxWidth === 'auto') {\n styles.maxWidth = 'none';\n } else {\n styles.maxWidth = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n }\n }\n if (minHeight !== undefined) {\n styles.minHeight = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n }\n if (maxHeight !== undefined) {\n if (maxHeight === 'auto') {\n styles.maxHeight = 'none';\n } else {\n styles.maxHeight = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n }\n }\n\n const hasHeightConstraint = minHeight !== undefined || maxHeight !== undefined;\n if (hasHeightConstraint) {\n styles.overflowY = 'auto';\n } else {\n styles.overflowY = 'visible';\n }\n\n return styles;\n },\n [autoWidth, externalTriggerRef, minWidth, maxWidth, minHeight, maxHeight],\n );\n\n const calculateOptimalPosition = useCallback(\n (triggerRect: DOMRect, contentRect: DOMRect) => {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 8;\n\n let placement: 'top' | 'bottom' | 'left' | 'right' = preferredPlacement;\n let top = 0;\n let left = 0;\n\n // Helpers for cross-axis alignment\n const alignedLeft = (() => {\n switch (align) {\n case 'end':\n return triggerRect.right - contentRect.width;\n case 'center':\n return triggerRect.left + (triggerRect.width - contentRect.width) / 2;\n default:\n return triggerRect.left; // \"start\"\n }\n })();\n const alignedTop = (() => {\n switch (align) {\n case 'end':\n return triggerRect.bottom - contentRect.height;\n case 'center':\n return triggerRect.top + (triggerRect.height - contentRect.height) / 2;\n default:\n return triggerRect.top; // \"start\"\n }\n })();\n\n switch (preferredPlacement) {\n case 'top':\n top = triggerRect.top - contentRect.height - gap;\n left = alignedLeft;\n break;\n case 'bottom':\n top = triggerRect.bottom + gap;\n left = alignedLeft;\n break;\n case 'left':\n top = alignedTop;\n left = triggerRect.left - contentRect.width - gap;\n break;\n case 'right':\n top = alignedTop;\n left = triggerRect.right + gap;\n break;\n }\n\n if (placement === 'top' && top < gap) {\n placement = 'bottom';\n top = triggerRect.bottom + gap;\n } else if (placement === 'bottom' && top + contentRect.height > viewportHeight - gap) {\n placement = 'top';\n top = triggerRect.top - contentRect.height - gap;\n } else if (placement === 'left' && left < gap) {\n placement = 'right';\n left = triggerRect.right + gap;\n } else if (placement === 'right' && left + contentRect.width > viewportWidth - gap) {\n placement = 'left';\n left = triggerRect.left - contentRect.width - gap;\n }\n\n // Always clamp to both viewport edges - not just the near one - regardless\n // of whether an explicit min/max size was passed. `autoWidth` consumers\n // (Combobox, Select, TagInput suggestions, Menu, ...) never set\n // minWidth/maxWidth, so gating this on those props left the far edge\n // (right/bottom) completely unclamped and let content overflow the\n // viewport whenever it rendered wider/taller than its trigger.\n top = Math.max(gap, Math.min(top, viewportHeight - contentRect.height - gap));\n\n left = Math.max(gap, Math.min(left, viewportWidth - contentRect.width - gap));\n\n return { top, left, placement };\n },\n [preferredPlacement, align],\n );\n\n const handleScroll = useCallback(() => {\n if (!isVisible || !dropdownState.isPositioned || isScrollingRef.current) return;\n\n isScrollingRef.current = true;\n\n animationFrameRef.current = requestAnimationFrame(() => {\n const triggerElement = getTriggerElement();\n if (triggerElement && contentRef.current) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n\n isScrollingRef.current = false;\n });\n }, [isVisible, dropdownState.isPositioned, calculateOptimalPosition, getTriggerElement]);\n\n const handleTriggerClick = useCallback(() => {\n if (disabled) return;\n\n if (isVisible) {\n setOpen(false);\n } else {\n if (dropdownGroup) {\n const siblingDropdowns = document.querySelectorAll(\n `[data-dropdown-group=\"${dropdownGroup}\"][data-dropdown-content]`,\n );\n siblingDropdowns.forEach((dropdown) => {\n const dropdownElement = dropdown as HTMLElement;\n\n dropdownElement.dispatchEvent(new CustomEvent('closeSibling'));\n });\n }\n\n if (delay > 0) {\n timeoutRef.current = setTimeout(() => setOpen(true), delay);\n } else {\n setOpen(true);\n }\n }\n }, [disabled, isVisible, delay, dropdownGroup, setOpen]);\n\n useEffect(() => {\n const handleCloseSibling = () => {\n if (isVisible) setOpen(false);\n };\n\n const currentContentRef = contentRef.current;\n if (currentContentRef) {\n currentContentRef.addEventListener('closeSibling', handleCloseSibling);\n }\n\n return () => {\n if (currentContentRef) {\n currentContentRef.removeEventListener('closeSibling', handleCloseSibling);\n }\n };\n }, [isVisible, setOpen]);\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (!closeOnClickOutside || !isVisible) return;\n\n const target = event.target as Node;\n\n if (contentRef.current?.contains(target)) {\n return;\n }\n\n if (getTriggerElement()?.contains(target)) {\n return;\n }\n\n const allDropdowns = document.querySelectorAll('[data-dropdown-content]');\n for (const dropdown of allDropdowns) {\n if (dropdown === contentRef.current) continue;\n\n if (dropdown.contains(target)) {\n const clickedDropdownLevel = parseInt(\n dropdown.getAttribute('data-dropdown-level') || '0',\n );\n\n if (clickedDropdownLevel > actualLevel) {\n return;\n }\n }\n }\n\n setOpen(false);\n },\n [closeOnClickOutside, isVisible, actualLevel, getTriggerElement, setOpen],\n );\n\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n if (closeOnEscape && event.key === 'Escape' && isVisible) {\n setOpen(false);\n }\n },\n [closeOnEscape, isVisible, setOpen],\n );\n\n useEffect(() => {\n const triggerElement = getTriggerElement();\n if (isVisible && !dropdownState.isPositioned && contentRef.current && triggerElement) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n isPositioned: true,\n }));\n }\n }, [\n isVisible,\n dropdownState.isPositioned,\n calculateOptimalPosition,\n getTriggerElement,\n // Load-bearing, not incidental. With `defaultOpen` the panel is \"visible\"\n // from the first render, but the portal is deferred one render for SSR\n // safety - so this effect's first run finds `contentRef.current` still\n // null, measures nothing, and without `isClient` in the deps it would never\n // run again. The panel then stays `visibility: hidden` forever: mounted,\n // unpositioned, invisible. Caught by `OpensOnMountWithDefaultOpen`.\n isClient,\n ]);\n\n useEffect(() => {\n const handleResize = () => {\n const triggerElement = getTriggerElement();\n if (isVisible && dropdownState.isPositioned && contentRef.current && triggerElement) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [isVisible, dropdownState.isPositioned, calculateOptimalPosition, getTriggerElement]);\n\n useEffect(() => {\n if (isVisible) {\n // Capture phase on `document`, which is the only way to see scrolling in\n // an arbitrary ancestor: `scroll` does not bubble from an element, so the\n // previous listeners on `window` and `document.body` only ever fired for\n // the page itself. Any other scroll container - `PageLayout`'s\n // `&__content` is the layout's scrollport, so this is every dropdown\n // inside it - moved the trigger while the portaled, `position: fixed`\n // content stayed at its original viewport coordinates.\n document.addEventListener('scroll', handleScroll, { capture: true, passive: true });\n }\n\n return () => {\n document.removeEventListener('scroll', handleScroll, { capture: true });\n };\n }, [isVisible, handleScroll]);\n\n useEffect(() => {\n if (isVisible) {\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [isVisible, handleClickOutside, handleEscapeKey]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n };\n }, []);\n\n return (\n <>\n {/*\n A positioning and click-capturing wrapper, and nothing more - it\n deliberately carries no `role` and no `tabIndex`.\n\n It used to be `role=\"button\" tabIndex={-1}`, which was wrong in both\n directions at once. `tabIndex={-1}` with no key handler meant the\n wrapper was never keyboard-operable, so the button role it advertised\n could not be activated by anyone using a keyboard - it promised a\n control that did not exist. Meanwhile, because `trigger` is virtually\n always a real control (Select and Combobox pass an `<input>`, Menu and\n SplitButton a `<button>`, ...), the role wrapped an interactive element\n in another interactive element: invalid ARIA, flagged by axe as\n `nested-interactive`, and announced by screen readers as a button\n inside a button. One attribute did this across every component built\n on Dropdown - Select, Combobox, Menu, Popover, ContextMenu,\n ColorPicker and TagInput - 212 violations in a single axe run.\n\n Semantics belong to whatever is passed as `trigger`, which is the only\n element that can actually own them. A consumer passing a\n non-interactive node should pass a `<button>` instead; it was never\n keyboard-accessible under the old markup either.\n */}\n <div\n ref={triggerRef}\n onClick={handleTriggerClick}\n className={`eidos-dropdown-trigger ${fullWidth ? fullWidthModifier('eidos-dropdown-trigger') : ''} ${triggerClassName}`}\n >\n {trigger}\n </div>\n {isClient &&\n isVisible &&\n createPortal(\n <div\n ref={contentRef}\n data-dropdown-content\n data-dropdown-level={actualLevel}\n data-dropdown-group={dropdownGroup || ''}\n className={`eidos-dropdown-content eidos-dropdown-content--${dropdownState.position.placement} ${isNested ? 'eidos-dropdown-content--nested' : ''} ${dropdownState.isPositioned ? 'eidos-dropdown-content--positioned' : ''} ${contentClassName || ''}`}\n style={{\n top: dropdownState.position.top,\n left: dropdownState.position.left,\n ...calculateDynamicSizing(getTriggerElement()?.getBoundingClientRect() ?? null),\n }}\n // No default role: see the `role` prop's note in `Dropdown.types`.\n // This was `role=\"menu\"` unconditionally, which made a menu out of\n // every `Select` listbox, date picker and toolbar panel in the\n // library.\n role={role}\n >\n {content}\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nexport const Dropdown: React.FC<DropdownProps> = (props) => {\n const context = useDropdownContext();\n const nextLevel = props.dropdownLevel !== undefined ? props.dropdownLevel : context.level + 1;\n\n return (\n <DropdownProvider level={nextLevel}>\n <DropdownInternal {...props} />\n </DropdownProvider>\n );\n};\n\nDropdown.displayName = 'Dropdown';\n"],"mappings":"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","names":["jsx"]}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FOCUSABLE_SELECTOR
|
|
3
|
+
} from "./chunk-RHHZRTWM.js";
|
|
4
|
+
|
|
1
5
|
// src/components/Tooltip/Tooltip.component.tsx
|
|
2
6
|
import { useState, useRef, useCallback, useEffect } from "react";
|
|
3
7
|
import { createPortal } from "react-dom";
|
|
4
8
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
var HOVER_GRACE_MS = 150;
|
|
5
10
|
var Tooltip = ({
|
|
6
11
|
children,
|
|
7
12
|
message,
|
|
@@ -92,12 +97,13 @@ var Tooltip = ({
|
|
|
92
97
|
}, [tooltipState.isVisible, tooltipState.isPositioned, calculateOptimalPosition]);
|
|
93
98
|
const handleMouseEnter = useCallback(() => {
|
|
94
99
|
if (disabled || triggerType !== "hover") return;
|
|
100
|
+
if (timeoutRef.current) {
|
|
101
|
+
clearTimeout(timeoutRef.current);
|
|
102
|
+
}
|
|
95
103
|
timeoutRef.current = setTimeout(() => {
|
|
96
|
-
setTooltipState(
|
|
97
|
-
...prev,
|
|
98
|
-
|
|
99
|
-
isPositioned: false
|
|
100
|
-
}));
|
|
104
|
+
setTooltipState(
|
|
105
|
+
(prev) => prev.isVisible ? prev : { ...prev, isVisible: true, isPositioned: false }
|
|
106
|
+
);
|
|
101
107
|
}, delay);
|
|
102
108
|
}, [disabled, delay, triggerType]);
|
|
103
109
|
const handleMouseLeave = useCallback(() => {
|
|
@@ -105,11 +111,13 @@ var Tooltip = ({
|
|
|
105
111
|
if (timeoutRef.current) {
|
|
106
112
|
clearTimeout(timeoutRef.current);
|
|
107
113
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
114
|
+
timeoutRef.current = setTimeout(() => {
|
|
115
|
+
setTooltipState((prev) => ({
|
|
116
|
+
...prev,
|
|
117
|
+
isVisible: false,
|
|
118
|
+
isPositioned: false
|
|
119
|
+
}));
|
|
120
|
+
}, HOVER_GRACE_MS);
|
|
113
121
|
}, [triggerType]);
|
|
114
122
|
const handleClick = useCallback(() => {
|
|
115
123
|
if (disabled || triggerType !== "click") return;
|
|
@@ -175,7 +183,7 @@ var Tooltip = ({
|
|
|
175
183
|
);
|
|
176
184
|
const handleEscapeKey = useCallback(
|
|
177
185
|
(event) => {
|
|
178
|
-
if (closeOnEscape && event.key === "Escape" && tooltipState.isVisible
|
|
186
|
+
if (closeOnEscape && event.key === "Escape" && tooltipState.isVisible) {
|
|
179
187
|
setTooltipState((prev) => ({
|
|
180
188
|
...prev,
|
|
181
189
|
isVisible: false,
|
|
@@ -183,7 +191,7 @@ var Tooltip = ({
|
|
|
183
191
|
}));
|
|
184
192
|
}
|
|
185
193
|
},
|
|
186
|
-
[closeOnEscape, tooltipState.isVisible
|
|
194
|
+
[closeOnEscape, tooltipState.isVisible]
|
|
187
195
|
);
|
|
188
196
|
useEffect(() => {
|
|
189
197
|
if (tooltipState.isVisible && !tooltipState.isPositioned && tooltipRef.current && triggerRef.current) {
|
|
@@ -214,24 +222,28 @@ var Tooltip = ({
|
|
|
214
222
|
}, [tooltipState.isVisible, tooltipState.isPositioned, calculateOptimalPosition]);
|
|
215
223
|
useEffect(() => {
|
|
216
224
|
if (tooltipState.isVisible) {
|
|
217
|
-
|
|
218
|
-
document.body.addEventListener("scroll", handleScroll, { passive: true });
|
|
225
|
+
document.addEventListener("scroll", handleScroll, { capture: true, passive: true });
|
|
219
226
|
}
|
|
220
227
|
return () => {
|
|
221
|
-
|
|
222
|
-
document.body.removeEventListener("scroll", handleScroll);
|
|
228
|
+
document.removeEventListener("scroll", handleScroll, { capture: true });
|
|
223
229
|
};
|
|
224
230
|
}, [tooltipState.isVisible, handleScroll]);
|
|
225
231
|
useEffect(() => {
|
|
226
232
|
if (tooltipState.isVisible && triggerType === "click") {
|
|
227
233
|
document.addEventListener("mousedown", handleClickOutside);
|
|
228
|
-
document.addEventListener("keydown", handleEscapeKey);
|
|
229
234
|
}
|
|
230
235
|
return () => {
|
|
231
236
|
document.removeEventListener("mousedown", handleClickOutside);
|
|
237
|
+
};
|
|
238
|
+
}, [tooltipState.isVisible, triggerType, handleClickOutside]);
|
|
239
|
+
useEffect(() => {
|
|
240
|
+
if (tooltipState.isVisible) {
|
|
241
|
+
document.addEventListener("keydown", handleEscapeKey);
|
|
242
|
+
}
|
|
243
|
+
return () => {
|
|
232
244
|
document.removeEventListener("keydown", handleEscapeKey);
|
|
233
245
|
};
|
|
234
|
-
}, [tooltipState.isVisible,
|
|
246
|
+
}, [tooltipState.isVisible, handleEscapeKey]);
|
|
235
247
|
useEffect(() => {
|
|
236
248
|
return () => {
|
|
237
249
|
if (timeoutRef.current) {
|
|
@@ -251,6 +263,11 @@ var Tooltip = ({
|
|
|
251
263
|
}
|
|
252
264
|
return null;
|
|
253
265
|
};
|
|
266
|
+
const [triggerNeedsFocus, setTriggerNeedsFocus] = useState(false);
|
|
267
|
+
useEffect(() => {
|
|
268
|
+
const el = triggerRef.current;
|
|
269
|
+
setTriggerNeedsFocus(!!el && el.querySelector(FOCUSABLE_SELECTOR) === null);
|
|
270
|
+
}, [children, triggerType]);
|
|
254
271
|
const getTriggerProps = () => {
|
|
255
272
|
const props = {
|
|
256
273
|
ref: triggerRef,
|
|
@@ -263,13 +280,21 @@ var Tooltip = ({
|
|
|
263
280
|
break;
|
|
264
281
|
case "click":
|
|
265
282
|
props.onClick = handleClick;
|
|
266
|
-
|
|
267
|
-
|
|
283
|
+
if (triggerNeedsFocus) {
|
|
284
|
+
props.role = "button";
|
|
285
|
+
props.tabIndex = 0;
|
|
286
|
+
props.onKeyDown = (event) => {
|
|
287
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
288
|
+
event.preventDefault();
|
|
289
|
+
handleClick();
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
}
|
|
268
293
|
break;
|
|
269
294
|
case "focus":
|
|
270
295
|
props.onFocus = handleFocus;
|
|
271
296
|
props.onBlur = handleBlur;
|
|
272
|
-
props.tabIndex = 0;
|
|
297
|
+
if (triggerNeedsFocus) props.tabIndex = 0;
|
|
273
298
|
break;
|
|
274
299
|
}
|
|
275
300
|
return props;
|
|
@@ -281,6 +306,8 @@ var Tooltip = ({
|
|
|
281
306
|
"div",
|
|
282
307
|
{
|
|
283
308
|
ref: tooltipRef,
|
|
309
|
+
onMouseEnter: handleMouseEnter,
|
|
310
|
+
onMouseLeave: handleMouseLeave,
|
|
284
311
|
className: `eidos-tooltip eidos-tooltip--${tooltipState.position.placement} ${className}`,
|
|
285
312
|
style: {
|
|
286
313
|
top: tooltipState.position.top,
|
|
@@ -300,4 +327,4 @@ Tooltip.displayName = "Tooltip";
|
|
|
300
327
|
export {
|
|
301
328
|
Tooltip
|
|
302
329
|
};
|
|
303
|
-
//# sourceMappingURL=chunk-
|
|
330
|
+
//# sourceMappingURL=chunk-JNY7TUDS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Tooltip/Tooltip.component.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { TooltipProps, TooltipState } from './Tooltip.types';\nimport { FOCUSABLE_SELECTOR } from '../../utils';\n\n/**\n * How long the tooltip stays open after the pointer leaves, so it can be\n * moved onto the panel itself (SC 1.4.13, \"hoverable\"). Long enough to cross\n * the gap, short enough not to feel stuck.\n */\nconst HOVER_GRACE_MS = 150;\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n children,\n message,\n component: Component,\n componentProps,\n placement: preferredPlacement = 'top',\n delay = 100,\n disabled = false,\n className = '',\n triggerType = 'hover',\n closeOnClickOutside = true,\n closeOnEscape = true,\n}) => {\n const [tooltipState, setTooltipState] = useState<TooltipState>({\n isVisible: false,\n position: { top: 0, left: 0, placement: 'top' },\n isPositioned: false,\n });\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const animationFrameRef = useRef<number | undefined>(undefined);\n const isScrollingRef = useRef(false);\n\n const calculateOptimalPosition = useCallback(\n (triggerRect: DOMRect, tooltipRect: DOMRect) => {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 8;\n\n let placement: 'top' | 'bottom' | 'left' | 'right' = preferredPlacement;\n let top = 0;\n let left = 0;\n\n switch (preferredPlacement) {\n case 'top':\n top = triggerRect.top - tooltipRect.height - gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n break;\n case 'bottom':\n top = triggerRect.bottom + gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n break;\n case 'left':\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.left - tooltipRect.width - gap;\n break;\n case 'right':\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.right + gap;\n break;\n }\n\n if (placement === 'top' && top < gap) {\n placement = 'bottom';\n top = triggerRect.bottom + gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n } else if (placement === 'bottom' && top + tooltipRect.height > viewportHeight - gap) {\n placement = 'top';\n top = triggerRect.top - tooltipRect.height - gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n } else if (placement === 'left' && left < gap) {\n placement = 'right';\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.right + gap;\n } else if (placement === 'right' && left + tooltipRect.width > viewportWidth - gap) {\n placement = 'left';\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.left - tooltipRect.width - gap;\n }\n\n top = Math.max(gap, Math.min(top, viewportHeight - tooltipRect.height - gap));\n left = Math.max(gap, Math.min(left, viewportWidth - tooltipRect.width - gap));\n\n return { top, left, placement };\n },\n [preferredPlacement],\n );\n\n const handleScroll = useCallback(() => {\n if (!tooltipState.isVisible || !tooltipState.isPositioned || isScrollingRef.current) return;\n\n isScrollingRef.current = true;\n\n animationFrameRef.current = requestAnimationFrame(() => {\n if (triggerRef.current && tooltipRef.current) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, tooltipRect);\n\n setTooltipState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n\n isScrollingRef.current = false;\n });\n }, [tooltipState.isVisible, tooltipState.isPositioned, calculateOptimalPosition]);\n\n const handleMouseEnter = useCallback(() => {\n if (disabled || triggerType !== 'hover') return;\n\n // Cancels a pending hide as well as scheduling the show. Both handlers\n // are bound to the trigger *and* to the panel, so this is what catches\n // the pointer as it crosses from one to the other.\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n // Left untouched when already open. Re-entering from the panel would\n // otherwise re-run the open transition and reposition a tooltip the\n // user is in the middle of reading.\n setTooltipState((prev) =>\n prev.isVisible ? prev : { ...prev, isVisible: true, isPositioned: false },\n );\n }, delay);\n }, [disabled, delay, triggerType]);\n\n const handleMouseLeave = useCallback(() => {\n if (triggerType !== 'hover') return;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Closing is delayed, not immediate.\n //\n // SC 1.4.13 requires the pointer to be able to reach the tooltip's own\n // content. The panel is portaled and sits a few pixels off the trigger,\n // so an immediate hide made that gap impossible to cross - the tooltip\n // disappeared the moment the pointer left the trigger, however fast the\n // user moved. The grace period is what makes \"hoverable\" reachable in\n // practice.\n timeoutRef.current = setTimeout(() => {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n }, HOVER_GRACE_MS);\n }, [triggerType]);\n\n const handleClick = useCallback(() => {\n if (disabled || triggerType !== 'click') return;\n\n if (tooltipState.isVisible) {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n } else {\n if (delay > 0) {\n timeoutRef.current = setTimeout(() => {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: true,\n isPositioned: false,\n }));\n }, delay);\n } else {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: true,\n isPositioned: false,\n }));\n }\n }\n }, [disabled, triggerType, tooltipState.isVisible, delay]);\n\n const handleFocus = useCallback(() => {\n if (disabled || triggerType !== 'focus') return;\n\n timeoutRef.current = setTimeout(() => {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: true,\n isPositioned: false,\n }));\n }, delay);\n }, [disabled, triggerType, delay]);\n\n const handleBlur = useCallback(() => {\n if (triggerType !== 'focus') return;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n }, [triggerType]);\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (!closeOnClickOutside || !tooltipState.isVisible || triggerType !== 'click') return;\n\n const target = event.target as Node;\n\n if (tooltipRef.current?.contains(target) || triggerRef.current?.contains(target)) {\n return;\n }\n\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n },\n [closeOnClickOutside, tooltipState.isVisible, triggerType],\n );\n\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n // Every trigger type, not just `click`.\n //\n // SC 1.4.13 requires content shown on hover *or focus* to be\n // dismissible without moving the pointer or focus - and `hover` is the\n // default, so the one configuration that could be dismissed was the\n // one least likely to be used. A tooltip covering the text you are\n // trying to read had to be escaped by physically moving the mouse.\n if (closeOnEscape && event.key === 'Escape' && tooltipState.isVisible) {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n }\n },\n [closeOnEscape, tooltipState.isVisible],\n );\n\n useEffect(() => {\n if (\n tooltipState.isVisible &&\n !tooltipState.isPositioned &&\n tooltipRef.current &&\n triggerRef.current\n ) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, tooltipRect);\n\n setTooltipState((prev) => ({\n ...prev,\n position: { top, left, placement },\n isPositioned: true,\n }));\n }\n }, [tooltipState.isVisible, tooltipState.isPositioned, calculateOptimalPosition]);\n\n useEffect(() => {\n const handleResize = () => {\n if (\n tooltipState.isVisible &&\n tooltipState.isPositioned &&\n tooltipRef.current &&\n triggerRef.current\n ) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, tooltipRect);\n\n setTooltipState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [tooltipState.isVisible, tooltipState.isPositioned, calculateOptimalPosition]);\n\n useEffect(() => {\n if (tooltipState.isVisible) {\n // Capture phase on `document` - see the note in `Dropdown`. `scroll` does\n // not bubble, so listeners on `window`/`document.body` miss every\n // ancestor scroll container and the portaled tooltip detaches from its\n // trigger.\n document.addEventListener('scroll', handleScroll, { capture: true, passive: true });\n }\n\n return () => {\n document.removeEventListener('scroll', handleScroll, { capture: true });\n };\n }, [tooltipState.isVisible, handleScroll]);\n\n // Click-outside is only meaningful for a click-triggered tooltip; Escape\n // is not. Registering them together meant a hover tooltip had no way to be\n // dismissed from the keyboard at all (SC 1.4.13, \"dismissible\") - and\n // `hover` is the default, so the failing case was the common one.\n useEffect(() => {\n if (tooltipState.isVisible && triggerType === 'click') {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [tooltipState.isVisible, triggerType, handleClickOutside]);\n\n useEffect(() => {\n if (tooltipState.isVisible) {\n document.addEventListener('keydown', handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [tooltipState.isVisible, handleEscapeKey]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n };\n }, []);\n\n const renderTooltipContent = () => {\n if (message) {\n return <span className=\"eidos-tooltip-message\">{message}</span>;\n }\n if (Component) {\n return <Component {...(componentProps || {})} />;\n }\n return null;\n };\n\n // Whether the trigger wrapper has to become focusable itself, i.e. whether\n // the consumer's child is not already a control. Measured from the DOM\n // rather than guessed from the node type, because `children` is an\n // arbitrary `ReactNode` and the control may be nested inside it.\n const [triggerNeedsFocus, setTriggerNeedsFocus] = useState(false);\n\n useEffect(() => {\n const el = triggerRef.current;\n setTriggerNeedsFocus(!!el && el.querySelector(FOCUSABLE_SELECTOR) === null);\n }, [children, triggerType]);\n\n const getTriggerProps = () => {\n const props: Record<string, unknown> = {\n ref: triggerRef,\n className: 'eidos-tooltip-trigger',\n };\n\n switch (triggerType) {\n case 'hover':\n props.onMouseEnter = handleMouseEnter;\n props.onMouseLeave = handleMouseLeave;\n break;\n case 'click':\n props.onClick = handleClick;\n // Only when the trigger has no control of its own. Making this\n // wrapper a button unconditionally put a button inside a button\n // whenever the child was one - which is the common case, since\n // `Button` wraps *itself* in a Tooltip when given `tooltip`. That is\n // invalid (`nested-interactive`) and gives one action two tab stops.\n if (triggerNeedsFocus) {\n props.role = 'button';\n props.tabIndex = 0;\n props.onKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleClick();\n }\n };\n }\n break;\n case 'focus':\n props.onFocus = handleFocus;\n props.onBlur = handleBlur;\n // Same reasoning: a focusable child already receives the focus that\n // opens the tooltip, and adding `tabIndex` here would just add a\n // second stop in front of it.\n if (triggerNeedsFocus) props.tabIndex = 0;\n break;\n }\n\n return props;\n };\n\n return (\n <>\n <div {...getTriggerProps()}>{children}</div>\n {tooltipState.isVisible &&\n createPortal(\n <div\n ref={tooltipRef}\n // SC 1.4.13 \"hoverable\": the pointer has to be able to reach the\n // tooltip's own content - to read a long message, or select text\n // from it - without it vanishing. The panel used to be\n // `pointer-events: none`, so moving towards it dismissed it.\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={`eidos-tooltip eidos-tooltip--${tooltipState.position.placement} ${className}`}\n style={{\n top: tooltipState.position.top,\n left: tooltipState.position.left,\n }}\n data-state={tooltipState.isPositioned ? 'entered' : 'entering'}\n role=\"tooltip\"\n >\n {renderTooltipContent()}\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nTooltip.displayName = 'Tooltip';\n"],"mappings":"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","names":[]}
|
|
@@ -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 _chunkBEOECPVJcjs = require('./chunk-BEOECPVJ.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
var _chunk35LGEPLPcjs = require('./chunk-35LGEPLP.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
|
+
_chunk35LGEPLPcjs.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 && _chunk35LGEPLPcjs.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, _chunkBEOECPVJcjs.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-JPYJQ4TF.cjs.map
|