eidos-ui 3.6.3 → 3.8.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 +11 -0
- package/dist/{Avatar.types-BY-C09Ke.d.cts → Avatar.types-DkRznn-7.d.cts} +6 -1
- package/dist/{Avatar.types-BY-C09Ke.d.ts → Avatar.types-DkRznn-7.d.ts} +6 -1
- package/dist/{Breadcrumb.types-DaykU-C8.d.cts → Breadcrumb.types-C3uADbKU.d.cts} +4 -1
- package/dist/{Breadcrumb.types-DaykU-C8.d.ts → Breadcrumb.types-C3uADbKU.d.ts} +4 -1
- package/dist/Button.types-BCIK8Qlk.d.ts +59 -0
- package/dist/Button.types-DkgWjFsk.d.cts +59 -0
- package/dist/Chip.types-BM-UZOCv.d.ts +33 -0
- package/dist/Chip.types-_1bhyKz4.d.cts +33 -0
- package/dist/{Header.types-Ce5Cj301.d.cts → Header.types-a6p0-ZHx.d.cts} +24 -8
- package/dist/{Header.types-0XovUp0T.d.ts → Header.types-zbhURbg7.d.ts} +24 -8
- package/dist/{Input.types-D7-sWq-q.d.cts → Input.types--K0t_3L2.d.cts} +1 -1
- package/dist/{Input.types-CSDMaZNe.d.ts → Input.types--UjucBDd.d.ts} +1 -1
- package/dist/{Menu.types-CTnUijv5.d.cts → Menu.types-D6VoK9T9.d.cts} +1 -1
- package/dist/{Menu.types-BN4g1-3A.d.ts → Menu.types-tUEhXn52.d.ts} +1 -1
- package/dist/{Navigation.types-By5HfPTi.d.ts → Navigation.types-CJRzo9Zo.d.ts} +1 -1
- package/dist/{Navigation.types-_MrYqqUI.d.cts → Navigation.types-D95oHZEJ.d.cts} +1 -1
- package/dist/{SegmentedControl.types-cjLwwBAm.d.ts → SegmentedControl.types-CHtjABQM.d.ts} +1 -1
- package/dist/{SegmentedControl.types-BofrEYyd.d.cts → SegmentedControl.types-D_gHYL9X.d.cts} +1 -1
- package/dist/{Select.types-ok-03rLo.d.cts → Select.types-8CGZBgT-.d.cts} +2 -2
- package/dist/{Select.types-C2tGy1vj.d.ts → Select.types-CAVh9Gvd.d.ts} +2 -2
- package/dist/{Table.types-D8pmgxKA.d.ts → Table.types-BFDE-hhF.d.ts} +2 -2
- package/dist/{Table.types-D-9tC0kJ.d.cts → Table.types-Tai7_MTz.d.cts} +2 -2
- package/dist/{Toolbar.types-CKnQC_TW.d.ts → Toolbar.types-BqBrPVww.d.ts} +8 -6
- package/dist/{Toolbar.types-DUz2mxct.d.cts → Toolbar.types-GCUgzuKW.d.cts} +8 -6
- package/dist/alert/index.cjs +8 -5
- package/dist/alert/index.cjs.map +1 -1
- package/dist/alert/index.d.cts +1 -1
- package/dist/alert/index.d.ts +1 -1
- package/dist/alert/index.js +7 -4
- package/dist/avatar/index.d.cts +2 -2
- package/dist/avatar/index.d.ts +2 -2
- package/dist/breadcrumb/index.cjs +4 -2
- package/dist/breadcrumb/index.cjs.map +1 -1
- package/dist/breadcrumb/index.d.cts +2 -2
- package/dist/breadcrumb/index.d.ts +2 -2
- package/dist/breadcrumb/index.js +3 -1
- package/dist/button/index.cjs +7 -4
- package/dist/button/index.cjs.map +1 -1
- package/dist/button/index.d.cts +5 -5
- package/dist/button/index.d.ts +5 -5
- package/dist/button/index.js +6 -3
- package/dist/button-group/index.d.cts +2 -2
- package/dist/button-group/index.d.ts +2 -2
- package/dist/chip/index.cjs +7 -4
- package/dist/chip/index.cjs.map +1 -1
- package/dist/chip/index.d.cts +5 -23
- package/dist/chip/index.d.ts +5 -23
- package/dist/chip/index.js +6 -3
- package/dist/{chunk-DRXPTACG.js → chunk-26PRBZA6.js} +6 -2
- package/dist/chunk-26PRBZA6.js.map +1 -0
- package/dist/chunk-2IXCEKLI.js +82 -0
- package/dist/chunk-2IXCEKLI.js.map +1 -0
- package/dist/{chunk-GWHZFX2H.js → chunk-2TIMJD4K.js} +29 -6
- package/dist/chunk-2TIMJD4K.js.map +1 -0
- package/dist/{chunk-RHFD2Z5V.js → chunk-3TF2GZSG.js} +7 -7
- package/dist/{chunk-TC5IC6OP.cjs → chunk-3VXUOAIJ.cjs} +3 -3
- package/dist/{chunk-TC5IC6OP.cjs.map → chunk-3VXUOAIJ.cjs.map} +1 -1
- package/dist/{chunk-JHX6JK3M.js → chunk-3X6QVHTD.js} +2 -2
- package/dist/{chunk-7VJCGKVP.cjs → chunk-4HZIXRAJ.cjs} +11 -11
- package/dist/{chunk-7VJCGKVP.cjs.map → chunk-4HZIXRAJ.cjs.map} +1 -1
- package/dist/{chunk-MQAOXZD4.js → chunk-4S57PE43.js} +4 -4
- package/dist/{chunk-JT4KVXJK.js → chunk-4V2XYUQL.js} +2 -2
- package/dist/{chunk-PMSENLOA.cjs → chunk-544RAXWO.cjs} +19 -19
- package/dist/{chunk-PMSENLOA.cjs.map → chunk-544RAXWO.cjs.map} +1 -1
- package/dist/{chunk-4JSTBA4F.cjs → chunk-6CW5QSYV.cjs} +7 -7
- package/dist/{chunk-4JSTBA4F.cjs.map → chunk-6CW5QSYV.cjs.map} +1 -1
- package/dist/{chunk-AR2ZOO6L.js → chunk-6FXFKMJ5.js} +3 -3
- package/dist/{chunk-KREHT4AQ.cjs → chunk-6IB27I5K.cjs} +8 -8
- package/dist/{chunk-KREHT4AQ.cjs.map → chunk-6IB27I5K.cjs.map} +1 -1
- package/dist/{chunk-LGDODZHI.js → chunk-6LTZV6HN.js} +4 -4
- package/dist/{chunk-YP4HUBKN.js → chunk-6NAOAKII.js} +2 -2
- package/dist/chunk-75Q5OS7L.cjs +10 -0
- package/dist/chunk-75Q5OS7L.cjs.map +1 -0
- package/dist/{chunk-LQXFXXMJ.cjs → chunk-7FV2X62W.cjs} +7 -7
- package/dist/{chunk-LQXFXXMJ.cjs.map → chunk-7FV2X62W.cjs.map} +1 -1
- package/dist/{chunk-2T7ZMMH5.cjs → chunk-7NUVLVSL.cjs} +5 -5
- package/dist/{chunk-2T7ZMMH5.cjs.map → chunk-7NUVLVSL.cjs.map} +1 -1
- package/dist/chunk-ACH7SYQ2.js +47 -0
- package/dist/chunk-ACH7SYQ2.js.map +1 -0
- package/dist/{chunk-HNGFRRVZ.cjs → chunk-AUNDBUHM.cjs} +3 -3
- package/dist/{chunk-HNGFRRVZ.cjs.map → chunk-AUNDBUHM.cjs.map} +1 -1
- package/dist/{chunk-XZLSHEHE.cjs → chunk-B2OHBIAL.cjs} +10 -10
- package/dist/{chunk-XZLSHEHE.cjs.map → chunk-B2OHBIAL.cjs.map} +1 -1
- package/dist/chunk-BDH2MXJW.js +46 -0
- package/dist/chunk-BDH2MXJW.js.map +1 -0
- package/dist/{chunk-D7SQ7LHJ.js → chunk-BO3KK3ZQ.js} +2 -2
- package/dist/{chunk-NOQF7UQ5.cjs → chunk-CFVUUMQA.cjs} +6 -6
- package/dist/{chunk-NOQF7UQ5.cjs.map → chunk-CFVUUMQA.cjs.map} +1 -1
- package/dist/chunk-CJT7L764.cjs +21 -0
- package/dist/chunk-CJT7L764.cjs.map +1 -0
- package/dist/{chunk-5XH2PHT2.js → chunk-CNTG7OOO.js} +14 -14
- package/dist/{chunk-I6M6CVI2.cjs → chunk-DG3O5NV4.cjs} +3 -3
- package/dist/{chunk-I6M6CVI2.cjs.map → chunk-DG3O5NV4.cjs.map} +1 -1
- package/dist/{chunk-WNDDS367.js → chunk-DPTTDHZ5.js} +3 -3
- package/dist/{chunk-35LGEPLP.cjs → chunk-ENMDOQQO.cjs} +29 -14
- package/dist/chunk-ENMDOQQO.cjs.map +1 -0
- package/dist/{chunk-V4BZWBZT.cjs → chunk-F5IRMMZ2.cjs} +7 -7
- package/dist/{chunk-V4BZWBZT.cjs.map → chunk-F5IRMMZ2.cjs.map} +1 -1
- package/dist/{chunk-WE2SBWZ6.js → chunk-FE7S4RSK.js} +10 -10
- package/dist/chunk-FE7S4RSK.js.map +1 -0
- package/dist/{chunk-BFKPJ627.js → chunk-FHOD3FUN.js} +4 -4
- package/dist/{chunk-SNRRF64M.js → chunk-GDRLVX2A.js} +31 -10
- package/dist/chunk-GDRLVX2A.js.map +1 -0
- package/dist/{chunk-5O73AALP.cjs → chunk-GP6EEZH5.cjs} +7 -3
- package/dist/chunk-GP6EEZH5.cjs.map +1 -0
- package/dist/{chunk-SDUGYJGW.js → chunk-H3C6YECZ.js} +6 -6
- package/dist/{chunk-RJVHR45I.cjs → chunk-H46ZLPNJ.cjs} +7 -7
- package/dist/{chunk-RJVHR45I.cjs.map → chunk-H46ZLPNJ.cjs.map} +1 -1
- package/dist/{chunk-66UQTF57.cjs → chunk-HLI4SOH3.cjs} +45 -45
- package/dist/{chunk-66UQTF57.cjs.map → chunk-HLI4SOH3.cjs.map} +1 -1
- package/dist/{chunk-ZMRINZIO.cjs → chunk-HR5MWA3B.cjs} +5 -5
- package/dist/{chunk-ZMRINZIO.cjs.map → chunk-HR5MWA3B.cjs.map} +1 -1
- package/dist/{chunk-MPIVBAMY.js → chunk-HYRLK462.js} +2 -2
- package/dist/{chunk-FIVMMCGM.js → chunk-IHPSRTVW.js} +4 -4
- package/dist/{chunk-THCTUBX6.js → chunk-IKXXXVUO.js} +3 -3
- package/dist/{chunk-JPYJQ4TF.cjs → chunk-JFV56ISS.cjs} +6 -6
- package/dist/{chunk-JPYJQ4TF.cjs.map → chunk-JFV56ISS.cjs.map} +1 -1
- package/dist/{chunk-75GFIQRU.js → chunk-JY77VJAZ.js} +30 -15
- package/dist/chunk-JY77VJAZ.js.map +1 -0
- package/dist/chunk-KXDGW6LJ.cjs +46 -0
- package/dist/chunk-KXDGW6LJ.cjs.map +1 -0
- package/dist/{chunk-24HKKSKX.js → chunk-L6ERHCQ2.js} +3 -3
- package/dist/{chunk-4LNTZPSQ.js → chunk-L6YJ6QTZ.js} +2 -2
- package/dist/{chunk-KBQD4JLK.cjs → chunk-LUDK44NZ.cjs} +3 -3
- package/dist/{chunk-KBQD4JLK.cjs.map → chunk-LUDK44NZ.cjs.map} +1 -1
- package/dist/chunk-LWCFT5SP.cjs +82 -0
- package/dist/chunk-LWCFT5SP.cjs.map +1 -0
- package/dist/{chunk-JNY7TUDS.js → chunk-MCPGI6EI.js} +2 -2
- package/dist/{chunk-DU5JKTHK.cjs → chunk-MKC6V3SY.cjs} +6 -6
- package/dist/{chunk-DU5JKTHK.cjs.map → chunk-MKC6V3SY.cjs.map} +1 -1
- package/dist/{chunk-J76JHN7J.cjs → chunk-N5NXKVFJ.cjs} +10 -10
- package/dist/{chunk-J76JHN7J.cjs.map → chunk-N5NXKVFJ.cjs.map} +1 -1
- package/dist/{chunk-XERBOFYZ.cjs → chunk-NERASTO2.cjs} +3 -3
- package/dist/{chunk-XERBOFYZ.cjs.map → chunk-NERASTO2.cjs.map} +1 -1
- package/dist/{chunk-3KBBJZHK.cjs → chunk-NFD7MPX4.cjs} +16 -14
- package/dist/chunk-NFD7MPX4.cjs.map +1 -0
- package/dist/{chunk-3ZRFOKDM.cjs → chunk-NNAEQR3Y.cjs} +30 -30
- package/dist/{chunk-3ZRFOKDM.cjs.map → chunk-NNAEQR3Y.cjs.map} +1 -1
- package/dist/{chunk-36JFXFM2.cjs → chunk-OGGZIFTI.cjs} +38 -38
- package/dist/chunk-OGGZIFTI.cjs.map +1 -0
- package/dist/{chunk-2PCCGQOH.js → chunk-P6OJQ2RN.js} +6 -6
- package/dist/{chunk-3RWZC6OW.cjs → chunk-PE2SLXUS.cjs} +5 -5
- package/dist/{chunk-3RWZC6OW.cjs.map → chunk-PE2SLXUS.cjs.map} +1 -1
- package/dist/chunk-QD32IMMH.js +13 -0
- package/dist/chunk-QD32IMMH.js.map +1 -0
- package/dist/{chunk-HEXAY6DE.cjs → chunk-QUSO4GFA.cjs} +7 -7
- package/dist/{chunk-HEXAY6DE.cjs.map → chunk-QUSO4GFA.cjs.map} +1 -1
- package/dist/{chunk-OOCCSMWM.js → chunk-RHWZX7PB.js} +9 -7
- package/dist/chunk-RHWZX7PB.js.map +1 -0
- package/dist/{chunk-YXRKBKFB.js → chunk-S5CMZFX6.js} +3 -3
- package/dist/{chunk-4AO5RKV5.cjs → chunk-SLHIVEFW.cjs} +7 -7
- package/dist/{chunk-4AO5RKV5.cjs.map → chunk-SLHIVEFW.cjs.map} +1 -1
- package/dist/{chunk-HEX4IMLO.js → chunk-TJQNGJHP.js} +4 -4
- package/dist/{chunk-JCKGAAPZ.cjs → chunk-TNQ2ZZ7W.cjs} +9 -9
- package/dist/{chunk-JCKGAAPZ.cjs.map → chunk-TNQ2ZZ7W.cjs.map} +1 -1
- package/dist/chunk-U32K2H3N.js +10 -0
- package/dist/chunk-U32K2H3N.js.map +1 -0
- package/dist/{chunk-RHHZRTWM.js → chunk-U34INRFO.js} +28 -13
- package/dist/chunk-U34INRFO.js.map +1 -0
- package/dist/{chunk-SFFKQQ5Z.js → chunk-U4SVBE2M.js} +5 -5
- package/dist/{chunk-O3QM3BFE.js → chunk-UC4NYF6T.js} +2 -2
- package/dist/{chunk-6JHVXWDV.cjs → chunk-ULKWUKD2.cjs} +22 -22
- package/dist/{chunk-6JHVXWDV.cjs.map → chunk-ULKWUKD2.cjs.map} +1 -1
- package/dist/{chunk-BEOECPVJ.cjs → chunk-UTYY35QX.cjs} +3 -3
- package/dist/{chunk-BEOECPVJ.cjs.map → chunk-UTYY35QX.cjs.map} +1 -1
- package/dist/{chunk-7BFODYNL.cjs → chunk-UUT2VEN5.cjs} +7 -7
- package/dist/{chunk-7BFODYNL.cjs.map → chunk-UUT2VEN5.cjs.map} +1 -1
- package/dist/chunk-V3T7RO4F.js +21 -0
- package/dist/chunk-V3T7RO4F.js.map +1 -0
- package/dist/{chunk-GIEDIAPD.js → chunk-V5CM5TH3.js} +3 -3
- package/dist/{chunk-L65MHFMD.js → chunk-V64DICJK.js} +3 -3
- package/dist/{chunk-KIZVY57H.cjs → chunk-VXC7Z7XB.cjs} +5 -5
- package/dist/{chunk-KIZVY57H.cjs.map → chunk-VXC7Z7XB.cjs.map} +1 -1
- package/dist/chunk-VYF7WV4K.cjs +47 -0
- package/dist/chunk-VYF7WV4K.cjs.map +1 -0
- package/dist/{chunk-P4XZH3OR.js → chunk-WHQGJHMD.js} +4 -4
- package/dist/{chunk-TTLFY76J.cjs → chunk-WR77IZUU.cjs} +32 -9
- package/dist/chunk-WR77IZUU.cjs.map +1 -0
- package/dist/{chunk-O2BECFXJ.cjs → chunk-WTFEMOV5.cjs} +43 -22
- package/dist/chunk-WTFEMOV5.cjs.map +1 -0
- package/dist/{chunk-YAKTVIVK.js → chunk-XIUZT4TO.js} +3 -3
- package/dist/chunk-XPG56DLQ.cjs +103 -0
- package/dist/chunk-XPG56DLQ.cjs.map +1 -0
- package/dist/{chunk-GPVGGBIR.js → chunk-XWMXEJVZ.js} +2 -2
- package/dist/chunk-XZILHRKG.cjs +13 -0
- package/dist/chunk-XZILHRKG.cjs.map +1 -0
- package/dist/{chunk-VQGLVBPL.cjs → chunk-YIOHKQ6Y.cjs} +11 -4
- package/dist/chunk-YIOHKQ6Y.cjs.map +1 -0
- package/dist/{chunk-A3LMUPG3.js → chunk-Z3IJWYUD.js} +2 -2
- package/dist/{chunk-4J25XZDI.js → chunk-ZJWQPZ7E.js} +9 -2
- package/dist/chunk-ZJWQPZ7E.js.map +1 -0
- package/dist/color-picker/index.cjs +5 -4
- package/dist/color-picker/index.cjs.map +1 -1
- package/dist/color-picker/index.js +4 -3
- package/dist/combobox/index.cjs +7 -6
- package/dist/combobox/index.cjs.map +1 -1
- package/dist/combobox/index.js +6 -5
- package/dist/command-palette/index.cjs +4 -3
- package/dist/command-palette/index.cjs.map +1 -1
- package/dist/command-palette/index.js +3 -2
- package/dist/context-menu/index.cjs +7 -6
- package/dist/context-menu/index.cjs.map +1 -1
- package/dist/context-menu/index.d.cts +2 -2
- package/dist/context-menu/index.d.ts +2 -2
- package/dist/context-menu/index.js +6 -5
- package/dist/conversation/index.cjs +11 -8
- package/dist/conversation/index.cjs.map +1 -1
- package/dist/conversation/index.d.cts +3 -3
- package/dist/conversation/index.d.ts +3 -3
- package/dist/conversation/index.js +10 -7
- package/dist/data-grid/index.cjs +18 -15
- package/dist/data-grid/index.cjs.map +1 -1
- package/dist/data-grid/index.d.cts +8 -8
- package/dist/data-grid/index.d.ts +8 -8
- package/dist/data-grid/index.js +17 -14
- package/dist/date-picker/index.cjs +11 -8
- package/dist/date-picker/index.cjs.map +1 -1
- package/dist/date-picker/index.d.cts +2 -2
- package/dist/date-picker/index.d.ts +2 -2
- package/dist/date-picker/index.js +10 -7
- package/dist/drawer/index.cjs +8 -5
- package/dist/drawer/index.cjs.map +1 -1
- package/dist/drawer/index.d.cts +5 -4
- package/dist/drawer/index.d.ts +5 -4
- package/dist/drawer/index.js +7 -4
- package/dist/dropdown/index.cjs +4 -3
- package/dist/dropdown/index.cjs.map +1 -1
- package/dist/dropdown/index.js +3 -2
- package/dist/header/index.cjs +9 -6
- package/dist/header/index.cjs.map +1 -1
- package/dist/header/index.d.cts +10 -10
- package/dist/header/index.d.ts +10 -10
- package/dist/header/index.js +8 -5
- package/dist/index.cjs +59 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +107 -34
- package/dist/index.d.cts +16 -13
- package/dist/index.d.ts +16 -13
- package/dist/index.js +65 -48
- package/dist/inline-edit/index.cjs +6 -5
- package/dist/inline-edit/index.cjs.map +1 -1
- package/dist/inline-edit/index.js +5 -4
- package/dist/input/index.cjs +5 -4
- package/dist/input/index.cjs.map +1 -1
- package/dist/input/index.d.cts +3 -3
- package/dist/input/index.d.ts +3 -3
- package/dist/input/index.js +4 -3
- package/dist/link-provider/index.cjs +12 -0
- package/dist/link-provider/index.cjs.map +1 -0
- package/dist/link-provider/index.d.cts +43 -0
- package/dist/link-provider/index.d.ts +43 -0
- package/dist/link-provider/index.js +12 -0
- package/dist/link-provider/index.js.map +1 -0
- package/dist/lucide-icons/index.cjs +9 -0
- package/dist/lucide-icons/index.cjs.map +1 -0
- package/dist/lucide-icons/index.d.cts +2 -0
- package/dist/lucide-icons/index.d.ts +2 -0
- package/dist/lucide-icons/index.js +9 -0
- package/dist/lucide-icons/index.js.map +1 -0
- package/dist/menu/index.cjs +6 -5
- package/dist/menu/index.cjs.map +1 -1
- package/dist/menu/index.d.cts +3 -3
- package/dist/menu/index.d.ts +3 -3
- package/dist/menu/index.js +5 -4
- package/dist/modal/index.cjs +8 -5
- package/dist/modal/index.cjs.map +1 -1
- package/dist/modal/index.d.cts +2 -2
- package/dist/modal/index.d.ts +2 -2
- package/dist/modal/index.js +7 -4
- package/dist/navigation/index.cjs +8 -5
- package/dist/navigation/index.cjs.map +1 -1
- package/dist/navigation/index.d.cts +3 -3
- package/dist/navigation/index.d.ts +3 -3
- package/dist/navigation/index.js +7 -4
- package/dist/number-input/index.cjs +4 -3
- package/dist/number-input/index.cjs.map +1 -1
- package/dist/number-input/index.js +3 -2
- package/dist/page-layout/index.cjs +16 -13
- package/dist/page-layout/index.cjs.map +1 -1
- package/dist/page-layout/index.d.cts +8 -8
- package/dist/page-layout/index.d.ts +8 -8
- package/dist/page-layout/index.js +15 -12
- package/dist/pagination/index.cjs +11 -8
- package/dist/pagination/index.cjs.map +1 -1
- package/dist/pagination/index.js +10 -7
- package/dist/popover/index.cjs +4 -3
- package/dist/popover/index.cjs.map +1 -1
- package/dist/popover/index.d.cts +1 -1
- package/dist/popover/index.d.ts +1 -1
- package/dist/popover/index.js +3 -2
- package/dist/renderIcon-BW3PUtg8.d.cts +50 -0
- package/dist/renderIcon-BW3PUtg8.d.ts +50 -0
- package/dist/segmented-control/index.cjs +5 -4
- package/dist/segmented-control/index.cjs.map +1 -1
- package/dist/segmented-control/index.d.cts +3 -3
- package/dist/segmented-control/index.d.ts +3 -3
- package/dist/segmented-control/index.js +4 -3
- package/dist/select/index.cjs +7 -6
- package/dist/select/index.cjs.map +1 -1
- package/dist/select/index.d.cts +4 -4
- package/dist/select/index.d.ts +4 -4
- package/dist/select/index.js +6 -5
- package/dist/snackbar/index.cjs +8 -5
- package/dist/snackbar/index.cjs.map +1 -1
- package/dist/snackbar/index.js +7 -4
- package/dist/split-button/index.cjs +7 -6
- package/dist/split-button/index.cjs.map +1 -1
- package/dist/split-button/index.d.cts +2 -2
- package/dist/split-button/index.d.ts +2 -2
- package/dist/split-button/index.js +6 -5
- package/dist/split-chip/index.cjs +14 -0
- package/dist/split-chip/index.cjs.map +1 -0
- package/dist/split-chip/index.d.cts +67 -0
- package/dist/split-chip/index.d.ts +67 -0
- package/dist/split-chip/index.js +14 -0
- package/dist/split-chip/index.js.map +1 -0
- package/dist/table/index.cjs +16 -13
- package/dist/table/index.cjs.map +1 -1
- package/dist/table/index.d.cts +4 -4
- package/dist/table/index.d.ts +4 -4
- package/dist/table/index.js +15 -12
- package/dist/tabs/index.cjs +4 -3
- package/dist/tabs/index.cjs.map +1 -1
- package/dist/tabs/index.d.cts +1 -1
- package/dist/tabs/index.d.ts +1 -1
- package/dist/tabs/index.js +3 -2
- package/dist/tag-input/index.cjs +9 -6
- package/dist/tag-input/index.cjs.map +1 -1
- package/dist/tag-input/index.js +8 -5
- package/dist/textarea/index.cjs +5 -4
- package/dist/textarea/index.cjs.map +1 -1
- package/dist/textarea/index.d.cts +1 -1
- package/dist/textarea/index.d.ts +1 -1
- package/dist/textarea/index.js +4 -3
- package/dist/theme-editor/index.cjs +14 -11
- package/dist/theme-editor/index.cjs.map +1 -1
- package/dist/theme-editor/index.js +13 -10
- package/dist/theme-provider/index.cjs +4 -3
- package/dist/theme-provider/index.cjs.map +1 -1
- package/dist/theme-provider/index.js +3 -2
- package/dist/timeline/index.cjs +2 -2
- package/dist/timeline/index.d.cts +18 -3
- package/dist/timeline/index.d.ts +18 -3
- package/dist/timeline/index.js +1 -1
- package/dist/toolbar/index.cjs +12 -9
- package/dist/toolbar/index.cjs.map +1 -1
- package/dist/toolbar/index.d.cts +7 -7
- package/dist/toolbar/index.d.ts +7 -7
- package/dist/toolbar/index.js +11 -8
- package/dist/tooltip/index.cjs +4 -3
- package/dist/tooltip/index.cjs.map +1 -1
- package/dist/tooltip/index.js +3 -2
- package/package.json +4 -2
- package/dist/Button.types-BH0CPyPx.d.ts +0 -33
- package/dist/Button.types-DZRCVqyN.d.cts +0 -33
- package/dist/chunk-35LGEPLP.cjs.map +0 -1
- package/dist/chunk-36JFXFM2.cjs.map +0 -1
- package/dist/chunk-3KBBJZHK.cjs.map +0 -1
- package/dist/chunk-4J25XZDI.js.map +0 -1
- package/dist/chunk-5O73AALP.cjs.map +0 -1
- package/dist/chunk-75GFIQRU.js.map +0 -1
- package/dist/chunk-DA375AI6.cjs +0 -88
- package/dist/chunk-DA375AI6.cjs.map +0 -1
- package/dist/chunk-DRXPTACG.js.map +0 -1
- package/dist/chunk-GWHZFX2H.js.map +0 -1
- package/dist/chunk-NEQXEVHM.js +0 -34
- package/dist/chunk-NEQXEVHM.js.map +0 -1
- package/dist/chunk-O2BECFXJ.cjs.map +0 -1
- package/dist/chunk-OOCCSMWM.js.map +0 -1
- package/dist/chunk-RHHZRTWM.js.map +0 -1
- package/dist/chunk-SNRRF64M.js.map +0 -1
- package/dist/chunk-TTLFY76J.cjs.map +0 -1
- package/dist/chunk-VQGLVBPL.cjs.map +0 -1
- package/dist/chunk-WE2SBWZ6.js.map +0 -1
- package/dist/chunk-ZMDZGL5A.cjs +0 -34
- package/dist/chunk-ZMDZGL5A.cjs.map +0 -1
- package/dist/renderIcon-C2lEMMzb.d.cts +0 -30
- package/dist/renderIcon-C2lEMMzb.d.ts +0 -30
- /package/dist/{chunk-RHFD2Z5V.js.map → chunk-3TF2GZSG.js.map} +0 -0
- /package/dist/{chunk-JHX6JK3M.js.map → chunk-3X6QVHTD.js.map} +0 -0
- /package/dist/{chunk-MQAOXZD4.js.map → chunk-4S57PE43.js.map} +0 -0
- /package/dist/{chunk-JT4KVXJK.js.map → chunk-4V2XYUQL.js.map} +0 -0
- /package/dist/{chunk-AR2ZOO6L.js.map → chunk-6FXFKMJ5.js.map} +0 -0
- /package/dist/{chunk-LGDODZHI.js.map → chunk-6LTZV6HN.js.map} +0 -0
- /package/dist/{chunk-YP4HUBKN.js.map → chunk-6NAOAKII.js.map} +0 -0
- /package/dist/{chunk-D7SQ7LHJ.js.map → chunk-BO3KK3ZQ.js.map} +0 -0
- /package/dist/{chunk-5XH2PHT2.js.map → chunk-CNTG7OOO.js.map} +0 -0
- /package/dist/{chunk-WNDDS367.js.map → chunk-DPTTDHZ5.js.map} +0 -0
- /package/dist/{chunk-BFKPJ627.js.map → chunk-FHOD3FUN.js.map} +0 -0
- /package/dist/{chunk-SDUGYJGW.js.map → chunk-H3C6YECZ.js.map} +0 -0
- /package/dist/{chunk-MPIVBAMY.js.map → chunk-HYRLK462.js.map} +0 -0
- /package/dist/{chunk-FIVMMCGM.js.map → chunk-IHPSRTVW.js.map} +0 -0
- /package/dist/{chunk-THCTUBX6.js.map → chunk-IKXXXVUO.js.map} +0 -0
- /package/dist/{chunk-24HKKSKX.js.map → chunk-L6ERHCQ2.js.map} +0 -0
- /package/dist/{chunk-4LNTZPSQ.js.map → chunk-L6YJ6QTZ.js.map} +0 -0
- /package/dist/{chunk-JNY7TUDS.js.map → chunk-MCPGI6EI.js.map} +0 -0
- /package/dist/{chunk-2PCCGQOH.js.map → chunk-P6OJQ2RN.js.map} +0 -0
- /package/dist/{chunk-YXRKBKFB.js.map → chunk-S5CMZFX6.js.map} +0 -0
- /package/dist/{chunk-HEX4IMLO.js.map → chunk-TJQNGJHP.js.map} +0 -0
- /package/dist/{chunk-SFFKQQ5Z.js.map → chunk-U4SVBE2M.js.map} +0 -0
- /package/dist/{chunk-O3QM3BFE.js.map → chunk-UC4NYF6T.js.map} +0 -0
- /package/dist/{chunk-GIEDIAPD.js.map → chunk-V5CM5TH3.js.map} +0 -0
- /package/dist/{chunk-L65MHFMD.js.map → chunk-V64DICJK.js.map} +0 -0
- /package/dist/{chunk-P4XZH3OR.js.map → chunk-WHQGJHMD.js.map} +0 -0
- /package/dist/{chunk-YAKTVIVK.js.map → chunk-XIUZT4TO.js.map} +0 -0
- /package/dist/{chunk-GPVGGBIR.js.map → chunk-XWMXEJVZ.js.map} +0 -0
- /package/dist/{chunk-A3LMUPG3.js.map → chunk-Z3IJWYUD.js.map} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkWR77IZUUcjs = require('./chunk-WR77IZUU.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkVXC7Z7XBcjs = require('./chunk-VXC7Z7XB.cjs');
|
|
7
7
|
|
|
8
8
|
// src/components/TagInput/TagInput.component.tsx
|
|
9
9
|
var _react = require('react');
|
|
@@ -202,7 +202,7 @@ var TagInput = ({
|
|
|
202
202
|
label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "label", { htmlFor: inputId, className: "eidos-tag-input-label", children: label }),
|
|
203
203
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: fieldClasses, onClick: handleFieldClick, ref: fieldRef, children: [
|
|
204
204
|
tags.map((tag, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
205
|
-
|
|
205
|
+
_chunkWR77IZUUcjs.Chip,
|
|
206
206
|
{
|
|
207
207
|
variant: "filled",
|
|
208
208
|
color: "primary",
|
|
@@ -237,7 +237,7 @@ var TagInput = ({
|
|
|
237
237
|
}
|
|
238
238
|
),
|
|
239
239
|
hasSuggestions && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
240
|
-
|
|
240
|
+
_chunkVXC7Z7XBcjs.Dropdown,
|
|
241
241
|
{
|
|
242
242
|
open: isSuggestionsOpen,
|
|
243
243
|
onOpenChange: setIsSuggestionsOpen,
|
|
@@ -288,4 +288,4 @@ TagInput.displayName = "TagInput";
|
|
|
288
288
|
|
|
289
289
|
|
|
290
290
|
exports.TagInput = TagInput;
|
|
291
|
-
//# sourceMappingURL=chunk-
|
|
291
|
+
//# sourceMappingURL=chunk-HR5MWA3B.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-ZMRINZIO.cjs","../src/components/TagInput/TagInput.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-ZMRINZIO.cjs","sourcesContent":[null,"import React, { useState, useId, useRef, useCallback, useMemo, useEffect } from 'react';\nimport { CircleAlert } from 'lucide-react';\nimport { Chip } from '../Chip/Chip.component';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport type { TagInputProps } from './TagInput.types';\nimport './TagInput.scss';\n\nexport const TagInput: React.FC<TagInputProps> = ({\n value,\n defaultValue = [],\n onChange,\n placeholder = 'Add tag…',\n size = 'md',\n disabled = false,\n label,\n error,\n hint,\n allowDuplicates = false,\n maxTags,\n separators = ['Enter', ',', 'Tab'],\n validate,\n className = '',\n fullWidth = false,\n suggestions,\n onSearch,\n suggestionsEmptyText = 'No matches',\n}) => {\n const generatedId = useId();\n const inputId = `tag-input-${generatedId}`;\n const inputRef = useRef<HTMLInputElement>(null);\n\n /** Entire component wrapper - used for click-outside detection on the suggestions dropdown */\n const containerRef = useRef<HTMLDivElement>(null);\n\n /** The field wrapper - passed to Dropdown as externalTriggerRef for width/anchoring */\n const fieldRef = useRef<HTMLDivElement>(null);\n\n /** The 0-height span that IS the Dropdown trigger element - programmatically clicked to open */\n\n const hasSuggestions = suggestions !== undefined;\n const [isSuggestionsOpen, setIsSuggestionsOpen] = useState(false);\n // Read synchronously by the document `mousedown` listener and the key\n // handlers, where a value captured at render would be stale. Kept in step by\n // an effect rather than assigned at every call site, which is how the two\n // used to drift apart.\n const isSuggestionsOpenRef = useRef(isSuggestionsOpen);\n useEffect(() => {\n isSuggestionsOpenRef.current = isSuggestionsOpen;\n }, [isSuggestionsOpen]);\n const [focusedSuggestionIndex, setFocusedSuggestionIndex] = useState(-1);\n\n const isControlled = value !== undefined;\n\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue);\n const [inputValue, setInputValue] = useState('');\n const [isFocused, setIsFocused] = useState(false);\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const tags = isControlled ? (value as string[]) : internalTags;\n\n const updateTags = useCallback(\n (newTags: string[]) => {\n if (!isControlled) {\n setInternalTags(newTags);\n }\n onChange?.(newTags);\n },\n [isControlled, onChange],\n );\n\n const addTag = useCallback(\n (rawTag: string) => {\n const tag = rawTag.trim();\n\n if (!tag) return;\n\n if (!allowDuplicates && tags.includes(tag)) return;\n\n if (maxTags !== undefined && tags.length >= maxTags) return;\n\n if (validate) {\n const result = validate(tag);\n if (result === false) return;\n if (typeof result === 'string') {\n setValidationError(result);\n return;\n }\n // result === true → valid, fall through\n }\n\n setValidationError(null);\n updateTags([...tags, tag]);\n setInputValue('');\n },\n [tags, allowDuplicates, maxTags, validate, updateTags],\n );\n\n const removeTag = useCallback(\n (index: number) => {\n updateTags(tags.filter((_, i) => i !== index));\n },\n [tags, updateTags],\n );\n\n // ─── Suggestions dropdown (autocomplete) ───────────────────────────────────\n\n const filteredSuggestions = useMemo<string[]>(() => {\n if (!suggestions) return [];\n const query = inputValue.trim().toLowerCase();\n return suggestions.filter((suggestion) => {\n if (!allowDuplicates && tags.includes(suggestion)) return false;\n if (!query) return true;\n return suggestion.toLowerCase().includes(query);\n });\n }, [suggestions, inputValue, tags, allowDuplicates]);\n\n useEffect(() => {\n setFocusedSuggestionIndex(-1);\n }, [filteredSuggestions]);\n\n const openSuggestions = useCallback(() => {\n if (isSuggestionsOpenRef.current || disabled || !hasSuggestions) return;\n // This used to synthesise a click on a hidden zero-height `span` so that it\n // would bubble to the dropdown's trigger wrapper - the only way in, while\n // the overlay owned its open state privately.\n isSuggestionsOpenRef.current = true;\n setIsSuggestionsOpen(true);\n }, [disabled, hasSuggestions]);\n\n const closeSuggestions = useCallback(() => {\n isSuggestionsOpenRef.current = false;\n setIsSuggestionsOpen(false);\n setFocusedSuggestionIndex(-1);\n }, []);\n\n const selectSuggestion = useCallback(\n (suggestion: string) => {\n addTag(suggestion);\n closeSuggestions();\n inputRef.current?.focus();\n },\n [addTag, closeSuggestions],\n );\n\n // Click-outside detection for the suggestions dropdown.\n useEffect(() => {\n if (!hasSuggestions) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n if (!isSuggestionsOpenRef.current) return;\n if (e.defaultPrevented) return; // click inside the portal-rendered listbox\n if (containerRef.current?.contains(e.target as Node)) return;\n closeSuggestions();\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [hasSuggestions, closeSuggestions]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (hasSuggestions && isSuggestionsOpenRef.current && filteredSuggestions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedSuggestionIndex((prev) => (prev + 1 < filteredSuggestions.length ? prev + 1 : 0));\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedSuggestionIndex((prev) => (prev > 0 ? prev - 1 : filteredSuggestions.length - 1));\n return;\n }\n if (e.key === 'Enter' && focusedSuggestionIndex >= 0) {\n e.preventDefault();\n selectSuggestion(filteredSuggestions[focusedSuggestionIndex]);\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n closeSuggestions();\n return;\n }\n }\n\n if (separators.includes(e.key)) {\n e.preventDefault();\n addTag(inputValue);\n return;\n }\n\n if (e.key === 'Backspace' && inputValue === '' && tags.length > 0) {\n e.preventDefault();\n removeTag(tags.length - 1);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setInputValue(query);\n if (validationError) {\n setValidationError(null);\n }\n onSearch?.(query);\n if (hasSuggestions && !isSuggestionsOpenRef.current) openSuggestions();\n };\n\n const handleInputFocus = () => {\n setIsFocused(true);\n if (hasSuggestions) openSuggestions();\n };\n\n const handleFieldClick = (e: React.MouseEvent<HTMLDivElement>) => {\n // Don't steal focus from interactive child elements\n if ((e.target as HTMLElement).closest('button, input')) return;\n if (!disabled) {\n inputRef.current?.focus();\n }\n };\n\n const displayError = validationError ?? error;\n const hasError = !!displayError;\n const errorId = `${inputId}-error`;\n const hintId = `${inputId}-hint`;\n\n const containerClasses = [\n 'eidos-tag-input',\n hasError && 'eidos-tag-input--error',\n disabled && 'eidos-tag-input--disabled',\n fullWidth && 'eidos-tag-input--full-width',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const fieldClasses = [\n 'eidos-tag-input-field',\n `eidos-tag-input-field--${size}`,\n isFocused && 'eidos-tag-input-field--focused',\n hasError && 'eidos-tag-input-field--error',\n disabled && 'eidos-tag-input-field--disabled',\n ]\n .filter(Boolean)\n .join(' ');\n\n const uid = generatedId;\n\n return (\n // No ARIA on this wrapper - it has no role, so `aria-expanded` and\n // `aria-haspopup` were invalid here. Same fix as `Combobox`: they belong\n // on the input, which is the combobox.\n <div className={containerClasses} ref={containerRef}>\n {label && (\n <label htmlFor={inputId} className=\"eidos-tag-input-label\">\n {label}\n </label>\n )}\n\n <div className={fieldClasses} onClick={handleFieldClick} ref={fieldRef}>\n {tags.map((tag, index) => (\n <Chip\n key={`${tag}-${index}`}\n variant=\"filled\"\n color=\"primary\"\n size={size}\n onRemove={disabled ? undefined : () => removeTag(index)}\n >\n {tag}\n </Chip>\n ))}\n\n <input\n ref={inputRef}\n id={inputId}\n className=\"eidos-tag-input-input\"\n type=\"text\"\n value={inputValue}\n placeholder={tags.length === 0 ? placeholder : undefined}\n disabled={disabled}\n onKeyDown={handleKeyDown}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={() => setIsFocused(false)}\n aria-label={label ? undefined : 'Tag input'}\n aria-invalid={hasError ? true : undefined}\n // The ternary is deliberate, not a bug: the hint is unmounted when\n // an error shows (see the render below), so describing the field\n // with it would point at an element that is not there.\n aria-describedby={hasError ? errorId : hint ? hintId : undefined}\n role={hasSuggestions ? 'combobox' : undefined}\n aria-expanded={hasSuggestions ? isSuggestionsOpen : undefined}\n aria-autocomplete={hasSuggestions ? 'list' : undefined}\n // Only while the list is actually rendered - `aria-controls` must\n // name an element that exists.\n aria-controls={hasSuggestions && isSuggestionsOpen ? `${uid}-tag-suggestions` : undefined}\n aria-activedescendant={\n hasSuggestions && focusedSuggestionIndex >= 0\n ? `${uid}-tag-suggestion-${focusedSuggestionIndex}`\n : undefined\n }\n />\n\n {hasSuggestions && (\n <Dropdown\n open={isSuggestionsOpen}\n onOpenChange={setIsSuggestionsOpen}\n // Positioning is anchored to the field via `triggerRef` below; this\n // span is only here because a trigger is required. It used to carry\n // a ref purely so `openSuggestions` could click it.\n trigger={<span className=\"eidos-tag-input-dropdown-anchor\" aria-hidden=\"true\" />}\n content={\n <div\n id={`${uid}-tag-suggestions`}\n className=\"eidos-tag-input-suggestions\"\n role=\"listbox\"\n aria-label={label ?? 'Suggestions'}\n onMouseDown={(e) => e.preventDefault()}\n >\n {filteredSuggestions.length === 0 ? (\n <div className=\"eidos-tag-input-suggestions-empty\">{suggestionsEmptyText}</div>\n ) : (\n filteredSuggestions.map((suggestion, index) => (\n <div\n key={suggestion}\n id={`${uid}-tag-suggestion-${index}`}\n className={[\n 'eidos-tag-input-suggestion',\n index === focusedSuggestionIndex && 'eidos-tag-input-suggestion--focused',\n ]\n .filter(Boolean)\n .join(' ')}\n role=\"option\"\n aria-selected={index === focusedSuggestionIndex}\n onClick={() => selectSuggestion(suggestion)}\n onMouseEnter={() => setFocusedSuggestionIndex(index)}\n >\n {suggestion}\n </div>\n ))\n )}\n </div>\n }\n triggerRef={fieldRef as React.RefObject<HTMLElement | null>}\n autoWidth\n closeOnClickOutside={false}\n closeOnEscape={false}\n />\n )}\n </div>\n\n {hint && !hasError && (\n <p className=\"eidos-tag-input-hint\" id={hintId}>\n {hint}\n </p>\n )}\n\n {hasError && (\n <p className=\"eidos-tag-input-error-message\" id={errorId} role=\"alert\">\n <CircleAlert />\n {displayError}\n </p>\n )}\n </div>\n );\n};\n\nTagInput.displayName = 'TagInput';\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-HR5MWA3B.cjs","../src/components/TagInput/TagInput.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-HR5MWA3B.cjs","sourcesContent":[null,"import React, { useState, useId, useRef, useCallback, useMemo, useEffect } from 'react';\nimport { CircleAlert } from 'lucide-react';\nimport { Chip } from '../Chip/Chip.component';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport type { TagInputProps } from './TagInput.types';\nimport './TagInput.scss';\n\nexport const TagInput: React.FC<TagInputProps> = ({\n value,\n defaultValue = [],\n onChange,\n placeholder = 'Add tag…',\n size = 'md',\n disabled = false,\n label,\n error,\n hint,\n allowDuplicates = false,\n maxTags,\n separators = ['Enter', ',', 'Tab'],\n validate,\n className = '',\n fullWidth = false,\n suggestions,\n onSearch,\n suggestionsEmptyText = 'No matches',\n}) => {\n const generatedId = useId();\n const inputId = `tag-input-${generatedId}`;\n const inputRef = useRef<HTMLInputElement>(null);\n\n /** Entire component wrapper - used for click-outside detection on the suggestions dropdown */\n const containerRef = useRef<HTMLDivElement>(null);\n\n /** The field wrapper - passed to Dropdown as externalTriggerRef for width/anchoring */\n const fieldRef = useRef<HTMLDivElement>(null);\n\n /** The 0-height span that IS the Dropdown trigger element - programmatically clicked to open */\n\n const hasSuggestions = suggestions !== undefined;\n const [isSuggestionsOpen, setIsSuggestionsOpen] = useState(false);\n // Read synchronously by the document `mousedown` listener and the key\n // handlers, where a value captured at render would be stale. Kept in step by\n // an effect rather than assigned at every call site, which is how the two\n // used to drift apart.\n const isSuggestionsOpenRef = useRef(isSuggestionsOpen);\n useEffect(() => {\n isSuggestionsOpenRef.current = isSuggestionsOpen;\n }, [isSuggestionsOpen]);\n const [focusedSuggestionIndex, setFocusedSuggestionIndex] = useState(-1);\n\n const isControlled = value !== undefined;\n\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue);\n const [inputValue, setInputValue] = useState('');\n const [isFocused, setIsFocused] = useState(false);\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const tags = isControlled ? (value as string[]) : internalTags;\n\n const updateTags = useCallback(\n (newTags: string[]) => {\n if (!isControlled) {\n setInternalTags(newTags);\n }\n onChange?.(newTags);\n },\n [isControlled, onChange],\n );\n\n const addTag = useCallback(\n (rawTag: string) => {\n const tag = rawTag.trim();\n\n if (!tag) return;\n\n if (!allowDuplicates && tags.includes(tag)) return;\n\n if (maxTags !== undefined && tags.length >= maxTags) return;\n\n if (validate) {\n const result = validate(tag);\n if (result === false) return;\n if (typeof result === 'string') {\n setValidationError(result);\n return;\n }\n // result === true → valid, fall through\n }\n\n setValidationError(null);\n updateTags([...tags, tag]);\n setInputValue('');\n },\n [tags, allowDuplicates, maxTags, validate, updateTags],\n );\n\n const removeTag = useCallback(\n (index: number) => {\n updateTags(tags.filter((_, i) => i !== index));\n },\n [tags, updateTags],\n );\n\n // ─── Suggestions dropdown (autocomplete) ───────────────────────────────────\n\n const filteredSuggestions = useMemo<string[]>(() => {\n if (!suggestions) return [];\n const query = inputValue.trim().toLowerCase();\n return suggestions.filter((suggestion) => {\n if (!allowDuplicates && tags.includes(suggestion)) return false;\n if (!query) return true;\n return suggestion.toLowerCase().includes(query);\n });\n }, [suggestions, inputValue, tags, allowDuplicates]);\n\n useEffect(() => {\n setFocusedSuggestionIndex(-1);\n }, [filteredSuggestions]);\n\n const openSuggestions = useCallback(() => {\n if (isSuggestionsOpenRef.current || disabled || !hasSuggestions) return;\n // This used to synthesise a click on a hidden zero-height `span` so that it\n // would bubble to the dropdown's trigger wrapper - the only way in, while\n // the overlay owned its open state privately.\n isSuggestionsOpenRef.current = true;\n setIsSuggestionsOpen(true);\n }, [disabled, hasSuggestions]);\n\n const closeSuggestions = useCallback(() => {\n isSuggestionsOpenRef.current = false;\n setIsSuggestionsOpen(false);\n setFocusedSuggestionIndex(-1);\n }, []);\n\n const selectSuggestion = useCallback(\n (suggestion: string) => {\n addTag(suggestion);\n closeSuggestions();\n inputRef.current?.focus();\n },\n [addTag, closeSuggestions],\n );\n\n // Click-outside detection for the suggestions dropdown.\n useEffect(() => {\n if (!hasSuggestions) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n if (!isSuggestionsOpenRef.current) return;\n if (e.defaultPrevented) return; // click inside the portal-rendered listbox\n if (containerRef.current?.contains(e.target as Node)) return;\n closeSuggestions();\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [hasSuggestions, closeSuggestions]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (hasSuggestions && isSuggestionsOpenRef.current && filteredSuggestions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedSuggestionIndex((prev) => (prev + 1 < filteredSuggestions.length ? prev + 1 : 0));\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedSuggestionIndex((prev) => (prev > 0 ? prev - 1 : filteredSuggestions.length - 1));\n return;\n }\n if (e.key === 'Enter' && focusedSuggestionIndex >= 0) {\n e.preventDefault();\n selectSuggestion(filteredSuggestions[focusedSuggestionIndex]);\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n closeSuggestions();\n return;\n }\n }\n\n if (separators.includes(e.key)) {\n e.preventDefault();\n addTag(inputValue);\n return;\n }\n\n if (e.key === 'Backspace' && inputValue === '' && tags.length > 0) {\n e.preventDefault();\n removeTag(tags.length - 1);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setInputValue(query);\n if (validationError) {\n setValidationError(null);\n }\n onSearch?.(query);\n if (hasSuggestions && !isSuggestionsOpenRef.current) openSuggestions();\n };\n\n const handleInputFocus = () => {\n setIsFocused(true);\n if (hasSuggestions) openSuggestions();\n };\n\n const handleFieldClick = (e: React.MouseEvent<HTMLDivElement>) => {\n // Don't steal focus from interactive child elements\n if ((e.target as HTMLElement).closest('button, input')) return;\n if (!disabled) {\n inputRef.current?.focus();\n }\n };\n\n const displayError = validationError ?? error;\n const hasError = !!displayError;\n const errorId = `${inputId}-error`;\n const hintId = `${inputId}-hint`;\n\n const containerClasses = [\n 'eidos-tag-input',\n hasError && 'eidos-tag-input--error',\n disabled && 'eidos-tag-input--disabled',\n fullWidth && 'eidos-tag-input--full-width',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const fieldClasses = [\n 'eidos-tag-input-field',\n `eidos-tag-input-field--${size}`,\n isFocused && 'eidos-tag-input-field--focused',\n hasError && 'eidos-tag-input-field--error',\n disabled && 'eidos-tag-input-field--disabled',\n ]\n .filter(Boolean)\n .join(' ');\n\n const uid = generatedId;\n\n return (\n // No ARIA on this wrapper - it has no role, so `aria-expanded` and\n // `aria-haspopup` were invalid here. Same fix as `Combobox`: they belong\n // on the input, which is the combobox.\n <div className={containerClasses} ref={containerRef}>\n {label && (\n <label htmlFor={inputId} className=\"eidos-tag-input-label\">\n {label}\n </label>\n )}\n\n <div className={fieldClasses} onClick={handleFieldClick} ref={fieldRef}>\n {tags.map((tag, index) => (\n <Chip\n key={`${tag}-${index}`}\n variant=\"filled\"\n color=\"primary\"\n size={size}\n onRemove={disabled ? undefined : () => removeTag(index)}\n >\n {tag}\n </Chip>\n ))}\n\n <input\n ref={inputRef}\n id={inputId}\n className=\"eidos-tag-input-input\"\n type=\"text\"\n value={inputValue}\n placeholder={tags.length === 0 ? placeholder : undefined}\n disabled={disabled}\n onKeyDown={handleKeyDown}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={() => setIsFocused(false)}\n aria-label={label ? undefined : 'Tag input'}\n aria-invalid={hasError ? true : undefined}\n // The ternary is deliberate, not a bug: the hint is unmounted when\n // an error shows (see the render below), so describing the field\n // with it would point at an element that is not there.\n aria-describedby={hasError ? errorId : hint ? hintId : undefined}\n role={hasSuggestions ? 'combobox' : undefined}\n aria-expanded={hasSuggestions ? isSuggestionsOpen : undefined}\n aria-autocomplete={hasSuggestions ? 'list' : undefined}\n // Only while the list is actually rendered - `aria-controls` must\n // name an element that exists.\n aria-controls={hasSuggestions && isSuggestionsOpen ? `${uid}-tag-suggestions` : undefined}\n aria-activedescendant={\n hasSuggestions && focusedSuggestionIndex >= 0\n ? `${uid}-tag-suggestion-${focusedSuggestionIndex}`\n : undefined\n }\n />\n\n {hasSuggestions && (\n <Dropdown\n open={isSuggestionsOpen}\n onOpenChange={setIsSuggestionsOpen}\n // Positioning is anchored to the field via `triggerRef` below; this\n // span is only here because a trigger is required. It used to carry\n // a ref purely so `openSuggestions` could click it.\n trigger={<span className=\"eidos-tag-input-dropdown-anchor\" aria-hidden=\"true\" />}\n content={\n <div\n id={`${uid}-tag-suggestions`}\n className=\"eidos-tag-input-suggestions\"\n role=\"listbox\"\n aria-label={label ?? 'Suggestions'}\n onMouseDown={(e) => e.preventDefault()}\n >\n {filteredSuggestions.length === 0 ? (\n <div className=\"eidos-tag-input-suggestions-empty\">{suggestionsEmptyText}</div>\n ) : (\n filteredSuggestions.map((suggestion, index) => (\n <div\n key={suggestion}\n id={`${uid}-tag-suggestion-${index}`}\n className={[\n 'eidos-tag-input-suggestion',\n index === focusedSuggestionIndex && 'eidos-tag-input-suggestion--focused',\n ]\n .filter(Boolean)\n .join(' ')}\n role=\"option\"\n aria-selected={index === focusedSuggestionIndex}\n onClick={() => selectSuggestion(suggestion)}\n onMouseEnter={() => setFocusedSuggestionIndex(index)}\n >\n {suggestion}\n </div>\n ))\n )}\n </div>\n }\n triggerRef={fieldRef as React.RefObject<HTMLElement | null>}\n autoWidth\n closeOnClickOutside={false}\n closeOnEscape={false}\n />\n )}\n </div>\n\n {hint && !hasError && (\n <p className=\"eidos-tag-input-hint\" id={hintId}>\n {hint}\n </p>\n )}\n\n {hasError && (\n <p className=\"eidos-tag-input-error-message\" id={errorId} role=\"alert\">\n <CircleAlert />\n {displayError}\n </p>\n )}\n </div>\n );\n};\n\nTagInput.displayName = 'TagInput';\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Button
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JY77VJAZ.js";
|
|
4
4
|
|
|
5
5
|
// src/components/Snackbar/Snackbar.context.tsx
|
|
6
6
|
import { createContext, useContext, useState, useCallback, useRef } from "react";
|
|
@@ -293,4 +293,4 @@ export {
|
|
|
293
293
|
SnackbarContainer,
|
|
294
294
|
useSnackbar
|
|
295
295
|
};
|
|
296
|
-
//# sourceMappingURL=chunk-
|
|
296
|
+
//# sourceMappingURL=chunk-HYRLK462.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Input
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XIUZT4TO.js";
|
|
4
4
|
import {
|
|
5
5
|
Dropdown
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-3X6QVHTD.js";
|
|
7
7
|
import {
|
|
8
8
|
fullWidthModifier
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-U34INRFO.js";
|
|
10
10
|
|
|
11
11
|
// src/components/Combobox/Combobox.component.tsx
|
|
12
12
|
import { useState, useCallback, useRef, useEffect, useMemo, useId } from "react";
|
|
@@ -445,4 +445,4 @@ Combobox.displayName = "Combobox";
|
|
|
445
445
|
export {
|
|
446
446
|
Combobox
|
|
447
447
|
};
|
|
448
|
-
//# sourceMappingURL=chunk-
|
|
448
|
+
//# sourceMappingURL=chunk-IHPSRTVW.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Button
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JY77VJAZ.js";
|
|
4
4
|
import {
|
|
5
5
|
useDialogFocus,
|
|
6
6
|
useIsClient
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-U34INRFO.js";
|
|
8
8
|
|
|
9
9
|
// src/components/Drawer/Drawer.component.tsx
|
|
10
10
|
import { useEffect, useCallback, useId, useRef, useState } from "react";
|
|
@@ -143,4 +143,4 @@ Drawer.displayName = "Drawer";
|
|
|
143
143
|
export {
|
|
144
144
|
Drawer
|
|
145
145
|
};
|
|
146
|
-
//# sourceMappingURL=chunk-
|
|
146
|
+
//# sourceMappingURL=chunk-IKXXXVUO.js.map
|
|
@@ -1,10 +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 _chunkUTYY35QXcjs = require('./chunk-UTYY35QX.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkENMDOQQOcjs = require('./chunk-ENMDOQQO.cjs');
|
|
8
8
|
|
|
9
9
|
// src/components/SegmentedControl/SegmentedControl.component.tsx
|
|
10
10
|
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
@@ -132,7 +132,7 @@ var SegmentedControl = ({
|
|
|
132
132
|
const isActive = activeValue === opt.value;
|
|
133
133
|
const isDisabled = disabled || !!opt.disabled;
|
|
134
134
|
if (!opt.label && !opt.tooltip) {
|
|
135
|
-
|
|
135
|
+
_chunkENMDOQQOcjs.devWarn.call(void 0,
|
|
136
136
|
"segmented-icon-only-name",
|
|
137
137
|
`SegmentedControl: option "${opt.value}" has an icon but no \`label\` or \`tooltip\`, so it has no accessible name.`
|
|
138
138
|
);
|
|
@@ -151,13 +151,13 @@ var SegmentedControl = ({
|
|
|
151
151
|
onKeyDown: handleKeyDown,
|
|
152
152
|
"aria-label": !opt.label ? opt.tooltip : void 0,
|
|
153
153
|
children: [
|
|
154
|
-
opt.icon &&
|
|
154
|
+
opt.icon && _chunkENMDOQQOcjs.renderIcon.call(void 0, opt.icon, "eidos-segmented-icon"),
|
|
155
155
|
opt.label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-segmented-label", children: opt.label })
|
|
156
156
|
]
|
|
157
157
|
},
|
|
158
158
|
opt.value
|
|
159
159
|
);
|
|
160
|
-
return opt.tooltip ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
160
|
+
return opt.tooltip ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUTYY35QXcjs.Tooltip, { message: opt.tooltip, children: segment }, opt.value) : _react2.default.cloneElement(segment, { key: opt.value });
|
|
161
161
|
}) });
|
|
162
162
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: barClasses, children: [
|
|
163
163
|
showPrevButton && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
@@ -191,4 +191,4 @@ var SegmentedControl = ({
|
|
|
191
191
|
|
|
192
192
|
|
|
193
193
|
exports.SegmentedControl = SegmentedControl;
|
|
194
|
-
//# sourceMappingURL=chunk-
|
|
194
|
+
//# sourceMappingURL=chunk-JFV56ISS.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-JPYJQ4TF.cjs","../src/components/SegmentedControl/SegmentedControl.component.tsx"],"names":["track"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-JPYJQ4TF.cjs","sourcesContent":[null,"import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Tooltip } from '../Tooltip';\nimport { renderIcon, devWarn } from '../../utils';\nimport type { SegmentedControlProps } from './SegmentedControl.types';\n\n/**\n * SegmentedControl - a compact, single-select toggle group rendered as a pill.\n *\n * Semantics: `role=\"radiogroup\"` on the container, `role=\"radio\"` on each\n * segment. Supports controlled and uncontrolled usage.\n *\n * @example\n * ```tsx\n * // Controlled\n * const [view, setView] = useState('list');\n * <SegmentedControl\n * options={[\n * { value: 'list', icon: List, tooltip: 'List view' },\n * { value: 'grid', icon: LayoutGrid, tooltip: 'Grid view' },\n * { value: 'table', icon: Table2, tooltip: 'Table view' },\n * ]}\n * value={view}\n * onChange={setView}\n * />\n *\n * // With labels\n * <SegmentedControl\n * options={[\n * { value: 'day', label: 'Day' },\n * { value: 'week', label: 'Week' },\n * { value: 'month', label: 'Month' },\n * ]}\n * defaultValue=\"week\"\n * onChange={console.log}\n * />\n * ```\n */\nexport const SegmentedControl: React.FC<SegmentedControlProps> = ({\n options,\n value,\n defaultValue,\n onChange,\n size = 'md',\n color = 'primary',\n disabled = false,\n fullWidth = false,\n scrollButtons = 'auto',\n className = '',\n}) => {\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? options[0]?.value ?? '',\n );\n\n const activeValue = isControlled ? value : internalValue;\n\n const handleSelect = (optValue: string) => {\n if (disabled) return;\n if (optValue === activeValue) return; // already selected\n if (!isControlled) setInternalValue(optValue);\n onChange?.(optValue);\n };\n\n const trackRef = useRef<HTMLDivElement>(null);\n\n // Roving tabindex: the group is a single tab stop, and arrow keys move\n // within it - the WAI-ARIA radiogroup pattern, which this had none of.\n // Every segment used to be its own tab stop, so a six-option control cost\n // six presses to skip past.\n //\n // The tabbable segment is the selected one; if nothing is selected (a\n // controlled `value` matching no option), the first enabled segment takes\n // the stop so the group can still be reached at all.\n const selectableValues = options.filter((opt) => !opt.disabled).map((opt) => opt.value);\n const hasSelection = selectableValues.includes(activeValue);\n const fallbackTabbableValue = selectableValues[0];\n\n const isTabbable = (optValue: string) =>\n hasSelection ? optValue === activeValue : optValue === fallbackTabbableValue;\n\n // Selection follows focus, which is what the radio pattern specifies -\n // unlike `Tabs`, where arrow keys only move focus. Disabled segments are\n // skipped rather than selected-and-ignored, and both ends wrap.\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (disabled || selectableValues.length === 0) return;\n\n const currentIndex = selectableValues.indexOf(activeValue);\n const from = currentIndex === -1 ? 0 : currentIndex;\n let targetIndex = -1;\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n targetIndex = (from + 1) % selectableValues.length;\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n targetIndex = (from - 1 + selectableValues.length) % selectableValues.length;\n } else if (event.key === 'Home') {\n targetIndex = 0;\n } else if (event.key === 'End') {\n targetIndex = selectableValues.length - 1;\n }\n\n if (targetIndex === -1) return;\n\n event.preventDefault();\n const targetValue = selectableValues[targetIndex];\n handleSelect(targetValue);\n\n // Focus has to follow the selection explicitly: the segment that was\n // focused is about to lose its `tabIndex={0}` to the newly selected one,\n // and focus does not move on its own.\n const target = trackRef.current?.querySelector<HTMLElement>(\n `[data-value=\"${CSS.escape(targetValue)}\"]`,\n );\n target?.focus();\n };\n\n // The selected segment can sit outside the scrollport - after a controlled\n // `value` change, or once focus moves to a segment off screen. `scrollLeft`\n // is set directly rather than through `scrollIntoView`, which walks the\n // whole ancestor chain and would scroll the page vertically when the\n // control is below the fold.\n useLayoutEffect(() => {\n const track = trackRef.current;\n if (!track) return;\n\n const activeItem = track.querySelector('[aria-checked=\"true\"]') as HTMLElement | null;\n if (!activeItem) return;\n\n const left = activeItem.offsetLeft;\n const right = left + activeItem.offsetWidth;\n\n if (left < track.scrollLeft) {\n track.scrollLeft = left;\n } else if (right > track.scrollLeft + track.clientWidth) {\n track.scrollLeft = right - track.clientWidth;\n }\n }, [activeValue]);\n\n // Whether either end has segments hidden past it. Drives the presence of\n // each button: none at all when the track fits, and none at the end already\n // reached, since a button there would point at nothing.\n const [scrollState, setScrollState] = useState({ canScrollPrev: false, canScrollNext: false });\n const hasScrollButtons = scrollButtons !== 'none';\n\n useEffect(() => {\n if (!hasScrollButtons) return;\n const track = trackRef.current;\n if (!track) return;\n\n const update = () => {\n const maxScroll = track.scrollWidth - track.clientWidth;\n // 1px of tolerance: fractional layout widths leave a sub-pixel\n // remainder at either end that would otherwise keep a button enabled\n // for a scroll that can no longer move anything.\n const canScrollPrev = track.scrollLeft > 1;\n const canScrollNext = track.scrollLeft < maxScroll - 1;\n setScrollState((previous) =>\n previous.canScrollPrev === canScrollPrev && previous.canScrollNext === canScrollNext\n ? previous\n : { canScrollPrev, canScrollNext },\n );\n };\n\n update();\n track.addEventListener('scroll', update, { passive: true });\n\n // The track's own box stays the same width when a label reflows or a font\n // finishes loading, so the segments have to be observed as well as the\n // container - only their sizes tell us the track started overflowing.\n const observer = new ResizeObserver(update);\n observer.observe(track);\n Array.from(track.children).forEach((child) => observer.observe(child));\n\n return () => {\n track.removeEventListener('scroll', update);\n observer.disconnect();\n };\n }, [hasScrollButtons, options.length, size, fullWidth]);\n\n const scrollByStep = (direction: -1 | 1) => {\n const track = trackRef.current;\n if (!track) return;\n\n // A step just short of a full page keeps a segment of context on screen,\n // the same way a paged scrollbar click does.\n const step = track.clientWidth * 0.8;\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n track.scrollBy({ left: direction * step, behavior: reducedMotion ? 'auto' : 'smooth' });\n };\n\n const barClasses = [\n 'eidos-segmented-bar',\n fullWidth && 'eidos-segmented-bar--full-width',\n disabled && 'eidos-segmented-bar--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const containerClasses = [\n 'eidos-segmented',\n `eidos-segmented--${size}`,\n `eidos-segmented--${color}`,\n disabled && 'eidos-segmented--disabled',\n fullWidth && 'eidos-segmented--full-width',\n // With buttons, they are the affordance - a native scrollbar under a\n // compact pill control is redundant and would break its shape.\n hasScrollButtons && 'eidos-segmented--hide-scrollbar',\n ]\n .filter(Boolean)\n .join(' ');\n\n const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;\n const showNextButton = hasScrollButtons && scrollState.canScrollNext;\n\n const scrollButtonClasses = (direction: 'prev' | 'next') =>\n [\n 'eidos-segmented-scroll-button',\n `eidos-segmented-scroll-button--${direction}`,\n `eidos-segmented-scroll-button--${size}`,\n ].join(' ');\n\n const track = (\n <div ref={trackRef} className={containerClasses} role=\"radiogroup\">\n {options.map((opt) => {\n const isActive = activeValue === opt.value;\n const isDisabled = disabled || !!opt.disabled;\n\n // An icon-only segment has no text to be named by. `tooltip` wraps\n // it in a `Tooltip`, which contributes nothing to the accessible\n // name, so such a segment was announced as just \"radio\" - identical\n // to every other segment, making the group unusable by voice or\n // screen reader. Same fallback as `Button`.\n if (!opt.label && !opt.tooltip) {\n devWarn(\n 'segmented-icon-only-name',\n `SegmentedControl: option \"${opt.value}\" has an icon but no \\`label\\` or \\`tooltip\\`, so it has no accessible name.`,\n );\n }\n\n const segment = (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n disabled={isDisabled}\n // Read back by the keyboard handler to move focus onto the newly\n // selected segment, which `value` alone can't identify in the DOM.\n data-value={opt.value}\n tabIndex={isTabbable(opt.value) ? 0 : -1}\n className={['eidos-segmented-item', isActive && 'eidos-segmented-item--active']\n .filter(Boolean)\n .join(' ')}\n onClick={() => !isDisabled && handleSelect(opt.value)}\n onKeyDown={handleKeyDown}\n aria-label={!opt.label ? opt.tooltip : undefined}\n >\n {opt.icon && renderIcon(opt.icon, 'eidos-segmented-icon')}\n {opt.label && <span className=\"eidos-segmented-label\">{opt.label}</span>}\n </button>\n );\n\n return opt.tooltip ? (\n <Tooltip key={opt.value} message={opt.tooltip}>\n {segment}\n </Tooltip>\n ) : (\n React.cloneElement(segment, { key: opt.value })\n );\n })}\n </div>\n );\n\n // The buttons are siblings of the track, never children of it:\n // `role=\"radiogroup\"` only accepts radios. They are also hidden from\n // assistive tech and skipped by Tab, because they are a pointer affordance\n // for something the keyboard already does - tabbing to a segment scrolls it\n // into view. Same arrangement as `Tabs`.\n return (\n <div className={barClasses}>\n {showPrevButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('prev')}\n onClick={() => scrollByStep(-1)}\n // `tabIndex={-1}` keeps these out of the tab order, but it does not\n // stop a *click* from focusing them - and focus landing inside an\n // `aria-hidden` subtree is an error the browser reports (\"Blocked\n // aria-hidden on an element because its descendant retained\n // focus\"). Suppressing the default mousedown behaviour keeps the\n // button unfocusable by pointer as well, while the click still\n // fires. `inert` would also prevent the click, so it is not an\n // option here.\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronLeft className=\"eidos-segmented-scroll-button-icon\" />\n </button>\n )}\n\n {track}\n\n {showNextButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('next')}\n onClick={() => scrollByStep(1)}\n onMouseDown={(event) => event.preventDefault()} // see the prev button\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronRight className=\"eidos-segmented-scroll-button-icon\" />\n </button>\n )}\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-JFV56ISS.cjs","../src/components/SegmentedControl/SegmentedControl.component.tsx"],"names":["track"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-JFV56ISS.cjs","sourcesContent":[null,"import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Tooltip } from '../Tooltip';\nimport { renderIcon, devWarn } from '../../utils';\nimport type { SegmentedControlProps } from './SegmentedControl.types';\n\n/**\n * SegmentedControl - a compact, single-select toggle group rendered as a pill.\n *\n * Semantics: `role=\"radiogroup\"` on the container, `role=\"radio\"` on each\n * segment. Supports controlled and uncontrolled usage.\n *\n * @example\n * ```tsx\n * // Controlled\n * const [view, setView] = useState('list');\n * <SegmentedControl\n * options={[\n * { value: 'list', icon: List, tooltip: 'List view' },\n * { value: 'grid', icon: LayoutGrid, tooltip: 'Grid view' },\n * { value: 'table', icon: Table2, tooltip: 'Table view' },\n * ]}\n * value={view}\n * onChange={setView}\n * />\n *\n * // With labels\n * <SegmentedControl\n * options={[\n * { value: 'day', label: 'Day' },\n * { value: 'week', label: 'Week' },\n * { value: 'month', label: 'Month' },\n * ]}\n * defaultValue=\"week\"\n * onChange={console.log}\n * />\n * ```\n */\nexport const SegmentedControl: React.FC<SegmentedControlProps> = ({\n options,\n value,\n defaultValue,\n onChange,\n size = 'md',\n color = 'primary',\n disabled = false,\n fullWidth = false,\n scrollButtons = 'auto',\n className = '',\n}) => {\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? options[0]?.value ?? '',\n );\n\n const activeValue = isControlled ? value : internalValue;\n\n const handleSelect = (optValue: string) => {\n if (disabled) return;\n if (optValue === activeValue) return; // already selected\n if (!isControlled) setInternalValue(optValue);\n onChange?.(optValue);\n };\n\n const trackRef = useRef<HTMLDivElement>(null);\n\n // Roving tabindex: the group is a single tab stop, and arrow keys move\n // within it - the WAI-ARIA radiogroup pattern, which this had none of.\n // Every segment used to be its own tab stop, so a six-option control cost\n // six presses to skip past.\n //\n // The tabbable segment is the selected one; if nothing is selected (a\n // controlled `value` matching no option), the first enabled segment takes\n // the stop so the group can still be reached at all.\n const selectableValues = options.filter((opt) => !opt.disabled).map((opt) => opt.value);\n const hasSelection = selectableValues.includes(activeValue);\n const fallbackTabbableValue = selectableValues[0];\n\n const isTabbable = (optValue: string) =>\n hasSelection ? optValue === activeValue : optValue === fallbackTabbableValue;\n\n // Selection follows focus, which is what the radio pattern specifies -\n // unlike `Tabs`, where arrow keys only move focus. Disabled segments are\n // skipped rather than selected-and-ignored, and both ends wrap.\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (disabled || selectableValues.length === 0) return;\n\n const currentIndex = selectableValues.indexOf(activeValue);\n const from = currentIndex === -1 ? 0 : currentIndex;\n let targetIndex = -1;\n\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n targetIndex = (from + 1) % selectableValues.length;\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n targetIndex = (from - 1 + selectableValues.length) % selectableValues.length;\n } else if (event.key === 'Home') {\n targetIndex = 0;\n } else if (event.key === 'End') {\n targetIndex = selectableValues.length - 1;\n }\n\n if (targetIndex === -1) return;\n\n event.preventDefault();\n const targetValue = selectableValues[targetIndex];\n handleSelect(targetValue);\n\n // Focus has to follow the selection explicitly: the segment that was\n // focused is about to lose its `tabIndex={0}` to the newly selected one,\n // and focus does not move on its own.\n const target = trackRef.current?.querySelector<HTMLElement>(\n `[data-value=\"${CSS.escape(targetValue)}\"]`,\n );\n target?.focus();\n };\n\n // The selected segment can sit outside the scrollport - after a controlled\n // `value` change, or once focus moves to a segment off screen. `scrollLeft`\n // is set directly rather than through `scrollIntoView`, which walks the\n // whole ancestor chain and would scroll the page vertically when the\n // control is below the fold.\n useLayoutEffect(() => {\n const track = trackRef.current;\n if (!track) return;\n\n const activeItem = track.querySelector('[aria-checked=\"true\"]') as HTMLElement | null;\n if (!activeItem) return;\n\n const left = activeItem.offsetLeft;\n const right = left + activeItem.offsetWidth;\n\n if (left < track.scrollLeft) {\n track.scrollLeft = left;\n } else if (right > track.scrollLeft + track.clientWidth) {\n track.scrollLeft = right - track.clientWidth;\n }\n }, [activeValue]);\n\n // Whether either end has segments hidden past it. Drives the presence of\n // each button: none at all when the track fits, and none at the end already\n // reached, since a button there would point at nothing.\n const [scrollState, setScrollState] = useState({ canScrollPrev: false, canScrollNext: false });\n const hasScrollButtons = scrollButtons !== 'none';\n\n useEffect(() => {\n if (!hasScrollButtons) return;\n const track = trackRef.current;\n if (!track) return;\n\n const update = () => {\n const maxScroll = track.scrollWidth - track.clientWidth;\n // 1px of tolerance: fractional layout widths leave a sub-pixel\n // remainder at either end that would otherwise keep a button enabled\n // for a scroll that can no longer move anything.\n const canScrollPrev = track.scrollLeft > 1;\n const canScrollNext = track.scrollLeft < maxScroll - 1;\n setScrollState((previous) =>\n previous.canScrollPrev === canScrollPrev && previous.canScrollNext === canScrollNext\n ? previous\n : { canScrollPrev, canScrollNext },\n );\n };\n\n update();\n track.addEventListener('scroll', update, { passive: true });\n\n // The track's own box stays the same width when a label reflows or a font\n // finishes loading, so the segments have to be observed as well as the\n // container - only their sizes tell us the track started overflowing.\n const observer = new ResizeObserver(update);\n observer.observe(track);\n Array.from(track.children).forEach((child) => observer.observe(child));\n\n return () => {\n track.removeEventListener('scroll', update);\n observer.disconnect();\n };\n }, [hasScrollButtons, options.length, size, fullWidth]);\n\n const scrollByStep = (direction: -1 | 1) => {\n const track = trackRef.current;\n if (!track) return;\n\n // A step just short of a full page keeps a segment of context on screen,\n // the same way a paged scrollbar click does.\n const step = track.clientWidth * 0.8;\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n track.scrollBy({ left: direction * step, behavior: reducedMotion ? 'auto' : 'smooth' });\n };\n\n const barClasses = [\n 'eidos-segmented-bar',\n fullWidth && 'eidos-segmented-bar--full-width',\n disabled && 'eidos-segmented-bar--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const containerClasses = [\n 'eidos-segmented',\n `eidos-segmented--${size}`,\n `eidos-segmented--${color}`,\n disabled && 'eidos-segmented--disabled',\n fullWidth && 'eidos-segmented--full-width',\n // With buttons, they are the affordance - a native scrollbar under a\n // compact pill control is redundant and would break its shape.\n hasScrollButtons && 'eidos-segmented--hide-scrollbar',\n ]\n .filter(Boolean)\n .join(' ');\n\n const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;\n const showNextButton = hasScrollButtons && scrollState.canScrollNext;\n\n const scrollButtonClasses = (direction: 'prev' | 'next') =>\n [\n 'eidos-segmented-scroll-button',\n `eidos-segmented-scroll-button--${direction}`,\n `eidos-segmented-scroll-button--${size}`,\n ].join(' ');\n\n const track = (\n <div ref={trackRef} className={containerClasses} role=\"radiogroup\">\n {options.map((opt) => {\n const isActive = activeValue === opt.value;\n const isDisabled = disabled || !!opt.disabled;\n\n // An icon-only segment has no text to be named by. `tooltip` wraps\n // it in a `Tooltip`, which contributes nothing to the accessible\n // name, so such a segment was announced as just \"radio\" - identical\n // to every other segment, making the group unusable by voice or\n // screen reader. Same fallback as `Button`.\n if (!opt.label && !opt.tooltip) {\n devWarn(\n 'segmented-icon-only-name',\n `SegmentedControl: option \"${opt.value}\" has an icon but no \\`label\\` or \\`tooltip\\`, so it has no accessible name.`,\n );\n }\n\n const segment = (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n disabled={isDisabled}\n // Read back by the keyboard handler to move focus onto the newly\n // selected segment, which `value` alone can't identify in the DOM.\n data-value={opt.value}\n tabIndex={isTabbable(opt.value) ? 0 : -1}\n className={['eidos-segmented-item', isActive && 'eidos-segmented-item--active']\n .filter(Boolean)\n .join(' ')}\n onClick={() => !isDisabled && handleSelect(opt.value)}\n onKeyDown={handleKeyDown}\n aria-label={!opt.label ? opt.tooltip : undefined}\n >\n {opt.icon && renderIcon(opt.icon, 'eidos-segmented-icon')}\n {opt.label && <span className=\"eidos-segmented-label\">{opt.label}</span>}\n </button>\n );\n\n return opt.tooltip ? (\n <Tooltip key={opt.value} message={opt.tooltip}>\n {segment}\n </Tooltip>\n ) : (\n React.cloneElement(segment, { key: opt.value })\n );\n })}\n </div>\n );\n\n // The buttons are siblings of the track, never children of it:\n // `role=\"radiogroup\"` only accepts radios. They are also hidden from\n // assistive tech and skipped by Tab, because they are a pointer affordance\n // for something the keyboard already does - tabbing to a segment scrolls it\n // into view. Same arrangement as `Tabs`.\n return (\n <div className={barClasses}>\n {showPrevButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('prev')}\n onClick={() => scrollByStep(-1)}\n // `tabIndex={-1}` keeps these out of the tab order, but it does not\n // stop a *click* from focusing them - and focus landing inside an\n // `aria-hidden` subtree is an error the browser reports (\"Blocked\n // aria-hidden on an element because its descendant retained\n // focus\"). Suppressing the default mousedown behaviour keeps the\n // button unfocusable by pointer as well, while the click still\n // fires. `inert` would also prevent the click, so it is not an\n // option here.\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronLeft className=\"eidos-segmented-scroll-button-icon\" />\n </button>\n )}\n\n {track}\n\n {showNextButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('next')}\n onClick={() => scrollByStep(1)}\n onMouseDown={(event) => event.preventDefault()} // see the prev button\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronRight className=\"eidos-segmented-scroll-button-icon\" />\n </button>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Tooltip
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MCPGI6EI.js";
|
|
4
4
|
import {
|
|
5
5
|
devWarn,
|
|
6
6
|
renderIcon
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-U34INRFO.js";
|
|
8
|
+
import {
|
|
9
|
+
EidosLink
|
|
10
|
+
} from "./chunk-BDH2MXJW.js";
|
|
8
11
|
|
|
9
12
|
// src/components/Button/Button.component.tsx
|
|
10
13
|
import { LoaderCircle } from "lucide-react";
|
|
@@ -54,7 +57,29 @@ var Button = ({
|
|
|
54
57
|
loading && "eidos-button--loading",
|
|
55
58
|
className
|
|
56
59
|
].filter(Boolean).join(" ");
|
|
57
|
-
const
|
|
60
|
+
const content = /* @__PURE__ */ jsx(Fragment, { children: loading ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
61
|
+
!isIconOnly && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
62
|
+
/* @__PURE__ */ jsx("span", { className: "eidos-button--loading-spinner", children: /* @__PURE__ */ jsx(LoaderCircle, { className: "eidos-button--spinner-icon" }) }),
|
|
63
|
+
/* @__PURE__ */ jsx("span", { className: "eidos-button--copy", children: loadingText })
|
|
64
|
+
] }),
|
|
65
|
+
isIconOnly && /* @__PURE__ */ jsx("span", { className: "eidos-button--loading-spinner", children: /* @__PURE__ */ jsx(LoaderCircle, { className: "eidos-button--spinner-icon" }) })
|
|
66
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
67
|
+
preIcon && renderIcon(preIcon, "eidos-button--pre-icon"),
|
|
68
|
+
isIconOnly && icon ? renderIcon(icon, "eidos-button--icon") : /* @__PURE__ */ jsx("span", { className: "eidos-button--copy", children }),
|
|
69
|
+
posIcon && renderIcon(posIcon, "eidos-button--pos-icon")
|
|
70
|
+
] }) });
|
|
71
|
+
const buttonContent = typeof buttonProps.href === "string" ? /* @__PURE__ */ jsx(
|
|
72
|
+
EidosLink,
|
|
73
|
+
{
|
|
74
|
+
...buttonProps,
|
|
75
|
+
href: buttonProps.href,
|
|
76
|
+
"aria-label": iconOnlyLabel ?? buttonProps["aria-label"],
|
|
77
|
+
"aria-busy": loading || void 0,
|
|
78
|
+
className: buttonClasses,
|
|
79
|
+
disabled: disabled || loading,
|
|
80
|
+
children: content
|
|
81
|
+
}
|
|
82
|
+
) : /* @__PURE__ */ jsx(
|
|
58
83
|
"button",
|
|
59
84
|
{
|
|
60
85
|
type: "button",
|
|
@@ -62,17 +87,7 @@ var Button = ({
|
|
|
62
87
|
"aria-label": iconOnlyLabel ?? buttonProps["aria-label"],
|
|
63
88
|
className: buttonClasses,
|
|
64
89
|
disabled: disabled || loading,
|
|
65
|
-
children:
|
|
66
|
-
!isIconOnly && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
67
|
-
/* @__PURE__ */ jsx("span", { className: "eidos-button--loading-spinner", children: /* @__PURE__ */ jsx(LoaderCircle, { className: "eidos-button--spinner-icon" }) }),
|
|
68
|
-
/* @__PURE__ */ jsx("span", { className: "eidos-button--copy", children: loadingText })
|
|
69
|
-
] }),
|
|
70
|
-
isIconOnly && /* @__PURE__ */ jsx("span", { className: "eidos-button--loading-spinner", children: /* @__PURE__ */ jsx(LoaderCircle, { className: "eidos-button--spinner-icon" }) })
|
|
71
|
-
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
72
|
-
preIcon && renderIcon(preIcon, "eidos-button--pre-icon"),
|
|
73
|
-
isIconOnly && icon ? renderIcon(icon, "eidos-button--icon") : /* @__PURE__ */ jsx("span", { className: "eidos-button--copy", children }),
|
|
74
|
-
posIcon && renderIcon(posIcon, "eidos-button--pos-icon")
|
|
75
|
-
] })
|
|
90
|
+
children: content
|
|
76
91
|
}
|
|
77
92
|
);
|
|
78
93
|
return tooltip ? /* @__PURE__ */ jsx(Tooltip, { message: tooltip, children: buttonContent }) : buttonContent;
|
|
@@ -85,4 +100,4 @@ export {
|
|
|
85
100
|
Button,
|
|
86
101
|
IconButton
|
|
87
102
|
};
|
|
88
|
-
//# sourceMappingURL=chunk-
|
|
103
|
+
//# sourceMappingURL=chunk-JY77VJAZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Button/Button.component.tsx"],"sourcesContent":["import React from 'react';\nimport { LoaderCircle } from 'lucide-react';\nimport { Tooltip } from '../Tooltip';\nimport { ButtonProps, IconButtonProps, IconLinkButtonProps } from './Button.types';\nimport { renderIcon, devWarn } from '../../utils';\nimport { EidosLink } from '../LinkProvider/Link.component';\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'filled',\n color = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n loadingText = 'Loading...',\n tooltip,\n className = '',\n preIcon,\n posIcon,\n icon,\n children,\n ...buttonProps\n}) => {\n const isIconOnly = !!icon;\n\n if (isIconOnly) {\n if (children) {\n throw new Error('Icon-only buttons cannot have children');\n }\n if (preIcon) {\n throw new Error('Icon-only buttons cannot have preIcon');\n }\n if (posIcon) {\n throw new Error('Icon-only buttons cannot have posIcon');\n }\n }\n\n // ── Accessible name for icon-only buttons ──────────────────────────────\n //\n // An icon-only button has no text, so without `aria-label` it is announced\n // as just \"button\". `tooltip` alone did NOT fix this: `Tooltip` renders a\n // floating panel and adds no naming attributes to its child, so the\n // library's own documented example - `<IconButton icon={Plus}\n // tooltip=\"Add item\" />` - shipped a nameless control.\n //\n // Falling back to `tooltip` makes that documented pattern correct without\n // asking anyone to change their code: if you already described the button\n // for sighted users, that description now names it for everyone.\n //\n // Only ever a fallback - an explicit `aria-label` or `aria-labelledby`\n // always wins, since the caller may want a longer name than the tooltip.\n const suppliedLabel = buttonProps['aria-label'] ?? buttonProps['aria-labelledby'];\n const iconOnlyLabel = isIconOnly && !suppliedLabel ? tooltip : undefined;\n\n if (isIconOnly && !suppliedLabel && !tooltip) {\n devWarn(\n 'button-icon-only-name',\n 'Button: an icon-only button needs an accessible name. Pass `tooltip` (which now also names it) or `aria-label`, otherwise it is announced as just \"button\".',\n );\n }\n\n const buttonClasses = [\n 'eidos-button',\n `eidos-button--${variant}`,\n `eidos-button--${color}`,\n `eidos-button--${size}`,\n isIconOnly && 'eidos-button--icon-only',\n disabled && 'eidos-button--disabled',\n loading && 'eidos-button--loading',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const content = (\n <>\n {loading ? (\n <>\n {!isIconOnly && (\n <>\n <span className=\"eidos-button--loading-spinner\">\n <LoaderCircle className=\"eidos-button--spinner-icon\" />\n </span>\n <span className=\"eidos-button--copy\">{loadingText}</span>\n </>\n )}\n {isIconOnly && (\n <span className=\"eidos-button--loading-spinner\">\n <LoaderCircle className=\"eidos-button--spinner-icon\" />\n </span>\n )}\n </>\n ) : (\n <>\n {preIcon && renderIcon(preIcon, 'eidos-button--pre-icon')}\n\n {isIconOnly && icon ? (\n renderIcon(icon, 'eidos-button--icon')\n ) : (\n <span className=\"eidos-button--copy\">{children}</span>\n )}\n\n {posIcon && renderIcon(posIcon, 'eidos-button--pos-icon')}\n </>\n )}\n </>\n );\n\n // Discriminated on `href` alone. The props arrive as one of four union\n // members, but destructuring the style/content props above collapses the\n // rest into a shape TypeScript can no longer narrow, hence the casts - each\n // is exactly the half of the union the `href` check just proved.\n const buttonContent =\n typeof buttonProps.href === 'string' ? (\n <EidosLink\n {...(buttonProps as React.AnchorHTMLAttributes<HTMLAnchorElement>)}\n href={buttonProps.href}\n aria-label={iconOnlyLabel ?? buttonProps['aria-label']}\n aria-busy={loading || undefined}\n className={buttonClasses}\n disabled={disabled || loading}\n >\n {content}\n </EidosLink>\n ) : (\n <button\n type=\"button\"\n {...(buttonProps as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n aria-label={iconOnlyLabel ?? buttonProps['aria-label']}\n className={buttonClasses}\n disabled={disabled || loading}\n >\n {content}\n </button>\n );\n\n return tooltip ? <Tooltip message={tooltip}>{buttonContent}</Tooltip> : buttonContent;\n};\n\n/**\n * IconButton - Convenience wrapper for icon-only buttons\n *\n * @example\n * ```tsx\n * import { IconButton } from 'eidos-ui';\n * import { Plus } from 'lucide-react';\n *\n * <IconButton icon={Plus} tooltip=\"Add item\" />\n * ```\n */\nexport const IconButton: React.FC<IconButtonProps | IconLinkButtonProps> = (props) => {\n return <Button {...props} />;\n};\n"],"mappings":";;;;;;;;;;;;AACA,SAAS,oBAAoB;AA6EjB,mBAEI,KAFJ;AAvEL,IAAM,SAAgC,CAAC;AAAA,EAC5C,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,WAAW;AAAA,EACX,UAAU;AAAA,EACV,cAAc;AAAA,EACd;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,aAAa,CAAC,CAAC;AAErB,MAAI,YAAY;AACd,QAAI,UAAU;AACZ,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,QAAI,SAAS;AACX,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AACA,QAAI,SAAS;AACX,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAAA,EACF;AAgBA,QAAM,gBAAgB,YAAY,YAAY,KAAK,YAAY,iBAAiB;AAChF,QAAM,gBAAgB,cAAc,CAAC,gBAAgB,UAAU;AAE/D,MAAI,cAAc,CAAC,iBAAiB,CAAC,SAAS;AAC5C;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA,iBAAiB,OAAO;AAAA,IACxB,iBAAiB,KAAK;AAAA,IACtB,iBAAiB,IAAI;AAAA,IACrB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX;AAAA,EACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,UACJ,gCACG,oBACC,iCACG;AAAA,KAAC,cACA,iCACE;AAAA,0BAAC,UAAK,WAAU,iCACd,8BAAC,gBAAa,WAAU,8BAA6B,GACvD;AAAA,MACA,oBAAC,UAAK,WAAU,sBAAsB,uBAAY;AAAA,OACpD;AAAA,IAED,cACC,oBAAC,UAAK,WAAU,iCACd,8BAAC,gBAAa,WAAU,8BAA6B,GACvD;AAAA,KAEJ,IAEA,iCACG;AAAA,eAAW,WAAW,SAAS,wBAAwB;AAAA,IAEvD,cAAc,OACb,WAAW,MAAM,oBAAoB,IAErC,oBAAC,UAAK,WAAU,sBAAsB,UAAS;AAAA,IAGhD,WAAW,WAAW,SAAS,wBAAwB;AAAA,KAC1D,GAEJ;AAOF,QAAM,gBACJ,OAAO,YAAY,SAAS,WAC1B;AAAA,IAAC;AAAA;AAAA,MACE,GAAI;AAAA,MACL,MAAM,YAAY;AAAA,MAClB,cAAY,iBAAiB,YAAY,YAAY;AAAA,MACrD,aAAW,WAAW;AAAA,MACtB,WAAW;AAAA,MACX,UAAU,YAAY;AAAA,MAErB;AAAA;AAAA,EACH,IAEA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACJ,GAAI;AAAA,MACL,cAAY,iBAAiB,YAAY,YAAY;AAAA,MACrD,WAAW;AAAA,MACX,UAAU,YAAY;AAAA,MAErB;AAAA;AAAA,EACH;AAGJ,SAAO,UAAU,oBAAC,WAAQ,SAAS,SAAU,yBAAc,IAAa;AAC1E;AAaO,IAAM,aAA8D,CAAC,UAAU;AACpF,SAAO,oBAAC,UAAQ,GAAG,OAAO;AAC5B;","names":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
|
+
|
|
3
|
+
var _chunk75Q5OS7Lcjs = require('./chunk-75Q5OS7L.cjs');
|
|
4
|
+
|
|
5
|
+
// src/components/LinkProvider/Link.component.tsx
|
|
6
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
7
|
+
var EidosLink = ({
|
|
8
|
+
href,
|
|
9
|
+
disabled = false,
|
|
10
|
+
target,
|
|
11
|
+
rel,
|
|
12
|
+
onClick,
|
|
13
|
+
children,
|
|
14
|
+
...anchorProps
|
|
15
|
+
}) => {
|
|
16
|
+
const LinkComponent = _chunk75Q5OS7Lcjs.useLinkComponent.call(void 0, );
|
|
17
|
+
if (disabled) {
|
|
18
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
19
|
+
"a",
|
|
20
|
+
{
|
|
21
|
+
...anchorProps,
|
|
22
|
+
role: "link",
|
|
23
|
+
"aria-disabled": "true",
|
|
24
|
+
tabIndex: -1,
|
|
25
|
+
onClick: (event) => event.preventDefault(),
|
|
26
|
+
children
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
31
|
+
LinkComponent,
|
|
32
|
+
{
|
|
33
|
+
...anchorProps,
|
|
34
|
+
href,
|
|
35
|
+
target,
|
|
36
|
+
rel: _nullishCoalesce(rel, () => ( (target === "_blank" ? "noopener noreferrer" : void 0))),
|
|
37
|
+
onClick,
|
|
38
|
+
children
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
exports.EidosLink = EidosLink;
|
|
46
|
+
//# sourceMappingURL=chunk-KXDGW6LJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-KXDGW6LJ.cjs","../src/components/LinkProvider/Link.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACoCM,+CAAA;AAbC,IAAM,UAAA,EAAsC,CAAC;AAAA,EAClD,IAAA;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,EACX,MAAA;AAAA,EACA,GAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,cAAA,EAAgB,gDAAA,CAAiB;AAEvC,EAAA,GAAA,CAAI,QAAA,EAAU;AACZ,IAAA,uBACE,6BAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACE,GAAG,WAAA;AAAA,QACJ,IAAA,EAAK,MAAA;AAAA,QACL,eAAA,EAAc,MAAA;AAAA,QACd,QAAA,EAAU,CAAA,CAAA;AAAA,QACV,OAAA,EAAS,CAAC,KAAA,EAAA,GAAU,KAAA,CAAM,cAAA,CAAe,CAAA;AAAA,QAExC;AAAA,MAAA;AAAA,IACH,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,6BAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACE,GAAG,WAAA;AAAA,MACJ,IAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAA,mBAAK,GAAA,UAAA,CAAQ,OAAA,IAAW,SAAA,EAAW,sBAAA,EAAwB,KAAA,CAAA,GAAA;AAAA,MAC3D,OAAA;AAAA,MAEC;AAAA,IAAA;AAAA,EACH,CAAA;AAEJ,CAAA;ADtBA;AACA;AACE;AACF,8BAAC","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-KXDGW6LJ.cjs","sourcesContent":[null,"import React from 'react';\nimport { useLinkComponent } from './LinkProvider.context';\n\nexport interface EidosLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string;\n /** Renders an inert link: no `href`, `aria-disabled`, out of the tab order. */\n disabled?: boolean;\n}\n\n/**\n * The one place the library renders a navigable link. Internal - not exported\n * from the package - so that `Button`, `Chip`, `Breadcrumb` and anything else\n * with an `href` agree on the three rules below instead of each re-deriving\n * them.\n *\n * - **An enabled link** renders the `LinkProvider` component, or `<a>`.\n * - **A disabled link has no `href`.** An anchor with an `href` cannot be\n * disabled: `disabled` is not an anchor attribute, `pointer-events: none`\n * still leaves it reachable by keyboard, and it still navigates on Enter.\n * Removing the `href` is the only thing that makes it inert, and it is also\n * why this path never uses the provider's component - a router link has no\n * way to render without a destination. `role=\"link\"` keeps the role that\n * losing the `href` would otherwise remove, and `aria-disabled` says why.\n * - **`target=\"_blank\"` defaults `rel` to `noopener noreferrer`,** so the\n * opened page cannot reach back through `window.opener`. An explicit `rel`\n * always wins.\n */\nexport const EidosLink: React.FC<EidosLinkProps> = ({\n href,\n disabled = false,\n target,\n rel,\n onClick,\n children,\n ...anchorProps\n}) => {\n const LinkComponent = useLinkComponent();\n\n if (disabled) {\n return (\n <a\n {...anchorProps}\n role=\"link\"\n aria-disabled=\"true\"\n tabIndex={-1}\n onClick={(event) => event.preventDefault()}\n >\n {children}\n </a>\n );\n }\n\n return (\n <LinkComponent\n {...anchorProps}\n href={href}\n target={target}\n rel={rel ?? (target === '_blank' ? 'noopener noreferrer' : undefined)}\n onClick={onClick}\n >\n {children}\n </LinkComponent>\n );\n};\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Chip
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-2TIMJD4K.js";
|
|
4
4
|
import {
|
|
5
5
|
Dropdown
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-3X6QVHTD.js";
|
|
7
7
|
|
|
8
8
|
// src/components/TagInput/TagInput.component.tsx
|
|
9
9
|
import { useState, useId, useRef, useCallback, useMemo, useEffect } from "react";
|
|
@@ -288,4 +288,4 @@ TagInput.displayName = "TagInput";
|
|
|
288
288
|
export {
|
|
289
289
|
TagInput
|
|
290
290
|
};
|
|
291
|
-
//# sourceMappingURL=chunk-
|
|
291
|
+
//# sourceMappingURL=chunk-L6ERHCQ2.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Dropdown
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-3X6QVHTD.js";
|
|
4
4
|
|
|
5
5
|
// src/components/ColorPicker/ColorPicker.component.tsx
|
|
6
6
|
import { useState, useRef, useEffect, useCallback } from "react";
|
|
@@ -532,4 +532,4 @@ ColorPicker.displayName = "ColorPicker";
|
|
|
532
532
|
export {
|
|
533
533
|
ColorPicker
|
|
534
534
|
};
|
|
535
|
-
//# sourceMappingURL=chunk-
|
|
535
|
+
//# sourceMappingURL=chunk-L6YJ6QTZ.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkVXC7Z7XBcjs = require('./chunk-VXC7Z7XB.cjs');
|
|
4
4
|
|
|
5
5
|
// src/components/ColorPicker/ColorPicker.component.tsx
|
|
6
6
|
var _react = require('react');
|
|
@@ -497,7 +497,7 @@ var ColorPicker = ({
|
|
|
497
497
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: rootClasses, children: [
|
|
498
498
|
label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-color-picker-label", children: label }),
|
|
499
499
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
500
|
-
|
|
500
|
+
_chunkVXC7Z7XBcjs.Dropdown,
|
|
501
501
|
{
|
|
502
502
|
trigger: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
503
503
|
"button",
|
|
@@ -532,4 +532,4 @@ ColorPicker.displayName = "ColorPicker";
|
|
|
532
532
|
|
|
533
533
|
|
|
534
534
|
exports.ColorPicker = ColorPicker;
|
|
535
|
-
//# sourceMappingURL=chunk-
|
|
535
|
+
//# sourceMappingURL=chunk-LUDK44NZ.cjs.map
|