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,11 +1,11 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkXPG56DLQcjs = require('./chunk-XPG56DLQ.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _chunkENMDOQQOcjs = require('./chunk-ENMDOQQO.cjs');
|
|
9
9
|
|
|
10
10
|
// src/components/Modal/Modal.component.tsx
|
|
11
11
|
var _react = require('react');
|
|
@@ -27,7 +27,7 @@ var Modal = ({
|
|
|
27
27
|
const titleId = _react.useId.call(void 0, );
|
|
28
28
|
const bodyId = _react.useId.call(void 0, );
|
|
29
29
|
const dialogRef = _react.useRef.call(void 0, null);
|
|
30
|
-
const isClient =
|
|
30
|
+
const isClient = _chunkENMDOQQOcjs.useIsClient.call(void 0, );
|
|
31
31
|
const TRANSITION_MS = 200;
|
|
32
32
|
const [isMounted, setIsMounted] = _react.useState.call(void 0, isOpen);
|
|
33
33
|
const [isVisible, setIsVisible] = _react.useState.call(void 0, isOpen);
|
|
@@ -76,7 +76,7 @@ var Modal = ({
|
|
|
76
76
|
document.body.style.overflow = "";
|
|
77
77
|
};
|
|
78
78
|
}, [isOpen, handleEscapeKey]);
|
|
79
|
-
|
|
79
|
+
_chunkENMDOQQOcjs.useDialogFocus.call(void 0, isClient && isOpen && isVisible, dialogRef);
|
|
80
80
|
if (!isClient || !isMounted) return null;
|
|
81
81
|
const modalContent = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: `eidos-modal ${isVisible ? "eidos-modal--is-open" : ""} ${className}`, children: [
|
|
82
82
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-modal-backdrop", onClick: handleBackdropClick, "aria-hidden": "true" }),
|
|
@@ -91,13 +91,13 @@ var Modal = ({
|
|
|
91
91
|
className: `eidos-modal-content eidos-modal-content--${size}`,
|
|
92
92
|
children: [
|
|
93
93
|
title && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: `eidos-modal-header ${type ? `eidos-modal-header--${type}` : ""}`, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "h4", { id: titleId, children: [
|
|
94
|
-
icon &&
|
|
94
|
+
icon && _chunkENMDOQQOcjs.renderIcon.call(void 0, icon, "eidos-modal-icon"),
|
|
95
95
|
" ",
|
|
96
96
|
title
|
|
97
97
|
] }) }),
|
|
98
98
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { id: bodyId, className: "eidos-modal-body", children }),
|
|
99
99
|
actions.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: `eidos-modal-footer`, children: actions.map((action) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
100
|
-
|
|
100
|
+
_chunkXPG56DLQcjs.Button,
|
|
101
101
|
{
|
|
102
102
|
variant: action.variant || "outlined",
|
|
103
103
|
size: action.size || "md",
|
|
@@ -120,4 +120,4 @@ Modal.displayName = "Modal";
|
|
|
120
120
|
|
|
121
121
|
|
|
122
122
|
exports.Modal = Modal;
|
|
123
|
-
//# sourceMappingURL=chunk-
|
|
123
|
+
//# sourceMappingURL=chunk-6CW5QSYV.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-6CW5QSYV.cjs","../src/components/Modal/Modal.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-6CW5QSYV.cjs","sourcesContent":[null,"import React, { useEffect, useCallback, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button } from '../Button/Button.component';\nimport type { ModalProps } from './Modal.types';\nimport { renderIcon, useDialogFocus, useIsClient } from '../../utils';\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n icon,\n type,\n children,\n actions = [],\n closeOnBackdropClick = true,\n closeOnEscape = true,\n size = 'md',\n className = '',\n}) => {\n const titleId = useId();\n const bodyId = useId();\n const dialogRef = useRef<HTMLDivElement>(null);\n const isClient = useIsClient();\n\n // ── Animation state ────────────────────────────────────────────────────────\n // isMounted: whether the portal DOM node exists at all.\n // isVisible: whether the '--is-open' CSS class is applied (drives the transition).\n //\n // On open: mount first → one rAF → apply --is-open (browser sees the\n // initial faded/scaled-down state before transitioning, so the\n // animation fires instead of just painting straight into \"open\").\n // On close: remove --is-open (CSS transition plays) → after 200 ms unmount.\n // 200 ms matches the CSS `transition: 0.2s` in Modal.scss.\n const TRANSITION_MS = 200;\n const [isMounted, setIsMounted] = useState(isOpen);\n const [isVisible, setIsVisible] = useState(isOpen);\n\n useEffect(() => {\n let raf1 = 0;\n let raf2 = 0;\n let timerId: ReturnType<typeof setTimeout>;\n\n if (isOpen) {\n setIsMounted(true);\n // Double rAF: React 18 automatic batching means setIsMounted(true) may\n // not produce a committed browser paint before the first rAF fires.\n // The second frame guarantees the modal is rendered in its closed\n // (faded/scaled-down) state before the CSS transition begins.\n raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsVisible(true));\n });\n } else {\n setIsVisible(false);\n timerId = setTimeout(() => setIsMounted(false), TRANSITION_MS);\n }\n\n return () => {\n cancelAnimationFrame(raf1);\n cancelAnimationFrame(raf2);\n clearTimeout(timerId);\n };\n }, [isOpen]);\n\n // Handle escape key\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n if (closeOnEscape && event.key === 'Escape' && isOpen) {\n onClose();\n }\n },\n [closeOnEscape, isOpen, onClose],\n );\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (event: React.MouseEvent) => {\n if (closeOnBackdropClick && event.target === event.currentTarget) {\n onClose();\n }\n },\n [closeOnBackdropClick, onClose],\n );\n\n // Add/remove escape key listener (tied to isOpen, not isMounted)\n useEffect(() => {\n if (isOpen) {\n document.addEventListener('keydown', handleEscapeKey);\n // Prevent body scroll when modal is open\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n document.body.style.overflow = '';\n };\n }, [isOpen, handleEscapeKey]);\n\n // Keyed to `isVisible`, not `isOpen` and not `isMounted`.\n //\n // `isOpen` alone is too early: `isMounted` is set in the effect above, one\n // render later, so the dialog element does not exist yet and the trap would\n // run against a null ref.\n //\n // `isMounted` is *also* too early, and fails more quietly. `.eidos-modal`\n // starts at `visibility: hidden` and only becomes visible with\n // `--is-open`, which is two animation frames later - so at mount there is\n // nothing focusable to find and `.focus()` on the dialog itself is a no-op.\n // Focus silently stayed on the trigger.\n // `isClient` is part of the gate, not just the render below: a modal that\n // starts open flips `isVisible` before the portal exists, so the hook would\n // find a null ref, return early, and never re-run - leaving focus outside a\n // dialog claiming `aria-modal`.\n useDialogFocus(isClient && isOpen && isVisible, dialogRef);\n\n // `isMounted` is initialised to `isOpen`, so a modal that starts open reaches\n // `createPortal` on its very first render - which throws under SSR, where\n // there is no `document`. The animation flag cannot cover that; `isClient`\n // can. See `useIsClient`.\n if (!isClient || !isMounted) return null;\n\n const modalContent = (\n <div className={`eidos-modal ${isVisible ? 'eidos-modal--is-open' : ''} ${className}`}>\n <div className=\"eidos-modal-backdrop\" onClick={handleBackdropClick} aria-hidden=\"true\" />\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={bodyId}\n className={`eidos-modal-content eidos-modal-content--${size}`}\n >\n {title && (\n <div className={`eidos-modal-header ${type ? `eidos-modal-header--${type}` : ''}`}>\n <h4 id={titleId}>\n {icon && renderIcon(icon, 'eidos-modal-icon')} {title}\n </h4>\n </div>\n )}\n\n <div id={bodyId} className=\"eidos-modal-body\">\n {children}\n </div>\n\n {actions.length > 0 && (\n <div className={`eidos-modal-footer`}>\n {actions.map((action) => (\n <Button\n key={action.id}\n variant={action.variant || 'outlined'}\n size={action.size || 'md'}\n color={action.color}\n disabled={action.disabled}\n loading={action.loading}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n\n return createPortal(modalContent, document.body);\n};\n\nModal.displayName = 'Modal';\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Button
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JY77VJAZ.js";
|
|
4
4
|
import {
|
|
5
5
|
renderIcon
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-U34INRFO.js";
|
|
7
7
|
|
|
8
8
|
// src/components/Alert/Alert.component.tsx
|
|
9
9
|
import { Info, CircleCheck, TriangleAlert, CircleX, X } from "lucide-react";
|
|
@@ -76,4 +76,4 @@ var Alert = ({
|
|
|
76
76
|
export {
|
|
77
77
|
Alert
|
|
78
78
|
};
|
|
79
|
-
//# sourceMappingURL=chunk-
|
|
79
|
+
//# sourceMappingURL=chunk-6FXFKMJ5.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkB2OHBIALcjs = require('./chunk-B2OHBIAL.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkXPG56DLQcjs = require('./chunk-XPG56DLQ.cjs');
|
|
7
7
|
|
|
8
8
|
// src/components/Pagination/Pagination.component.tsx
|
|
9
9
|
var _react = require('react');
|
|
@@ -79,7 +79,7 @@ var Pagination = ({
|
|
|
79
79
|
].filter(Boolean).join(" ");
|
|
80
80
|
const nav = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "nav", { "aria-label": "Pagination", className: "eidos-pagination-nav", children: [
|
|
81
81
|
showFirstLast && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
82
|
-
|
|
82
|
+
_chunkXPG56DLQcjs.Button,
|
|
83
83
|
{
|
|
84
84
|
variant: "text",
|
|
85
85
|
size,
|
|
@@ -90,7 +90,7 @@ var Pagination = ({
|
|
|
90
90
|
}
|
|
91
91
|
),
|
|
92
92
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
93
|
-
|
|
93
|
+
_chunkXPG56DLQcjs.Button,
|
|
94
94
|
{
|
|
95
95
|
variant: "text",
|
|
96
96
|
size,
|
|
@@ -146,7 +146,7 @@ var Pagination = ({
|
|
|
146
146
|
)
|
|
147
147
|
),
|
|
148
148
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
149
|
-
|
|
149
|
+
_chunkXPG56DLQcjs.Button,
|
|
150
150
|
{
|
|
151
151
|
variant: "text",
|
|
152
152
|
size,
|
|
@@ -157,7 +157,7 @@ var Pagination = ({
|
|
|
157
157
|
}
|
|
158
158
|
),
|
|
159
159
|
showFirstLast && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
160
|
-
|
|
160
|
+
_chunkXPG56DLQcjs.Button,
|
|
161
161
|
{
|
|
162
162
|
variant: "text",
|
|
163
163
|
size,
|
|
@@ -185,7 +185,7 @@ var Pagination = ({
|
|
|
185
185
|
hasPageSize && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-pagination-size", children: [
|
|
186
186
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "label", { className: "eidos-pagination-size-label", htmlFor: pageSizeId, children: "Show:" }),
|
|
187
187
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
188
|
-
|
|
188
|
+
_chunkB2OHBIALcjs.Select,
|
|
189
189
|
{
|
|
190
190
|
value: String(pageSize),
|
|
191
191
|
onChange: (val) => onPageSizeChange(Number(val)),
|
|
@@ -209,4 +209,4 @@ Pagination.displayName = "Pagination";
|
|
|
209
209
|
|
|
210
210
|
|
|
211
211
|
exports.Pagination = Pagination;
|
|
212
|
-
//# sourceMappingURL=chunk-
|
|
212
|
+
//# sourceMappingURL=chunk-6IB27I5K.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-KREHT4AQ.cjs","../src/components/Pagination/Pagination.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-KREHT4AQ.cjs","sourcesContent":[null,"import React, { useState, useEffect, useId } from 'react';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react';\nimport { Button } from '../Button';\nimport { Select } from '../Select';\nimport type { PaginationProps } from './Pagination.types';\n\n// ── Ellipsis range helper ─────────────────────────────────────────────────────\n\nconst ELLIPSIS = 'ellipsis' as const;\ntype PageItem = number | typeof ELLIPSIS;\n\nfunction usePaginationRange(page: number, totalPages: number, siblingCount: number): PageItem[] {\n const totalShown = siblingCount * 2 + 5;\n\n if (totalPages <= totalShown) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const leftSibling = Math.max(page - siblingCount, 1);\n const rightSibling = Math.min(page + siblingCount, totalPages);\n\n const showLeftEllipsis = leftSibling > 2;\n const showRightEllipsis = rightSibling < totalPages - 1;\n\n const items: PageItem[] = [1];\n\n if (showLeftEllipsis) {\n items.push(ELLIPSIS);\n } else {\n for (let i = 2; i < leftSibling; i++) items.push(i);\n }\n\n for (let i = leftSibling; i <= rightSibling; i++) {\n if (i !== 1 && i !== totalPages) items.push(i);\n }\n\n if (showRightEllipsis) {\n items.push(ELLIPSIS);\n } else {\n for (let i = rightSibling + 1; i < totalPages; i++) items.push(i);\n }\n\n items.push(totalPages);\n\n return items;\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport const Pagination: React.FC<PaginationProps> = ({\n page,\n totalPages,\n onChange,\n siblingCount = 1,\n showFirstLast = false,\n color = 'primary',\n size = 'sm',\n disabled = false,\n className = '',\n // Table-footer mode\n totalItems,\n pageSize,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n}) => {\n const pageSizeId = useId();\n const items = usePaginationRange(page, totalPages, siblingCount);\n\n // ── Active-page editable input ─────────────────────────────────────────────\n const [inputValue, setInputValue] = useState(String(page));\n useEffect(() => {\n setInputValue(String(page));\n }, [page]);\n\n const commitInput = (raw: string) => {\n const val = parseInt(raw, 10);\n if (!isNaN(val) && val >= 1 && val <= totalPages && val !== page) {\n onChange(val);\n } else {\n setInputValue(String(page)); // revert on invalid or same-page\n }\n };\n\n // ── Layout flags ───────────────────────────────────────────────────────────\n const hasResults = totalItems !== undefined && pageSize !== undefined;\n const hasPageSize = !!onPageSizeChange && pageSize !== undefined;\n const tableMode = hasResults || hasPageSize;\n\n const startItem = hasResults ? (totalItems === 0 ? 0 : (page - 1) * pageSize! + 1) : undefined;\n const endItem = hasResults ? Math.min(page * pageSize!, totalItems!) : undefined;\n\n const rootClasses = [\n 'eidos-pagination',\n `eidos-pagination--${size}`,\n tableMode && 'eidos-pagination--table',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // ── Navigation block ───────────────────────────────────────────────────────\n const nav = (\n <nav aria-label=\"Pagination\" className=\"eidos-pagination-nav\">\n {showFirstLast && (\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronsLeft}\n disabled={page === 1 || disabled}\n onClick={() => onChange(1)}\n aria-label=\"First page\"\n />\n )}\n\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronLeft}\n disabled={page === 1 || disabled}\n onClick={() => onChange(page - 1)}\n aria-label=\"Previous page\"\n />\n\n {items.map((item, i) =>\n item === ELLIPSIS ? (\n <span key={`ellipsis-${i}`} className=\"eidos-pagination-ellipsis\" aria-hidden=\"true\">\n …\n </span>\n ) : item === page ? (\n // Active page - styled as filled chip, editable via keyboard/click\n <input\n key=\"active-page\"\n type=\"text\"\n inputMode=\"numeric\"\n className={[\n 'eidos-pagination-page',\n 'eidos-pagination-page--active',\n `eidos-pagination-page--${color}`,\n ].join(' ')}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onFocus={(e) => e.target.select()}\n onBlur={() => commitInput(inputValue)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n commitInput(inputValue);\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n setInputValue(String(page));\n e.currentTarget.blur();\n }\n }}\n aria-label={`Page ${page} of ${totalPages}, editable`}\n aria-current=\"page\"\n disabled={disabled}\n />\n ) : (\n <button\n key={item}\n type=\"button\"\n className=\"eidos-pagination-page\"\n onClick={() => onChange(item)}\n disabled={disabled}\n aria-label={`Page ${item}`}\n >\n {item}\n </button>\n ),\n )}\n\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronRight}\n disabled={page === totalPages || disabled}\n onClick={() => onChange(page + 1)}\n aria-label=\"Next page\"\n />\n\n {showFirstLast && (\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronsRight}\n disabled={page === totalPages || disabled}\n onClick={() => onChange(totalPages)}\n aria-label=\"Last page\"\n />\n )}\n </nav>\n );\n\n // ── Standalone mode ────────────────────────────────────────────────────────\n if (!tableMode) {\n return <div className={rootClasses}>{nav}</div>;\n }\n\n // ── Table-footer mode ──────────────────────────────────────────────────────\n return (\n <div className={rootClasses}>\n {hasResults && (\n <span className=\"eidos-pagination-info\">\n Showing {startItem}-{endItem} of {totalItems} results\n </span>\n )}\n\n <div className=\"eidos-pagination-controls\">\n {hasPageSize && (\n <div className=\"eidos-pagination-size\">\n <label className=\"eidos-pagination-size-label\" htmlFor={pageSizeId}>\n Show:\n </label>\n <Select\n value={String(pageSize)}\n onChange={(val) => onPageSizeChange(Number(val))}\n options={pageSizeOptions.map((n) => ({\n id: String(n),\n value: String(n),\n label: String(n),\n }))}\n clearable={false}\n disabled={disabled}\n // Sizes the whole field, chevron and padding included - wide\n // enough for a 3-digit page size. `'3ch'` used to work here only\n // because `Input.width` sized the inner <input> and let the\n // chrome overflow it; now that it sizes the field, 3ch left no\n // room for the value at all.\n // Associated with the visible \"Show:\" label above rather\n // than given an `aria-label`. The `<label>` was real but had no\n // `htmlFor`, so it named nothing; an `aria-label` would have\n // worked for axe while risking SC 2.5.3 Label in Name, since\n // the spoken name would no longer contain the visible text.\n inputProps={{ size: 'sm', width: 72, id: pageSizeId }}\n />\n </div>\n )}\n\n {totalPages > 1 && nav}\n </div>\n </div>\n );\n};\n\nPagination.displayName = 'Pagination';\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-6IB27I5K.cjs","../src/components/Pagination/Pagination.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-6IB27I5K.cjs","sourcesContent":[null,"import React, { useState, useEffect, useId } from 'react';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react';\nimport { Button } from '../Button';\nimport { Select } from '../Select';\nimport type { PaginationProps } from './Pagination.types';\n\n// ── Ellipsis range helper ─────────────────────────────────────────────────────\n\nconst ELLIPSIS = 'ellipsis' as const;\ntype PageItem = number | typeof ELLIPSIS;\n\nfunction usePaginationRange(page: number, totalPages: number, siblingCount: number): PageItem[] {\n const totalShown = siblingCount * 2 + 5;\n\n if (totalPages <= totalShown) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const leftSibling = Math.max(page - siblingCount, 1);\n const rightSibling = Math.min(page + siblingCount, totalPages);\n\n const showLeftEllipsis = leftSibling > 2;\n const showRightEllipsis = rightSibling < totalPages - 1;\n\n const items: PageItem[] = [1];\n\n if (showLeftEllipsis) {\n items.push(ELLIPSIS);\n } else {\n for (let i = 2; i < leftSibling; i++) items.push(i);\n }\n\n for (let i = leftSibling; i <= rightSibling; i++) {\n if (i !== 1 && i !== totalPages) items.push(i);\n }\n\n if (showRightEllipsis) {\n items.push(ELLIPSIS);\n } else {\n for (let i = rightSibling + 1; i < totalPages; i++) items.push(i);\n }\n\n items.push(totalPages);\n\n return items;\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport const Pagination: React.FC<PaginationProps> = ({\n page,\n totalPages,\n onChange,\n siblingCount = 1,\n showFirstLast = false,\n color = 'primary',\n size = 'sm',\n disabled = false,\n className = '',\n // Table-footer mode\n totalItems,\n pageSize,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n}) => {\n const pageSizeId = useId();\n const items = usePaginationRange(page, totalPages, siblingCount);\n\n // ── Active-page editable input ─────────────────────────────────────────────\n const [inputValue, setInputValue] = useState(String(page));\n useEffect(() => {\n setInputValue(String(page));\n }, [page]);\n\n const commitInput = (raw: string) => {\n const val = parseInt(raw, 10);\n if (!isNaN(val) && val >= 1 && val <= totalPages && val !== page) {\n onChange(val);\n } else {\n setInputValue(String(page)); // revert on invalid or same-page\n }\n };\n\n // ── Layout flags ───────────────────────────────────────────────────────────\n const hasResults = totalItems !== undefined && pageSize !== undefined;\n const hasPageSize = !!onPageSizeChange && pageSize !== undefined;\n const tableMode = hasResults || hasPageSize;\n\n const startItem = hasResults ? (totalItems === 0 ? 0 : (page - 1) * pageSize! + 1) : undefined;\n const endItem = hasResults ? Math.min(page * pageSize!, totalItems!) : undefined;\n\n const rootClasses = [\n 'eidos-pagination',\n `eidos-pagination--${size}`,\n tableMode && 'eidos-pagination--table',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // ── Navigation block ───────────────────────────────────────────────────────\n const nav = (\n <nav aria-label=\"Pagination\" className=\"eidos-pagination-nav\">\n {showFirstLast && (\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronsLeft}\n disabled={page === 1 || disabled}\n onClick={() => onChange(1)}\n aria-label=\"First page\"\n />\n )}\n\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronLeft}\n disabled={page === 1 || disabled}\n onClick={() => onChange(page - 1)}\n aria-label=\"Previous page\"\n />\n\n {items.map((item, i) =>\n item === ELLIPSIS ? (\n <span key={`ellipsis-${i}`} className=\"eidos-pagination-ellipsis\" aria-hidden=\"true\">\n …\n </span>\n ) : item === page ? (\n // Active page - styled as filled chip, editable via keyboard/click\n <input\n key=\"active-page\"\n type=\"text\"\n inputMode=\"numeric\"\n className={[\n 'eidos-pagination-page',\n 'eidos-pagination-page--active',\n `eidos-pagination-page--${color}`,\n ].join(' ')}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onFocus={(e) => e.target.select()}\n onBlur={() => commitInput(inputValue)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n commitInput(inputValue);\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n setInputValue(String(page));\n e.currentTarget.blur();\n }\n }}\n aria-label={`Page ${page} of ${totalPages}, editable`}\n aria-current=\"page\"\n disabled={disabled}\n />\n ) : (\n <button\n key={item}\n type=\"button\"\n className=\"eidos-pagination-page\"\n onClick={() => onChange(item)}\n disabled={disabled}\n aria-label={`Page ${item}`}\n >\n {item}\n </button>\n ),\n )}\n\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronRight}\n disabled={page === totalPages || disabled}\n onClick={() => onChange(page + 1)}\n aria-label=\"Next page\"\n />\n\n {showFirstLast && (\n <Button\n variant=\"text\"\n size={size}\n icon={ChevronsRight}\n disabled={page === totalPages || disabled}\n onClick={() => onChange(totalPages)}\n aria-label=\"Last page\"\n />\n )}\n </nav>\n );\n\n // ── Standalone mode ────────────────────────────────────────────────────────\n if (!tableMode) {\n return <div className={rootClasses}>{nav}</div>;\n }\n\n // ── Table-footer mode ──────────────────────────────────────────────────────\n return (\n <div className={rootClasses}>\n {hasResults && (\n <span className=\"eidos-pagination-info\">\n Showing {startItem}-{endItem} of {totalItems} results\n </span>\n )}\n\n <div className=\"eidos-pagination-controls\">\n {hasPageSize && (\n <div className=\"eidos-pagination-size\">\n <label className=\"eidos-pagination-size-label\" htmlFor={pageSizeId}>\n Show:\n </label>\n <Select\n value={String(pageSize)}\n onChange={(val) => onPageSizeChange(Number(val))}\n options={pageSizeOptions.map((n) => ({\n id: String(n),\n value: String(n),\n label: String(n),\n }))}\n clearable={false}\n disabled={disabled}\n // Sizes the whole field, chevron and padding included - wide\n // enough for a 3-digit page size. `'3ch'` used to work here only\n // because `Input.width` sized the inner <input> and let the\n // chrome overflow it; now that it sizes the field, 3ch left no\n // room for the value at all.\n // Associated with the visible \"Show:\" label above rather\n // than given an `aria-label`. The `<label>` was real but had no\n // `htmlFor`, so it named nothing; an `aria-label` would have\n // worked for axe while risking SC 2.5.3 Label in Name, since\n // the spoken name would no longer contain the visible text.\n inputProps={{ size: 'sm', width: 72, id: pageSizeId }}\n />\n </div>\n )}\n\n {totalPages > 1 && nav}\n </div>\n </div>\n );\n};\n\nPagination.displayName = 'Pagination';\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Toolbar
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-U4SVBE2M.js";
|
|
4
4
|
import {
|
|
5
5
|
Header
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-RHWZX7PB.js";
|
|
7
7
|
import {
|
|
8
8
|
Navigation
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-TJQNGJHP.js";
|
|
10
10
|
import {
|
|
11
11
|
Footer
|
|
12
12
|
} from "./chunk-W2F6WDUX.js";
|
|
@@ -96,4 +96,4 @@ var PageLayout = ({
|
|
|
96
96
|
export {
|
|
97
97
|
PageLayout
|
|
98
98
|
};
|
|
99
|
-
//# sourceMappingURL=chunk-
|
|
99
|
+
//# sourceMappingURL=chunk-6LTZV6HN.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Input
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XIUZT4TO.js";
|
|
4
4
|
|
|
5
5
|
// src/components/InlineEdit/InlineEdit.component.tsx
|
|
6
6
|
import { useState, useRef, useCallback } from "react";
|
|
@@ -122,4 +122,4 @@ var InlineEdit = ({
|
|
|
122
122
|
export {
|
|
123
123
|
InlineEdit
|
|
124
124
|
};
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
125
|
+
//# sourceMappingURL=chunk-6NAOAKII.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/components/LinkProvider/LinkProvider.context.ts
|
|
2
|
+
var _react = require('react');
|
|
3
|
+
var LinkContext = _react.createContext.call(void 0, "a");
|
|
4
|
+
var useLinkComponent = () => _react.useContext.call(void 0, LinkContext);
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
exports.LinkContext = LinkContext; exports.useLinkComponent = useLinkComponent;
|
|
10
|
+
//# sourceMappingURL=chunk-75Q5OS7L.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-75Q5OS7L.cjs","../src/components/LinkProvider/LinkProvider.context.ts"],"names":[],"mappings":"AAAA;ACAA,8BAA0C;AAQnC,IAAM,YAAA,EAAc,kCAAA,GAAgC,CAAA;AAGpD,IAAM,iBAAA,EAAmB,CAAA,EAAA,GAAqB,+BAAA,WAAsB,CAAA;ADP3E;AACA;AACE;AACA;AACF,+EAAC","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-75Q5OS7L.cjs","sourcesContent":[null,"import { createContext, useContext } from 'react';\nimport type { LinkComponent } from './LinkProvider.types';\n\n/**\n * Defaults to a plain anchor rather than `undefined`: unlike `useTheme`, a\n * missing provider is not a misconfiguration - it is the ordinary case for a\n * site without client-side routing.\n */\nexport const LinkContext = createContext<LinkComponent>('a');\n\n/** The link component set by the nearest `LinkProvider`, or `'a'`. */\nexport const useLinkComponent = (): LinkComponent => useContext(LinkContext);\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkN5NXKVFJcjs = require('./chunk-N5NXKVFJ.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkVXC7Z7XBcjs = require('./chunk-VXC7Z7XB.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkENMDOQQOcjs = require('./chunk-ENMDOQQO.cjs');
|
|
10
10
|
|
|
11
11
|
// src/components/SplitButton/SplitButton.component.tsx
|
|
12
12
|
var _react = require('react');
|
|
@@ -72,16 +72,16 @@ var SplitButton = ({
|
|
|
72
72
|
disabled: disabledOrLoading,
|
|
73
73
|
onClick,
|
|
74
74
|
children: [
|
|
75
|
-
loading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.LoaderCircle, { className: "eidos-split-button__spinner", "aria-hidden": "true" }) : preIcon &&
|
|
75
|
+
loading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.LoaderCircle, { className: "eidos-split-button__spinner", "aria-hidden": "true" }) : preIcon && _chunkENMDOQQOcjs.renderIcon.call(void 0, preIcon, "eidos-split-button__pre-icon"),
|
|
76
76
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-split-button__label", children: label })
|
|
77
77
|
]
|
|
78
78
|
}
|
|
79
79
|
),
|
|
80
80
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
81
|
-
|
|
81
|
+
_chunkVXC7Z7XBcjs.Dropdown,
|
|
82
82
|
{
|
|
83
83
|
trigger: chevronTrigger,
|
|
84
|
-
content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
84
|
+
content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN5NXKVFJcjs.MenuPanel, { items: menuItems, onItemClick: handleItemClick }),
|
|
85
85
|
placement: "bottom",
|
|
86
86
|
align: "end",
|
|
87
87
|
disabled: disabledOrLoading
|
|
@@ -95,4 +95,4 @@ var SplitButton = ({
|
|
|
95
95
|
|
|
96
96
|
|
|
97
97
|
exports.SplitButton = SplitButton;
|
|
98
|
-
//# sourceMappingURL=chunk-
|
|
98
|
+
//# sourceMappingURL=chunk-7FV2X62W.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-7FV2X62W.cjs","../src/components/SplitButton/SplitButton.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACVA,8BAAmC;AACnC,2CAA0C;AAsEpC,+CAAA;AA5CC,IAAM,YAAA,EAA0C,CAAC;AAAA,EACtD,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,KAAA;AAAA,EACX,QAAA,EAAU,KAAA;AAAA,EACV,OAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AAEJ,EAAA,MAAM,UAAA,EAAwB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,EAAA,GAAA,CAAS;AAAA,IAClD,IAAA,EAAM,MAAA;AAAA,IACN,EAAA,EAAI,GAAA,CAAI,EAAA;AAAA,IACR,KAAA,EAAO,GAAA,CAAI,KAAA;AAAA,IACX,IAAA,EAAM,GAAA,CAAI,IAAA;AAAA,IACV,QAAA,EAAU,GAAA,CAAI,QAAA;AAAA,IACd,OAAA,EAAS,GAAA,CAAI;AAAA,EACf,CAAA,CAAE,CAAA;AAEF,EAAA,MAAM,gBAAA,EAAkB,gCAAA,CAAY,EAAA,GAAM;AAExC,IAAA,UAAA,CAAW,CAAA,EAAA,GAAM;AACf,MAAA,QAAA,CAAS,aAAA;AAAA,QACP,IAAI,UAAA,CAAW,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,OAAO,CAAC;AAAA,MAC/E,CAAA;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAAA,EACP,CAAA,EAAG,CAAC,CAAC,CAAA;AAEL,EAAA,MAAM,UAAA,EAAY,CAAA,2BAAA,EAA8B,OAAO,CAAA,eAAA,EAAkB,KAAK,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA;AAC9D,EAAA;AAGpC,EAAA;AAAC,IAAA;AAAA,IAAA;AACM,MAAA;AACkB,MAAA;AACb,MAAA;AACC,MAAA;AAGG,MAAA;AAE4C,MAAA;AAAmB,IAAA;AAC/E,EAAA;AAIA,EAAA;AAAC,IAAA;AAAA,IAAA;AACY,MAAA;AACT,QAAA;AAC8B,QAAA;AACF,QAAA;AACD,QAAA;AACN,QAAA;AACrB,QAAA;AAGS,MAAA;AAGX,MAAA;AAAA,wBAAA;AAAC,UAAA;AAAA,UAAA;AACM,YAAA;AACkB,YAAA;AACb,YAAA;AACV,YAAA;AAEC,YAAA;AACuD,cAAA;AAIL,8BAAA;AAAA,YAAA;AAAA,UAAA;AACrD,QAAA;AAGA,wBAAA;AAAC,UAAA;AAAA,UAAA;AACU,YAAA;AAC2D,YAAA;AAC1D,YAAA;AACJ,YAAA;AACI,YAAA;AAAA,UAAA;AACZ,QAAA;AAAA,MAAA;AAAA,IAAA;AACF,EAAA;AAEJ;ADpBuG;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-7FV2X62W.cjs","sourcesContent":[null,"import React, { useCallback } from 'react';\nimport { ChevronDown, LoaderCircle } from 'lucide-react';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport { MenuPanel } from '../Menu';\nimport type { MenuItem } from '../Menu';\nimport { renderIcon } from '../../utils';\nimport type { SplitButtonProps } from './SplitButton.types';\n\n/**\n * SplitButton - a two-part control with a primary action button on the left\n * and a chevron that opens a dropdown of secondary actions on the right.\n *\n * The primary button fires `onClick` directly; clicking the chevron opens the\n * dropdown. Visually the two parts share a single bordered unit.\n *\n * @example\n * ```tsx\n * <SplitButton\n * label=\"Save\"\n * onClick={() => save()}\n * options={[\n * { id: 'draft', label: 'Save as draft', onClick: saveDraft },\n * { id: 'template', label: 'Save as template', onClick: saveTemplate },\n * ]}\n * />\n * ```\n */\nexport const SplitButton: React.FC<SplitButtonProps> = ({\n label,\n onClick,\n options,\n variant = 'filled',\n color = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n preIcon,\n className = '',\n}) => {\n // Convert SplitButtonOption → MenuItemType so MenuPanel can render them.\n const menuItems: MenuItem[] = options.map((opt) => ({\n type: 'item' as const,\n id: opt.id,\n label: opt.label,\n icon: opt.icon,\n disabled: opt.disabled,\n onClick: opt.onClick,\n }));\n\n const handleItemClick = useCallback(() => {\n // Close the dropdown by dispatching a mousedown outside it.\n setTimeout(() => {\n document.dispatchEvent(\n new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window }),\n );\n }, 10);\n }, []);\n\n const baseClass = `eidos-button eidos-button--${variant} eidos-button--${color} eidos-button--${size}`;\n const disabledOrLoading = disabled || loading;\n\n const chevronTrigger = (\n <button\n type=\"button\"\n className={`${baseClass} eidos-split-button__chevron`}\n disabled={disabledOrLoading}\n aria-label=\"More options\"\n // The chevron opens a `MenuPanel`. `Dropdown` adds no ARIA to its trigger,\n // so without this the control is announced as a plain button.\n aria-haspopup=\"menu\"\n >\n <ChevronDown className=\"eidos-split-button__chevron-icon\" aria-hidden=\"true\" />\n </button>\n );\n\n return (\n <div\n className={[\n 'eidos-split-button',\n `eidos-split-button--${variant}`,\n `eidos-split-button--${color}`,\n `eidos-split-button--${size}`,\n disabledOrLoading && 'eidos-split-button--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {/* Primary action */}\n <button\n type=\"button\"\n className={`${baseClass} eidos-split-button__primary`}\n disabled={disabledOrLoading}\n onClick={onClick}\n >\n {loading ? (\n <LoaderCircle className=\"eidos-split-button__spinner\" aria-hidden=\"true\" />\n ) : (\n preIcon && renderIcon(preIcon, 'eidos-split-button__pre-icon')\n )}\n <span className=\"eidos-split-button__label\">{label}</span>\n </button>\n\n {/* Secondary actions dropdown */}\n <Dropdown\n trigger={chevronTrigger}\n content={<MenuPanel items={menuItems} onItemClick={handleItemClick} />}\n placement=\"bottom\"\n align=\"end\"\n disabled={disabledOrLoading}\n />\n </div>\n );\n};\n"]}
|
|
@@ -5,7 +5,7 @@ var _chunkKVIL4EP4cjs = require('./chunk-KVIL4EP4.cjs');
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _chunkENMDOQQOcjs = require('./chunk-ENMDOQQO.cjs');
|
|
9
9
|
|
|
10
10
|
// src/components/CommandPalette/CommandPalette.component.tsx
|
|
11
11
|
var _react = require('react');
|
|
@@ -79,7 +79,7 @@ var CommandPalette = ({
|
|
|
79
79
|
}, [shortcutKey, openPalette]);
|
|
80
80
|
const [isMounted, setIsMounted] = _react.useState.call(void 0, open);
|
|
81
81
|
const [isVisible, setIsVisible] = _react.useState.call(void 0, open);
|
|
82
|
-
const isClient =
|
|
82
|
+
const isClient = _chunkENMDOQQOcjs.useIsClient.call(void 0, );
|
|
83
83
|
_react.useEffect.call(void 0, () => {
|
|
84
84
|
let raf1 = 0;
|
|
85
85
|
let raf2 = 0;
|
|
@@ -113,7 +113,7 @@ var CommandPalette = ({
|
|
|
113
113
|
setFocusedIndex(0);
|
|
114
114
|
}
|
|
115
115
|
}, [open]);
|
|
116
|
-
|
|
116
|
+
_chunkENMDOQQOcjs.useDialogFocus.call(void 0, isClient && open && isVisible, dialogRef, { initialFocus: inputRef });
|
|
117
117
|
_react.useEffect.call(void 0, () => {
|
|
118
118
|
setFocusedIndex(0);
|
|
119
119
|
}, [query]);
|
|
@@ -181,7 +181,7 @@ var CommandPalette = ({
|
|
|
181
181
|
const [customTriggerIsControl, setCustomTriggerIsControl] = _react.useState.call(void 0, false);
|
|
182
182
|
_react.useEffect.call(void 0, () => {
|
|
183
183
|
const element = customTriggerRef.current;
|
|
184
|
-
setCustomTriggerIsControl(!!element && element.querySelector(
|
|
184
|
+
setCustomTriggerIsControl(!!element && element.querySelector(_chunkENMDOQQOcjs.FOCUSABLE_SELECTOR) === null);
|
|
185
185
|
}, [trigger]);
|
|
186
186
|
const triggerNode = trigger === true ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
187
187
|
"button",
|
|
@@ -377,4 +377,4 @@ CommandPalette.displayName = "CommandPalette";
|
|
|
377
377
|
|
|
378
378
|
|
|
379
379
|
exports.CommandPalette = CommandPalette;
|
|
380
|
-
//# sourceMappingURL=chunk-
|
|
380
|
+
//# sourceMappingURL=chunk-7NUVLVSL.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-2T7ZMMH5.cjs","../src/components/CommandPalette/CommandPalette.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-2T7ZMMH5.cjs","sourcesContent":[null,"import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ArrowDown, ArrowUp, Command, CornerDownLeft, Search } from 'lucide-react';\nimport type { CommandItem, CommandPaletteProps } from './CommandPalette.types';\nimport { useDialogFocus, useIsClient, FOCUSABLE_SELECTOR } from '../../utils';\nimport { Kbd } from '../Kbd';\nimport './CommandPalette.scss';\n\n// ── Constants ──────────────────────────────────────────────────────────────────\n\n/** Must match the CSS transition duration in CommandPalette.scss */\nconst TRANSITION_MS = 200;\n\n// ── Pure helpers ───────────────────────────────────────────────────────────────\n\nfunction filterItems(items: CommandItem[], query: string): CommandItem[] {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter(({ label, description, keywords }) => {\n return (\n label.toLowerCase().includes(q) ||\n (description?.toLowerCase().includes(q) ?? false) ||\n (keywords?.some((k) => k.toLowerCase().includes(q)) ?? false)\n );\n });\n}\n\ninterface Group {\n label: string | null;\n items: CommandItem[];\n}\n\n/**\n * Groups items while preserving the order in which groups first appear.\n * Items with no `group` property are placed in a leading implicit section\n * (label: null) so that labelled groups always follow them.\n */\nfunction buildGroups(items: CommandItem[]): Group[] {\n const groups: Group[] = [];\n const groupMap = new Map<string, Group>();\n\n for (const item of items) {\n const key = item.group ?? '';\n let group = groupMap.get(key);\n if (!group) {\n group = { label: item.group ?? null, items: [] };\n groups.push(group);\n groupMap.set(key, group);\n }\n group.items.push(item);\n }\n\n return groups;\n}\n\n// ── Component ──────────────────────────────────────────────────────────────────\n\nexport const CommandPalette: React.FC<CommandPaletteProps> = ({\n open: openProp,\n defaultOpen = false,\n onClose,\n onOpen,\n shortcutKey = 'k',\n items,\n onSelect,\n placeholder = 'Search commands…',\n emptyText = 'No commands found',\n maxHeight = 360,\n className = '',\n footer,\n trigger,\n triggerLabel = 'Search',\n}) => {\n const dialogId = useId();\n const listId = `${dialogId}-list`;\n\n // ── Controlled / uncontrolled open state ───────────────────────────────────\n // Omitting `open` lets the palette own its state entirely, which combined\n // with the shortcut listener below means it needs zero external\n // useState/useEffect to work. Passing `open` (+ `onClose`, optionally\n // `onOpen`) keeps full external control for consumers who need it (syncing\n // with a URL, another piece of app state, etc).\n const isControlled = openProp !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const open = isControlled ? (openProp as boolean) : internalOpen;\n\n const close = useCallback(() => {\n if (!isControlled) setInternalOpen(false);\n onClose?.();\n }, [isControlled, onClose]);\n\n // Shared \"open\" path - uncontrolled flips the internal state directly;\n // controlled defers to `onOpen` since the palette can't change `open`\n // itself. Used by both the keyboard shortcut below and the inline\n // `trigger`'s click handler.\n const openPalette = useCallback(() => {\n if (isControlled) {\n onOpen?.();\n } else {\n setInternalOpen(true);\n }\n }, [isControlled, onOpen]);\n\n // Global keyboard shortcut - Cmd/Ctrl+<shortcutKey> opens the palette.\n useEffect(() => {\n if (!shortcutKey) return;\n\n const handler = (e: KeyboardEvent) => {\n if (!(e.metaKey || e.ctrlKey) || e.key.toLowerCase() !== shortcutKey.toLowerCase()) return;\n e.preventDefault();\n openPalette();\n };\n\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [shortcutKey, openPalette]);\n\n // ── Animation state machine (mirrors the Drawer pattern) ─────────────────\n // isMounted → portal exists in the DOM (controls render/null)\n // isVisible → CSS --visible modifier is applied (drives transitions)\n //\n // Opening: isMounted=true → double rAF → isVisible=true → CSS transitions fire\n // Closing: isVisible=false → CSS transitions reverse → after TRANSITION_MS → isMounted=false\n const [isMounted, setIsMounted] = useState(open);\n const [isVisible, setIsVisible] = useState(open);\n // `isMounted` starts as `open`, so a palette opened by `open`/`defaultOpen`\n // would portal on its first render, which throws under SSR. The trigger\n // below still renders on the server - only the portal is deferred.\n const isClient = useIsClient();\n\n useEffect(() => {\n let raf1 = 0;\n let raf2 = 0;\n let timerId: ReturnType<typeof setTimeout>;\n\n if (open) {\n setIsMounted(true);\n // Double rAF: ensures the browser has painted the initial off-screen\n // state before the CSS transition begins (React 18 automatic batching\n // means a single rAF is not always sufficient).\n raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsVisible(true));\n });\n } else {\n setIsVisible(false);\n timerId = setTimeout(() => setIsMounted(false), TRANSITION_MS);\n }\n\n return () => {\n cancelAnimationFrame(raf1);\n cancelAnimationFrame(raf2);\n clearTimeout(timerId);\n };\n }, [open]);\n\n // ── Search state ───────────────────────────────────────────────────────────\n const [query, setQuery] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const dialogRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Map<string, HTMLDivElement>>(new Map());\n\n // Derived lists - memoised to stabilise scroll-effect deps\n const filtered = useMemo(() => filterItems(items, query), [items, query]);\n const navigable = useMemo(() => filtered.filter((item) => !item.disabled), [filtered]);\n const groups = useMemo(() => buildGroups(filtered), [filtered]);\n\n // Reset search query and selection when the palette is opened\n useEffect(() => {\n if (open) {\n setQuery('');\n setFocusedIndex(0);\n }\n }, [open]);\n\n // Focus the search input on open, trap Tab inside the dialog, and return\n // focus to the trigger on close.\n //\n // This replaces a bare `inputRef.current?.focus()` effect. That moved focus\n // in correctly but nothing kept it there: the first Tab left the dialog for\n // the page behind it, and closing the palette stranded focus wherever it\n // happened to be. `initialFocus` preserves the original behaviour of\n // landing on the search field rather than the first focusable node.\n // `isClient` for the same reason as `Modal`: a palette opened by `open` or\n // `defaultOpen` has no portal on its first render, and this would run against\n // a null ref and never re-run.\n useDialogFocus(isClient && open && isVisible, dialogRef, { initialFocus: inputRef });\n\n // Reset focused index to 0 whenever the filtered list changes\n useEffect(() => {\n setFocusedIndex(0);\n }, [query]);\n\n // Scroll the focused item into view during keyboard navigation\n useEffect(() => {\n const focusedItem = navigable[focusedIndex];\n if (!focusedItem) return;\n itemRefs.current.get(focusedItem.id)?.scrollIntoView({ block: 'nearest' });\n }, [focusedIndex, navigable]);\n\n // Body scroll lock (tied to open, not to isMounted, so it releases promptly\n // when the consumer decides to close - even before the exit animation ends)\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [open]);\n\n // ── Interaction handlers ───────────────────────────────────────────────────\n\n const selectItem = useCallback(\n (item: CommandItem) => {\n if (item.disabled) return;\n item.action?.();\n onSelect?.(item);\n close();\n },\n [close, onSelect],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n if (navigable.length === 0) return;\n setFocusedIndex((i) => (i + 1) % navigable.length);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n if (navigable.length === 0) return;\n setFocusedIndex((i) => (i - 1 + navigable.length) % navigable.length);\n break;\n }\n case 'Enter': {\n e.preventDefault();\n const item = navigable[focusedIndex];\n if (item) selectItem(item);\n break;\n }\n case 'Escape': {\n e.preventDefault();\n close();\n break;\n }\n }\n },\n [focusedIndex, navigable, close, selectItem],\n );\n\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n // Only fire when the click lands directly on the backdrop element,\n // not on any child (the dialog itself or its contents).\n if (e.target === e.currentTarget) {\n close();\n }\n },\n [close],\n );\n\n // Whether the custom trigger wrapper has to be the control itself, i.e.\n // whether what the caller passed contains nothing focusable. Measured after\n // render, like `Tooltip`'s equivalent.\n const customTriggerRef = useRef<HTMLDivElement>(null);\n const [customTriggerIsControl, setCustomTriggerIsControl] = useState(false);\n\n useEffect(() => {\n const element = customTriggerRef.current;\n setCustomTriggerIsControl(!!element && element.querySelector(FOCUSABLE_SELECTOR) === null);\n }, [trigger]);\n\n // ── Render ─────────────────────────────────────────────────────────────────\n\n // The inline trigger (if any) must render regardless of `isMounted` - it's\n // what opens the palette in the first place, so it can't be gated behind\n // the portal's own mount state.\n const triggerNode =\n trigger === true ? (\n <button\n type=\"button\"\n className=\"eidos-cmd-trigger-default\"\n onClick={openPalette}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n <span>{triggerLabel}</span>\n {shortcutKey && (\n <Kbd size=\"sm\" className=\"eidos-cmd-trigger-kbd\">\n <Command size={10} />\n {shortcutKey.toUpperCase()}\n </Kbd>\n )}\n </button>\n ) : trigger ? (\n // The wrapper only becomes a control when what it wraps is not one.\n //\n // It used to be `role=\"button\" tabIndex={0}` unconditionally, with no key\n // handler, which was wrong in both directions at once: around an\n // interactive child it produced a button inside a button and a second tab\n // stop, and around a non-interactive one - `Avatar`, which is the\n // documented example - it produced a focusable element that announced\n // itself as a button and did nothing when activated.\n //\n // Measured from the DOM rather than guessed from the node type, because\n // `trigger` is an arbitrary `ReactNode` and the control may be nested\n // inside it. Same approach as `Tooltip`.\n <div\n ref={customTriggerRef}\n className=\"eidos-cmd-trigger\"\n onClick={openPalette}\n {...(customTriggerIsControl\n ? {\n role: 'button',\n tabIndex: 0,\n 'aria-haspopup': 'dialog' as const,\n 'aria-expanded': open,\n onKeyDown: (event: React.KeyboardEvent) => {\n // A `div` is not a button: Enter and Space produce no click of\n // their own.\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openPalette();\n }\n },\n }\n : {})}\n >\n {trigger}\n </div>\n ) : null;\n\n const maxHeightValue = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n\n // The root element must not change shape between the closed and open\n // states.\n //\n // This used to `return triggerNode` while closed and a fragment once\n // mounted. React compares the root by element type, so flipping from\n // `<button>` to `<Fragment>` unmounted the trigger and mounted a brand new\n // one - the very element the user had just clicked was destroyed. Focus\n // was lost with it, which made returning focus on close impossible: the\n // node to return to no longer existed.\n //\n // Always returning the fragment keeps `triggerNode` in a stable position,\n // so React preserves the DOM node across open and close.\n return (\n <>\n {triggerNode}\n {isClient &&\n isMounted &&\n createPortal(\n <div\n className={['eidos-cmd-backdrop', isVisible && 'eidos-cmd-backdrop--visible']\n .filter(Boolean)\n .join(' ')}\n onClick={handleBackdropClick}\n aria-hidden={!open}\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Command palette\"\n id={dialogId}\n className={['eidos-cmd-dialog', isVisible && 'eidos-cmd-dialog--visible', className]\n .filter(Boolean)\n .join(' ')}\n onKeyDown={handleKeyDown}\n >\n {/* ── Search ──────────────────────────────────────────────────────── */}\n <div className=\"eidos-cmd-search\">\n <Search className=\"eidos-cmd-search-icon\" size={18} aria-hidden=\"true\" />\n\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-label={placeholder}\n className=\"eidos-cmd-input\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n spellCheck={false}\n autoComplete=\"off\"\n />\n\n {/* Reminds users of the configured shortcut, if any */}\n {shortcutKey && (\n <div className=\"eidos-cmd-search-badge\" aria-hidden=\"true\">\n <Command size={11} />\n <span>{shortcutKey.toUpperCase()}</span>\n </div>\n )}\n </div>\n\n {/* ── Results list ─────────────────────────────────────────────────── */}\n <div\n id={listId}\n role=\"listbox\"\n aria-label=\"Commands\"\n className=\"eidos-cmd-list\"\n style={{ maxHeight: maxHeightValue }}\n >\n {filtered.length === 0 ? (\n <p className=\"eidos-cmd-empty\" role=\"status\">\n {emptyText}\n </p>\n ) : (\n groups.map((group) => (\n <div\n key={group.label ?? '__ungrouped__'}\n role=\"group\"\n aria-label={group.label ?? undefined}\n >\n {group.label && (\n <div className=\"eidos-cmd-group-label\" aria-hidden=\"true\">\n {group.label}\n </div>\n )}\n\n {group.items.map((item) => {\n const isFocused = navigable[focusedIndex]?.id === item.id;\n const Icon = item.icon;\n\n return (\n <div\n key={item.id}\n ref={(el) => {\n if (el) {\n itemRefs.current.set(item.id, el);\n } else {\n itemRefs.current.delete(item.id);\n }\n }}\n role=\"option\"\n aria-selected={isFocused}\n aria-disabled={item.disabled}\n className={[\n 'eidos-cmd-item',\n isFocused && 'eidos-cmd-item--focused',\n item.disabled && 'eidos-cmd-item--disabled',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => selectItem(item)}\n onMouseEnter={() => {\n if (!item.disabled) {\n const idx = navigable.findIndex((n) => n.id === item.id);\n if (idx !== -1) setFocusedIndex(idx);\n }\n }}\n >\n {Icon && (\n <span className=\"eidos-cmd-item-icon\" aria-hidden=\"true\">\n <Icon size={16} />\n </span>\n )}\n\n <div className=\"eidos-cmd-item-body\">\n <div className=\"eidos-cmd-item-label\">{item.label}</div>\n {item.description && (\n <div className=\"eidos-cmd-item-description\">{item.description}</div>\n )}\n </div>\n\n {item.shortcut && item.shortcut.length > 0 && (\n <div\n className=\"eidos-cmd-item-shortcut\"\n aria-label={`Shortcut: ${item.shortcut.join(' ')}`}\n >\n {item.shortcut.map((key, i) => (\n <kbd key={i} className=\"eidos-cmd-kbd\">\n {key}\n </kbd>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n ))\n )}\n </div>\n\n {/* ── Footer ───────────────────────────────────────────────────────── */}\n <div className=\"eidos-cmd-footer\">\n <div className=\"eidos-cmd-hints\" aria-hidden=\"true\">\n <span>\n <ArrowUp size={11} />\n <ArrowDown size={11} /> Navigate\n </span>\n <span>\n <CornerDownLeft size={11} /> Select\n </span>\n <span>Esc Close</span>\n </div>\n\n {footer && <div className=\"eidos-cmd-footer-slot\">{footer}</div>}\n </div>\n </div>\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nCommandPalette.displayName = 'CommandPalette';\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-7NUVLVSL.cjs","../src/components/CommandPalette/CommandPalette.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-7NUVLVSL.cjs","sourcesContent":[null,"import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ArrowDown, ArrowUp, Command, CornerDownLeft, Search } from 'lucide-react';\nimport type { CommandItem, CommandPaletteProps } from './CommandPalette.types';\nimport { useDialogFocus, useIsClient, FOCUSABLE_SELECTOR } from '../../utils';\nimport { Kbd } from '../Kbd';\nimport './CommandPalette.scss';\n\n// ── Constants ──────────────────────────────────────────────────────────────────\n\n/** Must match the CSS transition duration in CommandPalette.scss */\nconst TRANSITION_MS = 200;\n\n// ── Pure helpers ───────────────────────────────────────────────────────────────\n\nfunction filterItems(items: CommandItem[], query: string): CommandItem[] {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter(({ label, description, keywords }) => {\n return (\n label.toLowerCase().includes(q) ||\n (description?.toLowerCase().includes(q) ?? false) ||\n (keywords?.some((k) => k.toLowerCase().includes(q)) ?? false)\n );\n });\n}\n\ninterface Group {\n label: string | null;\n items: CommandItem[];\n}\n\n/**\n * Groups items while preserving the order in which groups first appear.\n * Items with no `group` property are placed in a leading implicit section\n * (label: null) so that labelled groups always follow them.\n */\nfunction buildGroups(items: CommandItem[]): Group[] {\n const groups: Group[] = [];\n const groupMap = new Map<string, Group>();\n\n for (const item of items) {\n const key = item.group ?? '';\n let group = groupMap.get(key);\n if (!group) {\n group = { label: item.group ?? null, items: [] };\n groups.push(group);\n groupMap.set(key, group);\n }\n group.items.push(item);\n }\n\n return groups;\n}\n\n// ── Component ──────────────────────────────────────────────────────────────────\n\nexport const CommandPalette: React.FC<CommandPaletteProps> = ({\n open: openProp,\n defaultOpen = false,\n onClose,\n onOpen,\n shortcutKey = 'k',\n items,\n onSelect,\n placeholder = 'Search commands…',\n emptyText = 'No commands found',\n maxHeight = 360,\n className = '',\n footer,\n trigger,\n triggerLabel = 'Search',\n}) => {\n const dialogId = useId();\n const listId = `${dialogId}-list`;\n\n // ── Controlled / uncontrolled open state ───────────────────────────────────\n // Omitting `open` lets the palette own its state entirely, which combined\n // with the shortcut listener below means it needs zero external\n // useState/useEffect to work. Passing `open` (+ `onClose`, optionally\n // `onOpen`) keeps full external control for consumers who need it (syncing\n // with a URL, another piece of app state, etc).\n const isControlled = openProp !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const open = isControlled ? (openProp as boolean) : internalOpen;\n\n const close = useCallback(() => {\n if (!isControlled) setInternalOpen(false);\n onClose?.();\n }, [isControlled, onClose]);\n\n // Shared \"open\" path - uncontrolled flips the internal state directly;\n // controlled defers to `onOpen` since the palette can't change `open`\n // itself. Used by both the keyboard shortcut below and the inline\n // `trigger`'s click handler.\n const openPalette = useCallback(() => {\n if (isControlled) {\n onOpen?.();\n } else {\n setInternalOpen(true);\n }\n }, [isControlled, onOpen]);\n\n // Global keyboard shortcut - Cmd/Ctrl+<shortcutKey> opens the palette.\n useEffect(() => {\n if (!shortcutKey) return;\n\n const handler = (e: KeyboardEvent) => {\n if (!(e.metaKey || e.ctrlKey) || e.key.toLowerCase() !== shortcutKey.toLowerCase()) return;\n e.preventDefault();\n openPalette();\n };\n\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [shortcutKey, openPalette]);\n\n // ── Animation state machine (mirrors the Drawer pattern) ─────────────────\n // isMounted → portal exists in the DOM (controls render/null)\n // isVisible → CSS --visible modifier is applied (drives transitions)\n //\n // Opening: isMounted=true → double rAF → isVisible=true → CSS transitions fire\n // Closing: isVisible=false → CSS transitions reverse → after TRANSITION_MS → isMounted=false\n const [isMounted, setIsMounted] = useState(open);\n const [isVisible, setIsVisible] = useState(open);\n // `isMounted` starts as `open`, so a palette opened by `open`/`defaultOpen`\n // would portal on its first render, which throws under SSR. The trigger\n // below still renders on the server - only the portal is deferred.\n const isClient = useIsClient();\n\n useEffect(() => {\n let raf1 = 0;\n let raf2 = 0;\n let timerId: ReturnType<typeof setTimeout>;\n\n if (open) {\n setIsMounted(true);\n // Double rAF: ensures the browser has painted the initial off-screen\n // state before the CSS transition begins (React 18 automatic batching\n // means a single rAF is not always sufficient).\n raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsVisible(true));\n });\n } else {\n setIsVisible(false);\n timerId = setTimeout(() => setIsMounted(false), TRANSITION_MS);\n }\n\n return () => {\n cancelAnimationFrame(raf1);\n cancelAnimationFrame(raf2);\n clearTimeout(timerId);\n };\n }, [open]);\n\n // ── Search state ───────────────────────────────────────────────────────────\n const [query, setQuery] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const dialogRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Map<string, HTMLDivElement>>(new Map());\n\n // Derived lists - memoised to stabilise scroll-effect deps\n const filtered = useMemo(() => filterItems(items, query), [items, query]);\n const navigable = useMemo(() => filtered.filter((item) => !item.disabled), [filtered]);\n const groups = useMemo(() => buildGroups(filtered), [filtered]);\n\n // Reset search query and selection when the palette is opened\n useEffect(() => {\n if (open) {\n setQuery('');\n setFocusedIndex(0);\n }\n }, [open]);\n\n // Focus the search input on open, trap Tab inside the dialog, and return\n // focus to the trigger on close.\n //\n // This replaces a bare `inputRef.current?.focus()` effect. That moved focus\n // in correctly but nothing kept it there: the first Tab left the dialog for\n // the page behind it, and closing the palette stranded focus wherever it\n // happened to be. `initialFocus` preserves the original behaviour of\n // landing on the search field rather than the first focusable node.\n // `isClient` for the same reason as `Modal`: a palette opened by `open` or\n // `defaultOpen` has no portal on its first render, and this would run against\n // a null ref and never re-run.\n useDialogFocus(isClient && open && isVisible, dialogRef, { initialFocus: inputRef });\n\n // Reset focused index to 0 whenever the filtered list changes\n useEffect(() => {\n setFocusedIndex(0);\n }, [query]);\n\n // Scroll the focused item into view during keyboard navigation\n useEffect(() => {\n const focusedItem = navigable[focusedIndex];\n if (!focusedItem) return;\n itemRefs.current.get(focusedItem.id)?.scrollIntoView({ block: 'nearest' });\n }, [focusedIndex, navigable]);\n\n // Body scroll lock (tied to open, not to isMounted, so it releases promptly\n // when the consumer decides to close - even before the exit animation ends)\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [open]);\n\n // ── Interaction handlers ───────────────────────────────────────────────────\n\n const selectItem = useCallback(\n (item: CommandItem) => {\n if (item.disabled) return;\n item.action?.();\n onSelect?.(item);\n close();\n },\n [close, onSelect],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n if (navigable.length === 0) return;\n setFocusedIndex((i) => (i + 1) % navigable.length);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n if (navigable.length === 0) return;\n setFocusedIndex((i) => (i - 1 + navigable.length) % navigable.length);\n break;\n }\n case 'Enter': {\n e.preventDefault();\n const item = navigable[focusedIndex];\n if (item) selectItem(item);\n break;\n }\n case 'Escape': {\n e.preventDefault();\n close();\n break;\n }\n }\n },\n [focusedIndex, navigable, close, selectItem],\n );\n\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n // Only fire when the click lands directly on the backdrop element,\n // not on any child (the dialog itself or its contents).\n if (e.target === e.currentTarget) {\n close();\n }\n },\n [close],\n );\n\n // Whether the custom trigger wrapper has to be the control itself, i.e.\n // whether what the caller passed contains nothing focusable. Measured after\n // render, like `Tooltip`'s equivalent.\n const customTriggerRef = useRef<HTMLDivElement>(null);\n const [customTriggerIsControl, setCustomTriggerIsControl] = useState(false);\n\n useEffect(() => {\n const element = customTriggerRef.current;\n setCustomTriggerIsControl(!!element && element.querySelector(FOCUSABLE_SELECTOR) === null);\n }, [trigger]);\n\n // ── Render ─────────────────────────────────────────────────────────────────\n\n // The inline trigger (if any) must render regardless of `isMounted` - it's\n // what opens the palette in the first place, so it can't be gated behind\n // the portal's own mount state.\n const triggerNode =\n trigger === true ? (\n <button\n type=\"button\"\n className=\"eidos-cmd-trigger-default\"\n onClick={openPalette}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n <span>{triggerLabel}</span>\n {shortcutKey && (\n <Kbd size=\"sm\" className=\"eidos-cmd-trigger-kbd\">\n <Command size={10} />\n {shortcutKey.toUpperCase()}\n </Kbd>\n )}\n </button>\n ) : trigger ? (\n // The wrapper only becomes a control when what it wraps is not one.\n //\n // It used to be `role=\"button\" tabIndex={0}` unconditionally, with no key\n // handler, which was wrong in both directions at once: around an\n // interactive child it produced a button inside a button and a second tab\n // stop, and around a non-interactive one - `Avatar`, which is the\n // documented example - it produced a focusable element that announced\n // itself as a button and did nothing when activated.\n //\n // Measured from the DOM rather than guessed from the node type, because\n // `trigger` is an arbitrary `ReactNode` and the control may be nested\n // inside it. Same approach as `Tooltip`.\n <div\n ref={customTriggerRef}\n className=\"eidos-cmd-trigger\"\n onClick={openPalette}\n {...(customTriggerIsControl\n ? {\n role: 'button',\n tabIndex: 0,\n 'aria-haspopup': 'dialog' as const,\n 'aria-expanded': open,\n onKeyDown: (event: React.KeyboardEvent) => {\n // A `div` is not a button: Enter and Space produce no click of\n // their own.\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openPalette();\n }\n },\n }\n : {})}\n >\n {trigger}\n </div>\n ) : null;\n\n const maxHeightValue = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n\n // The root element must not change shape between the closed and open\n // states.\n //\n // This used to `return triggerNode` while closed and a fragment once\n // mounted. React compares the root by element type, so flipping from\n // `<button>` to `<Fragment>` unmounted the trigger and mounted a brand new\n // one - the very element the user had just clicked was destroyed. Focus\n // was lost with it, which made returning focus on close impossible: the\n // node to return to no longer existed.\n //\n // Always returning the fragment keeps `triggerNode` in a stable position,\n // so React preserves the DOM node across open and close.\n return (\n <>\n {triggerNode}\n {isClient &&\n isMounted &&\n createPortal(\n <div\n className={['eidos-cmd-backdrop', isVisible && 'eidos-cmd-backdrop--visible']\n .filter(Boolean)\n .join(' ')}\n onClick={handleBackdropClick}\n aria-hidden={!open}\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Command palette\"\n id={dialogId}\n className={['eidos-cmd-dialog', isVisible && 'eidos-cmd-dialog--visible', className]\n .filter(Boolean)\n .join(' ')}\n onKeyDown={handleKeyDown}\n >\n {/* ── Search ──────────────────────────────────────────────────────── */}\n <div className=\"eidos-cmd-search\">\n <Search className=\"eidos-cmd-search-icon\" size={18} aria-hidden=\"true\" />\n\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-label={placeholder}\n className=\"eidos-cmd-input\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n spellCheck={false}\n autoComplete=\"off\"\n />\n\n {/* Reminds users of the configured shortcut, if any */}\n {shortcutKey && (\n <div className=\"eidos-cmd-search-badge\" aria-hidden=\"true\">\n <Command size={11} />\n <span>{shortcutKey.toUpperCase()}</span>\n </div>\n )}\n </div>\n\n {/* ── Results list ─────────────────────────────────────────────────── */}\n <div\n id={listId}\n role=\"listbox\"\n aria-label=\"Commands\"\n className=\"eidos-cmd-list\"\n style={{ maxHeight: maxHeightValue }}\n >\n {filtered.length === 0 ? (\n <p className=\"eidos-cmd-empty\" role=\"status\">\n {emptyText}\n </p>\n ) : (\n groups.map((group) => (\n <div\n key={group.label ?? '__ungrouped__'}\n role=\"group\"\n aria-label={group.label ?? undefined}\n >\n {group.label && (\n <div className=\"eidos-cmd-group-label\" aria-hidden=\"true\">\n {group.label}\n </div>\n )}\n\n {group.items.map((item) => {\n const isFocused = navigable[focusedIndex]?.id === item.id;\n const Icon = item.icon;\n\n return (\n <div\n key={item.id}\n ref={(el) => {\n if (el) {\n itemRefs.current.set(item.id, el);\n } else {\n itemRefs.current.delete(item.id);\n }\n }}\n role=\"option\"\n aria-selected={isFocused}\n aria-disabled={item.disabled}\n className={[\n 'eidos-cmd-item',\n isFocused && 'eidos-cmd-item--focused',\n item.disabled && 'eidos-cmd-item--disabled',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => selectItem(item)}\n onMouseEnter={() => {\n if (!item.disabled) {\n const idx = navigable.findIndex((n) => n.id === item.id);\n if (idx !== -1) setFocusedIndex(idx);\n }\n }}\n >\n {Icon && (\n <span className=\"eidos-cmd-item-icon\" aria-hidden=\"true\">\n <Icon size={16} />\n </span>\n )}\n\n <div className=\"eidos-cmd-item-body\">\n <div className=\"eidos-cmd-item-label\">{item.label}</div>\n {item.description && (\n <div className=\"eidos-cmd-item-description\">{item.description}</div>\n )}\n </div>\n\n {item.shortcut && item.shortcut.length > 0 && (\n <div\n className=\"eidos-cmd-item-shortcut\"\n aria-label={`Shortcut: ${item.shortcut.join(' ')}`}\n >\n {item.shortcut.map((key, i) => (\n <kbd key={i} className=\"eidos-cmd-kbd\">\n {key}\n </kbd>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n ))\n )}\n </div>\n\n {/* ── Footer ───────────────────────────────────────────────────────── */}\n <div className=\"eidos-cmd-footer\">\n <div className=\"eidos-cmd-hints\" aria-hidden=\"true\">\n <span>\n <ArrowUp size={11} />\n <ArrowDown size={11} /> Navigate\n </span>\n <span>\n <CornerDownLeft size={11} /> Select\n </span>\n <span>Esc Close</span>\n </div>\n\n {footer && <div className=\"eidos-cmd-footer-slot\">{footer}</div>}\n </div>\n </div>\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nCommandPalette.displayName = 'CommandPalette';\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// src/components/Timeline/Timeline.component.tsx
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
var Timeline = ({
|
|
4
|
+
items,
|
|
5
|
+
ariaLabel,
|
|
6
|
+
"aria-labelledby": ariaLabelledBy,
|
|
7
|
+
className = ""
|
|
8
|
+
}) => /* @__PURE__ */ jsx(
|
|
9
|
+
"ol",
|
|
10
|
+
{
|
|
11
|
+
className: ["eidos-timeline", className].filter(Boolean).join(" "),
|
|
12
|
+
"aria-label": ariaLabel,
|
|
13
|
+
"aria-labelledby": ariaLabelledBy,
|
|
14
|
+
children: items.map((item, index) => {
|
|
15
|
+
const isLast = index === items.length - 1;
|
|
16
|
+
const color = item.color ?? "default";
|
|
17
|
+
return /* @__PURE__ */ jsxs(
|
|
18
|
+
"li",
|
|
19
|
+
{
|
|
20
|
+
className: [
|
|
21
|
+
"eidos-timeline-item",
|
|
22
|
+
`eidos-timeline-item--${color}`,
|
|
23
|
+
!isLast && "eidos-timeline-item--has-connector"
|
|
24
|
+
].filter(Boolean).join(" "),
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsxs("div", { className: "eidos-timeline-track", "aria-hidden": "true", children: [
|
|
27
|
+
/* @__PURE__ */ jsx("div", { className: "eidos-timeline-dot", children: item.icon && /* @__PURE__ */ jsx("span", { className: "eidos-timeline-dot-icon", children: item.icon }) }),
|
|
28
|
+
!isLast && /* @__PURE__ */ jsx("div", { className: "eidos-timeline-connector" })
|
|
29
|
+
] }),
|
|
30
|
+
/* @__PURE__ */ jsxs("div", { className: "eidos-timeline-content", children: [
|
|
31
|
+
item.timestamp && /* @__PURE__ */ jsx("span", { className: "eidos-timeline-timestamp", children: item.timestamp }),
|
|
32
|
+
/* @__PURE__ */ jsx("div", { className: "eidos-timeline-title", children: item.title }),
|
|
33
|
+
item.description && /* @__PURE__ */ jsx("div", { className: "eidos-timeline-description", children: item.description })
|
|
34
|
+
] })
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
item.id
|
|
38
|
+
);
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
Timeline.displayName = "Timeline";
|
|
43
|
+
|
|
44
|
+
export {
|
|
45
|
+
Timeline
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=chunk-ACH7SYQ2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Timeline/Timeline.component.tsx"],"sourcesContent":["import React from 'react';\nimport type { TimelineProps } from './Timeline.types';\n\n// Title and description are `div`s, not `span` and `p`. Both are documented\n// as `ReactNode`, and the obvious content for an Experience or Education\n// entry - a bullet list, a row of chips - is block-level: inside a `<p>` it is\n// invalid HTML (React reports it as a hydration error, and the browser's\n// parser closes the paragraph early), which pushed consumers to rebuild the\n// component out of Cards.\n//\n// The list used to carry a hardcoded `aria-label=\"Timeline\"`, which named\n// every instance the same thing and overrode whatever heading introduced it.\n// The name is now the consumer's to give, or to omit.\nexport const Timeline: React.FC<TimelineProps> = ({\n items,\n ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n className = '',\n}) => (\n <ol\n className={['eidos-timeline', className].filter(Boolean).join(' ')}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const color = item.color ?? 'default';\n\n return (\n <li\n key={item.id}\n className={[\n 'eidos-timeline-item',\n `eidos-timeline-item--${color}`,\n !isLast && 'eidos-timeline-item--has-connector',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {/* Left: dot + connector */}\n <div className=\"eidos-timeline-track\" aria-hidden=\"true\">\n <div className=\"eidos-timeline-dot\">\n {item.icon && <span className=\"eidos-timeline-dot-icon\">{item.icon}</span>}\n </div>\n {!isLast && <div className=\"eidos-timeline-connector\" />}\n </div>\n\n {/* Right: content */}\n <div className=\"eidos-timeline-content\">\n {item.timestamp && <span className=\"eidos-timeline-timestamp\">{item.timestamp}</span>}\n <div className=\"eidos-timeline-title\">{item.title}</div>\n {item.description && (\n <div className=\"eidos-timeline-description\">{item.description}</div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n);\n\nTimeline.displayName = 'Timeline';\n"],"mappings":";AAwCU,SAEkB,KAFlB;AA3BH,IAAM,WAAoC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,YAAY;AACd,MACE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,CAAC,kBAAkB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IACjE,cAAY;AAAA,IACZ,mBAAiB;AAAA,IAEhB,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,YAAM,SAAS,UAAU,MAAM,SAAS;AACxC,YAAM,QAAQ,KAAK,SAAS;AAE5B,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,YACT;AAAA,YACA,wBAAwB,KAAK;AAAA,YAC7B,CAAC,UAAU;AAAA,UACb,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UAGX;AAAA,iCAAC,SAAI,WAAU,wBAAuB,eAAY,QAChD;AAAA,kCAAC,SAAI,WAAU,sBACZ,eAAK,QAAQ,oBAAC,UAAK,WAAU,2BAA2B,eAAK,MAAK,GACrE;AAAA,cACC,CAAC,UAAU,oBAAC,SAAI,WAAU,4BAA2B;AAAA,eACxD;AAAA,YAGA,qBAAC,SAAI,WAAU,0BACZ;AAAA,mBAAK,aAAa,oBAAC,UAAK,WAAU,4BAA4B,eAAK,WAAU;AAAA,cAC9E,oBAAC,SAAI,WAAU,wBAAwB,eAAK,OAAM;AAAA,cACjD,KAAK,eACJ,oBAAC,SAAI,WAAU,8BAA8B,eAAK,aAAY;AAAA,eAElE;AAAA;AAAA;AAAA,QAxBK,KAAK;AAAA,MAyBZ;AAAA,IAEJ,CAAC;AAAA;AACH;AAGF,SAAS,cAAc;","names":[]}
|